Remerge fixes for Bug 1860 and Bug 1543, reapply MYuupy font (Bug 1899) RCL_3
authorWilliam Roberts <williamr@symbian.org>
Fri, 02 Apr 2010 10:04:19 +0100
branchRCL_3
changeset 14 829379b05c78
parent 13 7ff7c6e94fea (diff)
parent 8 030b3432fbe0 (current diff)
child 17 93dabad1a1d2
Remerge fixes for Bug 1860 and Bug 1543, reapply MYuupy font (Bug 1899)
--- a/charconvfw/JPLangUtil/group/jplangutil.mmp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/JPLangUtil/group/jplangutil.mmp	Fri Apr 02 10:04:19 2010 +0100
@@ -45,4 +45,4 @@
 SOURCE          jplangutil.cpp
 
 LIBRARY         euser.lib
-DEFFILE         jplangutil.def
+DEFFILE         JPLANGUTIL.DEF
--- a/charconvfw/JPLangUtil/src/jplangutil.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/JPLangUtil/src/jplangutil.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -19,8 +19,8 @@
 
 
 // INCLUDES FILES
-#include "JPLANGUTIL.H"
-#include "JPLANGUTIL.TABLES.H"
+#include "jplangutil.h"
+#include "jplangutil.tables.h"
 
 // LOCAL DEFINES
 
--- a/charconvfw/JPLangUtil/src/jplangutil.tables.h	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/JPLangUtil/src/jplangutil.tables.h	Fri Apr 02 10:04:19 2010 +0100
@@ -22,7 +22,7 @@
 #define __JPLANGUTIL_TABLES_H__
 
 // INCLUDES
-#include <E32STD.H>
+#include <e32std.h>
 
 // CONSTANTS
 const TText KMiddleDotMap[] =      { 0xff65 , 0x30fb };
--- a/charconvfw/SortUtil/src/SortUtil.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/SortUtil/src/SortUtil.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -25,7 +25,7 @@
 #include "SortUtil.h"
 
 #ifdef __WINS__     
-#include <FeatMgr.h>    
+#include <featmgr.h>    
 #endif
 
 // LOCAL CONSTANTS AND MACROS
--- a/charconvfw/SortUtil/src/SortUtilJapan.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/SortUtil/src/SortUtilJapan.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -24,7 +24,7 @@
 #include "SortUtilJapan.h"
 #include "SortUtilImpl.h"
 #include "SortUtilImplExport.h"
-#include <JpLangUtil.h>
+#include <jplangutil.h>
 
 // Unnamed namespace for local definitions
 namespace
--- a/charconvfw/inlinetext/inc/InlineTextNoMatchesIndicatorSource.h	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/inlinetext/inc/InlineTextNoMatchesIndicatorSource.h	Fri Apr 02 10:04:19 2010 +0100
@@ -22,12 +22,12 @@
 
 // INCLUDES
 
-#include "inlinetextbase.h"
+#include "InlineTextBase.h"
 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
 #include <tagma.h>
 #else
 #include <tagma.h>
-#include <tagmaLayoutAndSource.h>
+#include <tagmalayoutandsource.h>
 #endif
 
 // CONSTANTS
--- a/charconvfw/numbergrouping/Group/NumberGrouping.mmp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/numbergrouping/Group/NumberGrouping.mmp	Fri Apr 02 10:04:19 2010 +0100
@@ -59,7 +59,6 @@
 LIBRARY         euser.lib
 LIBRARY         bafl.lib
 LIBRARY         efsrv.lib
-LIBRARY         commonengine.lib
 LIBRARY         centralrepository.lib      // Central repository
 
 // End of file.
--- a/charconvfw/numbergrouping/Src/NumberGrouping.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/numbergrouping/Src/NumberGrouping.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -20,7 +20,7 @@
 
 #include <barsread.h>
 #include <eikenv.h>
-#include <CentralRepository.h>
+#include <centralrepository.h>
 #include <NumberGroupingCRKeys.h>
 
 const TText KNumberGroupingWildcard('n');
