fontservices/textbase/sgdi/LineBreak.cpp
changeset 51 a7c938434754
equal deleted inserted replaced
44:601ab138ba0b 51:a7c938434754
       
     1 // Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // This file was last edited on 09/04/2007. Please read the 'Unicode Character Data and Line Break data Update History.doc' file
       
    15 // for the latest updates.
       
    16 // 
       
    17 //
       
    18 
       
    19 #include "LineBreak.h"
       
    20 #include "LineBreakImp.h"
       
    21 #include <e32std.h>
       
    22 #include <e32svr.h>
       
    23 
       
    24 _LIT(KLinebreakPanicCategory,"LineBreak");
       
    25 
       
    26 GLDEF_C void Panic(TInt aError)
       
    27 	{
       
    28 	User::Panic(KLinebreakPanicCategory,aError);
       
    29 	}
       
    30 
       
    31 const TUint KOpFlag = 1 << MLineBreaker::EOpLineBreakClass;
       
    32 const TUint KClFlag = 1 << MLineBreaker::EClLineBreakClass;
       
    33 const TUint KNsFlag = 1 << MLineBreaker::ENsLineBreakClass;
       
    34 const TUint KExFlag = 1 << MLineBreaker::EExLineBreakClass;
       
    35 const TUint KSyFlag = 1 << MLineBreaker::ESyLineBreakClass;
       
    36 const TUint KIsFlag = 1 << MLineBreaker::EIsLineBreakClass;
       
    37 const TUint KPrFlag = 1 << MLineBreaker::EPrLineBreakClass;
       
    38 const TUint KPoFlag = 1 << MLineBreaker::EPoLineBreakClass;
       
    39 const TUint KNuFlag = 1 << MLineBreaker::ENuLineBreakClass;
       
    40 const TUint KAlFlag = 1 << MLineBreaker::EAlLineBreakClass;
       
    41 const TUint KIdFlag = 1 << MLineBreaker::EIdLineBreakClass;
       
    42 const TUint KInFlag = 1 << MLineBreaker::EInLineBreakClass;
       
    43 const TUint KBbFlag = 1 << MLineBreaker::EBbLineBreakClass;
       
    44 const TUint KB2Flag = 1 << MLineBreaker::EB2LineBreakClass;
       
    45 const TUint KZwFlag = 1 << MLineBreaker::EZwLineBreakClass;
       
    46 const TUint KCmFlag = 1 << MLineBreaker::ECmLineBreakClass;
       
    47 const TUint KAiFlag = 1 << MLineBreaker::EAiLineBreakClass;
       
    48 
       
    49 const TUint KAiAlFlags = KAiFlag | KAlFlag;
       
    50 
       
    51 const TUint KAllBreaks = 0xFFFFFFFF;
       
    52 const TUint KUsualForbidden = KClFlag | KExFlag | KSyFlag | KIsFlag | KZwFlag;
       
    53 const TUint KUsualAllowed = KOpFlag | KPrFlag | KPoFlag | KNuFlag | KAiAlFlags | KIdFlag | KInFlag | KBbFlag | KB2Flag;
       
    54 
       
    55 const TUint KAlAllowed = KOpFlag | KPrFlag | KPoFlag | KIdFlag | KBbFlag | KB2Flag;
       
    56 
       
    57 // A table of break rules, indexed by the class of the character before the possible break.
       
    58 static const TLineBreakRule TheLineBreakRuleTable[MLineBreaker::ELineBreakClasses] =
       
    59 	{
       
    60 	{ KAllBreaks - KCmFlag,0 },														// Op
       
    61 	{ KUsualForbidden | KNsFlag,KUsualAllowed - KPoFlag },							// Cl
       
    62 	{ KUsualForbidden | KOpFlag,0 },												// Qu
       
    63 	{ KUsualForbidden, 0 },															// Gl
       
    64 	{ KUsualForbidden, KUsualAllowed },												// Ns
       
    65 	{ KUsualForbidden, KUsualAllowed },												// Ex
       
    66 	{ KUsualForbidden, KUsualAllowed - KNuFlag },									// Sy
       
    67 	{ KUsualForbidden, KUsualAllowed - KNuFlag },									// Is
       
    68 	{ KUsualForbidden, KPrFlag | KPoFlag | KInFlag | KBbFlag | KB2Flag },			// Pr
       
    69 	{ KUsualForbidden, KUsualAllowed },												// Po
       
    70 	{ KUsualForbidden, KOpFlag | KPrFlag | KIdFlag | KBbFlag | KB2Flag },			// Nu
       
    71 	{ KUsualForbidden, KAlAllowed }, // Al
       
    72 	{ KUsualForbidden, KUsualAllowed - KPoFlag - KInFlag },							// Id
       
    73 	{ KUsualForbidden, KUsualAllowed - KInFlag },									// In
       
    74 	{ KUsualForbidden, KUsualAllowed },												// Hy
       
    75 	{ KUsualForbidden, KUsualAllowed },												// Ba
       
    76 	{ KUsualForbidden, 0 },															// Bb
       
    77 	{ KUsualForbidden | KB2Flag, KUsualAllowed },									// B2
       
    78 	{ KZwFlag, KAllBreaks - KZwFlag - KCmFlag},										// Zw
       
    79 	{ KUsualForbidden, KOpFlag | KPrFlag | KPoFlag | KIdFlag | KBbFlag | KB2Flag }, // Cm
       
    80 	{ 0, 0, },																		// Bk
       
    81 	{ 0, 0, }, // Cr
       
    82 	{ 0, 0, }, // Lf
       
    83 	{ 0, 0, },																		// Sg
       
    84 	{ 0, 0, },																		// Cb
       
    85 	{ KAllBreaks, 0, },																// Sp
       
    86 	{ 0, 0, },																		// Sa
       
    87 	{ KUsualForbidden, KAlAllowed, }, // Ai
       
    88 	{ 0, 0, }																		// Xx
       
    89 	};
       
    90 
       
    91 /**
       
    92 A sorted table of ranges of characters, with their line breaking classes.
       
    93 A range includes all codes for iStart <= code < iEnd.
       
    94 All these items have fixed range, please don't split any item into more or 
       
    95 combine consecutive items even if they have the same property,
       
    96 because these change will cause mismatch with customer definition.
       
    97 */
       
    98 static const TLineBreakRange TheLineBreakRangeTable[] = 
       
    99 	{
       
   100     { 0x0000, 0x0009, MLineBreaker::ECmLineBreakClass },  //<control>
       
   101     { 0x0009, 0x000a, MLineBreaker::EBaLineBreakClass },  //<control>
       
   102     { 0x000a, 0x000b, MLineBreaker::ELfLineBreakClass },  //<control>
       
   103     { 0x000b, 0x000c, MLineBreaker::ECmLineBreakClass },  //<control>
       
   104     { 0x000c, 0x000d, MLineBreaker::EBkLineBreakClass },  //<control>
       
   105     { 0x000d, 0x000e, MLineBreaker::ECrLineBreakClass },  //<control>
       
   106     { 0x000e, 0x0020, MLineBreaker::ECmLineBreakClass },  //<control>
       
   107     { 0x0020, 0x0021, MLineBreaker::ESpLineBreakClass },  //space
       
   108     { 0x0021, 0x0022, MLineBreaker::EExLineBreakClass },  //exclamation mark
       
   109     { 0x0022, 0x0023, MLineBreaker::EQuLineBreakClass },  //quotation mark
       
   110     { 0x0023, 0x0024, MLineBreaker::EAlLineBreakClass },  //number sign
       
   111     { 0x0024, 0x0025, MLineBreaker::EPrLineBreakClass },  //dollar sign
       
   112     { 0x0025, 0x0026, MLineBreaker::EPoLineBreakClass },  //percent sign
       
   113     { 0x0026, 0x0027, MLineBreaker::EAlLineBreakClass },  //ampersand
       
   114     { 0x0027, 0x0028, MLineBreaker::EQuLineBreakClass },  //apostrophe
       
   115     { 0x0028, 0x0029, MLineBreaker::EOpLineBreakClass },  //left parenthesis
       
   116     { 0x0029, 0x002a, MLineBreaker::EClLineBreakClass },  //right parenthesis
       
   117     { 0x002a, 0x002b, MLineBreaker::EAlLineBreakClass },  //asterisk
       
   118     { 0x002b, 0x002c, MLineBreaker::EPrLineBreakClass },  //plus sign
       
   119     { 0x002c, 0x002d, MLineBreaker::EIsLineBreakClass },  //comma
       
   120     { 0x002d, 0x002e, MLineBreaker::EHyLineBreakClass },  //hyphen-minus
       
   121     { 0x002e, 0x002f, MLineBreaker::EIsLineBreakClass },  //full stop
       
   122     { 0x002f, 0x0030, MLineBreaker::ESyLineBreakClass },  //solidus
       
   123     { 0x0030, 0x003a, MLineBreaker::ENuLineBreakClass },  //digit zero
       
   124     { 0x003a, 0x003c, MLineBreaker::EIsLineBreakClass },  //colon
       
   125     { 0x003c, 0x003f, MLineBreaker::EAlLineBreakClass },  //less-than sign
       
   126     { 0x003f, 0x0040, MLineBreaker::EExLineBreakClass },  //question mark
       
   127     { 0x0040, 0x005b, MLineBreaker::EAlLineBreakClass },  //commercial at
       
   128     { 0x005b, 0x005c, MLineBreaker::EOpLineBreakClass },  //left square bracket
       
   129     { 0x005c, 0x005d, MLineBreaker::EPrLineBreakClass },  //reverse solidus
       
   130     { 0x005d, 0x005e, MLineBreaker::EClLineBreakClass },  //right square bracket
       
   131     { 0x005e, 0x005f, MLineBreaker::EAlLineBreakClass },  //circumflex accent
       
   132     { 0x005f, 0x0060, MLineBreaker::EAlLineBreakClass },  //low line (underscore)
       
   133 	{ 0x0060, 0x007b, MLineBreaker::EAlLineBreakClass },  //grave accent  
       
   134 	{ 0x007b, 0x007c, MLineBreaker::EOpLineBreakClass },  //left curly bracket
       
   135     { 0x007c, 0x007d, MLineBreaker::EBaLineBreakClass },  //vertical line
       
   136     { 0x007d, 0x007e, MLineBreaker::EClLineBreakClass },  //right curly bracket
       
   137     { 0x007e, 0x007f, MLineBreaker::EAlLineBreakClass },  //tilde
       
   138     { 0x007f, 0x00a0, MLineBreaker::ECmLineBreakClass },  //<control>
       
   139     { 0x00a0, 0x00a1, MLineBreaker::EGlLineBreakClass },  //no-break space
       
   140     { 0x00a1, 0x00a2, MLineBreaker::EAiLineBreakClass },  //inverted exclamation mark
       
   141     { 0x00a2, 0x00a3, MLineBreaker::EPoLineBreakClass },  //cent sign
       
   142     { 0x00a3, 0x00a6, MLineBreaker::EPrLineBreakClass },  //pound sign
       
   143     { 0x00a6, 0x00a7, MLineBreaker::EAlLineBreakClass },  //broken bar
       
   144     { 0x00a7, 0x00a9, MLineBreaker::EAiLineBreakClass },  //section sign
       
   145     { 0x00a9, 0x00aa, MLineBreaker::EAlLineBreakClass },  //copyright sign
       
   146     { 0x00aa, 0x00ab, MLineBreaker::EAiLineBreakClass },  //feminine ordinal indicator
       
   147     { 0x00ab, 0x00ac, MLineBreaker::EQuLineBreakClass },  //left-pointing double angle quotation mark
       
   148     { 0x00ac, 0x00ad, MLineBreaker::EAlLineBreakClass },  //not sign
       
   149     { 0x00ad, 0x00ae, MLineBreaker::EBaLineBreakClass },  //soft hyphen
       
   150     { 0x00ae, 0x00b0, MLineBreaker::EAlLineBreakClass },  //registered sign
       
   151     { 0x00b0, 0x00b1, MLineBreaker::EPoLineBreakClass },  //degree sign
       
   152     { 0x00b1, 0x00b2, MLineBreaker::EPrLineBreakClass },  //plus-minus sign
       
   153     { 0x00b2, 0x00b4, MLineBreaker::EAiLineBreakClass },  //superscript two
       
   154     { 0x00b4, 0x00b5, MLineBreaker::EBaLineBreakClass },  //acute accent
       
   155     { 0x00b5, 0x00b6, MLineBreaker::EAlLineBreakClass },  //micro sign
       
   156     { 0x00b6, 0x00bb, MLineBreaker::EAiLineBreakClass },  //pilcrow sign
       
   157     { 0x00bb, 0x00bc, MLineBreaker::EQuLineBreakClass },  //right-pointing double angle quotation mark
       
   158     { 0x00bc, 0x00c0, MLineBreaker::EAiLineBreakClass },  //vulgar fraction one quarter
       
   159     { 0x00c0, 0x00c6, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with grave
       
   160     { 0x00c6, 0x00c7, MLineBreaker::EAiLineBreakClass },  //latin capital letter ae
       
   161     { 0x00c7, 0x00d0, MLineBreaker::EAlLineBreakClass },  //latin capital letter c with cedilla
       
   162     { 0x00d0, 0x00d1, MLineBreaker::EAiLineBreakClass },  //latin capital letter eth
       
   163     { 0x00d1, 0x00d7, MLineBreaker::EAlLineBreakClass },  //latin capital letter n with tilde
       
   164     { 0x00d7, 0x00d9, MLineBreaker::EAiLineBreakClass },  //multiplication sign
       
   165     { 0x00d9, 0x00de, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with grave
       
   166     { 0x00de, 0x00e2, MLineBreaker::EAiLineBreakClass },  //latin capital letter thorn
       
   167     { 0x00e2, 0x00e6, MLineBreaker::EAlLineBreakClass },  //latin small letter a with circumflex
       
   168     { 0x00e6, 0x00e7, MLineBreaker::EAiLineBreakClass },  //latin small letter ae
       
   169     { 0x00e7, 0x00e8, MLineBreaker::EAlLineBreakClass },  //latin small letter c with cedilla
       
   170     { 0x00e8, 0x00eb, MLineBreaker::EAiLineBreakClass },  //latin small letter e with grave
       
   171     { 0x00eb, 0x00ec, MLineBreaker::EAlLineBreakClass },  //latin small letter e with diaeresis
       
   172     { 0x00ec, 0x00ee, MLineBreaker::EAiLineBreakClass },  //latin small letter i with grave
       
   173     { 0x00ee, 0x00f0, MLineBreaker::EAlLineBreakClass },  //latin small letter i with circumflex
       
   174     { 0x00f0, 0x00f1, MLineBreaker::EAiLineBreakClass },  //latin small letter eth
       
   175     { 0x00f1, 0x00f2, MLineBreaker::EAlLineBreakClass },  //latin small letter n with tilde
       
   176     { 0x00f2, 0x00f4, MLineBreaker::EAiLineBreakClass },  //latin small letter o with grave
       
   177     { 0x00f4, 0x00f7, MLineBreaker::EAlLineBreakClass },  //latin small letter o with circumflex
       
   178     { 0x00f7, 0x00fb, MLineBreaker::EAiLineBreakClass },  //division sign
       
   179     { 0x00fb, 0x00fc, MLineBreaker::EAlLineBreakClass },  //latin small letter u with circumflex
       
   180     { 0x00fc, 0x00fd, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis
       
   181     { 0x00fd, 0x00fe, MLineBreaker::EAlLineBreakClass },  //latin small letter y with acute
       
   182     { 0x00fe, 0x00ff, MLineBreaker::EAiLineBreakClass },  //latin small letter thorn
       
   183     { 0x00ff, 0x0101, MLineBreaker::EAlLineBreakClass },  //latin small letter y with diaeresis
       
   184     { 0x0101, 0x0102, MLineBreaker::EAiLineBreakClass },  //latin small letter a with macron
       
   185     { 0x0102, 0x0111, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with breve
       
   186     { 0x0111, 0x0112, MLineBreaker::EAiLineBreakClass },  //latin small letter d with stroke
       
   187     { 0x0112, 0x0113, MLineBreaker::EAlLineBreakClass },  //latin capital letter e with macron
       
   188     { 0x0113, 0x0114, MLineBreaker::EAiLineBreakClass },  //latin small letter e with macron
       
   189     { 0x0114, 0x011b, MLineBreaker::EAlLineBreakClass },  //latin capital letter e with breve
       
   190     { 0x011b, 0x011c, MLineBreaker::EAiLineBreakClass },  //latin small letter e with caron
       
   191     { 0x011c, 0x0126, MLineBreaker::EAlLineBreakClass },  //latin capital letter g with circumflex
       
   192     { 0x0126, 0x0128, MLineBreaker::EAiLineBreakClass },  //latin capital letter h with stroke
       
   193     { 0x0128, 0x012b, MLineBreaker::EAlLineBreakClass },  //latin capital letter i with tilde
       
   194     { 0x012b, 0x012c, MLineBreaker::EAiLineBreakClass },  //latin small letter i with macron
       
   195     { 0x012c, 0x0131, MLineBreaker::EAlLineBreakClass },  //latin capital letter i with breve
       
   196     { 0x0131, 0x0134, MLineBreaker::EAiLineBreakClass },  //latin small letter dotless i
       
   197     { 0x0134, 0x0138, MLineBreaker::EAlLineBreakClass },  //latin capital letter j with circumflex
       
   198     { 0x0138, 0x0139, MLineBreaker::EAiLineBreakClass },  //latin small letter kra
       
   199     { 0x0139, 0x013f, MLineBreaker::EAlLineBreakClass },  //latin capital letter l with acute
       
   200     { 0x013f, 0x0143, MLineBreaker::EAiLineBreakClass },  //latin capital letter l with middle dot
       
   201     { 0x0143, 0x0144, MLineBreaker::EAlLineBreakClass },  //latin capital letter n with acute
       
   202     { 0x0144, 0x0145, MLineBreaker::EAiLineBreakClass },  //latin small letter n with acute
       
   203     { 0x0145, 0x0148, MLineBreaker::EAlLineBreakClass },  //latin capital letter n with cedilla
       
   204     { 0x0148, 0x014b, MLineBreaker::EAiLineBreakClass },  //latin small letter n with caron
       
   205     { 0x014b, 0x014d, MLineBreaker::EAlLineBreakClass },  //latin small letter eng
       
   206     { 0x014d, 0x014e, MLineBreaker::EAiLineBreakClass },  //latin small letter o with macron
       
   207     { 0x014e, 0x0152, MLineBreaker::EAlLineBreakClass },  //latin capital letter o with breve
       
   208     { 0x0152, 0x0154, MLineBreaker::EAiLineBreakClass },  //latin capital ligature oe
       
   209     { 0x0154, 0x0166, MLineBreaker::EAlLineBreakClass },  //latin capital letter r with acute
       
   210     { 0x0166, 0x0168, MLineBreaker::EAiLineBreakClass },  //latin capital letter t with stroke
       
   211     { 0x0168, 0x016b, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with tilde
       
   212     { 0x016b, 0x016c, MLineBreaker::EAiLineBreakClass },  //latin small letter u with macron
       
   213     { 0x016c, 0x01ce, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with breve
       
   214     { 0x01ce, 0x01cf, MLineBreaker::EAiLineBreakClass },  //latin small letter a with caron
       
   215     { 0x01cf, 0x01d0, MLineBreaker::EAlLineBreakClass },  //latin capital letter i with caron
       
   216     { 0x01d0, 0x01d1, MLineBreaker::EAiLineBreakClass },  //latin small letter i with caron
       
   217     { 0x01d1, 0x01d2, MLineBreaker::EAlLineBreakClass },  //latin capital letter o with caron
       
   218     { 0x01d2, 0x01d3, MLineBreaker::EAiLineBreakClass },  //latin small letter o with caron
       
   219     { 0x01d3, 0x01d4, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with caron
       
   220     { 0x01d4, 0x01d5, MLineBreaker::EAiLineBreakClass },  //latin small letter u with caron
       
   221     { 0x01d5, 0x01d6, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and macron
       
   222     { 0x01d6, 0x01d7, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and macron
       
   223     { 0x01d7, 0x01d8, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and acute
       
   224     { 0x01d8, 0x01d9, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and acute
       
   225     { 0x01d9, 0x01da, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and caron
       
   226     { 0x01da, 0x01db, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and caron
       
   227     { 0x01db, 0x01dc, MLineBreaker::EAlLineBreakClass },  //latin capital letter u with diaeresis and grave
       
   228     { 0x01dc, 0x01dd, MLineBreaker::EAiLineBreakClass },  //latin small letter u with diaeresis and grave
       
   229     { 0x01dd, 0x0250, MLineBreaker::EAlLineBreakClass },  //latin small letter turned e
       
   230     { 0x0250, 0x0251, MLineBreaker::EAlLineBreakClass },  //latin small letter turned a
       
   231     { 0x0251, 0x0252, MLineBreaker::EAiLineBreakClass },  //latin small letter alpha
       
   232     { 0x0252, 0x0261, MLineBreaker::EAlLineBreakClass },  //latin small letter turned alpha
       
   233     { 0x0261, 0x0262, MLineBreaker::EAiLineBreakClass },  //latin small letter script g
       
   234     { 0x0262, 0x02c7, MLineBreaker::EAlLineBreakClass },  //latin letter small capital g
       
   235     { 0x02c7, 0x02c8, MLineBreaker::EAiLineBreakClass },  //caron
       
   236     { 0x02c8, 0x02c9, MLineBreaker::EBbLineBreakClass },  //modifier letter vertical line
       
   237     { 0x02c9, 0x02cc, MLineBreaker::EAiLineBreakClass },  //modifier letter macron
       
   238     { 0x02cc, 0x02cd, MLineBreaker::EBbLineBreakClass },  //modifier letter low vertical line
       
   239     { 0x02cd, 0x02ce, MLineBreaker::EAiLineBreakClass },  //modifier letter low macron
       
   240     { 0x02ce, 0x02d0, MLineBreaker::EAlLineBreakClass },  //modifier letter low grave accent
       
   241     { 0x02d0, 0x02d1, MLineBreaker::EAiLineBreakClass },  //modifier letter triangular colon
       
   242     { 0x02d1, 0x02d8, MLineBreaker::EAlLineBreakClass },  //modifier letter half triangular colon
       
   243     { 0x02d8, 0x02dc, MLineBreaker::EAiLineBreakClass },  //breve
       
   244     { 0x02dc, 0x02dd, MLineBreaker::EAlLineBreakClass },  //small tilde
       
   245     { 0x02dd, 0x02de, MLineBreaker::EAiLineBreakClass },  //double acute accent
       
   246     { 0x02de, 0x0300, MLineBreaker::EAlLineBreakClass },  //modifier letter rhotic hook
       
   247     { 0x0300, 0x034f, MLineBreaker::ECmLineBreakClass },  //combining grave accent
       
   248     { 0x034f, 0x0350, MLineBreaker::EGlLineBreakClass },  //COMBINING GRAPHEME JOINER
       
   249     { 0x0350, 0x035c, MLineBreaker::ECmLineBreakClass },  //COMBINING RIGHT ARROWHEAD ABOVE
       
   250     { 0x035c, 0x0360, MLineBreaker::EGlLineBreakClass },  //COMBINING DOUBLE BREVE BELOW
       
   251     { 0x0360, 0x0370, MLineBreaker::ECmLineBreakClass },  //combining double tilde
       
   252     { 0x0374, 0x0376, MLineBreaker::EAlLineBreakClass },  //greek numeral sign
       
   253     { 0x037a, 0x037b, MLineBreaker::EAlLineBreakClass },  //greek ypogegrammeni
       
   254     { 0x037b, 0x037e, MLineBreaker::EAlLineBreakClass },  //GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
       
   255     { 0x037e, 0x037f, MLineBreaker::EAlLineBreakClass },  //greek question mark
       
   256     { 0x0384, 0x038b, MLineBreaker::EAlLineBreakClass },  //greek tonos
       
   257     { 0x038c, 0x038d, MLineBreaker::EAlLineBreakClass },  //greek capital letter omicron with tonos
       
   258     { 0x038e, 0x0391, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with tonos
       
   259     { 0x0391, 0x03a2, MLineBreaker::EAiLineBreakClass },  //greek capital letter alpha
       
   260     { 0x03a3, 0x03aa, MLineBreaker::EAiLineBreakClass },  //greek capital letter sigma
       
   261     { 0x03aa, 0x03b1, MLineBreaker::EAlLineBreakClass },  //greek capital letter iota with dialytika
       
   262     { 0x03b1, 0x03c2, MLineBreaker::EAiLineBreakClass },  //greek small letter alpha
       
   263     { 0x03c2, 0x03c3, MLineBreaker::EAlLineBreakClass },  //greek small letter final sigma
       
   264     { 0x03c3, 0x03ca, MLineBreaker::EAiLineBreakClass },  //greek small letter sigma
       
   265     { 0x03ca, 0x03cf, MLineBreaker::EAlLineBreakClass },  //greek small letter iota with dialytika
       
   266     { 0x03d0, 0x0400, MLineBreaker::EAlLineBreakClass },  //greek beta symbol
       
   267     { 0x0400, 0x0401, MLineBreaker::EAlLineBreakClass },  //cyrillic capital letter ie with grave
       
   268     { 0x0401, 0x0402, MLineBreaker::EAiLineBreakClass },  //cyrillic capital letter io
       
   269     { 0x0402, 0x0410, MLineBreaker::EAlLineBreakClass },  //cyrillic capital letter dje
       
   270     { 0x0410, 0x0450, MLineBreaker::EAiLineBreakClass },  //cyrillic capital letter a
       
   271     { 0x0450, 0x0451, MLineBreaker::EAlLineBreakClass },  //cyrillic small letter ie with grave
       
   272     { 0x0451, 0x0452, MLineBreaker::EAiLineBreakClass },  //cyrillic small letter io
       
   273     { 0x0452, 0x0483, MLineBreaker::EAlLineBreakClass },  //cyrillic small letter dje
       
   274     { 0x0483, 0x0487, MLineBreaker::ECmLineBreakClass },  //combining cyrillic titlo
       
   275     { 0x0488, 0x048a, MLineBreaker::ECmLineBreakClass },  //combining cyrillic hundred thousands sign
       
   276     { 0x048a, 0x0514, MLineBreaker::EAlLineBreakClass },  //CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
       
   277     { 0x0531, 0x0557, MLineBreaker::EAlLineBreakClass },  //armenian capital letter ayb
       
   278     { 0x0559, 0x0560, MLineBreaker::EAlLineBreakClass },  //armenian modifier letter left half ring
       
   279     { 0x0561, 0x0588, MLineBreaker::EAlLineBreakClass },  //armenian small letter ayb
       
   280     { 0x0589, 0x058a, MLineBreaker::EIsLineBreakClass },  //armenian full stop
       
   281     { 0x058a, 0x058b, MLineBreaker::EBaLineBreakClass },  //armenian hyphen
       
   282     { 0x0591, 0x05be, MLineBreaker::ECmLineBreakClass },  //hebrew accent etnahta
       
   283     { 0x05be, 0x05bf, MLineBreaker::EAlLineBreakClass },  //hebrew punctuation maqaf
       
   284     { 0x05bf, 0x05c0, MLineBreaker::ECmLineBreakClass },  //hebrew point rafe
       
   285     { 0x05c0, 0x05c1, MLineBreaker::EAlLineBreakClass },  //hebrew punctuation paseq
       
   286     { 0x05c1, 0x05c3, MLineBreaker::ECmLineBreakClass },  //hebrew point shin dot
       
   287     { 0x05c3, 0x05c4, MLineBreaker::EAlLineBreakClass },  //hebrew punctuation sof pasuq
       
   288     { 0x05c4, 0x05c5, MLineBreaker::ECmLineBreakClass },  //hebrew mark upper dot
       
   289     { 0x05c5, 0x05c6, MLineBreaker::ECmLineBreakClass },  //HEBREW MARK LOWER DOT
       
   290     { 0x05c6, 0x05c7, MLineBreaker::EExLineBreakClass },  //HEBREW PUNCTUATION NUN HAFUKHA
       
   291     { 0x05c7, 0x05c8, MLineBreaker::ECmLineBreakClass },  //HEBREW POINT QAMATS QATAN
       
   292     { 0x05d0, 0x05eb, MLineBreaker::EAlLineBreakClass },  //hebrew letter alef
       
   293     { 0x05f0, 0x05f5, MLineBreaker::EAlLineBreakClass },  //hebrew ligature yiddish double vav
       
   294     { 0x0600, 0x0604, MLineBreaker::EAlLineBreakClass },  //ARABIC NUMBER SIGN
       
   295     { 0x060b, 0x060c, MLineBreaker::EPoLineBreakClass },  //AFGHANI SIGN
       
   296     { 0x060c, 0x060d, MLineBreaker::EExLineBreakClass },  //arabic comma
       
   297     { 0x060d, 0x060e, MLineBreaker::EIsLineBreakClass },  //ARABIC DATE SEPARATOR
       
   298     { 0x060e, 0x0610, MLineBreaker::EAlLineBreakClass },  //ARABIC POETIC VERSE SIGN
       
   299     { 0x0610, 0x0616, MLineBreaker::ECmLineBreakClass },  //ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
       
   300     { 0x061b, 0x061c, MLineBreaker::EExLineBreakClass },  //arabic semicolon
       
   301     { 0x061e, 0x061f, MLineBreaker::EExLineBreakClass },  //ARABIC TRIPLE DOT PUNCTUATION MARK
       
   302     { 0x061f, 0x0620, MLineBreaker::EExLineBreakClass },  //arabic question mark
       
   303     { 0x0621, 0x063b, MLineBreaker::EAlLineBreakClass },  //arabic letter hamza
       
   304     { 0x0640, 0x064b, MLineBreaker::EAlLineBreakClass },  //arabic tatweel
       
   305     { 0x064b, 0x065f, MLineBreaker::ECmLineBreakClass },  //arabic fathatan
       
   306     { 0x0660, 0x066a, MLineBreaker::ENuLineBreakClass },  //arabic-indic digit zero
       
   307     { 0x066a, 0x066b, MLineBreaker::EExLineBreakClass },  //arabic percent sign
       
   308     { 0x066b, 0x066d, MLineBreaker::ENuLineBreakClass },  //arabic decimal & thousands separator
       
   309     { 0x066d, 0x066e, MLineBreaker::EAlLineBreakClass },  //arabic five pointed star
       
   310     { 0x066e, 0x0670, MLineBreaker::EAlLineBreakClass },  //arabic five pointed star
       
   311     { 0x0670, 0x0671, MLineBreaker::ECmLineBreakClass },  //arabic letter superscript alef
       
   312     { 0x0671, 0x06d4, MLineBreaker::EAlLineBreakClass },  //arabic letter alef wasla
       
   313     { 0x06d4, 0x06d5, MLineBreaker::EExLineBreakClass },  //arabic full stop
       
   314     { 0x06d5, 0x06d6, MLineBreaker::EAlLineBreakClass },  //arabic letter ae
       
   315     { 0x06d6, 0x06e5, MLineBreaker::ECmLineBreakClass },  //arabic small high ligature sad with lam with alef maksura
       
   316     { 0x06e5, 0x06e7, MLineBreaker::EAlLineBreakClass },  //arabic small waw
       
   317     { 0x06e7, 0x06e9, MLineBreaker::ECmLineBreakClass },  //arabic small high yeh
       
   318     { 0x06e9, 0x06ea, MLineBreaker::EAlLineBreakClass },  //arabic place of sajdah
       
   319     { 0x06ea, 0x06ee, MLineBreaker::ECmLineBreakClass },  //arabic empty centre low stop
       
   320     { 0x06ee, 0x06f0, MLineBreaker::EAlLineBreakClass },  //ARABIC LETTER DAL WITH INVERTED V
       
   321     { 0x06f0, 0x06fa, MLineBreaker::ENuLineBreakClass },  //extended arabic-indic digit zero
       
   322     { 0x06fa, 0x070e, MLineBreaker::EAlLineBreakClass },  //arabic letter sheen with dot below
       
   323     { 0x070f, 0x0710, MLineBreaker::ECmLineBreakClass },  //syriac abbreviation mark
       
   324     { 0x0710, 0x0711, MLineBreaker::EAlLineBreakClass },  //syriac letter alaph
       
   325     { 0x0711, 0x0712, MLineBreaker::ECmLineBreakClass },  //syriac letter superscript alaph
       
   326     { 0x0712, 0x0730, MLineBreaker::EAlLineBreakClass },  //syriac letter beth
       
   327     { 0x0730, 0x074b, MLineBreaker::ECmLineBreakClass },  //syriac pthaha above
       
   328     { 0x074d, 0x076e, MLineBreaker::EAlLineBreakClass },  //SYRIAC LETTER SOGDIAN ZHAIN
       
   329     { 0x0780, 0x07a6, MLineBreaker::EAlLineBreakClass },  //thaana letter haa
       
   330     { 0x07a6, 0x07b1, MLineBreaker::ECmLineBreakClass },  //thaana abafili
       
   331     { 0x07b1, 0x07b2, MLineBreaker::EAlLineBreakClass },  //THAANA LETTER NAA
       
   332     { 0x07c0, 0x07ca, MLineBreaker::ENuLineBreakClass },  //NKO DIGIT ZERO
       
   333     { 0x07ca, 0x07eb, MLineBreaker::EAlLineBreakClass },  //NKO LETTER A
       
   334     { 0x07eb, 0x07f4, MLineBreaker::ECmLineBreakClass },  //NKO COMBINING SHORT HIGH TONE
       
   335     { 0x07f4, 0x07f8, MLineBreaker::EAlLineBreakClass },  //NKO HIGH TONE APOSTROPHE
       
   336     { 0x07f8, 0x07f9, MLineBreaker::EIsLineBreakClass },  //NKO COMMA
       
   337     { 0x07f9, 0x07fa, MLineBreaker::EExLineBreakClass },  //NKO EXCLAMATION MARK
       
   338     { 0x07fa, 0x07fb, MLineBreaker::EAlLineBreakClass },  //NKO LAJANYALAN
       
   339     { 0x0901, 0x0904, MLineBreaker::ECmLineBreakClass },  //devanagari sign candrabindu
       
   340     { 0x0904, 0x093a, MLineBreaker::EAlLineBreakClass },  //devanagari letter short a: CR1080
       
   341     { 0x093c, 0x093d, MLineBreaker::ECmLineBreakClass },  //devanagari sign nukta
       
   342     { 0x093d, 0x093e, MLineBreaker::EAlLineBreakClass },  //devanagari sign avagraha
       
   343     { 0x093e, 0x094e, MLineBreaker::ECmLineBreakClass },  //devanagari vowel sign aa
       
   344     { 0x0950, 0x0951, MLineBreaker::EAlLineBreakClass },  //devanagari om
       
   345     { 0x0951, 0x0955, MLineBreaker::ECmLineBreakClass },  //devanagari stress sign udatta
       
   346     { 0x0958, 0x0962, MLineBreaker::EAlLineBreakClass },  //devanagari letter qa
       
   347     { 0x0962, 0x0964, MLineBreaker::ECmLineBreakClass },  //devanagari vowel sign vocalic l
       
   348     { 0x0964, 0x0966, MLineBreaker::EAlLineBreakClass },  //devanagari danda
       
   349     { 0x0966, 0x0970, MLineBreaker::ENuLineBreakClass },  //devanagari digit zero
       
   350     { 0x0970, 0x0971, MLineBreaker::EAlLineBreakClass },  //devanagari abbreviation sign
       
   351     { 0x097b, 0x0980, MLineBreaker::EAlLineBreakClass },  //devanagari letter gga: CR1080
       
   352     { 0x0981, 0x0984, MLineBreaker::ECmLineBreakClass },  //bengali sign candrabindu
       
   353     { 0x0985, 0x098d, MLineBreaker::EAlLineBreakClass },  //bengali letter a
       
   354     { 0x098f, 0x0991, MLineBreaker::EAlLineBreakClass },  //bengali letter e
       
   355     { 0x0993, 0x09a9, MLineBreaker::EAlLineBreakClass },  //bengali letter o
       
   356     { 0x09aa, 0x09b1, MLineBreaker::EAlLineBreakClass },  //bengali letter pa
       
   357     { 0x09b2, 0x09b3, MLineBreaker::EAlLineBreakClass },  //bengali letter la
       
   358     { 0x09b6, 0x09ba, MLineBreaker::EAlLineBreakClass },  //bengali letter sha
       
   359     { 0x09bc, 0x09bd, MLineBreaker::ECmLineBreakClass },  //bengali sign nukta
       
   360     { 0x09bd, 0x09be, MLineBreaker::EAlLineBreakClass },  //bengali sign avagraha: CR1080
       
   361     { 0x09be, 0x09c5, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign aa
       
   362     { 0x09c7, 0x09c9, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign e
       
   363     { 0x09cb, 0x09ce, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign o
       
   364     { 0x09ce, 0x09cf, MLineBreaker::EAlLineBreakClass },  //bengali letter khanda ta: CR1080
       
   365     { 0x09d7, 0x09d8, MLineBreaker::ECmLineBreakClass },  //bengali au length mark
       
   366     { 0x09dc, 0x09de, MLineBreaker::EAlLineBreakClass },  //bengali letter rra
       
   367     { 0x09df, 0x09e2, MLineBreaker::EAlLineBreakClass },  //bengali letter yya
       
   368     { 0x09e2, 0x09e4, MLineBreaker::ECmLineBreakClass },  //bengali vowel sign vocalic l
       
   369     { 0x09e6, 0x09f0, MLineBreaker::ENuLineBreakClass },  //bengali digit zero
       
   370     { 0x09f0, 0x09f2, MLineBreaker::EAlLineBreakClass },  //bengali letter ra with middle diagonal
       
   371     { 0x09f2, 0x09f4, MLineBreaker::EPrLineBreakClass },  //bengali rupee mark
       
   372     { 0x09f4, 0x09fb, MLineBreaker::EAlLineBreakClass },  //bengali currency numerator one
       
   373     { 0x0a01, 0x0a04, MLineBreaker::ECmLineBreakClass },  //gurmukhi sign adak bindi: CR1080
       
   374     { 0x0a05, 0x0a0b, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter a
       
   375     { 0x0a0f, 0x0a11, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter ee
       
   376     { 0x0a13, 0x0a29, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter oo
       
   377     { 0x0a2a, 0x0a31, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter pa
       
   378     { 0x0a32, 0x0a34, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter la
       
   379     { 0x0a35, 0x0a37, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter va
       
   380     { 0x0a38, 0x0a3a, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter sa
       
   381     { 0x0a3c, 0x0a3d, MLineBreaker::ECmLineBreakClass },  //gurmukhi sign nukta
       
   382     { 0x0a3e, 0x0a43, MLineBreaker::ECmLineBreakClass },  //gurmukhi vowel sign aa
       
   383     { 0x0a47, 0x0a49, MLineBreaker::ECmLineBreakClass },  //gurmukhi vowel sign ee
       
   384     { 0x0a4b, 0x0a4e, MLineBreaker::ECmLineBreakClass },  //gurmukhi vowel sign oo
       
   385     { 0x0a59, 0x0a5d, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter khha
       
   386     { 0x0a5e, 0x0a5f, MLineBreaker::EAlLineBreakClass },  //gurmukhi letter fa
       
   387     { 0x0a66, 0x0a70, MLineBreaker::ENuLineBreakClass },  //gurmukhi digit zero
       
   388     { 0x0a70, 0x0a72, MLineBreaker::ECmLineBreakClass },  //gurmukhi tippi
       
   389     { 0x0a72, 0x0a75, MLineBreaker::EAlLineBreakClass },  //gurmukhi iri
       
   390     { 0x0a81, 0x0a84, MLineBreaker::ECmLineBreakClass },  //gujarati sign candrabindu
       
   391     { 0x0a85, 0x0a8d, MLineBreaker::EAlLineBreakClass },  //gujarati letter a: CR1080
       
   392     { 0x0a8d, 0x0a8e, MLineBreaker::EAlLineBreakClass },  //gujarati vowel candra e
       
   393     { 0x0a8f, 0x0a92, MLineBreaker::EAlLineBreakClass },  //gujarati letter e
       
   394     { 0x0a93, 0x0aa9, MLineBreaker::EAlLineBreakClass },  //gujarati letter o
       
   395     { 0x0aaa, 0x0ab1, MLineBreaker::EAlLineBreakClass },  //gujarati letter pa
       
   396     { 0x0ab2, 0x0ab4, MLineBreaker::EAlLineBreakClass },  //gujarati letter la
       
   397     { 0x0ab5, 0x0aba, MLineBreaker::EAlLineBreakClass },  //gujarati letter va
       
   398     { 0x0abc, 0x0abd, MLineBreaker::ECmLineBreakClass },  //gujarati sign nukta
       
   399     { 0x0abd, 0x0abe, MLineBreaker::EAlLineBreakClass },  //gujarati sign avagraha
       
   400     { 0x0abe, 0x0ac6, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign aa
       
   401     { 0x0ac7, 0x0aca, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign e
       
   402     { 0x0acb, 0x0ace, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign o
       
   403     { 0x0ad0, 0x0ad1, MLineBreaker::EAlLineBreakClass },  //gujarati om
       
   404     { 0x0ae0, 0x0ae2, MLineBreaker::EAlLineBreakClass },  //gujarati letter vocalic rr: CR1080
       
   405     { 0x0ae2, 0x0ae4, MLineBreaker::ECmLineBreakClass },  //gujarati vowel sign vocalic l: CR1080
       
   406     { 0x0ae6, 0x0af0, MLineBreaker::ENuLineBreakClass },  //gujarati digit zero
       
   407     { 0x0af1, 0x0af2, MLineBreaker::EPrLineBreakClass },  //gujarati rupee sign: CR1080
       
   408     { 0x0b01, 0x0b04, MLineBreaker::ECmLineBreakClass },  //oriya sign candrabindu
       
   409     { 0x0b05, 0x0b0d, MLineBreaker::EAlLineBreakClass },  //oriya letter a
       
   410     { 0x0b0f, 0x0b11, MLineBreaker::EAlLineBreakClass },  //oriya letter e
       
   411     { 0x0b13, 0x0b29, MLineBreaker::EAlLineBreakClass },  //oriya letter o
       
   412     { 0x0b2a, 0x0b31, MLineBreaker::EAlLineBreakClass },  //oriya letter pa
       
   413     { 0x0b32, 0x0b34, MLineBreaker::EAlLineBreakClass },  //oriya letter la
       
   414     { 0x0b35, 0x0b36, MLineBreaker::EAlLineBreakClass },  //oriya letter va: CR1080
       
   415     { 0x0b36, 0x0b3a, MLineBreaker::EAlLineBreakClass },  //oriya letter sha
       
   416     { 0x0b3c, 0x0b3d, MLineBreaker::ECmLineBreakClass },  //oriya sign nukta
       
   417     { 0x0b3d, 0x0b3e, MLineBreaker::EAlLineBreakClass },  //oriya sign avagraha
       
   418     { 0x0b3e, 0x0b44, MLineBreaker::ECmLineBreakClass },  //oriya vowel sign aa
       
   419     { 0x0b47, 0x0b49, MLineBreaker::ECmLineBreakClass },  //oriya vowel sign e
       
   420     { 0x0b4b, 0x0b4e, MLineBreaker::ECmLineBreakClass },  //oriya vowel sign o
       
   421     { 0x0b56, 0x0b58, MLineBreaker::ECmLineBreakClass },  //oriya ai length mark
       
   422     { 0x0b5c, 0x0b5e, MLineBreaker::EAlLineBreakClass },  //oriya letter rra
       
   423     { 0x0b5f, 0x0b62, MLineBreaker::EAlLineBreakClass },  //oriya letter yya
       
   424     { 0x0b66, 0x0b70, MLineBreaker::ENuLineBreakClass },  //oriya digit zero
       
   425     { 0x0b70, 0x0b71, MLineBreaker::EAlLineBreakClass },  //oriya isshar
       
   426     { 0x0b71, 0x0b72, MLineBreaker::EAlLineBreakClass },  //oriya letter wa: CR1080
       
   427     { 0x0b82, 0x0b84, MLineBreaker::ECmLineBreakClass },  //tamil sign anusvara
       
   428     { 0x0b85, 0x0b8b, MLineBreaker::EAlLineBreakClass },  //tamil letter a
       
   429     { 0x0b8e, 0x0b91, MLineBreaker::EAlLineBreakClass },  //tamil letter e
       
   430     { 0x0b92, 0x0b96, MLineBreaker::EAlLineBreakClass },  //tamil letter o
       
   431     { 0x0b99, 0x0b9b, MLineBreaker::EAlLineBreakClass },  //tamil letter nga
       
   432     { 0x0b9c, 0x0b9d, MLineBreaker::EAlLineBreakClass },  //tamil letter ja
       
   433     { 0x0b9e, 0x0ba0, MLineBreaker::EAlLineBreakClass },  //tamil letter nya
       
   434     { 0x0ba3, 0x0ba5, MLineBreaker::EAlLineBreakClass },  //tamil letter nna
       
   435     { 0x0ba8, 0x0bab, MLineBreaker::EAlLineBreakClass },  //tamil letter na
       
   436     { 0x0bae, 0x0bba, MLineBreaker::EAlLineBreakClass },  //tamil letter ma: CR1080
       
   437     { 0x0bbe, 0x0bc3, MLineBreaker::ECmLineBreakClass },  //tamil vowel sign aa
       
   438     { 0x0bc6, 0x0bc9, MLineBreaker::ECmLineBreakClass },  //tamil vowel sign e
       
   439     { 0x0bca, 0x0bce, MLineBreaker::ECmLineBreakClass },  //tamil vowel sign o
       
   440     { 0x0bd7, 0x0bd8, MLineBreaker::ECmLineBreakClass },  //tamil au length mark
       
   441     { 0x0be6, 0x0bf0, MLineBreaker::ENuLineBreakClass },  //tamil digit one: CR1080
       
   442     { 0x0bf0, 0x0bf9, MLineBreaker::EAlLineBreakClass },  //tamil number ten: CR1080
       
   443     { 0x0bf9, 0x0bfa, MLineBreaker::EPrLineBreakClass },  //tamil rupee sign: CR1080
       
   444     { 0x0bfa, 0x0bfb, MLineBreaker::EAlLineBreakClass },  //tamil number sign: CR1080
       
   445     { 0x0c01, 0x0c04, MLineBreaker::ECmLineBreakClass },  //telugu sign candrabindu
       
   446     { 0x0c05, 0x0c0d, MLineBreaker::EAlLineBreakClass },  //telugu letter a
       
   447     { 0x0c0e, 0x0c11, MLineBreaker::EAlLineBreakClass },  //telugu letter e
       
   448     { 0x0c12, 0x0c29, MLineBreaker::EAlLineBreakClass },  //telugu letter o
       
   449     { 0x0c2a, 0x0c34, MLineBreaker::EAlLineBreakClass },  //telugu letter pa
       
   450     { 0x0c35, 0x0c3a, MLineBreaker::EAlLineBreakClass },  //telugu letter va
       
   451     { 0x0c3e, 0x0c45, MLineBreaker::ECmLineBreakClass },  //telugu vowel sign aa
       
   452     { 0x0c46, 0x0c49, MLineBreaker::ECmLineBreakClass },  //telugu vowel sign e
       
   453     { 0x0c4a, 0x0c4e, MLineBreaker::ECmLineBreakClass },  //telugu vowel sign o
       
   454     { 0x0c55, 0x0c57, MLineBreaker::ECmLineBreakClass },  //telugu length mark
       
   455     { 0x0c60, 0x0c62, MLineBreaker::EAlLineBreakClass },  //telugu letter vocalic rr
       
   456     { 0x0c66, 0x0c70, MLineBreaker::ENuLineBreakClass },  //telugu digit zero
       
   457     { 0x0c82, 0x0c84, MLineBreaker::ECmLineBreakClass },  //kannada sign anusvara
       
   458     { 0x0c85, 0x0c8d, MLineBreaker::EAlLineBreakClass },  //kannada letter a
       
   459     { 0x0c8e, 0x0c91, MLineBreaker::EAlLineBreakClass },  //kannada letter e
       
   460     { 0x0c92, 0x0ca9, MLineBreaker::EAlLineBreakClass },  //kannada letter o
       
   461     { 0x0caa, 0x0cb4, MLineBreaker::EAlLineBreakClass },  //kannada letter pa
       
   462     { 0x0cb5, 0x0cba, MLineBreaker::EAlLineBreakClass },  //kannada letter va
       
   463     { 0x0cbc, 0x0cbd, MLineBreaker::ECmLineBreakClass },  //kannada sign nukta: CR1080
       
   464     { 0x0cbd, 0x0cbe, MLineBreaker::EAlLineBreakClass },  //kannada sign avagraha: CR1080
       
   465     { 0x0cbe, 0x0cc5, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign aa
       
   466     { 0x0cc6, 0x0cc9, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign e
       
   467     { 0x0cca, 0x0cce, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign o
       
   468     { 0x0cd5, 0x0cd7, MLineBreaker::ECmLineBreakClass },  //kannada length mark
       
   469     { 0x0cde, 0x0cdf, MLineBreaker::EAlLineBreakClass },  //kannada letter fa
       
   470     { 0x0ce0, 0x0ce2, MLineBreaker::EAlLineBreakClass },  //kannada letter vocalic rr
       
   471     { 0x0ce2, 0x0ce4, MLineBreaker::ECmLineBreakClass },  //kannada vowel sign vocalic l: CR1080
       
   472     { 0x0ce6, 0x0cf0, MLineBreaker::ENuLineBreakClass },  //kannada digit zero
       
   473     { 0x0cf1, 0x0cf3, MLineBreaker::EAlLineBreakClass },  //kannada sign jihvamuliya: CR1080
       
   474     { 0x0d02, 0x0d04, MLineBreaker::ECmLineBreakClass },  //malayalam sign anusvara
       
   475     { 0x0d05, 0x0d0d, MLineBreaker::EAlLineBreakClass },  //malayalam letter a
       
   476     { 0x0d0e, 0x0d11, MLineBreaker::EAlLineBreakClass },  //malayalam letter e
       
   477     { 0x0d12, 0x0d29, MLineBreaker::EAlLineBreakClass },  //malayalam letter o
       
   478     { 0x0d2a, 0x0d3a, MLineBreaker::EAlLineBreakClass },  //malayalam letter pa
       
   479     { 0x0d3e, 0x0d44, MLineBreaker::ECmLineBreakClass },  //malayalam vowel sign aa
       
   480     { 0x0d46, 0x0d49, MLineBreaker::ECmLineBreakClass },  //malayalam vowel sign e
       
   481     { 0x0d4a, 0x0d4e, MLineBreaker::ECmLineBreakClass },  //malayalam vowel sign o
       
   482     { 0x0d57, 0x0d58, MLineBreaker::ECmLineBreakClass },  //malayalam au length mark
       
   483     { 0x0d60, 0x0d62, MLineBreaker::EAlLineBreakClass },  //malayalam letter vocalic rr
       
   484     { 0x0d66, 0x0d70, MLineBreaker::ENuLineBreakClass },  //malayalam digit zero
       
   485     { 0x0d82, 0x0d84, MLineBreaker::ECmLineBreakClass },  //sinhala sign anusvaraya
       
   486     { 0x0d85, 0x0d97, MLineBreaker::EAlLineBreakClass },  //sinhala letter ayanna
       
   487     { 0x0d9a, 0x0db2, MLineBreaker::EAlLineBreakClass },  //sinhala letter alpapraana kayanna
       
   488     { 0x0db3, 0x0dbc, MLineBreaker::EAlLineBreakClass },  //sinhala letter sanyaka dayanna
       
   489     { 0x0dbd, 0x0dbe, MLineBreaker::EAlLineBreakClass },  //sinhala letter dantaja layanna
       
   490     { 0x0dc0, 0x0dc7, MLineBreaker::EAlLineBreakClass },  //sinhala letter vayanna
       
   491     { 0x0dca, 0x0dcb, MLineBreaker::ECmLineBreakClass },  //sinhala sign al-lakuna
       
   492     { 0x0dcf, 0x0dd5, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign aela-pilla
       
   493     { 0x0dd6, 0x0dd7, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign diga paa-pilla
       
   494     { 0x0dd8, 0x0de0, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign gaetta-pilla
       
   495     { 0x0df2, 0x0df4, MLineBreaker::ECmLineBreakClass },  //sinhala vowel sign diga gaetta-pilla
       
   496     { 0x0df4, 0x0df5, MLineBreaker::EAlLineBreakClass },  //sinhala punctuation kunddaliya
       
   497     { 0x0e01, 0x0e31, MLineBreaker::ESaLineBreakClass },  //thai character ko kai
       
   498     { 0x0e31, 0x0e32, MLineBreaker::ECmLineBreakClass },  //thai character mai han-akat
       
   499     { 0x0e32, 0x0e34, MLineBreaker::ESaLineBreakClass },  //thai character sara aa
       
   500     { 0x0e34, 0x0e3b, MLineBreaker::ECmLineBreakClass },  //thai character sara i
       
   501     { 0x0e3f, 0x0e40, MLineBreaker::EPrLineBreakClass },  //thai currency symbol baht
       
   502     { 0x0e40, 0x0e47, MLineBreaker::ESaLineBreakClass },  //thai character sara e
       
   503     { 0x0e47, 0x0e4f, MLineBreaker::ECmLineBreakClass },  //thai character maitaikhu
       
   504     { 0x0e4f, 0x0e50, MLineBreaker::EAlLineBreakClass },  //thai character fongman
       
   505     { 0x0e50, 0x0e5a, MLineBreaker::ENuLineBreakClass },  //thai digit zero
       
   506     { 0x0e5a, 0x0e5c, MLineBreaker::ENsLineBreakClass },  //thai character angkhankhu
       
   507     { 0x0e81, 0x0e83, MLineBreaker::ESaLineBreakClass },  //lao letter ko
       
   508     { 0x0e84, 0x0e85, MLineBreaker::ESaLineBreakClass },  //lao letter kho tam
       
   509     { 0x0e87, 0x0e89, MLineBreaker::ESaLineBreakClass },  //lao letter ngo
       
   510     { 0x0e8a, 0x0e8b, MLineBreaker::ESaLineBreakClass },  //lao letter so tam
       
   511     { 0x0e8d, 0x0e8e, MLineBreaker::ESaLineBreakClass },  //lao letter nyo
       
   512     { 0x0e94, 0x0e98, MLineBreaker::ESaLineBreakClass },  //lao letter do
       
   513     { 0x0e99, 0x0ea0, MLineBreaker::ESaLineBreakClass },  //lao letter no
       
   514     { 0x0ea1, 0x0ea4, MLineBreaker::ESaLineBreakClass },  //lao letter mo
       
   515     { 0x0ea5, 0x0ea6, MLineBreaker::ESaLineBreakClass },  //lao letter lo loot
       
   516     { 0x0ea7, 0x0ea8, MLineBreaker::ESaLineBreakClass },  //lao letter wo
       
   517     { 0x0eaa, 0x0eac, MLineBreaker::ESaLineBreakClass },  //lao letter so sung
       
   518     { 0x0ead, 0x0eb1, MLineBreaker::ESaLineBreakClass },  //lao letter o
       
   519     { 0x0eb1, 0x0eb2, MLineBreaker::ECmLineBreakClass },  //lao vowel sign mai kan
       
   520     { 0x0eb2, 0x0eb4, MLineBreaker::ESaLineBreakClass },  //lao vowel sign aa
       
   521     { 0x0eb4, 0x0eba, MLineBreaker::ECmLineBreakClass },  //lao vowel sign i
       
   522     { 0x0ebb, 0x0ebd, MLineBreaker::ECmLineBreakClass },  //lao vowel sign mai kon
       
   523     { 0x0ebd, 0x0ebe, MLineBreaker::ESaLineBreakClass },  //lao semivowel sign nyo
       
   524     { 0x0ec0, 0x0ec5, MLineBreaker::ESaLineBreakClass },  //lao vowel sign e
       
   525     { 0x0ec6, 0x0ec7, MLineBreaker::ESaLineBreakClass },  //lao ko la
       
   526     { 0x0ec8, 0x0ece, MLineBreaker::ECmLineBreakClass },  //lao tone mai ek
       
   527     { 0x0ed0, 0x0eda, MLineBreaker::ENuLineBreakClass },  //lao digit zero
       
   528     { 0x0edc, 0x0ede, MLineBreaker::ESaLineBreakClass },  //lao ho no
       
   529     { 0x0f00, 0x0f0b, MLineBreaker::EAlLineBreakClass },  //tibetan syllable om
       
   530     { 0x0f0b, 0x0f0c, MLineBreaker::EBaLineBreakClass },  //tibetan mark intersyllabic tsheg
       
   531     { 0x0f0c, 0x0f0d, MLineBreaker::EGlLineBreakClass },  //tibetan mark delimiter tsheg bstar
       
   532     { 0x0f0d, 0x0f18, MLineBreaker::EAlLineBreakClass },  //tibetan mark shad
       
   533     { 0x0f18, 0x0f1a, MLineBreaker::ECmLineBreakClass },  //tibetan astrological sign -khyud pa
       
   534     { 0x0f1a, 0x0f20, MLineBreaker::EAlLineBreakClass },  //tibetan sign rdel dkar gcig
       
   535     { 0x0f20, 0x0f2a, MLineBreaker::ENuLineBreakClass },  //tibetan digit zero
       
   536     { 0x0f2a, 0x0f35, MLineBreaker::EAlLineBreakClass },  //tibetan digit half one
       
   537     { 0x0f35, 0x0f36, MLineBreaker::ECmLineBreakClass },  //tibetan mark ngas bzung nyi zla
       
   538     { 0x0f36, 0x0f37, MLineBreaker::EAlLineBreakClass },  //tibetan mark caret -dzud rtags bzhi mig can
       
   539     { 0x0f37, 0x0f38, MLineBreaker::ECmLineBreakClass },  //tibetan mark ngas bzung sgor rtags
       
   540     { 0x0f38, 0x0f39, MLineBreaker::EAlLineBreakClass },  //tibetan mark che mgo
       
   541     { 0x0f39, 0x0f3a, MLineBreaker::ECmLineBreakClass },  //tibetan mark tsa -phru
       
   542     { 0x0f3a, 0x0f3b, MLineBreaker::EOpLineBreakClass },  //tibetan mark gug rtags gyon
       
   543     { 0x0f3b, 0x0f3c, MLineBreaker::EClLineBreakClass },  //tibetan mark gug rtags gyas
       
   544     { 0x0f3c, 0x0f3d, MLineBreaker::EOpLineBreakClass },  //tibetan mark ang khang gyon
       
   545     { 0x0f3d, 0x0f3e, MLineBreaker::EClLineBreakClass },  //tibetan mark ang khang gyas
       
   546     { 0x0f3e, 0x0f40, MLineBreaker::ECmLineBreakClass },  //tibetan sign yar tshes
       
   547     { 0x0f40, 0x0f48, MLineBreaker::EAlLineBreakClass },  //tibetan letter ka
       
   548     { 0x0f49, 0x0f6b, MLineBreaker::EAlLineBreakClass },  //tibetan letter nya
       
   549     { 0x0f71, 0x0f85, MLineBreaker::ECmLineBreakClass },  //tibetan vowel sign aa
       
   550     { 0x0f85, 0x0f86, MLineBreaker::EAlLineBreakClass },  //tibetan mark paluta
       
   551     { 0x0f86, 0x0f88, MLineBreaker::ECmLineBreakClass },  //tibetan sign lci rtags
       
   552     { 0x0f88, 0x0f8c, MLineBreaker::EAlLineBreakClass },  //tibetan sign lce tsa can
       
   553     { 0x0f90, 0x0f98, MLineBreaker::ECmLineBreakClass },  //tibetan subjoined letter ka
       
   554     { 0x0f99, 0x0fbd, MLineBreaker::ECmLineBreakClass },  //tibetan subjoined letter nya
       
   555     { 0x0fbe, 0x0fc6, MLineBreaker::EAlLineBreakClass },  //tibetan ku ru kha
       
   556     { 0x0fc6, 0x0fc7, MLineBreaker::ECmLineBreakClass },  //tibetan symbol padma gdan
       
   557     { 0x0fc7, 0x0fcd, MLineBreaker::EAlLineBreakClass },  //tibetan symbol rdo rje rgya gram
       
   558     { 0x0fcf, 0x0fd0, MLineBreaker::EAlLineBreakClass },  //tibetan sign rdel nag gsum
       
   559     { 0x0fd0, 0x0fd2, MLineBreaker::EBbLineBreakClass },  //TIBETAN MARK BSKA- SHOG GI MGO RGYAN
       
   560     { 0x1000, 0x1022, MLineBreaker::ESaLineBreakClass },  //myanmar letter ka
       
   561     { 0x1023, 0x1028, MLineBreaker::ESaLineBreakClass },  //myanmar letter i
       
   562     { 0x1029, 0x102b, MLineBreaker::ESaLineBreakClass },  //myanmar letter o
       
   563     { 0x102c, 0x1033, MLineBreaker::ECmLineBreakClass },  //myanmar vowel sign aa
       
   564     { 0x1036, 0x103a, MLineBreaker::ECmLineBreakClass },  //myanmar sign anusvara
       
   565     { 0x1040, 0x104a, MLineBreaker::ENuLineBreakClass },  //myanmar digit zero
       
   566     { 0x104a, 0x1050, MLineBreaker::EAlLineBreakClass },  //myanmar sign little section
       
   567     { 0x1050, 0x1056, MLineBreaker::ESaLineBreakClass },  //myanmar letter sha
       
   568     { 0x1056, 0x105a, MLineBreaker::ECmLineBreakClass },  //myanmar vowel sign vocalic r
       
   569     { 0x10a0, 0x10c6, MLineBreaker::EAlLineBreakClass },  //georgian capital letter an
       
   570     { 0x10d0, 0x10fb, MLineBreaker::EAlLineBreakClass },  //georgian letter an
       
   571     { 0x10fb, 0x10fc, MLineBreaker::EAlLineBreakClass },  //georgian paragraph separator
       
   572     { 0x10fc, 0x10fd, MLineBreaker::EAlLineBreakClass },  //MODIFIER LETTER GEORGIAN NAR
       
   573     { 0x1100, 0x115a, MLineBreaker::EIdLineBreakClass },  //hangul choseong kiyeok
       
   574     { 0x115f, 0x1160, MLineBreaker::EIdLineBreakClass },  //hangul choseong filler
       
   575     { 0x1160, 0x11a3, MLineBreaker::ECmLineBreakClass },  //hangul jungseong filler
       
   576     { 0x11a8, 0x11fa, MLineBreaker::ECmLineBreakClass },  //hangul jongseong kiyeok
       
   577     { 0x1200, 0x1248, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable ha
       
   578     { 0x1248, 0x1249, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qwa
       
   579     { 0x124a, 0x124e, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qwi
       
   580     { 0x1250, 0x1257, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qha
       
   581     { 0x1258, 0x1259, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qhwa
       
   582     { 0x125a, 0x125e, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable qhwi
       
   583     { 0x1260, 0x1288, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable ba
       
   584     { 0x1288, 0x1289, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable xwa
       
   585     { 0x128a, 0x128e, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable xwi
       
   586     { 0x1290, 0x12b0, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable na
       
   587     { 0x12b0, 0x12b1, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kwa
       
   588     { 0x12b2, 0x12b6, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kwi
       
   589     { 0x12b8, 0x12bf, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kxa
       
   590     { 0x12c0, 0x12c1, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kxwa
       
   591     { 0x12c2, 0x12c6, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable kxwi
       
   592     { 0x12c8, 0x12d7, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable wa
       
   593     { 0x12d8, 0x1310, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable za
       
   594     { 0x1310, 0x1311, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable gwa
       
   595     { 0x1312, 0x1316, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable gwi
       
   596     { 0x1318, 0x135b, MLineBreaker::EAlLineBreakClass },  //ethiopic syllable gga
       
   597     { 0x135f, 0x1360, MLineBreaker::ECmLineBreakClass },  //ETHIOPIC COMBINING GEMINATION MARK
       
   598     { 0x1360, 0x1361, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SECTION MARK
       
   599     { 0x1361, 0x1362, MLineBreaker::EBaLineBreakClass },  //ethiopic wordspace
       
   600     { 0x1362, 0x1369, MLineBreaker::EAlLineBreakClass },  //ethiopic full stop
       
   601     { 0x1369, 0x1372, MLineBreaker::ENuLineBreakClass },  //ethiopic digit one
       
   602     { 0x1372, 0x137d, MLineBreaker::EAlLineBreakClass },  //ethiopic number ten
       
   603     { 0x1380, 0x139a, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE SEBATBEIT MWA
       
   604     { 0x13a0, 0x13f5, MLineBreaker::EAlLineBreakClass },  //cherokee letter a
       
   605     { 0x1401, 0x1677, MLineBreaker::EAlLineBreakClass },  //canadian syllabics e
       
   606     { 0x1680, 0x1681, MLineBreaker::EBaLineBreakClass },  //ogham space mark
       
   607     { 0x1681, 0x169b, MLineBreaker::EAlLineBreakClass },  //ogham letter beith
       
   608     { 0x169b, 0x169c, MLineBreaker::EOpLineBreakClass },  //ogham feather mark
       
   609     { 0x169c, 0x169d, MLineBreaker::EClLineBreakClass },  //ogham reversed feather mark
       
   610     { 0x16a0, 0x16f1, MLineBreaker::EAlLineBreakClass },  //runic letter fehu feoh fe f
       
   611     { 0x1700, 0x170d, MLineBreaker::EAlLineBreakClass },  //TAGALOG LETTER A
       
   612     { 0x170e, 0x1712, MLineBreaker::EAlLineBreakClass },  //TAGALOG LETTER LA
       
   613     { 0x1712, 0x1715, MLineBreaker::ECmLineBreakClass },  //TAGALOG VOWEL SIGN I
       
   614     { 0x1720, 0x1732, MLineBreaker::EAlLineBreakClass },  //HANUNOO LETTER A
       
   615     { 0x1732, 0x1735, MLineBreaker::ECmLineBreakClass },  //HANUNOO VOWEL SIGN I
       
   616     { 0x1735, 0x1737, MLineBreaker::EBaLineBreakClass },  //PHILIPPINE SINGLE PUNCTUATION
       
   617     { 0x1740, 0x1752, MLineBreaker::EAlLineBreakClass },  //BUHID LETTER A
       
   618     { 0x1752, 0x1754, MLineBreaker::ECmLineBreakClass },  //BUHID VOWEL SIGN I
       
   619     { 0x1760, 0x176d, MLineBreaker::EAlLineBreakClass },  //TAGBANWA LETTER A
       
   620     { 0x176e, 0x1771, MLineBreaker::EAlLineBreakClass },  //TAGBANWA LETTER LA
       
   621     { 0x1772, 0x1774, MLineBreaker::ECmLineBreakClass },  //TAGBANWA VOWEL SIGN I
       
   622     { 0x1780, 0x17b4, MLineBreaker::ESaLineBreakClass },  //khmer letter ka
       
   623     { 0x17b4, 0x17d4, MLineBreaker::ECmLineBreakClass },  //khmer vowel inherent aq
       
   624     { 0x17d4, 0x17d5, MLineBreaker::ENsLineBreakClass },  //khmer sign khan
       
   625     { 0x17d5, 0x17d6, MLineBreaker::EBaLineBreakClass },  //khmer sign bariyoosan
       
   626     { 0x17d6, 0x17db, MLineBreaker::ENsLineBreakClass },  //khmer sign camnuc pii kuuh
       
   627     { 0x17db, 0x17dc, MLineBreaker::EPrLineBreakClass },  //khmer currency symbol riel
       
   628     { 0x17dc, 0x17dd, MLineBreaker::EAlLineBreakClass },  //khmer sign avakrahasanya
       
   629     { 0x17dd, 0x17de, MLineBreaker::ESaLineBreakClass },  //KHMER SIGN ATTHACAN
       
   630     { 0x17e0, 0x17ea, MLineBreaker::ENuLineBreakClass },  //khmer digit zero
       
   631     { 0x17f0, 0x17fa, MLineBreaker::EAlLineBreakClass },  //KHMER SYMBOL LEK ATTAK SON
       
   632     { 0x1800, 0x1806, MLineBreaker::EAlLineBreakClass },  //mongolian birga
       
   633     { 0x1806, 0x1807, MLineBreaker::EBbLineBreakClass },  //mongolian todo soft hyphen
       
   634     { 0x1807, 0x180b, MLineBreaker::EAlLineBreakClass },  //mongolian sibe syllable boundary marker
       
   635     { 0x180b, 0x180f, MLineBreaker::ECmLineBreakClass },  //mongolian free variation selector one
       
   636     { 0x1810, 0x181a, MLineBreaker::ENuLineBreakClass },  //mongolian digit zero
       
   637     { 0x1820, 0x1878, MLineBreaker::EAlLineBreakClass },  //mongolian letter a
       
   638     { 0x1880, 0x18a9, MLineBreaker::EAlLineBreakClass },  //mongolian letter ali gali anusvara one
       
   639     { 0x18a9, 0x18aa, MLineBreaker::ECmLineBreakClass },  //mongolian letter ali gali dagalga
       
   640     { 0x1900, 0x191d, MLineBreaker::EAlLineBreakClass },  //LIMBU VOWEL-CARRIER LETTER
       
   641     { 0x1920, 0x192c, MLineBreaker::ECmLineBreakClass },  //LIMBU VOWEL SIGN A
       
   642     { 0x1930, 0x193c, MLineBreaker::ECmLineBreakClass },  //LIMBU SMALL LETTER KA
       
   643     { 0x1940, 0x1941, MLineBreaker::EAlLineBreakClass },  //LIMBU SIGN LOO
       
   644     { 0x1944, 0x1946, MLineBreaker::EExLineBreakClass },  //LIMBU EXCLAMATION MARK
       
   645     { 0x1946, 0x1950, MLineBreaker::ENuLineBreakClass },  //LIMBU DIGIT ZERO
       
   646     { 0x1950, 0x196e, MLineBreaker::ESaLineBreakClass },  //TAI LE LETTER KA
       
   647     { 0x1970, 0x1975, MLineBreaker::ESaLineBreakClass },  //TAI LE LETTER TONE-2
       
   648     { 0x1980, 0x19aa, MLineBreaker::ESaLineBreakClass },  //NEW TAI LUE LETTER HIGH QA
       
   649     { 0x19b0, 0x19ca, MLineBreaker::ESaLineBreakClass },  //NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
       
   650     { 0x19d0, 0x19da, MLineBreaker::ENuLineBreakClass },  //NEW TAI LUE DIGIT ZERO
       
   651     { 0x19de, 0x19e0, MLineBreaker::ESaLineBreakClass },  //NEW TAI LUE SIGN LAE
       
   652     { 0x19e0, 0x1a17, MLineBreaker::EAlLineBreakClass },  //KHMER SYMBOL PATHAMASAT
       
   653     { 0x1a17, 0x1a1c, MLineBreaker::ECmLineBreakClass },  //BUGINESE VOWEL SIGN I
       
   654     { 0x1a1e, 0x1a1f, MLineBreaker::EBaLineBreakClass },  //BUGINESE PALLAWA
       
   655     { 0x1a1f, 0x1a20, MLineBreaker::EAlLineBreakClass },  //BUGINESE END OF SECTION
       
   656     { 0x1b00, 0x1b05, MLineBreaker::ECmLineBreakClass },  //BALINESE SIGN ULU RICEM
       
   657     { 0x1b05, 0x1b34, MLineBreaker::EAlLineBreakClass },  //BALINESE LETTER AKARA
       
   658     { 0x1b34, 0x1b45, MLineBreaker::ECmLineBreakClass },  //BALINESE SIGN REREKAN
       
   659     { 0x1b45, 0x1b4c, MLineBreaker::EAlLineBreakClass },  //BALINESE LETTER KAF SASAK
       
   660     { 0x1b50, 0x1b5a, MLineBreaker::ENuLineBreakClass },  //BALINESE DIGIT ZERO
       
   661     { 0x1b5a, 0x1b61, MLineBreaker::EBaLineBreakClass },  //BALINESE PANTI
       
   662     { 0x1b61, 0x1b6b, MLineBreaker::EAlLineBreakClass },  //BALINESE MUSICAL SYMBOL DONG
       
   663     { 0x1b6b, 0x1b74, MLineBreaker::ECmLineBreakClass },  //BALINESE MUSICAL SYMBOL COMBINING TEGEH
       
   664     { 0x1b74, 0x1b7d, MLineBreaker::EAlLineBreakClass },  //BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
       
   665     { 0x1d00, 0x1dc0, MLineBreaker::EAlLineBreakClass },  //LATIN LETTER SMALL CAPITAL A
       
   666     { 0x1dc0, 0x1dcb, MLineBreaker::ECmLineBreakClass },  //COMBINING DOTTED GRAVE ACCENT
       
   667     { 0x1dfe, 0x1e00, MLineBreaker::ECmLineBreakClass },  //COMBINING LEFT ARROWHEAD ABOVE
       
   668     { 0x1e00, 0x1e9c, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with ring below
       
   669     { 0x1ea0, 0x1efa, MLineBreaker::EAlLineBreakClass },  //latin capital letter a with dot below
       
   670     { 0x1f00, 0x1f16, MLineBreaker::EAlLineBreakClass },  //greek small letter alpha with psili
       
   671     { 0x1f18, 0x1f1e, MLineBreaker::EAlLineBreakClass },  //greek capital letter epsilon with psili
       
   672     { 0x1f20, 0x1f46, MLineBreaker::EAlLineBreakClass },  //greek small letter eta with psili
       
   673     { 0x1f48, 0x1f4e, MLineBreaker::EAlLineBreakClass },  //greek capital letter omicron with psili
       
   674     { 0x1f50, 0x1f58, MLineBreaker::EAlLineBreakClass },  //greek small letter upsilon with psili
       
   675     { 0x1f59, 0x1f5a, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia
       
   676     { 0x1f5b, 0x1f5c, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia and varia
       
   677     { 0x1f5d, 0x1f5e, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia and oxia
       
   678     { 0x1f5f, 0x1f7e, MLineBreaker::EAlLineBreakClass },  //greek capital letter upsilon with dasia and perispomeni
       
   679     { 0x1f80, 0x1fb5, MLineBreaker::EAlLineBreakClass },  //greek small letter alpha with psili and ypogegrammeni
       
   680     { 0x1fb6, 0x1fc5, MLineBreaker::EAlLineBreakClass },  //greek small letter alpha with perispomeni
       
   681     { 0x1fc6, 0x1fd4, MLineBreaker::EAlLineBreakClass },  //greek small letter eta with perispomeni
       
   682     { 0x1fd6, 0x1fdc, MLineBreaker::EAlLineBreakClass },  //greek small letter iota with perispomeni
       
   683     { 0x1fdd, 0x1ff0, MLineBreaker::EAlLineBreakClass },  //greek dasia and varia
       
   684     { 0x1ff2, 0x1ff5, MLineBreaker::EAlLineBreakClass },  //greek small letter omega with varia and ypogegrammeni
       
   685     { 0x1ff6, 0x1fff, MLineBreaker::EAlLineBreakClass },  //greek small letter omega with perispomeni
       
   686     { 0x2000, 0x2007, MLineBreaker::EBaLineBreakClass },  //en quad
       
   687     { 0x2007, 0x2008, MLineBreaker::EGlLineBreakClass },  //figure space
       
   688     { 0x2008, 0x200b, MLineBreaker::EBaLineBreakClass },  //punctuation space
       
   689     { 0x200b, 0x200c, MLineBreaker::EZwLineBreakClass },  //zero width space
       
   690     { 0x200c, 0x2010, MLineBreaker::ECmLineBreakClass },  //zero width non-joiner
       
   691     { 0x2010, 0x2011, MLineBreaker::EBaLineBreakClass },  //hyphen
       
   692     { 0x2011, 0x2012, MLineBreaker::EGlLineBreakClass },  //non-breaking hyphen
       
   693     { 0x2012, 0x2014, MLineBreaker::EBaLineBreakClass },  //figure dash
       
   694     { 0x2014, 0x2015, MLineBreaker::EB2LineBreakClass },  //em dash
       
   695     { 0x2015, 0x2016, MLineBreaker::EAlLineBreakClass },  //horizontal bar
       
   696     { 0x2016, 0x2017, MLineBreaker::EAiLineBreakClass },  //double vertical line
       
   697     { 0x2017, 0x2018, MLineBreaker::EAlLineBreakClass },  //double low line
       
   698     { 0x2018, 0x201a, MLineBreaker::EQuLineBreakClass },  //left single quotation mark
       
   699     { 0x201a, 0x201b, MLineBreaker::EOpLineBreakClass },  //single low-9 quotation mark
       
   700     { 0x201b, 0x201e, MLineBreaker::EQuLineBreakClass },  //single high-reversed-9 quotation mark
       
   701     { 0x201e, 0x201f, MLineBreaker::EOpLineBreakClass },  //double low-9 quotation mark
       
   702     { 0x201f, 0x2020, MLineBreaker::EQuLineBreakClass },  //double high-reversed-9 quotation mark
       
   703     { 0x2020, 0x2022, MLineBreaker::EAiLineBreakClass },  //dagger
       
   704     { 0x2022, 0x2024, MLineBreaker::EAlLineBreakClass },  //bullet
       
   705     { 0x2024, 0x2027, MLineBreaker::EInLineBreakClass },  //one dot leader
       
   706     { 0x2027, 0x2028, MLineBreaker::EBaLineBreakClass },  //hyphenation point
       
   707     { 0x2028, 0x202a, MLineBreaker::EBkLineBreakClass },  //line separator
       
   708     { 0x202a, 0x202f, MLineBreaker::ECmLineBreakClass },  //left-to-right embedding
       
   709     { 0x202f, 0x2030, MLineBreaker::EGlLineBreakClass },  //narrow no-break space
       
   710     { 0x2030, 0x2038, MLineBreaker::EPoLineBreakClass },  //per mille sign
       
   711     { 0x2038, 0x2039, MLineBreaker::EAlLineBreakClass },  //caret
       
   712     { 0x2039, 0x203b, MLineBreaker::EQuLineBreakClass },  //single left-pointing angle quotation mark
       
   713     { 0x203b, 0x203c, MLineBreaker::EAiLineBreakClass },  //reference mark
       
   714     { 0x203c, 0x203d, MLineBreaker::ENsLineBreakClass },  //double exclamation mark
       
   715     { 0x203d, 0x2044, MLineBreaker::EAlLineBreakClass },  //interrobang
       
   716     { 0x2044, 0x2045, MLineBreaker::ENsLineBreakClass },  //fraction slash
       
   717     { 0x2045, 0x2046, MLineBreaker::EOpLineBreakClass },  //left square bracket with quill
       
   718     { 0x2046, 0x2047, MLineBreaker::EClLineBreakClass },  //right square bracket with quill
       
   719     { 0x2047, 0x2048, MLineBreaker::ENsLineBreakClass },  //DOUBLE QUESTION MARK
       
   720     { 0x2048, 0x2056, MLineBreaker::EAlLineBreakClass },  //question exclamation mark
       
   721     { 0x2056, 0x2057, MLineBreaker::EBaLineBreakClass },  //THREE DOT PUNCTUATION
       
   722     { 0x2057, 0x2058, MLineBreaker::EAlLineBreakClass },  //QUADRUPLE PRIME
       
   723     { 0x2058, 0x205c, MLineBreaker::EBaLineBreakClass },  //FOUR DOT PUNCTUATION
       
   724     { 0x205c, 0x205d, MLineBreaker::EAlLineBreakClass },  //DOTTED CROSS
       
   725     { 0x205d, 0x2060, MLineBreaker::EBaLineBreakClass },  //TRICOLON
       
   726     { 0x2060, 0x2061, MLineBreaker::EGlLineBreakClass },  //WORD JOINER
       
   727     { 0x2061, 0x2064, MLineBreaker::EAlLineBreakClass },  //FUNCTION APPLICATION
       
   728     { 0x206a, 0x2070, MLineBreaker::ECmLineBreakClass },  //inhibit symmetric swapping
       
   729     { 0x2070, 0x2071, MLineBreaker::EAlLineBreakClass },  //superscript zero
       
   730     { 0x2071, 0x2072, MLineBreaker::EAlLineBreakClass },  //SUPERSCRIPT LATIN SMALL LETTER I
       
   731     { 0x2074, 0x2075, MLineBreaker::EAiLineBreakClass },  //superscript four
       
   732     { 0x2075, 0x207d, MLineBreaker::EAlLineBreakClass },  //superscript five
       
   733     { 0x207d, 0x207e, MLineBreaker::EOpLineBreakClass },  //superscript left parenthesis
       
   734     { 0x207e, 0x207f, MLineBreaker::EClLineBreakClass },  //superscript right parenthesis
       
   735     { 0x207f, 0x2080, MLineBreaker::EAiLineBreakClass },  //superscript latin small letter n
       
   736     { 0x2080, 0x2081, MLineBreaker::EAlLineBreakClass },  //subscript zero
       
   737     { 0x2081, 0x2085, MLineBreaker::EAiLineBreakClass },  //subscript one
       
   738     { 0x2085, 0x208d, MLineBreaker::EAlLineBreakClass },  //subscript five
       
   739     { 0x208d, 0x208e, MLineBreaker::EOpLineBreakClass },  //subscript left parenthesis
       
   740     { 0x208e, 0x208f, MLineBreaker::EClLineBreakClass },  //subscript right parenthesis
       
   741     { 0x2090, 0x2095, MLineBreaker::EAlLineBreakClass },  //LATIN SUBSCRIPT SMALL LETTER A
       
   742     { 0x20a0, 0x20a7, MLineBreaker::EPrLineBreakClass },  //euro-currency sign
       
   743     { 0x20a7, 0x20a8, MLineBreaker::EPoLineBreakClass },  //peseta sign
       
   744     { 0x20a8, 0x20b6, MLineBreaker::EPrLineBreakClass },  //rupee sign
       
   745     { 0x20d0, 0x20f0, MLineBreaker::ECmLineBreakClass },  //combining left harpoon above
       
   746     { 0x2100, 0x2103, MLineBreaker::EAlLineBreakClass },  //account of
       
   747     { 0x2103, 0x2104, MLineBreaker::EPoLineBreakClass },  //degree celsius
       
   748     { 0x2104, 0x2105, MLineBreaker::EAlLineBreakClass },  //centre line symbol
       
   749     { 0x2105, 0x2106, MLineBreaker::EAiLineBreakClass },  //care of
       
   750     { 0x2106, 0x2109, MLineBreaker::EAlLineBreakClass },  //cada una
       
   751     { 0x2109, 0x210a, MLineBreaker::EPoLineBreakClass },  //degree fahrenheit
       
   752     { 0x210a, 0x2113, MLineBreaker::EAlLineBreakClass },  //script small g
       
   753     { 0x2113, 0x2114, MLineBreaker::EAiLineBreakClass },  //script small l
       
   754     { 0x2114, 0x2116, MLineBreaker::EAlLineBreakClass },  //l b bar symbol
       
   755     { 0x2116, 0x2117, MLineBreaker::EPrLineBreakClass },  //numero sign
       
   756     { 0x2117, 0x2121, MLineBreaker::EAlLineBreakClass },  //sound recording copyright
       
   757     { 0x2121, 0x2123, MLineBreaker::EAiLineBreakClass },  //telephone sign
       
   758     { 0x2123, 0x2126, MLineBreaker::EAlLineBreakClass },  //versicle
       
   759     { 0x2126, 0x2127, MLineBreaker::EPoLineBreakClass },  //ohm sign
       
   760     { 0x2127, 0x212b, MLineBreaker::EAlLineBreakClass },  //inverted ohm sign
       
   761     { 0x212b, 0x212c, MLineBreaker::EAiLineBreakClass },  //angstrom sign
       
   762     { 0x212c, 0x214f, MLineBreaker::EAlLineBreakClass },  //script capital b
       
   763     { 0x2153, 0x2154, MLineBreaker::EAlLineBreakClass },  //vulgar fraction one third
       
   764     { 0x2154, 0x2156, MLineBreaker::EAiLineBreakClass },  //vulgar fraction two thirds
       
   765     { 0x2156, 0x215b, MLineBreaker::EAlLineBreakClass },  //vulgar fraction two fifths
       
   766     { 0x215b, 0x215c, MLineBreaker::EAiLineBreakClass },  //vulgar fraction one eighth
       
   767     { 0x215c, 0x215e, MLineBreaker::EAlLineBreakClass },  //vulgar fraction three eighths
       
   768     { 0x215e, 0x215f, MLineBreaker::EAiLineBreakClass },  //vulgar fraction seven eighths
       
   769     { 0x215f, 0x2160, MLineBreaker::EAlLineBreakClass },  //fraction numerator one
       
   770     { 0x2160, 0x216c, MLineBreaker::EAiLineBreakClass },  //roman numeral one
       
   771     { 0x216c, 0x2170, MLineBreaker::EAlLineBreakClass },  //roman numeral fifty
       
   772     { 0x2170, 0x217a, MLineBreaker::EAiLineBreakClass },  //small roman numeral one
       
   773     { 0x217a, 0x2185, MLineBreaker::EAlLineBreakClass },  //small roman numeral eleven
       
   774     { 0x2190, 0x219a, MLineBreaker::EAiLineBreakClass },  //leftwards arrow
       
   775     { 0x219a, 0x21d2, MLineBreaker::EAlLineBreakClass },  //leftwards arrow with stroke
       
   776     { 0x21d2, 0x21d3, MLineBreaker::EAiLineBreakClass },  //rightwards double arrow
       
   777     { 0x21d3, 0x21d4, MLineBreaker::EAlLineBreakClass },  //downwards double arrow
       
   778     { 0x21d4, 0x21d5, MLineBreaker::EAiLineBreakClass },  //left right double arrow
       
   779     { 0x21d5, 0x2200, MLineBreaker::EAlLineBreakClass },  //up down double arrow
       
   780     { 0x2200, 0x2201, MLineBreaker::EAiLineBreakClass },  //for all
       
   781     { 0x2201, 0x2202, MLineBreaker::EAlLineBreakClass },  //complement
       
   782     { 0x2202, 0x2204, MLineBreaker::EAiLineBreakClass },  //partial differential
       
   783     { 0x2204, 0x2207, MLineBreaker::EAlLineBreakClass },  //there does not exist
       
   784     { 0x2207, 0x2209, MLineBreaker::EAiLineBreakClass },  //nabla
       
   785     { 0x2209, 0x220b, MLineBreaker::EAlLineBreakClass },  //not an element of
       
   786     { 0x220b, 0x220c, MLineBreaker::EAiLineBreakClass },  //contains as member
       
   787     { 0x220c, 0x220f, MLineBreaker::EAlLineBreakClass },  //does not contain as member
       
   788     { 0x220f, 0x2210, MLineBreaker::EAiLineBreakClass },  //n-ary product
       
   789     { 0x2210, 0x2211, MLineBreaker::EAlLineBreakClass },  //n-ary coproduct
       
   790     { 0x2211, 0x2212, MLineBreaker::EAiLineBreakClass },  //n-ary summation
       
   791     { 0x2212, 0x2214, MLineBreaker::EPrLineBreakClass },  //minus sign
       
   792     { 0x2214, 0x2215, MLineBreaker::EAlLineBreakClass },  //dot plus
       
   793     { 0x2215, 0x2216, MLineBreaker::EAiLineBreakClass },  //division slash
       
   794     { 0x2216, 0x221a, MLineBreaker::EAlLineBreakClass },  //set minus
       
   795     { 0x221a, 0x221b, MLineBreaker::EAiLineBreakClass },  //square root
       
   796     { 0x221b, 0x221d, MLineBreaker::EAlLineBreakClass },  //cube root
       
   797     { 0x221d, 0x2221, MLineBreaker::EAiLineBreakClass },  //proportional to
       
   798     { 0x2221, 0x2223, MLineBreaker::EAlLineBreakClass },  //measured angle
       
   799     { 0x2223, 0x2224, MLineBreaker::EAiLineBreakClass },  //divides
       
   800     { 0x2224, 0x2225, MLineBreaker::EAlLineBreakClass },  //does not divide
       
   801     { 0x2225, 0x2226, MLineBreaker::EAiLineBreakClass },  //parallel to
       
   802     { 0x2226, 0x2227, MLineBreaker::EAlLineBreakClass },  //not parallel to
       
   803     { 0x2227, 0x222d, MLineBreaker::EAiLineBreakClass },  //logical and
       
   804     { 0x222d, 0x222e, MLineBreaker::EAlLineBreakClass },  //triple integral
       
   805     { 0x222e, 0x222f, MLineBreaker::EAiLineBreakClass },  //contour integral
       
   806     { 0x222f, 0x2234, MLineBreaker::EAlLineBreakClass },  //surface integral
       
   807     { 0x2234, 0x2238, MLineBreaker::EAiLineBreakClass },  //therefore
       
   808     { 0x2238, 0x223c, MLineBreaker::EAlLineBreakClass },  //dot minus
       
   809     { 0x223c, 0x223e, MLineBreaker::EAiLineBreakClass },  //tilde operator
       
   810     { 0x223e, 0x2248, MLineBreaker::EAlLineBreakClass },  //inverted lazy s
       
   811     { 0x2248, 0x2249, MLineBreaker::EAiLineBreakClass },  //almost equal to
       
   812     { 0x2249, 0x224c, MLineBreaker::EAlLineBreakClass },  //not almost equal to
       
   813     { 0x224c, 0x224d, MLineBreaker::EAiLineBreakClass },  //all equal to
       
   814     { 0x224d, 0x2252, MLineBreaker::EAlLineBreakClass },  //equivalent to
       
   815     { 0x2252, 0x2253, MLineBreaker::EAiLineBreakClass },  //approximately equal to or the image of
       
   816     { 0x2253, 0x2260, MLineBreaker::EAlLineBreakClass },  //image of or approximately equal to
       
   817     { 0x2260, 0x2262, MLineBreaker::EAiLineBreakClass },  //not equal to
       
   818     { 0x2262, 0x2264, MLineBreaker::EAlLineBreakClass },  //not identical to
       
   819     { 0x2264, 0x2268, MLineBreaker::EAiLineBreakClass },  //less-than or equal to
       
   820     { 0x2268, 0x226a, MLineBreaker::EAlLineBreakClass },  //less-than but not equal to
       
   821     { 0x226a, 0x226c, MLineBreaker::EAiLineBreakClass },  //much less-than
       
   822     { 0x226c, 0x226e, MLineBreaker::EAlLineBreakClass },  //between
       
   823     { 0x226e, 0x2270, MLineBreaker::EAiLineBreakClass },  //not less-than
       
   824     { 0x2270, 0x2282, MLineBreaker::EAlLineBreakClass },  //neither less-than nor equal to
       
   825     { 0x2282, 0x2284, MLineBreaker::EAiLineBreakClass },  //subset of
       
   826     { 0x2284, 0x2286, MLineBreaker::EAlLineBreakClass },  //not a subset of
       
   827     { 0x2286, 0x2288, MLineBreaker::EAiLineBreakClass },  //subset of or equal to
       
   828     { 0x2288, 0x2295, MLineBreaker::EAlLineBreakClass },  //neither a subset of nor equal to
       
   829     { 0x2295, 0x2296, MLineBreaker::EAiLineBreakClass },  //circled plus
       
   830     { 0x2296, 0x2299, MLineBreaker::EAlLineBreakClass },  //circled minus
       
   831     { 0x2299, 0x229a, MLineBreaker::EAiLineBreakClass },  //circled dot operator
       
   832     { 0x229a, 0x22a5, MLineBreaker::EAlLineBreakClass },  //circled ring operator
       
   833     { 0x22a5, 0x22a6, MLineBreaker::EAiLineBreakClass },  //up tack
       
   834     { 0x22a6, 0x22bf, MLineBreaker::EAlLineBreakClass },  //assertion
       
   835     { 0x22bf, 0x22c0, MLineBreaker::EAiLineBreakClass },  //right triangle
       
   836     { 0x22c0, 0x2312, MLineBreaker::EAlLineBreakClass },  //n-ary logical and
       
   837     { 0x2312, 0x2313, MLineBreaker::EAiLineBreakClass },  //arc
       
   838     { 0x2313, 0x2329, MLineBreaker::EAlLineBreakClass },  //segment
       
   839     { 0x2329, 0x232a, MLineBreaker::EOpLineBreakClass },  //left-pointing angle bracket
       
   840     { 0x232a, 0x232b, MLineBreaker::EClLineBreakClass },  //right-pointing angle bracket
       
   841     { 0x232b, 0x23e8, MLineBreaker::EAlLineBreakClass },  //erase to the left
       
   842     { 0x2400, 0x2427, MLineBreaker::EAlLineBreakClass },  //symbol for null
       
   843     { 0x2440, 0x244b, MLineBreaker::EAlLineBreakClass },  //ocr hook
       
   844     { 0x2460, 0x24c0, MLineBreaker::EAiLineBreakClass },  //circled digit one
       
   845     { 0x24c0, 0x24d0, MLineBreaker::EAlLineBreakClass },  //circled latin capital letter k
       
   846     { 0x24d0, 0x24ea, MLineBreaker::EAiLineBreakClass },  //circled latin small letter a
       
   847     { 0x24ea, 0x24eb, MLineBreaker::EAlLineBreakClass },  //circled digit zero
       
   848     { 0x24eb, 0x24ff, MLineBreaker::EAiLineBreakClass },  //NEGATIVE CIRCLED NUMBER ELEVEN
       
   849     { 0x24ff, 0x2500, MLineBreaker::EAlLineBreakClass },  //NEGATIVE CIRCLED DIGIT ZERO
       
   850     { 0x2500, 0x254c, MLineBreaker::EAiLineBreakClass },  //box drawings light horizontal
       
   851     { 0x254c, 0x2550, MLineBreaker::EAlLineBreakClass },  //box drawings light double dash horizontal
       
   852     { 0x2550, 0x2575, MLineBreaker::EAiLineBreakClass },  //box drawings double horizontal
       
   853     { 0x2575, 0x2580, MLineBreaker::EAlLineBreakClass },  //box drawings light up
       
   854     { 0x2580, 0x2590, MLineBreaker::EAiLineBreakClass },  //upper half block
       
   855     { 0x2590, 0x2592, MLineBreaker::EAlLineBreakClass },  //right half block
       
   856     { 0x2592, 0x2596, MLineBreaker::EAiLineBreakClass },  //medium shade
       
   857     { 0x2596, 0x25a0, MLineBreaker::EAlLineBreakClass },  //QUADRANT LOWER LEFT
       
   858     { 0x25a0, 0x25a2, MLineBreaker::EAiLineBreakClass },  //black square
       
   859     { 0x25a2, 0x25a3, MLineBreaker::EAlLineBreakClass },  //white square with rounded corners
       
   860     { 0x25a3, 0x25aa, MLineBreaker::EAiLineBreakClass },  //white square containing black small square
       
   861     { 0x25aa, 0x25b2, MLineBreaker::EAlLineBreakClass },  //black small square
       
   862     { 0x25b2, 0x25b4, MLineBreaker::EAiLineBreakClass },  //black up-pointing triangle
       
   863     { 0x25b4, 0x25b6, MLineBreaker::EAlLineBreakClass },  //black up-pointing small triangle
       
   864     { 0x25b6, 0x25b8, MLineBreaker::EAiLineBreakClass },  //black right-pointing triangle
       
   865     { 0x25b8, 0x25bc, MLineBreaker::EAlLineBreakClass },  //black right-pointing small triangle
       
   866     { 0x25bc, 0x25be, MLineBreaker::EAiLineBreakClass },  //black down-pointing triangle
       
   867     { 0x25be, 0x25c0, MLineBreaker::EAlLineBreakClass },  //black down-pointing small triangle
       
   868     { 0x25c0, 0x25c2, MLineBreaker::EAiLineBreakClass },  //black left-pointing triangle
       
   869     { 0x25c2, 0x25c6, MLineBreaker::EAlLineBreakClass },  //black left-pointing small triangle
       
   870     { 0x25c6, 0x25c8, MLineBreaker::EAiLineBreakClass },  //black diamond
       
   871     { 0x25c8, 0x25cb, MLineBreaker::EAlLineBreakClass },  //white diamond containing black small diamond
       
   872     { 0x25cb, 0x25cc, MLineBreaker::EAiLineBreakClass },  //white circle
       
   873     { 0x25cc, 0x25ce, MLineBreaker::EAlLineBreakClass },  //dotted circle
       
   874     { 0x25ce, 0x25d2, MLineBreaker::EAiLineBreakClass },  //bullseye
       
   875     { 0x25d2, 0x25e2, MLineBreaker::EAlLineBreakClass },  //circle with lower half black
       
   876     { 0x25e2, 0x25e6, MLineBreaker::EAiLineBreakClass },  //black lower right triangle
       
   877     { 0x25e6, 0x25ef, MLineBreaker::EAlLineBreakClass },  //white bullet
       
   878     { 0x25ef, 0x25f0, MLineBreaker::EAiLineBreakClass },  //large circle
       
   879     { 0x25f0, 0x2605, MLineBreaker::EAlLineBreakClass },  //white square with upper left quadrant
       
   880     { 0x2605, 0x2607, MLineBreaker::EAiLineBreakClass },  //black star
       
   881     { 0x2607, 0x2609, MLineBreaker::EAlLineBreakClass },  //lightning
       
   882     { 0x2609, 0x260a, MLineBreaker::EAiLineBreakClass },  //sun
       
   883     { 0x260a, 0x260e, MLineBreaker::EAlLineBreakClass },  //ascending node
       
   884     { 0x260e, 0x2610, MLineBreaker::EAiLineBreakClass },  //black telephone
       
   885     { 0x2610, 0x2614, MLineBreaker::EAlLineBreakClass },  //ballot box
       
   886     { 0x2614, 0x2618, MLineBreaker::EAiLineBreakClass },  //UMBRELLA WITH RAIN DROPS
       
   887     { 0x2618, 0x261c, MLineBreaker::EAlLineBreakClass },  //SHAMROCK
       
   888     { 0x261c, 0x261d, MLineBreaker::EAiLineBreakClass },  //white left pointing index
       
   889     { 0x261d, 0x261e, MLineBreaker::EAlLineBreakClass },  //white up pointing index
       
   890     { 0x261e, 0x261f, MLineBreaker::EAiLineBreakClass },  //white right pointing index
       
   891     { 0x261f, 0x2640, MLineBreaker::EAlLineBreakClass },  //white down pointing index
       
   892     { 0x2640, 0x2641, MLineBreaker::EAiLineBreakClass },  //female sign
       
   893     { 0x2641, 0x2642, MLineBreaker::EAlLineBreakClass },  //earth
       
   894     { 0x2642, 0x2643, MLineBreaker::EAiLineBreakClass },  //male sign
       
   895     { 0x2643, 0x2660, MLineBreaker::EAlLineBreakClass },  //jupiter
       
   896     { 0x2660, 0x2662, MLineBreaker::EAiLineBreakClass },  //black spade suit
       
   897     { 0x2662, 0x2663, MLineBreaker::EAlLineBreakClass },  //white diamond suit
       
   898     { 0x2663, 0x2666, MLineBreaker::EAiLineBreakClass },  //black club suit
       
   899     { 0x2666, 0x2667, MLineBreaker::EAlLineBreakClass },  //black diamond suit
       
   900     { 0x2667, 0x266b, MLineBreaker::EAiLineBreakClass },  //white club suit
       
   901     { 0x266b, 0x266c, MLineBreaker::EAlLineBreakClass },  //beamed eighth notes
       
   902     { 0x266c, 0x266e, MLineBreaker::EAiLineBreakClass },  //beamed sixteenth notes
       
   903     { 0x266e, 0x266f, MLineBreaker::EAlLineBreakClass },  //music natural sign
       
   904     { 0x266f, 0x2670, MLineBreaker::EAiLineBreakClass },  //music sharp sign
       
   905     { 0x2670, 0x269d, MLineBreaker::EAlLineBreakClass },  //west syriac cross
       
   906     { 0x26a0, 0x26b3, MLineBreaker::EAlLineBreakClass },  //WARNING SIGN
       
   907     { 0x2701, 0x2705, MLineBreaker::EAlLineBreakClass },  //upper blade scissors
       
   908     { 0x2706, 0x270a, MLineBreaker::EAlLineBreakClass },  //telephone location sign
       
   909     { 0x270c, 0x2728, MLineBreaker::EAlLineBreakClass },  //victory hand
       
   910     { 0x2729, 0x274c, MLineBreaker::EAlLineBreakClass },  //stress outlined white star
       
   911     { 0x274d, 0x274e, MLineBreaker::EAlLineBreakClass },  //shadowed white circle
       
   912     { 0x274f, 0x2753, MLineBreaker::EAlLineBreakClass },  //lower right drop-shadowed white square
       
   913     { 0x2756, 0x2757, MLineBreaker::EAlLineBreakClass },  //black diamond minus white x
       
   914     { 0x2758, 0x275f, MLineBreaker::EAlLineBreakClass },  //light vertical bar
       
   915     { 0x2761, 0x2768, MLineBreaker::EAlLineBreakClass },  //curved stem paragraph sign ornament
       
   916     { 0x2768, 0x2769, MLineBreaker::EOpLineBreakClass },  //MEDIUM LEFT PARENTHESIS ORNAMENT
       
   917     { 0x2769, 0x276a, MLineBreaker::EClLineBreakClass },  //MEDIUM RIGHT PARENTHESIS ORNAMENT
       
   918     { 0x276a, 0x276b, MLineBreaker::EOpLineBreakClass },  //MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
       
   919     { 0x276b, 0x276c, MLineBreaker::EClLineBreakClass },  //MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
       
   920     { 0x276c, 0x276d, MLineBreaker::EOpLineBreakClass },  //MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
       
   921     { 0x276d, 0x276e, MLineBreaker::EClLineBreakClass },  //MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
       
   922     { 0x276e, 0x276f, MLineBreaker::EOpLineBreakClass },  //HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
       
   923     { 0x276f, 0x2770, MLineBreaker::EClLineBreakClass },  //HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
       
   924     { 0x2770, 0x2771, MLineBreaker::EOpLineBreakClass },  //HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
       
   925     { 0x2771, 0x2772, MLineBreaker::EClLineBreakClass },  //HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
       
   926     { 0x2772, 0x2773, MLineBreaker::EOpLineBreakClass },  //LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
       
   927     { 0x2773, 0x2774, MLineBreaker::EClLineBreakClass },  //LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
       
   928     { 0x2774, 0x2775, MLineBreaker::EOpLineBreakClass },  //MEDIUM LEFT CURLY BRACKET ORNAMENT
       
   929     { 0x2775, 0x2776, MLineBreaker::EClLineBreakClass },  //MEDIUM RIGHT CURLY BRACKET ORNAMENT
       
   930     { 0x2776, 0x2795, MLineBreaker::EAlLineBreakClass },  //dingbat negative circled digit one
       
   931     { 0x2798, 0x27b0, MLineBreaker::EAlLineBreakClass },  //heavy south east arrow
       
   932     { 0x27b1, 0x27bf, MLineBreaker::EAlLineBreakClass },  //notched upper right-shadowed white rightwards arrow
       
   933     { 0x27c0, 0x27c5, MLineBreaker::EAlLineBreakClass },  //THREE DIMENSIONAL ANGLE
       
   934     { 0x27c5, 0x27c6, MLineBreaker::EOpLineBreakClass },  //LEFT S-SHAPED BAG DELIMITER
       
   935     { 0x27c6, 0x27c7, MLineBreaker::EClLineBreakClass },  //RIGHT S-SHAPED BAG DELIMITER
       
   936     { 0x27c7, 0x27cb, MLineBreaker::EAlLineBreakClass },  //OR WITH DOT INSIDE
       
   937     { 0x27d0, 0x27e6, MLineBreaker::EAlLineBreakClass },  //WHITE DIAMOND WITH CENTRED DOT
       
   938     { 0x27e6, 0x27e7, MLineBreaker::EOpLineBreakClass },  //MATHEMATICAL LEFT WHITE SQUARE BRACKET
       
   939     { 0x27e7, 0x27e8, MLineBreaker::EClLineBreakClass },  //MATHEMATICAL RIGHT WHITE SQUARE BRACKET
       
   940     { 0x27e8, 0x27e9, MLineBreaker::EOpLineBreakClass },  //MATHEMATICAL LEFT ANGLE BRACKET
       
   941     { 0x27e9, 0x27ea, MLineBreaker::EClLineBreakClass },  //MATHEMATICAL RIGHT ANGLE BRACKET
       
   942     { 0x27ea, 0x27eb, MLineBreaker::EOpLineBreakClass },  //MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
       
   943     { 0x27eb, 0x27ec, MLineBreaker::EClLineBreakClass },  //MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
       
   944     { 0x27f0, 0x2983, MLineBreaker::EAlLineBreakClass },  //UPWARDS QUADRUPLE ARROW
       
   945     { 0x2983, 0x2984, MLineBreaker::EOpLineBreakClass },  //LEFT WHITE CURLY BRACKET
       
   946     { 0x2984, 0x2985, MLineBreaker::EClLineBreakClass },  //RIGHT WHITE CURLY BRACKET
       
   947     { 0x2985, 0x2986, MLineBreaker::EOpLineBreakClass },  //LEFT WHITE PARENTHESIS
       
   948     { 0x2986, 0x2987, MLineBreaker::EClLineBreakClass },  //RIGHT WHITE PARENTHESIS
       
   949     { 0x2987, 0x2988, MLineBreaker::EOpLineBreakClass },  //Z NOTATION LEFT IMAGE BRACKET
       
   950     { 0x2988, 0x2989, MLineBreaker::EClLineBreakClass },  //Z NOTATION RIGHT IMAGE BRACKET
       
   951     { 0x2989, 0x298a, MLineBreaker::EOpLineBreakClass },  //Z NOTATION LEFT BINDING BRACKET
       
   952     { 0x298a, 0x298b, MLineBreaker::EClLineBreakClass },  //Z NOTATION RIGHT BINDING BRACKET
       
   953     { 0x298b, 0x298c, MLineBreaker::EOpLineBreakClass },  //LEFT SQUARE BRACKET WITH UNDERBAR
       
   954     { 0x298c, 0x298d, MLineBreaker::EClLineBreakClass },  //RIGHT SQUARE BRACKET WITH UNDERBAR
       
   955     { 0x298d, 0x298e, MLineBreaker::EOpLineBreakClass },  //LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
       
   956     { 0x298e, 0x298f, MLineBreaker::EClLineBreakClass },  //RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
       
   957     { 0x298f, 0x2990, MLineBreaker::EOpLineBreakClass },  //LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
       
   958     { 0x2990, 0x2991, MLineBreaker::EClLineBreakClass },  //RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
       
   959     { 0x2991, 0x2992, MLineBreaker::EOpLineBreakClass },  //LEFT ANGLE BRACKET WITH DOT
       
   960     { 0x2992, 0x2993, MLineBreaker::EClLineBreakClass },  //RIGHT ANGLE BRACKET WITH DOT
       
   961     { 0x2993, 0x2994, MLineBreaker::EOpLineBreakClass },  //LEFT ARC LESS-THAN BRACKET
       
   962     { 0x2994, 0x2995, MLineBreaker::EClLineBreakClass },  //RIGHT ARC GREATER-THAN BRACKET
       
   963     { 0x2995, 0x2996, MLineBreaker::EOpLineBreakClass },  //DOUBLE LEFT ARC GREATER-THAN BRACKET
       
   964     { 0x2996, 0x2997, MLineBreaker::EClLineBreakClass },  //DOUBLE RIGHT ARC LESS-THAN BRACKET
       
   965     { 0x2997, 0x2998, MLineBreaker::EOpLineBreakClass },  //LEFT BLACK TORTOISE SHELL BRACKET
       
   966     { 0x2998, 0x2999, MLineBreaker::EClLineBreakClass },  //RIGHT BLACK TORTOISE SHELL BRACKET
       
   967     { 0x2999, 0x29d8, MLineBreaker::EAlLineBreakClass },  //DOTTED FENCE
       
   968     { 0x29d8, 0x29d9, MLineBreaker::EOpLineBreakClass },  //LEFT WIGGLY FENCE
       
   969     { 0x29d9, 0x29da, MLineBreaker::EClLineBreakClass },  //RIGHT WIGGLY FENCE
       
   970     { 0x29da, 0x29db, MLineBreaker::EOpLineBreakClass },  //LEFT DOUBLE WIGGLY FENCE
       
   971     { 0x29db, 0x29dc, MLineBreaker::EClLineBreakClass },  //RIGHT DOUBLE WIGGLY FENCE
       
   972     { 0x29dc, 0x29fc, MLineBreaker::EAlLineBreakClass },  //INCOMPLETE INFINITY
       
   973     { 0x29fc, 0x29fd, MLineBreaker::EOpLineBreakClass },  //LEFT-POINTING CURVED ANGLE BRACKET
       
   974     { 0x29fd, 0x29fe, MLineBreaker::EClLineBreakClass },  //RIGHT-POINTING CURVED ANGLE BRACKET
       
   975     { 0x29fe, 0x2b1b, MLineBreaker::EAlLineBreakClass },  //TINY
       
   976     { 0x2b20, 0x2b24, MLineBreaker::EAlLineBreakClass },  //WHITE PENTAGON
       
   977     { 0x2c00, 0x2c2f, MLineBreaker::EAlLineBreakClass },  //GLAGOLITIC CAPITAL LETTER AZU
       
   978     { 0x2c30, 0x2c5f, MLineBreaker::EAlLineBreakClass },  //GLAGOLITIC SMALL LETTER AZU
       
   979     { 0x2c60, 0x2c6d, MLineBreaker::EAlLineBreakClass },  //LATIN CAPITAL LETTER L WITH DOUBLE BAR
       
   980     { 0x2c74, 0x2c78, MLineBreaker::EAlLineBreakClass },  //LATIN SMALL LETTER V WITH CURL
       
   981     { 0x2c80, 0x2ceb, MLineBreaker::EAlLineBreakClass },  //COPTIC CAPITAL LETTER ALFA
       
   982     { 0x2cf9, 0x2cfd, MLineBreaker::EBaLineBreakClass },  //COPTIC OLD NUBIAN FULL STOP
       
   983     { 0x2cfd, 0x2cfe, MLineBreaker::EAlLineBreakClass },  //COPTIC FRACTION ONE HALF
       
   984     { 0x2cfe, 0x2d00, MLineBreaker::EBaLineBreakClass },  //COPTIC FULL STOP
       
   985     { 0x2d00, 0x2d26, MLineBreaker::EAlLineBreakClass },  //GEORGIAN SMALL LETTER AN
       
   986     { 0x2d30, 0x2d66, MLineBreaker::EAlLineBreakClass },  //TIFINAGH LETTER YA
       
   987     { 0x2d6f, 0x2d70, MLineBreaker::EAlLineBreakClass },  //TIFINAGH MODIFIER LETTER LABIALIZATION MARK
       
   988     { 0x2d80, 0x2d97, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE LOA
       
   989     { 0x2da0, 0x2da7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE SSA
       
   990     { 0x2da8, 0x2daf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE CCA
       
   991     { 0x2db0, 0x2db7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE ZZA
       
   992     { 0x2db8, 0x2dbf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE CCHA
       
   993     { 0x2dc0, 0x2dc7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE QYA
       
   994     { 0x2dc8, 0x2dcf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE KYA
       
   995     { 0x2dd0, 0x2dd7, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE XYA
       
   996     { 0x2dd8, 0x2ddf, MLineBreaker::EAlLineBreakClass },  //ETHIOPIC SYLLABLE GYA
       
   997     { 0x2e00, 0x2e0e, MLineBreaker::EQuLineBreakClass },  //RIGHT ANGLE SUBSTITUTION MARKER
       
   998     { 0x2e0e, 0x2e16, MLineBreaker::EBaLineBreakClass },  //EDITORIAL CORONIS
       
   999     { 0x2e16, 0x2e17, MLineBreaker::EAlLineBreakClass },  //DOTTED RIGHT-POINTING ANGLE
       
  1000     { 0x2e17, 0x2e18, MLineBreaker::EBaLineBreakClass },  //DOUBLE OBLIQUE HYPHEN
       
  1001     { 0x2e1c, 0x2e1e, MLineBreaker::EQuLineBreakClass },  //LEFT LOW PARAPHRASE BRACKET
       
  1002     { 0x2e80, 0x2e9a, MLineBreaker::EIdLineBreakClass },  //cjk radical repeat
       
  1003     { 0x2e9b, 0x2ef4, MLineBreaker::EIdLineBreakClass },  //cjk radical choke
       
  1004     { 0x2f00, 0x2fd6, MLineBreaker::EIdLineBreakClass },  //kangxi radical one
       
  1005     { 0x2ff0, 0x2ffc, MLineBreaker::EIdLineBreakClass },  //ideographic description character left to right
       
  1006     { 0x3000, 0x3001, MLineBreaker::EIdLineBreakClass },  //ideographic space
       
  1007     { 0x3001, 0x3003, MLineBreaker::EClLineBreakClass },  //ideographic comma
       
  1008     { 0x3003, 0x3005, MLineBreaker::EIdLineBreakClass },  //ditto mark
       
  1009     { 0x3005, 0x3006, MLineBreaker::ENsLineBreakClass },  //ideographic iteration mark
       
  1010     { 0x3006, 0x3008, MLineBreaker::EIdLineBreakClass },  //ideographic closing mark
       
  1011     { 0x3008, 0x3009, MLineBreaker::EOpLineBreakClass },  //left angle bracket
       
  1012     { 0x3009, 0x300a, MLineBreaker::EClLineBreakClass },  //right angle bracket
       
  1013     { 0x300a, 0x300b, MLineBreaker::EOpLineBreakClass },  //left double angle bracket
       
  1014     { 0x300b, 0x300c, MLineBreaker::EClLineBreakClass },  //right double angle bracket
       
  1015     { 0x300c, 0x300d, MLineBreaker::EOpLineBreakClass },  //left corner bracket
       
  1016     { 0x300d, 0x300e, MLineBreaker::EClLineBreakClass },  //right corner bracket
       
  1017     { 0x300e, 0x300f, MLineBreaker::EOpLineBreakClass },  //left white corner bracket
       
  1018     { 0x300f, 0x3010, MLineBreaker::EClLineBreakClass },  //right white corner bracket
       
  1019     { 0x3010, 0x3011, MLineBreaker::EOpLineBreakClass },  //left black lenticular bracket
       
  1020     { 0x3011, 0x3012, MLineBreaker::EClLineBreakClass },  //right black lenticular bracket
       
  1021     { 0x3012, 0x3014, MLineBreaker::EIdLineBreakClass },  //postal mark
       
  1022     { 0x3014, 0x3015, MLineBreaker::EOpLineBreakClass },  //left tortoise shell bracket
       
  1023     { 0x3015, 0x3016, MLineBreaker::EClLineBreakClass },  //right tortoise shell bracket
       
  1024     { 0x3016, 0x3017, MLineBreaker::EOpLineBreakClass },  //left white lenticular bracket
       
  1025     { 0x3017, 0x3018, MLineBreaker::EClLineBreakClass },  //right white lenticular bracket
       
  1026     { 0x3018, 0x3019, MLineBreaker::EOpLineBreakClass },  //left white tortoise shell bracket
       
  1027     { 0x3019, 0x301a, MLineBreaker::EClLineBreakClass },  //right white tortoise shell bracket
       
  1028     { 0x301a, 0x301b, MLineBreaker::EOpLineBreakClass },  //left white square bracket
       
  1029     { 0x301b, 0x301c, MLineBreaker::EClLineBreakClass },  //right white square bracket
       
  1030     { 0x301c, 0x301d, MLineBreaker::ENsLineBreakClass },  //wave dash
       
  1031     { 0x301d, 0x301e, MLineBreaker::EOpLineBreakClass },  //reversed double prime quotation mark
       
  1032     { 0x301e, 0x3020, MLineBreaker::EClLineBreakClass },  //double prime quotation mark
       
  1033     { 0x3020, 0x302a, MLineBreaker::EIdLineBreakClass },  //postal mark face
       
  1034     { 0x302a, 0x3030, MLineBreaker::ECmLineBreakClass },  //ideographic level tone mark
       
  1035     { 0x3030, 0x303b, MLineBreaker::EIdLineBreakClass },  //wavy dash
       
  1036     { 0x303b, 0x303d, MLineBreaker::ENsLineBreakClass },  //VERTICAL IDEOGRAPHIC ITERATION MARK
       
  1037     { 0x303d, 0x3040, MLineBreaker::EIdLineBreakClass },  //PART ALTERNATION MARK
       
  1038     { 0x3041, 0x3042, MLineBreaker::ENsLineBreakClass },  //hiragana letter small a
       
  1039     { 0x3042, 0x3043, MLineBreaker::EIdLineBreakClass },  //hiragana letter a
       
  1040     { 0x3043, 0x3044, MLineBreaker::ENsLineBreakClass },  //hiragana letter small i
       
  1041     { 0x3044, 0x3045, MLineBreaker::EIdLineBreakClass },  //hiragana letter i
       
  1042     { 0x3045, 0x3046, MLineBreaker::ENsLineBreakClass },  //hiragana letter small u
       
  1043     { 0x3046, 0x3047, MLineBreaker::EIdLineBreakClass },  //hiragana letter u
       
  1044     { 0x3047, 0x3048, MLineBreaker::ENsLineBreakClass },  //hiragana letter small e
       
  1045     { 0x3048, 0x3049, MLineBreaker::EIdLineBreakClass },  //hiragana letter e
       
  1046     { 0x3049, 0x304a, MLineBreaker::ENsLineBreakClass },  //hiragana letter small o
       
  1047     { 0x304a, 0x3063, MLineBreaker::EIdLineBreakClass },  //hiragana letter o
       
  1048     { 0x3063, 0x3064, MLineBreaker::ENsLineBreakClass },  //hiragana letter small tu
       
  1049     { 0x3064, 0x3083, MLineBreaker::EIdLineBreakClass },  //hiragana letter tu
       
  1050     { 0x3083, 0x3084, MLineBreaker::ENsLineBreakClass },  //hiragana letter small ya
       
  1051     { 0x3084, 0x3085, MLineBreaker::EIdLineBreakClass },  //hiragana letter ya
       
  1052     { 0x3085, 0x3086, MLineBreaker::ENsLineBreakClass },  //hiragana letter small yu
       
  1053     { 0x3086, 0x3087, MLineBreaker::EIdLineBreakClass },  //hiragana letter yu
       
  1054     { 0x3087, 0x3088, MLineBreaker::ENsLineBreakClass },  //hiragana letter small yo
       
  1055     { 0x3088, 0x308e, MLineBreaker::EIdLineBreakClass },  //hiragana letter yo
       
  1056     { 0x308e, 0x308f, MLineBreaker::ENsLineBreakClass },  //hiragana letter small wa
       
  1057     { 0x308f, 0x3095, MLineBreaker::EIdLineBreakClass },  //hiragana letter wa
       
  1058     { 0x3095, 0x3097, MLineBreaker::ENsLineBreakClass },  //HIRAGANA LETTER SMALL KA
       
  1059     { 0x3099, 0x309b, MLineBreaker::ECmLineBreakClass },  //combining katakana-hiragana voiced sound mark
       
  1060     { 0x309b, 0x309f, MLineBreaker::ENsLineBreakClass },  //katakana-hiragana voiced sound mark
       
  1061     { 0x309f, 0x30a0, MLineBreaker::EIdLineBreakClass },  //HIRAGANA DIGRAPH YORI
       
  1062     { 0x30a0, 0x30a1, MLineBreaker::ENsLineBreakClass },  //KATAKANA-HIRAGANA DOUBLE HYPHEN
       
  1063     { 0x30a1, 0x30a2, MLineBreaker::ENsLineBreakClass },  //katakana letter small a
       
  1064     { 0x30a2, 0x30a3, MLineBreaker::EIdLineBreakClass },  //katakana letter a
       
  1065     { 0x30a3, 0x30a4, MLineBreaker::ENsLineBreakClass },  //katakana letter small i
       
  1066     { 0x30a4, 0x30a5, MLineBreaker::EIdLineBreakClass },  //katakana letter i
       
  1067     { 0x30a5, 0x30a6, MLineBreaker::ENsLineBreakClass },  //katakana letter small u
       
  1068     { 0x30a6, 0x30a7, MLineBreaker::EIdLineBreakClass },  //katakana letter u
       
  1069     { 0x30a7, 0x30a8, MLineBreaker::ENsLineBreakClass },  //katakana letter small e
       
  1070     { 0x30a8, 0x30a9, MLineBreaker::EIdLineBreakClass },  //katakana letter e
       
  1071     { 0x30a9, 0x30aa, MLineBreaker::ENsLineBreakClass },  //katakana letter small o
       
  1072     { 0x30aa, 0x30c3, MLineBreaker::EIdLineBreakClass },  //katakana letter o
       
  1073     { 0x30c3, 0x30c4, MLineBreaker::ENsLineBreakClass },  //katakana letter small tu
       
  1074     { 0x30c4, 0x30e3, MLineBreaker::EIdLineBreakClass },  //katakana letter tu
       
  1075     { 0x30e3, 0x30e4, MLineBreaker::ENsLineBreakClass },  //katakana letter small ya
       
  1076     { 0x30e4, 0x30e5, MLineBreaker::EIdLineBreakClass },  //katakana letter ya
       
  1077     { 0x30e5, 0x30e6, MLineBreaker::ENsLineBreakClass },  //katakana letter small yu
       
  1078     { 0x30e6, 0x30e7, MLineBreaker::EIdLineBreakClass },  //katakana letter yu
       
  1079     { 0x30e7, 0x30e8, MLineBreaker::ENsLineBreakClass },  //katakana letter small yo
       
  1080     { 0x30e8, 0x30ee, MLineBreaker::EIdLineBreakClass },  //katakana letter yo
       
  1081     { 0x30ee, 0x30ef, MLineBreaker::ENsLineBreakClass },  //katakana letter small wa
       
  1082     { 0x30ef, 0x30f5, MLineBreaker::EIdLineBreakClass },  //katakana letter wa
       
  1083     { 0x30f5, 0x30f7, MLineBreaker::ENsLineBreakClass },  //katakana letter small ka
       
  1084     { 0x30f7, 0x30fb, MLineBreaker::EIdLineBreakClass },  //katakana letter va
       
  1085     { 0x30fb, 0x30fc, MLineBreaker::ENsLineBreakClass },  //katakana middle dot
       
  1086     { 0x30fc, 0x30fd, MLineBreaker::EIdLineBreakClass },  //katakana-hiragana prolonged sound mark
       
  1087     { 0x30fd, 0x30fe, MLineBreaker::ENsLineBreakClass },  //katakana iteration mark
       
  1088     { 0x30fe, 0x30ff, MLineBreaker::EIdLineBreakClass },  //katakana voiced iteration mark
       
  1089     { 0x30ff, 0x3100, MLineBreaker::EIdLineBreakClass },  //KATAKANA DIGRAPH KOTO
       
  1090     { 0x3105, 0x312d, MLineBreaker::EIdLineBreakClass },  //bopomofo letter b
       
  1091     { 0x3131, 0x318f, MLineBreaker::EIdLineBreakClass },  //hangul letter kiyeok
       
  1092     { 0x3190, 0x31b8, MLineBreaker::EIdLineBreakClass },  //ideographic annotation linking mark
       
  1093     { 0x31c0, 0x31d0, MLineBreaker::EIdLineBreakClass },  //CJK STROKE T
       
  1094     { 0x31f0, 0x3200, MLineBreaker::ENsLineBreakClass },  //KATAKANA LETTER SMALL KU
       
  1095     { 0x3200, 0x321f, MLineBreaker::EIdLineBreakClass },  //parenthesized hangul kiyeok
       
  1096     { 0x3220, 0x3244, MLineBreaker::EIdLineBreakClass },  //parenthesized ideograph one
       
  1097     { 0x3250, 0x32ff, MLineBreaker::EIdLineBreakClass },  //PARTNERSHIP SIGN
       
  1098     { 0x3300, 0x4db6, MLineBreaker::EIdLineBreakClass },  //square apaato
       
  1099     { 0x4dc0, 0x4e00, MLineBreaker::EAlLineBreakClass },  //HEXAGRAM FOR THE CREATIVE HEAVEN
       
  1100     { 0x4e00, 0x9fbb, MLineBreaker::EIdLineBreakClass },  //<cjk ideograph,
       
  1101     { 0xa000, 0xa48d, MLineBreaker::EIdLineBreakClass },  //yi syllable it
       
  1102     { 0xa490, 0xa4c6, MLineBreaker::EIdLineBreakClass },  //yi radical qot
       
  1103     { 0xa4c6, 0xa4c7, MLineBreaker::EIdLineBreakClass },  //yi radical ke
       
  1104     { 0xa700, 0xa71b, MLineBreaker::EAlLineBreakClass },  //MODIFIER LETTER CHINESE TONE YIN PING
       
  1105     { 0xa720, 0xa722, MLineBreaker::EAlLineBreakClass },  //MODIFIER LETTER STRESS AND HIGH TONE
       
  1106     { 0xa800, 0xa802, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER A
       
  1107     { 0xa802, 0xa803, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI SIGN DVISVARA
       
  1108     { 0xa803, 0xa806, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER U
       
  1109     { 0xa806, 0xa807, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI SIGN HASANTA
       
  1110     { 0xa807, 0xa80b, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER KO
       
  1111     { 0xa80b, 0xa80c, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI SIGN ANUSVARA
       
  1112     { 0xa80c, 0xa823, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI LETTER CO
       
  1113     { 0xa823, 0xa828, MLineBreaker::ECmLineBreakClass },  //SYLOTI NAGRI VOWEL SIGN A
       
  1114     { 0xa828, 0xa82c, MLineBreaker::EAlLineBreakClass },  //SYLOTI NAGRI POETRY MARK-1
       
  1115     { 0xa840, 0xa874, MLineBreaker::EAlLineBreakClass },  //PHAGS-PA LETTER KA
       
  1116     { 0xa874, 0xa876, MLineBreaker::EBbLineBreakClass },  //PHAGS-PA SINGLE HEAD MARK
       
  1117     { 0xa876, 0xa878, MLineBreaker::EExLineBreakClass },  //PHAGS-PA MARK SHAD
       
  1118     { 0xac00, 0xd7a4, MLineBreaker::EIdLineBreakClass },  //<hangul syllable,
       
  1119     { 0xd800, 0xe000, MLineBreaker::ESgLineBreakClass },  //<non private use high surrogate,
       
  1120     { 0xe000, 0xf900, MLineBreaker::EAiLineBreakClass },  //<private use,
       
  1121     { 0xf900, 0xfa2e, MLineBreaker::EIdLineBreakClass },  //cjk compatibility ideograph-f900
       
  1122     { 0xfa30, 0xfa6b, MLineBreaker::EIdLineBreakClass },  //CJK COMPATIBILITY IDEOGRAPH-FA30
       
  1123     { 0xfa70, 0xfada, MLineBreaker::EIdLineBreakClass },  //CJK COMPATIBILITY IDEOGRAPH-FA70
       
  1124     { 0xfb00, 0xfb07, MLineBreaker::EAlLineBreakClass },  //latin small ligature ff
       
  1125     { 0xfb13, 0xfb18, MLineBreaker::EAlLineBreakClass },  //armenian small ligature men now
       
  1126     { 0xfb1d, 0xfb1e, MLineBreaker::EAlLineBreakClass },  //hebrew letter yod with hiriq
       
  1127     { 0xfb1e, 0xfb1f, MLineBreaker::ECmLineBreakClass },  //hebrew point judeo-spanish varika
       
  1128     { 0xfb1f, 0xfb37, MLineBreaker::EAlLineBreakClass },  //hebrew ligature yiddish yod yod patah
       
  1129     { 0xfb38, 0xfb3d, MLineBreaker::EAlLineBreakClass },  //hebrew letter tet with dagesh
       
  1130     { 0xfb3e, 0xfb3f, MLineBreaker::EAlLineBreakClass },  //hebrew letter mem with dagesh
       
  1131     { 0xfb40, 0xfb42, MLineBreaker::EAlLineBreakClass },  //hebrew letter nun with dagesh
       
  1132     { 0xfb43, 0xfb45, MLineBreaker::EAlLineBreakClass },  //hebrew letter final pe with dagesh
       
  1133     { 0xfb46, 0xfbb2, MLineBreaker::EAlLineBreakClass },  //hebrew letter tsadi with dagesh
       
  1134     { 0xfbd3, 0xfd3e, MLineBreaker::EAlLineBreakClass },  //arabic letter ng isolated form
       
  1135     { 0xfd3e, 0xfd3f, MLineBreaker::EOpLineBreakClass },  //ornate left parenthesis
       
  1136     { 0xfd3f, 0xfd40, MLineBreaker::EClLineBreakClass },  //ornate right parenthesis
       
  1137     { 0xfd50, 0xfd90, MLineBreaker::EAlLineBreakClass },  //arabic ligature teh with jeem with meem initial form
       
  1138     { 0xfd92, 0xfdc8, MLineBreaker::EAlLineBreakClass },  //arabic ligature meem with jeem with khah initial form
       
  1139     { 0xfdf0, 0xfdfc, MLineBreaker::EAlLineBreakClass },  //arabic ligature salla used as koranic stop sign isolated form
       
  1140     { 0xfdfc, 0xfdfd, MLineBreaker::EPoLineBreakClass },  //RIAL SIGN
       
  1141     { 0xfdfd, 0xfdfe, MLineBreaker::EAlLineBreakClass },  //ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
       
  1142     { 0xfe00, 0xfe10, MLineBreaker::ECmLineBreakClass },  //VARIATION SELECTOR-1
       
  1143     { 0xfe10, 0xfe11, MLineBreaker::EIsLineBreakClass },  //PRESENTATION FORM FOR VERTICAL COMMA
       
  1144     { 0xfe11, 0xfe13, MLineBreaker::EClLineBreakClass },  //PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
       
  1145     { 0xfe13, 0xfe15, MLineBreaker::EIsLineBreakClass },  //PRESENTATION FORM FOR VERTICAL COLON
       
  1146     { 0xfe15, 0xfe17, MLineBreaker::EExLineBreakClass },  //PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
       
  1147     { 0xfe17, 0xfe18, MLineBreaker::EOpLineBreakClass },  //PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
       
  1148     { 0xfe18, 0xfe19, MLineBreaker::EClLineBreakClass },  //PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
       
  1149     { 0xfe19, 0xfe1a, MLineBreaker::EInLineBreakClass },  //PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
       
  1150     { 0xfe20, 0xfe24, MLineBreaker::ECmLineBreakClass },  //combining ligature left half
       
  1151     { 0xfe30, 0xfe35, MLineBreaker::EIdLineBreakClass },  //presentation form for vertical two dot leader
       
  1152     { 0xfe35, 0xfe36, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left parenthesis
       
  1153     { 0xfe36, 0xfe37, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right parenthesis
       
  1154     { 0xfe37, 0xfe38, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left curly bracket
       
  1155     { 0xfe38, 0xfe39, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right curly bracket
       
  1156     { 0xfe39, 0xfe3a, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left tortoise shell bracket
       
  1157     { 0xfe3a, 0xfe3b, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right tortoise shell bracket
       
  1158     { 0xfe3b, 0xfe3c, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left black lenticular bracket
       
  1159     { 0xfe3c, 0xfe3d, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right black lenticular bracket
       
  1160     { 0xfe3d, 0xfe3e, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left double angle bracket
       
  1161     { 0xfe3e, 0xfe3f, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right double angle bracket
       
  1162     { 0xfe3f, 0xfe40, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left angle bracket
       
  1163     { 0xfe40, 0xfe41, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right angle bracket
       
  1164     { 0xfe41, 0xfe42, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left corner bracket
       
  1165     { 0xfe42, 0xfe43, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right corner bracket
       
  1166     { 0xfe43, 0xfe44, MLineBreaker::EOpLineBreakClass },  //presentation form for vertical left white corner bracket
       
  1167     { 0xfe44, 0xfe45, MLineBreaker::EClLineBreakClass },  //presentation form for vertical right white corner bracket
       
  1168     { 0xfe45, 0xfe47, MLineBreaker::EIdLineBreakClass },  //SESAME DOT
       
  1169     { 0xfe47, 0xfe48, MLineBreaker::EOpLineBreakClass },  //PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
       
  1170     { 0xfe48, 0xfe49, MLineBreaker::EClLineBreakClass },  //PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
       
  1171     { 0xfe49, 0xfe50, MLineBreaker::EIdLineBreakClass },  //dashed overline
       
  1172     { 0xfe50, 0xfe51, MLineBreaker::EClLineBreakClass },  //small comma
       
  1173     { 0xfe51, 0xfe52, MLineBreaker::EIdLineBreakClass },  //small ideographic comma
       
  1174     { 0xfe52, 0xfe53, MLineBreaker::EClLineBreakClass },  //small full stop
       
  1175     { 0xfe54, 0xfe56, MLineBreaker::ENsLineBreakClass },  //small semicolon
       
  1176     { 0xfe56, 0xfe58, MLineBreaker::EExLineBreakClass },  //small question mark
       
  1177     { 0xfe58, 0xfe59, MLineBreaker::EIdLineBreakClass },  //small em dash
       
  1178     { 0xfe59, 0xfe5a, MLineBreaker::EOpLineBreakClass },  //small left parenthesis
       
  1179     { 0xfe5a, 0xfe5b, MLineBreaker::EClLineBreakClass },  //small right parenthesis
       
  1180     { 0xfe5b, 0xfe5c, MLineBreaker::EOpLineBreakClass },  //small left curly bracket
       
  1181     { 0xfe5c, 0xfe5d, MLineBreaker::EClLineBreakClass },  //small right curly bracket
       
  1182     { 0xfe5d, 0xfe5e, MLineBreaker::EOpLineBreakClass },  //small left tortoise shell bracket
       
  1183     { 0xfe5e, 0xfe5f, MLineBreaker::EClLineBreakClass },  //small right tortoise shell bracket
       
  1184     { 0xfe5f, 0xfe67, MLineBreaker::EIdLineBreakClass },  //small number sign
       
  1185     { 0xfe68, 0xfe69, MLineBreaker::EIdLineBreakClass },  //small reverse solidus
       
  1186     { 0xfe69, 0xfe6a, MLineBreaker::EPrLineBreakClass },  //small dollar sign
       
  1187     { 0xfe6a, 0xfe6b, MLineBreaker::EPoLineBreakClass },  //small percent sign
       
  1188     { 0xfe6b, 0xfe6c, MLineBreaker::EAlLineBreakClass },  //small commercial at
       
  1189     { 0xfe70, 0xfe74, MLineBreaker::EAlLineBreakClass },  //arabic fathatan isolated form
       
  1190     { 0xfe74, 0xfe75, MLineBreaker::EAlLineBreakClass },  //arabic kasratan isolated form
       
  1191     { 0xfe76, 0xfefd, MLineBreaker::EAlLineBreakClass },  //arabic fatha isolated form
       
  1192     { 0xfeff, 0xff00, MLineBreaker::EGlLineBreakClass },  //zero width no-break space
       
  1193     { 0xff01, 0xff02, MLineBreaker::EExLineBreakClass },  //fullwidth exclamation mark
       
  1194     { 0xff02, 0xff04, MLineBreaker::EIdLineBreakClass },  //fullwidth quotation mark
       
  1195     { 0xff04, 0xff05, MLineBreaker::EPrLineBreakClass },  //fullwidth dollar sign
       
  1196     { 0xff05, 0xff06, MLineBreaker::EPoLineBreakClass },  //fullwidth percent sign
       
  1197     { 0xff06, 0xff08, MLineBreaker::EIdLineBreakClass },  //fullwidth ampersand
       
  1198     { 0xff08, 0xff09, MLineBreaker::EOpLineBreakClass },  //fullwidth left parenthesis
       
  1199     { 0xff09, 0xff0a, MLineBreaker::EClLineBreakClass },  //fullwidth right parenthesis
       
  1200     { 0xff0a, 0xff0c, MLineBreaker::EIdLineBreakClass },  //fullwidth asterisk
       
  1201     { 0xff0c, 0xff0d, MLineBreaker::EClLineBreakClass },  //fullwidth comma
       
  1202     { 0xff0d, 0xff0e, MLineBreaker::EIdLineBreakClass },  //fullwidth hyphen-minus
       
  1203     { 0xff0e, 0xff0f, MLineBreaker::EClLineBreakClass },  //fullwidth full stop
       
  1204     { 0xff0f, 0xff1a, MLineBreaker::EIdLineBreakClass },  //fullwidth solidus
       
  1205     { 0xff1a, 0xff1c, MLineBreaker::ENsLineBreakClass },  //fullwidth colon
       
  1206     { 0xff1c, 0xff1f, MLineBreaker::EIdLineBreakClass },  //fullwidth less-than sign
       
  1207     { 0xff1f, 0xff20, MLineBreaker::EExLineBreakClass },  //fullwidth question mark
       
  1208     { 0xff20, 0xff3b, MLineBreaker::EIdLineBreakClass },  //fullwidth commercial at
       
  1209     { 0xff3b, 0xff3c, MLineBreaker::EOpLineBreakClass },  //fullwidth left square bracket
       
  1210     { 0xff3c, 0xff3d, MLineBreaker::EIdLineBreakClass },  //fullwidth reverse solidus
       
  1211     { 0xff3d, 0xff3e, MLineBreaker::EClLineBreakClass },  //fullwidth right square bracket
       
  1212     { 0xff3e, 0xff5b, MLineBreaker::EIdLineBreakClass },  //fullwidth circumflex accent
       
  1213     { 0xff5b, 0xff5c, MLineBreaker::EOpLineBreakClass },  //fullwidth left curly bracket
       
  1214     { 0xff5c, 0xff5d, MLineBreaker::EIdLineBreakClass },  //fullwidth vertical line
       
  1215     { 0xff5d, 0xff5e, MLineBreaker::EClLineBreakClass },  //fullwidth right curly bracket
       
  1216     { 0xff5e, 0xff5f, MLineBreaker::EIdLineBreakClass },  //fullwidth tilde
       
  1217     { 0xff5f, 0xff60, MLineBreaker::EOpLineBreakClass },  //FULLWIDTH LEFT WHITE PARENTHESIS
       
  1218     { 0xff60, 0xff61, MLineBreaker::EClLineBreakClass },  //FULLWIDTH RIGHT WHITE PARENTHESIS
       
  1219     { 0xff61, 0xff62, MLineBreaker::EClLineBreakClass },  //halfwidth ideographic full stop
       
  1220     { 0xff62, 0xff63, MLineBreaker::EOpLineBreakClass },  //halfwidth left corner bracket
       
  1221     { 0xff63, 0xff65, MLineBreaker::EClLineBreakClass },  //halfwidth right corner bracket
       
  1222     { 0xff65, 0xff66, MLineBreaker::ENsLineBreakClass },  //halfwidth katakana middle dot
       
  1223     { 0xff66, 0xff67, MLineBreaker::EAlLineBreakClass },  //halfwidth katakana letter wo
       
  1224     { 0xff67, 0xff71, MLineBreaker::ENsLineBreakClass },  //halfwidth katakana letter small a
       
  1225     { 0xff71, 0xff9e, MLineBreaker::EAlLineBreakClass },  //halfwidth katakana letter a
       
  1226     { 0xff9e, 0xffa0, MLineBreaker::ENsLineBreakClass },  //halfwidth katakana voiced sound mark
       
  1227     { 0xffa0, 0xffbf, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul filler
       
  1228     { 0xffc2, 0xffc8, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter a
       
  1229     { 0xffca, 0xffd0, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter yeo
       
  1230     { 0xffd2, 0xffd8, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter yo
       
  1231     { 0xffda, 0xffdd, MLineBreaker::EAlLineBreakClass },  //halfwidth hangul letter eu
       
  1232     { 0xffe0, 0xffe1, MLineBreaker::EPoLineBreakClass },  //fullwidth cent sign
       
  1233     { 0xffe1, 0xffe2, MLineBreaker::EPrLineBreakClass },  //fullwidth pound sign
       
  1234     { 0xffe2, 0xffe5, MLineBreaker::EIdLineBreakClass },  //fullwidth not sign
       
  1235     { 0xffe5, 0xffe7, MLineBreaker::EPrLineBreakClass },  //fullwidth yen sign
       
  1236     { 0xffe8, 0xffef, MLineBreaker::EAlLineBreakClass },  //halfwidth forms light vertical
       
  1237     { 0xfff9, 0xfffc, MLineBreaker::ECmLineBreakClass },  //interlinear annotation anchor
       
  1238     { 0xfffc, 0xfffd, MLineBreaker::ECbLineBreakClass },  //object replacement character
       
  1239     { 0xfffd, 0xfffe, MLineBreaker::EAiLineBreakClass },  //replacement character
       
  1240     { 0x10000, 0x1000c, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B008 A
       
  1241     { 0x1000d, 0x10027, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B036 JO
       
  1242     { 0x10028, 0x1003b, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B060 RA
       
  1243     { 0x1003c, 0x1003e, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B017 ZA
       
  1244     { 0x1003f, 0x1004e, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYLLABLE B020 ZO
       
  1245     { 0x10050, 0x1005e, MLineBreaker::EAlLineBreakClass },  //LINEAR B SYMBOL B018
       
  1246     { 0x10080, 0x100fb, MLineBreaker::EAlLineBreakClass },  //LINEAR B IDEOGRAM B100 MAN
       
  1247     { 0x10100, 0x10103, MLineBreaker::EBaLineBreakClass },  //AEGEAN WORD SEPARATOR LINE
       
  1248     { 0x10107, 0x10134, MLineBreaker::EAlLineBreakClass },  //AEGEAN NUMBER ONE
       
  1249     { 0x10137, 0x1018b, MLineBreaker::EAlLineBreakClass },  //AEGEAN WEIGHT BASE UNIT
       
  1250     { 0x10300, 0x1031f, MLineBreaker::EAlLineBreakClass },  //OLD ITALIC LETTER A
       
  1251     { 0x10320, 0x10324, MLineBreaker::EAlLineBreakClass },  //OLD ITALIC NUMERAL ONE
       
  1252     { 0x10330, 0x1034b, MLineBreaker::EAlLineBreakClass },  //GOTHIC LETTER AHSA
       
  1253     { 0x10380, 0x1039e, MLineBreaker::EAlLineBreakClass },  //UGARITIC LETTER ALPA
       
  1254     { 0x1039f, 0x103a0, MLineBreaker::EBaLineBreakClass },  //UGARITIC WORD DIVIDER
       
  1255     { 0x103a0, 0x103c4, MLineBreaker::EAlLineBreakClass },  //OLD PERSIAN SIGN A
       
  1256     { 0x103c8, 0x103d0, MLineBreaker::EAlLineBreakClass },  //OLD PERSIAN SIGN AURAMAZDAA
       
  1257     { 0x103d0, 0x103d1, MLineBreaker::EBaLineBreakClass },  //OLD PERSIAN WORD DIVIDER
       
  1258     { 0x103d1, 0x103d6, MLineBreaker::EAlLineBreakClass },  //OLD PERSIAN NUMBER ONE
       
  1259     { 0x10400, 0x1049e, MLineBreaker::EAlLineBreakClass },  //DESERET CAPITAL LETTER LONG I
       
  1260     { 0x104a0, 0x104aa, MLineBreaker::ENuLineBreakClass },  //OSMANYA DIGIT ZERO
       
  1261     { 0x10800, 0x10806, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE A
       
  1262     { 0x10808, 0x10809, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE JO
       
  1263     { 0x1080a, 0x10836, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE KA
       
  1264     { 0x10837, 0x10839, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE XA
       
  1265     { 0x1083c, 0x1083d, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE ZA
       
  1266     { 0x1083f, 0x10840, MLineBreaker::EAlLineBreakClass },  //CYPRIOT SYLLABLE ZO
       
  1267     { 0x10900, 0x1091a, MLineBreaker::EAlLineBreakClass },  //PHOENICIAN LETTER ALF
       
  1268     { 0x1091f, 0x10920, MLineBreaker::EBaLineBreakClass },  //PHOENICIAN WORD SEPARATOR
       
  1269     { 0x10a00, 0x10a01, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER A
       
  1270     { 0x10a01, 0x10a04, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VOWEL SIGN I
       
  1271     { 0x10a05, 0x10a07, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VOWEL SIGN E
       
  1272     { 0x10a0c, 0x10a10, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VOWEL LENGTH MARK
       
  1273     { 0x10a10, 0x10a14, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER KA
       
  1274     { 0x10a15, 0x10a18, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER CA
       
  1275     { 0x10a19, 0x10a34, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI LETTER NYA
       
  1276     { 0x10a38, 0x10a3b, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI SIGN BAR ABOVE
       
  1277     { 0x10a3f, 0x10a40, MLineBreaker::ECmLineBreakClass },  //KHAROSHTHI VIRAMA
       
  1278     { 0x10a40, 0x10a48, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI DIGIT ONE
       
  1279     { 0x10a50, 0x10a58, MLineBreaker::EBaLineBreakClass },  //KHAROSHTHI PUNCTUATION DOT
       
  1280     { 0x10a58, 0x10a59, MLineBreaker::EAlLineBreakClass },  //KHAROSHTHI PUNCTUATION LINES
       
  1281     { 0x12000, 0x1236f, MLineBreaker::EAlLineBreakClass },  //CUNEIFORM SIGN A
       
  1282     { 0x12400, 0x12463, MLineBreaker::EAlLineBreakClass },  //CUNEIFORM NUMERIC SIGN TWO ASH
       
  1283     { 0x12470, 0x12474, MLineBreaker::EBaLineBreakClass },  //CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
       
  1284     { 0x1d000, 0x1d0f6, MLineBreaker::EAlLineBreakClass },  //BYZANTINE MUSICAL SYMBOL PSILI
       
  1285     { 0x1d100, 0x1d127, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL SINGLE BARLINE
       
  1286     { 0x1d12a, 0x1d165, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL DOUBLE SHARP
       
  1287     { 0x1d165, 0x1d16a, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING STEM
       
  1288     { 0x1d16a, 0x1d16d, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL FINGERED TREMOLO-1
       
  1289     { 0x1d16d, 0x1d183, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING AUGMENTATION DOT
       
  1290     { 0x1d183, 0x1d185, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL ARPEGGIATO UP
       
  1291     { 0x1d185, 0x1d18c, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING DOIT
       
  1292     { 0x1d18c, 0x1d1aa, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL RINFORZANDO
       
  1293     { 0x1d1aa, 0x1d1ae, MLineBreaker::ECmLineBreakClass },  //MUSICAL SYMBOL COMBINING DOWN BOW
       
  1294     { 0x1d1ae, 0x1d1de, MLineBreaker::EAlLineBreakClass },  //MUSICAL SYMBOL PEDAL MARK
       
  1295     { 0x1d200, 0x1d242, MLineBreaker::EAlLineBreakClass },  //GREEK VOCAL NOTATION SYMBOL-1
       
  1296     { 0x1d242, 0x1d245, MLineBreaker::ECmLineBreakClass },  //COMBINING GREEK MUSICAL TRISEME
       
  1297     { 0x1d245, 0x1d246, MLineBreaker::EAlLineBreakClass },  //GREEK MUSICAL LEIMMA
       
  1298     { 0x1d300, 0x1d357, MLineBreaker::EAlLineBreakClass },  //MONOGRAM FOR EARTH
       
  1299     { 0x1d360, 0x1d372, MLineBreaker::EAlLineBreakClass },  //COUNTING ROD UNIT DIGIT ONE
       
  1300     { 0x1d400, 0x1d455, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL BOLD CAPITAL A
       
  1301     { 0x1d456, 0x1d49d, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL ITALIC SMALL I
       
  1302     { 0x1d49e, 0x1d4a0, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL C
       
  1303     { 0x1d4a2, 0x1d4a3, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL G
       
  1304     { 0x1d4a5, 0x1d4a7, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL J
       
  1305     { 0x1d4a9, 0x1d4ad, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL N
       
  1306     { 0x1d4ae, 0x1d4ba, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT CAPITAL S
       
  1307     { 0x1d4bb, 0x1d4bc, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT SMALL F
       
  1308     { 0x1d4bd, 0x1d4c4, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT SMALL H
       
  1309     { 0x1d4c5, 0x1d506, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL SCRIPT SMALL P
       
  1310     { 0x1d507, 0x1d50b, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR CAPITAL D
       
  1311     { 0x1d50d, 0x1d515, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR CAPITAL J
       
  1312     { 0x1d516, 0x1d51d, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR CAPITAL S
       
  1313     { 0x1d51e, 0x1d53a, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL FRAKTUR SMALL A
       
  1314     { 0x1d53b, 0x1d53f, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL D
       
  1315     { 0x1d540, 0x1d545, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL I
       
  1316     { 0x1d546, 0x1d547, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL O
       
  1317     { 0x1d54a, 0x1d551, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK CAPITAL S
       
  1318     { 0x1d552, 0x1d6a6, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL DOUBLE-STRUCK SMALL A
       
  1319     { 0x1d6a8, 0x1d7cc, MLineBreaker::EAlLineBreakClass },  //MATHEMATICAL BOLD CAPITAL ALPHA
       
  1320     { 0x1d7ce, 0x1d800, MLineBreaker::ENuLineBreakClass },  //MATHEMATICAL BOLD DIGIT ZERO
       
  1321     { 0x20000, 0x2a6d6, MLineBreaker::EIdLineBreakClass },  //<CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
       
  1322     { 0x2f800, 0x2fa1e, MLineBreaker::EIdLineBreakClass },  //CJK COMPATIBILITY IDEOGRAPH-2F800
       
  1323     { 0xe0001, 0xe0002, MLineBreaker::ECmLineBreakClass },  //LANGUAGE TAG
       
  1324     { 0xe0020, 0xe0080, MLineBreaker::ECmLineBreakClass },  //TAG SPACE
       
  1325     { 0xe0100, 0xe01f0, MLineBreaker::ECmLineBreakClass },  //VARIATION SELECTOR-17
       
  1326     { 0xf0000, 0xffffd, MLineBreaker::EXxLineBreakClass },  //<Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
       
  1327     { 0x100000, 0x10fffd, MLineBreaker::EXxLineBreakClass },  //<Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
       
  1328 	};
       
  1329 
       
  1330 static const TInt TheLineBreakRanges = sizeof(TheLineBreakRangeTable) / sizeof(TheLineBreakRangeTable[0]);
       
  1331 
       
  1332 void TestLineBreakTables(void)
       
  1333 	{
       
  1334 #ifdef _DEBUG
       
  1335 	TUint prev_end = 0;
       
  1336 	for (int i = 0; i < TheLineBreakRanges; i++)
       
  1337 		{
       
  1338 		const TLineBreakRange& r = TheLineBreakRangeTable[i];
       
  1339 		if (r.iStart >= r.iEnd || r.iClass >= MLineBreaker::ELineBreakClasses || r.iStart < prev_end)
       
  1340 			Panic(ELineBreakPanic_BadTable);
       
  1341 		prev_end = r.iEnd;
       
  1342 		}
       
  1343 #endif
       
  1344 	}
       
  1345 
       
  1346 TUint TLineBreakClassCache::LineBreakClass(TUint aChar)
       
  1347 	{
       
  1348 	if (aChar >= iStart && aChar < iEnd)
       
  1349 		return iClass;
       
  1350 	TUint new_start, new_end;
       
  1351 	TUint new_class = iBreaker.LineBreakClass(aChar,new_start,new_end);
       
  1352 	if (new_start < new_end - 1)
       
  1353 		{
       
  1354 		iStart = new_start;
       
  1355 		iEnd = new_end;
       
  1356 		iClass = new_class;
       
  1357 		}
       
  1358 	return new_class;
       
  1359 	}
       
  1360 
       
  1361 EXPORT_C TBool MLineBreaker::LineBreakPossible(
       
  1362 	TUint aPrevClass, TUint aNextClass, TBool aHaveSpaces) const
       
  1363 /** Returns whether line breaks are legal between a character of line breaking 
       
  1364 class aPrevClass and aNextClass, with intervening spaces or not as determined 
       
  1365 by aHaveSpaces. 
       
  1366 
       
  1367 @param aPrevClass The class before the potential line break.
       
  1368 @param aNextClass The class after the potential line break.
       
  1369 @param aHaveSpaces Whether spaces separate the characters.
       
  1370 @return ETrue if and only if a line break is legal in the situation described. */
       
  1371 	{
       
  1372 	if (aPrevClass >= ELineBreakClasses || aNextClass >= ELineBreakClasses)
       
  1373 		return FALSE;
       
  1374 	const TLineBreakRule& rule = TheLineBreakRuleTable[aPrevClass];
       
  1375 	TUint flag = 1 << aNextClass;
       
  1376 	if (rule.iForbid & flag)
       
  1377 		return FALSE;
       
  1378 	return aHaveSpaces || (rule.iAllow & flag);
       
  1379 	}
       
  1380 
       
  1381 EXPORT_C TUint MLineBreaker::LineBreakClass(TUint aCode,TUint& aRangeStart,TUint& aRangeEnd) const
       
  1382 /** Converts Unicode character into line breaking class. 
       
  1383 
       
  1384 @param aCode Input Unicode value.
       
  1385 @param aRangeStart Returns the start of the contiguous range of characters 
       
  1386 including aCode that have the returned line breaking class.
       
  1387 @param aRangeEnd Returns the end of the contiguous range of characters including 
       
  1388 aCode that have the returned line breaking class.
       
  1389 @return The line breaking class for aCode. */
       
  1390 	{
       
  1391 	aRangeStart = aCode;
       
  1392 	aRangeEnd = aCode + 1;
       
  1393 
       
  1394 	// First check for a space; this needs to be fast.
       
  1395 	if (aCode == 0x0020)
       
  1396 		return ESpLineBreakClass;
       
  1397 
       
  1398 	// Now search the table.
       
  1399 	const TLineBreakRange* base = TheLineBreakRangeTable;
       
  1400 	const TLineBreakRange* end = base + TheLineBreakRanges;
       
  1401 	while (base < end)
       
  1402 		{
       
  1403 		int n = end - base;
       
  1404 		const TLineBreakRange* r = &base[n / 2];
       
  1405 		if (r->iStart > aCode)
       
  1406 			end = r;
       
  1407 		else if (r->iEnd <= aCode)
       
  1408 			base = r + 1;
       
  1409 		else
       
  1410 			{
       
  1411 			aRangeStart = r->iStart;
       
  1412 			aRangeEnd = r->iEnd;
       
  1413 			return r->iClass;
       
  1414 			}
       
  1415 		}
       
  1416 
       
  1417 	// If the character was not in the table determine the line break class using the Unicode character category.
       
  1418 	TChar::TCategory cat = TChar(aCode).GetCategory();
       
  1419 	switch (cat)
       
  1420 		{
       
  1421 		case TChar::ELuCategory:
       
  1422 		case TChar::ELlCategory:
       
  1423 		case TChar::ELtCategory:
       
  1424 		case TChar::ELoCategory:
       
  1425 		case TChar::ESmCategory:
       
  1426 		case TChar::ESoCategory:
       
  1427 			return EAlLineBreakClass;
       
  1428 
       
  1429 		case TChar::ESkCategory:
       
  1430 			if (TChar(aCode).GetCjkWidth() == TChar::EWide)
       
  1431 				return ENsLineBreakClass;
       
  1432 			else
       
  1433 				return EAlLineBreakClass;
       
  1434 
       
  1435 		case TChar::ELmCategory:
       
  1436 			{
       
  1437 			TChar::TCjkWidth cjk_width = TChar(aCode).GetCjkWidth();
       
  1438 			if (cjk_width == TChar::EWide || cjk_width == TChar::EHalfWidth)
       
  1439 				return ENsLineBreakClass;
       
  1440 			}
       
  1441 			break;
       
  1442 
       
  1443 		case TChar::EMnCategory:
       
  1444 		case TChar::EMcCategory:
       
  1445 		case TChar::EMeCategory:
       
  1446 		case TChar::ECcCategory:
       
  1447 		case TChar::ECfCategory:
       
  1448 			return ECmLineBreakClass;
       
  1449 
       
  1450 		case TChar::ENdCategory:
       
  1451 			return ENuLineBreakClass;
       
  1452 
       
  1453 		case TChar::EPsCategory:
       
  1454 			return EOpLineBreakClass;
       
  1455 
       
  1456 		case TChar::EPeCategory:
       
  1457 			return EClLineBreakClass;
       
  1458 
       
  1459 		case TChar::EScCategory:
       
  1460 			return EPrLineBreakClass;
       
  1461 
       
  1462 		case TChar::EPfCategory:
       
  1463 		case TChar::EPiCategory:
       
  1464 			return EQuLineBreakClass;
       
  1465 
       
  1466 		case TChar::ECsCategory:
       
  1467 			return ESgLineBreakClass;
       
  1468 
       
  1469 		default:
       
  1470 			break;
       
  1471 		}
       
  1472 
       
  1473 	// If it has still not been found it may be an ideographic character not covered above.
       
  1474 	if (aCode >= 0x3000 && aCode <= 0x3FFF)
       
  1475 		return EIdLineBreakClass;
       
  1476 
       
  1477 	// Or it may be a surrogate; assume plane 1 is alphabetic, plane 2 is ideographic.
       
  1478 	if (aCode >= 0x10000 && aCode <= 0x1FFFF)
       
  1479 		return EAlLineBreakClass;
       
  1480 	if (aCode >= 0x20000 && aCode <= 0x2FFFF)
       
  1481 		return EIdLineBreakClass;
       
  1482 
       
  1483 	// Return the catch-all class.
       
  1484 	return EXxLineBreakClass;
       
  1485 	}
       
  1486 
       
  1487 
       
  1488 EXPORT_C TBool MLineBreaker::IsHangingCharacter(TUint) const
       
  1489 /** Returns ETrue if the character value may be positioned outside the margins. 
       
  1490 	
       
  1491 @param aChar Chatacter to test
       
  1492 @return ETrue if the character value may be positioned outside the margins. */
       
  1493     {
       
  1494 	return EFalse;
       
  1495 	}
       
  1496 
       
  1497 TInt MakeSurrogate(TInt aHigh, TInt aLow)
       
  1498 	{
       
  1499 	return (aHigh << 10) + (aLow & 0x3FF)
       
  1500 		+ (0x10000 - 0xD800*0x400);
       
  1501 	}
       
  1502 
       
  1503 inline TBool IsSurrogate(TInt aChar)
       
  1504 	{
       
  1505 	return (aChar & 0xF800) == 0xD800;
       
  1506 	}
       
  1507 
       
  1508 inline TBool IsHighSurrogate(TInt aChar)
       
  1509 	{
       
  1510 	return (aChar & 0xFC00) == 0xD800;
       
  1511 	}
       
  1512 
       
  1513 inline TBool IsLowSurrogate(TInt aChar)
       
  1514 	{
       
  1515 	return (aChar & 0xFC00) == 0xDC00;
       
  1516 	}
       
  1517 
       
  1518 /**
       
  1519 Move past the current character and return the next.
       
  1520 @param aPtr
       
  1521 	Pointer to the current character. On return, contains a pointer to the next
       
  1522 	character.
       
  1523 @param aLimit
       
  1524 	Limit of the iteration. For positive aOffset (moving forwards) this should
       
  1525 	be one less than the end of the text. For negative aOffset (moving
       
  1526 	backwards) this should be the start of the text.
       
  1527 @param aOffset
       
  1528 	1 for moving forward, -1 for moving backward.
       
  1529 @return
       
  1530 	Unicode character value or -1 on error.
       
  1531 @internalComponent
       
  1532 */
       
  1533 TInt MoveTextPtr(const TText*& aPtr, const TText* aLimit, TInt aOffset)
       
  1534 	{
       
  1535 	// if (aPtr - aLimit) has the same sign as aOffset then we are
       
  1536 	// already too far.
       
  1537 	if (0 <= ((aPtr - aLimit) ^ aOffset)
       
  1538 		&& aLimit)
       
  1539 		return -1;
       
  1540 	TInt c = 0;
       
  1541 	for (;;)
       
  1542 		{
       
  1543 		if (aPtr == aLimit)
       
  1544 			return -1;
       
  1545 		aPtr += aOffset;
       
  1546 		TInt lastc = c;
       
  1547 		c = *aPtr;
       
  1548 		if (!IsSurrogate(c))
       
  1549 			return c;
       
  1550 		if (aOffset < 0)
       
  1551 			{
       
  1552 			if (IsHighSurrogate(c) && IsLowSurrogate(lastc))
       
  1553 				return MakeSurrogate(c, lastc);
       
  1554 			}
       
  1555 		else
       
  1556 			{
       
  1557 			if (IsHighSurrogate(lastc) && IsLowSurrogate(c))
       
  1558 				{
       
  1559 				// found a surrogate pair
       
  1560 				// Set the pointer to the first of the pair
       
  1561 				--aPtr;
       
  1562 				return MakeSurrogate(lastc, c);
       
  1563 				}
       
  1564 			}
       
  1565 		}
       
  1566 	}
       
  1567 
       
  1568 /** Find the line break class of the latest character within [aFirst, aP+1]
       
  1569 to have non-CM line break class.
       
  1570 @pre aP points to a character of CM class.
       
  1571 */
       
  1572 inline TUint GetGlyphClusterLineBreakClass(const TText* aP,
       
  1573 	const TText* aFirst, TLineBreakClassCache& aBreaker)
       
  1574 	{
       
  1575 	TInt ch = MoveTextPtr(aP, aFirst, -1);
       
  1576 	while (0 <= ch)
       
  1577 		{
       
  1578 		TUint cl = aBreaker.LineBreakClass(ch);
       
  1579 		if (cl != MLineBreaker::ECmLineBreakClass)
       
  1580 			return cl;
       
  1581 		ch = MoveTextPtr(aP, aFirst, -1);
       
  1582 		}
       
  1583 	return MLineBreaker::ECmLineBreakClass;
       
  1584 	}
       
  1585 
       
  1586 void TLineBreakClassIterator::Set(const TText* aFirst, const TText* aText, TLineBreakClassCache& aBreaker)
       
  1587 	{
       
  1588 	iFirst = aFirst;
       
  1589 	iCurrent = aText;
       
  1590 	TInt c = *aText;
       
  1591 	if (IsHighSurrogate(c))
       
  1592 		{
       
  1593 		if (IsLowSurrogate(aText[1]))
       
  1594 			c = MakeSurrogate(c, aText[1]);
       
  1595 		}
       
  1596 	iClass = aBreaker.LineBreakClass(c);
       
  1597 	if (iClass == MLineBreaker::ECmLineBreakClass)
       
  1598 		{
       
  1599 		TUint baseLbCls = GetGlyphClusterLineBreakClass(iCurrent, iFirst, aBreaker);
       
  1600 		if (baseLbCls ==  MLineBreaker::ESaLineBreakClass)
       
  1601 			iClass = MLineBreaker::ESaLineBreakClass;
       
  1602 		}
       
  1603 	}
       
  1604 
       
  1605 void TLineBreakClassIterator::SetNull()
       
  1606 	{
       
  1607 	iFirst = iCurrent = 0;
       
  1608 	}
       
  1609 
       
  1610 TBool TLineBreakClassIterator::Move(const TText* aLimit,
       
  1611 	const TText* aLimitAfterSpaces, TInt aOffset,
       
  1612 	TBool& aHasSpaces, TLineBreakClassCache& aBreaker)
       
  1613 	{
       
  1614 	TInt c = MoveTextPtr(iCurrent, aLimit, aOffset);
       
  1615 	if (c < 0)
       
  1616 		return EFalse;
       
  1617 	TUint lbClass = aBreaker.LineBreakClass(c);
       
  1618 	if (lbClass == MLineBreaker::ESpLineBreakClass)
       
  1619 		{
       
  1620 		aHasSpaces = ETrue;
       
  1621 		while (lbClass == MLineBreaker::ESpLineBreakClass)
       
  1622 			{
       
  1623 			c = MoveTextPtr(iCurrent, aLimitAfterSpaces, aOffset);
       
  1624 			// We have hit the limit, but there might be more text to search
       
  1625 			// after the spaces.
       
  1626 			if (c < 0)
       
  1627 				{
       
  1628 				iClass = MLineBreaker::ESpLineBreakClass;
       
  1629 				return ETrue;
       
  1630 				}
       
  1631 			lbClass = aBreaker.LineBreakClass(c);
       
  1632 			}
       
  1633 		iClass = lbClass;
       
  1634 		return ETrue;
       
  1635 		}
       
  1636 		
       
  1637 	// Cm class characters taken on their base character's 
       
  1638 	// line break property in the combining character sequence
       
  1639 	// See D14 in Conformance chapter of Unicode 3.0 book.
       
  1640 	// We do this just for Complex content to maintain backwards
       
  1641 	// compatibility otherwise original test cases fail.
       
  1642 	if (lbClass == MLineBreaker::ECmLineBreakClass)
       
  1643 		{
       
  1644 		TUint baseLbCls = GetGlyphClusterLineBreakClass(iCurrent, iFirst, aBreaker);
       
  1645 	    if (baseLbCls ==  MLineBreaker::ESaLineBreakClass)
       
  1646 	        lbClass = MLineBreaker::ESaLineBreakClass;
       
  1647 		}
       
  1648 	    
       
  1649 	aHasSpaces = EFalse;
       
  1650 	if (lbClass == MLineBreaker::ESaLineBreakClass
       
  1651 		&& iClass == MLineBreaker::ESaLineBreakClass)
       
  1652 		{
       
  1653 		// We have at least two SA characters, so we need to find the
       
  1654 		// total extent of the SA block. GetLineBreakInContext will be asked
       
  1655 		// to find the break.
       
  1656 		const TText* p = iCurrent;
       
  1657 		while (0 <= c && lbClass == MLineBreaker::ESaLineBreakClass)
       
  1658 			{
       
  1659 			iCurrent = p;
       
  1660 			c = MoveTextPtr(p, aOffset < 0? iFirst : aLimitAfterSpaces, aOffset);
       
  1661 			lbClass = aBreaker.LineBreakClass(c);
       
  1662 			
       
  1663 			// Cm class characters taken on their base character's 
       
  1664 	        // line break property. See above.
       
  1665         	if (lbClass == MLineBreaker::ECmLineBreakClass)
       
  1666         		{
       
  1667 				TUint baseLbCls = GetGlyphClusterLineBreakClass(p, iFirst, aBreaker);
       
  1668         	    if (baseLbCls ==  MLineBreaker::ESaLineBreakClass)
       
  1669         	        lbClass = MLineBreaker::ESaLineBreakClass;
       
  1670         		}
       
  1671         	if (lbClass == MLineBreaker::EZwLineBreakClass)
       
  1672    				{
       
  1673    				iCurrent = p;
       
  1674    				}
       
  1675 			}
       
  1676 		return ETrue;
       
  1677 		}
       
  1678 	iClass = lbClass;
       
  1679 	return ETrue;
       
  1680 	}
       
  1681 
       
  1682 TLineBreakIterator::TLineBreakIterator(TLineBreakClassCache& aBreaker,
       
  1683 	const TText* aText, TInt aLength, TBool aForwards,
       
  1684 	TInt aMinBreakPos, TInt aMaxBreakPos)
       
  1685 	: iBreaker(aBreaker), iText(aText), iTextLength(aLength), iHasSpaces(EFalse)
       
  1686 	{
       
  1687 	if (aMinBreakPos < 1)
       
  1688 		aMinBreakPos = 1;
       
  1689 	// Find the next valid character and see if it can hang
       
  1690 	// over the margin.
       
  1691 	const TText* endText = aText + aLength;
       
  1692 	const TText* max = aText + aMaxBreakPos;
       
  1693 	if (endText <= max && aText < endText)
       
  1694 		{
       
  1695 		// let 'max' point to last character
       
  1696 		max = endText - 1;
       
  1697 		if (IsLowSurrogate(*max))
       
  1698 			{
       
  1699 			ASSERT(aLength > 1);
       
  1700 			--max;
       
  1701 			ASSERT(IsHighSurrogate(*max));
       
  1702 			}
       
  1703 		}
       
  1704 	TInt c = 0xFFFF;
       
  1705 	while (max < endText)
       
  1706 		{
       
  1707 		TInt lastc = c;
       
  1708 		c = *max;
       
  1709 		if ((c & 0xF800) != 0xD800)
       
  1710 			break;
       
  1711 		if ((lastc & 0xFC00) == 0xD800
       
  1712 			&& (c & 0xFC00) == 0xDC00)
       
  1713 			{
       
  1714 			c = MakeSurrogate(lastc, c);
       
  1715 			break;
       
  1716 			}
       
  1717 		++max;
       
  1718 		}
       
  1719 	if (c != 0xFFFF && max + 1 < endText
       
  1720 		&& aBreaker.Breaker().IsHangingCharacter(c))
       
  1721 		// Set max to just beyond hanging character
       
  1722 		++max;
       
  1723 	// till here, 'max' points to the "end" of a character
       
  1724 
       
  1725 	// set up the iteration.
       
  1726 	iMinBreakPos = aText + aMinBreakPos;
       
  1727 	iMaxBreakPos = aText + aMaxBreakPos;
       
  1728 	// Increment or Decrement must be called to complete set up.
       
  1729 	if (max < aText + aMinBreakPos)
       
  1730 		{
       
  1731 		// no possible line breaks
       
  1732 		iLimit = 0;
       
  1733 		iAfterBreak.SetNull();
       
  1734 		iBeforeBreak.SetNull();
       
  1735 		}
       
  1736 	else if (aForwards)
       
  1737 		{
       
  1738 		iLimit = max;	// point to the 'end' of the last character (low surrogate if supplementary)
       
  1739 		iLimitAfterSpaces = endText - 1;
       
  1740 		iAfterBreak.Set(iText, aText + aMinBreakPos - 1, aBreaker);
       
  1741 		}
       
  1742 	else
       
  1743 		{
       
  1744 		iLimit = aText + aMinBreakPos - 1;
       
  1745 		iLimitAfterSpaces = iLimit;
       
  1746 		iBeforeBreak.Set(iText, max - 1, aBreaker);
       
  1747 		iBeforeBreak.Move(endText - 1, endText - 1, 1, iHasSpaces, aBreaker);
       
  1748 		}
       
  1749 	}
       
  1750 
       
  1751 TBool TLineBreakIterator::IsBreak(TBool aForwards)
       
  1752 	{
       
  1753 	TInt beforeClass = iBeforeBreak.Class();
       
  1754 	TInt afterClass = iAfterBreak.Class();
       
  1755 	const MLineBreaker& breaker = iBreaker.Breaker();
       
  1756 
       
  1757 	// Line break characters overhang the margin
       
  1758 	// along with the spaces that precede them.
       
  1759 	if (afterClass == MLineBreaker::EBkLineBreakClass)
       
  1760 		{
       
  1761 		const TText* p = iAfterBreak.Ptr();
       
  1762 		MoveTextPtr(p, iText + iTextLength, 1);
       
  1763 		iAfterBreak.Set(iText, p, iBreaker);
       
  1764 		return ETrue;
       
  1765 		}
       
  1766 
       
  1767 	// Find break within this run of SA text
       
  1768 	const TText* startOfSaText = iBeforeBreak.Ptr();
       
  1769 	const TText* endOfSaText = iAfterBreak.Ptr();
       
  1770 	
       
  1771 	if ((beforeClass != MLineBreaker::ESaLineBreakClass && *startOfSaText != KWhiteSpace) || 
       
  1772 			(afterClass != MLineBreaker::ESaLineBreakClass))
       
  1773 		// Complex (South-East Asian) line breaking rules not required.
       
  1774 		return breaker.LineBreakPossible(beforeClass, afterClass, iHasSpaces);
       
  1775 
       
  1776 	MoveTextPtr(endOfSaText, iText + iTextLength, 1);
       
  1777 	const TText* minBreak = startOfSaText < iMinBreakPos ?
       
  1778 		iMinBreakPos : startOfSaText + 1;
       
  1779 	const TText* maxBreak = iMaxBreakPos < endOfSaText ?
       
  1780 		iMaxBreakPos : endOfSaText - 1;
       
  1781 	TInt breakPos;
       
  1782 	TPtrC saText(startOfSaText, endOfSaText - startOfSaText);
       
  1783 	if (!breaker.GetLineBreakInContext(saText,
       
  1784 		minBreak - startOfSaText, maxBreak - startOfSaText,
       
  1785 		aForwards, breakPos))
       
  1786 		return EFalse;
       
  1787 
       
  1788 	// Convert the break position within SA text into iterator positions.
       
  1789 	const TText* p = startOfSaText + breakPos;
       
  1790 		iAfterBreak.Set(iText, p, iBreaker);
       
  1791 		if (*p != KZeroWidthSpace) MoveTextPtr(p, 0, -1);
       
  1792 		iBeforeBreak.Set(iText, p, iBreaker);
       
  1793 
       
  1794 		return ETrue;
       
  1795 	}
       
  1796 
       
  1797 TBool TLineBreakIterator::HasContingentBreak() const
       
  1798 	{
       
  1799 	return iBeforeBreak.Class() == MLineBreaker::ECbLineBreakClass
       
  1800 		|| iAfterBreak.Class() == MLineBreaker::ECbLineBreakClass;
       
  1801 	}
       
  1802 
       
  1803 TInt TLineBreakIterator::PreviousClass() const
       
  1804 	{
       
  1805 	return iBeforeBreak.Class();
       
  1806 	}
       
  1807 
       
  1808 TInt TLineBreakIterator::NextClass() const
       
  1809 	{
       
  1810 	return iAfterBreak.Class();
       
  1811 	}
       
  1812 
       
  1813 TBool TLineBreakIterator::HasSpaces() const
       
  1814 	{
       
  1815 	return iHasSpaces;
       
  1816 	}
       
  1817 
       
  1818 TBool TLineBreakIterator::Decrement()
       
  1819 	{
       
  1820 	iAfterBreak = iBeforeBreak;
       
  1821 	return iBeforeBreak.Move(iLimit, iLimitAfterSpaces, -1, iHasSpaces, iBreaker);
       
  1822 	}
       
  1823 
       
  1824 TBool TLineBreakIterator::Increment()
       
  1825 	{
       
  1826 	iBeforeBreak = iAfterBreak;
       
  1827 	return iAfterBreak.Move(iLimit, iLimitAfterSpaces, 1, iHasSpaces, iBreaker);
       
  1828 	}
       
  1829 
       
  1830 TInt TLineBreakIterator::BreakPos() const
       
  1831 	{
       
  1832 	const TText* t = iBeforeBreak.Ptr();
       
  1833 	MoveTextPtr(t, 0, 1);
       
  1834 	return t - iText;
       
  1835 	}
       
  1836 
       
  1837 TInt TLineBreakIterator::BeforeBreakPos() const
       
  1838 	{
       
  1839 	return iBeforeBreak.Ptr() - iText;
       
  1840 	}
       
  1841 
       
  1842 TInt TLineBreakIterator::AfterBreakPos() const
       
  1843 	{
       
  1844 	return iAfterBreak.Ptr() - iText;
       
  1845 	}
       
  1846 
       
  1847 TBool HasContingentBreak(TLineBreakIterator& aIterator,
       
  1848 	MContingentLineBreaker& aCbDelegate)
       
  1849 	{
       
  1850 	if (aIterator.PreviousClass() == MLineBreaker::ECbLineBreakClass
       
  1851 		&& aCbDelegate.IsLegalBreakAfter(
       
  1852 		aIterator.BeforeBreakPos(), aIterator.NextClass(),
       
  1853 		aIterator.HasSpaces()))
       
  1854 		return ETrue;
       
  1855 	if (aIterator.NextClass() == MLineBreaker::ECbLineBreakClass
       
  1856 		&& aCbDelegate.IsLegalBreakBefore(
       
  1857 		aIterator.AfterBreakPos(), aIterator.PreviousClass(),
       
  1858 		aIterator.HasSpaces()))
       
  1859 		return ETrue;
       
  1860 	return EFalse;
       
  1861 	}
       
  1862 
       
  1863 TBool FindBreak(TLineBreakIterator& aIterator, TBool aForwards,
       
  1864 	MContingentLineBreaker* aCbDelegate)
       
  1865 	{
       
  1866 	while (aForwards? aIterator.Increment() : aIterator.Decrement())
       
  1867 		{
       
  1868 		if (aCbDelegate && aIterator.HasContingentBreak())
       
  1869 			{
       
  1870 			if (HasContingentBreak(aIterator, *aCbDelegate))
       
  1871 				{
       
  1872 				return ETrue;
       
  1873 				}
       
  1874 			}
       
  1875 		else if (aIterator.IsBreak(aForwards))
       
  1876 			{
       
  1877 			return ETrue;
       
  1878 			}
       
  1879 		}
       
  1880 	return EFalse;
       
  1881 	}
       
  1882 
       
  1883 TBool HasContingentBreakL(TLineBreakIterator& aIterator,
       
  1884 	MContingentLineBreakerL& aCbDelegate)
       
  1885 	{
       
  1886 	if (aIterator.PreviousClass() == MLineBreaker::ECbLineBreakClass
       
  1887 		&& aCbDelegate.IsLegalBreakAfterL(
       
  1888 		aIterator.BeforeBreakPos(), aIterator.NextClass(),
       
  1889 		aIterator.HasSpaces()))
       
  1890 		return ETrue;
       
  1891 	if (aIterator.NextClass() == MLineBreaker::ECbLineBreakClass
       
  1892 		&& aCbDelegate.IsLegalBreakBeforeL(
       
  1893 		aIterator.AfterBreakPos(), aIterator.PreviousClass(),
       
  1894 		aIterator.HasSpaces()))
       
  1895 		return ETrue;
       
  1896 	return EFalse;
       
  1897 	}
       
  1898 
       
  1899 TBool FindBreakL(TLineBreakIterator& aIterator, TBool aForwards,
       
  1900 	MContingentLineBreakerL* aCbDelegate)
       
  1901 	{
       
  1902 	while (aForwards? aIterator.Increment() : aIterator.Decrement())
       
  1903 		{
       
  1904 		if (aCbDelegate && aIterator.HasContingentBreak())
       
  1905 			{
       
  1906 			if (HasContingentBreakL(aIterator, *aCbDelegate))
       
  1907 				return ETrue;
       
  1908 			}
       
  1909 		else if (aIterator.IsBreak(aForwards))
       
  1910 			return ETrue;
       
  1911 		}
       
  1912 	return EFalse;
       
  1913 	}
       
  1914 
       
  1915 EXPORT_C TBool MLineBreaker::GetLineBreak(const TDesC& aText,
       
  1916 	TInt aMinBreakPos, TInt aMaxBreakPos, TBool aForwards,
       
  1917 	MContingentLineBreaker* aCbDelegate,
       
  1918 	TInt& aBreakPos, TInt& aBreakPosAfterSpaces) const
       
  1919 /** Finds the line break according to the rules in the virtual functions. 
       
  1920 
       
  1921 @param aText The text to be broken.
       
  1922 @param aMinBreakPos The smallest allowed result.
       
  1923 @param aMaxBreakPos The position of the first character that fails to fit the 
       
  1924 measure.
       
  1925 @param aForwards ETrue to find the earliest legal break opportunity, EFalse 
       
  1926 to find the last.
       
  1927 @param aCbDelegate Object to resolve breaks around characters with the CB (cointingent 
       
  1928 break) line breaking class. Typically this class is only used for character 
       
  1929 0xFFFD, which usually marks the position of embedded pictures. May be NULL, 
       
  1930 in which case LineBreakPossible() determines whether these breaks are legal.
       
  1931 @param aBreakPos Returns the position of the break.
       
  1932 @param aBreakPosAfterSpaces Returns the position of the start of the next line.
       
  1933 @return ETrue if successful, EFalse if no legal line breaks were found. */
       
  1934     {
       
  1935 	TLineBreakClassCache cache(*this);
       
  1936 	const TText* text = aText.Ptr();
       
  1937 	TLineBreakIterator it(cache, text, aText.Length(),
       
  1938 		aForwards, aMinBreakPos, aMaxBreakPos);
       
  1939 	if (!FindBreak(it, aForwards, aCbDelegate))
       
  1940 		return EFalse;
       
  1941 	aBreakPos = it.BreakPos();
       
  1942 	aBreakPosAfterSpaces = it.AfterBreakPos();
       
  1943 	return ETrue;
       
  1944 	}
       
  1945 
       
  1946 EXPORT_C TBool MLineBreaker::GetLineBreakL(const TDesC& aText,
       
  1947 	TInt aMinBreakPos, TInt aMaxBreakPos, TBool aForwards,
       
  1948 	MContingentLineBreakerL* aCbDelegate,
       
  1949 	TInt& aBreakPos, TInt& aBreakPosAfterSpaces) const
       
  1950 /** Exactly the same as GetLineBreak, but aCbDelegate's functions may leave so 
       
  1951 the whole function may leave. 
       
  1952 
       
  1953 @param aText The text to be broken.
       
  1954 @param aMinBreakPos The smallest allowed result.
       
  1955 @param aMaxBreakPos he position of the first character that fails to fit the 
       
  1956 measure.
       
  1957 @param aForwards ETrue to find the earliest legal break opportunity, EFalse 
       
  1958 to find the last.
       
  1959 @param aCbDelegate Object to resolve breaks around characters with the CB (cointingent 
       
  1960 break) line breaking class. Typically this class is only used for character 
       
  1961 0xFFFD, which usually marks the position of embedded pictures. May be NULL, 
       
  1962 in which case LineBreakPossible() determines whether these breaks are legal.
       
  1963 @param aBreakPos Returns the position of the break.
       
  1964 @param aBreakPosAfterSpaces Returns the position of the start of the next line.
       
  1965 @return ETrue if successful, EFalse if no legal line breaks were found. */
       
  1966 	{
       
  1967 	if (aMaxBreakPos < aMinBreakPos)
       
  1968 		return EFalse;
       
  1969 	TLineBreakClassCache cache(*this);
       
  1970 	const TText* text = aText.Ptr();
       
  1971 	TLineBreakIterator it(cache, text, aText.Length(),
       
  1972 		aForwards, aMinBreakPos, aMaxBreakPos);
       
  1973 	if (!FindBreakL(it, aForwards, aCbDelegate))
       
  1974 		return EFalse;
       
  1975 	aBreakPos = it.BreakPos();
       
  1976 	aBreakPosAfterSpaces = it.AfterBreakPos();
       
  1977 	return ETrue;
       
  1978 	}
       
  1979 EXPORT_C void* MLineBreaker::ExtendedInterface(TUid&) const 
       
  1980 /** Returns an interface to more functions, or 0 if these are unsupported.
       
  1981 Currently there are no other functions, so 0 is always returned. If this
       
  1982 function is overridden, it must base call if aUid is not recognised,
       
  1983 rather than just returning 0.
       
  1984 @param aUid Identifies the interface to be returned.
       
  1985 @return A pointer to the extended interface, or 0 if not supported. */
       
  1986 	{ 
       
  1987 	return 0; 
       
  1988 	}
       
  1989 
       
  1990