1 /* Copyright 2005, 2009 Elliotte Rusty Harold
2 
3    This library is free software; you can redistribute it and/or modify
4    it under the terms of version 2.1 of the GNU Lesser General Public
5    License as published by the Free Software Foundation.
6 
7    This library is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU Lesser General Public License for more details.
11 
12    You should have received a copy of the GNU Lesser General Public
13    License along with this library; if not, write to the
14    Free Software Foundation, Inc., 59 Temple Place, Suite 330,
15    Boston, MA 02111-1307  USA
16 
17    You can contact Elliotte Rusty Harold by sending e-mail to
18    elharo@ibiblio.org. Please include the word "XOM" in the
19    subject line. The XOM home page is located at http://www.xom.nu/
20 */
21 
22 package nu.xom;
23 
24 import java.io.InputStream;
25 import java.io.DataInputStream;
26 import java.io.IOException;
27 import java.util.Map;
28 import java.util.HashMap;
29 
30 /**
31  * <p>
32  *
33  * </p>
34  *
35  * @author Elliotte Rusty Harold
36  * @version 1.2b3
37  *
38  */
39 final class UnicodeUtil {
40 
41 
42     private static final int CANONICAL_COMBINING_CLASS_NOT_REORDERED = 0;
43     private static final int CANONICAL_COMBINING_CLASS_OVERLAY = 1;
44     private static final int CANONICAL_COMBINING_CLASS_NUKTA = 7;
45     private static final int CANONICAL_COMBINING_CLASS_KANA_VOICING = 8;
46     private final static int CANONICAL_COMBINING_CLASS_VIRAMA = 9;
47     private final static int CANONICAL_COMBINING_CLASS_10 = 10;
48     private final static int CANONICAL_COMBINING_CLASS_11 = 11;
49     private final static int CANONICAL_COMBINING_CLASS_12 = 12;
50     private final static int CANONICAL_COMBINING_CLASS_13 = 13;
51     private final static int CANONICAL_COMBINING_CLASS_14 = 14;
52     private final static int CANONICAL_COMBINING_CLASS_15 = 15;
53     private final static int CANONICAL_COMBINING_CLASS_16 = 16;
54     private final static int CANONICAL_COMBINING_CLASS_17 = 17;
55     private final static int CANONICAL_COMBINING_CLASS_18 = 18;
56     private final static int CANONICAL_COMBINING_CLASS_19 = 19;
57     private final static int CANONICAL_COMBINING_CLASS_20 = 20;
58     private final static int CANONICAL_COMBINING_CLASS_21 = 21;
59     private final static int CANONICAL_COMBINING_CLASS_22 = 22;
60     private final static int CANONICAL_COMBINING_CLASS_23 = 23;
61     private final static int CANONICAL_COMBINING_CLASS_24 = 24;
62     private final static int CANONICAL_COMBINING_CLASS_25 = 25;
63     private final static int CANONICAL_COMBINING_CLASS_26 = 26;
64     private final static int CANONICAL_COMBINING_CLASS_27 = 27;
65     private final static int CANONICAL_COMBINING_CLASS_28 = 28;
66     private final static int CANONICAL_COMBINING_CLASS_29 = 29;
67     private final static int CANONICAL_COMBINING_CLASS_30 = 30;
68     private final static int CANONICAL_COMBINING_CLASS_31 = 31;
69     private final static int CANONICAL_COMBINING_CLASS_32 = 32;
70     private final static int CANONICAL_COMBINING_CLASS_33 = 33;
71     private final static int CANONICAL_COMBINING_CLASS_34 = 34;
72     private final static int CANONICAL_COMBINING_CLASS_35 = 35;
73     private final static int CANONICAL_COMBINING_CLASS_36 = 36;
74     private final static int CANONICAL_COMBINING_CLASS_84 = 84;
75     private final static int CANONICAL_COMBINING_CLASS_91 = 91;
76     private final static int CANONICAL_COMBINING_CLASS_103 = 103;
77     private final static int CANONICAL_COMBINING_CLASS_107 = 107;
78     private final static int CANONICAL_COMBINING_CLASS_118 = 118;
79     private final static int CANONICAL_COMBINING_CLASS_122 = 122;
80     private final static int CANONICAL_COMBINING_CLASS_129 = 129;
81     private final static int CANONICAL_COMBINING_CLASS_130 = 130;
82     private final static int CANONICAL_COMBINING_CLASS_132 = 132;
83     private final static int CANONICAL_COMBINING_CLASS_ATTACHED_BELOW = 202;
84     private static final int CANONICAL_COMBINING_CLASS_214 = 214;
85     private static final int CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT = 216;
86     private final static int CANONICAL_COMBINING_CLASS_BELOW_LEFT = 218;
87     private final static int CANONICAL_COMBINING_CLASS_BELOW = 220;
88     private final static int CANONICAL_COMBINING_CLASS_BELOW_RIGHT = 222;
89     private final static int CANONICAL_COMBINING_CLASS_LEFT = 224;
90     private final static int CANONICAL_COMBINING_CLASS_RIGHT = 226;
91     private final static int CANONICAL_COMBINING_CLASS_ABOVE_LEFT = 228;
92     private final static int CANONICAL_COMBINING_CLASS_ABOVE = 230;
93     private final static int CANONICAL_COMBINING_CLASS_ABOVE_RIGHT = 232;
94     private final static int CANONICAL_COMBINING_CLASS_DOUBLE_BELOW = 233;
95     private final static int CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE = 234;
96     private final static int CANONICAL_COMBINING_CLASS_IOTA_SUBSCRIPT = 240;
97 
98 
isHighSurrogate(char c)99     private static boolean isHighSurrogate(char c) {
100         return c >= HI_SURROGATE_START && c <= HI_SURROGATE_END;
101     }
102 
103 
104     private static int HI_SURROGATE_START  = 0xD800;
105     private static int HI_SURROGATE_END    = 0xDBFF;
106     private static int LOW_SURROGATE_START = 0xDC00;
107 
108 
109     private static Map compositions;
110 
loadCompositions()111     private static void loadCompositions() {
112 
113         ClassLoader loader = Verifier.class.getClassLoader();
114         if (loader != null) loadCompositions(loader);
115         // If that didn't work, try a different ClassLoader
116         if (compositions == null) {
117             loader = Thread.currentThread().getContextClassLoader();
118             loadCompositions(loader);
119         }
120         if (compositions == null) {
121             throw new RuntimeException("Broken XOM installation: "
122               + "could not load nu/xom/compositions.dat");
123         }
124 
125     }
126 
127 
128     // XXX use a BiMap and make decompose much simpler?
loadCompositions(ClassLoader loader)129     private static void loadCompositions(ClassLoader loader) {
130 
131         DataInputStream in = null;
132         try {
133             InputStream source = loader.getResourceAsStream("nu/xom/compositions.dat");
134             in = new DataInputStream(source);
135             // ???? would it make sense to store a serialized HashMap instead????
136             compositions = new HashMap();
137             try {
138                 while (true) {
139                     String composed = in.readUTF();
140                     String decomposed = in.readUTF();
141                     compositions.put(decomposed, composed);
142                 }
143             }
144             catch (java.io.EOFException ex) {
145                 // finished
146             }
147         }
148         catch (IOException ex) {
149             return;
150         }
151         finally {
152             try {
153                 if (in != null) in.close();
154             }
155             catch (IOException ex) {
156                 // no big deal
157             }
158         }
159 
160     }
161 
162 
isStarter(int character)163     private static boolean isStarter(int character) {
164         return getCombiningClass(character) == 0;
165     }
166 
167 
getCombiningClass(int character)168     private static int getCombiningClass(int character) {
169         // ???? optimize with table lookup?
170 
171         if (character <= 0x2ff) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
172         if (character <= 0x314) return CANONICAL_COMBINING_CLASS_ABOVE;
173         if (character <= 0x315) return CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
174         if (character <= 0x319) return CANONICAL_COMBINING_CLASS_BELOW;
175         if (character <= 0x31a) return CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
176         if (character <= 0x31b) return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
177         if (character <= 0x320) return CANONICAL_COMBINING_CLASS_BELOW;
178         if (character <= 0x322) return CANONICAL_COMBINING_CLASS_ATTACHED_BELOW;
179         if (character <= 0x326) return CANONICAL_COMBINING_CLASS_BELOW;
180         if (character <= 0x328) return CANONICAL_COMBINING_CLASS_ATTACHED_BELOW;
181         if (character <= 0x333) return CANONICAL_COMBINING_CLASS_BELOW;
182         if (character <= 0x338) return CANONICAL_COMBINING_CLASS_OVERLAY;
183         if (character <= 0x33c) return CANONICAL_COMBINING_CLASS_BELOW;
184         if (character <= 0x344) return CANONICAL_COMBINING_CLASS_ABOVE;
185         if (character <= 0x345) return CANONICAL_COMBINING_CLASS_IOTA_SUBSCRIPT;
186         if (character <= 0x346) return CANONICAL_COMBINING_CLASS_ABOVE;
187         if (character <= 0x349) return CANONICAL_COMBINING_CLASS_BELOW;
188         if (character <= 0x34c) return CANONICAL_COMBINING_CLASS_ABOVE;
189         if (character <= 0x34e) return CANONICAL_COMBINING_CLASS_BELOW;
190         if (character <= 0x34f) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
191         if (character <= 0x352) return CANONICAL_COMBINING_CLASS_ABOVE;
192         if (character <= 0x356) return CANONICAL_COMBINING_CLASS_BELOW;
193         if (character <= 0x357) return CANONICAL_COMBINING_CLASS_ABOVE;
194         if (character <= 0x358) return CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
195         if (character <= 0x35a) return CANONICAL_COMBINING_CLASS_BELOW;
196         if (character <= 0x35b) return CANONICAL_COMBINING_CLASS_ABOVE;
197         if (character <= 0x35c) return CANONICAL_COMBINING_CLASS_DOUBLE_BELOW;
198         if (character <= 0x35e) return CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE;
199         if (character <= 0x35f) return CANONICAL_COMBINING_CLASS_DOUBLE_BELOW;
200         if (character <= 0x361) return CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE;
201         if (character <= 0x362) return CANONICAL_COMBINING_CLASS_DOUBLE_BELOW;
202         if (character <= 0x36f) return CANONICAL_COMBINING_CLASS_ABOVE;
203         if (character <= 0x482) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
204         if (character <= 0x487) return CANONICAL_COMBINING_CLASS_ABOVE;
205         if (character <= 0x590) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
206         if (character <= 0x591) return CANONICAL_COMBINING_CLASS_BELOW;
207         if (character <= 0x595) return CANONICAL_COMBINING_CLASS_ABOVE;
208         if (character <= 0x596) return CANONICAL_COMBINING_CLASS_BELOW;
209         if (character <= 0x599) return CANONICAL_COMBINING_CLASS_ABOVE;
210         if (character <= 0x59a) return CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
211         if (character <= 0x59b) return CANONICAL_COMBINING_CLASS_BELOW;
212         if (character <= 0x5a1) return CANONICAL_COMBINING_CLASS_ABOVE;
213         if (character <= 0x5a7) return CANONICAL_COMBINING_CLASS_BELOW;
214         if (character <= 0x5a9) return CANONICAL_COMBINING_CLASS_ABOVE;
215         if (character <= 0x5aa) return CANONICAL_COMBINING_CLASS_BELOW;
216         if (character <= 0x5ac) return CANONICAL_COMBINING_CLASS_ABOVE;
217         if (character <= 0x5ad) return CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
218         if (character <= 0x5ae) return CANONICAL_COMBINING_CLASS_ABOVE_LEFT;
219         if (character <= 0x5af) return CANONICAL_COMBINING_CLASS_ABOVE;
220         if (character <= 0x5b0) return CANONICAL_COMBINING_CLASS_10;
221         if (character <= 0x5b1) return CANONICAL_COMBINING_CLASS_11;
222         if (character <= 0x5b2) return CANONICAL_COMBINING_CLASS_12;
223         if (character <= 0x5b3) return CANONICAL_COMBINING_CLASS_13;
224         if (character <= 0x5b4) return CANONICAL_COMBINING_CLASS_14;
225         if (character <= 0x5b5) return CANONICAL_COMBINING_CLASS_15;
226         if (character <= 0x5b6) return CANONICAL_COMBINING_CLASS_16;
227         if (character <= 0x5b7) return CANONICAL_COMBINING_CLASS_17;
228         if (character <= 0x5b8) return CANONICAL_COMBINING_CLASS_18;
229         if (character <= 0x5ba) return CANONICAL_COMBINING_CLASS_19;
230         if (character <= 0x5bb) return CANONICAL_COMBINING_CLASS_20;
231         if (character <= 0x5bc) return CANONICAL_COMBINING_CLASS_21;
232         if (character <= 0x5bd) return CANONICAL_COMBINING_CLASS_22;
233         if (character <= 0x5be) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
234         if (character <= 0x5bf) return CANONICAL_COMBINING_CLASS_23;
235         if (character <= 0x5c0) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
236         if (character <= 0x5c1) return CANONICAL_COMBINING_CLASS_24;
237         if (character <= 0x5c2) return CANONICAL_COMBINING_CLASS_25;
238         if (character <= 0x5c3) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
239         if (character <= 0x5c4) return CANONICAL_COMBINING_CLASS_ABOVE;
240         if (character <= 0x5c5) return CANONICAL_COMBINING_CLASS_BELOW;
241         if (character <= 0x5c6) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
242         if (character <= 0x5c7) return CANONICAL_COMBINING_CLASS_18;
243         if (character <= 0x60f) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
244         if (character <= 0x617) return CANONICAL_COMBINING_CLASS_ABOVE;
245         if (character <= 0x618) return CANONICAL_COMBINING_CLASS_30;
246         if (character <= 0x619) return CANONICAL_COMBINING_CLASS_31;
247         if (character <= 0x61a) return CANONICAL_COMBINING_CLASS_32;
248         if (character <= 0x64a) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
249         if (character <= 0x64b) return CANONICAL_COMBINING_CLASS_27;
250         if (character <= 0x64c) return CANONICAL_COMBINING_CLASS_28;
251         if (character <= 0x64d) return CANONICAL_COMBINING_CLASS_29;
252         if (character <= 0x64e) return CANONICAL_COMBINING_CLASS_30;
253         if (character <= 0x64f) return CANONICAL_COMBINING_CLASS_31;
254         if (character <= 0x650) return CANONICAL_COMBINING_CLASS_32;
255         if (character <= 0x651) return CANONICAL_COMBINING_CLASS_33;
256         if (character <= 0x652) return CANONICAL_COMBINING_CLASS_34;
257         if (character <= 0x654) return CANONICAL_COMBINING_CLASS_ABOVE;
258         if (character <= 0x656) return CANONICAL_COMBINING_CLASS_BELOW;
259         if (character <= 0x65b) return CANONICAL_COMBINING_CLASS_ABOVE;
260         if (character <= 0x65c) return CANONICAL_COMBINING_CLASS_BELOW;
261         if (character <= 0x65e) return CANONICAL_COMBINING_CLASS_ABOVE;
262         if (character <= 0x66f) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
263         if (character <= 0x670) return CANONICAL_COMBINING_CLASS_35;
264         if (character <= 0x6d5) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
265         if (character <= 0x6dc) return CANONICAL_COMBINING_CLASS_ABOVE;
266         if (character <= 0x6de) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
267         if (character <= 0x6e2) return CANONICAL_COMBINING_CLASS_ABOVE;
268         if (character <= 0x6e3) return CANONICAL_COMBINING_CLASS_BELOW;
269         if (character <= 0x6e4) return CANONICAL_COMBINING_CLASS_ABOVE;
270         if (character <= 0x6e6) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
271         if (character <= 0x6e8) return CANONICAL_COMBINING_CLASS_ABOVE;
272         if (character <= 0x6e9) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
273         if (character <= 0x6ea) return CANONICAL_COMBINING_CLASS_BELOW;
274         if (character <= 0x6ec) return CANONICAL_COMBINING_CLASS_ABOVE;
275         if (character <= 0x6ed) return CANONICAL_COMBINING_CLASS_BELOW;
276         if (character <= 0x710) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
277         if (character <= 0x711) return CANONICAL_COMBINING_CLASS_36;
278         if (character <= 0x72f) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
279         if (character <= 0x730) return CANONICAL_COMBINING_CLASS_ABOVE;
280         if (character <= 0x731) return CANONICAL_COMBINING_CLASS_BELOW;
281         if (character <= 0x733) return CANONICAL_COMBINING_CLASS_ABOVE;
282         if (character <= 0x734) return CANONICAL_COMBINING_CLASS_BELOW;
283         if (character <= 0x736) return CANONICAL_COMBINING_CLASS_ABOVE;
284         if (character <= 0x739) return CANONICAL_COMBINING_CLASS_BELOW;
285         if (character <= 0x73a) return CANONICAL_COMBINING_CLASS_ABOVE;
286         if (character <= 0x73c) return CANONICAL_COMBINING_CLASS_BELOW;
287         if (character <= 0x73d) return CANONICAL_COMBINING_CLASS_ABOVE;
288         if (character <= 0x73e) return CANONICAL_COMBINING_CLASS_BELOW;
289         if (character <= 0x741) return CANONICAL_COMBINING_CLASS_ABOVE;
290         if (character <= 0x742) return CANONICAL_COMBINING_CLASS_BELOW;
291         if (character <= 0x743) return CANONICAL_COMBINING_CLASS_ABOVE;
292         if (character <= 0x744) return CANONICAL_COMBINING_CLASS_BELOW;
293         if (character <= 0x745) return CANONICAL_COMBINING_CLASS_ABOVE;
294         if (character <= 0x746) return CANONICAL_COMBINING_CLASS_BELOW;
295         if (character <= 0x747) return CANONICAL_COMBINING_CLASS_ABOVE;
296         if (character <= 0x748) return CANONICAL_COMBINING_CLASS_BELOW;
297         if (character <= 0x74a) return CANONICAL_COMBINING_CLASS_ABOVE;
298         if (character <= 0x7ea) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
299         if (character <= 0x7f1) return CANONICAL_COMBINING_CLASS_ABOVE;
300         if (character <= 0x7f2) return CANONICAL_COMBINING_CLASS_BELOW;
301         if (character <= 0x7f3) return CANONICAL_COMBINING_CLASS_ABOVE;
302         if (character <= 0x93b) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
303         if (character <= 0x93c) return CANONICAL_COMBINING_CLASS_NUKTA;
304         if (character <= 0x94c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
305         if (character <= 0x94d) return CANONICAL_COMBINING_CLASS_VIRAMA;
306         if (character <= 0x950) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
307         if (character <= 0x951) return CANONICAL_COMBINING_CLASS_ABOVE;
308         if (character <= 0x952) return CANONICAL_COMBINING_CLASS_BELOW;
309         if (character <= 0x954) return CANONICAL_COMBINING_CLASS_ABOVE;
310         if (character <= 0x9bb) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
311         if (character <= 0x9bc) return CANONICAL_COMBINING_CLASS_NUKTA;
312         if (character <= 0x9cc) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
313         if (character <= 0x9cd) return CANONICAL_COMBINING_CLASS_VIRAMA;
314         if (character <= 0xa3b) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
315         if (character <= 0xa3c) return CANONICAL_COMBINING_CLASS_NUKTA;
316         if (character <= 0xa4c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
317         if (character <= 0xa4d) return CANONICAL_COMBINING_CLASS_VIRAMA;
318         if (character <= 0xabb) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
319         if (character <= 0xabc) return CANONICAL_COMBINING_CLASS_NUKTA;
320         if (character <= 0xacc) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
321         if (character <= 0xacd) return CANONICAL_COMBINING_CLASS_VIRAMA;
322         if (character <= 0xb3b) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
323         if (character <= 0xb3c) return CANONICAL_COMBINING_CLASS_NUKTA;
324         if (character <= 0xb4c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
325         if (character <= 0xb4d) return CANONICAL_COMBINING_CLASS_VIRAMA;
326         if (character <= 0xbcc) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
327         if (character <= 0xbcd) return CANONICAL_COMBINING_CLASS_VIRAMA;
328         if (character <= 0xc4c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
329         if (character <= 0xc4d) return CANONICAL_COMBINING_CLASS_VIRAMA;
330         if (character <= 0xc54) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
331         if (character <= 0xc55) return CANONICAL_COMBINING_CLASS_84;
332         if (character <= 0xc56) return CANONICAL_COMBINING_CLASS_91;
333         if (character <= 0xcbb) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
334         if (character <= 0xcbc) return CANONICAL_COMBINING_CLASS_NUKTA;
335         if (character <= 0xccc) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
336         if (character <= 0xccd) return CANONICAL_COMBINING_CLASS_VIRAMA;
337         if (character <= 0xd4c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
338         if (character <= 0xd4d) return CANONICAL_COMBINING_CLASS_VIRAMA;
339         if (character <= 0xdc9) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
340         if (character <= 0xdca) return CANONICAL_COMBINING_CLASS_VIRAMA;
341         if (character <= 0xe37) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
342         if (character <= 0xe39) return CANONICAL_COMBINING_CLASS_103;
343         if (character <= 0xe3a) return CANONICAL_COMBINING_CLASS_VIRAMA;
344         if (character <= 0xe47) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
345         if (character <= 0xe4b) return CANONICAL_COMBINING_CLASS_107;
346         if (character <= 0xeb7) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
347         if (character <= 0xeb9) return CANONICAL_COMBINING_CLASS_118;
348         if (character <= 0xec7) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
349         if (character <= 0xecb) return CANONICAL_COMBINING_CLASS_122;
350         if (character <= 0xf17) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
351         if (character <= 0xf19) return CANONICAL_COMBINING_CLASS_BELOW;
352         if (character <= 0xf34) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
353         if (character <= 0xf35) return CANONICAL_COMBINING_CLASS_BELOW;
354         if (character <= 0xf36) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
355         if (character <= 0xf37) return CANONICAL_COMBINING_CLASS_BELOW;
356         if (character <= 0xf38) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
357         if (character <= 0xf39) return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
358         if (character <= 0xf70) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
359         if (character <= 0xf71) return CANONICAL_COMBINING_CLASS_129;
360         if (character <= 0xf72) return CANONICAL_COMBINING_CLASS_130;
361         if (character <= 0xf73) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
362         if (character <= 0xf74) return CANONICAL_COMBINING_CLASS_132;
363         if (character <= 0xf79) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
364         if (character <= 0xf7d) return CANONICAL_COMBINING_CLASS_130;
365         if (character <= 0xf7f) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
366         if (character <= 0xf80) return CANONICAL_COMBINING_CLASS_130;
367         if (character <= 0xf81) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
368         if (character <= 0xf83) return CANONICAL_COMBINING_CLASS_ABOVE;
369         if (character <= 0xf84) return CANONICAL_COMBINING_CLASS_VIRAMA;
370         if (character <= 0xf85) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
371         if (character <= 0xf87) return CANONICAL_COMBINING_CLASS_ABOVE;
372         if (character <= 0xfc5) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
373         if (character <= 0xfc6) return CANONICAL_COMBINING_CLASS_BELOW;
374         if (character <= 0x1036) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
375         if (character <= 0x1037) return CANONICAL_COMBINING_CLASS_NUKTA;
376         if (character <= 0x1038) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
377         if (character <= 0x103a) return CANONICAL_COMBINING_CLASS_VIRAMA;
378         if (character <= 0x108c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
379         if (character <= 0x108d) return CANONICAL_COMBINING_CLASS_BELOW;
380         if (character <= 0x135e) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
381         if (character <= 0x135f) return CANONICAL_COMBINING_CLASS_ABOVE;
382         if (character <= 0x1713) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
383         if (character <= 0x1714) return CANONICAL_COMBINING_CLASS_VIRAMA;
384         if (character <= 0x1733) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
385         if (character <= 0x1734) return CANONICAL_COMBINING_CLASS_VIRAMA;
386         if (character <= 0x17d1) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
387         if (character <= 0x17d2) return CANONICAL_COMBINING_CLASS_VIRAMA;
388         if (character <= 0x17dc) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
389         if (character <= 0x17dd) return CANONICAL_COMBINING_CLASS_ABOVE;
390         if (character <= 0x18a8) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
391         if (character <= 0x18a9) return CANONICAL_COMBINING_CLASS_ABOVE_LEFT;
392         if (character <= 0x1938) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
393         if (character <= 0x1939) return CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
394         if (character <= 0x193a) return CANONICAL_COMBINING_CLASS_ABOVE;
395         if (character <= 0x193b) return CANONICAL_COMBINING_CLASS_BELOW;
396         if (character <= 0x1a16) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
397         if (character <= 0x1a17) return CANONICAL_COMBINING_CLASS_ABOVE;
398         if (character <= 0x1a18) return CANONICAL_COMBINING_CLASS_BELOW;
399         if (character <= 0x1b33) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
400         if (character <= 0x1b34) return CANONICAL_COMBINING_CLASS_NUKTA;
401         if (character <= 0x1b43) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
402         if (character <= 0x1b44) return CANONICAL_COMBINING_CLASS_VIRAMA;
403         if (character <= 0x1b6a) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
404         if (character <= 0x1b6b) return CANONICAL_COMBINING_CLASS_ABOVE;
405         if (character <= 0x1b6c) return CANONICAL_COMBINING_CLASS_BELOW;
406         if (character <= 0x1b73) return CANONICAL_COMBINING_CLASS_ABOVE;
407         if (character <= 0x1ba9) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
408         if (character <= 0x1baa) return CANONICAL_COMBINING_CLASS_VIRAMA;
409         if (character <= 0x1c36) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
410         if (character <= 0x1c37) return CANONICAL_COMBINING_CLASS_NUKTA;
411         if (character <= 0x1dbf) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
412         if (character <= 0x1dc1) return CANONICAL_COMBINING_CLASS_ABOVE;
413         if (character <= 0x1dc2) return CANONICAL_COMBINING_CLASS_BELOW;
414         if (character <= 0x1dc9) return CANONICAL_COMBINING_CLASS_ABOVE;
415         if (character <= 0x1dca) return CANONICAL_COMBINING_CLASS_BELOW;
416         if (character <= 0x1dcc) return CANONICAL_COMBINING_CLASS_ABOVE;
417         if (character <= 0x1dcd) return CANONICAL_COMBINING_CLASS_DOUBLE_ABOVE;
418         if (character <= 0x1dce) return CANONICAL_COMBINING_CLASS_214;
419         if (character <= 0x1dcf) return CANONICAL_COMBINING_CLASS_BELOW;
420         if (character <= 0x1dd0) return CANONICAL_COMBINING_CLASS_ATTACHED_BELOW;
421         if (character <= 0x1de6) return CANONICAL_COMBINING_CLASS_ABOVE;
422         if (character <= 0x1dfd) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
423         if (character <= 0x1dfe) return CANONICAL_COMBINING_CLASS_ABOVE;
424         if (character <= 0x1dff) return CANONICAL_COMBINING_CLASS_BELOW;
425         if (character <= 0x20cf) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
426         if (character <= 0x20d1) return CANONICAL_COMBINING_CLASS_ABOVE;
427         if (character <= 0x20d3) return CANONICAL_COMBINING_CLASS_OVERLAY;
428         if (character <= 0x20d7) return CANONICAL_COMBINING_CLASS_ABOVE;
429         if (character <= 0x20da) return CANONICAL_COMBINING_CLASS_OVERLAY;
430         if (character <= 0x20dc) return CANONICAL_COMBINING_CLASS_ABOVE;
431         if (character <= 0x20e0) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
432         if (character <= 0x20e1) return CANONICAL_COMBINING_CLASS_ABOVE;
433         if (character <= 0x20e4) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
434         if (character <= 0x20e6) return CANONICAL_COMBINING_CLASS_OVERLAY;
435         if (character <= 0x20e7) return CANONICAL_COMBINING_CLASS_ABOVE;
436         if (character <= 0x20e8) return CANONICAL_COMBINING_CLASS_BELOW;
437         if (character <= 0x20e9) return CANONICAL_COMBINING_CLASS_ABOVE;
438         if (character <= 0x20eb) return CANONICAL_COMBINING_CLASS_OVERLAY;
439         if (character <= 0x20ef) return CANONICAL_COMBINING_CLASS_BELOW;
440         if (character <= 0x20f0) return CANONICAL_COMBINING_CLASS_ABOVE;
441         if (character <= 0x2ddf) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
442         if (character <= 0x2dff) return CANONICAL_COMBINING_CLASS_ABOVE;
443         if (character <= 0x3029) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
444         if (character <= 0x302a) return CANONICAL_COMBINING_CLASS_BELOW_LEFT;
445         if (character <= 0x302b) return CANONICAL_COMBINING_CLASS_ABOVE_LEFT;
446         if (character <= 0x302c) return CANONICAL_COMBINING_CLASS_ABOVE_RIGHT;
447         if (character <= 0x302d) return CANONICAL_COMBINING_CLASS_BELOW_RIGHT;
448         if (character <= 0x302f) return CANONICAL_COMBINING_CLASS_LEFT;
449         if (character <= 0x3098) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
450         if (character <= 0x309a) return CANONICAL_COMBINING_CLASS_KANA_VOICING;
451         if (character <= 0xa66e) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
452         if (character <= 0xa66f) return CANONICAL_COMBINING_CLASS_ABOVE;
453         if (character <= 0xa67b) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
454         if (character <= 0xa67d) return CANONICAL_COMBINING_CLASS_ABOVE;
455         if (character <= 0xa805) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
456         if (character <= 0xa806) return CANONICAL_COMBINING_CLASS_VIRAMA;
457         if (character <= 0xa8c3) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
458         if (character <= 0xa8c4) return CANONICAL_COMBINING_CLASS_VIRAMA;
459         if (character <= 0xa92a) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
460         if (character <= 0xa92d) return CANONICAL_COMBINING_CLASS_BELOW;
461         if (character <= 0xa952) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
462         if (character <= 0xa953) return CANONICAL_COMBINING_CLASS_VIRAMA;
463         if (character <= 0xfb1d) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
464         if (character <= 0xfb1e) return CANONICAL_COMBINING_CLASS_26;
465         if (character <= 0xfe1f) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
466         if (character <= 0xfe26) return CANONICAL_COMBINING_CLASS_ABOVE;
467         if (character <= 0x101fc) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
468         if (character <= 0x101fd) return CANONICAL_COMBINING_CLASS_BELOW;
469         if (character <= 0x10a0c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
470         if (character <= 0x10a0d) return CANONICAL_COMBINING_CLASS_BELOW;
471         if (character <= 0x10a0e) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
472         if (character <= 0x10a0f) return CANONICAL_COMBINING_CLASS_ABOVE;
473         if (character <= 0x10a37) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
474         if (character <= 0x10a38) return CANONICAL_COMBINING_CLASS_ABOVE;
475         if (character <= 0x10a39) return CANONICAL_COMBINING_CLASS_OVERLAY;
476         if (character <= 0x10a3a) return CANONICAL_COMBINING_CLASS_BELOW;
477         if (character <= 0x10a3e) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
478         if (character <= 0x10a3f) return CANONICAL_COMBINING_CLASS_VIRAMA;
479         if (character <= 0x1d164) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
480         if (character <= 0x1d166) return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
481         if (character <= 0x1d169) return CANONICAL_COMBINING_CLASS_OVERLAY;
482         if (character <= 0x1d16c) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
483         if (character <= 0x1d16d) return CANONICAL_COMBINING_CLASS_RIGHT;
484         if (character <= 0x1d172) return CANONICAL_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT;
485         if (character <= 0x1d17a) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
486         if (character <= 0x1d182) return CANONICAL_COMBINING_CLASS_BELOW;
487         if (character <= 0x1d184) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
488         if (character <= 0x1d189) return CANONICAL_COMBINING_CLASS_ABOVE;
489         if (character <= 0x1d18b) return CANONICAL_COMBINING_CLASS_BELOW;
490         if (character <= 0x1d1a9) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
491         if (character <= 0x1d1ad) return CANONICAL_COMBINING_CLASS_ABOVE;
492         if (character <= 0x1d241) return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
493         if (character <= 0x1d244) return CANONICAL_COMBINING_CLASS_ABOVE;
494 
495 
496         return CANONICAL_COMBINING_CLASS_NOT_REORDERED;
497     }
498 
499 
500     private final static int FIRST_HANGUL_SYLLABLE    = 0xAC00;
501     // even if this is not right; why do tests still pass????
502     // private final static int LAST_HANGUL_SYLLABLE     = 0xAC00; // FIXME
503     private final static int LAST_HANGUL_SYLLABLE = 0xD7A3;
504 
505 
combineSurrogatePair(char highSurrogate, char lowSurrogate)506     static int combineSurrogatePair(char highSurrogate, char lowSurrogate) {
507 
508         int high = highSurrogate & 0x7FF;
509         int low  = lowSurrogate - 0xDC00;
510         int highShifted = high << 10;
511         int combined = highShifted | low;
512         int codePoint = combined + 0x10000;
513         return codePoint;
514 
515     }
516 
makeSurrogatePair(int codePoint)517     private static String makeSurrogatePair(int codePoint) {
518 
519         StringBuffer s = new StringBuffer(2);
520         if (codePoint <= 0xFFFF) s.append((char) codePoint);
521         else {
522             char high = (char) (0xD800 - (0x10000 >> 10) + (codePoint >> 10));
523             char low = (char) (0xDC00 + (codePoint & 0x3FF));
524             s.append(high);
525             s.append(low);
526         }
527         return s.toString();
528 
529     }
530 
getHighSurrogate(int codepoint)531     private static char getHighSurrogate(int codepoint) {
532 
533         char x = (char) codepoint;
534         int u = (codepoint >> 16) & ((1<<5) - 1);
535         char w = (char) (u - 1);
536         return (char) (HI_SURROGATE_START | (w << 6) | x >> 10);
537 
538     }
539 
540 
getLowSurrogate(int codepoint)541     private static char getLowSurrogate(int codepoint) {
542 
543         char x = (char) codepoint;
544         return (char) (LOW_SURROGATE_START | x & ((1<<10) - 1));
545 
546     }
547 
548 
normalize(String s)549     static String normalize(String s) {
550 
551         boolean needsNormalizing = false;
552 
553         int length = s.length();
554         for (int i = 0; i < length; i++) {
555             char c = s.charAt(i);
556             if (c > 255) {
557                 needsNormalizing = true;
558                 break;
559             }
560         }
561 
562         if (needsNormalizing) {
563 
564             // ???? unnecessarily invoking this in many cases
565             s = decomposeHangul(s);
566             UnicodeString ustring = new UnicodeString(s);
567             UnicodeString decomposed = ustring.decompose();
568             UnicodeString recomposed = decomposed.compose();
569             String result = recomposed.toString();
570             // ???? unnecessarily invoking this in many cases
571             result = composeHangul(result);
572             return result;
573         }
574 
575         return s;
576 
577     }
578 
579 
decomposeHangul(String s)580     private static String decomposeHangul(String s) {
581 
582         int length = s.length();
583         StringBuffer sb = new StringBuffer(s.length());
584         for (int i = 0; i < length; i++) {
585             char c = s.charAt(i);
586             if (c >= FIRST_HANGUL_SYLLABLE && c <= LAST_HANGUL_SYLLABLE) {
587                 sb.append(decomposeHangul(c));
588             }
589             else {
590                 sb.append(c);
591             }
592         }
593         return sb.toString();
594 
595     }
596 
597 
598     // return -1 if the character cannot be combined with the starter;
599     // otherwise return the composed character
composeCharacter(int starter, int c)600     private static int composeCharacter(int starter, int c) {
601 
602         StringBuffer decomposed = new StringBuffer(4);
603 
604         if (starter > 0xFFFF) {
605             decomposed.append(getHighSurrogate(starter));
606             decomposed.append(getLowSurrogate(starter));
607         }
608         else decomposed.append((char) starter);
609 
610         if (c > 0xFFFF) {
611             decomposed.append(getHighSurrogate(c));
612             decomposed.append(getLowSurrogate(c));
613         }
614         else decomposed.append((char) c);
615 
616         String recomposed = (String) compositions.get(decomposed.toString());
617         if (recomposed == null) return -1;
618         else if (recomposed.length() == 1) return recomposed.charAt(0);
619         else return combineSurrogatePair(recomposed.charAt(0), recomposed.charAt(1));
620 
621     }
622 
623 
624     // FIXME must recurse this
625     ///CLOVER:OFF
decompose(int character)626     private static String decompose(int character) {
627 
628         if (character < 0x00C0) {
629             return String.valueOf((char) character);
630         }
631         else if (character >= FIRST_HANGUL_SYLLABLE && character <= LAST_HANGUL_SYLLABLE) {
632             return decomposeHangul((char) character);
633         }
634 
635         // XXX use lookup table prepopulated with large string at first use
636         switch (character) {
637         case 0x00C0:
638             return "\u0041\u0300";
639         case 0x00C1:
640             return "\u0041\u0301";
641         case 0x00C2:
642             return "\u0041\u0302";
643         case 0x00C3:
644             return "\u0041\u0303";
645         case 0x00C4:
646             return "\u0041\u0308";
647         case 0x00C5:
648             return "\u0041\u030A";
649         case 0x00C7:
650             return "\u0043\u0327";
651         case 0x00C8:
652             return "\u0045\u0300";
653         case 0x00C9:
654             return "\u0045\u0301";
655         case 0x00CA:
656             return "\u0045\u0302";
657         case 0x00CB:
658             return "\u0045\u0308";
659         case 0x00CC:
660             return "\u0049\u0300";
661         case 0x00CD:
662             return "\u0049\u0301";
663         case 0x00CE:
664             return "\u0049\u0302";
665         case 0x00CF:
666             return "\u0049\u0308";
667         case 0x00D1:
668             return "\u004E\u0303";
669         case 0x00D2:
670             return "\u004F\u0300";
671         case 0x00D3:
672             return "\u004F\u0301";
673         case 0x00D4:
674             return "\u004F\u0302";
675         case 0x00D5:
676             return "\u004F\u0303";
677         case 0x00D6:
678             return "\u004F\u0308";
679         case 0x00D9:
680             return "\u0055\u0300";
681         case 0x00DA:
682             return "\u0055\u0301";
683         case 0x00DB:
684             return "\u0055\u0302";
685         case 0x00DC:
686             return "\u0055\u0308";
687         case 0x00DD:
688             return "\u0059\u0301";
689         case 0x00E0:
690             return "\u0061\u0300";
691         case 0x00E1:
692             return "\u0061\u0301";
693         case 0x00E2:
694             return "\u0061\u0302";
695         case 0x00E3:
696             return "\u0061\u0303";
697         case 0x00E4:
698             return "\u0061\u0308";
699         case 0x00E5:
700             return "\u0061\u030A";
701         case 0x00E7:
702             return "\u0063\u0327";
703         case 0x00E8:
704             return "\u0065\u0300";
705         case 0x00E9:
706             return "\u0065\u0301";
707         case 0x00EA:
708             return "\u0065\u0302";
709         case 0x00EB:
710             return "\u0065\u0308";
711         case 0x00EC:
712             return "\u0069\u0300";
713         case 0x00ED:
714             return "\u0069\u0301";
715         case 0x00EE:
716             return "\u0069\u0302";
717         case 0x00EF:
718             return "\u0069\u0308";
719         case 0x00F1:
720             return "\u006E\u0303";
721         case 0x00F2:
722             return "\u006F\u0300";
723         case 0x00F3:
724             return "\u006F\u0301";
725         case 0x00F4:
726             return "\u006F\u0302";
727         case 0x00F5:
728             return "\u006F\u0303";
729         case 0x00F6:
730             return "\u006F\u0308";
731         case 0x00F9:
732             return "\u0075\u0300";
733         case 0x00FA:
734             return "\u0075\u0301";
735         case 0x00FB:
736             return "\u0075\u0302";
737         case 0x00FC:
738             return "\u0075\u0308";
739         case 0x00FD:
740             return "\u0079\u0301";
741         case 0x00FF:
742             return "\u0079\u0308";
743         case 0x0100:
744             return "\u0041\u0304";
745         case 0x0101:
746             return "\u0061\u0304";
747         case 0x0102:
748             return "\u0041\u0306";
749         case 0x0103:
750             return "\u0061\u0306";
751         case 0x0104:
752             return "\u0041\u0328";
753         case 0x0105:
754             return "\u0061\u0328";
755         case 0x0106:
756             return "\u0043\u0301";
757         case 0x0107:
758             return "\u0063\u0301";
759         case 0x0108:
760             return "\u0043\u0302";
761         case 0x0109:
762             return "\u0063\u0302";
763         case 0x010A:
764             return "\u0043\u0307";
765         case 0x010B:
766             return "\u0063\u0307";
767         case 0x010C:
768             return "\u0043\u030C";
769         case 0x010D:
770             return "\u0063\u030C";
771         case 0x010E:
772             return "\u0044\u030C";
773         case 0x010F:
774             return "\u0064\u030C";
775         case 0x0112:
776             return "\u0045\u0304";
777         case 0x0113:
778             return "\u0065\u0304";
779         case 0x0114:
780             return "\u0045\u0306";
781         case 0x0115:
782             return "\u0065\u0306";
783         case 0x0116:
784             return "\u0045\u0307";
785         case 0x0117:
786             return "\u0065\u0307";
787         case 0x0118:
788             return "\u0045\u0328";
789         case 0x0119:
790             return "\u0065\u0328";
791         case 0x011A:
792             return "\u0045\u030C";
793         case 0x011B:
794             return "\u0065\u030C";
795         case 0x011C:
796             return "\u0047\u0302";
797         case 0x011D:
798             return "\u0067\u0302";
799         case 0x011E:
800             return "\u0047\u0306";
801         case 0x011F:
802             return "\u0067\u0306";
803         case 0x0120:
804             return "\u0047\u0307";
805         case 0x0121:
806             return "\u0067\u0307";
807         case 0x0122:
808             return "\u0047\u0327";
809         case 0x0123:
810             return "\u0067\u0327";
811         case 0x0124:
812             return "\u0048\u0302";
813         case 0x0125:
814             return "\u0068\u0302";
815         case 0x0128:
816             return "\u0049\u0303";
817         case 0x0129:
818             return "\u0069\u0303";
819         case 0x012A:
820             return "\u0049\u0304";
821         case 0x012B:
822             return "\u0069\u0304";
823         case 0x012C:
824             return "\u0049\u0306";
825         case 0x012D:
826             return "\u0069\u0306";
827         case 0x012E:
828             return "\u0049\u0328";
829         case 0x012F:
830             return "\u0069\u0328";
831         case 0x0130:
832             return "\u0049\u0307";
833         case 0x0134:
834             return "\u004A\u0302";
835         case 0x0135:
836             return "\u006A\u0302";
837         case 0x0136:
838             return "\u004B\u0327";
839         case 0x0137:
840             return "\u006B\u0327";
841         case 0x0139:
842             return "\u004C\u0301";
843         case 0x013A:
844             return "\u006C\u0301";
845         case 0x013B:
846             return "\u004C\u0327";
847         case 0x013C:
848             return "\u006C\u0327";
849         case 0x013D:
850             return "\u004C\u030C";
851         case 0x013E:
852             return "\u006C\u030C";
853         case 0x0143:
854             return "\u004E\u0301";
855         case 0x0144:
856             return "\u006E\u0301";
857         case 0x0145:
858             return "\u004E\u0327";
859         case 0x0146:
860             return "\u006E\u0327";
861         case 0x0147:
862             return "\u004E\u030C";
863         case 0x0148:
864             return "\u006E\u030C";
865         case 0x014C:
866             return "\u004F\u0304";
867         case 0x014D:
868             return "\u006F\u0304";
869         case 0x014E:
870             return "\u004F\u0306";
871         case 0x014F:
872             return "\u006F\u0306";
873         case 0x0150:
874             return "\u004F\u030B";
875         case 0x0151:
876             return "\u006F\u030B";
877         case 0x0154:
878             return "\u0052\u0301";
879         case 0x0155:
880             return "\u0072\u0301";
881         case 0x0156:
882             return "\u0052\u0327";
883         case 0x0157:
884             return "\u0072\u0327";
885         case 0x0158:
886             return "\u0052\u030C";
887         case 0x0159:
888             return "\u0072\u030C";
889         case 0x015A:
890             return "\u0053\u0301";
891         case 0x015B:
892             return "\u0073\u0301";
893         case 0x015C:
894             return "\u0053\u0302";
895         case 0x015D:
896             return "\u0073\u0302";
897         case 0x015E:
898             return "\u0053\u0327";
899         case 0x015F:
900             return "\u0073\u0327";
901         case 0x0160:
902             return "\u0053\u030C";
903         case 0x0161:
904             return "\u0073\u030C";
905         case 0x0162:
906             return "\u0054\u0327";
907         case 0x0163:
908             return "\u0074\u0327";
909         case 0x0164:
910             return "\u0054\u030C";
911         case 0x0165:
912             return "\u0074\u030C";
913         case 0x0168:
914             return "\u0055\u0303";
915         case 0x0169:
916             return "\u0075\u0303";
917         case 0x016A:
918             return "\u0055\u0304";
919         case 0x016B:
920             return "\u0075\u0304";
921         case 0x016C:
922             return "\u0055\u0306";
923         case 0x016D:
924             return "\u0075\u0306";
925         case 0x016E:
926             return "\u0055\u030A";
927         case 0x016F:
928             return "\u0075\u030A";
929         case 0x0170:
930             return "\u0055\u030B";
931         case 0x0171:
932             return "\u0075\u030B";
933         case 0x0172:
934             return "\u0055\u0328";
935         case 0x0173:
936             return "\u0075\u0328";
937         case 0x0174:
938             return "\u0057\u0302";
939         case 0x0175:
940             return "\u0077\u0302";
941         case 0x0176:
942             return "\u0059\u0302";
943         case 0x0177:
944             return "\u0079\u0302";
945         case 0x0178:
946             return "\u0059\u0308";
947         case 0x0179:
948             return "\u005A\u0301";
949         case 0x017A:
950             return "\u007A\u0301";
951         case 0x017B:
952             return "\u005A\u0307";
953         case 0x017C:
954             return "\u007A\u0307";
955         case 0x017D:
956             return "\u005A\u030C";
957         case 0x017E:
958             return "\u007A\u030C";
959         case 0x01A0:
960             return "\u004F\u031B";
961         case 0x01A1:
962             return "\u006F\u031B";
963         case 0x01AF:
964             return "\u0055\u031B";
965         case 0x01B0:
966             return "\u0075\u031B";
967         case 0x01CD:
968             return "\u0041\u030C";
969         case 0x01CE:
970             return "\u0061\u030C";
971         case 0x01CF:
972             return "\u0049\u030C";
973         case 0x01D0:
974             return "\u0069\u030C";
975         case 0x01D1:
976             return "\u004F\u030C";
977         case 0x01D2:
978             return "\u006F\u030C";
979         case 0x01D3:
980             return "\u0055\u030C";
981         case 0x01D4:
982             return "\u0075\u030C";
983         case 0x01D5:
984             return "\u00DC\u0304";
985         case 0x01D6:
986             return "\u00FC\u0304";
987         case 0x01D7:
988             return "\u00DC\u0301";
989         case 0x01D8:
990             return "\u00FC\u0301";
991         case 0x01D9:
992             return "\u00DC\u030C";
993         case 0x01DA:
994             return "\u00FC\u030C";
995         case 0x01DB:
996             return "\u00DC\u0300";
997         case 0x01DC:
998             return "\u00FC\u0300";
999         case 0x01DE:
1000             return "\u00C4\u0304";
1001         case 0x01DF:
1002             return "\u00E4\u0304";
1003         case 0x01E0:
1004             return "\u0226\u0304";
1005         case 0x01E1:
1006             return "\u0227\u0304";
1007         case 0x01E2:
1008             return "\u00C6\u0304";
1009         case 0x01E3:
1010             return "\u00E6\u0304";
1011         case 0x01E6:
1012             return "\u0047\u030C";
1013         case 0x01E7:
1014             return "\u0067\u030C";
1015         case 0x01E8:
1016             return "\u004B\u030C";
1017         case 0x01E9:
1018             return "\u006B\u030C";
1019         case 0x01EA:
1020             return "\u004F\u0328";
1021         case 0x01EB:
1022             return "\u006F\u0328";
1023         case 0x01EC:
1024             return "\u01EA\u0304";
1025         case 0x01ED:
1026             return "\u01EB\u0304";
1027         case 0x01EE:
1028             return "\u01B7\u030C";
1029         case 0x01EF:
1030             return "\u0292\u030C";
1031         case 0x01F0:
1032             return "\u006A\u030C";
1033         case 0x01F4:
1034             return "\u0047\u0301";
1035         case 0x01F5:
1036             return "\u0067\u0301";
1037         case 0x01F8:
1038             return "\u004E\u0300";
1039         case 0x01F9:
1040             return "\u006E\u0300";
1041         case 0x01FA:
1042             return "\u00C5\u0301";
1043         case 0x01FB:
1044             return "\u00E5\u0301";
1045         case 0x01FC:
1046             return "\u00C6\u0301";
1047         case 0x01FD:
1048             return "\u00E6\u0301";
1049         case 0x01FE:
1050             return "\u00D8\u0301";
1051         case 0x01FF:
1052             return "\u00F8\u0301";
1053         case 0x0200:
1054             return "\u0041\u030F";
1055         case 0x0201:
1056             return "\u0061\u030F";
1057         case 0x0202:
1058             return "\u0041\u0311";
1059         case 0x0203:
1060             return "\u0061\u0311";
1061         case 0x0204:
1062             return "\u0045\u030F";
1063         case 0x0205:
1064             return "\u0065\u030F";
1065         case 0x0206:
1066             return "\u0045\u0311";
1067         case 0x0207:
1068             return "\u0065\u0311";
1069         case 0x0208:
1070             return "\u0049\u030F";
1071         case 0x0209:
1072             return "\u0069\u030F";
1073         case 0x020A:
1074             return "\u0049\u0311";
1075         case 0x020B:
1076             return "\u0069\u0311";
1077         case 0x020C:
1078             return "\u004F\u030F";
1079         case 0x020D:
1080             return "\u006F\u030F";
1081         case 0x020E:
1082             return "\u004F\u0311";
1083         case 0x020F:
1084             return "\u006F\u0311";
1085         case 0x0210:
1086             return "\u0052\u030F";
1087         case 0x0211:
1088             return "\u0072\u030F";
1089         case 0x0212:
1090             return "\u0052\u0311";
1091         case 0x0213:
1092             return "\u0072\u0311";
1093         case 0x0214:
1094             return "\u0055\u030F";
1095         case 0x0215:
1096             return "\u0075\u030F";
1097         case 0x0216:
1098             return "\u0055\u0311";
1099         case 0x0217:
1100             return "\u0075\u0311";
1101         case 0x0218:
1102             return "\u0053\u0326";
1103         case 0x0219:
1104             return "\u0073\u0326";
1105         case 0x021A:
1106             return "\u0054\u0326";
1107         case 0x021B:
1108             return "\u0074\u0326";
1109         case 0x021E:
1110             return "\u0048\u030C";
1111         case 0x021F:
1112             return "\u0068\u030C";
1113         case 0x0226:
1114             return "\u0041\u0307";
1115         case 0x0227:
1116             return "\u0061\u0307";
1117         case 0x0228:
1118             return "\u0045\u0327";
1119         case 0x0229:
1120             return "\u0065\u0327";
1121         case 0x022A:
1122             return "\u00D6\u0304";
1123         case 0x022B:
1124             return "\u00F6\u0304";
1125         case 0x022C:
1126             return "\u00D5\u0304";
1127         case 0x022D:
1128             return "\u00F5\u0304";
1129         case 0x022E:
1130             return "\u004F\u0307";
1131         case 0x022F:
1132             return "\u006F\u0307";
1133         case 0x0230:
1134             return "\u022E\u0304";
1135         case 0x0231:
1136             return "\u022F\u0304";
1137         case 0x0232:
1138             return "\u0059\u0304";
1139         case 0x0233:
1140             return "\u0079\u0304";
1141         case 0x0340:
1142             return "\u0300";
1143         case 0x0341:
1144             return "\u0301";
1145         case 0x0343:
1146             return "\u0313";
1147         case 0x0344:
1148             return "\u0308\u0301";
1149         case 0x0374:
1150             return "\u02B9";
1151         case 0x037E:
1152             return "\u003B";
1153         case 0x0385:
1154             return "\u00A8\u0301";
1155         case 0x0386:
1156             return "\u0391\u0301";
1157         case 0x0387:
1158             return "\u00B7";
1159         case 0x0388:
1160             return "\u0395\u0301";
1161         case 0x0389:
1162             return "\u0397\u0301";
1163         case 0x038A:
1164             return "\u0399\u0301";
1165         case 0x038C:
1166             return "\u039F\u0301";
1167         case 0x038E:
1168             return "\u03A5\u0301";
1169         case 0x038F:
1170             return "\u03A9\u0301";
1171         case 0x0390:
1172             return "\u03CA\u0301";
1173         case 0x03AA:
1174             return "\u0399\u0308";
1175         case 0x03AB:
1176             return "\u03A5\u0308";
1177         case 0x03AC:
1178             return "\u03B1\u0301";
1179         case 0x03AD:
1180             return "\u03B5\u0301";
1181         case 0x03AE:
1182             return "\u03B7\u0301";
1183         case 0x03AF:
1184             return "\u03B9\u0301";
1185         case 0x03B0:
1186             return "\u03CB\u0301";
1187         case 0x03CA:
1188             return "\u03B9\u0308";
1189         case 0x03CB:
1190             return "\u03C5\u0308";
1191         case 0x03CC:
1192             return "\u03BF\u0301";
1193         case 0x03CD:
1194             return "\u03C5\u0301";
1195         case 0x03CE:
1196             return "\u03C9\u0301";
1197         case 0x03D3:
1198             return "\u03D2\u0301";
1199         case 0x03D4:
1200             return "\u03D2\u0308";
1201         case 0x0400:
1202             return "\u0415\u0300";
1203         case 0x0401:
1204             return "\u0415\u0308";
1205         case 0x0403:
1206             return "\u0413\u0301";
1207         case 0x0407:
1208             return "\u0406\u0308";
1209         case 0x040C:
1210             return "\u041A\u0301";
1211         case 0x040D:
1212             return "\u0418\u0300";
1213         case 0x040E:
1214             return "\u0423\u0306";
1215         case 0x0419:
1216             return "\u0418\u0306";
1217         case 0x0439:
1218             return "\u0438\u0306";
1219         case 0x0450:
1220             return "\u0435\u0300";
1221         case 0x0451:
1222             return "\u0435\u0308";
1223         case 0x0453:
1224             return "\u0433\u0301";
1225         case 0x0457:
1226             return "\u0456\u0308";
1227         case 0x045C:
1228             return "\u043A\u0301";
1229         case 0x045D:
1230             return "\u0438\u0300";
1231         case 0x045E:
1232             return "\u0443\u0306";
1233         case 0x0476:
1234             return "\u0474\u030F";
1235         case 0x0477:
1236             return "\u0475\u030F";
1237         case 0x04C1:
1238             return "\u0416\u0306";
1239         case 0x04C2:
1240             return "\u0436\u0306";
1241         case 0x04D0:
1242             return "\u0410\u0306";
1243         case 0x04D1:
1244             return "\u0430\u0306";
1245         case 0x04D2:
1246             return "\u0410\u0308";
1247         case 0x04D3:
1248             return "\u0430\u0308";
1249         case 0x04D6:
1250             return "\u0415\u0306";
1251         case 0x04D7:
1252             return "\u0435\u0306";
1253         case 0x04DA:
1254             return "\u04D8\u0308";
1255         case 0x04DB:
1256             return "\u04D9\u0308";
1257         case 0x04DC:
1258             return "\u0416\u0308";
1259         case 0x04DD:
1260             return "\u0436\u0308";
1261         case 0x04DE:
1262             return "\u0417\u0308";
1263         case 0x04DF:
1264             return "\u0437\u0308";
1265         case 0x04E2:
1266             return "\u0418\u0304";
1267         case 0x04E3:
1268             return "\u0438\u0304";
1269         case 0x04E4:
1270             return "\u0418\u0308";
1271         case 0x04E5:
1272             return "\u0438\u0308";
1273         case 0x04E6:
1274             return "\u041E\u0308";
1275         case 0x04E7:
1276             return "\u043E\u0308";
1277         case 0x04EA:
1278             return "\u04E8\u0308";
1279         case 0x04EB:
1280             return "\u04E9\u0308";
1281         case 0x04EC:
1282             return "\u042D\u0308";
1283         case 0x04ED:
1284             return "\u044D\u0308";
1285         case 0x04EE:
1286             return "\u0423\u0304";
1287         case 0x04EF:
1288             return "\u0443\u0304";
1289         case 0x04F0:
1290             return "\u0423\u0308";
1291         case 0x04F1:
1292             return "\u0443\u0308";
1293         case 0x04F2:
1294             return "\u0423\u030B";
1295         case 0x04F3:
1296             return "\u0443\u030B";
1297         case 0x04F4:
1298             return "\u0427\u0308";
1299         case 0x04F5:
1300             return "\u0447\u0308";
1301         case 0x04F8:
1302             return "\u042B\u0308";
1303         case 0x04F9:
1304             return "\u044B\u0308";
1305         case 0x0622:
1306             return "\u0627\u0653";
1307         case 0x0623:
1308             return "\u0627\u0654";
1309         case 0x0624:
1310             return "\u0648\u0654";
1311         case 0x0625:
1312             return "\u0627\u0655";
1313         case 0x0626:
1314             return "\u064A\u0654";
1315         case 0x06C0:
1316             return "\u06D5\u0654";
1317         case 0x06C2:
1318             return "\u06C1\u0654";
1319         case 0x06D3:
1320             return "\u06D2\u0654";
1321         case 0x0929:
1322             return "\u0928\u093C";
1323         case 0x0931:
1324             return "\u0930\u093C";
1325         case 0x0934:
1326             return "\u0933\u093C";
1327         case 0x0958:
1328             return "\u0915\u093C";
1329         case 0x0959:
1330             return "\u0916\u093C";
1331         case 0x095A:
1332             return "\u0917\u093C";
1333         case 0x095B:
1334             return "\u091C\u093C";
1335         case 0x095C:
1336             return "\u0921\u093C";
1337         case 0x095D:
1338             return "\u0922\u093C";
1339         case 0x095E:
1340             return "\u092B\u093C";
1341         case 0x095F:
1342             return "\u092F\u093C";
1343         case 0x09CB:
1344             return "\u09C7\u09BE";
1345         case 0x09CC:
1346             return "\u09C7\u09D7";
1347         case 0x09DC:
1348             return "\u09A1\u09BC";
1349         case 0x09DD:
1350             return "\u09A2\u09BC";
1351         case 0x09DF:
1352             return "\u09AF\u09BC";
1353         case 0x0A33:
1354             return "\u0A32\u0A3C";
1355         case 0x0A36:
1356             return "\u0A38\u0A3C";
1357         case 0x0A59:
1358             return "\u0A16\u0A3C";
1359         case 0x0A5A:
1360             return "\u0A17\u0A3C";
1361         case 0x0A5B:
1362             return "\u0A1C\u0A3C";
1363         case 0x0A5E:
1364             return "\u0A2B\u0A3C";
1365         case 0x0B48:
1366             return "\u0B47\u0B56";
1367         case 0x0B4B:
1368             return "\u0B47\u0B3E";
1369         case 0x0B4C:
1370             return "\u0B47\u0B57";
1371         case 0x0B5C:
1372             return "\u0B21\u0B3C";
1373         case 0x0B5D:
1374             return "\u0B22\u0B3C";
1375         case 0x0B94:
1376             return "\u0B92\u0BD7";
1377         case 0x0BCA:
1378             return "\u0BC6\u0BBE";
1379         case 0x0BCB:
1380             return "\u0BC7\u0BBE";
1381         case 0x0BCC:
1382             return "\u0BC6\u0BD7";
1383         case 0x0C48:
1384             return "\u0C46\u0C56";
1385         case 0x0CC0:
1386             return "\u0CBF\u0CD5";
1387         case 0x0CC7:
1388             return "\u0CC6\u0CD5";
1389         case 0x0CC8:
1390             return "\u0CC6\u0CD6";
1391         case 0x0CCA:
1392             return "\u0CC6\u0CC2";
1393         case 0x0CCB:
1394             return "\u0CCA\u0CD5";
1395         case 0x0D4A:
1396             return "\u0D46\u0D3E";
1397         case 0x0D4B:
1398             return "\u0D47\u0D3E";
1399         case 0x0D4C:
1400             return "\u0D46\u0D57";
1401         case 0x0DDA:
1402             return "\u0DD9\u0DCA";
1403         case 0x0DDC:
1404             return "\u0DD9\u0DCF";
1405         case 0x0DDD:
1406             return "\u0DDC\u0DCA";
1407         case 0x0DDE:
1408             return "\u0DD9\u0DDF";
1409         case 0x0F43:
1410             return "\u0F42\u0FB7";
1411         case 0x0F4D:
1412             return "\u0F4C\u0FB7";
1413         case 0x0F52:
1414             return "\u0F51\u0FB7";
1415         case 0x0F57:
1416             return "\u0F56\u0FB7";
1417         case 0x0F5C:
1418             return "\u0F5B\u0FB7";
1419         case 0x0F69:
1420             return "\u0F40\u0FB5";
1421         case 0x0F73:
1422             return "\u0F71\u0F72";
1423         case 0x0F75:
1424             return "\u0F71\u0F74";
1425         case 0x0F76:
1426             return "\u0FB2\u0F80";
1427         case 0x0F78:
1428             return "\u0FB3\u0F80";
1429         case 0x0F81:
1430             return "\u0F71\u0F80";
1431         case 0x0F93:
1432             return "\u0F92\u0FB7";
1433         case 0x0F9D:
1434             return "\u0F9C\u0FB7";
1435         case 0x0FA2:
1436             return "\u0FA1\u0FB7";
1437         case 0x0FA7:
1438             return "\u0FA6\u0FB7";
1439         case 0x0FAC:
1440             return "\u0FAB\u0FB7";
1441         case 0x0FB9:
1442             return "\u0F90\u0FB5";
1443         case 0x1026:
1444             return "\u1025\u102E";
1445         case 0x1B06:
1446             return "\u1B05\u1B35";
1447         case 0x1B08:
1448             return "\u1B07\u1B35";
1449         case 0x1B0A:
1450             return "\u1B09\u1B35";
1451         case 0x1B0C:
1452             return "\u1B0B\u1B35";
1453         case 0x1B0E:
1454             return "\u1B0D\u1B35";
1455         case 0x1B12:
1456             return "\u1B11\u1B35";
1457         case 0x1B3B:
1458             return "\u1B3A\u1B35";
1459         case 0x1B3D:
1460             return "\u1B3C\u1B35";
1461         case 0x1B40:
1462             return "\u1B3E\u1B35";
1463         case 0x1B41:
1464             return "\u1B3F\u1B35";
1465         case 0x1B43:
1466             return "\u1B42\u1B35";
1467         case 0x1E00:
1468             return "\u0041\u0325";
1469         case 0x1E01:
1470             return "\u0061\u0325";
1471         case 0x1E02:
1472             return "\u0042\u0307";
1473         case 0x1E03:
1474             return "\u0062\u0307";
1475         case 0x1E04:
1476             return "\u0042\u0323";
1477         case 0x1E05:
1478             return "\u0062\u0323";
1479         case 0x1E06:
1480             return "\u0042\u0331";
1481         case 0x1E07:
1482             return "\u0062\u0331";
1483         case 0x1E08:
1484             return "\u00C7\u0301";
1485         case 0x1E09:
1486             return "\u00E7\u0301";
1487         case 0x1E0A:
1488             return "\u0044\u0307";
1489         case 0x1E0B:
1490             return "\u0064\u0307";
1491         case 0x1E0C:
1492             return "\u0044\u0323";
1493         case 0x1E0D:
1494             return "\u0064\u0323";
1495         case 0x1E0E:
1496             return "\u0044\u0331";
1497         case 0x1E0F:
1498             return "\u0064\u0331";
1499         case 0x1E10:
1500             return "\u0044\u0327";
1501         case 0x1E11:
1502             return "\u0064\u0327";
1503         case 0x1E12:
1504             return "\u0044\u032D";
1505         case 0x1E13:
1506             return "\u0064\u032D";
1507         case 0x1E14:
1508             return "\u0112\u0300";
1509         case 0x1E15:
1510             return "\u0113\u0300";
1511         case 0x1E16:
1512             return "\u0112\u0301";
1513         case 0x1E17:
1514             return "\u0113\u0301";
1515         case 0x1E18:
1516             return "\u0045\u032D";
1517         case 0x1E19:
1518             return "\u0065\u032D";
1519         case 0x1E1A:
1520             return "\u0045\u0330";
1521         case 0x1E1B:
1522             return "\u0065\u0330";
1523         case 0x1E1C:
1524             return "\u0228\u0306";
1525         case 0x1E1D:
1526             return "\u0229\u0306";
1527         case 0x1E1E:
1528             return "\u0046\u0307";
1529         case 0x1E1F:
1530             return "\u0066\u0307";
1531         case 0x1E20:
1532             return "\u0047\u0304";
1533         case 0x1E21:
1534             return "\u0067\u0304";
1535         case 0x1E22:
1536             return "\u0048\u0307";
1537         case 0x1E23:
1538             return "\u0068\u0307";
1539         case 0x1E24:
1540             return "\u0048\u0323";
1541         case 0x1E25:
1542             return "\u0068\u0323";
1543         case 0x1E26:
1544             return "\u0048\u0308";
1545         case 0x1E27:
1546             return "\u0068\u0308";
1547         case 0x1E28:
1548             return "\u0048\u0327";
1549         case 0x1E29:
1550             return "\u0068\u0327";
1551         case 0x1E2A:
1552             return "\u0048\u032E";
1553         case 0x1E2B:
1554             return "\u0068\u032E";
1555         case 0x1E2C:
1556             return "\u0049\u0330";
1557         case 0x1E2D:
1558             return "\u0069\u0330";
1559         case 0x1E2E:
1560             return "\u00CF\u0301";
1561         case 0x1E2F:
1562             return "\u00EF\u0301";
1563         case 0x1E30:
1564             return "\u004B\u0301";
1565         case 0x1E31:
1566             return "\u006B\u0301";
1567         case 0x1E32:
1568             return "\u004B\u0323";
1569         case 0x1E33:
1570             return "\u006B\u0323";
1571         case 0x1E34:
1572             return "\u004B\u0331";
1573         case 0x1E35:
1574             return "\u006B\u0331";
1575         case 0x1E36:
1576             return "\u004C\u0323";
1577         case 0x1E37:
1578             return "\u006C\u0323";
1579         case 0x1E38:
1580             return "\u1E36\u0304";
1581         case 0x1E39:
1582             return "\u1E37\u0304";
1583         case 0x1E3A:
1584             return "\u004C\u0331";
1585         case 0x1E3B:
1586             return "\u006C\u0331";
1587         case 0x1E3C:
1588             return "\u004C\u032D";
1589         case 0x1E3D:
1590             return "\u006C\u032D";
1591         case 0x1E3E:
1592             return "\u004D\u0301";
1593         case 0x1E3F:
1594             return "\u006D\u0301";
1595         case 0x1E40:
1596             return "\u004D\u0307";
1597         case 0x1E41:
1598             return "\u006D\u0307";
1599         case 0x1E42:
1600             return "\u004D\u0323";
1601         case 0x1E43:
1602             return "\u006D\u0323";
1603         case 0x1E44:
1604             return "\u004E\u0307";
1605         case 0x1E45:
1606             return "\u006E\u0307";
1607         case 0x1E46:
1608             return "\u004E\u0323";
1609         case 0x1E47:
1610             return "\u006E\u0323";
1611         case 0x1E48:
1612             return "\u004E\u0331";
1613         case 0x1E49:
1614             return "\u006E\u0331";
1615         case 0x1E4A:
1616             return "\u004E\u032D";
1617         case 0x1E4B:
1618             return "\u006E\u032D";
1619         case 0x1E4C:
1620             return "\u00D5\u0301";
1621         case 0x1E4D:
1622             return "\u00F5\u0301";
1623         case 0x1E4E:
1624             return "\u00D5\u0308";
1625         case 0x1E4F:
1626             return "\u00F5\u0308";
1627         case 0x1E50:
1628             return "\u014C\u0300";
1629         case 0x1E51:
1630             return "\u014D\u0300";
1631         case 0x1E52:
1632             return "\u014C\u0301";
1633         case 0x1E53:
1634             return "\u014D\u0301";
1635         case 0x1E54:
1636             return "\u0050\u0301";
1637         case 0x1E55:
1638             return "\u0070\u0301";
1639         case 0x1E56:
1640             return "\u0050\u0307";
1641         case 0x1E57:
1642             return "\u0070\u0307";
1643         case 0x1E58:
1644             return "\u0052\u0307";
1645         case 0x1E59:
1646             return "\u0072\u0307";
1647         case 0x1E5A:
1648             return "\u0052\u0323";
1649         case 0x1E5B:
1650             return "\u0072\u0323";
1651         case 0x1E5C:
1652             return "\u1E5A\u0304";
1653         case 0x1E5D:
1654             return "\u1E5B\u0304";
1655         case 0x1E5E:
1656             return "\u0052\u0331";
1657         case 0x1E5F:
1658             return "\u0072\u0331";
1659         case 0x1E60:
1660             return "\u0053\u0307";
1661         case 0x1E61:
1662             return "\u0073\u0307";
1663         case 0x1E62:
1664             return "\u0053\u0323";
1665         case 0x1E63:
1666             return "\u0073\u0323";
1667         case 0x1E64:
1668             return "\u015A\u0307";
1669         case 0x1E65:
1670             return "\u015B\u0307";
1671         case 0x1E66:
1672             return "\u0160\u0307";
1673         case 0x1E67:
1674             return "\u0161\u0307";
1675         case 0x1E68:
1676             return "\u1E62\u0307";
1677         case 0x1E69:
1678             return "\u1E63\u0307";
1679         case 0x1E6A:
1680             return "\u0054\u0307";
1681         case 0x1E6B:
1682             return "\u0074\u0307";
1683         case 0x1E6C:
1684             return "\u0054\u0323";
1685         case 0x1E6D:
1686             return "\u0074\u0323";
1687         case 0x1E6E:
1688             return "\u0054\u0331";
1689         case 0x1E6F:
1690             return "\u0074\u0331";
1691         case 0x1E70:
1692             return "\u0054\u032D";
1693         case 0x1E71:
1694             return "\u0074\u032D";
1695         case 0x1E72:
1696             return "\u0055\u0324";
1697         case 0x1E73:
1698             return "\u0075\u0324";
1699         case 0x1E74:
1700             return "\u0055\u0330";
1701         case 0x1E75:
1702             return "\u0075\u0330";
1703         case 0x1E76:
1704             return "\u0055\u032D";
1705         case 0x1E77:
1706             return "\u0075\u032D";
1707         case 0x1E78:
1708             return "\u0168\u0301";
1709         case 0x1E79:
1710             return "\u0169\u0301";
1711         case 0x1E7A:
1712             return "\u016A\u0308";
1713         case 0x1E7B:
1714             return "\u016B\u0308";
1715         case 0x1E7C:
1716             return "\u0056\u0303";
1717         case 0x1E7D:
1718             return "\u0076\u0303";
1719         case 0x1E7E:
1720             return "\u0056\u0323";
1721         case 0x1E7F:
1722             return "\u0076\u0323";
1723         case 0x1E80:
1724             return "\u0057\u0300";
1725         case 0x1E81:
1726             return "\u0077\u0300";
1727         case 0x1E82:
1728             return "\u0057\u0301";
1729         case 0x1E83:
1730             return "\u0077\u0301";
1731         case 0x1E84:
1732             return "\u0057\u0308";
1733         case 0x1E85:
1734             return "\u0077\u0308";
1735         case 0x1E86:
1736             return "\u0057\u0307";
1737         case 0x1E87:
1738             return "\u0077\u0307";
1739         case 0x1E88:
1740             return "\u0057\u0323";
1741         case 0x1E89:
1742             return "\u0077\u0323";
1743         case 0x1E8A:
1744             return "\u0058\u0307";
1745         case 0x1E8B:
1746             return "\u0078\u0307";
1747         case 0x1E8C:
1748             return "\u0058\u0308";
1749         case 0x1E8D:
1750             return "\u0078\u0308";
1751         case 0x1E8E:
1752             return "\u0059\u0307";
1753         case 0x1E8F:
1754             return "\u0079\u0307";
1755         case 0x1E90:
1756             return "\u005A\u0302";
1757         case 0x1E91:
1758             return "\u007A\u0302";
1759         case 0x1E92:
1760             return "\u005A\u0323";
1761         case 0x1E93:
1762             return "\u007A\u0323";
1763         case 0x1E94:
1764             return "\u005A\u0331";
1765         case 0x1E95:
1766             return "\u007A\u0331";
1767         case 0x1E96:
1768             return "\u0068\u0331";
1769         case 0x1E97:
1770             return "\u0074\u0308";
1771         case 0x1E98:
1772             return "\u0077\u030A";
1773         case 0x1E99:
1774             return "\u0079\u030A";
1775         case 0x1E9B:
1776             return "\u017F\u0307";
1777         case 0x1EA0:
1778             return "\u0041\u0323";
1779         case 0x1EA1:
1780             return "\u0061\u0323";
1781         case 0x1EA2:
1782             return "\u0041\u0309";
1783         case 0x1EA3:
1784             return "\u0061\u0309";
1785         case 0x1EA4:
1786             return "\u00C2\u0301";
1787         case 0x1EA5:
1788             return "\u00E2\u0301";
1789         case 0x1EA6:
1790             return "\u00C2\u0300";
1791         case 0x1EA7:
1792             return "\u00E2\u0300";
1793         case 0x1EA8:
1794             return "\u00C2\u0309";
1795         case 0x1EA9:
1796             return "\u00E2\u0309";
1797         case 0x1EAA:
1798             return "\u00C2\u0303";
1799         case 0x1EAB:
1800             return "\u00E2\u0303";
1801         case 0x1EAC:
1802             return "\u1EA0\u0302";
1803         case 0x1EAD:
1804             return "\u1EA1\u0302";
1805         case 0x1EAE:
1806             return "\u0102\u0301";
1807         case 0x1EAF:
1808             return "\u0103\u0301";
1809         case 0x1EB0:
1810             return "\u0102\u0300";
1811         case 0x1EB1:
1812             return "\u0103\u0300";
1813         case 0x1EB2:
1814             return "\u0102\u0309";
1815         case 0x1EB3:
1816             return "\u0103\u0309";
1817         case 0x1EB4:
1818             return "\u0102\u0303";
1819         case 0x1EB5:
1820             return "\u0103\u0303";
1821         case 0x1EB6:
1822             return "\u1EA0\u0306";
1823         case 0x1EB7:
1824             return "\u1EA1\u0306";
1825         case 0x1EB8:
1826             return "\u0045\u0323";
1827         case 0x1EB9:
1828             return "\u0065\u0323";
1829         case 0x1EBA:
1830             return "\u0045\u0309";
1831         case 0x1EBB:
1832             return "\u0065\u0309";
1833         case 0x1EBC:
1834             return "\u0045\u0303";
1835         case 0x1EBD:
1836             return "\u0065\u0303";
1837         case 0x1EBE:
1838             return "\u00CA\u0301";
1839         case 0x1EBF:
1840             return "\u00EA\u0301";
1841         case 0x1EC0:
1842             return "\u00CA\u0300";
1843         case 0x1EC1:
1844             return "\u00EA\u0300";
1845         case 0x1EC2:
1846             return "\u00CA\u0309";
1847         case 0x1EC3:
1848             return "\u00EA\u0309";
1849         case 0x1EC4:
1850             return "\u00CA\u0303";
1851         case 0x1EC5:
1852             return "\u00EA\u0303";
1853         case 0x1EC6:
1854             return "\u1EB8\u0302";
1855         case 0x1EC7:
1856             return "\u1EB9\u0302";
1857         case 0x1EC8:
1858             return "\u0049\u0309";
1859         case 0x1EC9:
1860             return "\u0069\u0309";
1861         case 0x1ECA:
1862             return "\u0049\u0323";
1863         case 0x1ECB:
1864             return "\u0069\u0323";
1865         case 0x1ECC:
1866             return "\u004F\u0323";
1867         case 0x1ECD:
1868             return "\u006F\u0323";
1869         case 0x1ECE:
1870             return "\u004F\u0309";
1871         case 0x1ECF:
1872             return "\u006F\u0309";
1873         case 0x1ED0:
1874             return "\u00D4\u0301";
1875         case 0x1ED1:
1876             return "\u00F4\u0301";
1877         case 0x1ED2:
1878             return "\u00D4\u0300";
1879         case 0x1ED3:
1880             return "\u00F4\u0300";
1881         case 0x1ED4:
1882             return "\u00D4\u0309";
1883         case 0x1ED5:
1884             return "\u00F4\u0309";
1885         case 0x1ED6:
1886             return "\u00D4\u0303";
1887         case 0x1ED7:
1888             return "\u00F4\u0303";
1889         case 0x1ED8:
1890             return "\u1ECC\u0302";
1891         case 0x1ED9:
1892             return "\u1ECD\u0302";
1893         case 0x1EDA:
1894             return "\u01A0\u0301";
1895         case 0x1EDB:
1896             return "\u01A1\u0301";
1897         case 0x1EDC:
1898             return "\u01A0\u0300";
1899         case 0x1EDD:
1900             return "\u01A1\u0300";
1901         case 0x1EDE:
1902             return "\u01A0\u0309";
1903         case 0x1EDF:
1904             return "\u01A1\u0309";
1905         case 0x1EE0:
1906             return "\u01A0\u0303";
1907         case 0x1EE1:
1908             return "\u01A1\u0303";
1909         case 0x1EE2:
1910             return "\u01A0\u0323";
1911         case 0x1EE3:
1912             return "\u01A1\u0323";
1913         case 0x1EE4:
1914             return "\u0055\u0323";
1915         case 0x1EE5:
1916             return "\u0075\u0323";
1917         case 0x1EE6:
1918             return "\u0055\u0309";
1919         case 0x1EE7:
1920             return "\u0075\u0309";
1921         case 0x1EE8:
1922             return "\u01AF\u0301";
1923         case 0x1EE9:
1924             return "\u01B0\u0301";
1925         case 0x1EEA:
1926             return "\u01AF\u0300";
1927         case 0x1EEB:
1928             return "\u01B0\u0300";
1929         case 0x1EEC:
1930             return "\u01AF\u0309";
1931         case 0x1EED:
1932             return "\u01B0\u0309";
1933         case 0x1EEE:
1934             return "\u01AF\u0303";
1935         case 0x1EEF:
1936             return "\u01B0\u0303";
1937         case 0x1EF0:
1938             return "\u01AF\u0323";
1939         case 0x1EF1:
1940             return "\u01B0\u0323";
1941         case 0x1EF2:
1942             return "\u0059\u0300";
1943         case 0x1EF3:
1944             return "\u0079\u0300";
1945         case 0x1EF4:
1946             return "\u0059\u0323";
1947         case 0x1EF5:
1948             return "\u0079\u0323";
1949         case 0x1EF6:
1950             return "\u0059\u0309";
1951         case 0x1EF7:
1952             return "\u0079\u0309";
1953         case 0x1EF8:
1954             return "\u0059\u0303";
1955         case 0x1EF9:
1956             return "\u0079\u0303";
1957         case 0x1F00:
1958             return "\u03B1\u0313";
1959         case 0x1F01:
1960             return "\u03B1\u0314";
1961         case 0x1F02:
1962             return "\u1F00\u0300";
1963         case 0x1F03:
1964             return "\u1F01\u0300";
1965         case 0x1F04:
1966             return "\u1F00\u0301";
1967         case 0x1F05:
1968             return "\u1F01\u0301";
1969         case 0x1F06:
1970             return "\u1F00\u0342";
1971         case 0x1F07:
1972             return "\u1F01\u0342";
1973         case 0x1F08:
1974             return "\u0391\u0313";
1975         case 0x1F09:
1976             return "\u0391\u0314";
1977         case 0x1F0A:
1978             return "\u1F08\u0300";
1979         case 0x1F0B:
1980             return "\u1F09\u0300";
1981         case 0x1F0C:
1982             return "\u1F08\u0301";
1983         case 0x1F0D:
1984             return "\u1F09\u0301";
1985         case 0x1F0E:
1986             return "\u1F08\u0342";
1987         case 0x1F0F:
1988             return "\u1F09\u0342";
1989         case 0x1F10:
1990             return "\u03B5\u0313";
1991         case 0x1F11:
1992             return "\u03B5\u0314";
1993         case 0x1F12:
1994             return "\u1F10\u0300";
1995         case 0x1F13:
1996             return "\u1F11\u0300";
1997         case 0x1F14:
1998             return "\u1F10\u0301";
1999         case 0x1F15:
2000             return "\u1F11\u0301";
2001         case 0x1F18:
2002             return "\u0395\u0313";
2003         case 0x1F19:
2004             return "\u0395\u0314";
2005         case 0x1F1A:
2006             return "\u1F18\u0300";
2007         case 0x1F1B:
2008             return "\u1F19\u0300";
2009         case 0x1F1C:
2010             return "\u1F18\u0301";
2011         case 0x1F1D:
2012             return "\u1F19\u0301";
2013         case 0x1F20:
2014             return "\u03B7\u0313";
2015         case 0x1F21:
2016             return "\u03B7\u0314";
2017         case 0x1F22:
2018             return "\u1F20\u0300";
2019         case 0x1F23:
2020             return "\u1F21\u0300";
2021         case 0x1F24:
2022             return "\u1F20\u0301";
2023         case 0x1F25:
2024             return "\u1F21\u0301";
2025         case 0x1F26:
2026             return "\u1F20\u0342";
2027         case 0x1F27:
2028             return "\u1F21\u0342";
2029         case 0x1F28:
2030             return "\u0397\u0313";
2031         case 0x1F29:
2032             return "\u0397\u0314";
2033         case 0x1F2A:
2034             return "\u1F28\u0300";
2035         case 0x1F2B:
2036             return "\u1F29\u0300";
2037         case 0x1F2C:
2038             return "\u1F28\u0301";
2039         case 0x1F2D:
2040             return "\u1F29\u0301";
2041         case 0x1F2E:
2042             return "\u1F28\u0342";
2043         case 0x1F2F:
2044             return "\u1F29\u0342";
2045         case 0x1F30:
2046             return "\u03B9\u0313";
2047         case 0x1F31:
2048             return "\u03B9\u0314";
2049         case 0x1F32:
2050             return "\u1F30\u0300";
2051         case 0x1F33:
2052             return "\u1F31\u0300";
2053         case 0x1F34:
2054             return "\u1F30\u0301";
2055         case 0x1F35:
2056             return "\u1F31\u0301";
2057         case 0x1F36:
2058             return "\u1F30\u0342";
2059         case 0x1F37:
2060             return "\u1F31\u0342";
2061         case 0x1F38:
2062             return "\u0399\u0313";
2063         case 0x1F39:
2064             return "\u0399\u0314";
2065         case 0x1F3A:
2066             return "\u1F38\u0300";
2067         case 0x1F3B:
2068             return "\u1F39\u0300";
2069         case 0x1F3C:
2070             return "\u1F38\u0301";
2071         case 0x1F3D:
2072             return "\u1F39\u0301";
2073         case 0x1F3E:
2074             return "\u1F38\u0342";
2075         case 0x1F3F:
2076             return "\u1F39\u0342";
2077         case 0x1F40:
2078             return "\u03BF\u0313";
2079         case 0x1F41:
2080             return "\u03BF\u0314";
2081         case 0x1F42:
2082             return "\u1F40\u0300";
2083         case 0x1F43:
2084             return "\u1F41\u0300";
2085         case 0x1F44:
2086             return "\u1F40\u0301";
2087         case 0x1F45:
2088             return "\u1F41\u0301";
2089         case 0x1F48:
2090             return "\u039F\u0313";
2091         case 0x1F49:
2092             return "\u039F\u0314";
2093         case 0x1F4A:
2094             return "\u1F48\u0300";
2095         case 0x1F4B:
2096             return "\u1F49\u0300";
2097         case 0x1F4C:
2098             return "\u1F48\u0301";
2099         case 0x1F4D:
2100             return "\u1F49\u0301";
2101         case 0x1F50:
2102             return "\u03C5\u0313";
2103         case 0x1F51:
2104             return "\u03C5\u0314";
2105         case 0x1F52:
2106             return "\u1F50\u0300";
2107         case 0x1F53:
2108             return "\u1F51\u0300";
2109         case 0x1F54:
2110             return "\u1F50\u0301";
2111         case 0x1F55:
2112             return "\u1F51\u0301";
2113         case 0x1F56:
2114             return "\u1F50\u0342";
2115         case 0x1F57:
2116             return "\u1F51\u0342";
2117         case 0x1F59:
2118             return "\u03A5\u0314";
2119         case 0x1F5B:
2120             return "\u1F59\u0300";
2121         case 0x1F5D:
2122             return "\u1F59\u0301";
2123         case 0x1F5F:
2124             return "\u1F59\u0342";
2125         case 0x1F60:
2126             return "\u03C9\u0313";
2127         case 0x1F61:
2128             return "\u03C9\u0314";
2129         case 0x1F62:
2130             return "\u1F60\u0300";
2131         case 0x1F63:
2132             return "\u1F61\u0300";
2133         case 0x1F64:
2134             return "\u1F60\u0301";
2135         case 0x1F65:
2136             return "\u1F61\u0301";
2137         case 0x1F66:
2138             return "\u1F60\u0342";
2139         case 0x1F67:
2140             return "\u1F61\u0342";
2141         case 0x1F68:
2142             return "\u03A9\u0313";
2143         case 0x1F69:
2144             return "\u03A9\u0314";
2145         case 0x1F6A:
2146             return "\u1F68\u0300";
2147         case 0x1F6B:
2148             return "\u1F69\u0300";
2149         case 0x1F6C:
2150             return "\u1F68\u0301";
2151         case 0x1F6D:
2152             return "\u1F69\u0301";
2153         case 0x1F6E:
2154             return "\u1F68\u0342";
2155         case 0x1F6F:
2156             return "\u1F69\u0342";
2157         case 0x1F70:
2158             return "\u03B1\u0300";
2159         case 0x1F71:
2160             return "\u03AC";
2161         case 0x1F72:
2162             return "\u03B5\u0300";
2163         case 0x1F73:
2164             return "\u03AD";
2165         case 0x1F74:
2166             return "\u03B7\u0300";
2167         case 0x1F75:
2168             return "\u03AE";
2169         case 0x1F76:
2170             return "\u03B9\u0300";
2171         case 0x1F77:
2172             return "\u03AF";
2173         case 0x1F78:
2174             return "\u03BF\u0300";
2175         case 0x1F79:
2176             return "\u03CC";
2177         case 0x1F7A:
2178             return "\u03C5\u0300";
2179         case 0x1F7B:
2180             return "\u03CD";
2181         case 0x1F7C:
2182             return "\u03C9\u0300";
2183         case 0x1F7D:
2184             return "\u03CE";
2185         case 0x1F80:
2186             return "\u1F00\u0345";
2187         case 0x1F81:
2188             return "\u1F01\u0345";
2189         case 0x1F82:
2190             return "\u1F02\u0345";
2191         case 0x1F83:
2192             return "\u1F03\u0345";
2193         case 0x1F84:
2194             return "\u1F04\u0345";
2195         case 0x1F85:
2196             return "\u1F05\u0345";
2197         case 0x1F86:
2198             return "\u1F06\u0345";
2199         case 0x1F87:
2200             return "\u1F07\u0345";
2201         case 0x1F88:
2202             return "\u1F08\u0345";
2203         case 0x1F89:
2204             return "\u1F09\u0345";
2205         case 0x1F8A:
2206             return "\u1F0A\u0345";
2207         case 0x1F8B:
2208             return "\u1F0B\u0345";
2209         case 0x1F8C:
2210             return "\u1F0C\u0345";
2211         case 0x1F8D:
2212             return "\u1F0D\u0345";
2213         case 0x1F8E:
2214             return "\u1F0E\u0345";
2215         case 0x1F8F:
2216             return "\u1F0F\u0345";
2217         case 0x1F90:
2218             return "\u1F20\u0345";
2219         case 0x1F91:
2220             return "\u1F21\u0345";
2221         case 0x1F92:
2222             return "\u1F22\u0345";
2223         case 0x1F93:
2224             return "\u1F23\u0345";
2225         case 0x1F94:
2226             return "\u1F24\u0345";
2227         case 0x1F95:
2228             return "\u1F25\u0345";
2229         case 0x1F96:
2230             return "\u1F26\u0345";
2231         case 0x1F97:
2232             return "\u1F27\u0345";
2233         case 0x1F98:
2234             return "\u1F28\u0345";
2235         case 0x1F99:
2236             return "\u1F29\u0345";
2237         case 0x1F9A:
2238             return "\u1F2A\u0345";
2239         case 0x1F9B:
2240             return "\u1F2B\u0345";
2241         case 0x1F9C:
2242             return "\u1F2C\u0345";
2243         case 0x1F9D:
2244             return "\u1F2D\u0345";
2245         case 0x1F9E:
2246             return "\u1F2E\u0345";
2247         case 0x1F9F:
2248             return "\u1F2F\u0345";
2249         case 0x1FA0:
2250             return "\u1F60\u0345";
2251         case 0x1FA1:
2252             return "\u1F61\u0345";
2253         case 0x1FA2:
2254             return "\u1F62\u0345";
2255         case 0x1FA3:
2256             return "\u1F63\u0345";
2257         case 0x1FA4:
2258             return "\u1F64\u0345";
2259         case 0x1FA5:
2260             return "\u1F65\u0345";
2261         case 0x1FA6:
2262             return "\u1F66\u0345";
2263         case 0x1FA7:
2264             return "\u1F67\u0345";
2265         case 0x1FA8:
2266             return "\u1F68\u0345";
2267         case 0x1FA9:
2268             return "\u1F69\u0345";
2269         case 0x1FAA:
2270             return "\u1F6A\u0345";
2271         case 0x1FAB:
2272             return "\u1F6B\u0345";
2273         case 0x1FAC:
2274             return "\u1F6C\u0345";
2275         case 0x1FAD:
2276             return "\u1F6D\u0345";
2277         case 0x1FAE:
2278             return "\u1F6E\u0345";
2279         case 0x1FAF:
2280             return "\u1F6F\u0345";
2281         case 0x1FB0:
2282             return "\u03B1\u0306";
2283         case 0x1FB1:
2284             return "\u03B1\u0304";
2285         case 0x1FB2:
2286             return "\u1F70\u0345";
2287         case 0x1FB3:
2288             return "\u03B1\u0345";
2289         case 0x1FB4:
2290             return "\u03AC\u0345";
2291         case 0x1FB6:
2292             return "\u03B1\u0342";
2293         case 0x1FB7:
2294             return "\u1FB6\u0345";
2295         case 0x1FB8:
2296             return "\u0391\u0306";
2297         case 0x1FB9:
2298             return "\u0391\u0304";
2299         case 0x1FBA:
2300             return "\u0391\u0300";
2301         case 0x1FBB:
2302             return "\u0386";
2303         case 0x1FBC:
2304             return "\u0391\u0345";
2305         case 0x1FBE:
2306             return "\u03B9";
2307         case 0x1FC1:
2308             return "\u00A8\u0342";
2309         case 0x1FC2:
2310             return "\u1F74\u0345";
2311         case 0x1FC3:
2312             return "\u03B7\u0345";
2313         case 0x1FC4:
2314             return "\u03AE\u0345";
2315         case 0x1FC6:
2316             return "\u03B7\u0342";
2317         case 0x1FC7:
2318             return "\u1FC6\u0345";
2319         case 0x1FC8:
2320             return "\u0395\u0300";
2321         case 0x1FC9:
2322             return "\u0388";
2323         case 0x1FCA:
2324             return "\u0397\u0300";
2325         case 0x1FCB:
2326             return "\u0389";
2327         case 0x1FCC:
2328             return "\u0397\u0345";
2329         case 0x1FCD:
2330             return "\u1FBF\u0300";
2331         case 0x1FCE:
2332             return "\u1FBF\u0301";
2333         case 0x1FCF:
2334             return "\u1FBF\u0342";
2335         case 0x1FD0:
2336             return "\u03B9\u0306";
2337         case 0x1FD1:
2338             return "\u03B9\u0304";
2339         case 0x1FD2:
2340             return "\u03CA\u0300";
2341         case 0x1FD3:
2342             return "\u0390";
2343         case 0x1FD6:
2344             return "\u03B9\u0342";
2345         case 0x1FD7:
2346             return "\u03CA\u0342";
2347         case 0x1FD8:
2348             return "\u0399\u0306";
2349         case 0x1FD9:
2350             return "\u0399\u0304";
2351         case 0x1FDA:
2352             return "\u0399\u0300";
2353         case 0x1FDB:
2354             return "\u038A";
2355         case 0x1FDD:
2356             return "\u1FFE\u0300";
2357         case 0x1FDE:
2358             return "\u1FFE\u0301";
2359         case 0x1FDF:
2360             return "\u1FFE\u0342";
2361         case 0x1FE0:
2362             return "\u03C5\u0306";
2363         case 0x1FE1:
2364             return "\u03C5\u0304";
2365         case 0x1FE2:
2366             return "\u03CB\u0300";
2367         case 0x1FE3:
2368             return "\u03B0";
2369         case 0x1FE4:
2370             return "\u03C1\u0313";
2371         case 0x1FE5:
2372             return "\u03C1\u0314";
2373         case 0x1FE6:
2374             return "\u03C5\u0342";
2375         case 0x1FE7:
2376             return "\u03CB\u0342";
2377         case 0x1FE8:
2378             return "\u03A5\u0306";
2379         case 0x1FE9:
2380             return "\u03A5\u0304";
2381         case 0x1FEA:
2382             return "\u03A5\u0300";
2383         case 0x1FEB:
2384             return "\u038E";
2385         case 0x1FEC:
2386             return "\u03A1\u0314";
2387         case 0x1FED:
2388             return "\u00A8\u0300";
2389         case 0x1FEE:
2390             return "\u0385";
2391         case 0x1FEF:
2392             return "\u0060";
2393         case 0x1FF2:
2394             return "\u1F7C\u0345";
2395         case 0x1FF3:
2396             return "\u03C9\u0345";
2397         case 0x1FF4:
2398             return "\u03CE\u0345";
2399         case 0x1FF6:
2400             return "\u03C9\u0342";
2401         case 0x1FF7:
2402             return "\u1FF6\u0345";
2403         case 0x1FF8:
2404             return "\u039F\u0300";
2405         case 0x1FF9:
2406             return "\u038C";
2407         case 0x1FFA:
2408             return "\u03A9\u0300";
2409         case 0x1FFB:
2410             return "\u038F";
2411         case 0x1FFC:
2412             return "\u03A9\u0345";
2413         case 0x1FFD:
2414             return "\u00B4";
2415         case 0x2000:
2416             return "\u2002";
2417         case 0x2001:
2418             return "\u2003";
2419         case 0x2126:
2420             return "\u03A9";
2421         case 0x212A:
2422             return "\u004B";
2423         case 0x212B:
2424             return "\u00C5";
2425         case 0x219A:
2426             return "\u2190\u0338";
2427         case 0x219B:
2428             return "\u2192\u0338";
2429         case 0x21AE:
2430             return "\u2194\u0338";
2431         case 0x21CD:
2432             return "\u21D0\u0338";
2433         case 0x21CE:
2434             return "\u21D4\u0338";
2435         case 0x21CF:
2436             return "\u21D2\u0338";
2437         case 0x2204:
2438             return "\u2203\u0338";
2439         case 0x2209:
2440             return "\u2208\u0338";
2441         case 0x220C:
2442             return "\u220B\u0338";
2443         case 0x2224:
2444             return "\u2223\u0338";
2445         case 0x2226:
2446             return "\u2225\u0338";
2447         case 0x2241:
2448             return "\u223C\u0338";
2449         case 0x2244:
2450             return "\u2243\u0338";
2451         case 0x2247:
2452             return "\u2245\u0338";
2453         case 0x2249:
2454             return "\u2248\u0338";
2455         case 0x2260:
2456             return "\u003D\u0338";
2457         case 0x2262:
2458             return "\u2261\u0338";
2459         case 0x226D:
2460             return "\u224D\u0338";
2461         case 0x226E:
2462             return "\u003C\u0338";
2463         case 0x226F:
2464             return "\u003E\u0338";
2465         case 0x2270:
2466             return "\u2264\u0338";
2467         case 0x2271:
2468             return "\u2265\u0338";
2469         case 0x2274:
2470             return "\u2272\u0338";
2471         case 0x2275:
2472             return "\u2273\u0338";
2473         case 0x2278:
2474             return "\u2276\u0338";
2475         case 0x2279:
2476             return "\u2277\u0338";
2477         case 0x2280:
2478             return "\u227A\u0338";
2479         case 0x2281:
2480             return "\u227B\u0338";
2481         case 0x2284:
2482             return "\u2282\u0338";
2483         case 0x2285:
2484             return "\u2283\u0338";
2485         case 0x2288:
2486             return "\u2286\u0338";
2487         case 0x2289:
2488             return "\u2287\u0338";
2489         case 0x22AC:
2490             return "\u22A2\u0338";
2491         case 0x22AD:
2492             return "\u22A8\u0338";
2493         case 0x22AE:
2494             return "\u22A9\u0338";
2495         case 0x22AF:
2496             return "\u22AB\u0338";
2497         case 0x22E0:
2498             return "\u227C\u0338";
2499         case 0x22E1:
2500             return "\u227D\u0338";
2501         case 0x22E2:
2502             return "\u2291\u0338";
2503         case 0x22E3:
2504             return "\u2292\u0338";
2505         case 0x22EA:
2506             return "\u22B2\u0338";
2507         case 0x22EB:
2508             return "\u22B3\u0338";
2509         case 0x22EC:
2510             return "\u22B4\u0338";
2511         case 0x22ED:
2512             return "\u22B5\u0338";
2513         case 0x2329:
2514             return "\u3008";
2515         case 0x232A:
2516             return "\u3009";
2517         case 0x2ADC:
2518             return "\u2ADD\u0338";
2519         case 0x304C:
2520             return "\u304B\u3099";
2521         case 0x304E:
2522             return "\u304D\u3099";
2523         case 0x3050:
2524             return "\u304F\u3099";
2525         case 0x3052:
2526             return "\u3051\u3099";
2527         case 0x3054:
2528             return "\u3053\u3099";
2529         case 0x3056:
2530             return "\u3055\u3099";
2531         case 0x3058:
2532             return "\u3057\u3099";
2533         case 0x305A:
2534             return "\u3059\u3099";
2535         case 0x305C:
2536             return "\u305B\u3099";
2537         case 0x305E:
2538             return "\u305D\u3099";
2539         case 0x3060:
2540             return "\u305F\u3099";
2541         case 0x3062:
2542             return "\u3061\u3099";
2543         case 0x3065:
2544             return "\u3064\u3099";
2545         case 0x3067:
2546             return "\u3066\u3099";
2547         case 0x3069:
2548             return "\u3068\u3099";
2549         case 0x3070:
2550             return "\u306F\u3099";
2551         case 0x3071:
2552             return "\u306F\u309A";
2553         case 0x3073:
2554             return "\u3072\u3099";
2555         case 0x3074:
2556             return "\u3072\u309A";
2557         case 0x3076:
2558             return "\u3075\u3099";
2559         case 0x3077:
2560             return "\u3075\u309A";
2561         case 0x3079:
2562             return "\u3078\u3099";
2563         case 0x307A:
2564             return "\u3078\u309A";
2565         case 0x307C:
2566             return "\u307B\u3099";
2567         case 0x307D:
2568             return "\u307B\u309A";
2569         case 0x3094:
2570             return "\u3046\u3099";
2571         case 0x309E:
2572             return "\u309D\u3099";
2573         case 0x30AC:
2574             return "\u30AB\u3099";
2575         case 0x30AE:
2576             return "\u30AD\u3099";
2577         case 0x30B0:
2578             return "\u30AF\u3099";
2579         case 0x30B2:
2580             return "\u30B1\u3099";
2581         case 0x30B4:
2582             return "\u30B3\u3099";
2583         case 0x30B6:
2584             return "\u30B5\u3099";
2585         case 0x30B8:
2586             return "\u30B7\u3099";
2587         case 0x30BA:
2588             return "\u30B9\u3099";
2589         case 0x30BC:
2590             return "\u30BB\u3099";
2591         case 0x30BE:
2592             return "\u30BD\u3099";
2593         case 0x30C0:
2594             return "\u30BF\u3099";
2595         case 0x30C2:
2596             return "\u30C1\u3099";
2597         case 0x30C5:
2598             return "\u30C4\u3099";
2599         case 0x30C7:
2600             return "\u30C6\u3099";
2601         case 0x30C9:
2602             return "\u30C8\u3099";
2603         case 0x30D0:
2604             return "\u30CF\u3099";
2605         case 0x30D1:
2606             return "\u30CF\u309A";
2607         case 0x30D3:
2608             return "\u30D2\u3099";
2609         case 0x30D4:
2610             return "\u30D2\u309A";
2611         case 0x30D6:
2612             return "\u30D5\u3099";
2613         case 0x30D7:
2614             return "\u30D5\u309A";
2615         case 0x30D9:
2616             return "\u30D8\u3099";
2617         case 0x30DA:
2618             return "\u30D8\u309A";
2619         case 0x30DC:
2620             return "\u30DB\u3099";
2621         case 0x30DD:
2622             return "\u30DB\u309A";
2623         case 0x30F4:
2624             return "\u30A6\u3099";
2625         case 0x30F7:
2626             return "\u30EF\u3099";
2627         case 0x30F8:
2628             return "\u30F0\u3099";
2629         case 0x30F9:
2630             return "\u30F1\u3099";
2631         case 0x30FA:
2632             return "\u30F2\u3099";
2633         case 0x30FE:
2634             return "\u30FD\u3099";
2635         case 0xF900:
2636             return "\u8C48";
2637         case 0xF901:
2638             return "\u66F4";
2639         case 0xF902:
2640             return "\u8ECA";
2641         case 0xF903:
2642             return "\u8CC8";
2643         case 0xF904:
2644             return "\u6ED1";
2645         case 0xF905:
2646             return "\u4E32";
2647         case 0xF906:
2648             return "\u53E5";
2649         case 0xF907:
2650             return "\u9F9C";
2651         case 0xF908:
2652             return "\u9F9C";
2653         case 0xF909:
2654             return "\u5951";
2655         case 0xF90A:
2656             return "\u91D1";
2657         case 0xF90B:
2658             return "\u5587";
2659         case 0xF90C:
2660             return "\u5948";
2661         case 0xF90D:
2662             return "\u61F6";
2663         case 0xF90E:
2664             return "\u7669";
2665         case 0xF90F:
2666             return "\u7F85";
2667         case 0xF910:
2668             return "\u863F";
2669         case 0xF911:
2670             return "\u87BA";
2671         case 0xF912:
2672             return "\u88F8";
2673         case 0xF913:
2674             return "\u908F";
2675         case 0xF914:
2676             return "\u6A02";
2677         case 0xF915:
2678             return "\u6D1B";
2679         case 0xF916:
2680             return "\u70D9";
2681         case 0xF917:
2682             return "\u73DE";
2683         case 0xF918:
2684             return "\u843D";
2685         case 0xF919:
2686             return "\u916A";
2687         case 0xF91A:
2688             return "\u99F1";
2689         case 0xF91B:
2690             return "\u4E82";
2691         case 0xF91C:
2692             return "\u5375";
2693         case 0xF91D:
2694             return "\u6B04";
2695         case 0xF91E:
2696             return "\u721B";
2697         case 0xF91F:
2698             return "\u862D";
2699         case 0xF920:
2700             return "\u9E1E";
2701         case 0xF921:
2702             return "\u5D50";
2703         case 0xF922:
2704             return "\u6FEB";
2705         case 0xF923:
2706             return "\u85CD";
2707         case 0xF924:
2708             return "\u8964";
2709         case 0xF925:
2710             return "\u62C9";
2711         case 0xF926:
2712             return "\u81D8";
2713         case 0xF927:
2714             return "\u881F";
2715         case 0xF928:
2716             return "\u5ECA";
2717         case 0xF929:
2718             return "\u6717";
2719         case 0xF92A:
2720             return "\u6D6A";
2721         case 0xF92B:
2722             return "\u72FC";
2723         case 0xF92C:
2724             return "\u90CE";
2725         case 0xF92D:
2726             return "\u4F86";
2727         case 0xF92E:
2728             return "\u51B7";
2729         case 0xF92F:
2730             return "\u52DE";
2731         case 0xF930:
2732             return "\u64C4";
2733         case 0xF931:
2734             return "\u6AD3";
2735         case 0xF932:
2736             return "\u7210";
2737         case 0xF933:
2738             return "\u76E7";
2739         case 0xF934:
2740             return "\u8001";
2741         case 0xF935:
2742             return "\u8606";
2743         case 0xF936:
2744             return "\u865C";
2745         case 0xF937:
2746             return "\u8DEF";
2747         case 0xF938:
2748             return "\u9732";
2749         case 0xF939:
2750             return "\u9B6F";
2751         case 0xF93A:
2752             return "\u9DFA";
2753         case 0xF93B:
2754             return "\u788C";
2755         case 0xF93C:
2756             return "\u797F";
2757         case 0xF93D:
2758             return "\u7DA0";
2759         case 0xF93E:
2760             return "\u83C9";
2761         case 0xF93F:
2762             return "\u9304";
2763         case 0xF940:
2764             return "\u9E7F";
2765         case 0xF941:
2766             return "\u8AD6";
2767         case 0xF942:
2768             return "\u58DF";
2769         case 0xF943:
2770             return "\u5F04";
2771         case 0xF944:
2772             return "\u7C60";
2773         case 0xF945:
2774             return "\u807E";
2775         case 0xF946:
2776             return "\u7262";
2777         case 0xF947:
2778             return "\u78CA";
2779         case 0xF948:
2780             return "\u8CC2";
2781         case 0xF949:
2782             return "\u96F7";
2783         case 0xF94A:
2784             return "\u58D8";
2785         case 0xF94B:
2786             return "\u5C62";
2787         case 0xF94C:
2788             return "\u6A13";
2789         case 0xF94D:
2790             return "\u6DDA";
2791         case 0xF94E:
2792             return "\u6F0F";
2793         case 0xF94F:
2794             return "\u7D2F";
2795         case 0xF950:
2796             return "\u7E37";
2797         case 0xF951:
2798             return "\u964B";
2799         case 0xF952:
2800             return "\u52D2";
2801         case 0xF953:
2802             return "\u808B";
2803         case 0xF954:
2804             return "\u51DC";
2805         case 0xF955:
2806             return "\u51CC";
2807         case 0xF956:
2808             return "\u7A1C";
2809         case 0xF957:
2810             return "\u7DBE";
2811         case 0xF958:
2812             return "\u83F1";
2813         case 0xF959:
2814             return "\u9675";
2815         case 0xF95A:
2816             return "\u8B80";
2817         case 0xF95B:
2818             return "\u62CF";
2819         case 0xF95C:
2820             return "\u6A02";
2821         case 0xF95D:
2822             return "\u8AFE";
2823         case 0xF95E:
2824             return "\u4E39";
2825         case 0xF95F:
2826             return "\u5BE7";
2827         case 0xF960:
2828             return "\u6012";
2829         case 0xF961:
2830             return "\u7387";
2831         case 0xF962:
2832             return "\u7570";
2833         case 0xF963:
2834             return "\u5317";
2835         case 0xF964:
2836             return "\u78FB";
2837         case 0xF965:
2838             return "\u4FBF";
2839         case 0xF966:
2840             return "\u5FA9";
2841         case 0xF967:
2842             return "\u4E0D";
2843         case 0xF968:
2844             return "\u6CCC";
2845         case 0xF969:
2846             return "\u6578";
2847         case 0xF96A:
2848             return "\u7D22";
2849         case 0xF96B:
2850             return "\u53C3";
2851         case 0xF96C:
2852             return "\u585E";
2853         case 0xF96D:
2854             return "\u7701";
2855         case 0xF96E:
2856             return "\u8449";
2857         case 0xF96F:
2858             return "\u8AAA";
2859         case 0xF970:
2860             return "\u6BBA";
2861         case 0xF971:
2862             return "\u8FB0";
2863         case 0xF972:
2864             return "\u6C88";
2865         case 0xF973:
2866             return "\u62FE";
2867         case 0xF974:
2868             return "\u82E5";
2869         case 0xF975:
2870             return "\u63A0";
2871         case 0xF976:
2872             return "\u7565";
2873         case 0xF977:
2874             return "\u4EAE";
2875         case 0xF978:
2876             return "\u5169";
2877         case 0xF979:
2878             return "\u51C9";
2879         case 0xF97A:
2880             return "\u6881";
2881         case 0xF97B:
2882             return "\u7CE7";
2883         case 0xF97C:
2884             return "\u826F";
2885         case 0xF97D:
2886             return "\u8AD2";
2887         case 0xF97E:
2888             return "\u91CF";
2889         case 0xF97F:
2890             return "\u52F5";
2891         case 0xF980:
2892             return "\u5442";
2893         case 0xF981:
2894             return "\u5973";
2895         case 0xF982:
2896             return "\u5EEC";
2897         case 0xF983:
2898             return "\u65C5";
2899         case 0xF984:
2900             return "\u6FFE";
2901         case 0xF985:
2902             return "\u792A";
2903         case 0xF986:
2904             return "\u95AD";
2905         case 0xF987:
2906             return "\u9A6A";
2907         case 0xF988:
2908             return "\u9E97";
2909         case 0xF989:
2910             return "\u9ECE";
2911         case 0xF98A:
2912             return "\u529B";
2913         case 0xF98B:
2914             return "\u66C6";
2915         case 0xF98C:
2916             return "\u6B77";
2917         case 0xF98D:
2918             return "\u8F62";
2919         case 0xF98E:
2920             return "\u5E74";
2921         case 0xF98F:
2922             return "\u6190";
2923         case 0xF990:
2924             return "\u6200";
2925         case 0xF991:
2926             return "\u649A";
2927         case 0xF992:
2928             return "\u6F23";
2929         case 0xF993:
2930             return "\u7149";
2931         case 0xF994:
2932             return "\u7489";
2933         case 0xF995:
2934             return "\u79CA";
2935         case 0xF996:
2936             return "\u7DF4";
2937         case 0xF997:
2938             return "\u806F";
2939         case 0xF998:
2940             return "\u8F26";
2941         case 0xF999:
2942             return "\u84EE";
2943         case 0xF99A:
2944             return "\u9023";
2945         case 0xF99B:
2946             return "\u934A";
2947         case 0xF99C:
2948             return "\u5217";
2949         case 0xF99D:
2950             return "\u52A3";
2951         case 0xF99E:
2952             return "\u54BD";
2953         case 0xF99F:
2954             return "\u70C8";
2955         case 0xF9A0:
2956             return "\u88C2";
2957         case 0xF9A1:
2958             return "\u8AAA";
2959         case 0xF9A2:
2960             return "\u5EC9";
2961         case 0xF9A3:
2962             return "\u5FF5";
2963         case 0xF9A4:
2964             return "\u637B";
2965         case 0xF9A5:
2966             return "\u6BAE";
2967         case 0xF9A6:
2968             return "\u7C3E";
2969         case 0xF9A7:
2970             return "\u7375";
2971         case 0xF9A8:
2972             return "\u4EE4";
2973         case 0xF9A9:
2974             return "\u56F9";
2975         case 0xF9AA:
2976             return "\u5BE7";
2977         case 0xF9AB:
2978             return "\u5DBA";
2979         case 0xF9AC:
2980             return "\u601C";
2981         case 0xF9AD:
2982             return "\u73B2";
2983         case 0xF9AE:
2984             return "\u7469";
2985         case 0xF9AF:
2986             return "\u7F9A";
2987         case 0xF9B0:
2988             return "\u8046";
2989         case 0xF9B1:
2990             return "\u9234";
2991         case 0xF9B2:
2992             return "\u96F6";
2993         case 0xF9B3:
2994             return "\u9748";
2995         case 0xF9B4:
2996             return "\u9818";
2997         case 0xF9B5:
2998             return "\u4F8B";
2999         case 0xF9B6:
3000             return "\u79AE";
3001         case 0xF9B7:
3002             return "\u91B4";
3003         case 0xF9B8:
3004             return "\u96B8";
3005         case 0xF9B9:
3006             return "\u60E1";
3007         case 0xF9BA:
3008             return "\u4E86";
3009         case 0xF9BB:
3010             return "\u50DA";
3011         case 0xF9BC:
3012             return "\u5BEE";
3013         case 0xF9BD:
3014             return "\u5C3F";
3015         case 0xF9BE:
3016             return "\u6599";
3017         case 0xF9BF:
3018             return "\u6A02";
3019         case 0xF9C0:
3020             return "\u71CE";
3021         case 0xF9C1:
3022             return "\u7642";
3023         case 0xF9C2:
3024             return "\u84FC";
3025         case 0xF9C3:
3026             return "\u907C";
3027         case 0xF9C4:
3028             return "\u9F8D";
3029         case 0xF9C5:
3030             return "\u6688";
3031         case 0xF9C6:
3032             return "\u962E";
3033         case 0xF9C7:
3034             return "\u5289";
3035         case 0xF9C8:
3036             return "\u677B";
3037         case 0xF9C9:
3038             return "\u67F3";
3039         case 0xF9CA:
3040             return "\u6D41";
3041         case 0xF9CB:
3042             return "\u6E9C";
3043         case 0xF9CC:
3044             return "\u7409";
3045         case 0xF9CD:
3046             return "\u7559";
3047         case 0xF9CE:
3048             return "\u786B";
3049         case 0xF9CF:
3050             return "\u7D10";
3051         case 0xF9D0:
3052             return "\u985E";
3053         case 0xF9D1:
3054             return "\u516D";
3055         case 0xF9D2:
3056             return "\u622E";
3057         case 0xF9D3:
3058             return "\u9678";
3059         case 0xF9D4:
3060             return "\u502B";
3061         case 0xF9D5:
3062             return "\u5D19";
3063         case 0xF9D6:
3064             return "\u6DEA";
3065         case 0xF9D7:
3066             return "\u8F2A";
3067         case 0xF9D8:
3068             return "\u5F8B";
3069         case 0xF9D9:
3070             return "\u6144";
3071         case 0xF9DA:
3072             return "\u6817";
3073         case 0xF9DB:
3074             return "\u7387";
3075         case 0xF9DC:
3076             return "\u9686";
3077         case 0xF9DD:
3078             return "\u5229";
3079         case 0xF9DE:
3080             return "\u540F";
3081         case 0xF9DF:
3082             return "\u5C65";
3083         case 0xF9E0:
3084             return "\u6613";
3085         case 0xF9E1:
3086             return "\u674E";
3087         case 0xF9E2:
3088             return "\u68A8";
3089         case 0xF9E3:
3090             return "\u6CE5";
3091         case 0xF9E4:
3092             return "\u7406";
3093         case 0xF9E5:
3094             return "\u75E2";
3095         case 0xF9E6:
3096             return "\u7F79";
3097         case 0xF9E7:
3098             return "\u88CF";
3099         case 0xF9E8:
3100             return "\u88E1";
3101         case 0xF9E9:
3102             return "\u91CC";
3103         case 0xF9EA:
3104             return "\u96E2";
3105         case 0xF9EB:
3106             return "\u533F";
3107         case 0xF9EC:
3108             return "\u6EBA";
3109         case 0xF9ED:
3110             return "\u541D";
3111         case 0xF9EE:
3112             return "\u71D0";
3113         case 0xF9EF:
3114             return "\u7498";
3115         case 0xF9F0:
3116             return "\u85FA";
3117         case 0xF9F1:
3118             return "\u96A3";
3119         case 0xF9F2:
3120             return "\u9C57";
3121         case 0xF9F3:
3122             return "\u9E9F";
3123         case 0xF9F4:
3124             return "\u6797";
3125         case 0xF9F5:
3126             return "\u6DCB";
3127         case 0xF9F6:
3128             return "\u81E8";
3129         case 0xF9F7:
3130             return "\u7ACB";
3131         case 0xF9F8:
3132             return "\u7B20";
3133         case 0xF9F9:
3134             return "\u7C92";
3135         case 0xF9FA:
3136             return "\u72C0";
3137         case 0xF9FB:
3138             return "\u7099";
3139         case 0xF9FC:
3140             return "\u8B58";
3141         case 0xF9FD:
3142             return "\u4EC0";
3143         case 0xF9FE:
3144             return "\u8336";
3145         case 0xF9FF:
3146             return "\u523A";
3147         case 0xFA00:
3148             return "\u5207";
3149         case 0xFA01:
3150             return "\u5EA6";
3151         case 0xFA02:
3152             return "\u62D3";
3153         case 0xFA03:
3154             return "\u7CD6";
3155         case 0xFA04:
3156             return "\u5B85";
3157         case 0xFA05:
3158             return "\u6D1E";
3159         case 0xFA06:
3160             return "\u66B4";
3161         case 0xFA07:
3162             return "\u8F3B";
3163         case 0xFA08:
3164             return "\u884C";
3165         case 0xFA09:
3166             return "\u964D";
3167         case 0xFA0A:
3168             return "\u898B";
3169         case 0xFA0B:
3170             return "\u5ED3";
3171         case 0xFA0C:
3172             return "\u5140";
3173         case 0xFA0D:
3174             return "\u55C0";
3175         case 0xFA10:
3176             return "\u585A";
3177         case 0xFA12:
3178             return "\u6674";
3179         case 0xFA15:
3180             return "\u51DE";
3181         case 0xFA16:
3182             return "\u732A";
3183         case 0xFA17:
3184             return "\u76CA";
3185         case 0xFA18:
3186             return "\u793C";
3187         case 0xFA19:
3188             return "\u795E";
3189         case 0xFA1A:
3190             return "\u7965";
3191         case 0xFA1B:
3192             return "\u798F";
3193         case 0xFA1C:
3194             return "\u9756";
3195         case 0xFA1D:
3196             return "\u7CBE";
3197         case 0xFA1E:
3198             return "\u7FBD";
3199         case 0xFA20:
3200             return "\u8612";
3201         case 0xFA22:
3202             return "\u8AF8";
3203         case 0xFA25:
3204             return "\u9038";
3205         case 0xFA26:
3206             return "\u90FD";
3207         case 0xFA2A:
3208             return "\u98EF";
3209         case 0xFA2B:
3210             return "\u98FC";
3211         case 0xFA2C:
3212             return "\u9928";
3213         case 0xFA2D:
3214             return "\u9DB4";
3215         case 0xFA30:
3216             return "\u4FAE";
3217         case 0xFA31:
3218             return "\u50E7";
3219         case 0xFA32:
3220             return "\u514D";
3221         case 0xFA33:
3222             return "\u52C9";
3223         case 0xFA34:
3224             return "\u52E4";
3225         case 0xFA35:
3226             return "\u5351";
3227         case 0xFA36:
3228             return "\u559D";
3229         case 0xFA37:
3230             return "\u5606";
3231         case 0xFA38:
3232             return "\u5668";
3233         case 0xFA39:
3234             return "\u5840";
3235         case 0xFA3A:
3236             return "\u58A8";
3237         case 0xFA3B:
3238             return "\u5C64";
3239         case 0xFA3C:
3240             return "\u5C6E";
3241         case 0xFA3D:
3242             return "\u6094";
3243         case 0xFA3E:
3244             return "\u6168";
3245         case 0xFA3F:
3246             return "\u618E";
3247         case 0xFA40:
3248             return "\u61F2";
3249         case 0xFA41:
3250             return "\u654F";
3251         case 0xFA42:
3252             return "\u65E2";
3253         case 0xFA43:
3254             return "\u6691";
3255         case 0xFA44:
3256             return "\u6885";
3257         case 0xFA45:
3258             return "\u6D77";
3259         case 0xFA46:
3260             return "\u6E1A";
3261         case 0xFA47:
3262             return "\u6F22";
3263         case 0xFA48:
3264             return "\u716E";
3265         case 0xFA49:
3266             return "\u722B";
3267         case 0xFA4A:
3268             return "\u7422";
3269         case 0xFA4B:
3270             return "\u7891";
3271         case 0xFA4C:
3272             return "\u793E";
3273         case 0xFA4D:
3274             return "\u7949";
3275         case 0xFA4E:
3276             return "\u7948";
3277         case 0xFA4F:
3278             return "\u7950";
3279         case 0xFA50:
3280             return "\u7956";
3281         case 0xFA51:
3282             return "\u795D";
3283         case 0xFA52:
3284             return "\u798D";
3285         case 0xFA53:
3286             return "\u798E";
3287         case 0xFA54:
3288             return "\u7A40";
3289         case 0xFA55:
3290             return "\u7A81";
3291         case 0xFA56:
3292             return "\u7BC0";
3293         case 0xFA57:
3294             return "\u7DF4";
3295         case 0xFA58:
3296             return "\u7E09";
3297         case 0xFA59:
3298             return "\u7E41";
3299         case 0xFA5A:
3300             return "\u7F72";
3301         case 0xFA5B:
3302             return "\u8005";
3303         case 0xFA5C:
3304             return "\u81ED";
3305         case 0xFA5D:
3306             return "\u8279";
3307         case 0xFA5E:
3308             return "\u8279";
3309         case 0xFA5F:
3310             return "\u8457";
3311         case 0xFA60:
3312             return "\u8910";
3313         case 0xFA61:
3314             return "\u8996";
3315         case 0xFA62:
3316             return "\u8B01";
3317         case 0xFA63:
3318             return "\u8B39";
3319         case 0xFA64:
3320             return "\u8CD3";
3321         case 0xFA65:
3322             return "\u8D08";
3323         case 0xFA66:
3324             return "\u8FB6";
3325         case 0xFA67:
3326             return "\u9038";
3327         case 0xFA68:
3328             return "\u96E3";
3329         case 0xFA69:
3330             return "\u97FF";
3331         case 0xFA6A:
3332             return "\u983B";
3333         case 0xFA70:
3334             return "\u4E26";
3335         case 0xFA71:
3336             return "\u51B5";
3337         case 0xFA72:
3338             return "\u5168";
3339         case 0xFA73:
3340             return "\u4F80";
3341         case 0xFA74:
3342             return "\u5145";
3343         case 0xFA75:
3344             return "\u5180";
3345         case 0xFA76:
3346             return "\u52C7";
3347         case 0xFA77:
3348             return "\u52FA";
3349         case 0xFA78:
3350             return "\u559D";
3351         case 0xFA79:
3352             return "\u5555";
3353         case 0xFA7A:
3354             return "\u5599";
3355         case 0xFA7B:
3356             return "\u55E2";
3357         case 0xFA7C:
3358             return "\u585A";
3359         case 0xFA7D:
3360             return "\u58B3";
3361         case 0xFA7E:
3362             return "\u5944";
3363         case 0xFA7F:
3364             return "\u5954";
3365         case 0xFA80:
3366             return "\u5A62";
3367         case 0xFA81:
3368             return "\u5B28";
3369         case 0xFA82:
3370             return "\u5ED2";
3371         case 0xFA83:
3372             return "\u5ED9";
3373         case 0xFA84:
3374             return "\u5F69";
3375         case 0xFA85:
3376             return "\u5FAD";
3377         case 0xFA86:
3378             return "\u60D8";
3379         case 0xFA87:
3380             return "\u614E";
3381         case 0xFA88:
3382             return "\u6108";
3383         case 0xFA89:
3384             return "\u618E";
3385         case 0xFA8A:
3386             return "\u6160";
3387         case 0xFA8B:
3388             return "\u61F2";
3389         case 0xFA8C:
3390             return "\u6234";
3391         case 0xFA8D:
3392             return "\u63C4";
3393         case 0xFA8E:
3394             return "\u641C";
3395         case 0xFA8F:
3396             return "\u6452";
3397         case 0xFA90:
3398             return "\u6556";
3399         case 0xFA91:
3400             return "\u6674";
3401         case 0xFA92:
3402             return "\u6717";
3403         case 0xFA93:
3404             return "\u671B";
3405         case 0xFA94:
3406             return "\u6756";
3407         case 0xFA95:
3408             return "\u6B79";
3409         case 0xFA96:
3410             return "\u6BBA";
3411         case 0xFA97:
3412             return "\u6D41";
3413         case 0xFA98:
3414             return "\u6EDB";
3415         case 0xFA99:
3416             return "\u6ECB";
3417         case 0xFA9A:
3418             return "\u6F22";
3419         case 0xFA9B:
3420             return "\u701E";
3421         case 0xFA9C:
3422             return "\u716E";
3423         case 0xFA9D:
3424             return "\u77A7";
3425         case 0xFA9E:
3426             return "\u7235";
3427         case 0xFA9F:
3428             return "\u72AF";
3429         case 0xFAA0:
3430             return "\u732A";
3431         case 0xFAA1:
3432             return "\u7471";
3433         case 0xFAA2:
3434             return "\u7506";
3435         case 0xFAA3:
3436             return "\u753B";
3437         case 0xFAA4:
3438             return "\u761D";
3439         case 0xFAA5:
3440             return "\u761F";
3441         case 0xFAA6:
3442             return "\u76CA";
3443         case 0xFAA7:
3444             return "\u76DB";
3445         case 0xFAA8:
3446             return "\u76F4";
3447         case 0xFAA9:
3448             return "\u774A";
3449         case 0xFAAA:
3450             return "\u7740";
3451         case 0xFAAB:
3452             return "\u78CC";
3453         case 0xFAAC:
3454             return "\u7AB1";
3455         case 0xFAAD:
3456             return "\u7BC0";
3457         case 0xFAAE:
3458             return "\u7C7B";
3459         case 0xFAAF:
3460             return "\u7D5B";
3461         case 0xFAB0:
3462             return "\u7DF4";
3463         case 0xFAB1:
3464             return "\u7F3E";
3465         case 0xFAB2:
3466             return "\u8005";
3467         case 0xFAB3:
3468             return "\u8352";
3469         case 0xFAB4:
3470             return "\u83EF";
3471         case 0xFAB5:
3472             return "\u8779";
3473         case 0xFAB6:
3474             return "\u8941";
3475         case 0xFAB7:
3476             return "\u8986";
3477         case 0xFAB8:
3478             return "\u8996";
3479         case 0xFAB9:
3480             return "\u8ABF";
3481         case 0xFABA:
3482             return "\u8AF8";
3483         case 0xFABB:
3484             return "\u8ACB";
3485         case 0xFABC:
3486             return "\u8B01";
3487         case 0xFABD:
3488             return "\u8AFE";
3489         case 0xFABE:
3490             return "\u8AED";
3491         case 0xFABF:
3492             return "\u8B39";
3493         case 0xFAC0:
3494             return "\u8B8A";
3495         case 0xFAC1:
3496             return "\u8D08";
3497         case 0xFAC2:
3498             return "\u8F38";
3499         case 0xFAC3:
3500             return "\u9072";
3501         case 0xFAC4:
3502             return "\u9199";
3503         case 0xFAC5:
3504             return "\u9276";
3505         case 0xFAC6:
3506             return "\u967C";
3507         case 0xFAC7:
3508             return "\u96E3";
3509         case 0xFAC8:
3510             return "\u9756";
3511         case 0xFAC9:
3512             return "\u97DB";
3513         case 0xFACA:
3514             return "\u97FF";
3515         case 0xFACB:
3516             return "\u980B";
3517         case 0xFACC:
3518             return "\u983B";
3519         case 0xFACD:
3520             return "\u9B12";
3521         case 0xFACE:
3522             return "\u9F9C";
3523         case 0xFACF:
3524             return "\ud84a\udc4a";
3525         case 0xFAD0:
3526             return "\ud84a\udc44";
3527         case 0xFAD1:
3528             return "\ud84c\udfd5";
3529         case 0xFAD2:
3530             return "\u3B9D";
3531         case 0xFAD3:
3532             return "\u4018";
3533         case 0xFAD4:
3534             return "\u4039";
3535         case 0xFAD5:
3536             return "\ud854\ude49";
3537         case 0xFAD6:
3538             return "\ud857\udcd0";
3539         case 0xFAD7:
3540             return "\ud85f\uded3";
3541         case 0xFAD8:
3542             return "\u9F43";
3543         case 0xFAD9:
3544             return "\u9F8E";
3545         case 0xFB1D:
3546             return "\u05D9\u05B4";
3547         case 0xFB1F:
3548             return "\u05F2\u05B7";
3549         case 0xFB2A:
3550             return "\u05E9\u05C1";
3551         case 0xFB2B:
3552             return "\u05E9\u05C2";
3553         case 0xFB2C:
3554             return "\uFB49\u05C1";
3555         case 0xFB2D:
3556             return "\uFB49\u05C2";
3557         case 0xFB2E:
3558             return "\u05D0\u05B7";
3559         case 0xFB2F:
3560             return "\u05D0\u05B8";
3561         case 0xFB30:
3562             return "\u05D0\u05BC";
3563         case 0xFB31:
3564             return "\u05D1\u05BC";
3565         case 0xFB32:
3566             return "\u05D2\u05BC";
3567         case 0xFB33:
3568             return "\u05D3\u05BC";
3569         case 0xFB34:
3570             return "\u05D4\u05BC";
3571         case 0xFB35:
3572             return "\u05D5\u05BC";
3573         case 0xFB36:
3574             return "\u05D6\u05BC";
3575         case 0xFB38:
3576             return "\u05D8\u05BC";
3577         case 0xFB39:
3578             return "\u05D9\u05BC";
3579         case 0xFB3A:
3580             return "\u05DA\u05BC";
3581         case 0xFB3B:
3582             return "\u05DB\u05BC";
3583         case 0xFB3C:
3584             return "\u05DC\u05BC";
3585         case 0xFB3E:
3586             return "\u05DE\u05BC";
3587         case 0xFB40:
3588             return "\u05E0\u05BC";
3589         case 0xFB41:
3590             return "\u05E1\u05BC";
3591         case 0xFB43:
3592             return "\u05E3\u05BC";
3593         case 0xFB44:
3594             return "\u05E4\u05BC";
3595         case 0xFB46:
3596             return "\u05E6\u05BC";
3597         case 0xFB47:
3598             return "\u05E7\u05BC";
3599         case 0xFB48:
3600             return "\u05E8\u05BC";
3601         case 0xFB49:
3602             return "\u05E9\u05BC";
3603         case 0xFB4A:
3604             return "\u05EA\u05BC";
3605         case 0xFB4B:
3606             return "\u05D5\u05B9";
3607         case 0xFB4C:
3608             return "\u05D1\u05BF";
3609         case 0xFB4D:
3610             return "\u05DB\u05BF";
3611         case 0xFB4E:
3612             return "\u05E4\u05BF";
3613         case 0x1D15E:
3614             return "\ud834\udd57\ud834\udd65";
3615         case 0x1D15F:
3616             return "\ud834\udd58\ud834\udd65";
3617         case 0x1D160:
3618             return "\ud834\udd5f\ud834\udd6e";
3619         case 0x1D161:
3620             return "\ud834\udd5f\ud834\udd6f";
3621         case 0x1D162:
3622             return "\ud834\udd5f\ud834\udd70";
3623         case 0x1D163:
3624             return "\ud834\udd5f\ud834\udd71";
3625         case 0x1D164:
3626             return "\ud834\udd5f\ud834\udd72";
3627         case 0x1D1BB:
3628             return "\ud834\uddb9\ud834\udd65";
3629         case 0x1D1BC:
3630             return "\ud834\uddba\ud834\udd65";
3631         case 0x1D1BD:
3632             return "\ud834\uddbb\ud834\udd6e";
3633         case 0x1D1BE:
3634             return "\ud834\uddbc\ud834\udd6e";
3635         case 0x1D1BF:
3636             return "\ud834\uddbb\ud834\udd6f";
3637         case 0x1D1C0:
3638             return "\ud834\uddbc\ud834\udd6f";
3639         case 0x2F800:
3640             return "\u4E3D";
3641         case 0x2F801:
3642             return "\u4E38";
3643         case 0x2F802:
3644             return "\u4E41";
3645         case 0x2F803:
3646             return "\ud840\udd22";
3647         case 0x2F804:
3648             return "\u4F60";
3649         case 0x2F805:
3650             return "\u4FAE";
3651         case 0x2F806:
3652             return "\u4FBB";
3653         case 0x2F807:
3654             return "\u5002";
3655         case 0x2F808:
3656             return "\u507A";
3657         case 0x2F809:
3658             return "\u5099";
3659         case 0x2F80A:
3660             return "\u50E7";
3661         case 0x2F80B:
3662             return "\u50CF";
3663         case 0x2F80C:
3664             return "\u349E";
3665         case 0x2F80D:
3666             return "\ud841\ude3a";
3667         case 0x2F80E:
3668             return "\u514D";
3669         case 0x2F80F:
3670             return "\u5154";
3671         case 0x2F810:
3672             return "\u5164";
3673         case 0x2F811:
3674             return "\u5177";
3675         case 0x2F812:
3676             return "\ud841\udd1c";
3677         case 0x2F813:
3678             return "\u34B9";
3679         case 0x2F814:
3680             return "\u5167";
3681         case 0x2F815:
3682             return "\u518D";
3683         case 0x2F816:
3684             return "\ud841\udd4b";
3685         case 0x2F817:
3686             return "\u5197";
3687         case 0x2F818:
3688             return "\u51A4";
3689         case 0x2F819:
3690             return "\u4ECC";
3691         case 0x2F81A:
3692             return "\u51AC";
3693         case 0x2F81B:
3694             return "\u51B5";
3695         case 0x2F81C:
3696             return "\ud864\udddf";
3697         case 0x2F81D:
3698             return "\u51F5";
3699         case 0x2F81E:
3700             return "\u5203";
3701         case 0x2F81F:
3702             return "\u34DF";
3703         case 0x2F820:
3704             return "\u523B";
3705         case 0x2F821:
3706             return "\u5246";
3707         case 0x2F822:
3708             return "\u5272";
3709         case 0x2F823:
3710             return "\u5277";
3711         case 0x2F824:
3712             return "\u3515";
3713         case 0x2F825:
3714             return "\u52C7";
3715         case 0x2F826:
3716             return "\u52C9";
3717         case 0x2F827:
3718             return "\u52E4";
3719         case 0x2F828:
3720             return "\u52FA";
3721         case 0x2F829:
3722             return "\u5305";
3723         case 0x2F82A:
3724             return "\u5306";
3725         case 0x2F82B:
3726             return "\u5317";
3727         case 0x2F82C:
3728             return "\u5349";
3729         case 0x2F82D:
3730             return "\u5351";
3731         case 0x2F82E:
3732             return "\u535A";
3733         case 0x2F82F:
3734             return "\u5373";
3735         case 0x2F830:
3736             return "\u537D";
3737         case 0x2F831:
3738             return "\u537F";
3739         case 0x2F832:
3740             return "\u537F";
3741         case 0x2F833:
3742             return "\u537F";
3743         case 0x2F834:
3744             return "\ud842\ude2c";
3745         case 0x2F835:
3746             return "\u7070";
3747         case 0x2F836:
3748             return "\u53CA";
3749         case 0x2F837:
3750             return "\u53DF";
3751         case 0x2F838:
3752             return "\ud842\udf63";
3753         case 0x2F839:
3754             return "\u53EB";
3755         case 0x2F83A:
3756             return "\u53F1";
3757         case 0x2F83B:
3758             return "\u5406";
3759         case 0x2F83C:
3760             return "\u549E";
3761         case 0x2F83D:
3762             return "\u5438";
3763         case 0x2F83E:
3764             return "\u5448";
3765         case 0x2F83F:
3766             return "\u5468";
3767         case 0x2F840:
3768             return "\u54A2";
3769         case 0x2F841:
3770             return "\u54F6";
3771         case 0x2F842:
3772             return "\u5510";
3773         case 0x2F843:
3774             return "\u5553";
3775         case 0x2F844:
3776             return "\u5563";
3777         case 0x2F845:
3778             return "\u5584";
3779         case 0x2F846:
3780             return "\u5584";
3781         case 0x2F847:
3782             return "\u5599";
3783         case 0x2F848:
3784             return "\u55AB";
3785         case 0x2F849:
3786             return "\u55B3";
3787         case 0x2F84A:
3788             return "\u55C2";
3789         case 0x2F84B:
3790             return "\u5716";
3791         case 0x2F84C:
3792             return "\u5606";
3793         case 0x2F84D:
3794             return "\u5717";
3795         case 0x2F84E:
3796             return "\u5651";
3797         case 0x2F84F:
3798             return "\u5674";
3799         case 0x2F850:
3800             return "\u5207";
3801         case 0x2F851:
3802             return "\u58EE";
3803         case 0x2F852:
3804             return "\u57CE";
3805         case 0x2F853:
3806             return "\u57F4";
3807         case 0x2F854:
3808             return "\u580D";
3809         case 0x2F855:
3810             return "\u578B";
3811         case 0x2F856:
3812             return "\u5832";
3813         case 0x2F857:
3814             return "\u5831";
3815         case 0x2F858:
3816             return "\u58AC";
3817         case 0x2F859:
3818             return "\ud845\udce4";
3819         case 0x2F85A:
3820             return "\u58F2";
3821         case 0x2F85B:
3822             return "\u58F7";
3823         case 0x2F85C:
3824             return "\u5906";
3825         case 0x2F85D:
3826             return "\u591A";
3827         case 0x2F85E:
3828             return "\u5922";
3829         case 0x2F85F:
3830             return "\u5962";
3831         case 0x2F860:
3832             return "\ud845\udea8";
3833         case 0x2F861:
3834             return "\ud845\udeea";
3835         case 0x2F862:
3836             return "\u59EC";
3837         case 0x2F863:
3838             return "\u5A1B";
3839         case 0x2F864:
3840             return "\u5A27";
3841         case 0x2F865:
3842             return "\u59D8";
3843         case 0x2F866:
3844             return "\u5A66";
3845         case 0x2F867:
3846             return "\u36EE";
3847         case 0x2F868:
3848             return "\u36FC";
3849         case 0x2F869:
3850             return "\u5B08";
3851         case 0x2F86A:
3852             return "\u5B3E";
3853         case 0x2F86B:
3854             return "\u5B3E";
3855         case 0x2F86C:
3856             return "\ud846\uddc8";
3857         case 0x2F86D:
3858             return "\u5BC3";
3859         case 0x2F86E:
3860             return "\u5BD8";
3861         case 0x2F86F:
3862             return "\u5BE7";
3863         case 0x2F870:
3864             return "\u5BF3";
3865         case 0x2F871:
3866             return "\ud846\udf18";
3867         case 0x2F872:
3868             return "\u5BFF";
3869         case 0x2F873:
3870             return "\u5C06";
3871         case 0x2F874:
3872             return "\u5F53";
3873         case 0x2F875:
3874             return "\u5C22";
3875         case 0x2F876:
3876             return "\u3781";
3877         case 0x2F877:
3878             return "\u5C60";
3879         case 0x2F878:
3880             return "\u5C6E";
3881         case 0x2F879:
3882             return "\u5CC0";
3883         case 0x2F87A:
3884             return "\u5C8D";
3885         case 0x2F87B:
3886             return "\ud847\udde4";
3887         case 0x2F87C:
3888             return "\u5D43";
3889         case 0x2F87D:
3890             return "\ud847\udde6";
3891         case 0x2F87E:
3892             return "\u5D6E";
3893         case 0x2F87F:
3894             return "\u5D6B";
3895         case 0x2F880:
3896             return "\u5D7C";
3897         case 0x2F881:
3898             return "\u5DE1";
3899         case 0x2F882:
3900             return "\u5DE2";
3901         case 0x2F883:
3902             return "\u382F";
3903         case 0x2F884:
3904             return "\u5DFD";
3905         case 0x2F885:
3906             return "\u5E28";
3907         case 0x2F886:
3908             return "\u5E3D";
3909         case 0x2F887:
3910             return "\u5E69";
3911         case 0x2F888:
3912             return "\u3862";
3913         case 0x2F889:
3914             return "\ud848\udd83";
3915         case 0x2F88A:
3916             return "\u387C";
3917         case 0x2F88B:
3918             return "\u5EB0";
3919         case 0x2F88C:
3920             return "\u5EB3";
3921         case 0x2F88D:
3922             return "\u5EB6";
3923         case 0x2F88E:
3924             return "\u5ECA";
3925         case 0x2F88F:
3926             return "\ud868\udf92";
3927         case 0x2F890:
3928             return "\u5EFE";
3929         case 0x2F891:
3930             return "\ud848\udf31";
3931         case 0x2F892:
3932             return "\ud848\udf31";
3933         case 0x2F893:
3934             return "\u8201";
3935         case 0x2F894:
3936             return "\u5F22";
3937         case 0x2F895:
3938             return "\u5F22";
3939         case 0x2F896:
3940             return "\u38C7";
3941         case 0x2F897:
3942             return "\ud84c\udeb8";
3943         case 0x2F898:
3944             return "\ud858\uddda";
3945         case 0x2F899:
3946             return "\u5F62";
3947         case 0x2F89A:
3948             return "\u5F6B";
3949         case 0x2F89B:
3950             return "\u38E3";
3951         case 0x2F89C:
3952             return "\u5F9A";
3953         case 0x2F89D:
3954             return "\u5FCD";
3955         case 0x2F89E:
3956             return "\u5FD7";
3957         case 0x2F89F:
3958             return "\u5FF9";
3959         case 0x2F8A0:
3960             return "\u6081";
3961         case 0x2F8A1:
3962             return "\u393A";
3963         case 0x2F8A2:
3964             return "\u391C";
3965         case 0x2F8A3:
3966             return "\u6094";
3967         case 0x2F8A4:
3968             return "\ud849\uded4";
3969         case 0x2F8A5:
3970             return "\u60C7";
3971         case 0x2F8A6:
3972             return "\u6148";
3973         case 0x2F8A7:
3974             return "\u614C";
3975         case 0x2F8A8:
3976             return "\u614E";
3977         case 0x2F8A9:
3978             return "\u614C";
3979         case 0x2F8AA:
3980             return "\u617A";
3981         case 0x2F8AB:
3982             return "\u618E";
3983         case 0x2F8AC:
3984             return "\u61B2";
3985         case 0x2F8AD:
3986             return "\u61A4";
3987         case 0x2F8AE:
3988             return "\u61AF";
3989         case 0x2F8AF:
3990             return "\u61DE";
3991         case 0x2F8B0:
3992             return "\u61F2";
3993         case 0x2F8B1:
3994             return "\u61F6";
3995         case 0x2F8B2:
3996             return "\u6210";
3997         case 0x2F8B3:
3998             return "\u621B";
3999         case 0x2F8B4:
4000             return "\u625D";
4001         case 0x2F8B5:
4002             return "\u62B1";
4003         case 0x2F8B6:
4004             return "\u62D4";
4005         case 0x2F8B7:
4006             return "\u6350";
4007         case 0x2F8B8:
4008             return "\ud84a\udf0c";
4009         case 0x2F8B9:
4010             return "\u633D";
4011         case 0x2F8BA:
4012             return "\u62FC";
4013         case 0x2F8BB:
4014             return "\u6368";
4015         case 0x2F8BC:
4016             return "\u6383";
4017         case 0x2F8BD:
4018             return "\u63E4";
4019         case 0x2F8BE:
4020             return "\ud84a\udff1";
4021         case 0x2F8BF:
4022             return "\u6422";
4023         case 0x2F8C0:
4024             return "\u63C5";
4025         case 0x2F8C1:
4026             return "\u63A9";
4027         case 0x2F8C2:
4028             return "\u3A2E";
4029         case 0x2F8C3:
4030             return "\u6469";
4031         case 0x2F8C4:
4032             return "\u647E";
4033         case 0x2F8C5:
4034             return "\u649D";
4035         case 0x2F8C6:
4036             return "\u6477";
4037         case 0x2F8C7:
4038             return "\u3A6C";
4039         case 0x2F8C8:
4040             return "\u654F";
4041         case 0x2F8C9:
4042             return "\u656C";
4043         case 0x2F8CA:
4044             return "\ud84c\udc0a";
4045         case 0x2F8CB:
4046             return "\u65E3";
4047         case 0x2F8CC:
4048             return "\u66F8";
4049         case 0x2F8CD:
4050             return "\u6649";
4051         case 0x2F8CE:
4052             return "\u3B19";
4053         case 0x2F8CF:
4054             return "\u6691";
4055         case 0x2F8D0:
4056             return "\u3B08";
4057         case 0x2F8D1:
4058             return "\u3AE4";
4059         case 0x2F8D2:
4060             return "\u5192";
4061         case 0x2F8D3:
4062             return "\u5195";
4063         case 0x2F8D4:
4064             return "\u6700";
4065         case 0x2F8D5:
4066             return "\u669C";
4067         case 0x2F8D6:
4068             return "\u80AD";
4069         case 0x2F8D7:
4070             return "\u43D9";
4071         case 0x2F8D8:
4072             return "\u6717";
4073         case 0x2F8D9:
4074             return "\u671B";
4075         case 0x2F8DA:
4076             return "\u6721";
4077         case 0x2F8DB:
4078             return "\u675E";
4079         case 0x2F8DC:
4080             return "\u6753";
4081         case 0x2F8DD:
4082             return "\ud84c\udfc3";
4083         case 0x2F8DE:
4084             return "\u3B49";
4085         case 0x2F8DF:
4086             return "\u67FA";
4087         case 0x2F8E0:
4088             return "\u6785";
4089         case 0x2F8E1:
4090             return "\u6852";
4091         case 0x2F8E2:
4092             return "\u6885";
4093         case 0x2F8E3:
4094             return "\ud84d\udc6d";
4095         case 0x2F8E4:
4096             return "\u688E";
4097         case 0x2F8E5:
4098             return "\u681F";
4099         case 0x2F8E6:
4100             return "\u6914";
4101         case 0x2F8E7:
4102             return "\u3B9D";
4103         case 0x2F8E8:
4104             return "\u6942";
4105         case 0x2F8E9:
4106             return "\u69A3";
4107         case 0x2F8EA:
4108             return "\u69EA";
4109         case 0x2F8EB:
4110             return "\u6AA8";
4111         case 0x2F8EC:
4112             return "\ud84d\udea3";
4113         case 0x2F8ED:
4114             return "\u6ADB";
4115         case 0x2F8EE:
4116             return "\u3C18";
4117         case 0x2F8EF:
4118             return "\u6B21";
4119         case 0x2F8F0:
4120             return "\ud84e\udca7";
4121         case 0x2F8F1:
4122             return "\u6B54";
4123         case 0x2F8F2:
4124             return "\u3C4E";
4125         case 0x2F8F3:
4126             return "\u6B72";
4127         case 0x2F8F4:
4128             return "\u6B9F";
4129         case 0x2F8F5:
4130             return "\u6BBA";
4131         case 0x2F8F6:
4132             return "\u6BBB";
4133         case 0x2F8F7:
4134             return "\ud84e\ude8d";
4135         case 0x2F8F8:
4136             return "\ud847\udd0b";
4137         case 0x2F8F9:
4138             return "\ud84e\udefa";
4139         case 0x2F8FA:
4140             return "\u6C4E";
4141         case 0x2F8FB:
4142             return "\ud84f\udcbc";
4143         case 0x2F8FC:
4144             return "\u6CBF";
4145         case 0x2F8FD:
4146             return "\u6CCD";
4147         case 0x2F8FE:
4148             return "\u6C67";
4149         case 0x2F8FF:
4150             return "\u6D16";
4151         case 0x2F900:
4152             return "\u6D3E";
4153         case 0x2F901:
4154             return "\u6D77";
4155         case 0x2F902:
4156             return "\u6D41";
4157         case 0x2F903:
4158             return "\u6D69";
4159         case 0x2F904:
4160             return "\u6D78";
4161         case 0x2F905:
4162             return "\u6D85";
4163         case 0x2F906:
4164             return "\ud84f\udd1e";
4165         case 0x2F907:
4166             return "\u6D34";
4167         case 0x2F908:
4168             return "\u6E2F";
4169         case 0x2F909:
4170             return "\u6E6E";
4171         case 0x2F90A:
4172             return "\u3D33";
4173         case 0x2F90B:
4174             return "\u6ECB";
4175         case 0x2F90C:
4176             return "\u6EC7";
4177         case 0x2F90D:
4178             return "\ud84f\uded1";
4179         case 0x2F90E:
4180             return "\u6DF9";
4181         case 0x2F90F:
4182             return "\u6F6E";
4183         case 0x2F910:
4184             return "\ud84f\udf5e";
4185         case 0x2F911:
4186             return "\ud84f\udf8e";
4187         case 0x2F912:
4188             return "\u6FC6";
4189         case 0x2F913:
4190             return "\u7039";
4191         case 0x2F914:
4192             return "\u701E";
4193         case 0x2F915:
4194             return "\u701B";
4195         case 0x2F916:
4196             return "\u3D96";
4197         case 0x2F917:
4198             return "\u704A";
4199         case 0x2F918:
4200             return "\u707D";
4201         case 0x2F919:
4202             return "\u7077";
4203         case 0x2F91A:
4204             return "\u70AD";
4205         case 0x2F91B:
4206             return "\ud841\udd25";
4207         case 0x2F91C:
4208             return "\u7145";
4209         case 0x2F91D:
4210             return "\ud850\ude63";
4211         case 0x2F91E:
4212             return "\u719C";
4213         case 0x2F91F:
4214             return "\ud850\udfab";
4215         case 0x2F920:
4216             return "\u7228";
4217         case 0x2F921:
4218             return "\u7235";
4219         case 0x2F922:
4220             return "\u7250";
4221         case 0x2F923:
4222             return "\ud851\ude08";
4223         case 0x2F924:
4224             return "\u7280";
4225         case 0x2F925:
4226             return "\u7295";
4227         case 0x2F926:
4228             return "\ud851\udf35";
4229         case 0x2F927:
4230             return "\ud852\udc14";
4231         case 0x2F928:
4232             return "\u737A";
4233         case 0x2F929:
4234             return "\u738B";
4235         case 0x2F92A:
4236             return "\u3EAC";
4237         case 0x2F92B:
4238             return "\u73A5";
4239         case 0x2F92C:
4240             return "\u3EB8";
4241         case 0x2F92D:
4242             return "\u3EB8";
4243         case 0x2F92E:
4244             return "\u7447";
4245         case 0x2F92F:
4246             return "\u745C";
4247         case 0x2F930:
4248             return "\u7471";
4249         case 0x2F931:
4250             return "\u7485";
4251         case 0x2F932:
4252             return "\u74CA";
4253         case 0x2F933:
4254             return "\u3F1B";
4255         case 0x2F934:
4256             return "\u7524";
4257         case 0x2F935:
4258             return "\ud853\udc36";
4259         case 0x2F936:
4260             return "\u753E";
4261         case 0x2F937:
4262             return "\ud853\udc92";
4263         case 0x2F938:
4264             return "\u7570";
4265         case 0x2F939:
4266             return "\ud848\udd9f";
4267         case 0x2F93A:
4268             return "\u7610";
4269         case 0x2F93B:
4270             return "\ud853\udfa1";
4271         case 0x2F93C:
4272             return "\ud853\udfb8";
4273         case 0x2F93D:
4274             return "\ud854\udc44";
4275         case 0x2F93E:
4276             return "\u3FFC";
4277         case 0x2F93F:
4278             return "\u4008";
4279         case 0x2F940:
4280             return "\u76F4";
4281         case 0x2F941:
4282             return "\ud854\udcf3";
4283         case 0x2F942:
4284             return "\ud854\udcf2";
4285         case 0x2F943:
4286             return "\ud854\udd19";
4287         case 0x2F944:
4288             return "\ud854\udd33";
4289         case 0x2F945:
4290             return "\u771E";
4291         case 0x2F946:
4292             return "\u771F";
4293         case 0x2F947:
4294             return "\u771F";
4295         case 0x2F948:
4296             return "\u774A";
4297         case 0x2F949:
4298             return "\u4039";
4299         case 0x2F94A:
4300             return "\u778B";
4301         case 0x2F94B:
4302             return "\u4046";
4303         case 0x2F94C:
4304             return "\u4096";
4305         case 0x2F94D:
4306             return "\ud855\udc1d";
4307         case 0x2F94E:
4308             return "\u784E";
4309         case 0x2F94F:
4310             return "\u788C";
4311         case 0x2F950:
4312             return "\u78CC";
4313         case 0x2F951:
4314             return "\u40E3";
4315         case 0x2F952:
4316             return "\ud855\ude26";
4317         case 0x2F953:
4318             return "\u7956";
4319         case 0x2F954:
4320             return "\ud855\ude9a";
4321         case 0x2F955:
4322             return "\ud855\udec5";
4323         case 0x2F956:
4324             return "\u798F";
4325         case 0x2F957:
4326             return "\u79EB";
4327         case 0x2F958:
4328             return "\u412F";
4329         case 0x2F959:
4330             return "\u7A40";
4331         case 0x2F95A:
4332             return "\u7A4A";
4333         case 0x2F95B:
4334             return "\u7A4F";
4335         case 0x2F95C:
4336             return "\ud856\udd7c";
4337         case 0x2F95D:
4338             return "\ud856\udea7";
4339         case 0x2F95E:
4340             return "\ud856\udea7";
4341         case 0x2F95F:
4342             return "\u7AEE";
4343         case 0x2F960:
4344             return "\u4202";
4345         case 0x2F961:
4346             return "\ud856\udfab";
4347         case 0x2F962:
4348             return "\u7BC6";
4349         case 0x2F963:
4350             return "\u7BC9";
4351         case 0x2F964:
4352             return "\u4227";
4353         case 0x2F965:
4354             return "\ud857\udc80";
4355         case 0x2F966:
4356             return "\u7CD2";
4357         case 0x2F967:
4358             return "\u42A0";
4359         case 0x2F968:
4360             return "\u7CE8";
4361         case 0x2F969:
4362             return "\u7CE3";
4363         case 0x2F96A:
4364             return "\u7D00";
4365         case 0x2F96B:
4366             return "\ud857\udf86";
4367         case 0x2F96C:
4368             return "\u7D63";
4369         case 0x2F96D:
4370             return "\u4301";
4371         case 0x2F96E:
4372             return "\u7DC7";
4373         case 0x2F96F:
4374             return "\u7E02";
4375         case 0x2F970:
4376             return "\u7E45";
4377         case 0x2F971:
4378             return "\u4334";
4379         case 0x2F972:
4380             return "\ud858\ude28";
4381         case 0x2F973:
4382             return "\ud858\ude47";
4383         case 0x2F974:
4384             return "\u4359";
4385         case 0x2F975:
4386             return "\ud858\uded9";
4387         case 0x2F976:
4388             return "\u7F7A";
4389         case 0x2F977:
4390             return "\ud858\udf3e";
4391         case 0x2F978:
4392             return "\u7F95";
4393         case 0x2F979:
4394             return "\u7FFA";
4395         case 0x2F97A:
4396             return "\u8005";
4397         case 0x2F97B:
4398             return "\ud859\udcda";
4399         case 0x2F97C:
4400             return "\ud859\udd23";
4401         case 0x2F97D:
4402             return "\u8060";
4403         case 0x2F97E:
4404             return "\ud859\udda8";
4405         case 0x2F97F:
4406             return "\u8070";
4407         case 0x2F980:
4408             return "\ud84c\udf5f";
4409         case 0x2F981:
4410             return "\u43D5";
4411         case 0x2F982:
4412             return "\u80B2";
4413         case 0x2F983:
4414             return "\u8103";
4415         case 0x2F984:
4416             return "\u440B";
4417         case 0x2F985:
4418             return "\u813E";
4419         case 0x2F986:
4420             return "\u5AB5";
4421         case 0x2F987:
4422             return "\ud859\udfa7";
4423         case 0x2F988:
4424             return "\ud859\udfb5";
4425         case 0x2F989:
4426             return "\ud84c\udf93";
4427         case 0x2F98A:
4428             return "\ud84c\udf9c";
4429         case 0x2F98B:
4430             return "\u8201";
4431         case 0x2F98C:
4432             return "\u8204";
4433         case 0x2F98D:
4434             return "\u8F9E";
4435         case 0x2F98E:
4436             return "\u446B";
4437         case 0x2F98F:
4438             return "\u8291";
4439         case 0x2F990:
4440             return "\u828B";
4441         case 0x2F991:
4442             return "\u829D";
4443         case 0x2F992:
4444             return "\u52B3";
4445         case 0x2F993:
4446             return "\u82B1";
4447         case 0x2F994:
4448             return "\u82B3";
4449         case 0x2F995:
4450             return "\u82BD";
4451         case 0x2F996:
4452             return "\u82E6";
4453         case 0x2F997:
4454             return "\ud85a\udf3c";
4455         case 0x2F998:
4456             return "\u82E5";
4457         case 0x2F999:
4458             return "\u831D";
4459         case 0x2F99A:
4460             return "\u8363";
4461         case 0x2F99B:
4462             return "\u83AD";
4463         case 0x2F99C:
4464             return "\u8323";
4465         case 0x2F99D:
4466             return "\u83BD";
4467         case 0x2F99E:
4468             return "\u83E7";
4469         case 0x2F99F:
4470             return "\u8457";
4471         case 0x2F9A0:
4472             return "\u8353";
4473         case 0x2F9A1:
4474             return "\u83CA";
4475         case 0x2F9A2:
4476             return "\u83CC";
4477         case 0x2F9A3:
4478             return "\u83DC";
4479         case 0x2F9A4:
4480             return "\ud85b\udc36";
4481         case 0x2F9A5:
4482             return "\ud85b\udd6b";
4483         case 0x2F9A6:
4484             return "\ud85b\udcd5";
4485         case 0x2F9A7:
4486             return "\u452B";
4487         case 0x2F9A8:
4488             return "\u84F1";
4489         case 0x2F9A9:
4490             return "\u84F3";
4491         case 0x2F9AA:
4492             return "\u8516";
4493         case 0x2F9AB:
4494             return "\ud85c\udfca";
4495         case 0x2F9AC:
4496             return "\u8564";
4497         case 0x2F9AD:
4498             return "\ud85b\udf2c";
4499         case 0x2F9AE:
4500             return "\u455D";
4501         case 0x2F9AF:
4502             return "\u4561";
4503         case 0x2F9B0:
4504             return "\ud85b\udfb1";
4505         case 0x2F9B1:
4506             return "\ud85c\udcd2";
4507         case 0x2F9B2:
4508             return "\u456B";
4509         case 0x2F9B3:
4510             return "\u8650";
4511         case 0x2F9B4:
4512             return "\u865C";
4513         case 0x2F9B5:
4514             return "\u8667";
4515         case 0x2F9B6:
4516             return "\u8669";
4517         case 0x2F9B7:
4518             return "\u86A9";
4519         case 0x2F9B8:
4520             return "\u8688";
4521         case 0x2F9B9:
4522             return "\u870E";
4523         case 0x2F9BA:
4524             return "\u86E2";
4525         case 0x2F9BB:
4526             return "\u8779";
4527         case 0x2F9BC:
4528             return "\u8728";
4529         case 0x2F9BD:
4530             return "\u876B";
4531         case 0x2F9BE:
4532             return "\u8786";
4533         case 0x2F9BF:
4534             return "\u45D7";
4535         case 0x2F9C0:
4536             return "\u87E1";
4537         case 0x2F9C1:
4538             return "\u8801";
4539         case 0x2F9C2:
4540             return "\u45F9";
4541         case 0x2F9C3:
4542             return "\u8860";
4543         case 0x2F9C4:
4544             return "\u8863";
4545         case 0x2F9C5:
4546             return "\ud85d\ude67";
4547         case 0x2F9C6:
4548             return "\u88D7";
4549         case 0x2F9C7:
4550             return "\u88DE";
4551         case 0x2F9C8:
4552             return "\u4635";
4553         case 0x2F9C9:
4554             return "\u88FA";
4555         case 0x2F9CA:
4556             return "\u34BB";
4557         case 0x2F9CB:
4558             return "\ud85e\udcae";
4559         case 0x2F9CC:
4560             return "\ud85e\udd66";
4561         case 0x2F9CD:
4562             return "\u46BE";
4563         case 0x2F9CE:
4564             return "\u46C7";
4565         case 0x2F9CF:
4566             return "\u8AA0";
4567         case 0x2F9D0:
4568             return "\u8AED";
4569         case 0x2F9D1:
4570             return "\u8B8A";
4571         case 0x2F9D2:
4572             return "\u8C55";
4573         case 0x2F9D3:
4574             return "\ud85f\udca8";
4575         case 0x2F9D4:
4576             return "\u8CAB";
4577         case 0x2F9D5:
4578             return "\u8CC1";
4579         case 0x2F9D6:
4580             return "\u8D1B";
4581         case 0x2F9D7:
4582             return "\u8D77";
4583         case 0x2F9D8:
4584             return "\ud85f\udf2f";
4585         case 0x2F9D9:
4586             return "\ud842\udc04";
4587         case 0x2F9DA:
4588             return "\u8DCB";
4589         case 0x2F9DB:
4590             return "\u8DBC";
4591         case 0x2F9DC:
4592             return "\u8DF0";
4593         case 0x2F9DD:
4594             return "\ud842\udcde";
4595         case 0x2F9DE:
4596             return "\u8ED4";
4597         case 0x2F9DF:
4598             return "\u8F38";
4599         case 0x2F9E0:
4600             return "\ud861\uddd2";
4601         case 0x2F9E1:
4602             return "\ud861\udded";
4603         case 0x2F9E2:
4604             return "\u9094";
4605         case 0x2F9E3:
4606             return "\u90F1";
4607         case 0x2F9E4:
4608             return "\u9111";
4609         case 0x2F9E5:
4610             return "\ud861\udf2e";
4611         case 0x2F9E6:
4612             return "\u911B";
4613         case 0x2F9E7:
4614             return "\u9238";
4615         case 0x2F9E8:
4616             return "\u92D7";
4617         case 0x2F9E9:
4618             return "\u92D8";
4619         case 0x2F9EA:
4620             return "\u927C";
4621         case 0x2F9EB:
4622             return "\u93F9";
4623         case 0x2F9EC:
4624             return "\u9415";
4625         case 0x2F9ED:
4626             return "\ud862\udffa";
4627         case 0x2F9EE:
4628             return "\u958B";
4629         case 0x2F9EF:
4630             return "\u4995";
4631         case 0x2F9F0:
4632             return "\u95B7";
4633         case 0x2F9F1:
4634             return "\ud863\udd77";
4635         case 0x2F9F2:
4636             return "\u49E6";
4637         case 0x2F9F3:
4638             return "\u96C3";
4639         case 0x2F9F4:
4640             return "\u5DB2";
4641         case 0x2F9F5:
4642             return "\u9723";
4643         case 0x2F9F6:
4644             return "\ud864\udd45";
4645         case 0x2F9F7:
4646             return "\ud864\ude1a";
4647         case 0x2F9F8:
4648             return "\u4A6E";
4649         case 0x2F9F9:
4650             return "\u4A76";
4651         case 0x2F9FA:
4652             return "\u97E0";
4653         case 0x2F9FB:
4654             return "\ud865\udc0a";
4655         case 0x2F9FC:
4656             return "\u4AB2";
4657         case 0x2F9FD:
4658             return "\ud865\udc96";
4659         case 0x2F9FE:
4660             return "\u980B";
4661         case 0x2F9FF:
4662             return "\u980B";
4663         case 0x2FA00:
4664             return "\u9829";
4665         case 0x2FA01:
4666             return "\ud865\uddb6";
4667         case 0x2FA02:
4668             return "\u98E2";
4669         case 0x2FA03:
4670             return "\u4B33";
4671         case 0x2FA04:
4672             return "\u9929";
4673         case 0x2FA05:
4674             return "\u99A7";
4675         case 0x2FA06:
4676             return "\u99C2";
4677         case 0x2FA07:
4678             return "\u99FE";
4679         case 0x2FA08:
4680             return "\u4BCE";
4681         case 0x2FA09:
4682             return "\ud866\udf30";
4683         case 0x2FA0A:
4684             return "\u9B12";
4685         case 0x2FA0B:
4686             return "\u9C40";
4687         case 0x2FA0C:
4688             return "\u9CFD";
4689         case 0x2FA0D:
4690             return "\u4CCE";
4691         case 0x2FA0E:
4692             return "\u4CED";
4693         case 0x2FA0F:
4694             return "\u9D67";
4695         case 0x2FA10:
4696             return "\ud868\udcce";
4697         case 0x2FA11:
4698             return "\u4CF8";
4699         case 0x2FA12:
4700             return "\ud868\udd05";
4701         case 0x2FA13:
4702             return "\ud868\ude0e";
4703         case 0x2FA14:
4704             return "\ud868\ude91";
4705         case 0x2FA15:
4706             return "\u9EBB";
4707         case 0x2FA16:
4708             return "\u4D56";
4709         case 0x2FA17:
4710             return "\u9EF9";
4711         case 0x2FA18:
4712             return "\u9EFE";
4713         case 0x2FA19:
4714             return "\u9F05";
4715         case 0x2FA1A:
4716             return "\u9F0F";
4717         case 0x2FA1B:
4718             return "\u9F16";
4719         case 0x2FA1C:
4720             return "\u9F3B";
4721         case 0x2FA1D:
4722             return "\ud869\ude00";
4723         default: // not decomposable
4724             if (character <= 0xFFFF) {
4725                 return String.valueOf((char) character);
4726              }
4727              else {
4728                  StringBuffer sb = new StringBuffer(2);
4729                  sb.append(getHighSurrogate(character));
4730                  sb.append(getLowSurrogate(character));
4731                  return sb.toString();
4732              }
4733         }
4734 
4735     }
4736     ///CLOVER:ON
4737 
4738 
decomposeHangul(char c)4739     private static String decomposeHangul(char c) {
4740 
4741         final int firstLeadingConsonant  = 0x1100;
4742         final int firstMedialVowel       = 0x1161;
4743         final int firstTrailingConsonant = 0x11A7;
4744 
4745         final int numberOfLeadingConsonants  = 19;
4746         final int numberOfMedialVowels       = 21;
4747         final int numberOfTrailingConsonants = 28;
4748 
4749         final int numberOfFinalPairs
4750           = numberOfMedialVowels * numberOfTrailingConsonants;
4751         final int numberOfSyllables
4752           = numberOfLeadingConsonants * numberOfFinalPairs;
4753 
4754         final int syllable = c - FIRST_HANGUL_SYLLABLE;
4755 
4756         if (syllable < 0 || syllable >= numberOfSyllables) {
4757             return String.valueOf(c);
4758         }
4759 
4760         int leadingConsonant = firstLeadingConsonant
4761           + syllable / numberOfFinalPairs;
4762         int medialVowel = firstMedialVowel
4763           + (syllable % numberOfFinalPairs) / numberOfTrailingConsonants;
4764         int trailingConsonant = firstTrailingConsonant
4765           + syllable % numberOfTrailingConsonants;
4766 
4767         StringBuffer result = new StringBuffer(3);
4768         result.append((char) leadingConsonant);
4769         result.append((char) medialVowel);
4770         if (trailingConsonant != firstTrailingConsonant) {
4771             result.append((char) trailingConsonant);
4772         }
4773 
4774         return result.toString();
4775 
4776     }
4777 
4778 
composeHangul(String source)4779     private static String composeHangul(String source) {
4780 
4781         final int firstLeadingConsonant = 0x1100;
4782         final int firstMedialVowel = 0x1161;
4783         final int firstTrailingConsonant = 0x11A7;
4784 
4785         final int numberOfLeadingConsonants  = 19;
4786         final int numberOfMedialVowels       = 21;
4787         final int numberOfTrailingConsonants = 28;
4788 
4789         final int numberOfFinalPairs
4790           = numberOfMedialVowels * numberOfTrailingConsonants;
4791         final int numberOfSyllables
4792           = numberOfLeadingConsonants * numberOfFinalPairs;
4793 
4794         final int length = source.length();
4795         if (length == 0) return "";
4796         StringBuffer result = new StringBuffer(length);
4797         char previous = source.charAt(0);
4798         result.append(previous);
4799 
4800         for (int i = 1; i < length; ++i) {
4801             char c = source.charAt(i);
4802 
4803             int leadingConsonant = previous - firstLeadingConsonant;
4804             if (0 <= leadingConsonant && leadingConsonant < numberOfLeadingConsonants) {
4805                 int medialVowel = c - firstMedialVowel;
4806                 if (medialVowel >= 0 && medialVowel < numberOfMedialVowels) {
4807                     previous = (char) (FIRST_HANGUL_SYLLABLE
4808                       + (leadingConsonant * numberOfMedialVowels + medialVowel)
4809                       * numberOfTrailingConsonants);
4810                     result.setCharAt(result.length()-1, previous);
4811                     continue;
4812                 }
4813             }
4814 
4815             int syllable = previous - FIRST_HANGUL_SYLLABLE;
4816             if (syllable >= 0 && syllable < numberOfSyllables
4817               && (syllable % numberOfTrailingConsonants) == 0) {
4818                 int trailingConsonant = c - firstTrailingConsonant;
4819                 if (trailingConsonant >= 0 && trailingConsonant <= numberOfTrailingConsonants) {
4820                     previous += trailingConsonant;
4821                     result.setCharAt(result.length()-1, previous);
4822                     continue;
4823                 }
4824             }
4825 
4826             previous = c;
4827             result.append(c);
4828         }
4829 
4830         return result.toString();
4831 
4832     }
4833 
4834 
4835     private static class UnicodeString {
4836 
4837         private int[] data;
4838         private int   size = 0;
4839 
UnicodeString(String s)4840         UnicodeString(String s) {
4841 
4842             int length = s.length();
4843             data = new int[length];
4844             int index = 0;
4845             for (int i = 0; i < length; i++) {
4846                 char c = s.charAt(i);
4847                 int codePoint = c;
4848                 if (isHighSurrogate(c)) {
4849                     i++;
4850                     codePoint = combineSurrogatePair(c, s.charAt(i));
4851                 }
4852                 data[index] = codePoint;
4853                 index++;
4854             }
4855             this.size = index;
4856 
4857         }
4858 
4859 
UnicodeString(int length)4860         UnicodeString(int length) {
4861             this.size = 0;
4862             data = new int[length];
4863         }
4864 
4865 
decompose()4866         UnicodeString decompose() {
4867 
4868             UnicodeString result = new UnicodeString(size);
4869             for (int i = 0; i < size; i++) {
4870                 int c = data[i];
4871                 String d = UnicodeUtil.decompose(c);
4872                 result.append(d);
4873             }
4874 
4875             /* now put into canonical order */
4876 
4877             for (int i = 0; i < result.size-1; i++) {
4878                 int first = result.data[i];
4879                 int second = result.data[i+1];
4880                 int secondClass = getCombiningClass(second);
4881                 if (secondClass == 0) continue;
4882                 int firstClass = getCombiningClass(first);
4883                 if (firstClass > secondClass ) {
4884                     result.data[i] = second;
4885                     result.data[i+1] = first;
4886                     i -= 2;
4887                     if (i == -2) i = -1;
4888                 }
4889             }
4890 
4891             return result;
4892 
4893         }
4894 
4895 
compose()4896         UnicodeString compose() {
4897 
4898             if (compositions == null) loadCompositions();
4899 
4900             UnicodeString composed = new UnicodeString(size);
4901 
4902             int lastStarter = -1;
4903             int lastStarterIndex = -1;
4904             int composedLastStarterIndex = -1;
4905 
4906             for (int i = 0; i < size; i++) {
4907                 int c = data[i];
4908                 if (lastStarter == -1 || isBlocked(lastStarterIndex, i)) {
4909                     composed.append(c);
4910                     if (isStarter(c) ) {
4911                         lastStarter = c;
4912                         lastStarterIndex = i;
4913                         composedLastStarterIndex = composed.size-1;
4914                     }
4915                 }
4916                 else  {
4917                     int composedChar = composeCharacter(lastStarter, c);
4918                     if (composedChar == -1) {
4919                         composed.append(c);
4920                         if (isStarter(c) ) {
4921                             lastStarter = c;
4922                             lastStarterIndex = i;
4923                             composedLastStarterIndex = composed.size-1;
4924                         }
4925                     }
4926                     else {
4927                         lastStarter = composedChar;
4928                         // XXX dangerous side effects
4929                         data[lastStarterIndex] = composedChar;
4930                         data[i] = 0;
4931                         composed.data[composedLastStarterIndex] = composedChar;
4932                     }
4933                 }
4934             }
4935 
4936             return composed;
4937 
4938         }
4939 
4940 
append(String s)4941         void append(String s) {
4942 
4943             for (int i = 0; i < s.length(); i++) {
4944                 char c = s.charAt(i);
4945                 if (isHighSurrogate(c)) {
4946                     append(UnicodeUtil.combineSurrogatePair(c, s.charAt(i+1)));
4947                     i++;
4948                 }
4949                 else {
4950                     append(c);
4951                 }
4952             }
4953 
4954         }
4955 
4956 
append(int c)4957         void append(int c) {
4958 
4959             if (size < data.length-1) {
4960                 data[size] = c;
4961                 size++;
4962             }
4963             else {
4964                 int[] array = new int[data.length+10];
4965                 System.arraycopy(data, 0, array, 0, size);
4966                 data = array;
4967                 append(c);
4968             }
4969 
4970         }
4971 
toString()4972         public String toString() {
4973 
4974             StringBuffer sb = new StringBuffer();
4975             for (int i = 0; i < size; i++) {
4976                 int c = data[i];
4977                 if (c <= 0xFFFF) sb.append((char) c);
4978                 else {
4979                     sb.append(makeSurrogatePair(c));
4980                 }
4981             }
4982             return sb.toString();
4983 
4984         }
4985 
isBlocked(int lastStarterIndex, int index)4986         private boolean isBlocked(int lastStarterIndex, int index) {
4987 
4988             int combiningClass = getCombiningClass(data[index]);
4989             for (int i = lastStarterIndex+1; i < index; i++) {
4990                 if (data[i] !=0 && combiningClass == getCombiningClass(data[i])) {
4991                     return true;
4992                 }
4993             }
4994             return false;
4995 
4996         }
4997 
4998     }
4999 
5000 
5001 }
5002