--- a/charconvfw/numbergrouping/Src/StateMachine.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/charconvfw/numbergrouping/Src/StateMachine.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -71,7 +71,7 @@
 
 void CStateMachine::AddStateTransistionL(TInt aIndex, TInt aState, TInt aNextState)
 {
-	if(aIndex > iMaxNumberChars || aState > iMaxNumberStates || aNextState > iMaxNumberStates)
+    if(aIndex < 0 || aIndex > iMaxNumberChars || aState > iMaxNumberStates || aNextState > iMaxNumberStates)
 		User::Leave(KErrGeneral);
 
 	iStateTable[static_cast<TInt>(aIndex)][static_cast<TInt>(aState)] = static_cast<TInt>(aNextState);
--- a/fontservices/fontstore/bwins/FNTSTR2U.DEF	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/bwins/FNTSTR2U.DEF	Fri Apr 02 10:04:19 2010 +0100
@@ -192,10 +192,4 @@
 	?UpdateLinkedTypefaceL@CFontStore@@QAEXABVTLinkedTypefaceSpecificationArgs@@@Z @ 191 NONAME ; void CFontStore::UpdateLinkedTypefaceL(class TLinkedTypefaceSpecificationArgs const &)
 	?KLinkedFontDrive@@3CB @ 192 NONAME ; signed char const KLinkedFontDrive
 	?GetFontFilePath@CFontStore@@QBEHABVTDesC16@@AAV?$TBuf@$0BAA@@@@Z @ 193 NONAME ; int CFontStore::GetFontFilePath(class TDesC16 const &, class TBuf<256> &) const
-	?ReleaseGlyphOutlines@CBitmapFont@@QAEXHPBIHH@Z @ 194 NONAME ; void CBitmapFont::ReleaseGlyphOutlines(int, unsigned int const *, int, int)
-	?GetGlyphOutline@CBitmapFont@@QAEHIHAAPAXAAHH@Z @ 195 NONAME ; int CBitmapFont::GetGlyphOutline(unsigned int, int, void * &, int &, int)
-	?KFontTable_GlyphOutline_CacheMaxMem@@3KB @ 196 NONAME ; unsigned long const KFontTable_GlyphOutline_CacheMaxMem
-	?CleanupCacheOnFbsSessionTermination@CFontStore@@QAEXH@Z @ 197 NONAME ; void CFontStore::CleanupCacheOnFbsSessionTermination(int)
-	?GetFontTable@CBitmapFont@@QAEHKAAPAXAAHH@Z @ 198 NONAME ; int CBitmapFont::GetFontTable(unsigned long, void * &, int &, int)
-	?ReleaseFontTable@CBitmapFont@@QAEXKH@Z @ 199 NONAME ; void CBitmapFont::ReleaseFontTable(unsigned long, int)
 
--- a/fontservices/fontstore/eabi/fntstr2U.def	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/eabi/fntstr2U.def	Fri Apr 02 10:04:19 2010 +0100
@@ -245,10 +245,4 @@
 	_ZN10CFontStore21UpdateLinkedTypefaceLERK32TLinkedTypefaceSpecificationArgs @ 244 NONAME
 	_ZN28CLinkedTypefaceSpecification21UpdateLinkedTypefaceLER17CFbsTypefaceStore @ 245 NONAME
 	_ZNK10CFontStore15GetFontFilePathERK7TDesC16R4TBufILi256EE @ 246 NONAME
-	KFontTable_GlyphOutline_CacheMaxMem @ 247 NONAME DATA 4
-	_ZN10CFontStore35CleanupCacheOnFbsSessionTerminationEi @ 248 NONAME
-	_ZN11CBitmapFont12GetFontTableEmRPvRii @ 249 NONAME
-	_ZN11CBitmapFont15GetGlyphOutlineEjiRPvRii @ 250 NONAME
-	_ZN11CBitmapFont16ReleaseFontTableEmi @ 251 NONAME
-	_ZN11CBitmapFont20ReleaseGlyphOutlinesEiPKjii @ 252 NONAME
 
--- a/fontservices/fontstore/group/BLD.INF	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/group/BLD.INF	Fri Apr 02 10:04:19 2010 +0100
@@ -67,7 +67,6 @@
 
 ../tfs/scripts/fntstoretest_T_All.script						z:/fntstoretest/fntstoretest_t_all.script
 ../tfs/scripts/fntstoretest_T_Fnt.script						z:/fntstoretest/fntstoretest_t_fnt.script
-../tfs/scripts/fntstoretest_T_Cache.script						z:/fntstoretest/fntstoretest_T_Cache.script
 ../tfs/scripts/fntstoretest_T_FntMem.script						z:/fntstoretest/fntstoretest_t_fntmem.script
 ../tfs/scripts/fntstoretest_T_FontBitmap.script					z:/fntstoretest/fntstoretest_t_fontbitmap.script
 ../tfs/scripts/fntstoretest_T_FsOpen.script						z:/fntstoretest/fntstoretest_t_fsopen.script
--- a/fontservices/fontstore/group/FntstoreTest.iby	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/group/FntstoreTest.iby	Fri Apr 02 10:04:19 2010 +0100
@@ -32,7 +32,6 @@
 //script files
 data=DATAZ_\fntstoretest\fntstoretest_T_All.script				\fntstoretest\fntstoretest_T_All.script
 data=DATAZ_\fntstoretest\fntstoretest_T_Fnt.script						\fntstoretest\fntstoretest_T_Fnt.script
-data=DATAZ_\fntstoretest\fntstoretest_T_Cache.script					\fntstoretest\fntstoretest_T_Cache.script
 data=DATAZ_\fntstoretest\fntstoretest_T_FntMem.script					\fntstoretest\fntstoretest_T_FntMem.script
 data=DATAZ_\fntstoretest\fntstoretest_T_FontBitmap.script				\fntstoretest\fntstoretest_T_FontBitmap.script
 data=DATAZ_\fntstoretest\fntstoretest_T_FsOpen.script					\fntstoretest\fntstoretest_T_FsOpen.script
--- a/fontservices/fontstore/group/TFntStoreServer.mmp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/group/TFntStoreServer.mmp	Fri Apr 02 10:04:19 2010 +0100
@@ -61,7 +61,6 @@
 SOURCE			t_linkedfontscapability.cpp
 SOURCE			T_LinkedFontUpdateTests.cpp
 SOURCE          T_IsolatedFontStore.cpp
-SOURCE          T_Cache.CPP
 SOURCE			T_FontSessionCache.cpp
 
 SOURCEPATH      ../src
--- a/fontservices/fontstore/group/tfontsessioncacheproc.mmp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/group/tfontsessioncacheproc.mmp	Fri Apr 02 10:04:19 2010 +0100
@@ -1,17 +1,20 @@
-// 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 "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
 
 
 TARGETTYPE EXE
--- a/fontservices/fontstore/inc/FNTSTORE.h	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/inc/FNTSTORE.h	Fri Apr 02 10:04:19 2010 +0100
@@ -65,7 +65,6 @@
 class COpenFontRasterizer;
 class CLinkedTypefaceGroup;
 IMPORT_C extern const TInt8 KLinkedFontDrive;
-IMPORT_C extern const TUint32 KFontTable_GlyphOutline_CacheMaxMem;
 
 /**
 WARNING: Class for internal use ONLY.  Compatibility is not guaranteed in future releases.
@@ -163,14 +162,7 @@
 	inline COpenFont* OpenFont() const;
 	inline TGlyphBitmapType GlyphBitmapType() const;
 	IMPORT_C TUint32 UniqueFontId();
-	IMPORT_C TInt GetFontTable(TUint32 aTag, TAny*& aTableContent, 
-	        TInt& aLength, TInt aSessionHandle);
-    IMPORT_C TInt GetGlyphOutline(TUint aCode,  
-            TBool aHinted, TAny*& aOutline, TInt& aLength, TInt aSessionHandle);
-    IMPORT_C void ReleaseGlyphOutlines(TInt aCount, const TUint* aCodes,  
-            TBool aHinted, TInt aSessionHandle);
-    IMPORT_C void ReleaseFontTable(TUint32 aTag, TInt aSessionHandle);
-    
+	
 private:
 	// From CFont
 	IMPORT_C virtual TUid DoTypeUid() const;
@@ -283,15 +275,6 @@
 	IMPORT_C void operator = (const COpenFontLinkedTypefaceSpecification& aRhs);
 	};
 	
-
-
-class TUnhintedOutlineId;
-class THintedOutlineId;
-class CFontTableCache;
-class CUnhintedOutlineCache;
-class CHintedOutlineCache;
-class TFontTableGlyphOutlineCacheMemMonitor;
-
 class CFontStore : public CTypefaceStore
 /** 
 A store for fonts.
@@ -350,27 +333,6 @@
 	IMPORT_C void UpdateLinkedTypefaceL(const TLinkedTypefaceSpecificationArgs& aLinkedTypefaceSpec);
 	IMPORT_C void LoadFontsAtStartupL();
 	IMPORT_C TBool GetFontFilePath(const TDesC& aFontName, TFileName& aFilePath) const;
-    IMPORT_C void CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
-	
-	TInt CacheFontTable(TUid aFileUid, TUint32 aTag, TAny*& aContent, TInt aLength);
-	TInt ReleaseFontTable(TUid aFileUid, TUint32 aTag, TInt aSessionHandle);
-	TInt FindFontTableInCache(TUid aFileUid, TUint32 aTag, TAny*& aContent, TInt& aLength);
-	TInt IncFontTableRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle);
-	TInt DecFontTableRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle);
-	TInt CacheUnhintedOutline(const TUnhintedOutlineId& aOutlineId, TAny* aData, 
-	        TInt aLength, TAny*& aOutline, TInt& aLen);
-	TInt CacheHintedOutline(const THintedOutlineId& aOutlineId, TAny* aData, TInt aLength,
-	        TAny*& aOutline, TInt& aLen);
-	TInt ReleaseUnhintedOutline(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
-	TInt ReleaseHintedOutline(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
-	TInt IncreaseUnhintedOutlineRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
-	TInt IncreaseHintedOutlineRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
-	TInt FindUnhintedOutlineInCache(const TUnhintedOutlineId& aOutlineId, TAny*& aData, 
-	        TInt &aLength);
-	TInt FindHintedOutlineInCache(const THintedOutlineId& aOutlineId, TAny*& aData, TInt& aLength);
-    void CleanupCacheOnOpenFontRemoval(COpenFont* aFont);
-    void CleanupCacheOnOpenFontFileRemoval(COpenFontFile* aFontFile);
-
 private:
 	CFontStore(RHeap* aHeap);
 	void ConstructL();
@@ -433,11 +395,7 @@
 	CArrayPtrFlat<CFontBitmap> iFontBitmapList;
 	CArrayFixFlat<TTypefaceFontBitmap> iTypefaceFontBitmapList;
 	CArrayPtrFlat<COpenFontFile> iOpenFontFileList;
-	TInt iReserved[2];		// keep iDefaultBitmapType at the correct offset
-    CFontTableCache *iFontTableCache;
-    CUnhintedOutlineCache *iUnhintedOutlineCache;
-    CHintedOutlineCache *iHintedOutlineCache;
-    TFontTableGlyphOutlineCacheMemMonitor *iCacheMemMon;
+	TInt iReserved[6];		// keep iDefaultBitmapType at the correct offset
 	CArrayPtrFlat<COpenFontRasterizer> iOpenFontRasterizerList;
 	COpenFontSessionCacheList* iOpenFontSessionCacheList;
 	TInt iOpenFontUid;
--- a/fontservices/fontstore/inc/OPENFONT.H	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/inc/OPENFONT.H	Fri Apr 02 10:04:19 2010 +0100
@@ -82,7 +82,6 @@
 @released
 */
 const TUid KUidOpenFontTrueTypeExtension = {0x1027553E};
-const TUid KUidOpenFontGlyphOutlineExtension = {0x102872CE};
 
 /**
 Supplied to CShaper::ExtendedInterface() to get the language and script
@@ -338,8 +337,6 @@
 	inline TInt FontLineGap() const;
 	inline TInt FontMaxHeight() const;
 	void DeleteShaper() const;
-	TInt GetFontTable(TUint32 aTag, TAny*& aTableContent, TInt& aLength);
-	TInt GetGlyphOutline(TUint aCode, TBool aHinted, TAny*& aOutline, TInt& aLength);
 	
 protected:	
 	/** WARNING: Function for internal use ONLY. Compatibility is not guaranteed in future releases.
@@ -555,12 +552,6 @@
 	virtual TBool HasTrueTypeTable(TUint32 aTag) = 0;
 	};
 
-class MOpenFontGlyphOutlineExtension 
-    {
-public:
-    virtual TInt GetGlyphOutline(TUint aCode, TBool aIsGlyphId, 
-            TBool aHinted, TAny*& aOutline, TInt& aLength) = 0;
-    };
 /** 
 Font attribute base class. 
 
--- a/fontservices/fontstore/inc/openfontsprivate.h	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/inc/openfontsprivate.h	Fri Apr 02 10:04:19 2010 +0100
@@ -19,7 +19,6 @@
 #ifndef __OPENFONTS_PRIVATE_H__
 #define __OPENFONTS_PRIVATE_H__
 
-#include <e32hashtab.h>
 class COpenFontShaperCacheEntry;
 
 /* MSB is set to indicate a glyph code rather than a unicode value
@@ -211,225 +210,6 @@
 	TInt iCacheOffset;
 	};
 
-class TFontTableGlyphOutlineCacheMemMonitor
-    {
-public:
-    TFontTableGlyphOutlineCacheMemMonitor();
-    void Inc(TInt aBytes);
-    void Dec(TInt aBytes);
-    TInt GetMemUsage();
-private:
-    TInt iBytes;
-    };
-
-struct TCacheUserInfo {
-    TInt iSessionHandle;
-    TInt iRefCount;
-    TCacheUserInfo(TInt aSessionHandle, TInt aRefCount = 0): 
-            iSessionHandle(aSessionHandle), iRefCount(aRefCount) { } 
-};
-
-class CFontTableCache;
-
-class CFontTableCacheItem
-    {
-friend class CFontTableCache ;
-
-public:
-    CFontTableCacheItem(TUid &aFileUid, const TUint32 aTag, 
-            TInt aOffset, TInt aLength);
-    ~CFontTableCacheItem(); 
-
-    TInt DecRefCount(TInt aSessionHandle);
-    TInt IncRefCount(TInt aSessionHandle);
-
-    TBool HasOutstandingRefCount();
-    TInt FindUser(TInt aSessionHandle, TInt *id);
-    
-#ifdef _DEBUG
-    void SetUser(RPointerArray<TCacheUserInfo> users)
-        {
-        TInt len = users.Count();
-        for( TInt i = 0; i < len ; i++ )
-            {
-            iUsers.Append(users[i]);
-            }
-        }    
-#endif
-    
-private:
-    CFontTableCacheItem(const CFontTableCacheItem &); // disallow copy construction.
-    CFontTableCacheItem& operator =(const CFontTableCacheItem &); // disallow assignment.
-    
-    TUid iFileUid; 
-    TUint32 iTag; 
- 
-
-    TInt iOffset;
-    TInt iLength; 
-    RPointerArray<TCacheUserInfo> iUsers;
-    }; 
-
-
-class CFontTableCache 
-    {
-public:
-    CFontTableCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
-    ~CFontTableCache();
-    TInt Append(TUid aFileUid, TUint32 aTag, 
-            TAny*& aContent, TInt aLength);
-    TInt Find(TUid aFileUid, TUint32 aTag, TAny*& aContent, TInt& aLength, TInt* id);
-    TInt IncRefCount(TUid FileUid, TUint32 aTag, TInt aSessionHandle);
-    TInt DecRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle);
-    TBool HasOutstandingRefCount();
-    TBool HasOutstandingRefCountWithUid(TUid aFileUid);  
-    void CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
-    void CleanupCacheOnOpenFontFileRemoval(COpenFontFile*);
-#ifdef _DEBUG    
-    void SetFontItem(RPointerArray<CFontTableCacheItem> cacheItems)
-        {
-        TInt len = cacheItems.Count();
-        for(TInt i = 0; i < len; i++)
-            {
-            iCacheItems.Append(cacheItems[i]);
-            }
-        }
-#endif   
-    
-private:
-    CFontTableCache(const CFontTableCache &); // no copy construction.
-    CFontTableCache& operator =(const CFontTableCache &); // no assignment.
-#ifdef _DEBUG
-    TInt GetCacheState(const char *func);
-#endif
-    
-    TFontTableGlyphOutlineCacheMemMonitor &iCacheMemMon;
-    RHeap *iHeap;
-    RPointerArray<CFontTableCacheItem> iCacheItems;
-    };
-
-
-class TUnhintedOutlineCache;
-
-class TUnhintedOutlineId 
-    {
-public:
-    TUnhintedOutlineId(TUid aFileUid, TInt aFaceIndex, TUint aId);
-    TUid iFileUid;
-    TInt iFaceIndex;
-    TUint iId;
-    };
-
-class COutlineCacheItem {
-friend class CUnhintedOutlineCache;
-friend class CHintedOutlineCache;
-    
-public:
-    COutlineCacheItem(TInt aOffset, TInt aLength);
-    ~COutlineCacheItem() ;
-
-    TInt DecRefCount(TInt aSessionHandle);
-    TInt IncRefCount(TInt aSessionHandle);
-#ifdef _DEBUG
-    void SetUser(RPointerArray<TCacheUserInfo> users)
-        {
-        TInt len = users.Count();
-        for( TInt i = 0; i < len ; i++ )
-            {
-            iUsers.Append(users[i]);
-            }
-        }    
-#endif
- 
-private:
-    TInt FindUser(TInt aSessionHandle, TInt *id);
-        
-
-    TInt iOffset;
-    TInt iLength;
-    RPointerArray<TCacheUserInfo> iUsers;
-};    
-
-class CUnhintedOutlineCache {
-public:
-    CUnhintedOutlineCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
-    TInt Find(const TUnhintedOutlineId &aOutlineId, TAny*& aData, TInt& aLength);
-    TInt IncRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
-    TInt DecRefCount(const TUnhintedOutlineId& aOutlineId, TInt aSessionHandle);
-    TInt CacheUnhintedOutline(const TUnhintedOutlineId& aOutlineId, 
-            TAny * const aData, const TInt aLength, TAny*& aOutline, TInt &aLen);
-    TInt CleanupCacheOnOpenFontFileRemoval(COpenFontFile* aFontFile);
-    TInt CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
-#ifdef _DEBUG
-    TInt GetCacheState(const char *func);
-#endif
-    ~CUnhintedOutlineCache();
-    
-#ifdef _DEBUG
-    void SetUnHintedItem(TUnhintedOutlineId id, COutlineCacheItem* item)
-        {
-        iItemIdMap.Insert(id, item);
-        }
-#endif
-    
-private:
-    // disallow assignment and copy-construction
-    CUnhintedOutlineCache(const CUnhintedOutlineCache &); 
-    CUnhintedOutlineCache& operator =(const CUnhintedOutlineCache &);
-    
-    static TUint32 IdHash(const TUnhintedOutlineId& aOutlineId);
-    static TBool IdIdentity(const TUnhintedOutlineId& id1, const TUnhintedOutlineId& id2);
-    
-    TFontTableGlyphOutlineCacheMemMonitor& iCacheMemMon;
-    RHeap* iHeap; 
-    RHashMap<TUnhintedOutlineId, COutlineCacheItem*> iItemIdMap; // map the identity to an index in 'iCacheItems'.
-};
-
-class CHintedOutlineCache;
-
-class THintedOutlineId 
-    {
-public:
-    THintedOutlineId(COpenFont* aFont, TUint aId);
-    COpenFont *iFont;
-    TUint iId;
-    };
-
-
-class CHintedOutlineCache {
-public:
-    CHintedOutlineCache(RHeap* aHeap, TFontTableGlyphOutlineCacheMemMonitor& aMon);
-    TInt Find(const THintedOutlineId& aOutlineId, TAny*& aData, TInt& aLength);
-    TInt IncRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
-    TInt DecRefCount(const THintedOutlineId& aOutlineId, TInt aSessionHandle);
-    TInt CacheHintedOutline(const THintedOutlineId& aOutlineId, 
-            TAny* aData, TInt aLength, TAny*& aOutline, TInt& aLen);
-    TInt CleanupCacheOnOpenFontRemoval(COpenFont* aFont);
-    TInt CleanupCacheOnFbsSessionTermination(TInt aSessionHandle);
-#ifdef _DEBUG
-    TInt GetCacheState(const char *func);
-    void SetHintedItem(THintedOutlineId id, COutlineCacheItem* item)
-        {
-        iItemIdMap.Insert(id, item);
-        }
-    RHashMap<THintedOutlineId, COutlineCacheItem*> GetHintedMap()
-    {
-    return iItemIdMap;
-    }
-#endif
-    
-private:
-    // disallow assignment and copy-construction
-    CHintedOutlineCache(const CHintedOutlineCache &); 
-    CHintedOutlineCache& operator =(const CHintedOutlineCache &);
-    static TUint32 IdHash(const THintedOutlineId& aOutlineId);
-    static TBool IdIdentity(const THintedOutlineId& id1, const THintedOutlineId& id2);
-        
-    TFontTableGlyphOutlineCacheMemMonitor& iCacheMemMon;
-    RHeap* iHeap; 
-    RHashMap<THintedOutlineId, COutlineCacheItem*> iItemIdMap; // map the identity to an index in 'iCacheItems'.
-    };
-
 
 // inline functions
 inline COpenFontSessionCacheEntry::COpenFontSessionCacheEntry(const COpenFont* aFont, TInt aCode, TInt aGlyphIndex,const TOpenFontCharMetrics& aMetrics) :
--- a/fontservices/fontstore/src/FNTSTORE.CPP	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/src/FNTSTORE.CPP	Fri Apr 02 10:04:19 2010 +0100
@@ -35,10 +35,6 @@
 #include <graphics/openfontrasterizer.h>
 #include <graphics/openfontconstants.h>
 
-static const TUint32 KOutlineGlyphIdHashMask = 0x0000ffff;
-static const TUint32 KOutlineFileUidHashMask = 0x00ff0000;
-static const TUint32 KOutlineFaceIndexHashMask = 0x0f000000;
-static const TUint32 KOutlineFontPtrHashMask = 0x0fff0000;
 
 // uncomment to enable some verbose debug prints
 //#define VERBOSE_DEBUG 1
@@ -1111,185 +1107,6 @@
         return NULL;
 	}
 
-/** Gets a font table.
-@param aTag: Input. The name of the font table.
-@param aTableContent: Output. To return the address of the table content.
-@param aLength: Output. To return the length (in bytes) of the table.
-@param aSessionHandle: Input. A handle to the session requesting this table.
-@return KErrNone on success, specific error code on failure.
-@internalTechnology
-*/
-EXPORT_C TInt CBitmapFont::GetFontTable(TUint32 aTag, TAny *&aTableContent, 
-        TInt &aLength, TInt aSessionHandle) 
-    {
-    COpenFont *fontPtr = NULL;
-    if (IsOpenFont())
-        fontPtr = OpenFont();
-    else
-        return KErrNotSupported;
-    
-    // try to find it in cache.
-    CFontStore *fntStore = fontPtr->File()->GetFontStore();
-    TUid fileUid = fontPtr->File()->Uid();
-    TInt ret = fntStore->FindFontTableInCache(fileUid, aTag, aTableContent, aLength);
-    if (KErrNone == ret)
-        {
-        ret = fntStore->IncFontTableRefCount(fileUid, aTag, aSessionHandle);
-        return ret;
-        }
-    
-    // font table not found in cache.
-    ret = fontPtr->GetFontTable(aTag, aTableContent, aLength);
-    if (KErrNone == ret)
-        {
-        ret = fntStore->CacheFontTable(fileUid, aTag, aTableContent, aLength);
-        if (KErrNone == ret)
-            {
-            ret = fntStore->IncFontTableRefCount(fileUid, aTag, aSessionHandle);
-            }
-        else 
-            {
-            aTableContent = NULL;
-            }
-        }
-    
-    return ret;
-    }
-
-/** Release a font table. Decrement its reference count. Remove from cache if 
- * reference decreases to zero.
-@param aTag: Input. The name of the font table to be released.
-@param aSessionHandle: Input. Handle to the session releasing this table.
-@return KErrNone on success, specific error code on failure.
-@internalTechnology
-*/
-EXPORT_C void CBitmapFont::ReleaseFontTable(TUint32 aTag, 
-        TInt aSessionHandle)
-    {
-    COpenFont *fontPtr = NULL;
-    if (IsOpenFont())
-        fontPtr = OpenFont();
-    else
-        return;
-    
-    CFontStore *fntStore = fontPtr->File()->GetFontStore();
-    TUid fileUid = fontPtr->File()->Uid();
-    fntStore->ReleaseFontTable(fileUid, aTag, aSessionHandle);
-    }
-
-
-/** Release a number of glyph outlines. Decrement their reference count.
- * Remove it from cache if reference count decreases to zero.
-@param aCount: Input. Number of outlines to be released.
-@param aCodes: Input. An array of codes. Its interpretation depends on the parameter
-    'aIsGlyphId' (see below).
-@param aIsGlyphId: Input. When aIsGlyphId==ETrue, 'aCodes' is an array of glyph ID's.
-    When aIsGlyphId==EFalse, 'aCodes' is an array of Unicode values.
-@param aHinted: Input. To indicate if the outlines are hinted or unhinted.
-@param aSessionHandle: Input. Handle to the session releasing the outlines.
-@return KErrNone on success, specific error code on failure.
-@internalTechnology
-*/
-EXPORT_C void CBitmapFont::ReleaseGlyphOutlines(TInt aCount, const TUint *aCodes, 
-        TBool aHinted, TInt aSessionHandle)
-    {
-    COpenFont *fontPtr = NULL;
-        if (IsOpenFont())
-            fontPtr = OpenFont();
-        else
-            return;
-    
-    CFontStore *fontStore = fontPtr->File()->GetFontStore();
-    
-    for (TInt i = 0; i < aCount; ++i)
-        {
-        if (aHinted)
-            {
-            THintedOutlineId outlineId(fontPtr, aCodes[i]);
-            fontStore->ReleaseHintedOutline(outlineId, aSessionHandle);
-            }
-        else
-            {
-            TInt faceId = fontPtr->FaceIndex();
-            TUnhintedOutlineId outlineId(fontPtr->File()->Uid(), faceId, aCodes[i]);
-            fontStore->ReleaseUnhintedOutline(outlineId, aSessionHandle);
-            }
-        }
-    }
-
-/** Gets a font table.
-@param aCode: Input. An glyph code. Its interpretation depends on the parameter
-    'aIsGlyphId' (see below).
-@param aIsGlyphId: Input. When aIsGlyphId==ETrue, 'aCode' is a glyph ID.
-    When aIsGlyphId==EFalse, 'aCode' is a Unicode values.
-@param aHinted: Input. To indicate if hinted or unhinted outline is needed.
-@param aOutline: Output. A 'void*' pointer, pointing to the outline in memory.
-@param aLength: Output. A TInt, recording the lenght (in bytes) of the outline.
-@param aSessionHandle: Input. Handle to the session requesting this outline.
-@return KErrNone on success, specific error code on failure.
-@internalTechnology
-*/
-EXPORT_C TInt CBitmapFont::GetGlyphOutline(TUint aCode, 
-        TBool aHinted, TAny *&aOutline, TInt &aLength, TInt aSessionHandle)
-    {
-    COpenFont *fontPtr = NULL;
-        if (IsOpenFont())
-            fontPtr = OpenFont();
-        else
-            return KErrNotSupported;
-    
-    CFontStore *fontStore = fontPtr->File()->GetFontStore();
-    TAny *outlineData = NULL; 
-    TInt len = KErrGeneral;
-    TInt ret = KErrNone;
-    if (!aHinted)
-        {
-        TInt faceId = fontPtr->FaceIndex();
-        TUnhintedOutlineId outlineId(fontPtr->File()->Uid(), faceId, aCode);
-        ret = fontStore->FindUnhintedOutlineInCache(outlineId, outlineData, len);
-        if (KErrNotFound == ret)
-            {
-            TAny* tmpOutline = 0; 
-            TInt tmpLen = 0;
-            ret = fontPtr->GetGlyphOutline(aCode, aHinted, tmpOutline, tmpLen);
-            if (KErrNone == ret)
-                {
-                fontStore->CacheUnhintedOutline(outlineId,
-                        tmpOutline, (TInt)tmpLen, outlineData, len);
-                }
-            User::Free(tmpOutline);
-            }
-        if (KErrNone == ret)
-            {
-            fontStore->IncreaseUnhintedOutlineRefCount(outlineId, aSessionHandle);
-            }
-        }
-    else 
-        {
-        THintedOutlineId outlineId(fontPtr, aCode);
-        ret = fontStore->FindHintedOutlineInCache(outlineId, outlineData, len);
-        if (KErrNotFound == ret)
-            {
-            TAny* tmpOutline = 0; 
-            TInt tmpLen = 0;
-            ret = fontPtr->GetGlyphOutline(aCode, aHinted, tmpOutline, tmpLen);
-            if (KErrNone == ret)
-                {
-                fontStore->CacheHintedOutline(outlineId,
-                        tmpOutline, (TInt)tmpLen, outlineData, len);
-                }
-            User::Free(tmpOutline);
-            }
-        if (KErrNone == ret)
-            {
-            fontStore->IncreaseHintedOutlineRefCount(outlineId, aSessionHandle);
-            }
-        }
-    
-    aOutline = outlineData;
-    aLength = len;    
-    return KErrNone;
-    }
 
 EXPORT_C TUint32 CBitmapFont::UniqueFontId()
 	{
@@ -1340,866 +1157,6 @@
 	}
 
 
-CFontTableCacheItem::CFontTableCacheItem(TUid &aFileUid, const TUint32 aTag, 
-        TInt aOffset, TInt aLength): iFileUid(aFileUid), iTag(aTag),
-        iOffset(aOffset), iLength(aLength)
-    {
-    // a null constructor
-    }
-
-CFontTableCacheItem::~CFontTableCacheItem()
-    {
-    iUsers.ResetAndDestroy();
-    iUsers.Close();
-    }
-    
-TBool CFontTableCacheItem::HasOutstandingRefCount()
-    {
-    TInt count = iUsers.Count();
-    for (TInt j = 0; j < count; ++j)
-        {
-        if (iUsers[j]->iRefCount > 0) 
-            {
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-
-
-TInt CFontTableCacheItem::FindUser(TInt aSessionHandle, TInt *id) 
-    {
-    TInt len = iUsers.Count();
-    for (TInt i = 0; i < len; ++i)
-        {
-        if (aSessionHandle == iUsers[i]->iSessionHandle)
-            {
-            *id = i;
-            return KErrNone;
-            }
-        }
-    return KErrNotFound;
-    }
-
-TInt CFontTableCacheItem::DecRefCount(TInt aSessionHandle)
-    {
-    TInt id = 0; 
-    TInt ret = FindUser(aSessionHandle, &id);
-    if (KErrNone == ret)
-        {
-        iUsers[id]->iRefCount--;
-        if (0 == iUsers[id]->iRefCount) 
-            {
-            delete iUsers[id];
-            iUsers.Remove(id);
-            }
-        return iUsers.Count();
-        }
-    return KErrNotFound;
-    }
-
-TInt CFontTableCacheItem::IncRefCount(TInt aSessionHandle)
-    {
-    TInt id = 0; 
-    TInt ret = FindUser(aSessionHandle, &id);
-    if (KErrNone == ret)
-        {
-        iUsers[id]->iRefCount++;
-        }
-    else
-        {
-        TCacheUserInfo *newUser = new TCacheUserInfo(aSessionHandle, 1);
-        if (NULL != newUser)
-            {
-            TRAP(ret, iUsers.AppendL(newUser));
-            }
-        else 
-            {
-            ret = KErrNoMemory;
-            }
-        //coverity[leaked_storage]
-        // The 'newUser' is kept in iUsers. It will be deleted in DecRefCount(). 
-        }
-    return ret;
-    }
-
-TInt CFontTableCache::Append(TUid aFileUid, TUint32 aTag, 
-        TAny *&aContent, TInt aLength) 
-    {
-    TInt ret = 0;
-    if ((TUint32)iCacheMemMon.GetMemUsage() >= KFontTable_GlyphOutline_CacheMaxMem)
-        {
-        RDebug::Printf("Table/Glyph cache full. Unable to add new item.");
-        return KErrNoMemory;
-        }
-    // make a copy of the table content on the shared heap.
-    TAny *sharedCopy = iHeap->Alloc(aLength);
-    if (NULL == sharedCopy) 
-        {
-        return KErrNoMemory;
-        }
-    
-    Mem::Copy(sharedCopy, aContent, aLength);
-
-    CFontTableCacheItem *newItem = NULL;
-    TInt offset = PointerToOffset(sharedCopy, iHeap->Base());
-    TRAP(ret, newItem = new(ELeave) CFontTableCacheItem(aFileUid, aTag, offset, aLength));
-    if (KErrNone != ret)
-        {
-        iHeap->Free(sharedCopy);
-        return ret;
-        }
-    
-    TRAP(ret, iCacheItems.AppendL(newItem));
-    if (KErrNone == ret)
-        {
-        // do not free 'aContent', because the mem is managed by
-        // rasterizer cache.
-        aContent = sharedCopy;
-        iCacheMemMon.Inc(aLength);
-        }
-    else 
-        {
-        iHeap->Free(sharedCopy);
-        }
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    return ret;
-    }
-
-TInt CFontTableCache::Find(TUid aFileUid, TUint32 aTag, TAny *&aContent, 
-        TInt &aLength, TInt *id)
-    {
-    *id = KErrNotFound;
-    TInt len = iCacheItems.Count();
-    
-    TInt ret = KErrNotFound;
-    for (TInt i = 0; i < len; ++i)
-        {
-        CFontTableCacheItem *item = iCacheItems[i]; 
-        if (item->iFileUid == aFileUid && item->iTag == aTag) 
-            {
-            aContent = OffsetToPointer(item->iOffset, iHeap->Base());
-            aLength = item->iLength;
-            *id = i;
-            ret = KErrNone;
-            break;
-            }
-        }
-    
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    return ret;
-    }
-
-CFontTableCache::CFontTableCache(RHeap *aHeap, TFontTableGlyphOutlineCacheMemMonitor &aMon): 
-    iCacheMemMon(aMon), iHeap(aHeap) 
-    {
-    // null constructor
-    }
-
-CFontTableCache::~CFontTableCache()
-    {
-    for (TInt i = 0; i < iCacheItems.Count(); ++i)
-        {
-        iHeap->Free(OffsetToPointer(iCacheItems[i]->iOffset, iHeap->Base()));
-        }
-    iCacheItems.ResetAndDestroy();
-    iCacheItems.Close();
-    }
-
-TInt CFontTableCache::IncRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle)
-    {
-    TAny *outline = NULL;
-    TInt len = 0;
-    TInt id = 0;
-    
-    TInt ret = Find(aFileUid, aTag, outline, len, &id);
-    if (KErrNone == ret)
-        {
-        ret = iCacheItems[id]->IncRefCount(aSessionHandle);
-        }
-    
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    return ret;
-    }
-
-TInt CFontTableCache::DecRefCount(TUid aFileUid, TUint32 aTag, TInt aSessionHandle)
-    {
-    TAny *outline = NULL;
-    TInt len = 0;
-    TInt id = 0;
-    
-    TInt ret = Find(aFileUid, aTag, outline, len, &id);
-    if (KErrNone == ret) 
-        {
-        TInt numUsers = iCacheItems[id]->DecRefCount(aSessionHandle);
-        if (0 == numUsers) 
-            {
-            // There is no outstanding reference to the cache item.
-            iHeap->Free(outline);
-            iCacheMemMon.Dec(len);
-            delete (iCacheItems[id]);
-            iCacheItems.Remove(id);
-            }
-        }
-    
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    return ret;
-    }
-
-TBool CFontTableCache::HasOutstandingRefCount() 
-    {
-    TInt len = iCacheItems.Count();
-   
-    for (TInt i = 0; i < len; ++i)
-        {
-        if (iCacheItems[i]->HasOutstandingRefCount())
-            {
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-
-TBool CFontTableCache::HasOutstandingRefCountWithUid(TUid aFileUid)
-    {
-    TInt len = iCacheItems.Count();
-   
-    for (TInt i = 0; i < len; ++i)
-        {
-        if (iCacheItems[i]->iFileUid == aFileUid) 
-            {
-            if (iCacheItems[i]->HasOutstandingRefCount())
-                {
-                return ETrue;
-                }
-            }
-        }
-    return EFalse;
-    }
-
-void CFontTableCache::CleanupCacheOnOpenFontFileRemoval(COpenFontFile *)
-    {
-    // In CFontStore::RemoveFile(), a font file is not allowed to be removed if
-    // there are outstanding ref counts on any table in it. If that check passed 
-    // and this function is called, there shall be no cache item for that file.
-    
-    // Currently a cache item having a refcount of 0 is removed immediately.
-    // If this strategy is changed in the future, we may need to do some
-    // cleanup here.
-    }
-
-void CFontTableCache::CleanupCacheOnFbsSessionTermination(TInt aSessionHandle)
-    {
-    TInt len = iCacheItems.Count();
-   
-    for (TInt i = 0; i < len; ++i)
-        {
-        TInt id = -1;
-        if (KErrNone == iCacheItems[i]->FindUser(aSessionHandle, &id))
-            {
-            iCacheItems[i]->iUsers.Remove(id);
-            if (iCacheItems[i]->iUsers.Count() == 0)
-                {
-                iHeap->Free(OffsetToPointer(iCacheItems[i]->iOffset, iHeap->Base()));
-                iCacheMemMon.Dec(iCacheItems[i]->iLength);
-                delete iCacheItems[i];
-                iCacheItems.Remove(i);
-                }
-            }
-        }
-    }
-
-
-#ifdef _DEBUG
-TInt CFontTableCache::GetCacheState(const char *func) 
-    {
-    RDebug::Printf("%s called from %s: ", __func__, func);
-    TBuf<256> buf;
-    
-    int len = iCacheItems.Count();
-    int numTables = 0, numSessions = 0, totalRef = 0;
-    buf.Append(_L("Table cache: "));
-    for (int i = 0; i < len; ++i)
-        {
-        ++numTables;
-        TInt abc = iCacheItems[i]->iUsers.Count();
-        numSessions += abc;
-        for (int j = 0; j < abc; ++j)
-            {
-            totalRef += iCacheItems[i]->iUsers[j]->iRefCount;
-            }
-        }
-    if (0 == iCacheItems.Count())
-        {
-        buf.Append(_L("cache empty. "));
-        }
-    else 
-        {
-        buf.AppendFormat(_L("%d tables referenced by %d sessions, total ref count %d"),
-                numTables, numSessions, totalRef);
-        }
-    RDebug::RawPrint(buf);
-    return 0;
-    }
-#endif
-
-
-
-TInt COutlineCacheItem::FindUser(TInt aSessionHandle, TInt *id) 
-    {
-    TInt len = iUsers.Count();
-    for (TInt i = 0; i < len; ++i)
-        {
-        if (aSessionHandle == iUsers[i]->iSessionHandle)
-            {
-            *id = i;
-            return KErrNone;
-            }
-        }
-    return KErrNotFound;
-    }
-
-COutlineCacheItem::~COutlineCacheItem() 
-    { 
-    iUsers.ResetAndDestroy(); 
-    }
-
-COutlineCacheItem::COutlineCacheItem(TInt aOffset, TInt aLength):
-    iOffset(aOffset), iLength(aLength)
-    {
-    // a null constructor.
-    }
-
-TInt COutlineCacheItem::DecRefCount(TInt aSessionHandle)
-    {
-    TInt id = 0; 
-    TInt ret = FindUser(aSessionHandle, &id);
-    if (KErrNone == ret)
-        {
-        iUsers[id]->iRefCount--;
-        if (0 == iUsers[id]->iRefCount) 
-            {
-            delete iUsers[id];
-            iUsers.Remove(id);
-            }
-        return iUsers.Count();
-        }
-    return KErrNotFound;
-    }
-
-TInt COutlineCacheItem::IncRefCount(TInt aSessionHandle)
-    {
-    TInt id = 0; 
-    TInt ret = FindUser(aSessionHandle, &id);
-    if (KErrNone == ret)
-        {
-        iUsers[id]->iRefCount++;
-        }
-    else
-        {
-        TCacheUserInfo *newUser = new TCacheUserInfo(aSessionHandle, 1);
-        if (NULL != newUser)
-            {
-            TRAP(ret, iUsers.AppendL(newUser));
-            }
-        else 
-            {
-            ret = KErrNoMemory;
-            }
-        //coverity[leaked_storage]
-        // The 'newUser' is kept in iUsers. It will be deleted in DecRefCount().
-        }
-    return ret;
-    }
-
-#ifdef _DEBUG
-TInt CUnhintedOutlineCache::GetCacheState(const char *func)
-    {
-    RDebug::Printf("%s called from %s: ", __func__, func);
-    int numSessions = 0, totalRef = 0;
-    THashMapIter<TUnhintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        COutlineCacheItem **data = it.CurrentValue();
-        int len = (*data)->iUsers.Count();
-        numSessions += len;
-        for (int j = 0; j < len; ++j)
-            {
-            totalRef += (*data)->iUsers[j]->iRefCount;
-            }
-        it.NextValue();
-        }
-    
-    TBuf<256> buf;
-    buf.Append(_L("Unhinted outline cache: "));
-    TInt numItems = iItemIdMap.Count();
-    if (0 == numItems)
-        {
-        buf.Append(_L("empty. "));
-        }
-    else 
-        {
-        buf.AppendFormat(_L("%d glyphs, %d sessions, total refcount %d"),
-                numItems, numSessions, totalRef);
-        }
-        
-    RDebug::RawPrint(buf);
-            
-    return 0;
-    }
-#endif
-
-CUnhintedOutlineCache::CUnhintedOutlineCache(RHeap *aHeap, TFontTableGlyphOutlineCacheMemMonitor &aMon):
-    iCacheMemMon(aMon), iHeap(aHeap), 
-    iItemIdMap(THashFunction32<TUnhintedOutlineId>(CUnhintedOutlineCache::IdHash),
-        TIdentityRelation<TUnhintedOutlineId>(CUnhintedOutlineCache::IdIdentity))
-    { 
-    
-    }
-
-CUnhintedOutlineCache::~CUnhintedOutlineCache()
-    {
-    THashMapIter<TUnhintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        const TUnhintedOutlineId *outlineId = it.CurrentKey();
-        COutlineCacheItem **data = it.CurrentValue();
-        
-        // loop body here!
-        iHeap->Free(OffsetToPointer((*data)->iOffset, iHeap->Base()));
-        delete (*data);
-        iItemIdMap.Remove(*outlineId);
-        // end loop body
-        
-        it.NextValue();
-        }
-    return;
-    }
-
-
-TInt CUnhintedOutlineCache::CleanupCacheOnOpenFontFileRemoval(COpenFontFile *aFontFile)
-    {
-    TUid fileUid = aFontFile->Uid();
-    
-    THashMapIter<TUnhintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        const TUnhintedOutlineId *outlineId = it.CurrentKey();
-        COutlineCacheItem **data = it.CurrentValue();
-        
-        // loop body here!
-        if (outlineId->iFileUid == fileUid)
-            {
-            iHeap->Free(OffsetToPointer((*data)->iOffset, iHeap->Base()));
-            iCacheMemMon.Dec((*data)->iLength);
-            delete (*data);
-            iItemIdMap.Remove(*outlineId);
-            }
-        // end loop body
-        
-        it.NextValue();
-        }
-    return KErrNone;
-    }
-
-TInt CUnhintedOutlineCache::CleanupCacheOnFbsSessionTermination(TInt aSessionHandle)
-    {
-    THashMapIter<TUnhintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        const TUnhintedOutlineId *outlineId = it.CurrentKey();
-        COutlineCacheItem **data = it.CurrentValue();
-        
-        // loop body here!
-        TInt id = 0;
-        TInt ret = (*data)->FindUser(aSessionHandle, &id);
-        if (KErrNone == ret)
-            {
-            delete (*data)->iUsers[id];
-            (*data)->iUsers.Remove(id);
-            if (0 == (*data)->iUsers.Count())
-                {
-                iHeap->Free(OffsetToPointer((*data)->iOffset, iHeap->Base()));
-                iCacheMemMon.Dec((*data)->iLength);
-                delete (*data);
-                iItemIdMap.Remove(*outlineId);
-                }
-            }
-        // end loop body
-        
-        it.NextValue();
-        }
-    return KErrNone;
-    }
-
-
-TInt CUnhintedOutlineCache::CacheUnhintedOutline(const TUnhintedOutlineId &aOutlineId, 
-        TAny* const aData, const TInt aLength, TAny *&aOutline, TInt &aLen)
-    {
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    if ((TUint32)iCacheMemMon.GetMemUsage() >= KFontTable_GlyphOutline_CacheMaxMem)
-        {
-        RDebug::Printf("Table/Glyph cache full. Unable to add new item.");
-        return KErrNoMemory;
-        }
-    
-    aLen = KErrGeneral;
-    TInt ret1= KErrNone;
-
-    // make a copy of the outline data on the shared heap.
-    TAny *sharedCopy = iHeap->Alloc(aLength);
-    if (NULL == sharedCopy) 
-        {
-        return KErrNoMemory;
-        }
-    
-    Mem::Copy(sharedCopy, aData, aLength);
-
-    COutlineCacheItem *newItem = NULL;
-    TInt offset = PointerToOffset(sharedCopy, iHeap->Base());
-    TRAP(ret1, newItem = new(ELeave) COutlineCacheItem(offset, aLength));
-    if (KErrNone != ret1)
-        {
-        iHeap->Free(sharedCopy);
-        sharedCopy = NULL;
-        }
-    else 
-        {
-        TRAP(ret1, iItemIdMap.InsertL(aOutlineId, newItem));
-        if (KErrNone != ret1)
-            {
-            delete newItem;
-            iHeap->Free(sharedCopy);
-            sharedCopy = NULL;
-            }
-        else
-            {
-            iCacheMemMon.Inc(aLength);
-            aLen = aLength;
-            }
-        }
-    aOutline = sharedCopy;
-    return ret1;  
-    }
-
-TInt CUnhintedOutlineCache::IncRefCount(const TUnhintedOutlineId &aOutlineId,
-        TInt aSessionHandle)
-    {
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    COutlineCacheItem **ret = iItemIdMap.Find(aOutlineId);
-    if (NULL != ret)
-        {
-        (*ret)->IncRefCount(aSessionHandle);
-        }
-    return (NULL==ret?KErrNotFound:KErrNone);
-    }
-
-TInt CUnhintedOutlineCache::DecRefCount(const TUnhintedOutlineId &aOutlineId,
-        TInt aSessionHandle)
-    {
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    COutlineCacheItem **ret = iItemIdMap.Find(aOutlineId); 
-    if (NULL != ret) 
-        {
-        TInt numUsers = (*ret)->DecRefCount(aSessionHandle);
-        if (0 == numUsers) 
-            {
-            // There is no outstanding reference to the cache item.
-            iHeap->Free(OffsetToPointer((*ret)->iOffset, iHeap->Base()));
-            iCacheMemMon.Dec((*ret)->iLength);
-            delete (*ret);
-            iItemIdMap.Remove(aOutlineId);
-            }
-        }
-    return (NULL==ret?KErrNotFound:KErrNone);
-    }
-
-TInt CUnhintedOutlineCache::Find(const TUnhintedOutlineId &aOutlineId, TAny *&aData, 
-        TInt &aLength)
-    {
-    COutlineCacheItem **ret = iItemIdMap.Find(aOutlineId);
-    TInt ret2 = KErrNone;
-    if (NULL != ret)
-        {
-        aData = OffsetToPointer((*ret)->iOffset, iHeap->Base());
-        aLength = (*ret)->iLength;
-        }
-    else
-        {
-        ret2 = KErrNotFound;
-        }
-    return ret2;
-    }
-    
-  
-TUint32 CUnhintedOutlineCache::IdHash(const TUnhintedOutlineId &outlineId)
-    {
-    // The hash value: 
-    // bits 0-15: glyph id; 
-    // bits 16-23: lower 8 bit of font file uid
-    // bits 24-27: lower 4 bit of the face index
-    // bit 28: 'isGlyphId'
-    TUint32 ret = 0;
-    ret |= (outlineId.iId & KOutlineGlyphIdHashMask);
-    ret |= (KOutlineFileUidHashMask & (outlineId.iFileUid.iUid << 16));
-    ret |= (KOutlineFaceIndexHashMask & (outlineId.iFaceIndex << 24));
-    ret = (ret % 701);
-    return ret;
-    }
-
-TBool CUnhintedOutlineCache::IdIdentity(const TUnhintedOutlineId &id1, const TUnhintedOutlineId &id2)
-    {
-    return id1.iId == id2.iId && id1.iFaceIndex == id2.iFaceIndex &&
-            id1.iFileUid == id2.iFileUid;
-    }
-
-// hinted outline cache
-#ifdef _DEBUG
-TInt CHintedOutlineCache::GetCacheState(const char *func)
-    {
-    RDebug::Printf("%s called from %s: ", __func__, func);
-    int numSessions = 0, totalRef = 0;
-    THashMapIter<THintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        COutlineCacheItem **data = it.CurrentValue();
-        int len = (*data)->iUsers.Count();
-        numSessions += len;
-        for (int j = 0; j < len; ++j)
-            {
-            totalRef += (*data)->iUsers[j]->iRefCount;
-            }
-        it.NextValue();
-        }
-    
-    TBuf<256> buf;
-    buf.Append(_L("Hinted outline cache: "));
-    TInt numItems = iItemIdMap.Count();
-    if (0 == numItems)
-        {
-        buf.Append(_L("empty. "));
-        }
-    else 
-        {
-        buf.AppendFormat(_L("%d glyphs, %d sessions, total refcount %d"),
-                numItems, numSessions, totalRef);
-        }
-        
-    RDebug::RawPrint(buf);
-            
-    return 0;
-    }
-#endif
-
-TInt CHintedOutlineCache::CleanupCacheOnOpenFontRemoval(COpenFont *aFont)
-    {
-    THashMapIter<THintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        const THintedOutlineId *outlineId = it.CurrentKey();
-        COutlineCacheItem **data = it.CurrentValue();
-        
-        // loop body here!
-        if (outlineId->iFont == aFont)
-            {
-            iCacheMemMon.Dec((*data)->iLength);
-            iHeap->Free(OffsetToPointer((*data)->iOffset, iHeap->Base()));
-            delete (*data);
-            iItemIdMap.Remove(*outlineId);
-            }
-        // end loop body
-        
-        it.NextValue();
-        }
-    return KErrNone;
-    }
-
-TInt CHintedOutlineCache::CleanupCacheOnFbsSessionTermination(TInt aSessionHandle)
-    {
-    THashMapIter<THintedOutlineId, COutlineCacheItem*> it(iItemIdMap);
-    it.NextValue();
-    while (it.CurrentValue())
-        {
-        const THintedOutlineId *outlineId = it.CurrentKey();
-        COutlineCacheItem **data = it.CurrentValue();
-        
-        // loop body here!
-        TInt id = 0; 
-        TInt ret = (*data)->FindUser(aSessionHandle, &id);
-        if (KErrNone == ret)
-            {
-            delete (*data)->iUsers[id];
-            (*data)->iUsers.Remove(id);
-            if (0 == (*data)->iUsers.Count())
-                {
-                iCacheMemMon.Dec((*data)->iLength);
-                iHeap->Free(OffsetToPointer((*data)->iOffset, iHeap->Base()));
-                delete (*data);
-                iItemIdMap.Remove(*outlineId);
-                }
-            }
-        // end loop body
-        
-        it.NextValue();
-        }
-
-    return KErrNone;
-    }
-
-
-CHintedOutlineCache::CHintedOutlineCache(RHeap *aHeap, TFontTableGlyphOutlineCacheMemMonitor &aMon):
-    iCacheMemMon(aMon), iHeap(aHeap), 
-    iItemIdMap(THashFunction32<THintedOutlineId>(CHintedOutlineCache::IdHash),
-        TIdentityRelation<THintedOutlineId>(CHintedOutlineCache::IdIdentity)) 
-    { 
-    // a null constructor
-    }
-
-TInt CHintedOutlineCache::CacheHintedOutline(const THintedOutlineId &aOutlineId,
-        TAny* aData, TInt aLength, TAny *&aOutline, TInt &aLen)
-    {
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    if ((TUint32)iCacheMemMon.GetMemUsage() >= KFontTable_GlyphOutline_CacheMaxMem)
-        {
-        RDebug::Printf("Table/Glyph cache full. Unable to add new item.");
-        return KErrNoMemory;
-        }
-    
-    aLen = KErrGeneral;
-    TInt ret = KErrNone;
-    // make a copy of the outline data on the shared heap.
-    TAny *sharedCopy = iHeap->Alloc(aLength);
-    if (NULL == sharedCopy) 
-        {
-        return KErrNoMemory;
-        }
-    
-    Mem::Copy(sharedCopy, aData, aLength);
-
-    COutlineCacheItem *newItem = NULL;
-    TInt offset = PointerToOffset(sharedCopy, iHeap->Base());
-    TRAP(ret, newItem = new(ELeave) COutlineCacheItem(offset, aLength));
-    if (KErrNone != ret)
-        {
-        iHeap->Free(sharedCopy);
-        sharedCopy = NULL;
-        }
-    else 
-        {
-        TRAP(ret, iItemIdMap.InsertL(aOutlineId, newItem));
-        if (KErrNone != ret)
-            {
-            delete newItem;
-            iHeap->Free(sharedCopy);
-            sharedCopy = NULL;
-            }
-        else
-            {
-            iCacheMemMon.Inc(aLength);
-            aLen = aLength;
-            }
-        }
-    aOutline = sharedCopy;
-    return ret;
-    }
-
-TInt CHintedOutlineCache::IncRefCount(const THintedOutlineId &aOutlineId, 
-        TInt aSessionHandle)
-    {
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    COutlineCacheItem **data = iItemIdMap.Find(aOutlineId);
-    if (NULL != data)
-        {
-        (*data)->IncRefCount(aSessionHandle);
-        }
-    return (NULL==data?KErrNotFound:KErrNone);
-    }
-
-TInt CHintedOutlineCache::DecRefCount(const THintedOutlineId &aOutlineId,
-        TInt aSessionHandle)
-    {
-#ifdef _DEBUG
-    GetCacheState(__func__);
-#endif
-    COutlineCacheItem **data = iItemIdMap.Find(aOutlineId);
-    if (NULL != data) 
-        {
-        TInt numUsers = (*data)->DecRefCount(aSessionHandle);
-        if (0 == numUsers) 
-            {
-            // There is no outstanding reference to the cache item.
-            iCacheMemMon.Dec((*data)->iLength);
-            iHeap->Free(OffsetToPointer((*data)->iOffset, iHeap->Base()));
-            delete (*data);
-            iItemIdMap.Remove(aOutlineId);
-            }
-        }
-    return (NULL==data?KErrNotFound:KErrNone);
-    }
-
-TInt CHintedOutlineCache::Find(const THintedOutlineId &aOutlineId, 
-        TAny *&aData, TInt &aLength)
-    {
-    COutlineCacheItem **ret = iItemIdMap.Find(aOutlineId);
-    TInt ret2 = KErrNone;
-    if (NULL != ret)
-        {
-        aData = OffsetToPointer((*ret)->iOffset, iHeap->Base());
-        aLength = (*ret)->iLength;
-        }
-    else
-        {
-        ret2 = KErrNotFound;
-        }
-    return ret2;
-    }
-
-
-TUint32 CHintedOutlineCache::IdHash(const THintedOutlineId &outlineId)
-    {
-    // The hash value:
-    // bits 0-15: the outline id
-    // bits 16-27: the lower 12 bits of the font pointer
-    // bit 28: 'isGlyphId'
-    
-    TUint32 ret = 0;
-    ret |= (KOutlineGlyphIdHashMask & outlineId.iId);
-    ret |= (KOutlineFontPtrHashMask & (((TUint32)outlineId.iFont) << 16));
-    ret = ret % 701;
-    return ret;
-    }
-
-TBool CHintedOutlineCache::IdIdentity(const THintedOutlineId &id1, const THintedOutlineId &id2)
-    {
-    return id1.iId == id2.iId && id1.iFont == id2.iFont;
-    }
-// hinted cache
-
-
 CFontStore::CFontStore(RHeap* aHeap):
 	iKPixelWidthInTwips(KDefaultPixelWidthInTwips),
 	iKPixelHeightInTwips(KDefaultPixelHeightInTwips),
