]> git.proxmox.com Git - mirror_novnc.git/blame - include/input.js
Limited the double click fix to touch devices.
[mirror_novnc.git] / include / input.js
CommitLineData
d3796c14
JM
1/*
2 * noVNC: HTML5 VNC client
1d728ace 3 * Copyright (C) 2012 Joel Martin
b2f1961a 4 * Copyright (C) 2013 Samuel Mannehed for Cendio AB
1d728ace 5 * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
d3796c14
JM
6 */
7
8/*jslint browser: true, white: false, bitwise: false */
9/*global window, Util */
10
11
12//
13// Keyboard event handler
14//
15
5210330a 16function Keyboard(defaults) {
d890e864 17"use strict";
d3796c14 18
5210330a
JM
19var that = {}, // Public API methods
20 conf = {}, // Configuration attributes
c96f9003
JM
21
22 keyDownList = []; // List of depressed keys
23 // (even if they are happy)
d3796c14 24
5210330a
JM
25// Configuration attributes
26Util.conf_defaults(conf, that, defaults, [
27 ['target', 'wo', 'dom', document, 'DOM element that captures keyboard input'],
28 ['focused', 'rw', 'bool', true, 'Capture and send key events'],
d3796c14 29
5210330a
JM
30 ['onKeyPress', 'rw', 'func', null, 'Handler for key press/release']
31 ]);
d3796c14 32
d3796c14
JM
33
34//
35// Private functions
36//
37
c96f9003
JM
38// From the event keyCode return the keysym value for keys that need
39// to be suppressed otherwise they may trigger unintended browser
40// actions
fac149dd 41function getKeysymSpecial(evt) {
c96f9003 42 var keysym = null;
d3796c14 43
d3796c14 44 switch ( evt.keyCode ) {
fac149dd 45 // These generate a keyDown and keyPress in Firefox and Opera
d3796c14 46 case 8 : keysym = 0xFF08; break; // BACKSPACE
d3796c14 47 case 13 : keysym = 0xFF0D; break; // ENTER
c96f9003 48
fac149dd
JM
49 // This generates a keyDown and keyPress in Opera
50 case 9 : keysym = 0xFF09; break; // TAB
c96f9003 51 default : break;
d3796c14
JM
52 }
53
fac149dd 54 if (evt.type === 'keydown') {
c96f9003 55 switch ( evt.keyCode ) {
fac149dd
JM
56 case 27 : keysym = 0xFF1B; break; // ESCAPE
57 case 46 : keysym = 0xFFFF; break; // DELETE
58
59 case 36 : keysym = 0xFF50; break; // HOME
60 case 35 : keysym = 0xFF57; break; // END
61 case 33 : keysym = 0xFF55; break; // PAGE_UP
62 case 34 : keysym = 0xFF56; break; // PAGE_DOWN
c96f9003
JM
63 case 45 : keysym = 0xFF63; break; // INSERT
64 // '-' during keyPress
fac149dd
JM
65 case 37 : keysym = 0xFF51; break; // LEFT
66 case 38 : keysym = 0xFF52; break; // UP
67 case 39 : keysym = 0xFF53; break; // RIGHT
68 case 40 : keysym = 0xFF54; break; // DOWN
69 case 16 : keysym = 0xFFE1; break; // SHIFT
70 case 17 : keysym = 0xFFE3; break; // CONTROL
71 //case 18 : keysym = 0xFFE7; break; // Left Meta (Mac Option)
72 case 18 : keysym = 0xFFE9; break; // Left ALT (Mac Command)
73
c96f9003
JM
74 case 112 : keysym = 0xFFBE; break; // F1
75 case 113 : keysym = 0xFFBF; break; // F2
76 case 114 : keysym = 0xFFC0; break; // F3
77 case 115 : keysym = 0xFFC1; break; // F4
78 case 116 : keysym = 0xFFC2; break; // F5
79 case 117 : keysym = 0xFFC3; break; // F6
80 case 118 : keysym = 0xFFC4; break; // F7
81 case 119 : keysym = 0xFFC5; break; // F8
82 case 120 : keysym = 0xFFC6; break; // F9
83 case 121 : keysym = 0xFFC7; break; // F10
84 case 122 : keysym = 0xFFC8; break; // F11
85 case 123 : keysym = 0xFFC9; break; // F12
86
50b81d44 87 case 225 : keysym = 0xFE03; break; // AltGr
c76b2a81
BE
88 case 91 : keysym = 0xFFEC; break; // Super_R (Win Key)
89 case 93 : keysym = 0xFF67; break; // Menu (Win Menu)
90
c96f9003
JM
91 default : break;
92 }
d3796c14 93 }
c96f9003
JM
94
95 if ((!keysym) && (evt.ctrlKey || evt.altKey)) {
96 if ((typeof(evt.which) !== "undefined") && (evt.which > 0)) {
97 keysym = evt.which;
98 } else {
99 // IE9 always
100 // Firefox and Opera when ctrl/alt + special
101 Util.Warn("which not set, using keyCode");
102 keysym = evt.keyCode;
d3796c14 103 }
c96f9003
JM
104
105 /* Remap symbols */
d3796c14 106 switch (keysym) {
c96f9003
JM
107 case 186 : keysym = 59; break; // ; (IE)
108 case 187 : keysym = 61; break; // = (IE)
109 case 188 : keysym = 44; break; // , (Mozilla, IE)
110 case 109 : // - (Mozilla, Opera)
111 if (Util.Engine.gecko || Util.Engine.presto) {
112 keysym = 45; }
113 break;
37a3081f
HT
114 case 173 : // - (Mozilla)
115 if (Util.Engine.gecko) {
116 keysym = 45; }
117 break;
c96f9003
JM
118 case 189 : keysym = 45; break; // - (IE)
119 case 190 : keysym = 46; break; // . (Mozilla, IE)
120 case 191 : keysym = 47; break; // / (Mozilla, IE)
121 case 192 : keysym = 96; break; // ` (Mozilla, IE)
122 case 219 : keysym = 91; break; // [ (Mozilla, IE)
123 case 220 : keysym = 92; break; // \ (Mozilla, IE)
124 case 221 : keysym = 93; break; // ] (Mozilla, IE)
125 case 222 : keysym = 39; break; // ' (Mozilla, IE)
126 }
127
128 /* Remap shifted and unshifted keys */
129 if (!!evt.shiftKey) {
130 switch (keysym) {
131 case 48 : keysym = 41 ; break; // ) (shifted 0)
132 case 49 : keysym = 33 ; break; // ! (shifted 1)
133 case 50 : keysym = 64 ; break; // @ (shifted 2)
134 case 51 : keysym = 35 ; break; // # (shifted 3)
135 case 52 : keysym = 36 ; break; // $ (shifted 4)
136 case 53 : keysym = 37 ; break; // % (shifted 5)
137 case 54 : keysym = 94 ; break; // ^ (shifted 6)
138 case 55 : keysym = 38 ; break; // & (shifted 7)
139 case 56 : keysym = 42 ; break; // * (shifted 8)
140 case 57 : keysym = 40 ; break; // ( (shifted 9)
141
142 case 59 : keysym = 58 ; break; // : (shifted `)
143 case 61 : keysym = 43 ; break; // + (shifted ;)
144 case 44 : keysym = 60 ; break; // < (shifted ,)
145 case 45 : keysym = 95 ; break; // _ (shifted -)
146 case 46 : keysym = 62 ; break; // > (shifted .)
147 case 47 : keysym = 63 ; break; // ? (shifted /)
148 case 96 : keysym = 126; break; // ~ (shifted `)
149 case 91 : keysym = 123; break; // { (shifted [)
150 case 92 : keysym = 124; break; // | (shifted \)
151 case 93 : keysym = 125; break; // } (shifted ])
152 case 39 : keysym = 34 ; break; // " (shifted ')
153 }
154 } else if ((keysym >= 65) && (keysym <=90)) {
155 /* Remap unshifted A-Z */
156 keysym += 32;
157 } else if (evt.keyLocation === 3) {
158 // numpad keys
159 switch (keysym) {
160 case 96 : keysym = 48; break; // 0
161 case 97 : keysym = 49; break; // 1
162 case 98 : keysym = 50; break; // 2
163 case 99 : keysym = 51; break; // 3
164 case 100: keysym = 52; break; // 4
165 case 101: keysym = 53; break; // 5
166 case 102: keysym = 54; break; // 6
167 case 103: keysym = 55; break; // 7
168 case 104: keysym = 56; break; // 8
169 case 105: keysym = 57; break; // 9
170 case 109: keysym = 45; break; // -
171 case 110: keysym = 46; break; // .
172 case 111: keysym = 47; break; // /
173 }
d3796c14
JM
174 }
175 }
176
177 return keysym;
c96f9003
JM
178}
179
180/* Translate DOM keyPress event to keysym value */
181function getKeysym(evt) {
182 var keysym, msg;
183
184 if (typeof(evt.which) !== "undefined") {
185 // WebKit, Firefox, Opera
186 keysym = evt.which;
187 } else {
188 // IE9
189 Util.Warn("which not set, using keyCode");
190 keysym = evt.keyCode;
191 }
192
193 if ((keysym > 255) && (keysym < 0xFF00)) {
d890e864 194 msg = "Mapping character code " + keysym;
c96f9003
JM
195 // Map Unicode outside Latin 1 to X11 keysyms
196 keysym = unicodeTable[keysym];
197 if (typeof(keysym) === 'undefined') {
198 keysym = 0;
199 }
200 Util.Debug(msg + " to " + keysym);
201 }
202
203 return keysym;
204}
d3796c14 205
c96f9003 206function show_keyDownList(kind) {
d890e864 207 var c;
c96f9003 208 var msg = "keyDownList (" + kind + "):\n";
d890e864 209 for (c = 0; c < keyDownList.length; c++) {
c96f9003
JM
210 msg = msg + " " + c + " - keyCode: " + keyDownList[c].keyCode +
211 " - which: " + keyDownList[c].which + "\n";
212 }
d890e864 213 Util.Debug(msg);
c96f9003
JM
214}
215
216function copyKeyEvent(evt) {
fac149dd 217 var members = ['type', 'keyCode', 'charCode', 'which',
c96f9003
JM
218 'altKey', 'ctrlKey', 'shiftKey',
219 'keyLocation', 'keyIdentifier'], i, obj = {};
220 for (i = 0; i < members.length; i++) {
221 if (typeof(evt[members[i]]) !== "undefined") {
222 obj[members[i]] = evt[members[i]];
223 }
224 }
225 return obj;
226}
227
228function pushKeyEvent(fevt) {
229 keyDownList.push(fevt);
230}
231
232function getKeyEvent(keyCode, pop) {
233 var i, fevt = null;
234 for (i = keyDownList.length-1; i >= 0; i--) {
235 if (keyDownList[i].keyCode === keyCode) {
236 if ((typeof(pop) !== "undefined") && (pop)) {
237 fevt = keyDownList.splice(i, 1)[0];
238 } else {
239 fevt = keyDownList[i];
240 }
241 break;
242 }
243 }
244 return fevt;
245}
246
247function ignoreKeyEvent(evt) {
248 // Blarg. Some keys have a different keyCode on keyDown vs keyUp
249 if (evt.keyCode === 229) {
250 // French AZERTY keyboard dead key.
251 // Lame thing is that the respective keyUp is 219 so we can't
252 // properly ignore the keyUp event
253 return true;
254 }
255 return false;
256}
257
258
259//
260// Key Event Handling:
261//
262// There are several challenges when dealing with key events:
263// - The meaning and use of keyCode, charCode and which depends on
264// both the browser and the event type (keyDown/Up vs keyPress).
265// - We cannot automatically determine the keyboard layout
266// - The keyDown and keyUp events have a keyCode value that has not
267// been translated by modifier keys.
268// - The keyPress event has a translated (for layout and modifiers)
269// character code but the attribute containing it differs. keyCode
270// contains the translated value in WebKit (Chrome/Safari), Opera
271// 11 and IE9. charCode contains the value in WebKit and Firefox.
272// The which attribute contains the value on WebKit, Firefox and
273// Opera 11.
274// - The keyDown/Up keyCode value indicates (sort of) the physical
275// key was pressed but only for standard US layout. On a US
276// keyboard, the '-' and '_' characters are on the same key and
277// generate a keyCode value of 189. But on an AZERTY keyboard even
278// though they are different physical keys they both still
279// generate a keyCode of 189!
280// - To prevent a key event from propagating to the browser and
281// causing unwanted default actions (such as closing a tab,
282// opening a menu, shifting focus, etc) we must suppress this
283// event in both keyDown and keyPress because not all key strokes
284// generate on a keyPress event. Also, in WebKit and IE9
285// suppressing the keyDown prevents a keyPress but other browsers
286// still generated a keyPress even if keyDown is suppressed.
287//
288// For safe key events, we wait until the keyPress event before
289// reporting a key down event. For unsafe key events, we report a key
290// down event when the keyDown event fires and we suppress any further
291// actions (including keyPress).
292//
293// In order to report a key up event that matches what we reported
294// for the key down event, we keep a list of keys that are currently
295// down. When the keyDown event happens, we add the key event to the
296// list. If it is a safe key event, then we update the which attribute
297// in the most recent item on the list when we received a keyPress
298// event (keyPress should immediately follow keyDown). When we
299// received a keyUp event we search for the event on the list with
300// a matching keyCode and we report the character code using the value
301// in the 'which' attribute that was stored with that key.
302//
303
304function onKeyDown(e) {
305 if (! conf.focused) {
306 return true;
307 }
308 var fevt = null, evt = (e ? e : window.event),
309 keysym = null, suppress = false;
d890e864 310 //Util.Debug("onKeyDown kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which);
c96f9003
JM
311
312 fevt = copyKeyEvent(evt);
313
fac149dd 314 keysym = getKeysymSpecial(evt);
c96f9003
JM
315 // Save keysym decoding for use in keyUp
316 fevt.keysym = keysym;
317 if (keysym) {
318 // If it is a key or key combination that might trigger
319 // browser behaviors or it has no corresponding keyPress
320 // event, then send it immediately
d890e864
JM
321 if (conf.onKeyPress && !ignoreKeyEvent(evt)) {
322 Util.Debug("onKeyPress down, keysym: " + keysym +
323 " (onKeyDown key: " + evt.keyCode +
324 ", which: " + evt.which + ")");
325 conf.onKeyPress(keysym, 1, evt);
c96f9003
JM
326 }
327 suppress = true;
328 }
329
330 if (! ignoreKeyEvent(evt)) {
331 // Add it to the list of depressed keys
332 pushKeyEvent(fevt);
d890e864 333 //show_keyDownList('down');
c96f9003
JM
334 }
335
336 if (suppress) {
337 // Suppress bubbling/default actions
338 Util.stopEvent(e);
339 return false;
340 } else {
341 // Allow the event to bubble and become a keyPress event which
342 // will have the character code translated
343 return true;
344 }
345}
346
347function onKeyPress(e) {
348 if (! conf.focused) {
349 return true;
350 }
351 var evt = (e ? e : window.event),
352 kdlen = keyDownList.length, keysym = null;
d890e864 353 //Util.Debug("onKeyPress kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which);
c96f9003
JM
354
355 if (((evt.which !== "undefined") && (evt.which === 0)) ||
fac149dd 356 (getKeysymSpecial(evt))) {
c96f9003
JM
357 // Firefox and Opera generate a keyPress event even if keyDown
358 // is suppressed. But the keys we want to suppress will have
359 // either:
360 // - the which attribute set to 0
fac149dd 361 // - getKeysymSpecial() will identify it
c96f9003
JM
362 Util.Debug("Ignoring special key in keyPress");
363 Util.stopEvent(e);
364 return false;
365 }
366
367 keysym = getKeysym(evt);
368
369 // Modify the the which attribute in the depressed keys list so
370 // that the keyUp event will be able to have the character code
371 // translation available.
372 if (kdlen > 0) {
373 keyDownList[kdlen-1].keysym = keysym;
374 } else {
375 Util.Warn("keyDownList empty when keyPress triggered");
376 }
377
d890e864 378 //show_keyDownList('press');
c96f9003
JM
379
380 // Send the translated keysym
d890e864
JM
381 if (conf.onKeyPress && (keysym > 0)) {
382 Util.Debug("onKeyPress down, keysym: " + keysym +
383 " (onKeyPress key: " + evt.keyCode +
384 ", which: " + evt.which + ")");
385 conf.onKeyPress(keysym, 1, evt);
c96f9003
JM
386 }
387
388 // Stop keypress events just in case
389 Util.stopEvent(e);
390 return false;
391}
392
393function onKeyUp(e) {
394 if (! conf.focused) {
395 return true;
396 }
d890e864
JM
397 var fevt = null, evt = (e ? e : window.event), keysym;
398 //Util.Debug("onKeyUp kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which);
c96f9003
JM
399
400 fevt = getKeyEvent(evt.keyCode, true);
401
402 if (fevt) {
403 keysym = fevt.keysym;
404 } else {
405 Util.Warn("Key event (keyCode = " + evt.keyCode +
406 ") not found on keyDownList");
407 keysym = 0;
408 }
409
d890e864 410 //show_keyDownList('up');
c96f9003 411
d890e864
JM
412 if (conf.onKeyPress && (keysym > 0)) {
413 //Util.Debug("keyPress up, keysym: " + keysym +
414 // " (key: " + evt.keyCode + ", which: " + evt.which + ")");
415 Util.Debug("onKeyPress up, keysym: " + keysym +
416 " (onKeyPress key: " + evt.keyCode +
417 ", which: " + evt.which + ")");
418 conf.onKeyPress(keysym, 0, evt);
c96f9003
JM
419 }
420 Util.stopEvent(e);
421 return false;
422}
423
6671c762
JM
424function allKeysUp() {
425 Util.Debug(">> Keyboard.allKeysUp");
426 if (keyDownList.length > 0) {
427 Util.Info("Releasing pressed/down keys");
428 }
429 var i, keysym, fevt = null;
430 for (i = keyDownList.length-1; i >= 0; i--) {
431 fevt = keyDownList.splice(i, 1)[0];
432 keysym = fevt.keysym;
433 if (conf.onKeyPress && (keysym > 0)) {
434 Util.Debug("allKeysUp, keysym: " + keysym +
435 " (keyCode: " + fevt.keyCode +
436 ", which: " + fevt.which + ")");
437 conf.onKeyPress(keysym, 0, fevt);
438 }
439 }
440 Util.Debug("<< Keyboard.allKeysUp");
441 return;
442}
443
c96f9003
JM
444//
445// Public API interface functions
446//
d3796c14
JM
447
448that.grab = function() {
449 //Util.Debug(">> Keyboard.grab");
450 var c = conf.target;
451
452 Util.addEvent(c, 'keydown', onKeyDown);
453 Util.addEvent(c, 'keyup', onKeyUp);
454 Util.addEvent(c, 'keypress', onKeyPress);
455
6671c762
JM
456 // Release (key up) if window loses focus
457 Util.addEvent(window, 'blur', allKeysUp);
458
d3796c14
JM
459 //Util.Debug("<< Keyboard.grab");
460};
461
462that.ungrab = function() {
463 //Util.Debug(">> Keyboard.ungrab");
464 var c = conf.target;
465
466 Util.removeEvent(c, 'keydown', onKeyDown);
467 Util.removeEvent(c, 'keyup', onKeyUp);
468 Util.removeEvent(c, 'keypress', onKeyPress);
6671c762
JM
469 Util.removeEvent(window, 'blur', allKeysUp);
470
471 // Release (key up) all keys that are in a down state
472 allKeysUp();
d3796c14
JM
473
474 //Util.Debug(">> Keyboard.ungrab");
475};
476
477return that; // Return the public API interface
478
479} // End of Keyboard()
480
481
482//
483// Mouse event handler
484//
485
5210330a 486function Mouse(defaults) {
d890e864 487"use strict";
d3796c14 488
5210330a 489var that = {}, // Public API methods
b1b342a9 490 conf = {}, // Configuration attributes
491 mouseCaptured = false;
d3796c14 492
b2f1961a 493var doubleClickTimer = null,
a4ec2f5c 494 lastTouchPos = null;
b2f1961a 495
5210330a
JM
496// Configuration attributes
497Util.conf_defaults(conf, that, defaults, [
498 ['target', 'ro', 'dom', document, 'DOM element that captures mouse input'],
499 ['focused', 'rw', 'bool', true, 'Capture and send mouse clicks/movement'],
500 ['scale', 'rw', 'float', 1.0, 'Viewport scale factor 0.0 - 1.0'],
d3796c14 501
5210330a 502 ['onMouseButton', 'rw', 'func', null, 'Handler for mouse button click/release'],
ad3f7624
JM
503 ['onMouseMove', 'rw', 'func', null, 'Handler for mouse movement'],
504 ['touchButton', 'rw', 'int', 1, 'Button mask (1, 2, 4) for touch devices (0 means ignore clicks)']
5210330a 505 ]);
d3796c14 506
b1b342a9 507function captureMouse() {
508 // capturing the mouse ensures we get the mouseup event
509 if (conf.target.setCapture) {
510 conf.target.setCapture();
511 }
512
513 // some browsers give us mouseup events regardless,
514 // so if we never captured the mouse, we can disregard the event
515 mouseCaptured = true;
516}
d3796c14 517
b1b342a9 518function releaseMouse() {
519 if (conf.target.releaseCapture) {
520 conf.target.releaseCapture();
521 }
522 mouseCaptured = false;
523}
d3796c14
JM
524//
525// Private functions
526//
527
b2f1961a
SM
528function resetDoubleClickTimer() {
529 doubleClickTimer = null;
530}
531
d3796c14
JM
532function onMouseButton(e, down) {
533 var evt, pos, bmask;
534 if (! conf.focused) {
535 return true;
536 }
537 evt = (e ? e : window.event);
538 pos = Util.getEventPosition(e, conf.target, conf.scale);
b2f1961a 539
a4ec2f5c 540 if (e.touches || e.changedTouches) {
541 // Touch device
542
543 // When two touches occur within 500 ms of each other and are
544 // closer than 50 pixels together a double click is triggered.
545 if (down == 1) {
546 if (doubleClickTimer == null) {
547 lastTouchPos = pos;
548 } else {
549 clearTimeout(doubleClickTimer);
b2f1961a 550
a4ec2f5c 551 var xs = lastTouchPos.x - pos.x;
552 var ys = lastTouchPos.y - pos.y;
553 var d = Math.sqrt((xs * xs) + (ys * ys));
b2f1961a 554
a4ec2f5c 555 // When the distance between the two touches is less than 50 pixels
556 // force the position of the latter touch to the position of the first
557 if (d < 50) {
558 pos = lastTouchPos;
559 }
b2f1961a 560 }
a4ec2f5c 561 doubleClickTimer = setTimeout(resetDoubleClickTimer, 500);
b2f1961a 562 }
ad3f7624
JM
563 bmask = conf.touchButton;
564 // If bmask is set
565 } else if (evt.which) {
d3796c14
JM
566 /* everything except IE */
567 bmask = 1 << evt.button;
568 } else {
569 /* IE including 9 */
570 bmask = (evt.button & 0x1) + // Left
571 (evt.button & 0x2) * 2 + // Right
572 (evt.button & 0x4) / 2; // Middle
573 }
574 //Util.Debug("mouse " + pos.x + "," + pos.y + " down: " + down +
575 // " bmask: " + bmask + "(evt.button: " + evt.button + ")");
ad3f7624 576 if (bmask > 0 && conf.onMouseButton) {
d890e864
JM
577 Util.Debug("onMouseButton " + (down ? "down" : "up") +
578 ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask);
579 conf.onMouseButton(pos.x, pos.y, down, bmask);
d3796c14
JM
580 }
581 Util.stopEvent(e);
582 return false;
583}
584
585function onMouseDown(e) {
b1b342a9 586 captureMouse();
d3796c14
JM
587 onMouseButton(e, 1);
588}
589
590function onMouseUp(e) {
b1b342a9 591 if (!mouseCaptured) {
592 return;
593 }
594
d3796c14 595 onMouseButton(e, 0);
b1b342a9 596 releaseMouse();
d3796c14
JM
597}
598
599function onMouseWheel(e) {
600 var evt, pos, bmask, wheelData;
601 if (! conf.focused) {
602 return true;
603 }
604 evt = (e ? e : window.event);
605 pos = Util.getEventPosition(e, conf.target, conf.scale);
606 wheelData = evt.detail ? evt.detail * -1 : evt.wheelDelta / 40;
607 if (wheelData > 0) {
608 bmask = 1 << 3;
609 } else {
610 bmask = 1 << 4;
611 }
612 //Util.Debug('mouse scroll by ' + wheelData + ':' + pos.x + "," + pos.y);
d890e864
JM
613 if (conf.onMouseButton) {
614 conf.onMouseButton(pos.x, pos.y, 1, bmask);
615 conf.onMouseButton(pos.x, pos.y, 0, bmask);
d3796c14
JM
616 }
617 Util.stopEvent(e);
618 return false;
619}
620
621function onMouseMove(e) {
622 var evt, pos;
623 if (! conf.focused) {
624 return true;
625 }
626 evt = (e ? e : window.event);
627 pos = Util.getEventPosition(e, conf.target, conf.scale);
628 //Util.Debug('mouse ' + evt.which + '/' + evt.button + ' up:' + pos.x + "," + pos.y);
d890e864
JM
629 if (conf.onMouseMove) {
630 conf.onMouseMove(pos.x, pos.y);
d3796c14 631 }
ad3f7624
JM
632 Util.stopEvent(e);
633 return false;
d3796c14
JM
634}
635
636function onMouseDisable(e) {
637 var evt, pos;
638 if (! conf.focused) {
639 return true;
640 }
641 evt = (e ? e : window.event);
642 pos = Util.getEventPosition(e, conf.target, conf.scale);
643 /* Stop propagation if inside canvas area */
644 if ((pos.x >= 0) && (pos.y >= 0) &&
645 (pos.x < conf.target.offsetWidth) &&
646 (pos.y < conf.target.offsetHeight)) {
647 //Util.Debug("mouse event disabled");
648 Util.stopEvent(e);
649 return false;
650 }
651 //Util.Debug("mouse event not disabled");
652 return true;
653}
654
655//
656// Public API interface functions
657//
658
659that.grab = function() {
660 //Util.Debug(">> Mouse.grab");
661 var c = conf.target;
662
ad3f7624
JM
663 if ('ontouchstart' in document.documentElement) {
664 Util.addEvent(c, 'touchstart', onMouseDown);
0d0f754a 665 Util.addEvent(window, 'touchend', onMouseUp);
ad3f7624
JM
666 Util.addEvent(c, 'touchend', onMouseUp);
667 Util.addEvent(c, 'touchmove', onMouseMove);
668 } else {
669 Util.addEvent(c, 'mousedown', onMouseDown);
0d0f754a 670 Util.addEvent(window, 'mouseup', onMouseUp);
ad3f7624
JM
671 Util.addEvent(c, 'mouseup', onMouseUp);
672 Util.addEvent(c, 'mousemove', onMouseMove);
673 Util.addEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel',
674 onMouseWheel);
675 }
d3796c14
JM
676
677 /* Work around right and middle click browser behaviors */
678 Util.addEvent(document, 'click', onMouseDisable);
679 Util.addEvent(document.body, 'contextmenu', onMouseDisable);
680
681 //Util.Debug("<< Mouse.grab");
682};
683
684that.ungrab = function() {
685 //Util.Debug(">> Mouse.ungrab");
686 var c = conf.target;
687
ad3f7624
JM
688 if ('ontouchstart' in document.documentElement) {
689 Util.removeEvent(c, 'touchstart', onMouseDown);
0d0f754a 690 Util.removeEvent(window, 'touchend', onMouseUp);
ad3f7624
JM
691 Util.removeEvent(c, 'touchend', onMouseUp);
692 Util.removeEvent(c, 'touchmove', onMouseMove);
693 } else {
694 Util.removeEvent(c, 'mousedown', onMouseDown);
0d0f754a 695 Util.removeEvent(window, 'mouseup', onMouseUp);
ad3f7624
JM
696 Util.removeEvent(c, 'mouseup', onMouseUp);
697 Util.removeEvent(c, 'mousemove', onMouseMove);
698 Util.removeEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel',
699 onMouseWheel);
700 }
d3796c14
JM
701
702 /* Work around right and middle click browser behaviors */
703 Util.removeEvent(document, 'click', onMouseDisable);
704 Util.removeEvent(document.body, 'contextmenu', onMouseDisable);
705
706 //Util.Debug(">> Mouse.ungrab");
707};
708
709return that; // Return the public API interface
710
711} // End of Mouse()
712
c96f9003
JM
713
714/*
715 * Browser keypress to X11 keysym for Unicode characters > U+00FF
716 */
717unicodeTable = {
718 0x0104 : 0x01a1,
719 0x02D8 : 0x01a2,
720 0x0141 : 0x01a3,
721 0x013D : 0x01a5,
722 0x015A : 0x01a6,
723 0x0160 : 0x01a9,
724 0x015E : 0x01aa,
725 0x0164 : 0x01ab,
726 0x0179 : 0x01ac,
727 0x017D : 0x01ae,
728 0x017B : 0x01af,
729 0x0105 : 0x01b1,
730 0x02DB : 0x01b2,
731 0x0142 : 0x01b3,
732 0x013E : 0x01b5,
733 0x015B : 0x01b6,
734 0x02C7 : 0x01b7,
735 0x0161 : 0x01b9,
736 0x015F : 0x01ba,
737 0x0165 : 0x01bb,
738 0x017A : 0x01bc,
739 0x02DD : 0x01bd,
740 0x017E : 0x01be,
741 0x017C : 0x01bf,
742 0x0154 : 0x01c0,
743 0x0102 : 0x01c3,
744 0x0139 : 0x01c5,
745 0x0106 : 0x01c6,
746 0x010C : 0x01c8,
747 0x0118 : 0x01ca,
748 0x011A : 0x01cc,
749 0x010E : 0x01cf,
750 0x0110 : 0x01d0,
751 0x0143 : 0x01d1,
752 0x0147 : 0x01d2,
753 0x0150 : 0x01d5,
754 0x0158 : 0x01d8,
755 0x016E : 0x01d9,
756 0x0170 : 0x01db,
757 0x0162 : 0x01de,
758 0x0155 : 0x01e0,
759 0x0103 : 0x01e3,
760 0x013A : 0x01e5,
761 0x0107 : 0x01e6,
762 0x010D : 0x01e8,
763 0x0119 : 0x01ea,
764 0x011B : 0x01ec,
765 0x010F : 0x01ef,
766 0x0111 : 0x01f0,
767 0x0144 : 0x01f1,
768 0x0148 : 0x01f2,
769 0x0151 : 0x01f5,
770 0x0171 : 0x01fb,
771 0x0159 : 0x01f8,
772 0x016F : 0x01f9,
773 0x0163 : 0x01fe,
774 0x02D9 : 0x01ff,
775 0x0126 : 0x02a1,
776 0x0124 : 0x02a6,
777 0x0130 : 0x02a9,
778 0x011E : 0x02ab,
779 0x0134 : 0x02ac,
780 0x0127 : 0x02b1,
781 0x0125 : 0x02b6,
782 0x0131 : 0x02b9,
783 0x011F : 0x02bb,
784 0x0135 : 0x02bc,
785 0x010A : 0x02c5,
786 0x0108 : 0x02c6,
787 0x0120 : 0x02d5,
788 0x011C : 0x02d8,
789 0x016C : 0x02dd,
790 0x015C : 0x02de,
791 0x010B : 0x02e5,
792 0x0109 : 0x02e6,
793 0x0121 : 0x02f5,
794 0x011D : 0x02f8,
795 0x016D : 0x02fd,
796 0x015D : 0x02fe,
797 0x0138 : 0x03a2,
798 0x0156 : 0x03a3,
799 0x0128 : 0x03a5,
800 0x013B : 0x03a6,
801 0x0112 : 0x03aa,
802 0x0122 : 0x03ab,
803 0x0166 : 0x03ac,
804 0x0157 : 0x03b3,
805 0x0129 : 0x03b5,
806 0x013C : 0x03b6,
807 0x0113 : 0x03ba,
808 0x0123 : 0x03bb,
809 0x0167 : 0x03bc,
810 0x014A : 0x03bd,
811 0x014B : 0x03bf,
812 0x0100 : 0x03c0,
813 0x012E : 0x03c7,
814 0x0116 : 0x03cc,
815 0x012A : 0x03cf,
816 0x0145 : 0x03d1,
817 0x014C : 0x03d2,
818 0x0136 : 0x03d3,
819 0x0172 : 0x03d9,
820 0x0168 : 0x03dd,
821 0x016A : 0x03de,
822 0x0101 : 0x03e0,
823 0x012F : 0x03e7,
824 0x0117 : 0x03ec,
825 0x012B : 0x03ef,
826 0x0146 : 0x03f1,
827 0x014D : 0x03f2,
828 0x0137 : 0x03f3,
829 0x0173 : 0x03f9,
830 0x0169 : 0x03fd,
831 0x016B : 0x03fe,
832 0x1E02 : 0x1001e02,
833 0x1E03 : 0x1001e03,
834 0x1E0A : 0x1001e0a,
835 0x1E80 : 0x1001e80,
836 0x1E82 : 0x1001e82,
837 0x1E0B : 0x1001e0b,
838 0x1EF2 : 0x1001ef2,
839 0x1E1E : 0x1001e1e,
840 0x1E1F : 0x1001e1f,
841 0x1E40 : 0x1001e40,
842 0x1E41 : 0x1001e41,
843 0x1E56 : 0x1001e56,
844 0x1E81 : 0x1001e81,
845 0x1E57 : 0x1001e57,
846 0x1E83 : 0x1001e83,
847 0x1E60 : 0x1001e60,
848 0x1EF3 : 0x1001ef3,
849 0x1E84 : 0x1001e84,
850 0x1E85 : 0x1001e85,
851 0x1E61 : 0x1001e61,
852 0x0174 : 0x1000174,
853 0x1E6A : 0x1001e6a,
854 0x0176 : 0x1000176,
855 0x0175 : 0x1000175,
856 0x1E6B : 0x1001e6b,
857 0x0177 : 0x1000177,
858 0x0152 : 0x13bc,
859 0x0153 : 0x13bd,
860 0x0178 : 0x13be,
861 0x203E : 0x047e,
862 0x3002 : 0x04a1,
863 0x300C : 0x04a2,
864 0x300D : 0x04a3,
865 0x3001 : 0x04a4,
866 0x30FB : 0x04a5,
867 0x30F2 : 0x04a6,
868 0x30A1 : 0x04a7,
869 0x30A3 : 0x04a8,
870 0x30A5 : 0x04a9,
871 0x30A7 : 0x04aa,
872 0x30A9 : 0x04ab,
873 0x30E3 : 0x04ac,
874 0x30E5 : 0x04ad,
875 0x30E7 : 0x04ae,
876 0x30C3 : 0x04af,
877 0x30FC : 0x04b0,
878 0x30A2 : 0x04b1,
879 0x30A4 : 0x04b2,
880 0x30A6 : 0x04b3,
881 0x30A8 : 0x04b4,
882 0x30AA : 0x04b5,
883 0x30AB : 0x04b6,
884 0x30AD : 0x04b7,
885 0x30AF : 0x04b8,
886 0x30B1 : 0x04b9,
887 0x30B3 : 0x04ba,
888 0x30B5 : 0x04bb,
889 0x30B7 : 0x04bc,
890 0x30B9 : 0x04bd,
891 0x30BB : 0x04be,
892 0x30BD : 0x04bf,
893 0x30BF : 0x04c0,
894 0x30C1 : 0x04c1,
895 0x30C4 : 0x04c2,
896 0x30C6 : 0x04c3,
897 0x30C8 : 0x04c4,
898 0x30CA : 0x04c5,
899 0x30CB : 0x04c6,
900 0x30CC : 0x04c7,
901 0x30CD : 0x04c8,
902 0x30CE : 0x04c9,
903 0x30CF : 0x04ca,
904 0x30D2 : 0x04cb,
905 0x30D5 : 0x04cc,
906 0x30D8 : 0x04cd,
907 0x30DB : 0x04ce,
908 0x30DE : 0x04cf,
909 0x30DF : 0x04d0,
910 0x30E0 : 0x04d1,
911 0x30E1 : 0x04d2,
912 0x30E2 : 0x04d3,
913 0x30E4 : 0x04d4,
914 0x30E6 : 0x04d5,
915 0x30E8 : 0x04d6,
916 0x30E9 : 0x04d7,
917 0x30EA : 0x04d8,
918 0x30EB : 0x04d9,
919 0x30EC : 0x04da,
920 0x30ED : 0x04db,
921 0x30EF : 0x04dc,
922 0x30F3 : 0x04dd,
923 0x309B : 0x04de,
924 0x309C : 0x04df,
925 0x06F0 : 0x10006f0,
926 0x06F1 : 0x10006f1,
927 0x06F2 : 0x10006f2,
928 0x06F3 : 0x10006f3,
929 0x06F4 : 0x10006f4,
930 0x06F5 : 0x10006f5,
931 0x06F6 : 0x10006f6,
932 0x06F7 : 0x10006f7,
933 0x06F8 : 0x10006f8,
934 0x06F9 : 0x10006f9,
935 0x066A : 0x100066a,
936 0x0670 : 0x1000670,
937 0x0679 : 0x1000679,
938 0x067E : 0x100067e,
939 0x0686 : 0x1000686,
940 0x0688 : 0x1000688,
941 0x0691 : 0x1000691,
942 0x060C : 0x05ac,
943 0x06D4 : 0x10006d4,
944 0x0660 : 0x1000660,
945 0x0661 : 0x1000661,
946 0x0662 : 0x1000662,
947 0x0663 : 0x1000663,
948 0x0664 : 0x1000664,
949 0x0665 : 0x1000665,
950 0x0666 : 0x1000666,
951 0x0667 : 0x1000667,
952 0x0668 : 0x1000668,
953 0x0669 : 0x1000669,
954 0x061B : 0x05bb,
955 0x061F : 0x05bf,
956 0x0621 : 0x05c1,
957 0x0622 : 0x05c2,
958 0x0623 : 0x05c3,
959 0x0624 : 0x05c4,
960 0x0625 : 0x05c5,
961 0x0626 : 0x05c6,
962 0x0627 : 0x05c7,
963 0x0628 : 0x05c8,
964 0x0629 : 0x05c9,
965 0x062A : 0x05ca,
966 0x062B : 0x05cb,
967 0x062C : 0x05cc,
968 0x062D : 0x05cd,
969 0x062E : 0x05ce,
970 0x062F : 0x05cf,
971 0x0630 : 0x05d0,
972 0x0631 : 0x05d1,
973 0x0632 : 0x05d2,
974 0x0633 : 0x05d3,
975 0x0634 : 0x05d4,
976 0x0635 : 0x05d5,
977 0x0636 : 0x05d6,
978 0x0637 : 0x05d7,
979 0x0638 : 0x05d8,
980 0x0639 : 0x05d9,
981 0x063A : 0x05da,
982 0x0640 : 0x05e0,
983 0x0641 : 0x05e1,
984 0x0642 : 0x05e2,
985 0x0643 : 0x05e3,
986 0x0644 : 0x05e4,
987 0x0645 : 0x05e5,
988 0x0646 : 0x05e6,
989 0x0647 : 0x05e7,
990 0x0648 : 0x05e8,
991 0x0649 : 0x05e9,
992 0x064A : 0x05ea,
993 0x064B : 0x05eb,
994 0x064C : 0x05ec,
995 0x064D : 0x05ed,
996 0x064E : 0x05ee,
997 0x064F : 0x05ef,
998 0x0650 : 0x05f0,
999 0x0651 : 0x05f1,
1000 0x0652 : 0x05f2,
1001 0x0653 : 0x1000653,
1002 0x0654 : 0x1000654,
1003 0x0655 : 0x1000655,
1004 0x0698 : 0x1000698,
1005 0x06A4 : 0x10006a4,
1006 0x06A9 : 0x10006a9,
1007 0x06AF : 0x10006af,
1008 0x06BA : 0x10006ba,
1009 0x06BE : 0x10006be,
1010 0x06CC : 0x10006cc,
1011 0x06D2 : 0x10006d2,
1012 0x06C1 : 0x10006c1,
1013 0x0492 : 0x1000492,
1014 0x0493 : 0x1000493,
1015 0x0496 : 0x1000496,
1016 0x0497 : 0x1000497,
1017 0x049A : 0x100049a,
1018 0x049B : 0x100049b,
1019 0x049C : 0x100049c,
1020 0x049D : 0x100049d,
1021 0x04A2 : 0x10004a2,
1022 0x04A3 : 0x10004a3,
1023 0x04AE : 0x10004ae,
1024 0x04AF : 0x10004af,
1025 0x04B0 : 0x10004b0,
1026 0x04B1 : 0x10004b1,
1027 0x04B2 : 0x10004b2,
1028 0x04B3 : 0x10004b3,
1029 0x04B6 : 0x10004b6,
1030 0x04B7 : 0x10004b7,
1031 0x04B8 : 0x10004b8,
1032 0x04B9 : 0x10004b9,
1033 0x04BA : 0x10004ba,
1034 0x04BB : 0x10004bb,
1035 0x04D8 : 0x10004d8,
1036 0x04D9 : 0x10004d9,
1037 0x04E2 : 0x10004e2,
1038 0x04E3 : 0x10004e3,
1039 0x04E8 : 0x10004e8,
1040 0x04E9 : 0x10004e9,
1041 0x04EE : 0x10004ee,
1042 0x04EF : 0x10004ef,
1043 0x0452 : 0x06a1,
1044 0x0453 : 0x06a2,
1045 0x0451 : 0x06a3,
1046 0x0454 : 0x06a4,
1047 0x0455 : 0x06a5,
1048 0x0456 : 0x06a6,
1049 0x0457 : 0x06a7,
1050 0x0458 : 0x06a8,
1051 0x0459 : 0x06a9,
1052 0x045A : 0x06aa,
1053 0x045B : 0x06ab,
1054 0x045C : 0x06ac,
1055 0x0491 : 0x06ad,
1056 0x045E : 0x06ae,
1057 0x045F : 0x06af,
1058 0x2116 : 0x06b0,
1059 0x0402 : 0x06b1,
1060 0x0403 : 0x06b2,
1061 0x0401 : 0x06b3,
1062 0x0404 : 0x06b4,
1063 0x0405 : 0x06b5,
1064 0x0406 : 0x06b6,
1065 0x0407 : 0x06b7,
1066 0x0408 : 0x06b8,
1067 0x0409 : 0x06b9,
1068 0x040A : 0x06ba,
1069 0x040B : 0x06bb,
1070 0x040C : 0x06bc,
1071 0x0490 : 0x06bd,
1072 0x040E : 0x06be,
1073 0x040F : 0x06bf,
1074 0x044E : 0x06c0,
1075 0x0430 : 0x06c1,
1076 0x0431 : 0x06c2,
1077 0x0446 : 0x06c3,
1078 0x0434 : 0x06c4,
1079 0x0435 : 0x06c5,
1080 0x0444 : 0x06c6,
1081 0x0433 : 0x06c7,
1082 0x0445 : 0x06c8,
1083 0x0438 : 0x06c9,
1084 0x0439 : 0x06ca,
1085 0x043A : 0x06cb,
1086 0x043B : 0x06cc,
1087 0x043C : 0x06cd,
1088 0x043D : 0x06ce,
1089 0x043E : 0x06cf,
1090 0x043F : 0x06d0,
1091 0x044F : 0x06d1,
1092 0x0440 : 0x06d2,
1093 0x0441 : 0x06d3,
1094 0x0442 : 0x06d4,
1095 0x0443 : 0x06d5,
1096 0x0436 : 0x06d6,
1097 0x0432 : 0x06d7,
1098 0x044C : 0x06d8,
1099 0x044B : 0x06d9,
1100 0x0437 : 0x06da,
1101 0x0448 : 0x06db,
1102 0x044D : 0x06dc,
1103 0x0449 : 0x06dd,
1104 0x0447 : 0x06de,
1105 0x044A : 0x06df,
1106 0x042E : 0x06e0,
1107 0x0410 : 0x06e1,
1108 0x0411 : 0x06e2,
1109 0x0426 : 0x06e3,
1110 0x0414 : 0x06e4,
1111 0x0415 : 0x06e5,
1112 0x0424 : 0x06e6,
1113 0x0413 : 0x06e7,
1114 0x0425 : 0x06e8,
1115 0x0418 : 0x06e9,
1116 0x0419 : 0x06ea,
1117 0x041A : 0x06eb,
1118 0x041B : 0x06ec,
1119 0x041C : 0x06ed,
1120 0x041D : 0x06ee,
1121 0x041E : 0x06ef,
1122 0x041F : 0x06f0,
1123 0x042F : 0x06f1,
1124 0x0420 : 0x06f2,
1125 0x0421 : 0x06f3,
1126 0x0422 : 0x06f4,
1127 0x0423 : 0x06f5,
1128 0x0416 : 0x06f6,
1129 0x0412 : 0x06f7,
1130 0x042C : 0x06f8,
1131 0x042B : 0x06f9,
1132 0x0417 : 0x06fa,
1133 0x0428 : 0x06fb,
1134 0x042D : 0x06fc,
1135 0x0429 : 0x06fd,
1136 0x0427 : 0x06fe,
1137 0x042A : 0x06ff,
1138 0x0386 : 0x07a1,
1139 0x0388 : 0x07a2,
1140 0x0389 : 0x07a3,
1141 0x038A : 0x07a4,
1142 0x03AA : 0x07a5,
1143 0x038C : 0x07a7,
1144 0x038E : 0x07a8,
1145 0x03AB : 0x07a9,
1146 0x038F : 0x07ab,
1147 0x0385 : 0x07ae,
1148 0x2015 : 0x07af,
1149 0x03AC : 0x07b1,
1150 0x03AD : 0x07b2,
1151 0x03AE : 0x07b3,
1152 0x03AF : 0x07b4,
1153 0x03CA : 0x07b5,
1154 0x0390 : 0x07b6,
1155 0x03CC : 0x07b7,
1156 0x03CD : 0x07b8,
1157 0x03CB : 0x07b9,
1158 0x03B0 : 0x07ba,
1159 0x03CE : 0x07bb,
1160 0x0391 : 0x07c1,
1161 0x0392 : 0x07c2,
1162 0x0393 : 0x07c3,
1163 0x0394 : 0x07c4,
1164 0x0395 : 0x07c5,
1165 0x0396 : 0x07c6,
1166 0x0397 : 0x07c7,
1167 0x0398 : 0x07c8,
1168 0x0399 : 0x07c9,
1169 0x039A : 0x07ca,
1170 0x039B : 0x07cb,
1171 0x039C : 0x07cc,
1172 0x039D : 0x07cd,
1173 0x039E : 0x07ce,
1174 0x039F : 0x07cf,
1175 0x03A0 : 0x07d0,
1176 0x03A1 : 0x07d1,
1177 0x03A3 : 0x07d2,
1178 0x03A4 : 0x07d4,
1179 0x03A5 : 0x07d5,
1180 0x03A6 : 0x07d6,
1181 0x03A7 : 0x07d7,
1182 0x03A8 : 0x07d8,
1183 0x03A9 : 0x07d9,
1184 0x03B1 : 0x07e1,
1185 0x03B2 : 0x07e2,
1186 0x03B3 : 0x07e3,
1187 0x03B4 : 0x07e4,
1188 0x03B5 : 0x07e5,
1189 0x03B6 : 0x07e6,
1190 0x03B7 : 0x07e7,
1191 0x03B8 : 0x07e8,
1192 0x03B9 : 0x07e9,
1193 0x03BA : 0x07ea,
1194 0x03BB : 0x07eb,
1195 0x03BC : 0x07ec,
1196 0x03BD : 0x07ed,
1197 0x03BE : 0x07ee,
1198 0x03BF : 0x07ef,
1199 0x03C0 : 0x07f0,
1200 0x03C1 : 0x07f1,
1201 0x03C3 : 0x07f2,
1202 0x03C2 : 0x07f3,
1203 0x03C4 : 0x07f4,
1204 0x03C5 : 0x07f5,
1205 0x03C6 : 0x07f6,
1206 0x03C7 : 0x07f7,
1207 0x03C8 : 0x07f8,
1208 0x03C9 : 0x07f9,
1209 0x23B7 : 0x08a1,
1210 0x2320 : 0x08a4,
1211 0x2321 : 0x08a5,
1212 0x23A1 : 0x08a7,
1213 0x23A3 : 0x08a8,
1214 0x23A4 : 0x08a9,
1215 0x23A6 : 0x08aa,
1216 0x239B : 0x08ab,
1217 0x239D : 0x08ac,
1218 0x239E : 0x08ad,
1219 0x23A0 : 0x08ae,
1220 0x23A8 : 0x08af,
1221 0x23AC : 0x08b0,
1222 0x2264 : 0x08bc,
1223 0x2260 : 0x08bd,
1224 0x2265 : 0x08be,
1225 0x222B : 0x08bf,
1226 0x2234 : 0x08c0,
1227 0x221D : 0x08c1,
1228 0x221E : 0x08c2,
1229 0x2207 : 0x08c5,
1230 0x223C : 0x08c8,
1231 0x2243 : 0x08c9,
1232 0x21D4 : 0x08cd,
1233 0x21D2 : 0x08ce,
1234 0x2261 : 0x08cf,
483157f8 1235 //0x221A : 0x08d6,
c96f9003
JM
1236 0x2282 : 0x08da,
1237 0x2283 : 0x08db,
1238 0x2229 : 0x08dc,
1239 0x222A : 0x08dd,
1240 0x2227 : 0x08de,
1241 0x2228 : 0x08df,
483157f8 1242 //0x2202 : 0x08ef,
c96f9003
JM
1243 0x0192 : 0x08f6,
1244 0x2190 : 0x08fb,
1245 0x2191 : 0x08fc,
1246 0x2192 : 0x08fd,
1247 0x2193 : 0x08fe,
1248 0x25C6 : 0x09e0,
1249 0x2592 : 0x09e1,
1250 0x2409 : 0x09e2,
1251 0x240C : 0x09e3,
1252 0x240D : 0x09e4,
1253 0x240A : 0x09e5,
1254 0x2424 : 0x09e8,
1255 0x240B : 0x09e9,
1256 0x2518 : 0x09ea,
1257 0x2510 : 0x09eb,
1258 0x250C : 0x09ec,
1259 0x2514 : 0x09ed,
1260 0x253C : 0x09ee,
1261 0x23BA : 0x09ef,
1262 0x23BB : 0x09f0,
1263 0x2500 : 0x09f1,
1264 0x23BC : 0x09f2,
1265 0x23BD : 0x09f3,
1266 0x251C : 0x09f4,
1267 0x2524 : 0x09f5,
1268 0x2534 : 0x09f6,
1269 0x252C : 0x09f7,
1270 0x2502 : 0x09f8,
1271 0x2003 : 0x0aa1,
1272 0x2002 : 0x0aa2,
1273 0x2004 : 0x0aa3,
1274 0x2005 : 0x0aa4,
1275 0x2007 : 0x0aa5,
1276 0x2008 : 0x0aa6,
1277 0x2009 : 0x0aa7,
1278 0x200A : 0x0aa8,
1279 0x2014 : 0x0aa9,
1280 0x2013 : 0x0aaa,
1281 0x2026 : 0x0aae,
1282 0x2025 : 0x0aaf,
1283 0x2153 : 0x0ab0,
1284 0x2154 : 0x0ab1,
1285 0x2155 : 0x0ab2,
1286 0x2156 : 0x0ab3,
1287 0x2157 : 0x0ab4,
1288 0x2158 : 0x0ab5,
1289 0x2159 : 0x0ab6,
1290 0x215A : 0x0ab7,
1291 0x2105 : 0x0ab8,
1292 0x2012 : 0x0abb,
1293 0x215B : 0x0ac3,
1294 0x215C : 0x0ac4,
1295 0x215D : 0x0ac5,
1296 0x215E : 0x0ac6,
1297 0x2122 : 0x0ac9,
1298 0x2018 : 0x0ad0,
1299 0x2019 : 0x0ad1,
1300 0x201C : 0x0ad2,
1301 0x201D : 0x0ad3,
1302 0x211E : 0x0ad4,
1303 0x2032 : 0x0ad6,
1304 0x2033 : 0x0ad7,
1305 0x271D : 0x0ad9,
1306 0x2663 : 0x0aec,
1307 0x2666 : 0x0aed,
1308 0x2665 : 0x0aee,
1309 0x2720 : 0x0af0,
1310 0x2020 : 0x0af1,
1311 0x2021 : 0x0af2,
1312 0x2713 : 0x0af3,
1313 0x2717 : 0x0af4,
1314 0x266F : 0x0af5,
1315 0x266D : 0x0af6,
1316 0x2642 : 0x0af7,
1317 0x2640 : 0x0af8,
1318 0x260E : 0x0af9,
1319 0x2315 : 0x0afa,
1320 0x2117 : 0x0afb,
1321 0x2038 : 0x0afc,
1322 0x201A : 0x0afd,
1323 0x201E : 0x0afe,
1324 0x22A4 : 0x0bc2,
1325 0x230A : 0x0bc4,
1326 0x2218 : 0x0bca,
1327 0x2395 : 0x0bcc,
1328 0x22A5 : 0x0bce,
1329 0x25CB : 0x0bcf,
1330 0x2308 : 0x0bd3,
1331 0x22A3 : 0x0bdc,
1332 0x22A2 : 0x0bfc,
1333 0x2017 : 0x0cdf,
1334 0x05D0 : 0x0ce0,
1335 0x05D1 : 0x0ce1,
1336 0x05D2 : 0x0ce2,
1337 0x05D3 : 0x0ce3,
1338 0x05D4 : 0x0ce4,
1339 0x05D5 : 0x0ce5,
1340 0x05D6 : 0x0ce6,
1341 0x05D7 : 0x0ce7,
1342 0x05D8 : 0x0ce8,
1343 0x05D9 : 0x0ce9,
1344 0x05DA : 0x0cea,
1345 0x05DB : 0x0ceb,
1346 0x05DC : 0x0cec,
1347 0x05DD : 0x0ced,
1348 0x05DE : 0x0cee,
1349 0x05DF : 0x0cef,
1350 0x05E0 : 0x0cf0,
1351 0x05E1 : 0x0cf1,
1352 0x05E2 : 0x0cf2,
1353 0x05E3 : 0x0cf3,
1354 0x05E4 : 0x0cf4,
1355 0x05E5 : 0x0cf5,
1356 0x05E6 : 0x0cf6,
1357 0x05E7 : 0x0cf7,
1358 0x05E8 : 0x0cf8,
1359 0x05E9 : 0x0cf9,
1360 0x05EA : 0x0cfa,
1361 0x0E01 : 0x0da1,
1362 0x0E02 : 0x0da2,
1363 0x0E03 : 0x0da3,
1364 0x0E04 : 0x0da4,
1365 0x0E05 : 0x0da5,
1366 0x0E06 : 0x0da6,
1367 0x0E07 : 0x0da7,
1368 0x0E08 : 0x0da8,
1369 0x0E09 : 0x0da9,
1370 0x0E0A : 0x0daa,
1371 0x0E0B : 0x0dab,
1372 0x0E0C : 0x0dac,
1373 0x0E0D : 0x0dad,
1374 0x0E0E : 0x0dae,
1375 0x0E0F : 0x0daf,
1376 0x0E10 : 0x0db0,
1377 0x0E11 : 0x0db1,
1378 0x0E12 : 0x0db2,
1379 0x0E13 : 0x0db3,
1380 0x0E14 : 0x0db4,
1381 0x0E15 : 0x0db5,
1382 0x0E16 : 0x0db6,
1383 0x0E17 : 0x0db7,
1384 0x0E18 : 0x0db8,
1385 0x0E19 : 0x0db9,
1386 0x0E1A : 0x0dba,
1387 0x0E1B : 0x0dbb,
1388 0x0E1C : 0x0dbc,
1389 0x0E1D : 0x0dbd,
1390 0x0E1E : 0x0dbe,
1391 0x0E1F : 0x0dbf,
1392 0x0E20 : 0x0dc0,
1393 0x0E21 : 0x0dc1,
1394 0x0E22 : 0x0dc2,
1395 0x0E23 : 0x0dc3,
1396 0x0E24 : 0x0dc4,
1397 0x0E25 : 0x0dc5,
1398 0x0E26 : 0x0dc6,
1399 0x0E27 : 0x0dc7,
1400 0x0E28 : 0x0dc8,
1401 0x0E29 : 0x0dc9,
1402 0x0E2A : 0x0dca,
1403 0x0E2B : 0x0dcb,
1404 0x0E2C : 0x0dcc,
1405 0x0E2D : 0x0dcd,
1406 0x0E2E : 0x0dce,
1407 0x0E2F : 0x0dcf,
1408 0x0E30 : 0x0dd0,
1409 0x0E31 : 0x0dd1,
1410 0x0E32 : 0x0dd2,
1411 0x0E33 : 0x0dd3,
1412 0x0E34 : 0x0dd4,
1413 0x0E35 : 0x0dd5,
1414 0x0E36 : 0x0dd6,
1415 0x0E37 : 0x0dd7,
1416 0x0E38 : 0x0dd8,
1417 0x0E39 : 0x0dd9,
1418 0x0E3A : 0x0dda,
1419 0x0E3F : 0x0ddf,
1420 0x0E40 : 0x0de0,
1421 0x0E41 : 0x0de1,
1422 0x0E42 : 0x0de2,
1423 0x0E43 : 0x0de3,
1424 0x0E44 : 0x0de4,
1425 0x0E45 : 0x0de5,
1426 0x0E46 : 0x0de6,
1427 0x0E47 : 0x0de7,
1428 0x0E48 : 0x0de8,
1429 0x0E49 : 0x0de9,
1430 0x0E4A : 0x0dea,
1431 0x0E4B : 0x0deb,
1432 0x0E4C : 0x0dec,
1433 0x0E4D : 0x0ded,
1434 0x0E50 : 0x0df0,
1435 0x0E51 : 0x0df1,
1436 0x0E52 : 0x0df2,
1437 0x0E53 : 0x0df3,
1438 0x0E54 : 0x0df4,
1439 0x0E55 : 0x0df5,
1440 0x0E56 : 0x0df6,
1441 0x0E57 : 0x0df7,
1442 0x0E58 : 0x0df8,
1443 0x0E59 : 0x0df9,
1444 0x0587 : 0x1000587,
1445 0x0589 : 0x1000589,
1446 0x055D : 0x100055d,
1447 0x058A : 0x100058a,
1448 0x055C : 0x100055c,
1449 0x055B : 0x100055b,
1450 0x055E : 0x100055e,
1451 0x0531 : 0x1000531,
1452 0x0561 : 0x1000561,
1453 0x0532 : 0x1000532,
1454 0x0562 : 0x1000562,
1455 0x0533 : 0x1000533,
1456 0x0563 : 0x1000563,
1457 0x0534 : 0x1000534,
1458 0x0564 : 0x1000564,
1459 0x0535 : 0x1000535,
1460 0x0565 : 0x1000565,
1461 0x0536 : 0x1000536,
1462 0x0566 : 0x1000566,
1463 0x0537 : 0x1000537,
1464 0x0567 : 0x1000567,
1465 0x0538 : 0x1000538,
1466 0x0568 : 0x1000568,
1467 0x0539 : 0x1000539,
1468 0x0569 : 0x1000569,
1469 0x053A : 0x100053a,
1470 0x056A : 0x100056a,
1471 0x053B : 0x100053b,
1472 0x056B : 0x100056b,
1473 0x053C : 0x100053c,
1474 0x056C : 0x100056c,
1475 0x053D : 0x100053d,
1476 0x056D : 0x100056d,
1477 0x053E : 0x100053e,
1478 0x056E : 0x100056e,
1479 0x053F : 0x100053f,
1480 0x056F : 0x100056f,
1481 0x0540 : 0x1000540,
1482 0x0570 : 0x1000570,
1483 0x0541 : 0x1000541,
1484 0x0571 : 0x1000571,
1485 0x0542 : 0x1000542,
1486 0x0572 : 0x1000572,
1487 0x0543 : 0x1000543,
1488 0x0573 : 0x1000573,
1489 0x0544 : 0x1000544,
1490 0x0574 : 0x1000574,
1491 0x0545 : 0x1000545,
1492 0x0575 : 0x1000575,
1493 0x0546 : 0x1000546,
1494 0x0576 : 0x1000576,
1495 0x0547 : 0x1000547,
1496 0x0577 : 0x1000577,
1497 0x0548 : 0x1000548,
1498 0x0578 : 0x1000578,
1499 0x0549 : 0x1000549,
1500 0x0579 : 0x1000579,
1501 0x054A : 0x100054a,
1502 0x057A : 0x100057a,
1503 0x054B : 0x100054b,
1504 0x057B : 0x100057b,
1505 0x054C : 0x100054c,
1506 0x057C : 0x100057c,
1507 0x054D : 0x100054d,
1508 0x057D : 0x100057d,
1509 0x054E : 0x100054e,
1510 0x057E : 0x100057e,
1511 0x054F : 0x100054f,
1512 0x057F : 0x100057f,
1513 0x0550 : 0x1000550,
1514 0x0580 : 0x1000580,
1515 0x0551 : 0x1000551,
1516 0x0581 : 0x1000581,
1517 0x0552 : 0x1000552,
1518 0x0582 : 0x1000582,
1519 0x0553 : 0x1000553,
1520 0x0583 : 0x1000583,
1521 0x0554 : 0x1000554,
1522 0x0584 : 0x1000584,
1523 0x0555 : 0x1000555,
1524 0x0585 : 0x1000585,
1525 0x0556 : 0x1000556,
1526 0x0586 : 0x1000586,
1527 0x055A : 0x100055a,
1528 0x10D0 : 0x10010d0,
1529 0x10D1 : 0x10010d1,
1530 0x10D2 : 0x10010d2,
1531 0x10D3 : 0x10010d3,
1532 0x10D4 : 0x10010d4,
1533 0x10D5 : 0x10010d5,
1534 0x10D6 : 0x10010d6,
1535 0x10D7 : 0x10010d7,
1536 0x10D8 : 0x10010d8,
1537 0x10D9 : 0x10010d9,
1538 0x10DA : 0x10010da,
1539 0x10DB : 0x10010db,
1540 0x10DC : 0x10010dc,
1541 0x10DD : 0x10010dd,
1542 0x10DE : 0x10010de,
1543 0x10DF : 0x10010df,
1544 0x10E0 : 0x10010e0,
1545 0x10E1 : 0x10010e1,
1546 0x10E2 : 0x10010e2,
1547 0x10E3 : 0x10010e3,
1548 0x10E4 : 0x10010e4,
1549 0x10E5 : 0x10010e5,
1550 0x10E6 : 0x10010e6,
1551 0x10E7 : 0x10010e7,
1552 0x10E8 : 0x10010e8,
1553 0x10E9 : 0x10010e9,
1554 0x10EA : 0x10010ea,
1555 0x10EB : 0x10010eb,
1556 0x10EC : 0x10010ec,
1557 0x10ED : 0x10010ed,
1558 0x10EE : 0x10010ee,
1559 0x10EF : 0x10010ef,
1560 0x10F0 : 0x10010f0,
1561 0x10F1 : 0x10010f1,
1562 0x10F2 : 0x10010f2,
1563 0x10F3 : 0x10010f3,
1564 0x10F4 : 0x10010f4,
1565 0x10F5 : 0x10010f5,
1566 0x10F6 : 0x10010f6,
1567 0x1E8A : 0x1001e8a,
1568 0x012C : 0x100012c,
1569 0x01B5 : 0x10001b5,
1570 0x01E6 : 0x10001e6,
1571 0x01D2 : 0x10001d1,
1572 0x019F : 0x100019f,
1573 0x1E8B : 0x1001e8b,
1574 0x012D : 0x100012d,
1575 0x01B6 : 0x10001b6,
1576 0x01E7 : 0x10001e7,
483157f8 1577 //0x01D2 : 0x10001d2,
c96f9003
JM
1578 0x0275 : 0x1000275,
1579 0x018F : 0x100018f,
1580 0x0259 : 0x1000259,
1581 0x1E36 : 0x1001e36,
1582 0x1E37 : 0x1001e37,
1583 0x1EA0 : 0x1001ea0,
1584 0x1EA1 : 0x1001ea1,
1585 0x1EA2 : 0x1001ea2,
1586 0x1EA3 : 0x1001ea3,
1587 0x1EA4 : 0x1001ea4,
1588 0x1EA5 : 0x1001ea5,
1589 0x1EA6 : 0x1001ea6,
1590 0x1EA7 : 0x1001ea7,
1591 0x1EA8 : 0x1001ea8,
1592 0x1EA9 : 0x1001ea9,
1593 0x1EAA : 0x1001eaa,
1594 0x1EAB : 0x1001eab,
1595 0x1EAC : 0x1001eac,
1596 0x1EAD : 0x1001ead,
1597 0x1EAE : 0x1001eae,
1598 0x1EAF : 0x1001eaf,
1599 0x1EB0 : 0x1001eb0,
1600 0x1EB1 : 0x1001eb1,
1601 0x1EB2 : 0x1001eb2,
1602 0x1EB3 : 0x1001eb3,
1603 0x1EB4 : 0x1001eb4,
1604 0x1EB5 : 0x1001eb5,
1605 0x1EB6 : 0x1001eb6,
1606 0x1EB7 : 0x1001eb7,
1607 0x1EB8 : 0x1001eb8,
1608 0x1EB9 : 0x1001eb9,
1609 0x1EBA : 0x1001eba,
1610 0x1EBB : 0x1001ebb,
1611 0x1EBC : 0x1001ebc,
1612 0x1EBD : 0x1001ebd,
1613 0x1EBE : 0x1001ebe,
1614 0x1EBF : 0x1001ebf,
1615 0x1EC0 : 0x1001ec0,
1616 0x1EC1 : 0x1001ec1,
1617 0x1EC2 : 0x1001ec2,
1618 0x1EC3 : 0x1001ec3,
1619 0x1EC4 : 0x1001ec4,
1620 0x1EC5 : 0x1001ec5,
1621 0x1EC6 : 0x1001ec6,
1622 0x1EC7 : 0x1001ec7,
1623 0x1EC8 : 0x1001ec8,
1624 0x1EC9 : 0x1001ec9,
1625 0x1ECA : 0x1001eca,
1626 0x1ECB : 0x1001ecb,
1627 0x1ECC : 0x1001ecc,
1628 0x1ECD : 0x1001ecd,
1629 0x1ECE : 0x1001ece,
1630 0x1ECF : 0x1001ecf,
1631 0x1ED0 : 0x1001ed0,
1632 0x1ED1 : 0x1001ed1,
1633 0x1ED2 : 0x1001ed2,
1634 0x1ED3 : 0x1001ed3,
1635 0x1ED4 : 0x1001ed4,
1636 0x1ED5 : 0x1001ed5,
1637 0x1ED6 : 0x1001ed6,
1638 0x1ED7 : 0x1001ed7,
1639 0x1ED8 : 0x1001ed8,
1640 0x1ED9 : 0x1001ed9,
1641 0x1EDA : 0x1001eda,
1642 0x1EDB : 0x1001edb,
1643 0x1EDC : 0x1001edc,
1644 0x1EDD : 0x1001edd,
1645 0x1EDE : 0x1001ede,
1646 0x1EDF : 0x1001edf,
1647 0x1EE0 : 0x1001ee0,
1648 0x1EE1 : 0x1001ee1,
1649 0x1EE2 : 0x1001ee2,
1650 0x1EE3 : 0x1001ee3,
1651 0x1EE4 : 0x1001ee4,
1652 0x1EE5 : 0x1001ee5,
1653 0x1EE6 : 0x1001ee6,
1654 0x1EE7 : 0x1001ee7,
1655 0x1EE8 : 0x1001ee8,
1656 0x1EE9 : 0x1001ee9,
1657 0x1EEA : 0x1001eea,
1658 0x1EEB : 0x1001eeb,
1659 0x1EEC : 0x1001eec,
1660 0x1EED : 0x1001eed,
1661 0x1EEE : 0x1001eee,
1662 0x1EEF : 0x1001eef,
1663 0x1EF0 : 0x1001ef0,
1664 0x1EF1 : 0x1001ef1,
1665 0x1EF4 : 0x1001ef4,
1666 0x1EF5 : 0x1001ef5,
1667 0x1EF6 : 0x1001ef6,
1668 0x1EF7 : 0x1001ef7,
1669 0x1EF8 : 0x1001ef8,
1670 0x1EF9 : 0x1001ef9,
1671 0x01A0 : 0x10001a0,
1672 0x01A1 : 0x10001a1,
1673 0x01AF : 0x10001af,
1674 0x01B0 : 0x10001b0,
1675 0x20A0 : 0x10020a0,
1676 0x20A1 : 0x10020a1,
1677 0x20A2 : 0x10020a2,
1678 0x20A3 : 0x10020a3,
1679 0x20A4 : 0x10020a4,
1680 0x20A5 : 0x10020a5,
1681 0x20A6 : 0x10020a6,
1682 0x20A7 : 0x10020a7,
1683 0x20A8 : 0x10020a8,
1684 0x20A9 : 0x10020a9,
1685 0x20AA : 0x10020aa,
1686 0x20AB : 0x10020ab,
1687 0x20AC : 0x20ac,
1688 0x2070 : 0x1002070,
1689 0x2074 : 0x1002074,
1690 0x2075 : 0x1002075,
1691 0x2076 : 0x1002076,
1692 0x2077 : 0x1002077,
1693 0x2078 : 0x1002078,
1694 0x2079 : 0x1002079,
1695 0x2080 : 0x1002080,
1696 0x2081 : 0x1002081,
1697 0x2082 : 0x1002082,
1698 0x2083 : 0x1002083,
1699 0x2084 : 0x1002084,
1700 0x2085 : 0x1002085,
1701 0x2086 : 0x1002086,
1702 0x2087 : 0x1002087,
1703 0x2088 : 0x1002088,
1704 0x2089 : 0x1002089,
1705 0x2202 : 0x1002202,
1706 0x2205 : 0x1002205,
1707 0x2208 : 0x1002208,
1708 0x2209 : 0x1002209,
1709 0x220B : 0x100220B,
1710 0x221A : 0x100221A,
1711 0x221B : 0x100221B,
1712 0x221C : 0x100221C,
1713 0x222C : 0x100222C,
1714 0x222D : 0x100222D,
1715 0x2235 : 0x1002235,
1716 0x2245 : 0x1002248,
1717 0x2247 : 0x1002247,
1718 0x2262 : 0x1002262,
1719 0x2263 : 0x1002263,
1720 0x2800 : 0x1002800,
1721 0x2801 : 0x1002801,
1722 0x2802 : 0x1002802,
1723 0x2803 : 0x1002803,
1724 0x2804 : 0x1002804,
1725 0x2805 : 0x1002805,
1726 0x2806 : 0x1002806,
1727 0x2807 : 0x1002807,
1728 0x2808 : 0x1002808,
1729 0x2809 : 0x1002809,
1730 0x280a : 0x100280a,
1731 0x280b : 0x100280b,
1732 0x280c : 0x100280c,
1733 0x280d : 0x100280d,
1734 0x280e : 0x100280e,
1735 0x280f : 0x100280f,
1736 0x2810 : 0x1002810,
1737 0x2811 : 0x1002811,
1738 0x2812 : 0x1002812,
1739 0x2813 : 0x1002813,
1740 0x2814 : 0x1002814,
1741 0x2815 : 0x1002815,
1742 0x2816 : 0x1002816,
1743 0x2817 : 0x1002817,
1744 0x2818 : 0x1002818,
1745 0x2819 : 0x1002819,
1746 0x281a : 0x100281a,
1747 0x281b : 0x100281b,
1748 0x281c : 0x100281c,
1749 0x281d : 0x100281d,
1750 0x281e : 0x100281e,
1751 0x281f : 0x100281f,
1752 0x2820 : 0x1002820,
1753 0x2821 : 0x1002821,
1754 0x2822 : 0x1002822,
1755 0x2823 : 0x1002823,
1756 0x2824 : 0x1002824,
1757 0x2825 : 0x1002825,
1758 0x2826 : 0x1002826,
1759 0x2827 : 0x1002827,
1760 0x2828 : 0x1002828,
1761 0x2829 : 0x1002829,
1762 0x282a : 0x100282a,
1763 0x282b : 0x100282b,
1764 0x282c : 0x100282c,
1765 0x282d : 0x100282d,
1766 0x282e : 0x100282e,
1767 0x282f : 0x100282f,
1768 0x2830 : 0x1002830,
1769 0x2831 : 0x1002831,
1770 0x2832 : 0x1002832,
1771 0x2833 : 0x1002833,
1772 0x2834 : 0x1002834,
1773 0x2835 : 0x1002835,
1774 0x2836 : 0x1002836,
1775 0x2837 : 0x1002837,
1776 0x2838 : 0x1002838,
1777 0x2839 : 0x1002839,
1778 0x283a : 0x100283a,
1779 0x283b : 0x100283b,
1780 0x283c : 0x100283c,
1781 0x283d : 0x100283d,
1782 0x283e : 0x100283e,
1783 0x283f : 0x100283f,
1784 0x2840 : 0x1002840,
1785 0x2841 : 0x1002841,
1786 0x2842 : 0x1002842,
1787 0x2843 : 0x1002843,
1788 0x2844 : 0x1002844,
1789 0x2845 : 0x1002845,
1790 0x2846 : 0x1002846,
1791 0x2847 : 0x1002847,
1792 0x2848 : 0x1002848,
1793 0x2849 : 0x1002849,
1794 0x284a : 0x100284a,
1795 0x284b : 0x100284b,
1796 0x284c : 0x100284c,
1797 0x284d : 0x100284d,
1798 0x284e : 0x100284e,
1799 0x284f : 0x100284f,
1800 0x2850 : 0x1002850,
1801 0x2851 : 0x1002851,
1802 0x2852 : 0x1002852,
1803 0x2853 : 0x1002853,
1804 0x2854 : 0x1002854,
1805 0x2855 : 0x1002855,
1806 0x2856 : 0x1002856,
1807 0x2857 : 0x1002857,
1808 0x2858 : 0x1002858,
1809 0x2859 : 0x1002859,
1810 0x285a : 0x100285a,
1811 0x285b : 0x100285b,
1812 0x285c : 0x100285c,
1813 0x285d : 0x100285d,
1814 0x285e : 0x100285e,
1815 0x285f : 0x100285f,
1816 0x2860 : 0x1002860,
1817 0x2861 : 0x1002861,
1818 0x2862 : 0x1002862,
1819 0x2863 : 0x1002863,
1820 0x2864 : 0x1002864,
1821 0x2865 : 0x1002865,
1822 0x2866 : 0x1002866,
1823 0x2867 : 0x1002867,
1824 0x2868 : 0x1002868,
1825 0x2869 : 0x1002869,
1826 0x286a : 0x100286a,
1827 0x286b : 0x100286b,
1828 0x286c : 0x100286c,
1829 0x286d : 0x100286d,
1830 0x286e : 0x100286e,
1831 0x286f : 0x100286f,
1832 0x2870 : 0x1002870,
1833 0x2871 : 0x1002871,
1834 0x2872 : 0x1002872,
1835 0x2873 : 0x1002873,
1836 0x2874 : 0x1002874,
1837 0x2875 : 0x1002875,
1838 0x2876 : 0x1002876,
1839 0x2877 : 0x1002877,
1840 0x2878 : 0x1002878,
1841 0x2879 : 0x1002879,
1842 0x287a : 0x100287a,
1843 0x287b : 0x100287b,
1844 0x287c : 0x100287c,
1845 0x287d : 0x100287d,
1846 0x287e : 0x100287e,
1847 0x287f : 0x100287f,
1848 0x2880 : 0x1002880,
1849 0x2881 : 0x1002881,
1850 0x2882 : 0x1002882,
1851 0x2883 : 0x1002883,
1852 0x2884 : 0x1002884,
1853 0x2885 : 0x1002885,
1854 0x2886 : 0x1002886,
1855 0x2887 : 0x1002887,
1856 0x2888 : 0x1002888,
1857 0x2889 : 0x1002889,
1858 0x288a : 0x100288a,
1859 0x288b : 0x100288b,
1860 0x288c : 0x100288c,
1861 0x288d : 0x100288d,
1862 0x288e : 0x100288e,
1863 0x288f : 0x100288f,
1864 0x2890 : 0x1002890,
1865 0x2891 : 0x1002891,
1866 0x2892 : 0x1002892,
1867 0x2893 : 0x1002893,
1868 0x2894 : 0x1002894,
1869 0x2895 : 0x1002895,
1870 0x2896 : 0x1002896,
1871 0x2897 : 0x1002897,
1872 0x2898 : 0x1002898,
1873 0x2899 : 0x1002899,
1874 0x289a : 0x100289a,
1875 0x289b : 0x100289b,
1876 0x289c : 0x100289c,
1877 0x289d : 0x100289d,
1878 0x289e : 0x100289e,
1879 0x289f : 0x100289f,
1880 0x28a0 : 0x10028a0,
1881 0x28a1 : 0x10028a1,
1882 0x28a2 : 0x10028a2,
1883 0x28a3 : 0x10028a3,
1884 0x28a4 : 0x10028a4,
1885 0x28a5 : 0x10028a5,
1886 0x28a6 : 0x10028a6,
1887 0x28a7 : 0x10028a7,
1888 0x28a8 : 0x10028a8,
1889 0x28a9 : 0x10028a9,
1890 0x28aa : 0x10028aa,
1891 0x28ab : 0x10028ab,
1892 0x28ac : 0x10028ac,
1893 0x28ad : 0x10028ad,
1894 0x28ae : 0x10028ae,
1895 0x28af : 0x10028af,
1896 0x28b0 : 0x10028b0,
1897 0x28b1 : 0x10028b1,
1898 0x28b2 : 0x10028b2,
1899 0x28b3 : 0x10028b3,
1900 0x28b4 : 0x10028b4,
1901 0x28b5 : 0x10028b5,
1902 0x28b6 : 0x10028b6,
1903 0x28b7 : 0x10028b7,
1904 0x28b8 : 0x10028b8,
1905 0x28b9 : 0x10028b9,
1906 0x28ba : 0x10028ba,
1907 0x28bb : 0x10028bb,
1908 0x28bc : 0x10028bc,
1909 0x28bd : 0x10028bd,
1910 0x28be : 0x10028be,
1911 0x28bf : 0x10028bf,
1912 0x28c0 : 0x10028c0,
1913 0x28c1 : 0x10028c1,
1914 0x28c2 : 0x10028c2,
1915 0x28c3 : 0x10028c3,
1916 0x28c4 : 0x10028c4,
1917 0x28c5 : 0x10028c5,
1918 0x28c6 : 0x10028c6,
1919 0x28c7 : 0x10028c7,
1920 0x28c8 : 0x10028c8,
1921 0x28c9 : 0x10028c9,
1922 0x28ca : 0x10028ca,
1923 0x28cb : 0x10028cb,
1924 0x28cc : 0x10028cc,
1925 0x28cd : 0x10028cd,
1926 0x28ce : 0x10028ce,
1927 0x28cf : 0x10028cf,
1928 0x28d0 : 0x10028d0,
1929 0x28d1 : 0x10028d1,
1930 0x28d2 : 0x10028d2,
1931 0x28d3 : 0x10028d3,
1932 0x28d4 : 0x10028d4,
1933 0x28d5 : 0x10028d5,
1934 0x28d6 : 0x10028d6,
1935 0x28d7 : 0x10028d7,
1936 0x28d8 : 0x10028d8,
1937 0x28d9 : 0x10028d9,
1938 0x28da : 0x10028da,
1939 0x28db : 0x10028db,
1940 0x28dc : 0x10028dc,
1941 0x28dd : 0x10028dd,
1942 0x28de : 0x10028de,
1943 0x28df : 0x10028df,
1944 0x28e0 : 0x10028e0,
1945 0x28e1 : 0x10028e1,
1946 0x28e2 : 0x10028e2,
53fc7392 1947 0x28e3 : 0x10028e3,
c96f9003
JM
1948 0x28e4 : 0x10028e4,
1949 0x28e5 : 0x10028e5,
1950 0x28e6 : 0x10028e6,
1951 0x28e7 : 0x10028e7,
1952 0x28e8 : 0x10028e8,
1953 0x28e9 : 0x10028e9,
1954 0x28ea : 0x10028ea,
1955 0x28eb : 0x10028eb,
1956 0x28ec : 0x10028ec,
1957 0x28ed : 0x10028ed,
1958 0x28ee : 0x10028ee,
1959 0x28ef : 0x10028ef,
1960 0x28f0 : 0x10028f0,
1961 0x28f1 : 0x10028f1,
1962 0x28f2 : 0x10028f2,
1963 0x28f3 : 0x10028f3,
1964 0x28f4 : 0x10028f4,
1965 0x28f5 : 0x10028f5,
1966 0x28f6 : 0x10028f6,
1967 0x28f7 : 0x10028f7,
1968 0x28f8 : 0x10028f8,
1969 0x28f9 : 0x10028f9,
1970 0x28fa : 0x10028fa,
1971 0x28fb : 0x10028fb,
1972 0x28fc : 0x10028fc,
1973 0x28fd : 0x10028fd,
1974 0x28fe : 0x10028fe,
d890e864 1975 0x28ff : 0x10028ff
483157f8 1976};