@@ -2261,12 +1218,6 @@
 
 	if (twipSize.iHeight > 0 && pixelSize.iHeight > 0)
 		iKPixelHeightInTwips = twipSize.iHeight * 1000 / pixelSize.iHeight;
-	
-	iCacheMemMon = new(ELeave) TFontTableGlyphOutlineCacheMemMonitor;
-	iUnhintedOutlineCache = new(ELeave) CUnhintedOutlineCache(iHeap, *iCacheMemMon);
-	iHintedOutlineCache = new(ELeave) CHintedOutlineCache(iHeap, *iCacheMemMon);
-	iFontTableCache = new(ELeave) CFontTableCache(iHeap, *iCacheMemMon);
-	
 	}
 
 /** Creates a new CFontStore object.
@@ -2311,11 +1262,6 @@
         delete iHandleArray;
         }
 	iFs.Close();
-	
-    delete iFontTableCache;
-    delete iUnhintedOutlineCache;
-    delete iHintedOutlineCache;
-    delete iCacheMemMon;
 	}
 
 
@@ -2795,11 +1741,6 @@
 				if((*iFontAccess)[i].iAccessCount)
 					return;
 			}
-		if (iFontTableCache && iFontTableCache->HasOutstandingRefCount())
-		    {
-		    // disallow font file removal if any font tables are still cached
-		    return;
-		    }
 		
 		iTypefaceList.ResetAndDestroy();
 		count = iFontBitmapList.Count();
@@ -2834,14 +1775,6 @@
 		  	  	  			}
 						}
 					} // Safe to proceed with removing file
-				// also check if there are outstanding references to any 
-				// table in that file.
-				if (iFontTableCache && iFontTableCache->HasOutstandingRefCountWithUid(aFileUid))
-				    {
-				    return; // outstanding reference to font table found.
-				    }
-				
-				// Safe to proceed with removing file
 				if (iOpenFontFileList[i]->DecRefCount())
 					{ // unload the font file
 					RemoveTypefacesFromSupportList(iOpenFontFileList[i]);
@@ -4901,147 +3834,6 @@
 	return EFalse;	
 	}
 
-TInt CFontStore::CacheFontTable(TUid aFileUid, TUint32 aTag, 
-        TAny *&aContent, TInt aLength)
-    {
-    return iFontTableCache->Append(aFileUid, aTag, aContent, aLength);
-    }
-
-TInt CFontStore::FindFontTableInCache(TUid aFileUid, TUint32 aTag, 
-        TAny *&aContent, TInt &aLength)
-    {
-    TInt id;
-    return iFontTableCache->Find(aFileUid, aTag, aContent, aLength, &id);
-    }
-
-TInt CFontStore::IncreaseUnhintedOutlineRefCount(const TUnhintedOutlineId &aOutlineId, 
-        TInt aSessionHandle)
-    {
-    return iUnhintedOutlineCache->IncRefCount(aOutlineId, aSessionHandle);
-    }
-
-TInt CFontStore::IncreaseHintedOutlineRefCount(const THintedOutlineId &aOutlineId,
-        TInt aSessionHandle)
-    {
-    return iHintedOutlineCache->IncRefCount(aOutlineId, aSessionHandle);
-    }
-
-TInt CFontStore::IncFontTableRefCount(TUid aFileUid, TUint32 aTag, 
-        TInt aSessionHandle)
-    {
-    return iFontTableCache->IncRefCount(aFileUid, aTag, aSessionHandle);
-    }
-
-TInt CFontStore::DecFontTableRefCount(TUid aFileUid, TUint32 aTag, 
-        TInt aSessionHandle)
-    {
-    return iFontTableCache->DecRefCount(aFileUid, aTag, aSessionHandle);
-    }
-
-TInt CFontStore::CacheUnhintedOutline(const TUnhintedOutlineId &aOutlineId, TAny * aData, 
-        TInt aLength, TAny *&aOutline, TInt &aLen)
-    {
-    return iUnhintedOutlineCache->CacheUnhintedOutline(aOutlineId, aData, aLength, 
-            aOutline, aLen);
-    }
-
-TInt CFontStore::CacheHintedOutline(const THintedOutlineId &aOutlineId,
-        TAny * aData, TInt aLength, TAny *&aOutline, TInt &aLen)
-    {
-    return iHintedOutlineCache->CacheHintedOutline(aOutlineId, aData, aLength,
-            aOutline, aLen);
-    }
-
-TInt CFontStore::ReleaseUnhintedOutline(const TUnhintedOutlineId &aOutlineId, 
-        TInt aSessionHandle)
-    {
-    return iUnhintedOutlineCache->DecRefCount(aOutlineId, aSessionHandle);    
-    }
-
-TInt CFontStore::ReleaseHintedOutline(const THintedOutlineId &aOutlineId,
-        TInt aSessionHandle)
-    {
-    return iHintedOutlineCache->DecRefCount(aOutlineId, aSessionHandle);    
-    }
-
-TInt CFontStore::ReleaseFontTable(TUid aFileUid, TUint32 aTag, 
-        TInt aSessionHandle)
-    {
-    return iFontTableCache->DecRefCount(aFileUid, aTag, aSessionHandle);
-    }
-
-TInt CFontStore::FindUnhintedOutlineInCache(const TUnhintedOutlineId &aOutlineId, TAny *&aData, 
-        TInt &aLength)
-    {
-    return iUnhintedOutlineCache->Find(aOutlineId, aData, aLength);
-    }
-
-TInt CFontStore::FindHintedOutlineInCache(const THintedOutlineId &aOutlineId, 
-        TAny *&aData, TInt &aLength)
-    {
-    return iHintedOutlineCache->Find(aOutlineId, aData, aLength);
-    }
-
-void CFontStore::CleanupCacheOnOpenFontRemoval(COpenFont *aFont)
-    {
-    iHintedOutlineCache->CleanupCacheOnOpenFontRemoval(aFont);
-    //iUnhintedOutlineCache.OnOpenFontRemoval(aFont);
-    }
-
-void CFontStore::CleanupCacheOnOpenFontFileRemoval(COpenFontFile *aFontFile) 
-    {
-    iUnhintedOutlineCache->CleanupCacheOnOpenFontFileRemoval(aFontFile);
-    iFontTableCache->CleanupCacheOnOpenFontFileRemoval(aFontFile);
-    }
-
-/** Clean up font table and glyph outline caches when an FBS session is terminated.
- * All the reference counts related to that session are cleared.
-@param aSession: Input. A pointer to the terminating session.
-@return always returns KErrNone.
-@internalTechnology
-*/
-EXPORT_C
-void CFontStore::CleanupCacheOnFbsSessionTermination(TInt aSessionHandle)
-    {
-    iHintedOutlineCache->CleanupCacheOnFbsSessionTermination(aSessionHandle);
-    iUnhintedOutlineCache->CleanupCacheOnFbsSessionTermination(aSessionHandle);
-    iFontTableCache->CleanupCacheOnFbsSessionTermination(aSessionHandle);
-    }
-
-
-void TFontTableGlyphOutlineCacheMemMonitor::Inc(TInt aBytes)
-    {
-    iBytes += aBytes;
-    }
-
-void TFontTableGlyphOutlineCacheMemMonitor::Dec(TInt aBytes)
-    {
-    iBytes -= aBytes;
-    }
-
-TInt TFontTableGlyphOutlineCacheMemMonitor::GetMemUsage()
-    {
-    return iBytes;
-    }
-
-TFontTableGlyphOutlineCacheMemMonitor::TFontTableGlyphOutlineCacheMemMonitor(): 
-    iBytes(0) 
-    {
-    // null constructor
-    }
-
-TUnhintedOutlineId::TUnhintedOutlineId(TUid aFileUid, TInt aFaceIndex, TUint aId):
-iFileUid(aFileUid), iFaceIndex(aFaceIndex), iId(aId)
-    {
-    // a null constructor;
-    }
-
-THintedOutlineId::THintedOutlineId(COpenFont *aFont, TUint aId):
-iFont(aFont), iId(aId)
-    {
-    // a null constructor;
-    }
-
 #ifdef _DEBUG
 /**
 Returns a timestamp for use by FinishTimingL().
--- a/fontservices/fontstore/src/OPENFONT.CPP	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/src/OPENFONT.CPP	Fri Apr 02 10:04:19 2010 +0100
@@ -520,8 +520,6 @@
 	{
 	//Delete the shaper
 	delete iShaper;
-
-	File()->GetFontStore()->CleanupCacheOnOpenFontRemoval(this);
 	
 	COpenFontGlyphCache* glyphCache = GetGlyphCache();
 	if (glyphCache != NULL)
@@ -822,54 +820,6 @@
 	delete iShaper;
 	}
 
-TInt COpenFont::GetFontTable(TUint32 aTag, TAny*& aTableContent, TInt& aLength) 
-    {
-    // get the extension API for GetTrueTypeTable() if available
-    TAny* ext = NULL;
-    ExtendedInterface(KUidOpenFontTrueTypeExtension, ext);
-    MOpenFontTrueTypeExtension* extensionInterface = 
-        reinterpret_cast<MOpenFontTrueTypeExtension*>(ext);
-
-    TInt ret = KErrNone;
-    if (extensionInterface == NULL)
-        {
-        ret = KErrNotSupported;
-        }
-    else 
-        {
-        TUint32 tag = aTag;
-        TInt len = 0;
-        aTableContent = extensionInterface->GetTrueTypeTable(ret, tag, &len);
-        if (KErrNone == ret) 
-            {
-            aLength = len;
-            }
-        }
-    return ret;
-    }
-
-TInt COpenFont::GetGlyphOutline(TUint aCode, 
-        TBool aHinted, TAny*& aOutline, TInt &aLength) 
-    {
-    // get the extension API for GetTrueTypeTable() if available
-    TAny* ext = NULL;
-    ExtendedInterface(KUidOpenFontGlyphOutlineExtension, ext);
-    MOpenFontGlyphOutlineExtension *extensionInterface = 
-        reinterpret_cast<MOpenFontGlyphOutlineExtension*>(ext);
-
-    TInt ret = KErrNone;
-    if (extensionInterface == NULL)
-        {
-        ret = KErrNotSupported;
-        }
-    else 
-        {
-        ret = extensionInterface->GetGlyphOutline(aCode, ETrue, 
-                aHinted, aOutline, aLength);
-        }
-    return ret;
-    }
-
 /** Given the passed pointer aAny, return an offset from it to the "this" pointer
 of this COpenFont object.
 @param aAny A pointer to an object that exists on the shared heap, i.e. the same heap
@@ -1698,11 +1648,6 @@
 */
 EXPORT_C COpenFontFile::~COpenFontFile()
 	{
-    CFontStore *fs = GetFontStore();
-    if (fs != NULL)
-        {
-        fs->CleanupCacheOnOpenFontFileRemoval(this);
-        }
 	delete iData;
 	}
 
--- a/fontservices/fontstore/src/linkedfonts.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/src/linkedfonts.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -148,13 +148,6 @@
 	if (GroupById(aElementSpec.GroupId()) == NULL)
 		User::Leave(KErrArgument);
 	
-	TInt canIndex = CanonicalIndex();
-	if (aElementSpec.Canonical())
-		{
-		if (canIndex!=KErrNotFound)
-			User::Leave(KErrArgument);
-		}
-	
 	err = iBody->iTypefaces.Insert(&aElementSpec, aPos);
 
 	User::LeaveIfError(err);
--- a/fontservices/fontstore/src/patchableconstants.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/src/patchableconstants.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -25,13 +25,6 @@
  */
 EXPORT_C extern const TInt8 KLinkedFontDrive = 0x63; //c in ASCII
 
-/**
-@internalTechnology
-
-The maximum size of memory used by the font table cache and the glyph outline cache.
- */
-EXPORT_C extern const TUint32 KFontTable_GlyphOutline_CacheMaxMem = 4 * 0x100000; // 4 Mega bytes.
-
 #if (__ARMCC_VERSION <= 310000)
 #include "FNTSTORE.H"
 #endif
--- a/fontservices/fontstore/tfs/TFntStoreServer.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/TFntStoreServer.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -43,7 +43,6 @@
 #include "t_linkedfontscomparison.h"
 #include "t_linkedfontscapability.h"
 #include "T_LinkedFontUpdateTests.h"
-#include "T_CACHE.H" 
 #include "T_FontSessionCache.h"
 
 CTFntStoreServer* CTFntStoreServer::NewL()
@@ -203,10 +202,6 @@
         {
         return new CTLinkedFontsUpdateStage2Step();
         }
-    else if (aStepName == KTCacheStep)
-        {
-        return new CTCacheStep();
-        }
     else if (aStepName == KTFontSessionCacheStep)
         {
         return new CTFontSessionCacheStep();
--- a/fontservices/fontstore/tfs/T_Cache.CPP	Tue Mar 09 14:23:10 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,377 +0,0 @@
-/*
-* 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 "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-#include "T_IsolatedFontStore.h"
-#include "openfontsprivate.h"
-#include <f32file.h>
-#include <e32test.h>
-#include <fntstore.h>
-#include <f32file.h>
-#include <s32file.h>
-#include <fbs.h>
-#include <graphics/openfontconstants.h>
-#include <graphics/openfontrasterizer.h>
-#include "T_Cache.H"
-
-LOCAL_C TInt Ptr2Offset(const TAny* aAny, TUint8* aHeapBase)
-    {
-    if (aAny && aHeapBase)
-        {
-        return (TInt)aAny - (TInt)aHeapBase;
-        }
-    return 0;
-    }
-
-//LOCAL_C TAny* Offset2Ptr(const TInt aOffset, TUint8* aHeapBase)
-//    {
-//    if (aOffset && aHeapBase)
-//        {
-//        return (TAny*)(aOffset + (TInt)aHeapBase);
-//        }
-//    return NULL;
-//    }
-
-CTCache::CTCache(CTestStep* aStep):
-    CTGraphicsBase(aStep)
-    {
-    INFO_PRINTF1(_L("FontStore T_Cache test\n"));
-    iHeap=UserHeap::ChunkHeap(NULL,0x1000000,0x1000000);
-    }
-
-CTCache::~CTCache()
-    {
-    iHeap->Close();
-    }
-
-//below code is for unit test and coverage only
-
-void CTCache::TFontCache()
-    {
-#ifdef _DEBUG 
-    TFontTableGlyphOutlineCacheMemMonitor mon;
-    CFontTableCache* fontCache = new CFontTableCache(iHeap,mon);
-
-    //user array
-    TCacheUserInfo* user1 = new TCacheUserInfo(111,0);
-    TCacheUserInfo* user2 = new TCacheUserInfo(222,1);    
-    RPointerArray<TCacheUserInfo> userArray;
-    userArray.Append(user1);
-    userArray.Append(user2);    
-   
-    //item array
-    CFontTableCacheItem* item1;
-    TInt len = 3;
-    TAny* content = (iHeap->Alloc(3));
-    TUid iUid = TUid::Uid(123456);
-    item1 = new CFontTableCacheItem(iUid, 0x68656164, Ptr2Offset(content, iHeap->Base()), len); 
-    item1->SetUser(userArray);    
-    RPointerArray<CFontTableCacheItem> itemArray;
-    itemArray.Append(item1);
-    
-    //font cache    
-    fontCache->SetFontItem(itemArray);
-    TBool has = fontCache->HasOutstandingRefCount();
-    TEST(has);
-    has = fontCache->HasOutstandingRefCountWithUid(iUid);  
-    TEST(has);
-    TUid uid = TUid::Uid(1234);
-    fontCache->HasOutstandingRefCountWithUid(uid);  //for coverage
-    
-    TAny *outline = NULL;
-    TInt length = 3;
-    TInt id = 0;
-    TUint32 tag = 0x1234;
-    TInt err = fontCache->Find(uid, tag, outline, length, &id);
-    TEST(err != KErrNone);
-    err = fontCache->Find(iUid, tag, outline, length, &id);
-    TEST(err != KErrNone);
-    __UHEAP_FAILNEXT(1);
-    fontCache->Append(uid, tag, content, length); 
-    TEST(err != KErrNone);
-    __UHEAP_RESET;
-    
-    fontCache->CleanupCacheOnFbsSessionTermination(123);
-    TEST(err != KErrNone);
-
-    userArray.Close();
-    delete fontCache;
-    itemArray.Close();
-#endif       
-    }
-
-void CTCache::TFontCacheItem()
-    {  
-#ifdef _DEBUG 
-    TCacheUserInfo* user1 = new TCacheUserInfo(111,0);
-    TCacheUserInfo* user2 = new TCacheUserInfo(222,1);    
-    RPointerArray<TCacheUserInfo> userArray;
-    userArray.Append(user1);
-    userArray.Append(user2);
-    
-    CFontTableCacheItem* item1;
-    TAny* content = User::Alloc(4); 
-    TUid iUid = TUid::Uid(123456);
-    item1 = new CFontTableCacheItem(iUid, 0x68656164, Ptr2Offset(content, User::Heap().Base()), 3);
-    User::Free(content);
-    __UHEAP_FAILNEXT(1);
-    TInt err = item1->IncRefCount(111);
-    TEST(err == KErrNoMemory);
-    __UHEAP_RESET;      
-    
-    TBool has = item1->HasOutstandingRefCount();
-    TEST(!has);
-    
-
-    item1->SetUser(userArray);
-    has = item1->HasOutstandingRefCount();
-    TEST(has);
-    
-    TInt id = 1;
-    err = item1->FindUser(333, &id); 
-    TEST(err != KErrNone);
-    
-    err = item1->DecRefCount(333);
-    TEST(err == KErrNotFound);
-    
-
-    userArray.Close();
-    delete item1; 
-    
-#endif    
-    }
-
-void CTCache::TGlyphCacheItem()
-    {
-#ifdef _DEBUG     
- 
-    TCacheUserInfo* user1 = new TCacheUserInfo(111,0);
-    TCacheUserInfo* user2 = new TCacheUserInfo(222,1);
-    
-    RPointerArray<TCacheUserInfo> userArray;
-    userArray.Append(user1);
-    userArray.Append(user2);
-    
-    COutlineCacheItem* item1;
-    TInt len = 3;
-    TAny* content = User::Alloc(4); 
-    item1 = new COutlineCacheItem(Ptr2Offset(content, User::Heap().Base()), len);
-    User::Free(content);
-    __UHEAP_FAILNEXT(1);
-    TInt err = item1->DecRefCount(333);
-    err = item1->IncRefCount(111);
-    TEST(err == KErrNoMemory);
-    __UHEAP_RESET;      
-    
-
-    item1->SetUser(userArray);    
-    err = item1->IncRefCount(333);
-    TEST(err == KErrNone);
-  
-    userArray.Close();
-    delete item1;   
-#endif  
-    }
-
-void CTCache::THintedGlyphCache()
-    {
-#ifdef _DEBUG 
-    TFontTableGlyphOutlineCacheMemMonitor mon;
-    CHintedOutlineCache* hintedCache = new CHintedOutlineCache(iHeap,mon);
-    TCacheUserInfo* user1 = new TCacheUserInfo(111,0);
-    TCacheUserInfo* user2 = new TCacheUserInfo(222,1);    
-    RPointerArray<TCacheUserInfo> userArray;
-    userArray.Append(user1);
-    userArray.Append(user2);    
-    COutlineCacheItem* item1;
-    TInt len = 4;
-    //TUint content[] = {1,2,3};
-    TAny* content = User::Alloc(4); 
-    item1 = new COutlineCacheItem(Ptr2Offset(content, User::Heap().Base()), len);
-    item1->SetUser(userArray); 
-    COpenFont* openFont = NULL;
-    THintedOutlineId hintedId(openFont, 11);
-    hintedCache->SetHintedItem(hintedId, item1);
-    RHashMap<THintedOutlineId, COutlineCacheItem*> map = hintedCache->GetHintedMap();
-    //for coverage
-    THintedOutlineId hintedId1(openFont, 12);
-    TInt err = hintedCache->IncRefCount(hintedId1, 111);
-    TEST(err != KErrNone);
-    COpenFont* openFont1 = reinterpret_cast<COpenFont*>(0x123);
-    //for coverage
-    err = hintedCache->CleanupCacheOnOpenFontRemoval(openFont1);
-    TEST(err == KErrNone);
-    //following return value alway KErrNone
-    hintedCache->CleanupCacheOnFbsSessionTermination(111);
-    hintedCache->CleanupCacheOnFbsSessionTermination(333);
-    
-    TAny* ptr;
-    TInt size = 0;
-    __UHEAP_FAILNEXT(1);
-    hintedCache->CacheHintedOutline(hintedId1, &content, len, ptr, size);  
-    __UHEAP_RESET;
-    
-    __RHEAP_FAILNEXT(iHeap, 1);
-    hintedCache->CacheHintedOutline(hintedId1, &content, len, ptr, size);
-    __RHEAP_RESET(iHeap);
-    
-
-    mon.Inc(KFontTable_GlyphOutline_CacheMaxMem);
-    err = hintedCache->CacheHintedOutline(hintedId1, &content, len, ptr, len); 
-    TEST(err == KErrNoMemory);
-    User::Free(content);
-    
-    map.Close();
-    delete item1;
-    userArray.Close();
-    delete hintedCache;    
-#endif      
-    }
-
-void CTCache::TUnHintedGlyphCache()
-    {
-#ifdef _DEBUG 
-    TFontTableGlyphOutlineCacheMemMonitor mon;
-    CUnhintedOutlineCache* unhintedCache = new CUnhintedOutlineCache(iHeap,mon);
-    TCacheUserInfo* user1 = new TCacheUserInfo(111,0);
-    TCacheUserInfo* user2 = new TCacheUserInfo(222,1);    
-    RPointerArray<TCacheUserInfo> userArray;
-    userArray.Append(user1);
-    userArray.Append(user2);    
-    COutlineCacheItem* item1;
-    TInt len = 3;
-    TAny* content = (iHeap->Alloc(3));  
-    item1 = new COutlineCacheItem(Ptr2Offset(content, iHeap->Base()), len);
-    item1->SetUser(userArray); 
-    TUid uid = TUid::Uid(123);
-    TUnhintedOutlineId unhintedId(uid, 11, 1);
-    unhintedCache->SetUnHintedItem(unhintedId, item1);
-//    RHashMap<TUnhintedOutlineId, COutlineCacheItem*> map = unhintedCache->GetHintedMap();
-    TUnhintedOutlineId unhintedId1(uid, 12, 1);
-    TInt err = unhintedCache->IncRefCount(unhintedId1, 111);
-    TEST(err != KErrNone);
-    //for coverage
-    unhintedCache->CleanupCacheOnFbsSessionTermination(111);
-    unhintedCache->CleanupCacheOnFbsSessionTermination(333);
-    
-    TAny* ptr;
-    TInt size = 0;
-    __UHEAP_FAILNEXT(1);
-    unhintedCache->CacheUnhintedOutline(unhintedId1, &content, len, ptr, size);  
-    __UHEAP_RESET;
-    
-    __RHEAP_FAILNEXT(iHeap, 1);
-    unhintedCache->CacheUnhintedOutline(unhintedId1, &content, len, ptr, size);
-    __RHEAP_RESET(iHeap);
-    
-    
-    mon.Inc(KFontTable_GlyphOutline_CacheMaxMem);
-    err = unhintedCache->CacheUnhintedOutline(unhintedId1, &content, len, ptr, len); 
-    TEST(err == KErrNoMemory);
-    
-    userArray.Close();
-    delete unhintedCache; 
-
-#endif   
-    }
-
-void CTCache::TFontCacheForCov()
-    {
-#ifdef _DEBUG 
-    TFontTableGlyphOutlineCacheMemMonitor mon;
-    CFontTableCache* fontCache = new CFontTableCache(iHeap,mon);
-
-    TCacheUserInfo* user1 = new TCacheUserInfo(111,0);
-    RPointerArray<TCacheUserInfo> userArray;
-    userArray.Append(user1);
-    CFontTableCacheItem* item1;
-    TInt len = 3;
-    TAny* content = (iHeap->Alloc(3));   
-    TUid iUid = TUid::Uid(123456);
-    item1 = new CFontTableCacheItem(iUid, 0x68656164, Ptr2Offset(content, iHeap->Base()), len); 
-    item1->SetUser(userArray);    
-    RPointerArray<CFontTableCacheItem> itemArray;
-    itemArray.Append(item1);
-    fontCache->SetFontItem(itemArray);
-    
-    TBool has = fontCache->HasOutstandingRefCount();
-    TEST(!has);
-    has = fontCache->HasOutstandingRefCountWithUid(iUid);  
-    TEST(!has);
-    
-    TUint length = 3;
-    TUint32 tag = 0x1234;
-    TUid uid = TUid::Uid(1234);
-    mon.Inc(KFontTable_GlyphOutline_CacheMaxMem);
-    TInt err = fontCache->Append(uid, tag, content, length); 
-    TEST(err == KErrNoMemory);
-
-    userArray.Close();
-    delete fontCache;
-    itemArray.Close();
-#endif       
-    }
-
-void CTCache::RunTestCaseL(TInt aCurTestCase)
-    {
-    ((CTCacheStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
-    switch(aCurTestCase)
-        {
-    case 1:
-        ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0001"));
-        INFO_PRINTF1(_L("FontStore T_Cache test 1: TFontCacheItem\n"));
-        TFontCacheItem();
-        break;
-        
-    case 2:
-        ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0002"));
-        INFO_PRINTF1(_L("FontStore T_Cache test 2: TFontCache\n"));
-        TFontCache();
-        TFontCacheForCov();
-        break;      
-        
-    case 3:
-        ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0003"));
-        INFO_PRINTF1(_L("FontStore T_Cache test 3: THintedGlyphCacheItem\n"));
-        TGlyphCacheItem();
-        break;  
-        
-    case 4:
-        ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0004"));
-        INFO_PRINTF1(_L("FontStore T_Cache test 4: THintedGlyphCache\n"));
-        THintedGlyphCache();
-        break;  
-
-    case 5:
-        ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0005"));
-        INFO_PRINTF1(_L("FontStore T_Cache test 5: TUnHintedGlyphCache\n"));
-        TUnHintedGlyphCache();
-        break; 
-        
-    case 6:
-        ((CTCacheStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
-        ((CTCacheStep*)iStep)->CloseTMSGraphicsStep();
-        TestComplete();             
-        break;
-        }
-    ((CTCacheStep*)iStep)->RecordTestResultL();
-    }
-
-//--------------
-__CONSTRUCT_STEP__(Cache)
-
-
-
--- a/fontservices/fontstore/tfs/T_Cache.H	Tue Mar 09 14:23:10 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
-* 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 "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-
-/**
- @file
- @test
- @internalComponent Internal Symbian test code
-*/
-
-
-#ifndef __T_CACHE_H__
-#define __T_CACHE_H__
-
-#include <fntstore.h>
-#include "TGraphicsHarness.h"
-#include <gdi.h>
-#include <fbs.h> 
-
-class CTCache : public CTGraphicsBase
-	{
-public:
-	CTCache(CTestStep* aStep);
-	 ~CTCache();
-protected:
-//from 	CTGraphicsStep
-	virtual void RunTestCaseL(TInt aCurTestCase);
-private:
-	void TFontCacheItem();
-	void TFontCache();
-	void TFontCacheForCov();
-	void TGlyphCacheItem();
-	void THintedGlyphCache();
-	void TUnHintedGlyphCache();
-	
-private:
-    RHeap*               iHeap;
-    };
-
-
-class CTCacheStep : public CTGraphicsStep
-	{
-public:
-	CTCacheStep();
-protected:	
-	//from CTGraphicsStep
-	virtual CTGraphicsBase* CreateTestL();
-	};
-
-_LIT(KTCacheStep,"TCache");
-
-#endif
--- a/fontservices/fontstore/tfs/T_LinkedFonts2.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/T_LinkedFonts2.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -1172,7 +1172,7 @@
 		TEST(CompareGroups(group2,groupf));
 			
 		//Check elements match 
-		TEST(fetchSpec->TypefaceCount() == fetchSpec->TypefaceCount());
+		TEST(typefaceSpec->TypefaceCount() == fetchSpec->TypefaceCount());
 		
 		CLinkedTypefaceElementSpec* elementf = fetchSpec->Typeface(0);
 		TEST(CompareElementSpecs(elementf, element1));
--- a/fontservices/fontstore/tfs/T_fontsessioncache.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/T_fontsessioncache.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -1,17 +1,19 @@
-// 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 "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
 
 /**
  @file
--- a/fontservices/fontstore/tfs/T_fontsessioncache.h	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/T_fontsessioncache.h	Fri Apr 02 10:04:19 2010 +0100
@@ -2,7 +2,7 @@
 * 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 "Eclipse Public License v1.0"
+* under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:
+* Description: 
 *
 */
 
--- a/fontservices/fontstore/tfs/T_fontsessioncacheproc.cpp	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/T_fontsessioncacheproc.cpp	Fri Apr 02 10:04:19 2010 +0100
@@ -2,7 +2,7 @@
 * 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 "Eclipse Public License v1.0"
+* under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:
+* Description: 
 *
 */
 
--- a/fontservices/fontstore/tfs/scripts/fntstoretest_T_All.script	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/scripts/fntstoretest_T_All.script	Fri Apr 02 10:04:19 2010 +0100
@@ -20,7 +20,6 @@
 //
 LOAD_SUITE TFntStoreServer
 RUN_TEST_STEP 300 TFntStoreServer TFnt
-RUN_TEST_STEP 300 TFntStoreServer TCache
 RUN_TEST_STEP 100 TFntStoreServer TFntMem
 RUN_TEST_STEP 100 TFntStoreServer TFontBitmap
 RUN_TEST_STEP 100 TFntStoreServer TFsOpen
--- a/fontservices/fontstore/tfs/scripts/fntstoretest_T_Cache.script	Tue Mar 09 14:23:10 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-//
-// 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 "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description: 
-//
-
-
-PRINT Run TCache Font Store test 
-//
-LOAD_SUITE TFntStoreServer
-
-RUN_TEST_STEP 100 TFntStoreServer TCache
-
--- a/fontservices/fontstore/tfs/scripts/fntstoretest_T_FontSessionCache.script	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/scripts/fntstoretest_T_FontSessionCache.script	Fri Apr 02 10:04:19 2010 +0100
@@ -1,7 +1,8 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+//
+// 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 "Eclipse Public License v1.0"
+// under the terms of "Eclipse Public License v1.0"
 // which accompanies this distribution, and is available
 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
 //
@@ -10,7 +11,7 @@
 //
 // Contributors:
 //
-// Description:
+// Description: 
 //
 
 
--- a/fontservices/fontstore/tfs/scripts/fntstoretest_run.bat	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/fontstore/tfs/scripts/fntstoretest_run.bat	Fri Apr 02 10:04:19 2010 +0100
@@ -30,7 +30,6 @@
 testexecute.exe	 z:\fntstoretest\fntstoretest_t_cachedeletion.script
 testexecute.exe	 z:\fntstoretest\fntstoretest_t_setdefaulttypefacename.script
 testexecute.exe	 z:\fntstoretest\fntstoretest_t_linkedfonts.script
-testexecute.exe	 z:\fntstoretest\fntstoretest_t_cache.script
 testexecute.exe  z:\fntstoretest\fntstoretest_t_fontsessioncache.script
 
 @echo off
--- a/fontservices/freetypefontrasteriser/src/FTRAST2.CPP	Tue Mar 09 14:23:10 2010 +0000
+++ b/fontservices/freetypefontrasteriser/src/FTRAST2.CPP	Fri Apr 02 10:04:19 2010 +0100
@@ -159,8 +159,6 @@
 		COpenFont*& aFont, TOpenFontSpec& aActualFontSpec, TInt aMaxHeight);
 	TBool HasUnicodeCharacterL(TInt aFaceIndex, TInt aCode) const;
 	TAny* GetTrueTypeTable(TInt& aError, TInt aFaceIndex, TUint32 aTag, TInt* aLength);
-	TInt GetGlyphOutline(TInt aFaceIndex, TUint aCode, 
-	        TBool aIsGlyphId, TBool, TAny*& aOutline, TInt &aLength);
 
 private:
 	static void SetGlyphMetrics(FT_GlyphSlot aGlyphSlot, TOpenFontGlyphData* aGlyphData);
@@ -184,7 +182,7 @@
 	};
 
 NONSHARABLE_CLASS(CFreeTypeFont) : public COpenFont, public MOpenFontShapingExtension, 
-    public MOpenFontTrueTypeExtension, public MOpenFontGlyphOutlineExtension
+    public MOpenFontTrueTypeExtension
 	{
 public:
 	static CFreeTypeFont* NewL(
@@ -218,8 +216,6 @@
 	TAny* GetTrueTypeTable(TInt& aError, TUint32 aTag, TInt* aLength);
 	TInt  ReleaseTrueTypeTable(TAny* aTable);
 	TBool HasTrueTypeTable(TUint32 aTag);
-	TInt GetGlyphOutline(TUint aCode, TBool aIsGlyphId, 
-	            TBool aHinted, TAny*& aOutline, TInt &aLength);
 
 	inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
 	inline TAny* operator new(TUint aSize) __NO_THROW;
@@ -1070,8 +1066,6 @@
 		aParam = static_cast<MOpenFontShapingExtension*>(this);
 	else if (aUid == KUidOpenFontTrueTypeExtension)	
 		aParam = static_cast<MOpenFontTrueTypeExtension*>(this);
-	else if (aUid == KUidOpenFontGlyphOutlineExtension)
-	    aParam = static_cast<MOpenFontGlyphOutlineExtension*>(this);
 	else
 		COpenFont::ExtendedInterface(aUid, aParam);
 	}
@@ -1175,18 +1169,7 @@
 	}
 
 
-TInt CFreeTypeFont::GetGlyphOutline(TUint aCode, TBool aIsGlyphId, 
-                TBool aHinted, TAny*& aOutline, TInt& aLength)
-    {
-    CFreeTypeFontFile* file = (CFreeTypeFontFile*)File();
-    if (!file)
-        {
-        return KErrNotFound;
-        }
-    aHinted = EFalse; // to avoid 'unused' warning.
-    
-    return file->GetGlyphOutline(FaceIndex(), aCode, aIsGlyphId, aHinted, aOutline, aLength);
-    }
+
 
 TAny* CFreeTypeFont::GetTrueTypeTable(TInt& aError, TUint32 aTag, TInt* aLength)
 	{
@@ -1301,483 +1284,6 @@
 		iContext->TranslateAntiAliasedGlyphBitmap(aFace->Face()->glyph,aGlyphData);
 	}
 
-enum vg_commands {
-    VG_CMD_NONE = 0,
-    VG_CMD_MOVETO,
-    VG_CMD_LINETO,
-    VG_CMD_CONICTO,
-    VG_CMD_CUBICTO,
-    VG_CMD_CLOSE
-};
-
-
-enum contour_states 
-    {
-    CONTOUR_STATE_NOT_STARTED = 0,
-    CONTOUR_STATE_START,
-    CONTOUR_STATE_CONIC,
-    CONTOUR_STATE_CUBIC1,
-    CONTOUR_STATE_CUBIC2,
-    CONTOUR_STATE_MAX
-    };
-
-static const TInt StateTransitions[CONTOUR_STATE_MAX][3] = 
-    {
-        {CONTOUR_STATE_START, -1, -1},
-        {CONTOUR_STATE_START, CONTOUR_STATE_CONIC, CONTOUR_STATE_CUBIC1},
-        {CONTOUR_STATE_START, -1, -1},
-        {-1, -1, CONTOUR_STATE_CUBIC2}, 
-        {CONTOUR_STATE_START, -1, -1}, 
-    };
-
-static const TInt OutputCommands[CONTOUR_STATE_MAX][3] = 
-    {
-        {VG_CMD_MOVETO, -1, -1},
-        {VG_CMD_LINETO, VG_CMD_NONE, VG_CMD_NONE},
-        {VG_CMD_CONICTO, -1, -1},
-        {-1, -1, VG_CMD_NONE}, 
-        {VG_CMD_CUBICTO, -1, -1},
-    };
-
-
-class MVGCommandProcessor 
-    {
-public:
-    virtual TInt ProcessCommand(TInt8 cmd, FT_Vector &start, FT_Vector &end) = 0;
-    };
-
-class COutlineStringBuilder: public MVGCommandProcessor, public CBase 
-    {
-private:
-    TUint8 *iBuffer;
-    TUint8 *iCur;
-    TInt iLen;
-
-
-public:
-    COutlineStringBuilder():iBuffer(0), iLen(2000) 
-        { 
-        iBuffer = (TUint8 *)User::Alloc(iLen);
-        iCur = iBuffer;
-        }
-    
-    ~COutlineStringBuilder() 
-        {
-        // ownership of the buffer is transferred to the caller.
-        }
-    
-    
-    TUint8 *GetBuffer(TInt &aLen) 
-        {
-        aLen = iCur - iBuffer;
-        *iCur = '\0';
-        return iBuffer;
-        }
-    
-    TInt AppendChar(char ch)
-        {
-        *(iCur++) = ch;
-        return 0;
-        }
-    
-    TInt AppendFTPos(FT_Pos n)
-        {
-        int divisor = 1;
-        FT_Pos tmp = (n > 0) ? n : (-n);
-        while (tmp/divisor >= 10) {
-            divisor *= 10;
-        }
-        
-        if (n < 0)
-            {
-            AppendChar('-');
-            }
-        
-        for ( ; divisor >= 1; divisor /= 10)
-            {
-            AppendChar('0' + tmp/divisor);
-            tmp = tmp % divisor;
-            }
-        
-        return 0;
-        }
-    
-    TInt AppendCoord(FT_Pos x, FT_Pos y) 
-        {
-        AppendFTPos(x);
-        AppendChar(',');
-        AppendFTPos(y);
-        AppendChar(' ');
-        return 0;
-        }
-    
-    TInt
-    ProcessCommand(TInt8 cmd, FT_Vector &start, FT_Vector &end) 
-        {
-        FT_Vector *st = &start;
-
-        if (iCur + 64 > iBuffer + iLen) 
-            {
-            TUint distance = iCur - iBuffer;
-            iLen += 1000;
-            TUint8 *newBuffer = (TUint8 *)User::ReAlloc(iBuffer, iLen);
-            iBuffer = newBuffer;
-            iCur = iBuffer + distance;
-            }
-        
-        if (VG_CMD_MOVETO == cmd) 
-            {
-            AppendChar('M');
-            AppendCoord(start.x, start.y);
-            }
-        else if (VG_CMD_LINETO == cmd)
-            {
-            AppendChar('L');
-            AppendCoord(end.x, end.y);
-            }
-        else if (VG_CMD_CONICTO == cmd)
-            {
-            AppendChar('Q');
-            AppendCoord((st+1)->x, (st+1)->y);
-            AppendCoord(end.x, end.y);
-            }
-        else if (VG_CMD_CUBICTO == cmd)
-            {
-            AppendChar('Q');
-            AppendCoord((st+1)->x, (st+1)->y);
-            AppendCoord((st+2)->x, (st+2)->y);
-            AppendCoord(end.x, end.y);
-            }
-        else if (VG_CMD_CLOSE == cmd)
-            {
-            AppendChar('Z');
-            AppendChar(' ');
-            }
-        
-        return KErrNone;
-        }
-    };
-
-
-class COutlineConvDirector: public CBase {
-private:
-    MVGCommandProcessor *iProcessor;
-    const FT_Outline *iOutline; 
-    FT_Outline iNewOutline;
-
-    
-private:
-    char
-    GetNextPointType(char aTag) 
-        {
-        char ret = FT_CURVE_TAG(aTag);
-        if (FT_CURVE_TAG_ON == ret)
-            {
-            ret = 0;
-            }
-        else if (FT_CURVE_TAG_CONIC == ret)
-            {
-            ret = 1;
-            }
-        else if (FT_CURVE_TAG_CUBIC == ret)
-            {
-            ret = 2;
-            }
-        else 
-            {
-            __ASSERT_DEBUG(0, User::Panic(_L("IncorrectState"), -1));
-            }
-        return ret;
-        }
-    
-    TInt SwapPoints(const TInt i1, const TInt i2)
-        {
-        FT_Vector tmpVector = iOutline->points[i1];
-        char tmpTags = iOutline->tags[i1];
-        iOutline->points[i1] = iOutline->points[i2];
-        iOutline->tags[i1] = iOutline->tags[i2];
-        iOutline->points[i2] = tmpVector;
-        iOutline->tags[i2] = tmpTags;
-        return 0;
-        }
-    
-    TInt MoveFirstOnPointToBeginning(const TInt aStartIndex, const TInt aEndIndex) 
-        {
-        /* Contours of three or more points are valid, and single points 
-         * (reference points, technically not contours) are also valid as 
-         * special cases in TrueType. 
-         */ 
-        char curTag = FT_CURVE_TAG(iOutline->tags[aStartIndex]);
-        
-        // so a contour having only one point which is 'off' is invalid!
-        __ASSERT_DEBUG(!(aEndIndex - aStartIndex == 0 && FT_CURVE_TAG_ON != curTag), 
-                User::Panic(_L("Contour consisting of 1 'off' point."), -1));
-        
-        /* Contours consisting of two points are not a valid configuration. */
-        __ASSERT_DEBUG(aEndIndex - aStartIndex != 1, 
-                User::Panic(_L("Contour consisting of two points."), -1));
-        
-        if (FT_CURVE_TAG_ON == curTag) 
-            {
-            return KErrNone;
-            }
-        TInt firstOnIndex = -1;
-        TInt i = 0;
-        for (i = 1+aStartIndex; i < aEndIndex; ++i)
-            {
-            if (FT_CURVE_TAG_ON == FT_CURVE_TAG(iOutline->tags[i]))
-                {
-                firstOnIndex = i;
-                break;
-                }
-            }
-        __ASSERT_DEBUG(-1 != firstOnIndex, 
-                User::Panic(_L("Contour containing no 'on' point."), -1));
-        
-        for (i = firstOnIndex-1; i >= aStartIndex; --i)
-            {
-            for (TInt j = i; j < aEndIndex; ++j)
-                {
-                SwapPoints(j, j+1);
-                }
-            }
-        
-        return KErrNone;
-        }
-    
-    TInt
-    ConvertContour(const TInt aStartIndex, const TInt aEndIndex)
-        {
-        /* Contours consisting of two 
-         * points are not a valid configuration. 
-         */
-        __ASSERT_DEBUG(aEndIndex - aStartIndex != 1, 
-                User::Panic(_L("Contour consisting of two points."), -1));
-        
-        TInt state = CONTOUR_STATE_NOT_STARTED, newState = -1;
-        TInt cmdStart = aStartIndex, cmdCur = 0, command = -1;
-        
-        char ptype = GetNextPointType(iNewOutline.tags[cmdStart]);
-        __ASSERT_DEBUG(0 == ptype, User::Panic(_L("IncorrectState"), -1)); 
-        state = CONTOUR_STATE_START;
-        iProcessor->ProcessCommand(VG_CMD_MOVETO, 
-                iNewOutline.points[aStartIndex], iNewOutline.points[aStartIndex]);
-        
-        
-        for (cmdCur = cmdStart + 1; cmdCur <= aEndIndex; ++cmdCur)
-            {
-            ptype = GetNextPointType(iNewOutline.tags[cmdCur]);
-            newState = StateTransitions[state][ptype];
-            __ASSERT_DEBUG(-1 != newState, User::Panic(_L("IncorrectState"), -1));
-            command = OutputCommands[state][ptype];
-            __ASSERT_DEBUG(-1 != command, User::Panic(_L("IncorrectState"), -1));
-            
-            if (VG_CMD_NONE != command)
-                {
-                iProcessor->ProcessCommand(command, 
-                        iNewOutline.points[cmdStart], iNewOutline.points[cmdCur]);
-                cmdStart = cmdCur;
-                }
-            state = newState;
-            }
-        
-        if (CONTOUR_STATE_CONIC == state)
-            {
-            iProcessor->ProcessCommand(VG_CMD_CONICTO, iNewOutline.points[cmdStart], 
-                    iNewOutline.points[aStartIndex]);
-            }
-        else if (CONTOUR_STATE_CUBIC2 == state)
-            {
-            iProcessor->ProcessCommand(VG_CMD_CUBICTO, iNewOutline.points[cmdStart], 
-                    iNewOutline.points[aStartIndex]);
-            }
-        iProcessor->ProcessCommand(VG_CMD_CLOSE, 
-                iNewOutline.points[aStartIndex], iNewOutline.points[aStartIndex]);
-        
-        return KErrNone;
-        }
-
-
-    TInt Preprocess() 
-        {
-        /* two successive conic "off" points forces the rasterizer to 
-         * create (during the scan-line conversion process exclusively) a 
-         * virtual "on" point amidst them, at their exact middle.
-         */
-        char prevTag = FT_CURVE_TAG(iOutline->tags[0]), currentTag = 0;
-        TInt numNewPoints = 0;
-        TInt contourIndex = 0;
-        
-        iNewOutline.contours = 0;
-        iNewOutline.n_contours = iOutline->n_contours;
-        iNewOutline.contours = (short *)
-                User::Alloc(iNewOutline.n_contours * sizeof(short));
-        
-        if (0 == iOutline->contours[0]) 
-            {
-            iNewOutline.contours[0] = iOutline->contours[0]; // == 0
-            ++contourIndex;
-            }
-        for (TInt i = 1; i < iOutline->n_points; ++i) 
-            {
-                currentTag = FT_CURVE_TAG(iOutline->tags[i]);
-                if (FT_CURVE_TAG_CONIC == prevTag && prevTag == currentTag)
-                    {
-                    numNewPoints++;
-                    }
-                prevTag = currentTag;
-                if (i == iOutline->contours[contourIndex]) 
-                    {
-                    iNewOutline.contours[contourIndex] =
-                        iOutline->contours[contourIndex] + numNewPoints;
-                    ++contourIndex;
-                    }
-            }
-        
-        
-        iNewOutline.n_points = iOutline->n_points + numNewPoints;
-        iNewOutline.flags = iOutline->flags;
-        
-        iNewOutline.points = 0;
-        iNewOutline.tags = 0;
-        
-        iNewOutline.points = (FT_Vector *)
-            User::Alloc(iNewOutline.n_points * sizeof(FT_Vector));
-
-        if (iNewOutline.contours)
-            {
-            iNewOutline.tags = (char *)
-                User::Alloc(iNewOutline.n_points * sizeof(char));
-            }
-        
-        // copy the 'points' and 'tags' array, inserting new points
-        // when necessary.
-        TInt oldIndex = 0, newIndex = 0;
-        for ( ; oldIndex < iOutline->n_points; ++oldIndex) 
-            {
-            char oldTag = FT_CURVE_TAG(iOutline->tags[oldIndex]);
-            iNewOutline.points[newIndex] = iOutline->points[oldIndex];
-            iNewOutline.tags[newIndex] = iOutline->tags[oldIndex];
-            
-            if (FT_CURVE_TAG_CONIC == oldTag && 
-                    oldIndex + 1 < iOutline->n_points) 
-                {
-                char nextTag = FT_CURVE_TAG(iOutline->tags[oldIndex+1]);
-                // insert a new 'on' point when there are two consecutive 
-                // 'conic off' points.
-                if (oldTag == nextTag)
-                    {
-                    newIndex++;
-                    FT_Vector *cur = &(iOutline->points[oldIndex]);
-                    FT_Vector *next = &(iOutline->points[oldIndex + 1]);
-                    iNewOutline.points[newIndex].x = (cur->x + next->x)/2;
-                    iNewOutline.points[newIndex].y = (cur->y + next->y)/2;
-                    iNewOutline.tags[newIndex] = FT_CURVE_TAG_ON;
-                    }
-                }
-            newIndex++;
-            }
-        
-        return 0;
-        }
-    
-public:
-    COutlineConvDirector():iProcessor(0), iOutline(0) 
-        {
-        // a null constructor
-        iNewOutline.contours = 0;
-        iNewOutline.tags = 0;
-        iNewOutline.points = 0;
-        }
-    
-    ~COutlineConvDirector()
-        {
-        User::Free(iNewOutline.contours);
-        User::Free(iNewOutline.points);
-        User::Free(iNewOutline.tags);
-        }
-    
-    TInt
-    ConvertOutline(const FT_Outline &aOutline, MVGCommandProcessor *aProcessor) 
-        {
-        if (0 != aOutline.n_contours) 
-            {
-            iProcessor = aProcessor;
-            iOutline = &aOutline;
-            
-            MoveFirstOnPointToBeginning(0, iOutline->contours[0]);
-            TInt i = 0;
-            for (i = 1; i < iOutline->n_contours; ++i)
-                {
-                MoveFirstOnPointToBeginning(iOutline->contours[i-1]+1, iOutline->contours[i]);
-                }
-                    
-            Preprocess();
-            
-            ConvertContour(0, iNewOutline.contours[0]);
-            for (i = 1; i < iNewOutline.n_contours; ++i)
-                {
-                ConvertContour(iNewOutline.contours[i-1]+1, iNewOutline.contours[i]);
-                }
-            }
-        else
-            {
-			RDebug::Printf("Zero contour in outline: missing glyph.");
-            FT_Vector dummyVector;
-            aProcessor->ProcessCommand(VG_CMD_CLOSE, dummyVector, dummyVector);
-            }
-        return KErrNone;
-        }
-};
-
-
-TInt CFreeTypeFontFile::GetGlyphOutline(TInt aFaceIndex, TUint aCode, 
-        TBool aIsGlyphId, TBool, TAny*& aOutline, TInt &aLength) 
-    {
-    // The 4th param 'aHinted' is ignored in this reference implementation.
-    // Need to add it back and implement accordingly if freetype is used in 
-    // production code.
-    CFaceListItem *faceList = LoadFaceL(aFaceIndex);
-    FT_Face face = faceList->Face();
-    TUint code = aCode;
-    if (!aIsGlyphId) 
-        {
-        code = FT_Get_Char_Index(face, aCode);
-        if (0 == code)
-            {
-            return KErrNotFound;
-            }
-        }
-    
-    TInt ret = FT_Load_Glyph(face, code, 
-            FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM);
-    
-    if (0 != ret)
-        {
-        return KErrUnknown;
-        }
-    
-    COutlineStringBuilder strBuilder;
-    if (0 != strBuilder.GetBuffer(aLength)) 
-        {
-        FT_Outline &outline = face->glyph->outline;
-        
-        COutlineConvDirector d;
-        d.ConvertOutline(outline, &strBuilder);
-        }
-    else
-        {
-        return KErrNoMemory;
-        }
-
-    TUint8 *buf = strBuilder.GetBuffer(aLength);
-    RDebug::Printf("length of buffer is %d\n", aLength);
-    RDebug::Printf("Outline for glyph %d: \n", aCode);
-    RDebug::Printf("%s", buf);
-    aOutline = (TAny*)buf;
-    
-    return KErrNone;
-    }
 TAny* CFreeTypeFontFile::GetTrueTypeTable(TInt& aError, TInt aFaceIndex,
 	TUint32 aTag, TInt* aLength)
 	{
--- a/localisation/localesupport/coltab/COLTAB.RTF	Tue Mar 09 14:23:10 2010 +0000
+++ b/localisation/localesupport/coltab/COLTAB.RTF	Fri Apr 02 10:04:19 2010 +0100
@@ -1,30 +1,31 @@
-{\rtf1\adeflang1025\ansi\ansicpg1252\uc2\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
-{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}
-{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f39\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;}
-{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}
-{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
-{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}
-{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
-{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
-{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f50\fbidi \fswiss\fcharset238\fprq2 Arial CE;}
-{\f51\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f53\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f54\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f55\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}
-{\f56\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f57\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f58\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f60\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}
-{\f61\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}{\f63\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f64\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f65\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}
-{\f66\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f67\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f68\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f172\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}
-{\f420\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f421\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f423\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f424\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}
-{\f425\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f426\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f427\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f428\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}
-{\f429\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f432\fbidi \fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
-{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
-{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
-{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}
-{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}
-{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
-{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
-{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
-{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
-{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
-{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}
-{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
+{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}
+{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f40\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
+{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
+{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f52\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f53\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}
+{\f55\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f56\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f57\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f58\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}
+{\f59\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f60\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
+{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
+{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f382\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}
+{\f383\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f385\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f386\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f389\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}
+{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}
+{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}
+{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f444\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
+{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
+{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
+{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
+{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}
+{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
 {\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
 {\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
 {\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
@@ -37,24 +38,23 @@
 \sbasedon0 \snext0 \slink16 \sqformat \styrsid15022011 heading 2;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
 \fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 \slink17 \sqformat \styrsid15022011 heading 3;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
 \ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
-\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe2052\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 
-\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af31503\afs32 \ltrch\fcs0 \b\fs32\lang2057\langfe0\kerning32\loch\f31502\hich\af31502\dbch\af31501\langnp2057 
-\sbasedon10 \slink1 \slocked \spriority9 \styrsid15022011 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\ai\af31503\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp2057 
-\sbasedon10 \slink2 \slocked \ssemihidden \spriority9 \styrsid15022011 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af31503\afs26 \ltrch\fcs0 \b\fs26\lang2057\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp2057 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe2052\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 
+\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af31503\afs32 \ltrch\fcs0 \b\fs32\lang2057\langfe0\kerning32\loch\f31502\hich\af31502\dbch\af31501\langnp2057\langfenp0 
+\sbasedon10 \slink1 \slocked \spriority9 \styrsid15022011 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\ai\af31503\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp2057\langfenp0 
+\sbasedon10 \slink2 \slocked \ssemihidden \spriority9 \styrsid15022011 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af31503\afs26 \ltrch\fcs0 \b\fs26\lang2057\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp2057\langfenp0 
 \sbasedon10 \slink3 \slocked \ssemihidden \spriority9 \styrsid15022011 Heading 3 Char;}{\s18\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 
 \fs16\lang2057\langfe2052\loch\f38\hich\af38\dbch\af31505\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext18 \slink19 \ssemihidden \sunhideused \styrsid7604161 Document Map;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 
-\f38\fs16\lang2057\langfe0\langnp2057 \sbasedon10 \slink18 \slocked \ssemihidden \styrsid7604161 Document Map Char;}{\s20\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 
-\fs20\lang2057\langfe2052\loch\f0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext20 \slink21 \ssemihidden \sunhideused \styrsid7604161 header;}{\*\cs21 \additive \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 
-\f0\fs20\lang2057\langfe0\langnp2057 \sbasedon10 \slink20 \slocked \ssemihidden \styrsid7604161 Header Char;}{\s22\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 
+\f38\fs16\lang2057\langfe0\langnp2057\langfenp0 \sbasedon10 \slink18 \slocked \ssemihidden \styrsid7604161 Document Map Char;}{\s20\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 
+\ltrch\fcs0 \fs20\lang2057\langfe2052\loch\f0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext20 \slink21 \ssemihidden \sunhideused \styrsid7604161 header;}{\*\cs21 \additive \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 
+\f0\fs20\lang2057\langfe0\langnp2057\langfenp0 \sbasedon10 \slink20 \slocked \ssemihidden \styrsid7604161 Header Char;}{\s22\ql \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 
 \fs20\lang2057\langfe2052\loch\f0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext22 \slink23 \ssemihidden \sunhideused \styrsid7604161 footer;}{\*\cs23 \additive \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 
-\f0\fs20\lang2057\langfe0\langnp2057 \sbasedon10 \slink22 \slocked \ssemihidden \styrsid7604161 Footer Char;}}{\*\listtable{\list\listtemplateid-328197846\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold
-\levelspace0\levelindent283{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b0\i0\f0\fs20\fbias0\hres0\chhres0 \fi-283\li283\lin283 }{\listname ;}\listid811824388}}{\*\listoverridetable{\listoverride\listid811824388
-\listoverridecount0\ls1}}{\*\revtbl {Unknown;}{x120li;}}{\*\rsidtbl \rsid1249922\rsid1327960\rsid2316060\rsid3302996\rsid5127372\rsid6169386\rsid7604161\rsid8209133\rsid9447428\rsid11078925\rsid14561726\rsid15022011}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1
-\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Graham Asher}{\operator x120li}{\creatim\yr2009\mo5\dy20\hr13\min44}{\revtim\yr2009\mo5\dy20\hr13\min44}{\version2}{\edmins1}{\nofpages6}{\nofwords2317}{\nofchars13053}
-{\*\company Symbian}{\nofcharsws15340}{\vern32895}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect 
-\widowctrl\ftnbj\aenddoc\revisions\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\hyphcaps0\formshade\horzdoc\dghspace120
-\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3
-\jcompress\viewkind1\viewscale100\splytwnine\ftnlytwnine\htmautsp\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot7604161
+\f0\fs20\lang2057\langfe0\langnp2057\langfenp0 \sbasedon10 \slink22 \slocked \ssemihidden \styrsid7604161 Footer Char;}}{\*\listtable{\list\listtemplateid-328197846\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelold\levelspace0\levelindent283{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b0\i0\f0\fs20\fbias0\hres0\chhres0 \fi-283\li283\lin283 }{\listname ;}\listid811824388}}{\*\listoverridetable{\listoverride\listid811824388
+\listoverridecount0\ls1}}{\*\rsidtbl \rsid737317\rsid1249922\rsid1327960\rsid2316060\rsid3302996\rsid4132030\rsid5127372\rsid5192092\rsid6169386\rsid7604161\rsid8209133\rsid9447428\rsid11078925\rsid14561726\rsid15022011}{\mmathPr\mmathFont34\mbrkBin0
+\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Graham Asher}{\operator yanchli}{\creatim\yr2009\mo5\dy20\hr13\min44}{\revtim\yr2010\mo3\dy15\hr16\min54}{\version4}{\edmins20}{\nofpages7}
+{\nofwords2326}{\nofchars12989}{\*\company Symbian}{\nofcharsws15285}{\vern32895}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect 
+\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120
+\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\splytwnine\ftnlytwnine\htmautsp\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot7604161
 \newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0{\*\wgrffmtfilter 2450}
 \nofeaturethrottle1\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid7604161 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 
 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3302996 \chftnsep 
@@ -64,78 +64,68 @@
 \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3302996 \chftnsep 
 \par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid7604161 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3302996 \chftnsepc 
-\par }}\ltrpar \sectd \ltrsect\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sectrsid15022011\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta \hich .}}
-{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta \hich )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl6
-\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl9
-\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}\pard\plain \ltrpar\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
-\b\fs28\lang2057\langfe2052\kerning28\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Using COLTAB to make collation key tables
+\par }}\ltrpar \sectd \ltrsect\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sectrsid15022011\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3
+\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
+{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar
+\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang2057\langfe2052\kerning28\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 
+\af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Using COLTAB to make collation key tables
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 Graham Asher, 10}{\rtlch\fcs1 \af0 \ltrch\fcs0 \super\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 th}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  November 1999
 \par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \ab\ai\af1\afs24\alang1025 \ltrch\fcs0 \b\i\fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Introduction
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
-\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 EPOC32 reads collation keys from tables. These tables not only map single Unicode characters to \hich\af0\dbch\af31505\loch\f0 
-single keys, but map sequences of characters to sequences of keys. This system allows almost any kind of collation behaviour to be expressed. Each key is actually a triplet, giving three weights that can be used successively to make finer discriminations.
-\hich\af0\dbch\af31505\loch\f0  \hich\af0\dbch\af31505\loch\f0 There is an implicit fourth weight that is the Unicode value of the character itself, but that is not stored in the tables.
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 
+EPOC32 reads collation keys from tables. These tables not only map single Unicode characters to single keys, but map sequences of characters to sequences of keys. This system allows almost any kind of collation behaviour to be expressed. Each key is actua
+\hich\af0\dbch\af31505\loch\f0 lly a triplet, giving three weights that can be used successively to make finer discriminations. There is an implicit fourth weight that is the Unicode value of the character itself, but that is not stored in the tables.
+
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 There can be two sets of tables. The first set provides the standard keys; the optional second set tailors them for a particular lo\hich\af0\dbch\af31505\loch\f0 cale. See the definition of TCollationMethod in \\e32\\include
+\par \hich\af0\dbch\af31505\loch\f0 There can be two sets of tables. T\hich\af0\dbch\af31505\loch\f0 he first set provides the standard keys; the optional second set tailors them for a particular locale. See the definition of TCollationMethod in \\e32\\include
 \\collate.h; iMainTable contains the standard keys and iOverrideTable the tailoring.
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 The tables used by EPOC are arrays of numbers written in the C++ source code in hexadecimal notation, and packe\hich\af0\dbch\af31505\loch\f0 
-d and encoded in various ways to make them more compact. This article explains how to use COLTAB to write this C++ code, translating from source data supplied by the Unicode Consortium, or other source data in the same format. It is followed by a case stu
-\hich\af0\dbch\af31505\loch\f0 d\hich\af0\dbch\af31505\loch\f0 y; that of creating collation tables for Swedish.
+\par \hich\af0\dbch\af31505\loch\f0 The tables use\hich\af0\dbch\af31505\loch\f0 
+d by EPOC are arrays of numbers written in the C++ source code in hexadecimal notation, and packed and encoded in various ways to make them more compact. This article explains how to use COLTAB to write this C++ code, translating from source data supplied
+\hich\af0\dbch\af31505\loch\f0  \hich\af0\dbch\af31505\loch\f0 by the Unicode Consortium, or other source data in the same format. It is followed by a case study; that of creating collation tables for Swedish.
 \par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \ab\ai\af1\afs24\alang1025 \ltrch\fcs0 \b\i\fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 COLTAB reference
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 COLTAB syntax
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
-\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 COLTAB is a Windows NT console application that requires }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 a single command-line argument}{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 
-\b\cf0\revised\revauth1\revdttm1188404120\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  and a single option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404122\insrsid7604161 
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 COLTAB is a Windows NT console application that requires }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 a single command-line\hich\af0\dbch\af31505\loch\f0  argument}{
+\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  and a single option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7604161 
+\par 
+\par \hich\af0\dbch\af31505\loch\f0 The argument }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 is the }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 locale name}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 \hich\f0 , which is used as a base for the names of the files that COLTAB reads and writes. The locale name can be one of the two special names \'93\loch\f0 \hich\f0 standard\'94\loch\f0 
+\hich\f0  and \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0 , in which case the standard da\hich\af0\dbch\af31505\loch\f0 
+ta files are read, or anything else (usually the name of a language) in which case files providing specific collation rules for that language are read.
 \par 
-\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \deleted\revauthdel1\revdttmdel1188404122\insrsid11078925\delrsid7604161 \hich\af0\dbch\af31505\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \deleted\revauthdel1\revdttmdel1188404120\insrsid11078925\delrsid7604161 
-\hich\af0\dbch\af31505\loch\f0 This }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404120\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 The argument }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 is the }{
-\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 locale name}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 , which is used as a base fo\hich\af0\dbch\af31505\loch\f0 \hich\f0 
-r the names of the files that COLTAB reads and writes. The locale name can be one of the two special names \'93\loch\f0 \hich\f0 standard\'94\loch\f0 \hich\f0  and \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0 
-, in which case the standard data files are read, or anything else (usually the name of a language) in which case files providi\hich\af0\dbch\af31505\loch\f0 n\hich\af0\dbch\af31505\loch\f0 g specific collation rules for that language are read.
-\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404122\insrsid11078925 
-\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404122\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 The option is \hich\f0 \lquote \loch\f0 /a\hich\f0 \rquote \loch\f0 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404123\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 The}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404126\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  organization of}{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404127\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404126\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 the }{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404123\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 default collation keys files provided by the Unicode}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404134\insrsid9447428 \hich\af0\dbch\af31505\loch\f0 
- Consortium}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404123\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  ha}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404124\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 ve}{
-\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404123\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404127\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 been }{\rtlch\fcs1 
-\af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404123\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 slightly changed since }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404122\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 Unicode }{
-\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404124\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 version }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404122\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 3.0}{
-\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404124\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404125\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 Before}{\rtlch\fcs1 
-\af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404127\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  and in}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404125\insrsid7604161 \hich\af0\dbch\af31505\loch\f0  Unicode 3.0, }{\rtlch\fcs1 
-\af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404122\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 three }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404123\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 keys 
-\hich\af0\dbch\af31505\loch\f0 files}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404125\insrsid7604161 \hich\af0\dbch\af31505\loch\f0 
- are provided. They are the base keys file, the composite keys file, and the string keys file. After Unicode 3.0, these three files are combined into one}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404128\insrsid7604161 
-\hich\af0\dbch\af31505\loch\f0  single file, which is the all keys file}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404125\insrsid7604161 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404128\insrsid7604161 
-\hich\af0\dbch\af31505\loch\f0  When option \hich\f0 \lquote \loch\f0 /a\hich\f0 \rquote \loch\f0  is not specified, COLTAB will try to fi\hich\af0\dbch\af31505\loch\f0 nd the three separated files, using the locale name as}{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404131\insrsid2316060 \hich\af0\dbch\af31505\loch\f0  file name base. When option \hich\f0 \lquote \loch\f0 a\hich\f0 \rquote \loch\f0  is specified, }{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404132\insrsid9447428 \hich\af0\dbch\af31505\loch\f0 COLTAB will try to find the single keys file, using the locale name as file name base.}{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404122\insrsid7604161 
-\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7604161 
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7604161 \hich\af0\dbch\af31505\loch\f0 The option is \hich\f0 \lquote \loch\f0 /a\hich\f0 \rquote \loch\f0 . \hich\af0\dbch\af31505\loch\f0 The\hich\af0\dbch\af31505\loch\f0  organization of
+\hich\af0\dbch\af31505\loch\f0  \hich\af0\dbch\af31505\loch\f0 the \hich\af0\dbch\af31505\loch\f0 default collation keys files provided by the Unicode}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9447428 \hich\af0\dbch\af31505\loch\f0  Consor
+\hich\af0\dbch\af31505\loch\f0 tium}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7604161 \hich\af0\dbch\af31505\loch\f0  ha\hich\af0\dbch\af31505\loch\f0 ve\hich\af0\dbch\af31505\loch\f0  \hich\af0\dbch\af31505\loch\f0 been \hich\af0\dbch\af31505\loch\f0 
+slightly changed since \hich\af0\dbch\af31505\loch\f0 Unicode \hich\af0\dbch\af31505\loch\f0 version \hich\af0\dbch\af31505\loch\f0 3.0\hich\af0\dbch\af31505\loch\f0 . \hich\af0\dbch\af31505\loch\f0 Before\hich\af0\dbch\af31505\loch\f0  and in
+\hich\af0\dbch\af31505\loch\f0  Unicode 3.0, \hich\af0\dbch\af31505\loch\f0 three \hich\af0\dbch\af31505\loch\f0 keys files\hich\af0\dbch\af31505\loch\f0 
+ are provided. They are the base keys file, the composite keys file, and the string keys file. After Unicode 3.0, these three files are combined into one\hich\af0\dbch\af31505\loch\f0  single file, which is the all keys file.
+\hich\af0\dbch\af31505\loch\f0  When option \hich\f0 \lquote \loch\f0 /a\hich\f0 \rquote \loch\f0  is not specified, COLTAB will try to find the three separated files, using the locale name as}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2316060 
+\hich\af0\dbch\af31505\loch\f0  file name base. When option \hich\f0 \lquote \loch\f0 a\hich\f0 \rquote \loch\f0  is specified, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9447428 \hich\af0\dbch\af31505\loch\f0 
+COLTAB will try to find the single keys file, using the l\hich\af0\dbch\af31505\loch\f0 ocale name as file name base.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7604161 
+\par 
 \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 The input and output files are:
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 1. The base keys file. If the loca\hich\af0\dbch\af31505\loch\f0 \hich\f0 le name is  \'93\loch\f0 \hich\f0 standard\'94\loch\f0 \hich\f0  or \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0  this is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
-\i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  (the standard base keys file supplied by the Unicode Consortium), otherwise it is }{\rtlch\fcs1 \ai\af0 
-\ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 <locale-name>_basekeys.txt.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
+\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 1. The base keys file. If the locale name is  \'93\loch\f0 \hich\f0 standard\'94\loch\f0 \hich\f0  or \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0  this is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 
+\hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  (the standard base keys file supplied by the Unicode Consortium), otherwise it is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 <locale-name>_basekeys\hich\af0\dbch\af31505\loch\f0 .txt.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 \hich\f0 2. The composite keys file. If the locale name is  \'93\loch\f0 \hich\f0 standard\'94\loch\f0 \hich\f0  or \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0  this is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 
-\hich\af0\dbch\af31505\loch\f0 compkeys.tx\hich\af0\dbch\af31505\loch\f0 t}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  (the standard base keys file supplied by the Unicode Consortium), otherwise it is }{\rtlch\fcs1 
-\ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 <locale-name>_compkeys.txt.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
+\hich\af0\dbch\af31505\loch\f0 compkeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  (the standard base keys file supplied by the Unicode Consortium), otherwise it is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 <locale-name>_compkeys.txt.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 \hich\f0 3. The file of strings; sequences of Unicode characters that map to single collation keys. If the locale name is  \'93\loch\f0 \hich\f0 standard\'94\loch\f0 \hich\f0  or \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0 
- no strin\hich\af0\dbch\af31505\loch\f0 gs file is read, otherwise it is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 <locale-name>_strings.txt.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
-\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404133\insrsid11078925 
-\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404133\insrsid9447428 \hich\af0\dbch\af31505\loch\f0 \hich\f0 3. The all keys file. If the locale name is \'93\loch\f0 \hich\f0 standard\'94\loch\f0 \hich\f0  or \'93\loch\f0 \hich\f0 wgl4
-\'94\loch\f0  this is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\cf0\revised\revauth1\revdttm1188404135\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 baseallkeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404133\insrsid9447428 
-\hich\af0\dbch\af31505\loch\f0  (the standard }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404134\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 all}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404133\insrsid9447428 
-\hich\af0\dbch\af31505\loch\f0  ke}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404134\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 ys file supplied by the Unicode Consortium), otherwise it is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
-\i\cf0\revised\revauth1\revdttm1188404135\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 <locale-name>_allkeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\revised\revauth1\revdttm1188404135\insrsid8209133 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 
-\cf0\revised\revauth1\revdttm1188404135\insrsid9447428 
+ no strings file is read, otherwise it is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 <locale-name>_strings.txt.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
+\par 
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9447428 \hich\af0\dbch\af31505\loch\f0 \hich\f0 3. The all keys file. If the locale name is \'93\loch\f0 standar\hich\af0\dbch\af31505\loch\f0 \hich\f0 d\'94\loch\f0 \hich\f0  or \'93\loch\f0 \hich\f0 wgl4\'94
+\loch\f0  this is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 baseallkeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9447428 \hich\af0\dbch\af31505\loch\f0  (the standard }{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 all}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9447428 \hich\af0\dbch\af31505\loch\f0  ke}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8209133 \hich\af0\dbch\af31505\loch\f0 
+ys file supplied by the Unicode Consortium), otherwise it is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8209133 \hich\af0\dbch\af31505\loch\f0 <locale-name>_allkeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8209133 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid9447428 
 \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6169386 
 \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 4. The output C++ source file. This is }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 ls_<locale-name>.cpp}{\rtlch\fcs1 \af0 \ltrch\fcs0 
 \insrsid11078925 .
@@ -146,94 +136,93 @@
 
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 0044 ; [.0707.0020.0008.0044] % LATIN CAPITAL LETTER D
-\par \hich\af0\dbch\af31505\loch\f0 FF24 ; [.0707.0020.0009.FF24] % FULLWIDTH LATIN CAPITAL LETTER \hich\af0\dbch\af31505\loch\f0 D; COMPAT
+\par \hich\af0\dbch\af31505\loch\f0 FF24 ; [.0707.0020.0009.FF24] % FULLWIDTH LATIN CAPITAL LETTER D; COMPAT
 \par \hich\af0\dbch\af31505\loch\f0 216E ; [.0707.0020.000A.216E] % ROMAN NUMERAL FIVE HUNDRED; COMPAT
-\par \hich\af0\dbch\af31505\loch\f0 24B9 ; [.0707.0020.000C.24B9] % CIRCLED LATIN CAPITAL LETTER D; COMPAT
+\par \hich\af0\dbch\af31505\loch\f0 24B9 ; [.0707.0020.0\hich\af0\dbch\af31505\loch\f0 00C.24B9] % CIRCLED LATIN CAPITAL LETTER D; COMPAT
 \par \hich\af0\dbch\af31505\loch\f0 010F ; [.0707.0031.0002.010F] % LATIN SMALL LETTER D WITH CARON; CANONSEQ
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 The format is
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 a four-digit hex n\hich\af0\dbch\af31505\loch\f0 umber; the Unicode value of the character
-\par \hich\af0\dbch\af31505\loch\f0 a space, a semicolon, and a space (optionally, a single space can occur here rather then the three characters just mentioned; this is how the data files used to be before Unicode 3.0 was released in March 2000)
-\par \hich\af0\dbch\af31505\loch\f0 squ\hich\af0\dbch\af31505\loch\f0 
-are brackets enclosing the four collation keys, each of which is a four-digit hex number preceded either by a full stop (meaning that this value is treated in the ordinary way) or an asterisk (meaning that this value is usually ignored)
+\par \hich\af0\dbch\af31505\loch\f0 a four-digit hex number; the Unicode value of the character
+\par \hich\af0\dbch\af31505\loch\f0 a space, a semicolon, and a space (optionally, a single\hich\af0\dbch\af31505\loch\f0 
+ space can occur here rather then the three characters just mentioned; this is how the data files used to be before Unicode 3.0 was released in March 2000)
+\par \hich\af0\dbch\af31505\loch\f0 square brackets enclosing the four collation keys, each of which is a four-digit hex number preceded\hich\af0\dbch\af31505\loch\f0 
+ either by a full stop (meaning that this value is treated in the ordinary way) or an asterisk (meaning that this value is usually ignored)
 \par \hich\af0\dbch\af31505\loch\f0 a space
-\par \hich\af0\dbch\af31505\loch\f0 a percent s\hich\af0\dbch\af31505\loch\f0 ign
+\par \hich\af0\dbch\af31505\loch\f0 a percent sign
 \par \hich\af0\dbch\af31505\loch\f0 an optional comment that is usually the Unicode name of the character
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 In addition, the file can start with some comments (lines starting with a percent sign) followed by the revision number (e.g., \hich\f0 \lquote \loch\f0 2.1.9 % version\hich\f0 \rquote \loch\f0 
-) on a line of its own; this part is \hich\af0\dbch\af31505\loch\f0 optional. Blank lines are ignored.
+\par \hich\af0\dbch\af31505\loch\f0 In addition, the file \hich\af0\dbch\af31505\loch\f0 can start with some comments (lines starting with a percent sign) followed by the revision number (e.g., \hich\f0 \lquote \loch\f0 2.1.9 % version\hich\f0 \rquote 
+\loch\f0 ) on a line of its own; this part is optional. Blank lines are ignored.
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 The four key values have the following conventional meanings:
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 Level-0 key (0707 in the first example line above): basic character identity. All Ds have 0707 as their level-0 key.
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 Level-1 key (0020): diacritic or modifi\hich\af0\dbch\af31505\loch\f0 er if any; 0020 means \hich\f0 \lquote \loch\f0 no diacritic\hich\f0 \rquote \loch\f0 , 0031 means \hich\f0 \lquote \loch\f0 caron\hich\f0 \rquote 
-\loch\f0 , etc. There are too many of these to list here but values can easily be ascertained by looking at }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 .
-
+\par \hich\af0\dbch\af31505\loch\f0 Level-1 key (0020): diacritic or modifier if any; 0020 means \hich\f0 \lquote \loch\f0 no diacritic\hich\f0 \rquote \loch\f0 , 0031 means \hich\f0 \lquote \loch\f0 caron\hich\f0 \rquote \hich\af0\dbch\af31505\loch\f0 
+, etc. There are too many of these to list here but values can easily be ascertained by looking at }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 .
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 Level-2 key (0008): case or other variation. Here are the conventional values used in }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 
 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  and }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 compkeys.txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 :
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 0002: default value; small letter; musical sign\line 0003: fullwidth small letter\line 0004: small letter used as Roman numeral or mathematical symbol\line 0005: script small letter\line 0006: circled small letter\line 
-0007: not used\line 0008: capital \hich\af0\dbch\af31505\loch\f0 letter\line 0009: fullwidth capital letter\line 000A: capital letter used as Roman numeral or mathematical symbol
-\par \hich\af0\dbch\af31505\loch\f0 000B: script capital\line 000C: circled capital\line 000D: Hiragana small letter\line 000E: Hiragana letter\line 000F: Katakana small letter\line 0010: Halfwidth Katakana small \hich\af0\dbch\af31505\loch\f0 letter
+\par \hich\af0\dbch\af31505\loch\f0 0002: default value; sma\hich\af0\dbch\af31505\loch\f0 ll letter; musical sign\line 0003: fullwidth small letter\line 0004: small letter used as Roman numeral or mathematical symbol\line 0005: script small letter\line 
+0006: circled small letter\line 0007: not used\line 0008: capital letter\line 0009: fullwidth capital letter\line 000A: capital lett\hich\af0\dbch\af31505\loch\f0 e\hich\af0\dbch\af31505\loch\f0 r used as Roman numeral or mathematical symbol
+\par \hich\af0\dbch\af31505\loch\f0 000B: script capital\line 000C: circled capital\line 000D: Hiragana small letter\line 000E: Hiragana letter\line 000F: Katakana small letter\line 0010: Halfwidth Katakana small letter
 \par \hich\af0\dbch\af31505\loch\f0 0011: Katakana letter
-\par \hich\af0\dbch\af31505\loch\f0 0012: Halfwidth Katakana letter
+\par \hich\af0\dbch\af31505\loch\f0 0012: Halfwidth Katakana let\hich\af0\dbch\af31505\loch\f0 ter
 \par \hich\af0\dbch\af31505\loch\f0 0013: Circled Katakana letter
 \par \hich\af0\dbch\af31505\loch\f0 0014: modifier, ideographic annotation, superscript
 \par \hich\af0\dbch\af31505\loch\f0 0015: subscript
 \par \hich\af0\dbch\af31505\loch\f0 0016: vertical presentation form
 \par \hich\af0\dbch\af31505\loch\f0 0017: initial (Arabic or other) presentation form
-\par \hich\af0\dbch\af31505\loch\f0 0018: medial p\hich\af0\dbch\af31505\loch\f0 resentation form
+\par \hich\af0\dbch\af31505\loch\f0 0018: medial presentation form
 \par \hich\af0\dbch\af31505\loch\f0 0019: final presentation form
-\par \hich\af0\dbch\af31505\loch\f0 001A: isolated presentation form
+\par \hich\af0\dbch\af31505\loch\f0 001A: isol\hich\af0\dbch\af31505\loch\f0 ated presentation form
 \par \hich\af0\dbch\af31505\loch\f0 001B: non-breaking variant (non-break space, etc.)
 \par \hich\af0\dbch\af31505\loch\f0 001C: surrounded by square
 \par \hich\af0\dbch\af31505\loch\f0 001D: surrounded by square (not sure how this differs from 001C)
 \par \hich\af0\dbch\af31505\loch\f0 001E: vulgar fraction
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 Level-3 ke\hich\af0\dbch\af31505\loch\f0 y: fallback key, used if all other keys yield equality; in }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 
+\par \hich\af0\dbch\af31505\loch\f0 Level-3 key: fallback key, used if all other keys yield equality; i\hich\af0\dbch\af31505\loch\f0 n }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys.txt}{\rtlch\fcs1 \af0 
 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  always the Unicode value of the character. This value is not stored in the tables generated by COLTAB.
 \par 
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 The format of the composite keys file
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
-\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 This is exactly the same as the base keys \hich\af0\dbch\af31505\loch\f0 
-file, except that there may be more than one group of collation keys. Here are a few sample lines (broken here because of the narrow page):
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 This is exactly the same as the base keys file, except that there may be more than one group of col\hich\af0\dbch\af31505\loch\f0 
+lation keys. Here are a few sample lines (broken here because of the narrow page):
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 217A ; [.08D9.0020.0004.0078] [.079D.0020.0004.0069] % SMALL ROMAN NUMERAL ELEVEN;
 \par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 COMPATSEQ
-\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 217B ; [.08D9.0020.000\hich\af0\dbch\af31505\loch\f0 
-4.0078] [.079D.0020.0004.0069] [.079D.0020.0004.0069] %
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 217B ; [.08D9.0020.0004.0078] [.079D.0020.0004.0069] [.079D.0020.0004.0069] %
 \par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 SMALL ROMAN NUMERAL TWELVE; COMPATSEQ
 \par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 216A ; [.08D9.0020.000A.0058] [.079D.0020.000A.0049] % ROMAN NUMERAL ELEVEN;
 \par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 COMPATSEQ
-\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 216B ; [.08D9.0020.000A.0058] [.079D.0020.000A.0049] [.079D.0020.000A.0049]
-\hich\af0\dbch\af31505\loch\f0  % ROMAN
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 216B ; [.08D9.0020.000A.0058] [.079D.0020.000A.0049] [.079D.0020.000A.0049] % ROMAN
 \par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 NUMERAL TWELVE; COMPATSEQ
-\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 0149 ; [.091E.0020.0004.02BC] [.07FD.0020.0004.006E] % LATIN SMALL LETTER N
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 0149 ; [.091E.0020.00\hich\af0\dbch\af31505\loch\f0 
+04.02BC] [.07FD.0020.0004.006E] % LATIN SMALL LETTER N
 \par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 PRECEDED BY APOSTROPHE; COMPATSEQ
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 The format of the strings file
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
-\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 The strings file has the same format as compkeys.txt, except that there can be a\hich\af0\dbch\af31505\loch\f0 
-ny number of Unicode characters at the start of the line, space-separated and each exactly 4 hex digits.
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 The strings file has the same format as compkeys.txt, except that there can be any number of Unicode characters at the start of the line\hich\af0\dbch\af31505\loch\f0 
+, space-separated and each exactly 4 hex digits.
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 Each line associates a string of Unicode characters (sometimes known as a \hich\f0 \lquote \loch\f0 collation grapheme\hich\f0 \rquote \loch\f0 ) with a collation key or sequence of collation keys. Th
-\hich\af0\dbch\af31505\loch\f0 e collation system currently handles strings of up to 8 characters. For example, the following entry treats \hich\f0 \lquote \loch\f0 ch\hich\f0 \rquote \loch\f0 
+\par \hich\af0\dbch\af31505\loch\f0 Each line associates a string of Unicode characters (sometimes known as a \hich\f0 \lquote \loch\f0 collation grapheme\hich\f0 \rquote \loch\f0 
+) with a collation key or sequence of collation keys. The collation system currently handles strings of up to 8 \hich\af0\dbch\af31505\loch\f0 characters. For example, the following entry treats \hich\f0 \lquote \loch\f0 ch\hich\f0 \rquote \loch\f0 
  as a single letter, as is done in traditional Spanish collation:
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 0063 0068 ; [.06FC.0020.0002.0063] % LATIN SMALL LETTER C followed by LATIN S\hich\af0\dbch\af31505\loch\f0 MALL
+\par \hich\af0\dbch\af31505\loch\f0 0063 0068 ; [.06FC.0020.0002.0063] % LATIN SMALL LETTER C followed by LATIN SMALL
 \par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 LETTER H
 \par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
-\par \hich\af0\dbch\af31505\loch\f0 You will have to supply all the case versions as separate entries. For \hich\f0 \lquote \loch\f0 ch\hich\f0 \rquote \loch\f0  the variants \hich\f0 \lquote \loch\f0 ch\hich\f0 \rquote \loch\f0 , \hich\f0 \lquote \loch\f0 Ch
-\hich\f0 \rquote \loch\f0  and \hich\f0 \lquote \loch\f0 CH\hich\f0 \rquote \loch\f0  are needed; \hich\f0 \lquote \loch\f0 cH\hich\f0 \rquote \loch\f0  should probably be omitted as not actually a case-variant of \hich\f0 \lquote \loch\f0 ch\hich\f0 
-\rquote \loch\f0  but two separate letters.
+\par \hich\af0\dbch\af31505\loch\f0 You will have to supply all the case vers\hich\af0\dbch\af31505\loch\f0 ions as separate entries. For \hich\f0 \lquote \loch\f0 ch\hich\f0 \rquote \loch\f0  the variants \hich\f0 \lquote \loch\f0 ch\hich\f0 \rquote \loch\f0 
+, \hich\f0 \lquote \loch\f0 Ch\hich\f0 \rquote \loch\f0  and \hich\f0 \lquote \loch\f0 CH\hich\f0 \rquote \loch\f0  are needed; \hich\f0 \lquote \loch\f0 cH\hich\f0 \rquote \loch\f0  should probably be omitted as not actually a case-variant of \hich\f0 
+\lquote \loch\f0 ch\hich\f0 \rquote \loch\f0  but two separate letters.
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 The output file
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
-\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 COLTAB \hich\af0\dbch\af31505\loch\f0 writes a C++ source file that looks like this (omitting irrelevant material):
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 COLTAB writes a C++ source file that looks like this (omitting \hich\af0\dbch\af31505\loch\f0 irrelevant material):
 \par 
 \par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid11078925 \hich\af2\dbch\af31505\loch\f2 static const TUint32 TheKey[] = 
 \par \tab \{
@@ -261,48 +250,48 @@
 \par \tab \{
 \par \tab \}\hich\af2\dbch\af31505\loch\f2 ;
 \par 
-\par \hich\af2\dbch\af31505\loch\f2 static const TCollationKeyTable TheStandardTable = 
+\par \hich\af2\dbch\af31505\loch\f2 static c\hich\af2\dbch\af31505\loch\f2 onst TCollationKeyTable TheStandardTable = 
 \par \tab \{\hich\af2\dbch\af31505\loch\f2  TheKey, TheIndex, 517, TheStringElement, TheStringIndex, 0 \};
 \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
-\par \hich\af0\dbch\af31505\loch\f0 The last declaration is the important one; all the preceding ones are components of it. T\hich\af0\dbch\af31505\loch\f0 
-he TCollationKeyTable structure that is declared can be used as one of the two elements of a TCollationMethod structure, which can be passed to one of the Mem::CompareC or TDesC16::CompareC functions.
+\par \hich\af0\dbch\af31505\loch\f0 The last declaration is the important one; all the preceding ones are components of it. The TCollationKeyTable structure that is declared can be u\hich\af0\dbch\af31505\loch\f0 
+sed as one of the two elements of a TCollationMethod structure, which can be passed to one of the Mem::CompareC or TDesC16::CompareC functions.
 \par 
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Putting the output into EPOC
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
-\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 In an EPOC implementation\hich\af0\dbch\af31505\loch\f0  collation rules are kept in two places. The }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 standard }{
-\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 rules, which form the base from which the tailoring or tailorings for a given locale differ, are encoded as constant static data in \\e32\\euser\\unicode\\collate.cpp. The }{
-\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 locale-specific}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  rules for the defa\hich\af0\dbch\af31505\loch\f0 ult locale are kept in \\e32
-\\elocl\\ls_unic.cpp. Locale-specific rules for other locales are kept in other files of the form \\e32\\elocl\\ls_<x>.cpp, where <x> will probably be the language name or locale code; this is yet to be decided.
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 In an EPOC implementation collation rules are kept in two places. The }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 standard }{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 rul\hich\af0\dbch\af31505\loch\f0 es, which form the base from which the tailoring or tailorings for a given locale differ, are encoded as constant static data in \\e32\\euser\\unicode\\collate.cpp. The }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 locale-specific}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  rules for the default locale are kept in \\e32\\elocl\\ls_unic.cpp. Locale-spe
+\hich\af0\dbch\af31505\loch\f0 cific rules for other locales are kept in other files of the form \\e32\\elocl\\ls_<x>.cpp, where <x> will probably be the language name or locale code; this is yet to be decided.
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 The standard rules sh\hich\af0\dbch\af31505\loch\f0 ould be changed only when the Unicode organisation releases new collation key tables, or when EPOC changes.
+\par \hich\af0\dbch\af31505\loch\f0 The standard rules should be changed only when the Unicode organisation releas\hich\af0\dbch\af31505\loch\f0 es new collation key tables, or when EPOC changes.
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 Tailoring files containing locale-specific collation keys can be created whenever necessary by running COLTAB; for locales other than \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0 \hich\f0  and \'93\loch\f0 s
-\hich\af0\dbch\af31505\loch\f0 \hich\f0 tandard\'94\loch\f0  COLTAB writes a complete source file that with small modifications (e.g., declaring a constant for the UID for the locale-specific collation rules) can be used directly as part of ELOCL.}{
-\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid11078925 
+\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 Tailoring files containing locale-specific collation keys can be created whenever necessary by running COLTAB; for locales other than \'93\loch\f0 \hich\f0 wgl4\'94\loch\f0 \hich\f0  and \'93\loch\f0 \hich\f0 
+standard\'94\loch\f0  COLTAB writes a complete source file that with s\hich\af0\dbch\af31505\loch\f0 mall modifications (e.g., declaring a constant for the UID for the locale-specific collation rules) can be used directly as part of ELOCL.}{\rtlch\fcs1 
+\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid11078925 
 \par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \rtlch\fcs1 \ab\ai\af1\afs24\alang1025 \ltrch\fcs0 \b\i\fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
 \rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Case Study: tailoring for the Swedish locale
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
-\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Determine the c\hich\af1\dbch\af31505\loch\f1 ollation rules
+\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid11078925 \hich\af1\dbch\af31505\loch\f1 Determine the collation rules
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 
-The first stage is to determine the collation rules for the locale in question. I will use Swedish as an example. Swedish uses the Latin script with some letters that require special treatment. It is a good rule, and one that I will follow 
-\hich\af0\dbch\af31505\loch\f0 
-here, that in all cases apart from the peculiarities that actually matter to the particular locale, the standard collation system should be used. For example, it is unnecessary and undesirable for the Swedish locale to sort Greek letters in a non-standard
-\hich\af0\dbch\af31505\loch\f0  \hich\af0\dbch\af31505\loch\f0 
-way. This means that the Swedish locale will be a relatively simple tailoring of the standard locale, which provides collation keys for the WGL4 character repertoire plus some useful control characters.
+The first stage is to determine the collation rules for the locale in question. I will use Swedish as an example. Swedish uses the Latin script with some letters that require special treatment. It is a good rule, and one that I will follow here, that in a
+\hich\af0\dbch\af31505\loch\f0 l\hich\af0\dbch\af31505\loch\f0 
+l cases apart from the peculiarities that actually matter to the particular locale, the standard collation system should be used. For example, it is unnecessary and undesirable for the Swedish locale to sort Greek letters in a non-standard way. This means
+\hich\af0\dbch\af31505\loch\f0  \hich\af0\dbch\af31505\loch\f0 that the Swedish locale will be a relatively simple tailoring of the standard locale, which provides collation keys for the WGL4 character repertoire plus some useful control characters.
+
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 The rules that we need to express are as follows. (N\hich\af0\dbch\af31505\loch\f0 
-ote to experts in Swedish: these rules are meant as an example and may not follow actual Swedish practice, although I believe they are correct as far as they go.)
+\par \hich\af0\dbch\af31505\loch\f0 The rules that we need to express are as follows. (Note to experts i\hich\af0\dbch\af31505\loch\f0 
+n Swedish: these rules are meant as an example and may not follow actual Swedish practice, although I believe they are correct as far as they go.)
 \par 
 \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang2057\langfe2052\langnp2057\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 1. \tab}}\pard \ltrpar\ql \fi-283\li283\ri0\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0
-\pndec\pnb0\pni0\pnfs20\pnstart1\pnindent283\pnhang {\pntxta \hich . }}\faauto\ls1\rin0\lin283\itap0\pararsid7604161 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 \hich\f0 The letters \'e5\loch\f0 \hich\f0 , \'e4\loch\f0 
-\hich\f0 , and \'f6\loch\f0  (a-ring, a-umlaut and o-umlaut) are separate letters, placed in that\hich\af0\dbch\af31505\loch\f0  order after z. They are not to be treated as accented letters.
+\pndec\pnb0\pni0\pnfs20\pnstart1\pnindent283\pnhang {\pntxta . }}\faauto\ls1\rin0\lin283\itap0\pararsid7604161 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 \hich\f0 The letters \'e5\loch\f0 \hich\f0 , \'e4\loch\f0 
+\hich\f0 , and \'f6\loch\f0  (a-ring, a-umlaut and o-umlaut) are separate letters, placed in that order aft\hich\af0\dbch\af31505\loch\f0 er z. They are not to be treated as accented letters.
 \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang2057\langfe2052\langnp2057\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 2. \tab}}\pard \ltrpar\ql \fi-283\li283\ri0\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0
-\pndec\pnb0\pni0\pnfs20\pnstart1\pnindent283\pnhang {\pntxta \hich . }}\faauto\ls1\rin0\lin283\itap0\pararsid7604161 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 
-The letters v and w are identical for the purposes of collation.
+\pndec\pnb0\pni0\pnfs20\pnstart1\pnindent283\pnhang {\pntxta . }}\faauto\ls1\rin0\lin283\itap0\pararsid7604161 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 The letters v and w are identical for the purposes of collation.
+
 \par {\pntext\pard\plain\ltrpar \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang2057\langfe2052\langnp2057\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 3. \tab}}\pard \ltrpar\ql \fi-283\li283\ri0\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0
-\pndec\pnb0\pni0\pnfs20\pnstart1\pnindent283\pnhang {\pntxta \hich . }}\faauto\ls1\rin0\lin283\itap0\pararsid7604161 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 \hich\f0 The letters \'fc\loch\f0 
+\pndec\pnb0\pni0\pnfs20\pnstart1\pnindent283\pnhang {\pntxta . }}\faauto\ls1\rin0\lin283\itap0\pararsid7604161 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 \hich\f0 The letters \'fc\loch\f0 
  and y are identical for the purposes of collation.
 \par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 
 \par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af1\hich\af1\dbch\af31505\cgrid\langnp2057\langfenp2052 {
@@ -310,28 +299,28 @@
 \par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 
 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 Here is the tailoring data. 
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 The equiv\hich\af0\dbch\af31505\loch\f0 alence of v and w is indicated by a tailored base keys file that should be called (following COLTAB\hich\f0 \rquote \loch\f0 
+\par \hich\af0\dbch\af31505\loch\f0 The equ\hich\af0\dbch\af31505\loch\f0 ivalence of v and w is indicated by a tailored base keys file that should be called (following COLTAB\hich\f0 \rquote \loch\f0 
 s conventions) swedish_basekeys.txt. Creating this is simple; just copy the }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 basekeys}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 .}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
-\i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  entries for V (U+0056) and v (U+0076) but change the Unicode values\hich\af0\dbch\af31505\loch\f0  to 0057 and 0077.
+\i\insrsid11078925 \hich\af0\dbch\af31505\loch\f0 txt}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0  entries for V (U+0056) and v (U+0076) but change the Unicode valu\hich\af0\dbch\af31505\loch\f0 es to 0057 and 0077.
 
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 0057 [.08C5.0020.0008.0057] % W equivalent to V
 \par \hich\af0\dbch\af31505\loch\f0 0077 [.08C5.0020.0002.0077] % w equivalent to v
 \par 
-\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 The letters \'e5\loch\f0 \hich\f0 , \'e4\loch\f0 \hich\f0 , \'f6\loch\f0 \hich\f0  and \'fc\loch\f0  must be treated in the data as strings of Unicode values, that is of bases plus accents, associated with single k
-\hich\af0\dbch\af31505\loch\f0 eys. (There is no need to create entries for the composed versions, because the EPOC collation system dissects them as it goes along). Use the combining diacritics; most are in the Unicode range U+0300\hich\f0 \emdash 
-\loch\f0 U+0361. For example, U+030A is combining ring above. \hich\af0\dbch\af31505\loch\f0 I\hich\af0\dbch\af31505\loch\f0 n general you have to use the combined character\hich\f0 \rquote \loch\f0 s canonical decomposition.
+\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 The letters \'e5\loch\f0 \hich\f0 , \'e4\loch\f0 \hich\f0 , \'f6\loch\f0 \hich\f0  and \'fc\loch\f0  must be treated in the data as strings of Unicode values, that is of bases plus accents, associated with single
+\hich\af0\dbch\af31505\loch\f0  keys. (There is no need to create entries for the composed versions, because the EPOC collation system dissects them as it goes along). Use the combining diacritics; most are in the Unicode range U+0300\hich\f0 \emdash 
+\loch\f0 U+0361. For example, U+030A is combining ring above.\hich\af0\dbch\af31505\loch\f0  In general you have to use the combined character\hich\f0 \rquote \loch\f0 s canonical decomposition.
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 \hich\f0 The primary collation keys for \'e5\loch\f0 \hich\f0 , \'e4\loch\f0 \hich\f0 , and \'f6\loch\f0  are assigned by making use of the convenient gaps between existing key values. The last \hich\f0 \lquote \loch\f0 z
-\hich\f0 \rquote \loch\f0  is U+0291, Latin small letter z with curl, w\hich\af0\dbch\af31505\loch\f0 
-hich has the primary key 08F5. The next entry is for U+0292, Latin small letter ezh, which has the primary key 08F9. This leaves a gap of 3 unused primary keys, 08F6\hich\f0 \emdash \loch\f0 \hich\f0 08F8, which can be used for \'e5\loch\f0 \hich\f0 , 
-\'e4\loch\f0 \hich\f0 , and \'f6\loch\f0 . Of course, if there were more interpolated value\hich\af0\dbch\af31505\loch\f0 s\hich\af0\dbch\af31505\loch\f0 , other primary keys would need to be reassigned.
+\hich\f0 \rquote \loch\f0  is U+0291, Latin small letter z with curl,\hich\af0\dbch\af31505\loch\f0 
+ which has the primary key 08F5. The next entry is for U+0292, Latin small letter ezh, which has the primary key 08F9. This leaves a gap of 3 unused primary keys, 08F6\hich\f0 \emdash \loch\f0 \hich\f0 08F8, which can be used for \'e5\loch\f0 \hich\f0 , 
+\'e4\loch\f0 \hich\f0 , and \'f6\loch\f0 . Of course, if there were more interpolated val\hich\af0\dbch\af31505\loch\f0 u\hich\af0\dbch\af31505\loch\f0 es, other primary keys would need to be reassigned.
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 This gives us the following strings file, which is called swedish_strings.txt:
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 0061 030A [.08F6.0020.0002.00E5] % a-ring after z
 \par \hich\af0\dbch\af31505\loch\f0 0061 0308 [.08F7.0020.0002.00E4] % a-umlaut after a-ring
-\par \hich\af0\dbch\af31505\loch\f0 006F 0308 [.08F8.0\hich\af0\dbch\af31505\loch\f0 020.0002.00F6] % o-umlaut after a-umlaut
+\par \hich\af0\dbch\af31505\loch\f0 006F 0308 [.08F8\hich\af0\dbch\af31505\loch\f0 .0020.0002.00F6] % o-umlaut after a-umlaut
 \par \hich\af0\dbch\af31505\loch\f0 0041 030A [.08F6.0020.0008.00C5] % A-ring after Z
 \par \hich\af0\dbch\af31505\loch\f0 0041 0308 [.08F7.0020.0008.00C4] % A-umlaut after A-ring
 \par \hich\af0\dbch\af31505\loch\f0 004F 0308 [.08F8.0020.0008.00D6] % O-umlaut after A-umlaut
@@ -347,14 +336,24 @@
 \par \hich\af0\dbch\af31505\loch\f0 coltab swedish
 \par 
 \par \hich\af0\dbch\af31505\loch\f0 The output is a new file, ls_swedish.cpp:
-\par \hich\af0\dbch\af31505\loch\f0 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).// All rights reserved.// This comp\hich\af0\dbch\af31505\loch\f0 
-onent and the accompanying materials are made available// under the terms of the License "Eclipse Public License v1.0"// which accompanies this distribution, and is available// at the URL "http://www.eclipse.org/legal/epl-v10.html".//// Init
-\hich\af0\dbch\af31505\loch\f0 i\hich\af0\dbch\af31505\loch\f0 al Contributors:// Nokia Corporation - initial contribution.//// Contributors://// Description:// 
-\par \hich\af0\dbch\af31505\loch\f0 LS_SWEDISH.CPP// 
-\par \hich\af0\dbch\af31505\loch\f0 // 
-\par \hich\af0\dbch\af31505\loch\f0 // //
-\par 
-\par \hich\af0\dbch\af31505\loch\f0 /*
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid737317 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid737317 \hich\af0\dbch\af31505\loch\f0 /*
+\par \hich\af0\dbch\af31505\loch\f0 * Copyright (c) 1997-2009 No\hich\af0\dbch\af31505\loch\f0 kia Corporation and/or its subsidiary(-ies).
+\par \hich\af0\dbch\af31505\loch\f0 * All rights reserved.
+\par \hich\af0\dbch\af31505\loch\f0 * This component and the accompanying materials are made available
+\par \hich\af0\dbch\af31505\loch\f0 * under the terms of "Eclipse Public License v1.0"
+\par \hich\af0\dbch\af31505\loch\f0 * which accompanies this distribution, and is available
+\par \hich\af0\dbch\af31505\loch\f0 * at the URL "\hich\af0\dbch\af31505\loch\f0 http://www.eclipse.org/legal/epl-v10.html".
+\par \hich\af0\dbch\af31505\loch\f0 *
+\par \hich\af0\dbch\af31505\loch\f0 * Initial Contributors:
+\par \hich\af0\dbch\af31505\loch\f0 * Nokia Corporation - initial contribution.
+\par \hich\af0\dbch\af31505\loch\f0 *
+\par \hich\af0\dbch\af31505\loch\f0 * Contributors:
+\par \hich\af0\dbch\af31505\loch\f0 *
+\par \hich\af0\dbch\af31505\loch\f0 * Description: 
+\par \hich\af0\dbch\af31505\loch\f0 *
+\par \hich\af0\dbch\af31505\loch\f0 */}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4132030 
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid737317 
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11078925 \hich\af0\dbch\af31505\loch\f0 /*
 \par \hich\af0\dbch\af31505\loch\f0 The LCharSet object used by the Swedish locale.
 \par \hich\af0\dbch\af31505\loch\f0 Generated by COLTAB.
 \par \hich\af0\dbch\af31505\loch\f0 */
@@ -513,17 +512,33 @@
 \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
 \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;
 \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000
-4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000
-d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+4d73786d6c322e534158584d4c5265616465722e352e30000000000000000000000e0000
+d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff01000000ec69d9888b8b3d4c859eaf6cd158be0f00000000000000000000000010bf
+d72d1dc4ca010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff02000000000000000000000000000000000000000000000010bfd72d1dc4ca01
+10bfd72d1dc4ca01000000000000000000000000d000d600d30031004d00cb0041003400540055004f005600570058003400c500c10052005300d0004600c0003d003d000000000000000000000000000000000032000101ffffffffffffffff03000000000000000000000000000000000000000000000010bfd72d1dc4
+ca0110bfd72d1dc4ca010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000
+00000000000000000000000000000000cf00000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000000058
-7b010ed9c901feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000105000000000000}}
\ No newline at end of file
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f757263657320786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d
+22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d22415041222f3e0d0a00000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b33324442
+364343332d314542302d343334442d393535392d3737413538353134423031367d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c
+64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000
+0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f
+72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}
\ No newline at end of file
--- a/textrendering/textformatting/inc/InlineText_Internal.h	Tue Mar 09 14:23:10 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
-* 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 "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-#ifndef INLINETEXT_INTERNAL_H_
-#define INLINETEXT_INTERNAL_H_
-
-#include <e32std.h>
-
-/**
-@internalTechnology
-*/
-const TUid KInlineTextApiExtensionUid = { 0x101FD03D };
-
-#endif
\ No newline at end of file
--- a/textrendering/textformatting/tagma/TMSOURCE.CPP	Tue Mar 09 14:23:10 2010 +0000
+++ b/textrendering/textformatting/tagma/TMSOURCE.CPP	Fri Apr 02 10:04:19 2010 +0100
@@ -251,6 +251,9 @@
 EXPORT_C void MTmCustom::SetPenColor(CGraphicsContext& aGc,TLogicalRgb aColor) const
 	{	
 	MTmCustomExtension c;
+	TUint index = aColor.SystemColorIndex();
+	if (index)
+	   aColor = SystemColor(index,aColor) & 0xFFFFFF;
 	c.SetPenColor(aGc,aColor);
 	}
 
--- a/textrendering/textformatting/tbox/LAYEMU.CPP	Tue Mar 09 14:23:10 2010 +0000
+++ b/textrendering/textformatting/tbox/LAYEMU.CPP	Fri Apr 02 10:04:19 2010 +0100
@@ -4012,7 +4012,9 @@
 	if (aDy > 0)		// text moves down; iBandTop decreases
 		{
 		if (aTopNoLimitBorder)
+		    {
 	        iBandTop = desired_bandtop;
+		    }
 		else
 		    iBandTop = Max(0,desired_bandtop);//Disallow text scrolled beyond top border
 		
@@ -4056,6 +4058,19 @@
 			if (!AddFormattingAtEndL(param, height_increase,paragraphs_increase))
 				break;
 			}
+		
+		// Shift the whole band upwards if we're at the very end of the text
+		// and there's no more text to format. This prevents a situation were
+		// iText->LayoutHeight() < BandHeightInPixels.
+		if ( aBottomNoLimitBorder && iText->LayoutHeight() - iBandTop < visible_height )
+		    {
+		    if ( iText->EndChar() > iText->Source()->DocumentLength() )
+		        {
+		        iBandTop = desired_bandtop;
+		        return pixels_scrolled;
+		        }
+		    }
+
 		}
 
 	// Scroll blank space off the display if desired.