summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/accessible/accessible.pro6
-rw-r--r--src/plugins/accessible/qaccessiblebase.pri2
-rw-r--r--src/plugins/accessible/widgets/complexwidgets.cpp2168
-rw-r--r--src/plugins/accessible/widgets/complexwidgets.h293
-rw-r--r--src/plugins/accessible/widgets/main.cpp341
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp678
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.h140
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp1667
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h318
-rw-r--r--src/plugins/accessible/widgets/rangecontrols.cpp991
-rw-r--r--src/plugins/accessible/widgets/rangecontrols.h235
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp888
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h193
-rw-r--r--src/plugins/accessible/widgets/widgets.pro20
-rw-r--r--src/plugins/bearer/bearer.pro19
-rw-r--r--src/plugins/bearer/connman/connman.pro21
-rw-r--r--src/plugins/bearer/connman/main.cpp93
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp594
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.h142
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp894
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux_p.h323
-rw-r--r--src/plugins/bearer/connman/qofonoservice_linux.cpp945
-rw-r--r--src/plugins/bearer/connman/qofonoservice_linux_p.h340
-rw-r--r--src/plugins/bearer/corewlan/corewlan.pro25
-rw-r--r--src/plugins/bearer/corewlan/main.cpp88
-rw-r--r--src/plugins/bearer/corewlan/qcorewlanengine.h147
-rw-r--r--src/plugins/bearer/corewlan/qcorewlanengine.mm946
-rw-r--r--src/plugins/bearer/generic/generic.pro16
-rw-r--r--src/plugins/bearer/generic/main.cpp88
-rw-r--r--src/plugins/bearer/generic/qgenericengine.cpp359
-rw-r--r--src/plugins/bearer/generic/qgenericengine.h96
-rw-r--r--src/plugins/bearer/icd/dbusdispatcher.cpp634
-rw-r--r--src/plugins/bearer/icd/dbusdispatcher.h111
-rw-r--r--src/plugins/bearer/icd/iapconf.cpp245
-rw-r--r--src/plugins/bearer/icd/iapconf.h74
-rw-r--r--src/plugins/bearer/icd/iapmonitor.cpp134
-rw-r--r--src/plugins/bearer/icd/iapmonitor.h68
-rw-r--r--src/plugins/bearer/icd/icd.pro33
-rw-r--r--src/plugins/bearer/icd/maemo_icd.cpp855
-rw-r--r--src/plugins/bearer/icd/maemo_icd.h174
-rw-r--r--src/plugins/bearer/icd/main.cpp88
-rw-r--r--src/plugins/bearer/icd/proxyconf.cpp422
-rw-r--r--src/plugins/bearer/icd/proxyconf.h74
-rw-r--r--src/plugins/bearer/icd/qicdengine.cpp1126
-rw-r--r--src/plugins/bearer/icd/qicdengine.h177
-rw-r--r--src/plugins/bearer/icd/qnetworksession_impl.cpp1072
-rw-r--r--src/plugins/bearer/icd/qnetworksession_impl.h229
-rw-r--r--src/plugins/bearer/icd/wlan-utils.h110
-rw-r--r--src/plugins/bearer/nativewifi/main.cpp143
-rw-r--r--src/plugins/bearer/nativewifi/nativewifi.pro17
-rw-r--r--src/plugins/bearer/nativewifi/platformdefs.h326
-rw-r--r--src/plugins/bearer/nativewifi/qnativewifiengine.cpp611
-rw-r--r--src/plugins/bearer/nativewifi/qnativewifiengine.h108
-rw-r--r--src/plugins/bearer/networkmanager/main.cpp95
-rw-r--r--src/plugins/bearer/networkmanager/networkmanager.pro20
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp911
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerengine.h142
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp931
-rw-r--r--src/plugins/bearer/networkmanager/qnetworkmanagerservice.h448
-rw-r--r--src/plugins/bearer/networkmanager/qnmdbushelper.cpp130
-rw-r--r--src/plugins/bearer/networkmanager/qnmdbushelper.h79
-rw-r--r--src/plugins/bearer/nla/main.cpp84
-rw-r--r--src/plugins/bearer/nla/nla.pro23
-rw-r--r--src/plugins/bearer/nla/qnlaengine.cpp650
-rw-r--r--src/plugins/bearer/nla/qnlaengine.h112
-rw-r--r--src/plugins/bearer/platformdefs_win.h141
-rw-r--r--src/plugins/bearer/qbearerengine_impl.h85
-rw-r--r--src/plugins/bearer/qnetworksession_impl.cpp421
-rw-r--r--src/plugins/bearer/qnetworksession_impl.h132
-rw-r--r--src/plugins/bearer/symbian/3_1/3_1.pro9
-rw-r--r--src/plugins/bearer/symbian/3_2/3_2.pro17
-rw-r--r--src/plugins/bearer/symbian/main.cpp88
-rw-r--r--src/plugins/bearer/symbian/qnetworksession_impl.cpp1549
-rw-r--r--src/plugins/bearer/symbian/qnetworksession_impl.h237
-rw-r--r--src/plugins/bearer/symbian/symbian.pri32
-rw-r--r--src/plugins/bearer/symbian/symbian.pro8
-rw-r--r--src/plugins/bearer/symbian/symbian_3/symbian_3.pro21
-rw-r--r--src/plugins/bearer/symbian/symbianengine.cpp1409
-rw-r--r--src/plugins/bearer/symbian/symbianengine.h246
-rw-r--r--src/plugins/codecs/cn/cn.pro16
-rw-r--r--src/plugins/codecs/cn/main.cpp145
-rw-r--r--src/plugins/codecs/cn/qgb18030codec.cpp9265
-rw-r--r--src/plugins/codecs/cn/qgb18030codec.h159
-rw-r--r--src/plugins/codecs/codecs.pro4
-rw-r--r--src/plugins/codecs/jp/jp.pro27
-rw-r--r--src/plugins/codecs/jp/main.cpp149
-rw-r--r--src/plugins/codecs/jp/qeucjpcodec.cpp261
-rw-r--r--src/plugins/codecs/jp/qeucjpcodec.h106
-rw-r--r--src/plugins/codecs/jp/qfontjpcodec.cpp145
-rw-r--r--src/plugins/codecs/jp/qfontjpcodec.h93
-rw-r--r--src/plugins/codecs/jp/qjiscodec.cpp367
-rw-r--r--src/plugins/codecs/jp/qjiscodec.h106
-rw-r--r--src/plugins/codecs/jp/qjpunicode.cpp10700
-rw-r--r--src/plugins/codecs/jp/qjpunicode.h174
-rw-r--r--src/plugins/codecs/jp/qsjiscodec.cpp227
-rw-r--r--src/plugins/codecs/jp/qsjiscodec.h106
-rw-r--r--src/plugins/codecs/kr/cp949codetbl.h632
-rw-r--r--src/plugins/codecs/kr/kr.pro20
-rw-r--r--src/plugins/codecs/kr/main.cpp131
-rw-r--r--src/plugins/codecs/kr/qeuckrcodec.cpp3571
-rw-r--r--src/plugins/codecs/kr/qeuckrcodec.h129
-rw-r--r--src/plugins/codecs/tw/main.cpp138
-rw-r--r--src/plugins/codecs/tw/qbig5codec.cpp12788
-rw-r--r--src/plugins/codecs/tw/qbig5codec.h124
-rw-r--r--src/plugins/codecs/tw/tw.pro16
-rw-r--r--src/plugins/decorations/decorations.pro4
-rw-r--r--src/plugins/decorations/default/default.pro10
-rw-r--r--src/plugins/decorations/default/main.cpp76
-rw-r--r--src/plugins/decorations/styled/main.cpp77
-rw-r--r--src/plugins/decorations/styled/styled.pro13
-rw-r--r--src/plugins/decorations/windows/main.cpp76
-rw-r--r--src/plugins/decorations/windows/windows.pro10
-rw-r--r--src/plugins/generic/linuxinput/linuxinput.pro18
-rw-r--r--src/plugins/generic/linuxinput/main.cpp80
-rw-r--r--src/plugins/generic/linuxinput/qlinuxinput.cpp557
-rw-r--r--src/plugins/generic/linuxinput/qlinuxinput.h111
-rw-r--r--src/plugins/generic/tslib/main.cpp78
-rw-r--r--src/plugins/generic/tslib/qtslib.cpp144
-rw-r--r--src/plugins/generic/tslib/qtslib.h77
-rw-r--r--src/plugins/generic/tslib/tslib.pro13
-rw-r--r--src/plugins/gfxdrivers/ahi/ahi.pro14
-rw-r--r--src/plugins/gfxdrivers/ahi/qscreenahi_qws.cpp598
-rw-r--r--src/plugins/gfxdrivers/ahi/qscreenahi_qws.h84
-rw-r--r--src/plugins/gfxdrivers/ahi/qscreenahiplugin.cpp74
-rw-r--r--src/plugins/gfxdrivers/directfb/directfb.pro15
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.cpp436
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.h74
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp294
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbmouse.h75
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp221
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h108
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp1430
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h123
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp588
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpixmap.h105
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp1819
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.h303
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreenplugin.cpp78
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp506
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h129
-rw-r--r--src/plugins/gfxdrivers/eglnullws/README48
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullws.pro18
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.cpp181
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.h69
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.cpp66
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.h47
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.cpp84
-rw-r--r--src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.h63
-rw-r--r--src/plugins/gfxdrivers/gfxdrivers.pro10
-rw-r--r--src/plugins/gfxdrivers/linuxfb/linuxfb.pro14
-rw-r--r--src/plugins/gfxdrivers/linuxfb/main.cpp79
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/QWSWSEGL.pro26
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c830
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h169
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h132
-rw-r--r--src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c402
-rw-r--r--src/plugins/gfxdrivers/powervr/README66
-rw-r--r--src/plugins/gfxdrivers/powervr/powervr.pri2
-rw-r--r--src/plugins/gfxdrivers/powervr/powervr.pro3
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp351
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h99
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.pro27
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreenplugin.cpp74
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp273
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h85
-rw-r--r--src/plugins/gfxdrivers/qvfb/main.cpp82
-rw-r--r--src/plugins/gfxdrivers/qvfb/qvfb.pro19
-rw-r--r--src/plugins/gfxdrivers/transformed/main.cpp84
-rw-r--r--src/plugins/gfxdrivers/transformed/transformed.pro13
-rw-r--r--src/plugins/gfxdrivers/vnc/main.cpp86
-rw-r--r--src/plugins/gfxdrivers/vnc/qscreenvnc_p.h524
-rw-r--r--src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp2338
-rw-r--r--src/plugins/gfxdrivers/vnc/qscreenvnc_qws.h88
-rw-r--r--src/plugins/gfxdrivers/vnc/vnc.pro16
-rw-r--r--src/plugins/graphicssystems/graphicssystems.pro15
-rw-r--r--src/plugins/graphicssystems/meego/dithering.cpp266
-rw-r--r--src/plugins/graphicssystems/meego/meego.pro13
-rw-r--r--src/plugins/graphicssystems/meego/qmeegoextensions.cpp213
-rw-r--r--src/plugins/graphicssystems/meego/qmeegoextensions.h125
-rw-r--r--src/plugins/graphicssystems/meego/qmeegographicssystem.cpp534
-rw-r--r--src/plugins/graphicssystems/meego/qmeegographicssystem.h127
-rw-r--r--src/plugins/graphicssystems/meego/qmeegographicssystemplugin.cpp58
-rw-r--r--src/plugins/graphicssystems/meego/qmeegographicssystemplugin.h54
-rw-r--r--src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp323
-rw-r--r--src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h78
-rw-r--r--src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp224
-rw-r--r--src/plugins/graphicssystems/meego/qmeegopixmapdata.h74
-rw-r--r--src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.cpp60
-rw-r--r--src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.h55
-rw-r--r--src/plugins/graphicssystems/opengl/main.cpp95
-rw-r--r--src/plugins/graphicssystems/opengl/opengl.pro13
-rw-r--r--src/plugins/graphicssystems/openvg/main.cpp71
-rw-r--r--src/plugins/graphicssystems/openvg/openvg.pro14
-rw-r--r--src/plugins/graphicssystems/openvg/qgraphicssystem_vg.cpp88
-rw-r--r--src/plugins/graphicssystems/openvg/qgraphicssystem_vg_p.h73
-rw-r--r--src/plugins/graphicssystems/shivavg/README8
-rw-r--r--src/plugins/graphicssystems/shivavg/main.cpp71
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavg.pro12
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavggraphicssystem.cpp62
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavggraphicssystem.h60
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp358
-rw-r--r--src/plugins/graphicssystems/shivavg/shivavgwindowsurface.h76
-rw-r--r--src/plugins/graphicssystems/trace/main.cpp69
-rw-r--r--src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp153
-rw-r--r--src/plugins/graphicssystems/trace/qgraphicssystem_trace_p.h71
-rw-r--r--src/plugins/graphicssystems/trace/trace.pro13
-rw-r--r--src/plugins/imageformats/gif/gif.pro11
-rw-r--r--src/plugins/imageformats/gif/main.cpp98
-rw-r--r--src/plugins/imageformats/ico/ico.pro14
-rw-r--r--src/plugins/imageformats/ico/main.cpp96
-rw-r--r--src/plugins/imageformats/ico/qicohandler.cpp899
-rw-r--r--src/plugins/imageformats/ico/qicohandler.h79
-rw-r--r--src/plugins/imageformats/imageformats.pro8
-rw-r--r--src/plugins/imageformats/jpeg/jpeg.pro11
-rw-r--r--src/plugins/imageformats/jpeg/main.cpp97
-rw-r--r--src/plugins/imageformats/mng/main.cpp98
-rw-r--r--src/plugins/imageformats/mng/mng.pro17
-rw-r--r--src/plugins/imageformats/tiff/main.cpp97
-rw-r--r--src/plugins/imageformats/tiff/tiff.pro13
-rw-r--r--src/plugins/inputmethods/imsw-multi/imsw-multi.pro13
-rw-r--r--src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp212
-rw-r--r--src/plugins/inputmethods/imsw-multi/qmultiinputcontext.h117
-rw-r--r--src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp111
-rw-r--r--src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.h85
-rw-r--r--src/plugins/inputmethods/inputmethods.pro3
-rw-r--r--src/plugins/kbddrivers/kbddrivers.pro2
-rw-r--r--src/plugins/kbddrivers/linuxinput/linuxinput.pro14
-rw-r--r--src/plugins/kbddrivers/linuxinput/main.cpp77
-rw-r--r--src/plugins/mousedrivers/linuxtp/linuxtp.pro14
-rw-r--r--src/plugins/mousedrivers/linuxtp/main.cpp76
-rw-r--r--src/plugins/mousedrivers/mousedrivers.pro5
-rw-r--r--src/plugins/mousedrivers/pc/main.cpp81
-rw-r--r--src/plugins/mousedrivers/pc/pc.pro14
-rw-r--r--src/plugins/mousedrivers/tslib/main.cpp77
-rw-r--r--src/plugins/mousedrivers/tslib/tslib.pro16
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro29
-rw-r--r--src/plugins/platforms/cocoa/main.mm74
-rw-r--r--src/plugins/platforms/cocoa/qcocoaautoreleasepool.h57
-rw-r--r--src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm52
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventloopintegration.h65
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventloopintegration.mm112
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h99
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm132
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h75
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm110
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindowsurface.h73
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindowsurface.mm103
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h79
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm211
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.h61
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.mm73
-rw-r--r--src/plugins/platforms/directfb/directfb.pro35
-rw-r--r--src/plugins/platforms/directfb/main.cpp72
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.cpp155
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.h76
-rw-r--r--src/plugins/platforms/directfb/qdirectfbconvenience.cpp376
-rw-r--r--src/plugins/platforms/directfb/qdirectfbconvenience.h84
-rw-r--r--src/plugins/platforms/directfb/qdirectfbcursor.cpp80
-rw-r--r--src/plugins/platforms/directfb/qdirectfbcursor.h63
-rw-r--r--src/plugins/platforms/directfb/qdirectfbglcontext.cpp101
-rw-r--r--src/plugins/platforms/directfb/qdirectfbglcontext.h69
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.cpp208
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.h86
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.cpp144
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.h104
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.cpp191
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.h79
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp141
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindowsurface.h77
-rw-r--r--src/plugins/platforms/eglconvenience/eglconvenience.pri7
-rw-r--r--src/plugins/platforms/eglconvenience/qeglconvenience.cpp324
-rw-r--r--src/plugins/platforms/eglconvenience/qeglconvenience.h60
-rw-r--r--src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp157
-rw-r--r--src/plugins/platforms/eglconvenience/qeglplatformcontext.h71
-rw-r--r--src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp184
-rw-r--r--src/plugins/platforms/eglconvenience/qxlibeglintegration.h53
-rw-r--r--src/plugins/platforms/eglconvenience/xlibeglintegration.pri7
-rw-r--r--src/plugins/platforms/eglfs/eglfs.pro31
-rw-r--r--src/plugins/platforms/eglfs/main.cpp72
-rw-r--r--src/plugins/platforms/eglfs/qeglfsintegration.cpp109
-rw-r--r--src/plugins/platforms/eglfs/qeglfsintegration.h77
-rw-r--r--src/plugins/platforms/eglfs/qeglfsscreen.cpp244
-rw-r--r--src/plugins/platforms/eglfs/qeglfsscreen.h80
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.cpp87
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.h68
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindowsurface.cpp101
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindowsurface.h67
-rw-r--r--src/plugins/platforms/externalplugin.pri29
-rw-r--r--src/plugins/platforms/fb_base/fb_base.cpp507
-rw-r--r--src/plugins/platforms/fb_base/fb_base.h210
-rw-r--r--src/plugins/platforms/fb_base/fb_base.pri2
-rw-r--r--src/plugins/platforms/fb_base/fb_base.pro23
-rw-r--r--src/plugins/platforms/fontdatabases/basicunix/basicunix.pri86
-rw-r--r--src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.cpp328
-rw-r--r--src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.h67
-rw-r--r--src/plugins/platforms/fontdatabases/fontconfig/fontconfig.pri12
-rw-r--r--src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp601
-rw-r--r--src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h56
-rw-r--r--src/plugins/platforms/fontdatabases/genericunix/genericunix.pri10
-rw-r--r--src/plugins/platforms/fontdatabases/genericunix/qgenericunixfontdatabase.h53
-rw-r--r--src/plugins/platforms/glxconvenience/glxconvenience.pri7
-rw-r--r--src/plugins/platforms/glxconvenience/qglxconvenience.cpp243
-rw-r--r--src/plugins/platforms/glxconvenience/qglxconvenience.h56
-rw-r--r--src/plugins/platforms/linuxfb/linuxfb.pro13
-rw-r--r--src/plugins/platforms/linuxfb/main.cpp72
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp875
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbintegration.h135
-rw-r--r--src/plugins/platforms/minimal/main.cpp73
-rw-r--r--src/plugins/platforms/minimal/minimal.pro13
-rw-r--r--src/plugins/platforms/minimal/qminimalintegration.cpp82
-rw-r--r--src/plugins/platforms/minimal/qminimalintegration.h86
-rw-r--r--src/plugins/platforms/minimal/qminimalwindowsurface.cpp86
-rw-r--r--src/plugins/platforms/minimal/qminimalwindowsurface.h67
-rw-r--r--src/plugins/platforms/openkode/main.cpp72
-rw-r--r--src/plugins/platforms/openkode/openkode.pro42
-rw-r--r--src/plugins/platforms/openkode/openkodekeytranslator.h244
-rw-r--r--src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp128
-rw-r--r--src/plugins/platforms/openkode/qopenkodeeventloopintegration.h71
-rw-r--r--src/plugins/platforms/openkode/qopenkodeintegration.cpp247
-rw-r--r--src/plugins/platforms/openkode/qopenkodeintegration.h120
-rw-r--r--src/plugins/platforms/openkode/qopenkodewindow.cpp315
-rw-r--r--src/plugins/platforms/openkode/qopenkodewindow.h89
-rw-r--r--src/plugins/platforms/openkode/resources.qrc6
-rw-r--r--src/plugins/platforms/openkode/shaders/frag.glslf49
-rw-r--r--src/plugins/platforms/openkode/shaders/vert.glslv55
-rw-r--r--src/plugins/platforms/openvglite/main.cpp71
-rw-r--r--src/plugins/platforms/openvglite/openvglite.pro12
-rw-r--r--src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp193
-rw-r--r--src/plugins/platforms/openvglite/qgraphicssystem_vglite.h93
-rw-r--r--src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp131
-rw-r--r--src/plugins/platforms/openvglite/qwindowsurface_vglite.h91
-rw-r--r--src/plugins/platforms/platforms.pro8
-rw-r--r--src/plugins/platforms/qvfb/main.cpp73
-rw-r--r--src/plugins/platforms/qvfb/qvfb.pro13
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.cpp448
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.h100
-rw-r--r--src/plugins/platforms/qvfb/qvfbwindowsurface.cpp108
-rw-r--r--src/plugins/platforms/qvfb/qvfbwindowsurface.h80
-rw-r--r--src/plugins/platforms/uikit/README45
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/main.mm78
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/qml/main.qml112
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/moc_qmlapplicationviewer.cpp110
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.cpp196
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.h80
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/qmltest-Info.plist28
-rwxr-xr-xsrc/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj491
-rw-r--r--src/plugins/platforms/uikit/examples/qmltest/qmltest_Prefix.pch8
-rw-r--r--src/plugins/platforms/uikit/main.mm74
-rw-r--r--src/plugins/platforms/uikit/quikiteventloop.h72
-rw-r--r--src/plugins/platforms/uikit/quikiteventloop.mm179
-rw-r--r--src/plugins/platforms/uikit/quikitintegration.h72
-rw-r--r--src/plugins/platforms/uikit/quikitintegration.mm104
-rw-r--r--src/plugins/platforms/uikit/quikitscreen.h75
-rw-r--r--src/plugins/platforms/uikit/quikitscreen.mm84
-rw-r--r--src/plugins/platforms/uikit/quikitsoftwareinputhandler.h61
-rw-r--r--src/plugins/platforms/uikit/quikitwindow.h122
-rw-r--r--src/plugins/platforms/uikit/quikitwindow.mm375
-rw-r--r--src/plugins/platforms/uikit/quikitwindowsurface.h64
-rw-r--r--src/plugins/platforms/uikit/quikitwindowsurface.mm96
-rw-r--r--src/plugins/platforms/uikit/uikit.pro27
-rw-r--r--src/plugins/platforms/vnc/main.cpp73
-rw-r--r--src/plugins/platforms/vnc/qvnccursor.cpp156
-rw-r--r--src/plugins/platforms/vnc/qvnccursor.h76
-rw-r--r--src/plugins/platforms/vnc/qvncintegration.cpp251
-rw-r--r--src/plugins/platforms/vnc/qvncintegration.h110
-rw-r--r--src/plugins/platforms/vnc/qvncserver.cpp1935
-rw-r--r--src/plugins/platforms/vnc/qvncserver.h533
-rw-r--r--src/plugins/platforms/vnc/vnc.pro22
-rw-r--r--src/plugins/platforms/wayland/gl_integration/gl_integration.pri57
-rw-r--r--src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp52
-rw-r--r--src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h62
-rw-r--r--src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp184
-rw-r--r--src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h69
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp174
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h80
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp112
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h82
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp76
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h66
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri14
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp163
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h79
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp97
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h80
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp73
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h65
-rw-r--r--src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri12
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h57
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp95
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h73
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp112
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h71
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp126
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h80
-rw-r--r--src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri12
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp169
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h82
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp139
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h98
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp77
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h65
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri15
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp150
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h85
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp126
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h93
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp77
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h65
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri13
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp59
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h62
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h145
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c59
-rw-r--r--src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri9
-rw-r--r--src/plugins/platforms/wayland/main.cpp75
-rw-r--r--src/plugins/platforms/wayland/qwaylandbuffer.h60
-rw-r--r--src/plugins/platforms/wayland/qwaylandcursor.cpp191
-rw-r--r--src/plugins/platforms/wayland/qwaylandcursor.h60
-rw-r--r--src/plugins/platforms/wayland/qwaylanddisplay.cpp270
-rw-r--r--src/plugins/platforms/wayland/qwaylanddisplay.h134
-rw-r--r--src/plugins/platforms/wayland/qwaylandinputdevice.cpp337
-rw-r--r--src/plugins/platforms/wayland/qwaylandinputdevice.h101
-rw-r--r--src/plugins/platforms/wayland/qwaylandintegration.cpp127
-rw-r--r--src/plugins/platforms/wayland/qwaylandintegration.h76
-rw-r--r--src/plugins/platforms/wayland/qwaylandscreen.cpp107
-rw-r--r--src/plugins/platforms/wayland/qwaylandscreen.h77
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmsurface.cpp145
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmsurface.h83
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmwindow.cpp71
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmwindow.h58
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.cpp158
-rw-r--r--src/plugins/platforms/wayland/qwaylandwindow.h93
-rw-r--r--src/plugins/platforms/wayland/wayland.pro39
-rw-r--r--src/plugins/platforms/xcb/README3
-rw-r--r--src/plugins/platforms/xcb/main.cpp72
-rw-r--r--src/plugins/platforms/xcb/qdri2context.cpp271
-rw-r--r--src/plugins/platforms/xcb/qdri2context.h77
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.cpp154
-rw-r--r--src/plugins/platforms/xcb/qglxintegration.h78
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp780
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h331
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp151
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.h83
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp973
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.h82
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp185
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.h75
-rw-r--r--src/plugins/platforms/xcb/qxcbobject.h62
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp134
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.h80
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp683
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h108
-rw-r--r--src/plugins/platforms/xcb/qxcbwindowsurface.cpp258
-rw-r--r--src/plugins/platforms/xcb/qxcbwindowsurface.h72
-rw-r--r--src/plugins/platforms/xcb/xcb.pro70
-rw-r--r--src/plugins/platforms/xlib/main.cpp79
-rw-r--r--src/plugins/platforms/xlib/qglxintegration.cpp160
-rw-r--r--src/plugins/platforms/xlib/qglxintegration.h85
-rw-r--r--src/plugins/platforms/xlib/qxlibclipboard.cpp677
-rw-r--r--src/plugins/platforms/xlib/qxlibclipboard.h94
-rw-r--r--src/plugins/platforms/xlib/qxlibcursor.cpp200
-rw-r--r--src/plugins/platforms/xlib/qxlibcursor.h68
-rw-r--r--src/plugins/platforms/xlib/qxlibdisplay.cpp78
-rw-r--r--src/plugins/platforms/xlib/qxlibdisplay.h63
-rw-r--r--src/plugins/platforms/xlib/qxlibintegration.cpp173
-rw-r--r--src/plugins/platforms/xlib/qxlibintegration.h90
-rw-r--r--src/plugins/platforms/xlib/qxlibkeyboard.cpp1001
-rw-r--r--src/plugins/platforms/xlib/qxlibkeyboard.h76
-rw-r--r--src/plugins/platforms/xlib/qxlibmime.cpp322
-rw-r--r--src/plugins/platforms/xlib/qxlibmime.h67
-rw-r--r--src/plugins/platforms/xlib/qxlibnativeinterface.cpp133
-rw-r--r--src/plugins/platforms/xlib/qxlibnativeinterface.h75
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.cpp488
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.h112
-rw-r--r--src/plugins/platforms/xlib/qxlibstatic.cpp512
-rw-r--r--src/plugins/platforms/xlib/qxlibstatic.h413
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.cpp737
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.h145
-rw-r--r--src/plugins/platforms/xlib/qxlibwindowsurface.cpp224
-rw-r--r--src/plugins/platforms/xlib/qxlibwindowsurface.h86
-rw-r--r--src/plugins/platforms/xlib/xlib.pro62
-rw-r--r--src/plugins/plugins.pro17
-rw-r--r--src/plugins/qpluginbase.pri41
-rw-r--r--src/plugins/s60/3_1/3_1.pro9
-rw-r--r--src/plugins/s60/3_2/3_2.pro23
-rw-r--r--src/plugins/s60/5_0/5_0.pro23
-rw-r--r--src/plugins/s60/bwins/qts60pluginu.def8
-rw-r--r--src/plugins/s60/eabi/qts60pluginu.def8
-rw-r--r--src/plugins/s60/s60.pro11
-rw-r--r--src/plugins/s60/s60pluginbase.pri23
-rw-r--r--src/plugins/s60/src/qcoreapplication_3_1.cpp48
-rw-r--r--src/plugins/s60/src/qcoreapplication_3_2.cpp48
-rw-r--r--src/plugins/s60/src/qdesktopservices_3_1.cpp49
-rw-r--r--src/plugins/s60/src/qdesktopservices_3_2.cpp80
-rw-r--r--src/plugins/s60/src/qlocale_3_1.cpp148
-rw-r--r--src/plugins/s60/src/qlocale_3_2.cpp66
-rw-r--r--src/plugins/sqldrivers/README5
-rw-r--r--src/plugins/sqldrivers/db2/README6
-rw-r--r--src/plugins/sqldrivers/db2/db2.pro6
-rw-r--r--src/plugins/sqldrivers/db2/main.cpp81
-rw-r--r--src/plugins/sqldrivers/ibase/ibase.pro6
-rw-r--r--src/plugins/sqldrivers/ibase/main.cpp81
-rw-r--r--src/plugins/sqldrivers/mysql/README6
-rw-r--r--src/plugins/sqldrivers/mysql/main.cpp82
-rw-r--r--src/plugins/sqldrivers/mysql/mysql.pro6
-rw-r--r--src/plugins/sqldrivers/oci/README6
-rw-r--r--src/plugins/sqldrivers/oci/main.cpp82
-rw-r--r--src/plugins/sqldrivers/oci/oci.pro6
-rw-r--r--src/plugins/sqldrivers/odbc/README6
-rw-r--r--src/plugins/sqldrivers/odbc/main.cpp82
-rw-r--r--src/plugins/sqldrivers/odbc/odbc.pro6
-rw-r--r--src/plugins/sqldrivers/psql/README6
-rw-r--r--src/plugins/sqldrivers/psql/main.cpp82
-rw-r--r--src/plugins/sqldrivers/psql/psql.pro6
-rw-r--r--src/plugins/sqldrivers/qsqldriverbase.pri8
-rw-r--r--src/plugins/sqldrivers/sqldrivers.pro13
-rw-r--r--src/plugins/sqldrivers/sqlite/README6
-rw-r--r--src/plugins/sqldrivers/sqlite/smain.cpp81
-rw-r--r--src/plugins/sqldrivers/sqlite/sqlite.pro8
-rw-r--r--src/plugins/sqldrivers/sqlite2/README6
-rw-r--r--src/plugins/sqldrivers/sqlite2/smain.cpp81
-rw-r--r--src/plugins/sqldrivers/sqlite2/sqlite2.pro6
-rw-r--r--src/plugins/sqldrivers/sqlite_symbian/SQLite3_v9.2.zipbin0 -> 3119273 bytes
-rw-r--r--src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri52
-rw-r--r--src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pro9
-rw-r--r--src/plugins/sqldrivers/tds/README6
-rw-r--r--src/plugins/sqldrivers/tds/main.cpp89
-rw-r--r--src/plugins/sqldrivers/tds/tds.pro6
528 files changed, 124707 insertions, 0 deletions
diff --git a/src/plugins/accessible/accessible.pro b/src/plugins/accessible/accessible.pro
new file mode 100644
index 0000000000..a7caf07106
--- /dev/null
+++ b/src/plugins/accessible/accessible.pro
@@ -0,0 +1,6 @@
+TEMPLATE = subdirs
+
+contains(QT_CONFIG, accessibility) {
+ SUBDIRS += widgets
+ contains(QT_CONFIG, qt3support):SUBDIRS += compat
+}
diff --git a/src/plugins/accessible/qaccessiblebase.pri b/src/plugins/accessible/qaccessiblebase.pri
new file mode 100644
index 0000000000..95c1fad13a
--- /dev/null
+++ b/src/plugins/accessible/qaccessiblebase.pri
@@ -0,0 +1,2 @@
+target.path += $$[QT_INSTALL_PLUGINS]/accessible
+INSTALLS += target
diff --git a/src/plugins/accessible/widgets/complexwidgets.cpp b/src/plugins/accessible/widgets/complexwidgets.cpp
new file mode 100644
index 0000000000..e6384133c0
--- /dev/null
+++ b/src/plugins/accessible/widgets/complexwidgets.cpp
@@ -0,0 +1,2168 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "complexwidgets.h"
+
+#include <qapplication.h>
+#include <qabstractbutton.h>
+#include <qevent.h>
+#include <qheaderview.h>
+#include <qtabbar.h>
+#include <qcombobox.h>
+#include <qlistview.h>
+#include <qtableview.h>
+#include <qlineedit.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qtreeview.h>
+#include <private/qtabbar_p.h>
+#include <QAbstractScrollArea>
+#include <QScrollArea>
+#include <QScrollBar>
+#include <QDebug>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+QString Q_GUI_EXPORT qt_accStripAmp(const QString &text);
+
+#ifndef QT_NO_ITEMVIEWS
+/*
+The MSDN article "Exposing Data Tables through Microsoft Active Accessibility" explains
+how data tables should be exposed. Url: http://msdn2.microsoft.com/en-us/library/ms971325.aspx
+Basically, the model is like this:
+
+ROLE_SYSTEM_TABLE
+ |- ROLE_SYSTEM_ROW
+ | |- ROLE_SYSTEM_ROWHEADER
+ | |- ROLE_SYSTEM_COLUMNHEADER
+ | |- ROLE_SYSTEM_COLUMNHEADER
+ | |- ROLE_SYSTEM_COLUMNHEADER
+ | '- ..
+ |- ROLE_SYSTEM_ROW
+ | |- ROLE_SYSTEM_ROWHEADER
+ | |- ROLE_SYSTEM_CELL
+ | |- ROLE_SYSTEM_CELL
+ | |- ROLE_SYSTEM_CELL
+ | '- ..
+ |- ROLE_SYSTEM_ROW
+ | |- ROLE_SYSTEM_ROWHEADER
+ | |- ROLE_SYSTEM_CELL
+ | |- ROLE_SYSTEM_CELL
+ | |- ROLE_SYSTEM_CELL
+ | '- ..
+ '- ..
+
+The headers of QTreeView is also represented like this.
+*/
+QAccessibleItemRow::QAccessibleItemRow(QAbstractItemView *aView, const QModelIndex &index, bool isHeader)
+ : row(index), view(aView), m_header(isHeader)
+{
+}
+
+QHeaderView *QAccessibleItemRow::horizontalHeader() const
+{
+ QHeaderView *header = 0;
+ if (m_header) {
+ if (false) {
+#ifndef QT_NO_TABLEVIEW
+ } else if (const QTableView *tv = qobject_cast<const QTableView*>(view)) {
+ header = tv->horizontalHeader();
+#endif
+#ifndef QT_NO_TREEVIEW
+ } else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) {
+ header = tv->header();
+#endif
+ }
+ }
+ return header;
+}
+
+QHeaderView *QAccessibleItemRow::verticalHeader() const
+{
+ QHeaderView *header = 0;
+#ifndef QT_NO_TABLEVIEW
+ if (const QTableView *tv = qobject_cast<const QTableView*>(view))
+ header = tv->verticalHeader();
+#endif
+ return header;
+}
+
+int QAccessibleItemRow::logicalFromChild(QHeaderView *header, int child) const
+{
+ int logical = -1;
+ if (header->sectionsHidden()) {
+ int kid = 0;
+ for (int i = 0; i < header->count(); ++i) {
+ if (!header->isSectionHidden(i))
+ ++kid;
+ if (kid == child) {
+ logical = i;
+ break;
+ }
+ }
+ } else {
+ logical = child - 1;
+ }
+ return logical;
+}
+
+QRect QAccessibleItemRow::rect(int child) const
+{
+ QRect r;
+ if (view && view->isVisible()) {
+ if (QHeaderView *header = horizontalHeader()) {
+ if (!child) {
+ r = header->rect();
+ } else {
+ if (QHeaderView *vheader = verticalHeader()) {
+ if (child == 1) {
+ int w = vheader->width();
+ int h = header->height();
+ r.setRect(0, 0, w, h);
+ }
+ --child;
+ }
+ if (child) {
+ int logical = logicalFromChild(header, child);
+ int w = header->sectionSize(logical);
+ r.setRect(header->sectionViewportPosition(logical), 0, w, header->height());
+ r.translate(header->mapTo(view, QPoint(0, 0)));
+ }
+ }
+ } else if (row.isValid()) {
+ if (!child) {
+ QModelIndex parent = row.parent();
+ const int colCount = row.model()->columnCount(parent);
+ for (int i = 0; i < colCount; ++i)
+ r |= view->visualRect(row.model()->index(row.row(), i, parent));
+ r.translate(view->viewport()->mapTo(view, QPoint(0,0)));
+
+ if (const QHeaderView *vheader = verticalHeader()) { // include the section of the vertical header
+ QRect re;
+ int logicalRow = row.row();
+ int h = vheader->sectionSize(logicalRow);
+ re.setRect(0, vheader->sectionViewportPosition(logicalRow), vheader->width(), h);
+ re.translate(vheader->mapTo(view, QPoint(0, 0)));
+ r |= re;
+ }
+ } else {
+ if (QHeaderView *vheader = verticalHeader()) {
+ if (child == 1) {
+ int logicalRow = row.row();
+ int h = vheader->sectionSize(logicalRow);
+ r.setRect(0, vheader->sectionViewportPosition(logicalRow), vheader->width(), h);
+ r.translate(vheader->mapTo(view, QPoint(0, 0)));
+ }
+ --child;
+ }
+ if (child) {
+ r = view->visualRect(childIndex(child));
+ r.translate(view->viewport()->mapTo(view, QPoint(0,0)));
+ }
+ }
+ }
+ }
+ if (!r.isNull())
+ r.translate(view->mapToGlobal(QPoint(0, 0)));
+
+ return r;
+}
+
+int QAccessibleItemRow::treeLevel() const
+{
+ int level = 0;
+ QModelIndex idx = row;
+ while (idx.isValid()) {
+ idx = idx.parent();
+ ++level;
+ }
+ return level;
+}
+
+QString QAccessibleItemRow::text_helper(int child) const
+{
+ QString value;
+ if (m_header) {
+ if (!child)
+ return QString();
+ if (verticalHeader()) {
+ if (child == 1)
+ return QString();
+ --child;
+ }
+ QHeaderView *header = horizontalHeader();
+ int logical = logicalFromChild(header, child);
+ value = view->model()->headerData(logical, Qt::Horizontal, Qt::AccessibleTextRole).toString();
+ if (value.isEmpty())
+ value = view->model()->headerData(logical, Qt::Horizontal).toString();
+ return value;
+ } else {
+ if (!child) { // for one-column views (i.e. QListView)
+ if (children().count() >= 1)
+ child = 1;
+ else
+ return QString();
+ }
+ if (verticalHeader()) {
+ if (child == 1) {
+ int logical = row.row();
+ value = view->model()->headerData(logical, Qt::Vertical, Qt::AccessibleTextRole).toString();
+ if (value.isEmpty())
+ value = view->model()->headerData(logical, Qt::Vertical).toString();
+ return value;
+ } else {
+ --child;
+ }
+ }
+ }
+ if (value.isEmpty()) {
+ QModelIndex idx = childIndex(child);
+ if (idx.isValid()) {
+ value = idx.model()->data(idx, Qt::AccessibleTextRole).toString();
+ if (value.isEmpty())
+ value = idx.model()->data(idx, Qt::DisplayRole).toString();
+ }
+ }
+ return value;
+}
+
+QString QAccessibleItemRow::text(Text t, int child) const
+{
+ QString value;
+ if (t == Name) {
+ value = text_helper(child);
+ } else if (t == Value) {
+#ifndef QT_NO_TREEVIEW
+ if (qobject_cast<const QTreeView*>(view)) {
+ if (child == 0)
+ value = QString::number(treeLevel());
+ } else
+#endif
+ {
+ value = text_helper(child);
+ }
+ } else if (t == Description) {
+#ifndef QT_NO_TREEVIEW
+ if (child == 0 && qobject_cast<const QTreeView*>(view)) {
+ // We store the tree coordinates of the current item in the description.
+ // This enables some screen readers to report where the focus is
+ // in a tree view. (works in JAWS). Also, Firefox does the same thing.
+ // For instance the description "L2, 4 of 25 with 24" means
+ // "L2": Tree Level 2
+ // "4 of 25": We are item 4 out of in total 25 other siblings
+ // "with 24": We have 24 children. (JAWS does not read this number)
+
+ // level
+ int level = treeLevel();
+
+ QAbstractItemModel *m = view->model();
+ // totalSiblings and itemIndex
+ QModelIndex parent = row.parent();
+ int rowCount = m->rowCount(parent);
+ int itemIndex = -1;
+ int totalSiblings = 0;
+ for (int i = 0 ; i < rowCount; ++i) {
+ QModelIndex sibling = row.sibling(i, 0);
+ if (!view->isIndexHidden(sibling))
+ ++totalSiblings;
+ if (row == sibling)
+ itemIndex = totalSiblings;
+ }
+ int totalChildren = m->rowCount(row); // JAWS does not report child count, so we do
+ // this simple and efficient.
+ // (don't check if they are all visible).
+ value = QString::fromAscii("L%1, %2 of %3 with %4").arg(level).arg(itemIndex).arg(totalSiblings).arg(totalChildren);
+ } else
+#endif // QT_NO_TREEVIEW
+ {
+ if (!m_header) {
+ if (child == 0 && children().count() >= 1)
+ child = 1;
+ if (verticalHeader()) {
+ if (child == 1) {
+ value = view->model()->headerData(row.row(), Qt::Vertical).toString();
+ }
+ --child;
+ }
+ if (child) {
+ QModelIndex idx = childIndex(child);
+ value = idx.model()->data(idx, Qt::AccessibleDescriptionRole).toString();
+ }
+
+ }
+ }
+ }
+ return value;
+}
+
+void QAccessibleItemRow::setText(Text t, int child, const QString &text)
+{
+ if (m_header) {
+ if (child)
+ view->model()->setHeaderData(child - 1, Qt::Horizontal, text);
+ // child == 0 means the cell to the left of the horizontal header, which is empty!?
+ } else {
+ if (!child) {
+ if (children().count() == 1)
+ child = 1;
+ else
+ return;
+ }
+
+ if (verticalHeader()) {
+ if (child == 1) {
+ view->model()->setHeaderData(row.row(), Qt::Vertical, text);
+ return;
+ }
+ --child;
+ }
+ QModelIndex idx = childIndex(child);
+ if (!idx.isValid())
+ return;
+
+ switch (t) {
+ case Description:
+ const_cast<QAbstractItemModel *>(idx.model())->setData(idx, text,
+ Qt::AccessibleDescriptionRole);
+ break;
+ case Value:
+ const_cast<QAbstractItemModel *>(idx.model())->setData(idx, text, Qt::EditRole);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+QModelIndex QAccessibleItemRow::childIndex(int child) const
+{
+ QList<QModelIndex> kids = children();
+ Q_ASSERT(child >= 1 && child <= kids.count());
+ return kids.at(child - 1);
+}
+
+QList<QModelIndex> QAccessibleItemRow::children() const
+{
+ QList<QModelIndex> kids;
+ for (int i = 0; i < row.model()->columnCount(row.parent()); ++i) {
+ QModelIndex idx = row.model()->index(row.row(), i, row.parent());
+ if (!view->isIndexHidden(idx)) {
+ kids << idx;
+ }
+ }
+ return kids;
+}
+
+bool QAccessibleItemRow::isValid() const
+{
+ return m_header ? true : row.isValid();
+}
+
+QObject *QAccessibleItemRow::object() const
+{
+ return 0;
+}
+
+int QAccessibleItemRow::childCount() const
+{
+ int count = 0;
+ if (QHeaderView *header = horizontalHeader()) {
+ count = header->count() - header->hiddenSectionCount();
+ } else {
+ count = children().count();
+ }
+#ifndef QT_NO_TABLEVIEW
+ if (qobject_cast<const QTableView*>(view)) {
+ if (verticalHeader())
+ ++count;
+ }
+#endif
+ return count;
+}
+
+int QAccessibleItemRow::indexOfChild(const QAccessibleInterface *iface) const
+{
+ if (!iface || iface->role(0) != Row)
+ return -1;
+
+ //### meaningless code?
+ QList<QModelIndex> kids = children();
+ QModelIndex idx = static_cast<const QAccessibleItemRow *>(iface)->row;
+ if (!idx.isValid())
+ return -1;
+ return kids.indexOf(idx) + 1;
+}
+
+QAccessible::Relation QAccessibleItemRow::relationTo(int child, const QAccessibleInterface *other,
+ int otherChild) const
+{
+ if (!child && !otherChild && other->object() == view)
+ return Child;
+ if (!child && !otherChild && other == this)
+ return Self;
+ if (!child && otherChild && other == this)
+ return Ancestor;
+ if (child && otherChild && other == this)
+ return Sibling;
+ return Unrelated;
+}
+
+int QAccessibleItemRow::childAt(int x, int y) const
+{
+ if (!view || !view->isVisible())
+ return -1;
+
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(x, y))
+ return i;
+ }
+ return -1;
+}
+
+QAbstractItemView::CursorAction QAccessibleItemRow::toCursorAction(
+ QAccessible::Relation rel)
+{
+ switch (rel) {
+ case QAccessible::Up:
+ return QAbstractItemView::MoveUp;
+ case QAccessible::Down:
+ return QAbstractItemView::MoveDown;
+ case QAccessible::Left:
+ return QAbstractItemView::MoveLeft;
+ case QAccessible::Right:
+ return QAbstractItemView::MoveRight;
+ default:
+ Q_ASSERT(false);
+ }
+ // should never be reached.
+ return QAbstractItemView::MoveRight;
+}
+
+int QAccessibleItemRow::navigate(RelationFlag relation, int index,
+ QAccessibleInterface **iface) const
+{
+ *iface = 0;
+ if (!view)
+ return -1;
+
+ switch (relation) {
+ case Ancestor: {
+ if (!index)
+ return -1;
+ QAccessibleItemView *ancestor = new QAccessibleItemView(view->viewport());
+ if (index == 1) {
+ *iface = ancestor;
+ return 0;
+ } else if (index > 1) {
+ int ret = ancestor->navigate(Ancestor, index - 1, iface);
+ delete ancestor;
+ return ret;
+ }
+ }
+ case Child: {
+ if (!index)
+ return -1;
+ if (index < 1 && index > childCount())
+ return -1;
+
+ return index;}
+ case Sibling:
+ if (index) {
+ QAccessibleInterface *ifaceParent = 0;
+ navigate(Ancestor, 1, &ifaceParent);
+ if (ifaceParent) {
+ int entry = ifaceParent->navigate(Child, index, iface);
+ delete ifaceParent;
+ return entry;
+ }
+ }
+ return -1;
+ case Up:
+ case Down:
+ case Left:
+ case Right: {
+ // This is in the "not so nice" category. In order to find out which item
+ // is geometrically around, we have to set the current index, navigate
+ // and restore the index as well as the old selection
+ view->setUpdatesEnabled(false);
+ const QModelIndex oldIdx = view->currentIndex();
+ QList<QModelIndex> kids = children();
+ const QModelIndex currentIndex = index ? kids.at(index - 1) : QModelIndex(row);
+ const QItemSelection oldSelection = view->selectionModel()->selection();
+ view->setCurrentIndex(currentIndex);
+ const QModelIndex idx = view->moveCursor(toCursorAction(relation), Qt::NoModifier);
+ view->setCurrentIndex(oldIdx);
+ view->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect);
+ view->setUpdatesEnabled(true);
+ if (!idx.isValid())
+ return -1;
+
+ if (idx.parent() != row.parent() || idx.row() != row.row())
+ *iface = new QAccessibleItemRow(view, idx);
+ return index ? kids.indexOf(idx) + 1 : 0; }
+ default:
+ break;
+ }
+
+ return -1;
+}
+
+QAccessible::Role QAccessibleItemRow::role(int child) const
+{
+ if (false) {
+#ifndef QT_NO_TREEVIEW
+ } else if (qobject_cast<const QTreeView*>(view)) {
+ if (horizontalHeader()) {
+ if (!child)
+ return Row;
+ return ColumnHeader;
+ }
+ return TreeItem;
+#endif
+#ifndef QT_NO_LISTVIEW
+ } else if (qobject_cast<const QListView*>(view)) {
+ return ListItem;
+#endif
+#ifndef QT_NO_TABLEVIEW
+ } else if (qobject_cast<const QTableView *>(view)) {
+ if (!child)
+ return Row;
+ if (child == 1) {
+ if (verticalHeader())
+ return RowHeader;
+ }
+ if (m_header)
+ return ColumnHeader;
+#endif
+ }
+ return Cell;
+}
+
+QAccessible::State QAccessibleItemRow::state(int child) const
+{
+ State st = Normal;
+
+ if (!view)
+ return st;
+
+ QAccessibleInterface *parent = 0;
+ QRect globalRect;
+ if (navigate(Ancestor, 1, &parent) == 0) {
+ globalRect = parent->rect(0);
+ delete parent;
+ }
+ if (!globalRect.intersects(rect(child)))
+ st |= Invisible;
+
+ if (!horizontalHeader()) {
+ if (!(st & Invisible)) {
+ if (child) {
+ if (QHeaderView *vheader = verticalHeader() ) {
+ if (child == 1) {
+ if (!vheader->isVisible())
+ st |= Invisible;
+ }
+ --child;
+ }
+ if (child) {
+ QModelIndex idx = childIndex(child);
+ if (!idx.isValid())
+ return st;
+
+ if (view->selectionModel()->isSelected(idx))
+ st |= Selected;
+ if (view->selectionModel()->currentIndex() == idx)
+ st |= Focused;
+ if (idx.model()->data(idx, Qt::CheckStateRole).toInt() == Qt::Checked)
+ st |= Checked;
+
+ Qt::ItemFlags flags = idx.flags();
+ if (flags & Qt::ItemIsSelectable) {
+ st |= Selectable;
+ if (view->selectionMode() == QAbstractItemView::MultiSelection)
+ st |= MultiSelectable;
+ if (view->selectionMode() == QAbstractItemView::ExtendedSelection)
+ st |= ExtSelectable;
+ }
+ }
+ } else {
+ Qt::ItemFlags flags = row.flags();
+ if (flags & Qt::ItemIsSelectable) {
+ st |= Selectable;
+ st |= Focusable;
+ }
+ if (view->selectionModel()->isRowSelected(row.row(), row.parent()))
+ st |= Selected;
+ if (view->selectionModel()->currentIndex().row() == row.row())
+ st |= Focused;
+ }
+ }
+ }
+
+ return st;
+}
+
+int QAccessibleItemRow::userActionCount(int) const
+{
+ return 0;
+}
+
+QString QAccessibleItemRow::actionText(int, Text, int) const
+{
+ return QString();
+}
+
+static QItemSelection rowAt(const QModelIndex &idx)
+{
+ return QItemSelection(idx.sibling(idx.row(), 0),
+ idx.sibling(idx.row(), idx.model()->columnCount(idx.parent())));
+}
+
+bool QAccessibleItemRow::doAction(int action, int child, const QVariantList & /*params*/)
+{
+ if (!view)
+ return false;
+
+ if (verticalHeader())
+ --child;
+
+ QModelIndex idx = child ? childIndex(child) : QModelIndex(row);
+ if (!idx.isValid())
+ return false;
+
+ QItemSelectionModel::SelectionFlags command = QItemSelectionModel::NoUpdate;
+
+ switch (action) {
+ case SetFocus:
+ view->setCurrentIndex(idx);
+ return true;
+ case ExtendSelection:
+ if (!child)
+ return false;
+ view->selectionModel()->select(QItemSelection(view->currentIndex(), idx),
+ QItemSelectionModel::SelectCurrent);
+ return true;
+ case Select:
+ command = QItemSelectionModel::ClearAndSelect;
+ break;
+ case ClearSelection:
+ command = QItemSelectionModel::Clear;
+ break;
+ case RemoveSelection:
+ command = QItemSelectionModel::Deselect;
+ break;
+ case AddToSelection:
+ command = QItemSelectionModel::SelectCurrent;
+ break;
+ }
+ if (command == QItemSelectionModel::NoUpdate)
+ return false;
+
+ if (child)
+ view->selectionModel()->select(idx, command);
+ else
+ view->selectionModel()->select(rowAt(row), command);
+ return true;
+}
+
+class ModelIndexIterator
+{
+public:
+ ModelIndexIterator(QAbstractItemView *view, const QModelIndex &start = QModelIndex()) : m_view(view)
+ {
+#ifndef QT_NO_LISTVIEW
+ list = qobject_cast<QListView*>(m_view);
+#endif
+#ifndef QT_NO_TREEVIEW
+ tree = qobject_cast<QTreeView*>(m_view);
+#endif
+#ifndef QT_NO_TABLEVIEW
+ table = qobject_cast<QTableView*>(m_view);
+#endif
+ if (start.isValid()) {
+ m_current = start;
+ } else if (m_view && m_view->model()) {
+ m_current = view->rootIndex().isValid() ?
+ view->rootIndex().child(0,0) : view->model()->index(0, 0);
+ }
+ }
+
+ bool next(int count = 1) {
+ for (int i = 0; i < count; ++i) {
+ do {
+ if (m_current.isValid()) {
+ const QAbstractItemModel *m = m_current.model();
+#ifndef QT_NO_TREEVIEW
+ if (tree && m_current.model()->hasChildren(m_current) && tree->isExpanded(m_current)) {
+ m_current = m_current.child(0, 0);
+ } else
+#endif
+ {
+ int row = m_current.row();
+ QModelIndex par = m_current.parent();
+
+ // Go up to the parent if we reach the end of the rows
+ // If m_curent becomses invalid, stop going up.
+ while (row + 1 >= m->rowCount(par)) {
+ m_current = par;
+ if (m_current.isValid()) {
+ row = m_current.row();
+ par = m_current.parent();
+ } else {
+ row = 0;
+ par = QModelIndex();
+ break;
+ }
+ }
+
+ if (m_current.isValid())
+ m_current = m_current.sibling(row + 1, 0);
+ }
+ }
+ } while (isHidden());
+ }
+ return m_current.isValid();
+ }
+
+ bool isHidden() const {
+ if (false) {
+#ifndef QT_NO_LISTVIEW
+ } else if (list) {
+ return list->isRowHidden(m_current.row());
+#endif
+#ifndef QT_NO_TREEVIEW
+ } else if (tree) {
+ return tree->isRowHidden(m_current.row(), m_current.parent());
+#endif
+#ifndef QT_NO_TABLEVIEW
+ } else if (table) {
+ return table->isRowHidden(m_current.row());
+#endif
+ }
+ return false;
+ }
+
+ QModelIndex current() const {
+ return m_current;
+ }
+
+private:
+ QModelIndex m_current;
+ QAbstractItemView *m_view;
+
+#ifndef QT_NO_TREEVIEW
+ QTreeView *tree;
+#endif
+#ifndef QT_NO_LISTVIEW
+ QListView *list;
+#endif
+#ifndef QT_NO_TABLEVIEW
+ QTableView *table;
+#endif
+};
+
+QAccessibleItemView::QAccessibleItemView(QWidget *w)
+ : QAccessibleAbstractScrollArea(w->objectName() == QLatin1String("qt_scrollarea_viewport") ? w->parentWidget() : w)
+{
+ atVP = w->objectName() == QLatin1String("qt_scrollarea_viewport");
+
+}
+
+
+QHeaderView *QAccessibleItemView::horizontalHeader() const
+{
+ QHeaderView *header = 0;
+ if (false) {
+#ifndef QT_NO_TABLEVIEW
+ } else if (const QTableView *tv = qobject_cast<const QTableView*>(itemView())) {
+ header = tv->horizontalHeader();
+#endif
+#ifndef QT_NO_TREEVIEW
+ } else if (const QTreeView *tv = qobject_cast<const QTreeView*>(itemView())) {
+ header = tv->header();
+#endif
+ }
+ return header;
+}
+
+QHeaderView *QAccessibleItemView::verticalHeader() const
+{
+ QHeaderView *header = 0;
+ if (false) {
+#ifndef QT_NO_TABLEVIEW
+ } else if (const QTableView *tv = qobject_cast<const QTableView*>(itemView())) {
+ header = tv->verticalHeader();
+#endif
+ }
+ return header;
+}
+
+
+bool QAccessibleItemView::isValidChildRole(QAccessible::Role role) const
+{
+ if (atViewport()) {
+ if (false) {
+#ifndef QT_NO_TREEVIEW
+ } else if (qobject_cast<const QTreeView*>(itemView())) {
+ return (role == TreeItem || role == Row);
+#endif
+#ifndef QT_NO_LISTVIEW
+ } else if (qobject_cast<const QListView*>(itemView())) {
+ return (role == ListItem);
+#endif
+ }
+ // TableView
+ return role == Row;
+ } else {
+ if (false) {
+#ifndef QT_NO_TREEVIEW
+ } else if (qobject_cast<const QTreeView*>(itemView())) {
+ return (role == Tree);
+#endif
+#ifndef QT_NO_LISTVIEW
+ } else if (qobject_cast<const QListView*>(itemView())) {
+ return (role == List);
+#endif
+ }
+ // TableView
+ return (role == Table);
+ }
+}
+
+QObject *QAccessibleItemView::object() const
+{
+ QObject *view = QAccessibleAbstractScrollArea::object();
+ Q_ASSERT(qobject_cast<const QAbstractItemView *>(view));
+ if (atViewport())
+ view = qobject_cast<const QAbstractItemView *>(view)->viewport();
+ return view;
+}
+
+QAbstractItemView *QAccessibleItemView::itemView() const
+{
+ return qobject_cast<QAbstractItemView *>(QAccessibleAbstractScrollArea::object());
+}
+
+int QAccessibleItemView::indexOfChild(const QAccessibleInterface *iface) const
+{
+ if (atViewport()) {
+ if (!iface || !isValidChildRole(iface->role(0)))
+ return -1;
+
+ int entry = -1;
+ // ### This will fail if a row is hidden.
+ const QAccessibleItemRow *ifRow = static_cast<const QAccessibleItemRow *>(iface);
+ if (ifRow->horizontalHeader())
+ return 1;
+
+ QModelIndex idx = ifRow->row;
+ if (!idx.isValid())
+ return -1;
+
+ entry = entryFromIndex(idx);
+ if (horizontalHeader())
+ ++entry;
+
+ return entry;
+
+ } else {
+ return QAccessibleAbstractScrollArea::indexOfChild(iface);
+ }
+}
+
+QModelIndex QAccessibleItemView::childIndex(int child) const
+{
+ if (!atViewport())
+ return QModelIndex();
+ ModelIndexIterator it(itemView());
+ it.next(child - 1);
+ return it.current();
+}
+
+int QAccessibleItemView::entryFromIndex(const QModelIndex &index) const
+{
+ int entry = -1;
+ if (false) {
+#ifndef QT_NO_TREEVIEW
+ } else if (QTreeView *tree = qobject_cast<QTreeView*>(itemView())) {
+ entry = tree->visualIndex(index) + 1;
+#endif
+#ifndef QT_NO_LISTVIEW
+ } else if (QListView *list = qobject_cast<QListView*>(itemView())) {
+ entry = list->visualIndex(index) + 1;
+#endif
+#ifndef QT_NO_TABLEVIEW
+ } else if (QTableView *table = qobject_cast<QTableView*>(itemView())) {
+ entry = table->visualIndex(index) + 1;
+#endif
+ }
+ return entry;
+}
+
+int QAccessibleItemView::childCount() const
+{
+ if (atViewport()) {
+ if (itemView()->model() == 0)
+ return 0;
+ QAbstractItemModel *m = itemView()->model();
+ QModelIndex idx = m->index(0,0);
+ if (!idx.isValid())
+ return 0;
+ ModelIndexIterator it(itemView());
+ int count = 1;
+ while (it.next()) {
+ ++count;
+ }
+ if (horizontalHeader())
+ ++count;
+
+ return count;
+ } else {
+ return QAccessibleAbstractScrollArea::childCount();
+ }
+}
+
+QString QAccessibleItemView::text(Text t, int child) const
+{
+ if (atViewport()) {
+ if (!child)
+ return QAccessibleAbstractScrollArea::text(t, child);
+
+ QAccessibleItemRow item(itemView(), childIndex(child));
+ return item.text(t, 1);
+ } else {
+ return QAccessibleAbstractScrollArea::text(t, child);
+ }
+}
+
+void QAccessibleItemView::setText(Text t, int child, const QString &text)
+{
+ if (atViewport()) {
+ if (!child) {
+ QAccessibleAbstractScrollArea::setText(t, child, text);
+ return;
+ }
+
+ QAccessibleItemRow item(itemView(), childIndex(child));
+ item.setText(t, 1, text);
+ } else {
+ QAccessibleAbstractScrollArea::setText(t, child, text);
+ }
+}
+
+QRect QAccessibleItemView::rect(int child) const
+{
+ if (atViewport()) {
+ QRect r;
+ if (!child) {
+ // Make sure that the rect *include* the vertical and horizontal headers, while
+ // not including the potential vertical and horizontal scrollbars.
+ QAbstractItemView *w = itemView();
+
+ int vscrollWidth = 0;
+ const QScrollBar *sb = w->verticalScrollBar();
+ if (sb && sb->isVisible())
+ vscrollWidth = sb->width();
+
+ int hscrollHeight = 0;
+ sb = w->horizontalScrollBar();
+ if (sb && sb->isVisible())
+ hscrollHeight = sb->height();
+
+ QPoint globalPos = w->mapToGlobal(QPoint(0,0));
+ r = w->rect().translated(globalPos);
+ if (w->isRightToLeft()) {
+ r.adjust(vscrollWidth, 0, 0, -hscrollHeight);
+ } else {
+ r.adjust(0, 0, -vscrollWidth, -hscrollHeight);
+ }
+ } else {
+ QAccessibleInterface *iface = 0;
+ if (navigate(Child, child, &iface) == 0) {
+ r = iface->rect(0);
+ delete iface;
+ }
+ }
+ return r;
+ } else {
+ QRect r = QAccessibleAbstractScrollArea::rect(child);
+ if (child == 1) {
+ // include the potential vertical and horizontal headers
+
+ const QHeaderView *header = verticalHeader();
+ int headerWidth = (header && header->isVisible()) ? header->width() : 0;
+ header = horizontalHeader();
+ int headerHeight= (header && header->isVisible()) ? header->height() : 0;
+ if (itemView()->isRightToLeft()) {
+ r.adjust(0, -headerHeight, headerWidth, 0);
+ } else {
+ r.adjust(-headerWidth, -headerHeight, 0, 0);
+ }
+ }
+ return r;
+ }
+}
+
+int QAccessibleItemView::childAt(int x, int y) const
+{
+ if (atViewport()) {
+ QPoint p(x, y);
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(p))
+ return i;
+ }
+ return -1;
+ } else {
+ return QAccessibleAbstractScrollArea::childAt(x, y);
+ }
+}
+
+QAccessible::Role QAccessibleItemView::role(int child) const
+{
+ if ((!atViewport() && child) || (atViewport() && child == 0)) {
+ QAbstractItemView *view = itemView();
+#ifndef QT_NO_TABLEVIEW
+ if (qobject_cast<QTableView *>(view))
+ return Table;
+#endif
+#ifndef QT_NO_LISTVIEW
+ if (qobject_cast<QListView *>(view))
+ return List;
+#endif
+ return Tree;
+ }
+ if (atViewport()) {
+ if (child)
+ return Row;
+ }
+
+ return QAccessibleAbstractScrollArea::role(child);
+}
+
+QAccessible::State QAccessibleItemView::state(int child) const
+{
+ State st = Normal;
+
+ if (itemView() == 0)
+ return State(Unavailable);
+
+ bool queryViewPort = (atViewport() && child == 0) || (!atViewport() && child == 1);
+ if (queryViewPort) {
+ if (itemView()->selectionMode() != QAbstractItemView::NoSelection) {
+ st |= Selectable;
+ st |= Focusable;
+ }
+ } else if (atViewport()) { // children of viewport
+ if (horizontalHeader())
+ --child;
+ if (child) {
+ QAccessibleItemRow item(itemView(), childIndex(child));
+ st |= item.state(0);
+ }
+ } else if (!atViewport() && child != 1) {
+ st = QAccessibleAbstractScrollArea::state(child);
+ }
+ return st;
+}
+
+bool QAccessibleItemView::isValid() const
+{
+ if (atViewport())
+ return QAccessibleWidgetEx::isValid();
+ else
+ return QAccessibleAbstractScrollArea::isValid();
+}
+
+int QAccessibleItemView::navigate(RelationFlag relation, int index,
+ QAccessibleInterface **iface) const
+{
+ if (atViewport()) {
+ if (relation == Ancestor && index == 1) {
+ *iface = new QAccessibleItemView(itemView());
+ return 0;
+ } else if (relation == Child && index >= 1) {
+ if (horizontalHeader()) {
+ if (index == 1) {
+ *iface = new QAccessibleItemRow(itemView(), QModelIndex(), true);
+ return 0;
+ }
+ --index;
+ }
+
+ //###JAS hidden rows..
+ QModelIndex idx = childIndex(index);
+ if (idx.isValid()) {
+ *iface = new QAccessibleItemRow(itemView(), idx);
+ return 0;
+ }
+ } else if (relation == Sibling && index >= 1) {
+ QAccessibleInterface *parent = new QAccessibleItemView(itemView());
+ return parent->navigate(Child, index, iface);
+ }
+ *iface = 0;
+ return -1;
+ } else {
+ return QAccessibleAbstractScrollArea::navigate(relation, index, iface);
+ }
+}
+
+/* returns the model index for a given row and column */
+QModelIndex QAccessibleItemView::index(int row, int column) const
+{
+ return itemView()->model()->index(row, column);
+}
+
+QAccessibleInterface *QAccessibleItemView::accessibleAt(int row, int column)
+{
+ QWidget *indexWidget = itemView()->indexWidget(index(row, column));
+ return QAccessible::queryAccessibleInterface(indexWidget);
+}
+
+/* We don't have a concept of a "caption" in Qt's standard widgets */
+QAccessibleInterface *QAccessibleItemView::caption()
+{
+ return 0;
+}
+
+/* childIndex is row * columnCount + columnIndex */
+int QAccessibleItemView::childIndex(int rowIndex, int columnIndex)
+{
+ return rowIndex * itemView()->model()->columnCount() + columnIndex;
+}
+
+/* Return the header data as column description */
+QString QAccessibleItemView::columnDescription(int column)
+{
+ return itemView()->model()->headerData(column, Qt::Horizontal).toString();
+}
+
+/* We don't support column spanning atm */
+int QAccessibleItemView::columnSpan(int /* row */, int /* column */)
+{
+ return 1;
+}
+
+/* Return the horizontal header view */
+QAccessibleInterface *QAccessibleItemView::columnHeader()
+{
+#ifndef QT_NO_TREEVIEW
+ if (QTreeView *tree = qobject_cast<QTreeView *>(itemView()))
+ return QAccessible::queryAccessibleInterface(tree->header());
+#endif
+#ifndef QT_NO_TABLEVIEW
+ if (QTableView *table = qobject_cast<QTableView *>(itemView()))
+ return QAccessible::queryAccessibleInterface(table->horizontalHeader());
+#endif
+ return 0;
+}
+
+int QAccessibleItemView::columnIndex(int childIndex)
+{
+ int columnCount = itemView()->model()->columnCount();
+ if (!columnCount)
+ return 0;
+
+ return childIndex % columnCount;
+}
+
+int QAccessibleItemView::columnCount()
+{
+ return itemView()->model()->columnCount();
+}
+
+int QAccessibleItemView::rowCount()
+{
+ return itemView()->model()->rowCount();
+}
+
+int QAccessibleItemView::selectedColumnCount()
+{
+ return itemView()->selectionModel()->selectedColumns().count();
+}
+
+int QAccessibleItemView::selectedRowCount()
+{
+ return itemView()->selectionModel()->selectedRows().count();
+}
+
+QString QAccessibleItemView::rowDescription(int row)
+{
+ return itemView()->model()->headerData(row, Qt::Vertical).toString();
+}
+
+/* We don't support row spanning */
+int QAccessibleItemView::rowSpan(int /*row*/, int /*column*/)
+{
+ return 1;
+}
+
+QAccessibleInterface *QAccessibleItemView::rowHeader()
+{
+#ifndef QT_NO_TABLEVIEW
+ if (QTableView *table = qobject_cast<QTableView *>(itemView()))
+ return QAccessible::queryAccessibleInterface(table->verticalHeader());
+#endif
+ return 0;
+}
+
+int QAccessibleItemView::rowIndex(int childIndex)
+{
+ int columnCount = itemView()->model()->columnCount();
+ if (!columnCount)
+ return 0;
+
+ return int(childIndex / columnCount);
+}
+
+int QAccessibleItemView::selectedRows(int maxRows, QList<int> *rows)
+{
+ Q_ASSERT(rows);
+
+ const QModelIndexList selRows = itemView()->selectionModel()->selectedRows();
+ int maxCount = qMin(selRows.count(), maxRows);
+
+ for (int i = 0; i < maxCount; ++i)
+ rows->append(selRows.at(i).row());
+
+ return maxCount;
+}
+
+int QAccessibleItemView::selectedColumns(int maxColumns, QList<int> *columns)
+{
+ Q_ASSERT(columns);
+
+ const QModelIndexList selColumns = itemView()->selectionModel()->selectedColumns();
+ int maxCount = qMin(selColumns.count(), maxColumns);
+
+ for (int i = 0; i < maxCount; ++i)
+ columns->append(selColumns.at(i).row());
+
+ return maxCount;
+}
+
+/* Qt widgets don't have a concept of a summary */
+QAccessibleInterface *QAccessibleItemView::summary()
+{
+ return 0;
+}
+
+bool QAccessibleItemView::isColumnSelected(int column)
+{
+ return itemView()->selectionModel()->isColumnSelected(column, QModelIndex());
+}
+
+bool QAccessibleItemView::isRowSelected(int row)
+{
+ return itemView()->selectionModel()->isRowSelected(row, QModelIndex());
+}
+
+bool QAccessibleItemView::isSelected(int row, int column)
+{
+ return itemView()->selectionModel()->isSelected(index(row, column));
+}
+
+void QAccessibleItemView::selectRow(int row)
+{
+ QItemSelectionModel *s = itemView()->selectionModel();
+ s->select(index(row, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows);
+}
+
+void QAccessibleItemView::selectColumn(int column)
+{
+ QItemSelectionModel *s = itemView()->selectionModel();
+ s->select(index(0, column), QItemSelectionModel::Select | QItemSelectionModel::Columns);
+}
+
+void QAccessibleItemView::unselectRow(int row)
+{
+ QItemSelectionModel *s = itemView()->selectionModel();
+ s->select(index(row, 0), QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
+}
+
+void QAccessibleItemView::unselectColumn(int column)
+{
+ QItemSelectionModel *s = itemView()->selectionModel();
+ s->select(index(0, column), QItemSelectionModel::Deselect | QItemSelectionModel::Columns);
+}
+
+void QAccessibleItemView::cellAtIndex(int index, int *row, int *column, int *rSpan,
+ int *cSpan, bool *isSelect)
+{
+ *row = rowIndex(index);
+ *column = columnIndex(index);
+ *rSpan = rowSpan(*row, *column);
+ *cSpan = columnSpan(*row, *column);
+ *isSelect = isSelected(*row, *column);
+}
+
+/*!
+ \class QAccessibleHeader
+ \brief The QAccessibleHeader class implements the QAccessibleInterface for header widgets.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ Constructs a QAccessibleHeader object for \a w.
+*/
+QAccessibleHeader::QAccessibleHeader(QWidget *w)
+: QAccessibleWidgetEx(w)
+{
+ Q_ASSERT(header());
+ addControllingSignal(QLatin1String("sectionClicked(int)"));
+}
+
+/*! Returns the QHeaderView. */
+QHeaderView *QAccessibleHeader::header() const
+{
+ return qobject_cast<QHeaderView*>(object());
+}
+
+/*! \reimp */
+QRect QAccessibleHeader::rect(int child) const
+{
+ if (!child)
+ return QAccessibleWidgetEx::rect(0);
+
+ QHeaderView *h = header();
+ QPoint zero = h->mapToGlobal(QPoint(0, 0));
+ int sectionSize = h->sectionSize(child - 1);
+ int sectionPos = h->sectionPosition(child - 1);
+ return h->orientation() == Qt::Horizontal
+ ? QRect(zero.x() + sectionPos, zero.y(), sectionSize, h->height())
+ : QRect(zero.x(), zero.y() + sectionPos, h->width(), sectionSize);
+}
+
+/*! \reimp */
+int QAccessibleHeader::childCount() const
+{
+ return header()->count();
+}
+
+/*! \reimp */
+QString QAccessibleHeader::text(Text t, int child) const
+{
+ QString str;
+
+ if (child > 0 && child <= childCount()) {
+ switch (t) {
+ case Name:
+ str = header()->model()->headerData(child - 1, header()->orientation()).toString();
+ break;
+ case Description: {
+ QAccessibleEvent event(QEvent::AccessibilityDescription, child);
+ if (QApplication::sendEvent(widget(), &event))
+ str = event.value();
+ break; }
+ case Help: {
+ QAccessibleEvent event(QEvent::AccessibilityHelp, child);
+ if (QApplication::sendEvent(widget(), &event))
+ str = event.value();
+ break; }
+ default:
+ break;
+ }
+ }
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, child);
+ return str;
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleHeader::role(int) const
+{
+ return (header()->orientation() == Qt::Horizontal) ? ColumnHeader : RowHeader;
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleHeader::state(int child) const
+{
+ State state = QAccessibleWidgetEx::state(child);
+
+ if (child) {
+ int section = child - 1;
+ if (header()->isSectionHidden(section))
+ state |= Invisible;
+ if (header()->resizeMode(section) != QHeaderView::Custom)
+ state |= Sizeable;
+ } else {
+ if (header()->isMovable())
+ state |= Movable;
+ }
+ if (!header()->isClickable())
+ state |= Unavailable;
+ return state;
+}
+#endif // QT_NO_ITEMVIEWS
+
+#ifndef QT_NO_TABBAR
+/*!
+ \class QAccessibleTabBar
+ \brief The QAccessibleTabBar class implements the QAccessibleInterface for tab bars.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ Constructs a QAccessibleTabBar object for \a w.
+*/
+QAccessibleTabBar::QAccessibleTabBar(QWidget *w)
+: QAccessibleWidgetEx(w)
+{
+ Q_ASSERT(tabBar());
+}
+
+/*! Returns the QTabBar. */
+QTabBar *QAccessibleTabBar::tabBar() const
+{
+ return qobject_cast<QTabBar*>(object());
+}
+
+QAbstractButton *QAccessibleTabBar::button(int child) const
+{
+ if (child <= tabBar()->count())
+ return 0;
+ QTabBarPrivate * const tabBarPrivate = tabBar()->d_func();
+ if (child - tabBar()->count() == 1)
+ return tabBarPrivate->leftB;
+ if (child - tabBar()->count() == 2)
+ return tabBarPrivate->rightB;
+ Q_ASSERT(false);
+ return 0;
+}
+
+/*! \reimp */
+QRect QAccessibleTabBar::rect(int child) const
+{
+ if (!child || !tabBar()->isVisible())
+ return QAccessibleWidgetEx::rect(0);
+
+ QPoint tp = tabBar()->mapToGlobal(QPoint(0,0));
+ QRect rec;
+ if (child <= tabBar()->count()) {
+ rec = tabBar()->tabRect(child - 1);
+ } else {
+ QWidget *widget = button(child);
+ rec = widget ? widget->geometry() : QRect();
+ }
+ return QRect(tp.x() + rec.x(), tp.y() + rec.y(), rec.width(), rec.height());
+}
+
+/*! \reimp */
+int QAccessibleTabBar::childCount() const
+{
+ // tabs + scroll buttons
+ return tabBar()->count() + 2;
+}
+
+/*! \reimp */
+QString QAccessibleTabBar::text(Text t, int child) const
+{
+ QString str;
+
+ if (child > tabBar()->count()) {
+ bool left = child - tabBar()->count() == 1;
+ switch (t) {
+ case Name:
+ return left ? QTabBar::tr("Scroll Left") : QTabBar::tr("Scroll Right");
+ default:
+ break;
+ }
+ } else {
+ switch (t) {
+ case Name:
+ if (child > 0)
+ return qt_accStripAmp(tabBar()->tabText(child - 1));
+ else if (tabBar()->currentIndex() != -1)
+ return qt_accStripAmp(tabBar()->tabText(tabBar()->currentIndex()));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, child);;
+ return str;
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleTabBar::role(int child) const
+{
+ if (!child)
+ return PageTabList;
+ if (child > tabBar()->count())
+ return PushButton;
+ return PageTab;
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleTabBar::state(int child) const
+{
+ State st = QAccessibleWidgetEx::state(0);
+
+ if (!child)
+ return st;
+
+ QTabBar *tb = tabBar();
+
+ if (child > tb->count()) {
+ QWidget *bt = button(child);
+ if (!bt)
+ return st;
+ if (bt->isEnabled() == false)
+ st |= Unavailable;
+ if (bt->isVisible() == false)
+ st |= Invisible;
+ if (bt->focusPolicy() != Qt::NoFocus && bt->isActiveWindow())
+ st |= Focusable;
+ if (bt->hasFocus())
+ st |= Focused;
+ return st;
+ }
+
+ if (!tb->isTabEnabled(child - 1))
+ st |= Unavailable;
+ else
+ st |= Selectable;
+
+ if (!tb->currentIndex() == child - 1)
+ st |= Selected;
+
+ return st;
+}
+
+/*! \reimp */
+bool QAccessibleTabBar::doAction(int action, int child, const QVariantList &)
+{
+ if (!child)
+ return false;
+
+ if (action != QAccessible::DefaultAction && action != QAccessible::Press)
+ return false;
+
+ if (child > tabBar()->count()) {
+ QAbstractButton *bt = button(child);
+ if (!bt->isEnabled())
+ return false;
+ bt->animateClick();
+ return true;
+ }
+ if (!tabBar()->isTabEnabled(child - 1))
+ return false;
+ tabBar()->setCurrentIndex(child - 1);
+ return true;
+}
+
+/*!
+ Selects the item with index \a child if \a on is true; otherwise
+ unselects it. If \a extend is true and the selection mode is not
+ \c Single and there is an existing selection, the selection is
+ extended to include all the items from the existing selection up
+ to and including the item with index \a child. Returns true if a
+ selection was made or extended; otherwise returns false.
+
+ \sa selection() clearSelection()
+*/
+bool QAccessibleTabBar::setSelected(int child, bool on, bool extend)
+{
+ if (!child || !on || extend || child > tabBar()->count())
+ return false;
+
+ if (!tabBar()->isTabEnabled(child - 1))
+ return false;
+ tabBar()->setCurrentIndex(child - 1);
+ return true;
+}
+
+/*!
+ Returns a (possibly empty) list of indexes of the items selected
+ in the list box.
+
+ \sa setSelected() clearSelection()
+*/
+QVector<int> QAccessibleTabBar::selection() const
+{
+ QVector<int> array;
+ if (tabBar()->currentIndex() != -1)
+ array +=tabBar()->currentIndex() + 1;
+ return array;
+}
+
+#endif // QT_NO_TABBAR
+
+#ifndef QT_NO_COMBOBOX
+/*!
+ \class QAccessibleComboBox
+ \brief The QAccessibleComboBox class implements the QAccessibleInterface for editable and read-only combo boxes.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ \enum QAccessibleComboBox::ComboBoxElements
+
+ \internal
+
+ \value ComboBoxSelf
+ \value CurrentText
+ \value OpenList
+ \value PopupList
+*/
+
+/*!
+ Constructs a QAccessibleComboBox object for \a w.
+*/
+QAccessibleComboBox::QAccessibleComboBox(QWidget *w)
+: QAccessibleWidgetEx(w, ComboBox)
+{
+ Q_ASSERT(comboBox());
+}
+
+/*!
+ Returns the combobox.
+*/
+QComboBox *QAccessibleComboBox::comboBox() const
+{
+ return qobject_cast<QComboBox*>(object());
+}
+
+/*! \reimp */
+QRect QAccessibleComboBox::rect(int child) const
+{
+ QPoint tp;
+ QStyle::SubControl sc;
+ QRect r;
+ switch (child) {
+ case CurrentText:
+ if (comboBox()->isEditable()) {
+ tp = comboBox()->lineEdit()->mapToGlobal(QPoint(0,0));
+ r = comboBox()->lineEdit()->rect();
+ sc = QStyle::SC_None;
+ } else {
+ tp = comboBox()->mapToGlobal(QPoint(0,0));
+ sc = QStyle::SC_ComboBoxEditField;
+ }
+ break;
+ case OpenList:
+ tp = comboBox()->mapToGlobal(QPoint(0,0));
+ sc = QStyle::SC_ComboBoxArrow;
+ break;
+ default:
+ return QAccessibleWidgetEx::rect(child);
+ }
+
+ if (sc != QStyle::SC_None) {
+ QStyleOptionComboBox option;
+ option.initFrom(comboBox());
+ r = comboBox()->style()->subControlRect(QStyle::CC_ComboBox, &option, sc, comboBox());
+ }
+ return QRect(tp.x() + r.x(), tp.y() + r.y(), r.width(), r.height());
+}
+
+/*! \reimp */
+int QAccessibleComboBox::navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ if (entry > ComboBoxSelf) switch (rel) {
+ case Child:
+ if (entry < PopupList)
+ return entry;
+ if (entry == PopupList) {
+ QAbstractItemView *view = comboBox()->view();
+ QWidget *parent = view ? view->parentWidget() : 0;
+ *target = QAccessible::queryAccessibleInterface(parent);
+ return *target ? 0 : -1;
+ }
+ case QAccessible::Left:
+ return entry == OpenList ? CurrentText : -1;
+ case QAccessible::Right:
+ return entry == CurrentText ? OpenList : -1;
+ case QAccessible::Up:
+ return -1;
+ case QAccessible::Down:
+ return -1;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::navigate(rel, entry, target);
+}
+
+/*! \reimp */
+int QAccessibleComboBox::childCount() const
+{
+ return comboBox()->view() ? PopupList : OpenList;
+}
+
+/*! \reimp */
+int QAccessibleComboBox::childAt(int x, int y) const
+{
+ if (!comboBox()->isVisible())
+ return -1;
+ QPoint gp = widget()->mapToGlobal(QPoint(0, 0));
+ if (!QRect(gp.x(), gp.y(), widget()->width(), widget()->height()).contains(x, y))
+ return -1;
+
+ // a complex control
+ for (int i = 1; i < PopupList; ++i) {
+ if (rect(i).contains(x, y))
+ return i;
+ }
+ return 0;
+}
+
+/*! \reimp */
+int QAccessibleComboBox::indexOfChild(const QAccessibleInterface *child) const
+{
+ QObject *viewParent = comboBox()->view() ? comboBox()->view()->parentWidget() : 0;
+ if (child->object() == viewParent)
+ return PopupList;
+ return -1;
+}
+
+/*! \reimp */
+QString QAccessibleComboBox::text(Text t, int child) const
+{
+ QString str;
+
+ switch (t) {
+ case Name:
+ if (child == OpenList)
+ str = QComboBox::tr("Open");
+ else
+ str = QAccessibleWidgetEx::text(t, 0);
+ break;
+#ifndef QT_NO_SHORTCUT
+ case Accelerator:
+ if (child == OpenList)
+ str = (QString)QKeySequence(Qt::Key_Down);
+ // missing break?
+#endif
+ case Value:
+ if (comboBox()->isEditable())
+ str = comboBox()->lineEdit()->text();
+ else
+ str = comboBox()->currentText();
+ break;
+ default:
+ break;
+ }
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, 0);
+ return str;
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleComboBox::role(int child) const
+{
+ switch (child) {
+ case CurrentText:
+ if (comboBox()->isEditable())
+ return EditableText;
+ return StaticText;
+ case OpenList:
+ return PushButton;
+ case PopupList:
+ return List;
+ default:
+ return ComboBox;
+ }
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleComboBox::state(int /*child*/) const
+{
+ return QAccessibleWidgetEx::state(0);
+}
+
+/*! \reimp */
+bool QAccessibleComboBox::doAction(int action, int child, const QVariantList &)
+{
+ if (child == 2 && (action == DefaultAction || action == Press)) {
+ if (comboBox()->view()->isVisible()) {
+ comboBox()->hidePopup();
+ } else {
+ comboBox()->showPopup();
+ }
+ return true;
+ }
+ return false;
+}
+
+QString QAccessibleComboBox::actionText(int action, Text t, int child) const
+{
+ QString text;
+ if (child == 2 && t == Name && (action == DefaultAction || action == Press))
+ text = comboBox()->view()->isVisible() ? QComboBox::tr("Close") : QComboBox::tr("Open");
+ return text;
+}
+#endif // QT_NO_COMBOBOX
+
+static inline void removeInvisibleWidgetsFromList(QWidgetList *list)
+{
+ if (!list || list->isEmpty())
+ return;
+
+ for (int i = 0; i < list->count(); ++i) {
+ QWidget *widget = list->at(i);
+ if (!widget->isVisible())
+ list->removeAt(i);
+ }
+}
+
+#ifndef QT_NO_SCROLLAREA
+// ======================= QAccessibleAbstractScrollArea =======================
+QAccessibleAbstractScrollArea::QAccessibleAbstractScrollArea(QWidget *widget)
+ : QAccessibleWidgetEx(widget, Client)
+{
+ Q_ASSERT(qobject_cast<QAbstractScrollArea *>(widget));
+}
+
+QString QAccessibleAbstractScrollArea::text(Text textType, int child) const
+{
+ if (child == Self)
+ return QAccessibleWidgetEx::text(textType, 0);
+ QWidgetList children = accessibleChildren();
+ if (child < 1 || child > children.count())
+ return QString();
+ QAccessibleInterface *childInterface = queryAccessibleInterface(children.at(child - 1));
+ if (!childInterface)
+ return QString();
+ QString string = childInterface->text(textType, 0);
+ delete childInterface;
+ return string;
+}
+
+void QAccessibleAbstractScrollArea::setText(Text textType, int child, const QString &text)
+{
+ if (text.isEmpty())
+ return;
+ if (child == 0) {
+ QAccessibleWidgetEx::setText(textType, 0, text);
+ return;
+ }
+ QWidgetList children = accessibleChildren();
+ if (child < 1 || child > children.count())
+ return;
+ QAccessibleInterface *childInterface = queryAccessibleInterface(children.at(child - 1));
+ if (!childInterface)
+ return;
+ childInterface->setText(textType, 0, text);
+ delete childInterface;
+}
+
+QAccessible::State QAccessibleAbstractScrollArea::state(int child) const
+{
+ if (child == Self)
+ return QAccessibleWidgetEx::state(child);
+ QWidgetList children = accessibleChildren();
+ if (child < 1 || child > children.count())
+ return QAccessibleWidgetEx::state(Self);
+ QAccessibleInterface *childInterface = queryAccessibleInterface(children.at(child - 1));
+ if (!childInterface)
+ return QAccessibleWidgetEx::state(Self);
+ QAccessible::State returnState = childInterface->state(0);
+ delete childInterface;
+ return returnState;
+}
+
+QVariant QAccessibleAbstractScrollArea::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+int QAccessibleAbstractScrollArea::childCount() const
+{
+ return accessibleChildren().count();
+}
+
+int QAccessibleAbstractScrollArea::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (!child || !child->object())
+ return -1;
+ int index = accessibleChildren().indexOf(qobject_cast<QWidget *>(child->object()));
+ if (index >= 0)
+ return ++index;
+ return -1;
+}
+
+bool QAccessibleAbstractScrollArea::isValid() const
+{
+ return (QAccessibleWidgetEx::isValid() && abstractScrollArea() && abstractScrollArea()->viewport());
+}
+
+int QAccessibleAbstractScrollArea::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ if (!target)
+ return -1;
+
+ *target = 0;
+
+ QWidget *targetWidget = 0;
+ QWidget *entryWidget = 0;
+
+ if (relation == Child ||
+ relation == Left || relation == Up || relation == Right || relation == Down) {
+ QWidgetList children = accessibleChildren();
+ if (entry < 0 || entry > children.count())
+ return -1;
+
+ if (entry == Self)
+ entryWidget = abstractScrollArea();
+ else
+ entryWidget = children.at(entry - 1);
+ AbstractScrollAreaElement entryElement = elementType(entryWidget);
+
+ // Not one of the most beautiful switches I've ever seen, but I believe it has
+ // to be like this since each case need special handling.
+ // It might be possible to make it more general, but I'll leave that as an exercise
+ // to the reader. :-)
+ switch (relation) {
+ case Child:
+ if (entry > 0)
+ targetWidget = children.at(entry - 1);
+ break;
+ case Left:
+ if (entry < 1)
+ break;
+ switch (entryElement) {
+ case Viewport:
+ if (!isLeftToRight())
+ targetWidget = abstractScrollArea()->verticalScrollBar();
+ break;
+ case HorizontalContainer:
+ if (!isLeftToRight())
+ targetWidget = abstractScrollArea()->cornerWidget();
+ break;
+ case VerticalContainer:
+ if (isLeftToRight())
+ targetWidget = abstractScrollArea()->viewport();
+ break;
+ case CornerWidget:
+ if (isLeftToRight())
+ targetWidget = abstractScrollArea()->horizontalScrollBar();
+ break;
+ default:
+ break;
+ }
+ break;
+ case Right:
+ if (entry < 1)
+ break;
+ switch (entryElement) {
+ case Viewport:
+ if (isLeftToRight())
+ targetWidget = abstractScrollArea()->verticalScrollBar();
+ break;
+ case HorizontalContainer:
+ targetWidget = abstractScrollArea()->cornerWidget();
+ break;
+ case VerticalContainer:
+ if (!isLeftToRight())
+ targetWidget = abstractScrollArea()->viewport();
+ break;
+ case CornerWidget:
+ if (!isLeftToRight())
+ targetWidget = abstractScrollArea()->horizontalScrollBar();
+ break;
+ default:
+ break;
+ }
+ break;
+ case Up:
+ if (entry < 1)
+ break;
+ switch (entryElement) {
+ case HorizontalContainer:
+ targetWidget = abstractScrollArea()->viewport();
+ break;
+ case CornerWidget:
+ targetWidget = abstractScrollArea()->verticalScrollBar();
+ break;
+ default:
+ break;
+ }
+ break;
+ case Down:
+ if (entry < 1)
+ break;
+ switch (entryElement) {
+ case Viewport:
+ targetWidget = abstractScrollArea()->horizontalScrollBar();
+ break;
+ case VerticalContainer:
+ targetWidget = abstractScrollArea()->cornerWidget();
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+
+ if (qobject_cast<const QScrollBar *>(targetWidget))
+ targetWidget = targetWidget->parentWidget();
+ *target = QAccessible::queryAccessibleInterface(targetWidget);
+ return *target ? 0: -1;
+}
+
+QRect QAccessibleAbstractScrollArea::rect(int child) const
+{
+ if (!abstractScrollArea()->isVisible())
+ return QRect();
+ if (child == Self)
+ return QAccessibleWidgetEx::rect(child);
+ QWidgetList children = accessibleChildren();
+ if (child < 1 || child > children.count())
+ return QRect();
+ const QWidget *childWidget = children.at(child - 1);
+ if (!childWidget->isVisible())
+ return QRect();
+ return QRect(childWidget->mapToGlobal(QPoint(0, 0)), childWidget->size());
+}
+
+int QAccessibleAbstractScrollArea::childAt(int x, int y) const
+{
+ if (!abstractScrollArea()->isVisible())
+ return -1;
+#if 0
+ const QRect globalSelfGeometry = rect(Self);
+ if (!globalSelfGeometry.isValid() || !globalSelfGeometry.contains(QPoint(x, y)))
+ return -1;
+ const QWidgetList children = accessibleChildren();
+ for (int i = 0; i < children.count(); ++i) {
+ const QWidget *child = children.at(i);
+ const QRect globalChildGeometry = QRect(child->mapToGlobal(QPoint(0, 0)), child->size());
+ if (globalChildGeometry.contains(QPoint(x, y))) {
+ return ++i;
+ }
+ }
+ return 0;
+#else
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(x, y))
+ return i;
+ }
+ return -1;
+#endif
+}
+
+QAbstractScrollArea *QAccessibleAbstractScrollArea::abstractScrollArea() const
+{
+ return static_cast<QAbstractScrollArea *>(object());
+}
+
+QWidgetList QAccessibleAbstractScrollArea::accessibleChildren() const
+{
+ QWidgetList children;
+
+ // Viewport.
+ QWidget * viewport = abstractScrollArea()->viewport();
+ if (viewport)
+ children.append(viewport);
+
+ // Horizontal scrollBar container.
+ QScrollBar *horizontalScrollBar = abstractScrollArea()->horizontalScrollBar();
+ if (horizontalScrollBar && horizontalScrollBar->isVisible()) {
+ children.append(horizontalScrollBar->parentWidget());
+ }
+
+ // Vertical scrollBar container.
+ QScrollBar *verticalScrollBar = abstractScrollArea()->verticalScrollBar();
+ if (verticalScrollBar && verticalScrollBar->isVisible()) {
+ children.append(verticalScrollBar->parentWidget());
+ }
+
+ // CornerWidget.
+ QWidget *cornerWidget = abstractScrollArea()->cornerWidget();
+ if (cornerWidget && cornerWidget->isVisible())
+ children.append(cornerWidget);
+
+ return children;
+}
+
+QAccessibleAbstractScrollArea::AbstractScrollAreaElement
+QAccessibleAbstractScrollArea::elementType(QWidget *widget) const
+{
+ if (!widget)
+ return Undefined;
+
+ if (widget == abstractScrollArea())
+ return Self;
+ if (widget == abstractScrollArea()->viewport())
+ return Viewport;
+ if (widget->objectName() == QLatin1String("qt_scrollarea_hcontainer"))
+ return HorizontalContainer;
+ if (widget->objectName() == QLatin1String("qt_scrollarea_vcontainer"))
+ return VerticalContainer;
+ if (widget == abstractScrollArea()->cornerWidget())
+ return CornerWidget;
+
+ return Undefined;
+}
+
+bool QAccessibleAbstractScrollArea::isLeftToRight() const
+{
+ return abstractScrollArea()->isLeftToRight();
+}
+
+// ======================= QAccessibleScrollArea ===========================
+QAccessibleScrollArea::QAccessibleScrollArea(QWidget *widget)
+ : QAccessibleAbstractScrollArea(widget)
+{
+ Q_ASSERT(qobject_cast<QScrollArea *>(widget));
+}
+#endif // QT_NO_SCROLLAREA
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/widgets/complexwidgets.h b/src/plugins/accessible/widgets/complexwidgets.h
new file mode 100644
index 0000000000..b5ba13941d
--- /dev/null
+++ b/src/plugins/accessible/widgets/complexwidgets.h
@@ -0,0 +1,293 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef COMPLEXWIDGETS_H
+#define COMPLEXWIDGETS_H
+
+#include <QtCore/qpointer.h>
+#include <QtGui/qaccessiblewidget.h>
+#include <QtGui/qabstractitemview.h>
+#include <QtGui/qaccessible2.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAbstractButton;
+class QHeaderView;
+class QTabBar;
+class QComboBox;
+class QTitleBar;
+class QAbstractScrollArea;
+class QScrollArea;
+
+#ifndef QT_NO_SCROLLAREA
+class QAccessibleAbstractScrollArea : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleAbstractScrollArea(QWidget *widget);
+
+ enum AbstractScrollAreaElement {
+ Self = 0,
+ Viewport,
+ HorizontalContainer,
+ VerticalContainer,
+ CornerWidget,
+ Undefined
+ };
+
+ QString text(Text textType, int child) const;
+ void setText(Text textType, int child, const QString &text);
+ State state(int child) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ bool isValid() const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+ QRect rect(int child) const;
+ int childAt(int x, int y) const;
+
+//protected:
+ QAbstractScrollArea *abstractScrollArea() const;
+
+private:
+ QWidgetList accessibleChildren() const;
+ AbstractScrollAreaElement elementType(QWidget *widget) const;
+ bool isLeftToRight() const;
+};
+
+class QAccessibleScrollArea : public QAccessibleAbstractScrollArea
+{
+public:
+ explicit QAccessibleScrollArea(QWidget *widget);
+};
+
+#endif // QT_NO_SCROLLAREA
+
+#ifndef QT_NO_ITEMVIEWS
+class QAccessibleHeader : public QAccessibleWidgetEx
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleHeader(QWidget *w);
+
+ int childCount() const;
+
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+
+protected:
+ QHeaderView *header() const;
+};
+
+class QAccessibleItemRow: public QAccessibleInterface
+{
+ friend class QAccessibleItemView;
+public:
+ QAccessibleItemRow(QAbstractItemView *view, const QModelIndex &index = QModelIndex(), bool isHeader = false);
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ void setText(Text t, int child, const QString &text);
+ bool isValid() const;
+ QObject *object() const;
+ Role role(int child) const;
+ State state(int child) const;
+
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *) const;
+ QList<QModelIndex> children() const;
+
+ Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
+ int childAt(int x, int y) const;
+ int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const;
+
+ int userActionCount(int child) const;
+ QString actionText(int action, Text t, int child) const;
+ bool doAction(int action, int child, const QVariantList &params = QVariantList());
+
+ QModelIndex childIndex(int child) const;
+
+ QHeaderView *horizontalHeader() const; //used by QAccessibleItemView
+private:
+ static QAbstractItemView::CursorAction toCursorAction(Relation rel);
+ int logicalFromChild(QHeaderView *header, int child) const;
+ int treeLevel() const;
+ QHeaderView *verticalHeader() const;
+ QString text_helper(int child) const;
+
+ QPersistentModelIndex row;
+ QPointer<QAbstractItemView> view;
+ bool m_header;
+};
+
+class QAccessibleItemView: public QAccessibleAbstractScrollArea, public QAccessibleTableInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleItemView(QWidget *w);
+
+ QObject *object() const;
+ Role role(int child) const;
+ State state(int child) const;
+ QRect rect(int child) const;
+ int childAt(int x, int y) const;
+ int childCount() const;
+ QString text(Text t, int child) const;
+ void setText(Text t, int child, const QString &text);
+ int indexOfChild(const QAccessibleInterface *iface) const;
+
+ QModelIndex childIndex(int child) const;
+ int entryFromIndex(const QModelIndex &index) const;
+ bool isValid() const;
+ int navigate(RelationFlag relation, int index, QAccessibleInterface **iface) const;
+
+ QAccessibleInterface *accessibleAt(int row, int column);
+ QAccessibleInterface *caption();
+ int childIndex(int rowIndex, int columnIndex);
+ QString columnDescription(int column);
+ int columnSpan(int row, int column);
+ QAccessibleInterface *columnHeader();
+ int columnIndex(int childIndex);
+ int columnCount();
+ int rowCount();
+ int selectedColumnCount();
+ int selectedRowCount();
+ QString rowDescription(int row);
+ int rowSpan(int row, int column);
+ QAccessibleInterface *rowHeader();
+ int rowIndex(int childIndex);
+ int selectedRows(int maxRows, QList<int> *rows);
+ int selectedColumns(int maxColumns, QList<int> *columns);
+ QAccessibleInterface *summary();
+ bool isColumnSelected(int column);
+ bool isRowSelected(int row);
+ bool isSelected(int row, int column);
+ void selectRow(int row);
+ void selectColumn(int column);
+ void unselectRow(int row);
+ void unselectColumn(int column);
+ void cellAtIndex(int index, int *row, int *column, int *rowSpan,
+ int *columnSpan, bool *isSelected);
+
+ QHeaderView *horizontalHeader() const;
+ QHeaderView *verticalHeader() const;
+ bool isValidChildRole(QAccessible::Role role) const;
+
+protected:
+ QAbstractItemView *itemView() const;
+ QModelIndex index(int row, int column) const;
+
+private:
+ inline bool atViewport() const {
+ return atVP;
+ };
+ QAccessible::Role expectedRoleOfChildren() const;
+
+ bool atVP;
+};
+
+#endif
+
+#ifndef QT_NO_TABBAR
+class QAccessibleTabBar : public QAccessibleWidgetEx
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleTabBar(QWidget *w);
+
+ int childCount() const;
+
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+
+ bool doAction(int action, int child, const QVariantList &params);
+ bool setSelected(int child, bool on, bool extend);
+ QVector<int> selection() const;
+
+protected:
+ QTabBar *tabBar() const;
+
+private:
+ QAbstractButton *button(int child) const;
+};
+#endif // QT_NO_TABBAR
+
+#ifndef QT_NO_COMBOBOX
+class QAccessibleComboBox : public QAccessibleWidgetEx
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleComboBox(QWidget *w);
+
+ enum ComboBoxElements {
+ ComboBoxSelf = 0,
+ CurrentText,
+ OpenList,
+ PopupList
+ };
+
+ int childCount() const;
+ int childAt(int x, int y) const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const;
+
+ QString text(Text t, int child) const;
+ QRect rect(int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+
+ bool doAction(int action, int child, const QVariantList &params);
+ QString actionText(int action, Text t, int child) const;
+
+protected:
+ QComboBox *comboBox() const;
+};
+#endif // QT_NO_COMBOBOX
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // COMPLEXWIDGETS_H
diff --git a/src/plugins/accessible/widgets/main.cpp b/src/plugins/accessible/widgets/main.cpp
new file mode 100644
index 0000000000..c73702edad
--- /dev/null
+++ b/src/plugins/accessible/widgets/main.cpp
@@ -0,0 +1,341 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblewidgets.h"
+#include "qaccessiblemenu.h"
+#include "simplewidgets.h"
+#include "rangecontrols.h"
+#include "complexwidgets.h"
+
+#include <qaccessibleplugin.h>
+#include <qplugin.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qvariant.h>
+#include <qaccessible.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+class AccessibleFactory : public QAccessiblePlugin
+{
+public:
+ AccessibleFactory();
+
+ QStringList keys() const;
+ QAccessibleInterface *create(const QString &classname, QObject *object);
+};
+
+AccessibleFactory::AccessibleFactory()
+{
+}
+
+QStringList AccessibleFactory::keys() const
+{
+ QStringList list;
+#ifndef QT_NO_LINEEDIT
+ list << QLatin1String("QLineEdit");
+#endif
+#ifndef QT_NO_COMBOBOX
+ list << QLatin1String("QComboBox");
+#endif
+#ifndef QT_NO_SPINBOX
+ list << QLatin1String("QAbstractSpinBox");
+ list << QLatin1String("QSpinBox");
+ list << QLatin1String("QDoubleSpinBox");
+#endif
+#ifndef QT_NO_SCROLLBAR
+ list << QLatin1String("QScrollBar");
+#endif
+#ifndef QT_NO_SLIDER
+ list << QLatin1String("QSlider");
+#endif
+ list << QLatin1String("QAbstractSlider");
+#ifndef QT_NO_TOOLBUTTON
+ list << QLatin1String("QToolButton");
+#endif
+ list << QLatin1String("QCheckBox");
+ list << QLatin1String("QRadioButton");
+ list << QLatin1String("QPushButton");
+ list << QLatin1String("QAbstractButton");
+ list << QLatin1String("QDialog");
+ list << QLatin1String("QMessageBox");
+ list << QLatin1String("QMainWindow");
+ list << QLatin1String("QLabel");
+ list << QLatin1String("QLCDNumber");
+ list << QLatin1String("QGroupBox");
+ list << QLatin1String("QStatusBar");
+ list << QLatin1String("QProgressBar");
+ list << QLatin1String("QMenuBar");
+ list << QLatin1String("Q3PopupMenu");
+ list << QLatin1String("QMenu");
+ list << QLatin1String("QHeaderView");
+ list << QLatin1String("QTabBar");
+ list << QLatin1String("QToolBar");
+ list << QLatin1String("QWorkspaceChild");
+ list << QLatin1String("QSizeGrip");
+ list << QLatin1String("QAbstractItemView");
+ list << QLatin1String("QWidget");
+#ifndef QT_NO_SPLITTER
+ list << QLatin1String("QSplitter");
+ list << QLatin1String("QSplitterHandle");
+#endif
+#ifndef QT_NO_TEXTEDIT
+ list << QLatin1String("QTextEdit");
+#endif
+ list << QLatin1String("QTipLabel");
+ list << QLatin1String("QFrame");
+ list << QLatin1String("QStackedWidget");
+ list << QLatin1String("QToolBox");
+ list << QLatin1String("QMdiArea");
+ list << QLatin1String("QMdiSubWindow");
+ list << QLatin1String("QWorkspace");
+ list << QLatin1String("QDialogButtonBox");
+#ifndef QT_NO_DIAL
+ list << QLatin1String("QDial");
+#endif
+#ifndef QT_NO_RUBBERBAND
+ list << QLatin1String("QRubberBand");
+#endif
+#ifndef QT_NO_TEXTBROWSER
+ list << QLatin1String("QTextBrowser");
+#endif
+#ifndef QT_NO_SCROLLAREA
+ list << QLatin1String("QAbstractScrollArea");
+ list << QLatin1String("QScrollArea");
+#endif
+#ifndef QT_NO_CALENDARWIDGET
+ list << QLatin1String("QCalendarWidget");
+#endif
+
+#ifndef QT_NO_DOCKWIDGET
+ list << QLatin1String("QDockWidget");
+#endif
+ return list;
+}
+
+QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObject *object)
+{
+ QAccessibleInterface *iface = 0;
+ if (!object || !object->isWidgetType())
+ return iface;
+ QWidget *widget = static_cast<QWidget*>(object);
+
+ if (false) {
+#ifndef QT_NO_LINEEDIT
+ } else if (classname == QLatin1String("QLineEdit")) {
+ iface = new QAccessibleLineEdit(widget);
+#endif
+#ifndef QT_NO_COMBOBOX
+ } else if (classname == QLatin1String("QComboBox")) {
+ iface = new QAccessibleComboBox(widget);
+#endif
+#ifndef QT_NO_SPINBOX
+ } else if (classname == QLatin1String("QAbstractSpinBox")) {
+ iface = new QAccessibleAbstractSpinBox(widget);
+ } else if (classname == QLatin1String("QSpinBox")) {
+ iface = new QAccessibleSpinBox(widget);
+ } else if (classname == QLatin1String("QDoubleSpinBox")) {
+ iface = new QAccessibleDoubleSpinBox(widget);
+#endif
+#ifndef QT_NO_SCROLLBAR
+ } else if (classname == QLatin1String("QScrollBar")) {
+ iface = new QAccessibleScrollBar(widget);
+#endif
+ } else if (classname == QLatin1String("QAbstractSlider")) {
+ iface = new QAccessibleAbstractSlider(widget);
+#ifndef QT_NO_SLIDER
+ } else if (classname == QLatin1String("QSlider")) {
+ iface = new QAccessibleSlider(widget);
+#endif
+#ifndef QT_NO_TOOLBUTTON
+ } else if (classname == QLatin1String("QToolButton")) {
+ Role role = NoRole;
+#ifndef QT_NO_MENU
+ QToolButton *tb = qobject_cast<QToolButton*>(widget);
+ if (!tb->menu())
+ role = tb->isCheckable() ? CheckBox : PushButton;
+ else if (!tb->popupMode() != QToolButton::DelayedPopup)
+ role = ButtonDropDown;
+ else
+#endif
+ role = ButtonMenu;
+ iface = new QAccessibleToolButton(widget, role);
+#endif // QT_NO_TOOLBUTTON
+ } else if (classname == QLatin1String("QCheckBox")) {
+ iface = new QAccessibleButton(widget, CheckBox);
+ } else if (classname == QLatin1String("QRadioButton")) {
+ iface = new QAccessibleButton(widget, RadioButton);
+ } else if (classname == QLatin1String("QPushButton")) {
+ Role role = NoRole;
+ QPushButton *pb = qobject_cast<QPushButton*>(widget);
+#ifndef QT_NO_MENU
+ if (pb->menu())
+ role = ButtonMenu;
+ else
+#endif
+ if (pb->isCheckable())
+ role = CheckBox;
+ else
+ role = PushButton;
+ iface = new QAccessibleButton(widget, role);
+ } else if (classname == QLatin1String("QAbstractButton")) {
+ iface = new QAccessibleButton(widget, PushButton);
+ } else if (classname == QLatin1String("QDialog")) {
+ iface = new QAccessibleWidgetEx(widget, Dialog);
+ } else if (classname == QLatin1String("QMessageBox")) {
+ iface = new QAccessibleWidgetEx(widget, AlertMessage);
+#ifndef QT_NO_MAINWINDOW
+ } else if (classname == QLatin1String("QMainWindow")) {
+ iface = new QAccessibleMainWindow(widget);
+#endif
+ } else if (classname == QLatin1String("QLabel") || classname == QLatin1String("QLCDNumber")) {
+ iface = new QAccessibleDisplay(widget);
+ } else if (classname == QLatin1String("QGroupBox")) {
+ iface = new QAccessibleDisplay(widget, Grouping);
+ } else if (classname == QLatin1String("QStatusBar")) {
+ iface = new QAccessibleWidgetEx(widget, StatusBar);
+#ifndef QT_NO_PROGRESSBAR
+ } else if (classname == QLatin1String("QProgressBar")) {
+ iface = new QAccessibleProgressBar(widget);
+#endif
+ } else if (classname == QLatin1String("QToolBar")) {
+ iface = new QAccessibleWidgetEx(widget, ToolBar, widget->windowTitle());
+#ifndef QT_NO_MENUBAR
+ } else if (classname == QLatin1String("QMenuBar")) {
+ iface = new QAccessibleMenuBar(widget);
+#endif
+#ifndef QT_NO_MENU
+ } else if (classname == QLatin1String("QMenu")) {
+ iface = new QAccessibleMenu(widget);
+ } else if (classname == QLatin1String("Q3PopupMenu")) {
+ iface = new QAccessibleMenu(widget);
+#endif
+#ifndef QT_NO_ITEMVIEWS
+ } else if (classname == QLatin1String("QHeaderView")) {
+ iface = new QAccessibleHeader(widget);
+ } else if (classname == QLatin1String("QAbstractItemView")) {
+ iface = new QAccessibleItemView(widget);
+ } else if (classname == QLatin1String("QWidget")
+ && widget->objectName() == QLatin1String("qt_scrollarea_viewport")
+ && qobject_cast<QAbstractItemView*>(widget->parentWidget())) {
+ iface = new QAccessibleItemView(widget);
+#endif
+#ifndef QT_NO_TABBAR
+ } else if (classname == QLatin1String("QTabBar")) {
+ iface = new QAccessibleTabBar(widget);
+#endif
+ } else if (classname == QLatin1String("QWorkspaceChild")) {
+ iface = new QAccessibleWidgetEx(widget, Window);
+ } else if (classname == QLatin1String("QSizeGrip")) {
+ iface = new QAccessibleWidgetEx(widget, Grip);
+#ifndef QT_NO_SPLITTER
+ } else if (classname == QLatin1String("QSplitter")) {
+ iface = new QAccessibleWidgetEx(widget, Splitter);
+ } else if (classname == QLatin1String("QSplitterHandle")) {
+ iface = new QAccessibleWidgetEx(widget, Grip);
+#endif
+#ifndef QT_NO_TEXTEDIT
+ } else if (classname == QLatin1String("QTextEdit")) {
+ iface = new QAccessibleTextEdit(widget);
+#endif
+ } else if (classname == QLatin1String("QTipLabel")) {
+ iface = new QAccessibleDisplay(widget, ToolTip);
+ } else if (classname == QLatin1String("QFrame")) {
+ iface = new QAccessibleWidget(widget, Border);
+#ifndef QT_NO_STACKEDWIDGET
+ } else if (classname == QLatin1String("QStackedWidget")) {
+ iface = new QAccessibleStackedWidget(widget);
+#endif
+#ifndef QT_NO_TOOLBOX
+ } else if (classname == QLatin1String("QToolBox")) {
+ iface = new QAccessibleToolBox(widget);
+#endif
+#ifndef QT_NO_MDIAREA
+ } else if (classname == QLatin1String("QMdiArea")) {
+ iface = new QAccessibleMdiArea(widget);
+ } else if (classname == QLatin1String("QMdiSubWindow")) {
+ iface = new QAccessibleMdiSubWindow(widget);
+#endif
+#ifndef QT_NO_WORKSPACE
+ } else if (classname == QLatin1String("QWorkspace")) {
+ iface = new QAccessibleWorkspace(widget);
+#endif
+ } else if (classname == QLatin1String("QDialogButtonBox")) {
+ iface = new QAccessibleDialogButtonBox(widget);
+#ifndef QT_NO_DIAL
+ } else if (classname == QLatin1String("QDial")) {
+ iface = new QAccessibleDial(widget);
+#endif
+#ifndef QT_NO_RUBBERBAND
+ } else if (classname == QLatin1String("QRubberBand")) {
+ iface = new QAccessibleWidgetEx(widget, QAccessible::Border);
+#endif
+#ifndef QT_NO_TEXTBROWSER
+ } else if (classname == QLatin1String("QTextBrowser")) {
+ iface = new QAccessibleTextBrowser(widget);
+#endif
+#ifndef QT_NO_SCROLLAREA
+ } else if (classname == QLatin1String("QAbstractScrollArea")) {
+ iface = new QAccessibleAbstractScrollArea(widget);
+ } else if (classname == QLatin1String("QScrollArea")) {
+ iface = new QAccessibleScrollArea(widget);
+#endif
+#ifndef QT_NO_CALENDARWIDGET
+ } else if (classname == QLatin1String("QCalendarWidget")) {
+ iface = new QAccessibleCalendarWidget(widget);
+#endif
+#ifndef QT_NO_DOCKWIDGET
+ } else if (classname == QLatin1String("QDockWidget")) {
+ iface = new QAccessibleDockWidget(widget);
+#endif
+ }
+
+ return iface;
+}
+
+Q_EXPORT_STATIC_PLUGIN(AccessibleFactory)
+Q_EXPORT_PLUGIN2(qtaccessiblewidgets, AccessibleFactory)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
new file mode 100644
index 0000000000..6d8a358d5c
--- /dev/null
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
@@ -0,0 +1,678 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblemenu.h"
+
+#include <qmenu.h>
+#include <qmenubar.h>
+#include <QtGui/QAction>
+#include <qstyle.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_MENU
+
+QString Q_GUI_EXPORT qt_accStripAmp(const QString &text);
+QString Q_GUI_EXPORT qt_accHotKey(const QString &text);
+
+QAccessibleMenu::QAccessibleMenu(QWidget *w)
+: QAccessibleWidgetEx(w)
+{
+ Q_ASSERT(menu());
+}
+
+QMenu *QAccessibleMenu::menu() const
+{
+ return qobject_cast<QMenu*>(object());
+}
+
+int QAccessibleMenu::childCount() const
+{
+ return menu()->actions().count();
+}
+
+QRect QAccessibleMenu::rect(int child) const
+{
+ if (!child || child > childCount())
+ return QAccessibleWidgetEx::rect(child);
+
+ QRect r = menu()->actionGeometry(menu()->actions()[child - 1]);
+ QPoint tlp = menu()->mapToGlobal(QPoint(0,0));
+
+ return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height());
+}
+
+int QAccessibleMenu::childAt(int x, int y) const
+{
+ QAction *act = menu()->actionAt(menu()->mapFromGlobal(QPoint(x,y)));
+ if(act && act->isSeparator())
+ act = 0;
+ return menu()->actions().indexOf(act) + 1;
+}
+
+QString QAccessibleMenu::text(Text t, int child) const
+{
+ QString tx = QAccessibleWidgetEx::text(t, child);
+ if (tx.size())
+ return tx;
+
+ switch (t) {
+ case Name:
+ if (!child)
+ return menu()->windowTitle();
+ return qt_accStripAmp(menu()->actions().at(child-1)->text());
+ case Help:
+ return child ? menu()->actions().at(child-1)->whatsThis() : tx;
+#ifndef QT_NO_SHORTCUT
+ case Accelerator:
+ return child ? static_cast<QString>(menu()->actions().at(child-1)->shortcut()) : tx;
+#endif
+ default:
+ break;
+ }
+ return tx;
+}
+
+QAccessible::Role QAccessibleMenu::role(int child) const
+{
+ if (!child)
+ return PopupMenu;
+
+ QAction *action = menu()->actions()[child-1];
+ if (action && action->isSeparator())
+ return Separator;
+ return MenuItem;
+}
+
+QAccessible::State QAccessibleMenu::state(int child) const
+{
+ State s = QAccessibleWidgetEx::state(child);
+ if (!child)
+ return s;
+
+ QAction *action = menu()->actions()[child-1];
+ if (!action)
+ return s;
+
+ if (menu()->style()->styleHint(QStyle::SH_Menu_MouseTracking))
+ s |= HotTracked;
+ if (action->isSeparator() || !action->isEnabled())
+ s |= Unavailable;
+ if (action->isChecked())
+ s |= Checked;
+ if (menu()->activeAction() == action)
+ s |= Focused;
+
+ return s;
+}
+
+QString QAccessibleMenu::actionText(int action, QAccessible::Text text, int child) const
+{
+ if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) {
+ QAction *a = menu()->actions().value(child-1, 0);
+ if (!a || a->isSeparator())
+ return QString();
+ if (a->menu()) {
+ if (a->menu()->isVisible())
+ return QMenu::tr("Close");
+ return QMenu::tr("Open");
+ }
+ return QMenu::tr("Execute");
+ }
+
+ return QAccessibleWidgetEx::actionText(action, text, child);
+}
+
+bool QAccessibleMenu::doAction(int act, int child, const QVariantList &)
+{
+ if (!child || act != QAccessible::DefaultAction)
+ return false;
+
+ QAction *action = menu()->actions().value(child-1, 0);
+ if (!action || !action->isEnabled())
+ return false;
+
+ if (action->menu() && action->menu()->isVisible())
+ action->menu()->hide();
+ else
+ menu()->setActiveAction(action);
+ return true;
+}
+
+int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ int ret = -1;
+ if (entry < 0) {
+ *target = 0;
+ return ret;
+ }
+
+ if (relation == Self || entry == 0) {
+ *target = new QAccessibleMenu(menu());
+ return 0;
+ }
+
+ switch (relation) {
+ case Child:
+ if (entry <= childCount()) {
+ *target = new QAccessibleMenuItem(menu(), menu()->actions().at( entry - 1 ));
+ ret = 0;
+ }
+ break;
+ case Ancestor: {
+ QAccessibleInterface *iface;
+ QWidget *parent = menu()->parentWidget();
+ if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) {
+ iface = new QAccessibleMenuItem(parent, menu()->menuAction());
+ if (entry == 1) {
+ *target = iface;
+ ret = 0;
+ } else {
+ ret = iface->navigate(Ancestor, entry - 1, target);
+ delete iface;
+ }
+ } else {
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+ break;}
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+
+
+ if (ret == -1)
+ *target = 0;
+
+ return ret;
+
+}
+
+int QAccessibleMenu::indexOfChild( const QAccessibleInterface *child ) const
+{
+ int index = -1;
+ Role r = child->role(0);
+ if ((r == MenuItem || r == Separator) && menu()) {
+ index = menu()->actions().indexOf(qobject_cast<QAction*>(child->object()));
+ if (index != -1)
+ ++index;
+ }
+ return index;
+}
+
+#ifndef QT_NO_MENUBAR
+QAccessibleMenuBar::QAccessibleMenuBar(QWidget *w)
+: QAccessibleWidgetEx(w)
+{
+ Q_ASSERT(menuBar());
+}
+
+QMenuBar *QAccessibleMenuBar::menuBar() const
+{
+ return qobject_cast<QMenuBar*>(object());
+}
+
+int QAccessibleMenuBar::childCount() const
+{
+ return menuBar()->actions().count();
+}
+
+QRect QAccessibleMenuBar::rect(int child) const
+{
+ if (!child)
+ return QAccessibleWidgetEx::rect(child);
+
+ QRect r = menuBar()->actionGeometry(menuBar()->actions()[child - 1]);
+ QPoint tlp = menuBar()->mapToGlobal(QPoint(0,0));
+ return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height());
+}
+
+int QAccessibleMenuBar::childAt(int x, int y) const
+{
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(x,y))
+ return i;
+ }
+ return -1;
+}
+
+int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ int ret = -1;
+ if (entry < 0) {
+ *target = 0;
+ return ret;
+ }
+
+ if (relation == Self || entry == 0) {
+ *target = new QAccessibleMenuBar(menuBar());
+ return 0;
+ }
+
+ switch (relation) {
+ case Child:
+ if (entry <= childCount()) {
+ *target = new QAccessibleMenuItem(menuBar(), menuBar()->actions().at( entry - 1 ));
+ ret = 0;
+ }
+ break;
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+
+
+ if (ret == -1)
+ *target = 0;
+
+ return ret;
+}
+
+int QAccessibleMenuBar::indexOfChild( const QAccessibleInterface *child ) const
+{
+ int index = -1;
+ Role r = child->role(0);
+ if ((r == MenuItem || r == Separator) && menuBar()) {
+ index = menuBar()->actions().indexOf(qobject_cast<QAction*>(child->object()));
+ if (index != -1)
+ ++index;
+ }
+ return index;
+}
+
+QString QAccessibleMenuBar::text(Text t, int child) const
+{
+ QString str;
+
+ if (child) {
+ if (QAction *action = menuBar()->actions().value(child - 1, 0)) {
+ switch (t) {
+ case Name:
+ return qt_accStripAmp(action->text());
+ case Accelerator:
+ str = qt_accHotKey(action->text());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, child);
+ return str;
+}
+
+QAccessible::Role QAccessibleMenuBar::role(int child) const
+{
+ if (!child)
+ return MenuBar;
+
+ QAction *action = menuBar()->actions()[child-1];
+ if (action && action->isSeparator())
+ return Separator;
+ return MenuItem;
+}
+
+QAccessible::State QAccessibleMenuBar::state(int child) const
+{
+ State s = QAccessibleWidgetEx::state(child);
+ if (!child)
+ return s;
+
+ QAction *action = menuBar()->actions().value(child-1, 0);
+ if (!action)
+ return s;
+
+ if (menuBar()->style()->styleHint(QStyle::SH_Menu_MouseTracking))
+ s |= HotTracked;
+ if (action->isSeparator() || !action->isEnabled())
+ s |= Unavailable;
+ if (menuBar()->activeAction() == action)
+ s |= Focused;
+
+ return s;
+}
+
+QString QAccessibleMenuBar::actionText(int action, QAccessible::Text text, int child) const
+{
+ if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) {
+ QAction *a = menuBar()->actions().value(child-1, 0);
+ if (!a || a->isSeparator())
+ return QString();
+ if (a->menu()) {
+ if (a->menu()->isVisible())
+ return QMenu::tr("Close");
+ return QMenu::tr("Open");
+ }
+ return QMenu::tr("Execute");
+ }
+
+ return QAccessibleWidgetEx::actionText(action, text, child);
+}
+
+bool QAccessibleMenuBar::doAction(int act, int child, const QVariantList &)
+{
+ if (act != !child)
+ return false;
+
+ QAction *action = menuBar()->actions().value(child-1, 0);
+ if (!action || !action->isEnabled())
+ return false;
+ if (action->menu() && action->menu()->isVisible())
+ action->menu()->hide();
+ else
+ menuBar()->setActiveAction(action);
+ return true;
+}
+
+#endif // QT_NO_MENUBAR
+
+QAccessibleMenuItem::QAccessibleMenuItem(QWidget *owner, QAction *action) : m_action(action), m_owner(owner)
+{
+}
+
+
+QAccessibleMenuItem::~QAccessibleMenuItem()
+{}
+
+int QAccessibleMenuItem::childAt(int x, int y ) const
+{
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(x,y))
+ return i;
+ }
+ return -1;
+}
+
+int QAccessibleMenuItem::childCount() const
+{
+ return m_action->menu() ? 1 : 0;
+}
+
+QString QAccessibleMenuItem::actionText(int action, Text text, int child ) const
+{
+ if (text == Name && child == 0) {
+ switch (action) {
+ case Press:
+ case DefaultAction:
+ return QMenu::tr("Execute");
+ break;
+ default:
+ break;
+ }
+ }
+ return QString();
+}
+
+bool QAccessibleMenuItem::doAction(int action, int child, const QVariantList & /*params = QVariantList()*/ )
+{
+ if ((action == Press || action == DefaultAction) && child == 0) {
+ m_action->trigger();
+ return true;
+ }
+ return false;
+}
+
+int QAccessibleMenuItem::indexOfChild( const QAccessibleInterface * child ) const
+{
+ if (child->role(0) == PopupMenu && child->object() == m_action->menu())
+ return 1;
+
+ return -1;
+}
+
+bool QAccessibleMenuItem::isValid() const
+{
+ return m_action ? true : false;
+}
+
+int QAccessibleMenuItem::navigate(RelationFlag relation, int entry, QAccessibleInterface ** target ) const
+{
+ int ret = -1;
+ if (entry < 0) {
+ *target = 0;
+ return ret;
+ }
+
+ if (relation == Self || entry == 0) {
+ *target = new QAccessibleMenuItem(owner(), action());
+ return 0;
+ }
+
+ switch (relation) {
+ case Child:
+ if (entry <= childCount()) {
+ *target = new QAccessibleMenu(action()->menu());
+ ret = 0;
+ }
+ break;
+
+ case Ancestor:{
+ QWidget *parent = owner();
+ QAccessibleInterface *ancestor = parent ? QAccessible::queryAccessibleInterface(parent) : 0;
+ if (ancestor) {
+ if (entry == 1) {
+ *target = ancestor;
+ ret = 0;
+ } else {
+ ret = ancestor->navigate(Ancestor, entry - 1, target);
+ delete ancestor;
+ }
+ }
+ break;}
+ case Up:
+ case Down:{
+ QAccessibleInterface *parent = 0;
+ int ent = navigate(Ancestor, 1, &parent);
+ if (ent == 0) {
+ int index = parent->indexOfChild(this);
+ if (index != -1) {
+ index += (relation == Down ? +1 : -1);
+ ret = parent->navigate(Child, index, target);
+ }
+ }
+ delete parent;
+ break;}
+ case Sibling: {
+ QAccessibleInterface *parent = 0;
+ int ent = navigate(Ancestor, 1, &parent);
+ if (ent == 0) {
+ ret = parent->navigate(Child, entry, target);
+ }
+ delete parent;
+ break;}
+ default:
+ break;
+
+ }
+ if (ret == -1)
+ *target = 0;
+ return ret;
+}
+
+QObject *QAccessibleMenuItem::object() const
+{
+ return m_action;
+}
+
+QRect QAccessibleMenuItem::rect (int child ) const
+{
+ QRect rect;
+ if (child == 0) {
+ QWidget *own = owner();
+#ifndef QT_NO_MENUBAR
+ if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
+ rect = menuBar->actionGeometry(m_action);
+ QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0));
+ rect = rect.translated(globalPos);
+ } else
+#endif // QT_NO_MENUBAR
+ if (QMenu *menu = qobject_cast<QMenu*>(own)) {
+ rect = menu->actionGeometry(m_action);
+ QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
+ rect = rect.translated(globalPos);
+ }
+ } else if (child == 1) {
+ QMenu *menu = m_action->menu();
+ if (menu) {
+ rect = menu->rect();
+ QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
+ rect = rect.translated(globalPos);
+ }
+ }
+ return rect;
+}
+
+QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const
+{
+ if (other->object() == owner()) {
+ return Child;
+ }
+ Q_UNUSED(child)
+ Q_UNUSED(other)
+ Q_UNUSED(otherChild)
+ // ###
+ return Unrelated;
+}
+
+QAccessible::Role QAccessibleMenuItem::role(int /*child*/ ) const
+{
+ return m_action->isSeparator() ? Separator :MenuItem;
+}
+
+void QAccessibleMenuItem::setText ( Text /*t*/, int /*child*/, const QString & /*text */)
+{
+
+}
+
+QAccessible::State QAccessibleMenuItem::state(int child ) const
+{
+ QAccessible::State s = Unavailable;
+
+ if (child == 0) {
+ s = Normal;
+ QWidget *own = owner();
+
+ if (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) {
+ s |= Invisible;
+ }
+
+ if (QMenu *menu = qobject_cast<QMenu*>(own)) {
+ if (menu->activeAction() == m_action)
+ s |= Focused;
+#ifndef QT_NO_MENUBAR
+ } else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
+ if (menuBar->activeAction() == m_action)
+ s |= Focused;
+#endif
+ }
+ if (own->style()->styleHint(QStyle::SH_Menu_MouseTracking))
+ s |= HotTracked;
+ if (m_action->isSeparator() || !m_action->isEnabled())
+ s |= Unavailable;
+ if (m_action->isChecked())
+ s |= Checked;
+ } else if (child == 1) {
+ QMenu *menu = m_action->menu();
+ if (menu) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(menu);
+ s = iface->state(0);
+ delete iface;
+ }
+ }
+ return s;
+}
+
+QString QAccessibleMenuItem::text ( Text t, int child ) const
+{
+ QString str;
+ switch (t) {
+ case Name:
+ if (child == 0) {
+ str = m_action->text();
+ } else if (child == 1) {
+ QMenu *m = m_action->menu();
+ if (m)
+ str = m->title();
+ }
+ str = qt_accStripAmp(str);
+ break;
+ case Accelerator:
+ if (child == 0) {
+#ifndef QT_NO_SHORTCUT
+ QKeySequence key = m_action->shortcut();
+ if (!key.isEmpty()) {
+ str = key.toString();
+ } else
+#endif
+ {
+ str = qt_accHotKey(m_action->text());
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return str;
+}
+
+int QAccessibleMenuItem::userActionCount ( int /*child*/ ) const
+{
+ return 0;
+}
+
+
+QAction *QAccessibleMenuItem::action() const
+{
+ return m_action;
+}
+
+QWidget *QAccessibleMenuItem::owner() const
+{
+ return m_owner;
+}
+
+#endif // QT_NO_MENU
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
+
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.h b/src/plugins/accessible/widgets/qaccessiblemenu.h
new file mode 100644
index 0000000000..7decca02c7
--- /dev/null
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.h
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEMENU_H
+#define QACCESSIBLEMENU_H
+
+#include <QtGui/qaccessiblewidget.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+#ifndef QT_NO_MENU
+class QMenu;
+class QMenuBar;
+class QAction;
+
+class QAccessibleMenu : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleMenu(QWidget *w);
+
+ int childCount() const;
+ int childAt(int x, int y) const;
+
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+ int indexOfChild( const QAccessibleInterface *child ) const;
+
+ QString actionText(int action, QAccessible::Text text, int child) const;
+ bool doAction(int action, int child, const QVariantList &params);
+
+protected:
+ QMenu *menu() const;
+};
+
+#ifndef QT_NO_MENUBAR
+class QAccessibleMenuBar : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleMenuBar(QWidget *w);
+
+ int childCount() const;
+ int childAt(int x, int y) const;
+
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+ int indexOfChild( const QAccessibleInterface *child ) const;
+
+ QString actionText(int action, QAccessible::Text text, int child) const;
+ bool doAction(int action, int child, const QVariantList &params);
+
+protected:
+ QMenuBar *menuBar() const;
+};
+#endif // QT_NO_MENUBAR
+
+
+
+class QAccessibleMenuItem : public QAccessibleInterface
+{
+public:
+ explicit QAccessibleMenuItem(QWidget *owner, QAction *w);
+
+ virtual ~QAccessibleMenuItem();
+ virtual QString actionText ( int action, Text t, int child ) const;
+ virtual int childAt ( int x, int y ) const;
+ virtual int childCount () const;
+ virtual bool doAction ( int action, int child, const QVariantList & params = QVariantList() );
+ virtual int indexOfChild ( const QAccessibleInterface * child ) const;
+ virtual bool isValid () const;
+ virtual int navigate ( RelationFlag relation, int entry, QAccessibleInterface ** target ) const;
+ virtual QObject * object () const;
+ virtual QRect rect ( int child ) const;
+ virtual Relation relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const;
+ virtual Role role ( int child ) const;
+ virtual void setText ( Text t, int child, const QString & text );
+ virtual State state ( int child ) const;
+ virtual QString text ( Text t, int child ) const;
+ virtual int userActionCount ( int child ) const;
+
+ QWidget *owner() const;
+
+
+protected:
+ QAction *action() const;
+private:
+ QAction *m_action;
+ QWidget *m_owner; // can hold either QMenu or the QMenuBar that contains the action
+};
+
+#endif // QT_NO_MENU
+
+QT_END_NAMESPACE
+#endif // QT_NO_ACCESSIBILITY
+#endif // QACCESSIBLEMENU_H
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
new file mode 100644
index 0000000000..09b5015785
--- /dev/null
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
@@ -0,0 +1,1667 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblewidgets.h"
+#include "qabstracttextdocumentlayout.h"
+#include "qapplication.h"
+#include "qclipboard.h"
+#include "qtextedit.h"
+#include "private/qtextedit_p.h"
+#include "qtextdocument.h"
+#include "qtextobject.h"
+#include "qscrollbar.h"
+#include "qdebug.h"
+#include <QApplication>
+#include <QStackedWidget>
+#include <QToolBox>
+#include <QMdiArea>
+#include <QMdiSubWindow>
+#include <QWorkspace>
+#include <QDialogButtonBox>
+#include <limits.h>
+#include <QRubberBand>
+#include <QTextBrowser>
+#include <QCalendarWidget>
+#include <QAbstractItemView>
+#include <QDockWidget>
+#include <QMainWindow>
+#include <QAbstractButton>
+#include <private/qdockwidget_p.h>
+#include <QtGui/QFocusFrame>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+using namespace QAccessible2;
+
+QList<QWidget*> childWidgets(const QWidget *widget, bool includeTopLevel)
+{
+ if (widget == 0)
+ return QList<QWidget*>();
+ QList<QObject*> list = widget->children();
+ QList<QWidget*> widgets;
+ for (int i = 0; i < list.size(); ++i) {
+ QWidget *w = qobject_cast<QWidget *>(list.at(i));
+ if (!w)
+ continue;
+ QString objectName = w->objectName();
+ if ((includeTopLevel || !w->isWindow())
+ && !qobject_cast<QFocusFrame*>(w)
+ && !qobject_cast<QMenu*>(w)
+ && objectName != QLatin1String("qt_rubberband")
+ && objectName != QLatin1String("qt_qmainwindow_extended_splitter")) {
+ widgets.append(w);
+ }
+ }
+ return widgets;
+}
+
+static inline int distance(QWidget *source, QWidget *target,
+ QAccessible::RelationFlag relation)
+{
+ if (!source || !target)
+ return -1;
+
+ int returnValue = -1;
+ switch (relation) {
+ case QAccessible::Up:
+ if (target->y() <= source->y())
+ returnValue = source->y() - target->y();
+ break;
+ case QAccessible::Down:
+ if (target->y() >= source->y() + source->height())
+ returnValue = target->y() - (source->y() + source->height());
+ break;
+ case QAccessible::Right:
+ if (target->x() >= source->x() + source->width())
+ returnValue = target->x() - (source->x() + source->width());
+ break;
+ case QAccessible::Left:
+ if (target->x() <= source->x())
+ returnValue = source->x() - target->x();
+ break;
+ default:
+ break;
+ }
+ return returnValue;
+}
+
+static inline QWidget *mdiAreaNavigate(QWidget *area,
+ QAccessible::RelationFlag relation, int entry)
+{
+#if defined(QT_NO_MDIAREA) && defined(QT_NO_WORKSPACE)
+ Q_UNUSED(area);
+#endif
+#ifndef QT_NO_MDIAREA
+ const QMdiArea *mdiArea = qobject_cast<QMdiArea *>(area);
+#endif
+#ifndef QT_NO_WORKSPACE
+ const QWorkspace *workspace = qobject_cast<QWorkspace *>(area);
+#endif
+ if (true
+#ifndef QT_NO_MDIAREA
+ && !mdiArea
+#endif
+#ifndef QT_NO_WORKSPACE
+ && !workspace
+#endif
+ )
+ return 0;
+
+ QWidgetList windows;
+#ifndef QT_NO_MDIAREA
+ if (mdiArea) {
+ foreach (QMdiSubWindow *window, mdiArea->subWindowList())
+ windows.append(window);
+ } else
+#endif
+ {
+#ifndef QT_NO_WORKSPACE
+ foreach (QWidget *window, workspace->windowList())
+ windows.append(window->parentWidget());
+#endif
+ }
+
+ if (windows.isEmpty() || entry < 1 || entry > windows.count())
+ return 0;
+
+ QWidget *source = windows.at(entry - 1);
+ QMap<int, QWidget *> candidates;
+ foreach (QWidget *window, windows) {
+ if (source == window)
+ continue;
+ int candidateDistance = distance(source, window, relation);
+ if (candidateDistance >= 0)
+ candidates.insert(candidateDistance, window);
+ }
+
+ int minimumDistance = INT_MAX;
+ QWidget *target = 0;
+ foreach (QWidget *candidate, candidates) {
+ switch (relation) {
+ case QAccessible::Up:
+ case QAccessible::Down:
+ if (qAbs(candidate->x() - source->x()) < minimumDistance) {
+ target = candidate;
+ minimumDistance = qAbs(candidate->x() - source->x());
+ }
+ break;
+ case QAccessible::Left:
+ case QAccessible::Right:
+ if (qAbs(candidate->y() - source->y()) < minimumDistance) {
+ target = candidate;
+ minimumDistance = qAbs(candidate->y() - source->y());
+ }
+ break;
+ default:
+ break;
+ }
+ if (minimumDistance == 0)
+ break;
+ }
+
+#ifndef QT_NO_WORKSPACE
+ if (workspace) {
+ foreach (QWidget *widget, workspace->windowList()) {
+ if (widget->parentWidget() == target)
+ target = widget;
+ }
+ }
+#endif
+ return target;
+}
+
+#ifndef QT_NO_TEXTEDIT
+
+/*!
+ \class QAccessibleTextEdit
+ \brief The QAccessibleTextEdit class implements the QAccessibleInterface for richtext editors.
+ \internal
+*/
+
+static QTextBlock qTextBlockAt(const QTextDocument *doc, int pos)
+{
+ Q_ASSERT(pos >= 0);
+
+ QTextBlock block = doc->begin();
+ int i = 0;
+ while (block.isValid() && i < pos) {
+ block = block.next();
+ ++i;
+ }
+ return block;
+}
+
+static int qTextBlockPosition(QTextBlock block)
+{
+ int child = 0;
+ while (block.isValid()) {
+ block = block.previous();
+ ++child;
+ }
+
+ return child;
+}
+
+/*!
+ \fn QAccessibleTextEdit::QAccessibleTextEdit(QWidget* widget)
+
+ Constructs a QAccessibleTextEdit object for a \a widget.
+*/
+QAccessibleTextEdit::QAccessibleTextEdit(QWidget *o)
+: QAccessibleWidgetEx(o, EditableText)
+{
+ Q_ASSERT(widget()->inherits("QTextEdit"));
+ childOffset = QAccessibleWidgetEx::childCount();
+}
+
+/*! Returns the text edit. */
+QTextEdit *QAccessibleTextEdit::textEdit() const
+{
+ return static_cast<QTextEdit *>(widget());
+}
+
+QRect QAccessibleTextEdit::rect(int child) const
+{
+ if (child <= childOffset)
+ return QAccessibleWidgetEx::rect(child);
+
+ QTextEdit *edit = textEdit();
+ QTextBlock block = qTextBlockAt(edit->document(), child - childOffset - 1);
+ if (!block.isValid())
+ return QRect();
+
+ QRect rect = edit->document()->documentLayout()->blockBoundingRect(block).toRect();
+ rect.translate(-edit->horizontalScrollBar()->value(), -edit->verticalScrollBar()->value());
+
+ rect = edit->viewport()->rect().intersect(rect);
+ if (rect.isEmpty())
+ return QRect();
+
+ return rect.translated(edit->viewport()->mapToGlobal(QPoint(0, 0)));
+}
+
+int QAccessibleTextEdit::childAt(int x, int y) const
+{
+ QTextEdit *edit = textEdit();
+ if (!edit->isVisible())
+ return -1;
+
+ QPoint point = edit->viewport()->mapFromGlobal(QPoint(x, y));
+ QTextBlock block = edit->cursorForPosition(point).block();
+ if (block.isValid())
+ return qTextBlockPosition(block) + childOffset;
+
+ return QAccessibleWidgetEx::childAt(x, y);
+}
+
+/*! \reimp */
+QString QAccessibleTextEdit::text(Text t, int child) const
+{
+ if (t == Value) {
+ if (child > childOffset)
+ return qTextBlockAt(textEdit()->document(), child - childOffset - 1).text();
+ if (!child)
+ return textEdit()->toPlainText();
+ }
+
+ return QAccessibleWidgetEx::text(t, child);
+}
+
+/*! \reimp */
+void QAccessibleTextEdit::setText(Text t, int child, const QString &text)
+{
+ if (t != Value || (child > 0 && child <= childOffset)) {
+ QAccessibleWidgetEx::setText(t, child, text);
+ return;
+ }
+ if (textEdit()->isReadOnly())
+ return;
+
+ if (!child) {
+ textEdit()->setText(text);
+ return;
+ }
+ QTextBlock block = qTextBlockAt(textEdit()->document(), child - childOffset - 1);
+ if (!block.isValid())
+ return;
+
+ QTextCursor cursor(block);
+ cursor.select(QTextCursor::BlockUnderCursor);
+ cursor.insertText(text);
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleTextEdit::role(int child) const
+{
+ if (child > childOffset)
+ return EditableText;
+ return QAccessibleWidgetEx::role(child);
+}
+
+QVariant QAccessibleTextEdit::invokeMethodEx(QAccessible::Method method, int child,
+ const QVariantList &params)
+{
+ if (child)
+ return QVariant();
+
+ switch (method) {
+ case ListSupportedMethods: {
+ QSet<QAccessible::Method> set;
+ set << ListSupportedMethods << SetCursorPosition << GetCursorPosition;
+ return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
+ QAccessibleWidgetEx::invokeMethodEx(method, child, params)));
+ }
+ case SetCursorPosition:
+ setCursorPosition(params.value(0).toInt());
+ return true;
+ case GetCursorPosition:
+ return textEdit()->textCursor().position();
+ default:
+ return QAccessibleWidgetEx::invokeMethodEx(method, child, params);
+ }
+}
+
+int QAccessibleTextEdit::childCount() const
+{
+ return childOffset + textEdit()->document()->blockCount();
+}
+#endif // QT_NO_TEXTEDIT
+
+#ifndef QT_NO_STACKEDWIDGET
+// ======================= QAccessibleStackedWidget ======================
+QAccessibleStackedWidget::QAccessibleStackedWidget(QWidget *widget)
+ : QAccessibleWidgetEx(widget, LayeredPane)
+{
+ Q_ASSERT(qobject_cast<QStackedWidget *>(widget));
+}
+
+QVariant QAccessibleStackedWidget::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+
+int QAccessibleStackedWidget::childAt(int x, int y) const
+{
+ if (!stackedWidget()->isVisible())
+ return -1;
+ QWidget *currentWidget = stackedWidget()->currentWidget();
+ if (!currentWidget)
+ return -1;
+ QPoint position = currentWidget->mapFromGlobal(QPoint(x, y));
+ if (currentWidget->rect().contains(position))
+ return 1;
+ return -1;
+}
+
+int QAccessibleStackedWidget::childCount() const
+{
+ return stackedWidget()->count();
+}
+
+int QAccessibleStackedWidget::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (!child || (stackedWidget()->currentWidget() != child->object()))
+ return -1;
+ return 1;
+}
+
+int QAccessibleStackedWidget::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+
+ QObject *targetObject = 0;
+ switch (relation) {
+ case Child:
+ if (entry != 1)
+ return -1;
+ targetObject = stackedWidget()->currentWidget();
+ break;
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+ *target = QAccessible::queryAccessibleInterface(targetObject);
+ return *target ? 0 : -1;
+}
+
+QStackedWidget *QAccessibleStackedWidget::stackedWidget() const
+{
+ return static_cast<QStackedWidget *>(object());
+}
+#endif // QT_NO_STACKEDWIDGET
+
+#ifndef QT_NO_TOOLBOX
+// ======================= QAccessibleToolBox ======================
+QAccessibleToolBox::QAccessibleToolBox(QWidget *widget)
+ : QAccessibleWidgetEx(widget, LayeredPane)
+{
+ Q_ASSERT(qobject_cast<QToolBox *>(widget));
+}
+
+QString QAccessibleToolBox::text(Text textType, int child) const
+{
+ if (textType != Value || child <= 0 || child > toolBox()->count())
+ return QAccessibleWidgetEx::text(textType, child);
+ return toolBox()->itemText(child - 1);
+}
+
+void QAccessibleToolBox::setText(Text textType, int child, const QString &text)
+{
+ if (textType != Value || child <= 0 || child > toolBox()->count()) {
+ QAccessibleWidgetEx::setText(textType, child, text);
+ return;
+ }
+ toolBox()->setItemText(child - 1, text);
+}
+
+QAccessible::State QAccessibleToolBox::state(int child) const
+{
+ QWidget *childWidget = toolBox()->widget(child - 1);
+ if (!childWidget)
+ return QAccessibleWidgetEx::state(child);
+ QAccessible::State childState = QAccessible::Normal;
+ if (toolBox()->currentWidget() == childWidget)
+ childState |= QAccessible::Expanded;
+ else
+ childState |= QAccessible::Collapsed;
+ return childState;
+}
+
+QVariant QAccessibleToolBox::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+int QAccessibleToolBox::childCount() const
+{
+ return toolBox()->count();
+}
+
+int QAccessibleToolBox::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (!child)
+ return -1;
+ QWidget *childWidget = qobject_cast<QWidget *>(child->object());
+ if (!childWidget)
+ return -1;
+ int index = toolBox()->indexOf(childWidget);
+ if (index != -1)
+ ++index;
+ return index;
+}
+
+int QAccessibleToolBox::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ if (entry <= 0 || entry > toolBox()->count())
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ int index = -1;
+ if (relation == QAccessible::Up)
+ index = entry - 2;
+ else if (relation == QAccessible::Down)
+ index = entry;
+ *target = QAccessible::queryAccessibleInterface(toolBox()->widget(index));
+ return *target ? 0: -1;
+}
+
+QToolBox * QAccessibleToolBox::toolBox() const
+{
+ return static_cast<QToolBox *>(object());
+}
+#endif // QT_NO_TOOLBOX
+
+// ======================= QAccessibleMdiArea ======================
+#ifndef QT_NO_MDIAREA
+QAccessibleMdiArea::QAccessibleMdiArea(QWidget *widget)
+ : QAccessibleWidgetEx(widget, LayeredPane)
+{
+ Q_ASSERT(qobject_cast<QMdiArea *>(widget));
+}
+
+QAccessible::State QAccessibleMdiArea::state(int child) const
+{
+ if (child < 0)
+ return QAccessibleWidgetEx::state(child);
+ if (child == 0)
+ return QAccessible::Normal;
+ QList<QMdiSubWindow *> subWindows = mdiArea()->subWindowList();
+ if (subWindows.isEmpty() || child > subWindows.count())
+ return QAccessibleWidgetEx::state(child);
+ if (subWindows.at(child - 1) == mdiArea()->activeSubWindow())
+ return QAccessible::Focused;
+ return QAccessible::Normal;
+}
+
+QVariant QAccessibleMdiArea::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+int QAccessibleMdiArea::childCount() const
+{
+ return mdiArea()->subWindowList().count();
+}
+
+int QAccessibleMdiArea::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (!child || !child->object() || mdiArea()->subWindowList().isEmpty())
+ return -1;
+ if (QMdiSubWindow *window = qobject_cast<QMdiSubWindow *>(child->object())) {
+ int index = mdiArea()->subWindowList().indexOf(window);
+ if (index != -1)
+ return ++index;
+ }
+ return -1;
+}
+
+int QAccessibleMdiArea::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ QWidget *targetObject = 0;
+ QList<QMdiSubWindow *> subWindows = mdiArea()->subWindowList();
+ switch (relation) {
+ case Child:
+ if (entry < 1 || subWindows.isEmpty() || entry > subWindows.count())
+ return -1;
+ targetObject = subWindows.at(entry - 1);
+ break;
+ case Up:
+ case Down:
+ case Left:
+ case Right:
+ targetObject = mdiAreaNavigate(mdiArea(), relation, entry);
+ break;
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+ *target = QAccessible::queryAccessibleInterface(targetObject);
+ return *target ? 0: -1;
+}
+
+QMdiArea *QAccessibleMdiArea::mdiArea() const
+{
+ return static_cast<QMdiArea *>(object());
+}
+
+// ======================= QAccessibleMdiSubWindow ======================
+QAccessibleMdiSubWindow::QAccessibleMdiSubWindow(QWidget *widget)
+ : QAccessibleWidgetEx(widget, QAccessible::Window)
+{
+ Q_ASSERT(qobject_cast<QMdiSubWindow *>(widget));
+}
+
+QString QAccessibleMdiSubWindow::text(Text textType, int child) const
+{
+ if (textType == QAccessible::Name && (child == 0 || child == 1)) {
+ QString title = mdiSubWindow()->windowTitle();
+ title.replace(QLatin1String("[*]"), QLatin1String(""));
+ return title;
+ }
+ return QAccessibleWidgetEx::text(textType, child);
+}
+
+void QAccessibleMdiSubWindow::setText(Text textType, int child, const QString &text)
+{
+ if (textType == QAccessible::Name && (child == 0 || child == 1))
+ mdiSubWindow()->setWindowTitle(text);
+ else
+ QAccessibleWidgetEx::setText(textType, child, text);
+}
+
+QAccessible::State QAccessibleMdiSubWindow::state(int child) const
+{
+ if (child != 0 || !mdiSubWindow()->parent())
+ return QAccessibleWidgetEx::state(child);
+ QAccessible::State state = QAccessible::Normal | QAccessible::Focusable;
+ if (!mdiSubWindow()->isMaximized())
+ state |= (QAccessible::Movable | QAccessible::Sizeable);
+ if (mdiSubWindow()->isAncestorOf(QApplication::focusWidget())
+ || QApplication::focusWidget() == mdiSubWindow())
+ state |= QAccessible::Focused;
+ if (!mdiSubWindow()->isVisible())
+ state |= QAccessible::Invisible;
+ if (!mdiSubWindow()->parentWidget()->contentsRect().contains(mdiSubWindow()->geometry()))
+ state |= QAccessible::Offscreen;
+ if (!mdiSubWindow()->isEnabled())
+ state |= QAccessible::Unavailable;
+ return state;
+}
+
+QVariant QAccessibleMdiSubWindow::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+int QAccessibleMdiSubWindow::childCount() const
+{
+ if (mdiSubWindow()->widget())
+ return 1;
+ return 0;
+}
+
+int QAccessibleMdiSubWindow::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (child && child->object() && child->object() == mdiSubWindow()->widget())
+ return 1;
+ return -1;
+}
+
+int QAccessibleMdiSubWindow::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+
+ if (!mdiSubWindow()->parent())
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+
+ QWidget *targetObject = 0;
+ QMdiSubWindow *source = mdiSubWindow();
+ switch (relation) {
+ case Child:
+ if (entry != 1 || !source->widget())
+ return -1;
+ targetObject = source->widget();
+ break;
+ case Up:
+ case Down:
+ case Left:
+ case Right: {
+ if (entry != 0)
+ break;
+ QWidget *parent = source->parentWidget();
+ while (parent && !parent->inherits("QMdiArea"))
+ parent = parent->parentWidget();
+ QMdiArea *mdiArea = qobject_cast<QMdiArea *>(parent);
+ if (!mdiArea)
+ break;
+ int index = mdiArea->subWindowList().indexOf(source);
+ if (index == -1)
+ break;
+ if (QWidget *dest = mdiAreaNavigate(mdiArea, relation, index + 1)) {
+ *target = QAccessible::queryAccessibleInterface(dest);
+ return *target ? 0 : -1;
+ }
+ break;
+ }
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+ *target = QAccessible::queryAccessibleInterface(targetObject);
+ return *target ? 0: -1;
+}
+
+QRect QAccessibleMdiSubWindow::rect(int child) const
+{
+ if (mdiSubWindow()->isHidden())
+ return QRect();
+ if (!mdiSubWindow()->parent())
+ return QAccessibleWidgetEx::rect(child);
+ const QPoint pos = mdiSubWindow()->mapToGlobal(QPoint(0, 0));
+ if (child == 0)
+ return QRect(pos, mdiSubWindow()->size());
+ if (child == 1 && mdiSubWindow()->widget()) {
+ if (mdiSubWindow()->widget()->isHidden())
+ return QRect();
+ const QRect contentsRect = mdiSubWindow()->contentsRect();
+ return QRect(pos.x() + contentsRect.x(), pos.y() + contentsRect.y(),
+ contentsRect.width(), contentsRect.height());
+ }
+ return QRect();
+}
+
+int QAccessibleMdiSubWindow::childAt(int x, int y) const
+{
+ if (!mdiSubWindow()->isVisible())
+ return -1;
+ if (!mdiSubWindow()->parent())
+ return QAccessibleWidgetEx::childAt(x, y);
+ const QRect globalGeometry = rect(0);
+ if (!globalGeometry.isValid())
+ return -1;
+ const QRect globalChildGeometry = rect(1);
+ if (globalChildGeometry.isValid() && globalChildGeometry.contains(QPoint(x, y)))
+ return 1;
+ if (globalGeometry.contains(QPoint(x, y)))
+ return 0;
+ return -1;
+}
+
+QMdiSubWindow *QAccessibleMdiSubWindow::mdiSubWindow() const
+{
+ return static_cast<QMdiSubWindow *>(object());
+}
+#endif // QT_NO_MDIAREA
+
+// ======================= QAccessibleWorkspace ======================
+#ifndef QT_NO_WORKSPACE
+QAccessibleWorkspace::QAccessibleWorkspace(QWidget *widget)
+ : QAccessibleWidgetEx(widget, LayeredPane)
+{
+ Q_ASSERT(qobject_cast<QWorkspace *>(widget));
+}
+
+QAccessible::State QAccessibleWorkspace::state(int child) const
+{
+ if (child < 0)
+ return QAccessibleWidgetEx::state(child);
+ if (child == 0)
+ return QAccessible::Normal;
+ QWidgetList subWindows = workspace()->windowList();
+ if (subWindows.isEmpty() || child > subWindows.count())
+ return QAccessibleWidgetEx::state(child);
+ if (subWindows.at(child - 1) == workspace()->activeWindow())
+ return QAccessible::Focused;
+ return QAccessible::Normal;
+}
+
+QVariant QAccessibleWorkspace::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+int QAccessibleWorkspace::childCount() const
+{
+ return workspace()->windowList().count();
+}
+
+int QAccessibleWorkspace::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (!child || !child->object() || workspace()->windowList().isEmpty())
+ return -1;
+ if (QWidget *window = qobject_cast<QWidget *>(child->object())) {
+ int index = workspace()->windowList().indexOf(window);
+ if (index != -1)
+ return ++index;
+ }
+ return -1;
+}
+
+int QAccessibleWorkspace::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ QWidget *targetObject = 0;
+ QWidgetList subWindows = workspace()->windowList();
+ switch (relation) {
+ case Child:
+ if (entry < 1 || subWindows.isEmpty() || entry > subWindows.count())
+ return -1;
+ targetObject = subWindows.at(entry - 1);
+ break;
+ case Up:
+ case Down:
+ case Left:
+ case Right:
+ targetObject = mdiAreaNavigate(workspace(), relation, entry);
+ break;
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+ *target = QAccessible::queryAccessibleInterface(targetObject);
+ return *target ? 0: -1;
+}
+
+QWorkspace *QAccessibleWorkspace::workspace() const
+{
+ return static_cast<QWorkspace *>(object());
+}
+#endif
+
+#ifndef QT_NO_DIALOGBUTTONBOX
+// ======================= QAccessibleDialogButtonBox ======================
+QAccessibleDialogButtonBox::QAccessibleDialogButtonBox(QWidget *widget)
+ : QAccessibleWidgetEx(widget, Grouping)
+{
+ Q_ASSERT(qobject_cast<QDialogButtonBox*>(widget));
+}
+
+QVariant QAccessibleDialogButtonBox::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+#endif // QT_NO_DIALOGBUTTONBOX
+
+#ifndef QT_NO_TEXTBROWSER
+QAccessibleTextBrowser::QAccessibleTextBrowser(QWidget *widget)
+ : QAccessibleTextEdit(widget)
+{
+ Q_ASSERT(qobject_cast<QTextBrowser *>(widget));
+}
+
+QAccessible::Role QAccessibleTextBrowser::role(int child) const
+{
+ if (child != 0)
+ return QAccessibleTextEdit::role(child);
+ return QAccessible::StaticText;
+}
+#endif // QT_NO_TEXTBROWSER
+
+#ifndef QT_NO_CALENDARWIDGET
+// ===================== QAccessibleCalendarWidget ========================
+QAccessibleCalendarWidget::QAccessibleCalendarWidget(QWidget *widget)
+ : QAccessibleWidgetEx(widget, Table)
+{
+ Q_ASSERT(qobject_cast<QCalendarWidget *>(widget));
+}
+
+QVariant QAccessibleCalendarWidget::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+int QAccessibleCalendarWidget::childCount() const
+{
+ return calendarWidget()->isNavigationBarVisible() ? 2 : 1;
+}
+
+int QAccessibleCalendarWidget::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (!child || !child->object() || childCount() <= 0)
+ return -1;
+ if (qobject_cast<QAbstractItemView *>(child->object()))
+ return childCount();
+ return 1;
+}
+
+int QAccessibleCalendarWidget::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ if (entry <= 0 || entry > childCount())
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ QWidget *targetWidget = 0;
+ switch (relation) {
+ case Child:
+ if (childCount() == 1) {
+ targetWidget = calendarView();
+ } else {
+ if (entry == 1)
+ targetWidget = navigationBar();
+ else
+ targetWidget = calendarView();
+ }
+ break;
+ case Up:
+ if (entry == 2)
+ targetWidget = navigationBar();
+ break;
+ case Down:
+ if (entry == 1 && childCount() == 2)
+ targetWidget = calendarView();
+ break;
+ default:
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+ }
+ *target = queryAccessibleInterface(targetWidget);
+ return *target ? 0: -1;
+}
+
+QRect QAccessibleCalendarWidget::rect(int child) const
+{
+ if (!calendarWidget()->isVisible() || child > childCount())
+ return QRect();
+ if (child == 0)
+ return QAccessibleWidgetEx::rect(child);
+ QWidget *childWidget = 0;
+ if (childCount() == 2)
+ childWidget = child == 1 ? navigationBar() : calendarView();
+ else
+ childWidget = calendarView();
+ return QRect(childWidget->mapToGlobal(QPoint(0, 0)), childWidget->size());
+}
+
+int QAccessibleCalendarWidget::childAt(int x, int y) const
+{
+ const QPoint globalTargetPos = QPoint(x, y);
+ if (!rect(0).contains(globalTargetPos))
+ return -1;
+ if (rect(1).contains(globalTargetPos))
+ return 1;
+ if (rect(2).contains(globalTargetPos))
+ return 2;
+ return 0;
+}
+
+QCalendarWidget *QAccessibleCalendarWidget::calendarWidget() const
+{
+ return static_cast<QCalendarWidget *>(object());
+}
+
+QAbstractItemView *QAccessibleCalendarWidget::calendarView() const
+{
+ foreach (QObject *child, calendarWidget()->children()) {
+ if (child->objectName() == QLatin1String("qt_calendar_calendarview"))
+ return static_cast<QAbstractItemView *>(child);
+ }
+ return 0;
+}
+
+QWidget *QAccessibleCalendarWidget::navigationBar() const
+{
+ foreach (QObject *child, calendarWidget()->children()) {
+ if (child->objectName() == QLatin1String("qt_calendar_navigationbar"))
+ return static_cast<QWidget *>(child);
+ }
+ return 0;
+}
+#endif // QT_NO_CALENDARWIDGET
+
+#ifndef QT_NO_DOCKWIDGET
+QAccessibleDockWidget::QAccessibleDockWidget(QWidget *widget)
+ : QAccessibleWidgetEx(widget, Window)
+{
+
+}
+
+int QAccessibleDockWidget::navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const
+{
+ if (relation == Child) {
+ if (entry == 1) {
+ *iface = new QAccessibleTitleBar(dockWidget());
+ return 0;
+ } else if (entry == 2) {
+ if (dockWidget()->widget())
+ *iface = QAccessible::queryAccessibleInterface(dockWidget()->widget());
+ return 0;
+ }
+ *iface = 0;
+ return -1;
+ }
+ return QAccessibleWidgetEx::navigate(relation, entry, iface);
+}
+
+int QAccessibleDockWidget::childAt(int x, int y) const
+{
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(x,y))
+ return i;
+ }
+ return -1;
+}
+
+int QAccessibleDockWidget::childCount() const
+{
+ return dockWidget()->widget() ? 2 : 1;
+}
+
+int QAccessibleDockWidget::indexOfChild(const QAccessibleInterface *child) const
+{
+ if (child) {
+ if (child->role(0) == TitleBar) {
+ return 1;
+ } else {
+ return 2; //###
+ }
+ }
+ return -1;
+}
+
+QAccessible::Role QAccessibleDockWidget::role(int child) const
+{
+ switch (child) {
+ case 0:
+ return Window;
+ case 1:
+ return TitleBar;
+ case 2:
+ //###
+ break;
+ default:
+ break;
+ }
+ return NoRole;
+}
+
+QAccessible::State QAccessibleDockWidget::state(int child) const
+{
+ //### mark tabified widgets as invisible
+ return QAccessibleWidgetEx::state(child);
+}
+
+QRect QAccessibleDockWidget::rect (int child ) const
+{
+ QRect rect;
+ bool mapToGlobal = true;
+ if (child == 0) {
+ if (dockWidget()->isFloating()) {
+ rect = dockWidget()->frameGeometry();
+ mapToGlobal = false;
+ } else {
+ rect = dockWidget()->rect();
+ }
+ }else if (child == 1) {
+ QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
+ rect = layout->titleArea();
+ }else if (child == 2) {
+ if (dockWidget()->widget())
+ rect = dockWidget()->widget()->geometry();
+ }
+ if (rect.isNull())
+ return rect;
+
+ if (mapToGlobal)
+ rect.moveTopLeft(dockWidget()->mapToGlobal(rect.topLeft()));
+
+ return rect;
+}
+
+QVariant QAccessibleDockWidget::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+QDockWidget *QAccessibleDockWidget::dockWidget() const
+{
+ return static_cast<QDockWidget *>(object());
+}
+
+////
+// QAccessibleTitleBar
+////
+QAccessibleTitleBar::QAccessibleTitleBar(QDockWidget *widget)
+ : m_dockWidget(widget)
+{
+
+}
+
+int QAccessibleTitleBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const
+{
+ if (entry == 0 || relation == Self) {
+ *iface = new QAccessibleTitleBar(dockWidget());
+ return 0;
+ }
+ switch (relation) {
+ case Child:
+ case FocusChild:
+ if (entry >= 1) {
+ QDockWidgetLayout *layout = dockWidgetLayout();
+ int index = 1;
+ int role;
+ for (role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
+ QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
+ if (!w->isVisible())
+ continue;
+ if (index == entry)
+ break;
+ ++index;
+ }
+ *iface = 0;
+ return role > QDockWidgetLayout::FloatButton ? -1 : index;
+ }
+ break;
+ case Ancestor:
+ {
+ QAccessibleDockWidget *target = new QAccessibleDockWidget(dockWidget());
+ int index;
+ if (entry == 1) {
+ *iface = target;
+ return 0;
+ }
+ index = target->navigate(Ancestor, entry - 1, iface);
+ delete target;
+ return index;
+
+ break;}
+ case Sibling:
+ return navigate(Child, entry, iface);
+ break;
+ default:
+ break;
+ }
+ *iface = 0;
+ return -1;
+}
+
+QAccessible::Relation QAccessibleTitleBar::relationTo(int /*child*/, const QAccessibleInterface * /*other*/, int /*otherChild*/) const
+{
+ return Unrelated; //###
+}
+
+int QAccessibleTitleBar::indexOfChild(const QAccessibleInterface * /*child*/) const
+{
+ return -1;
+}
+
+int QAccessibleTitleBar::childCount() const
+{
+ QDockWidgetLayout *layout = dockWidgetLayout();
+ int count = 0;
+ for (int role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
+ QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
+ if (w && w->isVisible())
+ ++count;
+ }
+ return count;
+}
+
+QString QAccessibleTitleBar::text(Text t, int child) const
+{
+ if (!child) {
+ if (t == Value) {
+ return dockWidget()->windowTitle();
+ }
+ }
+ return QString();
+}
+
+QAccessible::State QAccessibleTitleBar::state(int child) const
+{
+ QAccessible::State state = Normal;
+ if (child) {
+ QDockWidgetLayout *layout = dockWidgetLayout();
+ QAbstractButton *b = static_cast<QAbstractButton *>(layout->widgetForRole((QDockWidgetLayout::Role)child));
+ if (b) {
+ if (b->isDown())
+ state |= Pressed;
+ }
+ } else {
+ QDockWidget *w = dockWidget();
+ if (w->testAttribute(Qt::WA_WState_Visible) == false)
+ state |= Invisible;
+ if (w->focusPolicy() != Qt::NoFocus && w->isActiveWindow())
+ state |= Focusable;
+ if (w->hasFocus())
+ state |= Focused;
+ if (!w->isEnabled())
+ state |= Unavailable;
+ }
+
+ return state;
+}
+
+QRect QAccessibleTitleBar::rect (int child ) const
+{
+ bool mapToGlobal = true;
+ QRect rect;
+ if (child == 0) {
+ if (dockWidget()->isFloating()) {
+ rect = dockWidget()->frameGeometry();
+ QPoint globalPos = dockWidget()->mapToGlobal( dockWidget()->widget()->rect().topLeft() );
+ globalPos.ry()--;
+ rect.setBottom(globalPos.y());
+ mapToGlobal = false;
+ } else {
+ QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
+ rect = layout->titleArea();
+ }
+ }else if (child >= 1 && child <= childCount()) {
+ QDockWidgetLayout *layout = dockWidgetLayout();
+ int index = 1;
+ for (int role = QDockWidgetLayout::CloseButton; role <= QDockWidgetLayout::FloatButton; ++role) {
+ QWidget *w = layout->widgetForRole((QDockWidgetLayout::Role)role);
+ if (!w || !w->isVisible())
+ continue;
+ if (index == child) {
+ rect = w->geometry();
+ break;
+ }
+ ++index;
+ }
+ }
+ if (rect.isNull())
+ return rect;
+
+ if (mapToGlobal)
+ rect.moveTopLeft(dockWidget()->mapToGlobal(rect.topLeft()));
+ return rect;
+}
+
+int QAccessibleTitleBar::childAt(int x, int y) const
+{
+ for (int i = childCount(); i >= 0; --i) {
+ if (rect(i).contains(x,y))
+ return i;
+ }
+ return -1;
+}
+
+QObject *QAccessibleTitleBar::object() const
+{
+ return 0;
+}
+
+QDockWidgetLayout *QAccessibleTitleBar::dockWidgetLayout() const
+{
+ return qobject_cast<QDockWidgetLayout*>(dockWidget()->layout());
+}
+
+QDockWidget *QAccessibleTitleBar::dockWidget() const
+{
+ return m_dockWidget;
+}
+
+QString QAccessibleTitleBar::actionText(int action, Text t, int child) const
+{
+ QString str;
+ if (child >= 1 && child <= childCount()) {
+ if (t == Name) {
+ switch (action) {
+ case Press:
+ case DefaultAction:
+ if (child == QDockWidgetLayout::CloseButton) {
+ str = QDockWidget::tr("Close");
+ } else if (child == QDockWidgetLayout::FloatButton) {
+ str = dockWidget()->isFloating() ? QDockWidget::tr("Dock")
+ : QDockWidget::tr("Float");
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return str;
+}
+
+bool QAccessibleTitleBar::doAction(int action, int child, const QVariantList& /*params*/)
+{
+ if (!child || !dockWidget()->isEnabled())
+ return false;
+
+ switch (action) {
+ case DefaultAction:
+ case Press: {
+ QDockWidgetLayout *layout = dockWidgetLayout();
+ QAbstractButton *btn = static_cast<QAbstractButton *>(layout->widgetForRole((QDockWidgetLayout::Role)child));
+ if (btn)
+ btn->animateClick();
+ return true;
+ break;}
+ default:
+ break;
+ }
+
+ return false;
+}
+
+int QAccessibleTitleBar::userActionCount (int /*child*/) const
+{
+ return 0;
+}
+
+QAccessible::Role QAccessibleTitleBar::role(int child) const
+{
+ switch (child) {
+ case 0:
+ return TitleBar;
+ break;
+ default:
+ if (child >= 1 && child <= childCount())
+ return PushButton;
+ break;
+ }
+
+ return NoRole;
+}
+
+void QAccessibleTitleBar::setText(Text /*t*/, int /*child*/, const QString &/*text*/)
+{
+
+}
+
+bool QAccessibleTitleBar::isValid() const
+{
+ return dockWidget();
+}
+
+#endif // QT_NO_DOCKWIDGET
+
+#ifndef QT_NO_TEXTEDIT
+void QAccessibleTextEdit::addSelection(int startOffset, int endOffset)
+{
+ setSelection(0, startOffset, endOffset);
+}
+
+QString QAccessibleTextEdit::attributes(int offset, int *startOffset, int *endOffset)
+{
+ // TODO - wait for a definition of attributes
+ Q_UNUSED(offset);
+ Q_UNUSED(startOffset);
+ Q_UNUSED(endOffset);
+ return QString();
+}
+
+int QAccessibleTextEdit::cursorPosition()
+{
+ return textEdit()->textCursor().position();
+}
+
+QRect QAccessibleTextEdit::characterRect(int offset, CoordinateType coordType)
+{
+ QTextEdit *edit = textEdit();
+ QTextCursor cursor(edit->document());
+ cursor.setPosition(offset);
+
+ if (cursor.position() != offset)
+ return QRect();
+
+ QRect r = edit->cursorRect(cursor);
+ if (cursor.movePosition(QTextCursor::NextCharacter)) {
+ r.setWidth(edit->cursorRect(cursor).y() - r.y());
+ } else {
+ // we don't know the width of the character - maybe because we're at document end
+ // in that case, IAccessible2 tells us to return the width of a default character
+ int averageCharWidth = QFontMetrics(cursor.charFormat().font()).averageCharWidth();
+ if (edit->layoutDirection() == Qt::RightToLeft)
+ averageCharWidth *= -1;
+ r.setWidth(averageCharWidth);
+ }
+
+ switch (coordType) {
+ case RelativeToScreen:
+ r.moveTo(edit->viewport()->mapToGlobal(r.topLeft()));
+ break;
+ case RelativeToParent:
+ break;
+ }
+
+ return r;
+}
+
+int QAccessibleTextEdit::selectionCount()
+{
+ return textEdit()->textCursor().hasSelection() ? 1 : 0;
+}
+
+int QAccessibleTextEdit::offsetAtPoint(const QPoint &point, CoordinateType coordType)
+{
+ QTextEdit *edit = textEdit();
+
+ QPoint p = point;
+ if (coordType == RelativeToScreen)
+ p = edit->viewport()->mapFromGlobal(p);
+ // convert to document coordinates
+ p += QPoint(edit->horizontalScrollBar()->value(), edit->verticalScrollBar()->value());
+
+ return edit->document()->documentLayout()->hitTest(p, Qt::ExactHit);
+}
+
+void QAccessibleTextEdit::selection(int selectionIndex, int *startOffset, int *endOffset)
+{
+ *startOffset = *endOffset = 0;
+ QTextCursor cursor = textEdit()->textCursor();
+
+ if (selectionIndex != 0 || !cursor.hasSelection())
+ return;
+
+ *startOffset = cursor.selectionStart();
+ *endOffset = cursor.selectionEnd();
+}
+
+QString QAccessibleTextEdit::text(int startOffset, int endOffset)
+{
+ QTextCursor cursor(textEdit()->document());
+
+ cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
+ cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
+
+ return cursor.selectedText();
+}
+
+QString QAccessibleTextEdit::textBeforeOffset (int offset, BoundaryType boundaryType,
+ int *startOffset, int *endOffset)
+{
+ // TODO - what exactly is before?
+ Q_UNUSED(offset);
+ Q_UNUSED(boundaryType);
+ Q_UNUSED(startOffset);
+ Q_UNUSED(endOffset);
+ return QString();
+}
+
+QString QAccessibleTextEdit::textAfterOffset(int offset, BoundaryType boundaryType,
+ int *startOffset, int *endOffset)
+{
+ // TODO - what exactly is after?
+ Q_UNUSED(offset);
+ Q_UNUSED(boundaryType);
+ Q_UNUSED(startOffset);
+ Q_UNUSED(endOffset);
+ return QString();
+}
+
+QString QAccessibleTextEdit::textAtOffset(int offset, BoundaryType boundaryType,
+ int *startOffset, int *endOffset)
+{
+ Q_ASSERT(startOffset);
+ Q_ASSERT(endOffset);
+
+ *startOffset = *endOffset = -1;
+ QTextEdit *edit = textEdit();
+
+ QTextCursor cursor(edit->document());
+ if (offset >= characterCount())
+ return QString();
+
+ switch (boundaryType) {
+ case CharBoundary:
+ cursor.setPosition(offset);
+ *startOffset = cursor.position();
+ cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
+ *endOffset = cursor.position();
+ break;
+ case WordBoundary:
+ cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::MoveAnchor);
+ *startOffset = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
+ *endOffset = cursor.position();
+ break;
+ case SentenceBoundary:
+ // TODO - what's a sentence?
+ return QString();
+ case LineBoundary:
+ cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
+ *startOffset = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
+ *endOffset = cursor.position();
+ break;
+ case ParagraphBoundary:
+ cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);
+ *startOffset = cursor.position();
+ cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
+ *endOffset = cursor.position();
+ break;
+ case NoBoundary: {
+ *startOffset = 0;
+ const QString txt = edit->toPlainText();
+ *endOffset = txt.count();
+ return txt; }
+ default:
+ qDebug("AccessibleTextAdaptor::textAtOffset: Unknown boundary type %d", boundaryType);
+ return QString();
+ }
+
+ return cursor.selectedText();
+}
+
+void QAccessibleTextEdit::removeSelection(int selectionIndex)
+{
+ if (selectionIndex != 0)
+ return;
+
+ QTextCursor cursor = textEdit()->textCursor();
+ cursor.clearSelection();
+ textEdit()->setTextCursor(cursor);
+}
+
+void QAccessibleTextEdit::setCursorPosition(int position)
+{
+ QTextCursor cursor = textEdit()->textCursor();
+ cursor.setPosition(position);
+ textEdit()->setTextCursor(cursor);
+}
+
+void QAccessibleTextEdit::setSelection(int selectionIndex, int startOffset, int endOffset)
+{
+ if (selectionIndex != 0)
+ return;
+
+ QTextCursor cursor = textEdit()->textCursor();
+ cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
+ cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
+ textEdit()->setTextCursor(cursor);
+}
+
+int QAccessibleTextEdit::characterCount()
+{
+ return textEdit()->toPlainText().count();
+}
+
+void QAccessibleTextEdit::scrollToSubstring(int startIndex, int endIndex)
+{
+ QTextEdit *edit = textEdit();
+
+ QTextCursor cursor(edit->document());
+ cursor.setPosition(startIndex);
+ QRect r = edit->cursorRect(cursor);
+
+ cursor.setPosition(endIndex);
+ r.setBottomRight(edit->cursorRect(cursor).bottomRight());
+
+ r.moveTo(r.x() + edit->horizontalScrollBar()->value(),
+ r.y() + edit->verticalScrollBar()->value());
+
+ // E V I L, but ensureVisible is not public
+ if (!QMetaObject::invokeMethod(edit, "_q_ensureVisible", Q_ARG(QRectF, r)))
+ qWarning("AccessibleTextEdit::scrollToSubstring failed!");
+}
+
+static QTextCursor cursorForRange(QTextEdit *textEdit, int startOffset, int endOffset)
+{
+ QTextCursor cursor(textEdit->document());
+ cursor.setPosition(startOffset, QTextCursor::MoveAnchor);
+ cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
+
+ return cursor;
+}
+
+void QAccessibleTextEdit::copyText(int startOffset, int endOffset)
+{
+ QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
+
+ if (!cursor.hasSelection())
+ return;
+
+// QApplication::clipboard()->setMimeData(new QTextEditMimeData(cursor.selection()));
+}
+
+void QAccessibleTextEdit::deleteText(int startOffset, int endOffset)
+{
+ QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
+
+ cursor.removeSelectedText();
+}
+
+void QAccessibleTextEdit::insertText(int offset, const QString &text)
+{
+ QTextCursor cursor(textEdit()->document());
+ cursor.setPosition(offset);
+
+ cursor.insertText(text);
+}
+
+void QAccessibleTextEdit::cutText(int startOffset, int endOffset)
+{
+ QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
+
+ if (!cursor.hasSelection())
+ return;
+
+// QApplication::clipboard()->setMimeData(new QTextEditMimeData(cursor.selection()));
+ cursor.removeSelectedText();
+}
+
+void QAccessibleTextEdit::pasteText(int offset)
+{
+ QTextEdit *edit = textEdit();
+
+ QTextCursor oldCursor = edit->textCursor();
+ QTextCursor newCursor = oldCursor;
+ newCursor.setPosition(offset);
+
+ edit->setTextCursor(newCursor);
+#ifndef QT_NO_CLIPBOARD
+ edit->paste();
+#endif
+ edit->setTextCursor(oldCursor);
+}
+
+void QAccessibleTextEdit::replaceText(int startOffset, int endOffset, const QString &text)
+{
+ QTextCursor cursor = cursorForRange(textEdit(), startOffset, endOffset);
+
+ cursor.removeSelectedText();
+ cursor.insertText(text);
+}
+
+void QAccessibleTextEdit::setAttributes(int startOffset, int endOffset, const QString &attributes)
+{
+ // TODO
+ Q_UNUSED(startOffset);
+ Q_UNUSED(endOffset);
+ Q_UNUSED(attributes);
+}
+
+#endif // QT_NO_TEXTEDIT
+
+#ifndef QT_NO_MAINWINDOW
+QAccessibleMainWindow::QAccessibleMainWindow(QWidget *widget)
+ : QAccessibleWidgetEx(widget, Application) { }
+
+QVariant QAccessibleMainWindow::invokeMethodEx(QAccessible::Method /*method*/, int /*child*/, const QVariantList & /*params*/)
+{
+ return QVariant();
+}
+
+int QAccessibleMainWindow::childCount() const
+{
+ QList<QWidget*> kids = childWidgets(mainWindow(), true);
+ return kids.count();
+}
+
+int QAccessibleMainWindow::indexOfChild(const QAccessibleInterface *iface) const
+{
+ QList<QWidget*> kids = childWidgets(mainWindow(), true);
+ int childIndex = kids.indexOf(static_cast<QWidget*>(iface->object()));
+ return childIndex == -1 ? -1 : ++childIndex;
+}
+
+int QAccessibleMainWindow::navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const
+{
+ if (relation == Child && entry >= 1) {
+ QList<QWidget*> kids = childWidgets(mainWindow(), true);
+ if (entry <= kids.count()) {
+ *iface = QAccessible::queryAccessibleInterface(kids.at(entry - 1));
+ return *iface ? 0 : -1;
+ }
+ }
+ return QAccessibleWidgetEx::navigate(relation, entry, iface);
+}
+
+int QAccessibleMainWindow::childAt(int x, int y) const
+{
+ QWidget *w = widget();
+ if (!w->isVisible())
+ return -1;
+ QPoint gp = w->mapToGlobal(QPoint(0, 0));
+ if (!QRect(gp.x(), gp.y(), w->width(), w->height()).contains(x, y))
+ return -1;
+
+ QWidgetList kids = childWidgets(mainWindow(), true);
+ QPoint rp = mainWindow()->mapFromGlobal(QPoint(x, y));
+ for (int i = 0; i < kids.size(); ++i) {
+ QWidget *child = kids.at(i);
+ if (!child->isWindow() && !child->isHidden() && child->geometry().contains(rp)) {
+ return i + 1;
+ }
+ }
+ return 0;
+}
+
+QMainWindow *QAccessibleMainWindow::mainWindow() const
+{
+ return qobject_cast<QMainWindow *>(object());
+}
+
+#endif //QT_NO_MAINWINDOW
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h
new file mode 100644
index 0000000000..64c2bde188
--- /dev/null
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h
@@ -0,0 +1,318 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEWIDGETS_H
+#define QACCESSIBLEWIDGETS_H
+
+#include <QtGui/qaccessible2.h>
+#include <QtGui/qaccessiblewidget.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+#include <QtCore/QPointer>
+
+QT_BEGIN_NAMESPACE
+
+class QTextEdit;
+class QStackedWidget;
+class QToolBox;
+class QMdiArea;
+class QMdiSubWindow;
+class QWorkspace;
+class QRubberBand;
+class QTextBrowser;
+class QCalendarWidget;
+class QAbstractItemView;
+class QDockWidget;
+class QDockWidgetLayout;
+class QMainWindow;
+
+#ifndef QT_NO_TEXTEDIT
+class QAccessibleTextEdit : public QAccessibleWidgetEx, public QAccessibleTextInterface,
+ public QAccessibleEditableTextInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleTextEdit(QWidget *o);
+
+ QString text(Text t, int child) const;
+ void setText(Text t, int control, const QString &text);
+ Role role(int child) const;
+
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+
+ QRect rect(int child) const;
+ int childAt(int x, int y) const;
+
+ int childCount() const;
+
+ // QAccessibleTextInterface
+ void addSelection(int startOffset, int endOffset);
+ QString attributes(int offset, int *startOffset, int *endOffset);
+ int cursorPosition();
+ QRect characterRect(int offset, QAccessible2::CoordinateType coordType);
+ int selectionCount();
+ int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType);
+ void selection(int selectionIndex, int *startOffset, int *endOffset);
+ QString text(int startOffset, int endOffset);
+ QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset);
+ QString textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset);
+ QString textAtOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset);
+ void removeSelection(int selectionIndex);
+ void setCursorPosition(int position);
+ void setSelection(int selectionIndex, int startOffset, int endOffset);
+ int characterCount();
+ void scrollToSubstring(int startIndex, int endIndex);
+
+ // QAccessibleEditableTextInterface
+ void copyText(int startOffset, int endOffset);
+ void deleteText(int startOffset, int endOffset);
+ void insertText(int offset, const QString &text);
+ void cutText(int startOffset, int endOffset);
+ void pasteText(int offset);
+ void replaceText(int startOffset, int endOffset, const QString &text);
+ void setAttributes(int startOffset, int endOffset, const QString &attributes);
+
+protected:
+ QTextEdit *textEdit() const;
+
+private:
+ int childOffset;
+};
+#endif // QT_NO_TEXTEDIT
+
+class QAccessibleStackedWidget : public QAccessibleWidgetEx
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleStackedWidget(QWidget *widget);
+
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childAt(int x, int y) const;
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+
+protected:
+ QStackedWidget *stackedWidget() const;
+};
+
+class QAccessibleToolBox : public QAccessibleWidgetEx
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleToolBox(QWidget *widget);
+
+ QString text(Text textType, int child) const;
+ void setText(Text textType, int child, const QString &text);
+ State state(int child) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+
+protected:
+ QToolBox *toolBox() const;
+};
+
+#ifndef QT_NO_MDIAREA
+class QAccessibleMdiArea : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleMdiArea(QWidget *widget);
+
+ State state(int child) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+
+protected:
+ QMdiArea *mdiArea() const;
+};
+
+class QAccessibleMdiSubWindow : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleMdiSubWindow(QWidget *widget);
+
+ QString text(Text textType, int child) const;
+ void setText(Text textType, int child, const QString &text);
+ State state(int child) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+ QRect rect(int child) const;
+ int childAt(int x, int y) const;
+
+protected:
+ QMdiSubWindow *mdiSubWindow() const;
+};
+#endif // QT_NO_MDIAREA
+
+#ifndef QT_NO_WORKSPACE
+class QAccessibleWorkspace : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleWorkspace(QWidget *widget);
+
+ State state(int child) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+
+protected:
+ QWorkspace *workspace() const;
+};
+#endif
+
+class QAccessibleDialogButtonBox : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleDialogButtonBox(QWidget *widget);
+
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+};
+
+#ifndef QT_NO_TEXTBROWSER
+class QAccessibleTextBrowser : public QAccessibleTextEdit
+{
+public:
+ explicit QAccessibleTextBrowser(QWidget *widget);
+
+ Role role(int child) const;
+};
+#endif // QT_NO_TEXTBROWSER
+
+#ifndef QT_NO_CALENDARWIDGET
+class QAccessibleCalendarWidget : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleCalendarWidget(QWidget *widget);
+
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const;
+ QRect rect(int child) const;
+ int childAt(int x, int y) const;
+
+protected:
+ QCalendarWidget *calendarWidget() const;
+
+private:
+ QAbstractItemView *calendarView() const;
+ QWidget *navigationBar() const;
+};
+#endif // QT_NO_CALENDARWIDGET
+
+#ifndef QT_NO_DOCKWIDGET
+class QAccessibleDockWidget: public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleDockWidget(QWidget *widget);
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int childCount() const;
+ QRect rect (int child ) const;
+ Role role(int child) const;
+ State state(int child) const;
+ int childAt(int x, int y) const;
+
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ QDockWidget *dockWidget() const;
+};
+
+class QAccessibleTitleBar : public QAccessibleInterface
+{
+public:
+ explicit QAccessibleTitleBar(QDockWidget *widget);
+ QString actionText(int action, Text t, int child) const;
+ bool doAction(int action, int child, const QVariantList& params = QVariantList());
+ int userActionCount ( int child) const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const;
+ int indexOfChild(const QAccessibleInterface *child) const;
+ int childCount() const;
+ Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
+ void setText(Text t, int child, const QString &text);
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ QRect rect (int child) const;
+ State state(int child) const;
+ int childAt(int x, int y) const;
+ QObject *object() const;
+ bool isValid() const;
+
+
+ QPointer<QDockWidget> m_dockWidget;
+
+ QDockWidget *dockWidget() const;
+ QDockWidgetLayout *dockWidgetLayout() const;
+};
+
+#endif // QT_NO_DOCKWIDGET
+
+#ifndef QT_NO_MAINWINDOW
+class QAccessibleMainWindow : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleMainWindow(QWidget *widget);
+
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ int childCount() const;
+ int navigate(RelationFlag relation, int entry, QAccessibleInterface **iface) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+ int childAt(int x, int y) const;
+ QMainWindow *mainWindow() const;
+
+};
+#endif //QT_NO_MAINWINDOW
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QACESSIBLEWIDGETS_H
diff --git a/src/plugins/accessible/widgets/rangecontrols.cpp b/src/plugins/accessible/widgets/rangecontrols.cpp
new file mode 100644
index 0000000000..1f5407a631
--- /dev/null
+++ b/src/plugins/accessible/widgets/rangecontrols.cpp
@@ -0,0 +1,991 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "rangecontrols.h"
+
+#include <qslider.h>
+#include <qdial.h>
+#include <qspinbox.h>
+#include <qscrollbar.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+#include <qdebug.h>
+#include <qglobal.h>
+#include <QDoubleSpinBox>
+#include <QDial>
+#include <qmath.h>
+#include <private/qmath_p.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+extern QString Q_GUI_EXPORT qt_accStripAmp(const QString &text);
+#ifndef QT_NO_SCROLLBAR
+extern QStyleOptionSlider Q_GUI_EXPORT qt_qscrollbarStyleOption(QScrollBar *scrollBar);
+#endif
+#ifndef QT_NO_SLIDER
+extern QStyleOptionSlider Q_GUI_EXPORT qt_qsliderStyleOption(QSlider *slider);
+#endif
+
+#ifndef QT_NO_SPINBOX
+QAccessibleAbstractSpinBox::QAccessibleAbstractSpinBox(QWidget *w)
+: QAccessibleWidgetEx(w, SpinBox)
+{
+ Q_ASSERT(abstractSpinBox());
+}
+
+/*!
+ Returns the underlying QAbstractSpinBox.
+*/
+QAbstractSpinBox *QAccessibleAbstractSpinBox::abstractSpinBox() const
+{
+ return qobject_cast<QAbstractSpinBox*>(object());
+}
+
+/*! \reimp */
+int QAccessibleAbstractSpinBox::childCount() const
+{
+ if (!abstractSpinBox()->isVisible())
+ return 0;
+ return ValueDown;
+}
+
+/*! \reimp */
+QRect QAccessibleAbstractSpinBox::rect(int child) const
+{
+ QRect rect;
+ if (!abstractSpinBox()->isVisible())
+ return rect;
+ QStyleOptionSpinBox so;
+ so.rect = widget()->rect();
+ switch(child) {
+ case Editor:
+ rect = widget()->style()->subControlRect(QStyle::CC_SpinBox, &so,
+ QStyle::SC_SpinBoxEditField, widget());
+ break;
+ case ValueUp:
+ rect = widget()->style()->subControlRect(QStyle::CC_SpinBox, &so,
+ QStyle::SC_SpinBoxUp, widget());
+ break;
+ case ValueDown:
+ rect = widget()->style()->subControlRect(QStyle::CC_SpinBox, &so,
+ QStyle::SC_SpinBoxDown, widget());
+ break;
+ default:
+ rect = so.rect;
+ break;
+ }
+ QPoint tl = widget()->mapToGlobal(QPoint(0, 0));
+ return QRect(tl.x() + rect.x(), tl.y() + rect.y(), rect.width(), rect.height());
+}
+
+/*! \reimp */
+int QAccessibleAbstractSpinBox::navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+
+ if (entry) switch (rel) {
+ case Child:
+ return entry <= childCount() ? entry : -1;
+ case QAccessible::Left:
+ return (entry == ValueUp || entry == ValueDown) ? Editor : -1;
+ case QAccessible::Right:
+ return entry == Editor ? ValueUp : -1;
+ case QAccessible::Up:
+ return entry == ValueDown ? ValueUp : -1;
+ case QAccessible::Down:
+ return entry == ValueUp ? ValueDown : -1;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::navigate(rel, entry, target);
+}
+
+/*! \reimp */
+QString QAccessibleAbstractSpinBox::text(Text t, int child) const
+{
+ if (!abstractSpinBox()->isVisible())
+ return QString();
+ switch (t) {
+ case Name:
+ switch (child) {
+ case ValueUp:
+ return QSpinBox::tr("More");
+ case ValueDown:
+ return QSpinBox::tr("Less");
+ }
+ break;
+ case Value:
+ if (child == Editor || child == SpinBoxSelf)
+ return abstractSpinBox()->text();
+ break;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::text(t, 0);
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleAbstractSpinBox::role(int child) const
+{
+ switch(child) {
+ case Editor:
+ return EditableText;
+ case ValueUp:
+ case ValueDown:
+ return PushButton;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::role(child);
+}
+
+/*! \reimp */
+bool QAccessibleAbstractSpinBox::doAction(int action, int child, const QVariantList &params)
+{
+ if (!widget()->isEnabled())
+ return false;
+
+ if (action == Press) {
+ switch(child) {
+ case ValueUp:
+ abstractSpinBox()->stepUp();
+ return true;
+ case ValueDown:
+ abstractSpinBox()->stepDown();
+ return true;
+ default:
+ break;
+ }
+ }
+ return QAccessibleWidgetEx::doAction(action, 0, params);
+}
+
+QVariant QAccessibleAbstractSpinBox::currentValue()
+{
+ QVariant result = abstractSpinBox()->property("value");
+ QVariant::Type type = result.type();
+
+ // IA2 only allows numeric types
+ if (type == QVariant::Int || type == QVariant::UInt || type == QVariant::LongLong
+ || type == QVariant::ULongLong || type == QVariant::Double)
+ return result;
+
+ return QVariant();
+}
+
+void QAccessibleAbstractSpinBox::setCurrentValue(const QVariant &value)
+{
+ abstractSpinBox()->setProperty("setValue", value);
+}
+
+QVariant QAccessibleAbstractSpinBox::maximumValue()
+{
+ return abstractSpinBox()->property("maximum");
+}
+
+QVariant QAccessibleAbstractSpinBox::minimumValue()
+{
+ return abstractSpinBox()->property("minimum");
+}
+
+QVariant QAccessibleAbstractSpinBox::invokeMethodEx(Method method, int child, const QVariantList &params)
+{
+ switch (method) {
+ case ListSupportedMethods: {
+ QSet<QAccessible::Method> set;
+ set << ListSupportedMethods;
+ return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
+ QAccessibleWidgetEx::invokeMethodEx(method, child, params)));
+ }
+ default:
+ return QAccessibleWidgetEx::invokeMethodEx(method, child, params);
+ }
+}
+
+
+/*!
+ \class QAccessibleSpinBox
+ \brief The QAccessibleSpinBox class implements the QAccessibleInterface for spinbox widgets.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ \enum QAccessibleAbstractSpinBox::SpinBoxElements
+
+ This enum identifies the components of the spin box.
+
+ \value SpinBoxSelf The spin box as a whole
+ \value Editor The line edit sub-widget.
+ \value ValueUp The up sub-widget (i.e. the up arrow or + button)
+ \value ValueDown The down sub-widget (i.e. the down arrow or - button)
+*/
+
+/*!
+ Constructs a QAccessibleSpinWidget object for \a w.
+*/
+QAccessibleSpinBox::QAccessibleSpinBox(QWidget *w)
+: QAccessibleAbstractSpinBox(w)
+{
+ Q_ASSERT(spinBox());
+ addControllingSignal(QLatin1String("valueChanged(int)"));
+ addControllingSignal(QLatin1String("valueChanged(QString)"));
+}
+
+/*!
+ Returns the underlying QSpinBox.
+*/
+QSpinBox *QAccessibleSpinBox::spinBox() const
+{
+ return qobject_cast<QSpinBox*>(object());
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleSpinBox::state(int child) const
+{
+ State state = QAccessibleAbstractSpinBox::state(child);
+ switch(child) {
+ case ValueUp:
+ if (spinBox()->value() >= spinBox()->maximum())
+ state |= Unavailable;
+ return state;
+ case ValueDown:
+ if (spinBox()->value() <= spinBox()->minimum())
+ state |= Unavailable;
+ return state;
+ default:
+ break;
+ }
+ return state;
+}
+
+/*! \reimp */
+bool QAccessibleSpinBox::doAction(int action, int child, const QVariantList &params)
+{
+ if (!widget()->isEnabled())
+ return false;
+
+ if (action == Press) {
+ switch(child) {
+ case ValueUp:
+ if (spinBox()->value() >= spinBox()->maximum())
+ return false;
+ spinBox()->stepUp();
+ return true;
+ case ValueDown:
+ if (spinBox()->value() <= spinBox()->minimum())
+ return false;
+ spinBox()->stepDown();
+ return true;
+ default:
+ break;
+ }
+ }
+ return QAccessibleAbstractSpinBox::doAction(action, 0, params);
+}
+
+// ================================== QAccessibleDoubleSpinBox ==================================
+QAccessibleDoubleSpinBox::QAccessibleDoubleSpinBox(QWidget *widget)
+ : QAccessibleWidgetEx(widget, SpinBox)
+{
+ Q_ASSERT(qobject_cast<QDoubleSpinBox *>(widget));
+ addControllingSignal(QLatin1String("valueChanged(double)"));
+ addControllingSignal(QLatin1String("valueChanged(QString)"));
+}
+
+/*!
+ Returns the underlying QDoubleSpinBox.
+*/
+QDoubleSpinBox *QAccessibleDoubleSpinBox::doubleSpinBox() const
+{
+ return static_cast<QDoubleSpinBox*>(object());
+}
+
+/*! \reimp */
+int QAccessibleDoubleSpinBox::childCount() const
+{
+ if (!doubleSpinBox()->isVisible())
+ return 0;
+ return ValueDown;
+}
+
+/*! \reimp */
+QRect QAccessibleDoubleSpinBox::rect(int child) const
+{
+ QRect rect;
+ if (!doubleSpinBox()->isVisible())
+ return rect;
+ QStyleOptionSpinBox spinBoxOption;
+ spinBoxOption.initFrom(doubleSpinBox());
+ switch (child) {
+ case Editor:
+ rect = doubleSpinBox()->style()->subControlRect(QStyle::CC_SpinBox, &spinBoxOption,
+ QStyle::SC_SpinBoxEditField, doubleSpinBox());
+ break;
+ case ValueUp:
+ rect = doubleSpinBox()->style()->subControlRect(QStyle::CC_SpinBox, &spinBoxOption,
+ QStyle::SC_SpinBoxUp, doubleSpinBox());
+ break;
+ case ValueDown:
+ rect = doubleSpinBox()->style()->subControlRect(QStyle::CC_SpinBox, &spinBoxOption,
+ QStyle::SC_SpinBoxDown, doubleSpinBox());
+ break;
+ default:
+ rect = spinBoxOption.rect;
+ break;
+ }
+ const QPoint globalPos = doubleSpinBox()->mapToGlobal(QPoint(0, 0));
+ return QRect(globalPos.x() + rect.x(), globalPos.y() + rect.y(), rect.width(), rect.height());
+}
+
+/*! \reimp */
+int QAccessibleDoubleSpinBox::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ if (entry <= 0)
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+
+ *target = 0;
+ switch (relation) {
+ case Child:
+ return entry <= childCount() ? entry : -1;
+ case QAccessible::Left:
+ return (entry == ValueUp || entry == ValueDown) ? Editor : -1;
+ case QAccessible::Right:
+ return entry == Editor ? ValueUp : -1;
+ case QAccessible::Up:
+ return entry == ValueDown ? ValueUp : -1;
+ case QAccessible::Down:
+ return entry == ValueUp ? ValueDown : -1;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::navigate(relation, entry, target);
+}
+
+QVariant QAccessibleDoubleSpinBox::invokeMethodEx(QAccessible::Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+/*! \reimp */
+QString QAccessibleDoubleSpinBox::text(Text textType, int child) const
+{
+ if (!doubleSpinBox()->isVisible())
+ return QString();
+ switch (textType) {
+ case Name:
+ if (child == ValueUp)
+ return QDoubleSpinBox::tr("More");
+ else if (child == ValueDown)
+ return QDoubleSpinBox::tr("Less");
+ break;
+ case Value:
+ if (child == Editor || child == SpinBoxSelf)
+ return doubleSpinBox()->textFromValue(doubleSpinBox()->value());
+ break;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::text(textType, 0);
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleDoubleSpinBox::role(int child) const
+{
+ switch (child) {
+ case Editor:
+ return EditableText;
+ case ValueUp:
+ case ValueDown:
+ return PushButton;
+ default:
+ break;
+ }
+ return QAccessibleWidgetEx::role(child);
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleDoubleSpinBox::state(int child) const
+{
+ State state = QAccessibleWidgetEx::state(child);
+ switch (child) {
+ case ValueUp:
+ if (doubleSpinBox()->value() >= doubleSpinBox()->maximum())
+ state |= Unavailable;
+ break;
+ case ValueDown:
+ if (doubleSpinBox()->value() <= doubleSpinBox()->minimum())
+ state |= Unavailable;
+ break;
+ default:
+ break;
+ }
+ return state;
+}
+#endif // QT_NO_SPINBOX
+
+#ifndef QT_NO_SCROLLBAR
+/*!
+ \class QAccessibleScrollBar
+ \brief The QAccessibleScrollBar class implements the QAccessibleInterface for scroll bars.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ \enum QAccessibleScrollBar::ScrollBarElements
+
+ This enum identifies the components of the scroll bar.
+
+ \value ScrollBarSelf The scroll bar as a whole.
+ \value LineUp The up arrow button.
+ \value PageUp The area between the position and the up arrow button.
+ \value Position The position marking rectangle.
+ \value PageDown The area between the position and the down arrow button.
+ \value LineDown The down arrow button.
+*/
+
+/*!
+ Constructs a QAccessibleScrollBar object for \a w.
+ \a name is propagated to the QAccessibleWidgetEx constructor.
+*/
+QAccessibleScrollBar::QAccessibleScrollBar(QWidget *w)
+: QAccessibleAbstractSlider(w, ScrollBar)
+{
+ Q_ASSERT(scrollBar());
+ addControllingSignal(QLatin1String("valueChanged(int)"));
+}
+
+/*! Returns the scroll bar. */
+QScrollBar *QAccessibleScrollBar::scrollBar() const
+{
+ return qobject_cast<QScrollBar*>(object());
+}
+
+/*! \reimp */
+QRect QAccessibleScrollBar::rect(int child) const
+{
+ if (!scrollBar()->isVisible())
+ return QRect();
+
+ QStyle::SubControl subControl;
+ switch (child) {
+ case LineUp:
+ subControl = QStyle ::SC_ScrollBarSubLine;
+ break;
+ case PageUp:
+ subControl = QStyle::SC_ScrollBarSubPage;
+ break;
+ case Position:
+ subControl = QStyle::SC_ScrollBarSlider;
+ break;
+ case PageDown:
+ subControl = QStyle::SC_ScrollBarAddPage;
+ break;
+ case LineDown:
+ subControl = QStyle::SC_ScrollBarAddLine;
+ break;
+ default:
+ return QAccessibleAbstractSlider::rect(child);
+ }
+
+ const QStyleOptionSlider option = qt_qscrollbarStyleOption(scrollBar());
+ const QRect rect = scrollBar()->style()->subControlRect(QStyle::CC_ScrollBar, &option,
+ subControl, scrollBar());
+ const QPoint tp = scrollBar()->mapToGlobal(QPoint(0,0));
+ return QRect(tp.x() + rect.x(), tp.y() + rect.y(), rect.width(), rect.height());
+}
+
+/*! \reimp */
+int QAccessibleScrollBar::childCount() const
+{
+ if (!scrollBar()->isVisible())
+ return 0;
+ return LineDown;
+}
+
+/*! \reimp */
+QString QAccessibleScrollBar::text(Text t, int child) const
+{
+ if (!scrollBar()->isVisible())
+ return QString();
+ switch (t) {
+ case Value:
+ if (!child || child == Position)
+ return QString::number(scrollBar()->value());
+ return QString();
+ case Name:
+ switch (child) {
+ case LineUp:
+ return QScrollBar::tr("Line up");
+ case PageUp:
+ return QScrollBar::tr("Page up");
+ case Position:
+ return QScrollBar::tr("Position");
+ case PageDown:
+ return QScrollBar::tr("Page down");
+ case LineDown:
+ return QScrollBar::tr("Line down");
+ }
+ break;
+ default:
+ break;
+ }
+ return QAccessibleAbstractSlider::text(t, child);
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleScrollBar::role(int child) const
+{
+ switch (child) {
+ case LineUp:
+ case PageUp:
+ case PageDown:
+ case LineDown:
+ return PushButton;
+ case Position:
+ return Indicator;
+ default:
+ return ScrollBar;
+ }
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleScrollBar::state(int child) const
+{
+ const State parentState = QAccessibleAbstractSlider::state(0);
+
+ if (child == 0)
+ return parentState;
+
+ // Inherit the Invisible state from parent.
+ State state = parentState & QAccessible::Invisible;
+
+ // Disable left/right if we are at the minimum/maximum.
+ const QScrollBar * const scrollBar = QAccessibleScrollBar::scrollBar();
+ switch (child) {
+ case LineUp:
+ case PageUp:
+ if (scrollBar->value() <= scrollBar->minimum())
+ state |= Unavailable;
+ break;
+ case LineDown:
+ case PageDown:
+ if (scrollBar->value() >= scrollBar->maximum())
+ state |= Unavailable;
+ break;
+ case Position:
+ default:
+ break;
+ }
+
+ return state;
+}
+#endif // QT_NO_SCROLLBAR
+
+#ifndef QT_NO_SLIDER
+/*!
+ \class QAccessibleSlider
+ \brief The QAccessibleSlider class implements the QAccessibleInterface for sliders.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ \enum QAccessibleSlider::SliderElements
+
+ This enum identifies the components of the slider.
+
+ \value SliderSelf The slider as a whole.
+ \value PageLeft The area to the left of the position.
+ \value Position The position indicator.
+ \value PageRight The area to the right of the position.
+*/
+
+/*!
+ Constructs a QAccessibleScrollBar object for \a w.
+ \a name is propagated to the QAccessibleWidgetEx constructor.
+*/
+QAccessibleSlider::QAccessibleSlider(QWidget *w)
+: QAccessibleAbstractSlider(w)
+{
+ Q_ASSERT(slider());
+ addControllingSignal(QLatin1String("valueChanged(int)"));
+}
+
+/*! Returns the slider. */
+QSlider *QAccessibleSlider::slider() const
+{
+ return qobject_cast<QSlider*>(object());
+}
+
+/*! \reimp */
+QRect QAccessibleSlider::rect(int child) const
+{
+ QRect rect;
+ if (!slider()->isVisible())
+ return rect;
+ const QStyleOptionSlider option = qt_qsliderStyleOption(slider());
+ QRect srect = slider()->style()->subControlRect(QStyle::CC_Slider, &option,
+ QStyle::SC_SliderHandle, slider());
+
+ switch (child) {
+ case PageLeft:
+ if (slider()->orientation() == Qt::Vertical)
+ rect = QRect(0, 0, slider()->width(), srect.y());
+ else
+ rect = QRect(0, 0, srect.x(), slider()->height());
+ break;
+ case Position:
+ rect = srect;
+ break;
+ case PageRight:
+ if (slider()->orientation() == Qt::Vertical)
+ rect = QRect(0, srect.y() + srect.height(), slider()->width(), slider()->height()- srect.y() - srect.height());
+ else
+ rect = QRect(srect.x() + srect.width(), 0, slider()->width() - srect.x() - srect.width(), slider()->height());
+ break;
+ default:
+ return QAccessibleAbstractSlider::rect(child);
+ }
+
+ QPoint tp = slider()->mapToGlobal(QPoint(0,0));
+ return QRect(tp.x() + rect.x(), tp.y() + rect.y(), rect.width(), rect.height());
+}
+
+/*! \reimp */
+int QAccessibleSlider::childCount() const
+{
+ if (!slider()->isVisible())
+ return 0;
+ return PageRight;
+}
+
+/*! \reimp */
+QString QAccessibleSlider::text(Text t, int child) const
+{
+ if (!slider()->isVisible())
+ return QString();
+ switch (t) {
+ case Value:
+ if (!child || child == 2)
+ return QString::number(slider()->value());
+ return QString();
+ case Name:
+ switch (child) {
+ case PageLeft:
+ return slider()->orientation() == Qt::Horizontal ?
+ QSlider::tr("Page left") : QSlider::tr("Page up");
+ case Position:
+ return QSlider::tr("Position");
+ case PageRight:
+ return slider()->orientation() == Qt::Horizontal ?
+ QSlider::tr("Page right") : QSlider::tr("Page down");
+ }
+ break;
+ default:
+ break;
+ }
+ return QAccessibleAbstractSlider::text(t, child);
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleSlider::role(int child) const
+{
+ switch (child) {
+ case PageLeft:
+ case PageRight:
+ return PushButton;
+ case Position:
+ return Indicator;
+ default:
+ return Slider;
+ }
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleSlider::state(int child) const
+{
+ const State parentState = QAccessibleAbstractSlider::state(0);
+
+ if (child == 0)
+ return parentState;
+
+ // Inherit the Invisible state from parent.
+ State state = parentState & QAccessible::Invisible;
+
+ // Disable left/right if we are at the minimum/maximum.
+ const QSlider * const slider = QAccessibleSlider::slider();
+ switch (child) {
+ case PageLeft:
+ if (slider->value() <= slider->minimum())
+ state |= Unavailable;
+ break;
+ case PageRight:
+ if (slider->value() >= slider->maximum())
+ state |= Unavailable;
+ break;
+ case Position:
+ default:
+ break;
+ }
+
+ return state;
+}
+
+/*!
+ \fn int QAccessibleSlider::defaultAction(int child) const
+
+ Returns the default action for the given \a child. The base class
+ implementation returns 0.
+*/
+int QAccessibleSlider::defaultAction(int /*child*/) const
+{
+/*
+ switch (child) {
+ case SliderSelf:
+ return SetFocus;
+ case PageLeft:
+ return Press;
+ case PageRight:
+ return Press;
+ }
+*/
+ return 0;
+}
+
+/*! \internal */
+QString QAccessibleSlider::actionText(int /*action*/, Text /*t*/, int /*child*/) const
+{
+ return QLatin1String("");
+}
+
+QAccessibleAbstractSlider::QAccessibleAbstractSlider(QWidget *w, Role r)
+ : QAccessibleWidgetEx(w, r)
+{
+ Q_ASSERT(qobject_cast<QAbstractSlider *>(w));
+}
+
+QVariant QAccessibleAbstractSlider::invokeMethodEx(Method method, int child, const QVariantList &params)
+{
+ switch (method) {
+ case ListSupportedMethods: {
+ QSet<QAccessible::Method> set;
+ set << ListSupportedMethods;
+ return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
+ QAccessibleWidgetEx::invokeMethodEx(method, child, params)));
+ }
+ default:
+ return QAccessibleWidgetEx::invokeMethodEx(method, child, params);
+ }
+}
+
+QVariant QAccessibleAbstractSlider::currentValue()
+{
+ return abstractSlider()->value();
+}
+
+void QAccessibleAbstractSlider::setCurrentValue(const QVariant &value)
+{
+ abstractSlider()->setValue(value.toInt());
+}
+
+QVariant QAccessibleAbstractSlider::maximumValue()
+{
+ return abstractSlider()->maximum();
+}
+
+QVariant QAccessibleAbstractSlider::minimumValue()
+{
+ return abstractSlider()->minimum();
+}
+
+QAbstractSlider *QAccessibleAbstractSlider::abstractSlider() const
+{
+ return static_cast<QAbstractSlider *>(object());
+}
+
+#endif // QT_NO_SLIDER
+
+#ifndef QT_NO_DIAL
+// ======================================= QAccessibleDial ======================================
+QAccessibleDial::QAccessibleDial(QWidget *widget)
+ : QAccessibleWidgetEx(widget, Dial)
+{
+ Q_ASSERT(qobject_cast<QDial *>(widget));
+ addControllingSignal(QLatin1String("valueChanged(int)"));
+}
+
+QRect QAccessibleDial::rect(int child) const
+{
+ QRect rect;
+ if (!dial()->isVisible())
+ return rect;
+ switch (child) {
+ case Self:
+ return QAccessibleWidgetEx::rect(child);
+ case SpeedoMeter: {
+ // Mixture from qcommonstyle.cpp (focus rect).
+ int width = dial()->width();
+ int height = dial()->height();
+ qreal radius = qMin(width, height) / 2.0;
+ qreal delta = radius / 6.0;
+ qreal dx = delta + (width - 2 * radius) / 2.0;
+ qreal dy = delta + (height - 2 * radius) / 2.0;
+ rect = QRect(int(dx), int(dy), int(radius * 2 - 2 * delta), int(radius * 2 - 2 * delta));
+ if (dial()->notchesVisible()) {
+ rect.translate(int(-radius / 6), int(-radius / 6));
+ rect.setWidth(rect.width() + int(radius / 3));
+ rect.setHeight(rect.height() + int(radius / 3));
+ }
+ break;
+ }
+ case SliderHandle: {
+ // Mixture from qcommonstyle.cpp and qdial.cpp.
+ int sliderValue = !dial()->invertedAppearance() ? dial()->value()
+ : (dial()->maximum() - dial()->value());
+ qreal angle = 0;
+ if (dial()->maximum() == dial()->minimum()) {
+ angle = Q_PI / 2;
+ } else if (dial()->wrapping()) {
+ angle = Q_PI * 3 / 2 - (sliderValue - dial()->minimum()) * 2 * Q_PI
+ / (dial()->maximum() - dial()->minimum());
+ } else {
+ angle = (Q_PI * 8 - (sliderValue - dial()->minimum()) * 10 * Q_PI
+ / (dial()->maximum() - dial()->minimum())) / 6;
+ }
+
+ int width = dial()->rect().width();
+ int height = dial()->rect().height();
+ int radius = qMin(width, height) / 2;
+ int xc = width / 2;
+ int yc = height / 2;
+ int bigLineSize = radius / 6;
+ if (bigLineSize < 4)
+ bigLineSize = 4;
+ if (bigLineSize > radius / 2)
+ bigLineSize = radius / 2;
+ int len = radius - bigLineSize - 5;
+ if (len < 5)
+ len = 5;
+ int back = len / 2;
+
+ QPolygonF arrow(3);
+ arrow[0] = QPointF(0.5 + xc + len * qCos(angle),
+ 0.5 + yc - len * qSin(angle));
+ arrow[1] = QPointF(0.5 + xc + back * qCos(angle + Q_PI * 5 / 6),
+ 0.5 + yc - back * qSin(angle + Q_PI * 5 / 6));
+ arrow[2] = QPointF(0.5 + xc + back * qCos(angle - Q_PI * 5 / 6),
+ 0.5 + yc - back * qSin(angle - Q_PI * 5 / 6));
+ rect = arrow.boundingRect().toRect();
+ break;
+ }
+ default:
+ return QRect();
+ }
+
+ QPoint globalPos = dial()->mapToGlobal(QPoint(0,0));
+ return QRect(globalPos.x() + rect.x(), globalPos.y() + rect.y(), rect.width(), rect.height());
+}
+
+int QAccessibleDial::childCount() const
+{
+ if (!dial()->isVisible())
+ return 0;
+ return SliderHandle;
+}
+
+QString QAccessibleDial::text(Text textType, int child) const
+{
+ if (!dial()->isVisible())
+ return QString();
+ if (textType == Value && child >= Self && child <= SliderHandle)
+ return QString::number(dial()->value());
+ if (textType == Name) {
+ switch (child) {
+ case Self:
+ if (!widget()->accessibleName().isEmpty())
+ return widget()->accessibleName();
+ return QDial::tr("QDial");
+ case SpeedoMeter:
+ return QDial::tr("SpeedoMeter");
+ case SliderHandle:
+ return QDial::tr("SliderHandle");
+ }
+ }
+ return QAccessibleWidgetEx::text(textType, child);
+}
+
+QAccessible::Role QAccessibleDial::role(int child) const
+{
+ if (child == SpeedoMeter)
+ return Slider;
+ else if (child == SliderHandle)
+ return Indicator;
+ return QAccessibleWidgetEx::role(child);
+}
+
+QAccessible::State QAccessibleDial::state(int child) const
+{
+ const State parentState = QAccessibleWidgetEx::state(0);
+ if (child == SliderHandle)
+ return parentState | HotTracked;
+ return parentState;
+}
+
+QVariant QAccessibleDial::invokeMethodEx(Method, int, const QVariantList &)
+{
+ return QVariant();
+}
+
+QDial *QAccessibleDial::dial() const
+{
+ return static_cast<QDial*>(object());
+}
+#endif // QT_NO_DIAL
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
diff --git a/src/plugins/accessible/widgets/rangecontrols.h b/src/plugins/accessible/widgets/rangecontrols.h
new file mode 100644
index 0000000000..f565d8e888
--- /dev/null
+++ b/src/plugins/accessible/widgets/rangecontrols.h
@@ -0,0 +1,235 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef RANGECONTROLS_H
+#define RANGECONTROLS_H
+
+#include <QtGui/qaccessiblewidget.h>
+#include <QtGui/qaccessible2.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAbstractSpinBox;
+class QAbstractSlider;
+class QScrollBar;
+class QSlider;
+class QSpinBox;
+class QDoubleSpinBox;
+class QDial;
+
+#ifndef QT_NO_SPINBOX
+class QAccessibleAbstractSpinBox: public QAccessibleWidgetEx, public QAccessibleValueInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleAbstractSpinBox(QWidget *w);
+
+ enum SpinBoxElements {
+ SpinBoxSelf = 0,
+ Editor,
+ ValueUp,
+ ValueDown
+ };
+
+ int childCount() const;
+ QRect rect(int child) const;
+
+ int navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const;
+
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+
+ bool doAction(int action, int child, const QVariantList &params);
+
+ QVariant invokeMethodEx(Method method, int child, const QVariantList &params);
+
+ // QAccessibleValueInterface
+ QVariant currentValue();
+ void setCurrentValue(const QVariant &value);
+ QVariant maximumValue();
+ QVariant minimumValue();
+
+protected:
+ QAbstractSpinBox *abstractSpinBox() const;
+};
+
+class QAccessibleSpinBox : public QAccessibleAbstractSpinBox
+{
+public:
+ explicit QAccessibleSpinBox(QWidget *w);
+
+ State state(int child) const;
+
+ bool doAction(int action, int child, const QVariantList &params);
+
+protected:
+ QSpinBox *spinBox() const;
+};
+
+class QAccessibleDoubleSpinBox : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleDoubleSpinBox(QWidget *widget);
+
+ enum DoubleSpinBoxElements {
+ SpinBoxSelf = 0,
+ Editor,
+ ValueUp,
+ ValueDown
+ };
+
+ int childCount() const;
+ QRect rect(int child) const;
+ int navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+
+protected:
+ QDoubleSpinBox *doubleSpinBox() const;
+};
+#endif // QT_NO_SPINBOX
+
+class QAccessibleAbstractSlider: public QAccessibleWidgetEx, public QAccessibleValueInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleAbstractSlider(QWidget *w, Role r = Slider);
+
+ QVariant invokeMethodEx(Method method, int child, const QVariantList &params);
+
+ // QAccessibleValueInterface
+ QVariant currentValue();
+ void setCurrentValue(const QVariant &value);
+ QVariant maximumValue();
+ QVariant minimumValue();
+
+protected:
+ QAbstractSlider *abstractSlider() const;
+};
+
+#ifndef QT_NO_SCROLLBAR
+class QAccessibleScrollBar : public QAccessibleAbstractSlider
+{
+public:
+ explicit QAccessibleScrollBar(QWidget *w);
+
+ enum ScrollBarElements {
+ ScrollBarSelf = 0,
+ LineUp,
+ PageUp,
+ Position,
+ PageDown,
+ LineDown
+ };
+
+ int childCount() const;
+
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+
+protected:
+ QScrollBar *scrollBar() const;
+};
+#endif // QT_NO_SCROLLBAR
+
+#ifndef QT_NO_SLIDER
+class QAccessibleSlider : public QAccessibleAbstractSlider
+{
+public:
+ explicit QAccessibleSlider(QWidget *w);
+
+ enum SliderElements {
+ SliderSelf = 0,
+ PageLeft,
+ Position,
+ PageRight
+ };
+
+ int childCount() const;
+
+ QRect rect(int child) const;
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+
+ int defaultAction(int child) const;
+ QString actionText(int action, Text t, int child) const;
+
+protected:
+ QSlider *slider() const;
+};
+#endif // QT_NO_SLIDER
+
+#ifndef QT_NO_DIAL
+class QAccessibleDial : public QAccessibleWidgetEx
+{
+public:
+ explicit QAccessibleDial(QWidget *w);
+
+ enum DialElements {
+ Self = 0,
+ SpeedoMeter,
+ SliderHandle
+ };
+
+ int childCount() const;
+ QRect rect(int child) const;
+ QString text(Text textType, int child) const;
+ Role role(int child) const;
+ State state(int child) const;
+ QVariant invokeMethodEx(Method method, int child, const QVariantList &params);
+
+protected:
+ QDial *dial() const;
+};
+#endif // QT_NO_DIAL
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // RANGECONTROLS_H
diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp
new file mode 100644
index 0000000000..21d2d671f3
--- /dev/null
+++ b/src/plugins/accessible/widgets/simplewidgets.cpp
@@ -0,0 +1,888 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "simplewidgets.h"
+
+#include <qabstractbutton.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qprogressbar.h>
+#include <qradiobutton.h>
+#include <qtoolbutton.h>
+#include <qlabel.h>
+#include <qgroupbox.h>
+#include <qlcdnumber.h>
+#include <qlineedit.h>
+#include <qstyle.h>
+#include <qstyleoption.h>
+
+#ifdef Q_OS_MAC
+#include <qfocusframe.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+using namespace QAccessible2;
+extern QList<QWidget*> childWidgets(const QWidget *widget, bool includeTopLevel = false);
+
+QString Q_GUI_EXPORT qt_accStripAmp(const QString &text);
+QString Q_GUI_EXPORT qt_accHotKey(const QString &text);
+
+/*!
+ \class QAccessibleButton
+ \brief The QAccessibleButton class implements the QAccessibleInterface for button type widgets.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ Creates a QAccessibleButton object for \a w.
+ \a role is propagated to the QAccessibleWidgetEx constructor.
+*/
+QAccessibleButton::QAccessibleButton(QWidget *w, Role role)
+: QAccessibleWidgetEx(w, role)
+{
+ Q_ASSERT(button());
+ if (button()->isCheckable())
+ addControllingSignal(QLatin1String("toggled(bool)"));
+ else
+ addControllingSignal(QLatin1String("clicked()"));
+}
+
+/*! Returns the button. */
+QAbstractButton *QAccessibleButton::button() const
+{
+ return qobject_cast<QAbstractButton*>(object());
+}
+
+/*! \reimp */
+QString QAccessibleButton::actionText(int action, Text text, int child) const
+{
+ if (child)
+ return QString();
+
+ if (text == Name) switch (action) {
+ case Press:
+ case DefaultAction: // press, checking or open
+ switch (role(0)) {
+ case ButtonMenu:
+ return QPushButton::tr("Open");
+ case CheckBox:
+ {
+ if (state(child) & Checked)
+ return QCheckBox::tr("Uncheck");
+ QCheckBox *cb = qobject_cast<QCheckBox*>(object());
+ if (!cb || !cb->isTristate() || cb->checkState() == Qt::PartiallyChecked)
+ return QCheckBox::tr("Check");
+ return QCheckBox::tr("Toggle");
+ }
+ break;
+ case RadioButton:
+ return QRadioButton::tr("Check");
+ default:
+ break;
+ }
+ break;
+ }
+ return QAccessibleWidgetEx::actionText(action, text, child);
+}
+
+/*! \reimp */
+bool QAccessibleButton::doAction(int action, int child, const QVariantList &params)
+{
+ if (child || !widget()->isEnabled() || !widget()->isVisible())
+ return false;
+
+ switch (action) {
+ case DefaultAction:
+ case Press:
+ {
+#ifndef QT_NO_MENU
+ QPushButton *pb = qobject_cast<QPushButton*>(object());
+ if (pb && pb->menu())
+ pb->showMenu();
+ else
+#endif
+ button()->animateClick();
+ }
+ return true;
+ }
+ return QAccessibleWidgetEx::doAction(action, child, params);
+}
+
+/*! \reimp */
+QString QAccessibleButton::text(Text t, int child) const
+{
+ QString str;
+ if (!widget()->isVisible())
+ return str;
+
+ switch (t) {
+ case Accelerator:
+ {
+#ifndef QT_NO_SHORTCUT
+ QPushButton *pb = qobject_cast<QPushButton*>(object());
+ if (pb && pb->isDefault())
+ str = (QString)QKeySequence(Qt::Key_Enter);
+#endif
+ if (str.isEmpty())
+ str = qt_accHotKey(button()->text());
+ }
+ break;
+ case Name:
+ str = widget()->accessibleName();
+ if (str.isEmpty())
+ str = button()->text();
+ break;
+ default:
+ break;
+ }
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, child);;
+ return qt_accStripAmp(str);
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleButton::state(int child) const
+{
+ State state = QAccessibleWidgetEx::state(child);
+
+ QAbstractButton *b = button();
+ QCheckBox *cb = qobject_cast<QCheckBox *>(b);
+ if (b->isChecked())
+ state |= Checked;
+ else if (cb && cb->checkState() == Qt::PartiallyChecked)
+ state |= Mixed;
+ if (b->isDown())
+ state |= Pressed;
+ QPushButton *pb = qobject_cast<QPushButton*>(b);
+ if (pb) {
+ if (pb->isDefault())
+ state |= DefaultButton;
+#ifndef QT_NO_MENU
+ if (pb->menu())
+ state |= HasPopup;
+#endif
+ }
+
+ return state;
+}
+
+int QAccessibleButton::actionCount()
+{
+ return 1;
+}
+
+void QAccessibleButton::doAction(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ button()->click();
+ break;
+ }
+}
+
+QString QAccessibleButton::description(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ return QLatin1String("Clicks the button.");
+ default:
+ return QString();
+ }
+}
+
+QString QAccessibleButton::name(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ return QLatin1String("Press");
+ default:
+ return QString();
+ }
+}
+
+QString QAccessibleButton::localizedName(int actionIndex)
+{
+ switch (actionIndex) {
+ case 0:
+ return tr("Press");
+ default:
+ return QString();
+ }
+}
+
+QStringList QAccessibleButton::keyBindings(int actionIndex)
+{
+ switch (actionIndex) {
+#ifndef QT_NO_SHORTCUT
+ case 0:
+ return QStringList() << button()->shortcut().toString();
+#endif
+ default:
+ return QStringList();
+ }
+}
+
+#ifndef QT_NO_TOOLBUTTON
+/*!
+ \class QAccessibleToolButton
+ \brief The QAccessibleToolButton class implements the QAccessibleInterface for tool buttons.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ \enum QAccessibleToolButton::ToolButtonElements
+
+ This enum identifies the components of the tool button.
+
+ \value ToolButtonSelf The tool button as a whole.
+ \value ButtonExecute The button.
+ \value ButtonDropMenu The drop down menu.
+*/
+
+/*!
+ Creates a QAccessibleToolButton object for \a w.
+ \a role is propagated to the QAccessibleWidgetEx constructor.
+*/
+QAccessibleToolButton::QAccessibleToolButton(QWidget *w, Role role)
+: QAccessibleButton(w, role)
+{
+ Q_ASSERT(toolButton());
+}
+
+/*! Returns the button. */
+QToolButton *QAccessibleToolButton::toolButton() const
+{
+ return qobject_cast<QToolButton*>(object());
+}
+
+/*!
+ Returns true if this tool button is a split button.
+*/
+bool QAccessibleToolButton::isSplitButton() const
+{
+#ifndef QT_NO_MENU
+ return toolButton()->menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup;
+#else
+ return false;
+#endif
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleToolButton::role(int child) const
+{
+ if (isSplitButton()) switch(child) {
+ case ButtonExecute:
+ return PushButton;
+ case ButtonDropMenu:
+ return ButtonMenu;
+ }
+ return QAccessibleButton::role(child);
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleToolButton::state(int child) const
+{
+ QAccessible::State st = QAccessibleButton::state(child);
+ if (toolButton()->autoRaise())
+ st |= HotTracked;
+#ifndef QT_NO_MENU
+ if (toolButton()->menu() && child != ButtonExecute)
+ st |= HasPopup;
+#endif
+ return st;
+}
+
+/*! \reimp */
+int QAccessibleToolButton::childCount() const
+{
+ if (!toolButton()->isVisible())
+ return 0;
+ return isSplitButton() ? ButtonDropMenu : 0;
+}
+
+/*!
+ \internal
+
+ Returns the rectangle occupied by this button, depending on \a
+ child.
+*/
+QRect QAccessibleToolButton::rect(int child) const
+{
+ if (!toolButton()->isVisible())
+ return QRect();
+ if (!child)
+ return QAccessibleButton::rect(child);
+
+ QStyleOptionToolButton opt;
+ opt.init(widget());
+ QRect subrect = widget()->style()->subControlRect(QStyle::CC_ToolButton, &opt,
+ QStyle::SC_ToolButtonMenu, toolButton());
+
+ if (child == ButtonExecute)
+ subrect = QRect(0, 0, subrect.x(), widget()->height());
+
+ QPoint ntl = widget()->mapToGlobal(subrect.topLeft());
+ subrect.moveTopLeft(ntl);
+ return subrect;
+}
+
+/*!
+ \internal
+
+ Returns the button's text label, depending on the text \a t, and
+ the \a child.
+*/
+QString QAccessibleToolButton::text(Text t, int child) const
+{
+ QString str;
+ if (!toolButton()->isVisible())
+ return str;
+
+ switch (t) {
+ case Name:
+ str = toolButton()->text();
+ if (str.isEmpty())
+ str = toolButton()->text();
+ break;
+ default:
+ break;
+ }
+ if (str.isEmpty())
+ str = QAccessibleButton::text(t, child);;
+ return qt_accStripAmp(str);
+}
+
+/*!
+ \internal
+
+ Returns the number of actions which is 0, 1, or 2, in part
+ depending on \a child.
+*/
+int QAccessibleToolButton::actionCount(int child) const
+{
+ // each subelement has one action
+ if (child)
+ return isSplitButton() ? 1 : 0;
+ int ac = widget()->focusPolicy() != Qt::NoFocus ? 1 : 0;
+ // button itself has two actions if a menu button
+#ifndef QT_NO_MENU
+ return ac + (toolButton()->menu() ? 2 : 1);
+#else
+ return ac + 1;
+#endif
+}
+
+/*!
+ \internal
+
+ If \a text is \c Name, then depending on the \a child or the \a
+ action, an action text is returned. This is a translated string
+ which in English is one of "Press", "Open", or "Set Focus". If \a
+ text is not \c Name, an empty string is returned.
+*/
+QString QAccessibleToolButton::actionText(int action, Text text, int child) const
+{
+ if (text == Name) switch(child) {
+ case ButtonExecute:
+ return QToolButton::tr("Press");
+ case ButtonDropMenu:
+ return QToolButton::tr("Open");
+ default:
+ switch(action) {
+ case 0:
+ return QToolButton::tr("Press");
+ case 1:
+#ifndef QT_NO_MENU
+ if (toolButton()->menu())
+ return QToolButton::tr("Open");
+#endif
+ //fall through
+ case 2:
+ return QLatin1String("Set Focus");
+ }
+ }
+ return QString();
+}
+
+/*!
+ \internal
+*/
+bool QAccessibleToolButton::doAction(int action, int child, const QVariantList &params)
+{
+ if (!widget()->isEnabled() || !widget()->isVisible())
+ return false;
+ if (action == 1 || child == ButtonDropMenu) {
+ if(!child)
+ toolButton()->setDown(true);
+#ifndef QT_NO_MENU
+ toolButton()->showMenu();
+#endif
+ return true;
+ }
+ return QAccessibleButton::doAction(action, 0, params);
+}
+
+#endif // QT_NO_TOOLBUTTON
+
+/*!
+ \class QAccessibleDisplay
+ \brief The QAccessibleDisplay class implements the QAccessibleInterface for widgets that display information.
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ Constructs a QAccessibleDisplay object for \a w.
+ \a role is propagated to the QAccessibleWidgetEx constructor.
+*/
+QAccessibleDisplay::QAccessibleDisplay(QWidget *w, Role role)
+: QAccessibleWidgetEx(w, role)
+{
+}
+
+/*! \reimp */
+QAccessible::Role QAccessibleDisplay::role(int child) const
+{
+ QLabel *l = qobject_cast<QLabel*>(object());
+ if (l) {
+ if (l->pixmap())
+ return Graphic;
+#ifndef QT_NO_PICTURE
+ if (l->picture())
+ return Graphic;
+#endif
+#ifndef QT_NO_MOVIE
+ if (l->movie())
+ return Animation;
+#endif
+#ifndef QT_NO_PROGRESSBAR
+ } else if (qobject_cast<QProgressBar*>(object())) {
+ return ProgressBar;
+#endif
+ }
+ return QAccessibleWidgetEx::role(child);
+}
+
+/*! \reimp */
+QString QAccessibleDisplay::text(Text t, int child) const
+{
+ QString str;
+ if (!widget()->isVisible())
+ return str;
+ switch (t) {
+ case Name:
+ str = widget()->accessibleName();
+ if (str.isEmpty()) {
+ if (qobject_cast<QLabel*>(object())) {
+ str = qobject_cast<QLabel*>(object())->text();
+#ifndef QT_NO_GROUPBOX
+ } else if (qobject_cast<QGroupBox*>(object())) {
+ str = qobject_cast<QGroupBox*>(object())->title();
+#endif
+#ifndef QT_NO_LCDNUMBER
+ } else if (qobject_cast<QLCDNumber*>(object())) {
+ QLCDNumber *l = qobject_cast<QLCDNumber*>(object());
+ if (l->digitCount())
+ str = QString::number(l->value());
+ else
+ str = QString::number(l->intValue());
+#endif
+ }
+ }
+ break;
+ case Value:
+#ifndef QT_NO_PROGRESSBAR
+ if (qobject_cast<QProgressBar*>(object()))
+ str = QString::number(qobject_cast<QProgressBar*>(object())->value());
+#endif
+ break;
+ default:
+ break;
+ }
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, child);;
+ return qt_accStripAmp(str);
+}
+
+/*! \reimp */
+QAccessible::Relation QAccessibleDisplay::relationTo(int child, const QAccessibleInterface *other,
+ int otherChild) const
+{
+ Relation relation = QAccessibleWidgetEx::relationTo(child, other, otherChild);
+ if (child || otherChild)
+ return relation;
+
+ QObject *o = other->object();
+ QLabel *label = qobject_cast<QLabel*>(object());
+ if (label) {
+#ifndef QT_NO_SHORTCUT
+ if (o == label->buddy())
+ relation |= Label;
+#endif
+#ifndef QT_NO_GROUPBOX
+ } else {
+ QGroupBox *groupbox = qobject_cast<QGroupBox*>(object());
+ if (groupbox && !groupbox->title().isEmpty())
+ if (groupbox->children().contains(o))
+ relation |= Label;
+#endif
+ }
+ return relation;
+}
+
+/*! \reimp */
+int QAccessibleDisplay::navigate(RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ if (rel == Labelled) {
+ QObject *targetObject = 0;
+ QLabel *label = qobject_cast<QLabel*>(object());
+ if (label) {
+#ifndef QT_NO_SHORTCUT
+ if (entry == 1)
+ targetObject = label->buddy();
+#endif
+#ifndef QT_NO_GROUPBOX
+ } else {
+ QGroupBox *groupbox = qobject_cast<QGroupBox*>(object());
+ if (groupbox && !groupbox->title().isEmpty())
+ rel = Child;
+#endif
+ }
+ *target = QAccessible::queryAccessibleInterface(targetObject);
+ if (*target)
+ return 0;
+ }
+ return QAccessibleWidgetEx::navigate(rel, entry, target);
+}
+
+/*! \internal */
+QString QAccessibleDisplay::imageDescription()
+{
+#ifndef QT_NO_TOOLTIP
+ return widget()->toolTip();
+#else
+ return QString::null;
+#endif
+}
+
+/*! \internal */
+QSize QAccessibleDisplay::imageSize()
+{
+ QLabel *label = qobject_cast<QLabel *>(widget());
+ if (!label)
+ return QSize();
+ const QPixmap *pixmap = label->pixmap();
+ if (!pixmap)
+ return QSize();
+ return pixmap->size();
+}
+
+/*! \internal */
+QRect QAccessibleDisplay::imagePosition(QAccessible2::CoordinateType coordType)
+{
+ QLabel *label = qobject_cast<QLabel *>(widget());
+ if (!label)
+ return QRect();
+ const QPixmap *pixmap = label->pixmap();
+ if (!pixmap)
+ return QRect();
+
+ switch (coordType) {
+ case QAccessible2::RelativeToScreen:
+ return QRect(label->mapToGlobal(label->pos()), label->size());
+ case QAccessible2::RelativeToParent:
+ return label->geometry();
+ }
+
+ return QRect();
+}
+
+#ifndef QT_NO_LINEEDIT
+/*!
+ \class QAccessibleLineEdit
+ \brief The QAccessibleLineEdit class implements the QAccessibleInterface for widgets with editable text
+ \internal
+
+ \ingroup accessibility
+*/
+
+/*!
+ Constructs a QAccessibleLineEdit object for \a w.
+ \a name is propagated to the QAccessibleWidgetEx constructor.
+*/
+QAccessibleLineEdit::QAccessibleLineEdit(QWidget *w, const QString &name)
+: QAccessibleWidgetEx(w, EditableText, name), QAccessibleSimpleEditableTextInterface(this)
+{
+ addControllingSignal(QLatin1String("textChanged(const QString&)"));
+ addControllingSignal(QLatin1String("returnPressed()"));
+}
+
+/*! Returns the line edit. */
+QLineEdit *QAccessibleLineEdit::lineEdit() const
+{
+ return qobject_cast<QLineEdit*>(object());
+}
+
+/*! \reimp */
+QString QAccessibleLineEdit::text(Text t, int child) const
+{
+ QString str;
+ if (!lineEdit()->isVisible())
+ return str;
+ switch (t) {
+ case Value:
+ if (lineEdit()->echoMode() == QLineEdit::Normal)
+ str = lineEdit()->text();
+ break;
+ default:
+ break;
+ }
+ if (str.isEmpty())
+ str = QAccessibleWidgetEx::text(t, child);;
+ return qt_accStripAmp(str);
+}
+
+/*! \reimp */
+void QAccessibleLineEdit::setText(Text t, int control, const QString &text)
+{
+ if (!lineEdit()->isVisible())
+ return;
+ if (t != Value || control) {
+ QAccessibleWidgetEx::setText(t, control, text);
+ return;
+ }
+ lineEdit()->setText(text);
+}
+
+/*! \reimp */
+QAccessible::State QAccessibleLineEdit::state(int child) const
+{
+ State state = QAccessibleWidgetEx::state(child);
+
+ QLineEdit *l = lineEdit();
+ if (l->isReadOnly())
+ state |= ReadOnly;
+ if (l->echoMode() != QLineEdit::Normal)
+ state |= Protected;
+ state |= Selectable;
+ if (l->hasSelectedText())
+ state |= Selected;
+
+ if (l->contextMenuPolicy() != Qt::NoContextMenu
+ && l->contextMenuPolicy() != Qt::PreventContextMenu)
+ state |= HasPopup;
+
+ return state;
+}
+
+QVariant QAccessibleLineEdit::invokeMethodEx(QAccessible::Method method, int child,
+ const QVariantList &params)
+{
+ if (child)
+ return QVariant();
+
+ switch (method) {
+ case ListSupportedMethods: {
+ QSet<QAccessible::Method> set;
+ set << ListSupportedMethods << SetCursorPosition << GetCursorPosition;
+ return QVariant::fromValue(set | qvariant_cast<QSet<QAccessible::Method> >(
+ QAccessibleWidgetEx::invokeMethodEx(method, child, params)));
+ }
+ case SetCursorPosition:
+ setCursorPosition(params.value(0).toInt());
+ return true;
+ case GetCursorPosition:
+ return cursorPosition();
+ default:
+ return QAccessibleWidgetEx::invokeMethodEx(method, child, params);
+ }
+}
+
+void QAccessibleLineEdit::addSelection(int startOffset, int endOffset)
+{
+ setSelection(0, startOffset, endOffset);
+}
+
+QString QAccessibleLineEdit::attributes(int offset, int *startOffset, int *endOffset)
+{
+ // QLineEdit doesn't have text attributes
+ *startOffset = *endOffset = offset;
+ return QString();
+}
+
+int QAccessibleLineEdit::cursorPosition()
+{
+ return lineEdit()->cursorPosition();
+}
+
+QRect QAccessibleLineEdit::characterRect(int /*offset*/, CoordinateType /*coordType*/)
+{
+ // QLineEdit doesn't hand out character rects
+ return QRect();
+}
+
+int QAccessibleLineEdit::selectionCount()
+{
+ return lineEdit()->hasSelectedText() ? 1 : 0;
+}
+
+int QAccessibleLineEdit::offsetAtPoint(const QPoint &point, CoordinateType coordType)
+{
+ QPoint p = point;
+ if (coordType == RelativeToScreen)
+ p = lineEdit()->mapFromGlobal(p);
+
+ return lineEdit()->cursorPositionAt(p);
+}
+
+void QAccessibleLineEdit::selection(int selectionIndex, int *startOffset, int *endOffset)
+{
+ *startOffset = *endOffset = 0;
+ if (selectionIndex != 0)
+ return;
+
+ *startOffset = lineEdit()->selectionStart();
+ *endOffset = *startOffset + lineEdit()->selectedText().count();
+}
+
+QString QAccessibleLineEdit::text(int startOffset, int endOffset)
+{
+ if (startOffset > endOffset)
+ return QString();
+ return lineEdit()->text().mid(startOffset, endOffset - startOffset);
+}
+
+QString QAccessibleLineEdit::textBeforeOffset (int /*offset*/, BoundaryType /*boundaryType*/,
+ int * /*startOffset*/, int * /*endOffset*/)
+{
+ // TODO
+ return QString();
+}
+
+QString QAccessibleLineEdit::textAfterOffset(int /*offset*/, BoundaryType /*boundaryType*/,
+ int * /*startOffset*/, int * /*endOffset*/)
+{
+ // TODO
+ return QString();
+}
+
+QString QAccessibleLineEdit::textAtOffset(int /*offset*/, BoundaryType /*boundaryType*/,
+ int * /*startOffset*/, int * /*endOffset*/)
+{
+ // TODO
+ return QString();
+}
+
+void QAccessibleLineEdit::removeSelection(int selectionIndex)
+{
+ if (selectionIndex != 0)
+ return;
+
+ lineEdit()->deselect();
+}
+
+void QAccessibleLineEdit::setCursorPosition(int position)
+{
+ lineEdit()->setCursorPosition(position);
+}
+
+void QAccessibleLineEdit::setSelection(int selectionIndex, int startOffset, int endOffset)
+{
+ if (selectionIndex != 0)
+ return;
+
+ lineEdit()->setSelection(startOffset, endOffset - startOffset);
+}
+
+int QAccessibleLineEdit::characterCount()
+{
+ return lineEdit()->text().count();
+}
+
+void QAccessibleLineEdit::scrollToSubstring(int startIndex, int endIndex)
+{
+ lineEdit()->setCursorPosition(endIndex);
+ lineEdit()->setCursorPosition(startIndex);
+}
+
+#endif // QT_NO_LINEEDIT
+
+#ifndef QT_NO_PROGRESSBAR
+QAccessibleProgressBar::QAccessibleProgressBar(QWidget *o)
+ : QAccessibleDisplay(o)
+{
+ Q_ASSERT(progressBar());
+}
+
+QVariant QAccessibleProgressBar::currentValue()
+{
+ return progressBar()->value();
+}
+
+QVariant QAccessibleProgressBar::maximumValue()
+{
+ return progressBar()->maximum();
+}
+
+QVariant QAccessibleProgressBar::minimumValue()
+{
+ return progressBar()->minimum();
+}
+
+QProgressBar *QAccessibleProgressBar::progressBar() const
+{
+ return qobject_cast<QProgressBar *>(object());
+}
+#endif
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h
new file mode 100644
index 0000000000..ca1f24bfc2
--- /dev/null
+++ b/src/plugins/accessible/widgets/simplewidgets.h
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SIMPLEWIDGETS_H
+#define SIMPLEWIDGETS_H
+
+#include <QtCore/qcoreapplication.h>
+#include <QtGui/qaccessible2.h>
+#include <QtGui/qaccessiblewidget.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAbstractButton;
+class QLineEdit;
+class QToolButton;
+class QProgressBar;
+
+class QAccessibleButton : public QAccessibleWidgetEx, public QAccessibleActionInterface
+{
+ Q_ACCESSIBLE_OBJECT
+ Q_DECLARE_TR_FUNCTIONS(QAccessibleButton)
+public:
+ QAccessibleButton(QWidget *w, Role r);
+
+ QString text(Text t, int child) const;
+ State state(int child) const;
+
+ QString actionText(int action, Text text, int child) const;
+ bool doAction(int action, int child, const QVariantList &params);
+
+ // QAccessibleActionInterface
+ int actionCount();
+ void doAction(int actionIndex);
+ QString description(int actionIndex);
+ QString name(int actionIndex);
+ QString localizedName(int actionIndex);
+ QStringList keyBindings(int actionIndex);
+
+protected:
+ QAbstractButton *button() const;
+};
+
+#ifndef QT_NO_TOOLBUTTON
+class QAccessibleToolButton : public QAccessibleButton
+{
+public:
+ QAccessibleToolButton(QWidget *w, Role role);
+
+ enum ToolButtonElements {
+ ToolButtonSelf = 0,
+ ButtonExecute,
+ ButtonDropMenu
+ };
+
+ Role role(int child) const;
+ State state(int child) const;
+
+ int childCount() const;
+ QRect rect(int child) const;
+
+ QString text(Text t, int child) const;
+
+ int actionCount(int child) const;
+ QString actionText(int action, Text text, int child) const;
+ bool doAction(int action, int child, const QVariantList &params);
+
+protected:
+ QToolButton *toolButton() const;
+
+ bool isSplitButton() const;
+};
+#endif // QT_NO_TOOLBUTTON
+
+class QAccessibleDisplay : public QAccessibleWidgetEx, public QAccessibleImageInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleDisplay(QWidget *w, Role role = StaticText);
+
+ QString text(Text t, int child) const;
+ Role role(int child) const;
+
+ Relation relationTo(int child, const QAccessibleInterface *other, int otherChild) const;
+ int navigate(RelationFlag, int entry, QAccessibleInterface **target) const;
+
+ // QAccessibleImageInterface
+ QString imageDescription();
+ QSize imageSize();
+ QRect imagePosition(QAccessible2::CoordinateType coordType);
+};
+
+#ifndef QT_NO_LINEEDIT
+class QAccessibleLineEdit : public QAccessibleWidgetEx, public QAccessibleTextInterface,
+ public QAccessibleSimpleEditableTextInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleLineEdit(QWidget *o, const QString &name = QString());
+
+ QString text(Text t, int child) const;
+ void setText(Text t, int control, const QString &text);
+ State state(int child) const;
+ QVariant invokeMethodEx(QAccessible::Method method, int child, const QVariantList &params);
+
+ // QAccessibleTextInterface
+ void addSelection(int startOffset, int endOffset);
+ QString attributes(int offset, int *startOffset, int *endOffset);
+ int cursorPosition();
+ QRect characterRect(int offset, QAccessible2::CoordinateType coordType);
+ int selectionCount();
+ int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType);
+ void selection(int selectionIndex, int *startOffset, int *endOffset);
+ QString text(int startOffset, int endOffset);
+ QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset);
+ QString textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset);
+ QString textAtOffset(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset);
+ void removeSelection(int selectionIndex);
+ void setCursorPosition(int position);
+ void setSelection(int selectionIndex, int startOffset, int endOffset);
+ int characterCount();
+ void scrollToSubstring(int startIndex, int endIndex);
+
+protected:
+ QLineEdit *lineEdit() const;
+};
+#endif // QT_NO_LINEEDIT
+
+#ifndef QT_NO_PROGRESSBAR
+class QAccessibleProgressBar : public QAccessibleDisplay, public QAccessibleValueInterface
+{
+ Q_ACCESSIBLE_OBJECT
+public:
+ explicit QAccessibleProgressBar(QWidget *o);
+
+ // QAccessibleValueInterface
+ QVariant currentValue();
+ QVariant maximumValue();
+ QVariant minimumValue();
+ inline void setCurrentValue(const QVariant &) {}
+
+protected:
+ QProgressBar *progressBar() const;
+};
+#endif
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // SIMPLEWIDGETS_H
diff --git a/src/plugins/accessible/widgets/widgets.pro b/src/plugins/accessible/widgets/widgets.pro
new file mode 100644
index 0000000000..79110cbcd4
--- /dev/null
+++ b/src/plugins/accessible/widgets/widgets.pro
@@ -0,0 +1,20 @@
+TARGET = qtaccessiblewidgets
+include(../../qpluginbase.pri)
+include (../qaccessiblebase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/accessible
+
+QTDIR_build:REQUIRES += "contains(QT_CONFIG, accessibility)"
+
+SOURCES += main.cpp \
+ simplewidgets.cpp \
+ rangecontrols.cpp \
+ complexwidgets.cpp \
+ qaccessiblewidgets.cpp \
+ qaccessiblemenu.cpp
+
+HEADERS += qaccessiblewidgets.h \
+ simplewidgets.h \
+ rangecontrols.h \
+ complexwidgets.h \
+ qaccessiblemenu.h
diff --git a/src/plugins/bearer/bearer.pro b/src/plugins/bearer/bearer.pro
new file mode 100644
index 0000000000..d1d75f06fb
--- /dev/null
+++ b/src/plugins/bearer/bearer.pro
@@ -0,0 +1,19 @@
+TEMPLATE = subdirs
+
+contains(QT_CONFIG, dbus) {
+ contains(QT_CONFIG, icd) {
+ SUBDIRS += icd
+ } else:linux* {
+ SUBDIRS += generic
+ SUBDIRS += connman networkmanager
+ }
+}
+
+#win32:SUBDIRS += nla
+win32:SUBDIRS += generic
+win32:!wince*:SUBDIRS += nativewifi
+macx:contains(QT_CONFIG, corewlan):SUBDIRS += corewlan
+macx:SUBDIRS += generic
+symbian:SUBDIRS += symbian
+
+isEmpty(SUBDIRS):SUBDIRS = generic
diff --git a/src/plugins/bearer/connman/connman.pro b/src/plugins/bearer/connman/connman.pro
new file mode 100644
index 0000000000..dec408c724
--- /dev/null
+++ b/src/plugins/bearer/connman/connman.pro
@@ -0,0 +1,21 @@
+TARGET = qconnmanbearer
+include(../../qpluginbase.pri)
+
+QT = core network dbus
+
+HEADERS += qconnmanservice_linux_p.h \
+ qofonoservice_linux_p.h \
+ qconnmanengine.h \
+ ../qnetworksession_impl.h \
+ ../qbearerengine_impl.h
+
+SOURCES += main.cpp \
+ qconnmanservice_linux.cpp \
+ qofonoservice_linux.cpp \
+ qconnmanengine.cpp \
+ ../qnetworksession_impl.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
+
diff --git a/src/plugins/bearer/connman/main.cpp b/src/plugins/bearer/connman/main.cpp
new file mode 100644
index 0000000000..681b871479
--- /dev/null
+++ b/src/plugins/bearer/connman/main.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qconnmanengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+class QConnmanEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QConnmanEnginePlugin();
+ ~QConnmanEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QConnmanEnginePlugin::QConnmanEnginePlugin()
+{
+}
+
+QConnmanEnginePlugin::~QConnmanEnginePlugin()
+{
+}
+
+QStringList QConnmanEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("connman");
+}
+
+QBearerEngine *QConnmanEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("connman")) {
+ QConnmanEngine *engine = new QConnmanEngine;
+ if (engine->connmanAvailable())
+ return engine;
+ else
+ delete engine;
+ }
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QConnmanEnginePlugin)
+Q_EXPORT_PLUGIN2(qconnmanbearer, QConnmanEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
new file mode 100644
index 0000000000..53c9a7d431
--- /dev/null
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -0,0 +1,594 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qconnmanengine.h"
+#include "qconnmanservice_linux_p.h"
+#include "qofonoservice_linux_p.h"
+#include "../qnetworksession_impl.h"
+
+#include <QtNetwork/private/qnetworkconfiguration_p.h>
+
+#include <QtNetwork/qnetworksession.h>
+
+#include <QtCore/qdebug.h>
+
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+QConnmanEngine::QConnmanEngine(QObject *parent)
+: QBearerEngineImpl(parent),
+ connmanManager(new QConnmanManagerInterface(this))
+{
+}
+
+QConnmanEngine::~QConnmanEngine()
+{
+}
+
+bool QConnmanEngine::connmanAvailable() const
+{
+ QMutexLocker locker(&mutex);
+ return connmanManager->isValid();
+}
+
+void QConnmanEngine::initialize()
+{
+ connect(connmanManager,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(propertyChangedContext(QString,QString,QDBusVariant)));
+
+ foreach(const QString techPath, connmanManager->getTechnologies()) {
+ QConnmanTechnologyInterface *tech;
+ tech = new QConnmanTechnologyInterface(techPath, this);
+
+ connect(tech,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(technologyPropertyChangedContext(QString,QString,QDBusVariant)));
+ }
+
+ foreach(const QString servPath, connmanManager->getServices()) {
+ addServiceConfiguration(servPath);
+ }
+
+ // Get current list of access points.
+ getConfigurations();
+}
+
+QList<QNetworkConfigurationPrivate *> QConnmanEngine::getConfigurations()
+{
+ QMutexLocker locker(&mutex);
+ QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
+ QNetworkConfigurationPrivate* cpPriv = 0;
+
+ for (int i = 0; i < foundConfigurations.count(); ++i) {
+ QNetworkConfigurationPrivate *config = new QNetworkConfigurationPrivate;
+ cpPriv = foundConfigurations.at(i);
+
+ config->name = cpPriv->name;
+ config->isValid = cpPriv->isValid;
+ config->id = cpPriv->id;
+ config->state = cpPriv->state;
+ config->type = cpPriv->type;
+ config->roamingSupported = cpPriv->roamingSupported;
+ config->purpose = cpPriv->purpose;
+ config->bearerType = cpPriv->bearerType;
+
+ fetchedConfigurations.append(config);
+ delete config;
+ }
+ return fetchedConfigurations;
+}
+
+void QConnmanEngine::doRequestUpdate()
+{
+ connmanManager->requestScan("");
+ getConfigurations();
+ emit updateCompleted();
+}
+
+QString QConnmanEngine::getInterfaceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ return configInterfaces.value(id);
+}
+
+bool QConnmanEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ return accessPointConfigurations.contains(id);
+}
+
+void QConnmanEngine::connectToId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ QString servicePath = serviceFromId(id);
+ QConnmanServiceInterface serv(servicePath);
+ if(!serv.isValid()) {
+ emit connectionError(id, QBearerEngineImpl::InterfaceLookupError);
+ } else {
+ if(serv.getType() != "cellular") {
+
+ serv.connect();
+ } else {
+ QOfonoManagerInterface ofonoManager(0);
+ QString modemPath = ofonoManager.currentModem().path();
+ QOfonoDataConnectionManagerInterface dc(modemPath,0);
+ foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) {
+ if(dcPath.path().contains(servicePath.section("_",-1))) {
+ QOfonoPrimaryDataContextInterface primaryContext(dcPath.path(),0);
+ primaryContext.setActive(true);
+ }
+ }
+ }
+ }
+}
+
+void QConnmanEngine::disconnectFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ QString servicePath = serviceFromId(id);
+ QConnmanServiceInterface serv(servicePath);
+ if(!serv.isValid()) {
+ emit connectionError(id, DisconnectionError);
+ } else {
+ if(serv.getType() != "cellular") {
+ serv.disconnect();
+ } else {
+ QOfonoManagerInterface ofonoManager(0);
+ QString modemPath = ofonoManager.currentModem().path();
+ QOfonoDataConnectionManagerInterface dc(modemPath,0);
+ foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) {
+ if(dcPath.path().contains(servicePath.section("_",-1))) {
+ QOfonoPrimaryDataContextInterface primaryContext(dcPath.path(),0);
+ primaryContext.setActive(false);
+ }
+ }
+ }
+ }
+}
+
+void QConnmanEngine::requestUpdate()
+{
+ QMutexLocker locker(&mutex);
+ QTimer::singleShot(0, this, SLOT(doRequestUpdate()));
+}
+
+QString QConnmanEngine::serviceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ foreach(const QString service, serviceNetworks) {
+ if (id == QString::number(qHash(service)))
+ return service;
+ }
+
+ return QString();
+}
+
+QNetworkSession::State QConnmanEngine::sessionStateForId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ if (!ptr)
+ return QNetworkSession::Invalid;
+
+ if (!ptr->isValid) {
+ return QNetworkSession::Invalid;
+
+ }
+ QString service = serviceFromId(id);
+ QConnmanServiceInterface serv(service);
+ QString servState = serv.getState();
+
+ if(serv.isFavorite() && (servState == "idle" || servState == "failure")) {
+ return QNetworkSession::Disconnected;
+ }
+
+ if(servState == "association" || servState == "configuration" || servState == "login") {
+ return QNetworkSession::Connecting;
+ }
+ if(servState == "ready" || servState == "online") {
+ return QNetworkSession::Connected;
+ }
+
+ if ((ptr->state & QNetworkConfiguration::Discovered) ==
+ QNetworkConfiguration::Discovered) {
+ return QNetworkSession::Disconnected;
+ } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
+ return QNetworkSession::NotAvailable;
+ } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
+ QNetworkConfiguration::Undefined) {
+ return QNetworkSession::NotAvailable;
+ }
+
+ return QNetworkSession::Invalid;
+}
+
+quint64 QConnmanEngine::bytesWritten(const QString &id)
+{//TODO use connman counter API
+ QMutexLocker locker(&mutex);
+ quint64 result = 0;
+ QString devFile = getInterfaceFromId(id);
+ QFile tx("/sys/class/net/"+devFile+"/statistics/tx_bytes");
+ if(tx.exists() && tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QTextStream in(&tx);
+ in >> result;
+ tx.close();
+ }
+
+ return result;
+}
+
+quint64 QConnmanEngine::bytesReceived(const QString &id)
+{//TODO use connman counter API
+ QMutexLocker locker(&mutex);
+ quint64 result = 0;
+ QString devFile = getInterfaceFromId(id);
+ QFile rx("/sys/class/net/"+devFile+"/statistics/rx_bytes");
+ if(rx.exists() && rx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QTextStream in(&rx);
+ in >> result;
+ rx.close();
+ }
+ return result;
+}
+
+quint64 QConnmanEngine::startTime(const QString &/*id*/)
+{
+ // TODO
+ QMutexLocker locker(&mutex);
+ if (activeTime.isNull()) {
+ return 0;
+ }
+ return activeTime.secsTo(QDateTime::currentDateTime());
+}
+
+QNetworkConfigurationManager::Capabilities QConnmanEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::ForcedRoaming |
+ QNetworkConfigurationManager::DataStatistics |
+ QNetworkConfigurationManager::CanStartAndStopInterfaces;
+}
+
+QNetworkSessionPrivate *QConnmanEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl;
+}
+
+QNetworkConfigurationPrivatePointer QConnmanEngine::defaultConfiguration()
+{
+ return QNetworkConfigurationPrivatePointer();
+}
+
+void QConnmanEngine::propertyChangedContext(const QString &path,const QString &item, const QDBusVariant &value)
+{
+ Q_UNUSED(path);
+
+ QMutexLocker locker(&mutex);
+ if(item == "Services") {
+ QDBusArgument arg = qvariant_cast<QDBusArgument>(value.variant());
+ QStringList list = qdbus_cast<QStringList>(arg);
+
+ if(list.count() > accessPointConfigurations.count()) {
+ foreach(const QString service, list) {
+ addServiceConfiguration(service);
+ }
+ }
+ }
+
+ if(item == "Technologies") {
+ QDBusArgument arg = qvariant_cast<QDBusArgument>(value.variant());
+ QStringList newlist = qdbus_cast<QStringList>(arg);
+ if(newlist.count() > 0) {
+ QMap<QString,QConnmanTechnologyInterface *> oldtech = technologies;
+
+ foreach(const QString listPath, newlist) {
+ if(!oldtech.contains(listPath)) {
+ QConnmanTechnologyInterface *tech;
+ tech = new QConnmanTechnologyInterface(listPath,this);
+ connect(tech,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(technologyPropertyChangedContext(QString,QString,QDBusVariant)));
+ technologies.insert(listPath, tech);
+ }
+ }
+ }
+ }
+ if(item == "State") {
+// qDebug() << value.variant();
+ }
+}
+
+void QConnmanEngine::servicePropertyChangedContext(const QString &path,const QString &item, const QDBusVariant &value)
+{
+ QMutexLocker locker(&mutex);
+ if(item == "State") {
+ configurationChange(QString::number(qHash(path)));
+
+ if(value.variant().toString() == "failure") {
+ QConnmanServiceInterface serv(path);
+ emit connectionError(QString::number(qHash(path)), ConnectError);
+ }
+ }
+}
+
+void QConnmanEngine::technologyPropertyChangedContext(const QString & path, const QString &item, const QDBusVariant &value)
+{
+ if(item == "State") {
+ if(value.variant().toString() == "offline") {
+ QConnmanTechnologyInterface tech(path);
+ disconnect(&tech,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(technologyPropertyChangedContext(QString,QString,QDBusVariant)));
+
+ technologies.remove(path);
+ }
+ }
+}
+
+void QConnmanEngine::configurationChange(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (accessPointConfigurations.contains(id)) {
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ QString servicePath = serviceFromId(id);
+ QConnmanServiceInterface *serv;
+ serv = new QConnmanServiceInterface(servicePath);
+ QString networkName = serv->getName();
+
+ QNetworkConfiguration::StateFlags curState = getStateForService(servicePath);
+
+ ptr->mutex.lock();
+
+ if (!ptr->isValid) {
+ ptr->isValid = true;
+ }
+
+ if (ptr->name != networkName) {
+ ptr->name = networkName;
+ }
+
+ if (ptr->state != curState) {
+ ptr->state = curState;
+ }
+
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+
+ locker.unlock();
+ emit updateCompleted();
+}
+
+QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QString &service)
+{
+ QMutexLocker locker(&mutex);
+ QConnmanServiceInterface serv(service);
+ QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
+ if( serv.getType() == "cellular") {
+ if(serv.isSetupRequired()) {
+ flag = ( flag | QNetworkConfiguration::Defined);
+ } else {
+ flag = ( flag | QNetworkConfiguration::Discovered);
+ }
+ } else {
+ if(serv.isFavorite()) {
+ flag = ( flag | QNetworkConfiguration::Discovered);
+ } else {
+ flag = QNetworkConfiguration::Undefined;
+ }
+ }
+
+ if(serv.getState() == "ready" || serv.getState() == "online") {
+ flag = ( flag | QNetworkConfiguration::Active);
+ }
+
+ return flag;
+}
+
+QNetworkConfiguration::BearerType QConnmanEngine::typeToBearer(const QString &type)
+{
+ if (type == "wifi")
+ return QNetworkConfiguration::BearerWLAN;
+ if (type == "ethernet")
+ return QNetworkConfiguration::BearerEthernet;
+ if (type == "bluetooth")
+ return QNetworkConfiguration::BearerBluetooth;
+ if (type == "cellular") {
+ return ofonoTechToBearerType(type);
+ }
+ if (type == "wimax")
+ return QNetworkConfiguration::BearerWiMAX;
+
+// if(type == "gps")
+// if(type == "vpn")
+
+ return QNetworkConfiguration::BearerUnknown;
+}
+
+QNetworkConfiguration::BearerType QConnmanEngine::ofonoTechToBearerType(const QString &/*type*/)
+{
+ QOfonoManagerInterface ofonoManager(this);
+ QOfonoNetworkRegistrationInterface ofonoNetwork(ofonoManager.currentModem().path(),this);
+
+ if(ofonoNetwork.isValid()) {
+ foreach(const QDBusObjectPath op,ofonoNetwork.getOperators() ) {
+ QOfonoNetworkOperatorInterface opIface(op.path(),this);
+
+ foreach(const QString opTech, opIface.getTechnologies()) {
+
+ if(opTech == "gsm") {
+ return QNetworkConfiguration::Bearer2G;
+ }
+ if(opTech == "edge"){
+ return QNetworkConfiguration::BearerCDMA2000; //wrong, I know
+ }
+ if(opTech == "umts"){
+ return QNetworkConfiguration::BearerWCDMA;
+ }
+ if(opTech == "hspa"){
+ return QNetworkConfiguration::BearerHSPA;
+ }
+ if(opTech == "lte"){
+ return QNetworkConfiguration::BearerWiMAX; //not exact
+ }
+ }
+ }
+ }
+ return QNetworkConfiguration::BearerUnknown;
+}
+
+bool QConnmanEngine::isRoamingAllowed(const QString &context)
+{
+ QOfonoManagerInterface ofonoManager(this);
+ QString modemPath = ofonoManager.currentModem().path();
+ QOfonoDataConnectionManagerInterface dc(modemPath,this);
+ foreach(const QDBusObjectPath dcPath,dc.getPrimaryContexts()) {
+ if(dcPath.path().contains(context.section("_",-1))) {
+ return dc.isRoamingAllowed();
+ }
+ }
+ return false;
+}
+
+void QConnmanEngine::removeConfiguration(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (accessPointConfigurations.contains(id)) {
+
+ QString service = serviceFromId(id);
+ QConnmanServiceInterface serv(service);
+
+ disconnect(&serv,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(servicePropertyChangedContext(QString,QString, QDBusVariant)));
+
+ serviceNetworks.removeOne(service);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id);
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+}
+
+void QConnmanEngine::addServiceConfiguration(const QString &servicePath)
+{
+ QMutexLocker locker(&mutex);
+ QConnmanServiceInterface *serv;
+ serv = new QConnmanServiceInterface(servicePath);
+
+ const QString id = QString::number(qHash(servicePath));
+
+ if (!accessPointConfigurations.contains(id)) {
+ serviceNetworks.append(servicePath);
+
+ connect(serv,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
+ this,SLOT(servicePropertyChangedContext(QString,QString, QDBusVariant)));
+ QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
+
+ QString networkName = serv->getName();
+
+ const QString connectionType = serv->getType();
+ if (connectionType == "ethernet") {
+ cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
+ } else if (connectionType == "wifi") {
+ cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
+ } else if (connectionType == "cellular") {
+ cpPriv->bearerType = ofonoTechToBearerType("cellular");
+ if(servicePath.isEmpty()) {
+ networkName = serv->getAPN();
+ if(networkName.isEmpty()) {
+ networkName = serv->getName();
+ }
+ }
+ cpPriv->roamingSupported = isRoamingAllowed(servicePath);
+ } else if (connectionType == "wimax") {
+ cpPriv->bearerType = QNetworkConfiguration::BearerWiMAX;
+ } else {
+ cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
+ }
+
+ cpPriv->name = networkName;
+ cpPriv->isValid = true;
+ cpPriv->id = id;
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+
+ if(serv->getSecurity() == "none") {
+ cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
+ } else {
+ cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
+ }
+
+ cpPriv->state = getStateForService(servicePath);
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(ptr->id, ptr);
+ foundConfigurations.append(cpPriv);
+ configInterfaces[cpPriv->id] = serv->getInterface();
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+ locker.relock();
+ emit updateCompleted();
+ }
+}
+
+bool QConnmanEngine::requiresPolling() const
+{
+ return false;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
new file mode 100644
index 0000000000..8219c126c1
--- /dev/null
+++ b/src/plugins/bearer/connman/qconnmanengine.h
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCONNMANENGINE_P_H
+#define QCONNMANENGINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QLibrary class. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "../qbearerengine_impl.h"
+
+#include "qconnmanservice_linux_p.h"
+
+#include <QMap>
+#include <QVariant>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+class QConnmanEngine : public QBearerEngineImpl
+{
+ Q_OBJECT
+
+public:
+ QConnmanEngine(QObject *parent = 0);
+ ~QConnmanEngine();
+
+ bool connmanAvailable() const;
+
+ virtual QString getInterfaceFromId(const QString &id);
+ bool hasIdentifier(const QString &id);
+
+ virtual void connectToId(const QString &id);
+ virtual void disconnectFromId(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkSession::State sessionStateForId(const QString &id);
+ QNetworkSessionPrivate *createSessionBackend();
+
+ virtual quint64 bytesWritten(const QString &id);
+ virtual quint64 bytesReceived(const QString &id);
+ virtual quint64 startTime(const QString &id);
+
+
+ virtual QNetworkConfigurationManager::Capabilities capabilities() const;
+ virtual QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+ void configurationChange(const QString &id);
+ QList<QNetworkConfigurationPrivate *> getConfigurations();
+
+
+private Q_SLOTS:
+
+ void doRequestUpdate();
+ void servicePropertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+ void technologyPropertyChangedContext(const QString &,const QString &, const QDBusVariant &);
+
+private:
+ QConnmanManagerInterface *connmanManager;
+
+ QList<QNetworkConfigurationPrivate *> foundConfigurations;
+
+ QString serviceFromId(const QString &id);
+ QString networkFromId(const QString &id);
+
+ QNetworkConfiguration::StateFlags getStateForService(const QString &service);
+ QNetworkConfiguration::BearerType typeToBearer(const QString &type);
+
+ void removeConfiguration(const QString &servicePath);
+ void addServiceConfiguration(const QString &servicePath);
+ QDateTime activeTime;
+
+
+ QMap<QString,QConnmanTechnologyInterface *> technologies; // techpath, tech interface
+ QMap<QString,QString> configInterfaces; // id, interface name
+ QList<QString> serviceNetworks; //servpath
+
+ QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
+ bool isRoamingAllowed(const QString &context);
+protected:
+ bool requiresPolling() const;
+};
+
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif
+
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
new file mode 100644
index 0000000000..02b5eb9661
--- /dev/null
+++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
@@ -0,0 +1,894 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QList>
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusPendingCall>
+
+#include "qconnmanservice_linux_p.h"
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+static QDBusConnection dbusConnection = QDBusConnection::systemBus();
+
+
+QConnmanManagerInterface::QConnmanManagerInterface( QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
+ QLatin1String(CONNMAN_MANAGER_PATH),
+ CONNMAN_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QConnmanManagerInterface::~QConnmanManagerInterface()
+{
+}
+
+void QConnmanManagerInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(CONNMAN_SERVICE),
+ QLatin1String(CONNMAN_MANAGER_PATH),
+ QLatin1String(CONNMAN_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(stateChanged(QString))) {
+ if (!connection().connect(QLatin1String(CONNMAN_SERVICE),
+ QLatin1String(CONNMAN_MANAGER_PATH),
+ QLatin1String(CONNMAN_MANAGER_INTERFACE),
+ QLatin1String("StateChanged"),
+ this,SIGNAL(stateChanged(const QString&)))) {
+ qWarning() << "StateChanged not connected";
+
+ }
+ }
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QConnmanDBusHelper *helper;
+ helper = new QConnmanDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+ QLatin1String(CONNMAN_MANAGER_PATH),
+ QLatin1String(CONNMAN_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QConnmanManagerInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QConnmanManagerInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QConnmanManagerInterface::getProperties()
+{
+ if(this->isValid()) {
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+ } else return QVariantMap();
+}
+
+QString QConnmanManagerInterface::getState()
+{
+ QDBusReply<QString > reply = this->call("GetState");
+ return reply.value();
+}
+
+bool QConnmanManagerInterface::setProperty(const QString &name, const QDBusVariant &value)
+{
+ Q_UNUSED(name);
+ Q_UNUSED(value);
+ return false;
+}
+
+QDBusObjectPath QConnmanManagerInterface::createProfile(const QString &/*name*/)
+{
+ return QDBusObjectPath();
+}
+
+bool QConnmanManagerInterface::removeProfile(QDBusObjectPath /*path*/)
+{
+ return false;
+}
+
+bool QConnmanManagerInterface::requestScan(const QString &type)
+{
+ QDBusReply<QString> reply = this->call(QLatin1String("RequestScan"), QVariant::fromValue(type));
+
+ bool ok = true;
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ ok = false;
+ }
+ return ok;
+}
+
+bool QConnmanManagerInterface::enableTechnology(const QString &type)
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("EnableTechnology"), QVariant::fromValue(type));
+ bool ok = true;
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ ok = false;
+ }
+ return ok;
+}
+
+bool QConnmanManagerInterface::disableTechnology(const QString &type)
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("DisableTechnology"), QVariant::fromValue(type));
+ bool ok = true;
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ ok = false;
+ }
+ return ok;
+}
+
+QDBusObjectPath QConnmanManagerInterface::connectService(QVariantMap &map)
+{
+ QDBusReply<QDBusObjectPath > reply = this->call(QLatin1String("ConnectService"), QVariant::fromValue(map));
+ if(!reply.isValid()) {
+ qDebug() << reply.error().message();
+
+ }
+ return reply;
+}
+
+void QConnmanManagerInterface::registerAgent(QDBusObjectPath &/*path*/)
+{
+}
+
+void QConnmanManagerInterface::unregisterAgent(QDBusObjectPath /*path*/)
+{
+}
+
+void QConnmanManagerInterface::registerCounter(const QString &path, quint32 interval)
+{ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("RegisterCounter"),
+ QVariant::fromValue(path),
+ QVariant::fromValue(interval));
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ }
+}
+
+void QConnmanManagerInterface::unregisterCounter(const QString &path)
+{ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("UnregisterCounter"),
+ QVariant::fromValue(path));
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ }
+}
+
+QString QConnmanManagerInterface::requestSession(const QString &bearerName)
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("RequestSession"),
+ QVariant::fromValue(bearerName));
+ return QString();
+}
+
+void QConnmanManagerInterface::releaseSession()
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = this->call(QLatin1String("ReleaseSession"));
+}
+
+
+QDBusObjectPath QConnmanManagerInterface::lookupService(const QString &service)
+{
+ QDBusReply<QDBusObjectPath > reply = this->call(QLatin1String("LookupService"), QVariant::fromValue(service));
+ if(!reply.isValid()) {
+ qDebug() << reply.error().message();
+ }
+ return reply;
+}
+
+// properties
+
+QStringList QConnmanManagerInterface::getAvailableTechnologies()
+{
+ QVariant var = getProperty("AvailableTechnologies");
+ return qdbus_cast<QStringList>(var);
+}
+
+QStringList QConnmanManagerInterface::getEnabledTechnologies()
+{
+ QVariant var = getProperty("EnabledTechnologies");
+ return qdbus_cast<QStringList>(var);
+}
+
+QStringList QConnmanManagerInterface::getConnectedTechnologies()
+{
+ QVariant var = getProperty("ConnectedTechnologies");
+ return qdbus_cast<QStringList>(var);
+}
+
+QString QConnmanManagerInterface::getDefaultTechnology()
+{
+ QVariant var = getProperty("DefaultTechnology");
+ return qdbus_cast<QString>(var);
+}
+
+bool QConnmanManagerInterface::getOfflineMode()
+{
+ QVariant var = getProperty("OfflineMode");
+ return qdbus_cast<bool>(var);
+}
+
+QString QConnmanManagerInterface::getActiveProfile()
+{
+ QVariant var = getProperty("ActiveProfile");
+ return qdbus_cast<QString>(var);
+}
+
+QStringList QConnmanManagerInterface::getProfiles()
+{
+ QVariant var = getProperty("Profiles");
+ return qdbus_cast<QStringList>(var);
+}
+
+QStringList QConnmanManagerInterface::getTechnologies()
+{
+ QVariant var = getProperty("Technologies");
+ return qdbus_cast<QStringList >(var);
+}
+
+QStringList QConnmanManagerInterface::getServices()
+{
+ QVariant var = getProperty("Services");
+ return qdbus_cast<QStringList >(var);
+}
+
+QString QConnmanManagerInterface::getPathForTechnology(const QString &name)
+{
+ foreach(const QString path, getTechnologies()) {
+ if(path.contains(name)) {
+ return path;
+ }
+ }
+ return "";
+}
+
+
+//////////////////////////
+QConnmanProfileInterface::QConnmanProfileInterface(const QString &dbusPathName,QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
+ dbusPathName,
+ CONNMAN_PROFILE_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QConnmanProfileInterface::~QConnmanProfileInterface()
+{
+}
+
+void QConnmanProfileInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+ this->path(),
+ QLatin1String(CONNMAN_PROFILE_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(QString,QDBusVariant)));
+ }
+}
+
+void QConnmanProfileInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString, QVariant))) {
+
+ }
+}
+
+QVariantMap QConnmanProfileInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QVariant QConnmanProfileInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ }
+ return var;
+}
+
+// properties
+QString QConnmanProfileInterface::getName()
+{
+
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+bool QConnmanProfileInterface::isOfflineMode()
+{
+ QVariant var = getProperty("OfflineMode");
+ return qdbus_cast<bool>(var);
+}
+
+QStringList QConnmanProfileInterface::getServices()
+{
+ QVariant var = getProperty("Services");
+ return qdbus_cast<QStringList>(var);
+}
+
+
+///////////////////////////
+QConnmanServiceInterface::QConnmanServiceInterface(const QString &dbusPathName,QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
+ dbusPathName,
+ CONNMAN_SERVICE_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QConnmanServiceInterface::~QConnmanServiceInterface()
+{
+}
+
+void QConnmanServiceInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+ this->path(),
+ QLatin1String(CONNMAN_SERVICE_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(QString,QDBusVariant)));
+ }
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QConnmanDBusHelper *helper;
+ helper = new QConnmanDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+ this->path(),
+ QLatin1String(CONNMAN_SERVICE_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QConnmanServiceInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariantMap QConnmanServiceInterface::getProperties()
+{
+ if(this->isValid()) {
+ QDBusReply<QVariantMap> reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+ }
+ else
+ return QVariantMap();
+}
+
+QVariant QConnmanServiceInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ }
+ return var;
+}
+
+void QConnmanServiceInterface::connect()
+{
+ this->asyncCall(QLatin1String("Connect"));
+}
+
+void QConnmanServiceInterface::disconnect()
+{
+ QDBusReply<QVariantMap> reply = this->call(QLatin1String("Disconnect"));
+}
+
+void QConnmanServiceInterface::remove()
+{
+ QDBusReply<QVariantMap> reply = this->call(QLatin1String("Remove"));
+}
+
+// void moveBefore(QDBusObjectPath &service);
+// void moveAfter(QDBusObjectPath &service);
+
+// properties
+QString QConnmanServiceInterface::getState()
+{
+ QVariant var = getProperty("State");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getError()
+{
+ QVariant var = getProperty("Error");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getType()
+{
+ QVariant var = getProperty("Type");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getMode()
+{
+ QVariant var = getProperty("Mode");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getSecurity()
+{
+ QVariant var = getProperty("Security");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getPassphrase()
+{
+ QVariant var = getProperty("Passphrase");
+ return qdbus_cast<QString>(var);
+}
+
+bool QConnmanServiceInterface::isPassphraseRequired()
+{
+ QVariant var = getProperty("PassphraseRequired");
+ return qdbus_cast<bool>(var);
+}
+
+quint8 QConnmanServiceInterface::getSignalStrength()
+{
+ QVariant var = getProperty("Strength");
+ return qdbus_cast<quint8>(var);
+}
+
+bool QConnmanServiceInterface::isFavorite()
+{
+ QVariant var = getProperty("Favorite");
+ return qdbus_cast<bool>(var);
+}
+
+bool QConnmanServiceInterface::isImmutable()
+{
+ QVariant var = getProperty("Immutable");
+ return qdbus_cast<bool>(var);
+}
+
+bool QConnmanServiceInterface::isAutoConnect()
+{
+ QVariant var = getProperty("AutoConnect");
+ return qdbus_cast<bool>(var);
+}
+
+bool QConnmanServiceInterface::isSetupRequired()
+{
+ QVariant var = getProperty("SetupRequired");
+ return qdbus_cast<bool>(var);
+}
+
+QString QConnmanServiceInterface::getAPN()
+{
+ QVariant var = getProperty("APN");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getMCC()
+{
+ QVariant var = getProperty("MCC");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanServiceInterface::getMNC()
+{
+ QVariant var = getProperty("MNC");
+ return qdbus_cast<QString>(var);
+}
+
+bool QConnmanServiceInterface::isRoaming()
+{
+ QVariant var = getProperty("Roaming");
+ return qdbus_cast<bool>(var);
+}
+
+QStringList QConnmanServiceInterface::getNameservers()
+{
+ QVariant var = getProperty("NameServers");
+ return qdbus_cast<QStringList>(var);
+}
+
+QStringList QConnmanServiceInterface::getDomains()
+{
+ QVariant var = getProperty("Domains");
+ return qdbus_cast<QStringList>(var);
+}
+
+QVariantMap QConnmanServiceInterface::getIPv4()
+{
+ QVariant var = getProperty("IPv4");
+ return qdbus_cast<QVariantMap >(var);
+}
+
+QVariantMap QConnmanServiceInterface::getIPv4Configuration()
+{
+ QVariant var = getProperty("IPv4.Configuration");
+ return qdbus_cast<QVariantMap >(var);
+}
+
+QVariantMap QConnmanServiceInterface::getProxy()
+{
+ QVariant var = getProperty("Proxy");
+ return qdbus_cast<QVariantMap >(var);
+}
+
+QVariantMap QConnmanServiceInterface::getEthernet()
+{
+ QVariant var = getProperty("Ethernet");
+ return qdbus_cast<QVariantMap >(var);
+}
+
+QString QConnmanServiceInterface::getMethod()
+{
+ QVariant var;
+ QVariantMap map = getEthernet();
+ QMapIterator<QString,QVariant> it(map);
+ while(it.hasNext()) {
+ it.next();
+ if(it.key() == "Method") {
+ return it.value().toString();
+ }
+ }
+ return QString();
+}
+
+QString QConnmanServiceInterface::getInterface()
+{
+ QVariant var;
+ QVariantMap map = getEthernet();
+
+ QMapIterator<QString,QVariant> it(map);
+ while(it.hasNext()) {
+ it.next();
+ if(it.key() == "Interface") {
+ return it.value().toString();
+ }
+ }
+
+ return QString();
+}
+
+QString QConnmanServiceInterface::getMacAddress()
+{
+ QVariant var;
+ QVariantMap map = getEthernet();
+
+ QMapIterator<QString,QVariant> it(map);
+ while(it.hasNext()) {
+ it.next();
+ if(it.key() == "Address") {
+ return it.value().toString();
+ }
+ }
+ return QString();
+}
+
+quint16 QConnmanServiceInterface::getMtu()
+{
+ quint16 mtu=0;
+ QVariant var;
+ QVariantMap map = getEthernet();
+
+ QMapIterator<QString,QVariant> it(map);
+ while(it.hasNext()) {
+ it.next();
+ if(it.key() == "MTU") {
+ return it.value().toUInt();
+ }
+ }
+ return mtu;
+}
+
+quint16 QConnmanServiceInterface::getSpeed()
+{
+ quint16 speed=0;
+ QVariant var;
+ QVariantMap map = getEthernet();
+
+ QMapIterator<QString,QVariant> it(map);
+ while(it.hasNext()) {
+ it.next();
+ if(it.key() == "Speed") {
+ return it.value().toUInt();
+ }
+ }
+ return speed;
+}
+
+QString QConnmanServiceInterface::getDuplex()
+{
+ QVariant var;
+ QVariantMap map = getEthernet();
+
+ QMapIterator<QString,QVariant> it(map);
+ while(it.hasNext()) {
+ it.next();
+ if(it.key() == "Duplex") {
+ return it.value().toString();
+ }
+ }
+ return QString();
+}
+
+
+bool QConnmanServiceInterface::isOfflineMode()
+{
+ QVariant var = getProperty("OfflineMode");
+ return qdbus_cast<bool>(var);
+}
+
+QStringList QConnmanServiceInterface::getServices()
+{
+ QVariant var = getProperty("Services");
+ return qdbus_cast<QStringList>(var);
+}
+
+
+//////////////////////////
+QConnmanTechnologyInterface::QConnmanTechnologyInterface(const QString &dbusPathName,QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
+ dbusPathName,
+ CONNMAN_TECHNOLOGY_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QConnmanTechnologyInterface::~QConnmanTechnologyInterface()
+{
+}
+
+void QConnmanTechnologyInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+ this->path(),
+ QLatin1String(CONNMAN_TECHNOLOGY_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(QString,QDBusVariant)));
+ }
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QConnmanDBusHelper *helper;
+ helper = new QConnmanDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+ this->path(),
+ QLatin1String(CONNMAN_TECHNOLOGY_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QConnmanTechnologyInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariantMap QConnmanTechnologyInterface::getProperties()
+{
+ QDBusReply<QVariantMap> reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QVariant QConnmanTechnologyInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ }
+ return var;
+}
+
+// properties
+QString QConnmanTechnologyInterface::getState()
+{
+ QVariant var = getProperty("State");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanTechnologyInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QString QConnmanTechnologyInterface::getType()
+{
+ QVariant var = getProperty("Type");
+ return qdbus_cast<QString>(var);
+}
+
+
+//////////////////////////////////
+QConnmanAgentInterface::QConnmanAgentInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
+ dbusPathName,
+ CONNMAN_AGENT_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QConnmanAgentInterface::~QConnmanAgentInterface()
+{
+}
+
+void QConnmanAgentInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+// dbusConnection.connect(QLatin1String(CONNMAN_SERVICE),
+// this->path(),
+// QLatin1String(CONNMAN_NETWORK_INTERFACE),
+// QLatin1String("PropertyChanged"),
+// this,SIGNAL(propertyChanged(const QString &, QVariant &)));
+ }
+}
+
+void QConnmanAgentInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString, QDBusVariant))) {
+
+ }
+}
+
+
+void QConnmanAgentInterface::release()
+{
+}
+
+void QConnmanAgentInterface::reportError(QDBusObjectPath &/*path*/, const QString &/*error*/)
+{
+}
+
+//dict QConnmanAgentInterface::requestInput(QDBusObjectPath &path, dict fields)
+//{
+//}
+
+void QConnmanAgentInterface::cancel()
+{
+}
+
+
+/////////////////////////////////////////
+QConnmanCounterInterface::QConnmanCounterInterface(const QString &dbusPathName,QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(CONNMAN_SERVICE),
+ dbusPathName,
+ CONNMAN_COUNTER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QConnmanCounterInterface::~QConnmanCounterInterface()
+{
+}
+
+quint32 QConnmanCounterInterface::getReceivedByteCount()
+{
+ return 0;
+}
+
+quint32 QConnmanCounterInterface::getTransmittedByteCount()
+{
+ return 0;
+}
+
+quint64 QConnmanCounterInterface::getTimeOnline()
+{
+ return 0;
+}
+
+/////////////////////////////////////////
+QConnmanDBusHelper::QConnmanDBusHelper(QObject * parent)
+ : QObject(parent)
+{
+}
+
+QConnmanDBusHelper::~QConnmanDBusHelper()
+{
+}
+
+void QConnmanDBusHelper::propertyChanged(const QString &item, const QDBusVariant &var)
+{
+ QDBusMessage msg = this->message();
+ Q_EMIT propertyChangedContext(msg.path() ,item, var);
+}
+
+/////////////////
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
+
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
new file mode 100644
index 0000000000..d0ef6dc4f9
--- /dev/null
+++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
@@ -0,0 +1,323 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCONNMANSERVICE_H
+#define QCONNMANSERVICE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusContext>
+#include <QMap>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+#ifndef __CONNMAN_DBUS_H
+
+#define CONNMAN_SERVICE "net.connman"
+#define CONNMAN_PATH "/net/connman"
+
+#define CONNMAN_DEBUG_INTERFACE CONNMAN_SERVICE ".Debug"
+#define CONNMAN_ERROR_INTERFACE CONNMAN_SERVICE ".Error"
+#define CONNMAN_AGENT_INTERFACE CONNMAN_SERVICE ".Agent"
+#define CONNMAN_COUNTER_INTERFACE CONNMAN_SERVICE ".Counter"
+
+#define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager"
+#define CONNMAN_MANAGER_PATH "/"
+
+#define CONNMAN_TASK_INTERFACE CONNMAN_SERVICE ".Task"
+#define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile"
+#define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service"
+#define CONNMAN_PROVIDER_INTERFACE CONNMAN_SERVICE ".Provider"
+#define CONNMAN_TECHNOLOGY_INTERFACE CONNMAN_SERVICE ".Technology"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QT_END_NAMESPACE
+
+
+QT_BEGIN_NAMESPACE
+
+class QConnmanManagerInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QConnmanManagerInterface( QObject *parent = 0);
+ ~QConnmanManagerInterface();
+
+ QDBusObjectPath path() const;
+
+ QVariantMap getProperties();
+ bool setProperty(const QString &name, const QDBusVariant &value);
+ QDBusObjectPath createProfile(const QString &name);
+ bool removeProfile(QDBusObjectPath path);
+ bool requestScan(const QString &type);
+ bool enableTechnology(const QString &type);
+ bool disableTechnology(const QString &type);
+ QDBusObjectPath connectService(QVariantMap &map);
+ void registerAgent(QDBusObjectPath &path);
+ void unregisterAgent(QDBusObjectPath path);
+ void registerCounter(const QString &path, quint32 interval);
+ void unregisterCounter(const QString &path);
+
+ QString requestSession(const QString &bearerName);
+ void releaseSession();
+
+ // properties
+ QString getState();
+ QStringList getAvailableTechnologies();
+ QStringList getEnabledTechnologies();
+ QStringList getConnectedTechnologies();
+ QString getDefaultTechnology();
+ bool getOfflineMode();
+ QString getActiveProfile();
+ QStringList getProfiles();
+ QStringList getTechnologies();
+ QStringList getServices();
+ QDBusObjectPath lookupService(const QString &);
+
+ QString getPathForTechnology(const QString &tech);
+
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void stateChanged(const QString &);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+class QConnmanProfileInterfacePrivate;
+class QConnmanProfileInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QConnmanProfileInterface(const QString &dbusPathName,QObject *parent = 0);
+ ~QConnmanProfileInterface();
+
+ QVariantMap getProperties();
+// properties
+ QString getName();
+ bool isOfflineMode();
+ QStringList getServices();
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+private:
+ QConnmanProfileInterfacePrivate *d;
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+class QConnmanServiceInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QConnmanServiceInterface(const QString &dbusPathName,QObject *parent = 0);
+ ~QConnmanServiceInterface();
+
+ QVariantMap getProperties();
+ // clearProperty
+ void connect();
+ void disconnect();
+ void remove();
+ // void moveBefore(QDBusObjectPath &service);
+ // void moveAfter(QDBusObjectPath &service);
+
+// properties
+ QString getState();
+ QString getError();
+ QString getName();
+ QString getType();
+ QString getMode();
+ QString getSecurity();
+ QString getPassphrase();
+ bool isPassphraseRequired();
+ quint8 getSignalStrength();
+ bool isFavorite();
+ bool isImmutable();
+ bool isAutoConnect();
+ bool isSetupRequired();
+ QString getAPN();
+ QString getMCC();
+ QString getMNC();
+ bool isRoaming();
+ QStringList getNameservers();
+ QStringList getDomains();
+ QVariantMap getIPv4();
+ QVariantMap getIPv4Configuration();
+ QVariantMap getProxy();
+ QVariantMap getEthernet();
+
+ QString getMethod();
+ QString getInterface();
+ QString getMacAddress();
+ quint16 getMtu();
+ quint16 getSpeed();
+ QString getDuplex();
+
+ bool isOfflineMode();
+ QStringList getServices();
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+class QConnmanTechnologyInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QConnmanTechnologyInterface(const QString &dbusPathName,QObject *parent = 0);
+ ~QConnmanTechnologyInterface();
+
+ QVariantMap getProperties();
+// properties
+ QString getState();
+ QString getName();
+ QString getType();
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+
+};
+
+class QConnmanAgentInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QConnmanAgentInterface(const QString &dbusPathName,QObject *parent = 0);
+ ~QConnmanAgentInterface();
+
+ void release();
+ void reportError(QDBusObjectPath &path, const QString &error);
+// dict requestInput(QDBusObjectPath &path, dict fields);
+ void cancel();
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+};
+
+class QConnmanCounterInterfacePrivate;
+class QConnmanCounterInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QConnmanCounterInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QConnmanCounterInterface();
+
+// void release();
+ QString getInterface();
+ quint32 getReceivedByteCount();
+ quint32 getTransmittedByteCount();
+ quint64 getTimeOnline();
+
+private:
+ QConnmanCounterInterfacePrivate *d;
+};
+
+class QConnmanDBusHelper: public QObject, protected QDBusContext
+ {
+ Q_OBJECT
+ public:
+ QConnmanDBusHelper(QObject *parent = 0);
+ ~QConnmanDBusHelper();
+
+ public slots:
+ void propertyChanged(const QString &, const QDBusVariant &);
+
+Q_SIGNALS:
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif //QCONNMANSERVICE_H
diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/connman/qofonoservice_linux.cpp
new file mode 100644
index 0000000000..e3fb2c6034
--- /dev/null
+++ b/src/plugins/bearer/connman/qofonoservice_linux.cpp
@@ -0,0 +1,945 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QList>
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusPendingCall>
+
+#include "qofonoservice_linux_p.h"
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+static QDBusConnection dbusConnection = QDBusConnection::systemBus();
+
+
+QOfonoManagerInterface::QOfonoManagerInterface( QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ OFONO_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoManagerInterface::~QOfonoManagerInterface()
+{
+}
+
+QList <QDBusObjectPath> QOfonoManagerInterface::getModems()
+{
+ QVariant var = getProperty("Modems");
+ return qdbus_cast<QList<QDBusObjectPath> >(var);
+}
+
+QDBusObjectPath QOfonoManagerInterface::currentModem()
+{
+ QList<QDBusObjectPath> modems = getModems();
+ foreach(const QDBusObjectPath modem, modems) {
+ QOfonoModemInterface device(modem.path());
+ if(device.isPowered() && device.isOnline())
+ return modem;;
+ }
+ return QDBusObjectPath();
+}
+
+
+void QOfonoManagerInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ QLatin1String(OFONO_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ QLatin1String(OFONO_MANAGER_PATH),
+ QLatin1String(OFONO_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+}
+
+void QOfonoManagerInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoManagerInterface::getProperty(const QString &property)
+{
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ return map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return QVariant();
+}
+
+QVariantMap QOfonoManagerInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ if(reply.isValid())
+ return reply.value();
+ else
+ return QVariantMap();
+}
+
+QOfonoDBusHelper::QOfonoDBusHelper(QObject * parent)
+ : QObject(parent)
+{
+}
+
+QOfonoDBusHelper::~QOfonoDBusHelper()
+{
+}
+
+void QOfonoDBusHelper::propertyChanged(const QString &item, const QDBusVariant &var)
+{
+ QDBusMessage msg = this->message();
+ Q_EMIT propertyChangedContext(msg.path() ,item, var);
+}
+
+
+QOfonoModemInterface::QOfonoModemInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_MODEM_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoModemInterface::~QOfonoModemInterface()
+{
+}
+
+bool QOfonoModemInterface::isPowered()
+{
+ QVariant var = getProperty("Powered");
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoModemInterface::isOnline()
+{
+ QVariant var = getProperty("Online");
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoModemInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoModemInterface::getManufacturer()
+{
+ QVariant var = getProperty("Manufacturer");
+ return qdbus_cast<QString>(var);
+
+}
+
+QString QOfonoModemInterface::getModel()
+{
+
+ QVariant var = getProperty("Model");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoModemInterface::getRevision()
+{
+ QVariant var = getProperty("Revision");
+ return qdbus_cast<QString>(var);
+
+}
+QString QOfonoModemInterface::getSerial()
+{
+ QVariant var = getProperty("Serial");
+ return qdbus_cast<QString>(var);
+
+}
+
+QStringList QOfonoModemInterface::getFeatures()
+{
+ //sms, sim
+ QVariant var = getProperty("Features");
+ return qdbus_cast<QStringList>(var);
+}
+
+QStringList QOfonoModemInterface::getInterfaces()
+{
+ QVariant var = getProperty("Interfaces");
+ return qdbus_cast<QStringList>(var);
+}
+
+QString QOfonoModemInterface::defaultInterface()
+{
+ foreach(const QString &modem,getInterfaces()) {
+ return modem;
+ }
+ return QString();
+}
+
+
+void QOfonoModemInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }}
+
+void QOfonoModemInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariantMap QOfonoModemInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QVariant QOfonoModemInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+
+QOfonoNetworkRegistrationInterface::QOfonoNetworkRegistrationInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_NETWORK_REGISTRATION_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoNetworkRegistrationInterface::~QOfonoNetworkRegistrationInterface()
+{
+}
+
+QString QOfonoNetworkRegistrationInterface::getStatus()
+{
+ /*
+ "unregistered" Not registered to any network
+ "registered" Registered to home network
+ "searching" Not registered, but searching
+ "denied" Registration has been denied
+ "unknown" Status is unknown
+ "roaming" Registered, but roaming*/
+ QVariant var = getProperty("Status");
+ return qdbus_cast<QString>(var);
+}
+
+quint16 QOfonoNetworkRegistrationInterface::getLac()
+{
+ QVariant var = getProperty("LocationAreaCode");
+ return var.value<quint16>();
+}
+
+
+quint32 QOfonoNetworkRegistrationInterface::getCellId()
+{
+ QVariant var = getProperty("CellId");
+ return var.value<quint32>();
+}
+
+QString QOfonoNetworkRegistrationInterface::getTechnology()
+{
+ // "gsm", "edge", "umts", "hspa","lte"
+ QVariant var = getProperty("Technology");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkRegistrationInterface::getOperatorName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+int QOfonoNetworkRegistrationInterface::getSignalStrength()
+{
+ QVariant var = getProperty("Strength");
+ return qdbus_cast<int>(var);
+
+}
+
+QString QOfonoNetworkRegistrationInterface::getBaseStation()
+{
+ QVariant var = getProperty("BaseStation");
+ return qdbus_cast<QString>(var);
+}
+
+QList <QDBusObjectPath> QOfonoNetworkRegistrationInterface::getOperators()
+{
+ QVariant var = getProperty("Operators");
+ return qdbus_cast<QList <QDBusObjectPath> >(var);
+}
+
+void QOfonoNetworkRegistrationInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_REGISTRATION_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_REGISTRATION_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QOfonoNetworkRegistrationInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoNetworkRegistrationInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+
+
+QOfonoNetworkOperatorInterface::QOfonoNetworkOperatorInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_NETWORK_OPERATOR_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoNetworkOperatorInterface::~QOfonoNetworkOperatorInterface()
+{
+}
+
+QString QOfonoNetworkOperatorInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkOperatorInterface::getStatus()
+{
+ // "unknown", "available", "current" and "forbidden"
+ QVariant var = getProperty("Status");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkOperatorInterface::getMcc()
+{
+ QVariant var = getProperty("MobileCountryCode");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoNetworkOperatorInterface::getMnc()
+{
+ QVariant var = getProperty("MobileNetworkCode");
+ return qdbus_cast<QString>(var);
+}
+
+QStringList QOfonoNetworkOperatorInterface::getTechnologies()
+{
+ QVariant var = getProperty("Technologies");
+ return qdbus_cast<QStringList>(var);
+}
+
+void QOfonoNetworkOperatorInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_NETWORK_OPERATOR_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QOfonoNetworkOperatorInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoNetworkOperatorInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoNetworkOperatorInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QOfonoSimInterface::QOfonoSimInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_SIM_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoSimInterface::~QOfonoSimInterface()
+{
+}
+
+bool QOfonoSimInterface::isPresent()
+{
+ QVariant var = getProperty("Present");
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoSimInterface::getHomeMcc()
+{
+ QVariant var = getProperty("MobileCountryCode");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoSimInterface::getHomeMnc()
+{
+ QVariant var = getProperty("MobileNetworkCode");
+ return qdbus_cast<QString>(var);
+}
+
+// QStringList subscriberNumbers();
+// QMap<QString,QString> serviceNumbers();
+QString QOfonoSimInterface::pinRequired()
+{
+ QVariant var = getProperty("PinRequired");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoSimInterface::lockedPins()
+{
+ QVariant var = getProperty("LockedPins");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoSimInterface::cardIdentifier()
+{
+ QVariant var = getProperty("CardIdentifier");
+ return qdbus_cast<QString>(var);
+}
+
+void QOfonoSimInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SIM_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QOfonoSimInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoSimInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoSimInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QOfonoDataConnectionManagerInterface::QOfonoDataConnectionManagerInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_DATA_CONNECTION_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoDataConnectionManagerInterface::~QOfonoDataConnectionManagerInterface()
+{
+}
+
+QList<QDBusObjectPath> QOfonoDataConnectionManagerInterface::getPrimaryContexts()
+{
+ QVariant var = getProperty("PrimaryContexts");
+ return qdbus_cast<QList<QDBusObjectPath> >(var);
+}
+
+bool QOfonoDataConnectionManagerInterface::isAttached()
+{
+ QVariant var = getProperty("Attached");
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoDataConnectionManagerInterface::isRoamingAllowed()
+{
+ QVariant var = getProperty("RoamingAllowed");
+ return qdbus_cast<bool>(var);
+}
+
+bool QOfonoDataConnectionManagerInterface::isPowered()
+{
+ QVariant var = getProperty("Powered");
+ return qdbus_cast<bool>(var);
+}
+
+void QOfonoDataConnectionManagerInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONNECTION_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QOfonoDataConnectionManagerInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoDataConnectionManagerInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+QOfonoPrimaryDataContextInterface::QOfonoPrimaryDataContextInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_DATA_CONTEXT_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoPrimaryDataContextInterface::~QOfonoPrimaryDataContextInterface()
+{
+}
+
+bool QOfonoPrimaryDataContextInterface::isActive()
+{
+ QVariant var = getProperty("Active");
+ return qdbus_cast<bool>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getApName()
+{
+ QVariant var = getProperty("AccessPointName");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getType()
+{
+ QVariant var = getProperty("Type");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getName()
+{
+ QVariant var = getProperty("Name");
+ return qdbus_cast<QString>(var);
+}
+
+QVariantMap QOfonoPrimaryDataContextInterface::getSettings()
+{
+ QVariant var = getProperty("Settings");
+ return qdbus_cast<QVariantMap>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getInterface()
+{
+ QVariant var = getProperty("Interface");
+ return qdbus_cast<QString>(var);
+}
+
+QString QOfonoPrimaryDataContextInterface::getAddress()
+{
+ QVariant var = getProperty("Address");
+ return qdbus_cast<QString>(var);
+}
+
+bool QOfonoPrimaryDataContextInterface::setActive(bool on)
+{
+// this->setProperty("Active", QVariant(on));
+
+ return setProp("Active", qVariantFromValue(on));
+}
+
+bool QOfonoPrimaryDataContextInterface::setApn(const QString &name)
+{
+ return setProp("AccessPointName", QVariant::fromValue(name));
+}
+
+void QOfonoPrimaryDataContextInterface::connectNotify(const char *signal)
+{
+if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_DATA_CONTEXT_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)), Qt::UniqueConnection);
+ }
+}
+
+void QOfonoPrimaryDataContextInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoPrimaryDataContextInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoPrimaryDataContextInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+bool QOfonoPrimaryDataContextInterface::setProp(const QString &property, const QVariant &var)
+{
+ QList<QVariant> args;
+ args << qVariantFromValue(property) << qVariantFromValue(QDBusVariant(var));
+
+ QDBusMessage reply = this->callWithArgumentList(QDBus::AutoDetect,
+ QLatin1String("SetProperty"),
+ args);
+ bool ok = true;
+ if(reply.type() != QDBusMessage::ReplyMessage) {
+ qWarning() << reply.errorMessage();
+ ok = false;
+ }
+ qWarning() << reply.errorMessage();
+ return ok;
+}
+
+QOfonoSmsInterface::QOfonoSmsInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_SMS_MANAGER_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+}
+
+QOfonoSmsInterface::~QOfonoSmsInterface()
+{
+}
+
+void QOfonoSmsInterface::connectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QDBusVariant))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SIGNAL(propertyChanged(const QString &, const QDBusVariant & )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(propertyChangedContext(QString,QString,QDBusVariant))) {
+ QOfonoDBusHelper *helper;
+ helper = new QOfonoDBusHelper(this);
+
+ dbusConnection.connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ helper,SLOT(propertyChanged(QString,QDBusVariant)));
+
+
+ QObject::connect(helper,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)),
+ this,SIGNAL(propertyChangedContext(const QString &,const QString &,const QDBusVariant &)));
+ }
+
+ if (QLatin1String(signal) == SIGNAL(immediateMessage(QString,QVariantMap))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("ImmediateMessage"),
+ this,SIGNAL(immediateMessage(QString,QVariantMap )))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+
+ if (QLatin1String(signal) == SIGNAL(incomingMessage(QString,QVariantMap))) {
+ if(!connection().connect(QLatin1String(OFONO_SERVICE),
+ this->path(),
+ QLatin1String(OFONO_SMS_MANAGER_INTERFACE),
+ QLatin1String("IncomingMessage"),
+ this,SIGNAL(incomingMessage(QString,QVariantMap)))) {
+ qWarning() << "PropertyCHanged not connected";
+ }
+ }
+}
+
+void QOfonoSmsInterface::disconnectNotify(const char *signal)
+{
+ if (QLatin1String(signal) == SIGNAL(propertyChanged(QString,QVariant))) {
+
+ }
+}
+
+QVariant QOfonoSmsInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property)) {
+ var = map.value(property);
+ } else {
+ qDebug() << Q_FUNC_INFO << "does not contain" << property;
+ }
+ return var;
+}
+
+QVariantMap QOfonoSmsInterface::getProperties()
+{
+ QDBusReply<QVariantMap > reply = this->call(QLatin1String("GetProperties"));
+ return reply.value();
+}
+
+void QOfonoSmsInterface::sendMessage(const QString &to, const QString &message)
+{
+ QDBusReply<QString> reply = this->call(QLatin1String("SendMessage"),
+ QVariant::fromValue(to),
+ QVariant::fromValue(message));
+ bool ok = true;
+ if(reply.error().type() == QDBusError::InvalidArgs) {
+ qWarning() << reply.error().message();
+ ok = false;
+ }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/connman/qofonoservice_linux_p.h b/src/plugins/bearer/connman/qofonoservice_linux_p.h
new file mode 100644
index 0000000000..af54ba0613
--- /dev/null
+++ b/src/plugins/bearer/connman/qofonoservice_linux_p.h
@@ -0,0 +1,340 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOFONOSERVICE_H
+#define QOFONOSERVICE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusContext>
+#include <QMap>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+#define OFONO_SERVICE "org.ofono"
+#define OFONO_MANAGER_INTERFACE "org.ofono.Manager"
+#define OFONO_MANAGER_PATH "/"
+#define OFONO_MODEM_INTERFACE "org.ofono.Modem"
+#define OFONO_NETWORK_REGISTRATION_INTERFACE "org.ofono.NetworkRegistration"
+#define OFONO_NETWORK_OPERATOR_INTERFACE "org.ofono.NetworkOperator"
+#define OFONO_DATA_CONNECTION_MANAGER_INTERFACE "org.ofono.DataConnectionManager"
+#define OFONO_SIM_MANAGER_INTERFACE "org.ofono.SimManager"
+#define OFONO_DATA_CONTEXT_INTERFACE "org.ofono.PrimaryDataContext"
+
+#define OFONO_SMS_MANAGER_INTERFACE "org.ofono.SmsManager"
+#define OFONO_PHONEBOOK_INTERFACE "org.ofono.Phonebook"
+#define OFONO_MESSAGE_WAITING_INTERFACE "org.ofono.MessageWaiting"
+
+
+
+QT_BEGIN_NAMESPACE
+
+QT_END_NAMESPACE
+
+
+QT_BEGIN_NAMESPACE
+
+class QOfonoManagerInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoManagerInterface( QObject *parent = 0);
+ ~QOfonoManagerInterface();
+
+ QDBusObjectPath path() const;
+
+ QVariantMap getProperties();
+ bool setProperty(const QString &name, const QDBusVariant &value);
+ QList <QDBusObjectPath> getModems();
+ QDBusObjectPath currentModem();
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+
+};
+
+
+class QOfonoDBusHelper: public QObject, protected QDBusContext
+ {
+ Q_OBJECT
+ public:
+ QOfonoDBusHelper(QObject *parent = 0);
+ ~QOfonoDBusHelper();
+
+ public slots:
+ void propertyChanged(const QString &, const QDBusVariant &);
+ Q_SIGNALS:
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+};
+
+class QOfonoModemInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoModemInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoModemInterface();
+
+ QVariantMap getProperties();
+ //properties
+ bool isPowered();
+ bool isOnline();
+ QString getName();
+ QString getManufacturer();
+ QString getModel();
+ QString getRevision();
+ QString getSerial();
+
+ QStringList getFeatures(); //sms, sim
+ QStringList getInterfaces();
+ QString defaultInterface();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+};
+
+
+class QOfonoNetworkRegistrationInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoNetworkRegistrationInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoNetworkRegistrationInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ QString getStatus();
+ quint16 getLac();
+ quint32 getCellId();
+ QString getTechnology();
+ QString getOperatorName();
+ int getSignalStrength();
+ QString getBaseStation();
+ QList <QDBusObjectPath> getOperators();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+
+};
+
+class QOfonoNetworkOperatorInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+//modem or operator paths
+ QOfonoNetworkOperatorInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoNetworkOperatorInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ QString getName();
+ QString getStatus();// "unknown", "available", "current" and "forbidden"
+ QString getMcc();
+ QString getMnc();
+ QStringList getTechnologies();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+class QOfonoSimInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoSimInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoSimInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ bool isPresent();
+ QString getHomeMcc();
+ QString getHomeMnc();
+// QStringList subscriberNumbers();
+// QMap<QString,QString> serviceNumbers();
+ QString pinRequired();
+ QString lockedPins();
+ QString cardIdentifier();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+
+class QOfonoDataConnectionManagerInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoDataConnectionManagerInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoDataConnectionManagerInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ QList<QDBusObjectPath> getPrimaryContexts();
+ bool isAttached();
+ bool isRoamingAllowed();
+ bool isPowered();
+
+ bool setPower(bool on);
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+};
+
+
+class QOfonoPrimaryDataContextInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoPrimaryDataContextInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoPrimaryDataContextInterface();
+
+ QVariantMap getProperties();
+
+ //properties
+ bool isActive();
+ QString getApName();
+ QString getType();
+ QString getName();
+ QVariantMap getSettings();
+ QString getInterface();
+ QString getAddress();
+
+ bool setActive(bool on);
+ bool setApn(const QString &name);
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+ bool setProp(const QString &, const QVariant &var);
+};
+
+class QOfonoSmsInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ QOfonoSmsInterface(const QString &dbusModemPathName, QObject *parent = 0);
+ ~QOfonoSmsInterface();
+
+ QVariantMap getProperties();
+ void sendMessage(const QString &to, const QString &message);
+
+ //properties
+ QString serviceCenterAddress();
+ bool useDeliveryReports();
+ QString bearer();
+
+protected:
+ void connectNotify(const char *signal);
+ void disconnectNotify(const char *signal);
+ QVariant getProperty(const QString &);
+
+Q_SIGNALS:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+ void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+ void immediateMessage(const QString &message, const QVariantMap &info);
+ void incomingMessage(const QString &message, const QVariantMap &info);
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif //QOFONOSERVICE_H
diff --git a/src/plugins/bearer/corewlan/corewlan.pro b/src/plugins/bearer/corewlan/corewlan.pro
new file mode 100644
index 0000000000..90078e9290
--- /dev/null
+++ b/src/plugins/bearer/corewlan/corewlan.pro
@@ -0,0 +1,25 @@
+TARGET = qcorewlanbearer
+include(../../qpluginbase.pri)
+
+QT = core network
+LIBS += -framework Foundation -framework SystemConfiguration
+
+contains(QT_CONFIG, corewlan) {
+ isEmpty(QMAKE_MAC_SDK)|contains(QMAKE_MAC_SDK, "/Developer/SDKs/MacOSX10.6.sdk") {
+ LIBS += -framework CoreWLAN -framework Security
+ DEFINES += MAC_SDK_10_6
+ }
+}
+
+HEADERS += qcorewlanengine.h \
+ ../qnetworksession_impl.h \
+ ../qbearerengine_impl.h
+
+SOURCES += main.cpp \
+ ../qnetworksession_impl.cpp
+
+OBJECTIVE_SOURCES += qcorewlanengine.mm
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/corewlan/main.cpp b/src/plugins/bearer/corewlan/main.cpp
new file mode 100644
index 0000000000..7a5e7e30bd
--- /dev/null
+++ b/src/plugins/bearer/corewlan/main.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcorewlanengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QCoreWlanEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QCoreWlanEnginePlugin();
+ ~QCoreWlanEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QCoreWlanEnginePlugin::QCoreWlanEnginePlugin()
+{
+}
+
+QCoreWlanEnginePlugin::~QCoreWlanEnginePlugin()
+{
+}
+
+QStringList QCoreWlanEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("corewlan");
+}
+
+QBearerEngine *QCoreWlanEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("corewlan"))
+ return new QCoreWlanEngine;
+ else
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QCoreWlanEnginePlugin)
+Q_EXPORT_PLUGIN2(qcorewlanbearer, QCoreWlanEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.h b/src/plugins/bearer/corewlan/qcorewlanengine.h
new file mode 100644
index 0000000000..428c79e3f5
--- /dev/null
+++ b/src/plugins/bearer/corewlan/qcorewlanengine.h
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOREWLANENGINE_H
+#define QCOREWLANENGINE_H
+
+#include "../qbearerengine_impl.h"
+
+#include <QMap>
+#include <QTimer>
+#include <SystemConfiguration/SystemConfiguration.h>
+#include <QThread>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkConfigurationPrivate;
+class QScanThread;
+
+class QCoreWlanEngine : public QBearerEngineImpl
+{
+ friend class QScanThread;
+ Q_OBJECT
+
+public:
+ QCoreWlanEngine(QObject *parent = 0);
+ ~QCoreWlanEngine();
+
+ QString getInterfaceFromId(const QString &id);
+ bool hasIdentifier(const QString &id);
+
+ void connectToId(const QString &id);
+ void disconnectFromId(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkSession::State sessionStateForId(const QString &id);
+
+ quint64 bytesWritten(const QString &id);
+ quint64 bytesReceived(const QString &id);
+ quint64 startTime(const QString &id);
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+ bool requiresPolling() const;
+
+private Q_SLOTS:
+ void doRequestUpdate();
+ void networksChanged();
+
+private:
+ bool isWifiReady(const QString &dev);
+ QList<QNetworkConfigurationPrivate *> foundConfigurations;
+
+ SCDynamicStoreRef storeSession;
+ CFRunLoopSourceRef runloopSource;
+ bool hasWifi;
+ bool scanning;
+ QScanThread *scanThread;
+
+ quint64 getBytes(const QString &interfaceName,bool b);
+
+protected:
+ void startNetworkChangeLoop();
+
+};
+
+class QScanThread : public QThread
+{
+ Q_OBJECT
+
+public:
+ QScanThread(QObject *parent = 0);
+ ~QScanThread();
+
+ void quit();
+ QList<QNetworkConfigurationPrivate *> getConfigurations();
+ QString interfaceName;
+ QMap<QString, QString> configurationInterface;
+ void getUserConfigurations();
+ QString getNetworkNameFromSsid(const QString &ssid);
+ QString getSsidFromNetworkName(const QString &name);
+ bool isKnownSsid(const QString &ssid);
+ QMap<QString, QMap<QString,QString> > userProfiles;
+
+signals:
+ void networksChanged();
+
+protected:
+ void run();
+
+private:
+ QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
+ QMutex mutex;
+ QStringList foundNetwork(const QString &id, const QString &ssid, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose);
+
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm
new file mode 100644
index 0000000000..07e74fec1f
--- /dev/null
+++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm
@@ -0,0 +1,946 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcorewlanengine.h"
+#include "../qnetworksession_impl.h"
+
+#include <QtNetwork/private/qnetworkconfiguration_p.h>
+
+#include <QtCore/qthread.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qstringlist.h>
+
+#include <QtCore/qdebug.h>
+
+#include <QDir>
+#include <CoreWLAN/CoreWLAN.h>
+#include <CoreWLAN/CWInterface.h>
+#include <CoreWLAN/CWNetwork.h>
+#include <CoreWLAN/CWNetwork.h>
+#include <CoreWLAN/CW8021XProfile.h>
+
+#include <Foundation/NSEnumerator.h>
+#include <Foundation/NSKeyValueObserving.h>
+#include <Foundation/NSAutoreleasePool.h>
+#include <Foundation/NSLock.h>
+
+#include <SystemConfiguration/SCNetworkConfiguration.h>
+#include "private/qcore_mac_p.h"
+
+#include <net/if.h>
+#include <ifaddrs.h>
+
+inline QString qt_NSStringToQString(const NSString *nsstr)
+{ return QCFString::toQString(reinterpret_cast<const CFStringRef>(nsstr)); }
+
+inline NSString *qt_QStringToNSString(const QString &qstr)
+{ return [reinterpret_cast<const NSString *>(QCFString::toCFStringRef(qstr)) autorelease]; }
+
+
+@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
+{
+ NSNotificationCenter *notificationCenter;
+ CWInterface *currentInterface;
+ QCoreWlanEngine *engine;
+ NSLock *locker;
+}
+- (void)notificationHandler;//:(NSNotification *)notification;
+- (void)remove;
+- (void)setEngine:(QCoreWlanEngine *)coreEngine;
+- (void)dealloc;
+
+@property (assign) QCoreWlanEngine* engine;
+
+@end
+
+@implementation QT_MANGLE_NAMESPACE(QNSListener)
+@synthesize engine;
+
+- (id) init
+{
+ [locker lock];
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ notificationCenter = [NSNotificationCenter defaultCenter];
+ currentInterface = [CWInterface interfaceWithName:nil];
+ [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil];
+ [locker unlock];
+ [autoreleasepool release];
+ return self;
+}
+
+-(void)dealloc
+{
+ [super dealloc];
+}
+
+-(void)setEngine:(QCoreWlanEngine *)coreEngine
+{
+ [locker lock];
+ if(!engine)
+ engine = coreEngine;
+ [locker unlock];
+}
+
+-(void)remove
+{
+ [locker lock];
+ [notificationCenter removeObserver:self];
+ [locker unlock];
+}
+
+- (void)notificationHandler//:(NSNotification *)notification
+{
+ engine->requestUpdate();
+}
+@end
+
+QT_MANGLE_NAMESPACE(QNSListener) *listener = 0;
+
+QT_BEGIN_NAMESPACE
+
+void networkChangeCallback(SCDynamicStoreRef/* store*/, CFArrayRef changedKeys, void *info)
+{
+ for ( long i = 0; i < CFArrayGetCount(changedKeys); i++) {
+
+ QString changed = QCFString::toQString((CFStringRef)CFArrayGetValueAtIndex(changedKeys, i));
+ if( changed.contains("/Network/Global/IPv4")) {
+ QCoreWlanEngine* wlanEngine = static_cast<QCoreWlanEngine*>(info);
+ wlanEngine->requestUpdate();
+ }
+ }
+ return;
+}
+
+
+QScanThread::QScanThread(QObject *parent)
+ :QThread(parent)
+{
+}
+
+QScanThread::~QScanThread()
+{
+}
+
+void QScanThread::quit()
+{
+ wait();
+}
+
+void QScanThread::run()
+{
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ QStringList found;
+ mutex.lock();
+ CWInterface *currentInterface = [CWInterface interfaceWithName:qt_QStringToNSString(interfaceName)];
+ mutex.unlock();
+
+ if([currentInterface power]) {
+ NSError *err = nil;
+ NSDictionary *parametersDict = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], kCWScanKeyMerge,
+ [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
+ [NSNumber numberWithInteger:100], kCWScanKeyRestTime, nil];
+
+ NSArray* apArray = [currentInterface scanForNetworksWithParameters:parametersDict error:&err];
+ CWNetwork *apNetwork;
+
+ if (!err) {
+
+ for(uint row=0; row < [apArray count]; row++ ) {
+ apNetwork = [apArray objectAtIndex:row];
+
+ const QString networkSsid = qt_NSStringToQString([apNetwork ssid]);
+ const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
+ found.append(id);
+
+ QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
+ bool known = isKnownSsid(networkSsid);
+ if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
+ if( networkSsid == qt_NSStringToQString( [currentInterface ssid])) {
+ state = QNetworkConfiguration::Active;
+ }
+ }
+ if(state == QNetworkConfiguration::Undefined) {
+ if(known) {
+ state = QNetworkConfiguration::Discovered;
+ } else {
+ state = QNetworkConfiguration::Undefined;
+ }
+ }
+ QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose;
+ if([[apNetwork securityMode] intValue] == kCWSecurityModeOpen) {
+ purpose = QNetworkConfiguration::PublicPurpose;
+ } else {
+ purpose = QNetworkConfiguration::PrivatePurpose;
+ }
+
+ found.append(foundNetwork(id, networkSsid, state, interfaceName, purpose));
+
+ }
+ }
+ }
+ // add known configurations that are not around.
+ QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
+ while (i.hasNext()) {
+ i.next();
+
+ QString networkName = i.key();
+ const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkName));
+
+ if(!found.contains(id)) {
+ QString networkSsid = getSsidFromNetworkName(networkName);
+ const QString ssidId = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
+ QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
+ QString interfaceName;
+ QMapIterator<QString, QString> ij(i.value());
+ while (ij.hasNext()) {
+ ij.next();
+ interfaceName = ij.value();
+ }
+
+ if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
+ if( networkSsid == qt_NSStringToQString([currentInterface ssid])) {
+ state = QNetworkConfiguration::Active;
+ }
+ }
+ if(state == QNetworkConfiguration::Undefined) {
+ if( userProfiles.contains(networkName)
+ && found.contains(ssidId)) {
+ state = QNetworkConfiguration::Discovered;
+ }
+ }
+
+ if(state == QNetworkConfiguration::Undefined) {
+ state = QNetworkConfiguration::Defined;
+ }
+
+ found.append(foundNetwork(id, networkName, state, interfaceName, QNetworkConfiguration::UnknownPurpose));
+ }
+ }
+ emit networksChanged();
+ [autoreleasepool release];
+}
+
+QStringList QScanThread::foundNetwork(const QString &id, const QString &name, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose)
+{
+ QStringList found;
+ QMutexLocker locker(&mutex);
+ QNetworkConfigurationPrivate *ptr = new QNetworkConfigurationPrivate;
+
+ ptr->name = name;
+ ptr->isValid = true;
+ ptr->id = id;
+ ptr->state = state;
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ ptr->bearerType = QNetworkConfiguration::BearerWLAN;
+ ptr->purpose = purpose;
+
+ fetchedConfigurations.append( ptr);
+ configurationInterface.insert(ptr->id, interfaceName);
+
+ locker.unlock();
+ locker.relock();
+ found.append(id);
+ return found;
+}
+
+QList<QNetworkConfigurationPrivate *> QScanThread::getConfigurations()
+{
+ QMutexLocker locker(&mutex);
+
+ QList<QNetworkConfigurationPrivate *> foundConfigurations = fetchedConfigurations;
+ fetchedConfigurations.clear();
+
+ return foundConfigurations;
+}
+
+void QScanThread::getUserConfigurations()
+{
+ QMutexLocker locker(&mutex);
+
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ userProfiles.clear();
+
+ NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
+ for(uint row=0; row < [wifiInterfaces count]; row++ ) {
+
+ CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]];
+ if ( ![wifiInterface power] )
+ continue;
+
+ NSString *nsInterfaceName = [wifiInterface name];
+// add user configured system networks
+ SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil);
+ NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]);
+ CFRelease(dynRef);
+ if(airportPlist != nil) {
+ NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
+
+ NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
+ for(NSString *ssidkey in thisSsidarray) {
+ QString thisSsid = qt_NSStringToQString(ssidkey);
+ if(!userProfiles.contains(thisSsid)) {
+ QMap <QString,QString> map;
+ map.insert(thisSsid, qt_NSStringToQString(nsInterfaceName));
+ userProfiles.insert(thisSsid, map);
+ }
+ }
+ CFRelease(airportPlist);
+ }
+
+ // 802.1X user profiles
+ QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
+ NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile:qt_QStringToNSString(userProfilePath)] autorelease];
+ if(eapDict != nil) {
+ NSString *profileStr= @"Profiles";
+ NSString *nameStr = @"UserDefinedName";
+ NSString *networkSsidStr = @"Wireless Network";
+ for (id profileKey in eapDict) {
+ if ([profileStr isEqualToString:profileKey]) {
+ NSDictionary *itemDict = [eapDict objectForKey:profileKey];
+ for (id itemKey in itemDict) {
+
+ NSInteger dictSize = [itemKey count];
+ id objects[dictSize];
+ id keys[dictSize];
+
+ [itemKey getObjects:objects andKeys:keys];
+ QString networkName;
+ QString ssid;
+ for(int i = 0; i < dictSize; i++) {
+ if([nameStr isEqualToString:keys[i]]) {
+ networkName = qt_NSStringToQString(objects[i]);
+ }
+ if([networkSsidStr isEqualToString:keys[i]]) {
+ ssid = qt_NSStringToQString(objects[i]);
+ }
+ if(!userProfiles.contains(networkName)
+ && !ssid.isEmpty()) {
+ QMap<QString,QString> map;
+ map.insert(ssid, qt_NSStringToQString(nsInterfaceName));
+ userProfiles.insert(networkName, map);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ [autoreleasepool release];
+}
+
+QString QScanThread::getSsidFromNetworkName(const QString &name)
+{
+ QMutexLocker locker(&mutex);
+
+ QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
+ while (i.hasNext()) {
+ i.next();
+ QMap<QString,QString> map = i.value();
+ QMapIterator<QString, QString> ij(i.value());
+ while (ij.hasNext()) {
+ ij.next();
+ const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") +i.key()));
+ if(name == i.key() || name == networkNameHash) {
+ return ij.key();
+ }
+ }
+ }
+ return QString();
+}
+
+QString QScanThread::getNetworkNameFromSsid(const QString &ssid)
+{
+ QMutexLocker locker(&mutex);
+
+ QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
+ while (i.hasNext()) {
+ i.next();
+ QMap<QString,QString> map = i.value();
+ QMapIterator<QString, QString> ij(i.value());
+ while (ij.hasNext()) {
+ ij.next();
+ if(ij.key() == ssid) {
+ return i.key();
+ }
+ }
+ }
+ return QString();
+}
+
+bool QScanThread::isKnownSsid(const QString &ssid)
+{
+ QMutexLocker locker(&mutex);
+
+ QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
+ while (i.hasNext()) {
+ i.next();
+ QMap<QString,QString> map = i.value();
+ if(map.keys().contains(ssid)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+QCoreWlanEngine::QCoreWlanEngine(QObject *parent)
+: QBearerEngineImpl(parent), scanThread(0)
+{
+ scanThread = new QScanThread(this);
+ connect(scanThread, SIGNAL(networksChanged()),
+ this, SLOT(networksChanged()));
+}
+
+QCoreWlanEngine::~QCoreWlanEngine()
+{
+ while (!foundConfigurations.isEmpty())
+ delete foundConfigurations.takeFirst();
+ [listener remove];
+ [listener release];
+}
+
+void QCoreWlanEngine::initialize()
+{
+ QMutexLocker locker(&mutex);
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+
+ if([[CWInterface supportedInterfaces] count] > 0 && !listener) {
+ listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init];
+ listener.engine = this;
+ hasWifi = true;
+ } else {
+ hasWifi = false;
+ }
+ storeSession = NULL;
+
+ startNetworkChangeLoop();
+ [autoreleasepool release];
+}
+
+
+QString QCoreWlanEngine::getInterfaceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return scanThread->configurationInterface.value(id);
+}
+
+bool QCoreWlanEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return scanThread->configurationInterface.contains(id);
+}
+
+void QCoreWlanEngine::connectToId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ QString interfaceString = getInterfaceFromId(id);
+
+ CWInterface *wifiInterface =
+ [CWInterface interfaceWithName: qt_QStringToNSString(interfaceString)];
+
+ if ([wifiInterface power]) {
+ NSError *err = nil;
+ NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];
+
+ QString wantedSsid;
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name));
+ const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name)));
+
+ bool using8021X = false;
+ if (idHash2 != id) {
+ NSArray *array = [CW8021XProfile allUser8021XProfiles];
+
+ for (NSUInteger i = 0; i < [array count]; ++i) {
+ const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString([[array objectAtIndex:i] userDefinedName])));
+
+ const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString([[array objectAtIndex:i] ssid])));
+
+ if (id == networkNameHashCheck || id == ssidHash) {
+ const QString thisName = scanThread->getSsidFromNetworkName(id);
+ if (thisName.isEmpty())
+ wantedSsid = id;
+ else
+ wantedSsid = thisName;
+
+ [params setValue: [array objectAtIndex:i] forKey:kCWAssocKey8021XProfile];
+ using8021X = true;
+ break;
+ }
+ }
+ }
+
+ if (!using8021X) {
+ QString wantedNetwork;
+ QMapIterator<QString, QMap<QString,QString> > i(scanThread->userProfiles);
+ while (i.hasNext()) {
+ i.next();
+ wantedNetwork = i.key();
+ const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork));
+ if (id == networkNameHash) {
+ wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork);
+ break;
+ }
+ }
+ }
+ NSDictionary *scanParameters = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], kCWScanKeyMerge,
+ [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
+ [NSNumber numberWithInteger:100], kCWScanKeyRestTime,
+ qt_QStringToNSString(wantedSsid), kCWScanKeySSID,
+ nil];
+
+ NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err];
+
+ if(!err) {
+ for(uint row=0; row < [scanArray count]; row++ ) {
+ CWNetwork *apNetwork = [scanArray objectAtIndex:row];
+
+ if(wantedSsid == qt_NSStringToQString([apNetwork ssid])) {
+
+ if(!using8021X) {
+ SecKeychainAttribute attributes[3];
+
+ NSString *account = [apNetwork ssid];
+ NSString *keyKind = @"AirPort network password";
+ NSString *keyName = account;
+
+ attributes[0].tag = kSecAccountItemAttr;
+ attributes[0].data = (void *)[account UTF8String];
+ attributes[0].length = [account length];
+
+ attributes[1].tag = kSecDescriptionItemAttr;
+ attributes[1].data = (void *)[keyKind UTF8String];
+ attributes[1].length = [keyKind length];
+
+ attributes[2].tag = kSecLabelItemAttr;
+ attributes[2].data = (void *)[keyName UTF8String];
+ attributes[2].length = [keyName length];
+
+ SecKeychainAttributeList attributeList = {3,attributes};
+
+ SecKeychainSearchRef searchRef;
+ SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attributeList, &searchRef);
+
+ NSString *password = @"";
+ SecKeychainItemRef searchItem;
+
+ if (SecKeychainSearchCopyNext(searchRef, &searchItem) == noErr) {
+ UInt32 realPasswordLength;
+ SecKeychainAttribute attributesW[8];
+ attributesW[0].tag = kSecAccountItemAttr;
+ SecKeychainAttributeList listW = {1,attributesW};
+ char *realPassword;
+ OSStatus status = SecKeychainItemCopyContent(searchItem, NULL, &listW, &realPasswordLength,(void **)&realPassword);
+
+ if (status == noErr) {
+ if (realPassword != NULL) {
+
+ QByteArray pBuf;
+ pBuf.resize(realPasswordLength);
+ pBuf.prepend(realPassword);
+ pBuf.insert(realPasswordLength,'\0');
+
+ password = [NSString stringWithUTF8String:pBuf];
+ }
+ SecKeychainItemFreeContent(&listW, realPassword);
+ }
+
+ CFRelease(searchItem);
+ } else {
+ qDebug() << "SecKeychainSearchCopyNext error";
+ }
+ [params setValue: password forKey: kCWAssocKeyPassphrase];
+ } // end using8021X
+
+
+ bool result = [wifiInterface associateToNetwork: apNetwork parameters:[NSDictionary dictionaryWithDictionary:params] error:&err];
+
+ if(!err) {
+ if(!result) {
+ emit connectionError(id, ConnectError);
+ } else {
+ return;
+ }
+ } else {
+ qDebug() <<"associate ERROR"<< qt_NSStringToQString([err localizedDescription ]);
+ }
+ }
+ } //end scan network
+ } else {
+ qDebug() <<"scan ERROR"<< qt_NSStringToQString([err localizedDescription ]);
+ }
+ emit connectionError(id, InterfaceLookupError);
+ }
+
+ locker.unlock();
+ emit connectionError(id, InterfaceLookupError);
+ [autoreleasepool release];
+}
+
+void QCoreWlanEngine::disconnectFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QString interfaceString = getInterfaceFromId(id);
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+
+ CWInterface *wifiInterface =
+ [CWInterface interfaceWithName: qt_QStringToNSString(interfaceString)];
+
+ [wifiInterface disassociate];
+ if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) {
+ locker.unlock();
+ emit connectionError(id, DisconnectionError);
+ locker.relock();
+ }
+ [autoreleasepool release];
+}
+
+void QCoreWlanEngine::requestUpdate()
+{
+ scanThread->getUserConfigurations();
+ doRequestUpdate();
+}
+
+void QCoreWlanEngine::doRequestUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+
+ NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
+ for (uint row = 0; row < [wifiInterfaces count]; ++row) {
+ scanThread->interfaceName = qt_NSStringToQString([wifiInterfaces objectAtIndex:row]);
+ scanThread->start();
+ }
+ locker.unlock();
+ [autoreleasepool release];
+}
+
+bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName)
+{
+ QMutexLocker locker(&mutex);
+ bool haswifi = false;
+ if(hasWifi) {
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ CWInterface *defaultInterface = [CWInterface interfaceWithName: qt_QStringToNSString(wifiDeviceName)];
+ if([defaultInterface power]) {
+ haswifi = true;
+ }
+ [autoreleasepool release];
+ }
+ return haswifi;
+}
+
+
+QNetworkSession::State QCoreWlanEngine::sessionStateForId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ if (!ptr)
+ return QNetworkSession::Invalid;
+
+ if (!ptr->isValid) {
+ return QNetworkSession::Invalid;
+ } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ return QNetworkSession::Connected;
+ } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
+ QNetworkConfiguration::Discovered) {
+ return QNetworkSession::Disconnected;
+ } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
+ return QNetworkSession::NotAvailable;
+ } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
+ QNetworkConfiguration::Undefined) {
+ return QNetworkSession::NotAvailable;
+ }
+
+ return QNetworkSession::Invalid;
+}
+
+QNetworkConfigurationManager::Capabilities QCoreWlanEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::ForcedRoaming;
+}
+
+void QCoreWlanEngine::startNetworkChangeLoop()
+{
+
+ SCDynamicStoreContext dynStoreContext = { 0, this/*(void *)storeSession*/, NULL, NULL, NULL };
+ storeSession = SCDynamicStoreCreate(NULL,
+ CFSTR("networkChangeCallback"),
+ networkChangeCallback,
+ &dynStoreContext);
+ if (!storeSession ) {
+ qWarning() << "could not open dynamic store: error:" << SCErrorString(SCError());
+ return;
+ }
+
+ CFMutableArrayRef notificationKeys;
+ notificationKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+ CFMutableArrayRef patternsArray;
+ patternsArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+
+ CFStringRef storeKey;
+ storeKey = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
+ kSCDynamicStoreDomainState,
+ kSCEntNetIPv4);
+ CFArrayAppendValue(notificationKeys, storeKey);
+ CFRelease(storeKey);
+
+ storeKey = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
+ kSCDynamicStoreDomainState,
+ kSCCompAnyRegex,
+ kSCEntNetIPv4);
+ CFArrayAppendValue(patternsArray, storeKey);
+ CFRelease(storeKey);
+
+ if (!SCDynamicStoreSetNotificationKeys(storeSession , notificationKeys, patternsArray)) {
+ qWarning() << "register notification error:"<< SCErrorString(SCError());
+ CFRelease(storeSession );
+ CFRelease(notificationKeys);
+ CFRelease(patternsArray);
+ return;
+ }
+ CFRelease(notificationKeys);
+ CFRelease(patternsArray);
+
+ runloopSource = SCDynamicStoreCreateRunLoopSource(NULL, storeSession , 0);
+ if (!runloopSource) {
+ qWarning() << "runloop source error:"<< SCErrorString(SCError());
+ CFRelease(storeSession );
+ return;
+ }
+
+ CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode);
+ return;
+}
+
+QNetworkSessionPrivate *QCoreWlanEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl;
+}
+
+QNetworkConfigurationPrivatePointer QCoreWlanEngine::defaultConfiguration()
+{
+ return QNetworkConfigurationPrivatePointer();
+}
+
+bool QCoreWlanEngine::requiresPolling() const
+{
+ return true;
+}
+
+void QCoreWlanEngine::networksChanged()
+{
+ QMutexLocker locker(&mutex);
+
+ QStringList previous = accessPointConfigurations.keys();
+
+ QList<QNetworkConfigurationPrivate *> foundConfigurations = scanThread->getConfigurations();
+ while (!foundConfigurations.isEmpty()) {
+ QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst();
+
+ previous.removeAll(cpPriv->id);
+
+ if (accessPointConfigurations.contains(cpPriv->id)) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
+
+ bool changed = false;
+
+ ptr->mutex.lock();
+
+ if (ptr->isValid != cpPriv->isValid) {
+ ptr->isValid = cpPriv->isValid;
+ changed = true;
+ }
+
+ if (ptr->name != cpPriv->name) {
+ ptr->name = cpPriv->name;
+ changed = true;
+ }
+
+ if (ptr->bearerType != cpPriv->bearerType) {
+ ptr->bearerType = cpPriv->bearerType;
+ changed = true;
+ }
+
+ if (ptr->state != cpPriv->state) {
+ ptr->state = cpPriv->state;
+ changed = true;
+ }
+
+ ptr->mutex.unlock();
+
+ if (changed) {
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+
+ delete cpPriv;
+ } else {
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+ locker.relock();
+ }
+ }
+
+ while (!previous.isEmpty()) {
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.take(previous.takeFirst());
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+
+ locker.unlock();
+ emit updateCompleted();
+
+}
+
+quint64 QCoreWlanEngine::bytesWritten(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ const QString interfaceStr = getInterfaceFromId(id);
+ return getBytes(interfaceStr,false);
+}
+
+quint64 QCoreWlanEngine::bytesReceived(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+ const QString interfaceStr = getInterfaceFromId(id);
+ return getBytes(interfaceStr,true);
+}
+
+quint64 QCoreWlanEngine::startTime(const QString &identifier)
+{
+ QMutexLocker locker(&mutex);
+ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+ quint64 timestamp = 0;
+
+ NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist";
+ NSDictionary* plistDict = [[[NSDictionary alloc] initWithContentsOfFile:filePath] autorelease];
+ if(plistDict == nil)
+ return timestamp;
+ NSString *input = @"KnownNetworks";
+ NSString *timeStampStr = @"_timeStamp";
+
+ NSString *ssidStr = @"SSID_STR";
+
+ for (id key in plistDict) {
+ if ([input isEqualToString:key]) {
+
+ NSDictionary *knownNetworksDict = [plistDict objectForKey:key];
+ if(knownNetworksDict == nil)
+ return timestamp;
+ for (id networkKey in knownNetworksDict) {
+ bool isFound = false;
+ NSDictionary *itemDict = [knownNetworksDict objectForKey:networkKey];
+ if(itemDict == nil)
+ return timestamp;
+ NSInteger dictSize = [itemDict count];
+ id objects[dictSize];
+ id keys[dictSize];
+
+ [itemDict getObjects:objects andKeys:keys];
+ bool ok = false;
+ for(int i = 0; i < dictSize; i++) {
+ if([ssidStr isEqualToString:keys[i]]) {
+ const QString ident = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString(objects[i])));
+ if(ident == identifier) {
+ ok = true;
+ }
+ }
+ if(ok && [timeStampStr isEqualToString:keys[i]]) {
+ timestamp = (quint64)[objects[i] timeIntervalSince1970];
+ isFound = true;
+ break;
+ }
+ }
+ if(isFound)
+ break;
+ }
+ }
+ }
+ [autoreleasepool release];
+ return timestamp;
+}
+
+quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b)
+{
+ struct ifaddrs *ifAddressList, *ifAddress;
+ struct if_data *if_data;
+
+ quint64 bytes = 0;
+ ifAddressList = nil;
+ if(getifaddrs(&ifAddressList) == 0) {
+ for(ifAddress = ifAddressList; ifAddress; ifAddress = ifAddress->ifa_next) {
+ if(interfaceName == ifAddress->ifa_name) {
+ if_data = (struct if_data*)ifAddress->ifa_data;
+ if(b) {
+ bytes = if_data->ifi_ibytes;
+ break;
+ } else {
+ bytes = if_data->ifi_obytes;
+ break;
+ }
+ }
+ }
+ freeifaddrs(ifAddressList);
+ }
+ return bytes;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/bearer/generic/generic.pro b/src/plugins/bearer/generic/generic.pro
new file mode 100644
index 0000000000..c967f8c6dc
--- /dev/null
+++ b/src/plugins/bearer/generic/generic.pro
@@ -0,0 +1,16 @@
+TARGET = qgenericbearer
+include(../../qpluginbase.pri)
+
+QT = core network
+
+HEADERS += qgenericengine.h \
+ ../qnetworksession_impl.h \
+ ../qbearerengine_impl.h \
+ ../platformdefs_win.h
+SOURCES += qgenericengine.cpp \
+ ../qnetworksession_impl.cpp \
+ main.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/generic/main.cpp b/src/plugins/bearer/generic/main.cpp
new file mode 100644
index 0000000000..2b9eedc066
--- /dev/null
+++ b/src/plugins/bearer/generic/main.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgenericengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QGenericEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QGenericEnginePlugin();
+ ~QGenericEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QGenericEnginePlugin::QGenericEnginePlugin()
+{
+}
+
+QGenericEnginePlugin::~QGenericEnginePlugin()
+{
+}
+
+QStringList QGenericEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("generic");
+}
+
+QBearerEngine *QGenericEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("generic"))
+ return new QGenericEngine;
+ else
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QGenericEnginePlugin)
+Q_EXPORT_PLUGIN2(qgenericbearer, QGenericEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/generic/qgenericengine.cpp b/src/plugins/bearer/generic/qgenericengine.cpp
new file mode 100644
index 0000000000..2e183cf395
--- /dev/null
+++ b/src/plugins/bearer/generic/qgenericengine.cpp
@@ -0,0 +1,359 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgenericengine.h"
+#include "../qnetworksession_impl.h"
+
+#include <QtNetwork/private/qnetworkconfiguration_p.h>
+
+#include <QtCore/qthread.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qstringlist.h>
+
+#include <QtCore/qdebug.h>
+#include <QtCore/private/qcoreapplication_p.h>
+
+#ifdef Q_OS_WIN
+#include "../platformdefs_win.h"
+#endif
+
+#ifdef Q_OS_LINUX
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <unistd.h>
+#endif
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_NETWORKINTERFACE
+static QNetworkConfiguration::BearerType qGetInterfaceType(const QString &interface)
+{
+#ifdef Q_OS_WIN32
+ unsigned long oid;
+ DWORD bytesWritten;
+
+ NDIS_MEDIUM medium;
+ NDIS_PHYSICAL_MEDIUM physicalMedium;
+
+ HANDLE handle = CreateFile((TCHAR *)QString::fromLatin1("\\\\.\\%1").arg(interface).utf16(), 0,
+ FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ if (handle == INVALID_HANDLE_VALUE)
+ return QNetworkConfiguration::BearerUnknown;
+
+ oid = OID_GEN_MEDIA_SUPPORTED;
+ bytesWritten = 0;
+ bool result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
+ &medium, sizeof(medium), &bytesWritten, 0);
+ if (!result) {
+ CloseHandle(handle);
+ return QNetworkConfiguration::BearerUnknown;
+ }
+
+ oid = OID_GEN_PHYSICAL_MEDIUM;
+ bytesWritten = 0;
+ result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
+ &physicalMedium, sizeof(physicalMedium), &bytesWritten, 0);
+ if (!result) {
+ CloseHandle(handle);
+
+ if (medium == NdisMedium802_3)
+ return QNetworkConfiguration::BearerEthernet;
+ else
+ return QNetworkConfiguration::BearerUnknown;
+ }
+
+ CloseHandle(handle);
+
+ if (medium == NdisMedium802_3) {
+ switch (physicalMedium) {
+ case NdisPhysicalMediumWirelessLan:
+ return QNetworkConfiguration::BearerWLAN;
+ case NdisPhysicalMediumBluetooth:
+ return QNetworkConfiguration::BearerBluetooth;
+ case NdisPhysicalMediumWiMax:
+ return QNetworkConfiguration::BearerWiMAX;
+ default:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "Physical Medium" << physicalMedium;
+#endif
+ return QNetworkConfiguration::BearerEthernet;
+ }
+ }
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << medium << physicalMedium;
+#endif
+#elif defined(Q_OS_LINUX)
+ int sock = socket(AF_INET, SOCK_DGRAM, 0);
+
+ ifreq request;
+ strncpy(request.ifr_name, interface.toLocal8Bit().data(), sizeof(request.ifr_name));
+ int result = ioctl(sock, SIOCGIFHWADDR, &request);
+ close(sock);
+
+ if (result >= 0 && request.ifr_hwaddr.sa_family == ARPHRD_ETHER)
+ return QNetworkConfiguration::BearerEthernet;
+#else
+ Q_UNUSED(interface);
+#endif
+
+ return QNetworkConfiguration::BearerUnknown;
+}
+#endif
+
+QGenericEngine::QGenericEngine(QObject *parent)
+: QBearerEngineImpl(parent)
+{
+}
+
+QGenericEngine::~QGenericEngine()
+{
+}
+
+QString QGenericEngine::getInterfaceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return configurationInterface.value(id);
+}
+
+bool QGenericEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return configurationInterface.contains(id);
+}
+
+void QGenericEngine::connectToId(const QString &id)
+{
+ emit connectionError(id, OperationNotSupported);
+}
+
+void QGenericEngine::disconnectFromId(const QString &id)
+{
+ emit connectionError(id, OperationNotSupported);
+}
+
+void QGenericEngine::initialize()
+{
+ doRequestUpdate();
+}
+
+void QGenericEngine::requestUpdate()
+{
+ doRequestUpdate();
+}
+
+void QGenericEngine::doRequestUpdate()
+{
+#ifndef QT_NO_NETWORKINTERFACE
+ QMutexLocker locker(&mutex);
+
+ // Immediately after connecting with a wireless access point
+ // QNetworkInterface::allInterfaces() will sometimes return an empty list. Calling it again a
+ // second time results in a non-empty list. If we loose interfaces we will end up removing
+ // network configurations which will break current sessions.
+ QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
+ if (interfaces.isEmpty())
+ interfaces = QNetworkInterface::allInterfaces();
+
+ QStringList previous = accessPointConfigurations.keys();
+
+ // create configuration for each interface
+ while (!interfaces.isEmpty()) {
+ QNetworkInterface interface = interfaces.takeFirst();
+
+ if (!interface.isValid())
+ continue;
+
+ // ignore loopback interface
+ if (interface.flags() & QNetworkInterface::IsLoopBack)
+ continue;
+
+ // ignore WLAN interface handled in separate engine
+ if (qGetInterfaceType(interface.name()) == QNetworkConfiguration::BearerWLAN)
+ continue;
+
+ uint identifier;
+ if (interface.index())
+ identifier = qHash(QLatin1String("generic:") + QString::number(interface.index()));
+ else
+ identifier = qHash(QLatin1String("generic:") + interface.hardwareAddress());
+
+ const QString id = QString::number(identifier);
+
+ previous.removeAll(id);
+
+ QString name = interface.humanReadableName();
+ if (name.isEmpty())
+ name = interface.name();
+
+ QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Defined;
+ if((interface.flags() & QNetworkInterface::IsUp) && !interface.addressEntries().isEmpty())
+ state |= QNetworkConfiguration::Active;
+
+ if (accessPointConfigurations.contains(id)) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ bool changed = false;
+
+ ptr->mutex.lock();
+
+ if (!ptr->isValid) {
+ ptr->isValid = true;
+ changed = true;
+ }
+
+ if (ptr->name != name) {
+ ptr->name = name;
+ changed = true;
+ }
+
+ if (ptr->id != id) {
+ ptr->id = id;
+ changed = true;
+ }
+
+ if (ptr->state != state) {
+ ptr->state = state;
+ changed = true;
+ }
+
+ ptr->mutex.unlock();
+
+ if (changed) {
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+ } else {
+ QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
+
+ ptr->name = name;
+ ptr->isValid = true;
+ ptr->id = id;
+ ptr->state = state;
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ ptr->bearerType = qGetInterfaceType(interface.name());
+
+ accessPointConfigurations.insert(id, ptr);
+ configurationInterface.insert(id, interface.name());
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+ locker.relock();
+ }
+ }
+
+ while (!previous.isEmpty()) {
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.take(previous.takeFirst());
+
+ configurationInterface.remove(ptr->id);
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+
+ locker.unlock();
+#endif
+
+ emit updateCompleted();
+}
+
+QNetworkSession::State QGenericEngine::sessionStateForId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ if (!ptr)
+ return QNetworkSession::Invalid;
+
+ QMutexLocker configLocker(&ptr->mutex);
+
+ if (!ptr->isValid) {
+ return QNetworkSession::Invalid;
+ } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ return QNetworkSession::Connected;
+ } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
+ QNetworkConfiguration::Discovered) {
+ return QNetworkSession::Disconnected;
+ } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
+ return QNetworkSession::NotAvailable;
+ } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
+ QNetworkConfiguration::Undefined) {
+ return QNetworkSession::NotAvailable;
+ }
+
+ return QNetworkSession::Invalid;
+}
+
+QNetworkConfigurationManager::Capabilities QGenericEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::ForcedRoaming;
+}
+
+QNetworkSessionPrivate *QGenericEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl;
+}
+
+QNetworkConfigurationPrivatePointer QGenericEngine::defaultConfiguration()
+{
+ return QNetworkConfigurationPrivatePointer();
+}
+
+
+bool QGenericEngine::requiresPolling() const
+{
+ return true;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/generic/qgenericengine.h b/src/plugins/bearer/generic/qgenericengine.h
new file mode 100644
index 0000000000..30f69b538f
--- /dev/null
+++ b/src/plugins/bearer/generic/qgenericengine.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGENERICENGINE_H
+#define QGENERICENGINE_H
+
+#include "../qbearerengine_impl.h"
+
+#include <QMap>
+#include <QTimer>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkConfigurationPrivate;
+class QNetworkSessionPrivate;
+
+class QGenericEngine : public QBearerEngineImpl
+{
+ Q_OBJECT
+
+public:
+ QGenericEngine(QObject *parent = 0);
+ ~QGenericEngine();
+
+ QString getInterfaceFromId(const QString &id);
+ bool hasIdentifier(const QString &id);
+
+ void connectToId(const QString &id);
+ void disconnectFromId(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkSession::State sessionStateForId(const QString &id);
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+ bool requiresPolling() const;
+
+private Q_SLOTS:
+ void doRequestUpdate();
+
+private:
+ QMap<QString, QString> configurationInterface;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif
+
diff --git a/src/plugins/bearer/icd/dbusdispatcher.cpp b/src/plugins/bearer/icd/dbusdispatcher.cpp
new file mode 100644
index 0000000000..a317cb4944
--- /dev/null
+++ b/src/plugins/bearer/icd/dbusdispatcher.cpp
@@ -0,0 +1,634 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QDebug>
+#include <QtCore>
+#include <poll.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#include <glib.h>
+#include "dbusdispatcher.h"
+
+namespace Maemo {
+
+/*!
+ \class Maemo::DBusDispatcher
+
+ \brief DBusDispatcher is a class that can send DBUS method call
+ messages and receive unicast signals from DBUS objects.
+*/
+
+class DBusDispatcherPrivate
+{
+public:
+ DBusDispatcherPrivate(const QString& service,
+ const QString& path,
+ const QString& interface,
+ const QString& signalPath)
+ : service(service), path(path), interface(interface),
+ signalPath(signalPath), connection(0)
+ {
+ memset(&signal_vtable, 0, sizeof(signal_vtable));
+ }
+
+ ~DBusDispatcherPrivate()
+ {
+ foreach(DBusPendingCall *call, pending_calls) {
+ dbus_pending_call_cancel(call);
+ dbus_pending_call_unref(call);
+ }
+ }
+
+ QString service;
+ QString path;
+ QString interface;
+ QString signalPath;
+ struct DBusConnection *connection;
+ QList<DBusPendingCall *> pending_calls;
+ struct DBusObjectPathVTable signal_vtable;
+};
+
+static bool constantVariantList(const QVariantList& variantList) {
+ // Special case, empty list == empty struct
+ if (variantList.isEmpty()) {
+ return false;
+ } else {
+ QVariant::Type type = variantList[0].type();
+ // Iterate items in the list and check if they are same type
+ foreach(QVariant variant, variantList) {
+ if (variant.type() != type) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+static QString variantToSignature(const QVariant& argument,
+ bool constantList = true) {
+ switch (argument.type()) {
+ case QVariant::Bool:
+ return "b";
+ case QVariant::ByteArray:
+ return "ay";
+ case QVariant::Char:
+ return "y";
+ case QVariant::Int:
+ return "i";
+ case QVariant::UInt:
+ return "u";
+ case QVariant::StringList:
+ return "as";
+ case QVariant::String:
+ return "s";
+ case QVariant::LongLong:
+ return "x";
+ case QVariant::ULongLong:
+ return "t";
+ case QVariant::List:
+ {
+ QString signature;
+ QVariantList variantList = argument.toList();
+ if (!constantList) {
+ signature += DBUS_STRUCT_BEGIN_CHAR_AS_STRING;
+ foreach(QVariant listItem, variantList) {
+ signature += variantToSignature(listItem);
+ }
+ signature += DBUS_STRUCT_END_CHAR_AS_STRING;
+ } else {
+ if (variantList.isEmpty())
+ return "";
+ signature = "a" + variantToSignature(variantList[0]);
+ }
+
+ return signature;
+ }
+ default:
+ qDebug() << "Unsupported variant type: " << argument.type();
+ break;
+ }
+
+ return "";
+}
+
+static bool appendVariantToDBusMessage(const QVariant& argument,
+ DBusMessageIter *dbus_iter) {
+ int idx = 0;
+ DBusMessageIter array_iter;
+ QStringList str_list;
+ dbus_bool_t bool_data;
+ dbus_int32_t int32_data;
+ dbus_uint32_t uint32_data;
+ dbus_int64_t int64_data;
+ dbus_uint64_t uint64_data;
+ char *str_data;
+ char char_data;
+
+ switch (argument.type()) {
+
+ case QVariant::Bool:
+ bool_data = argument.toBool();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_BOOLEAN,
+ &bool_data);
+ break;
+
+ case QVariant::ByteArray:
+ str_data = argument.toByteArray().data();
+ dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_BYTE_AS_STRING, &array_iter);
+ dbus_message_iter_append_fixed_array(&array_iter,
+ DBUS_TYPE_BYTE,
+ &str_data,
+ argument.toByteArray().size());
+ dbus_message_iter_close_container(dbus_iter, &array_iter);
+ break;
+
+ case QVariant::Char:
+ char_data = argument.toChar().toAscii();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_BYTE,
+ &char_data);
+ break;
+
+ case QVariant::Int:
+ int32_data = argument.toInt();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_INT32,
+ &int32_data);
+ break;
+
+ case QVariant::String: {
+ QByteArray data = argument.toString().toLatin1();
+ str_data = data.data();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_STRING,
+ &str_data);
+ break;
+ }
+
+ case QVariant::StringList:
+ str_list = argument.toStringList();
+ dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY,
+ "s", &array_iter);
+ for (idx = 0; idx < str_list.size(); idx++) {
+ QByteArray data = str_list.at(idx).toLatin1();
+ str_data = data.data();
+ dbus_message_iter_append_basic(&array_iter,
+ DBUS_TYPE_STRING,
+ &str_data);
+ }
+ dbus_message_iter_close_container(dbus_iter, &array_iter);
+ break;
+
+ case QVariant::UInt:
+ uint32_data = argument.toUInt();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_UINT32,
+ &uint32_data);
+ break;
+
+ case QVariant::ULongLong:
+ uint64_data = argument.toULongLong();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_UINT64,
+ &uint64_data);
+ break;
+
+ case QVariant::LongLong:
+ int64_data = argument.toLongLong();
+ dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_INT64,
+ &int64_data);
+ break;
+
+ case QVariant::List:
+ {
+ QVariantList variantList = argument.toList();
+ bool constantList = constantVariantList(variantList);
+ DBusMessageIter array_iter;
+
+ // List is mapped either as an DBUS array (all items same type)
+ // DBUS struct (variable types) depending on constantList
+ if (constantList) {
+ // Resolve the signature for the first item
+ QString signature = "";
+ if (!variantList.isEmpty()) {
+ signature = variantToSignature(
+ variantList[0],
+ constantVariantList(variantList[0].toList()));
+ }
+
+ // Mapped as DBUS array
+ dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY,
+ signature.toAscii(),
+ &array_iter);
+
+ foreach(QVariant listItem, variantList) {
+ appendVariantToDBusMessage(listItem, &array_iter);
+ }
+
+ dbus_message_iter_close_container(dbus_iter, &array_iter);
+ } else {
+ // Mapped as DBUS struct
+ dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_STRUCT,
+ NULL,
+ &array_iter);
+
+ foreach(QVariant listItem, variantList) {
+ appendVariantToDBusMessage(listItem, &array_iter);
+ }
+
+ dbus_message_iter_close_container(dbus_iter, &array_iter);
+ }
+
+ break;
+ }
+ default:
+ qDebug() << "Unsupported variant type: " << argument.type();
+ break;
+ }
+
+ return true;
+}
+
+static QVariant getVariantFromDBusMessage(DBusMessageIter *iter) {
+ dbus_bool_t bool_data;
+ dbus_int32_t int32_data;
+ dbus_uint32_t uint32_data;
+ dbus_int64_t int64_data;
+ dbus_uint64_t uint64_data;
+ char *str_data;
+ char char_data;
+ int argtype = dbus_message_iter_get_arg_type(iter);
+
+ switch (argtype) {
+
+ case DBUS_TYPE_BOOLEAN:
+ {
+ dbus_message_iter_get_basic(iter, &bool_data);
+ QVariant variant((bool)bool_data);
+ return variant;
+ }
+
+ case DBUS_TYPE_ARRAY:
+ {
+ // Handle all arrays here
+ int elem_type = dbus_message_iter_get_element_type(iter);
+ DBusMessageIter array_iter;
+
+ dbus_message_iter_recurse(iter, &array_iter);
+
+ if (elem_type == DBUS_TYPE_BYTE) {
+ QByteArray byte_array;
+ do {
+ dbus_message_iter_get_basic(&array_iter, &char_data);
+ byte_array.append(char_data);
+ } while (dbus_message_iter_next(&array_iter));
+ QVariant variant(byte_array);
+ return variant;
+ } else if (elem_type == DBUS_TYPE_STRING) {
+ QStringList str_list;
+ do {
+ dbus_message_iter_get_basic(&array_iter, &str_data);
+ str_list.append(str_data);
+ } while (dbus_message_iter_next(&array_iter));
+ QVariant variant(str_list);
+ return variant;
+ } else {
+ QVariantList variantList;
+ do {
+ variantList << getVariantFromDBusMessage(&array_iter);
+ } while (dbus_message_iter_next(&array_iter));
+ QVariant variant(variantList);
+ return variant;
+ }
+ break;
+ }
+
+ case DBUS_TYPE_BYTE:
+ {
+ dbus_message_iter_get_basic(iter, &char_data);
+ QChar ch(char_data);
+ QVariant variant(ch);
+ return variant;
+ }
+
+ case DBUS_TYPE_INT32:
+ {
+ dbus_message_iter_get_basic(iter, &int32_data);
+ QVariant variant((int)int32_data);
+ return variant;
+ }
+
+ case DBUS_TYPE_UINT32:
+ {
+ dbus_message_iter_get_basic(iter, &uint32_data);
+ QVariant variant((uint)uint32_data);
+ return variant;
+ }
+
+ case DBUS_TYPE_STRING:
+ {
+ dbus_message_iter_get_basic(iter, &str_data);
+ QString str(str_data);
+ QVariant variant(str);
+ return variant;
+ }
+
+ case DBUS_TYPE_INT64:
+ {
+ dbus_message_iter_get_basic(iter, &int64_data);
+ QVariant variant((qlonglong)int64_data);
+ return variant;
+ }
+
+ case DBUS_TYPE_UINT64:
+ {
+ dbus_message_iter_get_basic(iter, &uint64_data);
+ QVariant variant((qulonglong)uint64_data);
+ return variant;
+ }
+
+ case DBUS_TYPE_STRUCT:
+ {
+ // Handle all structs here
+ DBusMessageIter struct_iter;
+ dbus_message_iter_recurse(iter, &struct_iter);
+
+ QVariantList variantList;
+ do {
+ variantList << getVariantFromDBusMessage(&struct_iter);
+ } while (dbus_message_iter_next(&struct_iter));
+ QVariant variant(variantList);
+ return variant;
+ }
+
+ default:
+ qDebug() << "Unsupported DBUS type: " << argtype;
+ }
+
+ return QVariant();
+}
+
+static DBusHandlerResult signalHandler (DBusConnection *connection,
+ DBusMessage *message,
+ void *object_ref) {
+ (void)connection;
+ QString interface;
+ QString signal;
+ DBusDispatcher *dispatcher = (DBusDispatcher *)object_ref;
+
+ if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_SIGNAL) {
+ interface = dbus_message_get_interface(message);
+ signal = dbus_message_get_member(message);
+
+ QList<QVariant> arglist;
+ DBusMessageIter dbus_iter;
+
+ if (dbus_message_iter_init(message, &dbus_iter)) {
+ // Read return arguments
+ while (dbus_message_iter_get_arg_type (&dbus_iter) != DBUS_TYPE_INVALID) {
+ arglist << getVariantFromDBusMessage(&dbus_iter);
+ dbus_message_iter_next(&dbus_iter);
+ }
+ }
+
+ dispatcher->emitSignalReceived(interface, signal, arglist);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+ (void)message;
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+DBusDispatcher::DBusDispatcher(const QString& service,
+ const QString& path,
+ const QString& interface,
+ QObject *parent)
+ : QObject(parent),
+ d_ptr(new DBusDispatcherPrivate(service, path, interface, path)) {
+ setupDBus();
+}
+
+DBusDispatcher::DBusDispatcher(const QString& service,
+ const QString& path,
+ const QString& interface,
+ const QString& signalPath,
+ QObject *parent)
+ : QObject(parent),
+ d_ptr(new DBusDispatcherPrivate(service, path, interface, signalPath)) {
+ setupDBus();
+}
+
+DBusDispatcher::~DBusDispatcher()
+{
+ if (d_ptr->connection) {
+ dbus_connection_close(d_ptr->connection);
+ dbus_connection_unref(d_ptr->connection);
+ }
+ delete d_ptr;
+}
+
+void DBusDispatcher::setupDBus()
+{
+ d_ptr->connection = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
+
+ if (d_ptr->connection == NULL)
+ qDebug() << "Unable to get DBUS connection!";
+ else {
+ d_ptr->signal_vtable.message_function = signalHandler;
+
+ dbus_connection_set_exit_on_disconnect(d_ptr->connection, FALSE);
+ dbus_connection_setup_with_g_main(d_ptr->connection, g_main_context_get_thread_default());
+ dbus_connection_register_object_path(d_ptr->connection,
+ d_ptr->signalPath.toLatin1(),
+ &d_ptr->signal_vtable,
+ this);
+ }
+}
+
+static DBusMessage *prepareDBusCall(const QString& service,
+ const QString& path,
+ const QString& interface,
+ const QString& method,
+ const QVariant& arg1 = QVariant(),
+ const QVariant& arg2 = QVariant(),
+ const QVariant& arg3 = QVariant(),
+ const QVariant& arg4 = QVariant(),
+ const QVariant& arg5 = QVariant(),
+ const QVariant& arg6 = QVariant(),
+ const QVariant& arg7 = QVariant(),
+ const QVariant& arg8 = QVariant())
+{
+ DBusMessage *message = dbus_message_new_method_call(service.toLatin1(),
+ path.toLatin1(),
+ interface.toLatin1(),
+ method.toLatin1());
+ DBusMessageIter dbus_iter;
+
+ // Append variants to DBUS message
+ QList<QVariant> arglist;
+ if (arg1.isValid()) arglist << arg1;
+ if (arg2.isValid()) arglist << arg2;
+ if (arg3.isValid()) arglist << arg3;
+ if (arg4.isValid()) arglist << arg4;
+ if (arg5.isValid()) arglist << arg5;
+ if (arg6.isValid()) arglist << arg6;
+ if (arg7.isValid()) arglist << arg7;
+ if (arg8.isValid()) arglist << arg8;
+
+ dbus_message_iter_init_append (message, &dbus_iter);
+
+ while (!arglist.isEmpty()) {
+ QVariant argument = arglist.takeFirst();
+ appendVariantToDBusMessage(argument, &dbus_iter);
+ }
+
+ return message;
+}
+
+QList<QVariant> DBusDispatcher::call(const QString& method,
+ const QVariant& arg1,
+ const QVariant& arg2,
+ const QVariant& arg3,
+ const QVariant& arg4,
+ const QVariant& arg5,
+ const QVariant& arg6,
+ const QVariant& arg7,
+ const QVariant& arg8) {
+ DBusMessageIter dbus_iter;
+ DBusMessage *message = prepareDBusCall(d_ptr->service, d_ptr->path,
+ d_ptr->interface, method,
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8);
+ DBusMessage *reply = dbus_connection_send_with_reply_and_block(
+ d_ptr->connection,
+ message, -1, NULL);
+ dbus_message_unref(message);
+
+ QList<QVariant> replylist;
+ if (reply != NULL && dbus_message_iter_init(reply, &dbus_iter)) {
+ // Read return arguments
+ while (dbus_message_iter_get_arg_type (&dbus_iter) != DBUS_TYPE_INVALID) {
+ replylist << getVariantFromDBusMessage(&dbus_iter);
+ dbus_message_iter_next(&dbus_iter);
+ }
+ }
+ if (reply != NULL) dbus_message_unref(reply);
+ return replylist;
+}
+
+class PendingCallInfo {
+public:
+ QString method;
+ DBusDispatcher *dispatcher;
+ DBusDispatcherPrivate *priv;
+};
+
+static void freePendingCallInfo(void *memory) {
+ PendingCallInfo *info = (PendingCallInfo *)memory;
+ delete info;
+}
+
+static void pendingCallFunction (DBusPendingCall *pending,
+ void *memory) {
+ PendingCallInfo *info = (PendingCallInfo *)memory;
+ QString errorStr;
+ QList<QVariant> replyList;
+ DBusMessage *reply = dbus_pending_call_steal_reply (pending);
+
+ Q_ASSERT(reply != NULL);
+
+ if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
+ errorStr = dbus_message_get_error_name (reply);
+ } else {
+ DBusMessageIter dbus_iter;
+ dbus_message_iter_init(reply, &dbus_iter);
+ // Read return arguments
+ while (dbus_message_iter_get_arg_type (&dbus_iter) != DBUS_TYPE_INVALID) {
+ replyList << getVariantFromDBusMessage(&dbus_iter);
+ dbus_message_iter_next(&dbus_iter);
+ }
+ }
+
+ info->priv->pending_calls.removeOne(pending);
+ info->dispatcher->emitCallReply(info->method, replyList, errorStr);
+ dbus_message_unref(reply);
+ dbus_pending_call_unref(pending);
+}
+
+bool DBusDispatcher::callAsynchronous(const QString& method,
+ const QVariant& arg1,
+ const QVariant& arg2,
+ const QVariant& arg3,
+ const QVariant& arg4,
+ const QVariant& arg5,
+ const QVariant& arg6,
+ const QVariant& arg7,
+ const QVariant& arg8) {
+ DBusMessage *message = prepareDBusCall(d_ptr->service, d_ptr->path,
+ d_ptr->interface, method,
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8);
+ DBusPendingCall *call = NULL;
+ dbus_bool_t ret = dbus_connection_send_with_reply(d_ptr->connection,
+ message, &call, -1);
+ PendingCallInfo *info = new PendingCallInfo;
+ info->method = method;
+ info->dispatcher = this;
+ info->priv = d_ptr;
+
+ dbus_pending_call_set_notify(call, pendingCallFunction, info, freePendingCallInfo);
+ d_ptr->pending_calls.append(call);
+ return (bool)ret;
+}
+
+void DBusDispatcher::emitSignalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args) {
+ emit signalReceived(interface, signal, args); }
+
+void DBusDispatcher::emitCallReply(const QString& method,
+ const QList<QVariant>& args,
+ const QString& error) {
+ emit callReply(method, args, error); }
+
+void DBusDispatcher::synchronousDispatch(int timeout_ms)
+{
+ dbus_connection_read_write_dispatch(d_ptr->connection, timeout_ms);
+}
+
+} // Maemo namespace
+
diff --git a/src/plugins/bearer/icd/dbusdispatcher.h b/src/plugins/bearer/icd/dbusdispatcher.h
new file mode 100644
index 0000000000..d14562948d
--- /dev/null
+++ b/src/plugins/bearer/icd/dbusdispatcher.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef DBUSDISPATCHER_H
+#define DBUSDISPATCHER_H
+
+#include <QObject>
+#include <QVariant>
+
+namespace Maemo {
+
+class DBusDispatcherPrivate;
+class DBusDispatcher : public QObject
+{
+ Q_OBJECT
+
+public:
+ DBusDispatcher(const QString& service,
+ const QString& path,
+ const QString& interface,
+ QObject *parent = 0);
+ DBusDispatcher(const QString& service,
+ const QString& path,
+ const QString& interface,
+ const QString& signalPath,
+ QObject *parent = 0);
+ ~DBusDispatcher();
+
+ QList<QVariant> call(const QString& method,
+ const QVariant& arg1 = QVariant(),
+ const QVariant& arg2 = QVariant(),
+ const QVariant& arg3 = QVariant(),
+ const QVariant& arg4 = QVariant(),
+ const QVariant& arg5 = QVariant(),
+ const QVariant& arg6 = QVariant(),
+ const QVariant& arg7 = QVariant(),
+ const QVariant& arg8 = QVariant());
+ bool callAsynchronous(const QString& method,
+ const QVariant& arg1 = QVariant(),
+ const QVariant& arg2 = QVariant(),
+ const QVariant& arg3 = QVariant(),
+ const QVariant& arg4 = QVariant(),
+ const QVariant& arg5 = QVariant(),
+ const QVariant& arg6 = QVariant(),
+ const QVariant& arg7 = QVariant(),
+ const QVariant& arg8 = QVariant());
+ void emitSignalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args);
+ void emitCallReply(const QString& method,
+ const QList<QVariant>& args,
+ const QString& error = "");
+ void synchronousDispatch(int timeout_ms);
+
+Q_SIGNALS:
+ void signalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args);
+ void callReply(const QString& method,
+ const QList<QVariant>& args,
+ const QString& error);
+
+protected:
+ void setupDBus();
+
+private:
+ DBusDispatcherPrivate *d_ptr;
+};
+
+} // Maemo namespace
+
+#endif
diff --git a/src/plugins/bearer/icd/iapconf.cpp b/src/plugins/bearer/icd/iapconf.cpp
new file mode 100644
index 0000000000..128296aec6
--- /dev/null
+++ b/src/plugins/bearer/icd/iapconf.cpp
@@ -0,0 +1,245 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <conn_settings.h>
+
+#include "iapconf.h"
+
+#define QSTRING_TO_CONST_CSTR(str) \
+ str.toUtf8().constData()
+
+namespace Maemo {
+
+class IAPConfPrivate {
+public:
+ ConnSettings *settings;
+
+ ConnSettingsValue *variantToValue(const QVariant &variant);
+ QVariant valueToVariant(ConnSettingsValue *value);
+};
+
+ConnSettingsValue *IAPConfPrivate::variantToValue(const QVariant &variant)
+{
+ // Convert variant to ConnSettingsValue
+ ConnSettingsValue *value = conn_settings_value_new();
+ if (value == 0) {
+ qWarning("IAPConf: Unable to create new ConnSettingsValue");
+ return 0;
+ }
+
+ switch(variant.type()) {
+
+ case QVariant::Invalid:
+ value->type = CONN_SETTINGS_VALUE_INVALID;
+ break;
+
+ case QVariant::String: {
+ char *valueStr = strdup(QSTRING_TO_CONST_CSTR(variant.toString()));
+ value->type = CONN_SETTINGS_VALUE_STRING;
+ value->value.string_val = valueStr;
+ break;
+ }
+
+ case QVariant::Int:
+ value->type = CONN_SETTINGS_VALUE_INT;
+ value->value.int_val = variant.toInt();
+ break;
+
+ case QMetaType::Float:
+ case QVariant::Double:
+ value->type = CONN_SETTINGS_VALUE_DOUBLE;
+ value->value.double_val = variant.toDouble();
+ break;
+
+ case QVariant::Bool:
+ value->type = CONN_SETTINGS_VALUE_BOOL;
+ value->value.bool_val = variant.toBool() ? 1 : 0;
+ break;
+
+ case QVariant::ByteArray: {
+ QByteArray array = variant.toByteArray();
+ value->type = CONN_SETTINGS_VALUE_BYTE_ARRAY;
+ value->value.byte_array.len = array.size();
+ value->value.byte_array.val = (unsigned char *)malloc(array.size());
+ memcpy(value->value.byte_array.val, array.constData(), array.size());
+ break;
+ }
+
+ case QVariant::List: {
+ QVariantList list = variant.toList();
+ ConnSettingsValue **list_val = (ConnSettingsValue **)malloc(
+ (list.size() + 1) * sizeof(ConnSettingsValue *));
+
+ for (int idx = 0; idx < list.size(); idx++) {
+ list_val[idx] = variantToValue(list.at(idx));
+ }
+ list_val[list.size()] = 0;
+
+ value->type = CONN_SETTINGS_VALUE_LIST;
+ value->value.list_val = list_val;
+ break;
+ }
+
+ default:
+ qWarning("IAPConf: Can not handle QVariant of type %d",
+ variant.type());
+ conn_settings_value_destroy(value);
+ return 0;
+ }
+
+ return value;
+}
+
+QVariant IAPConfPrivate::valueToVariant(ConnSettingsValue *value)
+{
+ if (value == 0 || value->type == CONN_SETTINGS_VALUE_INVALID) {
+ return QVariant();
+ }
+
+ switch(value->type) {
+
+ case CONN_SETTINGS_VALUE_BOOL:
+ return QVariant(value->value.bool_val ? true : false);
+
+ case CONN_SETTINGS_VALUE_STRING:
+ return QVariant(QString(value->value.string_val));
+
+ case CONN_SETTINGS_VALUE_DOUBLE:
+ return QVariant(value->value.double_val);
+
+ case CONN_SETTINGS_VALUE_INT:
+ return QVariant(value->value.int_val);
+
+ case CONN_SETTINGS_VALUE_LIST: {
+ // At least with GConf backend connsettings returns byte array as list
+ // of ints, first check for that case
+ if (value->value.list_val && value->value.list_val[0]) {
+ bool canBeConvertedToByteArray = true;
+ for (int idx = 0; value->value.list_val[idx]; idx++) {
+ ConnSettingsValue *val = value->value.list_val[idx];
+ if (val->type != CONN_SETTINGS_VALUE_INT
+ || val->value.int_val > 255
+ || val->value.int_val < 0) {
+ canBeConvertedToByteArray = false;
+ break;
+ }
+ }
+
+ if (canBeConvertedToByteArray) {
+ QByteArray array;
+ for (int idx = 0; value->value.list_val[idx]; idx++) {
+ array.append(value->value.list_val[idx]->value.int_val);
+ }
+ return array;
+ }
+
+ // Create normal list
+ QVariantList list;
+ for (int idx = 0; value->value.list_val[idx]; idx++) {
+ list.append(valueToVariant(value->value.list_val[idx]));
+ }
+ return list;
+ }
+ }
+
+ case CONN_SETTINGS_VALUE_BYTE_ARRAY:
+ return QByteArray::fromRawData((char *)value->value.byte_array.val,
+ value->value.byte_array.len);
+
+ default:
+ return QVariant();
+ }
+}
+
+// Public class implementation
+
+IAPConf::IAPConf(const QString &iap_id)
+ : d_ptr(new IAPConfPrivate)
+{
+ d_ptr->settings = conn_settings_open(CONN_SETTINGS_CONNECTION,
+ QSTRING_TO_CONST_CSTR(iap_id));
+ if (d_ptr->settings == 0) {
+ qWarning("IAPConf: Unable to open ConnSettings for %s",
+ QSTRING_TO_CONST_CSTR(iap_id));
+ }
+}
+
+IAPConf::~IAPConf()
+{
+ conn_settings_close(d_ptr->settings);
+ delete d_ptr;
+}
+
+
+QVariant IAPConf::value(const QString& key) const
+{
+ ConnSettingsValue *val = conn_settings_get(d_ptr->settings,
+ QSTRING_TO_CONST_CSTR(key));
+
+ QVariant variant = d_ptr->valueToVariant(val);
+ conn_settings_value_destroy(val);
+ return variant;
+}
+
+
+void IAPConf::getAll(QList<QString> &all_iaps, bool return_path)
+{
+ Q_UNUSED(return_path); // We don't use return path currently
+
+ // Go through all available connections and add them to the list
+ char **ids = conn_settings_list_ids(CONN_SETTINGS_CONNECTION);
+ if (ids == 0) {
+ // No ids found - nothing to do
+ return;
+ }
+
+ for (int idx = 0; ids[idx]; idx++) {
+ all_iaps.append(QString(ids[idx]));
+ free(ids[idx]);
+ }
+ free(ids);
+}
+
+
+} // namespace Maemo
diff --git a/src/plugins/bearer/icd/iapconf.h b/src/plugins/bearer/icd/iapconf.h
new file mode 100644
index 0000000000..909818a8e0
--- /dev/null
+++ b/src/plugins/bearer/icd/iapconf.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef IAPCONF_H
+#define IAPCONF_H
+
+#include <QString>
+#include <QVariant>
+
+namespace Maemo {
+
+class IAPConfPrivate;
+class IAPConf {
+public:
+ IAPConf(const QString &iap_id);
+ virtual ~IAPConf();
+
+ /**
+ Get one IAP value.
+ */
+ QVariant value(const QString& key) const;
+
+ /**
+ Return all the IAPs found in the system. If return_path is true,
+ then do not strip the IAP path away.
+ */
+ static void getAll(QList<QString> &all_iaps, bool return_path=false);
+
+private:
+ IAPConfPrivate *d_ptr;
+};
+
+} // namespace Maemo
+
+#endif
diff --git a/src/plugins/bearer/icd/iapmonitor.cpp b/src/plugins/bearer/icd/iapmonitor.cpp
new file mode 100644
index 0000000000..b2508cdd76
--- /dev/null
+++ b/src/plugins/bearer/icd/iapmonitor.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QStringList>
+
+#include <conn_settings.h>
+#include "iapmonitor.h"
+
+namespace Maemo {
+
+
+void conn_settings_notify_func (ConnSettingsType type,
+ const char *id,
+ const char *key,
+ ConnSettingsValue *value,
+ void *user_data);
+
+class IAPMonitorPrivate {
+private:
+ IAPMonitor *monitor;
+ ConnSettings *settings;
+
+public:
+
+ IAPMonitorPrivate(IAPMonitor *monitor)
+ : monitor(monitor)
+ {
+ settings = conn_settings_open(CONN_SETTINGS_CONNECTION, NULL);
+ conn_settings_add_notify(
+ settings,
+ (ConnSettingsNotifyFunc *)conn_settings_notify_func,
+ this);
+ }
+
+ ~IAPMonitorPrivate()
+ {
+ conn_settings_del_notify(settings);
+ conn_settings_close(settings);
+ }
+
+ void iapAdded(const QString &iap)
+ {
+ monitor->iapAdded(iap);
+ }
+
+ void iapRemoved(const QString &iap)
+ {
+ monitor->iapRemoved(iap);
+ }
+};
+
+void conn_settings_notify_func (ConnSettingsType type,
+ const char *id,
+ const char *key,
+ ConnSettingsValue *value,
+ void *user_data)
+{
+ Q_UNUSED(id);
+
+ if (type != CONN_SETTINGS_CONNECTION) return;
+ IAPMonitorPrivate *priv = (IAPMonitorPrivate *)user_data;
+
+ QString iapId(key);
+ iapId = iapId.split("/")[0];
+ if (value != 0) {
+ priv->iapAdded(iapId);
+ } else if (iapId == QString(key)) {
+ // IAP is removed only when the directory gets removed
+ priv->iapRemoved(iapId);
+ }
+}
+
+IAPMonitor::IAPMonitor()
+ : d_ptr(new IAPMonitorPrivate(this))
+{
+}
+
+IAPMonitor::~IAPMonitor()
+{
+ delete d_ptr;
+}
+
+void IAPMonitor::iapAdded(const QString &id)
+{
+ Q_UNUSED(id);
+ // By default do nothing
+}
+
+void IAPMonitor::iapRemoved(const QString &id)
+{
+ Q_UNUSED(id);
+ // By default do nothing
+}
+
+} // namespace Maemo
diff --git a/src/plugins/bearer/icd/iapmonitor.h b/src/plugins/bearer/icd/iapmonitor.h
new file mode 100644
index 0000000000..cb8135de58
--- /dev/null
+++ b/src/plugins/bearer/icd/iapmonitor.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef IAPMONITOR_H
+#define IAPMONITOR_H
+
+#include <QString>
+
+namespace Maemo {
+
+class IAPMonitorPrivate;
+class IAPMonitor {
+public:
+ IAPMonitor();
+ ~IAPMonitor();
+
+protected:
+ virtual void iapAdded(const QString &id);
+ virtual void iapRemoved(const QString &id);
+
+private:
+ IAPMonitorPrivate *d_ptr;
+ Q_DECLARE_PRIVATE(IAPMonitor);
+};
+
+} // namespace Maemo
+
+#endif // IAPMONITOR_H
+
diff --git a/src/plugins/bearer/icd/icd.pro b/src/plugins/bearer/icd/icd.pro
new file mode 100644
index 0000000000..6700cdaaa8
--- /dev/null
+++ b/src/plugins/bearer/icd/icd.pro
@@ -0,0 +1,33 @@
+TARGET = qicdbearer
+include(../../qpluginbase.pri)
+
+QT = core network dbus
+
+QMAKE_CXXFLAGS *= $$QT_CFLAGS_DBUS $$QT_CFLAGS_CONNSETTINGS
+LIBS += $$QT_LIBS_CONNSETTINGS
+
+HEADERS += qicdengine.h \
+ qnetworksession_impl.h \
+ dbusdispatcher.h \
+ iapconf.h \
+ iapmonitor.h \
+ maemo_icd.h \
+ proxyconf.h \
+ wlan-utils.h
+
+SOURCES += main.cpp \
+ qicdengine.cpp \
+ qnetworksession_impl.cpp \
+ dbusdispatcher.cpp \
+ iapmonitor.cpp \
+ iapconf.cpp \
+ maemo_icd.cpp \
+ proxyconf.cpp
+
+#DEFINES += BEARER_MANAGEMENT_DEBUG
+
+include(../../../3rdparty/libgq.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/icd/maemo_icd.cpp b/src/plugins/bearer/icd/maemo_icd.cpp
new file mode 100644
index 0000000000..1a27f0905b
--- /dev/null
+++ b/src/plugins/bearer/icd/maemo_icd.cpp
@@ -0,0 +1,855 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "maemo_icd.h"
+#include "dbusdispatcher.h"
+
+#include <QObject>
+#include <QTimer>
+#include <QCoreApplication>
+#include <QEventLoop>
+#include <QDebug>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+namespace Maemo {
+
+#undef PRINT_DEBUGINFO
+#ifdef PRINT_DEBUGINFO
+ static FILE *fdebug = NULL;
+#define PDEBUG(fmt, args...) \
+ do { \
+ struct timeval tv; \
+ gettimeofday(&tv, 0); \
+ fprintf(fdebug, "DEBUG[%d]:%ld.%ld:%s:%s():%d: " fmt, \
+ getpid(), \
+ tv.tv_sec, tv.tv_usec, \
+ __FILE__, __FUNCTION__, __LINE__, args); \
+ fflush(fdebug); \
+ } while(0)
+#else
+#define PDEBUG(fmt...)
+#endif
+
+
+class IcdPrivate
+{
+public:
+ IcdPrivate(Icd *myfriend)
+ {
+ init(10000, IcdNewDbusInterface, myfriend);
+ }
+
+ IcdPrivate(unsigned int timeout, Icd *myfriend)
+ {
+ init(timeout, IcdNewDbusInterface, myfriend);
+ }
+
+ IcdPrivate(unsigned int timeout, IcdDbusInterfaceVer ver, Icd *myfriend)
+ {
+ Q_UNUSED(ver);
+
+ /* Note that the old Icd interface is currently disabled and
+ * the new one is always used.
+ */
+ init(timeout, IcdNewDbusInterface, myfriend);
+ }
+
+ ~IcdPrivate()
+ {
+ QObject::disconnect(mDBus,
+ SIGNAL(signalReceived(const QString&,
+ const QString&,
+ const QList<QVariant>&)),
+ icd,
+ SLOT(icdSignalReceived(const QString&,
+ const QString&,
+ const QList<QVariant>&)));
+
+ QObject::disconnect(mDBus,
+ SIGNAL(callReply(const QString&,
+ const QList<QVariant>&,
+ const QString&)),
+ icd,
+ SLOT(icdCallReply(const QString&,
+ const QList<QVariant>&,
+ const QString&)));
+
+ delete mDBus;
+ mDBus = 0;
+ }
+
+ /* Icd2 dbus API functions */
+ QStringList scan(icd_scan_request_flags flags,
+ QStringList &network_types,
+ QList<IcdScanResult>& scan_results,
+ QString& error);
+
+ uint state(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdStateResult &state_result);
+
+ uint addrinfo(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdAddressInfoResult& addr_result);
+
+ uint state(QList<IcdStateResult>& state_results);
+ uint statistics(QList<IcdStatisticsResult>& stats_results);
+ uint addrinfo(QList<IcdAddressInfoResult>& addr_results);
+
+ void signalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args);
+ void callReply(const QString& method,
+ const QList<QVariant>& args,
+ const QString& error);
+
+public:
+ DBusDispatcher *mDBus;
+ QString mMethod;
+ QString mInterface;
+ QString mSignal;
+ QString mError;
+ QList<QVariant> mArgs;
+ QList<QVariant> receivedSignals;
+ unsigned int timeout;
+ IcdDbusInterfaceVer icd_dbus_version;
+ Icd *icd;
+
+ void init(unsigned int dbus_timeout, IcdDbusInterfaceVer ver,
+ Icd *myfriend)
+ {
+ if (ver == IcdNewDbusInterface) {
+ mDBus = new DBusDispatcher(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE);
+ } else {
+ mDBus = new DBusDispatcher(ICD_DBUS_SERVICE,
+ ICD_DBUS_PATH,
+ ICD_DBUS_INTERFACE);
+ }
+ icd_dbus_version = ver;
+
+ /* This connect has a side effect as it means that only one
+ * Icd object can exists in one time. This should be fixed!
+ */
+ QObject::connect(mDBus,
+ SIGNAL(signalReceived(const QString&,
+ const QString&,
+ const QList<QVariant>&)),
+ myfriend,
+ SLOT(icdSignalReceived(const QString&,
+ const QString&,
+ const QList<QVariant>&)));
+
+ QObject::connect(mDBus,
+ SIGNAL(callReply(const QString&,
+ const QList<QVariant>&,
+ const QString&)),
+ myfriend,
+ SLOT(icdCallReply(const QString&,
+ const QList<QVariant>&,
+ const QString&)));
+
+ icd = myfriend;
+ timeout = dbus_timeout;
+
+#ifdef PRINT_DEBUGINFO
+ if (!fdebug) {
+ fdebug = fopen("/tmp/maemoicd.log", "a+");
+ }
+ PDEBUG("created %s\n", "IcdPrivate");
+#endif
+ }
+
+ void clearState()
+ {
+ mMethod.clear();
+ mInterface.clear();
+ mSignal.clear();
+ mError.clear();
+ mArgs.clear();
+ receivedSignals.clear();
+ }
+
+ bool doState();
+};
+
+
+void IcdPrivate::signalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args)
+{
+ // Signal handler, which simply records what has been signalled
+ mInterface = interface;
+ mSignal = signal;
+ mArgs = args;
+
+ //qDebug() << "signal" << signal << "received:" << args;
+ receivedSignals << QVariant(interface) << QVariant(signal) << QVariant(args);
+}
+
+
+void IcdPrivate::callReply(const QString& method,
+ const QList<QVariant>& /*args*/,
+ const QString& error)
+{
+ mMethod = method;
+ mError = error;
+}
+
+
+static void get_scan_result(QList<QVariant>& args,
+ IcdScanResult& ret)
+{
+ int i=0;
+
+ if (args.isEmpty())
+ return;
+
+ ret.status = args[i++].toUInt();
+ ret.timestamp = args[i++].toUInt();
+ ret.scan.service_type = args[i++].toString();
+ ret.service_name = args[i++].toString();
+ ret.scan.service_attrs = args[i++].toUInt();
+ ret.scan.service_id = args[i++].toString();
+ ret.service_priority = args[i++].toInt();
+ ret.scan.network_type = args[i++].toString();
+ ret.network_name = args[i++].toString();
+ ret.scan.network_attrs = args[i++].toUInt();
+ ret.scan.network_id = args[i++].toByteArray();
+ ret.network_priority = args[i++].toInt();
+ ret.signal_strength = args[i++].toInt();
+ ret.station_id = args[i++].toString();
+ ret.signal_dB = args[i++].toInt();
+}
+
+
+QStringList IcdPrivate::scan(icd_scan_request_flags flags,
+ QStringList &network_types,
+ QList<IcdScanResult>& scan_results,
+ QString& error)
+{
+ Q_UNUSED(network_types);
+
+ QStringList scanned_types;
+ QTimer timer;
+ QVariant reply;
+ QVariantList vl;
+ bool last_result = false;
+ IcdScanResult result;
+ int all_waited;
+
+ clearState();
+ reply = mDBus->call(ICD_DBUS_API_SCAN_REQ, (uint)flags);
+ if (reply.type() != QVariant::List)
+ return scanned_types;
+ vl = reply.toList();
+ if (vl.isEmpty()) {
+ error = "Scan did not return anything.";
+ return scanned_types;
+ }
+ reply = vl.first();
+ scanned_types = reply.toStringList();
+ //qDebug() << "Scanning:" << scanned_types;
+ all_waited = scanned_types.size();
+
+ timer.setSingleShot(true);
+ timer.start(timeout);
+
+ scan_results.clear();
+ while (!last_result) {
+ while (timer.isActive() && mInterface.isEmpty() && mError.isEmpty()) {
+ QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
+ }
+
+ if (!timer.isActive()) {
+ //qDebug() << "Timeout happened";
+ break;
+ }
+
+ if (mSignal != ICD_DBUS_API_SCAN_SIG) {
+ //qDebug() << "Received" << mSignal << "while waiting" << ICD_DBUS_API_SCAN_SIG << ", ignoring";
+ mInterface.clear();
+ continue;
+ }
+
+ if (mError.isEmpty()) {
+ QString msgInterface = receivedSignals.takeFirst().toString();
+ QString msgSignal = receivedSignals.takeFirst().toString();
+ QList<QVariant> msgArgs = receivedSignals.takeFirst().toList();
+ //qDebug() << "Signal" << msgSignal << "received.";
+ //qDebug() << "Params:" << msgArgs;
+
+ while (!msgSignal.isEmpty()) {
+ get_scan_result(msgArgs, result);
+
+#if 0
+ qDebug() << "Received: " <<
+ "status =" << result.status <<
+ ", timestamp =" << result.timestamp <<
+ ", service_type =" << result.scan.service_type <<
+ ", service_name =" << result.service_name <<
+ ", service_attrs =" << result.scan.service_attrs <<
+ ", service_id =" << result.scan.service_id <<
+ ", service_priority =" << result.service_priority <<
+ ", network_type =" << result.scan.network_type <<
+ ", network_name =" << result.network_name <<
+ ", network_attrs =" << result.scan.network_attrs <<
+ ", network_id =" << "-" <<
+ ", network_priority =" << result.network_priority <<
+ ", signal_strength =" << result.signal_strength <<
+ ", station_id =" << result.station_id <<
+ ", signal_dB =" << result.signal_dB;
+#endif
+
+ if (result.status == ICD_SCAN_COMPLETE) {
+ //qDebug() << "waited =" << all_waited;
+ if (--all_waited == 0) {
+ last_result = true;
+ break;
+ }
+ } else
+ scan_results << result;
+
+ if (receivedSignals.isEmpty())
+ break;
+
+ msgInterface = receivedSignals.takeFirst().toString();
+ msgSignal = receivedSignals.takeFirst().toString();
+ msgArgs = receivedSignals.takeFirst().toList();
+ }
+ mInterface.clear();
+
+ } else {
+ qWarning() << "Error while scanning:" << mError;
+ break;
+ }
+ }
+ timer.stop();
+
+ error = mError;
+ return scanned_types;
+}
+
+
+static void get_state_all_result(QList<QVariant>& args,
+ IcdStateResult& ret)
+{
+ int i=0;
+
+ ret.params.service_type = args[i++].toString();
+ ret.params.service_attrs = args[i++].toUInt();
+ ret.params.service_id = args[i++].toString();
+ ret.params.network_type = args[i++].toString();
+ ret.params.network_attrs = args[i++].toUInt();
+ ret.params.network_id = args[i++].toByteArray();
+ ret.error = args[i++].toString();
+ ret.state = args[i++].toInt();
+}
+
+
+static void get_state_all_result2(QList<QVariant>& args,
+ IcdStateResult& ret)
+{
+ int i=0;
+
+ ret.params.network_type = args[i++].toString();
+ ret.state = args[i++].toInt();
+
+ // Initialize the other values so that the caller can
+ // notice we only returned partial status
+ ret.params.service_type = QString();
+ ret.params.service_attrs = 0;
+ ret.params.service_id = QString();
+ ret.params.network_attrs = 0;
+ ret.params.network_id = QByteArray();
+ ret.error = QString();
+}
+
+
+uint IcdPrivate::state(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdStateResult& state_result)
+{
+ QTimer timer;
+ QVariant reply;
+ uint total_signals;
+ QVariantList vl;
+
+ clearState();
+
+ reply = mDBus->call(ICD_DBUS_API_STATE_REQ,
+ service_type, service_attrs, service_id,
+ network_type, network_attrs, network_id);
+ if (reply.type() != QVariant::List)
+ return 0;
+ vl = reply.toList();
+ if (vl.isEmpty())
+ return 0;
+ reply = vl.first();
+ total_signals = reply.toUInt();
+ if (!total_signals)
+ return 0;
+
+ timer.setSingleShot(true);
+ timer.start(timeout);
+
+ mInterface.clear();
+ while (timer.isActive() && mInterface.isEmpty()) {
+ QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
+
+ if (mSignal != ICD_DBUS_API_STATE_SIG) {
+ mInterface.clear();
+ continue;
+ }
+ }
+
+ timer.stop();
+
+ if (mError.isEmpty()) {
+ if (!mArgs.isEmpty()) {
+ if (mArgs.size()>2)
+ get_state_all_result(mArgs, state_result);
+ else {
+ // We are not connected as we did not get the status we asked
+ return 0;
+ }
+ }
+ } else {
+ qWarning() << "Error:" << mError;
+ }
+
+ // The returned value should be one because we asked for one state
+ return total_signals;
+}
+
+
+/* Special version of the state() call which does not call event loop.
+ * Needed in order to fix NB#175098 where Qt4.7 webkit crashes because event
+ * loop is run when webkit does not expect it. This function is called from
+ * bearer management API syncStateWithInterface() in QNetworkSession
+ * constructor.
+ */
+uint IcdPrivate::state(QList<IcdStateResult>& state_results)
+{
+ QVariant reply;
+ QVariantList vl;
+ uint signals_left, total_signals;
+ IcdStateResult result;
+ time_t started;
+ int timeout_secs = timeout / 1000;
+
+ PDEBUG("%s\n", "state_results");
+
+ clearState();
+ reply = mDBus->call(ICD_DBUS_API_STATE_REQ);
+ if (reply.type() != QVariant::List)
+ return 0;
+ vl = reply.toList();
+ if (vl.isEmpty())
+ return 0;
+ reply = vl.first();
+ signals_left = total_signals = reply.toUInt();
+ if (!signals_left)
+ return 0;
+
+ started = time(0);
+ state_results.clear();
+ mError.clear();
+ while (signals_left) {
+ mInterface.clear();
+ while ((time(0)<=(started+timeout_secs)) && mInterface.isEmpty()) {
+ mDBus->synchronousDispatch(1000);
+ QCoreApplication::sendPostedEvents(icd, QEvent::MetaCall);
+ }
+
+ if (time(0)>(started+timeout_secs)) {
+ total_signals = 0;
+ break;
+ }
+
+ if (mSignal != ICD_DBUS_API_STATE_SIG) {
+ continue;
+ }
+
+ if (mError.isEmpty()) {
+ if (!mArgs.isEmpty()) {
+ if (mArgs.size()==2)
+ get_state_all_result2(mArgs, result);
+ else
+ get_state_all_result(mArgs, result);
+ state_results << result;
+ }
+ signals_left--;
+ } else {
+ qWarning() << "Error:" << mError;
+ break;
+ }
+ }
+
+ PDEBUG("total_signals=%d\n", total_signals);
+ return total_signals;
+}
+
+
+static void get_statistics_all_result(QList<QVariant>& args,
+ IcdStatisticsResult& ret)
+{
+ int i=0;
+
+ if (args.isEmpty())
+ return;
+
+ ret.params.service_type = args[i++].toString();
+ ret.params.service_attrs = args[i++].toUInt();
+ ret.params.service_id = args[i++].toString();
+ ret.params.network_type = args[i++].toString();
+ ret.params.network_attrs = args[i++].toUInt();
+ ret.params.network_id = args[i++].toByteArray();
+ ret.time_active = args[i++].toUInt();
+ ret.signal_strength = (enum icd_nw_levels)args[i++].toUInt();
+ ret.bytes_sent = args[i++].toUInt();
+ ret.bytes_received = args[i++].toUInt();
+}
+
+
+uint IcdPrivate::statistics(QList<IcdStatisticsResult>& stats_results)
+{
+ QTimer timer;
+ QVariant reply;
+ QVariantList vl;
+ uint signals_left, total_signals;
+ IcdStatisticsResult result;
+
+ clearState();
+ reply = mDBus->call(ICD_DBUS_API_STATISTICS_REQ);
+ if (reply.type() != QVariant::List)
+ return 0;
+ vl = reply.toList();
+ if (vl.isEmpty())
+ return 0;
+ reply = vl.first();
+ if (reply.type() != QVariant::UInt)
+ return 0;
+ signals_left = total_signals = reply.toUInt();
+
+ if (!signals_left)
+ return 0;
+
+ timer.setSingleShot(true);
+ timer.start(timeout);
+ stats_results.clear();
+ while (signals_left) {
+ mInterface.clear();
+ while (timer.isActive() && mInterface.isEmpty()) {
+ QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
+ }
+
+ if (!timer.isActive()) {
+ total_signals = 0;
+ break;
+ }
+
+ if (mSignal != ICD_DBUS_API_STATISTICS_SIG) {
+ continue;
+ }
+
+ if (mError.isEmpty()) {
+ get_statistics_all_result(mArgs, result);
+ stats_results << result;
+ signals_left--;
+ } else {
+ qWarning() << "Error:" << mError;
+ break;
+ }
+ }
+ timer.stop();
+
+ return total_signals;
+}
+
+
+static void get_addrinfo_all_result(QList<QVariant>& args,
+ IcdAddressInfoResult& ret)
+{
+ int i=0;
+
+ if (args.isEmpty())
+ return;
+
+ ret.params.service_type = args[i++].toString();
+ ret.params.service_attrs = args[i++].toUInt();
+ ret.params.service_id = args[i++].toString();
+ ret.params.network_type = args[i++].toString();
+ ret.params.network_attrs = args[i++].toUInt();
+ ret.params.network_id = args[i++].toByteArray();
+
+ QVariantList vl = args[i].toList();
+ QVariant reply = vl.first();
+ QList<QVariant> lst = reply.toList();
+ for (int k=0; k<lst.size()/6; k=k+6) {
+ IcdIPInformation ip_info;
+ ip_info.address = lst[k].toString();
+ ip_info.netmask = lst[k++].toString();
+ ip_info.default_gateway = lst[k++].toString();
+ ip_info.dns1 = lst[k++].toString();
+ ip_info.dns2 = lst[k++].toString();
+ ip_info.dns3 = lst[k++].toString();
+
+ ret.ip_info << ip_info;
+ }
+}
+
+
+/* Special version of the addrinfo() call which does not call event loop.
+ * Needed in order to fix NB#175098 where Qt4.7 webkit crashes because event
+ * loop is run when webkit does not expect it. This function is called from
+ * bearer management API syncStateWithInterface() in QNetworkSession
+ * constructor.
+ */
+uint IcdPrivate::addrinfo(QList<IcdAddressInfoResult>& addr_results)
+{
+ QVariant reply;
+ QVariantList vl;
+ uint signals_left, total_signals;
+ IcdAddressInfoResult result;
+ time_t started;
+ int timeout_secs = timeout / 1000;
+
+ PDEBUG("%s\n", "addr_results");
+
+ clearState();
+ reply = mDBus->call(ICD_DBUS_API_ADDRINFO_REQ);
+ if (reply.type() != QVariant::List)
+ return 0;
+ vl = reply.toList();
+ if (vl.isEmpty())
+ return 0;
+ reply = vl.first();
+ if (reply.type() != QVariant::UInt)
+ return 0;
+ signals_left = total_signals = reply.toUInt();
+ if (!signals_left)
+ return 0;
+
+ started = time(0);
+ addr_results.clear();
+ while (signals_left) {
+ mInterface.clear();
+ while ((time(0)<=(started+timeout_secs)) && mInterface.isEmpty()) {
+ mDBus->synchronousDispatch(1000);
+ QCoreApplication::sendPostedEvents(icd, QEvent::MetaCall);
+ }
+
+ if (time(0)>(started+timeout_secs)) {
+ total_signals = 0;
+ break;
+ }
+
+ if (mSignal != ICD_DBUS_API_ADDRINFO_SIG) {
+ continue;
+ }
+
+ if (mError.isEmpty()) {
+ get_addrinfo_all_result(mArgs, result);
+ addr_results << result;
+ signals_left--;
+ } else {
+ qWarning() << "Error:" << mError;
+ break;
+ }
+ }
+
+ PDEBUG("total_signals=%d\n", total_signals);
+ return total_signals;
+}
+
+
+uint IcdPrivate::addrinfo(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdAddressInfoResult& addr_result)
+{
+ QTimer timer;
+ QVariant reply;
+ uint total_signals;
+ QVariantList vl;
+
+ clearState();
+
+ reply = mDBus->call(ICD_DBUS_API_ADDRINFO_REQ,
+ service_type, service_attrs, service_id,
+ network_type, network_attrs, network_id);
+ if (reply.type() != QVariant::List)
+ return 0;
+ vl = reply.toList();
+ if (vl.isEmpty())
+ return 0;
+ reply = vl.first();
+ total_signals = reply.toUInt();
+
+ if (!total_signals)
+ return 0;
+
+ timer.setSingleShot(true);
+ timer.start(timeout);
+
+ mInterface.clear();
+ while (timer.isActive() && mInterface.isEmpty()) {
+ QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
+
+ if (mSignal != ICD_DBUS_API_ADDRINFO_SIG) {
+ mInterface.clear();
+ continue;
+ }
+ }
+
+ timer.stop();
+
+ if (mError.isEmpty()) {
+ get_addrinfo_all_result(mArgs, addr_result);
+ } else {
+ qWarning() << "Error:" << mError;
+ }
+
+ // The returned value should be one because we asked for one addrinfo
+ return total_signals;
+}
+
+
+Icd::Icd(QObject *parent)
+ : QObject(parent), d(new IcdPrivate(this))
+{
+}
+
+Icd::Icd(unsigned int timeout, QObject *parent)
+ : QObject(parent), d(new IcdPrivate(timeout, this))
+{
+}
+
+Icd::Icd(unsigned int timeout, IcdDbusInterfaceVer ver, QObject *parent)
+ : QObject(parent), d(new IcdPrivate(timeout, ver, this))
+{
+}
+
+Icd::~Icd()
+{
+ delete d;
+}
+
+
+QStringList Icd::scan(icd_scan_request_flags flags,
+ QStringList &network_types,
+ QList<IcdScanResult>& scan_results,
+ QString& error)
+{
+ return d->scan(flags, network_types, scan_results, error);
+}
+
+
+uint Icd::state(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdStateResult &state_result)
+{
+ return d->state(service_type, service_attrs, service_id,
+ network_type, network_attrs, network_id,
+ state_result);
+}
+
+
+uint Icd::addrinfo(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdAddressInfoResult& addr_result)
+{
+ return d->addrinfo(service_type, service_attrs, service_id,
+ network_type, network_attrs, network_id,
+ addr_result);
+}
+
+
+uint Icd::state(QList<IcdStateResult>& state_results)
+{
+ return d->state(state_results);
+}
+
+
+uint Icd::statistics(QList<IcdStatisticsResult>& stats_results)
+{
+ return d->statistics(stats_results);
+}
+
+
+uint Icd::addrinfo(QList<IcdAddressInfoResult>& addr_results)
+{
+ return d->addrinfo(addr_results);
+}
+
+
+void Icd::icdSignalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args)
+{
+ d->signalReceived(interface, signal, args);
+}
+
+
+void Icd::icdCallReply(const QString& method,
+ const QList<QVariant>& args,
+ const QString& error)
+{
+ d->callReply(method, args, error);
+}
+
+} // Maemo namespace
+
+
diff --git a/src/plugins/bearer/icd/maemo_icd.h b/src/plugins/bearer/icd/maemo_icd.h
new file mode 100644
index 0000000000..5656688bd7
--- /dev/null
+++ b/src/plugins/bearer/icd/maemo_icd.h
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef MAEMO_ICD_H
+#define MAEMO_ICD_H
+
+#include <QObject>
+#include <QStringList>
+#include <QByteArray>
+#include <QMetaType>
+#include <QtDBus>
+#include <QDBusArgument>
+
+#include <glib.h>
+#include <icd/dbus_api.h>
+#include <icd/osso-ic.h>
+#include <icd/osso-ic-dbus.h>
+#include <icd/network_api_defines.h>
+
+#define ICD_LONG_SCAN_TIMEOUT (30*1000) /* 30sec */
+#define ICD_SHORT_SCAN_TIMEOUT (10*1000) /* 10sec */
+#define ICD_SHORT_CONNECT_TIMEOUT (10*1000) /* 10sec */
+#define ICD_LONG_CONNECT_TIMEOUT (150*1000) /* 2.5min */
+
+namespace Maemo {
+
+struct CommonParams {
+ QString service_type;
+ uint service_attrs;
+ QString service_id;
+ QString network_type;
+ uint network_attrs;
+ QByteArray network_id;
+};
+
+struct IcdScanResult {
+ uint status; // see #icd_scan_status
+ uint timestamp; // when last seen
+ QString service_name;
+ uint service_priority; // within a service type
+ QString network_name;
+ uint network_priority;
+ struct CommonParams scan;
+ uint signal_strength; // quality, 0 (none) - 10 (good)
+ QString station_id; // e.g. MAC address or similar id
+ uint signal_dB; // use signal strength above unless you know what you are doing
+
+ IcdScanResult() {
+ status = timestamp = scan.service_attrs = service_priority =
+ scan.network_attrs = network_priority = signal_strength =
+ signal_dB = 0;
+ }
+};
+
+struct IcdStateResult {
+ struct CommonParams params;
+ QString error;
+ uint state;
+};
+
+struct IcdStatisticsResult {
+ struct CommonParams params;
+ uint time_active; // in seconds
+ enum icd_nw_levels signal_strength; // see network_api_defines.h in icd2-dev package
+ uint bytes_sent;
+ uint bytes_received;
+};
+
+struct IcdIPInformation {
+ QString address;
+ QString netmask;
+ QString default_gateway;
+ QString dns1;
+ QString dns2;
+ QString dns3;
+};
+
+struct IcdAddressInfoResult {
+ struct CommonParams params;
+ QList<IcdIPInformation> ip_info;
+};
+
+enum IcdDbusInterfaceVer {
+ IcdOldDbusInterface = 0, // use the old OSSO-IC interface
+ IcdNewDbusInterface // use the new Icd2 interface (default)
+};
+
+
+class IcdPrivate;
+class Icd : public QObject
+{
+ Q_OBJECT
+
+public:
+ Icd(QObject *parent = 0);
+ Icd(unsigned int timeout, QObject *parent = 0);
+ Icd(unsigned int timeout, IcdDbusInterfaceVer ver, QObject *parent = 0);
+ ~Icd();
+
+ /* Icd2 dbus API functions */
+ QStringList scan(icd_scan_request_flags flags,
+ QStringList &network_types,
+ QList<IcdScanResult>& scan_results,
+ QString& error);
+
+ uint state(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdStateResult &state_result);
+
+ uint addrinfo(QString& service_type, uint service_attrs,
+ QString& service_id, QString& network_type,
+ uint network_attrs, QByteArray& network_id,
+ IcdAddressInfoResult& addr_result);
+
+ uint state(QList<IcdStateResult>& state_results);
+ uint statistics(QList<IcdStatisticsResult>& stats_results);
+ uint addrinfo(QList<IcdAddressInfoResult>& addr_results);
+
+private Q_SLOTS:
+ void icdSignalReceived(const QString& interface,
+ const QString& signal,
+ const QList<QVariant>& args);
+ void icdCallReply(const QString& method,
+ const QList<QVariant>& args,
+ const QString& error);
+
+private:
+ IcdPrivate *d;
+ friend class IcdPrivate;
+};
+
+} // Maemo namespace
+
+#endif
diff --git a/src/plugins/bearer/icd/main.cpp b/src/plugins/bearer/icd/main.cpp
new file mode 100644
index 0000000000..6fb560aefa
--- /dev/null
+++ b/src/plugins/bearer/icd/main.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qicdengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QIcdEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QIcdEnginePlugin();
+ ~QIcdEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QIcdEnginePlugin::QIcdEnginePlugin()
+{
+}
+
+QIcdEnginePlugin::~QIcdEnginePlugin()
+{
+}
+
+QStringList QIcdEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("icd");
+}
+
+QBearerEngine *QIcdEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("icd"))
+ return new QIcdEngine;
+ else
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QIcdEnginePlugin)
+Q_EXPORT_PLUGIN2(qicdbearer, QIcdEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/bearer/icd/proxyconf.cpp b/src/plugins/bearer/icd/proxyconf.cpp
new file mode 100644
index 0000000000..0479515c63
--- /dev/null
+++ b/src/plugins/bearer/icd/proxyconf.cpp
@@ -0,0 +1,422 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QVariant>
+#include <QStringList>
+#include <QDebug>
+#include <QWriteLocker>
+#include <QNetworkProxyFactory>
+#include <QNetworkProxy>
+#include <gconf/gconf-value.h>
+#include <gconf/gconf-client.h>
+#include "proxyconf.h"
+
+#define CONF_PROXY "/system/proxy"
+#define HTTP_PROXY "/system/http_proxy"
+
+
+namespace Maemo {
+
+static QString convertKey(const char *key)
+{
+ return QString::fromUtf8(key);
+}
+
+static QVariant convertValue(GConfValue *src)
+{
+ if (!src) {
+ return QVariant();
+ } else {
+ switch (src->type) {
+ case GCONF_VALUE_INVALID:
+ return QVariant(QVariant::Invalid);
+ case GCONF_VALUE_BOOL:
+ return QVariant((bool)gconf_value_get_bool(src));
+ case GCONF_VALUE_INT:
+ return QVariant(gconf_value_get_int(src));
+ case GCONF_VALUE_FLOAT:
+ return QVariant(gconf_value_get_float(src));
+ case GCONF_VALUE_STRING:
+ return QVariant(QString::fromUtf8(gconf_value_get_string(src)));
+ case GCONF_VALUE_LIST:
+ switch (gconf_value_get_list_type(src)) {
+ case GCONF_VALUE_STRING:
+ {
+ QStringList result;
+ for (GSList *elts = gconf_value_get_list(src); elts; elts = elts->next)
+ result.append(QString::fromUtf8(gconf_value_get_string((GConfValue *)elts->data)));
+ return QVariant(result);
+ }
+ default:
+ {
+ QList<QVariant> result;
+ for (GSList *elts = gconf_value_get_list(src); elts; elts = elts->next)
+ result.append(convertValue((GConfValue *)elts->data));
+ return QVariant(result);
+ }
+ }
+ case GCONF_VALUE_SCHEMA:
+ default:
+ return QVariant();
+ }
+ }
+}
+
+
+/* Fast version of GConfItem, allows reading subtree at a time */
+class GConfItemFast {
+public:
+ GConfItemFast(const QString &k) : key(k) {}
+ QHash<QString,QVariant> getEntries() const;
+
+private:
+ QString key;
+};
+
+#define withClient(c) for (GConfClient *c = gconf_client_get_default(); c; c=0)
+
+
+QHash<QString,QVariant> GConfItemFast::getEntries() const
+{
+ QHash<QString,QVariant> children;
+
+ withClient(client) {
+ QByteArray k = key.toUtf8();
+ GSList *entries = gconf_client_all_entries(client, k.data(), NULL);
+ for (GSList *e = entries; e; e = e->next) {
+ char *key_name = strrchr(((GConfEntry *)e->data)->key, '/');
+ if (!key_name)
+ key_name = ((GConfEntry *)e->data)->key;
+ else
+ key_name++;
+ QString key(convertKey(key_name));
+ QVariant value = convertValue(((GConfEntry *)e->data)->value);
+ gconf_entry_unref((GConfEntry *)e->data);
+ //qDebug()<<"key="<<key<<"value="<<value;
+ children.insert(key, value);
+ }
+ g_slist_free (entries);
+ }
+
+ return children;
+}
+
+
+
+class NetworkProxyFactory : QNetworkProxyFactory
+{
+ ProxyConf proxy_conf;
+ bool proxy_data_read;
+
+public:
+ NetworkProxyFactory() : proxy_data_read(false) { }
+ QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query = QNetworkProxyQuery());
+};
+
+
+QList<QNetworkProxy> NetworkProxyFactory::queryProxy(const QNetworkProxyQuery &query)
+{
+ if (proxy_data_read == false) {
+ proxy_data_read = true;
+ proxy_conf.readProxyData();
+ }
+
+ QList<QNetworkProxy> result = proxy_conf.flush(query);
+ if (result.isEmpty())
+ result << QNetworkProxy::NoProxy;
+
+ return result;
+}
+
+
+class ProxyConfPrivate {
+private:
+ // proxy values from gconf
+ QString mode;
+ bool use_http_host;
+ QString autoconfig_url;
+ QString http_proxy;
+ quint16 http_port;
+ QList<QVariant> ignore_hosts;
+ QString secure_host;
+ quint16 secure_port;
+ QString ftp_host;
+ quint16 ftp_port;
+ QString socks_host;
+ quint16 socks_port;
+ QString rtsp_host;
+ quint16 rtsp_port;
+
+ bool isHostExcluded(const QString &host);
+
+public:
+ QString prefix;
+ QString http_prefix;
+
+ void readProxyData();
+ QList<QNetworkProxy> flush(const QNetworkProxyQuery &query);
+};
+
+
+static QHash<QString,QVariant> getValues(const QString& prefix)
+{
+ GConfItemFast item(prefix);
+ return item.getEntries();
+}
+
+static QHash<QString,QVariant> getHttpValues(const QString& prefix)
+{
+ GConfItemFast item(prefix);
+ return item.getEntries();
+}
+
+#define GET(var, type) \
+ do { \
+ QVariant v = values.value(#var); \
+ if (v.isValid()) \
+ var = v.to##type (); \
+ } while(0)
+
+#define GET_HTTP(var, name, type) \
+ do { \
+ QVariant v = httpValues.value(#name); \
+ if (v.isValid()) \
+ var = v.to##type (); \
+ } while(0)
+
+
+void ProxyConfPrivate::readProxyData()
+{
+ QHash<QString,QVariant> values = getValues(prefix);
+ QHash<QString,QVariant> httpValues = getHttpValues(http_prefix);
+
+ //qDebug()<<"values="<<values;
+
+ /* Read the proxy settings from /system/proxy* */
+ GET_HTTP(http_proxy, host, String);
+ GET_HTTP(http_port, port, Int);
+ GET_HTTP(ignore_hosts, ignore_hosts, List);
+
+ GET(mode, String);
+ GET(autoconfig_url, String);
+ GET(secure_host, String);
+ GET(secure_port, Int);
+ GET(ftp_host, String);
+ GET(ftp_port, Int);
+ GET(socks_host, String);
+ GET(socks_port, Int);
+ GET(rtsp_host, String);
+ GET(rtsp_port, Int);
+
+ if (http_proxy.isEmpty())
+ use_http_host = false;
+ else
+ use_http_host = true;
+}
+
+
+bool ProxyConfPrivate::isHostExcluded(const QString &host)
+{
+ if (host.isEmpty())
+ return true;
+
+ if (ignore_hosts.isEmpty())
+ return false;
+
+ QHostAddress ipAddress;
+ bool isIpAddress = ipAddress.setAddress(host);
+
+ foreach (QVariant h, ignore_hosts) {
+ QString entry = h.toString();
+ if (isIpAddress && ipAddress.isInSubnet(QHostAddress::parseSubnet(entry))) {
+ return true; // excluded
+ } else {
+ // do wildcard matching
+ QRegExp rx(entry, Qt::CaseInsensitive, QRegExp::Wildcard);
+ if (rx.exactMatch(host))
+ return true;
+ }
+ }
+
+ // host was not excluded
+ return false;
+}
+
+
+QList<QNetworkProxy> ProxyConfPrivate::flush(const QNetworkProxyQuery &query)
+{
+ QList<QNetworkProxy> result;
+
+#if 0
+ qDebug()<<"http_proxy" << http_proxy;
+ qDebug()<<"http_port" << http_port;
+ qDebug()<<"ignore_hosts" << ignore_hosts;
+ qDebug()<<"use_http_host" << use_http_host;
+ qDebug()<<"mode" << mode;
+ qDebug()<<"autoconfig_url" << autoconfig_url;
+ qDebug()<<"secure_host" << secure_host;
+ qDebug()<<"secure_port" << secure_port;
+ qDebug()<<"ftp_host" << ftp_host;
+ qDebug()<<"ftp_port" << ftp_port;
+ qDebug()<<"socks_host" << socks_host;
+ qDebug()<<"socks_port" << socks_port;
+ qDebug()<<"rtsp_host" << rtsp_host;
+ qDebug()<<"rtsp_port" << rtsp_port;
+#endif
+
+ if (isHostExcluded(query.peerHostName()))
+ return result; // no proxy for this host
+
+ if (mode == QLatin1String("AUTO")) {
+ // TODO: pac currently not supported, fix me
+ return result;
+ }
+
+ if (mode == QLatin1String("MANUAL")) {
+ bool isHttps = false;
+ QString protocol = query.protocolTag().toLower();
+
+ // try the protocol-specific proxy
+ QNetworkProxy protocolSpecificProxy;
+
+ if (protocol == QLatin1String("ftp")) {
+ if (!ftp_host.isEmpty()) {
+ protocolSpecificProxy.setType(QNetworkProxy::FtpCachingProxy);
+ protocolSpecificProxy.setHostName(ftp_host);
+ protocolSpecificProxy.setPort(ftp_port);
+ }
+ } else if (protocol == QLatin1String("http")) {
+ if (!http_proxy.isEmpty()) {
+ protocolSpecificProxy.setType(QNetworkProxy::HttpProxy);
+ protocolSpecificProxy.setHostName(http_proxy);
+ protocolSpecificProxy.setPort(http_port);
+ }
+ } else if (protocol == QLatin1String("https")) {
+ isHttps = true;
+ if (!secure_host.isEmpty()) {
+ protocolSpecificProxy.setType(QNetworkProxy::HttpProxy);
+ protocolSpecificProxy.setHostName(secure_host);
+ protocolSpecificProxy.setPort(secure_port);
+ }
+ }
+
+ if (protocolSpecificProxy.type() != QNetworkProxy::DefaultProxy)
+ result << protocolSpecificProxy;
+
+
+ if (!socks_host.isEmpty()) {
+ QNetworkProxy proxy;
+ proxy.setType(QNetworkProxy::Socks5Proxy);
+ proxy.setHostName(socks_host);
+ proxy.setPort(socks_port);
+ result << proxy;
+ }
+
+
+ // Add the HTTPS proxy if present (and if we haven't added yet)
+ if (!isHttps) {
+ QNetworkProxy https;
+ if (!secure_host.isEmpty()) {
+ https.setType(QNetworkProxy::HttpProxy);
+ https.setHostName(secure_host);
+ https.setPort(secure_port);
+ }
+
+ if (https.type() != QNetworkProxy::DefaultProxy &&
+ https != protocolSpecificProxy)
+ result << https;
+ }
+ }
+
+ return result;
+}
+
+
+ProxyConf::ProxyConf()
+ : d_ptr(new ProxyConfPrivate)
+{
+ g_type_init();
+ d_ptr->prefix = CONF_PROXY;
+ d_ptr->http_prefix = HTTP_PROXY;
+}
+
+ProxyConf::~ProxyConf()
+{
+ delete d_ptr;
+}
+
+void ProxyConf::readProxyData()
+{
+ d_ptr->readProxyData();
+}
+
+QList<QNetworkProxy> ProxyConf::flush(const QNetworkProxyQuery &query)
+{
+ return d_ptr->flush(query);
+}
+
+
+static int refcount = 0;
+static QReadWriteLock lock;
+
+void ProxyConf::update()
+{
+ QWriteLocker locker(&lock);
+ NetworkProxyFactory *factory = new NetworkProxyFactory();
+ QNetworkProxyFactory::setApplicationProxyFactory((QNetworkProxyFactory*)factory);
+ refcount++;
+}
+
+
+void ProxyConf::clear(void)
+{
+ QWriteLocker locker(&lock);
+ refcount--;
+ if (refcount == 0)
+ QNetworkProxyFactory::setApplicationProxyFactory(NULL);
+
+ if (refcount<0)
+ refcount = 0;
+}
+
+
+} // namespace Maemo
diff --git a/src/plugins/bearer/icd/proxyconf.h b/src/plugins/bearer/icd/proxyconf.h
new file mode 100644
index 0000000000..f291af773b
--- /dev/null
+++ b/src/plugins/bearer/icd/proxyconf.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef PROXYCONF_H
+#define PROXYCONF_H
+
+#include <QString>
+#include <QNetworkProxy>
+
+namespace Maemo {
+
+class ProxyConfPrivate;
+class ProxyConf {
+private:
+ ProxyConfPrivate *d_ptr;
+
+public:
+ ProxyConf();
+ virtual ~ProxyConf();
+
+ QList<QNetworkProxy> flush(const QNetworkProxyQuery &query = QNetworkProxyQuery()); // read the proxies from db
+ void readProxyData();
+
+ /* Note that for each update() call there should be corresponding
+ * clear() call because the ProxyConf class implements a reference
+ * counting mechanism. The factory is removed only when there is
+ * no one using the factory any more.
+ */
+ static void update(void); // this builds QNetworkProxy factory
+ static void clear(void); // this removes QNetworkProxy factory
+};
+
+} // namespace Maemo
+
+#endif
diff --git a/src/plugins/bearer/icd/qicdengine.cpp b/src/plugins/bearer/icd/qicdengine.cpp
new file mode 100644
index 0000000000..244bd84a83
--- /dev/null
+++ b/src/plugins/bearer/icd/qicdengine.cpp
@@ -0,0 +1,1126 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qicdengine.h"
+#include "qnetworksession_impl.h"
+
+#include <wlancond.h>
+#include <wlan-utils.h>
+#include <iapconf.h>
+#include <iapmonitor.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+IcdNetworkConfigurationPrivate::IcdNetworkConfigurationPrivate()
+: service_attrs(0), network_attrs(0)
+{
+}
+
+IcdNetworkConfigurationPrivate::~IcdNetworkConfigurationPrivate()
+{
+}
+
+QString IcdNetworkConfigurationPrivate::bearerTypeName() const
+{
+ QMutexLocker locker(&mutex);
+
+ return iap_type;
+}
+
+/******************************************************************************/
+/** IapAddTimer specific */
+/******************************************************************************/
+
+/* The IapAddTimer is a helper class that makes sure we update
+ * the configuration only after all db additions to certain
+ * iap are finished (after a certain timeout)
+ */
+class _IapAddTimer : public QObject
+{
+ Q_OBJECT
+
+public:
+ _IapAddTimer() {}
+ ~_IapAddTimer()
+ {
+ if (timer.isActive()) {
+ QObject::disconnect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
+ timer.stop();
+ }
+ }
+
+ void add(QString& iap_id, QIcdEngine *d);
+
+ QString iap_id;
+ QTimer timer;
+ QIcdEngine *d;
+
+public Q_SLOTS:
+ void timeout();
+};
+
+
+void _IapAddTimer::add(QString& id, QIcdEngine *d_ptr)
+{
+ iap_id = id;
+ d = d_ptr;
+
+ if (timer.isActive()) {
+ QObject::disconnect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
+ timer.stop();
+ }
+ timer.setSingleShot(true);
+ QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
+ timer.start(1500);
+}
+
+
+void _IapAddTimer::timeout()
+{
+ d->addConfiguration(iap_id);
+}
+
+
+class IapAddTimer {
+ QHash<QString, _IapAddTimer* > timers;
+
+public:
+ IapAddTimer() {}
+ ~IapAddTimer() {}
+
+ void add(QString& iap_id, QIcdEngine *d);
+ void del(QString& iap_id);
+ void removeAll();
+};
+
+
+void IapAddTimer::removeAll()
+{
+ QHashIterator<QString, _IapAddTimer* > i(timers);
+ while (i.hasNext()) {
+ i.next();
+ _IapAddTimer *t = i.value();
+ delete t;
+ }
+ timers.clear();
+}
+
+
+void IapAddTimer::add(QString& iap_id, QIcdEngine *d)
+{
+ if (timers.contains(iap_id)) {
+ _IapAddTimer *iap = timers.value(iap_id);
+ iap->add(iap_id, d);
+ } else {
+ _IapAddTimer *iap = new _IapAddTimer;
+ iap->add(iap_id, d);
+ timers.insert(iap_id, iap);
+ }
+}
+
+void IapAddTimer::del(QString& iap_id)
+{
+ if (timers.contains(iap_id)) {
+ _IapAddTimer *iap = timers.take(iap_id);
+ delete iap;
+ }
+}
+
+/******************************************************************************/
+/** IAPMonitor specific */
+/******************************************************************************/
+
+class IapMonitor : public Maemo::IAPMonitor
+{
+public:
+ IapMonitor() : first_call(true) { }
+
+ void setup(QIcdEngine *d);
+ void cleanup();
+
+protected:
+ void iapAdded(const QString &iapId);
+ void iapRemoved(const QString &iapId);
+
+private:
+ bool first_call;
+
+ QIcdEngine *d;
+ IapAddTimer timers;
+};
+
+void IapMonitor::setup(QIcdEngine *d_ptr)
+{
+ if (first_call) {
+ d = d_ptr;
+ first_call = false;
+ }
+}
+
+
+void IapMonitor::cleanup()
+{
+ if (!first_call) {
+ timers.removeAll();
+ first_call = true;
+ }
+}
+
+
+void IapMonitor::iapAdded(const QString &iap_id)
+{
+ /* We cannot know when the IAP is fully added to db, so a timer is
+ * installed instead. When the timer expires we hope that IAP is added ok.
+ */
+ QString id = iap_id;
+ timers.add(id, d);
+}
+
+
+void IapMonitor::iapRemoved(const QString &iap_id)
+{
+ QString id = iap_id;
+ d->deleteConfiguration(id);
+}
+
+
+/******************************************************************************/
+/** QIcdEngine implementation */
+/******************************************************************************/
+
+QIcdEngine::QIcdEngine(QObject *parent)
+: QBearerEngine(parent), iapMonitor(0), m_dbusInterface(0), m_icdServiceWatcher(0),
+ firstUpdate(true), m_scanGoingOn(false)
+{
+}
+
+QIcdEngine::~QIcdEngine()
+{
+ cleanup();
+ delete iapMonitor;
+}
+
+QNetworkConfigurationManager::Capabilities QIcdEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::CanStartAndStopInterfaces |
+ QNetworkConfigurationManager::DataStatistics |
+ QNetworkConfigurationManager::ForcedRoaming |
+ QNetworkConfigurationManager::NetworkSessionRequired;
+}
+
+bool QIcdEngine::ensureDBusConnection()
+{
+ if (m_dbusInterface)
+ return true;
+
+ // Setup DBus Interface for ICD
+ m_dbusInterface = new QDBusInterface(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE,
+ QDBusConnection::systemBus(),
+ this);
+
+ if (!m_dbusInterface->isValid()) {
+ delete m_dbusInterface;
+ m_dbusInterface = 0;
+
+ if (!m_icdServiceWatcher) {
+ m_icdServiceWatcher = new QDBusServiceWatcher(ICD_DBUS_API_INTERFACE,
+ QDBusConnection::systemBus(),
+ QDBusServiceWatcher::WatchForOwnerChange,
+ this);
+
+ connect(m_icdServiceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
+ this, SLOT(icdServiceOwnerChanged(QString,QString,QString)));
+ }
+
+ return false;
+ }
+
+ connect(&m_scanTimer, SIGNAL(timeout()), this, SLOT(finishAsyncConfigurationUpdate()));
+ m_scanTimer.setSingleShot(true);
+
+ /* Turn on IAP state monitoring */
+ startListeningStateSignalsForAllConnections();
+
+ /* Turn on IAP add/remove monitoring */
+ iapMonitor = new IapMonitor;
+ iapMonitor->setup(this);
+
+ /* We create a default configuration which is a pseudo config */
+ QNetworkConfigurationPrivate *cpPriv = new IcdNetworkConfigurationPrivate;
+ cpPriv->name = "UserChoice";
+ cpPriv->state = QNetworkConfiguration::Discovered;
+ cpPriv->isValid = true;
+ cpPriv->id = OSSO_IAP_ANY;
+ cpPriv->type = QNetworkConfiguration::UserChoice;
+ cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
+ cpPriv->roamingSupported = false;
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ userChoiceConfigurations.insert(cpPriv->id, ptr);
+
+ doRequestUpdate();
+
+ getIcdInitialState();
+
+ return true;
+}
+
+void QIcdEngine::initialize()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!ensureDBusConnection()) {
+ locker.unlock();
+ emit updateCompleted();
+ locker.relock();
+ }
+}
+
+static inline QString network_attrs_to_security(uint network_attrs)
+{
+ uint cap = 0;
+ nwattr2cap(network_attrs, &cap); /* from libicd-network-wlan-dev.h */
+ if (cap & WLANCOND_OPEN)
+ return "NONE";
+ else if (cap & WLANCOND_WEP)
+ return "WEP";
+ else if (cap & WLANCOND_WPA_PSK)
+ return "WPA_PSK";
+ else if (cap & WLANCOND_WPA_EAP)
+ return "WPA_EAP";
+ return "";
+}
+
+
+struct SSIDInfo {
+ QString iap_id;
+ QString wlan_security;
+};
+
+
+void QIcdEngine::deleteConfiguration(const QString &iap_id)
+{
+ QMutexLocker locker(&mutex);
+
+ /* Called when IAPs are deleted in db, in this case we do not scan
+ * or read all the IAPs from db because it might take too much power
+ * (multiple applications would need to scan and read all IAPs from db)
+ */
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(iap_id);
+ if (ptr) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "IAP" << iap_id << "was removed from storage.";
+#endif
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ } else {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("IAP: %s, already missing from the known list", iap_id.toAscii().data());
+#endif
+ }
+}
+
+
+static quint32 getNetworkAttrs(bool is_iap_id,
+ const QString &iap_id,
+ const QString &iap_type,
+ QString security_method)
+{
+ guint network_attr = 0;
+ dbus_uint32_t cap = 0;
+
+ if (iap_type == "WLAN_INFRA")
+ cap |= WLANCOND_INFRA;
+ else if (iap_type == "WLAN_ADHOC")
+ cap |= WLANCOND_ADHOC;
+
+ if (security_method.isEmpty() && (cap & (WLANCOND_INFRA | WLANCOND_ADHOC))) {
+ Maemo::IAPConf saved_ap(iap_id);
+ security_method = saved_ap.value("wlan_security").toString();
+ }
+
+ if (!security_method.isEmpty()) {
+ if (security_method == "WEP")
+ cap |= WLANCOND_WEP;
+ else if (security_method == "WPA_PSK")
+ cap |= WLANCOND_WPA_PSK;
+ else if (security_method == "WPA_EAP")
+ cap |= WLANCOND_WPA_EAP;
+ else if (security_method == "NONE")
+ cap |= WLANCOND_OPEN;
+
+ if (cap & (WLANCOND_WPA_PSK | WLANCOND_WPA_EAP)) {
+ Maemo::IAPConf saved_iap(iap_id);
+ bool wpa2_only = saved_iap.value("EAP_wpa2_only_mode").toBool();
+ if (wpa2_only) {
+ cap |= WLANCOND_WPA2;
+ }
+ }
+ }
+
+ cap2nwattr(cap, &network_attr);
+ if (is_iap_id)
+ network_attr |= ICD_NW_ATTR_IAPNAME;
+
+ return quint32(network_attr);
+}
+
+
+void QIcdEngine::addConfiguration(QString& iap_id)
+{
+ // Note: When new IAP is created, this function gets called multiple times
+ // in a row.
+ // For example: Empty type & name for WLAN was stored into newly
+ // created IAP data in gconf when this function gets
+ // called for the first time.
+ // WLAN type & name are updated into IAP data in gconf
+ // as soon as WLAN connection is up and running.
+ // => And this function gets called again.
+
+ QMutexLocker locker(&mutex);
+
+ if (!accessPointConfigurations.contains(iap_id)) {
+ Maemo::IAPConf saved_iap(iap_id);
+ QString iap_type = saved_iap.value("type").toString();
+ QString iap_name = saved_iap.value("name").toString();
+ QByteArray ssid = saved_iap.value("wlan_ssid").toByteArray();
+ if (!iap_type.isEmpty() && !iap_name.isEmpty()) {
+ // Check if new IAP is actually Undefined WLAN configuration
+ // Note: SSID is used as an iap id for Undefined WLAN configurations
+ // => configuration must be searched using SSID
+ if (!ssid.isEmpty() && accessPointConfigurations.contains(ssid)) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(ssid);
+ if (ptr) {
+ ptr->mutex.lock();
+ ptr->id = iap_id;
+ toIcdConfig(ptr)->iap_type = iap_type;
+ ptr->bearerType = bearerTypeFromIapType(iap_type);
+ toIcdConfig(ptr)->network_attrs = getNetworkAttrs(true, iap_id, iap_type, QString());
+ toIcdConfig(ptr)->network_id = ssid;
+ toIcdConfig(ptr)->service_id = saved_iap.value("service_id").toString();
+ toIcdConfig(ptr)->service_type = saved_iap.value("service_type").toString();
+ if (m_onlineIapId == iap_id) {
+ ptr->state = QNetworkConfiguration::Active;
+ } else {
+ ptr->state = QNetworkConfiguration::Defined;
+ }
+ ptr->mutex.unlock();
+ accessPointConfigurations.insert(iap_id, ptr);
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+ } else {
+ IcdNetworkConfigurationPrivate *cpPriv = new IcdNetworkConfigurationPrivate;
+ cpPriv->name = saved_iap.value("name").toString();
+ if (cpPriv->name.isEmpty())
+ cpPriv->name = iap_id;
+ cpPriv->isValid = true;
+ cpPriv->id = iap_id;
+ cpPriv->iap_type = iap_type;
+ cpPriv->bearerType = bearerTypeFromIapType(iap_type);
+ cpPriv->network_attrs = getNetworkAttrs(true, iap_id, iap_type, QString());
+ cpPriv->service_id = saved_iap.value("service_id").toString();
+ cpPriv->service_type = saved_iap.value("service_type").toString();
+ if (iap_type.startsWith(QLatin1String("WLAN"))) {
+ QByteArray ssid = saved_iap.value("wlan_ssid").toByteArray();
+ if (ssid.isEmpty()) {
+ qWarning() << "Cannot get ssid for" << iap_id;
+ }
+ cpPriv->network_id = ssid;
+ }
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+ if (m_onlineIapId == iap_id) {
+ cpPriv->state = QNetworkConfiguration::Active;
+ } else {
+ cpPriv->state = QNetworkConfiguration::Defined;
+ }
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(iap_id, ptr);
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("IAP: %s, name: %s, added to known list", iap_id.toAscii().data(), cpPriv->name.toAscii().data());
+#endif
+ locker.unlock();
+ emit configurationAdded(ptr);
+ locker.relock();
+ }
+ } else {
+ qWarning("IAP %s does not have \"type\" or \"name\" fields defined, skipping this IAP.", iap_id.toAscii().data());
+ }
+ } else {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "IAP" << iap_id << "already in db.";
+#endif
+
+ /* Check if the data in db changed and update configuration accordingly
+ */
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iap_id);
+ if (ptr) {
+ Maemo::IAPConf changed_iap(iap_id);
+ QString iap_type = changed_iap.value("type").toString();
+ bool update_needed = false; /* if IAP type or ssid changed, we need to change the state */
+
+ QMutexLocker configLocker(&ptr->mutex);
+
+ toIcdConfig(ptr)->network_attrs = getNetworkAttrs(true, iap_id, iap_type, QString());
+ toIcdConfig(ptr)->service_id = changed_iap.value("service_id").toString();
+ toIcdConfig(ptr)->service_type = changed_iap.value("service_type").toString();
+
+ if (!iap_type.isEmpty()) {
+ ptr->name = changed_iap.value("name").toString();
+ if (ptr->name.isEmpty())
+ ptr->name = iap_id;
+ ptr->isValid = true;
+ if (toIcdConfig(ptr)->iap_type != iap_type) {
+ toIcdConfig(ptr)->iap_type = iap_type;
+ ptr->bearerType = bearerTypeFromIapType(iap_type);
+ update_needed = true;
+ }
+ if (iap_type.startsWith(QLatin1String("WLAN"))) {
+ QByteArray ssid = changed_iap.value("wlan_ssid").toByteArray();
+ if (ssid.isEmpty()) {
+ qWarning() << "Cannot get ssid for" << iap_id;
+ }
+ if (toIcdConfig(ptr)->network_id != ssid) {
+ toIcdConfig(ptr)->network_id = ssid;
+ update_needed = true;
+ }
+ }
+ }
+
+ if (update_needed) {
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ if (m_onlineIapId == iap_id) {
+ if (ptr->state < QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Active;
+
+ configLocker.unlock();
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+ } else if (ptr->state < QNetworkConfiguration::Defined) {
+ ptr->state = QNetworkConfiguration::Defined;
+
+ configLocker.unlock();
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+ }
+ } else {
+ qWarning("Cannot find IAP %s from current configuration although it should be there.", iap_id.toAscii().data());
+ }
+ }
+}
+
+void QIcdEngine::doRequestUpdate(QList<Maemo::IcdScanResult> scanned)
+{
+ /* Contains all known iap_ids from storage */
+ QList<QString> knownConfigs = accessPointConfigurations.keys();
+
+ /* Contains all known WLAN network ids (like ssid) from storage */
+ QMultiHash<QByteArray, SSIDInfo* > notDiscoveredWLANConfigs;
+
+ QList<QString> all_iaps;
+ Maemo::IAPConf::getAll(all_iaps);
+
+ foreach (const QString &iap_id, all_iaps) {
+ QByteArray ssid;
+
+ Maemo::IAPConf saved_ap(iap_id);
+ bool is_temporary = saved_ap.value("temporary").toBool();
+ if (is_temporary) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "IAP" << iap_id << "is temporary, skipping it.";
+#endif
+ continue;
+ }
+
+ QString iap_type = saved_ap.value("type").toString();
+ if (iap_type.startsWith(QLatin1String("WLAN"))) {
+ ssid = saved_ap.value("wlan_ssid").toByteArray();
+ if (ssid.isEmpty())
+ continue;
+
+ QString security_method = saved_ap.value("wlan_security").toString();
+ SSIDInfo *info = new SSIDInfo;
+ info->iap_id = iap_id;
+ info->wlan_security = security_method;
+ notDiscoveredWLANConfigs.insert(ssid, info);
+ } else if (iap_type.isEmpty()) {
+ continue;
+ } else {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "IAP" << iap_id << "network type is" << iap_type;
+#endif
+ ssid.clear();
+ }
+
+ if (!accessPointConfigurations.contains(iap_id)) {
+ IcdNetworkConfigurationPrivate *cpPriv = new IcdNetworkConfigurationPrivate;
+
+ cpPriv->name = saved_ap.value("name").toString();
+ if (cpPriv->name.isEmpty()) {
+ if (!ssid.isEmpty() && ssid.size() > 0)
+ cpPriv->name = ssid.data();
+ else
+ cpPriv->name = iap_id;
+ }
+ cpPriv->isValid = true;
+ cpPriv->id = iap_id;
+ cpPriv->network_id = ssid;
+ cpPriv->network_attrs = getNetworkAttrs(true, iap_id, iap_type, QString());
+ cpPriv->iap_type = iap_type;
+ cpPriv->bearerType = bearerTypeFromIapType(iap_type);
+ cpPriv->service_id = saved_ap.value("service_id").toString();
+ cpPriv->service_type = saved_ap.value("service_type").toString();
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+ cpPriv->state = QNetworkConfiguration::Defined;
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(iap_id, ptr);
+
+ mutex.unlock();
+ emit configurationAdded(ptr);
+ mutex.lock();
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("IAP: %s, name: %s, ssid: %s, added to known list",
+ iap_id.toAscii().data(), ptr->name.toAscii().data(),
+ !ssid.isEmpty() ? ssid.data() : "-");
+#endif
+ } else {
+ knownConfigs.removeOne(iap_id);
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("IAP: %s, ssid: %s, already exists in the known list",
+ iap_id.toAscii().data(), !ssid.isEmpty() ? ssid.data() : "-");
+#endif
+ }
+ }
+
+ /* This is skipped in the first update as scanned size is zero */
+ if (!scanned.isEmpty()) {
+ for (int i=0; i<scanned.size(); ++i) {
+ const Maemo::IcdScanResult ap = scanned.at(i);
+
+ if (ap.scan.network_attrs & ICD_NW_ATTR_IAPNAME) {
+ /* The network_id is IAP id, so the IAP is a known one */
+ QString iapid = ap.scan.network_id.data();
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iapid);
+ if (ptr) {
+ bool changed = false;
+
+ ptr->mutex.lock();
+
+ if (!ptr->isValid) {
+ ptr->isValid = true;
+ changed = true;
+ }
+
+ /* If this config is the current active one, we do not set it
+ * to discovered.
+ */
+ if ((ptr->state != QNetworkConfiguration::Discovered) &&
+ (ptr->state != QNetworkConfiguration::Active)) {
+ ptr->state = QNetworkConfiguration::Discovered;
+ changed = true;
+ }
+
+ toIcdConfig(ptr)->network_attrs = ap.scan.network_attrs;
+ toIcdConfig(ptr)->service_id = ap.scan.service_id;
+ toIcdConfig(ptr)->service_type = ap.scan.service_type;
+ toIcdConfig(ptr)->service_attrs = ap.scan.service_attrs;
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("IAP: %s, ssid: %s, discovered",
+ iapid.toAscii().data(), toIcdConfig(ptr)->network_id.data());
+#endif
+
+ ptr->mutex.unlock();
+
+ if (changed) {
+ mutex.unlock();
+ emit configurationChanged(ptr);
+ mutex.lock();
+ }
+
+ if (!ap.scan.network_type.startsWith(QLatin1String("WLAN")))
+ continue; // not a wlan AP
+
+ /* Remove scanned AP from discovered WLAN configurations so that we can
+ * emit configurationRemoved signal later
+ */
+ ptr->mutex.lock();
+ QList<SSIDInfo* > known_iaps = notDiscoveredWLANConfigs.values(toIcdConfig(ptr)->network_id);
+rescan_list:
+ if (!known_iaps.isEmpty()) {
+ for (int k=0; k<known_iaps.size(); ++k) {
+ SSIDInfo *iap = known_iaps.at(k);
+
+ if (iap->wlan_security ==
+ network_attrs_to_security(ap.scan.network_attrs)) {
+ /* Remove IAP from the list */
+ notDiscoveredWLANConfigs.remove(toIcdConfig(ptr)->network_id, iap);
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "Removed IAP" << iap->iap_id << "from unknown config";
+#endif
+ known_iaps.removeAt(k);
+ delete iap;
+ goto rescan_list;
+ }
+ }
+ }
+ ptr->mutex.unlock();
+ }
+ } else {
+ /* Non saved access point data */
+ QByteArray scanned_ssid = ap.scan.network_id;
+ if (!accessPointConfigurations.contains(scanned_ssid)) {
+ IcdNetworkConfigurationPrivate *cpPriv = new IcdNetworkConfigurationPrivate;
+ QString hrs = scanned_ssid.data();
+
+ cpPriv->name = ap.network_name.isEmpty() ? hrs : ap.network_name;
+ cpPriv->isValid = true;
+ cpPriv->id = scanned_ssid.data(); // Note: id is now ssid, it should be set to IAP id if the IAP is saved
+ cpPriv->network_id = scanned_ssid;
+ cpPriv->iap_type = ap.scan.network_type;
+ cpPriv->bearerType = bearerTypeFromIapType(cpPriv->iap_type);
+ cpPriv->network_attrs = ap.scan.network_attrs;
+ cpPriv->service_id = ap.scan.service_id;
+ cpPriv->service_type = ap.scan.service_type;
+ cpPriv->service_attrs = ap.scan.service_attrs;
+
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+ cpPriv->state = QNetworkConfiguration::Undefined;
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "IAP with network id" << cpPriv->id << "was found in the scan.";
+#endif
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ mutex.unlock();
+ emit configurationAdded(ptr);
+ mutex.lock();
+ } else {
+ knownConfigs.removeOne(scanned_ssid);
+ }
+ }
+ }
+ }
+
+ if (!firstUpdate) {
+ // Update Defined status to all defined WLAN IAPs which
+ // could not be found when access points were scanned
+ QHashIterator<QByteArray, SSIDInfo* > i(notDiscoveredWLANConfigs);
+ while (i.hasNext()) {
+ i.next();
+ SSIDInfo *iap = i.value();
+ QString iap_id = iap->iap_id;
+ //qDebug() << i.key() << ": " << iap_id;
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iap_id);
+ if (ptr) {
+ QMutexLocker configLocker(&ptr->mutex);
+
+ // WLAN AccessPoint configuration could not be Discovered
+ // => Make sure that configuration state is Defined
+ if (ptr->state > QNetworkConfiguration::Defined) {
+ ptr->state = QNetworkConfiguration::Defined;
+
+ configLocker.unlock();
+ mutex.unlock();
+ emit configurationChanged(ptr);
+ mutex.lock();
+ }
+ }
+ }
+
+ /* Remove non existing iaps since last update */
+ foreach (const QString &oldIface, knownConfigs) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(oldIface);
+ if (ptr) {
+ mutex.unlock();
+ emit configurationRemoved(ptr);
+ mutex.lock();
+ //if we would have SNAP support we would have to remove the references
+ //from existing ServiceNetworks to the removed access point configuration
+ }
+ }
+ }
+
+ QMutableHashIterator<QByteArray, SSIDInfo* > i(notDiscoveredWLANConfigs);
+ while (i.hasNext()) {
+ i.next();
+ SSIDInfo *iap = i.value();
+ delete iap;
+ i.remove();
+ }
+
+ if (!firstUpdate) {
+ mutex.unlock();
+ emit updateCompleted();
+ mutex.lock();
+ }
+
+ if (firstUpdate)
+ firstUpdate = false;
+}
+
+QNetworkConfigurationPrivatePointer QIcdEngine::defaultConfiguration()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!ensureDBusConnection())
+ return QNetworkConfigurationPrivatePointer();
+
+ // Here we just return [ANY] request to icd and let the icd decide which IAP to connect.
+ return userChoiceConfigurations.value(OSSO_IAP_ANY);
+}
+
+void QIcdEngine::startListeningStateSignalsForAllConnections()
+{
+ // Start listening ICD_DBUS_API_STATE_SIG signals
+ m_dbusInterface->connection().connect(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_STATE_SIG,
+ this, SLOT(connectionStateSignalsSlot(QDBusMessage)));
+}
+
+void QIcdEngine::getIcdInitialState()
+{
+ /* Instead of requesting ICD status asynchronously, we ask it synchronously.
+ * It ensures that we always get right icd status BEFORE initialize() ends.
+ * If not, initialize() might end before we got icd status and
+ * QNetworkConfigurationManager::updateConfigurations()
+ * call from user might also end before receiving icd status.
+ * In such case, we come up to a bug:
+ * QNetworkConfigurationManagerPrivate::isOnline() will be false even
+ * if we are connected.
+ */
+ Maemo::Icd icd;
+ QList<Maemo::IcdStateResult> state_results;
+ QNetworkConfigurationPrivatePointer ptr;
+
+ if (icd.state(state_results) && !state_results.isEmpty()) {
+
+ if (!(state_results.first().params.network_attrs == 0 &&
+ state_results.first().params.network_id.isEmpty())) {
+
+ switch (state_results.first().state) {
+ case ICD_STATE_CONNECTED:
+ m_onlineIapId = state_results.first().params.network_id;
+
+ ptr = accessPointConfigurations.value(m_onlineIapId);
+ if (ptr) {
+ QMutexLocker configLocker(&ptr->mutex);
+ ptr->state = QNetworkConfiguration::Active;
+ configLocker.unlock();
+
+ mutex.unlock();
+ emit configurationChanged(ptr);
+ mutex.lock();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+void QIcdEngine::connectionStateSignalsSlot(QDBusMessage msg)
+{
+ QMutexLocker locker(&mutex);
+
+ QList<QVariant> arguments = msg.arguments();
+ if (arguments[1].toUInt() != 0 || arguments.count() < 8) {
+ return;
+ }
+
+ QString iapid = arguments[5].toByteArray().data();
+ uint icd_connection_state = arguments[7].toUInt();
+
+ switch (icd_connection_state) {
+ case ICD_STATE_CONNECTED:
+ {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iapid);
+ if (ptr) {
+ QMutexLocker configLocker(&ptr->mutex);
+
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ if (ptr->state != QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Active;
+
+ configLocker.unlock();
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+
+ m_onlineIapId = iapid;
+ }
+ } else {
+ // This gets called when new WLAN IAP is created using Connection dialog
+ // At this point Undefined WLAN configuration has SSID as iap id
+ // => Because of that configuration can not be found from
+ // accessPointConfigurations using correct iap id
+ m_onlineIapId = iapid;
+ }
+ break;
+ }
+ case ICD_STATE_DISCONNECTED:
+ {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iapid);
+ if (ptr) {
+ QMutexLocker configLocker(&ptr->mutex);
+
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ if (ptr->state == QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Discovered;
+
+ configLocker.unlock();
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+
+ // Note: If ICD switches used IAP from one to another:
+ // 1) new IAP is reported to be online first
+ // 2) old IAP is reported to be offline then
+ // => Device can be reported to be offline only
+ // if last known online IAP is reported to be disconnected
+ if (iapid == m_onlineIapId) {
+ // It's known that there is only one global ICD connection
+ // => Because ICD state was reported to be DISCONNECTED, Device is offline
+ m_onlineIapId.clear();
+ }
+ }
+ } else {
+ // Disconnected IAP was not found from accessPointConfigurations
+ // => Reason: Online IAP was removed which resulted ICD to disconnect
+ if (iapid == m_onlineIapId) {
+ // It's known that there is only one global ICD connection
+ // => Because ICD state was reported to be DISCONNECTED, Device is offline
+ m_onlineIapId.clear();
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ locker.unlock();
+ emit iapStateChanged(iapid, icd_connection_state);
+ locker.relock();
+}
+
+void QIcdEngine::icdServiceOwnerChanged(const QString &serviceName, const QString &oldOwner,
+ const QString &newOwner)
+{
+ Q_UNUSED(serviceName);
+ Q_UNUSED(oldOwner);
+
+ QMutexLocker locker(&mutex);
+
+ if (newOwner.isEmpty()) {
+ // Disconnected from ICD, remove all configurations
+ cleanup();
+ delete iapMonitor;
+ iapMonitor = 0;
+ delete m_dbusInterface;
+ m_dbusInterface = 0;
+
+ QMutableHashIterator<QString, QNetworkConfigurationPrivatePointer> i(accessPointConfigurations);
+ while (i.hasNext()) {
+ i.next();
+
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+ i.remove();
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+
+ userChoiceConfigurations.clear();
+ } else {
+ // Connected to ICD ensure connection.
+ ensureDBusConnection();
+ }
+}
+
+void QIcdEngine::requestUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!ensureDBusConnection()) {
+ locker.unlock();
+ emit updateCompleted();
+ locker.relock();
+ return;
+ }
+
+ if (m_scanGoingOn)
+ return;
+
+ m_scanGoingOn = true;
+
+ m_dbusInterface->connection().connect(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_SCAN_SIG,
+ this, SLOT(asyncUpdateConfigurationsSlot(QDBusMessage)));
+
+ QDBusMessage msg = m_dbusInterface->call(ICD_DBUS_API_SCAN_REQ,
+ (uint)ICD_SCAN_REQUEST_ACTIVE);
+ m_typesToBeScanned = msg.arguments()[0].value<QStringList>();
+ m_scanTimer.start(ICD_SHORT_SCAN_TIMEOUT);
+}
+
+void QIcdEngine::cancelAsyncConfigurationUpdate()
+{
+ if (!ensureDBusConnection())
+ return;
+
+ if (!m_scanGoingOn)
+ return;
+
+ m_scanGoingOn = false;
+
+ if (m_scanTimer.isActive())
+ m_scanTimer.stop();
+
+ m_dbusInterface->connection().disconnect(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_SCAN_SIG,
+ this, SLOT(asyncUpdateConfigurationsSlot(QDBusMessage)));
+
+ // Stop scanning rounds by calling ICD_DBUS_API_SCAN_CANCEL
+ // <=> If ICD_DBUS_API_SCAN_CANCEL is not called, new scanning round will
+ // be started after the module scan timeout.
+ m_dbusInterface->call(ICD_DBUS_API_SCAN_CANCEL);
+}
+
+void QIcdEngine::finishAsyncConfigurationUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ cancelAsyncConfigurationUpdate();
+ doRequestUpdate(m_scanResult);
+ m_scanResult.clear();
+}
+
+void QIcdEngine::asyncUpdateConfigurationsSlot(QDBusMessage msg)
+{
+ QMutexLocker locker(&mutex);
+
+ QList<QVariant> arguments = msg.arguments();
+ uint icd_scan_status = arguments.takeFirst().toUInt();
+ if (icd_scan_status == ICD_SCAN_COMPLETE) {
+ m_typesToBeScanned.removeOne(arguments[6].toString());
+ if (!m_typesToBeScanned.count()) {
+ locker.unlock();
+ finishAsyncConfigurationUpdate();
+ locker.relock();
+ }
+ } else {
+ Maemo::IcdScanResult scanResult;
+ scanResult.status = icd_scan_status;
+ scanResult.timestamp = arguments.takeFirst().toUInt();
+ scanResult.scan.service_type = arguments.takeFirst().toString();
+ scanResult.service_name = arguments.takeFirst().toString();
+ scanResult.scan.service_attrs = arguments.takeFirst().toUInt();
+ scanResult.scan.service_id = arguments.takeFirst().toString();
+ scanResult.service_priority = arguments.takeFirst().toInt();
+ scanResult.scan.network_type = arguments.takeFirst().toString();
+ scanResult.network_name = arguments.takeFirst().toString();
+ scanResult.scan.network_attrs = arguments.takeFirst().toUInt();
+ scanResult.scan.network_id = arguments.takeFirst().toByteArray();
+ scanResult.network_priority = arguments.takeFirst().toInt();
+ scanResult.signal_strength = arguments.takeFirst().toInt();
+ scanResult.station_id = arguments.takeFirst().toString();
+ scanResult.signal_dB = arguments.takeFirst().toInt();
+
+ m_scanResult.append(scanResult);
+ }
+}
+
+void QIcdEngine::cleanup()
+{
+ if (m_scanGoingOn) {
+ m_scanTimer.stop();
+ m_dbusInterface->call(ICD_DBUS_API_SCAN_CANCEL);
+ }
+ if (iapMonitor)
+ iapMonitor->cleanup();
+}
+
+bool QIcdEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return accessPointConfigurations.contains(id) ||
+ snapConfigurations.contains(id) ||
+ userChoiceConfigurations.contains(id);
+}
+
+QNetworkSessionPrivate *QIcdEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl(this);
+}
+
+#include "qicdengine.moc"
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/icd/qicdengine.h b/src/plugins/bearer/icd/qicdengine.h
new file mode 100644
index 0000000000..75866ffba0
--- /dev/null
+++ b/src/plugins/bearer/icd/qicdengine.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QICDENGINE_H
+#define QICDENGINE_H
+
+#include <QtNetwork/private/qbearerengine_p.h>
+
+#include <QtCore/qtimer.h>
+
+#include "maemo_icd.h"
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkConfigurationPrivate;
+class IapMonitor;
+class QDBusInterface;
+class QDBusServiceWatcher;
+
+inline QNetworkConfiguration::BearerType bearerTypeFromIapType(const QString &iapType)
+{
+ if (iapType == QLatin1String("WLAN_INFRA") ||
+ iapType == QLatin1String("WLAN_ADHOC")) {
+ return QNetworkConfiguration::BearerWLAN;
+ } else if (iapType == QLatin1String("GPRS")) {
+ return QNetworkConfiguration::BearerHSPA;
+ } else {
+ return QNetworkConfiguration::BearerUnknown;
+ }
+}
+
+class IcdNetworkConfigurationPrivate : public QNetworkConfigurationPrivate
+{
+public:
+ IcdNetworkConfigurationPrivate();
+ ~IcdNetworkConfigurationPrivate();
+
+ virtual QString bearerTypeName() const;
+
+ // In Maemo the id field (defined in QNetworkConfigurationPrivate)
+ // is the IAP id (which typically is UUID)
+ QByteArray network_id; // typically WLAN ssid or similar
+ QString iap_type; // is this one WLAN or GPRS
+
+ QString service_type;
+ QString service_id;
+ quint32 service_attrs;
+
+ // Network attributes for this IAP, this is the value returned by icd and
+ // passed to it when connecting.
+ quint32 network_attrs;
+};
+
+inline IcdNetworkConfigurationPrivate *toIcdConfig(QNetworkConfigurationPrivatePointer ptr)
+{
+ return static_cast<IcdNetworkConfigurationPrivate *>(ptr.data());
+}
+
+class QIcdEngine : public QBearerEngine
+{
+ Q_OBJECT
+
+public:
+ QIcdEngine(QObject *parent = 0);
+ ~QIcdEngine();
+
+ bool hasIdentifier(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+ void deleteConfiguration(const QString &iap_id);
+
+ inline QNetworkConfigurationPrivatePointer configuration(const QString &id)
+ {
+ QMutexLocker locker(&mutex);
+
+ return accessPointConfigurations.value(id);
+ }
+
+ inline void addSessionConfiguration(QNetworkConfigurationPrivatePointer ptr)
+ {
+ QMutexLocker locker(&mutex);
+
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+ }
+
+ inline void changedSessionConfiguration(QNetworkConfigurationPrivatePointer ptr)
+ {
+ emit configurationChanged(ptr);
+ }
+
+ void cleanup();
+
+ void addConfiguration(QString &iap_id);
+
+Q_SIGNALS:
+ void iapStateChanged(const QString& iapid, uint icd_connection_state);
+
+private Q_SLOTS:
+ void finishAsyncConfigurationUpdate();
+ void asyncUpdateConfigurationsSlot(QDBusMessage msg);
+ void connectionStateSignalsSlot(QDBusMessage msg);
+ void icdServiceOwnerChanged(const QString &serviceName, const QString &oldOwner,
+ const QString &newOwner);
+
+private:
+ void startListeningStateSignalsForAllConnections();
+ void doRequestUpdate(QList<Maemo::IcdScanResult> scanned = QList<Maemo::IcdScanResult>());
+ void cancelAsyncConfigurationUpdate();
+ void getIcdInitialState();
+ bool ensureDBusConnection();
+
+private:
+ IapMonitor *iapMonitor;
+ QDBusInterface *m_dbusInterface;
+ QTimer m_scanTimer;
+ QString m_onlineIapId;
+ QStringList m_typesToBeScanned;
+ QList<Maemo::IcdScanResult> m_scanResult;
+
+ QDBusServiceWatcher *m_icdServiceWatcher;
+
+ bool firstUpdate;
+ bool m_scanGoingOn;
+};
+
+QT_END_NAMESPACE
+
+#endif // QICDENGINE_H
diff --git a/src/plugins/bearer/icd/qnetworksession_impl.cpp b/src/plugins/bearer/icd/qnetworksession_impl.cpp
new file mode 100644
index 0000000000..94a6c811c9
--- /dev/null
+++ b/src/plugins/bearer/icd/qnetworksession_impl.cpp
@@ -0,0 +1,1072 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnetworksession_impl.h"
+#include "qicdengine.h"
+
+#include <QHash>
+
+#include <maemo_icd.h>
+#include <iapconf.h>
+#include <proxyconf.h>
+
+#include <ifaddrs.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+QDBusArgument &operator<<(QDBusArgument &argument,
+ const ICd2DetailsDBusStruct &icd2)
+{
+ argument.beginStructure();
+
+ argument << icd2.serviceType;
+ argument << icd2.serviceAttributes;
+ argument << icd2.setviceId;
+ argument << icd2.networkType;
+ argument << icd2.networkAttributes;
+ argument << icd2.networkId;
+
+ argument.endStructure();
+
+ return argument;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &argument,
+ ICd2DetailsDBusStruct &icd2)
+{
+ argument.beginStructure();
+
+ argument >> icd2.serviceType;
+ argument >> icd2.serviceAttributes;
+ argument >> icd2.setviceId;
+ argument >> icd2.networkType;
+ argument >> icd2.networkAttributes;
+ argument >> icd2.networkId;
+
+ argument.endStructure();
+
+ return argument;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &argument,
+ ICd2DetailsList &detailsList)
+{
+ argument.beginArray();
+ detailsList.clear();
+
+ while (!argument.atEnd()) {
+ ICd2DetailsDBusStruct element;
+ argument >> element;
+ detailsList.append(element);
+ }
+
+ argument.endArray();
+ return argument;
+}
+
+QDBusArgument &operator<<(QDBusArgument &argument,
+ const ICd2DetailsList &detailsList)
+{
+ argument.beginArray(qMetaTypeId<ICd2DetailsDBusStruct>());
+
+ for (int i = 0; i < detailsList.count(); ++i)
+ argument << detailsList[i];
+
+ argument.endArray();
+
+ return argument;
+}
+
+static QHash<QString, QVariant> properties;
+
+static QString get_network_interface();
+
+void QNetworkSessionPrivateImpl::iapStateChanged(const QString& iapid, uint icd_connection_state)
+{
+
+ if (((publicConfig.type() == QNetworkConfiguration::UserChoice) &&
+ (activeConfig.identifier() == iapid)) ||
+ (publicConfig.identifier() == iapid)) {
+ switch (icd_connection_state) {
+ case ICD_STATE_CONNECTING:
+ updateState(QNetworkSession::Connecting);
+ break;
+ case ICD_STATE_CONNECTED:
+ updateState(QNetworkSession::Connected);
+ break;
+ case ICD_STATE_DISCONNECTING:
+ updateState(QNetworkSession::Closing);
+ break;
+ case ICD_STATE_DISCONNECTED:
+ updateState(QNetworkSession::Disconnected);
+ break;
+ default:
+ break;
+ }
+ }
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ updateIdentifier(iapid);
+ }
+}
+
+void QNetworkSessionPrivateImpl::cleanupSession(void)
+{
+ QObject::disconnect(q, SIGNAL(stateChanged(QNetworkSession::State)),
+ this, SLOT(updateProxies(QNetworkSession::State)));
+}
+
+
+void QNetworkSessionPrivateImpl::updateState(QNetworkSession::State newState)
+{
+ if (newState != state) {
+ if (newState == QNetworkSession::Disconnected) {
+ if (isOpen) {
+ // The Session was aborted by the user or system
+ lastError = QNetworkSession::SessionAbortedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ emit closed();
+ }
+ if (m_stopTimer.isActive()) {
+ // Session was closed by calling stop()
+ m_stopTimer.stop();
+ }
+ isOpen = false;
+ opened = false;
+ currentNetworkInterface.clear();
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ copyConfig(publicConfig, activeConfig);
+ IcdNetworkConfigurationPrivate *icdConfig =
+ toIcdConfig(privateConfiguration(activeConfig));
+
+ icdConfig->mutex.lock();
+ icdConfig->state = QNetworkConfiguration::Defined;
+ icdConfig->mutex.unlock();
+ } else {
+ if (!activeConfig.isValid()) {
+ // Active configuration (IAP) was removed from system
+ // => Connection was disconnected and configuration became
+ // invalid
+ // => Also Session state must be changed to invalid
+ newState = QNetworkSession::Invalid;
+ }
+ }
+ } else if (newState == QNetworkSession::Connected) {
+ if (opened) {
+ isOpen = true;
+ }
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ IcdNetworkConfigurationPrivate *icdConfig =
+ toIcdConfig(privateConfiguration(activeConfig));
+
+ icdConfig->mutex.lock();
+ icdConfig->state = QNetworkConfiguration::Active;
+ icdConfig->type = QNetworkConfiguration::InternetAccessPoint;
+ icdConfig->mutex.unlock();
+ }
+
+ IcdNetworkConfigurationPrivate *icdConfig =
+ toIcdConfig(privateConfiguration(publicConfig));
+
+ icdConfig->mutex.lock();
+ icdConfig->state = QNetworkConfiguration::Active;
+ icdConfig->mutex.unlock();
+ }
+
+ if (newState != state) {
+ state = newState;
+ emit stateChanged(newState);
+ }
+ }
+}
+
+
+void QNetworkSessionPrivateImpl::updateIdentifier(const QString &newId)
+{
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ IcdNetworkConfigurationPrivate *icdConfig =
+ toIcdConfig(privateConfiguration(activeConfig));
+
+ icdConfig->mutex.lock();
+ icdConfig->network_attrs |= ICD_NW_ATTR_IAPNAME;
+ icdConfig->id = newId;
+ icdConfig->mutex.unlock();
+ } else {
+ IcdNetworkConfigurationPrivate *icdConfig =
+ toIcdConfig(privateConfiguration(publicConfig));
+
+ icdConfig->mutex.lock();
+ icdConfig->network_attrs |= ICD_NW_ATTR_IAPNAME;
+ if (icdConfig->id != newId)
+ icdConfig->id = newId;
+ icdConfig->mutex.unlock();
+ }
+}
+
+
+QNetworkSessionPrivateImpl::Statistics QNetworkSessionPrivateImpl::getStatistics() const
+{
+ /* This could be also implemented by using the Maemo::Icd::statistics()
+ * that gets the statistics data for a specific IAP. Change if
+ * necessary.
+ */
+ Maemo::Icd icd;
+ QList<Maemo::IcdStatisticsResult> stats_results;
+ Statistics stats = { 0, 0, 0};
+
+ if (!icd.statistics(stats_results))
+ return stats;
+
+ foreach (const Maemo::IcdStatisticsResult &res, stats_results) {
+ if (res.params.network_attrs & ICD_NW_ATTR_IAPNAME) {
+ /* network_id is the IAP UUID */
+ if (QString(res.params.network_id.data()) == activeConfig.identifier()) {
+ stats.txData = res.bytes_sent;
+ stats.rxData = res.bytes_received;
+ stats.activeTime = res.time_active;
+ }
+ } else {
+ /* We probably will never get to this branch */
+ IcdNetworkConfigurationPrivate *icdConfig =
+ toIcdConfig(privateConfiguration(activeConfig));
+
+ icdConfig->mutex.lock();
+ if (res.params.network_id == icdConfig->network_id) {
+ stats.txData = res.bytes_sent;
+ stats.rxData = res.bytes_received;
+ stats.activeTime = res.time_active;
+ }
+ icdConfig->mutex.unlock();
+ }
+ }
+
+ return stats;
+}
+
+
+quint64 QNetworkSessionPrivateImpl::bytesWritten() const
+{
+ return getStatistics().txData;
+}
+
+quint64 QNetworkSessionPrivateImpl::bytesReceived() const
+{
+ return getStatistics().rxData;
+}
+
+quint64 QNetworkSessionPrivateImpl::activeTime() const
+{
+ return getStatistics().activeTime;
+}
+
+
+QNetworkConfiguration& QNetworkSessionPrivateImpl::copyConfig(QNetworkConfiguration &fromConfig,
+ QNetworkConfiguration &toConfig,
+ bool deepCopy)
+{
+ IcdNetworkConfigurationPrivate *cpPriv;
+ if (deepCopy) {
+ cpPriv = new IcdNetworkConfigurationPrivate;
+ setPrivateConfiguration(toConfig, QNetworkConfigurationPrivatePointer(cpPriv));
+ } else {
+ cpPriv = toIcdConfig(privateConfiguration(toConfig));
+ }
+
+ IcdNetworkConfigurationPrivate *fromPriv = toIcdConfig(privateConfiguration(fromConfig));
+
+ QMutexLocker toLocker(&cpPriv->mutex);
+ QMutexLocker fromLocker(&fromPriv->mutex);
+
+ cpPriv->name = fromPriv->name;
+ cpPriv->isValid = fromPriv->isValid;
+ // Note that we do not copy id field here as the publicConfig does
+ // not contain a valid IAP id.
+ cpPriv->state = fromPriv->state;
+ cpPriv->type = fromPriv->type;
+ cpPriv->roamingSupported = fromPriv->roamingSupported;
+ cpPriv->purpose = fromPriv->purpose;
+ cpPriv->network_id = fromPriv->network_id;
+ cpPriv->iap_type = fromPriv->iap_type;
+ cpPriv->bearerType = fromPriv->bearerType;
+ cpPriv->network_attrs = fromPriv->network_attrs;
+ cpPriv->service_type = fromPriv->service_type;
+ cpPriv->service_id = fromPriv->service_id;
+ cpPriv->service_attrs = fromPriv->service_attrs;
+
+ return toConfig;
+}
+
+
+/* This is called by QNetworkSession constructor and it updates the current
+ * state of the configuration.
+ */
+void QNetworkSessionPrivateImpl::syncStateWithInterface()
+{
+ /* Initially we are not active although the configuration might be in
+ * connected state.
+ */
+ isOpen = false;
+ opened = false;
+
+ connect(engine, SIGNAL(iapStateChanged(const QString&, uint)),
+ this, SLOT(iapStateChanged(const QString&, uint)));
+
+ QObject::connect(q, SIGNAL(stateChanged(QNetworkSession::State)), this, SLOT(updateProxies(QNetworkSession::State)));
+
+ state = QNetworkSession::Invalid;
+ lastError = QNetworkSession::UnknownSessionError;
+
+ switch (publicConfig.type()) {
+ case QNetworkConfiguration::InternetAccessPoint:
+ activeConfig = publicConfig;
+ break;
+ case QNetworkConfiguration::ServiceNetwork:
+ serviceConfig = publicConfig;
+ break;
+ case QNetworkConfiguration::UserChoice:
+ // active config will contain correct data after open() has succeeded
+ copyConfig(publicConfig, activeConfig);
+
+ /* We create new configuration that holds the actual configuration
+ * returned by icd. This way publicConfig still contains the
+ * original user specified configuration.
+ *
+ * Note that the new activeConfig configuration is not inserted
+ * to configurationManager as manager class will get the newly
+ * connected configuration from gconf when the IAP is saved.
+ * This configuration manager update is done by IapMonitor class.
+ * If the ANY connection fails in open(), then the configuration
+ * data is not saved to gconf and will not be added to
+ * configuration manager IAP list.
+ */
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug()<<"New configuration created for" << publicConfig.identifier();
+#endif
+ break;
+ default:
+ /* Invalid configuration, no point continuing */
+ return;
+ }
+
+ if (!activeConfig.isValid())
+ return;
+
+ /* Get the initial state from icd */
+ Maemo::Icd icd;
+ QList<Maemo::IcdStateResult> state_results;
+
+ /* Update the active config from first connection, this is ok as icd
+ * supports only one connection anyway.
+ */
+ if (icd.state(state_results) && !state_results.isEmpty()) {
+ /* If we did not get full state back, then we are not
+ * connected and can skip the next part.
+ */
+ if (!(state_results.first().params.network_attrs == 0 &&
+ state_results.first().params.network_id.isEmpty())) {
+
+ /* If we try to connect to specific IAP and we get results back
+ * that tell the icd is actually connected to another IAP,
+ * then do not update current state etc.
+ */
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice ||
+ publicConfig.identifier() == state_results.first().params.network_id) {
+ switch (state_results.first().state) {
+ case ICD_STATE_DISCONNECTED:
+ state = QNetworkSession::Disconnected;
+ if (QNetworkConfigurationPrivatePointer ptr = privateConfiguration(activeConfig)) {
+ ptr->mutex.lock();
+ ptr->isValid = true;
+ ptr->mutex.unlock();
+ }
+ break;
+ case ICD_STATE_CONNECTING:
+ state = QNetworkSession::Connecting;
+ if (QNetworkConfigurationPrivatePointer ptr = privateConfiguration(activeConfig)) {
+ ptr->mutex.lock();
+ ptr->isValid = true;
+ ptr->mutex.unlock();
+ }
+ break;
+ case ICD_STATE_CONNECTED:
+ {
+ if (!state_results.first().error.isEmpty())
+ break;
+
+ const QString id = state_results.first().params.network_id;
+
+ QNetworkConfiguration config = manager.configurationFromIdentifier(id);
+ if (config.isValid()) {
+ //we don't want the copied data if the config is already known by the manager
+ //just reuse it so that existing references to the old data get the same update
+ setPrivateConfiguration(activeConfig, privateConfiguration(config));
+ }
+
+ QNetworkConfigurationPrivatePointer ptr = privateConfiguration(activeConfig);
+
+ QMutexLocker configLocker(&ptr->mutex);
+
+ state = QNetworkSession::Connected;
+ toIcdConfig(ptr)->network_id = state_results.first().params.network_id;
+ ptr->id = toIcdConfig(ptr)->network_id;
+ toIcdConfig(ptr)->network_attrs = state_results.first().params.network_attrs;
+ toIcdConfig(ptr)->iap_type = state_results.first().params.network_type;
+ ptr->bearerType = bearerTypeFromIapType(toIcdConfig(ptr)->iap_type);
+ toIcdConfig(ptr)->service_type = state_results.first().params.service_type;
+ toIcdConfig(ptr)->service_id = state_results.first().params.service_id;
+ toIcdConfig(ptr)->service_attrs = state_results.first().params.service_attrs;
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ ptr->state = QNetworkConfiguration::Active;
+ ptr->isValid = true;
+ currentNetworkInterface = get_network_interface();
+
+ Maemo::IAPConf iap_name(ptr->id);
+ QString name_value = iap_name.value("name").toString();
+ if (!name_value.isEmpty())
+ ptr->name = name_value;
+ else
+ ptr->name = ptr->id;
+
+ const QString identifier = ptr->id;
+
+ configLocker.unlock();
+
+ // Add the new active configuration to manager or update the old config
+ if (!engine->hasIdentifier(identifier))
+ engine->addSessionConfiguration(ptr);
+ else
+ engine->changedSessionConfiguration(ptr);
+ }
+ break;
+
+ case ICD_STATE_DISCONNECTING:
+ state = QNetworkSession::Closing;
+ if (QNetworkConfigurationPrivatePointer ptr = privateConfiguration(activeConfig)) {
+ ptr->mutex.lock();
+ ptr->isValid = true;
+ ptr->mutex.unlock();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ } else {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "status_req tells icd is not connected";
+#endif
+ }
+ } else {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "status_req did not return any results from icd";
+#endif
+ }
+
+ networkConfigurationsChanged();
+}
+
+
+void QNetworkSessionPrivateImpl::networkConfigurationsChanged()
+{
+ if (serviceConfig.isValid())
+ updateStateFromServiceNetwork();
+ else
+ updateStateFromActiveConfig();
+}
+
+
+void QNetworkSessionPrivateImpl::updateStateFromServiceNetwork()
+{
+ QNetworkSession::State oldState = state;
+
+ foreach (const QNetworkConfiguration &config, serviceConfig.children()) {
+ if ((config.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active)
+ continue;
+
+ if (activeConfig != config) {
+ activeConfig = config;
+ emit newConfigurationActivated();
+ }
+
+ state = QNetworkSession::Connected;
+ if (state != oldState)
+ emit stateChanged(state);
+
+ return;
+ }
+
+ if (serviceConfig.children().isEmpty())
+ state = QNetworkSession::NotAvailable;
+ else
+ state = QNetworkSession::Disconnected;
+
+ if (state != oldState)
+ emit stateChanged(state);
+}
+
+
+void QNetworkSessionPrivateImpl::clearConfiguration(QNetworkConfiguration &config)
+{
+ IcdNetworkConfigurationPrivate *icdConfig = toIcdConfig(privateConfiguration(config));
+
+ QMutexLocker locker(&icdConfig->mutex);
+
+ icdConfig->network_id.clear();
+ icdConfig->iap_type.clear();
+ icdConfig->network_attrs = 0;
+ icdConfig->service_type.clear();
+ icdConfig->service_id.clear();
+ icdConfig->service_attrs = 0;
+}
+
+
+void QNetworkSessionPrivateImpl::updateStateFromActiveConfig()
+{
+ QNetworkSession::State oldState = state;
+
+ bool newActive = false;
+
+ if (!activeConfig.isValid())
+ return;
+
+ if (!activeConfig.isValid()) {
+ state = QNetworkSession::Invalid;
+ clearConfiguration(activeConfig);
+ } else if ((activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ state = QNetworkSession::Connected;
+ newActive = opened;
+ } else if ((activeConfig.state() & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
+ state = QNetworkSession::Disconnected;
+ } else if ((activeConfig.state() & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
+ state = QNetworkSession::NotAvailable;
+ } else if ((activeConfig.state() & QNetworkConfiguration::Undefined) == QNetworkConfiguration::Undefined) {
+ state = QNetworkSession::NotAvailable;
+ }
+
+ bool oldActive = isOpen;
+ isOpen = newActive;
+
+ if (!oldActive && isOpen)
+ emit quitPendingWaitsForOpened();
+
+ if (oldActive && !isOpen)
+ emit closed();
+
+ if (oldState != state) {
+ emit stateChanged(state);
+
+ if (state == QNetworkSession::Disconnected && oldActive) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ //qDebug()<<"session aborted error emitted for"<<activeConfig.identifier();
+#endif
+ lastError = QNetworkSession::SessionAbortedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ }
+ }
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ //qDebug()<<"oldState ="<<oldState<<" state ="<<state<<" oldActive ="<<oldActive<<" newActive ="<<newActive<<" opened ="<<opened;
+#endif
+}
+
+static QString get_network_interface()
+{
+ Maemo::Icd icd;
+ QList<Maemo::IcdAddressInfoResult> addr_results;
+ uint ret;
+ QString iface;
+
+ ret = icd.addrinfo(addr_results);
+ if (ret == 0) {
+ /* No results */
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "Cannot get addrinfo from icd, are you connected or is icd running?";
+#endif
+ return iface;
+ }
+
+ if (addr_results.first().ip_info.isEmpty())
+ return QString();
+
+ QByteArray data = addr_results.first().ip_info.first().address.toAscii();
+ struct in_addr addr;
+ if (inet_aton(data.constData(), &addr) == 0) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "address" << data.constData() << "invalid";
+#endif
+ return iface;
+ }
+
+ struct ifaddrs *ifaddr, *ifa;
+ int family;
+
+ if (getifaddrs(&ifaddr) == -1) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "getifaddrs() failed";
+#endif
+ return iface;
+ }
+
+ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+ if (ifa->ifa_addr) {
+ family = ifa->ifa_addr->sa_family;
+ if (family != AF_INET) {
+ continue; /* Currently only IPv4 is supported by icd dbus interface */
+ }
+ if (((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr == addr.s_addr) {
+ iface = QString(ifa->ifa_name);
+ break;
+ }
+ }
+ }
+
+ freeifaddrs(ifaddr);
+ return iface;
+}
+
+
+void QNetworkSessionPrivateImpl::open()
+{
+ if (m_stopTimer.isActive()) {
+ m_stopTimer.stop();
+ }
+ if (!publicConfig.isValid()) {
+ lastError = QNetworkSession::InvalidConfigurationError;
+ emit QNetworkSessionPrivate::error(lastError);
+ return;
+ }
+ if (serviceConfig.isValid()) {
+ lastError = QNetworkSession::OperationNotSupportedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ } else if (!opened) {
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ /* Caller is trying to connect to default IAP.
+ * At this time we will not know the IAP details so we just
+ * connect and update the active config when the IAP is
+ * connected.
+ */
+ opened = true;
+ state = QNetworkSession::Connecting;
+ emit stateChanged(state);
+ QTimer::singleShot(0, this, SLOT(do_open()));
+ return;
+ }
+
+ /* User is connecting to one specific IAP. If that IAP is not
+ * in discovered state we cannot continue.
+ */
+ if ((activeConfig.state() & QNetworkConfiguration::Discovered) !=
+ QNetworkConfiguration::Discovered) {
+ lastError =QNetworkSession::InvalidConfigurationError;
+ emit QNetworkSessionPrivate::error(lastError);
+ return;
+ }
+ opened = true;
+
+ if ((activeConfig.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active) {
+ state = QNetworkSession::Connecting;
+ emit stateChanged(state);
+ QTimer::singleShot(0, this, SLOT(do_open()));
+ return;
+ }
+ isOpen = (activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active;
+ if (isOpen)
+ emit quitPendingWaitsForOpened();
+ } else {
+ /* We seem to be active so inform caller */
+ emit quitPendingWaitsForOpened();
+ }
+}
+
+void QNetworkSessionPrivateImpl::do_open()
+{
+ icd_connection_flags flags = connectFlags;
+ QString iap = publicConfig.identifier();
+
+ if (state == QNetworkSession::Connected) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "Already connected to" << activeConfig.identifier();
+#endif
+ emit stateChanged(QNetworkSession::Connected);
+ emit quitPendingWaitsForOpened();
+ return;
+ }
+
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice)
+ config = activeConfig;
+ else
+ config = publicConfig;
+
+ if (iap == OSSO_IAP_ANY) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "connecting to default IAP" << iap;
+#endif
+ m_connectRequestTimer.start(ICD_LONG_CONNECT_TIMEOUT);
+ m_dbusInterface->asyncCall(ICD_DBUS_API_CONNECT_REQ, (uint)flags); // Return value ignored
+ m_asynchCallActive = true;
+ } else {
+ IcdNetworkConfigurationPrivate *icdConfig = toIcdConfig(privateConfiguration(config));
+
+ icdConfig->mutex.lock();
+ ICd2DetailsDBusStruct icd2;
+ icd2.serviceType = icdConfig->service_type;
+ icd2.serviceAttributes = icdConfig->service_attrs;
+ icd2.setviceId = icdConfig->service_id;
+ icd2.networkType = icdConfig->iap_type;
+ icd2.networkAttributes = icdConfig->network_attrs;
+ if (icdConfig->network_attrs & ICD_NW_ATTR_IAPNAME) {
+ icd2.networkId = QByteArray(iap.toLatin1());
+ } else {
+ icd2.networkId = icdConfig->network_id;
+ }
+ icdConfig->mutex.unlock();
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("connecting to %s/%s/0x%x/%s/0x%x/%s",
+ icd2.networkId.data(),
+ icd2.networkType.toAscii().constData(),
+ icd2.networkAttributes,
+ icd2.serviceType.toAscii().constData(),
+ icd2.serviceAttributes,
+ icd2.setviceId.toAscii().constData());
+#endif
+
+ ICd2DetailsList paramArray;
+ paramArray.append(icd2);
+ m_connectRequestTimer.start(ICD_LONG_CONNECT_TIMEOUT);
+ m_dbusInterface->asyncCall(ICD_DBUS_API_CONNECT_REQ, (uint)flags, QVariant::fromValue(paramArray)); // Return value ignored
+ m_asynchCallActive = true;
+ }
+}
+
+void QNetworkSessionPrivateImpl::stateChange(const QDBusMessage& rep)
+{
+ if (m_asynchCallActive == true) {
+ if (m_connectRequestTimer.isActive())
+ m_connectRequestTimer.stop();
+ m_asynchCallActive = false;
+
+ QString result = rep.arguments().at(5).toString(); // network id or empty string
+ QString connected_iap = result;
+ if (connected_iap.isEmpty()) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "connect to"<< publicConfig.identifier() << "failed, result is empty";
+#endif
+ updateState(QNetworkSession::Disconnected);
+ emit QNetworkSessionPrivate::error(QNetworkSession::SessionAbortedError);
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice)
+ copyConfig(publicConfig, activeConfig);
+ return;
+ }
+
+ /* If the user tried to connect to some specific connection (foo)
+ * and we were already connected to some other connection (bar),
+ * then we cannot activate this session although icd has a valid
+ * connection to somewhere.
+ */
+ if ((publicConfig.type() != QNetworkConfiguration::UserChoice) &&
+ (connected_iap != config.identifier())) {
+ updateState(QNetworkSession::Disconnected);
+ emit QNetworkSessionPrivate::error(QNetworkSession::UnknownSessionError);
+ return;
+ }
+
+ IcdNetworkConfigurationPrivate *icdConfig = toIcdConfig(privateConfiguration(config));
+
+ /* Did we connect to non saved IAP? */
+ icdConfig->mutex.lock();
+ if (!(icdConfig->network_attrs & ICD_NW_ATTR_IAPNAME)) {
+ /* Because the connection succeeded, the IAP is now known.
+ */
+ icdConfig->network_attrs |= ICD_NW_ATTR_IAPNAME;
+ icdConfig->id = connected_iap;
+ }
+
+ /* User might have changed the IAP name when a new IAP was saved */
+ Maemo::IAPConf iap_name(icdConfig->id);
+ QString name = iap_name.value("name").toString();
+ if (!name.isEmpty())
+ icdConfig->name = name;
+
+ icdConfig->iap_type = rep.arguments().at(3).toString(); // connect_result.connect.network_type;
+ icdConfig->bearerType = bearerTypeFromIapType(icdConfig->iap_type);
+ icdConfig->isValid = true;
+ icdConfig->state = QNetworkConfiguration::Active;
+ icdConfig->type = QNetworkConfiguration::InternetAccessPoint;
+
+ icdConfig->mutex.unlock();
+
+ startTime = QDateTime::currentDateTime();
+ updateState(QNetworkSession::Connected);
+ //currentNetworkInterface = get_network_interface();
+#ifdef BEARER_MANAGEMENT_DEBUG
+ //qDebug() << "connected to" << result << config.name() << "at" << currentNetworkInterface;
+#endif
+
+ /* We first check if the configuration already exists in the manager
+ * and if it is not found there, we then insert it. Note that this
+ * is only done for user choice config only because it can be missing
+ * from config manager list.
+ */
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ if (!engine->hasIdentifier(result)) {
+ engine->addSessionConfiguration(privateConfiguration(config));
+ } else {
+ QNetworkConfigurationPrivatePointer priv = engine->configuration(result);
+ QNetworkConfiguration reference;
+ setPrivateConfiguration(reference, priv);
+ copyConfig(config, reference, false);
+ privateConfiguration(reference)->id = result; // Note: Id was not copied in copyConfig() function
+ config = reference;
+ activeConfig = reference;
+ engine->changedSessionConfiguration(privateConfiguration(config));
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug()<<"Existing configuration"<<result<<"updated in manager in open";
+#endif
+ }
+ }
+
+ emit quitPendingWaitsForOpened();
+ }
+}
+
+void QNetworkSessionPrivateImpl::connectTimeout()
+{
+ updateState(QNetworkSession::Disconnected);
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice)
+ copyConfig(publicConfig, activeConfig);
+ emit QNetworkSessionPrivate::error(QNetworkSession::UnknownSessionError);
+}
+
+void QNetworkSessionPrivateImpl::close()
+{
+ if (m_connectRequestTimer.isActive())
+ m_connectRequestTimer.stop();
+
+ if (serviceConfig.isValid()) {
+ lastError = QNetworkSession::OperationNotSupportedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ } else if (isOpen) {
+ if ((activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ // We will not wait any disconnect from icd as it might never come
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "closing session" << publicConfig.identifier();
+#endif
+ state = QNetworkSession::Closing;
+ emit stateChanged(state);
+
+ // we fake a disconnection, session error is sent
+ updateState(QNetworkSession::Disconnected);
+
+ opened = false;
+ isOpen = false;
+
+ m_dbusInterface->call(ICD_DBUS_API_DISCONNECT_REQ, ICD_CONNECTION_FLAG_APPLICATION_EVENT);
+ startTime = QDateTime();
+ } else {
+ opened = false;
+ isOpen = false;
+ emit closed();
+ }
+ }
+}
+
+
+void QNetworkSessionPrivateImpl::stop()
+{
+ if (m_connectRequestTimer.isActive())
+ m_connectRequestTimer.stop();
+
+ if (serviceConfig.isValid()) {
+ lastError = QNetworkSession::OperationNotSupportedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ } else {
+ if ((activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "stopping session" << publicConfig.identifier();
+#endif
+ state = QNetworkSession::Closing;
+ emit stateChanged(state);
+
+ // we fake a disconnection, a session error is sent also
+ updateState(QNetworkSession::Disconnected);
+
+ opened = false;
+ isOpen = false;
+
+ m_dbusInterface->call(ICD_DBUS_API_DISCONNECT_REQ, ICD_CONNECTION_FLAG_APPLICATION_EVENT);
+ startTime = QDateTime();
+ } else {
+ opened = false;
+ isOpen = false;
+ emit closed();
+ }
+ }
+}
+
+void QNetworkSessionPrivateImpl::finishStopBySendingClosedSignal()
+{
+ if ((activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ state = QNetworkSession::Connected;
+ emit stateChanged(state);
+ }
+
+ emit closed();
+}
+
+void QNetworkSessionPrivateImpl::migrate()
+{
+}
+
+
+void QNetworkSessionPrivateImpl::accept()
+{
+}
+
+
+void QNetworkSessionPrivateImpl::ignore()
+{
+}
+
+
+void QNetworkSessionPrivateImpl::reject()
+{
+}
+
+#ifndef QT_NO_NETWORKINTERFACE
+QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const
+{
+ if (!publicConfig.isValid() || state != QNetworkSession::Connected)
+ return QNetworkInterface();
+
+ if (currentNetworkInterface.isEmpty())
+ return QNetworkInterface();
+
+ return QNetworkInterface::interfaceFromName(currentNetworkInterface);
+}
+#endif
+
+void QNetworkSessionPrivateImpl::setSessionProperty(const QString& key, const QVariant& value)
+{
+ if (value.isValid()) {
+ properties.insert(key, value);
+
+ if (key == "ConnectInBackground") {
+ bool v = value.toBool();
+ if (v)
+ connectFlags = ICD_CONNECTION_FLAG_APPLICATION_EVENT;
+ else
+ connectFlags = ICD_CONNECTION_FLAG_USER_EVENT;
+ }
+ } else {
+ properties.remove(key);
+
+ /* Set default value when property is removed */
+ if (key == "ConnectInBackground")
+ connectFlags = ICD_CONNECTION_FLAG_USER_EVENT;
+ }
+}
+
+
+QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString& key) const
+{
+ return properties.value(key);
+}
+
+
+QString QNetworkSessionPrivateImpl::errorString() const
+{
+ QString errorStr;
+ switch(q->error()) {
+ case QNetworkSession::RoamingError:
+ errorStr = QNetworkSessionPrivateImpl::tr("Roaming error");
+ break;
+ case QNetworkSession::SessionAbortedError:
+ errorStr = QNetworkSessionPrivateImpl::tr("Session aborted by user or system");
+ break;
+ case QNetworkSession::InvalidConfigurationError:
+ errorStr = QNetworkSessionPrivateImpl::tr("The specified configuration cannot be used.");
+ break;
+ default:
+ case QNetworkSession::UnknownSessionError:
+ errorStr = QNetworkSessionPrivateImpl::tr("Unidentified Error");
+ break;
+ }
+ return errorStr;
+}
+
+
+QNetworkSession::SessionError QNetworkSessionPrivateImpl::error() const
+{
+ return QNetworkSession::UnknownSessionError;
+}
+
+void QNetworkSessionPrivateImpl::updateProxies(QNetworkSession::State newState)
+{
+ if ((newState == QNetworkSession::Connected) &&
+ (newState != currentState))
+ updateProxyInformation();
+ else if ((newState == QNetworkSession::Disconnected) &&
+ (currentState == QNetworkSession::Closing))
+ clearProxyInformation();
+
+ currentState = newState;
+}
+
+
+void QNetworkSessionPrivateImpl::updateProxyInformation()
+{
+ Maemo::ProxyConf::update();
+}
+
+
+void QNetworkSessionPrivateImpl::clearProxyInformation()
+{
+ Maemo::ProxyConf::clear();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/icd/qnetworksession_impl.h b/src/plugins/bearer/icd/qnetworksession_impl.h
new file mode 100644
index 0000000000..743ce60c88
--- /dev/null
+++ b/src/plugins/bearer/icd/qnetworksession_impl.h
@@ -0,0 +1,229 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNETWORKSESSION_IMPL_H
+#define QNETWORKSESSION_IMPL_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QLibrary class. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtNetwork/private/qnetworksession_p.h>
+#include <QtNetwork/qnetworkconfigmanager.h>
+
+#include <QtCore/qdatetime.h>
+#include <QtCore/qtimer.h>
+#include <QtCore/quuid.h>
+
+#include <QtDBus/qdbusconnection.h>
+#include <QtDBus/qdbusinterface.h>
+#include <QtDBus/qdbusmessage.h>
+#include <QtDBus/qdbusmetatype.h>
+
+#include <icd/dbus_api.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QIcdEngine;
+
+struct ICd2DetailsDBusStruct
+{
+ QString serviceType;
+ uint serviceAttributes;
+ QString setviceId;
+ QString networkType;
+ uint networkAttributes;
+ QByteArray networkId;
+};
+
+typedef QList<ICd2DetailsDBusStruct> ICd2DetailsList;
+
+class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate
+{
+ Q_OBJECT
+
+public:
+ QNetworkSessionPrivateImpl(QIcdEngine *engine)
+ : engine(engine),
+ connectFlags(ICD_CONNECTION_FLAG_USER_EVENT),
+ currentState(QNetworkSession::Invalid),
+ m_asynchCallActive(false)
+ {
+ m_stopTimer.setSingleShot(true);
+ connect(&m_stopTimer, SIGNAL(timeout()), this, SLOT(finishStopBySendingClosedSignal()));
+
+ QDBusConnection systemBus = QDBusConnection::connectToBus(
+ QDBusConnection::SystemBus,
+ QUuid::createUuid().toString());
+
+ m_dbusInterface = new QDBusInterface(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE,
+ systemBus,
+ this);
+
+ systemBus.connect(ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_PATH,
+ ICD_DBUS_API_INTERFACE,
+ ICD_DBUS_API_CONNECT_SIG,
+ this,
+ SLOT(stateChange(const QDBusMessage&)));
+
+ qDBusRegisterMetaType<ICd2DetailsDBusStruct>();
+ qDBusRegisterMetaType<ICd2DetailsList>();
+
+ m_connectRequestTimer.setSingleShot(true);
+ connect(&m_connectRequestTimer, SIGNAL(timeout()), this, SLOT(connectTimeout()));
+ }
+
+ ~QNetworkSessionPrivateImpl()
+ {
+ cleanupSession();
+
+ QDBusConnection::disconnectFromBus(m_dbusInterface->connection().name());
+ }
+
+ //called by QNetworkSession constructor and ensures
+ //that the state is immediately updated (w/o actually opening
+ //a session). Also this function should take care of
+ //notification hooks to discover future state changes.
+ void syncStateWithInterface();
+
+#ifndef QT_NO_NETWORKINTERFACE
+ QNetworkInterface currentInterface() const;
+#endif
+ QVariant sessionProperty(const QString& key) const;
+ void setSessionProperty(const QString& key, const QVariant& value);
+
+ void open();
+ void close();
+ void stop();
+
+ void migrate();
+ void accept();
+ void ignore();
+ void reject();
+
+ QString errorString() const; //must return translated string
+ QNetworkSession::SessionError error() const;
+
+ quint64 bytesWritten() const;
+ quint64 bytesReceived() const;
+ quint64 activeTime() const;
+
+private:
+ void updateStateFromServiceNetwork();
+ void updateStateFromActiveConfig();
+
+private Q_SLOTS:
+ void do_open();
+ void networkConfigurationsChanged();
+ void iapStateChanged(const QString& iapid, uint icd_connection_state);
+ void updateProxies(QNetworkSession::State newState);
+ void finishStopBySendingClosedSignal();
+ void stateChange(const QDBusMessage& rep);
+ void connectTimeout();
+
+private:
+ QNetworkConfigurationManager manager;
+ QIcdEngine *engine;
+
+ struct Statistics {
+ quint64 txData;
+ quint64 rxData;
+ quint64 activeTime;
+ };
+
+ // The config set on QNetworkSession.
+ QNetworkConfiguration config;
+
+ QNetworkConfiguration& copyConfig(QNetworkConfiguration &fromConfig, QNetworkConfiguration &toConfig, bool deepCopy = true);
+ void clearConfiguration(QNetworkConfiguration &config);
+
+ bool opened;
+ icd_connection_flags connectFlags;
+
+ QNetworkSession::SessionError lastError;
+
+ QDateTime startTime;
+ QString currentNetworkInterface;
+ friend class IcdListener;
+ void updateState(QNetworkSession::State);
+ void updateIdentifier(const QString &newId);
+ Statistics getStatistics() const;
+ void cleanupSession(void);
+
+ void updateProxyInformation();
+ void clearProxyInformation();
+ QNetworkSession::State currentState;
+
+ QDBusInterface *m_dbusInterface;
+
+ QTimer m_stopTimer;
+
+ bool m_asynchCallActive;
+ QTimer m_connectRequestTimer;
+};
+
+// Marshall the ICd2DetailsDBusStruct data into a D-Bus argument
+QDBusArgument &operator<<(QDBusArgument &argument, const ICd2DetailsDBusStruct &icd2);
+
+// Retrieve the ICd2DetailsDBusStruct data from the D-Bus argument
+const QDBusArgument &operator>>(const QDBusArgument &argument, ICd2DetailsDBusStruct &icd2);
+
+Q_DECLARE_METATYPE(ICd2DetailsDBusStruct);
+Q_DECLARE_METATYPE(ICd2DetailsList);
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif //QNETWORKSESSIONPRIVATE_H
+
diff --git a/src/plugins/bearer/icd/wlan-utils.h b/src/plugins/bearer/icd/wlan-utils.h
new file mode 100644
index 0000000000..91f5e99a45
--- /dev/null
+++ b/src/plugins/bearer/icd/wlan-utils.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef WLAN_UTILS_H
+#define WLAN_UTILS_H
+
+/** Originally taken from: libicd-network-wlan-dev.h*/
+
+#include <glib.h>
+#include <dbus/dbus.h>
+#include <wlancond.h>
+#include <icd/network_api_defines.h>
+
+/* capability bits inside network attributes var */
+#define NWATTR_WPS_MASK 0x0000F000
+#define NWATTR_ALGORITHM_MASK 0x00000F00
+#define NWATTR_WPA2_MASK 0x00000080
+#define NWATTR_METHOD_MASK 0x00000078
+#define NWATTR_MODE_MASK 0x00000007
+
+#define CAP_LOCALMASK 0x0FFFE008
+
+/* how much to shift between capability and network attributes var */
+#define CAP_SHIFT_WPS 3
+#define CAP_SHIFT_ALGORITHM 20
+#define CAP_SHIFT_WPA2 1
+#define CAP_SHIFT_METHOD 1
+#define CAP_SHIFT_MODE 0
+#define CAP_SHIFT_ALWAYS_ONLINE 26
+
+/* ------------------------------------------------------------------------- */
+/* From combined to capability */
+static inline dbus_uint32_t nwattr2cap(guint nwattrs, dbus_uint32_t *cap)
+{
+ guint oldval = *cap;
+
+ *cap &= CAP_LOCALMASK; /* clear old capabilities */
+ *cap |=
+ ((nwattrs & ICD_NW_ATTR_ALWAYS_ONLINE) >> CAP_SHIFT_ALWAYS_ONLINE) |
+ ((nwattrs & NWATTR_WPS_MASK) >> CAP_SHIFT_WPS) |
+ ((nwattrs & NWATTR_ALGORITHM_MASK) << CAP_SHIFT_ALGORITHM) |
+ ((nwattrs & NWATTR_WPA2_MASK) << CAP_SHIFT_WPA2) |
+ ((nwattrs & NWATTR_METHOD_MASK) << CAP_SHIFT_METHOD) |
+ (nwattrs & NWATTR_MODE_MASK);
+
+ return oldval;
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* From capability to combined */
+static inline guint cap2nwattr(dbus_uint32_t cap, guint *nwattrs)
+{
+ guint oldval = *nwattrs;
+
+ *nwattrs &= ~ICD_NW_ATTR_LOCALMASK; /* clear old capabilities */
+ *nwattrs |=
+#ifdef WLANCOND_WPS_MASK
+ ((cap & WLANCOND_WPS_MASK) << CAP_SHIFT_WPS) |
+#endif
+ ((cap & (WLANCOND_ENCRYPT_ALG_MASK |
+ WLANCOND_ENCRYPT_GROUP_ALG_MASK)) >> CAP_SHIFT_ALGORITHM)|
+ ((cap & WLANCOND_ENCRYPT_WPA2_MASK) >> CAP_SHIFT_WPA2) |
+ ((cap & WLANCOND_ENCRYPT_METHOD_MASK) >> CAP_SHIFT_METHOD) |
+ (cap & WLANCOND_MODE_MASK);
+
+ return oldval;
+}
+
+
+#endif
diff --git a/src/plugins/bearer/nativewifi/main.cpp b/src/plugins/bearer/nativewifi/main.cpp
new file mode 100644
index 0000000000..99510ee2b1
--- /dev/null
+++ b/src/plugins/bearer/nativewifi/main.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnativewifiengine.h"
+#include "platformdefs.h"
+
+#include <QtCore/qmutex.h>
+#include <QtCore/private/qmutexpool_p.h>
+#include <QtCore/qlibrary.h>
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+static void resolveLibrary()
+{
+ static volatile bool triedResolve = false;
+
+ if (!triedResolve) {
+#ifndef QT_NO_THREAD
+ QMutexLocker locker(QMutexPool::globalInstanceGet(&local_WlanOpenHandle));
+#endif
+
+ if (!triedResolve) {
+ local_WlanOpenHandle = (WlanOpenHandleProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanOpenHandle");
+ local_WlanRegisterNotification = (WlanRegisterNotificationProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanRegisterNotification");
+ local_WlanEnumInterfaces = (WlanEnumInterfacesProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanEnumInterfaces");
+ local_WlanGetAvailableNetworkList = (WlanGetAvailableNetworkListProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanGetAvailableNetworkList");
+ local_WlanQueryInterface = (WlanQueryInterfaceProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanQueryInterface");
+ local_WlanConnect = (WlanConnectProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanConnect");
+ local_WlanDisconnect = (WlanDisconnectProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanDisconnect");
+ local_WlanScan = (WlanScanProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanScan");
+ local_WlanFreeMemory = (WlanFreeMemoryProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanFreeMemory");
+ local_WlanCloseHandle = (WlanCloseHandleProto)
+ QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanCloseHandle");
+
+ triedResolve = true;
+ }
+ }
+}
+
+class QNativeWifiEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QNativeWifiEnginePlugin();
+ ~QNativeWifiEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QNativeWifiEnginePlugin::QNativeWifiEnginePlugin()
+{
+}
+
+QNativeWifiEnginePlugin::~QNativeWifiEnginePlugin()
+{
+}
+
+QStringList QNativeWifiEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("nativewifi");
+}
+
+QBearerEngine *QNativeWifiEnginePlugin::create(const QString &key) const
+{
+ if (key != QLatin1String("nativewifi"))
+ return 0;
+
+ resolveLibrary();
+
+ // native wifi dll not available
+ if (!local_WlanOpenHandle)
+ return 0;
+
+ QNativeWifiEngine *engine = new QNativeWifiEngine;
+
+ // could not initialise subsystem
+ if (engine && !engine->available()) {
+ delete engine;
+ return 0;
+ }
+
+ return engine;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QNativeWifiEnginePlugin)
+Q_EXPORT_PLUGIN2(qnativewifibearer, QNativeWifiEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/nativewifi/nativewifi.pro b/src/plugins/bearer/nativewifi/nativewifi.pro
new file mode 100644
index 0000000000..36dd36db19
--- /dev/null
+++ b/src/plugins/bearer/nativewifi/nativewifi.pro
@@ -0,0 +1,17 @@
+TARGET = qnativewifibearer
+include(../../qpluginbase.pri)
+
+QT = core network
+
+HEADERS += qnativewifiengine.h \
+ platformdefs.h \
+ ../qnetworksession_impl.h \
+ ../qbearerengine_impl.h
+
+SOURCES += main.cpp \
+ qnativewifiengine.cpp \
+ ../qnetworksession_impl.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/nativewifi/platformdefs.h b/src/plugins/bearer/nativewifi/platformdefs.h
new file mode 100644
index 0000000000..2f5e4dd23c
--- /dev/null
+++ b/src/plugins/bearer/nativewifi/platformdefs.h
@@ -0,0 +1,326 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PLATFORMDEFS_H
+#define PLATFORMDEFS_H
+
+#include <wtypes.h>
+#undef interface
+
+#define WLAN_MAX_NAME_LENGTH 256
+#define WLAN_MAX_PHY_TYPE_NUMBER 8
+#define WLAN_NOTIFICATION_SOURCE_ALL 0x0000ffff
+#define WLAN_AVAILABLE_NETWORK_CONNECTED 1
+#define WLAN_AVAILABLE_NETWORK_HAS_PROFILE 2
+#define DOT11_SSID_MAX_LENGTH 32
+
+QT_BEGIN_NAMESPACE
+
+struct WLAN_NOTIFICATION_DATA {
+ DWORD NotificationSource;
+ DWORD NotificationCode;
+ GUID InterfaceGuid;
+ DWORD dwDataSize;
+ PVOID pData;
+};
+
+enum WLAN_INTERFACE_STATE {
+ wlan_interface_state_not_ready = 0,
+ wlan_interface_state_connected,
+ wlan_interface_state_ad_hoc_network_formed,
+ wlan_interface_state_disconnecting,
+ wlan_interface_state_disconnected,
+ wlan_interface_state_associating,
+ wlan_interface_state_discovering,
+ wlan_interface_state_authenticating
+};
+
+struct WLAN_INTERFACE_INFO {
+ GUID InterfaceGuid;
+ WCHAR strInterfaceDescription[WLAN_MAX_NAME_LENGTH];
+ WLAN_INTERFACE_STATE isState;
+};
+
+struct WLAN_INTERFACE_INFO_LIST {
+ DWORD dwNumberOfItems;
+ DWORD dwIndex;
+ WLAN_INTERFACE_INFO InterfaceInfo[1];
+};
+
+struct DOT11_SSID {
+ ULONG uSSIDLength;
+ UCHAR ucSSID[DOT11_SSID_MAX_LENGTH];
+};
+
+struct NDIS_OBJECT_HEADER {
+ UCHAR Type;
+ UCHAR Revision;
+ USHORT Size;
+};
+
+typedef UCHAR DOT11_MAC_ADDRESS[6];
+struct DOT11_BSSID_LIST {
+ NDIS_OBJECT_HEADER Header;
+ ULONG uNumberOfEntries;
+ ULONG uTotalNumOfEntries;
+ DOT11_MAC_ADDRESS BSSIDs[1];
+};
+
+enum DOT11_BSS_TYPE {
+ dot11_BSS_type_infrastructure = 1,
+ dot11_BSS_type_independent = 2,
+ dot11_BSS_type_any = 3
+};
+
+enum DOT11_PHY_TYPE {
+ dot11_phy_type_unknown = 0,
+ dot11_phy_type_any = dot11_phy_type_unknown,
+ dot11_phy_type_fhss = 1,
+ dot11_phy_type_dsss = 2,
+ dot11_phy_type_irbaseband = 3,
+ dot11_phy_type_ofdm = 4,
+ dot11_phy_type_hrdsss = 5,
+ dot11_phy_type_erp = 6,
+ dot11_phy_type_ht = 7,
+ dot11_phy_type_IHV_start = 0x80000000,
+ dot11_phy_type_IHV_end = 0xffffffff
+};
+
+enum DOT11_AUTH_ALGORITHM {
+ DOT11_AUTH_ALGO_80211_OPEN = 1,
+ DOT11_AUTH_ALGO_80211_SHARED_KEY = 2,
+ DOT11_AUTH_ALGO_WPA = 3,
+ DOT11_AUTH_ALGO_WPA_PSK = 4,
+ DOT11_AUTH_ALGO_WPA_NONE = 5,
+ DOT11_AUTH_ALGO_RSNA = 6,
+ DOT11_AUTH_ALGO_RSNA_PSK = 7,
+ DOT11_AUTH_ALGO_IHV_START = 0x80000000,
+ DOT11_AUTH_ALGO_IHV_END = 0xffffffff
+};
+
+enum DOT11_CIPHER_ALGORITHM {
+ DOT11_CIPHER_ALGO_NONE = 0x00,
+ DOT11_CIPHER_ALGO_WEP40 = 0x01,
+ DOT11_CIPHER_ALGO_TKIP = 0x02,
+ DOT11_CIPHER_ALGO_CCMP = 0x04,
+ DOT11_CIPHER_ALGO_WEP104 = 0x05,
+ DOT11_CIPHER_ALGO_WPA_USE_GROUP = 0x100,
+ DOT11_CIPHER_ALGO_RSN_USE_GROUP = 0x100,
+ DOT11_CIPHER_ALGO_WEP = 0x101,
+ DOT11_CIPHER_ALGO_IHV_START = 0x80000000,
+ DOT11_CIPHER_ALGO_IHV_END = 0xffffffff
+};
+
+struct WLAN_AVAILABLE_NETWORK {
+ WCHAR strProfileName[WLAN_MAX_NAME_LENGTH];
+ DOT11_SSID dot11Ssid;
+ DOT11_BSS_TYPE dot11BssType;
+ ULONG uNumberOfBssids;
+ BOOL bNetworkConnectable;
+ DWORD wlanNotConnectableReason;
+ ULONG uNumberOfPhyTypes;
+ DOT11_PHY_TYPE dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER];
+ BOOL bMorePhyTypes;
+ ULONG wlanSignalQuality;
+ BOOL bSecurityEnabled;
+ DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;
+ DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;
+ DWORD dwFlags;
+ DWORD dwReserved;
+};
+
+struct WLAN_AVAILABLE_NETWORK_LIST {
+ DWORD dwNumberOfItems;
+ DWORD dwIndex;
+ WLAN_AVAILABLE_NETWORK Network[1];
+};
+
+enum WLAN_INTF_OPCODE {
+ wlan_intf_opcode_autoconf_start = 0x000000000,
+ wlan_intf_opcode_autoconf_enabled,
+ wlan_intf_opcode_background_scan_enabled,
+ wlan_intf_opcode_media_streaming_mode,
+ wlan_intf_opcode_radio_state,
+ wlan_intf_opcode_bss_type,
+ wlan_intf_opcode_interface_state,
+ wlan_intf_opcode_current_connection,
+ wlan_intf_opcode_channel_number,
+ wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs,
+ wlan_intf_opcode_supported_adhoc_auth_cipher_pairs,
+ wlan_intf_opcode_supported_country_or_region_string_list,
+ wlan_intf_opcode_current_operation_mode,
+ wlan_intf_opcode_supported_safe_mode,
+ wlan_intf_opcode_certified_safe_mode,
+ wlan_intf_opcode_autoconf_end = 0x0fffffff,
+ wlan_intf_opcode_msm_start = 0x10000100,
+ wlan_intf_opcode_statistics,
+ wlan_intf_opcode_rssi,
+ wlan_intf_opcode_msm_end = 0x1fffffff,
+ wlan_intf_opcode_security_start = 0x20010000,
+ wlan_intf_opcode_security_end = 0x2fffffff,
+ wlan_intf_opcode_ihv_start = 0x30000000,
+ wlan_intf_opcode_ihv_end = 0x3fffffff
+};
+
+enum WLAN_OPCODE_VALUE_TYPE {
+ wlan_opcode_value_type_query_only = 0,
+ wlan_opcode_value_type_set_by_group_policy,
+ wlan_opcode_value_type_set_by_user,
+ wlan_opcode_value_type_invalid
+};
+
+enum WLAN_CONNECTION_MODE {
+ wlan_connection_mode_profile = 0,
+ wlan_connection_mode_temporary_profile,
+ wlan_connection_mode_discovery_secure,
+ wlan_connection_mode_discovery_unsecure,
+ wlan_connection_mode_auto,
+ wlan_connection_mode_invalid
+};
+
+struct WLAN_CONNECTION_PARAMETERS {
+ WLAN_CONNECTION_MODE wlanConnectionMode;
+ LPCWSTR strProfile;
+ DOT11_SSID *pDot11Ssid;
+ DOT11_BSSID_LIST *pDesiredBssidList;
+ DOT11_BSS_TYPE dot11BssType;
+ DWORD dwFlags;
+};
+
+struct WLAN_RAW_DATA {
+ DWORD dwDataSize;
+ BYTE DataBlob[1];
+};
+
+enum WLAN_NOTIFICATION_ACM {
+ wlan_notification_acm_start = 0,
+ wlan_notification_acm_autoconf_enabled,
+ wlan_notification_acm_autoconf_disabled,
+ wlan_notification_acm_background_scan_enabled,
+ wlan_notification_acm_background_scan_disabled,
+ wlan_notification_acm_bss_type_change,
+ wlan_notification_acm_power_setting_change,
+ wlan_notification_acm_scan_complete,
+ wlan_notification_acm_scan_fail,
+ wlan_notification_acm_connection_start,
+ wlan_notification_acm_connection_complete,
+ wlan_notification_acm_connection_attempt_fail,
+ wlan_notification_acm_filter_list_change,
+ wlan_notification_acm_interface_arrival,
+ wlan_notification_acm_interface_removal,
+ wlan_notification_acm_profile_change,
+ wlan_notification_acm_profile_name_change,
+ wlan_notification_acm_profiles_exhausted,
+ wlan_notification_acm_network_not_available,
+ wlan_notification_acm_network_available,
+ wlan_notification_acm_disconnecting,
+ wlan_notification_acm_disconnected,
+ wlan_notification_acm_adhoc_network_state_change,
+ wlan_notification_acm_end
+};
+
+struct WLAN_ASSOCIATION_ATTRIBUTES {
+ DOT11_SSID dot11Ssid;
+ DOT11_BSS_TYPE dot11BssType;
+ DOT11_MAC_ADDRESS dot11Bssid;
+ DOT11_PHY_TYPE dot11PhyType;
+ ULONG uDot11PhyIndex;
+ ULONG wlanSignalQuality;
+ ULONG ulRxRate;
+ ULONG ulTxRate;
+};
+
+struct WLAN_SECURITY_ATTRIBUTES {
+ BOOL bSecurityEnabled;
+ BOOL bOneXEnabled;
+ DOT11_AUTH_ALGORITHM dot11AuthAlgorithm;
+ DOT11_CIPHER_ALGORITHM dot11CipherAlgorithm;
+};
+
+struct WLAN_CONNECTION_ATTRIBUTES {
+ WLAN_INTERFACE_STATE isState;
+ WLAN_CONNECTION_MODE wlanConnectionMode;
+ WCHAR strProfileName[WLAN_MAX_NAME_LENGTH];
+ WLAN_ASSOCIATION_ATTRIBUTES wlanAssociationAttributes;
+ WLAN_SECURITY_ATTRIBUTES wlanSecurityAttributes;
+};
+
+typedef void (WINAPI *WLAN_NOTIFICATION_CALLBACK)(WLAN_NOTIFICATION_DATA *, PVOID);
+
+typedef DWORD (WINAPI *WlanOpenHandleProto)
+ (DWORD dwClientVersion, PVOID pReserved, PDWORD pdwNegotiatedVersion, PHANDLE phClientHandle);
+typedef DWORD (WINAPI *WlanRegisterNotificationProto)
+ (HANDLE hClientHandle, DWORD dwNotifSource, BOOL bIgnoreDuplicate,
+ WLAN_NOTIFICATION_CALLBACK funcCallback, PVOID pCallbackContext,
+ PVOID pReserved, PDWORD pdwPrevNotifSource);
+typedef DWORD (WINAPI *WlanEnumInterfacesProto)
+ (HANDLE hClientHandle, PVOID pReserved, WLAN_INTERFACE_INFO_LIST **ppInterfaceList);
+typedef DWORD (WINAPI *WlanGetAvailableNetworkListProto)
+ (HANDLE hClientHandle, const GUID* pInterfaceGuid, DWORD dwFlags, PVOID pReserved,
+ WLAN_AVAILABLE_NETWORK_LIST **ppAvailableNetworkList);
+typedef DWORD (WINAPI *WlanQueryInterfaceProto)
+ (HANDLE hClientHandle, const GUID *pInterfaceGuid, WLAN_INTF_OPCODE OpCode, PVOID pReserved,
+ PDWORD pdwDataSize, PVOID *ppData, WLAN_OPCODE_VALUE_TYPE *pWlanOpcodeValueType);
+typedef DWORD (WINAPI *WlanConnectProto)
+ (HANDLE hClientHandle, const GUID *pInterfaceGuid,
+ const WLAN_CONNECTION_PARAMETERS *pConnectionParameters, PVOID pReserved);
+typedef DWORD (WINAPI *WlanDisconnectProto)
+ (HANDLE hClientHandle, const GUID *pInterfaceGuid, PVOID pReserved);
+typedef DWORD (WINAPI *WlanScanProto)
+ (HANDLE hClientHandle, const GUID *pInterfaceGuid, const DOT11_SSID *pDot11Ssid,
+ const WLAN_RAW_DATA *pIeData, PVOID pReserved);
+typedef VOID (WINAPI *WlanFreeMemoryProto)(PVOID pMemory);
+typedef DWORD (WINAPI *WlanCloseHandleProto)(HANDLE hClientHandle, PVOID pReserved);
+
+extern WlanOpenHandleProto local_WlanOpenHandle;
+extern WlanRegisterNotificationProto local_WlanRegisterNotification;
+extern WlanEnumInterfacesProto local_WlanEnumInterfaces;
+extern WlanGetAvailableNetworkListProto local_WlanGetAvailableNetworkList;
+extern WlanQueryInterfaceProto local_WlanQueryInterface;
+extern WlanConnectProto local_WlanConnect;
+extern WlanDisconnectProto local_WlanDisconnect;
+extern WlanScanProto local_WlanScan;
+extern WlanFreeMemoryProto local_WlanFreeMemory;
+extern WlanCloseHandleProto local_WlanCloseHandle;
+
+QT_END_NAMESPACE
+
+#endif // PLATFORMDEFS_H
diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
new file mode 100644
index 0000000000..16c2239190
--- /dev/null
+++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
@@ -0,0 +1,611 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnativewifiengine.h"
+#include "platformdefs.h"
+#include "../qnetworksession_impl.h"
+
+#include <QtNetwork/private/qnetworkconfiguration_p.h>
+
+#include <QtCore/qstringlist.h>
+#include <QtCore/qcoreapplication.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+WlanOpenHandleProto local_WlanOpenHandle = 0;
+WlanRegisterNotificationProto local_WlanRegisterNotification = 0;
+WlanEnumInterfacesProto local_WlanEnumInterfaces = 0;
+WlanGetAvailableNetworkListProto local_WlanGetAvailableNetworkList = 0;
+WlanQueryInterfaceProto local_WlanQueryInterface = 0;
+WlanConnectProto local_WlanConnect = 0;
+WlanDisconnectProto local_WlanDisconnect = 0;
+WlanScanProto local_WlanScan = 0;
+WlanFreeMemoryProto local_WlanFreeMemory = 0;
+WlanCloseHandleProto local_WlanCloseHandle = 0;
+
+void qNotificationCallback(WLAN_NOTIFICATION_DATA *data, QNativeWifiEngine *d)
+{
+ Q_UNUSED(d);
+
+ switch (data->NotificationCode) {
+ case wlan_notification_acm_connection_complete:
+ case wlan_notification_acm_disconnected:
+ QMetaObject::invokeMethod(d, "scanComplete", Qt::QueuedConnection);
+ break;
+ default:
+ ;
+ }
+}
+
+QNativeWifiEngine::QNativeWifiEngine(QObject *parent)
+: QBearerEngineImpl(parent), handle(INVALID_HANDLE_VALUE)
+{
+ connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(closeHandle()));
+}
+
+QNativeWifiEngine::~QNativeWifiEngine()
+{
+ closeHandle();
+}
+
+void QNativeWifiEngine::scanComplete()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!available()) {
+ locker.unlock();
+ emit updateCompleted();
+ return;
+ }
+
+ // enumerate interfaces
+ WLAN_INTERFACE_INFO_LIST *interfaceList;
+ DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
+#endif
+
+ locker.unlock();
+ emit updateCompleted();
+
+ return;
+ }
+
+ QStringList previous = accessPointConfigurations.keys();
+
+ for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
+ const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
+
+ WLAN_AVAILABLE_NETWORK_LIST *networkList;
+ result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid,
+ 3, 0, &networkList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n",
+ __FUNCTION__, result);
+#endif
+ continue;
+ }
+
+ QStringList seenNetworks;
+
+ for (unsigned int j = 0; j < networkList->dwNumberOfItems; ++j) {
+ WLAN_AVAILABLE_NETWORK &network = networkList->Network[j];
+
+ QString networkName;
+
+ if (network.strProfileName[0] != 0) {
+ networkName = QString::fromWCharArray(network.strProfileName);
+ } else {
+ networkName = QByteArray(reinterpret_cast<char *>(network.dot11Ssid.ucSSID),
+ network.dot11Ssid.uSSIDLength);
+ }
+
+ const QString id = QString::number(qHash(QLatin1String("WLAN:") + networkName));
+
+ previous.removeAll(id);
+
+ QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
+
+ if (!(network.dwFlags & WLAN_AVAILABLE_NETWORK_HAS_PROFILE))
+ state = QNetworkConfiguration::Undefined;
+
+ if (network.strProfileName[0] != 0) {
+ if (network.bNetworkConnectable) {
+ if (network.dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)
+ state = QNetworkConfiguration::Active;
+ else
+ state = QNetworkConfiguration::Discovered;
+ } else {
+ state = QNetworkConfiguration::Defined;
+ }
+ }
+
+ if (seenNetworks.contains(networkName))
+ continue;
+ else
+ seenNetworks.append(networkName);
+
+ if (accessPointConfigurations.contains(id)) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ bool changed = false;
+
+ ptr->mutex.lock();
+
+ if (!ptr->isValid) {
+ ptr->isValid = true;
+ changed = true;
+ }
+
+ if (ptr->name != networkName) {
+ ptr->name = networkName;
+ changed = true;
+ }
+
+ if (ptr->state != state) {
+ ptr->state = state;
+ changed = true;
+ }
+
+ ptr->mutex.unlock();
+
+ if (changed) {
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+ } else {
+ QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
+
+ ptr->name = networkName;
+ ptr->isValid = true;
+ ptr->id = id;
+ ptr->state = state;
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ ptr->bearerType = QNetworkConfiguration::BearerWLAN;
+
+ accessPointConfigurations.insert(id, ptr);
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+ locker.relock();
+ }
+ }
+
+ local_WlanFreeMemory(networkList);
+ }
+
+ local_WlanFreeMemory(interfaceList);
+
+ while (!previous.isEmpty()) {
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.take(previous.takeFirst());
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+
+ locker.unlock();
+ emit updateCompleted();
+}
+
+QString QNativeWifiEngine::getInterfaceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (!available())
+ return QString();
+
+ // enumerate interfaces
+ WLAN_INTERFACE_INFO_LIST *interfaceList;
+ DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
+#endif
+ return QString();
+ }
+
+ for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
+ const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
+
+ DWORD dataSize;
+ WLAN_CONNECTION_ATTRIBUTES *connectionAttributes;
+ result = local_WlanQueryInterface(handle, &interface.InterfaceGuid,
+ wlan_intf_opcode_current_connection, 0, &dataSize,
+ reinterpret_cast<PVOID *>(&connectionAttributes), 0);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ if (result != ERROR_INVALID_STATE)
+ qDebug("%s: WlanQueryInterface failed with error %ld\n", __FUNCTION__, result);
+#endif
+
+ continue;
+ }
+
+ if (qHash(QLatin1String("WLAN:") +
+ QString::fromWCharArray(connectionAttributes->strProfileName)) == id.toUInt()) {
+ QString guid("{%1-%2-%3-%4%5-%6%7%8%9%10%11}");
+
+ guid = guid.arg(interface.InterfaceGuid.Data1, 8, 16, QChar('0'));
+ guid = guid.arg(interface.InterfaceGuid.Data2, 4, 16, QChar('0'));
+ guid = guid.arg(interface.InterfaceGuid.Data3, 4, 16, QChar('0'));
+ for (int i = 0; i < 8; ++i)
+ guid = guid.arg(interface.InterfaceGuid.Data4[i], 2, 16, QChar('0'));
+
+ local_WlanFreeMemory(connectionAttributes);
+ local_WlanFreeMemory(interfaceList);
+
+ return guid.toUpper();
+ }
+
+ local_WlanFreeMemory(connectionAttributes);
+ }
+
+ local_WlanFreeMemory(interfaceList);
+
+ return QString();
+}
+
+bool QNativeWifiEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (!available())
+ return false;
+
+ // enumerate interfaces
+ WLAN_INTERFACE_INFO_LIST *interfaceList;
+ DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
+#endif
+ return false;
+ }
+
+ for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
+ const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
+
+ WLAN_AVAILABLE_NETWORK_LIST *networkList;
+ result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid,
+ 3, 0, &networkList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n",
+ __FUNCTION__, result);
+#endif
+ continue;
+ }
+
+ for (unsigned int j = 0; j < networkList->dwNumberOfItems; ++j) {
+ WLAN_AVAILABLE_NETWORK &network = networkList->Network[j];
+
+ QString networkName;
+
+ if (network.strProfileName[0] != 0) {
+ networkName = QString::fromWCharArray(network.strProfileName);
+ } else {
+ networkName = QByteArray(reinterpret_cast<char *>(network.dot11Ssid.ucSSID),
+ network.dot11Ssid.uSSIDLength);
+ }
+
+ if (qHash(QLatin1String("WLAN:") + networkName) == id.toUInt()) {
+ local_WlanFreeMemory(networkList);
+ local_WlanFreeMemory(interfaceList);
+ return true;
+ }
+ }
+
+ local_WlanFreeMemory(networkList);
+ }
+
+ local_WlanFreeMemory(interfaceList);
+
+ return false;
+}
+
+void QNativeWifiEngine::connectToId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (!available()) {
+ locker.unlock();
+ emit connectionError(id, InterfaceLookupError);
+ return;
+ }
+
+ WLAN_INTERFACE_INFO_LIST *interfaceList;
+ DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
+#endif
+ locker.unlock();
+ emit connectionError(id, InterfaceLookupError);
+ return;
+ }
+
+ QString profile;
+
+ for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
+ const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i];
+
+ WLAN_AVAILABLE_NETWORK_LIST *networkList;
+ result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid,
+ 3, 0, &networkList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n",
+ __FUNCTION__, result);
+#endif
+ continue;
+ }
+
+ for (unsigned int j = 0; j < networkList->dwNumberOfItems; ++j) {
+ WLAN_AVAILABLE_NETWORK &network = networkList->Network[j];
+
+ profile = QString::fromWCharArray(network.strProfileName);
+
+ if (qHash(QLatin1String("WLAN:") + profile) == id.toUInt())
+ break;
+ else
+ profile.clear();
+ }
+
+ local_WlanFreeMemory(networkList);
+
+ if (!profile.isEmpty()) {
+ WLAN_CONNECTION_PARAMETERS parameters;
+ parameters.wlanConnectionMode = wlan_connection_mode_profile;
+ parameters.strProfile = reinterpret_cast<LPCWSTR>(profile.utf16());
+ parameters.pDot11Ssid = 0;
+ parameters.pDesiredBssidList = 0;
+ parameters.dot11BssType = dot11_BSS_type_any;
+ parameters.dwFlags = 0;
+
+ DWORD result = local_WlanConnect(handle, &interface.InterfaceGuid, &parameters, 0);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanConnect failed with error %ld\n", __FUNCTION__, result);
+#endif
+ locker.unlock();
+ emit connectionError(id, ConnectError);
+ locker.relock();
+ break;
+ }
+
+ break;
+ }
+ }
+
+ local_WlanFreeMemory(interfaceList);
+
+ if (profile.isEmpty()) {
+ locker.unlock();
+ emit connectionError(id, InterfaceLookupError);
+ }
+}
+
+void QNativeWifiEngine::disconnectFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (!available()) {
+ locker.unlock();
+ emit connectionError(id, InterfaceLookupError);
+ return;
+ }
+
+ QString interface = getInterfaceFromId(id);
+
+ if (interface.isEmpty()) {
+ locker.unlock();
+ emit connectionError(id, InterfaceLookupError);
+ return;
+ }
+
+ QStringList split = interface.mid(1, interface.length() - 2).split('-');
+
+ GUID guid;
+ guid.Data1 = split.at(0).toUInt(0, 16);
+ guid.Data2 = split.at(1).toUShort(0, 16);
+ guid.Data3 = split.at(2).toUShort(0, 16);
+ guid.Data4[0] = split.at(3).left(2).toUShort(0, 16);
+ guid.Data4[1] = split.at(3).right(2).toUShort(0, 16);
+ for (int i = 0; i < 6; ++i)
+ guid.Data4[i + 2] = split.at(4).mid(i*2, 2).toUShort(0, 16);
+
+ DWORD result = local_WlanDisconnect(handle, &guid, 0);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanDisconnect failed with error %ld\n", __FUNCTION__, result);
+#endif
+ locker.unlock();
+ emit connectionError(id, DisconnectionError);
+ return;
+ }
+}
+
+void QNativeWifiEngine::initialize()
+{
+ scanComplete();
+}
+
+void QNativeWifiEngine::requestUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!available()) {
+ locker.unlock();
+ emit updateCompleted();
+ return;
+ }
+
+ // enumerate interfaces
+ WLAN_INTERFACE_INFO_LIST *interfaceList;
+ DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result);
+#endif
+
+ locker.unlock();
+ emit updateCompleted();
+
+ return;
+ }
+
+ bool requested = false;
+ for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) {
+ result = local_WlanScan(handle, &interfaceList->InterfaceInfo[i].InterfaceGuid, 0, 0, 0);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: WlanScan failed with error %ld\n", __FUNCTION__, result);
+#endif
+ } else {
+ requested = true;
+ }
+ }
+
+ local_WlanFreeMemory(interfaceList);
+
+ if (!requested) {
+ locker.unlock();
+ emit updateCompleted();
+ }
+}
+
+QNetworkSession::State QNativeWifiEngine::sessionStateForId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ if (!ptr)
+ return QNetworkSession::Invalid;
+
+ if (!ptr->isValid) {
+ return QNetworkSession::Invalid;
+ } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ return QNetworkSession::Connected;
+ } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
+ QNetworkConfiguration::Discovered) {
+ return QNetworkSession::Disconnected;
+ } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
+ return QNetworkSession::NotAvailable;
+ } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
+ QNetworkConfiguration::Undefined) {
+ return QNetworkSession::NotAvailable;
+ }
+
+ return QNetworkSession::Invalid;
+}
+
+QNetworkConfigurationManager::Capabilities QNativeWifiEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::ForcedRoaming |
+ QNetworkConfigurationManager::CanStartAndStopInterfaces;
+}
+
+QNetworkSessionPrivate *QNativeWifiEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl;
+}
+
+QNetworkConfigurationPrivatePointer QNativeWifiEngine::defaultConfiguration()
+{
+ return QNetworkConfigurationPrivatePointer();
+}
+
+bool QNativeWifiEngine::available()
+{
+ if (handle != INVALID_HANDLE_VALUE)
+ return true;
+
+ DWORD clientVersion;
+
+ DWORD result = local_WlanOpenHandle(1, 0, &clientVersion, &handle);
+ if (result != ERROR_SUCCESS) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ if (result != ERROR_SERVICE_NOT_ACTIVE)
+ qDebug("%s: WlanOpenHandle failed with error %ld\n", __FUNCTION__, result);
+#endif
+
+ return false;
+ }
+
+ result = local_WlanRegisterNotification(handle, WLAN_NOTIFICATION_SOURCE_ALL, true,
+ WLAN_NOTIFICATION_CALLBACK(qNotificationCallback),
+ this, 0, 0);
+#ifdef BEARER_MANAGEMENT_DEBUG
+ if (result != ERROR_SUCCESS)
+ qDebug("%s: WlanRegisterNotification failed with error %ld\n", __FUNCTION__, result);
+#endif
+
+ return handle != INVALID_HANDLE_VALUE;
+}
+
+void QNativeWifiEngine::closeHandle()
+{
+ if (handle != INVALID_HANDLE_VALUE) {
+ local_WlanCloseHandle(handle, 0);
+ handle = INVALID_HANDLE_VALUE;
+ }
+}
+
+bool QNativeWifiEngine::requiresPolling() const
+{
+ // On Windows XP SP2 and SP3 only connection and disconnection notifications are available.
+ // We need to poll for changes in available wireless networks.
+ return true;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.h b/src/plugins/bearer/nativewifi/qnativewifiengine.h
new file mode 100644
index 0000000000..712aecd2b2
--- /dev/null
+++ b/src/plugins/bearer/nativewifi/qnativewifiengine.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNATIVEWIFIENGINE_P_H
+#define QNATIVEWIFIENGINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "../qbearerengine_impl.h"
+
+#include <QtCore/qtimer.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkConfigurationPrivate;
+struct WLAN_NOTIFICATION_DATA;
+
+class QNativeWifiEngine : public QBearerEngineImpl
+{
+ Q_OBJECT
+
+public:
+ QNativeWifiEngine(QObject *parent = 0);
+ ~QNativeWifiEngine();
+
+ QString getInterfaceFromId(const QString &id);
+ bool hasIdentifier(const QString &id);
+
+ void connectToId(const QString &id);
+ void disconnectFromId(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkSession::State sessionStateForId(const QString &id);
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+ bool available();
+
+ bool requiresPolling() const;
+
+private Q_SLOTS:
+ void scanComplete();
+ void closeHandle();
+
+private:
+ Qt::HANDLE handle;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif
diff --git a/src/plugins/bearer/networkmanager/main.cpp b/src/plugins/bearer/networkmanager/main.cpp
new file mode 100644
index 0000000000..43dacca709
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/main.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnetworkmanagerengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkManagerEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QNetworkManagerEnginePlugin();
+ ~QNetworkManagerEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QNetworkManagerEnginePlugin::QNetworkManagerEnginePlugin()
+{
+}
+
+QNetworkManagerEnginePlugin::~QNetworkManagerEnginePlugin()
+{
+}
+
+QStringList QNetworkManagerEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("networkmanager");
+}
+
+QBearerEngine *QNetworkManagerEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("networkmanager")) {
+ QNetworkManagerEngine *engine = new QNetworkManagerEngine;
+ if (engine->networkManagerAvailable())
+ return engine;
+ else
+ delete engine;
+ }
+
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QNetworkManagerEnginePlugin)
+Q_EXPORT_PLUGIN2(qnmbearer, QNetworkManagerEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/networkmanager/networkmanager.pro b/src/plugins/bearer/networkmanager/networkmanager.pro
new file mode 100644
index 0000000000..e39626336c
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/networkmanager.pro
@@ -0,0 +1,20 @@
+TARGET = qnmbearer
+include(../../qpluginbase.pri)
+
+QT = core network dbus
+
+HEADERS += qnmdbushelper.h \
+ qnetworkmanagerservice.h \
+ qnetworkmanagerengine.h \
+ ../qnetworksession_impl.h \
+ ../qbearerengine_impl.h
+
+SOURCES += main.cpp \
+ qnmdbushelper.cpp \
+ qnetworkmanagerservice.cpp \
+ qnetworkmanagerengine.cpp \
+ ../qnetworksession_impl.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
new file mode 100644
index 0000000000..6b37b38e8c
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -0,0 +1,911 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnetworkmanagerengine.h"
+#include "qnetworkmanagerservice.h"
+#include "../qnetworksession_impl.h"
+
+#include <QtNetwork/private/qnetworkconfiguration_p.h>
+
+#include <QtNetwork/qnetworksession.h>
+
+#include <QtCore/qdebug.h>
+
+#include <QtDBus>
+#include <QDBusConnection>
+#include <QDBusError>
+#include <QDBusInterface>
+#include <QDBusMessage>
+#include <QDBusReply>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
+: QBearerEngineImpl(parent),
+ interface(new QNetworkManagerInterface(this)),
+ systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE_SYSTEM_SETTINGS, this)),
+ userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE_USER_SETTINGS, this))
+{
+ if (!interface->isValid())
+ return;
+
+ interface->setConnections();
+ connect(interface, SIGNAL(deviceAdded(QDBusObjectPath)),
+ this, SLOT(deviceAdded(QDBusObjectPath)));
+ connect(interface, SIGNAL(deviceRemoved(QDBusObjectPath)),
+ this, SLOT(deviceRemoved(QDBusObjectPath)));
+#if 0
+ connect(interface, SIGNAL(stateChanged(const QString,quint32)),
+ this, SIGNAL(configurationsChanged()));
+#endif
+ connect(interface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
+ this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
+ connect(interface, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
+ this, SLOT(interfacePropertiesChanged(QString,QMap<QString,QVariant>)));
+
+ qDBusRegisterMetaType<QNmSettingsMap>();
+
+ systemSettings->setConnections();
+ connect(systemSettings, SIGNAL(newConnection(QDBusObjectPath)),
+ this, SLOT(newConnection(QDBusObjectPath)));
+
+ userSettings->setConnections();
+ connect(userSettings, SIGNAL(newConnection(QDBusObjectPath)),
+ this, SLOT(newConnection(QDBusObjectPath)));
+}
+
+QNetworkManagerEngine::~QNetworkManagerEngine()
+{
+ qDeleteAll(connections);
+ qDeleteAll(accessPoints);
+ qDeleteAll(wirelessDevices);
+ qDeleteAll(activeConnections);
+}
+
+void QNetworkManagerEngine::initialize()
+{
+ QMutexLocker locker(&mutex);
+
+ // Get current list of access points.
+ foreach (const QDBusObjectPath &devicePath, interface->getDevices()) {
+ locker.unlock();
+ deviceAdded(devicePath);
+ locker.relock();
+ }
+
+ // Get connections.
+ foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
+ locker.unlock();
+ newConnection(settingsPath, systemSettings);
+ locker.relock();
+ }
+ foreach (const QDBusObjectPath &settingsPath, userSettings->listConnections()) {
+ locker.unlock();
+ newConnection(settingsPath, userSettings);
+ locker.relock();
+ }
+
+ // Get active connections.
+ foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
+ QNetworkManagerConnectionActive *activeConnection =
+ new QNetworkManagerConnectionActive(acPath.path());
+ activeConnections.insert(acPath.path(), activeConnection);
+
+ activeConnection->setConnections();
+ connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
+ this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
+ }
+}
+
+bool QNetworkManagerEngine::networkManagerAvailable() const
+{
+ QMutexLocker locker(&mutex);
+
+ return interface->isValid();
+}
+
+QString QNetworkManagerEngine::getInterfaceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
+ QNetworkManagerConnectionActive activeConnection(acPath.path());
+
+ const QString identifier = QString::number(qHash(activeConnection.serviceName() + ' ' +
+ activeConnection.connection().path()));
+
+ if (id == identifier) {
+ QList<QDBusObjectPath> devices = activeConnection.devices();
+
+ if (devices.isEmpty())
+ continue;
+
+ QNetworkManagerInterfaceDevice device(devices.at(0).path());
+ return device.networkInterface();
+ }
+ }
+
+ return QString();
+}
+
+bool QNetworkManagerEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ if (connectionFromId(id))
+ return true;
+
+ for (int i = 0; i < accessPoints.count(); ++i) {
+ QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
+
+ const QString identifier =
+ QString::number(qHash(accessPoint->connectionInterface()->path()));
+
+ if (id == identifier)
+ return true;
+ }
+
+ return false;
+}
+
+void QNetworkManagerEngine::connectToId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkManagerSettingsConnection *connection = connectionFromId(id);
+
+ if (!connection)
+ return;
+
+ QNmSettingsMap map = connection->getSettings();
+ const QString connectionType = map.value("connection").value("type").toString();
+
+ QString dbusDevicePath;
+ foreach (const QDBusObjectPath &devicePath, interface->getDevices()) {
+ QNetworkManagerInterfaceDevice device(devicePath.path());
+ if (device.deviceType() == DEVICE_TYPE_802_3_ETHERNET &&
+ connectionType == QLatin1String("802-3-ethernet")) {
+ dbusDevicePath = devicePath.path();
+ break;
+ } else if (device.deviceType() == DEVICE_TYPE_802_11_WIRELESS &&
+ connectionType == QLatin1String("802-11-wireless")) {
+ dbusDevicePath = devicePath.path();
+ break;
+ }
+ else if (device.deviceType() == DEVICE_TYPE_GSM &&
+ connectionType == QLatin1String("gsm")) {
+ dbusDevicePath = devicePath.path();
+ break;
+ }
+ }
+
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+
+ interface->activateConnection(service, QDBusObjectPath(settingsPath),
+ QDBusObjectPath(dbusDevicePath), QDBusObjectPath("/"));
+}
+
+void QNetworkManagerEngine::disconnectFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
+ QNetworkManagerConnectionActive activeConnection(acPath.path());
+
+ const QString identifier = QString::number(qHash(activeConnection.serviceName() + ' ' +
+ activeConnection.connection().path()));
+
+ if (id == identifier && accessPointConfigurations.contains(id)) {
+ interface->deactivateConnection(acPath);
+ break;
+ }
+ }
+}
+
+void QNetworkManagerEngine::requestUpdate()
+{
+ QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
+}
+
+void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
+ const QMap<QString, QVariant> &properties)
+{
+ QMutexLocker locker(&mutex);
+
+ Q_UNUSED(path)
+
+ QMapIterator<QString, QVariant> i(properties);
+ while (i.hasNext()) {
+ i.next();
+
+ if (i.key() == QLatin1String("ActiveConnections")) {
+ // Active connections changed, update configurations.
+
+ QList<QDBusObjectPath> activeConnections =
+ qdbus_cast<QList<QDBusObjectPath> >(i.value().value<QDBusArgument>());
+
+ QStringList identifiers = accessPointConfigurations.keys();
+ foreach (const QString &id, identifiers)
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ QStringList priorActiveConnections = this->activeConnections.keys();
+
+ foreach (const QDBusObjectPath &acPath, activeConnections) {
+ priorActiveConnections.removeOne(acPath.path());
+ QNetworkManagerConnectionActive *activeConnection =
+ this->activeConnections.value(acPath.path());
+ if (!activeConnection) {
+ activeConnection = new QNetworkManagerConnectionActive(acPath.path());
+ this->activeConnections.insert(acPath.path(), activeConnection);
+
+ activeConnection->setConnections();
+ connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
+ this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
+ }
+
+ const QString id = QString::number(qHash(activeConnection->serviceName() + ' ' +
+ activeConnection->connection().path()));
+
+ identifiers.removeOne(id);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+ if (ptr) {
+ ptr->mutex.lock();
+ if (activeConnection->state() == 2 &&
+ ptr->state != QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Active;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ } else {
+ ptr->mutex.unlock();
+ }
+ }
+ }
+
+ while (!priorActiveConnections.isEmpty())
+ delete this->activeConnections.take(priorActiveConnections.takeFirst());
+
+ while (!identifiers.isEmpty()) {
+ // These configurations are not active
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.value(identifiers.takeFirst());
+
+ ptr->mutex.lock();
+ if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Discovered;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ } else {
+ ptr->mutex.unlock();
+ }
+ }
+ }
+ }
+}
+
+void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &path,
+ const QMap<QString, QVariant> &properties)
+{
+ QMutexLocker locker(&mutex);
+
+ Q_UNUSED(properties)
+
+ QNetworkManagerConnectionActive *activeConnection = activeConnections.value(path);
+
+ if (!activeConnection)
+ return;
+
+ const QString id = QString::number(qHash(activeConnection->serviceName() + ' ' +
+ activeConnection->connection().path()));
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+ if (ptr) {
+ ptr->mutex.lock();
+ if (activeConnection->state() == 2 &&
+ ptr->state != QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Active;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ } else {
+ ptr->mutex.unlock();
+ }
+ }
+}
+
+void QNetworkManagerEngine::devicePropertiesChanged(const QString &path,
+ const QMap<QString, QVariant> &properties)
+{
+ Q_UNUSED(path);
+ Q_UNUSED(properties);
+}
+
+void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path)
+{
+ QNetworkManagerInterfaceDevice device(path.path());
+ if (device.deviceType() == DEVICE_TYPE_802_11_WIRELESS) {
+ QNetworkManagerInterfaceDeviceWireless *wirelessDevice =
+ new QNetworkManagerInterfaceDeviceWireless(device.connectionInterface()->path());
+
+ wirelessDevice->setConnections();
+ connect(wirelessDevice, SIGNAL(accessPointAdded(QString,QDBusObjectPath)),
+ this, SLOT(newAccessPoint(QString,QDBusObjectPath)));
+ connect(wirelessDevice, SIGNAL(accessPointRemoved(QString,QDBusObjectPath)),
+ this, SLOT(removeAccessPoint(QString,QDBusObjectPath)));
+ connect(wirelessDevice, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
+ this, SLOT(devicePropertiesChanged(QString,QMap<QString,QVariant>)));
+
+ foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints())
+ newAccessPoint(QString(), apPath);
+
+ mutex.lock();
+ wirelessDevices.insert(path.path(), wirelessDevice);
+ mutex.unlock();
+ }
+}
+
+void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path)
+{
+ QMutexLocker locker(&mutex);
+
+ delete wirelessDevices.take(path.path());
+}
+
+void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
+ QNetworkManagerSettings *settings)
+{
+ QMutexLocker locker(&mutex);
+
+ if (!settings)
+ settings = qobject_cast<QNetworkManagerSettings *>(sender());
+
+ if (!settings)
+ return;
+
+ QNetworkManagerSettingsConnection *connection =
+ new QNetworkManagerSettingsConnection(settings->connectionInterface()->service(),
+ path.path());
+ connections.append(connection);
+
+ connect(connection, SIGNAL(removed(QString)), this, SLOT(removeConnection(QString)));
+ connect(connection, SIGNAL(updated(const QNmSettingsMap&)),
+ this, SLOT(updateConnection(const QNmSettingsMap&)));
+
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+
+ QNetworkConfigurationPrivate *cpPriv =
+ parseConnection(service, settingsPath, connection->getSettings());
+
+ // Check if connection is active.
+ foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
+ QNetworkManagerConnectionActive activeConnection(acPath.path());
+
+ if (activeConnection.serviceName() == service &&
+ activeConnection.connection().path() == settingsPath &&
+ activeConnection.state() == 2) {
+ cpPriv->state |= QNetworkConfiguration::Active;
+ break;
+ }
+ }
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+}
+
+void QNetworkManagerEngine::removeConnection(const QString &path)
+{
+ QMutexLocker locker(&mutex);
+
+ Q_UNUSED(path)
+
+ QNetworkManagerSettingsConnection *connection =
+ qobject_cast<QNetworkManagerSettingsConnection *>(sender());
+ if (!connection)
+ return;
+
+ connections.removeAll(connection);
+
+ const QString id = QString::number(qHash(connection->connectionInterface()->service() + ' ' +
+ connection->connectionInterface()->path()));
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id);
+
+ connection->deleteLater();
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+}
+
+void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkManagerSettingsConnection *connection =
+ qobject_cast<QNetworkManagerSettingsConnection *>(sender());
+ if (!connection)
+ return;
+
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+
+ QNetworkConfigurationPrivate *cpPriv = parseConnection(service, settingsPath, settings);
+
+ // Check if connection is active.
+ foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
+ QNetworkManagerConnectionActive activeConnection(acPath.path());
+
+ if (activeConnection.serviceName() == service &&
+ activeConnection.connection().path() == settingsPath &&
+ activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+ cpPriv->state |= QNetworkConfiguration::Active;
+ break;
+ }
+ }
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
+
+ ptr->mutex.lock();
+
+ ptr->isValid = cpPriv->isValid;
+ ptr->name = cpPriv->name;
+ ptr->id = cpPriv->id;
+ ptr->state = cpPriv->state;
+
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ delete cpPriv;
+}
+
+void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
+{
+ QMutexLocker locker(&mutex);
+
+ QDBusPendingReply<QDBusObjectPath> reply = *watcher;
+ if (!reply.isError()) {
+ QDBusObjectPath result = reply.value();
+
+ QNetworkManagerConnectionActive activeConnection(result.path());
+
+ const QString id = QString::number(qHash(activeConnection.serviceName() + ' ' +
+ activeConnection.connection().path()));
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+ if (ptr) {
+ ptr->mutex.lock();
+ if (activeConnection.state() == 2 &&
+ ptr->state != QNetworkConfiguration::Active) {
+ ptr->state = QNetworkConfiguration::Active;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ } else {
+ ptr->mutex.unlock();
+ }
+ }
+ }
+}
+
+void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjectPath &objectPath)
+{
+ QMutexLocker locker(&mutex);
+
+ Q_UNUSED(path)
+
+ QNetworkManagerInterfaceAccessPoint *accessPoint =
+ new QNetworkManagerInterfaceAccessPoint(objectPath.path());
+ accessPoints.append(accessPoint);
+
+ accessPoint->setConnections();
+ connect(accessPoint, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
+ this, SLOT(updateAccessPoint(QMap<QString,QVariant>)));
+
+ // Check if configuration for this SSID already exists.
+ for (int i = 0; i < accessPoints.count(); ++i) {
+ if (accessPoint != accessPoints.at(i) &&
+ accessPoint->ssid() == accessPoints.at(i)->ssid()) {
+ return;
+ }
+ }
+
+ // Check if configuration exists for connection.
+ if (!accessPoint->ssid().isEmpty()) {
+ for (int i = 0; i < connections.count(); ++i) {
+ QNetworkManagerSettingsConnection *connection = connections.at(i);
+
+ if (accessPoint->ssid() == connection->getSsid()) {
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+ const QString connectionId = QString::number(qHash(service + ' ' + settingsPath));
+
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.value(connectionId);
+ ptr->mutex.lock();
+ ptr->state = QNetworkConfiguration::Discovered;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ return;
+ }
+ }
+ }
+
+ // New access point.
+ QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
+
+ ptr->name = accessPoint->ssid();
+ ptr->isValid = true;
+ ptr->id = QString::number(qHash(objectPath.path()));
+ ptr->type = QNetworkConfiguration::InternetAccessPoint;
+ if(accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) {
+ ptr->purpose = QNetworkConfiguration::PrivatePurpose;
+ } else {
+ ptr->purpose = QNetworkConfiguration::PublicPurpose;
+ }
+ ptr->state = QNetworkConfiguration::Undefined;
+ ptr->bearerType = QNetworkConfiguration::BearerWLAN;
+
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+}
+
+void QNetworkManagerEngine::removeAccessPoint(const QString &path,
+ const QDBusObjectPath &objectPath)
+{
+ QMutexLocker locker(&mutex);
+
+ Q_UNUSED(path)
+
+ for (int i = 0; i < accessPoints.count(); ++i) {
+ QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
+
+ if (accessPoint->connectionInterface()->path() == objectPath.path()) {
+ accessPoints.removeOne(accessPoint);
+
+ if (configuredAccessPoints.contains(accessPoint)) {
+ // find connection and change state to Defined
+ configuredAccessPoints.removeOne(accessPoint);
+ for (int i = 0; i < connections.count(); ++i) {
+ QNetworkManagerSettingsConnection *connection = connections.at(i);
+
+ if (accessPoint->ssid() == connection->getSsid()) {
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+ const QString connectionId =
+ QString::number(qHash(service + ' ' + settingsPath));
+
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.value(connectionId);
+ ptr->mutex.lock();
+ ptr->state = QNetworkConfiguration::Defined;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ break;
+ }
+ }
+ } else {
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.take(QString::number(qHash(objectPath.path())));
+
+ if (ptr) {
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+ }
+
+ delete accessPoint;
+
+ break;
+ }
+ }
+}
+
+void QNetworkManagerEngine::updateAccessPoint(const QMap<QString, QVariant> &map)
+{
+ QMutexLocker locker(&mutex);
+
+ Q_UNUSED(map)
+
+ QNetworkManagerInterfaceAccessPoint *accessPoint =
+ qobject_cast<QNetworkManagerInterfaceAccessPoint *>(sender());
+ if (!accessPoint)
+ return;
+
+ for (int i = 0; i < connections.count(); ++i) {
+ QNetworkManagerSettingsConnection *connection = connections.at(i);
+
+ if (accessPoint->ssid() == connection->getSsid()) {
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+ const QString connectionId = QString::number(qHash(service + ' ' + settingsPath));
+
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.value(connectionId);
+ ptr->mutex.lock();
+ ptr->state = QNetworkConfiguration::Discovered;
+ ptr->mutex.unlock();
+
+ locker.unlock();
+ emit configurationChanged(ptr);
+ return;
+ }
+ }
+}
+
+QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &service,
+ const QString &settingsPath,
+ const QNmSettingsMap &map)
+{
+ QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
+ cpPriv->name = map.value("connection").value("id").toString();
+ cpPriv->isValid = true;
+ cpPriv->id = QString::number(qHash(service + ' ' + settingsPath));
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+
+ cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
+
+ cpPriv->state = QNetworkConfiguration::Defined;
+
+ const QString connectionType = map.value("connection").value("type").toString();
+
+ if (connectionType == QLatin1String("802-3-ethernet")) {
+ cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
+ cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
+
+ foreach (const QDBusObjectPath &devicePath, interface->getDevices()) {
+ QNetworkManagerInterfaceDevice device(devicePath.path());
+ if (device.deviceType() == DEVICE_TYPE_802_3_ETHERNET) {
+ QNetworkManagerInterfaceDeviceWired wiredDevice(device.connectionInterface()->path());
+ if (wiredDevice.carrier()) {
+ cpPriv->state |= QNetworkConfiguration::Discovered;
+ break;
+ }
+
+ }
+ }
+ } else if (connectionType == QLatin1String("802-11-wireless")) {
+ cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
+
+ const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString();
+ const QString connectionSecurity = map.value("802-11-wireless").value("security").toString();
+ if(!connectionSecurity.isEmpty()) {
+ cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
+ } else {
+ cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
+ }
+ for (int i = 0; i < accessPoints.count(); ++i) {
+ if (connectionSsid == accessPoints.at(i)->ssid()) {
+ cpPriv->state |= QNetworkConfiguration::Discovered;
+ if (!configuredAccessPoints.contains(accessPoints.at(i))) {
+ configuredAccessPoints.append(accessPoints.at(i));
+
+ const QString accessPointId =
+ QString::number(qHash(accessPoints.at(i)->connectionInterface()->path()));
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.take(accessPointId);
+
+ if (ptr) {
+ mutex.unlock();
+ emit configurationRemoved(ptr);
+ mutex.lock();
+ }
+ }
+ break;
+ }
+ }
+ } else if (connectionType == "gsm") {
+ cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
+ } else if (connectionType == "cdma") {
+ cpPriv->bearerType = QNetworkConfiguration::BearerCDMA2000;
+ }
+
+ return cpPriv;
+}
+
+QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const QString &id) const
+{
+ for (int i = 0; i < connections.count(); ++i) {
+ QNetworkManagerSettingsConnection *connection = connections.at(i);
+ const QString service = connection->connectionInterface()->service();
+ const QString settingsPath = connection->connectionInterface()->path();
+
+ const QString identifier = QString::number(qHash(service + ' ' + settingsPath));
+
+ if (id == identifier)
+ return connection;
+ }
+
+ return 0;
+}
+
+QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ if (!ptr)
+ return QNetworkSession::Invalid;
+
+ if (!ptr->isValid)
+ return QNetworkSession::Invalid;
+
+ foreach (const QString &acPath, activeConnections.keys()) {
+ QNetworkManagerConnectionActive *activeConnection = activeConnections.value(acPath);
+
+ const QString identifier = QString::number(qHash(activeConnection->serviceName() + ' ' +
+ activeConnection->connection().path()));
+
+ if (id == identifier) {
+ switch (activeConnection->state()) {
+ case 0:
+ return QNetworkSession::Disconnected;
+ case 1:
+ return QNetworkSession::Connecting;
+ case 2:
+ return QNetworkSession::Connected;
+ }
+ }
+ }
+
+ if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered)
+ return QNetworkSession::Disconnected;
+ else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined)
+ return QNetworkSession::NotAvailable;
+ else if ((ptr->state & QNetworkConfiguration::Undefined) == QNetworkConfiguration::Undefined)
+ return QNetworkSession::NotAvailable;
+
+ return QNetworkSession::Invalid;
+}
+
+quint64 QNetworkManagerEngine::bytesWritten(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+ if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ const QString networkInterface = getInterfaceFromId(id);
+ if (!networkInterface.isEmpty()) {
+ const QString devFile = QLatin1String("/sys/class/net/") +
+ networkInterface +
+ QLatin1String("/statistics/tx_bytes");
+
+ quint64 result = Q_UINT64_C(0);
+
+ QFile tx(devFile);
+ if (tx.exists() && tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QTextStream in(&tx);
+ in >> result;
+ tx.close();
+ }
+
+ return result;
+ }
+ }
+
+ return Q_UINT64_C(0);
+}
+
+quint64 QNetworkManagerEngine::bytesReceived(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+ if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ const QString networkInterface = getInterfaceFromId(id);
+ if (!networkInterface.isEmpty()) {
+ const QString devFile = QLatin1String("/sys/class/net/") +
+ networkInterface +
+ QLatin1String("/statistics/rx_bytes");
+
+ quint64 result = Q_UINT64_C(0);
+
+ QFile tx(devFile);
+ if (tx.exists() && tx.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QTextStream in(&tx);
+ in >> result;
+ tx.close();
+ }
+
+ return result;
+ }
+ }
+
+ return Q_UINT64_C(0);
+}
+
+quint64 QNetworkManagerEngine::startTime(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkManagerSettingsConnection *connection = connectionFromId(id);
+ if (connection)
+ return connection->getTimestamp();
+ else
+ return Q_UINT64_C(0);
+}
+
+QNetworkConfigurationManager::Capabilities QNetworkManagerEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::ForcedRoaming |
+ QNetworkConfigurationManager::CanStartAndStopInterfaces;
+}
+
+QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl;
+}
+
+QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration()
+{
+ return QNetworkConfigurationPrivatePointer();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
new file mode 100644
index 0000000000..f9d1b9f752
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNETWORKMANAGERENGINE_P_H
+#define QNETWORKMANAGERENGINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QLibrary class. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "../qbearerengine_impl.h"
+
+#include "qnetworkmanagerservice.h"
+
+#include <QMap>
+#include <QVariant>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkManagerEngine : public QBearerEngineImpl
+{
+ Q_OBJECT
+
+public:
+ QNetworkManagerEngine(QObject *parent = 0);
+ ~QNetworkManagerEngine();
+
+ bool networkManagerAvailable() const;
+
+ QString getInterfaceFromId(const QString &id);
+ bool hasIdentifier(const QString &id);
+
+ void connectToId(const QString &id);
+ void disconnectFromId(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkSession::State sessionStateForId(const QString &id);
+
+ quint64 bytesWritten(const QString &id);
+ quint64 bytesReceived(const QString &id);
+ quint64 startTime(const QString &id);
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+private Q_SLOTS:
+ void interfacePropertiesChanged(const QString &path,
+ const QMap<QString, QVariant> &properties);
+ void activeConnectionPropertiesChanged(const QString &path,
+ const QMap<QString, QVariant> &properties);
+ void devicePropertiesChanged(const QString &path,
+ const QMap<QString, QVariant> &properties);
+
+ void deviceAdded(const QDBusObjectPath &path);
+ void deviceRemoved(const QDBusObjectPath &path);
+
+ void newConnection(const QDBusObjectPath &path, QNetworkManagerSettings *settings = 0);
+ void removeConnection(const QString &path);
+ void updateConnection(const QNmSettingsMap &settings);
+ void activationFinished(QDBusPendingCallWatcher *watcher);
+
+ void newAccessPoint(const QString &path, const QDBusObjectPath &objectPath);
+ void removeAccessPoint(const QString &path, const QDBusObjectPath &objectPath);
+ void updateAccessPoint(const QMap<QString, QVariant> &map);
+
+private:
+ QNetworkConfigurationPrivate *parseConnection(const QString &service,
+ const QString &settingsPath,
+ const QNmSettingsMap &map);
+ QNetworkManagerSettingsConnection *connectionFromId(const QString &id) const;
+
+private:
+ QNetworkManagerInterface *interface;
+ QNetworkManagerSettings *systemSettings;
+ QNetworkManagerSettings *userSettings;
+ QHash<QString, QNetworkManagerInterfaceDeviceWireless *> wirelessDevices;
+ QHash<QString, QNetworkManagerConnectionActive *> activeConnections;
+ QList<QNetworkManagerSettingsConnection *> connections;
+ QList<QNetworkManagerInterfaceAccessPoint *> accessPoints;
+ QList<QNetworkManagerInterfaceAccessPoint *> configuredAccessPoints;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif
+
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
new file mode 100644
index 0000000000..cb6385100a
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
@@ -0,0 +1,931 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QList>
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusPendingCall>
+
+#include "qnetworkmanagerservice.h"
+#include "qnmdbushelper.h"
+
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+static QDBusConnection dbusConnection = QDBusConnection::systemBus();
+
+class QNetworkManagerInterfacePrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ bool valid;
+};
+
+QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent)
+ : QObject(parent)
+{
+ d = new QNetworkManagerInterfacePrivate();
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String(NM_DBUS_INTERFACE),
+ dbusConnection);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(const QString &,QMap<QString,QVariant>)),
+ this,SIGNAL(propertiesChanged( const QString &, QMap<QString,QVariant>)));
+ connect(nmDBusHelper,SIGNAL(pathForStateChanged(const QString &, quint32)),
+ this, SIGNAL(stateChanged(const QString&, quint32)));
+
+}
+
+QNetworkManagerInterface::~QNetworkManagerInterface()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerInterface::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerInterface::setConnections()
+{
+ if(!isValid() )
+ return false;
+ bool allOk = false;
+ if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String(NM_DBUS_INTERFACE),
+ QLatin1String("PropertiesChanged"),
+ nmDBusHelper,SLOT(slotPropertiesChanged( QMap<QString,QVariant>)))) {
+ allOk = true;
+ }
+ if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String(NM_DBUS_INTERFACE),
+ QLatin1String("DeviceAdded"),
+ this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
+ allOk = true;
+ }
+ if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String(NM_DBUS_INTERFACE),
+ QLatin1String("DeviceRemoved"),
+ this,SIGNAL(deviceRemoved(QDBusObjectPath)))) {
+ allOk = true;
+ }
+
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerInterface::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+QList <QDBusObjectPath> QNetworkManagerInterface::getDevices() const
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetDevices"));
+ return reply.value();
+}
+
+void QNetworkManagerInterface::activateConnection( const QString &serviceName,
+ QDBusObjectPath connectionPath,
+ QDBusObjectPath devicePath,
+ QDBusObjectPath specificObject)
+{
+ QDBusPendingCall pendingCall = d->connectionInterface->asyncCall(QLatin1String("ActivateConnection"),
+ QVariant(serviceName),
+ QVariant::fromValue(connectionPath),
+ QVariant::fromValue(devicePath),
+ QVariant::fromValue(specificObject));
+
+ QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall, this);
+ connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
+ this, SIGNAL(activationFinished(QDBusPendingCallWatcher*)));
+}
+
+void QNetworkManagerInterface::deactivateConnection(QDBusObjectPath connectionPath) const
+{
+ d->connectionInterface->call(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
+}
+
+bool QNetworkManagerInterface::wirelessEnabled() const
+{
+ return d->connectionInterface->property("WirelessEnabled").toBool();
+}
+
+bool QNetworkManagerInterface::wirelessHardwareEnabled() const
+{
+ return d->connectionInterface->property("WirelessHardwareEnabled").toBool();
+}
+
+QList <QDBusObjectPath> QNetworkManagerInterface::activeConnections() const
+{
+ QVariant prop = d->connectionInterface->property("ActiveConnections");
+ return prop.value<QList<QDBusObjectPath> >();
+}
+
+quint32 QNetworkManagerInterface::state()
+{
+ return d->connectionInterface->property("State").toUInt();
+}
+
+class QNetworkManagerInterfaceAccessPointPrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerInterfaceAccessPoint::QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent)
+ : QObject(parent), nmDBusHelper(0)
+{
+ d = new QNetworkManagerInterfaceAccessPointPrivate();
+ d->path = dbusPathName;
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
+ dbusConnection);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+
+}
+
+QNetworkManagerInterfaceAccessPoint::~QNetworkManagerInterfaceAccessPoint()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerInterfaceAccessPoint::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerInterfaceAccessPoint::setConnections()
+{
+ if(!isValid() )
+ return false;
+
+ bool allOk = false;
+ delete nmDBusHelper;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(const QString &,QMap<QString,QVariant>)),
+ this,SIGNAL(propertiesChanged( const QString &, QMap<QString,QVariant>)));
+
+ if(dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
+ QLatin1String("PropertiesChanged"),
+ nmDBusHelper,SLOT(slotPropertiesChanged( QMap<QString,QVariant>))) ) {
+ allOk = true;
+
+ }
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerInterfaceAccessPoint::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::flags() const
+{
+ return d->connectionInterface->property("Flags").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::wpaFlags() const
+{
+ return d->connectionInterface->property("WpaFlags").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::rsnFlags() const
+{
+ return d->connectionInterface->property("RsnFlags").toUInt();
+}
+
+QString QNetworkManagerInterfaceAccessPoint::ssid() const
+{
+ return d->connectionInterface->property("Ssid").toString();
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::frequency() const
+{
+ return d->connectionInterface->property("Frequency").toUInt();
+}
+
+QString QNetworkManagerInterfaceAccessPoint::hwAddress() const
+{
+ return d->connectionInterface->property("HwAddress").toString();
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::mode() const
+{
+ return d->connectionInterface->property("Mode").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::maxBitrate() const
+{
+ return d->connectionInterface->property("MaxBitrate").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceAccessPoint::strength() const
+{
+ return d->connectionInterface->property("Strength").toUInt();
+}
+
+class QNetworkManagerInterfaceDevicePrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerInterfaceDevice::QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent)
+ : QObject(parent), nmDBusHelper(0)
+{
+ d = new QNetworkManagerInterfaceDevicePrivate();
+ d->path = deviceObjectPath;
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE),
+ dbusConnection);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+}
+
+QNetworkManagerInterfaceDevice::~QNetworkManagerInterfaceDevice()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerInterfaceDevice::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerInterfaceDevice::setConnections()
+{
+ if(!isValid() )
+ return false;
+
+ bool allOk = false;
+ delete nmDBusHelper;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper,SIGNAL(pathForStateChanged(const QString &, quint32)),
+ this, SIGNAL(stateChanged(const QString&, quint32)));
+ if(dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE),
+ QLatin1String("StateChanged"),
+ nmDBusHelper,SLOT(deviceStateChanged(quint32)))) {
+ allOk = true;
+ }
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerInterfaceDevice::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+QString QNetworkManagerInterfaceDevice::udi() const
+{
+ return d->connectionInterface->property("Udi").toString();
+}
+
+QString QNetworkManagerInterfaceDevice::networkInterface() const
+{
+ return d->connectionInterface->property("Interface").toString();
+}
+
+quint32 QNetworkManagerInterfaceDevice::ip4Address() const
+{
+ return d->connectionInterface->property("Ip4Address").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceDevice::state() const
+{
+ return d->connectionInterface->property("State").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceDevice::deviceType() const
+{
+ return d->connectionInterface->property("DeviceType").toUInt();
+}
+
+QDBusObjectPath QNetworkManagerInterfaceDevice::ip4config() const
+{
+ QVariant prop = d->connectionInterface->property("Ip4Config");
+ return prop.value<QDBusObjectPath>();
+}
+
+class QNetworkManagerInterfaceDeviceWiredPrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath, QObject *parent)
+ : QObject(parent), nmDBusHelper(0)
+{
+ d = new QNetworkManagerInterfaceDeviceWiredPrivate();
+ d->path = ifaceDevicePath;
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
+ dbusConnection, parent);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+}
+
+QNetworkManagerInterfaceDeviceWired::~QNetworkManagerInterfaceDeviceWired()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerInterfaceDeviceWired::isValid()
+{
+
+ return d->valid;
+}
+
+bool QNetworkManagerInterfaceDeviceWired::setConnections()
+{
+ if(!isValid() )
+ return false;
+
+ bool allOk = false;
+
+ delete nmDBusHelper;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(const QString &,QMap<QString,QVariant>)),
+ this,SIGNAL(propertiesChanged( const QString &, QMap<QString,QVariant>)));
+ if(dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
+ QLatin1String("PropertiesChanged"),
+ nmDBusHelper,SLOT(slotPropertiesChanged( QMap<QString,QVariant>))) ) {
+ allOk = true;
+ }
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerInterfaceDeviceWired::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+QString QNetworkManagerInterfaceDeviceWired::hwAddress() const
+{
+ return d->connectionInterface->property("HwAddress").toString();
+}
+
+quint32 QNetworkManagerInterfaceDeviceWired::speed() const
+{
+ return d->connectionInterface->property("Speed").toUInt();
+}
+
+bool QNetworkManagerInterfaceDeviceWired::carrier() const
+{
+ return d->connectionInterface->property("Carrier").toBool();
+}
+
+class QNetworkManagerInterfaceDeviceWirelessPrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath, QObject *parent)
+ : QObject(parent), nmDBusHelper(0)
+{
+ d = new QNetworkManagerInterfaceDeviceWirelessPrivate();
+ d->path = ifaceDevicePath;
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
+ dbusConnection, parent);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+}
+
+QNetworkManagerInterfaceDeviceWireless::~QNetworkManagerInterfaceDeviceWireless()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerInterfaceDeviceWireless::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerInterfaceDeviceWireless::setConnections()
+{
+ if(!isValid() )
+ return false;
+
+ bool allOk = false;
+ delete nmDBusHelper;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(const QString &,QMap<QString,QVariant>)),
+ this,SIGNAL(propertiesChanged( const QString &, QMap<QString,QVariant>)));
+
+ connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(const QString &,QDBusObjectPath)),
+ this,SIGNAL(accessPointAdded(const QString &,QDBusObjectPath)));
+
+ connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(const QString &,QDBusObjectPath)),
+ this,SIGNAL(accessPointRemoved(const QString &,QDBusObjectPath)));
+
+ if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
+ QLatin1String("AccessPointAdded"),
+ nmDBusHelper, SLOT(slotAccessPointAdded( QDBusObjectPath )))) {
+ allOk = true;
+ }
+
+
+ if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
+ QLatin1String("AccessPointRemoved"),
+ nmDBusHelper, SLOT(slotAccessPointRemoved( QDBusObjectPath )))) {
+ allOk = true;
+ }
+
+
+ if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
+ QLatin1String("PropertiesChanged"),
+ nmDBusHelper,SLOT(slotPropertiesChanged( QMap<QString,QVariant>)))) {
+ allOk = true;
+ }
+
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerInterfaceDeviceWireless::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+QList <QDBusObjectPath> QNetworkManagerInterfaceDeviceWireless::getAccessPoints()
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("GetAccessPoints"));
+ return reply.value();
+}
+
+QString QNetworkManagerInterfaceDeviceWireless::hwAddress() const
+{
+ return d->connectionInterface->property("HwAddress").toString();
+}
+
+quint32 QNetworkManagerInterfaceDeviceWireless::mode() const
+{
+ return d->connectionInterface->property("Mode").toUInt();
+}
+
+quint32 QNetworkManagerInterfaceDeviceWireless::bitrate() const
+{
+ return d->connectionInterface->property("Bitrate").toUInt();
+}
+
+QDBusObjectPath QNetworkManagerInterfaceDeviceWireless::activeAccessPoint() const
+{
+ return d->connectionInterface->property("ActiveAccessPoint").value<QDBusObjectPath>();
+}
+
+quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const
+{
+ return d->connectionInterface->property("WirelelessCapabilities").toUInt();
+}
+
+class QNetworkManagerSettingsPrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerSettings::QNetworkManagerSettings(const QString &settingsService, QObject *parent)
+ : QObject(parent)
+{
+ d = new QNetworkManagerSettingsPrivate();
+ d->path = settingsService;
+ d->connectionInterface = new QDBusInterface(settingsService,
+ QLatin1String(NM_DBUS_PATH_SETTINGS),
+ QLatin1String(NM_DBUS_IFACE_SETTINGS),
+ dbusConnection);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+}
+
+QNetworkManagerSettings::~QNetworkManagerSettings()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerSettings::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerSettings::setConnections()
+{
+ bool allOk = false;
+
+ if (!dbusConnection.connect(d->path, QLatin1String(NM_DBUS_PATH_SETTINGS),
+ QLatin1String(NM_DBUS_IFACE_SETTINGS), QLatin1String("NewConnection"),
+ this, SIGNAL(newConnection(QDBusObjectPath)))) {
+ allOk = true;
+ }
+
+ return allOk;
+}
+
+QList <QDBusObjectPath> QNetworkManagerSettings::listConnections()
+{
+ QDBusReply<QList<QDBusObjectPath> > reply = d->connectionInterface->call(QLatin1String("ListConnections"));
+ return reply.value();
+}
+
+QDBusInterface *QNetworkManagerSettings::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+
+class QNetworkManagerSettingsConnectionPrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ QString service;
+ QNmSettingsMap settingsMap;
+ bool valid;
+};
+
+QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent)
+ : QObject(parent), nmDBusHelper(0)
+{
+ qDBusRegisterMetaType<QNmSettingsMap>();
+ d = new QNetworkManagerSettingsConnectionPrivate();
+ d->path = connectionObjectPath;
+ d->service = settingsService;
+ d->connectionInterface = new QDBusInterface(settingsService,
+ d->path,
+ QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
+ dbusConnection, parent);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+ QDBusReply< QNmSettingsMap > rep = d->connectionInterface->call(QLatin1String("GetSettings"));
+ d->settingsMap = rep.value();
+}
+
+QNetworkManagerSettingsConnection::~QNetworkManagerSettingsConnection()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerSettingsConnection::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerSettingsConnection::setConnections()
+{
+ if(!isValid() )
+ return false;
+
+ bool allOk = false;
+ if(!dbusConnection.connect(d->service, d->path,
+ QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), QLatin1String("Updated"),
+ this, SIGNAL(updated(QNmSettingsMap)))) {
+ allOk = true;
+ } else {
+ QDBusError error = dbusConnection.lastError();
+ }
+
+ delete nmDBusHelper;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper, SIGNAL(pathForSettingsRemoved(const QString &)),
+ this,SIGNAL(removed( const QString &)));
+
+ if (!dbusConnection.connect(d->service, d->path,
+ QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), QLatin1String("Removed"),
+ nmDBusHelper, SIGNAL(slotSettingsRemoved()))) {
+ allOk = true;
+ }
+
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerSettingsConnection::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+QNmSettingsMap QNetworkManagerSettingsConnection::getSettings()
+{
+ QDBusReply< QNmSettingsMap > rep = d->connectionInterface->call(QLatin1String("GetSettings"));
+ d->settingsMap = rep.value();
+ return d->settingsMap;
+}
+
+NMDeviceType QNetworkManagerSettingsConnection::getType()
+{
+ const QString devType =
+ d->settingsMap.value(QLatin1String("connection")).value(QLatin1String("type")).toString();
+
+ if (devType == QLatin1String("802-3-ethernet"))
+ return DEVICE_TYPE_802_3_ETHERNET;
+ else if (devType == QLatin1String("802-11-wireless"))
+ return DEVICE_TYPE_802_11_WIRELESS;
+ else
+ return DEVICE_TYPE_UNKNOWN;
+}
+
+bool QNetworkManagerSettingsConnection::isAutoConnect()
+{
+ const QVariant autoConnect =
+ d->settingsMap.value(QLatin1String("connection")).value(QLatin1String("autoconnect"));
+
+ // NetworkManager default is to auto connect
+ if (!autoConnect.isValid())
+ return true;
+
+ return autoConnect.toBool();
+}
+
+quint64 QNetworkManagerSettingsConnection::getTimestamp()
+{
+ return d->settingsMap.value(QLatin1String("connection"))
+ .value(QLatin1String("timestamp")).toUInt();
+}
+
+QString QNetworkManagerSettingsConnection::getId()
+{
+ return d->settingsMap.value(QLatin1String("connection")).value(QLatin1String("id")).toString();
+}
+
+QString QNetworkManagerSettingsConnection::getUuid()
+{
+ const QString id = d->settingsMap.value(QLatin1String("connection"))
+ .value(QLatin1String("uuid")).toString();
+
+ // is no uuid, return the connection path
+ return id.isEmpty() ? d->connectionInterface->path() : id;
+}
+
+QString QNetworkManagerSettingsConnection::getSsid()
+{
+ return d->settingsMap.value(QLatin1String("802-11-wireless"))
+ .value(QLatin1String("ssid")).toString();
+}
+
+QString QNetworkManagerSettingsConnection::getMacAddress()
+{
+ NMDeviceType type = getType();
+
+ if (type == DEVICE_TYPE_802_3_ETHERNET) {
+ return d->settingsMap.value(QLatin1String("802-3-ethernet"))
+ .value(QLatin1String("mac-address")).toString();
+ } else if (type == DEVICE_TYPE_802_11_WIRELESS) {
+ return d->settingsMap.value(QLatin1String("802-11-wireless"))
+ .value(QLatin1String("mac-address")).toString();
+ } else {
+ return QString();
+ }
+}
+
+QStringList QNetworkManagerSettingsConnection::getSeenBssids()
+{
+ if (getType() == DEVICE_TYPE_802_11_WIRELESS) {
+ return d->settingsMap.value(QLatin1String("802-11-wireless"))
+ .value(QLatin1String("seen-bssids")).toStringList();
+ } else {
+ return QStringList();
+ }
+}
+
+class QNetworkManagerConnectionActivePrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerConnectionActive::QNetworkManagerConnectionActive( const QString &activeConnectionObjectPath, QObject *parent)
+ : QObject(parent), nmDBusHelper(0)
+{
+ d = new QNetworkManagerConnectionActivePrivate();
+ d->path = activeConnectionObjectPath;
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
+ dbusConnection, parent);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+}
+
+QNetworkManagerConnectionActive::~QNetworkManagerConnectionActive()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerConnectionActive::isValid()
+{
+ return d->valid;
+}
+
+bool QNetworkManagerConnectionActive::setConnections()
+{
+ if(!isValid() )
+ return false;
+
+ bool allOk = false;
+ delete nmDBusHelper;
+ nmDBusHelper = new QNmDBusHelper(this);
+ connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(const QString &,QMap<QString,QVariant>)),
+ this,SIGNAL(propertiesChanged( const QString &, QMap<QString,QVariant>)));
+ if(dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
+ QLatin1String("PropertiesChanged"),
+ nmDBusHelper,SLOT(slotPropertiesChanged( QMap<QString,QVariant>))) ) {
+ allOk = true;
+ }
+
+ return allOk;
+}
+
+QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const
+{
+ return d->connectionInterface;
+}
+
+QString QNetworkManagerConnectionActive::serviceName() const
+{
+ return d->connectionInterface->property("ServiceName").toString();
+}
+
+QDBusObjectPath QNetworkManagerConnectionActive::connection() const
+{
+ QVariant prop = d->connectionInterface->property("Connection");
+ return prop.value<QDBusObjectPath>();
+}
+
+QDBusObjectPath QNetworkManagerConnectionActive::specificObject() const
+{
+ QVariant prop = d->connectionInterface->property("SpecificObject");
+ return prop.value<QDBusObjectPath>();
+}
+
+QList<QDBusObjectPath> QNetworkManagerConnectionActive::devices() const
+{
+ QVariant prop = d->connectionInterface->property("Devices");
+ return prop.value<QList<QDBusObjectPath> >();
+}
+
+quint32 QNetworkManagerConnectionActive::state() const
+{
+ return d->connectionInterface->property("State").toUInt();
+}
+
+bool QNetworkManagerConnectionActive::defaultRoute() const
+{
+ return d->connectionInterface->property("Default").toBool();
+}
+
+class QNetworkManagerIp4ConfigPrivate
+{
+public:
+ QDBusInterface *connectionInterface;
+ QString path;
+ bool valid;
+};
+
+QNetworkManagerIp4Config::QNetworkManagerIp4Config( const QString &deviceObjectPath, QObject *parent)
+ : QObject(parent)
+{
+ d = new QNetworkManagerIp4ConfigPrivate();
+ d->path = deviceObjectPath;
+ d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
+ d->path,
+ QLatin1String(NM_DBUS_INTERFACE_IP4_CONFIG),
+ dbusConnection, parent);
+ if (!d->connectionInterface->isValid()) {
+ d->valid = false;
+ return;
+ }
+ d->valid = true;
+}
+
+QNetworkManagerIp4Config::~QNetworkManagerIp4Config()
+{
+ delete d->connectionInterface;
+ delete d;
+}
+
+bool QNetworkManagerIp4Config::isValid()
+{
+ return d->valid;
+}
+
+QStringList QNetworkManagerIp4Config::domains() const
+{
+ return d->connectionInterface->property("Domains").toStringList();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
new file mode 100644
index 0000000000..6fea2ba286
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h
@@ -0,0 +1,448 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNETWORKMANAGERSERVICE_H
+#define QNETWORKMANAGERSERVICE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtDBus/QtDBus>
+#include <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusError>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusReply>
+
+#include <QtDBus/QDBusPendingCallWatcher>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusContext>
+#include <QMap>
+#include "qnmdbushelper.h"
+
+#ifndef QT_NO_DBUS
+
+#ifndef NETWORK_MANAGER_H
+typedef enum NMDeviceType
+{
+ DEVICE_TYPE_UNKNOWN = 0,
+ DEVICE_TYPE_802_3_ETHERNET,
+ DEVICE_TYPE_802_11_WIRELESS,
+ DEVICE_TYPE_GSM,
+ DEVICE_TYPE_CDMA
+} NMDeviceType;
+
+typedef enum
+{
+ NM_DEVICE_STATE_UNKNOWN = 0,
+ NM_DEVICE_STATE_UNMANAGED,
+ NM_DEVICE_STATE_UNAVAILABLE,
+ NM_DEVICE_STATE_DISCONNECTED,
+ NM_DEVICE_STATE_PREPARE,
+ NM_DEVICE_STATE_CONFIG,
+ NM_DEVICE_STATE_NEED_AUTH,
+ NM_DEVICE_STATE_IP_CONFIG,
+ NM_DEVICE_STATE_ACTIVATED,
+ NM_DEVICE_STATE_FAILED
+} NMDeviceState;
+
+typedef enum
+{
+ NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0,
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATING,
+ NM_ACTIVE_CONNECTION_STATE_ACTIVATED
+} NMActiveConnectionState;
+
+#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
+
+#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
+#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
+#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device"
+#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
+#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
+#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
+#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
+
+#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManagerSettings"
+
+#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManagerSettings.Connection"
+#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManagerSettings"
+#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
+#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config"
+
+#define NM_DBUS_SERVICE_USER_SETTINGS "org.freedesktop.NetworkManagerUserSettings"
+#define NM_DBUS_SERVICE_SYSTEM_SETTINGS "org.freedesktop.NetworkManagerSystemSettings"
+
+#define NM_802_11_AP_FLAGS_NONE 0x00000000
+#define NM_802_11_AP_FLAGS_PRIVACY 0x00000001
+#endif
+
+QT_BEGIN_NAMESPACE
+
+typedef QMap< QString, QMap<QString,QVariant> > QNmSettingsMap;
+typedef QList<quint32> ServerThing;
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QNmSettingsMap))
+Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(ServerThing))
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkManagerInterfacePrivate;
+class QNetworkManagerInterface : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ QNetworkManagerInterface(QObject *parent = 0);
+ ~QNetworkManagerInterface();
+
+ QList <QDBusObjectPath> getDevices() const;
+ void activateConnection(const QString &serviceName, QDBusObjectPath connection, QDBusObjectPath device, QDBusObjectPath specificObject);
+ void deactivateConnection(QDBusObjectPath connectionPath) const;
+
+ QDBusObjectPath path() const;
+ QDBusInterface *connectionInterface() const;
+
+ bool wirelessEnabled() const;
+ bool wirelessHardwareEnabled() const;
+ QList <QDBusObjectPath> activeConnections() const;
+ quint32 state();
+ bool setConnections();
+ bool isValid();
+
+Q_SIGNALS:
+ void deviceAdded(QDBusObjectPath);
+ void deviceRemoved(QDBusObjectPath);
+ void propertiesChanged( const QString &, QMap<QString,QVariant>);
+ void stateChanged(const QString&, quint32);
+ void activationFinished(QDBusPendingCallWatcher*);
+
+private Q_SLOTS:
+private:
+ QNetworkManagerInterfacePrivate *d;
+ QNmDBusHelper *nmDBusHelper;
+};
+
+class QNetworkManagerInterfaceAccessPointPrivate;
+class QNetworkManagerInterfaceAccessPoint : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ enum DeviceState {
+ Unknown = 0,
+ Unmanaged,
+ Unavailable,
+ Disconnected,
+ Prepare,
+ Config,
+ NeedAuthentication,
+ IpConfig,
+ Activated,
+ Failed
+ };
+
+ enum ApFlag {
+ ApNone = 0x0,
+ Privacy = 0x1
+ };
+
+ Q_DECLARE_FLAGS(ApFlags, ApFlag);
+
+ enum ApSecurityFlag {
+ ApSecurityNone = 0x0,
+ PairWep40 = 0x1,
+ PairWep104 = 0x2,
+ PairTkip = 0x4,
+ PairCcmp = 0x8,
+ GroupWep40 = 0x10,
+ GroupWep104 = 0x20,
+ GroupTkip = 0x40,
+ GroupCcmp = 0x80,
+ KeyPsk = 0x100,
+ Key8021x = 0x200
+ };
+
+ Q_DECLARE_FLAGS(ApSecurityFlags, ApSecurityFlag);
+
+ explicit QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent = 0);
+ ~QNetworkManagerInterfaceAccessPoint();
+
+ QDBusInterface *connectionInterface() const;
+
+ quint32 flags() const;
+ quint32 wpaFlags() const;
+ quint32 rsnFlags() const;
+ QString ssid() const;
+ quint32 frequency() const;
+ QString hwAddress() const;
+ quint32 mode() const;
+ quint32 maxBitrate() const;
+ quint32 strength() const;
+ bool setConnections();
+ bool isValid();
+
+Q_SIGNALS:
+ void propertiesChanged(QMap <QString,QVariant>);
+ void propertiesChanged( const QString &, QMap<QString,QVariant>);
+private:
+ QNetworkManagerInterfaceAccessPointPrivate *d;
+ QNmDBusHelper *nmDBusHelper;
+
+};
+
+class QNetworkManagerInterfaceDevicePrivate;
+class QNetworkManagerInterfaceDevice : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ explicit QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent = 0);
+ ~QNetworkManagerInterfaceDevice();
+
+ QString udi() const;
+ QString networkInterface() const;
+ QDBusInterface *connectionInterface() const;
+ quint32 ip4Address() const;
+ quint32 state() const;
+ quint32 deviceType() const;
+
+ QDBusObjectPath ip4config() const;
+ bool setConnections();
+ bool isValid();
+
+Q_SIGNALS:
+ void stateChanged(const QString &, quint32);
+
+private:
+ QNetworkManagerInterfaceDevicePrivate *d;
+ QNmDBusHelper *nmDBusHelper;
+};
+
+class QNetworkManagerInterfaceDeviceWiredPrivate;
+class QNetworkManagerInterfaceDeviceWired : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ explicit QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath,
+ QObject *parent = 0);
+ ~QNetworkManagerInterfaceDeviceWired();
+
+ QDBusInterface *connectionInterface() const;
+ QString hwAddress() const;
+ quint32 speed() const;
+ bool carrier() const;
+ bool setConnections();
+ bool isValid();
+
+Q_SIGNALS:
+ void propertiesChanged( const QString &, QMap<QString,QVariant>);
+private:
+ QNetworkManagerInterfaceDeviceWiredPrivate *d;
+ QNmDBusHelper *nmDBusHelper;
+};
+
+class QNetworkManagerInterfaceDeviceWirelessPrivate;
+class QNetworkManagerInterfaceDeviceWireless : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ enum DeviceCapability {
+ None = 0x0,
+ Wep40 = 0x1,
+ Wep104 = 0x2,
+ Tkip = 0x4,
+ Ccmp = 0x8,
+ Wpa = 0x10,
+ Rsn = 0x20
+ };
+
+ explicit QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath,
+ QObject *parent = 0);
+ ~QNetworkManagerInterfaceDeviceWireless();
+
+ QDBusObjectPath path() const;
+ QList <QDBusObjectPath> getAccessPoints();
+ QDBusInterface *connectionInterface() const;
+
+ QString hwAddress() const;
+ quint32 mode() const;
+ quint32 bitrate() const;
+ QDBusObjectPath activeAccessPoint() const;
+ quint32 wirelessCapabilities() const;
+ bool setConnections();
+ bool isValid();
+
+Q_SIGNALS:
+ void propertiesChanged( const QString &, QMap<QString,QVariant>);
+ void accessPointAdded(const QString &,QDBusObjectPath);
+ void accessPointRemoved(const QString &,QDBusObjectPath);
+private:
+ QNetworkManagerInterfaceDeviceWirelessPrivate *d;
+ QNmDBusHelper *nmDBusHelper;
+};
+
+class QNetworkManagerSettingsPrivate;
+class QNetworkManagerSettings : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ explicit QNetworkManagerSettings(const QString &settingsService, QObject *parent = 0);
+ ~QNetworkManagerSettings();
+
+ QDBusInterface *connectionInterface() const;
+ QList <QDBusObjectPath> listConnections();
+ bool setConnections();
+ bool isValid();
+
+Q_SIGNALS:
+ void newConnection(QDBusObjectPath);
+private:
+ QNetworkManagerSettingsPrivate *d;
+};
+
+class QNetworkManagerSettingsConnectionPrivate;
+class QNetworkManagerSettingsConnection : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent = 0);
+ ~QNetworkManagerSettingsConnection();
+
+ QDBusInterface *connectionInterface() const;
+ QNmSettingsMap getSettings();
+ bool setConnections();
+ NMDeviceType getType();
+ bool isAutoConnect();
+ quint64 getTimestamp();
+ QString getId();
+ QString getUuid();
+ QString getSsid();
+ QString getMacAddress();
+ QStringList getSeenBssids();
+ bool isValid();
+
+Q_SIGNALS:
+
+ void updated(const QNmSettingsMap &settings);
+ void removed(const QString &path);
+
+private:
+ QNmDBusHelper *nmDBusHelper;
+ QNetworkManagerSettingsConnectionPrivate *d;
+};
+
+class QNetworkManagerConnectionActivePrivate;
+class QNetworkManagerConnectionActive : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ enum ActiveConnectionState {
+ Unknown = 0,
+ Activating = 1,
+ Activated = 2
+ };
+
+ explicit QNetworkManagerConnectionActive(const QString &dbusPathName, QObject *parent = 0);
+ ~ QNetworkManagerConnectionActive();
+
+ QDBusInterface *connectionInterface() const;
+ QString serviceName() const;
+ QDBusObjectPath connection() const;
+ QDBusObjectPath specificObject() const;
+ QList<QDBusObjectPath> devices() const;
+ quint32 state() const;
+ bool defaultRoute() const;
+ bool setConnections();
+ bool isValid();
+
+
+Q_SIGNALS:
+ void propertiesChanged(QList<QDBusObjectPath>);
+ void propertiesChanged( const QString &, QMap<QString,QVariant>);
+private:
+ QNetworkManagerConnectionActivePrivate *d;
+ QNmDBusHelper *nmDBusHelper;
+};
+
+class QNetworkManagerIp4ConfigPrivate;
+class QNetworkManagerIp4Config : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit QNetworkManagerIp4Config(const QString &dbusPathName, QObject *parent = 0);
+ ~QNetworkManagerIp4Config();
+
+ QStringList domains() const;
+ bool isValid();
+
+ private:
+ QNetworkManagerIp4ConfigPrivate *d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+#endif //QNETWORKMANAGERSERVICE_H
diff --git a/src/plugins/bearer/networkmanager/qnmdbushelper.cpp b/src/plugins/bearer/networkmanager/qnmdbushelper.cpp
new file mode 100644
index 0000000000..53b1c7cb4c
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/qnmdbushelper.cpp
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// this class is for helping qdbus get stuff
+
+#include "qnmdbushelper.h"
+
+#include "qnetworkmanagerservice.h"
+
+#include <QDBusError>
+#include <QDBusInterface>
+#include <QDBusMessage>
+#include <QDBusReply>
+
+#include <QDebug>
+
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+QNmDBusHelper::QNmDBusHelper(QObject * parent)
+ : QObject(parent)
+{
+}
+
+QNmDBusHelper::~QNmDBusHelper()
+{
+}
+
+void QNmDBusHelper::deviceStateChanged(quint32 state)
+ {
+ QDBusMessage msg = this->message();
+ if(state == NM_DEVICE_STATE_ACTIVATED
+ || state == NM_DEVICE_STATE_DISCONNECTED
+ || state == NM_DEVICE_STATE_UNAVAILABLE
+ || state == NM_DEVICE_STATE_FAILED) {
+ emit pathForStateChanged(msg.path(), state);
+ }
+ }
+
+void QNmDBusHelper::slotAccessPointAdded(QDBusObjectPath path)
+{
+ if(path.path().length() > 2) {
+ QDBusMessage msg = this->message();
+ emit pathForAccessPointAdded(msg.path(), path);
+ }
+}
+
+void QNmDBusHelper::slotAccessPointRemoved(QDBusObjectPath path)
+{
+ if(path.path().length() > 2) {
+ QDBusMessage msg = this->message();
+ emit pathForAccessPointRemoved(msg.path(), path);
+ }
+}
+
+void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map)
+{
+ QDBusMessage msg = this->message();
+ QMapIterator<QString, QVariant> i(map);
+ while (i.hasNext()) {
+ i.next();
+ if( i.key() == "State") { //state only applies to device interfaces
+ quint32 state = i.value().toUInt();
+ if( state == NM_DEVICE_STATE_ACTIVATED
+ || state == NM_DEVICE_STATE_DISCONNECTED
+ || state == NM_DEVICE_STATE_UNAVAILABLE
+ || state == NM_DEVICE_STATE_FAILED) {
+ emit pathForPropertiesChanged( msg.path(), map);
+ }
+ } else if( i.key() == "ActiveAccessPoint") {
+ emit pathForPropertiesChanged(msg.path(), map);
+ // qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value().value<QDBusObjectPath>().path();
+ // } else if( i.key() == "Strength")
+ // qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value().toUInt();
+ // else
+ // qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value();
+ } else if (i.key() == "ActiveConnections") {
+ emit pathForPropertiesChanged(msg.path(), map);
+ }
+ }
+}
+
+void QNmDBusHelper::slotSettingsRemoved()
+{
+ QDBusMessage msg = this->message();
+ emit pathForSettingsRemoved(msg.path());
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnmdbushelper.h b/src/plugins/bearer/networkmanager/qnmdbushelper.h
new file mode 100644
index 0000000000..6f3484a797
--- /dev/null
+++ b/src/plugins/bearer/networkmanager/qnmdbushelper.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNMDBUSHELPERPRIVATE_H
+#define QNMDBUSHELPERPRIVATE_H
+
+#include <QDBusObjectPath>
+#include <QDBusContext>
+#include <QMap>
+
+#ifndef QT_NO_DBUS
+
+QT_BEGIN_NAMESPACE
+
+class QNmDBusHelper: public QObject, protected QDBusContext
+ {
+ Q_OBJECT
+ public:
+ QNmDBusHelper(QObject *parent = 0);
+ ~QNmDBusHelper();
+
+ public slots:
+ void deviceStateChanged(quint32);
+ void slotAccessPointAdded( QDBusObjectPath );
+ void slotAccessPointRemoved( QDBusObjectPath );
+ void slotPropertiesChanged( QMap<QString,QVariant>);
+ void slotSettingsRemoved();
+
+Q_SIGNALS:
+ void pathForStateChanged(const QString &, quint32);
+ void pathForAccessPointAdded(const QString &, QDBusObjectPath );
+ void pathForAccessPointRemoved(const QString &, QDBusObjectPath );
+ void pathForPropertiesChanged(const QString &, QMap<QString,QVariant>);
+ void pathForSettingsRemoved(const QString &);
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_DBUS
+
+#endif// QNMDBUSHELPERPRIVATE_H
diff --git a/src/plugins/bearer/nla/main.cpp b/src/plugins/bearer/nla/main.cpp
new file mode 100644
index 0000000000..801694bcf9
--- /dev/null
+++ b/src/plugins/bearer/nla/main.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnlaengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+class QNlaEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QNlaEnginePlugin();
+ ~QNlaEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QNlaEnginePlugin::QNlaEnginePlugin()
+{
+}
+
+QNlaEnginePlugin::~QNlaEnginePlugin()
+{
+}
+
+QStringList QNlaEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("nla");
+}
+
+QBearerEngine *QNlaEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("nla"))
+ return new QNlaEngine;
+ else
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QNlaEnginePlugin)
+Q_EXPORT_PLUGIN2(qnlabearer, QNlaEnginePlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/bearer/nla/nla.pro b/src/plugins/bearer/nla/nla.pro
new file mode 100644
index 0000000000..5dfb6d7e2d
--- /dev/null
+++ b/src/plugins/bearer/nla/nla.pro
@@ -0,0 +1,23 @@
+TARGET = qnlabearer
+include(../../qpluginbase.pri)
+
+QT = core network
+
+!wince* {
+ LIBS += -lWs2_32
+} else {
+ LIBS += -lWs2
+}
+
+HEADERS += qnlaengine.h \
+ ../platformdefs_win.h \
+ ../qnetworksession_impl.h \
+ ../qbearerengine_impl.h
+
+SOURCES += main.cpp \
+ qnlaengine.cpp \
+ ../qnetworksession_impl.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/nla/qnlaengine.cpp b/src/plugins/bearer/nla/qnlaengine.cpp
new file mode 100644
index 0000000000..b5086e2354
--- /dev/null
+++ b/src/plugins/bearer/nla/qnlaengine.cpp
@@ -0,0 +1,650 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnlaengine.h"
+#include "../qnetworksession_impl.h"
+
+#include <QtNetwork/private/qnetworkconfiguration_p.h>
+
+#include <QtCore/qthread.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qstringlist.h>
+
+#include <QtCore/qdebug.h>
+
+#include "../platformdefs_win.h"
+
+QT_BEGIN_NAMESPACE
+
+QWindowsSockInit2::QWindowsSockInit2()
+: version(0)
+{
+ //### should we try for 2.2 on all platforms ??
+ WSAData wsadata;
+
+ // IPv6 requires Winsock v2.0 or better.
+ if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0) {
+ qWarning("QBearerManagementAPI: WinSock v2.0 initialization failed.");
+ } else {
+ version = 0x20;
+ }
+}
+
+QWindowsSockInit2::~QWindowsSockInit2()
+{
+ WSACleanup();
+}
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+static void printBlob(NLA_BLOB *blob)
+{
+ qDebug() << "==== BEGIN NLA_BLOB ====";
+
+ qDebug() << "type:" << blob->header.type;
+ qDebug() << "size:" << blob->header.dwSize;
+ qDebug() << "next offset:" << blob->header.nextOffset;
+
+ switch (blob->header.type) {
+ case NLA_RAW_DATA:
+ qDebug() << "Raw Data";
+ qDebug() << '\t' << blob->data.rawData;
+ break;
+ case NLA_INTERFACE:
+ qDebug() << "Interface";
+ qDebug() << "\ttype:" << blob->data.interfaceData.dwType;
+ qDebug() << "\tspeed:" << blob->data.interfaceData.dwSpeed;
+ qDebug() << "\tadapter:" << blob->data.interfaceData.adapterName;
+ break;
+ case NLA_802_1X_LOCATION:
+ qDebug() << "802.1x Location";
+ qDebug() << '\t' << blob->data.locationData.information;
+ break;
+ case NLA_CONNECTIVITY:
+ qDebug() << "Connectivity";
+ qDebug() << "\ttype:" << blob->data.connectivity.type;
+ qDebug() << "\tinternet:" << blob->data.connectivity.internet;
+ break;
+ case NLA_ICS:
+ qDebug() << "ICS";
+ qDebug() << "\tspeed:" << blob->data.ICS.remote.speed;
+ qDebug() << "\ttype:" << blob->data.ICS.remote.type;
+ qDebug() << "\tstate:" << blob->data.ICS.remote.state;
+ qDebug() << "\tmachine name:" << blob->data.ICS.remote.machineName;
+ qDebug() << "\tshared adapter name:" << blob->data.ICS.remote.sharedAdapterName;
+ break;
+ default:
+ qDebug() << "UNKNOWN BLOB TYPE";
+ }
+
+ qDebug() << "===== END NLA_BLOB =====";
+}
+#endif
+
+static QNetworkConfiguration::BearerType qGetInterfaceType(const QString &interface)
+{
+#ifdef Q_OS_WINCE
+ Q_UNUSED(interface)
+#else
+ unsigned long oid;
+ DWORD bytesWritten;
+
+ NDIS_MEDIUM medium;
+ NDIS_PHYSICAL_MEDIUM physicalMedium;
+
+ HANDLE handle = CreateFile((TCHAR *)QString::fromLatin1("\\\\.\\%1").arg(interface).utf16(), 0,
+ FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ if (handle == INVALID_HANDLE_VALUE)
+ return QNetworkConfiguration::BearerUnknown;
+
+ oid = OID_GEN_MEDIA_SUPPORTED;
+ bytesWritten = 0;
+ bool result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
+ &medium, sizeof(medium), &bytesWritten, 0);
+ if (!result) {
+ CloseHandle(handle);
+ return QNetworkConfiguration::BearerUnknown;
+ }
+
+ oid = OID_GEN_PHYSICAL_MEDIUM;
+ bytesWritten = 0;
+ result = DeviceIoControl(handle, IOCTL_NDIS_QUERY_GLOBAL_STATS, &oid, sizeof(oid),
+ &physicalMedium, sizeof(physicalMedium), &bytesWritten, 0);
+ if (!result) {
+ CloseHandle(handle);
+
+ if (medium == NdisMedium802_3)
+ return QNetworkConfiguration::BearerEthernet;
+ else
+ return QNetworkConfiguration::BearerUnknown;
+ }
+
+ CloseHandle(handle);
+
+ if (medium == NdisMedium802_3) {
+ switch (physicalMedium) {
+ case NdisPhysicalMediumWirelessLan:
+ return QNetworkConfiguration::BearerWLAN;
+ case NdisPhysicalMediumBluetooth:
+ return QNetworkConfiguration::BearerBluetooth;
+ case NdisPhysicalMediumWiMax:
+ return QNetworkConfiguration::BearerWiMAX;
+ default:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "Physical Medium" << physicalMedium;
+#endif
+ return QNetworkConfiguration::BearerEthernet;
+ }
+ }
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << medium << physicalMedium;
+#endif
+
+#endif
+
+ return QNetworkConfiguration::BearerUnknown;
+}
+
+class QNlaThread : public QThread
+{
+ Q_OBJECT
+
+public:
+ QNlaThread(QNlaEngine *parent = 0);
+ ~QNlaThread();
+
+ QList<QNetworkConfigurationPrivate *> getConfigurations();
+
+ void forceUpdate();
+
+protected:
+ virtual void run();
+
+private:
+ void updateConfigurations(QList<QNetworkConfigurationPrivate *> &configs);
+ DWORD parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv) const;
+ QNetworkConfigurationPrivate *parseQuerySet(const WSAQUERYSET *querySet) const;
+ void fetchConfigurations();
+
+signals:
+ void networksChanged();
+
+private:
+ QMutex mutex;
+ HANDLE handle;
+ bool done;
+ QList<QNetworkConfigurationPrivate *> fetchedConfigurations;
+};
+
+QNlaThread::QNlaThread(QNlaEngine *parent)
+: QThread(parent), handle(0), done(false)
+{
+}
+
+QNlaThread::~QNlaThread()
+{
+ mutex.lock();
+
+ done = true;
+
+ if (handle) {
+ /* cancel completion event */
+ if (WSALookupServiceEnd(handle) == SOCKET_ERROR) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("WSALookupServiceEnd error %d", WSAGetLastError());
+#endif
+ }
+ }
+ mutex.unlock();
+
+ wait();
+}
+
+QList<QNetworkConfigurationPrivate *> QNlaThread::getConfigurations()
+{
+ QMutexLocker locker(&mutex);
+
+ QList<QNetworkConfigurationPrivate *> foundConfigurations = fetchedConfigurations;
+ fetchedConfigurations.clear();
+
+ return foundConfigurations;
+}
+
+void QNlaThread::forceUpdate()
+{
+ mutex.lock();
+
+ if (handle) {
+ /* cancel completion event */
+ if (WSALookupServiceEnd(handle) == SOCKET_ERROR) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("WSALookupServiceEnd error %d", WSAGetLastError());
+#endif
+ }
+ handle = 0;
+ }
+ mutex.unlock();
+}
+
+void QNlaThread::run()
+{
+ WSAEVENT changeEvent = WSACreateEvent();
+ if (changeEvent == WSA_INVALID_EVENT)
+ return;
+
+ while (true) {
+ fetchConfigurations();
+
+ WSAQUERYSET qsRestrictions;
+
+ memset(&qsRestrictions, 0, sizeof(qsRestrictions));
+ qsRestrictions.dwSize = sizeof(qsRestrictions);
+ qsRestrictions.dwNameSpace = NS_NLA;
+
+ mutex.lock();
+ if (done) {
+ mutex.unlock();
+ break;
+ }
+ int result = WSALookupServiceBegin(&qsRestrictions, LUP_RETURN_ALL, &handle);
+ mutex.unlock();
+
+ if (result == SOCKET_ERROR)
+ break;
+
+ WSACOMPLETION completion;
+ WSAOVERLAPPED overlapped;
+
+ memset(&overlapped, 0, sizeof(overlapped));
+ overlapped.hEvent = changeEvent;
+
+ memset(&completion, 0, sizeof(completion));
+ completion.Type = NSP_NOTIFY_EVENT;
+ completion.Parameters.Event.lpOverlapped = &overlapped;
+
+ DWORD bytesReturned = 0;
+ result = WSANSPIoctl(handle, SIO_NSP_NOTIFY_CHANGE, 0, 0, 0, 0,
+ &bytesReturned, &completion);
+ if (result == SOCKET_ERROR) {
+ if (WSAGetLastError() != WSA_IO_PENDING)
+ break;
+ }
+
+#ifndef Q_OS_WINCE
+ // Not interested in unrelated IO completion events
+ // although we also don't want to block them
+ while (WaitForSingleObjectEx(changeEvent, WSA_INFINITE, true) != WAIT_IO_COMPLETION &&
+ handle)
+ {
+ }
+#else
+ WaitForSingleObject(changeEvent, WSA_INFINITE);
+#endif
+
+ mutex.lock();
+ if (handle) {
+ result = WSALookupServiceEnd(handle);
+ if (result == SOCKET_ERROR) {
+ mutex.unlock();
+ break;
+ }
+ handle = 0;
+ }
+ mutex.unlock();
+ }
+
+ WSACloseEvent(changeEvent);
+}
+
+void QNlaThread::updateConfigurations(QList<QNetworkConfigurationPrivate *> &configs)
+{
+ mutex.lock();
+
+ while (!fetchedConfigurations.isEmpty())
+ delete fetchedConfigurations.takeFirst();
+
+ fetchedConfigurations = configs;
+
+ mutex.unlock();
+
+ emit networksChanged();
+}
+
+DWORD QNlaThread::parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv) const
+{
+#ifdef BEARER_MANAGEMENT_DEBUG
+ printBlob(blob);
+#endif
+
+ switch (blob->header.type) {
+ case NLA_RAW_DATA:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: unhandled header type NLA_RAW_DATA", __FUNCTION__);
+#endif
+ break;
+ case NLA_INTERFACE:
+ cpPriv->state = QNetworkConfiguration::Active;
+ if (QNlaEngine *engine = qobject_cast<QNlaEngine *>(parent())) {
+ engine->configurationInterface[cpPriv->id.toUInt()] =
+ QString::fromLatin1(blob->data.interfaceData.adapterName);
+ }
+ break;
+ case NLA_802_1X_LOCATION:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: unhandled header type NLA_802_1X_LOCATION", __FUNCTION__);
+#endif
+ break;
+ case NLA_CONNECTIVITY:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: unhandled header type NLA_CONNECTIVITY", __FUNCTION__);
+#endif
+ break;
+ case NLA_ICS:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: unhandled header type NLA_ICS", __FUNCTION__);
+#endif
+ break;
+ default:
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("%s: unhandled header type %d", __FUNCTION__, blob->header.type);
+#endif
+ ;
+ }
+
+ return blob->header.nextOffset;
+}
+
+QNetworkConfigurationPrivate *QNlaThread::parseQuerySet(const WSAQUERYSET *querySet) const
+{
+ QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
+
+ cpPriv->name = QString::fromWCharArray(querySet->lpszServiceInstanceName);
+ cpPriv->isValid = true;
+ cpPriv->id = QString::number(qHash(QLatin1String("NLA:") + cpPriv->name));
+ cpPriv->state = QNetworkConfiguration::Defined;
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "size:" << querySet->dwSize;
+ qDebug() << "service instance name:" << QString::fromUtf16(querySet->lpszServiceInstanceName);
+ qDebug() << "service class id:" << querySet->lpServiceClassId;
+ qDebug() << "version:" << querySet->lpVersion;
+ qDebug() << "comment:" << QString::fromUtf16(querySet->lpszComment);
+ qDebug() << "namespace:" << querySet->dwNameSpace;
+ qDebug() << "namespace provider id:" << querySet->lpNSProviderId;
+ qDebug() << "context:" << QString::fromUtf16(querySet->lpszContext);
+ qDebug() << "number of protocols:" << querySet->dwNumberOfProtocols;
+ qDebug() << "protocols:" << querySet->lpafpProtocols;
+ qDebug() << "query string:" << QString::fromUtf16(querySet->lpszQueryString);
+ qDebug() << "number of cs addresses:" << querySet->dwNumberOfCsAddrs;
+ qDebug() << "cs addresses:" << querySet->lpcsaBuffer;
+ qDebug() << "output flags:" << querySet->dwOutputFlags;
+#endif
+
+ if (querySet->lpBlob) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug() << "blob size:" << querySet->lpBlob->cbSize;
+ qDebug() << "blob data:" << querySet->lpBlob->pBlobData;
+#endif
+
+ DWORD offset = 0;
+ do {
+ NLA_BLOB *blob = reinterpret_cast<NLA_BLOB *>(querySet->lpBlob->pBlobData + offset);
+ DWORD nextOffset = parseBlob(blob, cpPriv);
+ if (nextOffset == offset)
+ break;
+ else
+ offset = nextOffset;
+ } while (offset != 0 && offset < querySet->lpBlob->cbSize);
+ }
+
+ if (QNlaEngine *engine = qobject_cast<QNlaEngine *>(parent())) {
+ const QString interface = engine->getInterfaceFromId(cpPriv->id);
+ cpPriv->bearerType = qGetInterfaceType(interface);
+ }
+
+ return cpPriv;
+}
+
+void QNlaThread::fetchConfigurations()
+{
+ QList<QNetworkConfigurationPrivate *> foundConfigurations;
+
+ WSAQUERYSET qsRestrictions;
+ HANDLE hLookup = 0;
+
+ memset(&qsRestrictions, 0, sizeof(qsRestrictions));
+ qsRestrictions.dwSize = sizeof(qsRestrictions);
+ qsRestrictions.dwNameSpace = NS_NLA;
+
+ int result = WSALookupServiceBegin(&qsRestrictions, LUP_RETURN_ALL | LUP_DEEP, &hLookup);
+ if (result == SOCKET_ERROR) {
+ mutex.lock();
+ fetchedConfigurations.clear();
+ mutex.unlock();
+ }
+
+ char buffer[0x10000];
+ while (result == 0) {
+ DWORD bufferLength = sizeof(buffer);
+ result = WSALookupServiceNext(hLookup, LUP_RETURN_ALL,
+ &bufferLength, reinterpret_cast<WSAQUERYSET *>(buffer));
+
+ if (result == SOCKET_ERROR)
+ break;
+
+ QNetworkConfigurationPrivate *cpPriv =
+ parseQuerySet(reinterpret_cast<WSAQUERYSET *>(buffer));
+
+ foundConfigurations.append(cpPriv);
+ }
+
+ if (hLookup) {
+ result = WSALookupServiceEnd(hLookup);
+ if (result == SOCKET_ERROR) {
+#ifdef BEARER_MANAGEMENT_DEBUG
+ qDebug("WSALookupServiceEnd error %d", WSAGetLastError());
+#endif
+ }
+ }
+
+ updateConfigurations(foundConfigurations);
+}
+
+QNlaEngine::QNlaEngine(QObject *parent)
+: QBearerEngineImpl(parent), nlaThread(0)
+{
+ nlaThread = new QNlaThread(this);
+ connect(nlaThread, SIGNAL(networksChanged()),
+ this, SLOT(networksChanged()));
+ nlaThread->start();
+
+ qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
+}
+
+QNlaEngine::~QNlaEngine()
+{
+ delete nlaThread;
+}
+
+void QNlaEngine::networksChanged()
+{
+ QMutexLocker locker(&mutex);
+
+ QStringList previous = accessPointConfigurations.keys();
+
+ QList<QNetworkConfigurationPrivate *> foundConfigurations = nlaThread->getConfigurations();
+ while (!foundConfigurations.isEmpty()) {
+ QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst();
+
+ previous.removeAll(cpPriv->id);
+
+ if (accessPointConfigurations.contains(cpPriv->id)) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
+
+ bool changed = false;
+
+ ptr->mutex.lock();
+
+ if (ptr->isValid != cpPriv->isValid) {
+ ptr->isValid = cpPriv->isValid;
+ changed = true;
+ }
+
+ if (ptr->name != cpPriv->name) {
+ ptr->name = cpPriv->name;
+ changed = true;
+ }
+
+ if (ptr->state != cpPriv->state) {
+ ptr->state = cpPriv->state;
+ changed = true;
+ }
+
+ ptr->mutex.unlock();
+
+ if (changed) {
+ locker.unlock();
+ emit configurationChanged(ptr);
+ locker.relock();
+ }
+
+ delete cpPriv;
+ } else {
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ locker.unlock();
+ emit configurationAdded(ptr);
+ locker.relock();
+ }
+ }
+
+ while (!previous.isEmpty()) {
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.take(previous.takeFirst());
+
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+
+ locker.unlock();
+ emit updateCompleted();
+}
+
+QString QNlaEngine::getInterfaceFromId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return configurationInterface.value(id.toUInt());
+}
+
+bool QNlaEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return configurationInterface.contains(id.toUInt());
+}
+
+void QNlaEngine::connectToId(const QString &id)
+{
+ emit connectionError(id, OperationNotSupported);
+}
+
+void QNlaEngine::disconnectFromId(const QString &id)
+{
+ emit connectionError(id, OperationNotSupported);
+}
+
+void QNlaEngine::requestUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ nlaThread->forceUpdate();
+}
+
+QNetworkSession::State QNlaEngine::sessionStateForId(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
+
+ if (!ptr)
+ return QNetworkSession::Invalid;
+
+ if (!ptr->isValid) {
+ return QNetworkSession::Invalid;
+ } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ return QNetworkSession::Connected;
+ } else if ((ptr->state & QNetworkConfiguration::Discovered) ==
+ QNetworkConfiguration::Discovered) {
+ return QNetworkSession::Disconnected;
+ } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
+ return QNetworkSession::NotAvailable;
+ } else if ((ptr->state & QNetworkConfiguration::Undefined) ==
+ QNetworkConfiguration::Undefined) {
+ return QNetworkSession::NotAvailable;
+ }
+
+ return QNetworkSession::Invalid;
+}
+
+QNetworkConfigurationManager::Capabilities QNlaEngine::capabilities() const
+{
+ return QNetworkConfigurationManager::ForcedRoaming;
+}
+
+QNetworkSessionPrivate *QNlaEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl;
+}
+
+QNetworkConfigurationPrivatePointer QNlaEngine::defaultConfiguration()
+{
+ return QNetworkConfigurationPrivatePointer();
+}
+
+#include "qnlaengine.moc"
+QT_END_NAMESPACE
+
diff --git a/src/plugins/bearer/nla/qnlaengine.h b/src/plugins/bearer/nla/qnlaengine.h
new file mode 100644
index 0000000000..645824419e
--- /dev/null
+++ b/src/plugins/bearer/nla/qnlaengine.h
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNLAENGINE_P_H
+#define QNLAENGINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "../qbearerengine_impl.h"
+
+#include <QtNetwork/private/qnativesocketengine_p.h>
+
+#include <QMap>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkConfigurationPrivate;
+class QNlaThread;
+
+class QWindowsSockInit2
+{
+public:
+ QWindowsSockInit2();
+ ~QWindowsSockInit2();
+ int version;
+};
+
+class QNlaEngine : public QBearerEngineImpl
+{
+ Q_OBJECT
+
+ friend class QNlaThread;
+
+public:
+ QNlaEngine(QObject *parent = 0);
+ ~QNlaEngine();
+
+ QString getInterfaceFromId(const QString &id);
+ bool hasIdentifier(const QString &id);
+
+ void connectToId(const QString &id);
+ void disconnectFromId(const QString &id);
+
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkSession::State sessionStateForId(const QString &id);
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+private Q_SLOTS:
+ void networksChanged();
+
+private:
+ QWindowsSockInit2 winSock;
+ QNlaThread *nlaThread;
+ QMap<uint, QString> configurationInterface;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/bearer/platformdefs_win.h b/src/plugins/bearer/platformdefs_win.h
new file mode 100644
index 0000000000..b102183a70
--- /dev/null
+++ b/src/plugins/bearer/platformdefs_win.h
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMDEFS_WIN_H
+#define QPLATFORMDEFS_WIN_H
+
+#include <winsock2.h>
+#include <mswsock.h>
+#undef interface
+#include <winioctl.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef NS_NLA
+
+#define NS_NLA 15
+
+#ifndef NLA_NAMESPACE_GUID
+enum NLA_BLOB_DATA_TYPE {
+ NLA_RAW_DATA = 0,
+ NLA_INTERFACE = 1,
+ NLA_802_1X_LOCATION = 2,
+ NLA_CONNECTIVITY = 3,
+ NLA_ICS = 4
+};
+
+enum NLA_CONNECTIVITY_TYPE {
+ NLA_NETWORK_AD_HOC = 0,
+ NLA_NETWORK_MANAGED = 1,
+ NLA_NETWORK_UNMANAGED = 2,
+ NLA_NETWORK_UNKNOWN = 3
+};
+
+enum NLA_INTERNET {
+ NLA_INTERNET_UNKNOWN = 0,
+ NLA_INTERNET_NO = 1,
+ NLA_INTERNET_YES = 2
+};
+
+struct NLA_BLOB {
+ struct {
+ NLA_BLOB_DATA_TYPE type;
+ DWORD dwSize;
+ DWORD nextOffset;
+ } header;
+
+ union {
+ // NLA_RAW_DATA
+ CHAR rawData[1];
+
+ // NLA_INTERFACE
+ struct {
+ DWORD dwType;
+ DWORD dwSpeed;
+ CHAR adapterName[1];
+ } interfaceData;
+
+ // NLA_802_1X_LOCATION
+ struct {
+ CHAR information[1];
+ } locationData;
+
+ // NLA_CONNECTIVITY
+ struct {
+ NLA_CONNECTIVITY_TYPE type;
+ NLA_INTERNET internet;
+ } connectivity;
+
+ // NLA_ICS
+ struct {
+ struct {
+ DWORD speed;
+ DWORD type;
+ DWORD state;
+ WCHAR machineName[256];
+ WCHAR sharedAdapterName[256];
+ } remote;
+ } ICS;
+ } data;
+};
+#endif // NLA_NAMESPACE_GUID
+
+#endif
+
+enum NDIS_MEDIUM {
+ NdisMedium802_3 = 0,
+};
+
+enum NDIS_PHYSICAL_MEDIUM {
+ NdisPhysicalMediumWirelessLan = 1,
+ NdisPhysicalMediumBluetooth = 10,
+ NdisPhysicalMediumWiMax = 12,
+};
+
+#define OID_GEN_MEDIA_SUPPORTED 0x00010103
+#define OID_GEN_PHYSICAL_MEDIUM 0x00010202
+
+#define IOCTL_NDIS_QUERY_GLOBAL_STATS \
+ CTL_CODE(FILE_DEVICE_PHYSICAL_NETCARD, 0, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
+
+QT_END_NAMESPACE
+
+#endif // QPLATFORMDEFS_WIN_H
diff --git a/src/plugins/bearer/qbearerengine_impl.h b/src/plugins/bearer/qbearerengine_impl.h
new file mode 100644
index 0000000000..ac96207ac1
--- /dev/null
+++ b/src/plugins/bearer/qbearerengine_impl.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBEARERENGINE_IMPL_H
+#define QBEARERENGINE_IMPL_H
+
+#include <QtNetwork/private/qbearerengine_p.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QBearerEngineImpl : public QBearerEngine
+{
+ Q_OBJECT
+
+public:
+ enum ConnectionError {
+ InterfaceLookupError = 0,
+ ConnectError,
+ OperationNotSupported,
+ DisconnectionError,
+ };
+
+ QBearerEngineImpl(QObject *parent = 0) : QBearerEngine(parent) {}
+ ~QBearerEngineImpl() {}
+
+ virtual void connectToId(const QString &id) = 0;
+ virtual void disconnectFromId(const QString &id) = 0;
+
+ virtual QString getInterfaceFromId(const QString &id) = 0;
+
+ virtual QNetworkSession::State sessionStateForId(const QString &id) = 0;
+
+ virtual quint64 bytesWritten(const QString &) { return Q_UINT64_C(0); }
+ virtual quint64 bytesReceived(const QString &) { return Q_UINT64_C(0); }
+ virtual quint64 startTime(const QString &) { return Q_UINT64_C(0); }
+
+Q_SIGNALS:
+ void connectionError(const QString &id, QBearerEngineImpl::ConnectionError error);
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif // QBEARERENGINE_IMPL_H
diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp
new file mode 100644
index 0000000000..c41e3e0f35
--- /dev/null
+++ b/src/plugins/bearer/qnetworksession_impl.cpp
@@ -0,0 +1,421 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnetworksession_impl.h"
+#include "qbearerengine_impl.h"
+
+#include <QtNetwork/qnetworksession.h>
+#include <QtNetwork/private/qnetworkconfigmanager_p.h>
+
+#include <QtCore/qdatetime.h>
+#include <QtCore/qdebug.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qstringlist.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+static QBearerEngineImpl *getEngineFromId(const QString &id)
+{
+ QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
+
+ foreach (QBearerEngine *engine, priv->engines()) {
+ QBearerEngineImpl *engineImpl = qobject_cast<QBearerEngineImpl *>(engine);
+ if (engineImpl && engineImpl->hasIdentifier(id))
+ return engineImpl;
+ }
+
+ return 0;
+}
+
+class QNetworkSessionManagerPrivate : public QObject
+{
+ Q_OBJECT
+
+public:
+ QNetworkSessionManagerPrivate(QObject *parent = 0) : QObject(parent) {}
+ ~QNetworkSessionManagerPrivate() {}
+
+ inline void forceSessionClose(const QNetworkConfiguration &config)
+ { emit forcedSessionClose(config); }
+
+Q_SIGNALS:
+ void forcedSessionClose(const QNetworkConfiguration &config);
+};
+
+#include "qnetworksession_impl.moc"
+
+Q_GLOBAL_STATIC(QNetworkSessionManagerPrivate, sessionManager);
+
+void QNetworkSessionPrivateImpl::syncStateWithInterface()
+{
+ connect(sessionManager(), SIGNAL(forcedSessionClose(QNetworkConfiguration)),
+ this, SLOT(forcedSessionClose(QNetworkConfiguration)));
+
+ opened = false;
+ isOpen = false;
+ state = QNetworkSession::Invalid;
+ lastError = QNetworkSession::UnknownSessionError;
+
+ qRegisterMetaType<QBearerEngineImpl::ConnectionError>("QBearerEngineImpl::ConnectionError");
+
+ switch (publicConfig.type()) {
+ case QNetworkConfiguration::InternetAccessPoint:
+ activeConfig = publicConfig;
+ engine = getEngineFromId(activeConfig.identifier());
+ if (engine) {
+ qRegisterMetaType<QNetworkConfigurationPrivatePointer>("QNetworkConfigurationPrivatePointer");
+ connect(engine, SIGNAL(configurationChanged(QNetworkConfigurationPrivatePointer)),
+ this, SLOT(configurationChanged(QNetworkConfigurationPrivatePointer)),
+ Qt::QueuedConnection);
+ connect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ Qt::QueuedConnection);
+ }
+ break;
+ case QNetworkConfiguration::ServiceNetwork:
+ serviceConfig = publicConfig;
+ // Defer setting engine and signals until open().
+ // fall through
+ case QNetworkConfiguration::UserChoice:
+ // Defer setting serviceConfig and activeConfig until open().
+ // fall through
+ default:
+ engine = 0;
+ }
+
+ networkConfigurationsChanged();
+}
+
+void QNetworkSessionPrivateImpl::open()
+{
+ if (serviceConfig.isValid()) {
+ lastError = QNetworkSession::OperationNotSupportedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ } else if (!isOpen) {
+ if ((activeConfig.state() & QNetworkConfiguration::Discovered) != QNetworkConfiguration::Discovered) {
+ lastError = QNetworkSession::InvalidConfigurationError;
+ state = QNetworkSession::Invalid;
+ emit stateChanged(state);
+ emit QNetworkSessionPrivate::error(lastError);
+ return;
+ }
+ opened = true;
+
+ if ((activeConfig.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active &&
+ (activeConfig.state() & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
+ state = QNetworkSession::Connecting;
+ emit stateChanged(state);
+
+ engine->connectToId(activeConfig.identifier());
+ }
+
+ isOpen = (activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active;
+ if (isOpen)
+ emit quitPendingWaitsForOpened();
+ }
+}
+
+void QNetworkSessionPrivateImpl::close()
+{
+ if (serviceConfig.isValid()) {
+ lastError = QNetworkSession::OperationNotSupportedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ } else if (isOpen) {
+ opened = false;
+ isOpen = false;
+ emit closed();
+ }
+}
+
+void QNetworkSessionPrivateImpl::stop()
+{
+ if (serviceConfig.isValid()) {
+ lastError = QNetworkSession::OperationNotSupportedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ } else {
+ if ((activeConfig.state() & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ state = QNetworkSession::Closing;
+ emit stateChanged(state);
+
+ engine->disconnectFromId(activeConfig.identifier());
+
+ sessionManager()->forceSessionClose(activeConfig);
+ }
+
+ opened = false;
+ isOpen = false;
+ emit closed();
+ }
+}
+
+void QNetworkSessionPrivateImpl::migrate()
+{
+}
+
+void QNetworkSessionPrivateImpl::accept()
+{
+}
+
+void QNetworkSessionPrivateImpl::ignore()
+{
+}
+
+void QNetworkSessionPrivateImpl::reject()
+{
+}
+
+#ifndef QT_NO_NETWORKINTERFACE
+QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const
+{
+ if (!engine || state != QNetworkSession::Connected || !publicConfig.isValid())
+ return QNetworkInterface();
+
+ QString interface = engine->getInterfaceFromId(activeConfig.identifier());
+ if (interface.isEmpty())
+ return QNetworkInterface();
+ return QNetworkInterface::interfaceFromName(interface);
+}
+#endif
+
+QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString &key) const
+{
+ if (key == QLatin1String("AutoCloseSessionTimeout")) {
+ if (engine && engine->requiresPolling() &&
+ !(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) {
+ return sessionTimeout >= 0 ? sessionTimeout * 10000 : -1;
+ }
+ }
+
+ return QVariant();
+}
+
+void QNetworkSessionPrivateImpl::setSessionProperty(const QString &key, const QVariant &value)
+{
+ if (key == QLatin1String("AutoCloseSessionTimeout")) {
+ if (engine && engine->requiresPolling() &&
+ !(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) {
+ int timeout = value.toInt();
+ if (timeout >= 0) {
+ connect(engine, SIGNAL(updateCompleted()),
+ this, SLOT(decrementTimeout()), Qt::UniqueConnection);
+ sessionTimeout = timeout / 10000; // convert to poll intervals
+ } else {
+ disconnect(engine, SIGNAL(updateCompleted()), this, SLOT(decrementTimeout()));
+ sessionTimeout = -1;
+ }
+ }
+ }
+}
+
+QString QNetworkSessionPrivateImpl::errorString() const
+{
+ switch (lastError) {
+ case QNetworkSession::UnknownSessionError:
+ return tr("Unknown session error.");
+ case QNetworkSession::SessionAbortedError:
+ return tr("The session was aborted by the user or system.");
+ case QNetworkSession::OperationNotSupportedError:
+ return tr("The requested operation is not supported by the system.");
+ case QNetworkSession::InvalidConfigurationError:
+ return tr("The specified configuration cannot be used.");
+ case QNetworkSession::RoamingError:
+ return tr("Roaming was aborted or is not possible.");
+ default:
+ break;
+ }
+
+ return QString();
+}
+
+QNetworkSession::SessionError QNetworkSessionPrivateImpl::error() const
+{
+ return lastError;
+}
+
+quint64 QNetworkSessionPrivateImpl::bytesWritten() const
+{
+ if (engine && state == QNetworkSession::Connected)
+ return engine->bytesWritten(activeConfig.identifier());
+ return Q_UINT64_C(0);
+}
+
+quint64 QNetworkSessionPrivateImpl::bytesReceived() const
+{
+ if (engine && state == QNetworkSession::Connected)
+ return engine->bytesReceived(activeConfig.identifier());
+ return Q_UINT64_C(0);
+}
+
+quint64 QNetworkSessionPrivateImpl::activeTime() const
+{
+ if (state == QNetworkSession::Connected && startTime != Q_UINT64_C(0))
+ return QDateTime::currentDateTime().toTime_t() - startTime;
+ return Q_UINT64_C(0);
+}
+
+void QNetworkSessionPrivateImpl::updateStateFromServiceNetwork()
+{
+ QNetworkSession::State oldState = state;
+
+ foreach (const QNetworkConfiguration &config, serviceConfig.children()) {
+ if ((config.state() & QNetworkConfiguration::Active) != QNetworkConfiguration::Active)
+ continue;
+
+ if (activeConfig != config) {
+ if (engine) {
+ disconnect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)));
+ }
+
+ activeConfig = config;
+ engine = getEngineFromId(activeConfig.identifier());
+
+ if (engine) {
+ connect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)),
+ Qt::QueuedConnection);
+ }
+ emit newConfigurationActivated();
+ }
+
+ state = QNetworkSession::Connected;
+ if (state != oldState)
+ emit stateChanged(state);
+
+ return;
+ }
+
+ if (serviceConfig.children().isEmpty())
+ state = QNetworkSession::NotAvailable;
+ else
+ state = QNetworkSession::Disconnected;
+
+ if (state != oldState)
+ emit stateChanged(state);
+}
+
+void QNetworkSessionPrivateImpl::updateStateFromActiveConfig()
+{
+ if (!engine)
+ return;
+
+ QNetworkSession::State oldState = state;
+ state = engine->sessionStateForId(activeConfig.identifier());
+
+ bool oldActive = isOpen;
+ isOpen = (state == QNetworkSession::Connected) ? opened : false;
+
+ if (!oldActive && isOpen)
+ emit quitPendingWaitsForOpened();
+ if (oldActive && !isOpen)
+ emit closed();
+
+ if (oldState != state)
+ emit stateChanged(state);
+}
+
+void QNetworkSessionPrivateImpl::networkConfigurationsChanged()
+{
+ if (serviceConfig.isValid())
+ updateStateFromServiceNetwork();
+ else
+ updateStateFromActiveConfig();
+
+ startTime = engine->startTime(activeConfig.identifier());
+}
+
+void QNetworkSessionPrivateImpl::configurationChanged(QNetworkConfigurationPrivatePointer config)
+{
+ if (serviceConfig.isValid() &&
+ (config->id == serviceConfig.identifier() || config->id == activeConfig.identifier())) {
+ updateStateFromServiceNetwork();
+ } else if (config->id == activeConfig.identifier()) {
+ updateStateFromActiveConfig();
+ }
+}
+
+void QNetworkSessionPrivateImpl::forcedSessionClose(const QNetworkConfiguration &config)
+{
+ if (activeConfig == config) {
+ opened = false;
+ isOpen = false;
+
+ emit closed();
+
+ lastError = QNetworkSession::SessionAbortedError;
+ emit QNetworkSessionPrivate::error(lastError);
+ }
+}
+
+void QNetworkSessionPrivateImpl::connectionError(const QString &id, QBearerEngineImpl::ConnectionError error)
+{
+ if (activeConfig.identifier() == id) {
+ networkConfigurationsChanged();
+ switch (error) {
+ case QBearerEngineImpl::OperationNotSupported:
+ lastError = QNetworkSession::OperationNotSupportedError;
+ opened = false;
+ break;
+ case QBearerEngineImpl::InterfaceLookupError:
+ case QBearerEngineImpl::ConnectError:
+ case QBearerEngineImpl::DisconnectionError:
+ default:
+ lastError = QNetworkSession::UnknownSessionError;
+ }
+
+ emit QNetworkSessionPrivate::error(lastError);
+ }
+}
+
+void QNetworkSessionPrivateImpl::decrementTimeout()
+{
+ if (--sessionTimeout <= 0) {
+ disconnect(engine, SIGNAL(updateCompleted()), this, SLOT(decrementTimeout()));
+ sessionTimeout = -1;
+ close();
+ }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/qnetworksession_impl.h b/src/plugins/bearer/qnetworksession_impl.h
new file mode 100644
index 0000000000..644565a794
--- /dev/null
+++ b/src/plugins/bearer/qnetworksession_impl.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNETWORKSESSION_IMPL_H
+#define QNETWORKSESSION_IMPL_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbearerengine_impl.h"
+
+#include <QtNetwork/private/qnetworkconfigmanager_p.h>
+#include <QtNetwork/private/qnetworksession_p.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QBearerEngineImpl;
+
+class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate
+{
+ Q_OBJECT
+
+public:
+ QNetworkSessionPrivateImpl()
+ : startTime(0), sessionTimeout(-1)
+ {}
+ ~QNetworkSessionPrivateImpl()
+ {}
+
+ //called by QNetworkSession constructor and ensures
+ //that the state is immediately updated (w/o actually opening
+ //a session). Also this function should take care of
+ //notification hooks to discover future state changes.
+ void syncStateWithInterface();
+
+#ifndef QT_NO_NETWORKINTERFACE
+ QNetworkInterface currentInterface() const;
+#endif
+ QVariant sessionProperty(const QString& key) const;
+ void setSessionProperty(const QString& key, const QVariant& value);
+
+ void open();
+ void close();
+ void stop();
+ void migrate();
+ void accept();
+ void ignore();
+ void reject();
+
+ QString errorString() const; //must return translated string
+ QNetworkSession::SessionError error() const;
+
+ quint64 bytesWritten() const;
+ quint64 bytesReceived() const;
+ quint64 activeTime() const;
+
+private Q_SLOTS:
+ void networkConfigurationsChanged();
+ void configurationChanged(QNetworkConfigurationPrivatePointer config);
+ void forcedSessionClose(const QNetworkConfiguration &config);
+ void connectionError(const QString &id, QBearerEngineImpl::ConnectionError error);
+ void decrementTimeout();
+
+private:
+ void updateStateFromServiceNetwork();
+ void updateStateFromActiveConfig();
+
+private:
+ QBearerEngineImpl *engine;
+
+ quint64 startTime;
+
+ QNetworkSession::SessionError lastError;
+
+ int sessionTimeout;
+
+ bool opened;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
+
+#endif // QNETWORKSESSION_IMPL_H
diff --git a/src/plugins/bearer/symbian/3_1/3_1.pro b/src/plugins/bearer/symbian/3_1/3_1.pro
new file mode 100644
index 0000000000..b7c6aef913
--- /dev/null
+++ b/src/plugins/bearer/symbian/3_1/3_1.pro
@@ -0,0 +1,9 @@
+include(../symbian.pri)
+
+is_using_gnupoc {
+ LIBS += -lapengine
+} else {
+ LIBS += -lAPEngine
+}
+TARGET = $${TARGET}_3_1
+TARGET.UID3 = 0x2002131C
diff --git a/src/plugins/bearer/symbian/3_2/3_2.pro b/src/plugins/bearer/symbian/3_2/3_2.pro
new file mode 100644
index 0000000000..ac3b3f898f
--- /dev/null
+++ b/src/plugins/bearer/symbian/3_2/3_2.pro
@@ -0,0 +1,17 @@
+include(../symbian.pri)
+
+symbian {
+ contains(S60_VERSION, 3.1) {
+ is_using_gnupoc {
+ LIBS += -lapengine
+ } else {
+ LIBS += -lAPEngine
+ }
+ } else {
+ DEFINES += SNAP_FUNCTIONALITY_AVAILABLE
+ LIBS += -lcmmanager
+ }
+}
+
+TARGET = $${TARGET}_3_2
+TARGET.UID3 = 0x2002131D
diff --git a/src/plugins/bearer/symbian/main.cpp b/src/plugins/bearer/symbian/main.cpp
new file mode 100644
index 0000000000..4506a0bcf2
--- /dev/null
+++ b/src/plugins/bearer/symbian/main.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "symbianengine.h"
+
+#include <QtNetwork/private/qbearerplugin_p.h>
+
+#include <QtCore/qdebug.h>
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+class QSymbianEnginePlugin : public QBearerEnginePlugin
+{
+public:
+ QSymbianEnginePlugin();
+ ~QSymbianEnginePlugin();
+
+ QStringList keys() const;
+ QBearerEngine *create(const QString &key) const;
+};
+
+QSymbianEnginePlugin::QSymbianEnginePlugin()
+{
+}
+
+QSymbianEnginePlugin::~QSymbianEnginePlugin()
+{
+}
+
+QStringList QSymbianEnginePlugin::keys() const
+{
+ return QStringList() << QLatin1String("symbian");
+}
+
+QBearerEngine *QSymbianEnginePlugin::create(const QString &key) const
+{
+ if (key == QLatin1String("symbian"))
+ return new SymbianEngine;
+ else
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QSymbianEnginePlugin)
+Q_EXPORT_PLUGIN2(qsymbianbearer, QSymbianEnginePlugin)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
new file mode 100644
index 0000000000..a9bd4146dc
--- /dev/null
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -0,0 +1,1549 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnetworksession_impl.h"
+#include "symbianengine.h"
+
+#include <es_enum.h>
+#include <es_sock.h>
+#include <in_sock.h>
+#include <private/qcore_symbian_p.h>
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+#include <cmmanager.h>
+#endif
+
+#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+#include <extendedconnpref.h>
+#endif
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine)
+: engine(engine), iSocketServ(qt_symbianGetSocketServer()),
+ ipConnectionNotifier(0), ipConnectionStarter(0),
+ iHandleStateNotificationsFromManager(false), iFirstSync(true), iStoppedByUser(false),
+ iClosedByUser(false), iError(QNetworkSession::UnknownSessionError), iALREnabled(0),
+ iConnectInBackground(false), isOpening(false)
+{
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ iMobility = NULL;
+#endif
+
+ TRAP_IGNORE(iConnectionMonitor.ConnectL());
+}
+
+void QNetworkSessionPrivateImpl::closeHandles()
+{
+ QMutexLocker lock(&mutex);
+ // Cancel Connection Progress Notifications first.
+ // Note: ConnectionNotifier must be destroyed before RConnection::Close()
+ // => deleting ipConnectionNotifier results RConnection::CancelProgressNotification()
+ delete ipConnectionNotifier;
+ ipConnectionNotifier = NULL;
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ // mobility monitor must be deleted before RConnection is closed
+ delete iMobility;
+ iMobility = NULL;
+#endif
+
+ // Cancel possible RConnection::Start() - may call RConnection::Close if Start was in progress
+ delete ipConnectionStarter;
+ ipConnectionStarter = 0;
+ //close any open connection (note Close twice is safe in case Cancel did it above)
+ iConnection.Close();
+
+ QSymbianSocketManager::instance().setDefaultConnection(0);
+
+ iConnectionMonitor.Close();
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this)
+ << " - handles closed";
+#endif
+
+}
+
+QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl()
+{
+ isOpen = false;
+ isOpening = false;
+
+ closeHandles();
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this)
+ << " - destroyed";
+#endif
+}
+
+void QNetworkSessionPrivateImpl::configurationStateChanged(quint32 accessPointId, quint32 connMonId, QNetworkSession::State newState)
+{
+ if (iHandleStateNotificationsFromManager) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "configurationStateChanged from manager for IAP : " << QString::number(accessPointId)
+ << "connMon ID : " << QString::number(connMonId) << " : to a state: " << newState
+ << "whereas my current state is: " << state;
+#else
+ Q_UNUSED(connMonId);
+#endif
+ this->newState(newState, accessPointId);
+ }
+}
+
+void QNetworkSessionPrivateImpl::configurationRemoved(QNetworkConfigurationPrivatePointer config)
+{
+ if (!publicConfig.isValid())
+ return;
+
+ TUint32 publicNumericId =
+ toSymbianConfig(privateConfiguration(publicConfig))->numericIdentifier();
+
+ if (toSymbianConfig(config)->numericIdentifier() == publicNumericId) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "configurationRemoved IAP: " << QString::number(publicNumericId) << " : going to State: Invalid";
+#endif
+ this->newState(QNetworkSession::Invalid, publicNumericId);
+ }
+}
+
+void QNetworkSessionPrivateImpl::configurationAdded(QNetworkConfigurationPrivatePointer config)
+{
+ Q_UNUSED(config);
+ // If session is based on service network, some other app may create new access points
+ // to the SNAP --> synchronize session's state with that of interface's.
+ if (!publicConfig.isValid() || publicConfig.type() != QNetworkConfiguration::ServiceNetwork)
+ return;
+
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "configurationAdded IAP: "
+ << toSymbianConfig(config)->numericIdentifier();
+#endif
+
+ syncStateWithInterface();
+}
+
+// Function sets the state of the session to match the state
+// of the underlying interface (the configuration this session is based on)
+void QNetworkSessionPrivateImpl::syncStateWithInterface()
+{
+ if (!publicConfig.isValid())
+ return;
+
+ if (iFirstSync) {
+ QObject::connect(engine,
+ SIGNAL(configurationStateChanged(quint32,quint32,QNetworkSession::State)),
+ this,
+ SLOT(configurationStateChanged(quint32,quint32,QNetworkSession::State)));
+ // Listen to configuration removals, so that in case the configuration
+ // this session is based on is removed, session knows to enter Invalid -state.
+ QObject::connect(engine, SIGNAL(configurationRemoved(QNetworkConfigurationPrivatePointer)),
+ this, SLOT(configurationRemoved(QNetworkConfigurationPrivatePointer)));
+ // Connect to configuration additions, so that in case a configuration is added
+ // in a SNAP this session is based on, the session knows to synch its state with its
+ // interface.
+ QObject::connect(engine, SIGNAL(configurationAdded(QNetworkConfigurationPrivatePointer)),
+ this, SLOT(configurationAdded(QNetworkConfigurationPrivatePointer)));
+ }
+ // Start listening IAP state changes from QNetworkConfigurationManagerPrivate
+ iHandleStateNotificationsFromManager = true;
+
+ // Check what is the state of the configuration this session is based on
+ // and set the session in appropriate state.
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "syncStateWithInterface() state of publicConfig is: " << publicConfig.state();
+#endif
+ switch (publicConfig.state()) {
+ case QNetworkConfiguration::Active:
+ newState(QNetworkSession::Connected);
+ break;
+ case QNetworkConfiguration::Discovered:
+ newState(QNetworkSession::Disconnected);
+ break;
+ case QNetworkConfiguration::Defined:
+ newState(QNetworkSession::NotAvailable);
+ break;
+ case QNetworkConfiguration::Undefined:
+ default:
+ newState(QNetworkSession::Invalid);
+ }
+}
+
+#ifndef QT_NO_NETWORKINTERFACE
+QNetworkInterface QNetworkSessionPrivateImpl::interface(TUint iapId) const
+{
+ QString interfaceName;
+
+ TSoInetInterfaceInfo ifinfo;
+ TPckg<TSoInetInterfaceInfo> ifinfopkg(ifinfo);
+ TSoInetIfQuery ifquery;
+ TPckg<TSoInetIfQuery> ifquerypkg(ifquery);
+
+ // Open dummy socket for interface queries
+ RSocket socket;
+ TInt retVal = socket.Open(iSocketServ, _L("udp"));
+ if (retVal != KErrNone) {
+ return QNetworkInterface();
+ }
+
+ // Start enumerating interfaces
+ socket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
+ while(socket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, ifinfopkg) == KErrNone) {
+ ifquery.iName = ifinfo.iName;
+ TInt err = socket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, ifquerypkg);
+ if(err == KErrNone && ifquery.iZone[1] == iapId) { // IAP ID is index 1 of iZone
+ if(ifinfo.iAddress.Address() > 0) {
+ interfaceName = QString::fromUtf16(ifinfo.iName.Ptr(),ifinfo.iName.Length());
+ break;
+ }
+ }
+ }
+
+ socket.Close();
+
+ if (interfaceName.isEmpty()) {
+ return QNetworkInterface();
+ }
+
+ return QNetworkInterface::interfaceFromName(interfaceName);
+}
+#endif
+
+#ifndef QT_NO_NETWORKINTERFACE
+QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const
+{
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "currentInterface() requested, state: " << state
+ << "publicConfig validity: " << publicConfig.isValid();
+ if (activeInterface.isValid())
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "interface is: " << activeInterface.humanReadableName();
+#endif
+
+ if (!publicConfig.isValid() || state != QNetworkSession::Connected) {
+ return QNetworkInterface();
+ }
+
+ return activeInterface;
+}
+#endif
+
+QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString& key) const
+{
+ if (key == "ConnectInBackground") {
+ return QVariant(iConnectInBackground);
+ }
+ return QVariant();
+}
+
+void QNetworkSessionPrivateImpl::setSessionProperty(const QString& key, const QVariant& value)
+{
+ // Valid value means adding property, invalid means removing it.
+ if (key == "ConnectInBackground") {
+ if (value.isValid()) {
+ iConnectInBackground = value.toBool();
+ } else {
+ iConnectInBackground = EFalse;
+ }
+ }
+}
+
+QString QNetworkSessionPrivateImpl::errorString() const
+{
+ switch (iError) {
+ case QNetworkSession::UnknownSessionError:
+ return tr("Unknown session error.");
+ case QNetworkSession::SessionAbortedError:
+ return tr("The session was aborted by the user or system.");
+ case QNetworkSession::OperationNotSupportedError:
+ return tr("The requested operation is not supported by the system.");
+ case QNetworkSession::InvalidConfigurationError:
+ return tr("The specified configuration cannot be used.");
+ case QNetworkSession::RoamingError:
+ return tr("Roaming was aborted or is not possible.");
+ }
+
+ return QString();
+}
+
+QNetworkSession::SessionError QNetworkSessionPrivateImpl::error() const
+{
+ return iError;
+}
+
+void QNetworkSessionPrivateImpl::open()
+{
+ QMutexLocker lock(&mutex);
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "open() called, session state is: " << state << " and isOpen is: "
+ << isOpen << isOpening;
+#endif
+
+ if (isOpen || isOpening)
+ return;
+
+ isOpening = true;
+
+ // Stop handling IAP state change signals from QNetworkConfigurationManagerPrivate
+ // => RConnection::ProgressNotification will be used for IAP/SNAP monitoring
+ iHandleStateNotificationsFromManager = false;
+
+ // Configuration may have been invalidated after session creation by platform
+ // (e.g. configuration has been deleted).
+ if (!publicConfig.isValid()) {
+ newState(QNetworkSession::Invalid);
+ iError = QNetworkSession::InvalidConfigurationError;
+ emit QNetworkSessionPrivate::error(iError);
+ return;
+ }
+ // If opening a undefined configuration, session emits error and enters
+ // NotAvailable -state. Note that we will try ones in 'defined' state to avoid excessive
+ // need for WLAN scans (via updateConfigurations()), because user may have walked
+ // into a WLAN range, but periodic background scan has not occurred yet -->
+ // we don't want to force application to make frequent updateConfigurations() calls
+ // to be able to try if e.g. home WLAN is available.
+ if (publicConfig.state() == QNetworkConfiguration::Undefined) {
+ newState(QNetworkSession::NotAvailable);
+ iError = QNetworkSession::InvalidConfigurationError;
+ emit QNetworkSessionPrivate::error(iError);
+ return;
+ }
+ // Clear possible previous states
+ iStoppedByUser = false;
+ iClosedByUser = false;
+
+ Q_ASSERT(!iConnection.SubSessionHandle());
+ TInt error = iConnection.Open(iSocketServ);
+ if (error != KErrNone) {
+ // Could not open RConnection
+ newState(QNetworkSession::Invalid);
+ iError = QNetworkSession::UnknownSessionError;
+ emit QNetworkSessionPrivate::error(iError);
+ syncStateWithInterface();
+ return;
+ }
+
+ // Use RConnection::ProgressNotification for IAP/SNAP monitoring
+ // (<=> ConnectionProgressNotifier uses RConnection::ProgressNotification)
+ if (!ipConnectionNotifier) {
+ ipConnectionNotifier = new ConnectionProgressNotifier(*this,iConnection);
+ }
+ if (ipConnectionNotifier) {
+ ipConnectionNotifier->StartNotifications();
+ }
+
+ if (publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(publicConfig));
+
+#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+ // With One Click Connectivity (Symbian^3 onwards) it is possible
+ // to connect silently, without any popups.
+ TConnPrefList pref;
+ TExtendedConnPref prefs;
+
+ prefs.SetIapId(symbianConfig->numericIdentifier());
+ if (iConnectInBackground) {
+ prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent );
+ }
+ pref.AppendL(&prefs);
+#else
+ TCommDbConnPref pref;
+ pref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+
+ pref.SetIapId(symbianConfig->numericIdentifier());
+#endif
+ if (!ipConnectionStarter) {
+ ipConnectionStarter = new ConnectionStarter(*this, iConnection);
+ ipConnectionStarter->Start(pref);
+ }
+ // Avoid flip flop of states if the configuration is already
+ // active. IsOpen/opened() will indicate when ready.
+ if (state != QNetworkSession::Connected) {
+ newState(QNetworkSession::Connecting);
+ }
+ } else if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(publicConfig));
+
+#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE)
+ // On Symbian^3 if service network is not reachable, it triggers a UI (aka EasyWLAN) where
+ // user can create new IAPs. To detect this, we need to store the number of IAPs
+ // there was before connection was started.
+ iKnownConfigsBeforeConnectionStart = engine->accessPointConfigurationIdentifiers();
+ TConnPrefList snapPref;
+ TExtendedConnPref prefs;
+ prefs.SetSnapId(symbianConfig->numericIdentifier());
+ if (iConnectInBackground) {
+ prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent );
+ }
+ snapPref.AppendL(&prefs);
+#else
+ TConnSnapPref snapPref(symbianConfig->numericIdentifier());
+#endif
+ if (!ipConnectionStarter) {
+ ipConnectionStarter = new ConnectionStarter(*this, iConnection);
+ ipConnectionStarter->Start(snapPref);
+ }
+ // Avoid flip flop of states if the configuration is already
+ // active. IsOpen/opened() will indicate when ready.
+ if (state != QNetworkSession::Connected) {
+ newState(QNetworkSession::Connecting);
+ }
+ } else if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ iKnownConfigsBeforeConnectionStart = engine->accessPointConfigurationIdentifiers();
+ if (!ipConnectionStarter) {
+ ipConnectionStarter = new ConnectionStarter(*this, iConnection);
+ ipConnectionStarter->Start();
+ }
+ newState(QNetworkSession::Connecting);
+ }
+
+ if (error != KErrNone) {
+ isOpen = false;
+ isOpening = false;
+ iError = QNetworkSession::UnknownSessionError;
+ emit QNetworkSessionPrivate::error(iError);
+ closeHandles();
+ syncStateWithInterface();
+ }
+}
+
+TUint QNetworkSessionPrivateImpl::iapClientCount(TUint aIAPId) const
+{
+ TRequestStatus status;
+ TUint connectionCount;
+ iConnectionMonitor.GetConnectionCount(connectionCount, status);
+ User::WaitForRequest(status);
+ if (status.Int() == KErrNone) {
+ for (TUint i = 1; i <= connectionCount; i++) {
+ TUint connectionId;
+ TUint subConnectionCount;
+ iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
+ TUint apId;
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
+ User::WaitForRequest(status);
+ if (apId == aIAPId) {
+ TConnMonClientEnumBuf buf;
+ iConnectionMonitor.GetPckgAttribute(connectionId, 0, KClientInfo, buf, status);
+ User::WaitForRequest(status);
+ if (status.Int() == KErrNone) {
+ return buf().iCount;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+void QNetworkSessionPrivateImpl::close(bool allowSignals)
+{
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "close() called, session state is: " << state << " and isOpen is : "
+ << isOpen;
+#endif
+
+ if (!isOpen && state != QNetworkSession::Connecting) {
+ return;
+ }
+ // Mark this session as closed-by-user so that we are able to report
+ // distinguish between stop() and close() state transitions
+ // when reporting.
+ iClosedByUser = true;
+ isOpen = false;
+ isOpening = false;
+
+ serviceConfig = QNetworkConfiguration();
+
+ closeHandles();
+
+ // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
+ iHandleStateNotificationsFromManager = true;
+
+ // If UserChoice, go down immediately. If some other configuration,
+ // go down immediately if there is no reports expected from the platform;
+ // in practice Connection Monitor is aware of connections only after
+ // KFinishedSelection event, and hence reports only after that event, but
+ // that does not seem to be trusted on all Symbian versions --> safest
+ // to go down.
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice || state == QNetworkSession::Connecting) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "going disconnected right away, since either UserChoice or Connecting";
+#endif
+ newState(QNetworkSession::Closing);
+ newState(QNetworkSession::Disconnected);
+ }
+ if (allowSignals) {
+ emit closed();
+ }
+}
+
+void QNetworkSessionPrivateImpl::stop()
+{
+ QMutexLocker lock(&mutex);
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "stop() called, session state is: " << state << " and isOpen is : "
+ << isOpen;
+#endif
+ if (!isOpen &&
+ publicConfig.isValid() &&
+ publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "since session is not open, using RConnectionMonitor to stop() the interface";
+#endif
+ iStoppedByUser = true;
+ // If the publicConfig is type of IAP, enumerate through connections at
+ // connection monitor. If publicConfig is active in that list, stop it.
+ // Otherwise there is nothing to stop. Note: because this QNetworkSession is not open,
+ // activeConfig is not usable.
+ TUint count;
+ TRequestStatus status;
+ iConnectionMonitor.GetConnectionCount(count, status);
+ User::WaitForRequest(status);
+ if (status.Int() != KErrNone) {
+ return;
+ }
+ TUint numSubConnections; // Not used but needed by GetConnectionInfo i/f
+ TUint connectionId;
+ for (TUint i = 1; i <= count; ++i) {
+ // Get (connection monitor's assigned) connection ID
+ TInt ret = iConnectionMonitor.GetConnectionInfo(i, connectionId, numSubConnections);
+ if (ret == KErrNone) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(publicConfig));
+
+ // See if connection Id matches with our Id. If so, stop() it.
+ if (symbianConfig->connectionIdentifier() == connectionId) {
+ ret = iConnectionMonitor.SetBoolAttribute(connectionId,
+ 0, // subConnectionId don't care
+ KConnectionStop,
+ ETrue);
+ }
+ }
+ // Enter disconnected state right away since the session is not even open.
+ // Symbian^3 connection monitor does not emit KLinkLayerClosed when
+ // connection is stopped via connection monitor.
+ newState(QNetworkSession::Disconnected);
+ }
+ } else if (isOpen) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "since session is open, using RConnection to stop() the interface";
+#endif
+ // Since we are open, use RConnection to stop the interface
+ isOpen = false;
+ isOpening = false;
+ iStoppedByUser = true;
+ newState(QNetworkSession::Closing);
+ if (ipConnectionNotifier) {
+ ipConnectionNotifier->StopNotifications();
+ // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
+ iHandleStateNotificationsFromManager = true;
+ }
+ iConnection.Stop(RConnection::EStopAuthoritative);
+ isOpen = true;
+ isOpening = false;
+ close(false);
+ emit closed();
+ }
+}
+
+void QNetworkSessionPrivateImpl::migrate()
+{
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (iMobility) {
+ QSymbianSocketManager::instance().setDefaultConnection(0);
+ // Start migrating to new IAP
+ iMobility->MigrateToPreferredCarrier();
+ }
+#endif
+}
+
+void QNetworkSessionPrivateImpl::ignore()
+{
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (iMobility) {
+ iMobility->IgnorePreferredCarrier();
+
+ if (!iALRUpgradingConnection) {
+ newState(QNetworkSession::Disconnected);
+ } else {
+ newState(QNetworkSession::Connected,iOldRoamingIap);
+ }
+ }
+#endif
+}
+
+void QNetworkSessionPrivateImpl::accept()
+{
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (iMobility) {
+ iMobility->NewCarrierAccepted();
+
+ QNetworkConfiguration newActiveConfig = activeConfiguration(iNewRoamingIap);
+
+ QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
+
+ newState(QNetworkSession::Connected, iNewRoamingIap);
+ }
+#endif
+}
+
+void QNetworkSessionPrivateImpl::reject()
+{
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (iMobility) {
+ iMobility->NewCarrierRejected();
+
+ if (!iALRUpgradingConnection) {
+ newState(QNetworkSession::Disconnected);
+ } else {
+ QNetworkConfiguration newActiveConfig = activeConfiguration(iOldRoamingIap);
+
+ QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
+
+ newState(QNetworkSession::Connected, iOldRoamingIap);
+ }
+ }
+#endif
+}
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+void QNetworkSessionPrivateImpl::PreferredCarrierAvailable(TAccessPointInfo aOldAPInfo,
+ TAccessPointInfo aNewAPInfo,
+ TBool aIsUpgrade,
+ TBool aIsSeamless)
+{
+ iOldRoamingIap = aOldAPInfo.AccessPoint();
+ iNewRoamingIap = aNewAPInfo.AccessPoint();
+ newState(QNetworkSession::Roaming);
+ if (iALREnabled > 0) {
+ iALRUpgradingConnection = aIsUpgrade;
+ QList<QNetworkConfiguration> configs = publicConfig.children();
+ for (int i=0; i < configs.count(); i++) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(configs[i]));
+
+ if (symbianConfig->numericIdentifier() == aNewAPInfo.AccessPoint()) {
+ // Any slot connected to the signal might throw an std::exception,
+ // which must not propagate into Symbian code (this function is a callback
+ // from platform). We could convert exception to a symbian Leave, but since the
+ // prototype of this function bans this (no trailing 'L'), we just catch
+ // and drop.
+ QT_TRY {
+ emit preferredConfigurationChanged(configs[i], aIsSeamless);
+ }
+ QT_CATCH (std::exception&) {}
+ }
+ }
+ } else {
+ migrate();
+ }
+}
+
+void QNetworkSessionPrivateImpl::NewCarrierActive(TAccessPointInfo /*aNewAPInfo*/, TBool /*aIsSeamless*/)
+{
+ if (iALREnabled > 0) {
+ QT_TRY {
+ emit newConfigurationActivated();
+ }
+ QT_CATCH (std::exception&) {}
+ } else {
+ accept();
+ }
+}
+
+void QNetworkSessionPrivateImpl::Error(TInt aError)
+{
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "roaming Error() occurred" << aError << ", isOpen is: " << isOpen;
+#endif
+ if (aError == KErrCancel)
+ return; //avoid recursive deletion
+ if (isOpen) {
+ isOpen = false;
+ isOpening = false;
+ activeConfig = QNetworkConfiguration();
+ serviceConfig = QNetworkConfiguration();
+ iError = QNetworkSession::RoamingError;
+ emit QNetworkSessionPrivate::error(iError);
+ closeHandles();
+ QT_TRY {
+ syncStateWithInterface();
+ // In some cases IAP is still in Connected state when
+ // syncStateWithInterface(); is called
+ // => Following call makes sure that Session state
+ // changes immediately to Disconnected.
+ newState(QNetworkSession::Disconnected);
+ emit closed();
+ }
+ QT_CATCH (std::exception&) {}
+ } else if (iStoppedByUser) {
+ // If the user of this session has called the stop() and
+ // configuration is based on internet SNAP, this needs to be
+ // done here because platform might roam.
+ QT_TRY {
+ newState(QNetworkSession::Disconnected);
+ }
+ QT_CATCH (std::exception&) {}
+ }
+}
+#endif
+
+void QNetworkSessionPrivateImpl::setALREnabled(bool enabled)
+{
+ if (enabled) {
+ iALREnabled++;
+ } else {
+ iALREnabled--;
+ }
+}
+
+QNetworkConfiguration QNetworkSessionPrivateImpl::bestConfigFromSNAP(const QNetworkConfiguration& snapConfig) const
+{
+ QNetworkConfiguration config;
+ QList<QNetworkConfiguration> subConfigurations = snapConfig.children();
+ for (int i = 0; i < subConfigurations.count(); i++ ) {
+ if (subConfigurations[i].state() == QNetworkConfiguration::Active) {
+ config = subConfigurations[i];
+ break;
+ } else if (!config.isValid() && subConfigurations[i].state() == QNetworkConfiguration::Discovered) {
+ config = subConfigurations[i];
+ }
+ }
+ if (!config.isValid() && subConfigurations.count() > 0) {
+ config = subConfigurations[0];
+ }
+ return config;
+}
+
+quint64 QNetworkSessionPrivateImpl::bytesWritten() const
+{
+ return transferredData(KUplinkData);
+}
+
+quint64 QNetworkSessionPrivateImpl::bytesReceived() const
+{
+ return transferredData(KDownlinkData);
+}
+
+quint64 QNetworkSessionPrivateImpl::transferredData(TUint dataType) const
+{
+ if (!publicConfig.isValid()) {
+ return 0;
+ }
+
+ QNetworkConfiguration config;
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ if (serviceConfig.isValid()) {
+ config = serviceConfig;
+ } else {
+ if (activeConfig.isValid()) {
+ config = activeConfig;
+ }
+ }
+ } else {
+ config = publicConfig;
+ }
+
+ if (!config.isValid()) {
+ return 0;
+ }
+
+ TUint count;
+ TRequestStatus status;
+ iConnectionMonitor.GetConnectionCount(count, status);
+ User::WaitForRequest(status);
+ if (status.Int() != KErrNone) {
+ return 0;
+ }
+
+ TUint transferredData = 0;
+ TUint numSubConnections;
+ TUint connectionId;
+ bool configFound;
+ for (TUint i = 1; i <= count; i++) {
+ TInt ret = iConnectionMonitor.GetConnectionInfo(i, connectionId, numSubConnections);
+ if (ret == KErrNone) {
+ TUint apId;
+ iConnectionMonitor.GetUintAttribute(connectionId, 0, KIAPId, apId, status);
+ User::WaitForRequest(status);
+ if (status.Int() == KErrNone) {
+ configFound = false;
+ if (config.type() == QNetworkConfiguration::ServiceNetwork) {
+ QList<QNetworkConfiguration> configs = config.children();
+ for (int i=0; i < configs.count(); i++) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(configs[i]));
+
+ if (symbianConfig->numericIdentifier() == apId) {
+ configFound = true;
+ break;
+ }
+ }
+ } else {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(config));
+
+ if (symbianConfig->numericIdentifier() == apId)
+ configFound = true;
+ }
+ if (configFound) {
+ TUint tData;
+ iConnectionMonitor.GetUintAttribute(connectionId, 0, dataType, tData, status );
+ User::WaitForRequest(status);
+ if (status.Int() == KErrNone) {
+ transferredData += tData;
+ }
+ }
+ }
+ }
+ }
+
+ return transferredData;
+}
+
+quint64 QNetworkSessionPrivateImpl::activeTime() const
+{
+ if (!isOpen || startTime.isNull()) {
+ return 0;
+ }
+ return startTime.secsTo(QDateTime::currentDateTime());
+}
+
+QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 iapId) const
+{
+ if (iapId == 0) {
+ _LIT(KSetting, "IAP\\Id");
+ iConnection.GetIntSetting(KSetting, iapId);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ // Check if this is an Easy WLAN configuration. On Symbian^3 RConnection may report
+ // the used configuration as 'EasyWLAN' IAP ID if someone has just opened the configuration
+ // from WLAN Scan dialog, _and_ that connection is still up. We need to find the
+ // real matching configuration. Function alters the Easy WLAN ID to real IAP ID (only if
+ // easy WLAN):
+ easyWlanTrueIapId(iapId);
+#endif
+ }
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) {
+ // Try to search IAP from the used SNAP using IAP Id
+ QList<QNetworkConfiguration> children = publicConfig.children();
+ for (int i=0; i < children.count(); i++) {
+ SymbianNetworkConfigurationPrivate *childConfig =
+ toSymbianConfig(privateConfiguration(children[i]));
+
+ if (childConfig->numericIdentifier() == iapId)
+ return children[i];
+ }
+
+ // Given IAP Id was not found from the used SNAP
+ // => Try to search matching IAP using mappingName
+ // mappingName contains:
+ // 1. "Access point name" for "Packet data" Bearer
+ // 2. "WLAN network name" (= SSID) for "Wireless LAN" Bearer
+ // 3. "Dial-up number" for "Data call Bearer" or "High Speed (GSM)" Bearer
+ // <=> Note: It's possible that in this case reported IAP is
+ // clone of the one of the IAPs of the used SNAP
+ // => If mappingName matches, clone has been found
+ QNetworkConfiguration pt = QNetworkConfigurationManager().configurationFromIdentifier(
+ QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId)));
+
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(pt));
+ if (symbianConfig) {
+ for (int i=0; i < children.count(); i++) {
+ SymbianNetworkConfigurationPrivate *childConfig =
+ toSymbianConfig(privateConfiguration(children[i]));
+
+ if (childConfig->configMappingName() == symbianConfig->configMappingName()) {
+ return children[i];
+ }
+ }
+ } else {
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ // On Symbian^3 (only, not earlier or Symbian^4) if the SNAP was not reachable, it
+ // triggers user choice type of activity (EasyWLAN). As a result, a new IAP may be
+ // created, and hence if was not found yet. Therefore update configurations and see if
+ // there is something new.
+
+ // 1. Update knowledge from the databases.
+ if (thread() != engine->thread())
+ QMetaObject::invokeMethod(engine, "requestUpdate", Qt::BlockingQueuedConnection);
+ else
+ engine->requestUpdate();
+
+ // 2. Check if new configuration was created during connection creation
+ QList<QString> knownConfigs = engine->accessPointConfigurationIdentifiers();
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "opened configuration was not known beforehand, looking for new.";
+#endif
+ if (knownConfigs.count() > iKnownConfigsBeforeConnectionStart.count()) {
+ // Configuration count increased => new configuration was created
+ // => Search new, created configuration
+ QString newIapId;
+ for (int i=0; i < iKnownConfigsBeforeConnectionStart.count(); i++) {
+ if (knownConfigs[i] != iKnownConfigsBeforeConnectionStart[i]) {
+ newIapId = knownConfigs[i];
+ break;
+ }
+ }
+ if (newIapId.isEmpty()) {
+ newIapId = knownConfigs[knownConfigs.count()-1];
+ }
+ pt = QNetworkConfigurationManager().configurationFromIdentifier(newIapId);
+ if (pt.isValid()) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "new configuration was found, name, IAP id: " << pt.name() << pt.identifier();
+#endif
+ return pt;
+ }
+ }
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "configuration was not found, returning invalid.";
+#endif
+#endif
+ // Given IAP Id was not found from known IAPs array
+ return QNetworkConfiguration();
+ }
+ // Matching IAP was not found from used SNAP
+ // => IAP from another SNAP is returned
+ // (Note: Returned IAP matches to given IAP Id)
+ return pt;
+ }
+#endif
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ if (engine) {
+ QNetworkConfiguration pt = QNetworkConfigurationManager().configurationFromIdentifier(
+ QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId)));
+ // Try to found User Selected IAP from known IAPs (accessPointConfigurations)
+ if (pt.isValid()) {
+ return pt;
+ } else {
+ // Check if new (WLAN) IAP was created in IAP/SNAP dialog
+ // 1. Sync internal configurations array to commsdb first
+ if (thread() != engine->thread()) {
+ QMetaObject::invokeMethod(engine, "requestUpdate",
+ Qt::BlockingQueuedConnection);
+ } else {
+ engine->requestUpdate();
+ }
+ // 2. Check if new configuration was created during connection creation
+ QStringList knownConfigs = engine->accessPointConfigurationIdentifiers();
+ if (knownConfigs.count() > iKnownConfigsBeforeConnectionStart.count()) {
+ // Configuration count increased => new configuration was created
+ // => Search new, created configuration
+ QString newIapId;
+ for (int i=0; i < iKnownConfigsBeforeConnectionStart.count(); i++) {
+ if (knownConfigs[i] != iKnownConfigsBeforeConnectionStart[i]) {
+ newIapId = knownConfigs[i];
+ break;
+ }
+ }
+ if (newIapId.isEmpty()) {
+ newIapId = knownConfigs[knownConfigs.count()-1];
+ }
+ pt = QNetworkConfigurationManager().configurationFromIdentifier(newIapId);
+ if (pt.isValid())
+ return pt;
+ }
+ }
+ }
+ return QNetworkConfiguration();
+ }
+
+ return publicConfig;
+}
+
+void QNetworkSessionPrivateImpl::ConnectionStartComplete(TInt statusCode)
+{
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "RConnection::Start completed with status code: " << statusCode;
+#endif
+ delete ipConnectionStarter;
+ ipConnectionStarter = 0;
+
+ switch (statusCode) {
+ case KErrNone: // Connection created successfully
+ {
+ TInt error = KErrNone;
+ QNetworkConfiguration newActiveConfig = activeConfiguration();
+ if (!newActiveConfig.isValid()) {
+ // RConnection startup was successful but no configuration
+ // was found. That indicates that user has chosen to create a
+ // new WLAN configuration (from scan results), but that new
+ // configuration does not have access to Internet (Internet
+ // Connectivity Test, ICT, failed).
+ error = KErrGeneral;
+ } else {
+ QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
+ }
+ if (error != KErrNone) {
+ isOpen = false;
+ isOpening = false;
+ iError = QNetworkSession::UnknownSessionError;
+ QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
+ closeHandles();
+ if (!newActiveConfig.isValid()) {
+ // No valid configuration, bail out.
+ // Status updates from QNCM won't be received correctly
+ // because there is no configuration to associate them with so transit here.
+ newState(QNetworkSession::Closing);
+ newState(QNetworkSession::Disconnected);
+ }
+ QT_TRYCATCH_LEAVING(syncStateWithInterface());
+ return;
+ }
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) {
+ // Activate ALR monitoring
+ iMobility = CActiveCommsMobilityApiExt::NewL(iConnection, *this);
+ }
+#endif
+
+ isOpen = true;
+ isOpening = false;
+ activeConfig = newActiveConfig;
+
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(activeConfig));
+
+#ifndef QT_NO_NETWORKINTERFACE
+ activeInterface = interface(symbianConfig->numericIdentifier());
+#endif
+ if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
+ serviceConfig = QNetworkConfigurationManager()
+ .configurationFromIdentifier(activeConfig.identifier());
+ }
+
+ startTime = QDateTime::currentDateTime();
+
+ QT_TRYCATCH_LEAVING({
+ newState(QNetworkSession::Connected);
+ emit quitPendingWaitsForOpened();
+ });
+ }
+ break;
+ case KErrNotFound: // Connection failed
+ isOpen = false;
+ isOpening = false;
+ activeConfig = QNetworkConfiguration();
+ serviceConfig = QNetworkConfiguration();
+ iError = QNetworkSession::InvalidConfigurationError;
+ QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
+ closeHandles();
+ QT_TRYCATCH_LEAVING(syncStateWithInterface());
+ break;
+ case KErrCancel: // Connection attempt cancelled
+ case KErrAlreadyExists: // Connection already exists
+ default:
+ isOpen = false;
+ isOpening = false;
+ activeConfig = QNetworkConfiguration();
+ serviceConfig = QNetworkConfiguration();
+ if (statusCode == KErrCancel) {
+ iError = QNetworkSession::SessionAbortedError;
+ } else if (publicConfig.state() == QNetworkConfiguration::Undefined ||
+ publicConfig.state() == QNetworkConfiguration::Defined) {
+ iError = QNetworkSession::InvalidConfigurationError;
+ } else {
+ iError = QNetworkSession::UnknownSessionError;
+ }
+ QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
+ closeHandles();
+ QT_TRYCATCH_LEAVING(syncStateWithInterface());
+ break;
+ }
+}
+
+// Enters newState if feasible according to current state.
+// AccessPointId may be given as parameter. If it is zero, state-change is assumed to
+// concern this session's configuration. If non-zero, the configuration is looked up
+// and checked if it matches the configuration this session is based on.
+bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint accessPointId)
+{
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - "
+ << "NEW STATE, IAP ID : " << QString::number(accessPointId) << " , newState : " << QString::number(newState);
+#endif
+ // Make sure that activeConfig is always updated when SNAP is signaled to be
+ // connected.
+ if (isOpen && publicConfig.type() == QNetworkConfiguration::ServiceNetwork &&
+ newState == QNetworkSession::Connected) {
+ activeConfig = activeConfiguration(accessPointId);
+
+#ifndef QT_NO_NETWORKINTERFACE
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(activeConfig));
+
+ activeInterface = interface(symbianConfig->numericIdentifier());
+#endif
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ QSymbianSocketManager::instance().setDefaultConnection(&iConnection);
+#endif
+ }
+
+ // Make sure that same state is not signaled twice in a row.
+ if (state == newState) {
+ return true;
+ }
+
+ // Make sure that Connecting state does not overwrite Roaming state
+ if (state == QNetworkSession::Roaming && newState == QNetworkSession::Connecting) {
+ return false;
+ }
+
+ // Make sure that Connected state is not reported when Connection is
+ // already Closing.
+ // Note: Stopping connection results sometimes KLinkLayerOpen
+ // to be reported first (just before KLinkLayerClosed).
+ if (state == QNetworkSession::Closing && newState == QNetworkSession::Connected) {
+ return false;
+ }
+
+ // Make sure that some lagging 'closing' state-changes do not overwrite
+ // if we are already disconnected or closed.
+ if (state == QNetworkSession::Disconnected && newState == QNetworkSession::Closing) {
+ return false;
+ }
+
+ // Make sure that some lagging 'connecting' state-changes do not overwrite
+ // if we are already connected (may righfully still happen with roaming though).
+ if (state == QNetworkSession::Connected && newState == QNetworkSession::Connecting) {
+ return false;
+ }
+
+ bool emitSessionClosed = false;
+
+ // If we abruptly go down and user hasn't closed the session, we've been aborted.
+ // Note that session may be in 'closing' state and not in 'connected' state, because
+ // depending on platform the platform may report KConfigDaemonStartingDeregistration
+ // event before KLinkLayerClosed
+ if ((isOpen && state == QNetworkSession::Connected && newState == QNetworkSession::Disconnected) ||
+ (isOpen && !iClosedByUser && newState == QNetworkSession::Disconnected)) {
+ // Active & Connected state should change directly to Disconnected state
+ // only when something forces connection to close (eg. when another
+ // application or session stops connection or when network drops
+ // unexpectedly).
+ isOpen = false;
+ isOpening = false;
+ activeConfig = QNetworkConfiguration();
+ serviceConfig = QNetworkConfiguration();
+ iError = QNetworkSession::SessionAbortedError;
+ emit QNetworkSessionPrivate::error(iError);
+ closeHandles();
+ // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
+ iHandleStateNotificationsFromManager = true;
+ emitSessionClosed = true; // Emit SessionClosed after state change has been reported
+ }
+
+ bool retVal = false;
+ if (accessPointId == 0) {
+ state = newState;
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed A to: " << state;
+#endif
+ emit stateChanged(state);
+ retVal = true;
+ } else {
+ if (publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(publicConfig));
+
+ if (symbianConfig->numericIdentifier() == accessPointId) {
+ state = newState;
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed B to: " << state;
+#endif
+ emit stateChanged(state);
+ retVal = true;
+ }
+ } else if (publicConfig.type() == QNetworkConfiguration::UserChoice && isOpen) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(activeConfig));
+
+ if (symbianConfig->numericIdentifier() == accessPointId) {
+ state = newState;
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed C to: " << state;
+#endif
+ emit stateChanged(state);
+ retVal = true;
+ }
+ } else if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) {
+ QList<QNetworkConfiguration> subConfigurations = publicConfig.children();
+ for (int i = 0; i < subConfigurations.count(); i++) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(subConfigurations[i]));
+
+ if (symbianConfig->numericIdentifier() == accessPointId) {
+ if (newState != QNetworkSession::Disconnected) {
+ state = newState;
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed D to: " << state;
+#endif
+ emit stateChanged(state);
+ retVal = true;
+ } else {
+ QNetworkConfiguration config = bestConfigFromSNAP(publicConfig);
+ if ((config.state() == QNetworkConfiguration::Defined) ||
+ (config.state() == QNetworkConfiguration::Discovered)) {
+ activeConfig = QNetworkConfiguration();
+ state = newState;
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed E to: " << state;
+#endif
+ emit stateChanged(state);
+ retVal = true;
+ } else if (config.state() == QNetworkConfiguration::Active) {
+ // Connection to used IAP was closed, but there is another
+ // IAP that's active in used SNAP
+ // => Change state back to Connected
+ state = QNetworkSession::Connected;
+ emit stateChanged(state);
+ retVal = true;
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed F to: " << state;
+#endif
+ }
+ }
+ }
+ }
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ // If the retVal is not true here, it means that the status update may apply to an IAP outside of
+ // SNAP (session is based on SNAP but follows IAP outside of it), which may occur on Symbian^3 EasyWlan.
+ if (retVal == false && activeConfig.isValid() &&
+ toSymbianConfig(privateConfiguration(activeConfig))->numericIdentifier() == accessPointId) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed G to: " << state;
+#endif
+ if (newState == QNetworkSession::Disconnected) {
+ activeConfig = QNetworkConfiguration();
+ }
+ state = newState;
+ emit stateChanged(state);
+ retVal = true;
+ }
+#endif
+ }
+ }
+ if (emitSessionClosed) {
+ emit closed();
+ }
+ if (state == QNetworkSession::Disconnected) {
+ // Just in case clear activeConfiguration.
+ activeConfig = QNetworkConfiguration();
+ }
+ return retVal;
+}
+
+void QNetworkSessionPrivateImpl::handleSymbianConnectionStatusChange(TInt aConnectionStatus,
+ TInt aError,
+ TUint accessPointId)
+{
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << QString::number(accessPointId) << " , status : " << QString::number(aConnectionStatus);
+#endif
+ switch (aConnectionStatus)
+ {
+ // Connection unitialised
+ case KConnectionUninitialised:
+ break;
+
+ // Starting connetion selection
+ case KStartingSelection:
+ break;
+
+ // Selection finished
+ case KFinishedSelection:
+ if (aError == KErrNone)
+ {
+ break;
+ }
+ else
+ {
+ // The user pressed e.g. "Cancel" and did not select an IAP
+ newState(QNetworkSession::Disconnected,accessPointId);
+ }
+ break;
+
+ // Connection failure
+ case KConnectionFailure:
+ newState(QNetworkSession::NotAvailable);
+ break;
+
+ // Prepearing connection (e.g. dialing)
+ case KPsdStartingConfiguration:
+ case KPsdFinishedConfiguration:
+ case KCsdFinishedDialling:
+ case KCsdScanningScript:
+ case KCsdGettingLoginInfo:
+ case KCsdGotLoginInfo:
+ break;
+
+ case KConfigDaemonStartingRegistration:
+ // Creating connection (e.g. GPRS activation)
+ case KCsdStartingConnect:
+ case KCsdFinishedConnect:
+ newState(QNetworkSession::Connecting,accessPointId);
+ break;
+
+ // Starting log in
+ case KCsdStartingLogIn:
+ break;
+
+ // Finished login
+ case KCsdFinishedLogIn:
+ break;
+
+ // Connection open
+ case KConnectionOpen:
+ break;
+
+ case KLinkLayerOpen:
+ newState(QNetworkSession::Connected,accessPointId);
+ break;
+
+ // Connection blocked or suspended
+ case KDataTransferTemporarilyBlocked:
+ break;
+
+ case KConfigDaemonStartingDeregistration:
+ // Hangup or GRPS deactivation
+ case KConnectionStartingClose:
+ newState(QNetworkSession::Closing,accessPointId);
+ break;
+
+ // Connection closed
+ case KConnectionClosed:
+ case KLinkLayerClosed:
+ newState(QNetworkSession::Disconnected,accessPointId);
+ // Report manager about this to make sure this event
+ // is received by all interseted parties (mediated by
+ // manager because it does always receive all events from
+ // connection monitor).
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "reporting disconnection to manager.";
+#endif
+ if (publicConfig.isValid()) {
+ SymbianNetworkConfigurationPrivate *symbianConfig =
+ toSymbianConfig(privateConfiguration(publicConfig));
+
+ engine->configurationStateChangeReport(symbianConfig->numericIdentifier(),
+ QNetworkSession::Disconnected);
+ }
+ break;
+ // Unhandled state
+ default:
+ break;
+ }
+}
+
+#if defined(SNAP_FUNCTIONALITY_AVAILABLE)
+bool QNetworkSessionPrivateImpl::easyWlanTrueIapId(TUint32 &trueIapId) const
+{
+ RCmManager iCmManager;
+ TRAPD(err, iCmManager.OpenL());
+ if (err != KErrNone)
+ return false;
+
+ // Check if this is easy wlan id in the first place
+ if (trueIapId != iCmManager.EasyWlanIdL()) {
+ iCmManager.Close();
+ return false;
+ }
+
+ iCmManager.Close();
+
+ // Loop through all connections that connection monitor is aware
+ // and check for IAPs based on easy WLAN
+ TRequestStatus status;
+ TUint connectionCount;
+ iConnectionMonitor.GetConnectionCount(connectionCount, status);
+ User::WaitForRequest(status);
+ TUint connectionId;
+ TUint subConnectionCount;
+ TUint apId;
+ if (status.Int() == KErrNone) {
+ for (TUint i = 1; i <= connectionCount; i++) {
+ iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount,
+ KIAPId, apId, status);
+ User::WaitForRequest(status);
+ if (apId == trueIapId) {
+ TBuf<50>easyWlanNetworkName;
+ iConnectionMonitor.GetStringAttribute(connectionId, 0, KNetworkName,
+ easyWlanNetworkName, status);
+ User::WaitForRequest(status);
+ if (status.Int() != KErrNone)
+ continue;
+
+ const QString ssid = QString::fromUtf16(easyWlanNetworkName.Ptr(),
+ easyWlanNetworkName.Length());
+
+ QNetworkConfigurationPrivatePointer ptr = engine->configurationFromSsid(ssid);
+ if (ptr) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM easyWlanTrueIapId(), found true IAP ID: "
+ << toSymbianConfig(ptr)->numericIdentifier();
+#endif
+ trueIapId = toSymbianConfig(ptr)->numericIdentifier();
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+#endif
+
+RConnection* QNetworkSessionPrivateImpl::nativeSession()
+{
+ return &iConnection;
+}
+
+ConnectionProgressNotifier::ConnectionProgressNotifier(QNetworkSessionPrivateImpl& owner, RConnection& connection)
+ : CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection)
+{
+ CActiveScheduler::Add(this);
+}
+
+ConnectionProgressNotifier::~ConnectionProgressNotifier()
+{
+ Cancel();
+}
+
+void ConnectionProgressNotifier::StartNotifications()
+{
+ if (!IsActive()) {
+ SetActive();
+ iConnection.ProgressNotification(iProgress, iStatus);
+ }
+}
+
+void ConnectionProgressNotifier::StopNotifications()
+{
+ Cancel();
+}
+
+void ConnectionProgressNotifier::DoCancel()
+{
+ iConnection.CancelProgressNotification();
+}
+
+void ConnectionProgressNotifier::RunL()
+{
+ if (iStatus == KErrNone) {
+ SetActive();
+ iConnection.ProgressNotification(iProgress, iStatus);
+ // warning, this object may be deleted in the callback - do nothing after handleSymbianConnectionStatusChange
+ QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError));
+ }
+}
+
+ConnectionStarter::ConnectionStarter(QNetworkSessionPrivateImpl &owner, RConnection &connection)
+ : CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection)
+{
+ CActiveScheduler::Add(this);
+}
+
+ConnectionStarter::~ConnectionStarter()
+{
+ Cancel();
+}
+
+void ConnectionStarter::Start()
+{
+ if (!IsActive()) {
+ iConnection.Start(iStatus);
+ SetActive();
+ }
+}
+
+void ConnectionStarter::Start(TConnPref &pref)
+{
+ if (!IsActive()) {
+ iConnection.Start(pref, iStatus);
+ SetActive();
+ }
+}
+
+void ConnectionStarter::RunL()
+{
+ iOwner.ConnectionStartComplete(iStatus.Int());
+ //note owner deletes on callback
+}
+
+TInt ConnectionStarter::RunError(TInt err)
+{
+ qWarning() << "ConnectionStarter::RunError" << err;
+ return KErrNone;
+}
+
+void ConnectionStarter::DoCancel()
+{
+ iConnection.Close();
+}
+
+QT_END_NAMESPACE
+
+#endif //QT_NO_BEARERMANAGEMENT
+
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h
new file mode 100644
index 0000000000..2dda456acc
--- /dev/null
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.h
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNETWORKSESSION_IMPL_H
+#define QNETWORKSESSION_IMPL_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtNetwork/private/qnetworksession_p.h>
+
+#include <QDateTime>
+
+#include <e32base.h>
+#include <commdbconnpref.h>
+#include <es_sock.h>
+#include <rconnmon.h>
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ #include <comms-infras/cs_mobility_apiext.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class ConnectionProgressNotifier;
+class ConnectionStarter;
+class SymbianEngine;
+
+typedef void (*TOpenCUnSetdefaultifFunction)();
+
+class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ , public MMobilityProtocolResp
+#endif
+{
+ Q_OBJECT
+public:
+ QNetworkSessionPrivateImpl(SymbianEngine *engine);
+ ~QNetworkSessionPrivateImpl();
+
+ //called by QNetworkSession constructor and ensures
+ //that the state is immediately updated (w/o actually opening
+ //a session). Also this function should take care of
+ //notification hooks to discover future state changes.
+ void syncStateWithInterface();
+
+#ifndef QT_NO_NETWORKINTERFACE
+ QNetworkInterface currentInterface() const;
+#endif
+ QVariant sessionProperty(const QString& key) const;
+ void setSessionProperty(const QString& key, const QVariant& value);
+
+ void setALREnabled(bool enabled);
+
+ void open();
+ inline void close() { close(true); }
+ void close(bool allowSignals);
+ void stop();
+ void migrate();
+ void accept();
+ void ignore();
+ void reject();
+
+ QString errorString() const; //must return translated string
+ QNetworkSession::SessionError error() const;
+
+ quint64 bytesWritten() const;
+ quint64 bytesReceived() const;
+ quint64 activeTime() const;
+
+ RConnection* nativeSession();
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+public: // From MMobilityProtocolResp
+ void PreferredCarrierAvailable(TAccessPointInfo aOldAPInfo,
+ TAccessPointInfo aNewAPInfo,
+ TBool aIsUpgrade,
+ TBool aIsSeamless);
+
+ void NewCarrierActive(TAccessPointInfo aNewAPInfo, TBool aIsSeamless);
+
+ void Error(TInt aError);
+#endif
+
+protected: // From CActive
+ void ConnectionStartComplete(TInt statusCode);
+ void DoCancel();
+
+private Q_SLOTS:
+ void configurationStateChanged(quint32 accessPointId, quint32 connMonId,
+ QNetworkSession::State newState);
+ void configurationRemoved(QNetworkConfigurationPrivatePointer config);
+ void configurationAdded(QNetworkConfigurationPrivatePointer config);
+
+private:
+ TUint iapClientCount(TUint aIAPId) const;
+ quint64 transferredData(TUint dataType) const;
+ bool newState(QNetworkSession::State newState, TUint accessPointId = 0);
+ void handleSymbianConnectionStatusChange(TInt aConnectionStatus, TInt aError, TUint accessPointId = 0);
+ QNetworkConfiguration bestConfigFromSNAP(const QNetworkConfiguration& snapConfig) const;
+ QNetworkConfiguration activeConfiguration(TUint32 iapId = 0) const;
+#ifndef QT_NO_NETWORKINTERFACE
+ QNetworkInterface interface(TUint iapId) const;
+#endif
+
+#if defined(SNAP_FUNCTIONALITY_AVAILABLE)
+ bool easyWlanTrueIapId(TUint32 &trueIapId) const;
+#endif
+
+ void closeHandles();
+
+private: // data
+ SymbianEngine *engine;
+
+#ifndef QT_NO_NETWORKINTERFACE
+ mutable QNetworkInterface activeInterface;
+#endif
+
+ QDateTime startTime;
+
+ mutable RSocketServ &iSocketServ; //not owned, shared from QtCore
+ mutable RConnection iConnection;
+ mutable RConnectionMonitor iConnectionMonitor;
+ ConnectionProgressNotifier* ipConnectionNotifier;
+ ConnectionStarter* ipConnectionStarter;
+
+ bool iHandleStateNotificationsFromManager;
+ bool iFirstSync;
+ bool iStoppedByUser;
+ bool iClosedByUser;
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ CActiveCommsMobilityApiExt* iMobility;
+#endif
+
+ QNetworkSession::SessionError iError;
+ TInt iALREnabled;
+ TBool iALRUpgradingConnection;
+ TBool iConnectInBackground;
+
+ QList<QString> iKnownConfigsBeforeConnectionStart;
+
+ TUint32 iOldRoamingIap;
+ TUint32 iNewRoamingIap;
+
+ bool isOpening;
+
+ friend class ConnectionProgressNotifier;
+ friend class ConnectionStarter;
+};
+
+class ConnectionProgressNotifier : public CActive
+{
+public:
+ ConnectionProgressNotifier(QNetworkSessionPrivateImpl &owner, RConnection &connection);
+ ~ConnectionProgressNotifier();
+
+ void StartNotifications();
+ void StopNotifications();
+
+protected: // From CActive
+ void RunL();
+ void DoCancel();
+
+private: // Data
+ QNetworkSessionPrivateImpl &iOwner;
+ RConnection& iConnection;
+ TNifProgressBuf iProgress;
+
+};
+
+class ConnectionStarter : public CActive
+{
+public:
+ ConnectionStarter(QNetworkSessionPrivateImpl &owner, RConnection &connection);
+ ~ConnectionStarter();
+
+ void Start();
+ void Start(TConnPref &pref);
+protected:
+ void RunL();
+ TInt RunError(TInt err);
+ void DoCancel();
+
+private: // Data
+ QNetworkSessionPrivateImpl &iOwner;
+ RConnection& iConnection;
+};
+
+QT_END_NAMESPACE
+
+#endif //QNETWORKSESSION_IMPL_H
+
diff --git a/src/plugins/bearer/symbian/symbian.pri b/src/plugins/bearer/symbian/symbian.pri
new file mode 100644
index 0000000000..8d92f57b68
--- /dev/null
+++ b/src/plugins/bearer/symbian/symbian.pri
@@ -0,0 +1,32 @@
+TARGET = qsymbianbearer
+include(../../qpluginbase.pri)
+
+QT = core network
+
+HEADERS += ../symbianengine.h \
+ ../qnetworksession_impl.h
+
+SOURCES += ../symbianengine.cpp \
+ ../qnetworksession_impl.cpp \
+ ../main.cpp
+
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private
+
+LIBS += -lcommdb \
+ -lcentralrepository \
+ -lesock \
+ -linsock \
+ -lecom \
+ -lefsrv \
+ -lnetmeta
+
+is_using_gnupoc {
+ LIBS += -lconnmon
+} else {
+ LIBS += -lConnMon
+}
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/bearer
+target.path += $$[QT_INSTALL_PLUGINS]/bearer
+INSTALLS += target
diff --git a/src/plugins/bearer/symbian/symbian.pro b/src/plugins/bearer/symbian/symbian.pro
new file mode 100644
index 0000000000..91f8217b2e
--- /dev/null
+++ b/src/plugins/bearer/symbian/symbian.pro
@@ -0,0 +1,8 @@
+TEMPLATE = subdirs
+
+contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) {
+ SUBDIRS += 3_1 3_2
+}
+
+# Symbian3 builds the default plugin for winscw so it is always needed
+SUBDIRS += symbian_3 \ No newline at end of file
diff --git a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro
new file mode 100644
index 0000000000..ef90ad2b73
--- /dev/null
+++ b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro
@@ -0,0 +1,21 @@
+include(../symbian.pri)
+
+symbian {
+ contains(S60_VERSION, 3.1) {
+ is_using_gnupoc {
+ LIBS += -lapengine
+ } else {
+ LIBS += -lAPEngine
+ }
+ } else {
+ DEFINES += SNAP_FUNCTIONALITY_AVAILABLE
+ LIBS += -lcmmanager
+
+ !contains(S60_VERSION, 3.2):!contains(S60_VERSION, 5.0) {
+ DEFINES += OCC_FUNCTIONALITY_AVAILABLE
+ LIBS += -lextendedconnpref
+ }
+ }
+}
+
+TARGET.UID3 = 0x20021319
diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp
new file mode 100644
index 0000000000..f367c26050
--- /dev/null
+++ b/src/plugins/bearer/symbian/symbianengine.cpp
@@ -0,0 +1,1409 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "symbianengine.h"
+#include "qnetworksession_impl.h"
+
+#include <commdb.h>
+#include <cdbcols.h>
+#include <d32dbms.h>
+#include <nifvar.h>
+#include <QTimer>
+#include <QTime> // For randgen seeding
+#include <QtCore> // For randgen seeding
+
+
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+#include <QDebug>
+#endif
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ #include <cmdestination.h>
+ #include <cmconnectionmethod.h>
+ #include <cmconnectionmethoddef.h>
+ #include <cmpluginwlandef.h>
+ #include <cmpluginpacketdatadef.h>
+ #include <cmplugindialcommondefs.h>
+#else
+ #include <ApAccessPointItem.h>
+ #include <ApDataHandler.h>
+ #include <ApUtils.h>
+#endif
+
+#ifndef QT_NO_BEARERMANAGEMENT
+
+QT_BEGIN_NAMESPACE
+
+static const int KUserChoiceIAPId = 0;
+
+SymbianNetworkConfigurationPrivate::SymbianNetworkConfigurationPrivate()
+: numericId(0), connectionId(0)
+{
+}
+
+SymbianNetworkConfigurationPrivate::~SymbianNetworkConfigurationPrivate()
+{
+}
+
+SymbianEngine::SymbianEngine(QObject *parent)
+: QBearerEngine(parent), CActive(CActive::EPriorityHigh), iFirstUpdate(true), ipCommsDB(0),
+ iInitOk(true), iUpdatePending(false), ipAccessPointsAvailabilityScanner(0)
+{
+}
+
+void SymbianEngine::initialize()
+{
+ QMutexLocker locker(&mutex);
+
+ CActiveScheduler::Add(this);
+
+ // Seed the randomgenerator
+ qsrand(QTime(0,0,0).secsTo(QTime::currentTime()) + QCoreApplication::applicationPid());
+
+ TRAPD(error, ipCommsDB = CCommsDatabase::NewL(EDatabaseTypeIAP));
+ if (error != KErrNone) {
+ iInitOk = false;
+ return;
+ }
+
+ TRAP_IGNORE(iConnectionMonitor.ConnectL());
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ TRAP_IGNORE(iConnectionMonitor.SetUintAttribute(EBearerIdAll, 0, KBearerGroupThreshold, 1));
+#endif
+ TRAP_IGNORE(iConnectionMonitor.NotifyEventL(*this));
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ TRAP(error, iCmManager.OpenL());
+ if (error != KErrNone) {
+ iInitOk = false;
+ return;
+ }
+#endif
+
+ SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
+ cpPriv->name = "UserChoice";
+ cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
+ cpPriv->state = QNetworkConfiguration::Discovered;
+ cpPriv->isValid = true;
+ cpPriv->id = QString::number(qHash(KUserChoiceIAPId));
+ cpPriv->numericId = KUserChoiceIAPId;
+ cpPriv->connectionId = 0;
+ cpPriv->type = QNetworkConfiguration::UserChoice;
+ cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
+ cpPriv->roamingSupported = false;
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ userChoiceConfigurations.insert(ptr->id, ptr);
+
+ updateConfigurations();
+ updateStatesToSnaps();
+ updateAvailableAccessPoints(); // On first time updates (without WLAN scans)
+ // Start monitoring IAP and/or SNAP changes in Symbian CommsDB
+ startCommsDatabaseNotifications();
+}
+
+SymbianEngine::~SymbianEngine()
+{
+ Cancel();
+
+ //The scanner may be using the connection monitor so it needs to be
+ //deleted first while the handle is still valid.
+ delete ipAccessPointsAvailabilityScanner;
+
+ iConnectionMonitor.CancelNotifications();
+ iConnectionMonitor.Close();
+
+ // CCommsDatabase destructor and RCmManager.Close() use cleanup stack. Since QNetworkConfigurationManager
+ // is a global static, but the time we are here, E32Main() has been exited already and
+ // the thread's default cleanup stack has been deleted. Without this line, a
+ // 'E32USER-CBase 69' -panic will occur.
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ iCmManager.Close();
+#endif
+ delete ipCommsDB;
+ delete cleanup;
+}
+
+void SymbianEngine::delayedConfigurationUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ if (iUpdatePending) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug("QNCM delayed configuration update (ECommit or ERecover occurred).");
+#endif
+ TRAPD(error, updateConfigurationsL());
+ if (error == KErrNone) {
+ updateStatesToSnaps();
+ }
+ iUpdatePending = false;
+ // Start monitoring again.
+ if (!IsActive()) {
+ SetActive();
+ // Start waiting for new notification
+ ipCommsDB->RequestNotification(iStatus);
+ }
+ }
+}
+
+bool SymbianEngine::hasIdentifier(const QString &id)
+{
+ QMutexLocker locker(&mutex);
+
+ return accessPointConfigurations.contains(id) ||
+ snapConfigurations.contains(id) ||
+ userChoiceConfigurations.contains(id);
+}
+
+QNetworkConfigurationManager::Capabilities SymbianEngine::capabilities() const
+{
+ QNetworkConfigurationManager::Capabilities capFlags;
+
+ capFlags = QNetworkConfigurationManager::CanStartAndStopInterfaces |
+ QNetworkConfigurationManager::DirectConnectionRouting |
+ QNetworkConfigurationManager::SystemSessionSupport |
+ QNetworkConfigurationManager::DataStatistics |
+ QNetworkConfigurationManager::NetworkSessionRequired;
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ capFlags |= QNetworkConfigurationManager::ApplicationLevelRoaming |
+ QNetworkConfigurationManager::ForcedRoaming;
+#endif
+
+ return capFlags;
+}
+
+QNetworkSessionPrivate *SymbianEngine::createSessionBackend()
+{
+ return new QNetworkSessionPrivateImpl(this);
+}
+
+void SymbianEngine::requestUpdate()
+{
+ QMutexLocker locker(&mutex);
+
+ if (!iInitOk || iUpdateGoingOn) {
+ return;
+ }
+ iUpdateGoingOn = true;
+
+ stopCommsDatabaseNotifications();
+ updateConfigurations(); // Synchronous call
+ updateAvailableAccessPoints(); // Asynchronous call
+}
+
+void SymbianEngine::updateConfigurations()
+{
+ if (!iInitOk)
+ return;
+
+ TRAP_IGNORE(updateConfigurationsL());
+}
+
+void SymbianEngine::updateConfigurationsL()
+{
+ QList<QString> knownConfigs = accessPointConfigurations.keys();
+ QList<QString> knownSnapConfigs = snapConfigurations.keys();
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ // S60 version is >= Series60 3rd Edition Feature Pack 2
+ TInt error = KErrNone;
+
+ // Loop through all IAPs
+ RArray<TUint32> connectionMethods; // IAPs
+ CleanupClosePushL(connectionMethods);
+ iCmManager.ConnectionMethodL(connectionMethods);
+ for(int i = 0; i < connectionMethods.Count(); i++) {
+ RCmConnectionMethod connectionMethod = iCmManager.ConnectionMethodL(connectionMethods[i]);
+ CleanupClosePushL(connectionMethod);
+ TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
+ if (accessPointConfigurations.contains(ident)) {
+ knownConfigs.removeOne(ident);
+ } else {
+ SymbianNetworkConfigurationPrivate* cpPriv = NULL;
+ TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
+ if (error == KErrNone) {
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(ptr->id, ptr);
+ if (!iFirstUpdate) {
+ // Emit configuration added. Connected slots may throw execptions
+ // which propagate here --> must be converted to leaves (standard
+ // std::exception would cause any TRAP trapping this function to terminate
+ // program).
+ QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
+ updateStatesToSnaps();
+ mutex.unlock();
+ QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
+ mutex.lock();
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(&connectionMethod);
+ }
+ CleanupStack::PopAndDestroy(&connectionMethods);
+
+ // Loop through all SNAPs
+ RArray<TUint32> destinations;
+ CleanupClosePushL(destinations);
+ iCmManager.AllDestinationsL(destinations);
+ for(int i = 0; i < destinations.Count(); i++) {
+ RCmDestination destination;
+
+ // Some destinatsions require ReadDeviceData -capability (MMS/WAP)
+ // The below function will leave in these cases. Don't. Proceed to
+ // next destination (if any).
+ TRAPD(error, destination = iCmManager.DestinationL(destinations[i]));
+ if (error == KErrPermissionDenied) {
+ continue;
+ } else {
+ User::LeaveIfError(error);
+ }
+
+ CleanupClosePushL(destination);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX +
+ QString::number(qHash(destination.Id()));
+ if (snapConfigurations.contains(ident)) {
+ knownSnapConfigs.removeOne(ident);
+ } else {
+ SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
+
+ HBufC *pName = destination.NameLC();
+ QT_TRYCATCH_LEAVING(cpPriv->name = QString::fromUtf16(pName->Ptr(),pName->Length()));
+ CleanupStack::PopAndDestroy(pName);
+ pName = NULL;
+
+ cpPriv->isValid = true;
+ cpPriv->id = ident;
+ cpPriv->numericId = destination.Id();
+ cpPriv->connectionId = 0;
+ cpPriv->state = QNetworkConfiguration::Defined;
+ cpPriv->type = QNetworkConfiguration::ServiceNetwork;
+ cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
+ cpPriv->roamingSupported = false;
+
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ snapConfigurations.insert(ident, ptr);
+ if (!iFirstUpdate) {
+ QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
+ updateStatesToSnaps();
+ mutex.unlock();
+ QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
+ mutex.lock();
+ }
+ }
+
+ // Loop through all connection methods in this SNAP
+ QMap<unsigned int, QNetworkConfigurationPrivatePointer> connections;
+ for (int j=0; j < destination.ConnectionMethodCount(); j++) {
+ RCmConnectionMethod connectionMethod = destination.ConnectionMethodL(j);
+ CleanupClosePushL(connectionMethod);
+
+ TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
+ QString iface = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
+ // Check that IAP can be found from accessPointConfigurations list
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
+ if (!ptr) {
+ SymbianNetworkConfigurationPrivate *cpPriv = NULL;
+ TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
+ if (error == KErrNone) {
+ ptr = QNetworkConfigurationPrivatePointer(cpPriv);
+ accessPointConfigurations.insert(ptr->id, ptr);
+
+ if (!iFirstUpdate) {
+ QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
+ updateStatesToSnaps();
+ mutex.unlock();
+ QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
+ mutex.lock();
+ }
+ }
+ } else {
+ knownConfigs.removeOne(iface);
+ }
+
+ if (ptr) {
+ unsigned int priority;
+ TRAPD(error, priority = destination.PriorityL(connectionMethod));
+ if (!error)
+ connections.insert(priority, ptr);
+ }
+
+ CleanupStack::PopAndDestroy(&connectionMethod);
+ }
+
+ QNetworkConfigurationPrivatePointer privSNAP = snapConfigurations.value(ident);
+ QMutexLocker snapConfigLocker(&privSNAP->mutex);
+
+ if (privSNAP->serviceNetworkMembers != connections) {
+ privSNAP->serviceNetworkMembers = connections;
+
+ // Roaming is supported only if SNAP contains more than one IAP
+ privSNAP->roamingSupported = privSNAP->serviceNetworkMembers.count() > 1;
+
+ snapConfigLocker.unlock();
+
+ updateStatesToSnaps();
+
+ mutex.unlock();
+ QT_TRYCATCH_LEAVING(emit configurationChanged(privSNAP));
+ mutex.lock();
+ }
+
+ CleanupStack::PopAndDestroy(&destination);
+ }
+ CleanupStack::PopAndDestroy(&destinations);
+#else
+ // S60 version is < Series60 3rd Edition Feature Pack 2
+ CCommsDbTableView* pDbTView = ipCommsDB->OpenTableLC(TPtrC(IAP));
+
+ // Loop through all IAPs
+ TUint32 apId = 0;
+ TInt retVal = pDbTView->GotoFirstRecord();
+ while (retVal == KErrNone) {
+ pDbTView->ReadUintL(TPtrC(COMMDB_ID), apId);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
+ if (accessPointConfigurations.contains(ident)) {
+ knownConfigs.removeOne(ident);
+ } else {
+ SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
+ if (readNetworkConfigurationValuesFromCommsDb(apId, cpPriv)) {
+ QNetworkConfigurationPrivatePointer ptr(cpPriv);
+ accessPointConfigurations.insert(ident, ptr);
+ if (!iFirstUpdate) {
+ QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
+ updateStatesToSnaps();
+ mutex.unlock();
+ QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
+ mutex.lock();
+ }
+ } else {
+ delete cpPriv;
+ }
+ }
+ retVal = pDbTView->GotoNextRecord();
+ }
+ CleanupStack::PopAndDestroy(pDbTView);
+#endif
+
+ QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
+
+ foreach (const QString &oldIface, knownConfigs) {
+ //remove non existing IAP
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(oldIface);
+
+ mutex.unlock();
+ emit configurationRemoved(ptr);
+ QT_TRYCATCH_LEAVING(emit configurationRemoved(ptr));
+ mutex.lock();
+
+ // Remove non existing IAP from SNAPs
+ foreach (const QString &iface, snapConfigurations.keys()) {
+ QNetworkConfigurationPrivatePointer ptr2 = snapConfigurations.value(iface);
+ // => Check if one of the IAPs of the SNAP is active
+ QMutexLocker snapConfigLocker(&ptr2->mutex);
+ QMutableMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(ptr2->serviceNetworkMembers);
+ while (i.hasNext()) {
+ i.next();
+
+ if (toSymbianConfig(i.value())->numericIdentifier() ==
+ toSymbianConfig(ptr)->numericIdentifier()) {
+ i.remove();
+ break;
+ }
+ }
+ }
+ }
+
+ foreach (const QString &oldIface, knownSnapConfigs) {
+ //remove non existing SNAPs
+ QNetworkConfigurationPrivatePointer ptr = snapConfigurations.take(oldIface);
+
+ mutex.unlock();
+ emit configurationRemoved(ptr);
+ QT_TRYCATCH_LEAVING(emit configurationRemoved(ptr));
+ mutex.lock();
+ }
+
+ // find default configuration.
+ stopCommsDatabaseNotifications();
+ TRAP_IGNORE(defaultConfig = defaultConfigurationL());
+ startCommsDatabaseNotifications();
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ updateStatesToSnaps();
+#endif
+}
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+SymbianNetworkConfigurationPrivate *SymbianEngine::configFromConnectionMethodL(
+ RCmConnectionMethod& connectionMethod)
+{
+ SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
+ TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
+
+ HBufC *pName = connectionMethod.GetStringAttributeL(CMManager::ECmName);
+ CleanupStack::PushL(pName);
+ QT_TRYCATCH_LEAVING(cpPriv->name = QString::fromUtf16(pName->Ptr(),pName->Length()));
+ CleanupStack::PopAndDestroy(pName);
+ pName = NULL;
+
+ TUint32 bearerId = connectionMethod.GetIntAttributeL(CMManager::ECmCommsDBBearerType);
+ switch (bearerId) {
+ case KCommDbBearerCSD:
+ cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case KCommDbBearerWcdma:
+ cpPriv->bearerType = QNetworkConfiguration::BearerWCDMA;
+ break;
+ case KCommDbBearerLAN:
+ cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
+ break;
+ case KCommDbBearerVirtual:
+ cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
+ break;
+ case KCommDbBearerPAN:
+ cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
+ break;
+ case KCommDbBearerWLAN:
+ cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
+ break;
+ default:
+ cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
+ break;
+ }
+
+ TInt error = KErrNone;
+ TUint32 bearerType = connectionMethod.GetIntAttributeL(CMManager::ECmBearerType);
+ switch (bearerType) {
+ case KUidPacketDataBearerType:
+ // "Packet data" Bearer => Mapping is done using "Access point name"
+ TRAP(error, pName = connectionMethod.GetStringAttributeL(CMManager::EPacketDataAPName));
+ break;
+ case KUidWlanBearerType:
+ // "Wireless LAN" Bearer => Mapping is done using "WLAN network name" = SSID
+ TRAP(error, pName = connectionMethod.GetStringAttributeL(CMManager::EWlanSSID));
+ break;
+ }
+ if (!pName) {
+ // "Data call" Bearer or "High Speed (GSM)" Bearer => Mapping is done using "Dial-up number"
+ TRAP(error, pName = connectionMethod.GetStringAttributeL(CMManager::EDialDefaultTelNum));
+ }
+
+ if (error == KErrNone && pName) {
+ CleanupStack::PushL(pName);
+ QT_TRYCATCH_LEAVING(cpPriv->mappingName = QString::fromUtf16(pName->Ptr(),pName->Length()));
+ CleanupStack::PopAndDestroy(pName);
+ pName = NULL;
+ }
+
+ cpPriv->state = QNetworkConfiguration::Defined;
+ TBool isConnected = connectionMethod.GetBoolAttributeL(CMManager::ECmConnected);
+ if (isConnected) {
+ cpPriv->state = QNetworkConfiguration::Active;
+ }
+
+ cpPriv->isValid = true;
+ cpPriv->id = ident;
+ cpPriv->numericId = iapId;
+ cpPriv->connectionId = 0;
+ cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
+ cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
+ cpPriv->roamingSupported = false;
+ return cpPriv;
+}
+#else
+bool SymbianEngine::readNetworkConfigurationValuesFromCommsDb(
+ TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration)
+{
+ TRAPD(error, readNetworkConfigurationValuesFromCommsDbL(aApId,apNetworkConfiguration));
+ if (error != KErrNone) {
+ return false;
+ }
+ return true;
+}
+
+void SymbianEngine::readNetworkConfigurationValuesFromCommsDbL(
+ TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration)
+{
+ CApDataHandler* pDataHandler = CApDataHandler::NewLC(*ipCommsDB);
+ CApAccessPointItem* pAPItem = CApAccessPointItem::NewLC();
+ TBuf<KCommsDbSvrMaxColumnNameLength> name;
+
+ CApUtils* pApUtils = CApUtils::NewLC(*ipCommsDB);
+ TUint32 apId = pApUtils->WapIdFromIapIdL(aApId);
+
+ pDataHandler->AccessPointDataL(apId,*pAPItem);
+ pAPItem->ReadTextL(EApIapName, name);
+ if (name.Compare(_L("Easy WLAN")) == 0) {
+ // "Easy WLAN" won't be accepted to the Configurations list
+ User::Leave(KErrNotFound);
+ }
+
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(aApId));
+
+ QT_TRYCATCH_LEAVING(apNetworkConfiguration->name = QString::fromUtf16(name.Ptr(),name.Length()));
+ apNetworkConfiguration->isValid = true;
+ apNetworkConfiguration->id = ident;
+ apNetworkConfiguration->numericId = aApId;
+ apNetworkConfiguration->connectionId = 0;
+ apNetworkConfiguration->state = (QNetworkConfiguration::Defined);
+ apNetworkConfiguration->type = QNetworkConfiguration::InternetAccessPoint;
+ apNetworkConfiguration->purpose = QNetworkConfiguration::UnknownPurpose;
+ apNetworkConfiguration->roamingSupported = false;
+ switch (pAPItem->BearerTypeL()) {
+ case EApBearerTypeCSD:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case EApBearerTypeGPRS:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case EApBearerTypeHSCSD:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerHSPA;
+ break;
+ case EApBearerTypeCDMA:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerCDMA2000;
+ break;
+ case EApBearerTypeWLAN:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerWLAN;
+ break;
+ case EApBearerTypeLAN:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerEthernet;
+ break;
+ case EApBearerTypeLANModem:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerEthernet;
+ break;
+ default:
+ apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerUnknown;
+ break;
+ }
+
+ CleanupStack::PopAndDestroy(pApUtils);
+ CleanupStack::PopAndDestroy(pAPItem);
+ CleanupStack::PopAndDestroy(pDataHandler);
+}
+#endif
+
+QNetworkConfigurationPrivatePointer SymbianEngine::defaultConfiguration()
+{
+ QMutexLocker locker(&mutex);
+
+ return defaultConfig;
+}
+
+QStringList SymbianEngine::accessPointConfigurationIdentifiers()
+{
+ QMutexLocker locker(&mutex);
+
+ return accessPointConfigurations.keys();
+}
+
+QNetworkConfigurationPrivatePointer SymbianEngine::defaultConfigurationL()
+{
+ QNetworkConfigurationPrivatePointer ptr;
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ // Check Default Connection (SNAP or IAP)
+ TCmDefConnValue defaultConnectionValue;
+ iCmManager.ReadDefConnL(defaultConnectionValue);
+ if (defaultConnectionValue.iType == ECmDefConnDestination) {
+ QString iface = QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX +
+ QString::number(qHash(defaultConnectionValue.iId));
+ ptr = snapConfigurations.value(iface);
+ } else if (defaultConnectionValue.iType == ECmDefConnConnectionMethod) {
+ QString iface = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
+ QString::number(qHash(defaultConnectionValue.iId));
+ ptr = accessPointConfigurations.value(iface);
+ }
+#endif
+
+ if (ptr) {
+ QMutexLocker configLocker(&ptr->mutex);
+ if (ptr->isValid)
+ return ptr;
+ }
+
+ QString iface = QString::number(qHash(KUserChoiceIAPId));
+ return userChoiceConfigurations.value(iface);
+}
+
+void SymbianEngine::updateActiveAccessPoints()
+{
+ bool online = false;
+ QList<QString> inactiveConfigs = accessPointConfigurations.keys();
+
+ TRequestStatus status;
+ TUint connectionCount;
+ iConnectionMonitor.GetConnectionCount(connectionCount, status);
+ User::WaitForRequest(status);
+
+ // Go through all connections and set state of related IAPs to Active.
+ // Status needs to be checked carefully, because ConnMon lists also e.g.
+ // WLAN connections that are being currently tried --> we don't want to
+ // state these as active.
+ TUint connectionId;
+ TUint subConnectionCount;
+ TUint apId;
+ TInt connectionStatus;
+ if (status.Int() == KErrNone) {
+ for (TUint i = 1; i <= connectionCount; i++) {
+ iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
+ User::WaitForRequest(status);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (!ptr) {
+ // If IAP was not found, check if the update was about EasyWLAN
+ ptr = configurationFromEasyWlan(apId, connectionId);
+ // Change the ident correspondingly
+ if (ptr) {
+ ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
+ QString::number(qHash(toSymbianConfig(ptr)->numericIdentifier()));
+ }
+ }
+#endif
+ if (ptr) {
+ iConnectionMonitor.GetIntAttribute(connectionId, subConnectionCount, KConnectionStatus, connectionStatus, status);
+ User::WaitForRequest(status);
+
+ if (connectionStatus == KLinkLayerOpen) {
+ online = true;
+ inactiveConfigs.removeOne(ident);
+
+ ptr->mutex.lock();
+ toSymbianConfig(ptr)->connectionId = connectionId;
+ ptr->mutex.unlock();
+
+ // Configuration is Active
+ changeConfigurationStateTo(ptr, QNetworkConfiguration::Active);
+ }
+ }
+ }
+ }
+
+ // Make sure that state of rest of the IAPs won't be Active
+ foreach (const QString &iface, inactiveConfigs) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
+ if (ptr) {
+ // Configuration is either Defined or Discovered
+ changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered);
+ }
+ }
+
+ if (iOnline != online) {
+ iOnline = online;
+ mutex.unlock();
+ emit this->onlineStateChanged(online);
+ mutex.lock();
+ }
+}
+
+void SymbianEngine::updateAvailableAccessPoints()
+{
+ if (!ipAccessPointsAvailabilityScanner) {
+ ipAccessPointsAvailabilityScanner = new AccessPointsAvailabilityScanner(*this, iConnectionMonitor);
+ }
+ if (ipAccessPointsAvailabilityScanner) {
+ // Scanning may take a while because WLAN scanning will be done (if device supports WLAN).
+ ipAccessPointsAvailabilityScanner->StartScanning();
+ }
+}
+
+void SymbianEngine::accessPointScanningReady(TBool scanSuccessful, TConnMonIapInfo iapInfo)
+{
+ iUpdateGoingOn = false;
+ if (scanSuccessful) {
+ QList<QString> unavailableConfigs = accessPointConfigurations.keys();
+
+ // Set state of returned IAPs to Discovered
+ // if state is not already Active
+ for(TUint i=0; i<iapInfo.iCount; i++) {
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
+ QString::number(qHash(iapInfo.iIap[i].iIapId));
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+ if (ptr) {
+ unavailableConfigs.removeOne(ident);
+
+ QMutexLocker configLocker(&ptr->mutex);
+ if (ptr->state < QNetworkConfiguration::Active) {
+ // Configuration is either Discovered or Active
+ changeConfigurationStateAtMinTo(ptr, QNetworkConfiguration::Discovered);
+ }
+ }
+ }
+
+ // Make sure that state of rest of the IAPs won't be Active
+ foreach (const QString &iface, unavailableConfigs) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
+ if (ptr) {
+ // Configuration is Defined
+ changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered);
+ }
+ }
+ }
+
+ updateStatesToSnaps();
+
+ if (!iFirstUpdate) {
+ startCommsDatabaseNotifications();
+ mutex.unlock();
+ emit updateCompleted();
+ mutex.lock();
+ } else {
+ iFirstUpdate = false;
+ if (iScanInQueue) {
+ iScanInQueue = EFalse;
+ updateAvailableAccessPoints();
+ }
+ }
+}
+
+void SymbianEngine::updateStatesToSnaps()
+{
+ // Go through SNAPs and set correct state to SNAPs
+ foreach (const QString &iface, snapConfigurations.keys()) {
+ bool discovered = false;
+ bool active = false;
+ QNetworkConfigurationPrivatePointer ptr = snapConfigurations.value(iface);
+
+ QMutexLocker snapConfigLocker(&ptr->mutex);
+
+ // => Check if one of the IAPs of the SNAP is discovered or active
+ // => If one of IAPs is active, also SNAP is active
+ // => If one of IAPs is discovered but none of the IAPs is active, SNAP is discovered
+ QMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(ptr->serviceNetworkMembers);
+ while (i.hasNext()) {
+ i.next();
+
+ const QNetworkConfigurationPrivatePointer child = i.value();
+
+ QMutexLocker configLocker(&child->mutex);
+
+ if ((child->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
+ active = true;
+ break;
+ } else if ((child->state & QNetworkConfiguration::Discovered) ==
+ QNetworkConfiguration::Discovered) {
+ discovered = true;
+ }
+ }
+ snapConfigLocker.unlock();
+ if (active) {
+ changeConfigurationStateTo(ptr, QNetworkConfiguration::Active);
+ } else if (discovered) {
+ changeConfigurationStateTo(ptr, QNetworkConfiguration::Discovered);
+ } else {
+ changeConfigurationStateTo(ptr, QNetworkConfiguration::Defined);
+ }
+ }
+}
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+void SymbianEngine::updateMobileBearerToConfigs(TConnMonBearerInfo bearerInfo)
+{
+ QHash<QString, QNetworkConfigurationPrivatePointer>::const_iterator i =
+ accessPointConfigurations.constBegin();
+ while (i != accessPointConfigurations.constEnd()) {
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+
+ QMutexLocker locker(&ptr->mutex);
+
+ SymbianNetworkConfigurationPrivate *p = toSymbianConfig(ptr);
+
+ if (p->bearerType >= QNetworkConfiguration::Bearer2G &&
+ p->bearerType <= QNetworkConfiguration::BearerHSPA) {
+ switch (bearerInfo) {
+ case EBearerInfoCSD:
+ p->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case EBearerInfoWCDMA:
+ p->bearerType = QNetworkConfiguration::BearerWCDMA;
+ break;
+ case EBearerInfoCDMA2000:
+ p->bearerType = QNetworkConfiguration::BearerCDMA2000;
+ break;
+ case EBearerInfoGPRS:
+ p->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case EBearerInfoHSCSD:
+ p->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case EBearerInfoEdgeGPRS:
+ p->bearerType = QNetworkConfiguration::Bearer2G;
+ break;
+ case EBearerInfoWcdmaCSD:
+ p->bearerType = QNetworkConfiguration::BearerWCDMA;
+ break;
+ case EBearerInfoHSDPA:
+ p->bearerType = QNetworkConfiguration::BearerHSPA;
+ break;
+ case EBearerInfoHSUPA:
+ p->bearerType = QNetworkConfiguration::BearerHSPA;
+ break;
+ case EBearerInfoHSxPA:
+ p->bearerType = QNetworkConfiguration::BearerHSPA;
+ break;
+ }
+ }
+
+ ++i;
+ }
+}
+#endif
+
+bool SymbianEngine::changeConfigurationStateTo(QNetworkConfigurationPrivatePointer ptr,
+ QNetworkConfiguration::StateFlags newState)
+{
+ ptr->mutex.lock();
+ if (newState != ptr->state) {
+ ptr->state = newState;
+ ptr->mutex.unlock();
+
+ mutex.unlock();
+ emit configurationChanged(ptr);
+ mutex.lock();
+
+ return true;
+ } else {
+ ptr->mutex.unlock();
+ }
+ return false;
+}
+
+/* changeConfigurationStateAtMinTo function does not overwrite possible better
+ * state (e.g. Discovered state does not overwrite Active state) but
+ * makes sure that state is at minimum given state.
+*/
+bool SymbianEngine::changeConfigurationStateAtMinTo(QNetworkConfigurationPrivatePointer ptr,
+ QNetworkConfiguration::StateFlags newState)
+{
+ ptr->mutex.lock();
+ if ((newState | ptr->state) != ptr->state) {
+ ptr->state = (ptr->state | newState);
+ ptr->mutex.unlock();
+
+ mutex.unlock();
+ emit configurationChanged(ptr);
+ mutex.lock();
+
+ return true;
+ } else {
+ ptr->mutex.unlock();
+ }
+ return false;
+}
+
+/* changeConfigurationStateAtMaxTo function overwrites possible better
+ * state (e.g. Discovered state overwrites Active state) and
+ * makes sure that state is at maximum given state (e.g. Discovered state
+ * does not overwrite Defined state).
+*/
+bool SymbianEngine::changeConfigurationStateAtMaxTo(QNetworkConfigurationPrivatePointer ptr,
+ QNetworkConfiguration::StateFlags newState)
+{
+ ptr->mutex.lock();
+ if ((newState & ptr->state) != ptr->state) {
+ ptr->state = (newState & ptr->state);
+ ptr->mutex.unlock();
+
+ mutex.unlock();
+ emit configurationChanged(ptr);
+ mutex.lock();
+
+ return true;
+ } else {
+ ptr->mutex.unlock();
+ }
+ return false;
+}
+
+void SymbianEngine::startCommsDatabaseNotifications()
+{
+ if (!iWaitingCommsDatabaseNotifications) {
+ iWaitingCommsDatabaseNotifications = ETrue;
+ if (!IsActive()) {
+ SetActive();
+ // Start waiting for new notification
+ ipCommsDB->RequestNotification(iStatus);
+ }
+ }
+}
+
+void SymbianEngine::stopCommsDatabaseNotifications()
+{
+ if (iWaitingCommsDatabaseNotifications) {
+ iWaitingCommsDatabaseNotifications = EFalse;
+ Cancel();
+ }
+}
+
+void SymbianEngine::RunL()
+{
+ QMutexLocker locker(&mutex);
+
+ if (iStatus != KErrCancel) {
+ // By default, start relistening notifications. Stop only if interesting event occurred.
+ iWaitingCommsDatabaseNotifications = true;
+ RDbNotifier::TEvent event = STATIC_CAST(RDbNotifier::TEvent, iStatus.Int());
+ switch (event) {
+ case RDbNotifier::ECommit: /** A transaction has been committed. */
+ case RDbNotifier::ERecover: /** The database has been recovered */
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug("QNCM CommsDB event (of type RDbNotifier::TEvent) received: %d", iStatus.Int());
+#endif
+ // Mark that there is update pending. No need to ask more events,
+ // as we know we will be updating anyway when the timer expires.
+ if (!iUpdatePending) {
+ iUpdatePending = true;
+ iWaitingCommsDatabaseNotifications = false;
+ // Update after random time, so that many processes won't
+ // start updating simultaneously
+ updateConfigurationsAfterRandomTime();
+ }
+ break;
+ default:
+ // Do nothing
+ break;
+ }
+ }
+
+ if (iWaitingCommsDatabaseNotifications) {
+ if (!IsActive()) {
+ SetActive();
+ // Start waiting for new notification
+ ipCommsDB->RequestNotification(iStatus);
+ }
+ }
+}
+
+void SymbianEngine::DoCancel()
+{
+ QMutexLocker locker(&mutex);
+
+ ipCommsDB->CancelRequestNotification();
+}
+
+void SymbianEngine::EventL(const CConnMonEventBase& aEvent)
+{
+ QMutexLocker locker(&mutex);
+
+ switch (aEvent.EventType()) {
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ case EConnMonBearerInfoChange:
+ {
+ CConnMonBearerInfoChange* realEvent;
+ realEvent = (CConnMonBearerInfoChange*) &aEvent;
+ TUint connectionId = realEvent->ConnectionId();
+ if (connectionId == EBearerIdAll) {
+ //Network level event
+ TConnMonBearerInfo bearerInfo = (TConnMonBearerInfo)realEvent->BearerInfo();
+ updateMobileBearerToConfigs(bearerInfo);
+ }
+ break;
+ }
+#endif
+ case EConnMonConnectionStatusChange:
+ {
+ CConnMonConnectionStatusChange* realEvent;
+ realEvent = (CConnMonConnectionStatusChange*) &aEvent;
+ TInt connectionStatus = realEvent->ConnectionStatus();
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM Connection status : " << QString::number(connectionStatus) << " , connection monitor Id : " << realEvent->ConnectionId();
+#endif
+ if (connectionStatus == KConfigDaemonStartingRegistration) {
+ TUint connectionId = realEvent->ConnectionId();
+ TUint subConnectionCount = 0;
+ TUint apId;
+ TRequestStatus status;
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
+ User::WaitForRequest(status);
+
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (!ptr) {
+ // Check if status was regarding EasyWLAN
+ ptr = configurationFromEasyWlan(apId, connectionId);
+ }
+#endif
+ if (ptr) {
+ ptr->mutex.lock();
+ toSymbianConfig(ptr)->connectionId = connectionId;
+ ptr->mutex.unlock();
+ QT_TRYCATCH_LEAVING(
+ emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
+ connectionId, QNetworkSession::Connecting)
+ );
+ }
+ } else if (connectionStatus == KLinkLayerOpen) {
+ // Connection has been successfully opened
+ TUint connectionId = realEvent->ConnectionId();
+ TUint subConnectionCount = 0;
+ TUint apId;
+ TRequestStatus status;
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
+ User::WaitForRequest(status);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (!ptr) {
+ // Check for EasyWLAN
+ ptr = configurationFromEasyWlan(apId, connectionId);
+ }
+#endif
+ if (ptr) {
+ ptr->mutex.lock();
+ toSymbianConfig(ptr)->connectionId = connectionId;
+ ptr->mutex.unlock();
+
+ // Configuration is Active
+ QT_TRYCATCH_LEAVING(
+ if (changeConfigurationStateTo(ptr, QNetworkConfiguration::Active)) {
+ updateStatesToSnaps();
+ }
+ emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
+ connectionId, QNetworkSession::Connected);
+
+ if (!iOnline) {
+ iOnline = true;
+ emit this->onlineStateChanged(iOnline);
+ }
+ );
+ }
+ } else if (connectionStatus == KConfigDaemonStartingDeregistration) {
+ TUint connectionId = realEvent->ConnectionId();
+ QNetworkConfigurationPrivatePointer ptr = dataByConnectionId(connectionId);
+ if (ptr) {
+ QT_TRYCATCH_LEAVING(
+ emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
+ connectionId, QNetworkSession::Closing)
+ );
+ }
+ } else if (connectionStatus == KLinkLayerClosed ||
+ connectionStatus == KConnectionClosed) {
+ // Connection has been closed. Which of the above events is reported, depends on the Symbian
+ // platform.
+ TUint connectionId = realEvent->ConnectionId();
+ QNetworkConfigurationPrivatePointer ptr = dataByConnectionId(connectionId);
+ if (ptr) {
+ // Configuration is either Defined or Discovered
+ QT_TRYCATCH_LEAVING(
+ if (changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered)) {
+ updateStatesToSnaps();
+ }
+ emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
+ connectionId, QNetworkSession::Disconnected);
+ );
+ }
+
+ bool online = false;
+ foreach (const QString &iface, accessPointConfigurations.keys()) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
+ QMutexLocker configLocker(&ptr->mutex);
+ if (ptr->state == QNetworkConfiguration::Active) {
+ online = true;
+ break;
+ }
+ }
+ if (iOnline != online) {
+ iOnline = online;
+ QT_TRYCATCH_LEAVING(emit this->onlineStateChanged(iOnline));
+ }
+ }
+ }
+ break;
+
+ case EConnMonIapAvailabilityChange:
+ {
+ CConnMonIapAvailabilityChange* realEvent;
+ realEvent = (CConnMonIapAvailabilityChange*) &aEvent;
+ TConnMonIapInfo iaps = realEvent->IapAvailability();
+ QList<QString> unDiscoveredConfigs = accessPointConfigurations.keys();
+ for ( TUint i = 0; i < iaps.Count(); i++ ) {
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
+ QString::number(qHash(iaps.iIap[i].iIapId));
+
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+ if (ptr) {
+ // Configuration is either Discovered or Active
+ QT_TRYCATCH_LEAVING(changeConfigurationStateAtMinTo(ptr, QNetworkConfiguration::Discovered));
+ unDiscoveredConfigs.removeOne(ident);
+ }
+ }
+ foreach (const QString &iface, unDiscoveredConfigs) {
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
+ if (ptr) {
+ // Configuration is Defined
+ QT_TRYCATCH_LEAVING(changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Defined));
+ }
+ }
+ // Something has in IAPs, update states to SNAPs
+ updateStatesToSnaps();
+ }
+ break;
+
+ case EConnMonCreateConnection:
+ {
+ // This event is caught to keep connection monitor IDs up-to-date.
+ CConnMonCreateConnection* realEvent;
+ realEvent = (CConnMonCreateConnection*) &aEvent;
+ TUint subConnectionCount = 0;
+ TUint apId;
+ TUint connectionId = realEvent->ConnectionId();
+ TRequestStatus status;
+ iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
+ User::WaitForRequest(status);
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ if (!ptr) {
+ // If IAP was not found, check if the update was about EasyWLAN
+ ptr = configurationFromEasyWlan(apId, connectionId);
+ }
+#endif
+ if (ptr) {
+ QMutexLocker configLocker(&ptr->mutex);
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM updating connection monitor ID : from, to, whose: " << toSymbianConfig(ptr)->connectionId << connectionId << ptr->name;
+#endif
+ toSymbianConfig(ptr)->connectionId = connectionId;
+ }
+ }
+ break;
+ default:
+ // For unrecognized events
+ break;
+ }
+}
+
+/*
+ Returns the network configuration that matches the given SSID.
+*/
+QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromSsid(const QString &ssid)
+{
+ QMutexLocker locker(&mutex);
+
+ // Browser through all items and check their name for match
+ QHash<QString, QNetworkConfigurationPrivatePointer>::ConstIterator i =
+ accessPointConfigurations.constBegin();
+ while (i != accessPointConfigurations.constEnd()) {
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+
+ QMutexLocker configLocker(&ptr->mutex);
+
+ if (ptr->name == ssid) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM EasyWlan uses real SSID: " << ssid;
+#endif
+ return ptr;
+ }
+ ++i;
+ }
+
+ return QNetworkConfigurationPrivatePointer();
+}
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+// Tries to derive configuration from EasyWLAN.
+// First checks if the interface brought up was EasyWLAN, then derives the real SSID,
+// and looks up configuration based on that one.
+QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromEasyWlan(TUint32 apId,
+ TUint connectionId)
+{
+ if (apId == iCmManager.EasyWlanIdL()) {
+ TRequestStatus status;
+ TBuf<50> easyWlanNetworkName;
+ iConnectionMonitor.GetStringAttribute( connectionId, 0, KNetworkName,
+ easyWlanNetworkName, status );
+ User::WaitForRequest(status);
+ if (status.Int() == KErrNone) {
+ const QString realSSID = QString::fromUtf16(easyWlanNetworkName.Ptr(),
+ easyWlanNetworkName.Length());
+
+ // Browser through all items and check their name for match
+ QHash<QString, QNetworkConfigurationPrivatePointer>::ConstIterator i =
+ accessPointConfigurations.constBegin();
+ while (i != accessPointConfigurations.constEnd()) {
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+
+ QMutexLocker configLocker(&ptr->mutex);
+
+ if (ptr->name == realSSID) {
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM EasyWlan uses real SSID: " << realSSID;
+#endif
+ return ptr;
+ }
+ ++i;
+ }
+ }
+ }
+ return QNetworkConfigurationPrivatePointer();
+}
+#endif
+
+// Sessions may use this function to report configuration state changes,
+// because on some Symbian platforms (especially Symbian^3) all state changes are not
+// reported by the RConnectionMonitor, in particular in relation to stop() call,
+// whereas they _are_ reported on RConnection progress notifier used by sessions --> centralize
+// this data here so that other sessions may benefit from it too (not all sessions necessarily have
+// RConnection progress notifiers available but they relay on having e.g. disconnected information from
+// manager). Currently only 'Disconnected' state is of interest because it has proven to be troublesome.
+void SymbianEngine::configurationStateChangeReport(TUint32 accessPointId, QNetworkSession::State newState)
+{
+ QMutexLocker locker(&mutex);
+
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug() << "QNCM A session reported state change for IAP ID: " << accessPointId << " whose new state is: " << newState;
+#endif
+ switch (newState) {
+ case QNetworkSession::Disconnected:
+ {
+ QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
+ QString::number(qHash(accessPointId));
+ QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
+ if (ptr) {
+ // Configuration is either Defined or Discovered
+ if (changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered)) {
+ updateStatesToSnaps();
+ }
+
+ locker.unlock();
+ emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
+ toSymbianConfig(ptr)->connectionIdentifier(),
+ QNetworkSession::Disconnected);
+ locker.relock();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+// Waits for 2..6 seconds.
+void SymbianEngine::updateConfigurationsAfterRandomTime()
+{
+ int iTimeToWait = qMax(1000, (qAbs(qrand()) % 68) * 100);
+#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
+ qDebug("QNCM waiting random time: %d ms", iTimeToWait);
+#endif
+ QTimer::singleShot(iTimeToWait, this, SLOT(delayedConfigurationUpdate()));
+}
+
+QNetworkConfigurationPrivatePointer SymbianEngine::dataByConnectionId(TUint aConnectionId)
+{
+ QNetworkConfiguration item;
+ QHash<QString, QNetworkConfigurationPrivatePointer>::const_iterator i =
+ accessPointConfigurations.constBegin();
+ while (i != accessPointConfigurations.constEnd()) {
+ QNetworkConfigurationPrivatePointer ptr = i.value();
+ if (toSymbianConfig(ptr)->connectionIdentifier() == aConnectionId)
+ return ptr;
+
+ ++i;
+ }
+
+ return QNetworkConfigurationPrivatePointer();
+}
+
+AccessPointsAvailabilityScanner::AccessPointsAvailabilityScanner(SymbianEngine& owner,
+ RConnectionMonitor& connectionMonitor)
+ : CActive(CActive::EPriorityHigh), iOwner(owner), iConnectionMonitor(connectionMonitor)
+{
+ CActiveScheduler::Add(this);
+}
+
+AccessPointsAvailabilityScanner::~AccessPointsAvailabilityScanner()
+{
+ Cancel();
+}
+
+void AccessPointsAvailabilityScanner::DoCancel()
+{
+ iConnectionMonitor.CancelAsyncRequest(EConnMonGetPckgAttribute);
+ iScanActive = EFalse;
+ iOwner.iScanInQueue = EFalse;
+}
+
+void AccessPointsAvailabilityScanner::StartScanning()
+{
+ if (!iScanActive) {
+ iScanActive = ETrue;
+ if (iOwner.iFirstUpdate) {
+ // On first update (the mgr is being instantiated) update only those bearers who
+ // don't need time-consuming scans (WLAN).
+ // Note: EBearerIdWCDMA covers also GPRS bearer
+ iConnectionMonitor.GetPckgAttribute(EBearerIdWCDMA, 0, KIapAvailability, iIapBuf, iStatus);
+ } else {
+ iConnectionMonitor.GetPckgAttribute(EBearerIdAll, 0, KIapAvailability, iIapBuf, iStatus);
+ }
+
+ if (!IsActive()) {
+ SetActive();
+ }
+ } else {
+ // Queue scan for getting WLAN info after first request returns
+ if (iOwner.iFirstUpdate) {
+ iOwner.iScanInQueue = ETrue;
+ }
+ }
+}
+
+void AccessPointsAvailabilityScanner::RunL()
+{
+ QMutexLocker locker(&iOwner.mutex);
+
+ iScanActive = EFalse;
+ if (iStatus.Int() != KErrNone) {
+ iIapBuf().iCount = 0;
+ QT_TRYCATCH_LEAVING(iOwner.accessPointScanningReady(false,iIapBuf()));
+ } else {
+ QT_TRYCATCH_LEAVING(iOwner.accessPointScanningReady(true,iIapBuf()));
+ }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/symbian/symbianengine.h b/src/plugins/bearer/symbian/symbianengine.h
new file mode 100644
index 0000000000..1ab41ba45f
--- /dev/null
+++ b/src/plugins/bearer/symbian/symbianengine.h
@@ -0,0 +1,246 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SYMBIANENGINE_H
+#define SYMBIANENGINE_H
+
+#include <QtCore/qstringlist.h>
+#include <QtNetwork/private/qbearerengine_p.h>
+#include <QtNetwork/qnetworkconfigmanager.h>
+
+#include <QHash>
+#include <rconnmon.h>
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ #include <cmmanager.h>
+#endif
+
+// Uncomment and compile QtBearer to gain detailed state tracing
+// #define QT_BEARERMGMT_SYMBIAN_DEBUG
+
+#define QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX QLatin1String("S_")
+#define QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX QLatin1String("I_")
+
+class CCommsDatabase;
+class QEventLoop;
+
+QT_BEGIN_NAMESPACE
+class QTimer;
+QT_END_NAMESPACE
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkSessionPrivate;
+class AccessPointsAvailabilityScanner;
+
+class SymbianNetworkConfigurationPrivate : public QNetworkConfigurationPrivate
+{
+public:
+ SymbianNetworkConfigurationPrivate();
+ ~SymbianNetworkConfigurationPrivate();
+
+ inline TUint32 numericIdentifier() const
+ {
+ QMutexLocker locker(&mutex);
+ return numericId;
+ }
+
+ inline TUint connectionIdentifier() const
+ {
+ QMutexLocker locker(&mutex);
+ return connectionId;
+ }
+
+ inline QString configMappingName() const
+ {
+ QMutexLocker locker(&mutex);
+ return mappingName;
+ }
+
+ QString mappingName;
+
+ // So called IAP id from the platform. Remains constant as long as the
+ // platform is aware of the configuration ie. it is stored in the databases
+ // --> does not depend on whether connections are currently open or not.
+ // In practice is the same for the lifetime of the QNetworkConfiguration.
+ TUint32 numericId;
+ // So called connection id, or connection monitor ID. A dynamic ID assigned
+ // by RConnectionMonitor whenever a new connection is opened. ConnectionID and
+ // numericId/IAP id have 1-to-1 mapping during the lifetime of the connection at
+ // connection monitor. Notably however it changes whenever a new connection to
+ // a given IAP is created. In a sense it is constant during the time the
+ // configuration remains between states Discovered..Active..Discovered, do not
+ // however relay on this.
+ TUint connectionId;
+};
+
+inline SymbianNetworkConfigurationPrivate *toSymbianConfig(QNetworkConfigurationPrivatePointer ptr)
+{
+ return static_cast<SymbianNetworkConfigurationPrivate *>(ptr.data());
+}
+
+class SymbianEngine : public QBearerEngine, public CActive,
+ public MConnectionMonitorObserver
+{
+ Q_OBJECT
+
+public:
+ SymbianEngine(QObject *parent = 0);
+ virtual ~SymbianEngine();
+
+ bool hasIdentifier(const QString &id);
+
+ Q_INVOKABLE void initialize();
+ Q_INVOKABLE void requestUpdate();
+
+ QNetworkConfigurationManager::Capabilities capabilities() const;
+
+ QNetworkSessionPrivate *createSessionBackend();
+
+ QNetworkConfigurationPrivatePointer defaultConfiguration();
+
+ QStringList accessPointConfigurationIdentifiers();
+
+ QNetworkConfigurationPrivatePointer configurationFromSsid(const QString &ssid);
+
+ // For QNetworkSessionPrivateImpl to indicate about state changes
+ void configurationStateChangeReport(TUint32 accessPointId, QNetworkSession::State newState);
+
+Q_SIGNALS:
+ void onlineStateChanged(bool isOnline);
+
+ void configurationStateChanged(quint32 accessPointId, quint32 connMonId,
+ QNetworkSession::State newState);
+
+public Q_SLOTS:
+ void updateConfigurations();
+ void delayedConfigurationUpdate();
+
+private:
+ void updateStatesToSnaps();
+ bool changeConfigurationStateTo(QNetworkConfigurationPrivatePointer ptr,
+ QNetworkConfiguration::StateFlags newState);
+ bool changeConfigurationStateAtMinTo(QNetworkConfigurationPrivatePointer ptr,
+ QNetworkConfiguration::StateFlags newState);
+ bool changeConfigurationStateAtMaxTo(QNetworkConfigurationPrivatePointer ptr,
+ QNetworkConfiguration::StateFlags newState);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ void updateMobileBearerToConfigs(TConnMonBearerInfo bearerInfo);
+ SymbianNetworkConfigurationPrivate *configFromConnectionMethodL(RCmConnectionMethod& connectionMethod);
+#else
+ bool readNetworkConfigurationValuesFromCommsDb(
+ TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration);
+ void readNetworkConfigurationValuesFromCommsDbL(
+ TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration);
+#endif
+
+ void updateConfigurationsL();
+ void updateActiveAccessPoints();
+ void updateAvailableAccessPoints();
+ void accessPointScanningReady(TBool scanSuccessful, TConnMonIapInfo iapInfo);
+ void startCommsDatabaseNotifications();
+ void stopCommsDatabaseNotifications();
+ void updateConfigurationsAfterRandomTime();
+
+ QNetworkConfigurationPrivatePointer defaultConfigurationL();
+ TBool GetS60PlatformVersion(TUint& aMajor, TUint& aMinor) const;
+ void startMonitoringIAPData(TUint32 aIapId);
+ QNetworkConfigurationPrivatePointer dataByConnectionId(TUint aConnectionId);
+
+protected:
+ // From CActive
+ void RunL();
+ void DoCancel();
+
+private:
+ // MConnectionMonitorObserver
+ void EventL(const CConnMonEventBase& aEvent);
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ QNetworkConfigurationPrivatePointer configurationFromEasyWlan(TUint32 apId,
+ TUint connectionId);
+#endif
+
+private: // Data
+ bool iFirstUpdate;
+ CCommsDatabase* ipCommsDB;
+ RConnectionMonitor iConnectionMonitor;
+
+ TBool iWaitingCommsDatabaseNotifications;
+ TBool iOnline;
+ TBool iInitOk;
+ TBool iUpdateGoingOn;
+ TBool iUpdatePending;
+ TBool iScanInQueue;
+
+ AccessPointsAvailabilityScanner* ipAccessPointsAvailabilityScanner;
+
+ QNetworkConfigurationPrivatePointer defaultConfig;
+
+ friend class QNetworkSessionPrivate;
+ friend class AccessPointsAvailabilityScanner;
+
+#ifdef SNAP_FUNCTIONALITY_AVAILABLE
+ RCmManager iCmManager;
+#endif
+};
+
+class AccessPointsAvailabilityScanner : public CActive
+{
+public:
+ AccessPointsAvailabilityScanner(SymbianEngine& owner,
+ RConnectionMonitor& connectionMonitor);
+ ~AccessPointsAvailabilityScanner();
+
+ void StartScanning();
+
+protected: // From CActive
+ void RunL();
+ void DoCancel();
+
+private: // Data
+ SymbianEngine& iOwner;
+ RConnectionMonitor& iConnectionMonitor;
+ TConnMonIapInfoBuf iIapBuf;
+ TBool iScanActive;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/codecs/cn/cn.pro b/src/plugins/codecs/cn/cn.pro
new file mode 100644
index 0000000000..b0a8a91779
--- /dev/null
+++ b/src/plugins/codecs/cn/cn.pro
@@ -0,0 +1,16 @@
+TARGET = qcncodecs
+include(../../qpluginbase.pri)
+
+CONFIG += warn_on
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/codecs
+QT = core
+
+HEADERS = qgb18030codec.h
+
+SOURCES = qgb18030codec.cpp \
+ main.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/codecs
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001E615
diff --git a/src/plugins/codecs/cn/main.cpp b/src/plugins/codecs/cn/main.cpp
new file mode 100644
index 0000000000..6485379b85
--- /dev/null
+++ b/src/plugins/codecs/cn/main.cpp
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtextcodecplugin.h>
+#include <qtextcodec.h>
+#include <qlist.h>
+
+#include "qgb18030codec.h"
+
+#ifndef QT_NO_TEXTCODECPLUGIN
+
+QT_BEGIN_NAMESPACE
+
+class CNTextCodecs : public QTextCodecPlugin
+{
+public:
+ CNTextCodecs() {}
+
+ QList<QByteArray> names() const;
+ QList<QByteArray> aliases() const;
+ QList<int> mibEnums() const;
+
+ QTextCodec *createForMib(int);
+ QTextCodec *createForName(const QByteArray &);
+};
+
+QList<QByteArray> CNTextCodecs::names() const
+{
+ QList<QByteArray> list;
+ list += QGb18030Codec::_name();
+ list += QGbkCodec::_name();
+ list += QGb2312Codec::_name();
+#ifdef Q_WS_X11
+ list += QFontGb2312Codec::_name();
+ list += QFontGbkCodec::_name();
+#endif
+ return list;
+}
+
+QList<QByteArray> CNTextCodecs::aliases() const
+{
+ QList<QByteArray> list;
+ list += QGb18030Codec::_aliases();
+ list += QGbkCodec::_aliases();
+ list += QGb2312Codec::_aliases();
+#ifdef Q_WS_X11
+ list += QFontGb2312Codec::_aliases();
+ list += QFontGbkCodec::_aliases();
+#endif
+ return list;
+}
+
+QList<int> CNTextCodecs::mibEnums() const
+{
+ QList<int> list;
+ list += QGb18030Codec::_mibEnum();
+ list += QGbkCodec::_mibEnum();
+ list += QGb2312Codec::_mibEnum();
+#ifdef Q_WS_X11
+ list += QFontGb2312Codec::_mibEnum();
+ list += QFontGbkCodec::_mibEnum();
+#endif
+ return list;
+}
+
+QTextCodec *CNTextCodecs::createForMib(int mib)
+{
+ if (mib == QGb18030Codec::_mibEnum())
+ return new QGb18030Codec;
+ if (mib == QGbkCodec::_mibEnum())
+ return new QGbkCodec;
+ if (mib == QGb2312Codec::_mibEnum())
+ return new QGb2312Codec;
+#ifdef Q_WS_X11
+ if (mib == QFontGbkCodec::_mibEnum())
+ return new QFontGbkCodec;
+ if (mib == QFontGb2312Codec::_mibEnum())
+ return new QFontGb2312Codec;
+#endif
+ return 0;
+}
+
+
+QTextCodec *CNTextCodecs::createForName(const QByteArray &name)
+{
+ if (name == QGb18030Codec::_name() || QGb18030Codec::_aliases().contains(name))
+ return new QGb18030Codec;
+ if (name == QGbkCodec::_name() || QGbkCodec::_aliases().contains(name))
+ return new QGbkCodec;
+ if (name == QGb2312Codec::_name() || QGb2312Codec::_aliases().contains(name))
+ return new QGb2312Codec;
+#ifdef Q_WS_X11
+ if (name == QFontGbkCodec::_name() || QFontGbkCodec::_aliases().contains(name))
+ return new QFontGbkCodec;
+ if (name == QFontGb2312Codec::_name() || QFontGb2312Codec::_aliases().contains(name))
+ return new QFontGb2312Codec;
+#endif
+ return 0;
+}
+
+
+Q_EXPORT_STATIC_PLUGIN(CNTextCodecs)
+Q_EXPORT_PLUGIN2(qcncodecs, CNTextCodecs)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_TEXTCODECPLUGIN
diff --git a/src/plugins/codecs/cn/qgb18030codec.cpp b/src/plugins/codecs/cn/qgb18030codec.cpp
new file mode 100644
index 0000000000..387bd07866
--- /dev/null
+++ b/src/plugins/codecs/cn/qgb18030codec.cpp
@@ -0,0 +1,9265 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*! \class QGb18030Codec
+ \reentrant
+ \internal
+*/
+
+#include "qgb18030codec.h"
+
+#ifndef QT_NO_TEXTCODEC
+
+QT_BEGIN_NAMESPACE
+
+#define InRange(c, lower, upper) (((c) >= (lower)) && ((c) <= (upper)))
+#define IsLatin(c) ((c) <= 0x7F)
+#define IsByteInGb2312(c) (InRange((c), 0xA1, 0xFE))
+#define Is1stByte(c) (InRange((c), 0x81, 0xFE))
+#define Is2ndByteIn2Bytes(c) (InRange((c), 0x40, 0xFE) && (c) != 0x7F)
+#define Is2ndByteIn4Bytes(c) (InRange((c), 0x30, 0x39))
+#define Is2ndByte(c) (Is2ndByteIn2Bytes(c) || Is2ndByteIn4Bytes(c))
+#define Is3rdByte(c) (InRange((c), 0x81, 0xFE))
+#define Is4thByte(c) (InRange((c), 0x30, 0x39))
+
+#define qValidChar(u) ((u) ? (u) : static_cast<ushort>(QChar::ReplacementCharacter))
+
+/* User-defined areas: UDA 1: 0xAAA1 - 0xAFFE (564/0)
+ UDA 2: 0xF8A1 - 0xFEFE (658/0)
+ UDA 3: 0xA140 - 0xA7A0 (672/0) */
+#define IsUDA1(a, b) (InRange((a), 0xAA, 0xAF) && InRange((b), 0xA1, 0xFE))
+#define IsUDA2(a, b) (InRange((a), 0xF8, 0xFE) && InRange((b), 0xA1, 0xFE))
+#define IsUDA3(a, b) (InRange((a), 0xA1, 0xA7) && InRange((b), 0x40, 0xA0) && ((b) != 0x7F))
+
+typedef struct {
+ quint8 tblBegin;
+ quint8 tblEnd;
+ quint16 tblOffset;
+ quint16 algOffset;
+} indexTbl_t;
+
+static uint qt_Gb18030ToUnicode(const uchar *gbstr, int& len);
+static int qt_UnicodeToGb18030(uint unicode, uchar *gbchar);
+int qt_UnicodeToGbk(uint unicode, uchar *gbchar);
+
+QGb18030Codec::QGb18030Codec()
+{
+}
+
+/*! \reimp */
+QByteArray QGb18030Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ int high = -1;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ if (state->remainingChars)
+ high = state->state_data[0];
+ }
+ int invalid = 0;
+
+ int rlen = 4 *len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+
+ //qDebug("QGb18030Codec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ for (int i = 0; i < len; i++) {
+ unsigned short ch = uc[i].unicode();
+ int len;
+ uchar buf[4];
+ if (high >= 0) {
+ if (ch >= 0xdc00 && ch < 0xe000) {
+ // valid surrogate pair
+ ++i;
+ uint u = (high-0xd800)*0x400+(ch-0xdc00)+0x10000;
+ len = qt_UnicodeToGb18030(u, buf);
+ if (len >= 2) {
+ for (int j=0; j<len; j++)
+ *cursor++ = buf[j];
+ } else {
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ high = -1;
+ continue;
+ } else {
+ *cursor++ = replacement;
+ ++invalid;
+ high = -1;
+ }
+ }
+
+ if (ch < 0x80) {
+ // ASCII
+ *cursor++ = ch;
+ } else if ((ch >= 0xd800 && ch < 0xdc00)) {
+ // surrogates area. check for correct encoding
+ // we need at least one more character, first the high surrogate, then the low one
+ high = ch;
+ } else if ((len = qt_UnicodeToGb18030(ch, buf)) >= 2) {
+ for (int j=0; j<len; j++)
+ *cursor++ = buf[j];
+ } else {
+ // Error
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ state->state_data[0] = high;
+ if (high)
+ state->remainingChars = 1;
+ }
+ return rstr;
+}
+
+QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[4];
+ int nbuf = 0;
+ ushort replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = (state->state_data[0] >> 24) & 0xff;
+ buf[1] = (state->state_data[0] >> 16) & 0xff;
+ buf[2] = (state->state_data[0] >> 8) & 0xff;
+ buf[3] = (state->state_data[0] >> 0) & 0xff;
+ }
+ int invalid = 0;
+
+ QString result;
+ result.resize(len);
+ int unicodeLen = 0;
+ ushort *const resultData = reinterpret_cast<ushort*>(result.data());
+ //qDebug("QGb18030Decoder::toUnicode(const char* chars, int len = %d)", len);
+ for (int i = 0; i < len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80) {
+ // ASCII
+ resultData[unicodeLen] = ch;
+ ++unicodeLen;
+ } else if (Is1stByte(ch)) {
+ // GB18030?
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ break;
+ case 1:
+ // GB18030 2 bytes
+ if (Is2ndByteIn2Bytes(ch)) {
+ buf[1] = ch;
+ int clen = 2;
+ uint u = qt_Gb18030ToUnicode(buf, clen);
+ if (clen == 2) {
+ resultData[unicodeLen] = qValidChar(static_cast<ushort>(u));
+ ++unicodeLen;
+ } else {
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ nbuf = 0;
+ } else if (Is2ndByteIn4Bytes(ch)) {
+ buf[1] = ch;
+ nbuf = 2;
+ } else {
+ // Error
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ nbuf = 0;
+ }
+ break;
+ case 2:
+ // GB18030 3 bytes
+ if (Is3rdByte(ch)) {
+ buf[2] = ch;
+ nbuf = 3;
+ } else {
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ nbuf = 0;
+ }
+ break;
+ case 3:
+ // GB18030 4 bytes
+ if (Is4thByte(ch)) {
+ buf[3] = ch;
+ int clen = 4;
+ uint u = qt_Gb18030ToUnicode(buf, clen);
+ if (clen == 4) {
+ resultData[unicodeLen] = qValidChar(u);
+ ++unicodeLen;
+ } else {
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ } else {
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+ result.resize(unicodeLen);
+
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+
+/*! \class QGbkCodec
+ \reentrant
+ \internal
+
+ \brief The QGbkCodec class provides conversion to and from the Chinese
+ GBK encoding.
+
+ GBK, formally the Chinese Internal Code Specification, is a commonly
+ used extension of GB 2312-80. Microsoft Windows uses it under the
+ name code page 936.
+
+ The GBK encoding has been superseded by the GB18030 encoding and
+ GB18030 is backward compatible to GBK. For this reason the QGbkCodec class
+ is implemented in terms of the GB18030 codec and uses its 1-byte and
+ 2-byte portion for conversion from and to Unicode.
+
+ The QGbkCodec is kept mainly for compatibility reasons with older software.
+*/
+
+
+/*!
+ Constructs a QGbkCodec object.
+*/
+QGbkCodec::QGbkCodec()
+ : QGb18030Codec()
+{
+}
+
+int QGbkCodec::_mibEnum()
+{
+ return 113;
+}
+
+QByteArray QGbkCodec::_name()
+{
+ return "GBK";
+}
+
+QList<QByteArray> QGbkCodec::_aliases()
+{
+ QList<QByteArray> list;
+ list << "CP936"
+ << "MS936"
+ << "windows-936";
+ return list;
+}
+
+QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[2];
+ int nbuf = 0;
+ ushort replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ QString result;
+ result.resize(len);
+ int unicodeLen = 0;
+ ushort *const resultData = reinterpret_cast<ushort*>(result.data());
+
+ //qDebug("QGbkDecoder::toUnicode(const char* chars = \"%s\", int len = %d)", chars, len);
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80) {
+ // ASCII
+ resultData[unicodeLen] = ch;
+ ++unicodeLen;
+ } else if (Is1stByte(ch)) {
+ // GBK 1st byte?
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ break;
+ case 1:
+ // GBK 2nd byte
+ if (Is2ndByteIn2Bytes(ch)) {
+ buf[1] = ch;
+ int clen = 2;
+ uint u = qt_Gb18030ToUnicode(buf, clen);
+ if (clen == 2) {
+ resultData[unicodeLen] = qValidChar(static_cast<ushort>(u));
+ ++unicodeLen;
+ } else {
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ nbuf = 0;
+ } else {
+ // Error
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ nbuf = 0;
+ }
+ break;
+ }
+ }
+ result.resize(unicodeLen);
+
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+QByteArray QGbkCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+
+ //qDebug("QGbkCodec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ for (int i = 0; i < len; i++) {
+ QChar ch = uc[i];
+ uchar buf[2];
+
+ if (ch.row() == 0x00 && ch.cell() < 0x80) {
+ // ASCII
+ *cursor++ = ch.cell();
+ } else if (qt_UnicodeToGbk(ch.unicode(), buf) == 2) {
+ *cursor++ = buf[0];
+ *cursor++ = buf[1];
+ } else {
+ // Error
+ *cursor += replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+
+/*! \class QGb2312Codec
+ \internal
+
+ \brief The QGb2312Codec class provides conversion to and from the Chinese
+ GB2312 encoding.
+
+ The GB2312 encoding has been superseded by the GB18030 encoding and
+ GB18030 is backward compatible to GB2312. For this reason the QGb2312Codec
+ class is implemented in terms of the GB18030 codec and uses its
+ 0xA1A1-0xFEFE subset for conversion from and to Unicode.
+
+ The QGb2312Codec is kept mainly for compatibility reasons with older software.
+*/
+
+
+/*!
+ Constructs a QGb2312Codec object.
+*/
+QGb2312Codec::QGb2312Codec()
+ : QGb18030Codec()
+{
+}
+
+int QGb2312Codec::_mibEnum()
+{
+ return 2025;
+}
+
+QByteArray QGb2312Codec::_name()
+{
+ return "GB2312";
+}
+
+
+QString QGb2312Codec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[2];
+ int nbuf = 0;
+ ushort replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ QString result;
+ result.resize(len);
+ int unicodeLen = 0;
+ ushort *const resultData = reinterpret_cast<ushort*>(result.data());
+ //qDebug("QGb2312Decoder::toUnicode(const char* chars, int len = %d)", len);
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80) {
+ // ASCII
+ resultData[unicodeLen] = ch;
+ ++unicodeLen;
+ } else if (IsByteInGb2312(ch)) {
+ // GB2312 1st byte?
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ break;
+ case 1:
+ // GB2312 2nd byte
+ if (IsByteInGb2312(ch)) {
+ buf[1] = ch;
+ int clen = 2;
+ uint u = qt_Gb18030ToUnicode(buf, clen);
+ if (clen == 2) {
+ resultData[unicodeLen] = qValidChar(static_cast<ushort>(u));
+ ++unicodeLen;
+ } else {
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ }
+ nbuf = 0;
+ } else {
+ // Error
+ resultData[unicodeLen] = replacement;
+ ++unicodeLen;
+ ++invalid;
+ nbuf = 0;
+ }
+ break;
+ }
+ }
+ result.resize(unicodeLen);
+
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+
+QByteArray QGb2312Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+
+ //qDebug("QGb2312Codec::fromUnicode(const QString& uc, int& lenInOut = %d) const", lenInOut);
+ for (int i = 0; i < len; i++) {
+ QChar ch = uc[i];
+ uchar buf[2];
+
+ if (ch.row() == 0x00 && ch.cell() < 0x80) {
+ // ASCII
+ *cursor++ = ch.cell();
+ } else if ((qt_UnicodeToGbk(ch.unicode(), buf) == 2) &&
+ (buf[0] >= 0xA1) && (buf[1] >= 0xA1)) {
+ *cursor++ = buf[0];
+ *cursor++ = buf[1];
+ } else {
+ // Error
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+
+#ifdef Q_WS_X11
+
+QFontGb2312Codec::QFontGb2312Codec()
+{
+}
+
+
+QByteArray QFontGb2312Codec::_name()
+{
+ return "gb2312.1980-0";
+}
+
+
+int QFontGb2312Codec::_mibEnum()
+{
+ return 57;
+}
+
+
+QString QFontGb2312Codec::convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontGb2312Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ //qDebug("QFontGb2312Codec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ uchar buf[8];
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+
+ int len = qt_UnicodeToGbk(ch.unicode(), buf);
+
+ if (len == 2 && buf[0] > 0xa0 && buf[1] > 0xa0) {
+ *rdata++ = buf[0] & 0x7f;
+ *rdata++ = buf[1] & 0x7f;
+ } else {
+ *rdata++ = 0;
+ *rdata++ = 0;
+ }
+ }
+ return result;
+}
+
+
+QFontGbkCodec::QFontGbkCodec()
+{
+}
+
+
+QByteArray QFontGbkCodec::_name()
+{
+ return "gbk-0";
+}
+
+
+int QFontGbkCodec::_mibEnum()
+{
+ return -113;
+}
+
+
+QString QFontGbkCodec::convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontGbkCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ //qDebug("QFontGbkCodec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+ uchar buf[8];
+
+ int len = qt_UnicodeToGbk(ch.unicode(), buf);
+
+ if (len == 2) {
+ *rdata++ = buf[0];
+ *rdata++ = buf[1];
+ } else {
+ *rdata++ = 0;
+ *rdata++ = 0;
+ }
+ }
+ return result;
+}
+
+
+QFontGb18030_0Codec::QFontGb18030_0Codec()
+{
+ //qDebug("QFontGb18030_0Codec::QFontGb18030_0Codec()");
+}
+
+
+QByteArray QFontGb18030_0Codec::_name()
+{
+ //qDebug("QFontGb18030_0Codec::name() = \"gb18030-0\"");
+ return "gb18030-0";
+}
+
+
+int QFontGb18030_0Codec::_mibEnum()
+{
+ //qDebug("QFontGb18030_0Codec::mibEnum() = -114");
+ return -114;
+}
+
+
+QString QFontGb18030_0Codec::convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontGb18030_0Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ //qDebug("QFontGb18030_0Codec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+ if (ch.row () > 0 && !(ch.row () >= 0xd8 && ch.row () < 0xe0)) {
+ *rdata++ = ch.row();
+ *rdata++ = ch.cell();
+ } else {
+ *rdata++ = 0x0;
+ *rdata++ = 0x0;
+ }
+ }
+ return result;
+}
+
+#endif // Q_WS_X11
+
+
+static const indexTbl_t gb18030_to_ucs_index[154] = {
+ /* U+00__ */ {0x00, 0xFF, 0x0000, 0x0000}, {0x00, 0xFF, 0x0000, 0x0000},
+ /* U+02__ */ {0x00, 0xFF, 0x0000, 0x0000}, {0x00, 0x33, 0x0000, 0x041E},
+ /* U+04__ */ {0xFF, 0x00, 0x1BBE, 0x051E}, {0xFF, 0x00, 0x1BBE, 0x061E},
+ /* U+06__ */ {0xFF, 0x00, 0x1BBE, 0x071E}, {0xFF, 0x00, 0x1BBE, 0x081E},
+ /* U+08__ */ {0xFF, 0x00, 0x1BBE, 0x091E}, {0xFF, 0x00, 0x1BBE, 0x0A1E},
+ /* U+0A__ */ {0xFF, 0x00, 0x1BBE, 0x0B1E}, {0xFF, 0x00, 0x1BBE, 0x0C1E},
+ /* U+0C__ */ {0xFF, 0x00, 0x1BBE, 0x0D1E}, {0xFF, 0x00, 0x1BBE, 0x0E1E},
+ /* U+0E__ */ {0xFF, 0x00, 0x1BBE, 0x0F1E}, {0xFF, 0x00, 0x1BBE, 0x101E},
+ /* U+10__ */ {0xFF, 0x00, 0x1BBE, 0x111E}, {0xFF, 0x00, 0x1BBE, 0x121E},
+ /* U+12__ */ {0xFF, 0x00, 0x1BBE, 0x131E}, {0xFF, 0x00, 0x1BBE, 0x141E},
+ /* U+14__ */ {0xFF, 0x00, 0x1BBE, 0x151E}, {0xFF, 0x00, 0x1BBE, 0x161E},
+ /* U+16__ */ {0xFF, 0x00, 0x1BBE, 0x171E}, {0xFF, 0x00, 0x1BBE, 0x181E},
+ /* U+18__ */ {0xFF, 0x00, 0x1BBE, 0x191E}, {0xFF, 0x00, 0x1BBE, 0x1A1E},
+ /* U+1A__ */ {0xFF, 0x00, 0x1BBE, 0x1B1E}, {0xFF, 0x00, 0x1BBE, 0x1C1E},
+ /* U+1C__ */ {0xFF, 0x00, 0x1BBE, 0x1D1E}, {0xFF, 0x00, 0x1BBE, 0x1E1E},
+ /* U+1E__ */ {0xF2, 0xFF, 0x1BBE, 0x1F1E}, {0x00, 0xFF, 0x1BBE, 0x0000},
+ /* U+20__ */ {0x00, 0xFF, 0x1BBE, 0x0000}, {0x00, 0xFF, 0x1BBE, 0x0000},
+ /* U+22__ */ {0x00, 0xFF, 0x1BBE, 0x0000}, {0x00, 0xFF, 0x1BBE, 0x0000},
+ /* U+24__ */ {0x00, 0x02, 0x1BBE, 0x2640}, {0xFF, 0x00, 0x23FC, 0x2740},
+ /* U+26__ */ {0xFF, 0x00, 0x23FC, 0x2840}, {0xFF, 0x00, 0x23FC, 0x2940},
+ /* U+28__ */ {0xFF, 0x00, 0x23FC, 0x2A40}, {0xFF, 0x00, 0x23FC, 0x2B40},
+ /* U+2A__ */ {0xFF, 0x00, 0x23FC, 0x2C40}, {0xFF, 0x00, 0x23FC, 0x2D40},
+ /* U+2C__ */ {0x41, 0xFF, 0x23FC, 0x2E40}, {0x00, 0xFF, 0x23FC, 0x0000},
+ /* U+2E__ */ {0x00, 0xFF, 0x23FC, 0x0000}, {0x00, 0xFF, 0x23FC, 0x0000},
+ /* U+30__ */ {0x00, 0xFF, 0x23FC, 0x0000}, {0x00, 0xFF, 0x23FC, 0x0000},
+ /* U+32__ */ {0x00, 0xAC, 0x23FC, 0x356E}, {0xFF, 0x00, 0x26F9, 0x366E},
+ /* U+34__ */ {0xFF, 0x00, 0x26F9, 0x376E}, {0xAA, 0xFF, 0x26F9, 0x386E},
+ /* U+36__ */ {0x00, 0xFF, 0x26F9, 0x0000}, {0x00, 0xFF, 0x26F9, 0x0000},
+ /* U+38__ */ {0x00, 0xFF, 0x26F9, 0x0000}, {0x00, 0x69, 0x26F9, 0x3C77},
+ /* U+3A__ */ {0xFF, 0x00, 0x2A6E, 0x3D77}, {0xFF, 0x00, 0x2A6E, 0x3E77},
+ /* U+3C__ */ {0xDF, 0xFF, 0x2A6E, 0x3F77}, {0x00, 0xE6, 0x2A6E, 0x4079},
+ /* U+3E__ */ {0xFF, 0x00, 0x2C45, 0x4179}, {0xBE, 0xFF, 0x2C45, 0x4279},
+ /* U+40__ */ {0x00, 0xFF, 0x2C45, 0x0000}, {0x00, 0x58, 0x2C45, 0x447E},
+ /* U+42__ */ {0xCE, 0xFF, 0x2DBA, 0x457E}, {0x00, 0xFF, 0x2DBA, 0x0000},
+ /* U+44__ */ {0x00, 0x09, 0x2DBA, 0x4784}, {0xC3, 0xFF, 0x2F73, 0x4884},
+ /* U+46__ */ {0x00, 0x28, 0x2F73, 0x498F}, {0xFF, 0x00, 0x3232, 0x4A8F},
+ /* U+48__ */ {0xE8, 0xFF, 0x3232, 0x4B8F}, {0x00, 0xFF, 0x3232, 0x0000},
+ /* U+4A__ */ {0x00, 0x62, 0x3232, 0x9F43}, {0xFF, 0x00, 0x6A8C, 0xA043},
+ /* U+4C__ */ {0xFF, 0x00, 0x6A8C, 0xA143}, {0xFF, 0x00, 0x6A8C, 0xA243},
+ /* U+4E__ */ {0xFF, 0x00, 0x6A8C, 0xA343}, {0xFF, 0x00, 0x6A8C, 0xA443},
+ /* U+50__ */ {0xFF, 0x00, 0x6A8C, 0xA543}, {0xFF, 0x00, 0x6A8C, 0xA643},
+ /* U+52__ */ {0xFF, 0x00, 0x6A8C, 0xA743}, {0xFF, 0x00, 0x6A8C, 0xA843},
+ /* U+54__ */ {0xFF, 0x00, 0x6A8C, 0xA943}, {0xFF, 0x00, 0x6A8C, 0xAA43},
+ /* U+56__ */ {0xFF, 0x00, 0x6A8C, 0xAB43}, {0xFF, 0x00, 0x6A8C, 0xAC43},
+ /* U+58__ */ {0xFF, 0x00, 0x6A8C, 0xAD43}, {0xFF, 0x00, 0x6A8C, 0xAE43},
+ /* U+5A__ */ {0xFF, 0x00, 0x6A8C, 0xAF43}, {0xFF, 0x00, 0x6A8C, 0xB043},
+ /* U+5C__ */ {0xFF, 0x00, 0x6A8C, 0xB143}, {0xFF, 0x00, 0x6A8C, 0xB243},
+ /* U+5E__ */ {0xFF, 0x00, 0x6A8C, 0xB343}, {0xFF, 0x00, 0x6A8C, 0xB443},
+ /* U+60__ */ {0xFF, 0x00, 0x6A8C, 0xB543}, {0xFF, 0x00, 0x6A8C, 0xB643},
+ /* U+62__ */ {0xFF, 0x00, 0x6A8C, 0xB743}, {0xFF, 0x00, 0x6A8C, 0xB843},
+ /* U+64__ */ {0xFF, 0x00, 0x6A8C, 0xB943}, {0xFF, 0x00, 0x6A8C, 0xBA43},
+ /* U+66__ */ {0xFF, 0x00, 0x6A8C, 0xBB43}, {0xFF, 0x00, 0x6A8C, 0xBC43},
+ /* U+68__ */ {0xFF, 0x00, 0x6A8C, 0xBD43}, {0xFF, 0x00, 0x6A8C, 0xBE43},
+ /* U+6A__ */ {0xFF, 0x00, 0x6A8C, 0xBF43}, {0xFF, 0x00, 0x6A8C, 0xC043},
+ /* U+6C__ */ {0xFF, 0x00, 0x6A8C, 0xC143}, {0xFF, 0x00, 0x6A8C, 0xC243},
+ /* U+6E__ */ {0xFF, 0x00, 0x6A8C, 0xC343}, {0xFF, 0x00, 0x6A8C, 0xC443},
+ /* U+70__ */ {0xFF, 0x00, 0x6A8C, 0xC543}, {0xFF, 0x00, 0x6A8C, 0xC643},
+ /* U+72__ */ {0xFF, 0x00, 0x6A8C, 0xC743}, {0xFF, 0x00, 0x6A8C, 0xC843},
+ /* U+74__ */ {0xFF, 0x00, 0x6A8C, 0xC943}, {0xFF, 0x00, 0x6A8C, 0xCA43},
+ /* U+76__ */ {0xFF, 0x00, 0x6A8C, 0xCB43}, {0xFF, 0x00, 0x6A8C, 0xCC43},
+ /* U+78__ */ {0xFF, 0x00, 0x6A8C, 0xCD43}, {0xFF, 0x00, 0x6A8C, 0xCE43},
+ /* U+7A__ */ {0xFF, 0x00, 0x6A8C, 0xCF43}, {0xFF, 0x00, 0x6A8C, 0xD043},
+ /* U+7C__ */ {0xFF, 0x00, 0x6A8C, 0xD143}, {0xFF, 0x00, 0x6A8C, 0xD243},
+ /* U+7E__ */ {0xFF, 0x00, 0x6A8C, 0xD343}, {0xFF, 0x00, 0x6A8C, 0xD443},
+ /* U+80__ */ {0xFF, 0x00, 0x6A8C, 0xD543}, {0xFF, 0x00, 0x6A8C, 0xD643},
+ /* U+82__ */ {0xBD, 0xFF, 0x6A8C, 0xD743}, {0x00, 0x0D, 0x6A8C, 0xE857},
+ /* U+84__ */ {0xFF, 0x00, 0x7B53, 0xE957}, {0xFF, 0x00, 0x7B53, 0xEA57},
+ /* U+86__ */ {0xFF, 0x00, 0x7B53, 0xEB57}, {0xFF, 0x00, 0x7B53, 0xEC57},
+ /* U+88__ */ {0xFF, 0x00, 0x7B53, 0xED57}, {0xFF, 0x00, 0x7B53, 0xEE57},
+ /* U+8A__ */ {0xFF, 0x00, 0x7B53, 0xEF57}, {0xFF, 0x00, 0x7B53, 0xF057},
+ /* U+8C__ */ {0xFF, 0x00, 0x7B53, 0xF157}, {0xFF, 0x00, 0x7B53, 0xF257},
+ /* U+8E__ */ {0xFF, 0x00, 0x7B53, 0xF357}, {0xFF, 0x00, 0x7B53, 0xF457},
+ /* U+90__ */ {0xFF, 0x00, 0x7B53, 0xF557}, {0xFF, 0x00, 0x7B53, 0xF657},
+ /* U+92__ */ {0xFF, 0x00, 0x7B53, 0xF757}, {0xD5, 0xFF, 0x7B53, 0xF857},
+ /* U+94__ */ {0x00, 0xBD, 0x7B53, 0xF96C}, {0xFF, 0x00, 0x7F59, 0xFA6C},
+ /* U+96__ */ {0xFF, 0x00, 0x7F59, 0xFB6C}, {0xFF, 0x00, 0x7F59, 0xFC6C},
+ /* U+98__ */ {0xC4, 0xFF, 0x7F59, 0xFD6C}, {0x00, 0xE1, 0x7F59, 0xFF04},
+};
+
+static const indexTbl_t ucs_to_gb18030_index[256] = {
+ /* 0x00__ */ {0x80, 0xFF, 0x0080, 0x0000}, {0x00, 0xFF, 0x0080, 0x0000},
+ /* 0x02__ */ {0x00, 0xFF, 0x0080, 0x0000}, {0x00, 0xFF, 0x0080, 0x0000},
+ /* 0x04__ */ {0x00, 0x51, 0x0080, 0x02E2}, {0xFF, 0x00, 0x1C3E, 0x03E2},
+ /* 0x06__ */ {0xFF, 0x00, 0x1C3E, 0x04E2}, {0xFF, 0x00, 0x1C3E, 0x05E2},
+ /* 0x08__ */ {0xFF, 0x00, 0x1C3E, 0x06E2}, {0xFF, 0x00, 0x1C3E, 0x07E2},
+ /* 0x0A__ */ {0xFF, 0x00, 0x1C3E, 0x08E2}, {0xFF, 0x00, 0x1C3E, 0x09E2},
+ /* 0x0C__ */ {0xFF, 0x00, 0x1C3E, 0x0AE2}, {0xFF, 0x00, 0x1C3E, 0x0BE2},
+ /* 0x0E__ */ {0xFF, 0x00, 0x1C3E, 0x0CE2}, {0xFF, 0x00, 0x1C3E, 0x0DE2},
+ /* 0x10__ */ {0xFF, 0x00, 0x1C3E, 0x0EE2}, {0xFF, 0x00, 0x1C3E, 0x0FE2},
+ /* 0x12__ */ {0xFF, 0x00, 0x1C3E, 0x10E2}, {0xFF, 0x00, 0x1C3E, 0x11E2},
+ /* 0x14__ */ {0xFF, 0x00, 0x1C3E, 0x12E2}, {0xFF, 0x00, 0x1C3E, 0x13E2},
+ /* 0x16__ */ {0xFF, 0x00, 0x1C3E, 0x14E2}, {0xFF, 0x00, 0x1C3E, 0x15E2},
+ /* 0x18__ */ {0xFF, 0x00, 0x1C3E, 0x16E2}, {0xFF, 0x00, 0x1C3E, 0x17E2},
+ /* 0x1A__ */ {0xFF, 0x00, 0x1C3E, 0x18E2}, {0xFF, 0x00, 0x1C3E, 0x19E2},
+ /* 0x1C__ */ {0xFF, 0x00, 0x1C3E, 0x1AE2}, {0xFF, 0x00, 0x1C3E, 0x1BE2},
+ /* 0x1E__ */ {0xFF, 0x00, 0x1C3E, 0x1CE2}, {0xFF, 0x00, 0x1C3E, 0x1DE2},
+ /* 0x20__ */ {0x10, 0xFF, 0x1C3E, 0x1EE2}, {0x00, 0xFF, 0x1C3E, 0x0000},
+ /* 0x22__ */ {0x00, 0xFF, 0x1C3E, 0x0000}, {0x00, 0xFF, 0x1C3E, 0x0000},
+ /* 0x24__ */ {0x00, 0xFF, 0x1C3E, 0x0000}, {0x00, 0xFF, 0x1C3E, 0x0000},
+ /* 0x26__ */ {0x00, 0x42, 0x1C3E, 0x23C0}, {0xFF, 0x00, 0x247C, 0x24C0},
+ /* 0x28__ */ {0xFF, 0x00, 0x247C, 0x25C0}, {0xFF, 0x00, 0x247C, 0x26C0},
+ /* 0x2A__ */ {0xFF, 0x00, 0x247C, 0x27C0}, {0xFF, 0x00, 0x247C, 0x28C0},
+ /* 0x2C__ */ {0xFF, 0x00, 0x247C, 0x29C0}, {0xFF, 0x00, 0x247C, 0x2AC0},
+ /* 0x2E__ */ {0x81, 0xFF, 0x247C, 0x2BC0}, {0x00, 0xFF, 0x247C, 0x0000},
+ /* 0x30__ */ {0x00, 0xFF, 0x247C, 0x0000}, {0x00, 0xFF, 0x247C, 0x0000},
+ /* 0x32__ */ {0x00, 0xFF, 0x247C, 0x0000}, {0x00, 0xFF, 0x247C, 0x0000},
+ /* 0x34__ */ {0x00, 0xFF, 0x247C, 0x0000}, {0x00, 0xFF, 0x247C, 0x0000},
+ /* 0x36__ */ {0x00, 0x1A, 0x247C, 0x3292}, {0xFF, 0x00, 0x2779, 0x3392},
+ /* 0x38__ */ {0xFF, 0x00, 0x2779, 0x3492}, {0x18, 0xFF, 0x2779, 0x3592},
+ /* 0x3A__ */ {0x00, 0xFF, 0x2779, 0x0000}, {0x00, 0xFF, 0x2779, 0x0000},
+ /* 0x3C__ */ {0x00, 0xE0, 0x2779, 0x3889}, {0xFF, 0x00, 0x2AEE, 0x3989},
+ /* 0x3E__ */ {0xFF, 0x00, 0x2AEE, 0x3A89}, {0xFF, 0x00, 0x2AEE, 0x3B89},
+ /* 0x40__ */ {0x56, 0xFF, 0x2AEE, 0x3C89}, {0x00, 0x5F, 0x2AEE, 0x3D87},
+ /* 0x42__ */ {0xFF, 0x00, 0x2CC5, 0x3E87}, {0x37, 0xFF, 0x2CC5, 0x3F87},
+ /* 0x44__ */ {0x00, 0xD6, 0x2CC5, 0x4082}, {0xFF, 0x00, 0x2E3A, 0x4182},
+ /* 0x46__ */ {0x4C, 0xFF, 0x2E3A, 0x4282}, {0x00, 0x8D, 0x2E3A, 0x437C},
+ /* 0x48__ */ {0xFF, 0x00, 0x2FF3, 0x447C}, {0x47, 0xB7, 0x2FF3, 0x457C},
+ /* 0x4A__ */ {0xFF, 0x00, 0x32B2, 0x4671}, {0xFF, 0x00, 0x32B2, 0x4771},
+ /* 0x4C__ */ {0x77, 0xFF, 0x32B2, 0x4871}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x4E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x50__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x52__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x54__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x56__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x58__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x5A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x5C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x5E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x60__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x62__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x64__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x66__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x68__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x6A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x6C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x6E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x70__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x72__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x74__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x76__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x78__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x7A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x7C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x7E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x80__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x82__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x84__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x86__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x88__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x8A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x8C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x8E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x90__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x92__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x94__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x96__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x98__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x9A__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x9C__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xFF, 0x32B2, 0x0000},
+ /* 0x9E__ */ {0x00, 0xFF, 0x32B2, 0x0000}, {0x00, 0xA5, 0x32B2, 0x49BD},
+ /* 0xA0__ */ {0xFF, 0x00, 0x6B0C, 0x4ABD}, {0xFF, 0x00, 0x6B0C, 0x4BBD},
+ /* 0xA2__ */ {0xFF, 0x00, 0x6B0C, 0x4CBD}, {0xFF, 0x00, 0x6B0C, 0x4DBD},
+ /* 0xA4__ */ {0xFF, 0x00, 0x6B0C, 0x4EBD}, {0xFF, 0x00, 0x6B0C, 0x4FBD},
+ /* 0xA6__ */ {0xFF, 0x00, 0x6B0C, 0x50BD}, {0xFF, 0x00, 0x6B0C, 0x51BD},
+ /* 0xA8__ */ {0xFF, 0x00, 0x6B0C, 0x52BD}, {0xFF, 0x00, 0x6B0C, 0x53BD},
+ /* 0xAA__ */ {0xFF, 0x00, 0x6B0C, 0x54BD}, {0xFF, 0x00, 0x6B0C, 0x55BD},
+ /* 0xAC__ */ {0xFF, 0x00, 0x6B0C, 0x56BD}, {0xFF, 0x00, 0x6B0C, 0x57BD},
+ /* 0xAE__ */ {0xFF, 0x00, 0x6B0C, 0x58BD}, {0xFF, 0x00, 0x6B0C, 0x59BD},
+ /* 0xB0__ */ {0xFF, 0x00, 0x6B0C, 0x5ABD}, {0xFF, 0x00, 0x6B0C, 0x5BBD},
+ /* 0xB2__ */ {0xFF, 0x00, 0x6B0C, 0x5CBD}, {0xFF, 0x00, 0x6B0C, 0x5DBD},
+ /* 0xB4__ */ {0xFF, 0x00, 0x6B0C, 0x5EBD}, {0xFF, 0x00, 0x6B0C, 0x5FBD},
+ /* 0xB6__ */ {0xFF, 0x00, 0x6B0C, 0x60BD}, {0xFF, 0x00, 0x6B0C, 0x61BD},
+ /* 0xB8__ */ {0xFF, 0x00, 0x6B0C, 0x62BD}, {0xFF, 0x00, 0x6B0C, 0x63BD},
+ /* 0xBA__ */ {0xFF, 0x00, 0x6B0C, 0x64BD}, {0xFF, 0x00, 0x6B0C, 0x65BD},
+ /* 0xBC__ */ {0xFF, 0x00, 0x6B0C, 0x66BD}, {0xFF, 0x00, 0x6B0C, 0x67BD},
+ /* 0xBE__ */ {0xFF, 0x00, 0x6B0C, 0x68BD}, {0xFF, 0x00, 0x6B0C, 0x69BD},
+ /* 0xC0__ */ {0xFF, 0x00, 0x6B0C, 0x6ABD}, {0xFF, 0x00, 0x6B0C, 0x6BBD},
+ /* 0xC2__ */ {0xFF, 0x00, 0x6B0C, 0x6CBD}, {0xFF, 0x00, 0x6B0C, 0x6DBD},
+ /* 0xC4__ */ {0xFF, 0x00, 0x6B0C, 0x6EBD}, {0xFF, 0x00, 0x6B0C, 0x6FBD},
+ /* 0xC6__ */ {0xFF, 0x00, 0x6B0C, 0x70BD}, {0xFF, 0x00, 0x6B0C, 0x71BD},
+ /* 0xC8__ */ {0xFF, 0x00, 0x6B0C, 0x72BD}, {0xFF, 0x00, 0x6B0C, 0x73BD},
+ /* 0xCA__ */ {0xFF, 0x00, 0x6B0C, 0x74BD}, {0xFF, 0x00, 0x6B0C, 0x75BD},
+ /* 0xCC__ */ {0xFF, 0x00, 0x6B0C, 0x76BD}, {0xFF, 0x00, 0x6B0C, 0x77BD},
+ /* 0xCE__ */ {0xFF, 0x00, 0x6B0C, 0x78BD}, {0xFF, 0x00, 0x6B0C, 0x79BD},
+ /* 0xD0__ */ {0xFF, 0x00, 0x6B0C, 0x7ABD}, {0xFF, 0x00, 0x6B0C, 0x7BBD},
+ /* 0xD2__ */ {0xFF, 0x00, 0x6B0C, 0x7CBD}, {0xFF, 0x00, 0x6B0C, 0x7DBD},
+ /* 0xD4__ */ {0xFF, 0x00, 0x6B0C, 0x7EBD}, {0xFF, 0x00, 0x6B0C, 0x7FBD},
+ /* 0xD6__ */ {0xFF, 0x00, 0x6B0C, 0x80BD}, {0xFF, 0x00, 0x6B0C, 0x81BD},
+ /* 0xD8__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000},
+ /* 0xDA__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000},
+ /* 0xDC__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000},
+ /* 0xDE__ */ {0xFF, 0x00, 0x6B0C, 0x0000}, {0xFF, 0x00, 0x6B0C, 0x0000},
+ /* 0xE0__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0xFF, 0x00, 0x7A72, 0x0000},
+ /* 0xE2__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0xFF, 0x00, 0x7A72, 0x0000},
+ /* 0xE4__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0xFF, 0x00, 0x7A72, 0x0000},
+ /* 0xE6__ */ {0xFF, 0x00, 0x7A72, 0x0000}, {0x66, 0xFF, 0x7A72, 0x0000},
+ /* 0xE8__ */ {0x00, 0x64, 0x7A72, 0x82A9}, {0xFF, 0x00, 0x8B39, 0x83A9},
+ /* 0xEA__ */ {0xFF, 0x00, 0x8B39, 0x84A9}, {0xFF, 0x00, 0x8B39, 0x85A9},
+ /* 0xEC__ */ {0xFF, 0x00, 0x8B39, 0x86A9}, {0xFF, 0x00, 0x8B39, 0x87A9},
+ /* 0xEE__ */ {0xFF, 0x00, 0x8B39, 0x88A9}, {0xFF, 0x00, 0x8B39, 0x89A9},
+ /* 0xF0__ */ {0xFF, 0x00, 0x8B39, 0x8AA9}, {0xFF, 0x00, 0x8B39, 0x8BA9},
+ /* 0xF2__ */ {0xFF, 0x00, 0x8B39, 0x8CA9}, {0xFF, 0x00, 0x8B39, 0x8DA9},
+ /* 0xF4__ */ {0xFF, 0x00, 0x8B39, 0x8EA9}, {0xFF, 0x00, 0x8B39, 0x8FA9},
+ /* 0xF6__ */ {0xFF, 0x00, 0x8B39, 0x90A9}, {0xFF, 0x00, 0x8B39, 0x91A9},
+ /* 0xF8__ */ {0xFF, 0x00, 0x8B39, 0x92A9}, {0x2C, 0xFF, 0x8B39, 0x93A9},
+ /* 0xFA__ */ {0x00, 0x29, 0x8B39, 0x9494}, {0xFF, 0x00, 0x8F3F, 0x9594},
+ /* 0xFC__ */ {0xFF, 0x00, 0x8F3F, 0x9694}, {0xFF, 0x00, 0x8F3F, 0x9794},
+ /* 0xFE__ */ {0x30, 0xFF, 0x8F3F, 0x9894}, {0x00, 0xE5, 0x8F3F, 0x98FC},
+};
+
+static quint16 const ucs_to_gb18030[28839] = {
+ /* Contiguous area: U+0080 .. U+0451 */
+ /* U+0080 */ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ /* U+0088 */ 0x0008, 0x0009, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015,
+ /* U+0090 */ 0x0016, 0x0017, 0x0018, 0x0019, 0x0020, 0x0021, 0x0022, 0x0023,
+ /* U+0098 */ 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x0030, 0x0031,
+ /* U+00A0 */ 0x0032, 0x0033, 0x0034, 0x0035, 0xA1E8, 0x0036, 0x0037, 0xA1EC,
+ /* U+00A8 */ 0xA1A7, 0x0038, 0x0039, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044,
+ /* U+00B0 */ 0xA1E3, 0xA1C0, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0xA1A4,
+ /* U+00B8 */ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ /* U+00C0 */ 0x0058, 0x0059, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ /* U+00C8 */ 0x0066, 0x0067, 0x0068, 0x0069, 0x0070, 0x0071, 0x0072, 0x0073,
+ /* U+00D0 */ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x0080, 0xA1C1,
+ /* U+00D8 */ 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088,
+ /* U+00E0 */ 0xA8A4, 0xA8A2, 0x0089, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094,
+ /* U+00E8 */ 0xA8A8, 0xA8A6, 0xA8BA, 0x0095, 0xA8AC, 0xA8AA, 0x0096, 0x0097,
+ /* U+00F0 */ 0x0098, 0x0099, 0xA8B0, 0xA8AE, 0x00A0, 0x00A1, 0x00A2, 0xA1C2,
+ /* U+00F8 */ 0x00A3, 0xA8B4, 0xA8B2, 0x00A4, 0xA8B9, 0x00A5, 0x00A6, 0x00A7,
+ /* U+0100 */ 0x00A8, 0xA8A1, 0x00A9, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4,
+ /* U+0108 */ 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00C0, 0x00C1, 0x00C2,
+ /* U+0110 */ 0x00C3, 0x00C4, 0x00C5, 0xA8A5, 0x00C6, 0x00C7, 0x00C8, 0x00C9,
+ /* U+0118 */ 0x00D0, 0x00D1, 0x00D2, 0xA8A7, 0x00D3, 0x00D4, 0x00D5, 0x00D6,
+ /* U+0120 */ 0x00D7, 0x00D8, 0x00D9, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4,
+ /* U+0128 */ 0x00E5, 0x00E6, 0x00E7, 0xA8A9, 0x00E8, 0x00E9, 0x00F0, 0x00F1,
+ /* U+0130 */ 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9,
+ /* U+0138 */ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107,
+ /* U+0140 */ 0x0108, 0x0109, 0x0110, 0x0111, 0xA8BD, 0x0112, 0x0113, 0x0114,
+ /* U+0148 */ 0xA8BE, 0x0115, 0x0116, 0x0117, 0x0118, 0xA8AD, 0x0119, 0x0120,
+ /* U+0150 */ 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127, 0x0128,
+ /* U+0158 */ 0x0129, 0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136,
+ /* U+0160 */ 0x0137, 0x0138, 0x0139, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144,
+ /* U+0168 */ 0x0145, 0x0146, 0x0147, 0xA8B1, 0x0148, 0x0149, 0x0150, 0x0151,
+ /* U+0170 */ 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159,
+ /* U+0178 */ 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0166, 0x0167,
+ /* U+0180 */ 0x0168, 0x0169, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175,
+ /* U+0188 */ 0x0176, 0x0177, 0x0178, 0x0179, 0x0180, 0x0181, 0x0182, 0x0183,
+ /* U+0190 */ 0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x0190, 0x0191,
+ /* U+0198 */ 0x0192, 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199,
+ /* U+01A0 */ 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4, 0x01A5, 0x01A6, 0x01A7,
+ /* U+01A8 */ 0x01A8, 0x01A9, 0x01B0, 0x01B1, 0x01B2, 0x01B3, 0x01B4, 0x01B5,
+ /* U+01B0 */ 0x01B6, 0x01B7, 0x01B8, 0x01B9, 0x01C0, 0x01C1, 0x01C2, 0x01C3,
+ /* U+01B8 */ 0x01C4, 0x01C5, 0x01C6, 0x01C7, 0x01C8, 0x01C9, 0x01D0, 0x01D1,
+ /* U+01C0 */ 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, 0x01D8, 0x01D9,
+ /* U+01C8 */ 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E4, 0x01E5, 0xA8A3, 0x01E6,
+ /* U+01D0 */ 0xA8AB, 0x01E7, 0xA8AF, 0x01E8, 0xA8B3, 0x01E9, 0xA8B5, 0x01F0,
+ /* U+01D8 */ 0xA8B6, 0x01F1, 0xA8B7, 0x01F2, 0xA8B8, 0x01F3, 0x01F4, 0x01F5,
+ /* U+01E0 */ 0x01F6, 0x01F7, 0x01F8, 0x01F9, 0x0200, 0x0201, 0x0202, 0x0203,
+ /* U+01E8 */ 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, 0x0210, 0x0211,
+ /* U+01F0 */ 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217, 0x0218, 0x0219,
+ /* U+01F8 */ 0x0220, 0xA8BF, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226,
+ /* U+0200 */ 0x0227, 0x0228, 0x0229, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234,
+ /* U+0208 */ 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, 0x0240, 0x0241, 0x0242,
+ /* U+0210 */ 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, 0x0250,
+ /* U+0218 */ 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0258,
+ /* U+0220 */ 0x0259, 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266,
+ /* U+0228 */ 0x0267, 0x0268, 0x0269, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274,
+ /* U+0230 */ 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, 0x0280, 0x0281, 0x0282,
+ /* U+0238 */ 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x0290,
+ /* U+0240 */ 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298,
+ /* U+0248 */ 0x0299, 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4, 0x02A5, 0x02A6,
+ /* U+0250 */ 0x02A7, 0xA8BB, 0x02A8, 0x02A9, 0x02B0, 0x02B1, 0x02B2, 0x02B3,
+ /* U+0258 */ 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8, 0x02B9, 0x02C0, 0x02C1,
+ /* U+0260 */ 0x02C2, 0xA8C0, 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C7, 0x02C8,
+ /* U+0268 */ 0x02C9, 0x02D0, 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5, 0x02D6,
+ /* U+0270 */ 0x02D7, 0x02D8, 0x02D9, 0x02E0, 0x02E1, 0x02E2, 0x02E3, 0x02E4,
+ /* U+0278 */ 0x02E5, 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02F0, 0x02F1, 0x02F2,
+ /* U+0280 */ 0x02F3, 0x02F4, 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9, 0x0300,
+ /* U+0288 */ 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308,
+ /* U+0290 */ 0x0309, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316,
+ /* U+0298 */ 0x0317, 0x0318, 0x0319, 0x0320, 0x0321, 0x0322, 0x0323, 0x0324,
+ /* U+02A0 */ 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x0330, 0x0331, 0x0332,
+ /* U+02A8 */ 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x0340,
+ /* U+02B0 */ 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348,
+ /* U+02B8 */ 0x0349, 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356,
+ /* U+02C0 */ 0x0357, 0x0358, 0x0359, 0x0360, 0x0361, 0x0362, 0x0363, 0xA1A6,
+ /* U+02C8 */ 0x0364, 0xA1A5, 0xA840, 0xA841, 0x0365, 0x0366, 0x0367, 0x0368,
+ /* U+02D0 */ 0x0369, 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376,
+ /* U+02D8 */ 0x0377, 0xA842, 0x0378, 0x0379, 0x0380, 0x0381, 0x0382, 0x0383,
+ /* U+02E0 */ 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x0390, 0x0391,
+ /* U+02E8 */ 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,
+ /* U+02F0 */ 0x03A0, 0x03A1, 0x03A2, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+ /* U+02F8 */ 0x03A8, 0x03A9, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,
+ /* U+0300 */ 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03C0, 0x03C1, 0x03C2, 0x03C3,
+ /* U+0308 */ 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03D0, 0x03D1,
+ /* U+0310 */ 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8, 0x03D9,
+ /* U+0318 */ 0x03E0, 0x03E1, 0x03E2, 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7,
+ /* U+0320 */ 0x03E8, 0x03E9, 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5,
+ /* U+0328 */ 0x03F6, 0x03F7, 0x03F8, 0x03F9, 0x0400, 0x0401, 0x0402, 0x0403,
+ /* U+0330 */ 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x0410, 0x0411,
+ /* U+0338 */ 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419,
+ /* U+0340 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ /* U+0348 */ 0x0428, 0x0429, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435,
+ /* U+0350 */ 0x0436, 0x0437, 0x0438, 0x0439, 0x0440, 0x0441, 0x0442, 0x0443,
+ /* U+0358 */ 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x0450, 0x0451,
+ /* U+0360 */ 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459,
+ /* U+0368 */ 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467,
+ /* U+0370 */ 0x0468, 0x0469, 0x0470, 0x0471, 0x0472, 0x0473, 0x0474, 0x0475,
+ /* U+0378 */ 0x0476, 0x0477, 0x0478, 0x0479, 0x0480, 0x0481, 0x0482, 0x0483,
+ /* U+0380 */ 0x0484, 0x0485, 0x0486, 0x0487, 0x0488, 0x0489, 0x0490, 0x0491,
+ /* U+0388 */ 0x0492, 0x0493, 0x0494, 0x0495, 0x0496, 0x0497, 0x0498, 0x0499,
+ /* U+0390 */ 0x04A0, 0xA6A1, 0xA6A2, 0xA6A3, 0xA6A4, 0xA6A5, 0xA6A6, 0xA6A7,
+ /* U+0398 */ 0xA6A8, 0xA6A9, 0xA6AA, 0xA6AB, 0xA6AC, 0xA6AD, 0xA6AE, 0xA6AF,
+ /* U+03A0 */ 0xA6B0, 0xA6B1, 0x04A1, 0xA6B2, 0xA6B3, 0xA6B4, 0xA6B5, 0xA6B6,
+ /* U+03A8 */ 0xA6B7, 0xA6B8, 0x04A2, 0x04A3, 0x04A4, 0x04A5, 0x04A6, 0x04A7,
+ /* U+03B0 */ 0x04A8, 0xA6C1, 0xA6C2, 0xA6C3, 0xA6C4, 0xA6C5, 0xA6C6, 0xA6C7,
+ /* U+03B8 */ 0xA6C8, 0xA6C9, 0xA6CA, 0xA6CB, 0xA6CC, 0xA6CD, 0xA6CE, 0xA6CF,
+ /* U+03C0 */ 0xA6D0, 0xA6D1, 0x04A9, 0xA6D2, 0xA6D3, 0xA6D4, 0xA6D5, 0xA6D6,
+ /* U+03C8 */ 0xA6D7, 0xA6D8, 0x04B0, 0x04B1, 0x04B2, 0x04B3, 0x04B4, 0x04B5,
+ /* U+03D0 */ 0x04B6, 0x04B7, 0x04B8, 0x04B9, 0x04C0, 0x04C1, 0x04C2, 0x04C3,
+ /* U+03D8 */ 0x04C4, 0x04C5, 0x04C6, 0x04C7, 0x04C8, 0x04C9, 0x04D0, 0x04D1,
+ /* U+03E0 */ 0x04D2, 0x04D3, 0x04D4, 0x04D5, 0x04D6, 0x04D7, 0x04D8, 0x04D9,
+ /* U+03E8 */ 0x04E0, 0x04E1, 0x04E2, 0x04E3, 0x04E4, 0x04E5, 0x04E6, 0x04E7,
+ /* U+03F0 */ 0x04E8, 0x04E9, 0x04F0, 0x04F1, 0x04F2, 0x04F3, 0x04F4, 0x04F5,
+ /* U+03F8 */ 0x04F6, 0x04F7, 0x04F8, 0x04F9, 0x0500, 0x0501, 0x0502, 0x0503,
+ /* U+0400 */ 0x0504, 0xA7A7, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, 0x0510,
+ /* U+0408 */ 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, 0x0518,
+ /* U+0410 */ 0xA7A1, 0xA7A2, 0xA7A3, 0xA7A4, 0xA7A5, 0xA7A6, 0xA7A8, 0xA7A9,
+ /* U+0418 */ 0xA7AA, 0xA7AB, 0xA7AC, 0xA7AD, 0xA7AE, 0xA7AF, 0xA7B0, 0xA7B1,
+ /* U+0420 */ 0xA7B2, 0xA7B3, 0xA7B4, 0xA7B5, 0xA7B6, 0xA7B7, 0xA7B8, 0xA7B9,
+ /* U+0428 */ 0xA7BA, 0xA7BB, 0xA7BC, 0xA7BD, 0xA7BE, 0xA7BF, 0xA7C0, 0xA7C1,
+ /* U+0430 */ 0xA7D1, 0xA7D2, 0xA7D3, 0xA7D4, 0xA7D5, 0xA7D6, 0xA7D8, 0xA7D9,
+ /* U+0438 */ 0xA7DA, 0xA7DB, 0xA7DC, 0xA7DD, 0xA7DE, 0xA7DF, 0xA7E0, 0xA7E1,
+ /* U+0440 */ 0xA7E2, 0xA7E3, 0xA7E4, 0xA7E5, 0xA7E6, 0xA7E7, 0xA7E8, 0xA7E9,
+ /* U+0448 */ 0xA7EA, 0xA7EB, 0xA7EC, 0xA7ED, 0xA7EE, 0xA7EF, 0xA7F0, 0xA7F1,
+ /* U+0450 */ 0x0519, 0xA7D7,
+ /* Contiguous area: U+2010 .. U+2642 */
+ /* U+2010 */ 0xA95C, 0x0A42, 0x0A43, 0xA843, 0xA1AA, 0xA844, 0xA1AC, 0x0A44,
+ /* U+2018 */ 0xA1AE, 0xA1AF, 0x0A45, 0x0A46, 0xA1B0, 0xA1B1, 0x0A47, 0x0A48,
+ /* U+2020 */ 0x0A49, 0x0A50, 0x0A51, 0x0A52, 0x0A53, 0xA845, 0xA1AD, 0x0A54,
+ /* U+2028 */ 0x0A55, 0x0A56, 0x0A57, 0x0A58, 0x0A59, 0x0A60, 0x0A61, 0x0A62,
+ /* U+2030 */ 0xA1EB, 0x0A63, 0xA1E4, 0xA1E5, 0x0A64, 0xA846, 0x0A65, 0x0A66,
+ /* U+2038 */ 0x0A67, 0x0A68, 0x0A69, 0xA1F9, 0x0A70, 0x0A71, 0x0A72, 0x0A73,
+ /* U+2040 */ 0x0A74, 0x0A75, 0x0A76, 0x0A77, 0x0A78, 0x0A79, 0x0A80, 0x0A81,
+ /* U+2048 */ 0x0A82, 0x0A83, 0x0A84, 0x0A85, 0x0A86, 0x0A87, 0x0A88, 0x0A89,
+ /* U+2050 */ 0x0A90, 0x0A91, 0x0A92, 0x0A93, 0x0A94, 0x0A95, 0x0A96, 0x0A97,
+ /* U+2058 */ 0x0A98, 0x0A99, 0x0AA0, 0x0AA1, 0x0AA2, 0x0AA3, 0x0AA4, 0x0AA5,
+ /* U+2060 */ 0x0AA6, 0x0AA7, 0x0AA8, 0x0AA9, 0x0AB0, 0x0AB1, 0x0AB2, 0x0AB3,
+ /* U+2068 */ 0x0AB4, 0x0AB5, 0x0AB6, 0x0AB7, 0x0AB8, 0x0AB9, 0x0AC0, 0x0AC1,
+ /* U+2070 */ 0x0AC2, 0x0AC3, 0x0AC4, 0x0AC5, 0x0AC6, 0x0AC7, 0x0AC8, 0x0AC9,
+ /* U+2078 */ 0x0AD0, 0x0AD1, 0x0AD2, 0x0AD3, 0x0AD4, 0x0AD5, 0x0AD6, 0x0AD7,
+ /* U+2080 */ 0x0AD8, 0x0AD9, 0x0AE0, 0x0AE1, 0x0AE2, 0x0AE3, 0x0AE4, 0x0AE5,
+ /* U+2088 */ 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AF0, 0x0AF1, 0x0AF2, 0x0AF3,
+ /* U+2090 */ 0x0AF4, 0x0AF5, 0x0AF6, 0x0AF7, 0x0AF8, 0x0AF9, 0x0B00, 0x0B01,
+ /* U+2098 */ 0x0B02, 0x0B03, 0x0B04, 0x0B05, 0x0B06, 0x0B07, 0x0B08, 0x0B09,
+ /* U+20A0 */ 0x0B10, 0x0B11, 0x0B12, 0x0B13, 0x0B14, 0x0B15, 0x0B16, 0x0B17,
+ /* U+20A8 */ 0x0B18, 0x0B19, 0x0B20, 0x0B21, 0xA2E3, 0x0B22, 0x0B23, 0x0B24,
+ /* U+20B0 */ 0x0B25, 0x0B26, 0x0B27, 0x0B28, 0x0B29, 0x0B30, 0x0B31, 0x0B32,
+ /* U+20B8 */ 0x0B33, 0x0B34, 0x0B35, 0x0B36, 0x0B37, 0x0B38, 0x0B39, 0x0B40,
+ /* U+20C0 */ 0x0B41, 0x0B42, 0x0B43, 0x0B44, 0x0B45, 0x0B46, 0x0B47, 0x0B48,
+ /* U+20C8 */ 0x0B49, 0x0B50, 0x0B51, 0x0B52, 0x0B53, 0x0B54, 0x0B55, 0x0B56,
+ /* U+20D0 */ 0x0B57, 0x0B58, 0x0B59, 0x0B60, 0x0B61, 0x0B62, 0x0B63, 0x0B64,
+ /* U+20D8 */ 0x0B65, 0x0B66, 0x0B67, 0x0B68, 0x0B69, 0x0B70, 0x0B71, 0x0B72,
+ /* U+20E0 */ 0x0B73, 0x0B74, 0x0B75, 0x0B76, 0x0B77, 0x0B78, 0x0B79, 0x0B80,
+ /* U+20E8 */ 0x0B81, 0x0B82, 0x0B83, 0x0B84, 0x0B85, 0x0B86, 0x0B87, 0x0B88,
+ /* U+20F0 */ 0x0B89, 0x0B90, 0x0B91, 0x0B92, 0x0B93, 0x0B94, 0x0B95, 0x0B96,
+ /* U+20F8 */ 0x0B97, 0x0B98, 0x0B99, 0x0BA0, 0x0BA1, 0x0BA2, 0x0BA3, 0x0BA4,
+ /* U+2100 */ 0x0BA5, 0x0BA6, 0x0BA7, 0xA1E6, 0x0BA8, 0xA847, 0x0BA9, 0x0BB0,
+ /* U+2108 */ 0x0BB1, 0xA848, 0x0BB2, 0x0BB3, 0x0BB4, 0x0BB5, 0x0BB6, 0x0BB7,
+ /* U+2110 */ 0x0BB8, 0x0BB9, 0x0BC0, 0x0BC1, 0x0BC2, 0x0BC3, 0xA1ED, 0x0BC4,
+ /* U+2118 */ 0x0BC5, 0x0BC6, 0x0BC7, 0x0BC8, 0x0BC9, 0x0BD0, 0x0BD1, 0x0BD2,
+ /* U+2120 */ 0x0BD3, 0xA959, 0x0BD4, 0x0BD5, 0x0BD6, 0x0BD7, 0x0BD8, 0x0BD9,
+ /* U+2128 */ 0x0BE0, 0x0BE1, 0x0BE2, 0x0BE3, 0x0BE4, 0x0BE5, 0x0BE6, 0x0BE7,
+ /* U+2130 */ 0x0BE8, 0x0BE9, 0x0BF0, 0x0BF1, 0x0BF2, 0x0BF3, 0x0BF4, 0x0BF5,
+ /* U+2138 */ 0x0BF6, 0x0BF7, 0x0BF8, 0x0BF9, 0x0C00, 0x0C01, 0x0C02, 0x0C03,
+ /* U+2140 */ 0x0C04, 0x0C05, 0x0C06, 0x0C07, 0x0C08, 0x0C09, 0x0C10, 0x0C11,
+ /* U+2148 */ 0x0C12, 0x0C13, 0x0C14, 0x0C15, 0x0C16, 0x0C17, 0x0C18, 0x0C19,
+ /* U+2150 */ 0x0C20, 0x0C21, 0x0C22, 0x0C23, 0x0C24, 0x0C25, 0x0C26, 0x0C27,
+ /* U+2158 */ 0x0C28, 0x0C29, 0x0C30, 0x0C31, 0x0C32, 0x0C33, 0x0C34, 0x0C35,
+ /* U+2160 */ 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8,
+ /* U+2168 */ 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0x0C36, 0x0C37, 0x0C38, 0x0C39,
+ /* U+2170 */ 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8,
+ /* U+2178 */ 0xA2A9, 0xA2AA, 0x0C40, 0x0C41, 0x0C42, 0x0C43, 0x0C44, 0x0C45,
+ /* U+2180 */ 0x0C46, 0x0C47, 0x0C48, 0x0C49, 0x0C50, 0x0C51, 0x0C52, 0x0C53,
+ /* U+2188 */ 0x0C54, 0x0C55, 0x0C56, 0x0C57, 0x0C58, 0x0C59, 0x0C60, 0x0C61,
+ /* U+2190 */ 0xA1FB, 0xA1FC, 0xA1FA, 0xA1FD, 0x0C62, 0x0C63, 0xA849, 0xA84A,
+ /* U+2198 */ 0xA84B, 0xA84C, 0x0C64, 0x0C65, 0x0C66, 0x0C67, 0x0C68, 0x0C69,
+ /* U+21A0 */ 0x0C70, 0x0C71, 0x0C72, 0x0C73, 0x0C74, 0x0C75, 0x0C76, 0x0C77,
+ /* U+21A8 */ 0x0C78, 0x0C79, 0x0C80, 0x0C81, 0x0C82, 0x0C83, 0x0C84, 0x0C85,
+ /* U+21B0 */ 0x0C86, 0x0C87, 0x0C88, 0x0C89, 0x0C90, 0x0C91, 0x0C92, 0x0C93,
+ /* U+21B8 */ 0x0C94, 0x0C95, 0x0C96, 0x0C97, 0x0C98, 0x0C99, 0x0CA0, 0x0CA1,
+ /* U+21C0 */ 0x0CA2, 0x0CA3, 0x0CA4, 0x0CA5, 0x0CA6, 0x0CA7, 0x0CA8, 0x0CA9,
+ /* U+21C8 */ 0x0CB0, 0x0CB1, 0x0CB2, 0x0CB3, 0x0CB4, 0x0CB5, 0x0CB6, 0x0CB7,
+ /* U+21D0 */ 0x0CB8, 0x0CB9, 0x0CC0, 0x0CC1, 0x0CC2, 0x0CC3, 0x0CC4, 0x0CC5,
+ /* U+21D8 */ 0x0CC6, 0x0CC7, 0x0CC8, 0x0CC9, 0x0CD0, 0x0CD1, 0x0CD2, 0x0CD3,
+ /* U+21E0 */ 0x0CD4, 0x0CD5, 0x0CD6, 0x0CD7, 0x0CD8, 0x0CD9, 0x0CE0, 0x0CE1,
+ /* U+21E8 */ 0x0CE2, 0x0CE3, 0x0CE4, 0x0CE5, 0x0CE6, 0x0CE7, 0x0CE8, 0x0CE9,
+ /* U+21F0 */ 0x0CF0, 0x0CF1, 0x0CF2, 0x0CF3, 0x0CF4, 0x0CF5, 0x0CF6, 0x0CF7,
+ /* U+21F8 */ 0x0CF8, 0x0CF9, 0x0D00, 0x0D01, 0x0D02, 0x0D03, 0x0D04, 0x0D05,
+ /* U+2200 */ 0x0D06, 0x0D07, 0x0D08, 0x0D09, 0x0D10, 0x0D11, 0x0D12, 0x0D13,
+ /* U+2208 */ 0xA1CA, 0x0D14, 0x0D15, 0x0D16, 0x0D17, 0x0D18, 0x0D19, 0xA1C7,
+ /* U+2210 */ 0x0D20, 0xA1C6, 0x0D21, 0x0D22, 0x0D23, 0xA84D, 0x0D24, 0x0D25,
+ /* U+2218 */ 0x0D26, 0x0D27, 0xA1CC, 0x0D28, 0x0D29, 0xA1D8, 0xA1DE, 0xA84E,
+ /* U+2220 */ 0xA1CF, 0x0D30, 0x0D31, 0xA84F, 0x0D32, 0xA1CE, 0x0D33, 0xA1C4,
+ /* U+2228 */ 0xA1C5, 0xA1C9, 0xA1C8, 0xA1D2, 0x0D34, 0x0D35, 0xA1D3, 0x0D36,
+ /* U+2230 */ 0x0D37, 0x0D38, 0x0D39, 0x0D40, 0xA1E0, 0xA1DF, 0xA1C3, 0xA1CB,
+ /* U+2238 */ 0x0D41, 0x0D42, 0x0D43, 0x0D44, 0x0D45, 0xA1D7, 0x0D46, 0x0D47,
+ /* U+2240 */ 0x0D48, 0x0D49, 0x0D50, 0x0D51, 0x0D52, 0x0D53, 0x0D54, 0x0D55,
+ /* U+2248 */ 0xA1D6, 0x0D56, 0x0D57, 0x0D58, 0xA1D5, 0x0D59, 0x0D60, 0x0D61,
+ /* U+2250 */ 0x0D62, 0x0D63, 0xA850, 0x0D64, 0x0D65, 0x0D66, 0x0D67, 0x0D68,
+ /* U+2258 */ 0x0D69, 0x0D70, 0x0D71, 0x0D72, 0x0D73, 0x0D74, 0x0D75, 0x0D76,
+ /* U+2260 */ 0xA1D9, 0xA1D4, 0x0D77, 0x0D78, 0xA1DC, 0xA1DD, 0xA851, 0xA852,
+ /* U+2268 */ 0x0D79, 0x0D80, 0x0D81, 0x0D82, 0x0D83, 0x0D84, 0xA1DA, 0xA1DB,
+ /* U+2270 */ 0x0D85, 0x0D86, 0x0D87, 0x0D88, 0x0D89, 0x0D90, 0x0D91, 0x0D92,
+ /* U+2278 */ 0x0D93, 0x0D94, 0x0D95, 0x0D96, 0x0D97, 0x0D98, 0x0D99, 0x0DA0,
+ /* U+2280 */ 0x0DA1, 0x0DA2, 0x0DA3, 0x0DA4, 0x0DA5, 0x0DA6, 0x0DA7, 0x0DA8,
+ /* U+2288 */ 0x0DA9, 0x0DB0, 0x0DB1, 0x0DB2, 0x0DB3, 0x0DB4, 0x0DB5, 0x0DB6,
+ /* U+2290 */ 0x0DB7, 0x0DB8, 0x0DB9, 0x0DC0, 0x0DC1, 0xA892, 0x0DC2, 0x0DC3,
+ /* U+2298 */ 0x0DC4, 0xA1D1, 0x0DC5, 0x0DC6, 0x0DC7, 0x0DC8, 0x0DC9, 0x0DD0,
+ /* U+22A0 */ 0x0DD1, 0x0DD2, 0x0DD3, 0x0DD4, 0x0DD5, 0xA1CD, 0x0DD6, 0x0DD7,
+ /* U+22A8 */ 0x0DD8, 0x0DD9, 0x0DE0, 0x0DE1, 0x0DE2, 0x0DE3, 0x0DE4, 0x0DE5,
+ /* U+22B0 */ 0x0DE6, 0x0DE7, 0x0DE8, 0x0DE9, 0x0DF0, 0x0DF1, 0x0DF2, 0x0DF3,
+ /* U+22B8 */ 0x0DF4, 0x0DF5, 0x0DF6, 0x0DF7, 0x0DF8, 0x0DF9, 0x0E00, 0xA853,
+ /* U+22C0 */ 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08,
+ /* U+22C8 */ 0x0E09, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16,
+ /* U+22D0 */ 0x0E17, 0x0E18, 0x0E19, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24,
+ /* U+22D8 */ 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E30, 0x0E31, 0x0E32,
+ /* U+22E0 */ 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E40,
+ /* U+22E8 */ 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48,
+ /* U+22F0 */ 0x0E49, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56,
+ /* U+22F8 */ 0x0E57, 0x0E58, 0x0E59, 0x0E60, 0x0E61, 0x0E62, 0x0E63, 0x0E64,
+ /* U+2300 */ 0x0E65, 0x0E66, 0x0E67, 0x0E68, 0x0E69, 0x0E70, 0x0E71, 0x0E72,
+ /* U+2308 */ 0x0E73, 0x0E74, 0x0E75, 0x0E76, 0x0E77, 0x0E78, 0x0E79, 0x0E80,
+ /* U+2310 */ 0x0E81, 0x0E82, 0xA1D0, 0x0E83, 0x0E84, 0x0E85, 0x0E86, 0x0E87,
+ /* U+2318 */ 0x0E88, 0x0E89, 0x0E90, 0x0E91, 0x0E92, 0x0E93, 0x0E94, 0x0E95,
+ /* U+2320 */ 0x0E96, 0x0E97, 0x0E98, 0x0E99, 0x0EA0, 0x0EA1, 0x0EA2, 0x0EA3,
+ /* U+2328 */ 0x0EA4, 0x0EA5, 0x0EA6, 0x0EA7, 0x0EA8, 0x0EA9, 0x0EB0, 0x0EB1,
+ /* U+2330 */ 0x0EB2, 0x0EB3, 0x0EB4, 0x0EB5, 0x0EB6, 0x0EB7, 0x0EB8, 0x0EB9,
+ /* U+2338 */ 0x0EC0, 0x0EC1, 0x0EC2, 0x0EC3, 0x0EC4, 0x0EC5, 0x0EC6, 0x0EC7,
+ /* U+2340 */ 0x0EC8, 0x0EC9, 0x0ED0, 0x0ED1, 0x0ED2, 0x0ED3, 0x0ED4, 0x0ED5,
+ /* U+2348 */ 0x0ED6, 0x0ED7, 0x0ED8, 0x0ED9, 0x0EE0, 0x0EE1, 0x0EE2, 0x0EE3,
+ /* U+2350 */ 0x0EE4, 0x0EE5, 0x0EE6, 0x0EE7, 0x0EE8, 0x0EE9, 0x0EF0, 0x0EF1,
+ /* U+2358 */ 0x0EF2, 0x0EF3, 0x0EF4, 0x0EF5, 0x0EF6, 0x0EF7, 0x0EF8, 0x0EF9,
+ /* U+2360 */ 0x0F00, 0x0F01, 0x0F02, 0x0F03, 0x0F04, 0x0F05, 0x0F06, 0x0F07,
+ /* U+2368 */ 0x0F08, 0x0F09, 0x0F10, 0x0F11, 0x0F12, 0x0F13, 0x0F14, 0x0F15,
+ /* U+2370 */ 0x0F16, 0x0F17, 0x0F18, 0x0F19, 0x0F20, 0x0F21, 0x0F22, 0x0F23,
+ /* U+2378 */ 0x0F24, 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29, 0x0F30, 0x0F31,
+ /* U+2380 */ 0x0F32, 0x0F33, 0x0F34, 0x0F35, 0x0F36, 0x0F37, 0x0F38, 0x0F39,
+ /* U+2388 */ 0x0F40, 0x0F41, 0x0F42, 0x0F43, 0x0F44, 0x0F45, 0x0F46, 0x0F47,
+ /* U+2390 */ 0x0F48, 0x0F49, 0x0F50, 0x0F51, 0x0F52, 0x0F53, 0x0F54, 0x0F55,
+ /* U+2398 */ 0x0F56, 0x0F57, 0x0F58, 0x0F59, 0x0F60, 0x0F61, 0x0F62, 0x0F63,
+ /* U+23A0 */ 0x0F64, 0x0F65, 0x0F66, 0x0F67, 0x0F68, 0x0F69, 0x0F70, 0x0F71,
+ /* U+23A8 */ 0x0F72, 0x0F73, 0x0F74, 0x0F75, 0x0F76, 0x0F77, 0x0F78, 0x0F79,
+ /* U+23B0 */ 0x0F80, 0x0F81, 0x0F82, 0x0F83, 0x0F84, 0x0F85, 0x0F86, 0x0F87,
+ /* U+23B8 */ 0x0F88, 0x0F89, 0x0F90, 0x0F91, 0x0F92, 0x0F93, 0x0F94, 0x0F95,
+ /* U+23C0 */ 0x0F96, 0x0F97, 0x0F98, 0x0F99, 0x0FA0, 0x0FA1, 0x0FA2, 0x0FA3,
+ /* U+23C8 */ 0x0FA4, 0x0FA5, 0x0FA6, 0x0FA7, 0x0FA8, 0x0FA9, 0x0FB0, 0x0FB1,
+ /* U+23D0 */ 0x0FB2, 0x0FB3, 0x0FB4, 0x0FB5, 0x0FB6, 0x0FB7, 0x0FB8, 0x0FB9,
+ /* U+23D8 */ 0x0FC0, 0x0FC1, 0x0FC2, 0x0FC3, 0x0FC4, 0x0FC5, 0x0FC6, 0x0FC7,
+ /* U+23E0 */ 0x0FC8, 0x0FC9, 0x0FD0, 0x0FD1, 0x0FD2, 0x0FD3, 0x0FD4, 0x0FD5,
+ /* U+23E8 */ 0x0FD6, 0x0FD7, 0x0FD8, 0x0FD9, 0x1000, 0x1001, 0x1002, 0x1003,
+ /* U+23F0 */ 0x1004, 0x1005, 0x1006, 0x1007, 0x1008, 0x1009, 0x1010, 0x1011,
+ /* U+23F8 */ 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, 0x1018, 0x1019,
+ /* U+2400 */ 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027,
+ /* U+2408 */ 0x1028, 0x1029, 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035,
+ /* U+2410 */ 0x1036, 0x1037, 0x1038, 0x1039, 0x1040, 0x1041, 0x1042, 0x1043,
+ /* U+2418 */ 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049, 0x1050, 0x1051,
+ /* U+2420 */ 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, 0x1059,
+ /* U+2428 */ 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067,
+ /* U+2430 */ 0x1068, 0x1069, 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075,
+ /* U+2438 */ 0x1076, 0x1077, 0x1078, 0x1079, 0x1080, 0x1081, 0x1082, 0x1083,
+ /* U+2440 */ 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x1090, 0x1091,
+ /* U+2448 */ 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, 0x1098, 0x1099,
+ /* U+2450 */ 0x10A0, 0x10A1, 0x10A2, 0x10A3, 0x10A4, 0x10A5, 0x10A6, 0x10A7,
+ /* U+2458 */ 0x10A8, 0x10A9, 0x10B0, 0x10B1, 0x10B2, 0x10B3, 0x10B4, 0x10B5,
+ /* U+2460 */ 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, 0xA2DF, 0xA2E0,
+ /* U+2468 */ 0xA2E1, 0xA2E2, 0x10B6, 0x10B7, 0x10B8, 0x10B9, 0x10C0, 0x10C1,
+ /* U+2470 */ 0x10C2, 0x10C3, 0x10C4, 0x10C5, 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8,
+ /* U+2478 */ 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE, 0xA2CF, 0xA2D0,
+ /* U+2480 */ 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, 0xA2D6, 0xA2D7, 0xA2D8,
+ /* U+2488 */ 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7, 0xA2B8,
+ /* U+2490 */ 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF, 0xA2C0,
+ /* U+2498 */ 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4, 0x10C6, 0x10C7, 0x10C8, 0x10C9,
+ /* U+24A0 */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7,
+ /* U+24A8 */ 0x10D8, 0x10D9, 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5,
+ /* U+24B0 */ 0x10E6, 0x10E7, 0x10E8, 0x10E9, 0x10F0, 0x10F1, 0x10F2, 0x10F3,
+ /* U+24B8 */ 0x10F4, 0x10F5, 0x10F6, 0x10F7, 0x10F8, 0x10F9, 0x1100, 0x1101,
+ /* U+24C0 */ 0x1102, 0x1103, 0x1104, 0x1105, 0x1106, 0x1107, 0x1108, 0x1109,
+ /* U+24C8 */ 0x1110, 0x1111, 0x1112, 0x1113, 0x1114, 0x1115, 0x1116, 0x1117,
+ /* U+24D0 */ 0x1118, 0x1119, 0x1120, 0x1121, 0x1122, 0x1123, 0x1124, 0x1125,
+ /* U+24D8 */ 0x1126, 0x1127, 0x1128, 0x1129, 0x1130, 0x1131, 0x1132, 0x1133,
+ /* U+24E0 */ 0x1134, 0x1135, 0x1136, 0x1137, 0x1138, 0x1139, 0x1140, 0x1141,
+ /* U+24E8 */ 0x1142, 0x1143, 0x1144, 0x1145, 0x1146, 0x1147, 0x1148, 0x1149,
+ /* U+24F0 */ 0x1150, 0x1151, 0x1152, 0x1153, 0x1154, 0x1155, 0x1156, 0x1157,
+ /* U+24F8 */ 0x1158, 0x1159, 0x1160, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165,
+ /* U+2500 */ 0xA9A4, 0xA9A5, 0xA9A6, 0xA9A7, 0xA9A8, 0xA9A9, 0xA9AA, 0xA9AB,
+ /* U+2508 */ 0xA9AC, 0xA9AD, 0xA9AE, 0xA9AF, 0xA9B0, 0xA9B1, 0xA9B2, 0xA9B3,
+ /* U+2510 */ 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7, 0xA9B8, 0xA9B9, 0xA9BA, 0xA9BB,
+ /* U+2518 */ 0xA9BC, 0xA9BD, 0xA9BE, 0xA9BF, 0xA9C0, 0xA9C1, 0xA9C2, 0xA9C3,
+ /* U+2520 */ 0xA9C4, 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, 0xA9C9, 0xA9CA, 0xA9CB,
+ /* U+2528 */ 0xA9CC, 0xA9CD, 0xA9CE, 0xA9CF, 0xA9D0, 0xA9D1, 0xA9D2, 0xA9D3,
+ /* U+2530 */ 0xA9D4, 0xA9D5, 0xA9D6, 0xA9D7, 0xA9D8, 0xA9D9, 0xA9DA, 0xA9DB,
+ /* U+2538 */ 0xA9DC, 0xA9DD, 0xA9DE, 0xA9DF, 0xA9E0, 0xA9E1, 0xA9E2, 0xA9E3,
+ /* U+2540 */ 0xA9E4, 0xA9E5, 0xA9E6, 0xA9E7, 0xA9E8, 0xA9E9, 0xA9EA, 0xA9EB,
+ /* U+2548 */ 0xA9EC, 0xA9ED, 0xA9EE, 0xA9EF, 0x1166, 0x1167, 0x1168, 0x1169,
+ /* U+2550 */ 0xA854, 0xA855, 0xA856, 0xA857, 0xA858, 0xA859, 0xA85A, 0xA85B,
+ /* U+2558 */ 0xA85C, 0xA85D, 0xA85E, 0xA85F, 0xA860, 0xA861, 0xA862, 0xA863,
+ /* U+2560 */ 0xA864, 0xA865, 0xA866, 0xA867, 0xA868, 0xA869, 0xA86A, 0xA86B,
+ /* U+2568 */ 0xA86C, 0xA86D, 0xA86E, 0xA86F, 0xA870, 0xA871, 0xA872, 0xA873,
+ /* U+2570 */ 0xA874, 0xA875, 0xA876, 0xA877, 0x1170, 0x1171, 0x1172, 0x1173,
+ /* U+2578 */ 0x1174, 0x1175, 0x1176, 0x1177, 0x1178, 0x1179, 0x1180, 0x1181,
+ /* U+2580 */ 0x1182, 0xA878, 0xA879, 0xA87A, 0xA87B, 0xA87C, 0xA87D, 0xA87E,
+ /* U+2588 */ 0xA880, 0xA881, 0xA882, 0xA883, 0xA884, 0xA885, 0xA886, 0xA887,
+ /* U+2590 */ 0x1183, 0x1184, 0x1185, 0xA888, 0xA889, 0xA88A, 0x1186, 0x1187,
+ /* U+2598 */ 0x1188, 0x1189, 0x1190, 0x1191, 0x1192, 0x1193, 0x1194, 0x1195,
+ /* U+25A0 */ 0xA1F6, 0xA1F5, 0x1196, 0x1197, 0x1198, 0x1199, 0x11A0, 0x11A1,
+ /* U+25A8 */ 0x11A2, 0x11A3, 0x11A4, 0x11A5, 0x11A6, 0x11A7, 0x11A8, 0x11A9,
+ /* U+25B0 */ 0x11B0, 0x11B1, 0xA1F8, 0xA1F7, 0x11B2, 0x11B3, 0x11B4, 0x11B5,
+ /* U+25B8 */ 0x11B6, 0x11B7, 0x11B8, 0x11B9, 0xA88B, 0xA88C, 0x11C0, 0x11C1,
+ /* U+25C0 */ 0x11C2, 0x11C3, 0x11C4, 0x11C5, 0x11C6, 0x11C7, 0xA1F4, 0xA1F3,
+ /* U+25C8 */ 0x11C8, 0x11C9, 0x11D0, 0xA1F0, 0x11D1, 0x11D2, 0xA1F2, 0xA1F1,
+ /* U+25D0 */ 0x11D3, 0x11D4, 0x11D5, 0x11D6, 0x11D7, 0x11D8, 0x11D9, 0x11E0,
+ /* U+25D8 */ 0x11E1, 0x11E2, 0x11E3, 0x11E4, 0x11E5, 0x11E6, 0x11E7, 0x11E8,
+ /* U+25E0 */ 0x11E9, 0x11F0, 0xA88D, 0xA88E, 0xA88F, 0xA890, 0x11F1, 0x11F2,
+ /* U+25E8 */ 0x11F3, 0x11F4, 0x11F5, 0x11F6, 0x11F7, 0x11F8, 0x11F9, 0x1200,
+ /* U+25F0 */ 0x1201, 0x1202, 0x1203, 0x1204, 0x1205, 0x1206, 0x1207, 0x1208,
+ /* U+25F8 */ 0x1209, 0x1210, 0x1211, 0x1212, 0x1213, 0x1214, 0x1215, 0x1216,
+ /* U+2600 */ 0x1217, 0x1218, 0x1219, 0x1220, 0x1221, 0xA1EF, 0xA1EE, 0x1222,
+ /* U+2608 */ 0x1223, 0xA891, 0x1224, 0x1225, 0x1226, 0x1227, 0x1228, 0x1229,
+ /* U+2610 */ 0x1230, 0x1231, 0x1232, 0x1233, 0x1234, 0x1235, 0x1236, 0x1237,
+ /* U+2618 */ 0x1238, 0x1239, 0x1240, 0x1241, 0x1242, 0x1243, 0x1244, 0x1245,
+ /* U+2620 */ 0x1246, 0x1247, 0x1248, 0x1249, 0x1250, 0x1251, 0x1252, 0x1253,
+ /* U+2628 */ 0x1254, 0x1255, 0x1256, 0x1257, 0x1258, 0x1259, 0x1260, 0x1261,
+ /* U+2630 */ 0x1262, 0x1263, 0x1264, 0x1265, 0x1266, 0x1267, 0x1268, 0x1269,
+ /* U+2638 */ 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1276, 0x1277,
+ /* U+2640 */ 0xA1E2, 0x1278, 0xA1E1,
+ /* Contiguous area: U+2E81 .. U+361A */
+ /* U+2E81 */ 0xFE50, 0x1FC9, 0x1FD0, 0xFE54, 0x1FD1, 0x1FD2, 0x1FD3,
+ /* U+2E88 */ 0xFE57, 0x1FD4, 0x1FD5, 0xFE58, 0xFE5D, 0x1FD6, 0x1FD7, 0x1FD8,
+ /* U+2E90 */ 0x1FD9, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0xFE5E,
+ /* U+2E98 */ 0x2006, 0x2007, 0x2008, 0x2009, 0x2010, 0x2011, 0x2012, 0x2013,
+ /* U+2EA0 */ 0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x2020, 0xFE6B,
+ /* U+2EA8 */ 0x2021, 0x2022, 0xFE6E, 0x2023, 0x2024, 0x2025, 0xFE71, 0x2026,
+ /* U+2EB0 */ 0x2027, 0x2028, 0x2029, 0xFE73, 0x2030, 0x2031, 0xFE74, 0xFE75,
+ /* U+2EB8 */ 0x2032, 0x2033, 0x2034, 0xFE79, 0x2035, 0x2036, 0x2037, 0x2038,
+ /* U+2EC0 */ 0x2039, 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046,
+ /* U+2EC8 */ 0x2047, 0x2048, 0xFE84, 0x2049, 0x2050, 0x2051, 0x2052, 0x2053,
+ /* U+2ED0 */ 0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x2060, 0x2061,
+ /* U+2ED8 */ 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, 0x2068, 0x2069,
+ /* U+2EE0 */ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077,
+ /* U+2EE8 */ 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085,
+ /* U+2EF0 */ 0x2086, 0x2087, 0x2088, 0x2089, 0x2090, 0x2091, 0x2092, 0x2093,
+ /* U+2EF8 */ 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x20A0, 0x20A1,
+ /* U+2F00 */ 0x20A2, 0x20A3, 0x20A4, 0x20A5, 0x20A6, 0x20A7, 0x20A8, 0x20A9,
+ /* U+2F08 */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x20B5, 0x20B6, 0x20B7,
+ /* U+2F10 */ 0x20B8, 0x20B9, 0x20C0, 0x20C1, 0x20C2, 0x20C3, 0x20C4, 0x20C5,
+ /* U+2F18 */ 0x20C6, 0x20C7, 0x20C8, 0x20C9, 0x20D0, 0x20D1, 0x20D2, 0x20D3,
+ /* U+2F20 */ 0x20D4, 0x20D5, 0x20D6, 0x20D7, 0x20D8, 0x20D9, 0x20E0, 0x20E1,
+ /* U+2F28 */ 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, 0x20E7, 0x20E8, 0x20E9,
+ /* U+2F30 */ 0x20F0, 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, 0x20F6, 0x20F7,
+ /* U+2F38 */ 0x20F8, 0x20F9, 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105,
+ /* U+2F40 */ 0x2106, 0x2107, 0x2108, 0x2109, 0x2110, 0x2111, 0x2112, 0x2113,
+ /* U+2F48 */ 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x2120, 0x2121,
+ /* U+2F50 */ 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129,
+ /* U+2F58 */ 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137,
+ /* U+2F60 */ 0x2138, 0x2139, 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145,
+ /* U+2F68 */ 0x2146, 0x2147, 0x2148, 0x2149, 0x2150, 0x2151, 0x2152, 0x2153,
+ /* U+2F70 */ 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x2160, 0x2161,
+ /* U+2F78 */ 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169,
+ /* U+2F80 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+ /* U+2F88 */ 0x2178, 0x2179, 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185,
+ /* U+2F90 */ 0x2186, 0x2187, 0x2188, 0x2189, 0x2190, 0x2191, 0x2192, 0x2193,
+ /* U+2F98 */ 0x2194, 0x2195, 0x2196, 0x2197, 0x2198, 0x2199, 0x21A0, 0x21A1,
+ /* U+2FA0 */ 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9,
+ /* U+2FA8 */ 0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7,
+ /* U+2FB0 */ 0x21B8, 0x21B9, 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5,
+ /* U+2FB8 */ 0x21C6, 0x21C7, 0x21C8, 0x21C9, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
+ /* U+2FC0 */ 0x21D4, 0x21D5, 0x21D6, 0x21D7, 0x21D8, 0x21D9, 0x21E0, 0x21E1,
+ /* U+2FC8 */ 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, 0x21E8, 0x21E9,
+ /* U+2FD0 */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7,
+ /* U+2FD8 */ 0x21F8, 0x21F9, 0x2200, 0x2201, 0x2202, 0x2203, 0x2204, 0x2205,
+ /* U+2FE0 */ 0x2206, 0x2207, 0x2208, 0x2209, 0x2210, 0x2211, 0x2212, 0x2213,
+ /* U+2FE8 */ 0x2214, 0x2215, 0x2216, 0x2217, 0x2218, 0x2219, 0x2220, 0x2221,
+ /* U+2FF0 */ 0xA98A, 0xA98B, 0xA98C, 0xA98D, 0xA98E, 0xA98F, 0xA990, 0xA991,
+ /* U+2FF8 */ 0xA992, 0xA993, 0xA994, 0xA995, 0x2222, 0x2223, 0x2224, 0x2225,
+ /* U+3000 */ 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A8, 0x2226, 0xA1A9, 0xA965, 0xA996,
+ /* U+3008 */ 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB,
+ /* U+3010 */ 0xA1BE, 0xA1BF, 0xA893, 0xA1FE, 0xA1B2, 0xA1B3, 0xA1BC, 0xA1BD,
+ /* U+3018 */ 0x2227, 0x2228, 0x2229, 0x2230, 0x2231, 0xA894, 0xA895, 0x2232,
+ /* U+3020 */ 0x2233, 0xA940, 0xA941, 0xA942, 0xA943, 0xA944, 0xA945, 0xA946,
+ /* U+3028 */ 0xA947, 0xA948, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239,
+ /* U+3030 */ 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2245, 0x2246, 0x2247,
+ /* U+3038 */ 0x2248, 0x2249, 0x2250, 0x2251, 0x2252, 0x2253, 0xA989, 0x2254,
+ /* U+3040 */ 0x2255, 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7,
+ /* U+3048 */ 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF,
+ /* U+3050 */ 0xA4B0, 0xA4B1, 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7,
+ /* U+3058 */ 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF,
+ /* U+3060 */ 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7,
+ /* U+3068 */ 0xA4C8, 0xA4C9, 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF,
+ /* U+3070 */ 0xA4D0, 0xA4D1, 0xA4D2, 0xA4D3, 0xA4D4, 0xA4D5, 0xA4D6, 0xA4D7,
+ /* U+3078 */ 0xA4D8, 0xA4D9, 0xA4DA, 0xA4DB, 0xA4DC, 0xA4DD, 0xA4DE, 0xA4DF,
+ /* U+3080 */ 0xA4E0, 0xA4E1, 0xA4E2, 0xA4E3, 0xA4E4, 0xA4E5, 0xA4E6, 0xA4E7,
+ /* U+3088 */ 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, 0xA4ED, 0xA4EE, 0xA4EF,
+ /* U+3090 */ 0xA4F0, 0xA4F1, 0xA4F2, 0xA4F3, 0x2256, 0x2257, 0x2258, 0x2259,
+ /* U+3098 */ 0x2260, 0x2261, 0x2262, 0xA961, 0xA962, 0xA966, 0xA967, 0x2263,
+ /* U+30A0 */ 0x2264, 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, 0xA5A5, 0xA5A6, 0xA5A7,
+ /* U+30A8 */ 0xA5A8, 0xA5A9, 0xA5AA, 0xA5AB, 0xA5AC, 0xA5AD, 0xA5AE, 0xA5AF,
+ /* U+30B0 */ 0xA5B0, 0xA5B1, 0xA5B2, 0xA5B3, 0xA5B4, 0xA5B5, 0xA5B6, 0xA5B7,
+ /* U+30B8 */ 0xA5B8, 0xA5B9, 0xA5BA, 0xA5BB, 0xA5BC, 0xA5BD, 0xA5BE, 0xA5BF,
+ /* U+30C0 */ 0xA5C0, 0xA5C1, 0xA5C2, 0xA5C3, 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7,
+ /* U+30C8 */ 0xA5C8, 0xA5C9, 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF,
+ /* U+30D0 */ 0xA5D0, 0xA5D1, 0xA5D2, 0xA5D3, 0xA5D4, 0xA5D5, 0xA5D6, 0xA5D7,
+ /* U+30D8 */ 0xA5D8, 0xA5D9, 0xA5DA, 0xA5DB, 0xA5DC, 0xA5DD, 0xA5DE, 0xA5DF,
+ /* U+30E0 */ 0xA5E0, 0xA5E1, 0xA5E2, 0xA5E3, 0xA5E4, 0xA5E5, 0xA5E6, 0xA5E7,
+ /* U+30E8 */ 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, 0xA5ED, 0xA5EE, 0xA5EF,
+ /* U+30F0 */ 0xA5F0, 0xA5F1, 0xA5F2, 0xA5F3, 0xA5F4, 0xA5F5, 0xA5F6, 0x2265,
+ /* U+30F8 */ 0x2266, 0x2267, 0x2268, 0x2269, 0xA960, 0xA963, 0xA964, 0x2270,
+ /* U+3100 */ 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0xA8C5, 0xA8C6, 0xA8C7,
+ /* U+3108 */ 0xA8C8, 0xA8C9, 0xA8CA, 0xA8CB, 0xA8CC, 0xA8CD, 0xA8CE, 0xA8CF,
+ /* U+3110 */ 0xA8D0, 0xA8D1, 0xA8D2, 0xA8D3, 0xA8D4, 0xA8D5, 0xA8D6, 0xA8D7,
+ /* U+3118 */ 0xA8D8, 0xA8D9, 0xA8DA, 0xA8DB, 0xA8DC, 0xA8DD, 0xA8DE, 0xA8DF,
+ /* U+3120 */ 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7,
+ /* U+3128 */ 0xA8E8, 0xA8E9, 0x2276, 0x2277, 0x2278, 0x2279, 0x2280, 0x2281,
+ /* U+3130 */ 0x2282, 0x2283, 0x2284, 0x2285, 0x2286, 0x2287, 0x2288, 0x2289,
+ /* U+3138 */ 0x2290, 0x2291, 0x2292, 0x2293, 0x2294, 0x2295, 0x2296, 0x2297,
+ /* U+3140 */ 0x2298, 0x2299, 0x22A0, 0x22A1, 0x22A2, 0x22A3, 0x22A4, 0x22A5,
+ /* U+3148 */ 0x22A6, 0x22A7, 0x22A8, 0x22A9, 0x22B0, 0x22B1, 0x22B2, 0x22B3,
+ /* U+3150 */ 0x22B4, 0x22B5, 0x22B6, 0x22B7, 0x22B8, 0x22B9, 0x22C0, 0x22C1,
+ /* U+3158 */ 0x22C2, 0x22C3, 0x22C4, 0x22C5, 0x22C6, 0x22C7, 0x22C8, 0x22C9,
+ /* U+3160 */ 0x22D0, 0x22D1, 0x22D2, 0x22D3, 0x22D4, 0x22D5, 0x22D6, 0x22D7,
+ /* U+3168 */ 0x22D8, 0x22D9, 0x22E0, 0x22E1, 0x22E2, 0x22E3, 0x22E4, 0x22E5,
+ /* U+3170 */ 0x22E6, 0x22E7, 0x22E8, 0x22E9, 0x22F0, 0x22F1, 0x22F2, 0x22F3,
+ /* U+3178 */ 0x22F4, 0x22F5, 0x22F6, 0x22F7, 0x22F8, 0x22F9, 0x2300, 0x2301,
+ /* U+3180 */ 0x2302, 0x2303, 0x2304, 0x2305, 0x2306, 0x2307, 0x2308, 0x2309,
+ /* U+3188 */ 0x2310, 0x2311, 0x2312, 0x2313, 0x2314, 0x2315, 0x2316, 0x2317,
+ /* U+3190 */ 0x2318, 0x2319, 0x2320, 0x2321, 0x2322, 0x2323, 0x2324, 0x2325,
+ /* U+3198 */ 0x2326, 0x2327, 0x2328, 0x2329, 0x2330, 0x2331, 0x2332, 0x2333,
+ /* U+31A0 */ 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2340, 0x2341,
+ /* U+31A8 */ 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349,
+ /* U+31B0 */ 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357,
+ /* U+31B8 */ 0x2358, 0x2359, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365,
+ /* U+31C0 */ 0x2366, 0x2367, 0x2368, 0x2369, 0x2370, 0x2371, 0x2372, 0x2373,
+ /* U+31C8 */ 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x2380, 0x2381,
+ /* U+31D0 */ 0x2382, 0x2383, 0x2384, 0x2385, 0x2386, 0x2387, 0x2388, 0x2389,
+ /* U+31D8 */ 0x2390, 0x2391, 0x2392, 0x2393, 0x2394, 0x2395, 0x2396, 0x2397,
+ /* U+31E0 */ 0x2398, 0x2399, 0x23A0, 0x23A1, 0x23A2, 0x23A3, 0x23A4, 0x23A5,
+ /* U+31E8 */ 0x23A6, 0x23A7, 0x23A8, 0x23A9, 0x23B0, 0x23B1, 0x23B2, 0x23B3,
+ /* U+31F0 */ 0x23B4, 0x23B5, 0x23B6, 0x23B7, 0x23B8, 0x23B9, 0x23C0, 0x23C1,
+ /* U+31F8 */ 0x23C2, 0x23C3, 0x23C4, 0x23C5, 0x23C6, 0x23C7, 0x23C8, 0x23C9,
+ /* U+3200 */ 0x23D0, 0x23D1, 0x23D2, 0x23D3, 0x23D4, 0x23D5, 0x23D6, 0x23D7,
+ /* U+3208 */ 0x23D8, 0x23D9, 0x23E0, 0x23E1, 0x23E2, 0x23E3, 0x23E4, 0x23E5,
+ /* U+3210 */ 0x23E6, 0x23E7, 0x23E8, 0x23E9, 0x23F0, 0x23F1, 0x23F2, 0x23F3,
+ /* U+3218 */ 0x23F4, 0x23F5, 0x23F6, 0x23F7, 0x23F8, 0x23F9, 0x2400, 0x2401,
+ /* U+3220 */ 0xA2E5, 0xA2E6, 0xA2E7, 0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC,
+ /* U+3228 */ 0xA2ED, 0xA2EE, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407,
+ /* U+3230 */ 0x2408, 0xA95A, 0x2409, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414,
+ /* U+3238 */ 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x2420, 0x2421, 0x2422,
+ /* U+3240 */ 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x2430,
+ /* U+3248 */ 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438,
+ /* U+3250 */ 0x2439, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446,
+ /* U+3258 */ 0x2447, 0x2448, 0x2449, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454,
+ /* U+3260 */ 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x2460, 0x2461, 0x2462,
+ /* U+3268 */ 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2470,
+ /* U+3270 */ 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,
+ /* U+3278 */ 0x2479, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486,
+ /* U+3280 */ 0x2487, 0x2488, 0x2489, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494,
+ /* U+3288 */ 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x24A0, 0x24A1, 0x24A2,
+ /* U+3290 */ 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24B0,
+ /* U+3298 */ 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x24B6, 0x24B7, 0x24B8,
+ /* U+32A0 */ 0x24B9, 0x24C0, 0x24C1, 0xA949, 0x24C2, 0x24C3, 0x24C4, 0x24C5,
+ /* U+32A8 */ 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24D0, 0x24D1, 0x24D2, 0x24D3,
+ /* U+32B0 */ 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24E0, 0x24E1,
+ /* U+32B8 */ 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9,
+ /* U+32C0 */ 0x24F0, 0x24F1, 0x24F2, 0x24F3, 0x24F4, 0x24F5, 0x24F6, 0x24F7,
+ /* U+32C8 */ 0x24F8, 0x24F9, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505,
+ /* U+32D0 */ 0x2506, 0x2507, 0x2508, 0x2509, 0x2510, 0x2511, 0x2512, 0x2513,
+ /* U+32D8 */ 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x2520, 0x2521,
+ /* U+32E0 */ 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529,
+ /* U+32E8 */ 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537,
+ /* U+32F0 */ 0x2538, 0x2539, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545,
+ /* U+32F8 */ 0x2546, 0x2547, 0x2548, 0x2549, 0x2550, 0x2551, 0x2552, 0x2553,
+ /* U+3300 */ 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x2560, 0x2561,
+ /* U+3308 */ 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569,
+ /* U+3310 */ 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577,
+ /* U+3318 */ 0x2578, 0x2579, 0x2580, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585,
+ /* U+3320 */ 0x2586, 0x2587, 0x2588, 0x2589, 0x2590, 0x2591, 0x2592, 0x2593,
+ /* U+3328 */ 0x2594, 0x2595, 0x2596, 0x2597, 0x2598, 0x2599, 0x25A0, 0x25A1,
+ /* U+3330 */ 0x25A2, 0x25A3, 0x25A4, 0x25A5, 0x25A6, 0x25A7, 0x25A8, 0x25A9,
+ /* U+3338 */ 0x25B0, 0x25B1, 0x25B2, 0x25B3, 0x25B4, 0x25B5, 0x25B6, 0x25B7,
+ /* U+3340 */ 0x25B8, 0x25B9, 0x25C0, 0x25C1, 0x25C2, 0x25C3, 0x25C4, 0x25C5,
+ /* U+3348 */ 0x25C6, 0x25C7, 0x25C8, 0x25C9, 0x25D0, 0x25D1, 0x25D2, 0x25D3,
+ /* U+3350 */ 0x25D4, 0x25D5, 0x25D6, 0x25D7, 0x25D8, 0x25D9, 0x25E0, 0x25E1,
+ /* U+3358 */ 0x25E2, 0x25E3, 0x25E4, 0x25E5, 0x25E6, 0x25E7, 0x25E8, 0x25E9,
+ /* U+3360 */ 0x25F0, 0x25F1, 0x25F2, 0x25F3, 0x25F4, 0x25F5, 0x25F6, 0x25F7,
+ /* U+3368 */ 0x25F8, 0x25F9, 0x2600, 0x2601, 0x2602, 0x2603, 0x2604, 0x2605,
+ /* U+3370 */ 0x2606, 0x2607, 0x2608, 0x2609, 0x2610, 0x2611, 0x2612, 0x2613,
+ /* U+3378 */ 0x2614, 0x2615, 0x2616, 0x2617, 0x2618, 0x2619, 0x2620, 0x2621,
+ /* U+3380 */ 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629,
+ /* U+3388 */ 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0xA94A, 0xA94B,
+ /* U+3390 */ 0x2636, 0x2637, 0x2638, 0x2639, 0x2640, 0x2641, 0x2642, 0x2643,
+ /* U+3398 */ 0x2644, 0x2645, 0x2646, 0x2647, 0xA94C, 0xA94D, 0xA94E, 0x2648,
+ /* U+33A0 */ 0x2649, 0xA94F, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655,
+ /* U+33A8 */ 0x2656, 0x2657, 0x2658, 0x2659, 0x2660, 0x2661, 0x2662, 0x2663,
+ /* U+33B0 */ 0x2664, 0x2665, 0x2666, 0x2667, 0x2668, 0x2669, 0x2670, 0x2671,
+ /* U+33B8 */ 0x2672, 0x2673, 0x2674, 0x2675, 0x2676, 0x2677, 0x2678, 0x2679,
+ /* U+33C0 */ 0x2680, 0x2681, 0x2682, 0x2683, 0xA950, 0x2684, 0x2685, 0x2686,
+ /* U+33C8 */ 0x2687, 0x2688, 0x2689, 0x2690, 0x2691, 0x2692, 0xA951, 0x2693,
+ /* U+33D0 */ 0x2694, 0xA952, 0xA953, 0x2695, 0x2696, 0xA954, 0x2697, 0x2698,
+ /* U+33D8 */ 0x2699, 0x26A0, 0x26A1, 0x26A2, 0x26A3, 0x26A4, 0x26A5, 0x26A6,
+ /* U+33E0 */ 0x26A7, 0x26A8, 0x26A9, 0x26B0, 0x26B1, 0x26B2, 0x26B3, 0x26B4,
+ /* U+33E8 */ 0x26B5, 0x26B6, 0x26B7, 0x26B8, 0x26B9, 0x26C0, 0x26C1, 0x26C2,
+ /* U+33F0 */ 0x26C3, 0x26C4, 0x26C5, 0x26C6, 0x26C7, 0x26C8, 0x26C9, 0x26D0,
+ /* U+33F8 */ 0x26D1, 0x26D2, 0x26D3, 0x26D4, 0x26D5, 0x26D6, 0x26D7, 0x26D8,
+ /* U+3400 */ 0x26D9, 0x26E0, 0x26E1, 0x26E2, 0x26E3, 0x26E4, 0x26E5, 0x26E6,
+ /* U+3408 */ 0x26E7, 0x26E8, 0x26E9, 0x26F0, 0x26F1, 0x26F2, 0x26F3, 0x26F4,
+ /* U+3410 */ 0x26F5, 0x26F6, 0x26F7, 0x26F8, 0x26F9, 0x2700, 0x2701, 0x2702,
+ /* U+3418 */ 0x2703, 0x2704, 0x2705, 0x2706, 0x2707, 0x2708, 0x2709, 0x2710,
+ /* U+3420 */ 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, 0x2718,
+ /* U+3428 */ 0x2719, 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726,
+ /* U+3430 */ 0x2727, 0x2728, 0x2729, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734,
+ /* U+3438 */ 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x2740, 0x2741, 0x2742,
+ /* U+3440 */ 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0xFE56,
+ /* U+3448 */ 0x2750, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2757,
+ /* U+3450 */ 0x2758, 0x2759, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765,
+ /* U+3458 */ 0x2766, 0x2767, 0x2768, 0x2769, 0x2770, 0x2771, 0x2772, 0x2773,
+ /* U+3460 */ 0x2774, 0x2775, 0x2776, 0x2777, 0x2778, 0x2779, 0x2780, 0x2781,
+ /* U+3468 */ 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787, 0x2788, 0x2789,
+ /* U+3470 */ 0x2790, 0x2791, 0x2792, 0xFE55, 0x2793, 0x2794, 0x2795, 0x2796,
+ /* U+3478 */ 0x2797, 0x2798, 0x2799, 0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4,
+ /* U+3480 */ 0x27A5, 0x27A6, 0x27A7, 0x27A8, 0x27A9, 0x27B0, 0x27B1, 0x27B2,
+ /* U+3488 */ 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7, 0x27B8, 0x27B9, 0x27C0,
+ /* U+3490 */ 0x27C1, 0x27C2, 0x27C3, 0x27C4, 0x27C5, 0x27C6, 0x27C7, 0x27C8,
+ /* U+3498 */ 0x27C9, 0x27D0, 0x27D1, 0x27D2, 0x27D3, 0x27D4, 0x27D5, 0x27D6,
+ /* U+34A0 */ 0x27D7, 0x27D8, 0x27D9, 0x3000, 0x3001, 0x3002, 0x3003, 0x3004,
+ /* U+34A8 */ 0x3005, 0x3006, 0x3007, 0x3008, 0x3009, 0x3010, 0x3011, 0x3012,
+ /* U+34B0 */ 0x3013, 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x3020,
+ /* U+34B8 */ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028,
+ /* U+34C0 */ 0x3029, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036,
+ /* U+34C8 */ 0x3037, 0x3038, 0x3039, 0x3040, 0x3041, 0x3042, 0x3043, 0x3044,
+ /* U+34D0 */ 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x3050, 0x3051, 0x3052,
+ /* U+34D8 */ 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x3060,
+ /* U+34E0 */ 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+ /* U+34E8 */ 0x3069, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,
+ /* U+34F0 */ 0x3077, 0x3078, 0x3079, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084,
+ /* U+34F8 */ 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x3090, 0x3091, 0x3092,
+ /* U+3500 */ 0x3093, 0x3094, 0x3095, 0x3096, 0x3097, 0x3098, 0x3099, 0x30A0,
+ /* U+3508 */ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8,
+ /* U+3510 */ 0x30A9, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6,
+ /* U+3518 */ 0x30B7, 0x30B8, 0x30B9, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4,
+ /* U+3520 */ 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30D0, 0x30D1, 0x30D2,
+ /* U+3528 */ 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30E0,
+ /* U+3530 */ 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8,
+ /* U+3538 */ 0x30E9, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6,
+ /* U+3540 */ 0x30F7, 0x30F8, 0x30F9, 0x3100, 0x3101, 0x3102, 0x3103, 0x3104,
+ /* U+3548 */ 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x3110, 0x3111, 0x3112,
+ /* U+3550 */ 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x3120,
+ /* U+3558 */ 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+ /* U+3560 */ 0x3129, 0x3130, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136,
+ /* U+3568 */ 0x3137, 0x3138, 0x3139, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144,
+ /* U+3570 */ 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x3150, 0x3151, 0x3152,
+ /* U+3578 */ 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x3160,
+ /* U+3580 */ 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168,
+ /* U+3588 */ 0x3169, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176,
+ /* U+3590 */ 0x3177, 0x3178, 0x3179, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184,
+ /* U+3598 */ 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x3190, 0xFE5A, 0x3191,
+ /* U+35A0 */ 0x3192, 0x3193, 0x3194, 0x3195, 0x3196, 0x3197, 0x3198, 0x3199,
+ /* U+35A8 */ 0x31A0, 0x31A1, 0x31A2, 0x31A3, 0x31A4, 0x31A5, 0x31A6, 0x31A7,
+ /* U+35B0 */ 0x31A8, 0x31A9, 0x31B0, 0x31B1, 0x31B2, 0x31B3, 0x31B4, 0x31B5,
+ /* U+35B8 */ 0x31B6, 0x31B7, 0x31B8, 0x31B9, 0x31C0, 0x31C1, 0x31C2, 0x31C3,
+ /* U+35C0 */ 0x31C4, 0x31C5, 0x31C6, 0x31C7, 0x31C8, 0x31C9, 0x31D0, 0x31D1,
+ /* U+35C8 */ 0x31D2, 0x31D3, 0x31D4, 0x31D5, 0x31D6, 0x31D7, 0x31D8, 0x31D9,
+ /* U+35D0 */ 0x31E0, 0x31E1, 0x31E2, 0x31E3, 0x31E4, 0x31E5, 0x31E6, 0x31E7,
+ /* U+35D8 */ 0x31E8, 0x31E9, 0x31F0, 0x31F1, 0x31F2, 0x31F3, 0x31F4, 0x31F5,
+ /* U+35E0 */ 0x31F6, 0x31F7, 0x31F8, 0x31F9, 0x3200, 0x3201, 0x3202, 0x3203,
+ /* U+35E8 */ 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x3210, 0x3211,
+ /* U+35F0 */ 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219,
+ /* U+35F8 */ 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227,
+ /* U+3600 */ 0x3228, 0x3229, 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235,
+ /* U+3608 */ 0x3236, 0x3237, 0x3238, 0x3239, 0x3240, 0x3241, 0xFE5C, 0x3242,
+ /* U+3610 */ 0x3243, 0x3244, 0x3245, 0x3246, 0x3247, 0x3248, 0x3249, 0x3250,
+ /* U+3618 */ 0x3251, 0x3252, 0xFE5B,
+ /* Contiguous area: U+3918 .. U+3CE0 */
+ /* U+3918 */ 0xFE60, 0x3718, 0x3719, 0x3720, 0x3721, 0x3722, 0x3723, 0x3724,
+ /* U+3920 */ 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x3730, 0x3731, 0x3732,
+ /* U+3928 */ 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x3740,
+ /* U+3930 */ 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, 0x3748,
+ /* U+3938 */ 0x3749, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, 0x3756,
+ /* U+3940 */ 0x3757, 0x3758, 0x3759, 0x3760, 0x3761, 0x3762, 0x3763, 0x3764,
+ /* U+3948 */ 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x3770, 0x3771, 0x3772,
+ /* U+3950 */ 0x3773, 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x3780,
+ /* U+3958 */ 0x3781, 0x3782, 0x3783, 0x3784, 0x3785, 0x3786, 0x3787, 0x3788,
+ /* U+3960 */ 0x3789, 0x3790, 0x3791, 0x3792, 0x3793, 0x3794, 0x3795, 0x3796,
+ /* U+3968 */ 0x3797, 0x3798, 0x3799, 0x37A0, 0x37A1, 0x37A2, 0xFE5F, 0x37A3,
+ /* U+3970 */ 0x37A4, 0x37A5, 0x37A6, 0x37A7, 0x37A8, 0x37A9, 0x37B0, 0x37B1,
+ /* U+3978 */ 0x37B2, 0x37B3, 0x37B4, 0x37B5, 0x37B6, 0x37B7, 0x37B8, 0x37B9,
+ /* U+3980 */ 0x37C0, 0x37C1, 0x37C2, 0x37C3, 0x37C4, 0x37C5, 0x37C6, 0x37C7,
+ /* U+3988 */ 0x37C8, 0x37C9, 0x37D0, 0x37D1, 0x37D2, 0x37D3, 0x37D4, 0x37D5,
+ /* U+3990 */ 0x37D6, 0x37D7, 0x37D8, 0x37D9, 0x3800, 0x3801, 0x3802, 0x3803,
+ /* U+3998 */ 0x3804, 0x3805, 0x3806, 0x3807, 0x3808, 0x3809, 0x3810, 0x3811,
+ /* U+39A0 */ 0x3812, 0x3813, 0x3814, 0x3815, 0x3816, 0x3817, 0x3818, 0x3819,
+ /* U+39A8 */ 0x3820, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827,
+ /* U+39B0 */ 0x3828, 0x3829, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835,
+ /* U+39B8 */ 0x3836, 0x3837, 0x3838, 0x3839, 0x3840, 0x3841, 0x3842, 0x3843,
+ /* U+39C0 */ 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x3850, 0x3851,
+ /* U+39C8 */ 0x3852, 0x3853, 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0xFE62,
+ /* U+39D0 */ 0xFE65, 0x3859, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865,
+ /* U+39D8 */ 0x3866, 0x3867, 0x3868, 0x3869, 0x3870, 0x3871, 0x3872, 0xFE63,
+ /* U+39E0 */ 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x3880,
+ /* U+39E8 */ 0x3881, 0x3882, 0x3883, 0x3884, 0x3885, 0x3886, 0x3887, 0x3888,
+ /* U+39F0 */ 0x3889, 0x3890, 0x3891, 0x3892, 0x3893, 0x3894, 0x3895, 0x3896,
+ /* U+39F8 */ 0x3897, 0x3898, 0x3899, 0x38A0, 0x38A1, 0x38A2, 0x38A3, 0x38A4,
+ /* U+3A00 */ 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38A9, 0x38B0, 0x38B1, 0x38B2,
+ /* U+3A08 */ 0x38B3, 0x38B4, 0x38B5, 0x38B6, 0x38B7, 0x38B8, 0x38B9, 0x38C0,
+ /* U+3A10 */ 0x38C1, 0x38C2, 0x38C3, 0x38C4, 0x38C5, 0x38C6, 0x38C7, 0x38C8,
+ /* U+3A18 */ 0x38C9, 0x38D0, 0x38D1, 0x38D2, 0x38D3, 0x38D4, 0x38D5, 0x38D6,
+ /* U+3A20 */ 0x38D7, 0x38D8, 0x38D9, 0x38E0, 0x38E1, 0x38E2, 0x38E3, 0x38E4,
+ /* U+3A28 */ 0x38E5, 0x38E6, 0x38E7, 0x38E8, 0x38E9, 0x38F0, 0x38F1, 0x38F2,
+ /* U+3A30 */ 0x38F3, 0x38F4, 0x38F5, 0x38F6, 0x38F7, 0x38F8, 0x38F9, 0x3900,
+ /* U+3A38 */ 0x3901, 0x3902, 0x3903, 0x3904, 0x3905, 0x3906, 0x3907, 0x3908,
+ /* U+3A40 */ 0x3909, 0x3910, 0x3911, 0x3912, 0x3913, 0x3914, 0x3915, 0x3916,
+ /* U+3A48 */ 0x3917, 0x3918, 0x3919, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924,
+ /* U+3A50 */ 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x3930, 0x3931, 0x3932,
+ /* U+3A58 */ 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x3940,
+ /* U+3A60 */ 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948,
+ /* U+3A68 */ 0x3949, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956,
+ /* U+3A70 */ 0x3957, 0x3958, 0x3959, 0xFE64, 0x3960, 0x3961, 0x3962, 0x3963,
+ /* U+3A78 */ 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x3970, 0x3971,
+ /* U+3A80 */ 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979,
+ /* U+3A88 */ 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985, 0x3986, 0x3987,
+ /* U+3A90 */ 0x3988, 0x3989, 0x3990, 0x3991, 0x3992, 0x3993, 0x3994, 0x3995,
+ /* U+3A98 */ 0x3996, 0x3997, 0x3998, 0x3999, 0x39A0, 0x39A1, 0x39A2, 0x39A3,
+ /* U+3AA0 */ 0x39A4, 0x39A5, 0x39A6, 0x39A7, 0x39A8, 0x39A9, 0x39B0, 0x39B1,
+ /* U+3AA8 */ 0x39B2, 0x39B3, 0x39B4, 0x39B5, 0x39B6, 0x39B7, 0x39B8, 0x39B9,
+ /* U+3AB0 */ 0x39C0, 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5, 0x39C6, 0x39C7,
+ /* U+3AB8 */ 0x39C8, 0x39C9, 0x39D0, 0x39D1, 0x39D2, 0x39D3, 0x39D4, 0x39D5,
+ /* U+3AC0 */ 0x39D6, 0x39D7, 0x39D8, 0x39D9, 0x39E0, 0x39E1, 0x39E2, 0x39E3,
+ /* U+3AC8 */ 0x39E4, 0x39E5, 0x39E6, 0x39E7, 0x39E8, 0x39E9, 0x39F0, 0x39F1,
+ /* U+3AD0 */ 0x39F2, 0x39F3, 0x39F4, 0x39F5, 0x39F6, 0x39F7, 0x39F8, 0x39F9,
+ /* U+3AD8 */ 0x3A00, 0x3A01, 0x3A02, 0x3A03, 0x3A04, 0x3A05, 0x3A06, 0x3A07,
+ /* U+3AE0 */ 0x3A08, 0x3A09, 0x3A10, 0x3A11, 0x3A12, 0x3A13, 0x3A14, 0x3A15,
+ /* U+3AE8 */ 0x3A16, 0x3A17, 0x3A18, 0x3A19, 0x3A20, 0x3A21, 0x3A22, 0x3A23,
+ /* U+3AF0 */ 0x3A24, 0x3A25, 0x3A26, 0x3A27, 0x3A28, 0x3A29, 0x3A30, 0x3A31,
+ /* U+3AF8 */ 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, 0x3A37, 0x3A38, 0x3A39,
+ /* U+3B00 */ 0x3A40, 0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, 0x3A46, 0x3A47,
+ /* U+3B08 */ 0x3A48, 0x3A49, 0x3A50, 0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55,
+ /* U+3B10 */ 0x3A56, 0x3A57, 0x3A58, 0x3A59, 0x3A60, 0x3A61, 0x3A62, 0x3A63,
+ /* U+3B18 */ 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68, 0x3A69, 0x3A70, 0x3A71,
+ /* U+3B20 */ 0x3A72, 0x3A73, 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78, 0x3A79,
+ /* U+3B28 */ 0x3A80, 0x3A81, 0x3A82, 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87,
+ /* U+3B30 */ 0x3A88, 0x3A89, 0x3A90, 0x3A91, 0x3A92, 0x3A93, 0x3A94, 0x3A95,
+ /* U+3B38 */ 0x3A96, 0x3A97, 0x3A98, 0x3A99, 0x3AA0, 0x3AA1, 0x3AA2, 0x3AA3,
+ /* U+3B40 */ 0x3AA4, 0x3AA5, 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9, 0x3AB0, 0x3AB1,
+ /* U+3B48 */ 0x3AB2, 0x3AB3, 0x3AB4, 0x3AB5, 0x3AB6, 0x3AB7, 0xFE68, 0x3AB8,
+ /* U+3B50 */ 0x3AB9, 0x3AC0, 0x3AC1, 0x3AC2, 0x3AC3, 0x3AC4, 0x3AC5, 0x3AC6,
+ /* U+3B58 */ 0x3AC7, 0x3AC8, 0x3AC9, 0x3AD0, 0x3AD1, 0x3AD2, 0x3AD3, 0x3AD4,
+ /* U+3B60 */ 0x3AD5, 0x3AD6, 0x3AD7, 0x3AD8, 0x3AD9, 0x3AE0, 0x3AE1, 0x3AE2,
+ /* U+3B68 */ 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3AE7, 0x3AE8, 0x3AE9, 0x3AF0,
+ /* U+3B70 */ 0x3AF1, 0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AF7, 0x3AF8,
+ /* U+3B78 */ 0x3AF9, 0x3B00, 0x3B01, 0x3B02, 0x3B03, 0x3B04, 0x3B05, 0x3B06,
+ /* U+3B80 */ 0x3B07, 0x3B08, 0x3B09, 0x3B10, 0x3B11, 0x3B12, 0x3B13, 0x3B14,
+ /* U+3B88 */ 0x3B15, 0x3B16, 0x3B17, 0x3B18, 0x3B19, 0x3B20, 0x3B21, 0x3B22,
+ /* U+3B90 */ 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0x3B29, 0x3B30,
+ /* U+3B98 */ 0x3B31, 0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36, 0x3B37, 0x3B38,
+ /* U+3BA0 */ 0x3B39, 0x3B40, 0x3B41, 0x3B42, 0x3B43, 0x3B44, 0x3B45, 0x3B46,
+ /* U+3BA8 */ 0x3B47, 0x3B48, 0x3B49, 0x3B50, 0x3B51, 0x3B52, 0x3B53, 0x3B54,
+ /* U+3BB0 */ 0x3B55, 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B60, 0x3B61, 0x3B62,
+ /* U+3BB8 */ 0x3B63, 0x3B64, 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, 0x3B70,
+ /* U+3BC0 */ 0x3B71, 0x3B72, 0x3B73, 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78,
+ /* U+3BC8 */ 0x3B79, 0x3B80, 0x3B81, 0x3B82, 0x3B83, 0x3B84, 0x3B85, 0x3B86,
+ /* U+3BD0 */ 0x3B87, 0x3B88, 0x3B89, 0x3B90, 0x3B91, 0x3B92, 0x3B93, 0x3B94,
+ /* U+3BD8 */ 0x3B95, 0x3B96, 0x3B97, 0x3B98, 0x3B99, 0x3BA0, 0x3BA1, 0x3BA2,
+ /* U+3BE0 */ 0x3BA3, 0x3BA4, 0x3BA5, 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BB0,
+ /* U+3BE8 */ 0x3BB1, 0x3BB2, 0x3BB3, 0x3BB4, 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8,
+ /* U+3BF0 */ 0x3BB9, 0x3BC0, 0x3BC1, 0x3BC2, 0x3BC3, 0x3BC4, 0x3BC5, 0x3BC6,
+ /* U+3BF8 */ 0x3BC7, 0x3BC8, 0x3BC9, 0x3BD0, 0x3BD1, 0x3BD2, 0x3BD3, 0x3BD4,
+ /* U+3C00 */ 0x3BD5, 0x3BD6, 0x3BD7, 0x3BD8, 0x3BD9, 0x3BE0, 0x3BE1, 0x3BE2,
+ /* U+3C08 */ 0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, 0x3BE7, 0x3BE8, 0x3BE9, 0x3BF0,
+ /* U+3C10 */ 0x3BF1, 0x3BF2, 0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, 0x3BF7, 0x3BF8,
+ /* U+3C18 */ 0x3BF9, 0x3C00, 0x3C01, 0x3C02, 0x3C03, 0x3C04, 0x3C05, 0x3C06,
+ /* U+3C20 */ 0x3C07, 0x3C08, 0x3C09, 0x3C10, 0x3C11, 0x3C12, 0x3C13, 0x3C14,
+ /* U+3C28 */ 0x3C15, 0x3C16, 0x3C17, 0x3C18, 0x3C19, 0x3C20, 0x3C21, 0x3C22,
+ /* U+3C30 */ 0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, 0x3C28, 0x3C29, 0x3C30,
+ /* U+3C38 */ 0x3C31, 0x3C32, 0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C37, 0x3C38,
+ /* U+3C40 */ 0x3C39, 0x3C40, 0x3C41, 0x3C42, 0x3C43, 0x3C44, 0x3C45, 0x3C46,
+ /* U+3C48 */ 0x3C47, 0x3C48, 0x3C49, 0x3C50, 0x3C51, 0x3C52, 0x3C53, 0x3C54,
+ /* U+3C50 */ 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59, 0x3C60, 0x3C61, 0x3C62,
+ /* U+3C58 */ 0x3C63, 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68, 0x3C69, 0x3C70,
+ /* U+3C60 */ 0x3C71, 0x3C72, 0x3C73, 0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78,
+ /* U+3C68 */ 0x3C79, 0x3C80, 0x3C81, 0x3C82, 0x3C83, 0x3C84, 0xFE69, 0x3C85,
+ /* U+3C70 */ 0x3C86, 0x3C87, 0x3C88, 0x3C89, 0x3C90, 0x3C91, 0x3C92, 0x3C93,
+ /* U+3C78 */ 0x3C94, 0x3C95, 0x3C96, 0x3C97, 0x3C98, 0x3C99, 0x3CA0, 0x3CA1,
+ /* U+3C80 */ 0x3CA2, 0x3CA3, 0x3CA4, 0x3CA5, 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9,
+ /* U+3C88 */ 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3, 0x3CB4, 0x3CB5, 0x3CB6, 0x3CB7,
+ /* U+3C90 */ 0x3CB8, 0x3CB9, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3, 0x3CC4, 0x3CC5,
+ /* U+3C98 */ 0x3CC6, 0x3CC7, 0x3CC8, 0x3CC9, 0x3CD0, 0x3CD1, 0x3CD2, 0x3CD3,
+ /* U+3CA0 */ 0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7, 0x3CD8, 0x3CD9, 0x3CE0, 0x3CE1,
+ /* U+3CA8 */ 0x3CE2, 0x3CE3, 0x3CE4, 0x3CE5, 0x3CE6, 0x3CE7, 0x3CE8, 0x3CE9,
+ /* U+3CB0 */ 0x3CF0, 0x3CF1, 0x3CF2, 0x3CF3, 0x3CF4, 0x3CF5, 0x3CF6, 0x3CF7,
+ /* U+3CB8 */ 0x3CF8, 0x3CF9, 0x3D00, 0x3D01, 0x3D02, 0x3D03, 0x3D04, 0x3D05,
+ /* U+3CC0 */ 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D10, 0x3D11, 0x3D12, 0x3D13,
+ /* U+3CC8 */ 0x3D14, 0x3D15, 0x3D16, 0x3D17, 0x3D18, 0x3D19, 0x3D20, 0x3D21,
+ /* U+3CD0 */ 0x3D22, 0x3D23, 0x3D24, 0x3D25, 0x3D26, 0x3D27, 0x3D28, 0x3D29,
+ /* U+3CD8 */ 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34, 0x3D35, 0x3D36, 0x3D37,
+ /* U+3CE0 */ 0xFE6A,
+ /* Contiguous area: U+4056 .. U+415F */
+ /* U+4056 */ 0xFE6F, 0x42E3,
+ /* U+4058 */ 0x42E4, 0x42E5, 0x42E6, 0x42E7, 0x42E8, 0x42E9, 0x42F0, 0x42F1,
+ /* U+4060 */ 0x42F2, 0x42F3, 0x42F4, 0x42F5, 0x42F6, 0x42F7, 0x42F8, 0x42F9,
+ /* U+4068 */ 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306, 0x4307,
+ /* U+4070 */ 0x4308, 0x4309, 0x4310, 0x4311, 0x4312, 0x4313, 0x4314, 0x4315,
+ /* U+4078 */ 0x4316, 0x4317, 0x4318, 0x4319, 0x4320, 0x4321, 0x4322, 0x4323,
+ /* U+4080 */ 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x4330, 0x4331,
+ /* U+4088 */ 0x4332, 0x4333, 0x4334, 0x4335, 0x4336, 0x4337, 0x4338, 0x4339,
+ /* U+4090 */ 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347,
+ /* U+4098 */ 0x4348, 0x4349, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355,
+ /* U+40A0 */ 0x4356, 0x4357, 0x4358, 0x4359, 0x4360, 0x4361, 0x4362, 0x4363,
+ /* U+40A8 */ 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x4370, 0x4371,
+ /* U+40B0 */ 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377, 0x4378, 0x4379,
+ /* U+40B8 */ 0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, 0x4387,
+ /* U+40C0 */ 0x4388, 0x4389, 0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395,
+ /* U+40C8 */ 0x4396, 0x4397, 0x4398, 0x4399, 0x43A0, 0x43A1, 0x43A2, 0x43A3,
+ /* U+40D0 */ 0x43A4, 0x43A5, 0x43A6, 0x43A7, 0x43A8, 0x43A9, 0x43B0, 0x43B1,
+ /* U+40D8 */ 0x43B2, 0x43B3, 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8, 0x43B9,
+ /* U+40E0 */ 0x43C0, 0x43C1, 0x43C2, 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7,
+ /* U+40E8 */ 0x43C8, 0x43C9, 0x43D0, 0x43D1, 0x43D2, 0x43D3, 0x43D4, 0x43D5,
+ /* U+40F0 */ 0x43D6, 0x43D7, 0x43D8, 0x43D9, 0x43E0, 0x43E1, 0x43E2, 0x43E3,
+ /* U+40F8 */ 0x43E4, 0x43E5, 0x43E6, 0x43E7, 0x43E8, 0x43E9, 0x43F0, 0x43F1,
+ /* U+4100 */ 0x43F2, 0x43F3, 0x43F4, 0x43F5, 0x43F6, 0x43F7, 0x43F8, 0x43F9,
+ /* U+4108 */ 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, 0x4405, 0x4406, 0x4407,
+ /* U+4110 */ 0x4408, 0x4409, 0x4410, 0x4411, 0x4412, 0x4413, 0x4414, 0x4415,
+ /* U+4118 */ 0x4416, 0x4417, 0x4418, 0x4419, 0x4420, 0x4421, 0x4422, 0x4423,
+ /* U+4120 */ 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x4430, 0x4431,
+ /* U+4128 */ 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439,
+ /* U+4130 */ 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447,
+ /* U+4138 */ 0x4448, 0x4449, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455,
+ /* U+4140 */ 0x4456, 0x4457, 0x4458, 0x4459, 0x4460, 0x4461, 0x4462, 0x4463,
+ /* U+4148 */ 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x4470, 0x4471,
+ /* U+4150 */ 0x4472, 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479,
+ /* U+4158 */ 0x4480, 0x4481, 0x4482, 0x4483, 0x4484, 0x4485, 0x4486, 0xFE70,
+ /* Contiguous area: U+4337 .. U+44D6 */
+ /* U+4337 */ 0xFE72,
+ /* U+4338 */ 0x4778, 0x4779, 0x4780, 0x4781, 0x4782, 0x4783, 0x4784, 0x4785,
+ /* U+4340 */ 0x4786, 0x4787, 0x4788, 0x4789, 0x4790, 0x4791, 0x4792, 0x4793,
+ /* U+4348 */ 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799, 0x47A0, 0x47A1,
+ /* U+4350 */ 0x47A2, 0x47A3, 0x47A4, 0x47A5, 0x47A6, 0x47A7, 0x47A8, 0x47A9,
+ /* U+4358 */ 0x47B0, 0x47B1, 0x47B2, 0x47B3, 0x47B4, 0x47B5, 0x47B6, 0x47B7,
+ /* U+4360 */ 0x47B8, 0x47B9, 0x47C0, 0x47C1, 0x47C2, 0x47C3, 0x47C4, 0x47C5,
+ /* U+4368 */ 0x47C6, 0x47C7, 0x47C8, 0x47C9, 0x47D0, 0x47D1, 0x47D2, 0x47D3,
+ /* U+4370 */ 0x47D4, 0x47D5, 0x47D6, 0x47D7, 0x47D8, 0x47D9, 0x4800, 0x4801,
+ /* U+4378 */ 0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, 0x4808, 0x4809,
+ /* U+4380 */ 0x4810, 0x4811, 0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817,
+ /* U+4388 */ 0x4818, 0x4819, 0x4820, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825,
+ /* U+4390 */ 0x4826, 0x4827, 0x4828, 0x4829, 0x4830, 0x4831, 0x4832, 0x4833,
+ /* U+4398 */ 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x4840, 0x4841,
+ /* U+43A0 */ 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849,
+ /* U+43A8 */ 0x4850, 0x4851, 0x4852, 0x4853, 0xFE78, 0x4854, 0x4855, 0x4856,
+ /* U+43B0 */ 0x4857, 0xFE77, 0x4858, 0x4859, 0x4860, 0x4861, 0x4862, 0x4863,
+ /* U+43B8 */ 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x4870, 0x4871,
+ /* U+43C0 */ 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879,
+ /* U+43C8 */ 0x4880, 0x4881, 0x4882, 0x4883, 0x4884, 0x4885, 0x4886, 0x4887,
+ /* U+43D0 */ 0x4888, 0x4889, 0x4890, 0x4891, 0x4892, 0x4893, 0x4894, 0x4895,
+ /* U+43D8 */ 0x4896, 0x4897, 0x4898, 0x4899, 0x48A0, 0xFE7A, 0x48A1, 0x48A2,
+ /* U+43E0 */ 0x48A3, 0x48A4, 0x48A5, 0x48A6, 0x48A7, 0x48A8, 0x48A9, 0x48B0,
+ /* U+43E8 */ 0x48B1, 0x48B2, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x48B8,
+ /* U+43F0 */ 0x48B9, 0x48C0, 0x48C1, 0x48C2, 0x48C3, 0x48C4, 0x48C5, 0x48C6,
+ /* U+43F8 */ 0x48C7, 0x48C8, 0x48C9, 0x48D0, 0x48D1, 0x48D2, 0x48D3, 0x48D4,
+ /* U+4400 */ 0x48D5, 0x48D6, 0x48D7, 0x48D8, 0x48D9, 0x48E0, 0x48E1, 0x48E2,
+ /* U+4408 */ 0x48E3, 0x48E4, 0x48E5, 0x48E6, 0x48E7, 0x48E8, 0x48E9, 0x48F0,
+ /* U+4410 */ 0x48F1, 0x48F2, 0x48F3, 0x48F4, 0x48F5, 0x48F6, 0x48F7, 0x48F8,
+ /* U+4418 */ 0x48F9, 0x4900, 0x4901, 0x4902, 0x4903, 0x4904, 0x4905, 0x4906,
+ /* U+4420 */ 0x4907, 0x4908, 0x4909, 0x4910, 0x4911, 0x4912, 0x4913, 0x4914,
+ /* U+4428 */ 0x4915, 0x4916, 0x4917, 0x4918, 0x4919, 0x4920, 0x4921, 0x4922,
+ /* U+4430 */ 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929, 0x4930,
+ /* U+4438 */ 0x4931, 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938,
+ /* U+4440 */ 0x4939, 0x4940, 0x4941, 0x4942, 0x4943, 0x4944, 0x4945, 0x4946,
+ /* U+4448 */ 0x4947, 0x4948, 0x4949, 0x4950, 0x4951, 0x4952, 0x4953, 0x4954,
+ /* U+4450 */ 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x4960, 0x4961, 0x4962,
+ /* U+4458 */ 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x4970,
+ /* U+4460 */ 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978,
+ /* U+4468 */ 0x4979, 0x4980, 0x4981, 0x4982, 0x4983, 0x4984, 0x4985, 0x4986,
+ /* U+4470 */ 0x4987, 0x4988, 0x4989, 0x4990, 0x4991, 0x4992, 0x4993, 0x4994,
+ /* U+4478 */ 0x4995, 0x4996, 0x4997, 0x4998, 0x4999, 0x49A0, 0x49A1, 0x49A2,
+ /* U+4480 */ 0x49A3, 0x49A4, 0x49A5, 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49B0,
+ /* U+4488 */ 0x49B1, 0x49B2, 0x49B3, 0x49B4, 0x49B5, 0x49B6, 0x49B7, 0x49B8,
+ /* U+4490 */ 0x49B9, 0x49C0, 0x49C1, 0x49C2, 0x49C3, 0x49C4, 0x49C5, 0x49C6,
+ /* U+4498 */ 0x49C7, 0x49C8, 0x49C9, 0x49D0, 0x49D1, 0x49D2, 0x49D3, 0x49D4,
+ /* U+44A0 */ 0x49D5, 0x49D6, 0x49D7, 0x49D8, 0x49D9, 0x49E0, 0x49E1, 0x49E2,
+ /* U+44A8 */ 0x49E3, 0x49E4, 0x49E5, 0x49E6, 0x49E7, 0x49E8, 0x49E9, 0x49F0,
+ /* U+44B0 */ 0x49F1, 0x49F2, 0x49F3, 0x49F4, 0x49F5, 0x49F6, 0x49F7, 0x49F8,
+ /* U+44B8 */ 0x49F9, 0x4A00, 0x4A01, 0x4A02, 0x4A03, 0x4A04, 0x4A05, 0x4A06,
+ /* U+44C0 */ 0x4A07, 0x4A08, 0x4A09, 0x4A10, 0x4A11, 0x4A12, 0x4A13, 0x4A14,
+ /* U+44C8 */ 0x4A15, 0x4A16, 0x4A17, 0x4A18, 0x4A19, 0x4A20, 0x4A21, 0x4A22,
+ /* U+44D0 */ 0x4A23, 0x4A24, 0x4A25, 0x4A26, 0x4A27, 0x4A28, 0xFE7B,
+ /* Contiguous area: U+464C .. U+478D */
+ /* U+464C */ 0xFE7D, 0x4C82, 0x4C83, 0x4C84,
+ /* U+4650 */ 0x4C85, 0x4C86, 0x4C87, 0x4C88, 0x4C89, 0x4C90, 0x4C91, 0x4C92,
+ /* U+4658 */ 0x4C93, 0x4C94, 0x4C95, 0x4C96, 0x4C97, 0x4C98, 0x4C99, 0x4CA0,
+ /* U+4660 */ 0x4CA1, 0xFE7C, 0x4CA2, 0x4CA3, 0x4CA4, 0x4CA5, 0x4CA6, 0x4CA7,
+ /* U+4668 */ 0x4CA8, 0x4CA9, 0x4CB0, 0x4CB1, 0x4CB2, 0x4CB3, 0x4CB4, 0x4CB5,
+ /* U+4670 */ 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, 0x4CC0, 0x4CC1, 0x4CC2, 0x4CC3,
+ /* U+4678 */ 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8, 0x4CC9, 0x4CD0, 0x4CD1,
+ /* U+4680 */ 0x4CD2, 0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, 0x4CD8, 0x4CD9,
+ /* U+4688 */ 0x4CE0, 0x4CE1, 0x4CE2, 0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, 0x4CE7,
+ /* U+4690 */ 0x4CE8, 0x4CE9, 0x4CF0, 0x4CF1, 0x4CF2, 0x4CF3, 0x4CF4, 0x4CF5,
+ /* U+4698 */ 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4D00, 0x4D01, 0x4D02, 0x4D03,
+ /* U+46A0 */ 0x4D04, 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, 0x4D10, 0x4D11,
+ /* U+46A8 */ 0x4D12, 0x4D13, 0x4D14, 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19,
+ /* U+46B0 */ 0x4D20, 0x4D21, 0x4D22, 0x4D23, 0x4D24, 0x4D25, 0x4D26, 0x4D27,
+ /* U+46B8 */ 0x4D28, 0x4D29, 0x4D30, 0x4D31, 0x4D32, 0x4D33, 0x4D34, 0x4D35,
+ /* U+46C0 */ 0x4D36, 0x4D37, 0x4D38, 0x4D39, 0x4D40, 0x4D41, 0x4D42, 0x4D43,
+ /* U+46C8 */ 0x4D44, 0x4D45, 0x4D46, 0x4D47, 0x4D48, 0x4D49, 0x4D50, 0x4D51,
+ /* U+46D0 */ 0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56, 0x4D57, 0x4D58, 0x4D59,
+ /* U+46D8 */ 0x4D60, 0x4D61, 0x4D62, 0x4D63, 0x4D64, 0x4D65, 0x4D66, 0x4D67,
+ /* U+46E0 */ 0x4D68, 0x4D69, 0x4D70, 0x4D71, 0x4D72, 0x4D73, 0x4D74, 0x4D75,
+ /* U+46E8 */ 0x4D76, 0x4D77, 0x4D78, 0x4D79, 0x4D80, 0x4D81, 0x4D82, 0x4D83,
+ /* U+46F0 */ 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, 0x4D89, 0x4D90, 0x4D91,
+ /* U+46F8 */ 0x4D92, 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, 0x4D98, 0x4D99,
+ /* U+4700 */ 0x4DA0, 0x4DA1, 0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6, 0x4DA7,
+ /* U+4708 */ 0x4DA8, 0x4DA9, 0x4DB0, 0x4DB1, 0x4DB2, 0x4DB3, 0x4DB4, 0x4DB5,
+ /* U+4710 */ 0x4DB6, 0x4DB7, 0x4DB8, 0x4DB9, 0x4DC0, 0x4DC1, 0x4DC2, 0x4DC3,
+ /* U+4718 */ 0x4DC4, 0x4DC5, 0x4DC6, 0x4DC7, 0x4DC8, 0x4DC9, 0x4DD0, 0x4DD1,
+ /* U+4720 */ 0x4DD2, 0x4DD3, 0x4DD4, 0xFE80, 0x4DD5, 0x4DD6, 0x4DD7, 0x4DD8,
+ /* U+4728 */ 0x4DD9, 0xFE81, 0x4DE0, 0x4DE1, 0x4DE2, 0x4DE3, 0x4DE4, 0x4DE5,
+ /* U+4730 */ 0x4DE6, 0x4DE7, 0x4DE8, 0x4DE9, 0x4DF0, 0x4DF1, 0x4DF2, 0x4DF3,
+ /* U+4738 */ 0x4DF4, 0x4DF5, 0x4DF6, 0x4DF7, 0x4DF8, 0x4DF9, 0x4E00, 0x4E01,
+ /* U+4740 */ 0x4E02, 0x4E03, 0x4E04, 0x4E05, 0x4E06, 0x4E07, 0x4E08, 0x4E09,
+ /* U+4748 */ 0x4E10, 0x4E11, 0x4E12, 0x4E13, 0x4E14, 0x4E15, 0x4E16, 0x4E17,
+ /* U+4750 */ 0x4E18, 0x4E19, 0x4E20, 0x4E21, 0x4E22, 0x4E23, 0x4E24, 0x4E25,
+ /* U+4758 */ 0x4E26, 0x4E27, 0x4E28, 0x4E29, 0x4E30, 0x4E31, 0x4E32, 0x4E33,
+ /* U+4760 */ 0x4E34, 0x4E35, 0x4E36, 0x4E37, 0x4E38, 0x4E39, 0x4E40, 0x4E41,
+ /* U+4768 */ 0x4E42, 0x4E43, 0x4E44, 0x4E45, 0x4E46, 0x4E47, 0x4E48, 0x4E49,
+ /* U+4770 */ 0x4E50, 0x4E51, 0x4E52, 0x4E53, 0x4E54, 0x4E55, 0x4E56, 0x4E57,
+ /* U+4778 */ 0x4E58, 0x4E59, 0x4E60, 0x4E61, 0xFE82, 0x4E62, 0x4E63, 0x4E64,
+ /* U+4780 */ 0x4E65, 0x4E66, 0x4E67, 0x4E68, 0x4E69, 0x4E70, 0x4E71, 0x4E72,
+ /* U+4788 */ 0x4E73, 0x4E74, 0x4E75, 0x4E76, 0x4E77, 0xFE83,
+ /* Contiguous area: U+4947 .. U+49B7 */
+ /* U+4947 */ 0xFE85,
+ /* U+4948 */ 0x5159, 0x5160, 0x5161, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166,
+ /* U+4950 */ 0x5167, 0x5168, 0x5169, 0x5170, 0x5171, 0x5172, 0x5173, 0x5174,
+ /* U+4958 */ 0x5175, 0x5176, 0x5177, 0x5178, 0x5179, 0x5180, 0x5181, 0x5182,
+ /* U+4960 */ 0x5183, 0x5184, 0x5185, 0x5186, 0x5187, 0x5188, 0x5189, 0x5190,
+ /* U+4968 */ 0x5191, 0x5192, 0x5193, 0x5194, 0x5195, 0x5196, 0x5197, 0x5198,
+ /* U+4970 */ 0x5199, 0x51A0, 0x51A1, 0x51A2, 0x51A3, 0x51A4, 0x51A5, 0x51A6,
+ /* U+4978 */ 0x51A7, 0x51A8, 0xFE86, 0x51A9, 0x51B0, 0xFE87, 0x51B1, 0x51B2,
+ /* U+4980 */ 0x51B3, 0x51B4, 0xFE88, 0xFE89, 0x51B5, 0xFE8A, 0xFE8B, 0x51B6,
+ /* U+4988 */ 0x51B7, 0x51B8, 0x51B9, 0x51C0, 0x51C1, 0x51C2, 0x51C3, 0x51C4,
+ /* U+4990 */ 0x51C5, 0x51C6, 0x51C7, 0x51C8, 0x51C9, 0x51D0, 0x51D1, 0x51D2,
+ /* U+4998 */ 0x51D3, 0x51D4, 0x51D5, 0xFE8D, 0x51D6, 0x51D7, 0x51D8, 0xFE8C,
+ /* U+49A0 */ 0x51D9, 0x51E0, 0x51E1, 0x51E2, 0x51E3, 0x51E4, 0x51E5, 0x51E6,
+ /* U+49A8 */ 0x51E7, 0x51E8, 0x51E9, 0x51F0, 0x51F1, 0x51F2, 0x51F3, 0x51F4,
+ /* U+49B0 */ 0x51F5, 0x51F6, 0x51F7, 0x51F8, 0x51F9, 0x5200, 0xFE8F, 0xFE8E,
+ /* Contiguous area: U+4C77 .. U+9FA5 */
+ /* U+4C77 */ 0xFE96,
+ /* U+4C78 */ 0x5664, 0x5665, 0x5666, 0x5667, 0x5668, 0x5669, 0x5670, 0x5671,
+ /* U+4C80 */ 0x5672, 0x5673, 0x5674, 0x5675, 0x5676, 0x5677, 0x5678, 0x5679,
+ /* U+4C88 */ 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5685, 0x5686, 0x5687,
+ /* U+4C90 */ 0x5688, 0x5689, 0x5690, 0x5691, 0x5692, 0x5693, 0x5694, 0x5695,
+ /* U+4C98 */ 0x5696, 0x5697, 0x5698, 0x5699, 0x56A0, 0x56A1, 0x56A2, 0xFE93,
+ /* U+4CA0 */ 0xFE94, 0xFE95, 0xFE97, 0xFE92, 0x56A3, 0x56A4, 0x56A5, 0x56A6,
+ /* U+4CA8 */ 0x56A7, 0x56A8, 0x56A9, 0x56B0, 0x56B1, 0x56B2, 0x56B3, 0x56B4,
+ /* U+4CB0 */ 0x56B5, 0x56B6, 0x56B7, 0x56B8, 0x56B9, 0x56C0, 0x56C1, 0x56C2,
+ /* U+4CB8 */ 0x56C3, 0x56C4, 0x56C5, 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56D0,
+ /* U+4CC0 */ 0x56D1, 0x56D2, 0x56D3, 0x56D4, 0x56D5, 0x56D6, 0x56D7, 0x56D8,
+ /* U+4CC8 */ 0x56D9, 0x56E0, 0x56E1, 0x56E2, 0x56E3, 0x56E4, 0x56E5, 0x56E6,
+ /* U+4CD0 */ 0x56E7, 0x56E8, 0x56E9, 0x56F0, 0x56F1, 0x56F2, 0x56F3, 0x56F4,
+ /* U+4CD8 */ 0x56F5, 0x56F6, 0x56F7, 0x56F8, 0x56F9, 0x5700, 0x5701, 0x5702,
+ /* U+4CE0 */ 0x5703, 0x5704, 0x5705, 0x5706, 0x5707, 0x5708, 0x5709, 0x5710,
+ /* U+4CE8 */ 0x5711, 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718,
+ /* U+4CF0 */ 0x5719, 0x5720, 0x5721, 0x5722, 0x5723, 0x5724, 0x5725, 0x5726,
+ /* U+4CF8 */ 0x5727, 0x5728, 0x5729, 0x5730, 0x5731, 0x5732, 0x5733, 0x5734,
+ /* U+4D00 */ 0x5735, 0x5736, 0x5737, 0x5738, 0x5739, 0x5740, 0x5741, 0x5742,
+ /* U+4D08 */ 0x5743, 0x5744, 0x5745, 0x5746, 0x5747, 0x5748, 0x5749, 0x5750,
+ /* U+4D10 */ 0x5751, 0x5752, 0x5753, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C,
+ /* U+4D18 */ 0xFE9D, 0xFE9E, 0x5754, 0x5755, 0x5756, 0x5757, 0x5758, 0x5759,
+ /* U+4D20 */ 0x5760, 0x5761, 0x5762, 0x5763, 0x5764, 0x5765, 0x5766, 0x5767,
+ /* U+4D28 */ 0x5768, 0x5769, 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775,
+ /* U+4D30 */ 0x5776, 0x5777, 0x5778, 0x5779, 0x5780, 0x5781, 0x5782, 0x5783,
+ /* U+4D38 */ 0x5784, 0x5785, 0x5786, 0x5787, 0x5788, 0x5789, 0x5790, 0x5791,
+ /* U+4D40 */ 0x5792, 0x5793, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799,
+ /* U+4D48 */ 0x57A0, 0x57A1, 0x57A2, 0x57A3, 0x57A4, 0x57A5, 0x57A6, 0x57A7,
+ /* U+4D50 */ 0x57A8, 0x57A9, 0x57B0, 0x57B1, 0x57B2, 0x57B3, 0x57B4, 0x57B5,
+ /* U+4D58 */ 0x57B6, 0x57B7, 0x57B8, 0x57B9, 0x57C0, 0x57C1, 0x57C2, 0x57C3,
+ /* U+4D60 */ 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57D0, 0x57D1,
+ /* U+4D68 */ 0x57D2, 0x57D3, 0x57D4, 0x57D5, 0x57D6, 0x57D7, 0x57D8, 0x57D9,
+ /* U+4D70 */ 0x5800, 0x5801, 0x5802, 0x5803, 0x5804, 0x5805, 0x5806, 0x5807,
+ /* U+4D78 */ 0x5808, 0x5809, 0x5810, 0x5811, 0x5812, 0x5813, 0x5814, 0x5815,
+ /* U+4D80 */ 0x5816, 0x5817, 0x5818, 0x5819, 0x5820, 0x5821, 0x5822, 0x5823,
+ /* U+4D88 */ 0x5824, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x5830, 0x5831,
+ /* U+4D90 */ 0x5832, 0x5833, 0x5834, 0x5835, 0x5836, 0x5837, 0x5838, 0x5839,
+ /* U+4D98 */ 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, 0x5847,
+ /* U+4DA0 */ 0x5848, 0x5849, 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855,
+ /* U+4DA8 */ 0x5856, 0x5857, 0x5858, 0x5859, 0x5860, 0x5861, 0xFE9F, 0x5862,
+ /* U+4DB0 */ 0x5863, 0x5864, 0x5865, 0x5866, 0x5867, 0x5868, 0x5869, 0x5870,
+ /* U+4DB8 */ 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878,
+ /* U+4DC0 */ 0x5879, 0x5880, 0x5881, 0x5882, 0x5883, 0x5884, 0x5885, 0x5886,
+ /* U+4DC8 */ 0x5887, 0x5888, 0x5889, 0x5890, 0x5891, 0x5892, 0x5893, 0x5894,
+ /* U+4DD0 */ 0x5895, 0x5896, 0x5897, 0x5898, 0x5899, 0x58A0, 0x58A1, 0x58A2,
+ /* U+4DD8 */ 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58A8, 0x58A9, 0x58B0,
+ /* U+4DE0 */ 0x58B1, 0x58B2, 0x58B3, 0x58B4, 0x58B5, 0x58B6, 0x58B7, 0x58B8,
+ /* U+4DE8 */ 0x58B9, 0x58C0, 0x58C1, 0x58C2, 0x58C3, 0x58C4, 0x58C5, 0x58C6,
+ /* U+4DF0 */ 0x58C7, 0x58C8, 0x58C9, 0x58D0, 0x58D1, 0x58D2, 0x58D3, 0x58D4,
+ /* U+4DF8 */ 0x58D5, 0x58D6, 0x58D7, 0x58D8, 0x58D9, 0x58E0, 0x58E1, 0x58E2,
+ /* U+4E00 */ 0xD2BB, 0xB6A1, 0x8140, 0xC6DF, 0x8141, 0x8142, 0x8143, 0xCDF2,
+ /* U+4E08 */ 0xD5C9, 0xC8FD, 0xC9CF, 0xCFC2, 0xD8A2, 0xB2BB, 0xD3EB, 0x8144,
+ /* U+4E10 */ 0xD8A4, 0xB3F3, 0x8145, 0xD7A8, 0xC7D2, 0xD8A7, 0xCAC0, 0x8146,
+ /* U+4E18 */ 0xC7F0, 0xB1FB, 0xD2B5, 0xB4D4, 0xB6AB, 0xCBBF, 0xD8A9, 0x8147,
+ /* U+4E20 */ 0x8148, 0x8149, 0xB6AA, 0x814A, 0xC1BD, 0xD1CF, 0x814B, 0xC9A5,
+ /* U+4E28 */ 0xD8AD, 0x814C, 0xB8F6, 0xD1BE, 0xE3DC, 0xD6D0, 0x814D, 0x814E,
+ /* U+4E30 */ 0xB7E1, 0x814F, 0xB4AE, 0x8150, 0xC1D9, 0x8151, 0xD8BC, 0x8152,
+ /* U+4E38 */ 0xCDE8, 0xB5A4, 0xCEAA, 0xD6F7, 0x8153, 0xC0F6, 0xBED9, 0xD8AF,
+ /* U+4E40 */ 0x8154, 0x8155, 0x8156, 0xC4CB, 0x8157, 0xBEC3, 0x8158, 0xD8B1,
+ /* U+4E48 */ 0xC3B4, 0xD2E5, 0x8159, 0xD6AE, 0xCEDA, 0xD5A7, 0xBAF5, 0xB7A6,
+ /* U+4E50 */ 0xC0D6, 0x815A, 0xC6B9, 0xC5D2, 0xC7C7, 0x815B, 0xB9D4, 0x815C,
+ /* U+4E58 */ 0xB3CB, 0xD2D2, 0x815D, 0x815E, 0xD8BF, 0xBEC5, 0xC6F2, 0xD2B2,
+ /* U+4E60 */ 0xCFB0, 0xCFE7, 0x815F, 0x8160, 0x8161, 0x8162, 0xCAE9, 0x8163,
+ /* U+4E68 */ 0x8164, 0xD8C0, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816A,
+ /* U+4E70 */ 0xC2F2, 0xC2D2, 0x816B, 0xC8E9, 0x816C, 0x816D, 0x816E, 0x816F,
+ /* U+4E78 */ 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0xC7AC, 0x8176,
+ /* U+4E80 */ 0x8177, 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0xC1CB, 0x817D,
+ /* U+4E88 */ 0xD3E8, 0xD5F9, 0x817E, 0xCAC2, 0xB6FE, 0xD8A1, 0xD3DA, 0xBFF7,
+ /* U+4E90 */ 0x8180, 0xD4C6, 0xBBA5, 0xD8C1, 0xCEE5, 0xBEAE, 0x8181, 0x8182,
+ /* U+4E98 */ 0xD8A8, 0x8183, 0xD1C7, 0xD0A9, 0x8184, 0x8185, 0x8186, 0xD8BD,
+ /* U+4EA0 */ 0xD9EF, 0xCDF6, 0xBFBA, 0x8187, 0xBDBB, 0xBAA5, 0xD2E0, 0xB2FA,
+ /* U+4EA8 */ 0xBAE0, 0xC4B6, 0x8188, 0xCFED, 0xBEA9, 0xCDA4, 0xC1C1, 0x8189,
+ /* U+4EB0 */ 0x818A, 0x818B, 0xC7D7, 0xD9F1, 0x818C, 0xD9F4, 0x818D, 0x818E,
+ /* U+4EB8 */ 0x818F, 0x8190, 0xC8CB, 0xD8E9, 0x8191, 0x8192, 0x8193, 0xD2DA,
+ /* U+4EC0 */ 0xCAB2, 0xC8CA, 0xD8EC, 0xD8EA, 0xD8C6, 0xBDF6, 0xC6CD, 0xB3F0,
+ /* U+4EC8 */ 0x8194, 0xD8EB, 0xBDF1, 0xBDE9, 0x8195, 0xC8D4, 0xB4D3, 0x8196,
+ /* U+4ED0 */ 0x8197, 0xC2D8, 0x8198, 0xB2D6, 0xD7D0, 0xCACB, 0xCBFB, 0xD5CC,
+ /* U+4ED8 */ 0xB8B6, 0xCFC9, 0x8199, 0x819A, 0x819B, 0xD9DA, 0xD8F0, 0xC7AA,
+ /* U+4EE0 */ 0x819C, 0xD8EE, 0x819D, 0xB4FA, 0xC1EE, 0xD2D4, 0x819E, 0x819F,
+ /* U+4EE8 */ 0xD8ED, 0x81A0, 0xD2C7, 0xD8EF, 0xC3C7, 0x81A1, 0x81A2, 0x81A3,
+ /* U+4EF0 */ 0xD1F6, 0x81A4, 0xD6D9, 0xD8F2, 0x81A5, 0xD8F5, 0xBCFE, 0xBCDB,
+ /* U+4EF8 */ 0x81A6, 0x81A7, 0x81A8, 0xC8CE, 0x81A9, 0xB7DD, 0x81AA, 0xB7C2,
+ /* U+4F00 */ 0x81AB, 0xC6F3, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1,
+ /* U+4F08 */ 0x81B2, 0xD8F8, 0xD2C1, 0x81B3, 0x81B4, 0xCEE9, 0xBCBF, 0xB7FC,
+ /* U+4F10 */ 0xB7A5, 0xD0DD, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0xD6DA,
+ /* U+4F18 */ 0xD3C5, 0xBBEF, 0xBBE1, 0xD8F1, 0x81BA, 0x81BB, 0xC9A1, 0xCEB0,
+ /* U+4F20 */ 0xB4AB, 0x81BC, 0xD8F3, 0x81BD, 0xC9CB, 0xD8F6, 0xC2D7, 0xD8F7,
+ /* U+4F28 */ 0x81BE, 0x81BF, 0xCEB1, 0xD8F9, 0x81C0, 0x81C1, 0x81C2, 0xB2AE,
+ /* U+4F30 */ 0xB9C0, 0x81C3, 0xD9A3, 0x81C4, 0xB0E9, 0x81C5, 0xC1E6, 0x81C6,
+ /* U+4F38 */ 0xC9EC, 0x81C7, 0xCBC5, 0x81C8, 0xCBC6, 0xD9A4, 0x81C9, 0x81CA,
+ /* U+4F40 */ 0x81CB, 0x81CC, 0x81CD, 0xB5E8, 0x81CE, 0x81CF, 0xB5AB, 0x81D0,
+ /* U+4F48 */ 0x81D1, 0x81D2, 0x81D3, 0x81D4, 0x81D5, 0xCEBB, 0xB5CD, 0xD7A1,
+ /* U+4F50 */ 0xD7F4, 0xD3D3, 0x81D6, 0xCCE5, 0x81D7, 0xBACE, 0x81D8, 0xD9A2,
+ /* U+4F58 */ 0xD9DC, 0xD3E0, 0xD8FD, 0xB7F0, 0xD7F7, 0xD8FE, 0xD8FA, 0xD9A1,
+ /* U+4F60 */ 0xC4E3, 0x81D9, 0x81DA, 0xD3B6, 0xD8F4, 0xD9DD, 0x81DB, 0xD8FB,
+ /* U+4F68 */ 0x81DC, 0xC5E5, 0x81DD, 0x81DE, 0xC0D0, 0x81DF, 0x81E0, 0xD1F0,
+ /* U+4F70 */ 0xB0DB, 0x81E1, 0x81E2, 0xBCD1, 0xD9A6, 0x81E3, 0xD9A5, 0x81E4,
+ /* U+4F78 */ 0x81E5, 0x81E6, 0x81E7, 0xD9AC, 0xD9AE, 0x81E8, 0xD9AB, 0xCAB9,
+ /* U+4F80 */ 0x81E9, 0x81EA, 0x81EB, 0xD9A9, 0xD6B6, 0x81EC, 0x81ED, 0x81EE,
+ /* U+4F88 */ 0xB3DE, 0xD9A8, 0x81EF, 0xC0FD, 0x81F0, 0xCACC, 0x81F1, 0xD9AA,
+ /* U+4F90 */ 0x81F2, 0xD9A7, 0x81F3, 0x81F4, 0xD9B0, 0x81F5, 0x81F6, 0xB6B1,
+ /* U+4F98 */ 0x81F7, 0x81F8, 0x81F9, 0xB9A9, 0x81FA, 0xD2C0, 0x81FB, 0x81FC,
+ /* U+4FA0 */ 0xCFC0, 0x81FD, 0x81FE, 0xC2C2, 0x8240, 0xBDC4, 0xD5EC, 0xB2E0,
+ /* U+4FA8 */ 0xC7C8, 0xBFEB, 0xD9AD, 0x8241, 0xD9AF, 0x8242, 0xCEEA, 0xBAEE,
+ /* U+4FB0 */ 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0xC7D6, 0x8248, 0x8249,
+ /* U+4FB8 */ 0x824A, 0x824B, 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0xB1E3,
+ /* U+4FC0 */ 0x8251, 0x8252, 0x8253, 0xB4D9, 0xB6ED, 0xD9B4, 0x8254, 0x8255,
+ /* U+4FC8 */ 0x8256, 0x8257, 0xBFA1, 0x8258, 0x8259, 0x825A, 0xD9DE, 0xC7CE,
+ /* U+4FD0 */ 0xC0FE, 0xD9B8, 0x825B, 0x825C, 0x825D, 0x825E, 0x825F, 0xCBD7,
+ /* U+4FD8 */ 0xB7FD, 0x8260, 0xD9B5, 0x8261, 0xD9B7, 0xB1A3, 0xD3E1, 0xD9B9,
+ /* U+4FE0 */ 0x8262, 0xD0C5, 0x8263, 0xD9B6, 0x8264, 0x8265, 0xD9B1, 0x8266,
+ /* U+4FE8 */ 0xD9B2, 0xC1A9, 0xD9B3, 0x8267, 0x8268, 0xBCF3, 0xD0DE, 0xB8A9,
+ /* U+4FF0 */ 0x8269, 0xBEE3, 0x826A, 0xD9BD, 0x826B, 0x826C, 0x826D, 0x826E,
+ /* U+4FF8 */ 0xD9BA, 0x826F, 0xB0B3, 0x8270, 0x8271, 0x8272, 0xD9C2, 0x8273,
+ /* U+5000 */ 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B,
+ /* U+5008 */ 0x827C, 0x827D, 0x827E, 0x8280, 0xD9C4, 0xB1B6, 0x8281, 0xD9BF,
+ /* U+5010 */ 0x8282, 0x8283, 0xB5B9, 0x8284, 0xBEF3, 0x8285, 0x8286, 0x8287,
+ /* U+5018 */ 0xCCC8, 0xBAF2, 0xD2D0, 0x8288, 0xD9C3, 0x8289, 0x828A, 0xBDE8,
+ /* U+5020 */ 0x828B, 0xB3AB, 0x828C, 0x828D, 0x828E, 0xD9C5, 0xBEEB, 0x828F,
+ /* U+5028 */ 0xD9C6, 0xD9BB, 0xC4DF, 0x8290, 0xD9BE, 0xD9C1, 0xD9C0, 0x8291,
+ /* U+5030 */ 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299,
+ /* U+5038 */ 0x829A, 0x829B, 0xD5AE, 0x829C, 0xD6B5, 0x829D, 0xC7E3, 0x829E,
+ /* U+5040 */ 0x829F, 0x82A0, 0x82A1, 0xD9C8, 0x82A2, 0x82A3, 0x82A4, 0xBCD9,
+ /* U+5048 */ 0xD9CA, 0x82A5, 0x82A6, 0x82A7, 0xD9BC, 0x82A8, 0xD9CB, 0xC6AB,
+ /* U+5050 */ 0x82A9, 0x82AA, 0x82AB, 0x82AC, 0x82AD, 0xD9C9, 0x82AE, 0x82AF,
+ /* U+5058 */ 0x82B0, 0x82B1, 0xD7F6, 0x82B2, 0xCDA3, 0x82B3, 0x82B4, 0x82B5,
+ /* U+5060 */ 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0xBDA1, 0x82BB, 0x82BC,
+ /* U+5068 */ 0x82BD, 0x82BE, 0x82BF, 0x82C0, 0xD9CC, 0x82C1, 0x82C2, 0x82C3,
+ /* U+5070 */ 0x82C4, 0x82C5, 0x82C6, 0x82C7, 0x82C8, 0x82C9, 0xC5BC, 0xCDB5,
+ /* U+5078 */ 0x82CA, 0x82CB, 0x82CC, 0xD9CD, 0x82CD, 0x82CE, 0xD9C7, 0xB3A5,
+ /* U+5080 */ 0xBFFE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0xB8B5, 0x82D3, 0x82D4,
+ /* U+5088 */ 0xC0FC, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0xB0F8, 0x82D9, 0x82DA,
+ /* U+5090 */ 0x82DB, 0x82DC, 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2,
+ /* U+5098 */ 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA,
+ /* U+50A0 */ 0x82EB, 0x82EC, 0x82ED, 0xB4F6, 0x82EE, 0xD9CE, 0x82EF, 0xD9CF,
+ /* U+50A8 */ 0xB4A2, 0xD9D0, 0x82F0, 0x82F1, 0xB4DF, 0x82F2, 0x82F3, 0x82F4,
+ /* U+50B0 */ 0x82F5, 0x82F6, 0xB0C1, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB,
+ /* U+50B8 */ 0x82FC, 0x82FD, 0xD9D1, 0xC9B5, 0x82FE, 0x8340, 0x8341, 0x8342,
+ /* U+50C0 */ 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A,
+ /* U+50C8 */ 0x834B, 0x834C, 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0xCFF1,
+ /* U+50D0 */ 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0xD9D2, 0x8358,
+ /* U+50D8 */ 0x8359, 0x835A, 0xC1C5, 0x835B, 0x835C, 0x835D, 0x835E, 0x835F,
+ /* U+50E0 */ 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0xD9D6, 0xC9AE,
+ /* U+50E8 */ 0x8366, 0x8367, 0x8368, 0x8369, 0xD9D5, 0xD9D4, 0xD9D7, 0x836A,
+ /* U+50F0 */ 0x836B, 0x836C, 0x836D, 0xCBDB, 0x836E, 0xBDA9, 0x836F, 0x8370,
+ /* U+50F8 */ 0x8371, 0x8372, 0x8373, 0xC6A7, 0x8374, 0x8375, 0x8376, 0x8377,
+ /* U+5100 */ 0x8378, 0x8379, 0x837A, 0x837B, 0x837C, 0x837D, 0xD9D3, 0xD9D8,
+ /* U+5108 */ 0x837E, 0x8380, 0x8381, 0xD9D9, 0x8382, 0x8383, 0x8384, 0x8385,
+ /* U+5110 */ 0x8386, 0x8387, 0xC8E5, 0x8388, 0x8389, 0x838A, 0x838B, 0x838C,
+ /* U+5118 */ 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394,
+ /* U+5120 */ 0x8395, 0xC0DC, 0x8396, 0x8397, 0x8398, 0x8399, 0x839A, 0x839B,
+ /* U+5128 */ 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3,
+ /* U+5130 */ 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8, 0x83A9, 0x83AA, 0x83AB,
+ /* U+5138 */ 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0xB6F9,
+ /* U+5140 */ 0xD8A3, 0xD4CA, 0x83B3, 0xD4AA, 0xD0D6, 0xB3E4, 0xD5D7, 0x83B4,
+ /* U+5148 */ 0xCFC8, 0xB9E2, 0x83B5, 0xBFCB, 0x83B6, 0xC3E2, 0x83B7, 0x83B8,
+ /* U+5150 */ 0x83B9, 0xB6D2, 0x83BA, 0x83BB, 0xCDC3, 0xD9EE, 0xD9F0, 0x83BC,
+ /* U+5158 */ 0x83BD, 0x83BE, 0xB5B3, 0x83BF, 0xB6B5, 0x83C0, 0x83C1, 0x83C2,
+ /* U+5160 */ 0x83C3, 0x83C4, 0xBEA4, 0x83C5, 0x83C6, 0xC8EB, 0x83C7, 0x83C8,
+ /* U+5168 */ 0xC8AB, 0x83C9, 0x83CA, 0xB0CB, 0xB9AB, 0xC1F9, 0xD9E2, 0x83CB,
+ /* U+5170 */ 0xC0BC, 0xB9B2, 0x83CC, 0xB9D8, 0xD0CB, 0xB1F8, 0xC6E4, 0xBEDF,
+ /* U+5178 */ 0xB5E4, 0xD7C8, 0x83CD, 0xD1F8, 0xBCE6, 0xCADE, 0x83CE, 0x83CF,
+ /* U+5180 */ 0xBCBD, 0xD9E6, 0xD8E7, 0x83D0, 0x83D1, 0xC4DA, 0x83D2, 0x83D3,
+ /* U+5188 */ 0xB8D4, 0xC8BD, 0x83D4, 0x83D5, 0xB2E1, 0xD4D9, 0x83D6, 0x83D7,
+ /* U+5190 */ 0x83D8, 0x83D9, 0xC3B0, 0x83DA, 0x83DB, 0xC3E1, 0xDAA2, 0xC8DF,
+ /* U+5198 */ 0x83DC, 0xD0B4, 0x83DD, 0xBEFC, 0xC5A9, 0x83DE, 0x83DF, 0x83E0,
+ /* U+51A0 */ 0xB9DA, 0x83E1, 0xDAA3, 0x83E2, 0xD4A9, 0xDAA4, 0x83E3, 0x83E4,
+ /* U+51A8 */ 0x83E5, 0x83E6, 0x83E7, 0xD9FB, 0xB6AC, 0x83E8, 0x83E9, 0xB7EB,
+ /* U+51B0 */ 0xB1F9, 0xD9FC, 0xB3E5, 0xBEF6, 0x83EA, 0xBFF6, 0xD2B1, 0xC0E4,
+ /* U+51B8 */ 0x83EB, 0x83EC, 0x83ED, 0xB6B3, 0xD9FE, 0xD9FD, 0x83EE, 0x83EF,
+ /* U+51C0 */ 0xBEBB, 0x83F0, 0x83F1, 0x83F2, 0xC6E0, 0x83F3, 0xD7BC, 0xDAA1,
+ /* U+51C8 */ 0x83F4, 0xC1B9, 0x83F5, 0xB5F2, 0xC1E8, 0x83F6, 0x83F7, 0xBCF5,
+ /* U+51D0 */ 0x83F8, 0xB4D5, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE,
+ /* U+51D8 */ 0x8440, 0x8441, 0x8442, 0xC1DD, 0x8443, 0xC4FD, 0x8444, 0x8445,
+ /* U+51E0 */ 0xBCB8, 0xB7B2, 0x8446, 0x8447, 0xB7EF, 0x8448, 0x8449, 0x844A,
+ /* U+51E8 */ 0x844B, 0x844C, 0x844D, 0xD9EC, 0x844E, 0xC6BE, 0x844F, 0xBFAD,
+ /* U+51F0 */ 0xBBCB, 0x8450, 0x8451, 0xB5CA, 0x8452, 0xDBC9, 0xD0D7, 0x8453,
+ /* U+51F8 */ 0xCDB9, 0xB0BC, 0xB3F6, 0xBBF7, 0xDBCA, 0xBAAF, 0x8454, 0xD4E4,
+ /* U+5200 */ 0xB5B6, 0xB5F3, 0xD8D6, 0xC8D0, 0x8455, 0x8456, 0xB7D6, 0xC7D0,
+ /* U+5208 */ 0xD8D7, 0x8457, 0xBFAF, 0x8458, 0x8459, 0xDBBB, 0xD8D8, 0x845A,
+ /* U+5210 */ 0x845B, 0xD0CC, 0xBBAE, 0x845C, 0x845D, 0x845E, 0xEBBE, 0xC1D0,
+ /* U+5218 */ 0xC1F5, 0xD4F2, 0xB8D5, 0xB4B4, 0x845F, 0xB3F5, 0x8460, 0x8461,
+ /* U+5220 */ 0xC9BE, 0x8462, 0x8463, 0x8464, 0xC5D0, 0x8465, 0x8466, 0x8467,
+ /* U+5228 */ 0xC5D9, 0xC0FB, 0x8468, 0xB1F0, 0x8469, 0xD8D9, 0xB9CE, 0x846A,
+ /* U+5230 */ 0xB5BD, 0x846B, 0x846C, 0xD8DA, 0x846D, 0x846E, 0xD6C6, 0xCBA2,
+ /* U+5238 */ 0xC8AF, 0xC9B2, 0xB4CC, 0xBFCC, 0x846F, 0xB9F4, 0x8470, 0xD8DB,
+ /* U+5240 */ 0xD8DC, 0xB6E7, 0xBCC1, 0xCCEA, 0x8471, 0x8472, 0x8473, 0x8474,
+ /* U+5248 */ 0x8475, 0x8476, 0xCFF7, 0x8477, 0xD8DD, 0xC7B0, 0x8478, 0x8479,
+ /* U+5250 */ 0xB9D0, 0xBDA3, 0x847A, 0x847B, 0xCCDE, 0x847C, 0xC6CA, 0x847D,
+ /* U+5258 */ 0x847E, 0x8480, 0x8481, 0x8482, 0xD8E0, 0x8483, 0xD8DE, 0x8484,
+ /* U+5260 */ 0x8485, 0xD8DF, 0x8486, 0x8487, 0x8488, 0xB0FE, 0x8489, 0xBEE7,
+ /* U+5268 */ 0x848A, 0xCAA3, 0xBCF4, 0x848B, 0x848C, 0x848D, 0x848E, 0xB8B1,
+ /* U+5270 */ 0x848F, 0x8490, 0xB8EE, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495,
+ /* U+5278 */ 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0xD8E2, 0x849B, 0xBDCB,
+ /* U+5280 */ 0x849C, 0xD8E4, 0xD8E3, 0x849D, 0x849E, 0x849F, 0x84A0, 0x84A1,
+ /* U+5288 */ 0xC5FC, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8,
+ /* U+5290 */ 0xD8E5, 0x84A9, 0x84AA, 0xD8E6, 0x84AB, 0x84AC, 0x84AD, 0x84AE,
+ /* U+5298 */ 0x84AF, 0x84B0, 0x84B1, 0xC1A6, 0x84B2, 0xC8B0, 0xB0EC, 0xB9A6,
+ /* U+52A0 */ 0xBCD3, 0xCEF1, 0xDBBD, 0xC1D3, 0x84B3, 0x84B4, 0x84B5, 0x84B6,
+ /* U+52A8 */ 0xB6AF, 0xD6FA, 0xC5AC, 0xBDD9, 0xDBBE, 0xDBBF, 0x84B7, 0x84B8,
+ /* U+52B0 */ 0x84B9, 0xC0F8, 0xBEA2, 0xC0CD, 0x84BA, 0x84BB, 0x84BC, 0x84BD,
+ /* U+52B8 */ 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0xDBC0, 0xCAC6,
+ /* U+52C0 */ 0x84C4, 0x84C5, 0x84C6, 0xB2AA, 0x84C7, 0x84C8, 0x84C9, 0xD3C2,
+ /* U+52C8 */ 0x84CA, 0xC3E3, 0x84CB, 0xD1AB, 0x84CC, 0x84CD, 0x84CE, 0x84CF,
+ /* U+52D0 */ 0xDBC2, 0x84D0, 0xC0D5, 0x84D1, 0x84D2, 0x84D3, 0xDBC3, 0x84D4,
+ /* U+52D8 */ 0xBFB1, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0xC4BC,
+ /* U+52E0 */ 0x84DB, 0x84DC, 0x84DD, 0x84DE, 0xC7DA, 0x84DF, 0x84E0, 0x84E1,
+ /* U+52E8 */ 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9,
+ /* U+52F0 */ 0xDBC4, 0x84EA, 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x84F0,
+ /* U+52F8 */ 0x84F1, 0xD9E8, 0xC9D7, 0x84F2, 0x84F3, 0x84F4, 0xB9B4, 0xCEF0,
+ /* U+5300 */ 0xD4C8, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0xB0FC, 0xB4D2, 0x84F9,
+ /* U+5308 */ 0xD0D9, 0x84FA, 0x84FB, 0x84FC, 0x84FD, 0xD9E9, 0x84FE, 0xDECB,
+ /* U+5310 */ 0xD9EB, 0x8540, 0x8541, 0x8542, 0x8543, 0xD8B0, 0xBBAF, 0xB1B1,
+ /* U+5318 */ 0x8544, 0xB3D7, 0xD8CE, 0x8545, 0x8546, 0xD4D1, 0x8547, 0x8548,
+ /* U+5320 */ 0xBDB3, 0xBFEF, 0x8549, 0xCFBB, 0x854A, 0x854B, 0xD8D0, 0x854C,
+ /* U+5328 */ 0x854D, 0x854E, 0xB7CB, 0x854F, 0x8550, 0x8551, 0xD8D1, 0x8552,
+ /* U+5330 */ 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855A,
+ /* U+5338 */ 0x855B, 0xC6A5, 0xC7F8, 0xD2BD, 0x855C, 0x855D, 0xD8D2, 0xC4E4,
+ /* U+5340 */ 0x855E, 0xCAAE, 0x855F, 0xC7A7, 0x8560, 0xD8A6, 0x8561, 0xC9FD,
+ /* U+5348 */ 0xCEE7, 0xBBDC, 0xB0EB, 0x8562, 0x8563, 0x8564, 0xBBAA, 0xD0AD,
+ /* U+5350 */ 0x8565, 0xB1B0, 0xD7E4, 0xD7BF, 0x8566, 0xB5A5, 0xC2F4, 0xC4CF,
+ /* U+5358 */ 0x8567, 0x8568, 0xB2A9, 0x8569, 0xB2B7, 0x856A, 0xB1E5, 0xDFB2,
+ /* U+5360 */ 0xD5BC, 0xBFA8, 0xC2AC, 0xD8D5, 0xC2B1, 0x856B, 0xD8D4, 0xCED4,
+ /* U+5368 */ 0x856C, 0xDAE0, 0x856D, 0xCEC0, 0x856E, 0x856F, 0xD8B4, 0xC3AE,
+ /* U+5370 */ 0xD3A1, 0xCEA3, 0x8570, 0xBCB4, 0xC8B4, 0xC2D1, 0x8571, 0xBEED,
+ /* U+5378 */ 0xD0B6, 0x8572, 0xDAE1, 0x8573, 0x8574, 0x8575, 0x8576, 0xC7E4,
+ /* U+5380 */ 0x8577, 0x8578, 0xB3A7, 0x8579, 0xB6F2, 0xCCFC, 0xC0FA, 0x857A,
+ /* U+5388 */ 0x857B, 0xC0F7, 0x857C, 0xD1B9, 0xD1E1, 0xD8C7, 0x857D, 0x857E,
+ /* U+5390 */ 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0xB2DE, 0x8585, 0x8586,
+ /* U+5398 */ 0xC0E5, 0x8587, 0xBAF1, 0x8588, 0x8589, 0xD8C8, 0x858A, 0xD4AD,
+ /* U+53A0 */ 0x858B, 0x858C, 0xCFE1, 0xD8C9, 0x858D, 0xD8CA, 0xCFC3, 0x858E,
+ /* U+53A8 */ 0xB3F8, 0xBEC7, 0x858F, 0x8590, 0x8591, 0x8592, 0xD8CB, 0x8593,
+ /* U+53B0 */ 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0xDBCC, 0x859A,
+ /* U+53B8 */ 0x859B, 0x859C, 0x859D, 0xC8A5, 0x859E, 0x859F, 0x85A0, 0xCFD8,
+ /* U+53C0 */ 0x85A1, 0xC8FE, 0xB2CE, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x85A6,
+ /* U+53C8 */ 0xD3D6, 0xB2E6, 0xBCB0, 0xD3D1, 0xCBAB, 0xB7B4, 0x85A7, 0x85A8,
+ /* U+53D0 */ 0x85A9, 0xB7A2, 0x85AA, 0x85AB, 0xCAE5, 0x85AC, 0xC8A1, 0xCADC,
+ /* U+53D8 */ 0xB1E4, 0xD0F0, 0x85AD, 0xC5D1, 0x85AE, 0x85AF, 0x85B0, 0xDBC5,
+ /* U+53E0 */ 0xB5FE, 0x85B1, 0x85B2, 0xBFDA, 0xB9C5, 0xBEE4, 0xC1ED, 0x85B3,
+ /* U+53E8 */ 0xDFB6, 0xDFB5, 0xD6BB, 0xBDD0, 0xD5D9, 0xB0C8, 0xB6A3, 0xBFC9,
+ /* U+53F0 */ 0xCCA8, 0xDFB3, 0xCAB7, 0xD3D2, 0x85B4, 0xD8CF, 0xD2B6, 0xBAC5,
+ /* U+53F8 */ 0xCBBE, 0xCCBE, 0x85B5, 0xDFB7, 0xB5F0, 0xDFB4, 0x85B6, 0x85B7,
+ /* U+5400 */ 0x85B8, 0xD3F5, 0x85B9, 0xB3D4, 0xB8F7, 0x85BA, 0xDFBA, 0x85BB,
+ /* U+5408 */ 0xBACF, 0xBCAA, 0xB5F5, 0x85BC, 0xCDAC, 0xC3FB, 0xBAF3, 0xC0F4,
+ /* U+5410 */ 0xCDC2, 0xCFF2, 0xDFB8, 0xCFC5, 0x85BD, 0xC2C0, 0xDFB9, 0xC2F0,
+ /* U+5418 */ 0x85BE, 0x85BF, 0x85C0, 0xBEFD, 0x85C1, 0xC1DF, 0xCDCC, 0xD2F7,
+ /* U+5420 */ 0xB7CD, 0xDFC1, 0x85C2, 0xDFC4, 0x85C3, 0x85C4, 0xB7F1, 0xB0C9,
+ /* U+5428 */ 0xB6D6, 0xB7D4, 0x85C5, 0xBAAC, 0xCCFD, 0xBFD4, 0xCBB1, 0xC6F4,
+ /* U+5430 */ 0x85C6, 0xD6A8, 0xDFC5, 0x85C7, 0xCEE2, 0xB3B3, 0x85C8, 0x85C9,
+ /* U+5438 */ 0xCEFC, 0xB4B5, 0x85CA, 0xCEC7, 0xBAF0, 0x85CB, 0xCEE1, 0x85CC,
+ /* U+5440 */ 0xD1BD, 0x85CD, 0x85CE, 0xDFC0, 0x85CF, 0x85D0, 0xB4F4, 0x85D1,
+ /* U+5448 */ 0xB3CA, 0x85D2, 0xB8E6, 0xDFBB, 0x85D3, 0x85D4, 0x85D5, 0x85D6,
+ /* U+5450 */ 0xC4C5, 0x85D7, 0xDFBC, 0xDFBD, 0xDFBE, 0xC5BB, 0xDFBF, 0xDFC2,
+ /* U+5458 */ 0xD4B1, 0xDFC3, 0x85D8, 0xC7BA, 0xCED8, 0x85D9, 0x85DA, 0x85DB,
+ /* U+5460 */ 0x85DC, 0x85DD, 0xC4D8, 0x85DE, 0xDFCA, 0x85DF, 0xDFCF, 0x85E0,
+ /* U+5468 */ 0xD6DC, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7,
+ /* U+5470 */ 0x85E8, 0xDFC9, 0xDFDA, 0xCEB6, 0x85E9, 0xBAC7, 0xDFCE, 0xDFC8,
+ /* U+5478 */ 0xC5DE, 0x85EA, 0x85EB, 0xC9EB, 0xBAF4, 0xC3FC, 0x85EC, 0x85ED,
+ /* U+5480 */ 0xBED7, 0x85EE, 0xDFC6, 0x85EF, 0xDFCD, 0x85F0, 0xC5D8, 0x85F1,
+ /* U+5488 */ 0x85F2, 0x85F3, 0x85F4, 0xD5A6, 0xBACD, 0x85F5, 0xBECC, 0xD3BD,
+ /* U+5490 */ 0xB8C0, 0x85F6, 0xD6E4, 0x85F7, 0xDFC7, 0xB9BE, 0xBFA7, 0x85F8,
+ /* U+5498 */ 0x85F9, 0xC1FC, 0xDFCB, 0xDFCC, 0x85FA, 0xDFD0, 0x85FB, 0x85FC,
+ /* U+54A0 */ 0x85FD, 0x85FE, 0x8640, 0xDFDB, 0xDFE5, 0x8641, 0xDFD7, 0xDFD6,
+ /* U+54A8 */ 0xD7C9, 0xDFE3, 0xDFE4, 0xE5EB, 0xD2A7, 0xDFD2, 0x8642, 0xBFA9,
+ /* U+54B0 */ 0x8643, 0xD4DB, 0x8644, 0xBFC8, 0xDFD4, 0x8645, 0x8646, 0x8647,
+ /* U+54B8 */ 0xCFCC, 0x8648, 0x8649, 0xDFDD, 0x864A, 0xD1CA, 0x864B, 0xDFDE,
+ /* U+54C0 */ 0xB0A7, 0xC6B7, 0xDFD3, 0x864C, 0xBAE5, 0x864D, 0xB6DF, 0xCDDB,
+ /* U+54C8 */ 0xB9FE, 0xD4D5, 0x864E, 0x864F, 0xDFDF, 0xCFEC, 0xB0A5, 0xDFE7,
+ /* U+54D0 */ 0xDFD1, 0xD1C6, 0xDFD5, 0xDFD8, 0xDFD9, 0xDFDC, 0x8650, 0xBBA9,
+ /* U+54D8 */ 0x8651, 0xDFE0, 0xDFE1, 0x8652, 0xDFE2, 0xDFE6, 0xDFE8, 0xD3B4,
+ /* U+54E0 */ 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0xB8E7, 0xC5B6, 0xDFEA,
+ /* U+54E8 */ 0xC9DA, 0xC1A8, 0xC4C4, 0x8658, 0x8659, 0xBFDE, 0xCFF8, 0x865A,
+ /* U+54F0 */ 0x865B, 0x865C, 0xD5DC, 0xDFEE, 0x865D, 0x865E, 0x865F, 0x8660,
+ /* U+54F8 */ 0x8661, 0x8662, 0xB2B8, 0x8663, 0xBADF, 0xDFEC, 0x8664, 0xDBC1,
+ /* U+5500 */ 0x8665, 0xD1E4, 0x8666, 0x8667, 0x8668, 0x8669, 0xCBF4, 0xB4BD,
+ /* U+5508 */ 0x866A, 0xB0A6, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0xDFF1,
+ /* U+5510 */ 0xCCC6, 0xDFF2, 0x8670, 0x8671, 0xDFED, 0x8672, 0x8673, 0x8674,
+ /* U+5518 */ 0x8675, 0x8676, 0x8677, 0xDFE9, 0x8678, 0x8679, 0x867A, 0x867B,
+ /* U+5520 */ 0xDFEB, 0x867C, 0xDFEF, 0xDFF0, 0xBBBD, 0x867D, 0x867E, 0xDFF3,
+ /* U+5528 */ 0x8680, 0x8681, 0xDFF4, 0x8682, 0xBBA3, 0x8683, 0xCADB, 0xCEA8,
+ /* U+5530 */ 0xE0A7, 0xB3AA, 0x8684, 0xE0A6, 0x8685, 0x8686, 0x8687, 0xE0A1,
+ /* U+5538 */ 0x8688, 0x8689, 0x868A, 0x868B, 0xDFFE, 0x868C, 0xCDD9, 0xDFFC,
+ /* U+5540 */ 0x868D, 0xDFFA, 0x868E, 0xBFD0, 0xD7C4, 0x868F, 0xC9CC, 0x8690,
+ /* U+5548 */ 0x8691, 0xDFF8, 0xB0A1, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696,
+ /* U+5550 */ 0xDFFD, 0x8697, 0x8698, 0x8699, 0x869A, 0xDFFB, 0xE0A2, 0x869B,
+ /* U+5558 */ 0x869C, 0x869D, 0x869E, 0x869F, 0xE0A8, 0x86A0, 0x86A1, 0x86A2,
+ /* U+5560 */ 0x86A3, 0xB7C8, 0x86A4, 0x86A5, 0xC6A1, 0xC9B6, 0xC0B2, 0xDFF5,
+ /* U+5568 */ 0x86A6, 0x86A7, 0xC5BE, 0x86A8, 0xD8C4, 0xDFF9, 0xC4F6, 0x86A9,
+ /* U+5570 */ 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0xE0A3, 0xE0A4, 0xE0A5,
+ /* U+5578 */ 0xD0A5, 0x86AF, 0x86B0, 0xE0B4, 0xCCE4, 0x86B1, 0xE0B1, 0x86B2,
+ /* U+5580 */ 0xBFA6, 0xE0AF, 0xCEB9, 0xE0AB, 0xC9C6, 0x86B3, 0x86B4, 0xC0AE,
+ /* U+5588 */ 0xE0AE, 0xBAED, 0xBAB0, 0xE0A9, 0x86B5, 0x86B6, 0x86B7, 0xDFF6,
+ /* U+5590 */ 0x86B8, 0xE0B3, 0x86B9, 0x86BA, 0xE0B8, 0x86BB, 0x86BC, 0x86BD,
+ /* U+5598 */ 0xB4AD, 0xE0B9, 0x86BE, 0x86BF, 0xCFB2, 0xBAC8, 0x86C0, 0xE0B0,
+ /* U+55A0 */ 0x86C1, 0x86C2, 0x86C3, 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0xD0FA,
+ /* U+55A8 */ 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF,
+ /* U+55B0 */ 0x86D0, 0xE0AC, 0x86D1, 0xD4FB, 0x86D2, 0xDFF7, 0x86D3, 0xC5E7,
+ /* U+55B8 */ 0x86D4, 0xE0AD, 0x86D5, 0xD3F7, 0x86D6, 0xE0B6, 0xE0B7, 0x86D7,
+ /* U+55C0 */ 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0xE0C4, 0xD0E1, 0x86DC, 0x86DD,
+ /* U+55C8 */ 0x86DE, 0xE0BC, 0x86DF, 0x86E0, 0xE0C9, 0xE0CA, 0x86E1, 0x86E2,
+ /* U+55D0 */ 0x86E3, 0xE0BE, 0xE0AA, 0xC9A4, 0xE0C1, 0x86E4, 0xE0B2, 0x86E5,
+ /* U+55D8 */ 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0xCAC8, 0xE0C3, 0x86EA, 0xE0B5,
+ /* U+55E0 */ 0x86EB, 0xCECB, 0x86EC, 0xCBC3, 0xE0CD, 0xE0C6, 0xE0C2, 0x86ED,
+ /* U+55E8 */ 0xE0CB, 0x86EE, 0xE0BA, 0xE0BF, 0xE0C0, 0x86EF, 0x86F0, 0xE0C5,
+ /* U+55F0 */ 0x86F1, 0x86F2, 0xE0C7, 0xE0C8, 0x86F3, 0xE0CC, 0x86F4, 0xE0BB,
+ /* U+55F8 */ 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0xCBD4, 0xE0D5, 0x86FA,
+ /* U+5600 */ 0xE0D6, 0xE0D2, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x8740, 0x8741,
+ /* U+5608 */ 0xE0D0, 0xBCCE, 0x8742, 0x8743, 0xE0D1, 0x8744, 0xB8C2, 0xD8C5,
+ /* U+5610 */ 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C,
+ /* U+5618 */ 0xD0EA, 0x874D, 0x874E, 0xC2EF, 0x874F, 0x8750, 0xE0CF, 0xE0BD,
+ /* U+5620 */ 0x8751, 0x8752, 0x8753, 0xE0D4, 0xE0D3, 0x8754, 0x8755, 0xE0D7,
+ /* U+5628 */ 0x8756, 0x8757, 0x8758, 0x8759, 0xE0DC, 0xE0D8, 0x875A, 0x875B,
+ /* U+5630 */ 0x875C, 0xD6F6, 0xB3B0, 0x875D, 0xD7EC, 0x875E, 0xCBBB, 0x875F,
+ /* U+5638 */ 0x8760, 0xE0DA, 0x8761, 0xCEFB, 0x8762, 0x8763, 0x8764, 0xBAD9,
+ /* U+5640 */ 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C,
+ /* U+5648 */ 0x876D, 0x876E, 0x876F, 0x8770, 0xE0E1, 0xE0DD, 0xD2AD, 0x8771,
+ /* U+5650 */ 0x8772, 0x8773, 0x8774, 0x8775, 0xE0E2, 0x8776, 0x8777, 0xE0DB,
+ /* U+5658 */ 0xE0D9, 0xE0DF, 0x8778, 0x8779, 0xE0E0, 0x877A, 0x877B, 0x877C,
+ /* U+5660 */ 0x877D, 0x877E, 0xE0DE, 0x8780, 0xE0E4, 0x8781, 0x8782, 0x8783,
+ /* U+5668 */ 0xC6F7, 0xD8AC, 0xD4EB, 0xE0E6, 0xCAC9, 0x8784, 0x8785, 0x8786,
+ /* U+5670 */ 0x8787, 0xE0E5, 0x8788, 0x8789, 0x878A, 0x878B, 0xB8C1, 0x878C,
+ /* U+5678 */ 0x878D, 0x878E, 0x878F, 0xE0E7, 0xE0E8, 0x8790, 0x8791, 0x8792,
+ /* U+5680 */ 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0xE0E9, 0xE0E3, 0x8798,
+ /* U+5688 */ 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E, 0xBABF, 0xCCE7,
+ /* U+5690 */ 0x879F, 0x87A0, 0x87A1, 0xE0EA, 0x87A2, 0x87A3, 0x87A4, 0x87A5,
+ /* U+5698 */ 0x87A6, 0x87A7, 0x87A8, 0x87A9, 0x87AA, 0x87AB, 0x87AC, 0x87AD,
+ /* U+56A0 */ 0x87AE, 0x87AF, 0x87B0, 0xCFF9, 0x87B1, 0x87B2, 0x87B3, 0x87B4,
+ /* U+56A8 */ 0x87B5, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BA, 0x87BB, 0xE0EB,
+ /* U+56B0 */ 0x87BC, 0x87BD, 0x87BE, 0x87BF, 0x87C0, 0x87C1, 0x87C2, 0xC8C2,
+ /* U+56B8 */ 0x87C3, 0x87C4, 0x87C5, 0x87C6, 0xBDC0, 0x87C7, 0x87C8, 0x87C9,
+ /* U+56C0 */ 0x87CA, 0x87CB, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D1,
+ /* U+56C8 */ 0x87D2, 0x87D3, 0xC4D2, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8,
+ /* U+56D0 */ 0x87D9, 0x87DA, 0x87DB, 0x87DC, 0xE0EC, 0x87DD, 0x87DE, 0xE0ED,
+ /* U+56D8 */ 0x87DF, 0x87E0, 0xC7F4, 0xCBC4, 0x87E1, 0xE0EE, 0xBBD8, 0xD8B6,
+ /* U+56E0 */ 0xD2F2, 0xE0EF, 0xCDC5, 0x87E2, 0xB6DA, 0x87E3, 0x87E4, 0x87E5,
+ /* U+56E8 */ 0x87E6, 0x87E7, 0x87E8, 0xE0F1, 0x87E9, 0xD4B0, 0x87EA, 0x87EB,
+ /* U+56F0 */ 0xC0A7, 0xB4D1, 0x87EC, 0x87ED, 0xCEA7, 0xE0F0, 0x87EE, 0x87EF,
+ /* U+56F8 */ 0x87F0, 0xE0F2, 0xB9CC, 0x87F1, 0x87F2, 0xB9FA, 0xCDBC, 0xE0F3,
+ /* U+5700 */ 0x87F3, 0x87F4, 0x87F5, 0xC6D4, 0xE0F4, 0x87F6, 0xD4B2, 0x87F7,
+ /* U+5708 */ 0xC8A6, 0xE0F6, 0xE0F5, 0x87F8, 0x87F9, 0x87FA, 0x87FB, 0x87FC,
+ /* U+5710 */ 0x87FD, 0x87FE, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845,
+ /* U+5718 */ 0x8846, 0x8847, 0x8848, 0x8849, 0xE0F7, 0x884A, 0x884B, 0xCDC1,
+ /* U+5720 */ 0x884C, 0x884D, 0x884E, 0xCAA5, 0x884F, 0x8850, 0x8851, 0x8852,
+ /* U+5728 */ 0xD4DA, 0xDBD7, 0xDBD9, 0x8853, 0xDBD8, 0xB9E7, 0xDBDC, 0xDBDD,
+ /* U+5730 */ 0xB5D8, 0x8854, 0x8855, 0xDBDA, 0x8856, 0x8857, 0x8858, 0x8859,
+ /* U+5738 */ 0x885A, 0xDBDB, 0xB3A1, 0xDBDF, 0x885B, 0x885C, 0xBBF8, 0x885D,
+ /* U+5740 */ 0xD6B7, 0x885E, 0xDBE0, 0x885F, 0x8860, 0x8861, 0x8862, 0xBEF9,
+ /* U+5748 */ 0x8863, 0x8864, 0xB7BB, 0x8865, 0xDBD0, 0xCCAE, 0xBFB2, 0xBBB5,
+ /* U+5750 */ 0xD7F8, 0xBFD3, 0x8866, 0x8867, 0x8868, 0x8869, 0x886A, 0xBFE9,
+ /* U+5758 */ 0x886B, 0x886C, 0xBCE1, 0xCCB3, 0xDBDE, 0xB0D3, 0xCEEB, 0xB7D8,
+ /* U+5760 */ 0xD7B9, 0xC6C2, 0x886D, 0x886E, 0xC0A4, 0x886F, 0xCCB9, 0x8870,
+ /* U+5768 */ 0xDBE7, 0xDBE1, 0xC6BA, 0xDBE3, 0x8871, 0xDBE8, 0x8872, 0xC5F7,
+ /* U+5770 */ 0x8873, 0x8874, 0x8875, 0xDBEA, 0x8876, 0x8877, 0xDBE9, 0xBFC0,
+ /* U+5778 */ 0x8878, 0x8879, 0x887A, 0xDBE6, 0xDBE5, 0x887B, 0x887C, 0x887D,
+ /* U+5780 */ 0x887E, 0x8880, 0xB4B9, 0xC0AC, 0xC2A2, 0xDBE2, 0xDBE4, 0x8881,
+ /* U+5788 */ 0x8882, 0x8883, 0x8884, 0xD0CD, 0xDBED, 0x8885, 0x8886, 0x8887,
+ /* U+5790 */ 0x8888, 0x8889, 0xC0DD, 0xDBF2, 0x888A, 0x888B, 0x888C, 0x888D,
+ /* U+5798 */ 0x888E, 0x888F, 0x8890, 0xB6E2, 0x8891, 0x8892, 0x8893, 0x8894,
+ /* U+57A0 */ 0xDBF3, 0xDBD2, 0xB9B8, 0xD4AB, 0xDBEC, 0x8895, 0xBFD1, 0xDBF0,
+ /* U+57A8 */ 0x8896, 0xDBD1, 0x8897, 0xB5E6, 0x8898, 0xDBEB, 0xBFE5, 0x8899,
+ /* U+57B0 */ 0x889A, 0x889B, 0xDBEE, 0x889C, 0xDBF1, 0x889D, 0x889E, 0x889F,
+ /* U+57B8 */ 0xDBF9, 0x88A0, 0x88A1, 0x88A2, 0x88A3, 0x88A4, 0x88A5, 0x88A6,
+ /* U+57C0 */ 0x88A7, 0x88A8, 0xB9A1, 0xB0A3, 0x88A9, 0x88AA, 0x88AB, 0x88AC,
+ /* U+57C8 */ 0x88AD, 0x88AE, 0x88AF, 0xC2F1, 0x88B0, 0x88B1, 0xB3C7, 0xDBEF,
+ /* U+57D0 */ 0x88B2, 0x88B3, 0xDBF8, 0x88B4, 0xC6D2, 0xDBF4, 0x88B5, 0x88B6,
+ /* U+57D8 */ 0xDBF5, 0xDBF7, 0xDBF6, 0x88B7, 0x88B8, 0xDBFE, 0x88B9, 0xD3F2,
+ /* U+57E0 */ 0xB2BA, 0x88BA, 0x88BB, 0x88BC, 0xDBFD, 0x88BD, 0x88BE, 0x88BF,
+ /* U+57E8 */ 0x88C0, 0x88C1, 0x88C2, 0x88C3, 0x88C4, 0xDCA4, 0x88C5, 0xDBFB,
+ /* U+57F0 */ 0x88C6, 0x88C7, 0x88C8, 0x88C9, 0xDBFA, 0x88CA, 0x88CB, 0x88CC,
+ /* U+57F8 */ 0xDBFC, 0xC5E0, 0xBBF9, 0x88CD, 0x88CE, 0xDCA3, 0x88CF, 0x88D0,
+ /* U+5800 */ 0xDCA5, 0x88D1, 0xCCC3, 0x88D2, 0x88D3, 0x88D4, 0xB6D1, 0xDDC0,
+ /* U+5808 */ 0x88D5, 0x88D6, 0x88D7, 0xDCA1, 0x88D8, 0xDCA2, 0x88D9, 0x88DA,
+ /* U+5810 */ 0x88DB, 0xC7B5, 0x88DC, 0x88DD, 0x88DE, 0xB6E9, 0x88DF, 0x88E0,
+ /* U+5818 */ 0x88E1, 0xDCA7, 0x88E2, 0x88E3, 0x88E4, 0x88E5, 0xDCA6, 0x88E6,
+ /* U+5820 */ 0xDCA9, 0xB1A4, 0x88E7, 0x88E8, 0xB5CC, 0x88E9, 0x88EA, 0x88EB,
+ /* U+5828 */ 0x88EC, 0x88ED, 0xBFB0, 0x88EE, 0x88EF, 0x88F0, 0x88F1, 0x88F2,
+ /* U+5830 */ 0xD1DF, 0x88F3, 0x88F4, 0x88F5, 0x88F6, 0xB6C2, 0x88F7, 0x88F8,
+ /* U+5838 */ 0x88F9, 0x88FA, 0x88FB, 0x88FC, 0x88FD, 0x88FE, 0x8940, 0x8941,
+ /* U+5840 */ 0x8942, 0x8943, 0x8944, 0x8945, 0xDCA8, 0x8946, 0x8947, 0x8948,
+ /* U+5848 */ 0x8949, 0x894A, 0x894B, 0x894C, 0xCBFA, 0xEBF3, 0x894D, 0x894E,
+ /* U+5850 */ 0x894F, 0xCBDC, 0x8950, 0x8951, 0xCBFE, 0x8952, 0x8953, 0x8954,
+ /* U+5858 */ 0xCCC1, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0xC8FB, 0x895A,
+ /* U+5860 */ 0x895B, 0x895C, 0x895D, 0x895E, 0x895F, 0xDCAA, 0x8960, 0x8961,
+ /* U+5868 */ 0x8962, 0x8963, 0x8964, 0xCCEE, 0xDCAB, 0x8965, 0x8966, 0x8967,
+ /* U+5870 */ 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F,
+ /* U+5878 */ 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0xDBD3, 0x8976,
+ /* U+5880 */ 0xDCAF, 0xDCAC, 0x8977, 0xBEB3, 0x8978, 0xCAFB, 0x8979, 0x897A,
+ /* U+5888 */ 0x897B, 0xDCAD, 0x897C, 0x897D, 0x897E, 0x8980, 0x8981, 0x8982,
+ /* U+5890 */ 0x8983, 0x8984, 0xC9CA, 0xC4B9, 0x8985, 0x8986, 0x8987, 0x8988,
+ /* U+5898 */ 0x8989, 0xC7BD, 0xDCAE, 0x898A, 0x898B, 0x898C, 0xD4F6, 0xD0E6,
+ /* U+58A0 */ 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994,
+ /* U+58A8 */ 0xC4AB, 0xB6D5, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A,
+ /* U+58B0 */ 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x89A2,
+ /* U+58B8 */ 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0xDBD4, 0x89A7, 0x89A8, 0x89A9,
+ /* U+58C0 */ 0x89AA, 0xB1DA, 0x89AB, 0x89AC, 0x89AD, 0xDBD5, 0x89AE, 0x89AF,
+ /* U+58C8 */ 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7,
+ /* U+58D0 */ 0x89B8, 0xDBD6, 0x89B9, 0x89BA, 0x89BB, 0xBABE, 0x89BC, 0x89BD,
+ /* U+58D8 */ 0x89BE, 0x89BF, 0x89C0, 0x89C1, 0x89C2, 0x89C3, 0x89C4, 0x89C5,
+ /* U+58E0 */ 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0xC8C0, 0x89CA, 0x89CB, 0x89CC,
+ /* U+58E8 */ 0x89CD, 0x89CE, 0x89CF, 0xCABF, 0xC8C9, 0x89D0, 0xD7B3, 0x89D1,
+ /* U+58F0 */ 0xC9F9, 0x89D2, 0x89D3, 0xBFC7, 0x89D4, 0x89D5, 0xBAF8, 0x89D6,
+ /* U+58F8 */ 0x89D7, 0xD2BC, 0x89D8, 0x89D9, 0x89DA, 0x89DB, 0x89DC, 0x89DD,
+ /* U+5900 */ 0x89DE, 0x89DF, 0xE2BA, 0x89E0, 0xB4A6, 0x89E1, 0x89E2, 0xB1B8,
+ /* U+5908 */ 0x89E3, 0x89E4, 0x89E5, 0x89E6, 0x89E7, 0xB8B4, 0x89E8, 0xCFC4,
+ /* U+5910 */ 0x89E9, 0x89EA, 0x89EB, 0x89EC, 0xD9E7, 0xCFA6, 0xCDE2, 0x89ED,
+ /* U+5918 */ 0x89EE, 0xD9ED, 0xB6E0, 0x89EF, 0xD2B9, 0x89F0, 0x89F1, 0xB9BB,
+ /* U+5920 */ 0x89F2, 0x89F3, 0x89F4, 0x89F5, 0xE2B9, 0xE2B7, 0x89F6, 0xB4F3,
+ /* U+5928 */ 0x89F7, 0xCCEC, 0xCCAB, 0xB7F2, 0x89F8, 0xD8B2, 0xD1EB, 0xBABB,
+ /* U+5930 */ 0x89F9, 0xCAA7, 0x89FA, 0x89FB, 0xCDB7, 0x89FC, 0x89FD, 0xD2C4,
+ /* U+5938 */ 0xBFE4, 0xBCD0, 0xB6E1, 0x89FE, 0xDEC5, 0x8A40, 0x8A41, 0x8A42,
+ /* U+5940 */ 0x8A43, 0xDEC6, 0xDBBC, 0x8A44, 0xD1D9, 0x8A45, 0x8A46, 0xC6E6,
+ /* U+5948 */ 0xC4CE, 0xB7EE, 0x8A47, 0xB7DC, 0x8A48, 0x8A49, 0xBFFC, 0xD7E0,
+ /* U+5950 */ 0x8A4A, 0xC6F5, 0x8A4B, 0x8A4C, 0xB1BC, 0xDEC8, 0xBDB1, 0xCCD7,
+ /* U+5958 */ 0xDECA, 0x8A4D, 0xDEC9, 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52,
+ /* U+5960 */ 0xB5EC, 0x8A53, 0xC9DD, 0x8A54, 0x8A55, 0xB0C2, 0x8A56, 0x8A57,
+ /* U+5968 */ 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0x8A5F,
+ /* U+5970 */ 0x8A60, 0x8A61, 0x8A62, 0xC5AE, 0xC5AB, 0x8A63, 0xC4CC, 0x8A64,
+ /* U+5978 */ 0xBCE9, 0xCBFD, 0x8A65, 0x8A66, 0x8A67, 0xBAC3, 0x8A68, 0x8A69,
+ /* U+5980 */ 0x8A6A, 0xE5F9, 0xC8E7, 0xE5FA, 0xCDFD, 0x8A6B, 0xD7B1, 0xB8BE,
+ /* U+5988 */ 0xC2E8, 0x8A6C, 0xC8D1, 0x8A6D, 0x8A6E, 0xE5FB, 0x8A6F, 0x8A70,
+ /* U+5990 */ 0x8A71, 0x8A72, 0xB6CA, 0xBCCB, 0x8A73, 0x8A74, 0xD1FD, 0xE6A1,
+ /* U+5998 */ 0x8A75, 0xC3EE, 0x8A76, 0x8A77, 0x8A78, 0x8A79, 0xE6A4, 0x8A7A,
+ /* U+59A0 */ 0x8A7B, 0x8A7C, 0x8A7D, 0xE5FE, 0xE6A5, 0xCDD7, 0x8A7E, 0x8A80,
+ /* U+59A8 */ 0xB7C1, 0xE5FC, 0xE5FD, 0xE6A3, 0x8A81, 0x8A82, 0xC4DD, 0xE6A8,
+ /* U+59B0 */ 0x8A83, 0x8A84, 0xE6A7, 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A89,
+ /* U+59B8 */ 0x8A8A, 0xC3C3, 0x8A8B, 0xC6DE, 0x8A8C, 0x8A8D, 0xE6AA, 0x8A8E,
+ /* U+59C0 */ 0x8A8F, 0x8A90, 0x8A91, 0x8A92, 0x8A93, 0x8A94, 0xC4B7, 0x8A95,
+ /* U+59C8 */ 0x8A96, 0x8A97, 0xE6A2, 0xCABC, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B,
+ /* U+59D0 */ 0xBDE3, 0xB9C3, 0xE6A6, 0xD0D5, 0xCEAF, 0x8A9C, 0x8A9D, 0xE6A9,
+ /* U+59D8 */ 0xE6B0, 0x8A9E, 0xD2A6, 0x8A9F, 0xBDAA, 0xE6AD, 0x8AA0, 0x8AA1,
+ /* U+59E0 */ 0x8AA2, 0x8AA3, 0x8AA4, 0xE6AF, 0x8AA5, 0xC0D1, 0x8AA6, 0x8AA7,
+ /* U+59E8 */ 0xD2CC, 0x8AA8, 0x8AA9, 0x8AAA, 0xBCA7, 0x8AAB, 0x8AAC, 0x8AAD,
+ /* U+59F0 */ 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5,
+ /* U+59F8 */ 0x8AB6, 0xE6B1, 0x8AB7, 0xD2F6, 0x8AB8, 0x8AB9, 0x8ABA, 0xD7CB,
+ /* U+5A00 */ 0x8ABB, 0xCDFE, 0x8ABC, 0xCDDE, 0xC2A6, 0xE6AB, 0xE6AC, 0xBDBF,
+ /* U+5A08 */ 0xE6AE, 0xE6B3, 0x8ABD, 0x8ABE, 0xE6B2, 0x8ABF, 0x8AC0, 0x8AC1,
+ /* U+5A10 */ 0x8AC2, 0xE6B6, 0x8AC3, 0xE6B8, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7,
+ /* U+5A18 */ 0xC4EF, 0x8AC8, 0x8AC9, 0x8ACA, 0xC4C8, 0x8ACB, 0x8ACC, 0xBEEA,
+ /* U+5A20 */ 0xC9EF, 0x8ACD, 0x8ACE, 0xE6B7, 0x8ACF, 0xB6F0, 0x8AD0, 0x8AD1,
+ /* U+5A28 */ 0x8AD2, 0xC3E4, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8,
+ /* U+5A30 */ 0x8AD9, 0xD3E9, 0xE6B4, 0x8ADA, 0xE6B5, 0x8ADB, 0xC8A2, 0x8ADC,
+ /* U+5A38 */ 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0xE6BD, 0x8AE1, 0x8AE2, 0x8AE3,
+ /* U+5A40 */ 0xE6B9, 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0xC6C5, 0x8AE9,
+ /* U+5A48 */ 0x8AEA, 0xCDF1, 0xE6BB, 0x8AEB, 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF,
+ /* U+5A50 */ 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0xE6BC, 0x8AF5, 0x8AF6,
+ /* U+5A58 */ 0x8AF7, 0x8AF8, 0xBBE9, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD,
+ /* U+5A60 */ 0x8AFE, 0x8B40, 0xE6BE, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0xE6BA,
+ /* U+5A68 */ 0x8B45, 0x8B46, 0xC0B7, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B,
+ /* U+5A70 */ 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0xD3A4, 0xE6BF, 0xC9F4, 0xE6C3,
+ /* U+5A78 */ 0x8B50, 0x8B51, 0xE6C4, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0xD0F6,
+ /* U+5A80 */ 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D,
+ /* U+5A88 */ 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65,
+ /* U+5A90 */ 0x8B66, 0x8B67, 0xC3BD, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6C,
+ /* U+5A98 */ 0x8B6D, 0x8B6E, 0xC3C4, 0xE6C2, 0x8B6F, 0x8B70, 0x8B71, 0x8B72,
+ /* U+5AA0 */ 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A,
+ /* U+5AA8 */ 0x8B7B, 0x8B7C, 0xE6C1, 0x8B7D, 0x8B7E, 0x8B80, 0x8B81, 0x8B82,
+ /* U+5AB0 */ 0x8B83, 0x8B84, 0xE6C7, 0xCFB1, 0x8B85, 0xEBF4, 0x8B86, 0x8B87,
+ /* U+5AB8 */ 0xE6CA, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0xE6C5, 0x8B8D,
+ /* U+5AC0 */ 0x8B8E, 0xBCDE, 0xC9A9, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93,
+ /* U+5AC8 */ 0x8B94, 0xBCB5, 0x8B95, 0x8B96, 0xCFD3, 0x8B97, 0x8B98, 0x8B99,
+ /* U+5AD0 */ 0x8B9A, 0x8B9B, 0xE6C8, 0x8B9C, 0xE6C9, 0x8B9D, 0xE6CE, 0x8B9E,
+ /* U+5AD8 */ 0xE6D0, 0x8B9F, 0x8BA0, 0x8BA1, 0xE6D1, 0x8BA2, 0x8BA3, 0x8BA4,
+ /* U+5AE0 */ 0xE6CB, 0xB5D5, 0x8BA5, 0xE6CC, 0x8BA6, 0x8BA7, 0xE6CF, 0x8BA8,
+ /* U+5AE8 */ 0x8BA9, 0xC4DB, 0x8BAA, 0xE6C6, 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE,
+ /* U+5AF0 */ 0x8BAF, 0xE6CD, 0x8BB0, 0x8BB1, 0x8BB2, 0x8BB3, 0x8BB4, 0x8BB5,
+ /* U+5AF8 */ 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9, 0x8BBA, 0x8BBB, 0x8BBC, 0x8BBD,
+ /* U+5B00 */ 0x8BBE, 0x8BBF, 0x8BC0, 0x8BC1, 0x8BC2, 0x8BC3, 0x8BC4, 0x8BC5,
+ /* U+5B08 */ 0x8BC6, 0xE6D2, 0x8BC7, 0x8BC8, 0x8BC9, 0x8BCA, 0x8BCB, 0x8BCC,
+ /* U+5B10 */ 0x8BCD, 0x8BCE, 0x8BCF, 0x8BD0, 0x8BD1, 0x8BD2, 0xE6D4, 0xE6D3,
+ /* U+5B18 */ 0x8BD3, 0x8BD4, 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, 0x8BD9, 0x8BDA,
+ /* U+5B20 */ 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, 0x8BE0, 0x8BE1, 0x8BE2,
+ /* U+5B28 */ 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6, 0x8BE7, 0x8BE8, 0x8BE9, 0x8BEA,
+ /* U+5B30 */ 0x8BEB, 0x8BEC, 0xE6D5, 0x8BED, 0xD9F8, 0x8BEE, 0x8BEF, 0xE6D6,
+ /* U+5B38 */ 0x8BF0, 0x8BF1, 0x8BF2, 0x8BF3, 0x8BF4, 0x8BF5, 0x8BF6, 0x8BF7,
+ /* U+5B40 */ 0xE6D7, 0x8BF8, 0x8BF9, 0x8BFA, 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE,
+ /* U+5B48 */ 0x8C40, 0x8C41, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C46, 0x8C47,
+ /* U+5B50 */ 0xD7D3, 0xE6DD, 0x8C48, 0xE6DE, 0xBFD7, 0xD4D0, 0x8C49, 0xD7D6,
+ /* U+5B58 */ 0xB4E6, 0xCBEF, 0xE6DA, 0xD8C3, 0xD7CE, 0xD0A2, 0x8C4A, 0xC3CF,
+ /* U+5B60 */ 0x8C4B, 0x8C4C, 0xE6DF, 0xBCBE, 0xB9C2, 0xE6DB, 0xD1A7, 0x8C4D,
+ /* U+5B68 */ 0x8C4E, 0xBAA2, 0xC2CF, 0x8C4F, 0xD8AB, 0x8C50, 0x8C51, 0x8C52,
+ /* U+5B70 */ 0xCAEB, 0xE5EE, 0x8C53, 0xE6DC, 0x8C54, 0xB7F5, 0x8C55, 0x8C56,
+ /* U+5B78 */ 0x8C57, 0x8C58, 0xC8E6, 0x8C59, 0x8C5A, 0xC4F5, 0x8C5B, 0x8C5C,
+ /* U+5B80 */ 0xE5B2, 0xC4FE, 0x8C5D, 0xCBFC, 0xE5B3, 0xD5AC, 0x8C5E, 0xD3EE,
+ /* U+5B88 */ 0xCAD8, 0xB0B2, 0x8C5F, 0xCBCE, 0xCDEA, 0x8C60, 0x8C61, 0xBAEA,
+ /* U+5B90 */ 0x8C62, 0x8C63, 0x8C64, 0xE5B5, 0x8C65, 0xE5B4, 0x8C66, 0xD7DA,
+ /* U+5B98 */ 0xB9D9, 0xD6E6, 0xB6A8, 0xCDF0, 0xD2CB, 0xB1A6, 0xCAB5, 0x8C67,
+ /* U+5BA0 */ 0xB3E8, 0xC9F3, 0xBFCD, 0xD0FB, 0xCAD2, 0xE5B6, 0xBBC2, 0x8C68,
+ /* U+5BA8 */ 0x8C69, 0x8C6A, 0xCFDC, 0xB9AC, 0x8C6B, 0x8C6C, 0x8C6D, 0x8C6E,
+ /* U+5BB0 */ 0xD4D7, 0x8C6F, 0x8C70, 0xBAA6, 0xD1E7, 0xCFFC, 0xBCD2, 0x8C71,
+ /* U+5BB8 */ 0xE5B7, 0xC8DD, 0x8C72, 0x8C73, 0x8C74, 0xBFED, 0xB1F6, 0xCBDE,
+ /* U+5BC0 */ 0x8C75, 0x8C76, 0xBCC5, 0x8C77, 0xBCC4, 0xD2FA, 0xC3DC, 0xBFDC,
+ /* U+5BC8 */ 0x8C78, 0x8C79, 0x8C7A, 0x8C7B, 0xB8BB, 0x8C7C, 0x8C7D, 0x8C7E,
+ /* U+5BD0 */ 0xC3C2, 0x8C80, 0xBAAE, 0xD4A2, 0x8C81, 0x8C82, 0x8C83, 0x8C84,
+ /* U+5BD8 */ 0x8C85, 0x8C86, 0x8C87, 0x8C88, 0x8C89, 0xC7DE, 0xC4AF, 0xB2EC,
+ /* U+5BE0 */ 0x8C8A, 0xB9D1, 0x8C8B, 0x8C8C, 0xE5BB, 0xC1C8, 0x8C8D, 0x8C8E,
+ /* U+5BE8 */ 0xD5AF, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0xE5BC, 0x8C94,
+ /* U+5BF0 */ 0xE5BE, 0x8C95, 0x8C96, 0x8C97, 0x8C98, 0x8C99, 0x8C9A, 0x8C9B,
+ /* U+5BF8 */ 0xB4E7, 0xB6D4, 0xCBC2, 0xD1B0, 0xB5BC, 0x8C9C, 0x8C9D, 0xCAD9,
+ /* U+5C00 */ 0x8C9E, 0xB7E2, 0x8C9F, 0x8CA0, 0xC9E4, 0x8CA1, 0xBDAB, 0x8CA2,
+ /* U+5C08 */ 0x8CA3, 0xCEBE, 0xD7F0, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0xD0A1,
+ /* U+5C10 */ 0x8CA8, 0xC9D9, 0x8CA9, 0x8CAA, 0xB6FB, 0xE6D8, 0xBCE2, 0x8CAB,
+ /* U+5C18 */ 0xB3BE, 0x8CAC, 0xC9D0, 0x8CAD, 0xE6D9, 0xB3A2, 0x8CAE, 0x8CAF,
+ /* U+5C20 */ 0x8CB0, 0x8CB1, 0xDECC, 0x8CB2, 0xD3C8, 0xDECD, 0x8CB3, 0xD2A2,
+ /* U+5C28 */ 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0xDECE, 0x8CB8, 0x8CB9, 0x8CBA,
+ /* U+5C30 */ 0x8CBB, 0xBECD, 0x8CBC, 0x8CBD, 0xDECF, 0x8CBE, 0x8CBF, 0x8CC0,
+ /* U+5C38 */ 0xCAAC, 0xD2FC, 0xB3DF, 0xE5EA, 0xC4E1, 0xBEA1, 0xCEB2, 0xC4F2,
+ /* U+5C40 */ 0xBED6, 0xC6A8, 0xB2E3, 0x8CC1, 0x8CC2, 0xBED3, 0x8CC3, 0x8CC4,
+ /* U+5C48 */ 0xC7FC, 0xCCEB, 0xBDEC, 0xCEDD, 0x8CC5, 0x8CC6, 0xCABA, 0xC6C1,
+ /* U+5C50 */ 0xE5EC, 0xD0BC, 0x8CC7, 0x8CC8, 0x8CC9, 0xD5B9, 0x8CCA, 0x8CCB,
+ /* U+5C58 */ 0x8CCC, 0xE5ED, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0xCAF4, 0x8CD1,
+ /* U+5C60 */ 0xCDC0, 0xC2C5, 0x8CD2, 0xE5EF, 0x8CD3, 0xC2C4, 0xE5F0, 0x8CD4,
+ /* U+5C68 */ 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0xE5F8, 0xCDCD,
+ /* U+5C70 */ 0x8CDB, 0xC9BD, 0x8CDC, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1,
+ /* U+5C78 */ 0x8CE2, 0xD2D9, 0xE1A8, 0x8CE3, 0x8CE4, 0x8CE5, 0x8CE6, 0xD3EC,
+ /* U+5C80 */ 0x8CE7, 0xCBEA, 0xC6F1, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC,
+ /* U+5C88 */ 0xE1AC, 0x8CED, 0x8CEE, 0x8CEF, 0xE1A7, 0xE1A9, 0x8CF0, 0x8CF1,
+ /* U+5C90 */ 0xE1AA, 0xE1AF, 0x8CF2, 0x8CF3, 0xB2ED, 0x8CF4, 0xE1AB, 0xB8DA,
+ /* U+5C98 */ 0xE1AD, 0xE1AE, 0xE1B0, 0xB5BA, 0xE1B1, 0x8CF5, 0x8CF6, 0x8CF7,
+ /* U+5CA0 */ 0x8CF8, 0x8CF9, 0xE1B3, 0xE1B8, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD,
+ /* U+5CA8 */ 0x8CFE, 0xD1D2, 0x8D40, 0xE1B6, 0xE1B5, 0xC1EB, 0x8D41, 0x8D42,
+ /* U+5CB0 */ 0x8D43, 0xE1B7, 0x8D44, 0xD4C0, 0x8D45, 0xE1B2, 0x8D46, 0xE1BA,
+ /* U+5CB8 */ 0xB0B6, 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0xE1B4, 0x8D4B, 0xBFF9,
+ /* U+5CC0 */ 0x8D4C, 0xE1B9, 0x8D4D, 0x8D4E, 0xE1BB, 0x8D4F, 0x8D50, 0x8D51,
+ /* U+5CC8 */ 0x8D52, 0x8D53, 0x8D54, 0xE1BE, 0x8D55, 0x8D56, 0x8D57, 0x8D58,
+ /* U+5CD0 */ 0x8D59, 0x8D5A, 0xE1BC, 0x8D5B, 0x8D5C, 0x8D5D, 0x8D5E, 0x8D5F,
+ /* U+5CD8 */ 0x8D60, 0xD6C5, 0x8D61, 0x8D62, 0x8D63, 0x8D64, 0x8D65, 0x8D66,
+ /* U+5CE0 */ 0x8D67, 0xCFBF, 0x8D68, 0x8D69, 0xE1BD, 0xE1BF, 0xC2CD, 0x8D6A,
+ /* U+5CE8 */ 0xB6EB, 0x8D6B, 0xD3F8, 0x8D6C, 0x8D6D, 0xC7CD, 0x8D6E, 0x8D6F,
+ /* U+5CF0 */ 0xB7E5, 0x8D70, 0x8D71, 0x8D72, 0x8D73, 0x8D74, 0x8D75, 0x8D76,
+ /* U+5CF8 */ 0x8D77, 0x8D78, 0x8D79, 0xBEFE, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D,
+ /* U+5D00 */ 0x8D7E, 0x8D80, 0xE1C0, 0xE1C1, 0x8D81, 0x8D82, 0xE1C7, 0xB3E7,
+ /* U+5D08 */ 0x8D83, 0x8D84, 0x8D85, 0x8D86, 0x8D87, 0x8D88, 0xC6E9, 0x8D89,
+ /* U+5D10 */ 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0xB4DE, 0x8D8E, 0xD1C2, 0x8D8F,
+ /* U+5D18 */ 0x8D90, 0x8D91, 0x8D92, 0xE1C8, 0x8D93, 0x8D94, 0xE1C6, 0x8D95,
+ /* U+5D20 */ 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0xE1C5, 0x8D9A, 0xE1C3, 0xE1C2,
+ /* U+5D28 */ 0x8D9B, 0xB1C0, 0x8D9C, 0x8D9D, 0x8D9E, 0xD5B8, 0xE1C4, 0x8D9F,
+ /* U+5D30 */ 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0xE1CB, 0x8DA4, 0x8DA5, 0x8DA6,
+ /* U+5D38 */ 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0xE1CC, 0xE1CA, 0x8DAC,
+ /* U+5D40 */ 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB1, 0x8DB2, 0x8DB3, 0xEFFA,
+ /* U+5D48 */ 0x8DB4, 0x8DB5, 0xE1D3, 0xE1D2, 0xC7B6, 0x8DB6, 0x8DB7, 0x8DB8,
+ /* U+5D50 */ 0x8DB9, 0x8DBA, 0x8DBB, 0x8DBC, 0x8DBD, 0x8DBE, 0x8DBF, 0x8DC0,
+ /* U+5D58 */ 0xE1C9, 0x8DC1, 0x8DC2, 0xE1CE, 0x8DC3, 0xE1D0, 0x8DC4, 0x8DC5,
+ /* U+5D60 */ 0x8DC6, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCB, 0x8DCC, 0x8DCD,
+ /* U+5D68 */ 0x8DCE, 0xE1D4, 0x8DCF, 0xE1D1, 0xE1CD, 0x8DD0, 0x8DD1, 0xE1CF,
+ /* U+5D70 */ 0x8DD2, 0x8DD3, 0x8DD4, 0x8DD5, 0xE1D5, 0x8DD6, 0x8DD7, 0x8DD8,
+ /* U+5D78 */ 0x8DD9, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x8DDE, 0x8DDF, 0x8DE0,
+ /* U+5D80 */ 0x8DE1, 0x8DE2, 0xE1D6, 0x8DE3, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7,
+ /* U+5D88 */ 0x8DE8, 0x8DE9, 0x8DEA, 0x8DEB, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF,
+ /* U+5D90 */ 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7,
+ /* U+5D98 */ 0x8DF8, 0xE1D7, 0x8DF9, 0x8DFA, 0x8DFB, 0xE1D8, 0x8DFC, 0x8DFD,
+ /* U+5DA0 */ 0x8DFE, 0x8E40, 0x8E41, 0x8E42, 0x8E43, 0x8E44, 0x8E45, 0x8E46,
+ /* U+5DA8 */ 0x8E47, 0x8E48, 0x8E49, 0x8E4A, 0x8E4B, 0x8E4C, 0x8E4D, 0x8E4E,
+ /* U+5DB0 */ 0x8E4F, 0x8E50, 0x8E51, 0x8E52, 0x8E53, 0x8E54, 0x8E55, 0xE1DA,
+ /* U+5DB8 */ 0x8E56, 0x8E57, 0x8E58, 0x8E59, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D,
+ /* U+5DC0 */ 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0xE1DB, 0x8E63, 0x8E64,
+ /* U+5DC8 */ 0x8E65, 0x8E66, 0x8E67, 0x8E68, 0x8E69, 0xCEA1, 0x8E6A, 0x8E6B,
+ /* U+5DD0 */ 0x8E6C, 0x8E6D, 0x8E6E, 0x8E6F, 0x8E70, 0x8E71, 0x8E72, 0x8E73,
+ /* U+5DD8 */ 0x8E74, 0x8E75, 0x8E76, 0xE7DD, 0x8E77, 0xB4A8, 0xD6DD, 0x8E78,
+ /* U+5DE0 */ 0x8E79, 0xD1B2, 0xB3B2, 0x8E7A, 0x8E7B, 0xB9A4, 0xD7F3, 0xC7C9,
+ /* U+5DE8 */ 0xBEDE, 0xB9AE, 0x8E7C, 0xCED7, 0x8E7D, 0x8E7E, 0xB2EE, 0xDBCF,
+ /* U+5DF0 */ 0x8E80, 0xBCBA, 0xD2D1, 0xCBC8, 0xB0CD, 0x8E81, 0x8E82, 0xCFEF,
+ /* U+5DF8 */ 0x8E83, 0x8E84, 0x8E85, 0x8E86, 0x8E87, 0xD9E3, 0xBDED, 0x8E88,
+ /* U+5E00 */ 0x8E89, 0xB1D2, 0xCAD0, 0xB2BC, 0x8E8A, 0xCBA7, 0xB7AB, 0x8E8B,
+ /* U+5E08 */ 0xCAA6, 0x8E8C, 0x8E8D, 0x8E8E, 0xCFA3, 0x8E8F, 0x8E90, 0xE0F8,
+ /* U+5E10 */ 0xD5CA, 0xE0FB, 0x8E91, 0x8E92, 0xE0FA, 0xC5C1, 0xCCFB, 0x8E93,
+ /* U+5E18 */ 0xC1B1, 0xE0F9, 0xD6E3, 0xB2AF, 0xD6C4, 0xB5DB, 0x8E94, 0x8E95,
+ /* U+5E20 */ 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0xB4F8, 0xD6A1,
+ /* U+5E28 */ 0x8E9C, 0x8E9D, 0x8E9E, 0x8E9F, 0x8EA0, 0xCFAF, 0xB0EF, 0x8EA1,
+ /* U+5E30 */ 0x8EA2, 0xE0FC, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, 0x8EA7, 0xE1A1,
+ /* U+5E38 */ 0xB3A3, 0x8EA8, 0x8EA9, 0xE0FD, 0xE0FE, 0xC3B1, 0x8EAA, 0x8EAB,
+ /* U+5E40 */ 0x8EAC, 0x8EAD, 0xC3DD, 0x8EAE, 0xE1A2, 0xB7F9, 0x8EAF, 0x8EB0,
+ /* U+5E48 */ 0x8EB1, 0x8EB2, 0x8EB3, 0x8EB4, 0xBBCF, 0x8EB5, 0x8EB6, 0x8EB7,
+ /* U+5E50 */ 0x8EB8, 0x8EB9, 0x8EBA, 0x8EBB, 0xE1A3, 0xC4BB, 0x8EBC, 0x8EBD,
+ /* U+5E58 */ 0x8EBE, 0x8EBF, 0x8EC0, 0xE1A4, 0x8EC1, 0x8EC2, 0xE1A5, 0x8EC3,
+ /* U+5E60 */ 0x8EC4, 0xE1A6, 0xB4B1, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9,
+ /* U+5E68 */ 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECE, 0x8ECF, 0x8ED0, 0x8ED1,
+ /* U+5E70 */ 0x8ED2, 0x8ED3, 0xB8C9, 0xC6BD, 0xC4EA, 0x8ED4, 0xB2A2, 0x8ED5,
+ /* U+5E78 */ 0xD0D2, 0x8ED6, 0xE7DB, 0xBBC3, 0xD3D7, 0xD3C4, 0x8ED7, 0xB9E3,
+ /* U+5E80 */ 0xE2CF, 0x8ED8, 0x8ED9, 0x8EDA, 0xD7AF, 0x8EDB, 0xC7EC, 0xB1D3,
+ /* U+5E88 */ 0x8EDC, 0x8EDD, 0xB4B2, 0xE2D1, 0x8EDE, 0x8EDF, 0x8EE0, 0xD0F2,
+ /* U+5E90 */ 0xC2AE, 0xE2D0, 0x8EE1, 0xBFE2, 0xD3A6, 0xB5D7, 0xE2D2, 0xB5EA,
+ /* U+5E98 */ 0x8EE2, 0xC3ED, 0xB8FD, 0x8EE3, 0xB8AE, 0x8EE4, 0xC5D3, 0xB7CF,
+ /* U+5EA0 */ 0xE2D4, 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0xE2D3, 0xB6C8, 0xD7F9,
+ /* U+5EA8 */ 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, 0x8EED, 0xCDA5, 0x8EEE, 0x8EEF,
+ /* U+5EB0 */ 0x8EF0, 0x8EF1, 0x8EF2, 0xE2D8, 0x8EF3, 0xE2D6, 0xCAFC, 0xBFB5,
+ /* U+5EB8 */ 0xD3B9, 0xE2D5, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0xE2D7, 0x8EF8,
+ /* U+5EC0 */ 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8F40, 0x8F41,
+ /* U+5EC8 */ 0x8F42, 0xC1AE, 0xC0C8, 0x8F43, 0x8F44, 0x8F45, 0x8F46, 0x8F47,
+ /* U+5ED0 */ 0x8F48, 0xE2DB, 0xE2DA, 0xC0AA, 0x8F49, 0x8F4A, 0xC1CE, 0x8F4B,
+ /* U+5ED8 */ 0x8F4C, 0x8F4D, 0x8F4E, 0xE2DC, 0x8F4F, 0x8F50, 0x8F51, 0x8F52,
+ /* U+5EE0 */ 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A,
+ /* U+5EE8 */ 0xE2DD, 0x8F5B, 0xE2DE, 0x8F5C, 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60,
+ /* U+5EF0 */ 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0xDBC8, 0x8F65, 0xD1D3, 0xCDA2,
+ /* U+5EF8 */ 0x8F66, 0x8F67, 0xBDA8, 0x8F68, 0x8F69, 0x8F6A, 0xDEC3, 0xD8A5,
+ /* U+5F00 */ 0xBFAA, 0xDBCD, 0xD2EC, 0xC6FA, 0xC5AA, 0x8F6B, 0x8F6C, 0x8F6D,
+ /* U+5F08 */ 0xDEC4, 0x8F6E, 0xB1D7, 0xDFAE, 0x8F6F, 0x8F70, 0x8F71, 0xCABD,
+ /* U+5F10 */ 0x8F72, 0xDFB1, 0x8F73, 0xB9AD, 0x8F74, 0xD2FD, 0x8F75, 0xB8A5,
+ /* U+5F18 */ 0xBAEB, 0x8F76, 0x8F77, 0xB3DA, 0x8F78, 0x8F79, 0x8F7A, 0xB5DC,
+ /* U+5F20 */ 0xD5C5, 0x8F7B, 0x8F7C, 0x8F7D, 0x8F7E, 0xC3D6, 0xCFD2, 0xBBA1,
+ /* U+5F28 */ 0x8F80, 0xE5F3, 0xE5F2, 0x8F81, 0x8F82, 0xE5F4, 0x8F83, 0xCDE4,
+ /* U+5F30 */ 0x8F84, 0xC8F5, 0x8F85, 0x8F86, 0x8F87, 0x8F88, 0x8F89, 0x8F8A,
+ /* U+5F38 */ 0x8F8B, 0xB5AF, 0xC7BF, 0x8F8C, 0xE5F6, 0x8F8D, 0x8F8E, 0x8F8F,
+ /* U+5F40 */ 0xECB0, 0x8F90, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x8F95, 0x8F96,
+ /* U+5F48 */ 0x8F97, 0x8F98, 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x8F9D, 0x8F9E,
+ /* U+5F50 */ 0xE5E6, 0x8F9F, 0xB9E9, 0xB5B1, 0x8FA0, 0xC2BC, 0xE5E8, 0xE5E7,
+ /* U+5F58 */ 0xE5E9, 0x8FA1, 0x8FA2, 0x8FA3, 0x8FA4, 0xD2CD, 0x8FA5, 0x8FA6,
+ /* U+5F60 */ 0x8FA7, 0xE1EA, 0xD0CE, 0x8FA8, 0xCDAE, 0x8FA9, 0xD1E5, 0x8FAA,
+ /* U+5F68 */ 0x8FAB, 0xB2CA, 0xB1EB, 0x8FAC, 0xB1F2, 0xC5ED, 0x8FAD, 0x8FAE,
+ /* U+5F70 */ 0xD5C3, 0xD3B0, 0x8FAF, 0xE1DC, 0x8FB0, 0x8FB1, 0x8FB2, 0xE1DD,
+ /* U+5F78 */ 0x8FB3, 0xD2DB, 0x8FB4, 0xB3B9, 0xB1CB, 0x8FB5, 0x8FB6, 0x8FB7,
+ /* U+5F80 */ 0xCDF9, 0xD5F7, 0xE1DE, 0x8FB8, 0xBEB6, 0xB4FD, 0x8FB9, 0xE1DF,
+ /* U+5F88 */ 0xBADC, 0xE1E0, 0xBBB2, 0xC2C9, 0xE1E1, 0x8FBA, 0x8FBB, 0x8FBC,
+ /* U+5F90 */ 0xD0EC, 0x8FBD, 0xCDBD, 0x8FBE, 0x8FBF, 0xE1E2, 0x8FC0, 0xB5C3,
+ /* U+5F98 */ 0xC5C7, 0xE1E3, 0x8FC1, 0x8FC2, 0xE1E4, 0x8FC3, 0x8FC4, 0x8FC5,
+ /* U+5FA0 */ 0x8FC6, 0xD3F9, 0x8FC7, 0x8FC8, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC,
+ /* U+5FA8 */ 0xE1E5, 0x8FCD, 0xD1AD, 0x8FCE, 0x8FCF, 0xE1E6, 0xCEA2, 0x8FD0,
+ /* U+5FB0 */ 0x8FD1, 0x8FD2, 0x8FD3, 0x8FD4, 0x8FD5, 0xE1E7, 0x8FD6, 0xB5C2,
+ /* U+5FB8 */ 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA, 0xE1E8, 0xBBD5, 0x8FDB, 0x8FDC,
+ /* U+5FC0 */ 0x8FDD, 0x8FDE, 0x8FDF, 0xD0C4, 0xE2E0, 0xB1D8, 0xD2E4, 0x8FE0,
+ /* U+5FC8 */ 0x8FE1, 0xE2E1, 0x8FE2, 0x8FE3, 0xBCC9, 0xC8CC, 0x8FE4, 0xE2E3,
+ /* U+5FD0 */ 0xECFE, 0xECFD, 0xDFAF, 0x8FE5, 0x8FE6, 0x8FE7, 0xE2E2, 0xD6BE,
+ /* U+5FD8 */ 0xCDFC, 0xC3A6, 0x8FE8, 0x8FE9, 0x8FEA, 0xE3C3, 0x8FEB, 0x8FEC,
+ /* U+5FE0 */ 0xD6D2, 0xE2E7, 0x8FED, 0x8FEE, 0xE2E8, 0x8FEF, 0x8FF0, 0xD3C7,
+ /* U+5FE8 */ 0x8FF1, 0x8FF2, 0xE2EC, 0xBFEC, 0x8FF3, 0xE2ED, 0xE2E5, 0x8FF4,
+ /* U+5FF0 */ 0x8FF5, 0xB3C0, 0x8FF6, 0x8FF7, 0x8FF8, 0xC4EE, 0x8FF9, 0x8FFA,
+ /* U+5FF8 */ 0xE2EE, 0x8FFB, 0x8FFC, 0xD0C3, 0x8FFD, 0xBAF6, 0xE2E9, 0xB7DE,
+ /* U+6000 */ 0xBBB3, 0xCCAC, 0xCBCB, 0xE2E4, 0xE2E6, 0xE2EA, 0xE2EB, 0x8FFE,
+ /* U+6008 */ 0x9040, 0x9041, 0xE2F7, 0x9042, 0x9043, 0xE2F4, 0xD4F5, 0xE2F3,
+ /* U+6010 */ 0x9044, 0x9045, 0xC5AD, 0x9046, 0xD5FA, 0xC5C2, 0xB2C0, 0x9047,
+ /* U+6018 */ 0x9048, 0xE2EF, 0x9049, 0xE2F2, 0xC1AF, 0xCBBC, 0x904A, 0x904B,
+ /* U+6020 */ 0xB5A1, 0xE2F9, 0x904C, 0x904D, 0x904E, 0xBCB1, 0xE2F1, 0xD0D4,
+ /* U+6028 */ 0xD4B9, 0xE2F5, 0xB9D6, 0xE2F6, 0x904F, 0x9050, 0x9051, 0xC7D3,
+ /* U+6030 */ 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0xE2F0, 0x9057, 0x9058,
+ /* U+6038 */ 0x9059, 0x905A, 0x905B, 0xD7DC, 0xEDA1, 0x905C, 0x905D, 0xE2F8,
+ /* U+6040 */ 0x905E, 0xEDA5, 0xE2FE, 0xCAD1, 0x905F, 0x9060, 0x9061, 0x9062,
+ /* U+6048 */ 0x9063, 0x9064, 0x9065, 0xC1B5, 0x9066, 0xBBD0, 0x9067, 0x9068,
+ /* U+6050 */ 0xBFD6, 0x9069, 0xBAE3, 0x906A, 0x906B, 0xCBA1, 0x906C, 0x906D,
+ /* U+6058 */ 0x906E, 0xEDA6, 0xEDA3, 0x906F, 0x9070, 0xEDA2, 0x9071, 0x9072,
+ /* U+6060 */ 0x9073, 0x9074, 0xBBD6, 0xEDA7, 0xD0F4, 0x9075, 0x9076, 0xEDA4,
+ /* U+6068 */ 0xBADE, 0xB6F7, 0xE3A1, 0xB6B2, 0xCCF1, 0xB9A7, 0x9077, 0xCFA2,
+ /* U+6070 */ 0xC7A1, 0x9078, 0x9079, 0xBFD2, 0x907A, 0x907B, 0xB6F1, 0x907C,
+ /* U+6078 */ 0xE2FA, 0xE2FB, 0xE2FD, 0xE2FC, 0xC4D5, 0xE3A2, 0x907D, 0xD3C1,
+ /* U+6080 */ 0x907E, 0x9080, 0x9081, 0xE3A7, 0xC7C4, 0x9082, 0x9083, 0x9084,
+ /* U+6088 */ 0x9085, 0xCFA4, 0x9086, 0x9087, 0xE3A9, 0xBAB7, 0x9088, 0x9089,
+ /* U+6090 */ 0x908A, 0x908B, 0xE3A8, 0x908C, 0xBBDA, 0x908D, 0xE3A3, 0x908E,
+ /* U+6098 */ 0x908F, 0x9090, 0xE3A4, 0xE3AA, 0x9091, 0xE3A6, 0x9092, 0xCEF2,
+ /* U+60A0 */ 0xD3C6, 0x9093, 0x9094, 0xBBBC, 0x9095, 0x9096, 0xD4C3, 0x9097,
+ /* U+60A8 */ 0xC4FA, 0x9098, 0x9099, 0xEDA8, 0xD0FC, 0xE3A5, 0x909A, 0xC3F5,
+ /* U+60B0 */ 0x909B, 0xE3AD, 0xB1AF, 0x909C, 0xE3B2, 0x909D, 0x909E, 0x909F,
+ /* U+60B8 */ 0xBCC2, 0x90A0, 0x90A1, 0xE3AC, 0xB5BF, 0x90A2, 0x90A3, 0x90A4,
+ /* U+60C0 */ 0x90A5, 0x90A6, 0x90A7, 0x90A8, 0x90A9, 0xC7E9, 0xE3B0, 0x90AA,
+ /* U+60C8 */ 0x90AB, 0x90AC, 0xBEAA, 0xCDEF, 0x90AD, 0x90AE, 0x90AF, 0x90B0,
+ /* U+60D0 */ 0x90B1, 0xBBF3, 0x90B2, 0x90B3, 0x90B4, 0xCCE8, 0x90B5, 0x90B6,
+ /* U+60D8 */ 0xE3AF, 0x90B7, 0xE3B1, 0x90B8, 0xCFA7, 0xE3AE, 0x90B9, 0xCEA9,
+ /* U+60E0 */ 0xBBDD, 0x90BA, 0x90BB, 0x90BC, 0x90BD, 0x90BE, 0xB5EB, 0xBEE5,
+ /* U+60E8 */ 0xB2D2, 0xB3CD, 0x90BF, 0xB1B9, 0xE3AB, 0xB2D1, 0xB5AC, 0xB9DF,
+ /* U+60F0 */ 0xB6E8, 0x90C0, 0x90C1, 0xCFEB, 0xE3B7, 0x90C2, 0xBBCC, 0x90C3,
+ /* U+60F8 */ 0x90C4, 0xC8C7, 0xD0CA, 0x90C5, 0x90C6, 0x90C7, 0x90C8, 0x90C9,
+ /* U+6100 */ 0xE3B8, 0xB3EE, 0x90CA, 0x90CB, 0x90CC, 0x90CD, 0xEDA9, 0x90CE,
+ /* U+6108 */ 0xD3FA, 0xD3E4, 0x90CF, 0x90D0, 0x90D1, 0xEDAA, 0xE3B9, 0xD2E2,
+ /* U+6110 */ 0x90D2, 0x90D3, 0x90D4, 0x90D5, 0x90D6, 0xE3B5, 0x90D7, 0x90D8,
+ /* U+6118 */ 0x90D9, 0x90DA, 0xD3DE, 0x90DB, 0x90DC, 0x90DD, 0x90DE, 0xB8D0,
+ /* U+6120 */ 0xE3B3, 0x90DF, 0x90E0, 0xE3B6, 0xB7DF, 0x90E1, 0xE3B4, 0xC0A2,
+ /* U+6128 */ 0x90E2, 0x90E3, 0x90E4, 0xE3BA, 0x90E5, 0x90E6, 0x90E7, 0x90E8,
+ /* U+6130 */ 0x90E9, 0x90EA, 0x90EB, 0x90EC, 0x90ED, 0x90EE, 0x90EF, 0x90F0,
+ /* U+6138 */ 0x90F1, 0x90F2, 0x90F3, 0x90F4, 0x90F5, 0x90F6, 0x90F7, 0xD4B8,
+ /* U+6140 */ 0x90F8, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FD, 0x90FE, 0x9140,
+ /* U+6148 */ 0xB4C8, 0x9141, 0xE3BB, 0x9142, 0xBBC5, 0x9143, 0xC9F7, 0x9144,
+ /* U+6150 */ 0x9145, 0xC9E5, 0x9146, 0x9147, 0x9148, 0xC4BD, 0x9149, 0x914A,
+ /* U+6158 */ 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0xEDAB, 0x9150, 0x9151,
+ /* U+6160 */ 0x9152, 0x9153, 0xC2FD, 0x9154, 0x9155, 0x9156, 0x9157, 0xBBDB,
+ /* U+6168 */ 0xBFAE, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E,
+ /* U+6170 */ 0xCEBF, 0x915F, 0x9160, 0x9161, 0x9162, 0xE3BC, 0x9163, 0xBFB6,
+ /* U+6178 */ 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B,
+ /* U+6180 */ 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173,
+ /* U+6188 */ 0x9174, 0x9175, 0x9176, 0xB1EF, 0x9177, 0x9178, 0xD4F7, 0x9179,
+ /* U+6190 */ 0x917A, 0x917B, 0x917C, 0x917D, 0xE3BE, 0x917E, 0x9180, 0x9181,
+ /* U+6198 */ 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0xEDAD, 0x9187, 0x9188,
+ /* U+61A0 */ 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0xE3BF,
+ /* U+61A8 */ 0xBAA9, 0xEDAC, 0x9190, 0x9191, 0xE3BD, 0x9192, 0x9193, 0x9194,
+ /* U+61B0 */ 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0xE3C0,
+ /* U+61B8 */ 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0xBAB6, 0x91A2,
+ /* U+61C0 */ 0x91A3, 0x91A4, 0xB6AE, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9,
+ /* U+61C8 */ 0xD0B8, 0x91AA, 0xB0C3, 0xEDAE, 0x91AB, 0x91AC, 0x91AD, 0x91AE,
+ /* U+61D0 */ 0x91AF, 0xEDAF, 0xC0C1, 0x91B0, 0xE3C1, 0x91B1, 0x91B2, 0x91B3,
+ /* U+61D8 */ 0x91B4, 0x91B5, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB,
+ /* U+61E0 */ 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0xC5B3, 0x91C2,
+ /* U+61E8 */ 0x91C3, 0x91C4, 0x91C5, 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA,
+ /* U+61F0 */ 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0xE3C2, 0x91D0, 0x91D1,
+ /* U+61F8 */ 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0xDCB2,
+ /* U+6200 */ 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0xEDB0, 0x91DF,
+ /* U+6208 */ 0xB8EA, 0x91E0, 0xCEEC, 0xEAA7, 0xD0E7, 0xCAF9, 0xC8D6, 0xCFB7,
+ /* U+6210 */ 0xB3C9, 0xCED2, 0xBDE4, 0x91E1, 0x91E2, 0xE3DE, 0xBBF2, 0xEAA8,
+ /* U+6218 */ 0xD5BD, 0x91E3, 0xC6DD, 0xEAA9, 0x91E4, 0x91E5, 0x91E6, 0xEAAA,
+ /* U+6220 */ 0x91E7, 0xEAAC, 0xEAAB, 0x91E8, 0xEAAE, 0xEAAD, 0x91E9, 0x91EA,
+ /* U+6228 */ 0x91EB, 0x91EC, 0xBDD8, 0x91ED, 0xEAAF, 0x91EE, 0xC2BE, 0x91EF,
+ /* U+6230 */ 0x91F0, 0x91F1, 0x91F2, 0xB4C1, 0xB4F7, 0x91F3, 0x91F4, 0xBBA7,
+ /* U+6238 */ 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0xECE6, 0xECE5, 0xB7BF,
+ /* U+6240 */ 0xCBF9, 0xB1E2, 0x91FA, 0xECE7, 0x91FB, 0x91FC, 0x91FD, 0xC9C8,
+ /* U+6248 */ 0xECE8, 0xECE9, 0x91FE, 0xCAD6, 0xDED0, 0xB2C5, 0xD4FA, 0x9240,
+ /* U+6250 */ 0x9241, 0xC6CB, 0xB0C7, 0xB4F2, 0xC8D3, 0x9242, 0x9243, 0x9244,
+ /* U+6258 */ 0xCDD0, 0x9245, 0x9246, 0xBFB8, 0x9247, 0x9248, 0x9249, 0x924A,
+ /* U+6260 */ 0x924B, 0x924C, 0x924D, 0xBFDB, 0x924E, 0x924F, 0xC7A4, 0xD6B4,
+ /* U+6268 */ 0x9250, 0xC0A9, 0xDED1, 0xC9A8, 0xD1EF, 0xC5A4, 0xB0E7, 0xB3B6,
+ /* U+6270 */ 0xC8C5, 0x9251, 0x9252, 0xB0E2, 0x9253, 0x9254, 0xB7F6, 0x9255,
+ /* U+6278 */ 0x9256, 0xC5FA, 0x9257, 0x9258, 0xB6F3, 0x9259, 0xD5D2, 0xB3D0,
+ /* U+6280 */ 0xBCBC, 0x925A, 0x925B, 0x925C, 0xB3AD, 0x925D, 0x925E, 0x925F,
+ /* U+6288 */ 0x9260, 0xBEF1, 0xB0D1, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265,
+ /* U+6290 */ 0x9266, 0xD2D6, 0xCAE3, 0xD7A5, 0x9267, 0xCDB6, 0xB6B6, 0xBFB9,
+ /* U+6298 */ 0xD5DB, 0x9268, 0xB8A7, 0xC5D7, 0x9269, 0x926A, 0x926B, 0xDED2,
+ /* U+62A0 */ 0xBFD9, 0xC2D5, 0xC7C0, 0x926C, 0xBBA4, 0xB1A8, 0x926D, 0x926E,
+ /* U+62A8 */ 0xC5EA, 0x926F, 0x9270, 0xC5FB, 0xCCA7, 0x9271, 0x9272, 0x9273,
+ /* U+62B0 */ 0x9274, 0xB1A7, 0x9275, 0x9276, 0x9277, 0xB5D6, 0x9278, 0x9279,
+ /* U+62B8 */ 0x927A, 0xC4A8, 0x927B, 0xDED3, 0xD1BA, 0xB3E9, 0x927C, 0xC3F2,
+ /* U+62C0 */ 0x927D, 0x927E, 0xB7F7, 0x9280, 0xD6F4, 0xB5A3, 0xB2F0, 0xC4B4,
+ /* U+62C8 */ 0xC4E9, 0xC0AD, 0xDED4, 0x9281, 0xB0E8, 0xC5C4, 0xC1E0, 0x9282,
+ /* U+62D0 */ 0xB9D5, 0x9283, 0xBEDC, 0xCDD8, 0xB0CE, 0x9284, 0xCDCF, 0xDED6,
+ /* U+62D8 */ 0xBED0, 0xD7BE, 0xDED5, 0xD5D0, 0xB0DD, 0x9285, 0x9286, 0xC4E2,
+ /* U+62E0 */ 0x9287, 0x9288, 0xC2A3, 0xBCF0, 0x9289, 0xD3B5, 0xC0B9, 0xC5A1,
+ /* U+62E8 */ 0xB2A6, 0xD4F1, 0x928A, 0x928B, 0xC0A8, 0xCAC3, 0xDED7, 0xD5FC,
+ /* U+62F0 */ 0x928C, 0xB9B0, 0x928D, 0xC8AD, 0xCBA9, 0x928E, 0xDED9, 0xBFBD,
+ /* U+62F8 */ 0x928F, 0x9290, 0x9291, 0x9292, 0xC6B4, 0xD7A7, 0xCAB0, 0xC4C3,
+ /* U+6300 */ 0x9293, 0xB3D6, 0xB9D2, 0x9294, 0x9295, 0x9296, 0x9297, 0xD6B8,
+ /* U+6308 */ 0xEAFC, 0xB0B4, 0x9298, 0x9299, 0x929A, 0x929B, 0xBFE6, 0x929C,
+ /* U+6310 */ 0x929D, 0xCCF4, 0x929E, 0x929F, 0x92A0, 0x92A1, 0xCDDA, 0x92A2,
+ /* U+6318 */ 0x92A3, 0x92A4, 0xD6BF, 0xC2CE, 0x92A5, 0xCECE, 0xCCA2, 0xD0AE,
+ /* U+6320 */ 0xC4D3, 0xB5B2, 0xDED8, 0xD5F5, 0xBCB7, 0xBBD3, 0x92A6, 0x92A7,
+ /* U+6328 */ 0xB0A4, 0x92A8, 0xC5B2, 0xB4EC, 0x92A9, 0x92AA, 0x92AB, 0xD5F1,
+ /* U+6330 */ 0x92AC, 0x92AD, 0xEAFD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2,
+ /* U+6338 */ 0x92B3, 0xDEDA, 0xCDA6, 0x92B4, 0x92B5, 0xCDEC, 0x92B6, 0x92B7,
+ /* U+6340 */ 0x92B8, 0x92B9, 0xCEE6, 0xDEDC, 0x92BA, 0xCDB1, 0xC0A6, 0x92BB,
+ /* U+6348 */ 0x92BC, 0xD7BD, 0x92BD, 0xDEDB, 0xB0C6, 0xBAB4, 0xC9D3, 0xC4F3,
+ /* U+6350 */ 0xBEE8, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0xB2B6, 0x92C2, 0x92C3,
+ /* U+6358 */ 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0xC0CC, 0xCBF0,
+ /* U+6360 */ 0x92CA, 0xBCF1, 0xBBBB, 0xB5B7, 0x92CB, 0x92CC, 0x92CD, 0xC5F5,
+ /* U+6368 */ 0x92CE, 0xDEE6, 0x92CF, 0x92D0, 0x92D1, 0xDEE3, 0xBEDD, 0x92D2,
+ /* U+6370 */ 0x92D3, 0xDEDF, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0xB4B7, 0xBDDD,
+ /* U+6378 */ 0x92D8, 0x92D9, 0xDEE0, 0xC4ED, 0x92DA, 0x92DB, 0x92DC, 0x92DD,
+ /* U+6380 */ 0xCFC6, 0x92DE, 0xB5E0, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0xB6DE,
+ /* U+6388 */ 0xCADA, 0xB5F4, 0xDEE5, 0x92E3, 0xD5C6, 0x92E4, 0xDEE1, 0xCCCD,
+ /* U+6390 */ 0xC6FE, 0x92E5, 0xC5C5, 0x92E6, 0x92E7, 0x92E8, 0xD2B4, 0x92E9,
+ /* U+6398 */ 0xBEF2, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0,
+ /* U+63A0 */ 0xC2D3, 0x92F1, 0xCCBD, 0xB3B8, 0x92F2, 0xBDD3, 0x92F3, 0xBFD8,
+ /* U+63A8 */ 0xCDC6, 0xD1DA, 0xB4EB, 0x92F4, 0xDEE4, 0xDEDD, 0xDEE7, 0x92F5,
+ /* U+63B0 */ 0xEAFE, 0x92F6, 0x92F7, 0xC2B0, 0xDEE2, 0x92F8, 0x92F9, 0xD6C0,
+ /* U+63B8 */ 0xB5A7, 0x92FA, 0xB2F4, 0x92FB, 0xDEE8, 0x92FC, 0xDEF2, 0x92FD,
+ /* U+63C0 */ 0x92FE, 0x9340, 0x9341, 0x9342, 0xDEED, 0x9343, 0xDEF1, 0x9344,
+ /* U+63C8 */ 0x9345, 0xC8E0, 0x9346, 0x9347, 0x9348, 0xD7E1, 0xDEEF, 0xC3E8,
+ /* U+63D0 */ 0xCCE1, 0x9349, 0xB2E5, 0x934A, 0x934B, 0x934C, 0xD2BE, 0x934D,
+ /* U+63D8 */ 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0xDEEE, 0x9354,
+ /* U+63E0 */ 0xDEEB, 0xCED5, 0x9355, 0xB4A7, 0x9356, 0x9357, 0x9358, 0x9359,
+ /* U+63E8 */ 0x935A, 0xBFAB, 0xBEBE, 0x935B, 0x935C, 0xBDD2, 0x935D, 0x935E,
+ /* U+63F0 */ 0x935F, 0x9360, 0xDEE9, 0x9361, 0xD4AE, 0x9362, 0xDEDE, 0x9363,
+ /* U+63F8 */ 0xDEEA, 0x9364, 0x9365, 0x9366, 0x9367, 0xC0BF, 0x9368, 0xDEEC,
+ /* U+6400 */ 0xB2F3, 0xB8E9, 0xC2A7, 0x9369, 0x936A, 0xBDC1, 0x936B, 0x936C,
+ /* U+6408 */ 0x936D, 0x936E, 0x936F, 0xDEF5, 0xDEF8, 0x9370, 0x9371, 0xB2AB,
+ /* U+6410 */ 0xB4A4, 0x9372, 0x9373, 0xB4EA, 0xC9A6, 0x9374, 0x9375, 0x9376,
+ /* U+6418 */ 0x9377, 0x9378, 0x9379, 0xDEF6, 0xCBD1, 0x937A, 0xB8E3, 0x937B,
+ /* U+6420 */ 0xDEF7, 0xDEFA, 0x937C, 0x937D, 0x937E, 0x9380, 0xDEF9, 0x9381,
+ /* U+6428 */ 0x9382, 0x9383, 0xCCC2, 0x9384, 0xB0E1, 0xB4EE, 0x9385, 0x9386,
+ /* U+6430 */ 0x9387, 0x9388, 0x9389, 0x938A, 0xE5BA, 0x938B, 0x938C, 0x938D,
+ /* U+6438 */ 0x938E, 0x938F, 0xD0AF, 0x9390, 0x9391, 0xB2EB, 0x9392, 0xEBA1,
+ /* U+6440 */ 0x9393, 0xDEF4, 0x9394, 0x9395, 0xC9E3, 0xDEF3, 0xB0DA, 0xD2A1,
+ /* U+6448 */ 0xB1F7, 0x9396, 0xCCAF, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B,
+ /* U+6450 */ 0x939C, 0x939D, 0xDEF0, 0x939E, 0xCBA4, 0x939F, 0x93A0, 0x93A1,
+ /* U+6458 */ 0xD5AA, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, 0xDEFB, 0x93A7,
+ /* U+6460 */ 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0xB4DD,
+ /* U+6468 */ 0x93AF, 0xC4A6, 0x93B0, 0x93B1, 0x93B2, 0xDEFD, 0x93B3, 0x93B4,
+ /* U+6470 */ 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC,
+ /* U+6478 */ 0xC3FE, 0xC4A1, 0xDFA1, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1,
+ /* U+6480 */ 0x93C2, 0x93C3, 0xC1CC, 0x93C4, 0xDEFC, 0xBEEF, 0x93C5, 0xC6B2,
+ /* U+6488 */ 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD,
+ /* U+6490 */ 0x93CE, 0xB3C5, 0xC8F6, 0x93CF, 0x93D0, 0xCBBA, 0xDEFE, 0x93D1,
+ /* U+6498 */ 0x93D2, 0xDFA4, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0xD7B2, 0x93D7,
+ /* U+64A0 */ 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0xB3B7, 0x93DC, 0x93DD, 0x93DE,
+ /* U+64A8 */ 0x93DF, 0xC1C3, 0x93E0, 0x93E1, 0xC7CB, 0xB2A5, 0xB4E9, 0x93E2,
+ /* U+64B0 */ 0xD7AB, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0xC4EC, 0x93E7, 0xDFA2,
+ /* U+64B8 */ 0xDFA3, 0x93E8, 0xDFA5, 0x93E9, 0xBAB3, 0x93EA, 0x93EB, 0x93EC,
+ /* U+64C0 */ 0xDFA6, 0x93ED, 0xC0DE, 0x93EE, 0x93EF, 0xC9C3, 0x93F0, 0x93F1,
+ /* U+64C8 */ 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0xB2D9, 0xC7E6, 0x93F7,
+ /* U+64D0 */ 0xDFA7, 0x93F8, 0xC7DC, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0xDFA8,
+ /* U+64D8 */ 0xEBA2, 0x93FD, 0x93FE, 0x9440, 0x9441, 0x9442, 0xCBD3, 0x9443,
+ /* U+64E0 */ 0x9444, 0x9445, 0xDFAA, 0x9446, 0xDFA9, 0x9447, 0xB2C1, 0x9448,
+ /* U+64E8 */ 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, 0x9450,
+ /* U+64F0 */ 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458,
+ /* U+64F8 */ 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, 0x9460,
+ /* U+6500 */ 0xC5CA, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467,
+ /* U+6508 */ 0x9468, 0xDFAB, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D, 0x946E,
+ /* U+6510 */ 0x946F, 0x9470, 0xD4DC, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475,
+ /* U+6518 */ 0xC8C1, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C,
+ /* U+6520 */ 0x947D, 0x947E, 0x9480, 0x9481, 0x9482, 0xDFAC, 0x9483, 0x9484,
+ /* U+6528 */ 0x9485, 0x9486, 0x9487, 0xBEF0, 0x9488, 0x9489, 0xDFAD, 0xD6A7,
+ /* U+6530 */ 0x948A, 0x948B, 0x948C, 0x948D, 0xEAB7, 0xEBB6, 0xCAD5, 0x948E,
+ /* U+6538 */ 0xD8FC, 0xB8C4, 0x948F, 0xB9A5, 0x9490, 0x9491, 0xB7C5, 0xD5FE,
+ /* U+6540 */ 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0xB9CA, 0x9497, 0x9498,
+ /* U+6548 */ 0xD0A7, 0xF4CD, 0x9499, 0x949A, 0xB5D0, 0x949B, 0x949C, 0xC3F4,
+ /* U+6550 */ 0x949D, 0xBEC8, 0x949E, 0x949F, 0x94A0, 0xEBB7, 0xB0BD, 0x94A1,
+ /* U+6558 */ 0x94A2, 0xBDCC, 0x94A3, 0xC1B2, 0x94A4, 0xB1D6, 0xB3A8, 0x94A5,
+ /* U+6560 */ 0x94A6, 0x94A7, 0xB8D2, 0xC9A2, 0x94A8, 0x94A9, 0xB6D8, 0x94AA,
+ /* U+6568 */ 0x94AB, 0x94AC, 0x94AD, 0xEBB8, 0xBEB4, 0x94AE, 0x94AF, 0x94B0,
+ /* U+6570 */ 0xCAFD, 0x94B1, 0xC7C3, 0x94B2, 0xD5FB, 0x94B3, 0x94B4, 0xB7F3,
+ /* U+6578 */ 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC,
+ /* U+6580 */ 0x94BD, 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0xCEC4,
+ /* U+6588 */ 0x94C4, 0x94C5, 0x94C6, 0xD5AB, 0xB1F3, 0x94C7, 0x94C8, 0x94C9,
+ /* U+6590 */ 0xECB3, 0xB0DF, 0x94CA, 0xECB5, 0x94CB, 0x94CC, 0x94CD, 0xB6B7,
+ /* U+6598 */ 0x94CE, 0xC1CF, 0x94CF, 0xF5FA, 0xD0B1, 0x94D0, 0x94D1, 0xD5E5,
+ /* U+65A0 */ 0x94D2, 0xCED3, 0x94D3, 0x94D4, 0xBDEF, 0xB3E2, 0x94D5, 0xB8AB,
+ /* U+65A8 */ 0x94D6, 0xD5B6, 0x94D7, 0xEDBD, 0x94D8, 0xB6CF, 0x94D9, 0xCBB9,
+ /* U+65B0 */ 0xD0C2, 0x94DA, 0x94DB, 0x94DC, 0x94DD, 0x94DE, 0x94DF, 0x94E0,
+ /* U+65B8 */ 0x94E1, 0xB7BD, 0x94E2, 0x94E3, 0xECB6, 0xCAA9, 0x94E4, 0x94E5,
+ /* U+65C0 */ 0x94E6, 0xC5D4, 0x94E7, 0xECB9, 0xECB8, 0xC2C3, 0xECB7, 0x94E8,
+ /* U+65C8 */ 0x94E9, 0x94EA, 0x94EB, 0xD0FD, 0xECBA, 0x94EC, 0xECBB, 0xD7E5,
+ /* U+65D0 */ 0x94ED, 0x94EE, 0xECBC, 0x94EF, 0x94F0, 0x94F1, 0xECBD, 0xC6EC,
+ /* U+65D8 */ 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x94F9,
+ /* U+65E0 */ 0xCEDE, 0x94FA, 0xBCC8, 0x94FB, 0x94FC, 0xC8D5, 0xB5A9, 0xBEC9,
+ /* U+65E8 */ 0xD6BC, 0xD4E7, 0x94FD, 0x94FE, 0xD1AE, 0xD0F1, 0xEAB8, 0xEAB9,
+ /* U+65F0 */ 0xEABA, 0xBAB5, 0x9540, 0x9541, 0x9542, 0x9543, 0xCAB1, 0xBFF5,
+ /* U+65F8 */ 0x9544, 0x9545, 0xCDFA, 0x9546, 0x9547, 0x9548, 0x9549, 0x954A,
+ /* U+6600 */ 0xEAC0, 0x954B, 0xB0BA, 0xEABE, 0x954C, 0x954D, 0xC0A5, 0x954E,
+ /* U+6608 */ 0x954F, 0x9550, 0xEABB, 0x9551, 0xB2FD, 0x9552, 0xC3F7, 0xBBE8,
+ /* U+6610 */ 0x9553, 0x9554, 0x9555, 0xD2D7, 0xCEF4, 0xEABF, 0x9556, 0x9557,
+ /* U+6618 */ 0x9558, 0xEABC, 0x9559, 0x955A, 0x955B, 0xEAC3, 0x955C, 0xD0C7,
+ /* U+6620 */ 0xD3B3, 0x955D, 0x955E, 0x955F, 0x9560, 0xB4BA, 0x9561, 0xC3C1,
+ /* U+6628 */ 0xD7F2, 0x9562, 0x9563, 0x9564, 0x9565, 0xD5D1, 0x9566, 0xCAC7,
+ /* U+6630 */ 0x9567, 0xEAC5, 0x9568, 0x9569, 0xEAC4, 0xEAC7, 0xEAC6, 0x956A,
+ /* U+6638 */ 0x956B, 0x956C, 0x956D, 0x956E, 0xD6E7, 0x956F, 0xCFD4, 0x9570,
+ /* U+6640 */ 0x9571, 0xEACB, 0x9572, 0xBBCE, 0x9573, 0x9574, 0x9575, 0x9576,
+ /* U+6648 */ 0x9577, 0x9578, 0x9579, 0xBDFA, 0xC9CE, 0x957A, 0x957B, 0xEACC,
+ /* U+6650 */ 0x957C, 0x957D, 0xC9B9, 0xCFFE, 0xEACA, 0xD4CE, 0xEACD, 0xEACF,
+ /* U+6658 */ 0x957E, 0x9580, 0xCDED, 0x9581, 0x9582, 0x9583, 0x9584, 0xEAC9,
+ /* U+6660 */ 0x9585, 0xEACE, 0x9586, 0x9587, 0xCEEE, 0x9588, 0xBBDE, 0x9589,
+ /* U+6668 */ 0xB3BF, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0xC6D5, 0xBEB0,
+ /* U+6670 */ 0xCEFA, 0x958F, 0x9590, 0x9591, 0xC7E7, 0x9592, 0xBEA7, 0xEAD0,
+ /* U+6678 */ 0x9593, 0x9594, 0xD6C7, 0x9595, 0x9596, 0x9597, 0xC1C0, 0x9598,
+ /* U+6680 */ 0x9599, 0x959A, 0xD4DD, 0x959B, 0xEAD1, 0x959C, 0x959D, 0xCFBE,
+ /* U+6688 */ 0x959E, 0x959F, 0x95A0, 0x95A1, 0xEAD2, 0x95A2, 0x95A3, 0x95A4,
+ /* U+6690 */ 0x95A5, 0xCAEE, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0xC5AF, 0xB0B5,
+ /* U+6698 */ 0x95AA, 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0xEAD4, 0x95AF, 0x95B0,
+ /* U+66A0 */ 0x95B1, 0x95B2, 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0xEAD3,
+ /* U+66A8 */ 0xF4DF, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC, 0xC4BA, 0x95BD,
+ /* U+66B0 */ 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0xB1A9, 0x95C2, 0x95C3, 0x95C4,
+ /* U+66B8 */ 0x95C5, 0xE5DF, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0xEAD5, 0x95CA,
+ /* U+66C0 */ 0x95CB, 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2,
+ /* U+66C8 */ 0x95D3, 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA,
+ /* U+66D0 */ 0x95DB, 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2,
+ /* U+66D8 */ 0x95E3, 0xCAEF, 0x95E4, 0xEAD6, 0xEAD7, 0xC6D8, 0x95E5, 0x95E6,
+ /* U+66E0 */ 0x95E7, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0xEAD8, 0x95ED,
+ /* U+66E8 */ 0x95EE, 0xEAD9, 0x95EF, 0x95F0, 0x95F1, 0x95F2, 0x95F3, 0x95F4,
+ /* U+66F0 */ 0xD4BB, 0x95F5, 0xC7FA, 0xD2B7, 0xB8FC, 0x95F6, 0x95F7, 0xEAC2,
+ /* U+66F8 */ 0x95F8, 0xB2DC, 0x95F9, 0x95FA, 0xC2FC, 0x95FB, 0xD4F8, 0xCCE6,
+ /* U+6700 */ 0xD7EE, 0x95FC, 0x95FD, 0x95FE, 0x9640, 0x9641, 0x9642, 0x9643,
+ /* U+6708 */ 0xD4C2, 0xD3D0, 0xEBC3, 0xC5F3, 0x9644, 0xB7FE, 0x9645, 0x9646,
+ /* U+6710 */ 0xEBD4, 0x9647, 0x9648, 0x9649, 0xCBB7, 0xEBDE, 0x964A, 0xC0CA,
+ /* U+6718 */ 0x964B, 0x964C, 0x964D, 0xCDFB, 0x964E, 0xB3AF, 0x964F, 0xC6DA,
+ /* U+6720 */ 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0xEBFC, 0x9656,
+ /* U+6728 */ 0xC4BE, 0x9657, 0xCEB4, 0xC4A9, 0xB1BE, 0xD4FD, 0x9658, 0xCAF5,
+ /* U+6730 */ 0x9659, 0xD6EC, 0x965A, 0x965B, 0xC6D3, 0xB6E4, 0x965C, 0x965D,
+ /* U+6738 */ 0x965E, 0x965F, 0xBBFA, 0x9660, 0x9661, 0xD0E0, 0x9662, 0x9663,
+ /* U+6740 */ 0xC9B1, 0x9664, 0xD4D3, 0xC8A8, 0x9665, 0x9666, 0xB8CB, 0x9667,
+ /* U+6748 */ 0xE8BE, 0xC9BC, 0x9668, 0x9669, 0xE8BB, 0x966A, 0xC0EE, 0xD0D3,
+ /* U+6750 */ 0xB2C4, 0xB4E5, 0x966B, 0xE8BC, 0x966C, 0x966D, 0xD5C8, 0x966E,
+ /* U+6758 */ 0x966F, 0x9670, 0x9671, 0x9672, 0xB6C5, 0x9673, 0xE8BD, 0xCAF8,
+ /* U+6760 */ 0xB8DC, 0xCCF5, 0x9674, 0x9675, 0x9676, 0xC0B4, 0x9677, 0x9678,
+ /* U+6768 */ 0xD1EE, 0xE8BF, 0xE8C2, 0x9679, 0x967A, 0xBABC, 0x967B, 0xB1AD,
+ /* U+6770 */ 0xBDDC, 0x967C, 0xEABD, 0xE8C3, 0x967D, 0xE8C6, 0x967E, 0xE8CB,
+ /* U+6778 */ 0x9680, 0x9681, 0x9682, 0x9683, 0xE8CC, 0x9684, 0xCBC9, 0xB0E5,
+ /* U+6780 */ 0x9685, 0xBCAB, 0x9686, 0x9687, 0xB9B9, 0x9688, 0x9689, 0xE8C1,
+ /* U+6788 */ 0x968A, 0xCDF7, 0x968B, 0xE8CA, 0x968C, 0x968D, 0x968E, 0x968F,
+ /* U+6790 */ 0xCEF6, 0x9690, 0x9691, 0x9692, 0x9693, 0xD5ED, 0x9694, 0xC1D6,
+ /* U+6798 */ 0xE8C4, 0x9695, 0xC3B6, 0x9696, 0xB9FB, 0xD6A6, 0xE8C8, 0x9697,
+ /* U+67A0 */ 0x9698, 0x9699, 0xCAE0, 0xD4E6, 0x969A, 0xE8C0, 0x969B, 0xE8C5,
+ /* U+67A8 */ 0xE8C7, 0x969C, 0xC7B9, 0xB7E3, 0x969D, 0xE8C9, 0x969E, 0xBFDD,
+ /* U+67B0 */ 0xE8D2, 0x969F, 0x96A0, 0xE8D7, 0x96A1, 0xE8D5, 0xBCDC, 0xBCCF,
+ /* U+67B8 */ 0xE8DB, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A7, 0x96A8,
+ /* U+67C0 */ 0x96A9, 0xE8DE, 0x96AA, 0xE8DA, 0xB1FA, 0x96AB, 0x96AC, 0x96AD,
+ /* U+67C8 */ 0x96AE, 0x96AF, 0x96B0, 0x96B1, 0x96B2, 0x96B3, 0x96B4, 0xB0D8,
+ /* U+67D0 */ 0xC4B3, 0xB8CC, 0xC6E2, 0xC8BE, 0xC8E1, 0x96B5, 0x96B6, 0x96B7,
+ /* U+67D8 */ 0xE8CF, 0xE8D4, 0xE8D6, 0x96B8, 0xB9F1, 0xE8D8, 0xD7F5, 0x96B9,
+ /* U+67E0 */ 0xC4FB, 0x96BA, 0xE8DC, 0x96BB, 0x96BC, 0xB2E9, 0x96BD, 0x96BE,
+ /* U+67E8 */ 0x96BF, 0xE8D1, 0x96C0, 0x96C1, 0xBCED, 0x96C2, 0x96C3, 0xBFC2,
+ /* U+67F0 */ 0xE8CD, 0xD6F9, 0x96C4, 0xC1F8, 0xB2F1, 0x96C5, 0x96C6, 0x96C7,
+ /* U+67F8 */ 0x96C8, 0x96C9, 0x96CA, 0x96CB, 0x96CC, 0xE8DF, 0x96CD, 0xCAC1,
+ /* U+6800 */ 0xE8D9, 0x96CE, 0x96CF, 0x96D0, 0x96D1, 0xD5A4, 0x96D2, 0xB1EA,
+ /* U+6808 */ 0xD5BB, 0xE8CE, 0xE8D0, 0xB6B0, 0xE8D3, 0x96D3, 0xE8DD, 0xC0B8,
+ /* U+6810 */ 0x96D4, 0xCAF7, 0x96D5, 0xCBA8, 0x96D6, 0x96D7, 0xC6DC, 0xC0F5,
+ /* U+6818 */ 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0xE8E9, 0x96DD, 0x96DE,
+ /* U+6820 */ 0x96DF, 0xD0A3, 0x96E0, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5,
+ /* U+6828 */ 0x96E6, 0xE8F2, 0xD6EA, 0x96E7, 0x96E8, 0x96E9, 0x96EA, 0x96EB,
+ /* U+6830 */ 0x96EC, 0x96ED, 0xE8E0, 0xE8E1, 0x96EE, 0x96EF, 0x96F0, 0xD1F9,
+ /* U+6838 */ 0xBACB, 0xB8F9, 0x96F1, 0x96F2, 0xB8F1, 0xD4D4, 0xE8EF, 0x96F3,
+ /* U+6840 */ 0xE8EE, 0xE8EC, 0xB9F0, 0xCCD2, 0xE8E6, 0xCEA6, 0xBFF2, 0x96F4,
+ /* U+6848 */ 0xB0B8, 0xE8F1, 0xE8F0, 0x96F5, 0xD7C0, 0x96F6, 0xE8E4, 0x96F7,
+ /* U+6850 */ 0xCDA9, 0xC9A3, 0x96F8, 0xBBB8, 0xBDDB, 0xE8EA, 0x96F9, 0x96FA,
+ /* U+6858 */ 0x96FB, 0x96FC, 0x96FD, 0x96FE, 0x9740, 0x9741, 0x9742, 0x9743,
+ /* U+6860 */ 0xE8E2, 0xE8E3, 0xE8E5, 0xB5B5, 0xE8E7, 0xC7C5, 0xE8EB, 0xE8ED,
+ /* U+6868 */ 0xBDB0, 0xD7AE, 0x9744, 0xE8F8, 0x9745, 0x9746, 0x9747, 0x9748,
+ /* U+6870 */ 0x9749, 0x974A, 0x974B, 0x974C, 0xE8F5, 0x974D, 0xCDB0, 0xE8F6,
+ /* U+6878 */ 0x974E, 0x974F, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755,
+ /* U+6880 */ 0x9756, 0xC1BA, 0x9757, 0xE8E8, 0x9758, 0xC3B7, 0xB0F0, 0x9759,
+ /* U+6888 */ 0x975A, 0x975B, 0x975C, 0x975D, 0x975E, 0x975F, 0x9760, 0xE8F4,
+ /* U+6890 */ 0x9761, 0x9762, 0x9763, 0xE8F7, 0x9764, 0x9765, 0x9766, 0xB9A3,
+ /* U+6898 */ 0x9767, 0x9768, 0x9769, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E,
+ /* U+68A0 */ 0x976F, 0x9770, 0xC9D2, 0x9771, 0x9772, 0x9773, 0xC3CE, 0xCEE0,
+ /* U+68A8 */ 0xC0E6, 0x9774, 0x9775, 0x9776, 0x9777, 0xCBF3, 0x9778, 0xCCDD,
+ /* U+68B0 */ 0xD0B5, 0x9779, 0x977A, 0xCAE1, 0x977B, 0xE8F3, 0x977C, 0x977D,
+ /* U+68B8 */ 0x977E, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786,
+ /* U+68C0 */ 0xBCEC, 0x9787, 0xE8F9, 0x9788, 0x9789, 0x978A, 0x978B, 0x978C,
+ /* U+68C8 */ 0x978D, 0xC3DE, 0x978E, 0xC6E5, 0x978F, 0xB9F7, 0x9790, 0x9791,
+ /* U+68D0 */ 0x9792, 0x9793, 0xB0F4, 0x9794, 0x9795, 0xD7D8, 0x9796, 0x9797,
+ /* U+68D8 */ 0xBCAC, 0x9798, 0xC5EF, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D,
+ /* U+68E0 */ 0xCCC4, 0x979E, 0x979F, 0xE9A6, 0x97A0, 0x97A1, 0x97A2, 0x97A3,
+ /* U+68E8 */ 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0xC9AD, 0x97AA,
+ /* U+68F0 */ 0xE9A2, 0xC0E2, 0x97AB, 0x97AC, 0x97AD, 0xBFC3, 0x97AE, 0x97AF,
+ /* U+68F8 */ 0x97B0, 0xE8FE, 0xB9D7, 0x97B1, 0xE8FB, 0x97B2, 0x97B3, 0x97B4,
+ /* U+6900 */ 0x97B5, 0xE9A4, 0x97B6, 0x97B7, 0x97B8, 0xD2CE, 0x97B9, 0x97BA,
+ /* U+6908 */ 0x97BB, 0x97BC, 0x97BD, 0xE9A3, 0x97BE, 0xD6B2, 0xD7B5, 0x97BF,
+ /* U+6910 */ 0xE9A7, 0x97C0, 0xBDB7, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5,
+ /* U+6918 */ 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, 0xE8FC,
+ /* U+6920 */ 0xE8FD, 0x97CD, 0x97CE, 0x97CF, 0xE9A1, 0x97D0, 0x97D1, 0x97D2,
+ /* U+6928 */ 0x97D3, 0x97D4, 0x97D5, 0x97D6, 0x97D7, 0xCDD6, 0x97D8, 0x97D9,
+ /* U+6930 */ 0xD2AC, 0x97DA, 0x97DB, 0x97DC, 0xE9B2, 0x97DD, 0x97DE, 0x97DF,
+ /* U+6938 */ 0x97E0, 0xE9A9, 0x97E1, 0x97E2, 0x97E3, 0xB4AA, 0x97E4, 0xB4BB,
+ /* U+6940 */ 0x97E5, 0x97E6, 0xE9AB, 0x97E7, 0x97E8, 0x97E9, 0x97EA, 0x97EB,
+ /* U+6948 */ 0x97EC, 0x97ED, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F3,
+ /* U+6950 */ 0x97F4, 0x97F5, 0x97F6, 0x97F7, 0xD0A8, 0x97F8, 0x97F9, 0xE9A5,
+ /* U+6958 */ 0x97FA, 0x97FB, 0xB3FE, 0x97FC, 0x97FD, 0xE9AC, 0xC0E3, 0x97FE,
+ /* U+6960 */ 0xE9AA, 0x9840, 0x9841, 0xE9B9, 0x9842, 0x9843, 0xE9B8, 0x9844,
+ /* U+6968 */ 0x9845, 0x9846, 0x9847, 0xE9AE, 0x9848, 0x9849, 0xE8FA, 0x984A,
+ /* U+6970 */ 0x984B, 0xE9A8, 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, 0xBFAC,
+ /* U+6978 */ 0xE9B1, 0xE9BA, 0x9851, 0x9852, 0xC2A5, 0x9853, 0x9854, 0x9855,
+ /* U+6980 */ 0xE9AF, 0x9856, 0xB8C5, 0x9857, 0xE9AD, 0x9858, 0xD3DC, 0xE9B4,
+ /* U+6988 */ 0xE9B5, 0xE9B7, 0x9859, 0x985A, 0x985B, 0xE9C7, 0x985C, 0x985D,
+ /* U+6990 */ 0x985E, 0x985F, 0x9860, 0x9861, 0xC0C6, 0xE9C5, 0x9862, 0x9863,
+ /* U+6998 */ 0xE9B0, 0x9864, 0x9865, 0xE9BB, 0xB0F1, 0x9866, 0x9867, 0x9868,
+ /* U+69A0 */ 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x986F, 0xE9BC,
+ /* U+69A8 */ 0xD5A5, 0x9870, 0x9871, 0xE9BE, 0x9872, 0xE9BF, 0x9873, 0x9874,
+ /* U+69B0 */ 0x9875, 0xE9C1, 0x9876, 0x9877, 0xC1F1, 0x9878, 0x9879, 0xC8B6,
+ /* U+69B8 */ 0x987A, 0x987B, 0x987C, 0xE9BD, 0x987D, 0x987E, 0x9880, 0x9881,
+ /* U+69C0 */ 0x9882, 0xE9C2, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888,
+ /* U+69C8 */ 0x9889, 0x988A, 0xE9C3, 0x988B, 0xE9B3, 0x988C, 0xE9B6, 0x988D,
+ /* U+69D0 */ 0xBBB1, 0x988E, 0x988F, 0x9890, 0xE9C0, 0x9891, 0x9892, 0x9893,
+ /* U+69D8 */ 0x9894, 0x9895, 0x9896, 0xBCF7, 0x9897, 0x9898, 0x9899, 0xE9C4,
+ /* U+69E0 */ 0xE9C6, 0x989A, 0x989B, 0x989C, 0x989D, 0x989E, 0x989F, 0x98A0,
+ /* U+69E8 */ 0x98A1, 0x98A2, 0x98A3, 0x98A4, 0x98A5, 0xE9CA, 0x98A6, 0x98A7,
+ /* U+69F0 */ 0x98A8, 0x98A9, 0xE9CE, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE,
+ /* U+69F8 */ 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0xB2DB, 0x98B4, 0xE9C8,
+ /* U+6A00 */ 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC,
+ /* U+6A08 */ 0x98BD, 0x98BE, 0xB7AE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3,
+ /* U+6A10 */ 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0xE9CB,
+ /* U+6A18 */ 0xE9CC, 0x98CB, 0x98CC, 0x98CD, 0x98CE, 0x98CF, 0x98D0, 0xD5C1,
+ /* U+6A20 */ 0x98D1, 0xC4A3, 0x98D2, 0x98D3, 0x98D4, 0x98D5, 0x98D6, 0x98D7,
+ /* U+6A28 */ 0xE9D8, 0x98D8, 0xBAE1, 0x98D9, 0x98DA, 0x98DB, 0x98DC, 0xE9C9,
+ /* U+6A30 */ 0x98DD, 0xD3A3, 0x98DE, 0x98DF, 0x98E0, 0xE9D4, 0x98E1, 0x98E2,
+ /* U+6A38 */ 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E7, 0xE9D7, 0xE9D0, 0x98E8,
+ /* U+6A40 */ 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0xE9CF, 0x98ED, 0x98EE, 0xC7C1,
+ /* U+6A48 */ 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6,
+ /* U+6A50 */ 0xE9D2, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD,
+ /* U+6A58 */ 0xE9D9, 0xB3C8, 0x98FE, 0xE9D3, 0x9940, 0x9941, 0x9942, 0x9943,
+ /* U+6A60 */ 0x9944, 0xCFF0, 0x9945, 0x9946, 0x9947, 0xE9CD, 0x9948, 0x9949,
+ /* U+6A68 */ 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951,
+ /* U+6A70 */ 0x9952, 0xB3F7, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958,
+ /* U+6A78 */ 0x9959, 0xE9D6, 0x995A, 0x995B, 0xE9DA, 0x995C, 0x995D, 0x995E,
+ /* U+6A80 */ 0xCCB4, 0x995F, 0x9960, 0x9961, 0xCFAD, 0x9962, 0x9963, 0x9964,
+ /* U+6A88 */ 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996A, 0xE9D5, 0x996B,
+ /* U+6A90 */ 0xE9DC, 0xE9DB, 0x996C, 0x996D, 0x996E, 0x996F, 0x9970, 0xE9DE,
+ /* U+6A98 */ 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978,
+ /* U+6AA0 */ 0xE9D1, 0x9979, 0x997A, 0x997B, 0x997C, 0x997D, 0x997E, 0x9980,
+ /* U+6AA8 */ 0x9981, 0xE9DD, 0x9982, 0xE9DF, 0xC3CA, 0x9983, 0x9984, 0x9985,
+ /* U+6AB0 */ 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B, 0x998C, 0x998D,
+ /* U+6AB8 */ 0x998E, 0x998F, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995,
+ /* U+6AC0 */ 0x9996, 0x9997, 0x9998, 0x9999, 0x999A, 0x999B, 0x999C, 0x999D,
+ /* U+6AC8 */ 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A5,
+ /* U+6AD0 */ 0x99A6, 0x99A7, 0x99A8, 0x99A9, 0x99AA, 0x99AB, 0x99AC, 0x99AD,
+ /* U+6AD8 */ 0x99AE, 0x99AF, 0x99B0, 0x99B1, 0x99B2, 0x99B3, 0x99B4, 0x99B5,
+ /* U+6AE0 */ 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB, 0x99BC, 0x99BD,
+ /* U+6AE8 */ 0x99BE, 0x99BF, 0x99C0, 0x99C1, 0x99C2, 0x99C3, 0x99C4, 0x99C5,
+ /* U+6AF0 */ 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD,
+ /* U+6AF8 */ 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D2, 0x99D3, 0x99D4, 0x99D5,
+ /* U+6B00 */ 0x99D6, 0x99D7, 0x99D8, 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD,
+ /* U+6B08 */ 0x99DE, 0x99DF, 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5,
+ /* U+6B10 */ 0x99E6, 0x99E7, 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED,
+ /* U+6B18 */ 0x99EE, 0x99EF, 0x99F0, 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5,
+ /* U+6B20 */ 0xC7B7, 0xB4CE, 0xBBB6, 0xD0C0, 0xECA3, 0x99F6, 0x99F7, 0xC5B7,
+ /* U+6B28 */ 0x99F8, 0x99F9, 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x9A40,
+ /* U+6B30 */ 0x9A41, 0x9A42, 0xD3FB, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0xECA4,
+ /* U+6B38 */ 0x9A47, 0xECA5, 0xC6DB, 0x9A48, 0x9A49, 0x9A4A, 0xBFEE, 0x9A4B,
+ /* U+6B40 */ 0x9A4C, 0x9A4D, 0x9A4E, 0xECA6, 0x9A4F, 0x9A50, 0xECA7, 0xD0AA,
+ /* U+6B48 */ 0x9A51, 0xC7B8, 0x9A52, 0x9A53, 0xB8E8, 0x9A54, 0x9A55, 0x9A56,
+ /* U+6B50 */ 0x9A57, 0x9A58, 0x9A59, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E,
+ /* U+6B58 */ 0x9A5F, 0xECA8, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65,
+ /* U+6B60 */ 0x9A66, 0x9A67, 0xD6B9, 0xD5FD, 0xB4CB, 0xB2BD, 0xCEE4, 0xC6E7,
+ /* U+6B68 */ 0x9A68, 0x9A69, 0xCDE1, 0x9A6A, 0x9A6B, 0x9A6C, 0x9A6D, 0x9A6E,
+ /* U+6B70 */ 0x9A6F, 0x9A70, 0x9A71, 0x9A72, 0x9A73, 0x9A74, 0x9A75, 0x9A76,
+ /* U+6B78 */ 0x9A77, 0xB4F5, 0x9A78, 0xCBC0, 0xBCDF, 0x9A79, 0x9A7A, 0x9A7B,
+ /* U+6B80 */ 0x9A7C, 0xE9E2, 0xE9E3, 0xD1EA, 0xE9E5, 0x9A7D, 0xB4F9, 0xE9E4,
+ /* U+6B88 */ 0x9A7E, 0xD1B3, 0xCAE2, 0xB2D0, 0x9A80, 0xE9E8, 0x9A81, 0x9A82,
+ /* U+6B90 */ 0x9A83, 0x9A84, 0xE9E6, 0xE9E7, 0x9A85, 0x9A86, 0xD6B3, 0x9A87,
+ /* U+6B98 */ 0x9A88, 0x9A89, 0xE9E9, 0xE9EA, 0x9A8A, 0x9A8B, 0x9A8C, 0x9A8D,
+ /* U+6BA0 */ 0x9A8E, 0xE9EB, 0x9A8F, 0x9A90, 0x9A91, 0x9A92, 0x9A93, 0x9A94,
+ /* U+6BA8 */ 0x9A95, 0x9A96, 0xE9EC, 0x9A97, 0x9A98, 0x9A99, 0x9A9A, 0x9A9B,
+ /* U+6BB0 */ 0x9A9C, 0x9A9D, 0x9A9E, 0xECAF, 0xC5B9, 0xB6CE, 0x9A9F, 0xD2F3,
+ /* U+6BB8 */ 0x9AA0, 0x9AA1, 0x9AA2, 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, 0xB5EE,
+ /* U+6BC0 */ 0x9AA7, 0xBBD9, 0xECB1, 0x9AA8, 0x9AA9, 0xD2E3, 0x9AAA, 0x9AAB,
+ /* U+6BC8 */ 0x9AAC, 0x9AAD, 0x9AAE, 0xCEE3, 0x9AAF, 0xC4B8, 0x9AB0, 0xC3BF,
+ /* U+6BD0 */ 0x9AB1, 0x9AB2, 0xB6BE, 0xD8B9, 0xB1C8, 0xB1CF, 0xB1D1, 0xC5FE,
+ /* U+6BD8 */ 0x9AB3, 0xB1D0, 0x9AB4, 0xC3AB, 0x9AB5, 0x9AB6, 0x9AB7, 0x9AB8,
+ /* U+6BE0 */ 0x9AB9, 0xD5B1, 0x9ABA, 0x9ABB, 0x9ABC, 0x9ABD, 0x9ABE, 0x9ABF,
+ /* U+6BE8 */ 0x9AC0, 0x9AC1, 0xEBA4, 0xBAC1, 0x9AC2, 0x9AC3, 0x9AC4, 0xCCBA,
+ /* U+6BF0 */ 0x9AC5, 0x9AC6, 0x9AC7, 0xEBA5, 0x9AC8, 0xEBA7, 0x9AC9, 0x9ACA,
+ /* U+6BF8 */ 0x9ACB, 0xEBA8, 0x9ACC, 0x9ACD, 0x9ACE, 0xEBA6, 0x9ACF, 0x9AD0,
+ /* U+6C00 */ 0x9AD1, 0x9AD2, 0x9AD3, 0x9AD4, 0x9AD5, 0xEBA9, 0xEBAB, 0xEBAA,
+ /* U+6C08 */ 0x9AD6, 0x9AD7, 0x9AD8, 0x9AD9, 0x9ADA, 0xEBAC, 0x9ADB, 0xCACF,
+ /* U+6C10 */ 0xD8B5, 0xC3F1, 0x9ADC, 0xC3A5, 0xC6F8, 0xEBAD, 0xC4CA, 0x9ADD,
+ /* U+6C18 */ 0xEBAE, 0xEBAF, 0xEBB0, 0xB7D5, 0x9ADE, 0x9ADF, 0x9AE0, 0xB7FA,
+ /* U+6C20 */ 0x9AE1, 0xEBB1, 0xC7E2, 0x9AE2, 0xEBB3, 0x9AE3, 0xBAA4, 0xD1F5,
+ /* U+6C28 */ 0xB0B1, 0xEBB2, 0xEBB4, 0x9AE4, 0x9AE5, 0x9AE6, 0xB5AA, 0xC2C8,
+ /* U+6C30 */ 0xC7E8, 0x9AE7, 0xEBB5, 0x9AE8, 0xCBAE, 0xE3DF, 0x9AE9, 0x9AEA,
+ /* U+6C38 */ 0xD3C0, 0x9AEB, 0x9AEC, 0x9AED, 0x9AEE, 0xD9DB, 0x9AEF, 0x9AF0,
+ /* U+6C40 */ 0xCDA1, 0xD6AD, 0xC7F3, 0x9AF1, 0x9AF2, 0x9AF3, 0xD9E0, 0xBBE3,
+ /* U+6C48 */ 0x9AF4, 0xBABA, 0xE3E2, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AF9,
+ /* U+6C50 */ 0xCFAB, 0x9AFA, 0x9AFB, 0x9AFC, 0xE3E0, 0xC9C7, 0x9AFD, 0xBAB9,
+ /* U+6C58 */ 0x9AFE, 0x9B40, 0x9B41, 0xD1B4, 0xE3E1, 0xC8EA, 0xB9AF, 0xBDAD,
+ /* U+6C60 */ 0xB3D8, 0xCEDB, 0x9B42, 0x9B43, 0xCCC0, 0x9B44, 0x9B45, 0x9B46,
+ /* U+6C68 */ 0xE3E8, 0xE3E9, 0xCDF4, 0x9B47, 0x9B48, 0x9B49, 0x9B4A, 0x9B4B,
+ /* U+6C70 */ 0xCCAD, 0x9B4C, 0xBCB3, 0x9B4D, 0xE3EA, 0x9B4E, 0xE3EB, 0x9B4F,
+ /* U+6C78 */ 0x9B50, 0xD0DA, 0x9B51, 0x9B52, 0x9B53, 0xC6FB, 0xB7DA, 0x9B54,
+ /* U+6C80 */ 0x9B55, 0xC7DF, 0xD2CA, 0xCED6, 0x9B56, 0xE3E4, 0xE3EC, 0x9B57,
+ /* U+6C88 */ 0xC9F2, 0xB3C1, 0x9B58, 0x9B59, 0xE3E7, 0x9B5A, 0x9B5B, 0xC6E3,
+ /* U+6C90 */ 0xE3E5, 0x9B5C, 0x9B5D, 0xEDB3, 0xE3E6, 0x9B5E, 0x9B5F, 0x9B60,
+ /* U+6C98 */ 0x9B61, 0xC9B3, 0x9B62, 0xC5E6, 0x9B63, 0x9B64, 0x9B65, 0xB9B5,
+ /* U+6CA0 */ 0x9B66, 0xC3BB, 0x9B67, 0xE3E3, 0xC5BD, 0xC1A4, 0xC2D9, 0xB2D7,
+ /* U+6CA8 */ 0x9B68, 0xE3ED, 0xBBA6, 0xC4AD, 0x9B69, 0xE3F0, 0xBEDA, 0x9B6A,
+ /* U+6CB0 */ 0x9B6B, 0xE3FB, 0xE3F5, 0xBAD3, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F,
+ /* U+6CB8 */ 0xB7D0, 0xD3CD, 0x9B70, 0xD6CE, 0xD5D3, 0xB9C1, 0xD5B4, 0xD1D8,
+ /* U+6CC0 */ 0x9B71, 0x9B72, 0x9B73, 0x9B74, 0xD0B9, 0xC7F6, 0x9B75, 0x9B76,
+ /* U+6CC8 */ 0x9B77, 0xC8AA, 0xB2B4, 0x9B78, 0xC3DA, 0x9B79, 0x9B7A, 0x9B7B,
+ /* U+6CD0 */ 0xE3EE, 0x9B7C, 0x9B7D, 0xE3FC, 0xE3EF, 0xB7A8, 0xE3F7, 0xE3F4,
+ /* U+6CD8 */ 0x9B7E, 0x9B80, 0x9B81, 0xB7BA, 0x9B82, 0x9B83, 0xC5A2, 0x9B84,
+ /* U+6CE0 */ 0xE3F6, 0xC5DD, 0xB2A8, 0xC6FC, 0x9B85, 0xC4E0, 0x9B86, 0x9B87,
+ /* U+6CE8 */ 0xD7A2, 0x9B88, 0xC0E1, 0xE3F9, 0x9B89, 0x9B8A, 0xE3FA, 0xE3FD,
+ /* U+6CF0 */ 0xCCA9, 0xE3F3, 0x9B8B, 0xD3BE, 0x9B8C, 0xB1C3, 0xEDB4, 0xE3F1,
+ /* U+6CF8 */ 0xE3F2, 0x9B8D, 0xE3F8, 0xD0BA, 0xC6C3, 0xD4F3, 0xE3FE, 0x9B8E,
+ /* U+6D00 */ 0x9B8F, 0xBDE0, 0x9B90, 0x9B91, 0xE4A7, 0x9B92, 0x9B93, 0xE4A6,
+ /* U+6D08 */ 0x9B94, 0x9B95, 0x9B96, 0xD1F3, 0xE4A3, 0x9B97, 0xE4A9, 0x9B98,
+ /* U+6D10 */ 0x9B99, 0x9B9A, 0xC8F7, 0x9B9B, 0x9B9C, 0x9B9D, 0x9B9E, 0xCFB4,
+ /* U+6D18 */ 0x9B9F, 0xE4A8, 0xE4AE, 0xC2E5, 0x9BA0, 0x9BA1, 0xB6B4, 0x9BA2,
+ /* U+6D20 */ 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0xBDF2, 0x9BA8, 0xE4A2,
+ /* U+6D28 */ 0x9BA9, 0x9BAA, 0xBAE9, 0xE4AA, 0x9BAB, 0x9BAC, 0xE4AC, 0x9BAD,
+ /* U+6D30 */ 0x9BAE, 0xB6FD, 0xD6DE, 0xE4B2, 0x9BAF, 0xE4AD, 0x9BB0, 0x9BB1,
+ /* U+6D38 */ 0x9BB2, 0xE4A1, 0x9BB3, 0xBBEE, 0xCDDD, 0xC7A2, 0xC5C9, 0x9BB4,
+ /* U+6D40 */ 0x9BB5, 0xC1F7, 0x9BB6, 0xE4A4, 0x9BB7, 0xC7B3, 0xBDAC, 0xBDBD,
+ /* U+6D48 */ 0xE4A5, 0x9BB8, 0xD7C7, 0xB2E2, 0x9BB9, 0xE4AB, 0xBCC3, 0xE4AF,
+ /* U+6D50 */ 0x9BBA, 0xBBEB, 0xE4B0, 0xC5A8, 0xE4B1, 0x9BBB, 0x9BBC, 0x9BBD,
+ /* U+6D58 */ 0x9BBE, 0xD5E3, 0xBFA3, 0x9BBF, 0xE4BA, 0x9BC0, 0xE4B7, 0x9BC1,
+ /* U+6D60 */ 0xE4BB, 0x9BC2, 0x9BC3, 0xE4BD, 0x9BC4, 0x9BC5, 0xC6D6, 0x9BC6,
+ /* U+6D68 */ 0x9BC7, 0xBAC6, 0xC0CB, 0x9BC8, 0x9BC9, 0x9BCA, 0xB8A1, 0xE4B4,
+ /* U+6D70 */ 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0xD4A1, 0x9BCF, 0x9BD0, 0xBAA3,
+ /* U+6D78 */ 0xBDFE, 0x9BD1, 0x9BD2, 0x9BD3, 0xE4BC, 0x9BD4, 0x9BD5, 0x9BD6,
+ /* U+6D80 */ 0x9BD7, 0x9BD8, 0xCDBF, 0x9BD9, 0x9BDA, 0xC4F9, 0x9BDB, 0x9BDC,
+ /* U+6D88 */ 0xCFFB, 0xC9E6, 0x9BDD, 0x9BDE, 0xD3BF, 0x9BDF, 0xCFD1, 0x9BE0,
+ /* U+6D90 */ 0x9BE1, 0xE4B3, 0x9BE2, 0xE4B8, 0xE4B9, 0xCCE9, 0x9BE3, 0x9BE4,
+ /* U+6D98 */ 0x9BE5, 0x9BE6, 0x9BE7, 0xCCCE, 0x9BE8, 0xC0D4, 0xE4B5, 0xC1B0,
+ /* U+6DA0 */ 0xE4B6, 0xCED0, 0x9BE9, 0xBBC1, 0xB5D3, 0x9BEA, 0xC8F3, 0xBDA7,
+ /* U+6DA8 */ 0xD5C7, 0xC9AC, 0xB8A2, 0xE4CA, 0x9BEB, 0x9BEC, 0xE4CC, 0xD1C4,
+ /* U+6DB0 */ 0x9BED, 0x9BEE, 0xD2BA, 0x9BEF, 0x9BF0, 0xBAAD, 0x9BF1, 0x9BF2,
+ /* U+6DB8 */ 0xBAD4, 0x9BF3, 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0xE4C3,
+ /* U+6DC0 */ 0xB5ED, 0x9BF9, 0x9BFA, 0x9BFB, 0xD7CD, 0xE4C0, 0xCFFD, 0xE4BF,
+ /* U+6DC8 */ 0x9BFC, 0x9BFD, 0x9BFE, 0xC1DC, 0xCCCA, 0x9C40, 0x9C41, 0x9C42,
+ /* U+6DD0 */ 0x9C43, 0xCAE7, 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0xC4D7, 0x9C48,
+ /* U+6DD8 */ 0xCCD4, 0xE4C8, 0x9C49, 0x9C4A, 0x9C4B, 0xE4C7, 0xE4C1, 0x9C4C,
+ /* U+6DE0 */ 0xE4C4, 0xB5AD, 0x9C4D, 0x9C4E, 0xD3D9, 0x9C4F, 0xE4C6, 0x9C50,
+ /* U+6DE8 */ 0x9C51, 0x9C52, 0x9C53, 0xD2F9, 0xB4E3, 0x9C54, 0xBBB4, 0x9C55,
+ /* U+6DF0 */ 0x9C56, 0xC9EE, 0x9C57, 0xB4BE, 0x9C58, 0x9C59, 0x9C5A, 0xBBEC,
+ /* U+6DF8 */ 0x9C5B, 0xD1CD, 0x9C5C, 0xCCED, 0xEDB5, 0x9C5D, 0x9C5E, 0x9C5F,
+ /* U+6E00 */ 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0xC7E5, 0x9C65, 0x9C66,
+ /* U+6E08 */ 0x9C67, 0x9C68, 0xD4A8, 0x9C69, 0xE4CB, 0xD7D5, 0xE4C2, 0x9C6A,
+ /* U+6E10 */ 0xBDA5, 0xE4C5, 0x9C6B, 0x9C6C, 0xD3E6, 0x9C6D, 0xE4C9, 0xC9F8,
+ /* U+6E18 */ 0x9C6E, 0x9C6F, 0xE4BE, 0x9C70, 0x9C71, 0xD3E5, 0x9C72, 0x9C73,
+ /* U+6E20 */ 0xC7FE, 0xB6C9, 0x9C74, 0xD4FC, 0xB2B3, 0xE4D7, 0x9C75, 0x9C76,
+ /* U+6E28 */ 0x9C77, 0xCEC2, 0x9C78, 0xE4CD, 0x9C79, 0xCEBC, 0x9C7A, 0xB8DB,
+ /* U+6E30 */ 0x9C7B, 0x9C7C, 0xE4D6, 0x9C7D, 0xBFCA, 0x9C7E, 0x9C80, 0x9C81,
+ /* U+6E38 */ 0xD3CE, 0x9C82, 0xC3EC, 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87,
+ /* U+6E40 */ 0x9C88, 0x9C89, 0x9C8A, 0xC5C8, 0xE4D8, 0x9C8B, 0x9C8C, 0x9C8D,
+ /* U+6E48 */ 0x9C8E, 0x9C8F, 0x9C90, 0x9C91, 0x9C92, 0xCDC4, 0xE4CF, 0x9C93,
+ /* U+6E50 */ 0x9C94, 0x9C95, 0x9C96, 0xE4D4, 0xE4D5, 0x9C97, 0xBAFE, 0x9C98,
+ /* U+6E58 */ 0xCFE6, 0x9C99, 0x9C9A, 0xD5BF, 0x9C9B, 0x9C9C, 0x9C9D, 0xE4D2,
+ /* U+6E60 */ 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA4, 0x9CA5,
+ /* U+6E68 */ 0x9CA6, 0x9CA7, 0x9CA8, 0xE4D0, 0x9CA9, 0x9CAA, 0xE4CE, 0x9CAB,
+ /* U+6E70 */ 0x9CAC, 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3,
+ /* U+6E78 */ 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CB8, 0x9CB9, 0xCDE5, 0xCAAA,
+ /* U+6E80 */ 0x9CBA, 0x9CBB, 0x9CBC, 0xC0A3, 0x9CBD, 0xBDA6, 0xE4D3, 0x9CBE,
+ /* U+6E88 */ 0x9CBF, 0xB8C8, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC3, 0x9CC4, 0xE4E7,
+ /* U+6E90 */ 0xD4B4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CC8, 0x9CC9, 0x9CCA, 0x9CCB,
+ /* U+6E98 */ 0xE4DB, 0x9CCC, 0x9CCD, 0x9CCE, 0xC1EF, 0x9CCF, 0x9CD0, 0xE4E9,
+ /* U+6EA0 */ 0x9CD1, 0x9CD2, 0xD2E7, 0x9CD3, 0x9CD4, 0xE4DF, 0x9CD5, 0xE4E0,
+ /* U+6EA8 */ 0x9CD6, 0x9CD7, 0xCFAA, 0x9CD8, 0x9CD9, 0x9CDA, 0x9CDB, 0xCBDD,
+ /* U+6EB0 */ 0x9CDC, 0xE4DA, 0xE4D1, 0x9CDD, 0xE4E5, 0x9CDE, 0xC8DC, 0xE4E3,
+ /* U+6EB8 */ 0x9CDF, 0x9CE0, 0xC4E7, 0xE4E2, 0x9CE1, 0xE4E1, 0x9CE2, 0x9CE3,
+ /* U+6EC0 */ 0x9CE4, 0xB3FC, 0xE4E8, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0xB5E1,
+ /* U+6EC8 */ 0x9CE9, 0x9CEA, 0x9CEB, 0xD7CC, 0x9CEC, 0x9CED, 0x9CEE, 0xE4E6,
+ /* U+6ED0 */ 0x9CEF, 0xBBAC, 0x9CF0, 0xD7D2, 0xCCCF, 0xEBF8, 0x9CF1, 0xE4E4,
+ /* U+6ED8 */ 0x9CF2, 0x9CF3, 0xB9F6, 0x9CF4, 0x9CF5, 0x9CF6, 0xD6CD, 0xE4D9,
+ /* U+6EE0 */ 0xE4DC, 0xC2FA, 0xE4DE, 0x9CF7, 0xC2CB, 0xC0C4, 0xC2D0, 0x9CF8,
+ /* U+6EE8 */ 0xB1F5, 0xCCB2, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE,
+ /* U+6EF0 */ 0x9D40, 0x9D41, 0x9D42, 0x9D43, 0xB5CE, 0x9D44, 0x9D45, 0x9D46,
+ /* U+6EF8 */ 0x9D47, 0xE4EF, 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D,
+ /* U+6F00 */ 0x9D4E, 0x9D4F, 0xC6AF, 0x9D50, 0x9D51, 0x9D52, 0xC6E1, 0x9D53,
+ /* U+6F08 */ 0x9D54, 0xE4F5, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0xC2A9,
+ /* U+6F10 */ 0x9D5A, 0x9D5B, 0x9D5C, 0xC0EC, 0xD1DD, 0xE4EE, 0x9D5D, 0x9D5E,
+ /* U+6F18 */ 0x9D5F, 0x9D60, 0x9D61, 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66,
+ /* U+6F20 */ 0xC4AE, 0x9D67, 0x9D68, 0x9D69, 0xE4ED, 0x9D6A, 0x9D6B, 0x9D6C,
+ /* U+6F28 */ 0x9D6D, 0xE4F6, 0xE4F4, 0xC2FE, 0x9D6E, 0xE4DD, 0x9D6F, 0xE4F0,
+ /* U+6F30 */ 0x9D70, 0xCAFE, 0x9D71, 0xD5C4, 0x9D72, 0x9D73, 0xE4F1, 0x9D74,
+ /* U+6F38 */ 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0xD1FA, 0x9D7B,
+ /* U+6F40 */ 0x9D7C, 0x9D7D, 0x9D7E, 0x9D80, 0x9D81, 0x9D82, 0xE4EB, 0xE4EC,
+ /* U+6F48 */ 0x9D83, 0x9D84, 0x9D85, 0xE4F2, 0x9D86, 0xCEAB, 0x9D87, 0x9D88,
+ /* U+6F50 */ 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90,
+ /* U+6F58 */ 0xC5CB, 0x9D91, 0x9D92, 0x9D93, 0xC7B1, 0x9D94, 0xC2BA, 0x9D95,
+ /* U+6F60 */ 0x9D96, 0x9D97, 0xE4EA, 0x9D98, 0x9D99, 0x9D9A, 0xC1CA, 0x9D9B,
+ /* U+6F68 */ 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0xCCB6, 0xB3B1, 0x9DA1,
+ /* U+6F70 */ 0x9DA2, 0x9DA3, 0xE4FB, 0x9DA4, 0xE4F3, 0x9DA5, 0x9DA6, 0x9DA7,
+ /* U+6F78 */ 0xE4FA, 0x9DA8, 0xE4FD, 0x9DA9, 0xE4FC, 0x9DAA, 0x9DAB, 0x9DAC,
+ /* U+6F80 */ 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0xB3CE, 0x9DB1, 0x9DB2, 0x9DB3,
+ /* U+6F88 */ 0xB3BA, 0xE4F7, 0x9DB4, 0x9DB5, 0xE4F9, 0xE4F8, 0xC5EC, 0x9DB6,
+ /* U+6F90 */ 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE,
+ /* U+6F98 */ 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0xC0BD, 0x9DC3, 0x9DC4, 0x9DC5,
+ /* U+6FA0 */ 0x9DC6, 0xD4E8, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0xE5A2,
+ /* U+6FA8 */ 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3,
+ /* U+6FB0 */ 0x9DD4, 0x9DD5, 0x9DD6, 0xB0C4, 0x9DD7, 0x9DD8, 0xE5A4, 0x9DD9,
+ /* U+6FB8 */ 0x9DDA, 0xE5A3, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0,
+ /* U+6FC0 */ 0xBCA4, 0x9DE1, 0xE5A5, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6,
+ /* U+6FC8 */ 0x9DE7, 0xE5A1, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED,
+ /* U+6FD0 */ 0x9DEE, 0xE4FE, 0xB1F4, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3,
+ /* U+6FD8 */ 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0xE5A8, 0x9DFA,
+ /* U+6FE0 */ 0xE5A9, 0xE5A6, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9E40, 0x9E41,
+ /* U+6FE8 */ 0x9E42, 0x9E43, 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0xE5A7, 0xE5AA,
+ /* U+6FF0 */ 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, 0x9E4C, 0x9E4D, 0x9E4E, 0x9E4F,
+ /* U+6FF8 */ 0x9E50, 0x9E51, 0x9E52, 0x9E53, 0x9E54, 0x9E55, 0x9E56, 0x9E57,
+ /* U+7000 */ 0x9E58, 0x9E59, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5D, 0x9E5E, 0x9E5F,
+ /* U+7008 */ 0x9E60, 0x9E61, 0x9E62, 0x9E63, 0x9E64, 0x9E65, 0x9E66, 0x9E67,
+ /* U+7010 */ 0x9E68, 0xC6D9, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E6D, 0x9E6E,
+ /* U+7018 */ 0x9E6F, 0x9E70, 0xE5AB, 0xE5AD, 0x9E71, 0x9E72, 0x9E73, 0x9E74,
+ /* U+7020 */ 0x9E75, 0x9E76, 0x9E77, 0xE5AC, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B,
+ /* U+7028 */ 0x9E7C, 0x9E7D, 0x9E7E, 0x9E80, 0x9E81, 0x9E82, 0x9E83, 0x9E84,
+ /* U+7030 */ 0x9E85, 0x9E86, 0x9E87, 0x9E88, 0x9E89, 0xE5AF, 0x9E8A, 0x9E8B,
+ /* U+7038 */ 0x9E8C, 0xE5AE, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E92,
+ /* U+7040 */ 0x9E93, 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A,
+ /* U+7048 */ 0x9E9B, 0x9E9C, 0x9E9D, 0x9E9E, 0xB9E0, 0x9E9F, 0x9EA0, 0xE5B0,
+ /* U+7050 */ 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA6, 0x9EA7, 0x9EA8,
+ /* U+7058 */ 0x9EA9, 0x9EAA, 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0xE5B1, 0x9EAF,
+ /* U+7060 */ 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB4, 0x9EB5, 0x9EB6, 0x9EB7,
+ /* U+7068 */ 0x9EB8, 0x9EB9, 0x9EBA, 0xBBF0, 0xECE1, 0xC3F0, 0x9EBB, 0xB5C6,
+ /* U+7070 */ 0xBBD2, 0x9EBC, 0x9EBD, 0x9EBE, 0x9EBF, 0xC1E9, 0xD4EE, 0x9EC0,
+ /* U+7078 */ 0xBEC4, 0x9EC1, 0x9EC2, 0x9EC3, 0xD7C6, 0x9EC4, 0xD4D6, 0xB2D3,
+ /* U+7080 */ 0xECBE, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0xEAC1, 0x9EC9, 0x9ECA,
+ /* U+7088 */ 0x9ECB, 0xC2AF, 0xB4B6, 0x9ECC, 0x9ECD, 0x9ECE, 0xD1D7, 0x9ECF,
+ /* U+7090 */ 0x9ED0, 0x9ED1, 0xB3B4, 0x9ED2, 0xC8B2, 0xBFBB, 0xECC0, 0x9ED3,
+ /* U+7098 */ 0x9ED4, 0xD6CB, 0x9ED5, 0x9ED6, 0xECBF, 0xECC1, 0x9ED7, 0x9ED8,
+ /* U+70A0 */ 0x9ED9, 0x9EDA, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EDE, 0x9EDF, 0x9EE0,
+ /* U+70A8 */ 0x9EE1, 0x9EE2, 0x9EE3, 0xECC5, 0xBEE6, 0xCCBF, 0xC5DA, 0xBEBC,
+ /* U+70B0 */ 0x9EE4, 0xECC6, 0x9EE5, 0xB1FE, 0x9EE6, 0x9EE7, 0x9EE8, 0xECC4,
+ /* U+70B8 */ 0xD5A8, 0xB5E3, 0x9EE9, 0xECC2, 0xC1B6, 0xB3E3, 0x9EEA, 0x9EEB,
+ /* U+70C0 */ 0xECC3, 0xCBB8, 0xC0C3, 0xCCFE, 0x9EEC, 0x9EED, 0x9EEE, 0x9EEF,
+ /* U+70C8 */ 0xC1D2, 0x9EF0, 0xECC8, 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5,
+ /* U+70D0 */ 0x9EF6, 0x9EF7, 0x9EF8, 0x9EF9, 0x9EFA, 0x9EFB, 0x9EFC, 0x9EFD,
+ /* U+70D8 */ 0xBAE6, 0xC0D3, 0x9EFE, 0xD6F2, 0x9F40, 0x9F41, 0x9F42, 0xD1CC,
+ /* U+70E0 */ 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0xBFBE, 0x9F47, 0xB7B3, 0xC9D5,
+ /* U+70E8 */ 0xECC7, 0xBBE2, 0x9F48, 0xCCCC, 0xBDFD, 0xC8C8, 0x9F49, 0xCFA9,
+ /* U+70F0 */ 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F50, 0xCDE9,
+ /* U+70F8 */ 0x9F51, 0xC5EB, 0x9F52, 0x9F53, 0x9F54, 0xB7E9, 0x9F55, 0x9F56,
+ /* U+7100 */ 0x9F57, 0x9F58, 0x9F59, 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E,
+ /* U+7108 */ 0x9F5F, 0xD1C9, 0xBAB8, 0x9F60, 0x9F61, 0x9F62, 0x9F63, 0x9F64,
+ /* U+7110 */ 0xECC9, 0x9F65, 0x9F66, 0xECCA, 0x9F67, 0xBBC0, 0xECCB, 0x9F68,
+ /* U+7118 */ 0xECE2, 0xB1BA, 0xB7D9, 0x9F69, 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D,
+ /* U+7120 */ 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F72, 0x9F73, 0xBDB9, 0x9F74,
+ /* U+7128 */ 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x9F79, 0x9F7A, 0x9F7B, 0xECCC,
+ /* U+7130 */ 0xD1E6, 0xECCD, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F80, 0xC8BB, 0x9F81,
+ /* U+7138 */ 0x9F82, 0x9F83, 0x9F84, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89,
+ /* U+7140 */ 0x9F8A, 0x9F8B, 0x9F8C, 0x9F8D, 0x9F8E, 0xECD1, 0x9F8F, 0x9F90,
+ /* U+7148 */ 0x9F91, 0x9F92, 0xECD3, 0x9F93, 0xBBCD, 0x9F94, 0xBCE5, 0x9F95,
+ /* U+7150 */ 0x9F96, 0x9F97, 0x9F98, 0x9F99, 0x9F9A, 0x9F9B, 0x9F9C, 0x9F9D,
+ /* U+7158 */ 0x9F9E, 0x9F9F, 0x9FA0, 0x9FA1, 0xECCF, 0x9FA2, 0xC9B7, 0x9FA3,
+ /* U+7160 */ 0x9FA4, 0x9FA5, 0x9FA6, 0x9FA7, 0xC3BA, 0x9FA8, 0xECE3, 0xD5D5,
+ /* U+7168 */ 0xECD0, 0x9FA9, 0x9FAA, 0x9FAB, 0x9FAC, 0x9FAD, 0xD6F3, 0x9FAE,
+ /* U+7170 */ 0x9FAF, 0x9FB0, 0xECD2, 0xECCE, 0x9FB1, 0x9FB2, 0x9FB3, 0x9FB4,
+ /* U+7178 */ 0xECD4, 0x9FB5, 0xECD5, 0x9FB6, 0x9FB7, 0xC9BF, 0x9FB8, 0x9FB9,
+ /* U+7180 */ 0x9FBA, 0x9FBB, 0x9FBC, 0x9FBD, 0xCFA8, 0x9FBE, 0x9FBF, 0x9FC0,
+ /* U+7188 */ 0x9FC1, 0x9FC2, 0xD0DC, 0x9FC3, 0x9FC4, 0x9FC5, 0x9FC6, 0xD1AC,
+ /* U+7190 */ 0x9FC7, 0x9FC8, 0x9FC9, 0x9FCA, 0xC8DB, 0x9FCB, 0x9FCC, 0x9FCD,
+ /* U+7198 */ 0xECD6, 0xCEF5, 0x9FCE, 0x9FCF, 0x9FD0, 0x9FD1, 0x9FD2, 0xCAEC,
+ /* U+71A0 */ 0xECDA, 0x9FD3, 0x9FD4, 0x9FD5, 0x9FD6, 0x9FD7, 0x9FD8, 0x9FD9,
+ /* U+71A8 */ 0xECD9, 0x9FDA, 0x9FDB, 0x9FDC, 0xB0BE, 0x9FDD, 0x9FDE, 0x9FDF,
+ /* U+71B0 */ 0x9FE0, 0x9FE1, 0x9FE2, 0xECD7, 0x9FE3, 0xECD8, 0x9FE4, 0x9FE5,
+ /* U+71B8 */ 0x9FE6, 0xECE4, 0x9FE7, 0x9FE8, 0x9FE9, 0x9FEA, 0x9FEB, 0x9FEC,
+ /* U+71C0 */ 0x9FED, 0x9FEE, 0x9FEF, 0xC8BC, 0x9FF0, 0x9FF1, 0x9FF2, 0x9FF3,
+ /* U+71C8 */ 0x9FF4, 0x9FF5, 0x9FF6, 0x9FF7, 0x9FF8, 0x9FF9, 0xC1C7, 0x9FFA,
+ /* U+71D0 */ 0x9FFB, 0x9FFC, 0x9FFD, 0x9FFE, 0xECDC, 0xD1E0, 0xA040, 0xA041,
+ /* U+71D8 */ 0xA042, 0xA043, 0xA044, 0xA045, 0xA046, 0xA047, 0xA048, 0xA049,
+ /* U+71E0 */ 0xECDB, 0xA04A, 0xA04B, 0xA04C, 0xA04D, 0xD4EF, 0xA04E, 0xECDD,
+ /* U+71E8 */ 0xA04F, 0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xDBC6, 0xA055,
+ /* U+71F0 */ 0xA056, 0xA057, 0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D,
+ /* U+71F8 */ 0xA05E, 0xECDE, 0xA05F, 0xA060, 0xA061, 0xA062, 0xA063, 0xA064,
+ /* U+7200 */ 0xA065, 0xA066, 0xA067, 0xA068, 0xA069, 0xA06A, 0xB1AC, 0xA06B,
+ /* U+7208 */ 0xA06C, 0xA06D, 0xA06E, 0xA06F, 0xA070, 0xA071, 0xA072, 0xA073,
+ /* U+7210 */ 0xA074, 0xA075, 0xA076, 0xA077, 0xA078, 0xA079, 0xA07A, 0xA07B,
+ /* U+7218 */ 0xA07C, 0xA07D, 0xA07E, 0xA080, 0xA081, 0xECDF, 0xA082, 0xA083,
+ /* U+7220 */ 0xA084, 0xA085, 0xA086, 0xA087, 0xA088, 0xA089, 0xA08A, 0xA08B,
+ /* U+7228 */ 0xECE0, 0xA08C, 0xD7A6, 0xA08D, 0xC5C0, 0xA08E, 0xA08F, 0xA090,
+ /* U+7230 */ 0xEBBC, 0xB0AE, 0xA091, 0xA092, 0xA093, 0xBEF4, 0xB8B8, 0xD2AF,
+ /* U+7238 */ 0xB0D6, 0xB5F9, 0xA094, 0xD8B3, 0xA095, 0xCBAC, 0xA096, 0xE3DD,
+ /* U+7240 */ 0xA097, 0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xC6AC,
+ /* U+7248 */ 0xB0E6, 0xA09E, 0xA09F, 0xA0A0, 0xC5C6, 0xEBB9, 0xA0A1, 0xA0A2,
+ /* U+7250 */ 0xA0A3, 0xA0A4, 0xEBBA, 0xA0A5, 0xA0A6, 0xA0A7, 0xEBBB, 0xA0A8,
+ /* U+7258 */ 0xA0A9, 0xD1C0, 0xA0AA, 0xC5A3, 0xA0AB, 0xEAF2, 0xA0AC, 0xC4B2,
+ /* U+7260 */ 0xA0AD, 0xC4B5, 0xC0CE, 0xA0AE, 0xA0AF, 0xA0B0, 0xEAF3, 0xC4C1,
+ /* U+7268 */ 0xA0B1, 0xCEEF, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xEAF0, 0xEAF4,
+ /* U+7270 */ 0xA0B6, 0xA0B7, 0xC9FC, 0xA0B8, 0xA0B9, 0xC7A3, 0xA0BA, 0xA0BB,
+ /* U+7278 */ 0xA0BC, 0xCCD8, 0xCEFE, 0xA0BD, 0xA0BE, 0xA0BF, 0xEAF5, 0xEAF6,
+ /* U+7280 */ 0xCFAC, 0xC0E7, 0xA0C0, 0xA0C1, 0xEAF7, 0xA0C2, 0xA0C3, 0xA0C4,
+ /* U+7288 */ 0xA0C5, 0xA0C6, 0xB6BF, 0xEAF8, 0xA0C7, 0xEAF9, 0xA0C8, 0xEAFA,
+ /* U+7290 */ 0xA0C9, 0xA0CA, 0xEAFB, 0xA0CB, 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF,
+ /* U+7298 */ 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, 0xA0D5, 0xA0D6, 0xEAF1,
+ /* U+72A0 */ 0xA0D7, 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE,
+ /* U+72A8 */ 0xA0DF, 0xA0E0, 0xA0E1, 0xA0E2, 0xC8AE, 0xE1EB, 0xA0E3, 0xB7B8,
+ /* U+72B0 */ 0xE1EC, 0xA0E4, 0xA0E5, 0xA0E6, 0xE1ED, 0xA0E7, 0xD7B4, 0xE1EE,
+ /* U+72B8 */ 0xE1EF, 0xD3CC, 0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED,
+ /* U+72C0 */ 0xA0EE, 0xE1F1, 0xBFF1, 0xE1F0, 0xB5D2, 0xA0EF, 0xA0F0, 0xA0F1,
+ /* U+72C8 */ 0xB1B7, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xE1F3, 0xE1F2, 0xA0F6,
+ /* U+72D0 */ 0xBAFC, 0xA0F7, 0xE1F4, 0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xB9B7,
+ /* U+72D8 */ 0xA0FC, 0xBED1, 0xA0FD, 0xA0FE, 0xAA40, 0xAA41, 0xC4FC, 0xAA42,
+ /* U+72E0 */ 0xBADD, 0xBDC6, 0xAA43, 0xAA44, 0xAA45, 0xAA46, 0xAA47, 0xAA48,
+ /* U+72E8 */ 0xE1F5, 0xE1F7, 0xAA49, 0xAA4A, 0xB6C0, 0xCFC1, 0xCAA8, 0xE1F6,
+ /* U+72F0 */ 0xD5F8, 0xD3FC, 0xE1F8, 0xE1FC, 0xE1F9, 0xAA4B, 0xAA4C, 0xE1FA,
+ /* U+72F8 */ 0xC0EA, 0xAA4D, 0xE1FE, 0xE2A1, 0xC0C7, 0xAA4E, 0xAA4F, 0xAA50,
+ /* U+7300 */ 0xAA51, 0xE1FB, 0xAA52, 0xE1FD, 0xAA53, 0xAA54, 0xAA55, 0xAA56,
+ /* U+7308 */ 0xAA57, 0xAA58, 0xE2A5, 0xAA59, 0xAA5A, 0xAA5B, 0xC1D4, 0xAA5C,
+ /* U+7310 */ 0xAA5D, 0xAA5E, 0xAA5F, 0xE2A3, 0xAA60, 0xE2A8, 0xB2FE, 0xE2A2,
+ /* U+7318 */ 0xAA61, 0xAA62, 0xAA63, 0xC3CD, 0xB2C2, 0xE2A7, 0xE2A6, 0xAA64,
+ /* U+7320 */ 0xAA65, 0xE2A4, 0xE2A9, 0xAA66, 0xAA67, 0xE2AB, 0xAA68, 0xAA69,
+ /* U+7328 */ 0xAA6A, 0xD0C9, 0xD6ED, 0xC3A8, 0xE2AC, 0xAA6B, 0xCFD7, 0xAA6C,
+ /* U+7330 */ 0xAA6D, 0xE2AE, 0xAA6E, 0xAA6F, 0xBAEF, 0xAA70, 0xAA71, 0xE9E0,
+ /* U+7338 */ 0xE2AD, 0xE2AA, 0xAA72, 0xAA73, 0xAA74, 0xAA75, 0xBBAB, 0xD4B3,
+ /* U+7340 */ 0xAA76, 0xAA77, 0xAA78, 0xAA79, 0xAA7A, 0xAA7B, 0xAA7C, 0xAA7D,
+ /* U+7348 */ 0xAA7E, 0xAA80, 0xAA81, 0xAA82, 0xAA83, 0xE2B0, 0xAA84, 0xAA85,
+ /* U+7350 */ 0xE2AF, 0xAA86, 0xE9E1, 0xAA87, 0xAA88, 0xAA89, 0xAA8A, 0xE2B1,
+ /* U+7358 */ 0xAA8B, 0xAA8C, 0xAA8D, 0xAA8E, 0xAA8F, 0xAA90, 0xAA91, 0xAA92,
+ /* U+7360 */ 0xE2B2, 0xAA93, 0xAA94, 0xAA95, 0xAA96, 0xAA97, 0xAA98, 0xAA99,
+ /* U+7368 */ 0xAA9A, 0xAA9B, 0xAA9C, 0xAA9D, 0xE2B3, 0xCCA1, 0xAA9E, 0xE2B4,
+ /* U+7370 */ 0xAA9F, 0xAAA0, 0xAB40, 0xAB41, 0xAB42, 0xAB43, 0xAB44, 0xAB45,
+ /* U+7378 */ 0xAB46, 0xAB47, 0xAB48, 0xAB49, 0xAB4A, 0xAB4B, 0xE2B5, 0xAB4C,
+ /* U+7380 */ 0xAB4D, 0xAB4E, 0xAB4F, 0xAB50, 0xD0FE, 0xAB51, 0xAB52, 0xC2CA,
+ /* U+7388 */ 0xAB53, 0xD3F1, 0xAB54, 0xCDF5, 0xAB55, 0xAB56, 0xE7E0, 0xAB57,
+ /* U+7390 */ 0xAB58, 0xE7E1, 0xAB59, 0xAB5A, 0xAB5B, 0xAB5C, 0xBEC1, 0xAB5D,
+ /* U+7398 */ 0xAB5E, 0xAB5F, 0xAB60, 0xC2EA, 0xAB61, 0xAB62, 0xAB63, 0xE7E4,
+ /* U+73A0 */ 0xAB64, 0xAB65, 0xE7E3, 0xAB66, 0xAB67, 0xAB68, 0xAB69, 0xAB6A,
+ /* U+73A8 */ 0xAB6B, 0xCDE6, 0xAB6C, 0xC3B5, 0xAB6D, 0xAB6E, 0xE7E2, 0xBBB7,
+ /* U+73B0 */ 0xCFD6, 0xAB6F, 0xC1E1, 0xE7E9, 0xAB70, 0xAB71, 0xAB72, 0xE7E8,
+ /* U+73B8 */ 0xAB73, 0xAB74, 0xE7F4, 0xB2A3, 0xAB75, 0xAB76, 0xAB77, 0xAB78,
+ /* U+73C0 */ 0xE7EA, 0xAB79, 0xE7E6, 0xAB7A, 0xAB7B, 0xAB7C, 0xAB7D, 0xAB7E,
+ /* U+73C8 */ 0xE7EC, 0xE7EB, 0xC9BA, 0xAB80, 0xAB81, 0xD5E4, 0xAB82, 0xE7E5,
+ /* U+73D0 */ 0xB7A9, 0xE7E7, 0xAB83, 0xAB84, 0xAB85, 0xAB86, 0xAB87, 0xAB88,
+ /* U+73D8 */ 0xAB89, 0xE7EE, 0xAB8A, 0xAB8B, 0xAB8C, 0xAB8D, 0xE7F3, 0xAB8E,
+ /* U+73E0 */ 0xD6E9, 0xAB8F, 0xAB90, 0xAB91, 0xAB92, 0xE7ED, 0xAB93, 0xE7F2,
+ /* U+73E8 */ 0xAB94, 0xE7F1, 0xAB95, 0xAB96, 0xAB97, 0xB0E0, 0xAB98, 0xAB99,
+ /* U+73F0 */ 0xAB9A, 0xAB9B, 0xE7F5, 0xAB9C, 0xAB9D, 0xAB9E, 0xAB9F, 0xABA0,
+ /* U+73F8 */ 0xAC40, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47,
+ /* U+7400 */ 0xAC48, 0xAC49, 0xAC4A, 0xC7F2, 0xAC4B, 0xC0C5, 0xC0ED, 0xAC4C,
+ /* U+7408 */ 0xAC4D, 0xC1F0, 0xE7F0, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xE7F6,
+ /* U+7410 */ 0xCBF6, 0xAC52, 0xAC53, 0xAC54, 0xAC55, 0xAC56, 0xAC57, 0xAC58,
+ /* U+7418 */ 0xAC59, 0xAC5A, 0xE8A2, 0xE8A1, 0xAC5B, 0xAC5C, 0xAC5D, 0xAC5E,
+ /* U+7420 */ 0xAC5F, 0xAC60, 0xD7C1, 0xAC61, 0xAC62, 0xE7FA, 0xE7F9, 0xAC63,
+ /* U+7428 */ 0xE7FB, 0xAC64, 0xE7F7, 0xAC65, 0xE7FE, 0xAC66, 0xE7FD, 0xAC67,
+ /* U+7430 */ 0xE7FC, 0xAC68, 0xAC69, 0xC1D5, 0xC7D9, 0xC5FD, 0xC5C3, 0xAC6A,
+ /* U+7438 */ 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, 0xC7ED, 0xAC6F, 0xAC70, 0xAC71,
+ /* U+7440 */ 0xAC72, 0xE8A3, 0xAC73, 0xAC74, 0xAC75, 0xAC76, 0xAC77, 0xAC78,
+ /* U+7448 */ 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, 0xAC80, 0xAC81,
+ /* U+7450 */ 0xAC82, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xE8A6, 0xAC87, 0xE8A5,
+ /* U+7458 */ 0xAC88, 0xE8A7, 0xBAF7, 0xE7F8, 0xE8A4, 0xAC89, 0xC8F0, 0xC9AA,
+ /* U+7460 */ 0xAC8A, 0xAC8B, 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, 0xAC91,
+ /* U+7468 */ 0xAC92, 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xE8A9, 0xAC97, 0xAC98,
+ /* U+7470 */ 0xB9E5, 0xAC99, 0xAC9A, 0xAC9B, 0xAC9C, 0xAC9D, 0xD1FE, 0xE8A8,
+ /* U+7478 */ 0xAC9E, 0xAC9F, 0xACA0, 0xAD40, 0xAD41, 0xAD42, 0xE8AA, 0xAD43,
+ /* U+7480 */ 0xE8AD, 0xE8AE, 0xAD44, 0xC1A7, 0xAD45, 0xAD46, 0xAD47, 0xE8AF,
+ /* U+7488 */ 0xAD48, 0xAD49, 0xAD4A, 0xE8B0, 0xAD4B, 0xAD4C, 0xE8AC, 0xAD4D,
+ /* U+7490 */ 0xE8B4, 0xAD4E, 0xAD4F, 0xAD50, 0xAD51, 0xAD52, 0xAD53, 0xAD54,
+ /* U+7498 */ 0xAD55, 0xAD56, 0xAD57, 0xAD58, 0xE8AB, 0xAD59, 0xE8B1, 0xAD5A,
+ /* U+74A0 */ 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60, 0xAD61, 0xE8B5,
+ /* U+74A8 */ 0xE8B2, 0xE8B3, 0xAD62, 0xAD63, 0xAD64, 0xAD65, 0xAD66, 0xAD67,
+ /* U+74B0 */ 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6C, 0xAD6D, 0xAD6E, 0xAD6F,
+ /* U+74B8 */ 0xAD70, 0xAD71, 0xE8B7, 0xAD72, 0xAD73, 0xAD74, 0xAD75, 0xAD76,
+ /* U+74C0 */ 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7E,
+ /* U+74C8 */ 0xAD80, 0xAD81, 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87,
+ /* U+74D0 */ 0xAD88, 0xAD89, 0xE8B6, 0xAD8A, 0xAD8B, 0xAD8C, 0xAD8D, 0xAD8E,
+ /* U+74D8 */ 0xAD8F, 0xAD90, 0xAD91, 0xAD92, 0xB9CF, 0xAD93, 0xF0AC, 0xAD94,
+ /* U+74E0 */ 0xF0AD, 0xAD95, 0xC6B0, 0xB0EA, 0xC8BF, 0xAD96, 0xCDDF, 0xAD97,
+ /* U+74E8 */ 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D, 0xCECD, 0xEAB1,
+ /* U+74F0 */ 0xAD9E, 0xAD9F, 0xADA0, 0xAE40, 0xEAB2, 0xAE41, 0xC6BF, 0xB4C9,
+ /* U+74F8 */ 0xAE42, 0xAE43, 0xAE44, 0xAE45, 0xAE46, 0xAE47, 0xAE48, 0xEAB3,
+ /* U+7500 */ 0xAE49, 0xAE4A, 0xAE4B, 0xAE4C, 0xD5E7, 0xAE4D, 0xAE4E, 0xAE4F,
+ /* U+7508 */ 0xAE50, 0xAE51, 0xAE52, 0xAE53, 0xAE54, 0xDDF9, 0xAE55, 0xEAB4,
+ /* U+7510 */ 0xAE56, 0xEAB5, 0xAE57, 0xEAB6, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,
+ /* U+7518 */ 0xB8CA, 0xDFB0, 0xC9F5, 0xAE5C, 0xCCF0, 0xAE5D, 0xAE5E, 0xC9FA,
+ /* U+7520 */ 0xAE5F, 0xAE60, 0xAE61, 0xAE62, 0xAE63, 0xC9FB, 0xAE64, 0xAE65,
+ /* U+7528 */ 0xD3C3, 0xCBA6, 0xAE66, 0xB8A6, 0xF0AE, 0xB1C2, 0xAE67, 0xE5B8,
+ /* U+7530 */ 0xCCEF, 0xD3C9, 0xBCD7, 0xC9EA, 0xAE68, 0xB5E7, 0xAE69, 0xC4D0,
+ /* U+7538 */ 0xB5E9, 0xAE6A, 0xEEAE, 0xBBAD, 0xAE6B, 0xAE6C, 0xE7DE, 0xAE6D,
+ /* U+7540 */ 0xEEAF, 0xAE6E, 0xAE6F, 0xAE70, 0xAE71, 0xB3A9, 0xAE72, 0xAE73,
+ /* U+7548 */ 0xEEB2, 0xAE74, 0xAE75, 0xEEB1, 0xBDE7, 0xAE76, 0xEEB0, 0xCEB7,
+ /* U+7550 */ 0xAE77, 0xAE78, 0xAE79, 0xAE7A, 0xC5CF, 0xAE7B, 0xAE7C, 0xAE7D,
+ /* U+7558 */ 0xAE7E, 0xC1F4, 0xDBCE, 0xEEB3, 0xD0F3, 0xAE80, 0xAE81, 0xAE82,
+ /* U+7560 */ 0xAE83, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xC2D4, 0xC6E8, 0xAE88,
+ /* U+7568 */ 0xAE89, 0xAE8A, 0xB7AC, 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F,
+ /* U+7570 */ 0xAE90, 0xAE91, 0xEEB4, 0xAE92, 0xB3EB, 0xAE93, 0xAE94, 0xAE95,
+ /* U+7578 */ 0xBBFB, 0xEEB5, 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xE7DC,
+ /* U+7580 */ 0xAE9B, 0xAE9C, 0xAE9D, 0xEEB6, 0xAE9E, 0xAE9F, 0xBDAE, 0xAEA0,
+ /* U+7588 */ 0xAF40, 0xAF41, 0xAF42, 0xF1E2, 0xAF43, 0xAF44, 0xAF45, 0xCAE8,
+ /* U+7590 */ 0xAF46, 0xD2C9, 0xF0DA, 0xAF47, 0xF0DB, 0xAF48, 0xF0DC, 0xC1C6,
+ /* U+7598 */ 0xAF49, 0xB8ED, 0xBECE, 0xAF4A, 0xAF4B, 0xF0DE, 0xAF4C, 0xC5B1,
+ /* U+75A0 */ 0xF0DD, 0xD1F1, 0xAF4D, 0xF0E0, 0xB0CC, 0xBDEA, 0xAF4E, 0xAF4F,
+ /* U+75A8 */ 0xAF50, 0xAF51, 0xAF52, 0xD2DF, 0xF0DF, 0xAF53, 0xB4AF, 0xB7E8,
+ /* U+75B0 */ 0xF0E6, 0xF0E5, 0xC6A3, 0xF0E1, 0xF0E2, 0xB4C3, 0xAF54, 0xAF55,
+ /* U+75B8 */ 0xF0E3, 0xD5EE, 0xAF56, 0xAF57, 0xCCDB, 0xBED2, 0xBCB2, 0xAF58,
+ /* U+75C0 */ 0xAF59, 0xAF5A, 0xF0E8, 0xF0E7, 0xF0E4, 0xB2A1, 0xAF5B, 0xD6A2,
+ /* U+75C8 */ 0xD3B8, 0xBEB7, 0xC8AC, 0xAF5C, 0xAF5D, 0xF0EA, 0xAF5E, 0xAF5F,
+ /* U+75D0 */ 0xAF60, 0xAF61, 0xD1F7, 0xAF62, 0xD6CC, 0xBADB, 0xF0E9, 0xAF63,
+ /* U+75D8 */ 0xB6BB, 0xAF64, 0xAF65, 0xCDB4, 0xAF66, 0xAF67, 0xC6A6, 0xAF68,
+ /* U+75E0 */ 0xAF69, 0xAF6A, 0xC1A1, 0xF0EB, 0xF0EE, 0xAF6B, 0xF0ED, 0xF0F0,
+ /* U+75E8 */ 0xF0EC, 0xAF6C, 0xBBBE, 0xF0EF, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70,
+ /* U+75F0 */ 0xCCB5, 0xF0F2, 0xAF71, 0xAF72, 0xB3D5, 0xAF73, 0xAF74, 0xAF75,
+ /* U+75F8 */ 0xAF76, 0xB1D4, 0xAF77, 0xAF78, 0xF0F3, 0xAF79, 0xAF7A, 0xF0F4,
+ /* U+7600 */ 0xF0F6, 0xB4E1, 0xAF7B, 0xF0F1, 0xAF7C, 0xF0F7, 0xAF7D, 0xAF7E,
+ /* U+7608 */ 0xAF80, 0xAF81, 0xF0FA, 0xAF82, 0xF0F8, 0xAF83, 0xAF84, 0xAF85,
+ /* U+7610 */ 0xF0F5, 0xAF86, 0xAF87, 0xAF88, 0xAF89, 0xF0FD, 0xAF8A, 0xF0F9,
+ /* U+7618 */ 0xF0FC, 0xF0FE, 0xAF8B, 0xF1A1, 0xAF8C, 0xAF8D, 0xAF8E, 0xCEC1,
+ /* U+7620 */ 0xF1A4, 0xAF8F, 0xF1A3, 0xAF90, 0xC1F6, 0xF0FB, 0xCADD, 0xAF91,
+ /* U+7628 */ 0xAF92, 0xB4F1, 0xB1F1, 0xCCB1, 0xAF93, 0xF1A6, 0xAF94, 0xAF95,
+ /* U+7630 */ 0xF1A7, 0xAF96, 0xAF97, 0xF1AC, 0xD5CE, 0xF1A9, 0xAF98, 0xAF99,
+ /* U+7638 */ 0xC8B3, 0xAF9A, 0xAF9B, 0xAF9C, 0xF1A2, 0xAF9D, 0xF1AB, 0xF1A8,
+ /* U+7640 */ 0xF1A5, 0xAF9E, 0xAF9F, 0xF1AA, 0xAFA0, 0xB040, 0xB041, 0xB042,
+ /* U+7648 */ 0xB043, 0xB044, 0xB045, 0xB046, 0xB0A9, 0xF1AD, 0xB047, 0xB048,
+ /* U+7650 */ 0xB049, 0xB04A, 0xB04B, 0xB04C, 0xF1AF, 0xB04D, 0xF1B1, 0xB04E,
+ /* U+7658 */ 0xB04F, 0xB050, 0xB051, 0xB052, 0xF1B0, 0xB053, 0xF1AE, 0xB054,
+ /* U+7660 */ 0xB055, 0xB056, 0xB057, 0xD1A2, 0xB058, 0xB059, 0xB05A, 0xB05B,
+ /* U+7668 */ 0xB05C, 0xB05D, 0xB05E, 0xF1B2, 0xB05F, 0xB060, 0xB061, 0xF1B3,
+ /* U+7670 */ 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, 0xB067, 0xB068, 0xB069,
+ /* U+7678 */ 0xB9EF, 0xB06A, 0xB06B, 0xB5C7, 0xB06C, 0xB0D7, 0xB0D9, 0xB06D,
+ /* U+7680 */ 0xB06E, 0xB06F, 0xD4ED, 0xB070, 0xB5C4, 0xB071, 0xBDD4, 0xBBCA,
+ /* U+7688 */ 0xF0A7, 0xB072, 0xB073, 0xB8DE, 0xB074, 0xB075, 0xF0A8, 0xB076,
+ /* U+7690 */ 0xB077, 0xB0A8, 0xB078, 0xF0A9, 0xB079, 0xB07A, 0xCDEE, 0xB07B,
+ /* U+7698 */ 0xB07C, 0xF0AA, 0xB07D, 0xB07E, 0xB080, 0xB081, 0xB082, 0xB083,
+ /* U+76A0 */ 0xB084, 0xB085, 0xB086, 0xB087, 0xF0AB, 0xB088, 0xB089, 0xB08A,
+ /* U+76A8 */ 0xB08B, 0xB08C, 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xC6A4, 0xB091,
+ /* U+76B0 */ 0xB092, 0xD6E5, 0xF1E4, 0xB093, 0xF1E5, 0xB094, 0xB095, 0xB096,
+ /* U+76B8 */ 0xB097, 0xB098, 0xB099, 0xB09A, 0xB09B, 0xB09C, 0xB09D, 0xC3F3,
+ /* U+76C0 */ 0xB09E, 0xB09F, 0xD3DB, 0xB0A0, 0xB140, 0xD6D1, 0xC5E8, 0xB141,
+ /* U+76C8 */ 0xD3AF, 0xB142, 0xD2E6, 0xB143, 0xB144, 0xEEC1, 0xB0BB, 0xD5B5,
+ /* U+76D0 */ 0xD1CE, 0xBCE0, 0xBAD0, 0xB145, 0xBFF8, 0xB146, 0xB8C7, 0xB5C1,
+ /* U+76D8 */ 0xC5CC, 0xB147, 0xB148, 0xCAA2, 0xB149, 0xB14A, 0xB14B, 0xC3CB,
+ /* U+76E0 */ 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB150, 0xEEC2, 0xB151, 0xB152,
+ /* U+76E8 */ 0xB153, 0xB154, 0xB155, 0xB156, 0xB157, 0xB158, 0xC4BF, 0xB6A2,
+ /* U+76F0 */ 0xB159, 0xEDEC, 0xC3A4, 0xB15A, 0xD6B1, 0xB15B, 0xB15C, 0xB15D,
+ /* U+76F8 */ 0xCFE0, 0xEDEF, 0xB15E, 0xB15F, 0xC5CE, 0xB160, 0xB6DC, 0xB161,
+ /* U+7700 */ 0xB162, 0xCAA1, 0xB163, 0xB164, 0xEDED, 0xB165, 0xB166, 0xEDF0,
+ /* U+7708 */ 0xEDF1, 0xC3BC, 0xB167, 0xBFB4, 0xB168, 0xEDEE, 0xB169, 0xB16A,
+ /* U+7710 */ 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170, 0xB171, 0xB172,
+ /* U+7718 */ 0xB173, 0xEDF4, 0xEDF2, 0xB174, 0xB175, 0xB176, 0xB177, 0xD5E6,
+ /* U+7720 */ 0xC3DF, 0xB178, 0xEDF3, 0xB179, 0xB17A, 0xB17B, 0xEDF6, 0xB17C,
+ /* U+7728 */ 0xD5A3, 0xD1A3, 0xB17D, 0xB17E, 0xB180, 0xEDF5, 0xB181, 0xC3D0,
+ /* U+7730 */ 0xB182, 0xB183, 0xB184, 0xB185, 0xB186, 0xEDF7, 0xBFF4, 0xBEEC,
+ /* U+7738 */ 0xEDF8, 0xB187, 0xCCF7, 0xB188, 0xD1DB, 0xB189, 0xB18A, 0xB18B,
+ /* U+7740 */ 0xD7C5, 0xD5F6, 0xB18C, 0xEDFC, 0xB18D, 0xB18E, 0xB18F, 0xEDFB,
+ /* U+7748 */ 0xB190, 0xB191, 0xB192, 0xB193, 0xB194, 0xB195, 0xB196, 0xB197,
+ /* U+7750 */ 0xEDF9, 0xEDFA, 0xB198, 0xB199, 0xB19A, 0xB19B, 0xB19C, 0xB19D,
+ /* U+7758 */ 0xB19E, 0xB19F, 0xEDFD, 0xBEA6, 0xB1A0, 0xB240, 0xB241, 0xB242,
+ /* U+7760 */ 0xB243, 0xCBAF, 0xEEA1, 0xB6BD, 0xB244, 0xEEA2, 0xC4C0, 0xB245,
+ /* U+7768 */ 0xEDFE, 0xB246, 0xB247, 0xBDDE, 0xB2C7, 0xB248, 0xB249, 0xB24A,
+ /* U+7770 */ 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB252,
+ /* U+7778 */ 0xB253, 0xB6C3, 0xB254, 0xB255, 0xB256, 0xEEA5, 0xD8BA, 0xEEA3,
+ /* U+7780 */ 0xEEA6, 0xB257, 0xB258, 0xB259, 0xC3E9, 0xB3F2, 0xB25A, 0xB25B,
+ /* U+7788 */ 0xB25C, 0xB25D, 0xB25E, 0xB25F, 0xEEA7, 0xEEA4, 0xCFB9, 0xB260,
+ /* U+7790 */ 0xB261, 0xEEA8, 0xC2F7, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266,
+ /* U+7798 */ 0xB267, 0xB268, 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xEEA9,
+ /* U+77A0 */ 0xEEAA, 0xB26E, 0xDEAB, 0xB26F, 0xB270, 0xC6B3, 0xB271, 0xC7C6,
+ /* U+77A8 */ 0xB272, 0xD6F5, 0xB5C9, 0xB273, 0xCBB2, 0xB274, 0xB275, 0xB276,
+ /* U+77B0 */ 0xEEAB, 0xB277, 0xB278, 0xCDAB, 0xB279, 0xEEAC, 0xB27A, 0xB27B,
+ /* U+77B8 */ 0xB27C, 0xB27D, 0xB27E, 0xD5B0, 0xB280, 0xEEAD, 0xB281, 0xF6C4,
+ /* U+77C0 */ 0xB282, 0xB283, 0xB284, 0xB285, 0xB286, 0xB287, 0xB288, 0xB289,
+ /* U+77C8 */ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xDBC7, 0xB28F, 0xB290,
+ /* U+77D0 */ 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, 0xB296, 0xB297, 0xB4A3,
+ /* U+77D8 */ 0xB298, 0xB299, 0xB29A, 0xC3AC, 0xF1E6, 0xB29B, 0xB29C, 0xB29D,
+ /* U+77E0 */ 0xB29E, 0xB29F, 0xCAB8, 0xD2D3, 0xB2A0, 0xD6AA, 0xB340, 0xEFF2,
+ /* U+77E8 */ 0xB341, 0xBED8, 0xB342, 0xBDC3, 0xEFF3, 0xB6CC, 0xB0AB, 0xB343,
+ /* U+77F0 */ 0xB344, 0xB345, 0xB346, 0xCAAF, 0xB347, 0xB348, 0xEDB6, 0xB349,
+ /* U+77F8 */ 0xEDB7, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xCEF9, 0xB7AF, 0xBFF3,
+ /* U+7800 */ 0xEDB8, 0xC2EB, 0xC9B0, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352,
+ /* U+7808 */ 0xB353, 0xEDB9, 0xB354, 0xB355, 0xC6F6, 0xBFB3, 0xB356, 0xB357,
+ /* U+7810 */ 0xB358, 0xEDBC, 0xC5F8, 0xB359, 0xD1D0, 0xB35A, 0xD7A9, 0xEDBA,
+ /* U+7818 */ 0xEDBB, 0xB35B, 0xD1E2, 0xB35C, 0xEDBF, 0xEDC0, 0xB35D, 0xEDC4,
+ /* U+7820 */ 0xB35E, 0xB35F, 0xB360, 0xEDC8, 0xB361, 0xEDC6, 0xEDCE, 0xD5E8,
+ /* U+7828 */ 0xB362, 0xEDC9, 0xB363, 0xB364, 0xEDC7, 0xEDBE, 0xB365, 0xB366,
+ /* U+7830 */ 0xC5E9, 0xB367, 0xB368, 0xB369, 0xC6C6, 0xB36A, 0xB36B, 0xC9E9,
+ /* U+7838 */ 0xD4D2, 0xEDC1, 0xEDC2, 0xEDC3, 0xEDC5, 0xB36C, 0xC0F9, 0xB36D,
+ /* U+7840 */ 0xB4A1, 0xB36E, 0xB36F, 0xB370, 0xB371, 0xB9E8, 0xB372, 0xEDD0,
+ /* U+7848 */ 0xB373, 0xB374, 0xB375, 0xB376, 0xEDD1, 0xB377, 0xEDCA, 0xB378,
+ /* U+7850 */ 0xEDCF, 0xB379, 0xCEF8, 0xB37A, 0xB37B, 0xCBB6, 0xEDCC, 0xEDCD,
+ /* U+7858 */ 0xB37C, 0xB37D, 0xB37E, 0xB380, 0xB381, 0xCFF5, 0xB382, 0xB383,
+ /* U+7860 */ 0xB384, 0xB385, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B,
+ /* U+7868 */ 0xB38C, 0xB38D, 0xEDD2, 0xC1F2, 0xD3B2, 0xEDCB, 0xC8B7, 0xB38E,
+ /* U+7870 */ 0xB38F, 0xB390, 0xB391, 0xB392, 0xB393, 0xB394, 0xB395, 0xBCEF,
+ /* U+7878 */ 0xB396, 0xB397, 0xB398, 0xB399, 0xC5F0, 0xB39A, 0xB39B, 0xB39C,
+ /* U+7880 */ 0xB39D, 0xB39E, 0xB39F, 0xB3A0, 0xB440, 0xB441, 0xB442, 0xEDD6,
+ /* U+7888 */ 0xB443, 0xB5EF, 0xB444, 0xB445, 0xC2B5, 0xB0AD, 0xCBE9, 0xB446,
+ /* U+7890 */ 0xB447, 0xB1AE, 0xB448, 0xEDD4, 0xB449, 0xB44A, 0xB44B, 0xCDEB,
+ /* U+7898 */ 0xB5E2, 0xB44C, 0xEDD5, 0xEDD3, 0xEDD7, 0xB44D, 0xB44E, 0xB5FA,
+ /* U+78A0 */ 0xB44F, 0xEDD8, 0xB450, 0xEDD9, 0xB451, 0xEDDC, 0xB452, 0xB1CC,
+ /* U+78A8 */ 0xB453, 0xB454, 0xB455, 0xB456, 0xB457, 0xB458, 0xB459, 0xB45A,
+ /* U+78B0 */ 0xC5F6, 0xBCEE, 0xEDDA, 0xCCBC, 0xB2EA, 0xB45B, 0xB45C, 0xB45D,
+ /* U+78B8 */ 0xB45E, 0xEDDB, 0xB45F, 0xB460, 0xB461, 0xB462, 0xC4EB, 0xB463,
+ /* U+78C0 */ 0xB464, 0xB4C5, 0xB465, 0xB466, 0xB467, 0xB0F5, 0xB468, 0xB469,
+ /* U+78C8 */ 0xB46A, 0xEDDF, 0xC0DA, 0xB4E8, 0xB46B, 0xB46C, 0xB46D, 0xB46E,
+ /* U+78D0 */ 0xC5CD, 0xB46F, 0xB470, 0xB471, 0xEDDD, 0xBFC4, 0xB472, 0xB473,
+ /* U+78D8 */ 0xB474, 0xEDDE, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A,
+ /* U+78E0 */ 0xB47B, 0xB47C, 0xB47D, 0xB47E, 0xB480, 0xB481, 0xB482, 0xB483,
+ /* U+78E8 */ 0xC4A5, 0xB484, 0xB485, 0xB486, 0xEDE0, 0xB487, 0xB488, 0xB489,
+ /* U+78F0 */ 0xB48A, 0xB48B, 0xEDE1, 0xB48C, 0xEDE3, 0xB48D, 0xB48E, 0xC1D7,
+ /* U+78F8 */ 0xB48F, 0xB490, 0xBBC7, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495,
+ /* U+7900 */ 0xB496, 0xBDB8, 0xB497, 0xB498, 0xB499, 0xEDE2, 0xB49A, 0xB49B,
+ /* U+7908 */ 0xB49C, 0xB49D, 0xB49E, 0xB49F, 0xB4A0, 0xB540, 0xB541, 0xB542,
+ /* U+7910 */ 0xB543, 0xB544, 0xB545, 0xEDE4, 0xB546, 0xB547, 0xB548, 0xB549,
+ /* U+7918 */ 0xB54A, 0xB54B, 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xEDE6, 0xB550,
+ /* U+7920 */ 0xB551, 0xB552, 0xB553, 0xB554, 0xEDE5, 0xB555, 0xB556, 0xB557,
+ /* U+7928 */ 0xB558, 0xB559, 0xB55A, 0xB55B, 0xB55C, 0xB55D, 0xB55E, 0xB55F,
+ /* U+7930 */ 0xB560, 0xB561, 0xB562, 0xB563, 0xEDE7, 0xB564, 0xB565, 0xB566,
+ /* U+7938 */ 0xB567, 0xB568, 0xCABE, 0xECEA, 0xC0F1, 0xB569, 0xC9E7, 0xB56A,
+ /* U+7940 */ 0xECEB, 0xC6EE, 0xB56B, 0xB56C, 0xB56D, 0xB56E, 0xECEC, 0xB56F,
+ /* U+7948 */ 0xC6ED, 0xECED, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,
+ /* U+7950 */ 0xB576, 0xB577, 0xB578, 0xECF0, 0xB579, 0xB57A, 0xD7E6, 0xECF3,
+ /* U+7958 */ 0xB57B, 0xB57C, 0xECF1, 0xECEE, 0xECEF, 0xD7A3, 0xC9F1, 0xCBEE,
+ /* U+7960 */ 0xECF4, 0xB57D, 0xECF2, 0xB57E, 0xB580, 0xCFE9, 0xB581, 0xECF6,
+ /* U+7968 */ 0xC6B1, 0xB582, 0xB583, 0xB584, 0xB585, 0xBCC0, 0xB586, 0xECF5,
+ /* U+7970 */ 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB5BB,
+ /* U+7978 */ 0xBBF6, 0xB58E, 0xECF7, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593,
+ /* U+7980 */ 0xD9F7, 0xBDFB, 0xB594, 0xB595, 0xC2BB, 0xECF8, 0xB596, 0xB597,
+ /* U+7988 */ 0xB598, 0xB599, 0xECF9, 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB8A3,
+ /* U+7990 */ 0xB59E, 0xB59F, 0xB5A0, 0xB640, 0xB641, 0xB642, 0xB643, 0xB644,
+ /* U+7998 */ 0xB645, 0xB646, 0xECFA, 0xB647, 0xB648, 0xB649, 0xB64A, 0xB64B,
+ /* U+79A0 */ 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xECFB,
+ /* U+79A8 */ 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A,
+ /* U+79B0 */ 0xB65B, 0xB65C, 0xB65D, 0xECFC, 0xB65E, 0xB65F, 0xB660, 0xB661,
+ /* U+79B8 */ 0xB662, 0xD3ED, 0xD8AE, 0xC0EB, 0xB663, 0xC7DD, 0xBACC, 0xB664,
+ /* U+79C0 */ 0xD0E3, 0xCBBD, 0xB665, 0xCDBA, 0xB666, 0xB667, 0xB8D1, 0xB668,
+ /* U+79C8 */ 0xB669, 0xB1FC, 0xB66A, 0xC7EF, 0xB66B, 0xD6D6, 0xB66C, 0xB66D,
+ /* U+79D0 */ 0xB66E, 0xBFC6, 0xC3EB, 0xB66F, 0xB670, 0xEFF5, 0xB671, 0xB672,
+ /* U+79D8 */ 0xC3D8, 0xB673, 0xB674, 0xB675, 0xB676, 0xB677, 0xB678, 0xD7E2,
+ /* U+79E0 */ 0xB679, 0xB67A, 0xB67B, 0xEFF7, 0xB3D3, 0xB67C, 0xC7D8, 0xD1ED,
+ /* U+79E8 */ 0xB67D, 0xD6C8, 0xB67E, 0xEFF8, 0xB680, 0xEFF6, 0xB681, 0xBBFD,
+ /* U+79F0 */ 0xB3C6, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688,
+ /* U+79F8 */ 0xBDD5, 0xB689, 0xB68A, 0xD2C6, 0xB68B, 0xBBE0, 0xB68C, 0xB68D,
+ /* U+7A00 */ 0xCFA1, 0xB68E, 0xEFFC, 0xEFFB, 0xB68F, 0xB690, 0xEFF9, 0xB691,
+ /* U+7A08 */ 0xB692, 0xB693, 0xB694, 0xB3CC, 0xB695, 0xC9D4, 0xCBB0, 0xB696,
+ /* U+7A10 */ 0xB697, 0xB698, 0xB699, 0xB69A, 0xEFFE, 0xB69B, 0xB69C, 0xB0DE,
+ /* U+7A18 */ 0xB69D, 0xB69E, 0xD6C9, 0xB69F, 0xB6A0, 0xB740, 0xEFFD, 0xB741,
+ /* U+7A20 */ 0xB3ED, 0xB742, 0xB743, 0xF6D5, 0xB744, 0xB745, 0xB746, 0xB747,
+ /* U+7A28 */ 0xB748, 0xB749, 0xB74A, 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xB74F,
+ /* U+7A30 */ 0xB750, 0xB751, 0xB752, 0xCEC8, 0xB753, 0xB754, 0xB755, 0xF0A2,
+ /* U+7A38 */ 0xB756, 0xF0A1, 0xB757, 0xB5BE, 0xBCDA, 0xBBFC, 0xB758, 0xB8E5,
+ /* U+7A40 */ 0xB759, 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xC4C2, 0xB75F,
+ /* U+7A48 */ 0xB760, 0xB761, 0xB762, 0xB763, 0xB764, 0xB765, 0xB766, 0xB767,
+ /* U+7A50 */ 0xB768, 0xF0A3, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xCBEB,
+ /* U+7A58 */ 0xB76E, 0xB76F, 0xB770, 0xB771, 0xB772, 0xB773, 0xB774, 0xB775,
+ /* U+7A60 */ 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77C, 0xB77D,
+ /* U+7A68 */ 0xB77E, 0xB780, 0xB781, 0xB782, 0xB783, 0xB784, 0xB785, 0xB786,
+ /* U+7A70 */ 0xF0A6, 0xB787, 0xB788, 0xB789, 0xD1A8, 0xB78A, 0xBEBF, 0xC7EE,
+ /* U+7A78 */ 0xF1B6, 0xF1B7, 0xBFD5, 0xB78B, 0xB78C, 0xB78D, 0xB78E, 0xB4A9,
+ /* U+7A80 */ 0xF1B8, 0xCDBB, 0xB78F, 0xC7D4, 0xD5AD, 0xB790, 0xF1B9, 0xB791,
+ /* U+7A88 */ 0xF1BA, 0xB792, 0xB793, 0xB794, 0xB795, 0xC7CF, 0xB796, 0xB797,
+ /* U+7A90 */ 0xB798, 0xD2A4, 0xD6CF, 0xB799, 0xB79A, 0xF1BB, 0xBDD1, 0xB4B0,
+ /* U+7A98 */ 0xBEBD, 0xB79B, 0xB79C, 0xB79D, 0xB4DC, 0xCED1, 0xB79E, 0xBFDF,
+ /* U+7AA0 */ 0xF1BD, 0xB79F, 0xB7A0, 0xB840, 0xB841, 0xBFFA, 0xF1BC, 0xB842,
+ /* U+7AA8 */ 0xF1BF, 0xB843, 0xB844, 0xB845, 0xF1BE, 0xF1C0, 0xB846, 0xB847,
+ /* U+7AB0 */ 0xB848, 0xB849, 0xB84A, 0xF1C1, 0xB84B, 0xB84C, 0xB84D, 0xB84E,
+ /* U+7AB8 */ 0xB84F, 0xB850, 0xB851, 0xB852, 0xB853, 0xB854, 0xB855, 0xC1FE,
+ /* U+7AC0 */ 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, 0xB85C, 0xB85D,
+ /* U+7AC8 */ 0xB85E, 0xB85F, 0xB860, 0xC1A2, 0xB861, 0xB862, 0xB863, 0xB864,
+ /* U+7AD0 */ 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xCAFA, 0xB86B,
+ /* U+7AD8 */ 0xB86C, 0xD5BE, 0xB86D, 0xB86E, 0xB86F, 0xB870, 0xBEBA, 0xBEB9,
+ /* U+7AE0 */ 0xD5C2, 0xB871, 0xB872, 0xBFA2, 0xB873, 0xCDAF, 0xF1B5, 0xB874,
+ /* U+7AE8 */ 0xB875, 0xB876, 0xB877, 0xB878, 0xB879, 0xBDDF, 0xB87A, 0xB6CB,
+ /* U+7AF0 */ 0xB87B, 0xB87C, 0xB87D, 0xB87E, 0xB880, 0xB881, 0xB882, 0xB883,
+ /* U+7AF8 */ 0xB884, 0xD6F1, 0xF3C3, 0xB885, 0xB886, 0xF3C4, 0xB887, 0xB8CD,
+ /* U+7B00 */ 0xB888, 0xB889, 0xB88A, 0xF3C6, 0xF3C7, 0xB88B, 0xB0CA, 0xB88C,
+ /* U+7B08 */ 0xF3C5, 0xB88D, 0xF3C9, 0xCBF1, 0xB88E, 0xB88F, 0xB890, 0xF3CB,
+ /* U+7B10 */ 0xB891, 0xD0A6, 0xB892, 0xB893, 0xB1CA, 0xF3C8, 0xB894, 0xB895,
+ /* U+7B18 */ 0xB896, 0xF3CF, 0xB897, 0xB5D1, 0xB898, 0xB899, 0xF3D7, 0xB89A,
+ /* U+7B20 */ 0xF3D2, 0xB89B, 0xB89C, 0xB89D, 0xF3D4, 0xF3D3, 0xB7FB, 0xB89E,
+ /* U+7B28 */ 0xB1BF, 0xB89F, 0xF3CE, 0xF3CA, 0xB5DA, 0xB8A0, 0xF3D0, 0xB940,
+ /* U+7B30 */ 0xB941, 0xF3D1, 0xB942, 0xF3D5, 0xB943, 0xB944, 0xB945, 0xB946,
+ /* U+7B38 */ 0xF3CD, 0xB947, 0xBCE3, 0xB948, 0xC1FD, 0xB949, 0xF3D6, 0xB94A,
+ /* U+7B40 */ 0xB94B, 0xB94C, 0xB94D, 0xB94E, 0xB94F, 0xF3DA, 0xB950, 0xF3CC,
+ /* U+7B48 */ 0xB951, 0xB5C8, 0xB952, 0xBDEE, 0xF3DC, 0xB953, 0xB954, 0xB7A4,
+ /* U+7B50 */ 0xBFF0, 0xD6FE, 0xCDB2, 0xB955, 0xB4F0, 0xB956, 0xB2DF, 0xB957,
+ /* U+7B58 */ 0xF3D8, 0xB958, 0xF3D9, 0xC9B8, 0xB959, 0xF3DD, 0xB95A, 0xB95B,
+ /* U+7B60 */ 0xF3DE, 0xB95C, 0xF3E1, 0xB95D, 0xB95E, 0xB95F, 0xB960, 0xB961,
+ /* U+7B68 */ 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xF3DF, 0xB968,
+ /* U+7B70 */ 0xB969, 0xF3E3, 0xF3E2, 0xB96A, 0xB96B, 0xF3DB, 0xB96C, 0xBFEA,
+ /* U+7B78 */ 0xB96D, 0xB3EF, 0xB96E, 0xF3E0, 0xB96F, 0xB970, 0xC7A9, 0xB971,
+ /* U+7B80 */ 0xBCF2, 0xB972, 0xB973, 0xB974, 0xB975, 0xF3EB, 0xB976, 0xB977,
+ /* U+7B88 */ 0xB978, 0xB979, 0xB97A, 0xB97B, 0xB97C, 0xB9BF, 0xB97D, 0xB97E,
+ /* U+7B90 */ 0xF3E4, 0xB980, 0xB981, 0xB982, 0xB2AD, 0xBBFE, 0xB983, 0xCBE3,
+ /* U+7B98 */ 0xB984, 0xB985, 0xB986, 0xB987, 0xF3ED, 0xF3E9, 0xB988, 0xB989,
+ /* U+7BA0 */ 0xB98A, 0xB9DC, 0xF3EE, 0xB98B, 0xB98C, 0xB98D, 0xF3E5, 0xF3E6,
+ /* U+7BA8 */ 0xF3EA, 0xC2E1, 0xF3EC, 0xF3EF, 0xF3E8, 0xBCFD, 0xB98E, 0xB98F,
+ /* U+7BB0 */ 0xB990, 0xCFE4, 0xB991, 0xB992, 0xF3F0, 0xB993, 0xB994, 0xB995,
+ /* U+7BB8 */ 0xF3E7, 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C,
+ /* U+7BC0 */ 0xB99D, 0xF3F2, 0xB99E, 0xB99F, 0xB9A0, 0xBA40, 0xD7AD, 0xC6AA,
+ /* U+7BC8 */ 0xBA41, 0xBA42, 0xBA43, 0xBA44, 0xF3F3, 0xBA45, 0xBA46, 0xBA47,
+ /* U+7BD0 */ 0xBA48, 0xF3F1, 0xBA49, 0xC2A8, 0xBA4A, 0xBA4B, 0xBA4C, 0xBA4D,
+ /* U+7BD8 */ 0xBA4E, 0xB8DD, 0xF3F5, 0xBA4F, 0xBA50, 0xF3F4, 0xBA51, 0xBA52,
+ /* U+7BE0 */ 0xBA53, 0xB4DB, 0xBA54, 0xBA55, 0xBA56, 0xF3F6, 0xF3F7, 0xBA57,
+ /* U+7BE8 */ 0xBA58, 0xBA59, 0xF3F8, 0xBA5A, 0xBA5B, 0xBA5C, 0xC0BA, 0xBA5D,
+ /* U+7BF0 */ 0xBA5E, 0xC0E9, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xC5F1,
+ /* U+7BF8 */ 0xBA64, 0xBA65, 0xBA66, 0xBA67, 0xF3FB, 0xBA68, 0xF3FA, 0xBA69,
+ /* U+7C00 */ 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA70, 0xB4D8,
+ /* U+7C08 */ 0xBA71, 0xBA72, 0xBA73, 0xF3FE, 0xF3F9, 0xBA74, 0xBA75, 0xF3FC,
+ /* U+7C10 */ 0xBA76, 0xBA77, 0xBA78, 0xBA79, 0xBA7A, 0xBA7B, 0xF3FD, 0xBA7C,
+ /* U+7C18 */ 0xBA7D, 0xBA7E, 0xBA80, 0xBA81, 0xBA82, 0xBA83, 0xBA84, 0xF4A1,
+ /* U+7C20 */ 0xBA85, 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A, 0xF4A3, 0xBBC9,
+ /* U+7C28 */ 0xBA8B, 0xBA8C, 0xF4A2, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91,
+ /* U+7C30 */ 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,
+ /* U+7C38 */ 0xF4A4, 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xB2BE,
+ /* U+7C40 */ 0xF4A6, 0xF4A5, 0xBAA0, 0xBB40, 0xBB41, 0xBB42, 0xBB43, 0xBB44,
+ /* U+7C48 */ 0xBB45, 0xBB46, 0xBB47, 0xBB48, 0xBB49, 0xBCAE, 0xBB4A, 0xBB4B,
+ /* U+7C50 */ 0xBB4C, 0xBB4D, 0xBB4E, 0xBB4F, 0xBB50, 0xBB51, 0xBB52, 0xBB53,
+ /* U+7C58 */ 0xBB54, 0xBB55, 0xBB56, 0xBB57, 0xBB58, 0xBB59, 0xBB5A, 0xBB5B,
+ /* U+7C60 */ 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB61, 0xBB62, 0xBB63,
+ /* U+7C68 */ 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B,
+ /* U+7C70 */ 0xBB6C, 0xBB6D, 0xBB6E, 0xC3D7, 0xD9E1, 0xBB6F, 0xBB70, 0xBB71,
+ /* U+7C78 */ 0xBB72, 0xBB73, 0xBB74, 0xC0E0, 0xF4CC, 0xD7D1, 0xBB75, 0xBB76,
+ /* U+7C80 */ 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E,
+ /* U+7C88 */ 0xBB80, 0xB7DB, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86,
+ /* U+7C90 */ 0xBB87, 0xF4CE, 0xC1A3, 0xBB88, 0xBB89, 0xC6C9, 0xBB8A, 0xB4D6,
+ /* U+7C98 */ 0xD5B3, 0xBB8B, 0xBB8C, 0xBB8D, 0xF4D0, 0xF4CF, 0xF4D1, 0xCBDA,
+ /* U+7CA0 */ 0xBB8E, 0xBB8F, 0xF4D2, 0xBB90, 0xD4C1, 0xD6E0, 0xBB91, 0xBB92,
+ /* U+7CA8 */ 0xBB93, 0xBB94, 0xB7E0, 0xBB95, 0xBB96, 0xBB97, 0xC1B8, 0xBB98,
+ /* U+7CB0 */ 0xBB99, 0xC1BB, 0xF4D3, 0xBEAC, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D,
+ /* U+7CB8 */ 0xBB9E, 0xB4E2, 0xBB9F, 0xBBA0, 0xF4D4, 0xF4D5, 0xBEAB, 0xBC40,
+ /* U+7CC0 */ 0xBC41, 0xF4D6, 0xBC42, 0xBC43, 0xBC44, 0xF4DB, 0xBC45, 0xF4D7,
+ /* U+7CC8 */ 0xF4DA, 0xBC46, 0xBAFD, 0xBC47, 0xF4D8, 0xF4D9, 0xBC48, 0xBC49,
+ /* U+7CD0 */ 0xBC4A, 0xBC4B, 0xBC4C, 0xBC4D, 0xBC4E, 0xB8E2, 0xCCC7, 0xF4DC,
+ /* U+7CD8 */ 0xBC4F, 0xB2DA, 0xBC50, 0xBC51, 0xC3D3, 0xBC52, 0xBC53, 0xD4E3,
+ /* U+7CE0 */ 0xBFB7, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A,
+ /* U+7CE8 */ 0xF4DD, 0xBC5B, 0xBC5C, 0xBC5D, 0xBC5E, 0xBC5F, 0xBC60, 0xC5B4,
+ /* U+7CF0 */ 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0xBC68,
+ /* U+7CF8 */ 0xF4E9, 0xBC69, 0xBC6A, 0xCFB5, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E,
+ /* U+7D00 */ 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76,
+ /* U+7D08 */ 0xBC77, 0xBC78, 0xCEC9, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,
+ /* U+7D10 */ 0xBC7E, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC84, 0xBC85, 0xBC86,
+ /* U+7D18 */ 0xBC87, 0xBC88, 0xBC89, 0xBC8A, 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E,
+ /* U+7D20 */ 0xCBD8, 0xBC8F, 0xCBF7, 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBDF4,
+ /* U+7D28 */ 0xBC94, 0xBC95, 0xBC96, 0xD7CF, 0xBC97, 0xBC98, 0xBC99, 0xC0DB,
+ /* U+7D30 */ 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA0, 0xBD40,
+ /* U+7D38 */ 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD48,
+ /* U+7D40 */ 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD50,
+ /* U+7D48 */ 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57, 0xBD58,
+ /* U+7D50 */ 0xBD59, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60,
+ /* U+7D58 */ 0xBD61, 0xBD62, 0xBD63, 0xBD64, 0xBD65, 0xBD66, 0xBD67, 0xBD68,
+ /* U+7D60 */ 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70,
+ /* U+7D68 */ 0xBD71, 0xBD72, 0xBD73, 0xBD74, 0xBD75, 0xBD76, 0xD0F5, 0xBD77,
+ /* U+7D70 */ 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xF4EA,
+ /* U+7D78 */ 0xBD80, 0xBD81, 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86, 0xBD87,
+ /* U+7D80 */ 0xBD88, 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F,
+ /* U+7D88 */ 0xBD90, 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95, 0xBD96, 0xBD97,
+ /* U+7D90 */ 0xBD98, 0xBD99, 0xBD9A, 0xBD9B, 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F,
+ /* U+7D98 */ 0xBDA0, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE44, 0xBE45, 0xBE46,
+ /* U+7DA0 */ 0xBE47, 0xBE48, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4C, 0xF4EB, 0xBE4D,
+ /* U+7DA8 */ 0xBE4E, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xF4EC, 0xBE54,
+ /* U+7DB0 */ 0xBE55, 0xBE56, 0xBE57, 0xBE58, 0xBE59, 0xBE5A, 0xBE5B, 0xBE5C,
+ /* U+7DB8 */ 0xBE5D, 0xBE5E, 0xBE5F, 0xBE60, 0xBE61, 0xBE62, 0xBE63, 0xBE64,
+ /* U+7DC0 */ 0xBE65, 0xBE66, 0xBE67, 0xBE68, 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C,
+ /* U+7DC8 */ 0xBE6D, 0xBE6E, 0xBE6F, 0xBE70, 0xBE71, 0xBE72, 0xBE73, 0xBE74,
+ /* U+7DD0 */ 0xBE75, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7B, 0xBE7C,
+ /* U+7DD8 */ 0xBE7D, 0xBE7E, 0xBE80, 0xBE81, 0xBE82, 0xBE83, 0xBE84, 0xBE85,
+ /* U+7DE0 */ 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A, 0xBE8B, 0xBE8C, 0xBE8D,
+ /* U+7DE8 */ 0xBE8E, 0xBE8F, 0xBE90, 0xBE91, 0xBE92, 0xBE93, 0xBE94, 0xBE95,
+ /* U+7DF0 */ 0xBE96, 0xBE97, 0xBE98, 0xBE99, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D,
+ /* U+7DF8 */ 0xBE9E, 0xBE9F, 0xBEA0, 0xBF40, 0xBF41, 0xBF42, 0xBF43, 0xBF44,
+ /* U+7E00 */ 0xBF45, 0xBF46, 0xBF47, 0xBF48, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C,
+ /* U+7E08 */ 0xBF4D, 0xBF4E, 0xBF4F, 0xBF50, 0xBF51, 0xBF52, 0xBF53, 0xBF54,
+ /* U+7E10 */ 0xBF55, 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0xBF5C,
+ /* U+7E18 */ 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, 0xBF63, 0xBF64,
+ /* U+7E20 */ 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C,
+ /* U+7E28 */ 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xBF74,
+ /* U+7E30 */ 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C,
+ /* U+7E38 */ 0xBF7D, 0xBF7E, 0xBF80, 0xF7E3, 0xBF81, 0xBF82, 0xBF83, 0xBF84,
+ /* U+7E40 */ 0xBF85, 0xB7B1, 0xBF86, 0xBF87, 0xBF88, 0xBF89, 0xBF8A, 0xF4ED,
+ /* U+7E48 */ 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92,
+ /* U+7E50 */ 0xBF93, 0xBF94, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,
+ /* U+7E58 */ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xC040, 0xC041,
+ /* U+7E60 */ 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049,
+ /* U+7E68 */ 0xC04A, 0xC04B, 0xC04C, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC051,
+ /* U+7E70 */ 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, 0xC058, 0xC059,
+ /* U+7E78 */ 0xC05A, 0xC05B, 0xC05C, 0xC05D, 0xC05E, 0xC05F, 0xC060, 0xC061,
+ /* U+7E80 */ 0xC062, 0xC063, 0xD7EB, 0xC064, 0xC065, 0xC066, 0xC067, 0xC068,
+ /* U+7E88 */ 0xC069, 0xC06A, 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070,
+ /* U+7E90 */ 0xC071, 0xC072, 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078,
+ /* U+7E98 */ 0xC079, 0xC07A, 0xC07B, 0xF4EE, 0xC07C, 0xC07D, 0xC07E, 0xE6F9,
+ /* U+7EA0 */ 0xBEC0, 0xE6FA, 0xBAEC, 0xE6FB, 0xCFCB, 0xE6FC, 0xD4BC, 0xBCB6,
+ /* U+7EA8 */ 0xE6FD, 0xE6FE, 0xBCCD, 0xC8D2, 0xCEB3, 0xE7A1, 0xC080, 0xB4BF,
+ /* U+7EB0 */ 0xE7A2, 0xC9B4, 0xB8D9, 0xC4C9, 0xC081, 0xD7DD, 0xC2DA, 0xB7D7,
+ /* U+7EB8 */ 0xD6BD, 0xCEC6, 0xB7C4, 0xC082, 0xC083, 0xC5A6, 0xE7A3, 0xCFDF,
+ /* U+7EC0 */ 0xE7A4, 0xE7A5, 0xE7A6, 0xC1B7, 0xD7E9, 0xC9F0, 0xCFB8, 0xD6AF,
+ /* U+7EC8 */ 0xD6D5, 0xE7A7, 0xB0ED, 0xE7A8, 0xE7A9, 0xC9DC, 0xD2EF, 0xBEAD,
+ /* U+7ED0 */ 0xE7AA, 0xB0F3, 0xC8DE, 0xBDE1, 0xE7AB, 0xC8C6, 0xC084, 0xE7AC,
+ /* U+7ED8 */ 0xBBE6, 0xB8F8, 0xD1A4, 0xE7AD, 0xC2E7, 0xBEF8, 0xBDCA, 0xCDB3,
+ /* U+7EE0 */ 0xE7AE, 0xE7AF, 0xBEEE, 0xD0E5, 0xC085, 0xCBE7, 0xCCD0, 0xBCCC,
+ /* U+7EE8 */ 0xE7B0, 0xBCA8, 0xD0F7, 0xE7B1, 0xC086, 0xD0F8, 0xE7B2, 0xE7B3,
+ /* U+7EF0 */ 0xB4C2, 0xE7B4, 0xE7B5, 0xC9FE, 0xCEAC, 0xC3E0, 0xE7B7, 0xB1C1,
+ /* U+7EF8 */ 0xB3F1, 0xC087, 0xE7B8, 0xE7B9, 0xD7DB, 0xD5C0, 0xE7BA, 0xC2CC,
+ /* U+7F00 */ 0xD7BA, 0xE7BB, 0xE7BC, 0xE7BD, 0xBCEA, 0xC3E5, 0xC0C2, 0xE7BE,
+ /* U+7F08 */ 0xE7BF, 0xBCA9, 0xC088, 0xE7C0, 0xE7C1, 0xE7B6, 0xB6D0, 0xE7C2,
+ /* U+7F10 */ 0xC089, 0xE7C3, 0xE7C4, 0xBBBA, 0xB5DE, 0xC2C6, 0xB1E0, 0xE7C5,
+ /* U+7F18 */ 0xD4B5, 0xE7C6, 0xB8BF, 0xE7C8, 0xE7C7, 0xB7EC, 0xC08A, 0xE7C9,
+ /* U+7F20 */ 0xB2F8, 0xE7CA, 0xE7CB, 0xE7CC, 0xE7CD, 0xE7CE, 0xE7CF, 0xE7D0,
+ /* U+7F28 */ 0xD3A7, 0xCBF5, 0xE7D1, 0xE7D2, 0xE7D3, 0xE7D4, 0xC9C9, 0xE7D5,
+ /* U+7F30 */ 0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, 0xBDC9, 0xE7DA, 0xF3BE, 0xC08B,
+ /* U+7F38 */ 0xB8D7, 0xC08C, 0xC8B1, 0xC08D, 0xC08E, 0xC08F, 0xC090, 0xC091,
+ /* U+7F40 */ 0xC092, 0xC093, 0xF3BF, 0xC094, 0xF3C0, 0xF3C1, 0xC095, 0xC096,
+ /* U+7F48 */ 0xC097, 0xC098, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,
+ /* U+7F50 */ 0xB9DE, 0xCDF8, 0xC09F, 0xC0A0, 0xD8E8, 0xBAB1, 0xC140, 0xC2DE,
+ /* U+7F58 */ 0xEEB7, 0xC141, 0xB7A3, 0xC142, 0xC143, 0xC144, 0xC145, 0xEEB9,
+ /* U+7F60 */ 0xC146, 0xEEB8, 0xB0D5, 0xC147, 0xC148, 0xC149, 0xC14A, 0xC14B,
+ /* U+7F68 */ 0xEEBB, 0xD5D6, 0xD7EF, 0xC14C, 0xC14D, 0xC14E, 0xD6C3, 0xC14F,
+ /* U+7F70 */ 0xC150, 0xEEBD, 0xCAF0, 0xC151, 0xEEBC, 0xC152, 0xC153, 0xC154,
+ /* U+7F78 */ 0xC155, 0xEEBE, 0xC156, 0xC157, 0xC158, 0xC159, 0xEEC0, 0xC15A,
+ /* U+7F80 */ 0xC15B, 0xEEBF, 0xC15C, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161,
+ /* U+7F88 */ 0xC162, 0xC163, 0xD1F2, 0xC164, 0xC7BC, 0xC165, 0xC3C0, 0xC166,
+ /* U+7F90 */ 0xC167, 0xC168, 0xC169, 0xC16A, 0xB8E1, 0xC16B, 0xC16C, 0xC16D,
+ /* U+7F98 */ 0xC16E, 0xC16F, 0xC1E7, 0xC170, 0xC171, 0xF4C6, 0xD0DF, 0xF4C7,
+ /* U+7FA0 */ 0xC172, 0xCFDB, 0xC173, 0xC174, 0xC8BA, 0xC175, 0xC176, 0xF4C8,
+ /* U+7FA8 */ 0xC177, 0xC178, 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xF4C9,
+ /* U+7FB0 */ 0xF4CA, 0xC17E, 0xF4CB, 0xC180, 0xC181, 0xC182, 0xC183, 0xC184,
+ /* U+7FB8 */ 0xD9FA, 0xB8FE, 0xC185, 0xC186, 0xE5F1, 0xD3F0, 0xC187, 0xF4E0,
+ /* U+7FC0 */ 0xC188, 0xCECC, 0xC189, 0xC18A, 0xC18B, 0xB3E1, 0xC18C, 0xC18D,
+ /* U+7FC8 */ 0xC18E, 0xC18F, 0xF1B4, 0xC190, 0xD2EE, 0xC191, 0xF4E1, 0xC192,
+ /* U+7FD0 */ 0xC193, 0xC194, 0xC195, 0xC196, 0xCFE8, 0xF4E2, 0xC197, 0xC198,
+ /* U+7FD8 */ 0xC7CC, 0xC199, 0xC19A, 0xC19B, 0xC19C, 0xC19D, 0xC19E, 0xB5D4,
+ /* U+7FE0 */ 0xB4E4, 0xF4E4, 0xC19F, 0xC1A0, 0xC240, 0xF4E3, 0xF4E5, 0xC241,
+ /* U+7FE8 */ 0xC242, 0xF4E6, 0xC243, 0xC244, 0xC245, 0xC246, 0xF4E7, 0xC247,
+ /* U+7FF0 */ 0xBAB2, 0xB0BF, 0xC248, 0xF4E8, 0xC249, 0xC24A, 0xC24B, 0xC24C,
+ /* U+7FF8 */ 0xC24D, 0xC24E, 0xC24F, 0xB7AD, 0xD2ED, 0xC250, 0xC251, 0xC252,
+ /* U+8000 */ 0xD2AB, 0xC0CF, 0xC253, 0xBFBC, 0xEBA3, 0xD5DF, 0xEAC8, 0xC254,
+ /* U+8008 */ 0xC255, 0xC256, 0xC257, 0xF1F3, 0xB6F8, 0xCBA3, 0xC258, 0xC259,
+ /* U+8010 */ 0xC4CD, 0xC25A, 0xF1E7, 0xC25B, 0xF1E8, 0xB8FB, 0xF1E9, 0xBAC4,
+ /* U+8018 */ 0xD4C5, 0xB0D2, 0xC25C, 0xC25D, 0xF1EA, 0xC25E, 0xC25F, 0xC260,
+ /* U+8020 */ 0xF1EB, 0xC261, 0xF1EC, 0xC262, 0xC263, 0xF1ED, 0xF1EE, 0xF1EF,
+ /* U+8028 */ 0xF1F1, 0xF1F0, 0xC5D5, 0xC264, 0xC265, 0xC266, 0xC267, 0xC268,
+ /* U+8030 */ 0xC269, 0xF1F2, 0xC26A, 0xB6FA, 0xC26B, 0xF1F4, 0xD2AE, 0xDEC7,
+ /* U+8038 */ 0xCBCA, 0xC26C, 0xC26D, 0xB3DC, 0xC26E, 0xB5A2, 0xC26F, 0xB9A2,
+ /* U+8040 */ 0xC270, 0xC271, 0xC4F4, 0xF1F5, 0xC272, 0xC273, 0xF1F6, 0xC274,
+ /* U+8048 */ 0xC275, 0xC276, 0xC1C4, 0xC1FB, 0xD6B0, 0xF1F7, 0xC277, 0xC278,
+ /* U+8050 */ 0xC279, 0xC27A, 0xF1F8, 0xC27B, 0xC1AA, 0xC27C, 0xC27D, 0xC27E,
+ /* U+8058 */ 0xC6B8, 0xC280, 0xBEDB, 0xC281, 0xC282, 0xC283, 0xC284, 0xC285,
+ /* U+8060 */ 0xC286, 0xC287, 0xC288, 0xC289, 0xC28A, 0xC28B, 0xC28C, 0xC28D,
+ /* U+8068 */ 0xC28E, 0xF1F9, 0xB4CF, 0xC28F, 0xC290, 0xC291, 0xC292, 0xC293,
+ /* U+8070 */ 0xC294, 0xF1FA, 0xC295, 0xC296, 0xC297, 0xC298, 0xC299, 0xC29A,
+ /* U+8078 */ 0xC29B, 0xC29C, 0xC29D, 0xC29E, 0xC29F, 0xC2A0, 0xC340, 0xEDB2,
+ /* U+8080 */ 0xEDB1, 0xC341, 0xC342, 0xCBE0, 0xD2DE, 0xC343, 0xCBC1, 0xD5D8,
+ /* U+8088 */ 0xC344, 0xC8E2, 0xC345, 0xC0DF, 0xBCA1, 0xC346, 0xC347, 0xC348,
+ /* U+8090 */ 0xC349, 0xC34A, 0xC34B, 0xEBC1, 0xC34C, 0xC34D, 0xD0A4, 0xC34E,
+ /* U+8098 */ 0xD6E2, 0xC34F, 0xB6C7, 0xB8D8, 0xEBC0, 0xB8CE, 0xC350, 0xEBBF,
+ /* U+80A0 */ 0xB3A6, 0xB9C9, 0xD6AB, 0xC351, 0xB7F4, 0xB7CA, 0xC352, 0xC353,
+ /* U+80A8 */ 0xC354, 0xBCE7, 0xB7BE, 0xEBC6, 0xC355, 0xEBC7, 0xB0B9, 0xBFCF,
+ /* U+80B0 */ 0xC356, 0xEBC5, 0xD3FD, 0xC357, 0xEBC8, 0xC358, 0xC359, 0xEBC9,
+ /* U+80B8 */ 0xC35A, 0xC35B, 0xB7CE, 0xC35C, 0xEBC2, 0xEBC4, 0xC9F6, 0xD6D7,
+ /* U+80C0 */ 0xD5CD, 0xD0B2, 0xEBCF, 0xCEB8, 0xEBD0, 0xC35D, 0xB5A8, 0xC35E,
+ /* U+80C8 */ 0xC35F, 0xC360, 0xC361, 0xC362, 0xB1B3, 0xEBD2, 0xCCA5, 0xC363,
+ /* U+80D0 */ 0xC364, 0xC365, 0xC366, 0xC367, 0xC368, 0xC369, 0xC5D6, 0xEBD3,
+ /* U+80D8 */ 0xC36A, 0xEBD1, 0xC5DF, 0xEBCE, 0xCAA4, 0xEBD5, 0xB0FB, 0xC36B,
+ /* U+80E0 */ 0xC36C, 0xBAFA, 0xC36D, 0xC36E, 0xD8B7, 0xF1E3, 0xC36F, 0xEBCA,
+ /* U+80E8 */ 0xEBCB, 0xEBCC, 0xEBCD, 0xEBD6, 0xE6C0, 0xEBD9, 0xC370, 0xBFE8,
+ /* U+80F0 */ 0xD2C8, 0xEBD7, 0xEBDC, 0xB8EC, 0xEBD8, 0xC371, 0xBDBA, 0xC372,
+ /* U+80F8 */ 0xD0D8, 0xC373, 0xB0B7, 0xC374, 0xEBDD, 0xC4DC, 0xC375, 0xC376,
+ /* U+8100 */ 0xC377, 0xC378, 0xD6AC, 0xC379, 0xC37A, 0xC37B, 0xB4E0, 0xC37C,
+ /* U+8108 */ 0xC37D, 0xC2F6, 0xBCB9, 0xC37E, 0xC380, 0xEBDA, 0xEBDB, 0xD4E0,
+ /* U+8110 */ 0xC6EA, 0xC4D4, 0xEBDF, 0xC5A7, 0xD9F5, 0xC381, 0xB2B1, 0xC382,
+ /* U+8118 */ 0xEBE4, 0xC383, 0xBDC5, 0xC384, 0xC385, 0xC386, 0xEBE2, 0xC387,
+ /* U+8120 */ 0xC388, 0xC389, 0xC38A, 0xC38B, 0xC38C, 0xC38D, 0xC38E, 0xC38F,
+ /* U+8128 */ 0xC390, 0xC391, 0xC392, 0xC393, 0xEBE3, 0xC394, 0xC395, 0xB8AC,
+ /* U+8130 */ 0xC396, 0xCDD1, 0xEBE5, 0xC397, 0xC398, 0xC399, 0xEBE1, 0xC39A,
+ /* U+8138 */ 0xC1B3, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0xC6A2, 0xC3A0,
+ /* U+8140 */ 0xC440, 0xC441, 0xC442, 0xC443, 0xC444, 0xC445, 0xCCF3, 0xC446,
+ /* U+8148 */ 0xEBE6, 0xC447, 0xC0B0, 0xD2B8, 0xEBE7, 0xC448, 0xC449, 0xC44A,
+ /* U+8150 */ 0xB8AF, 0xB8AD, 0xC44B, 0xEBE8, 0xC7BB, 0xCDF3, 0xC44C, 0xC44D,
+ /* U+8158 */ 0xC44E, 0xEBEA, 0xEBEB, 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453,
+ /* U+8160 */ 0xEBED, 0xC454, 0xC455, 0xC456, 0xC457, 0xD0C8, 0xC458, 0xEBF2,
+ /* U+8168 */ 0xC459, 0xEBEE, 0xC45A, 0xC45B, 0xC45C, 0xEBF1, 0xC8F9, 0xC45D,
+ /* U+8170 */ 0xD1FC, 0xEBEC, 0xC45E, 0xC45F, 0xEBE9, 0xC460, 0xC461, 0xC462,
+ /* U+8178 */ 0xC463, 0xB8B9, 0xCFD9, 0xC4E5, 0xEBEF, 0xEBF0, 0xCCDA, 0xCDC8,
+ /* U+8180 */ 0xB0F2, 0xC464, 0xEBF6, 0xC465, 0xC466, 0xC467, 0xC468, 0xC469,
+ /* U+8188 */ 0xEBF5, 0xC46A, 0xB2B2, 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xB8E0,
+ /* U+8190 */ 0xC46F, 0xEBF7, 0xC470, 0xC471, 0xC472, 0xC473, 0xC474, 0xC475,
+ /* U+8198 */ 0xB1EC, 0xC476, 0xC477, 0xCCC5, 0xC4A4, 0xCFA5, 0xC478, 0xC479,
+ /* U+81A0 */ 0xC47A, 0xC47B, 0xC47C, 0xEBF9, 0xC47D, 0xC47E, 0xECA2, 0xC480,
+ /* U+81A8 */ 0xC5F2, 0xC481, 0xEBFA, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486,
+ /* U+81B0 */ 0xC487, 0xC488, 0xC489, 0xC9C5, 0xC48A, 0xC48B, 0xC48C, 0xC48D,
+ /* U+81B8 */ 0xC48E, 0xC48F, 0xE2DF, 0xEBFE, 0xC490, 0xC491, 0xC492, 0xC493,
+ /* U+81C0 */ 0xCDCE, 0xECA1, 0xB1DB, 0xD3B7, 0xC494, 0xC495, 0xD2DC, 0xC496,
+ /* U+81C8 */ 0xC497, 0xC498, 0xEBFD, 0xC499, 0xEBFB, 0xC49A, 0xC49B, 0xC49C,
+ /* U+81D0 */ 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC540, 0xC541, 0xC542, 0xC543,
+ /* U+81D8 */ 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, 0xC549, 0xC54A, 0xC54B,
+ /* U+81E0 */ 0xC54C, 0xC54D, 0xC54E, 0xB3BC, 0xC54F, 0xC550, 0xC551, 0xEAB0,
+ /* U+81E8 */ 0xC552, 0xC553, 0xD7D4, 0xC554, 0xF4AB, 0xB3F4, 0xC555, 0xC556,
+ /* U+81F0 */ 0xC557, 0xC558, 0xC559, 0xD6C1, 0xD6C2, 0xC55A, 0xC55B, 0xC55C,
+ /* U+81F8 */ 0xC55D, 0xC55E, 0xC55F, 0xD5E9, 0xBECA, 0xC560, 0xF4A7, 0xC561,
+ /* U+8200 */ 0xD2A8, 0xF4A8, 0xF4A9, 0xC562, 0xF4AA, 0xBECB, 0xD3DF, 0xC563,
+ /* U+8208 */ 0xC564, 0xC565, 0xC566, 0xC567, 0xC9E0, 0xC9E1, 0xC568, 0xC569,
+ /* U+8210 */ 0xF3C2, 0xC56A, 0xCAE6, 0xC56B, 0xCCF2, 0xC56C, 0xC56D, 0xC56E,
+ /* U+8218 */ 0xC56F, 0xC570, 0xC571, 0xE2B6, 0xCBB4, 0xC572, 0xCEE8, 0xD6DB,
+ /* U+8220 */ 0xC573, 0xF4AD, 0xF4AE, 0xF4AF, 0xC574, 0xC575, 0xC576, 0xC577,
+ /* U+8228 */ 0xF4B2, 0xC578, 0xBABD, 0xF4B3, 0xB0E3, 0xF4B0, 0xC579, 0xF4B1,
+ /* U+8230 */ 0xBDA2, 0xB2D5, 0xC57A, 0xF4B6, 0xF4B7, 0xB6E6, 0xB2B0, 0xCFCF,
+ /* U+8238 */ 0xF4B4, 0xB4AC, 0xC57B, 0xF4B5, 0xC57C, 0xC57D, 0xF4B8, 0xC57E,
+ /* U+8240 */ 0xC580, 0xC581, 0xC582, 0xC583, 0xF4B9, 0xC584, 0xC585, 0xCDA7,
+ /* U+8248 */ 0xC586, 0xF4BA, 0xC587, 0xF4BB, 0xC588, 0xC589, 0xC58A, 0xF4BC,
+ /* U+8250 */ 0xC58B, 0xC58C, 0xC58D, 0xC58E, 0xC58F, 0xC590, 0xC591, 0xC592,
+ /* U+8258 */ 0xCBD2, 0xC593, 0xF4BD, 0xC594, 0xC595, 0xC596, 0xC597, 0xF4BE,
+ /* U+8260 */ 0xC598, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, 0xC59F,
+ /* U+8268 */ 0xF4BF, 0xC5A0, 0xC640, 0xC641, 0xC642, 0xC643, 0xF4DE, 0xC1BC,
+ /* U+8270 */ 0xBCE8, 0xC644, 0xC9AB, 0xD1DE, 0xE5F5, 0xC645, 0xC646, 0xC647,
+ /* U+8278 */ 0xC648, 0xDCB3, 0xD2D5, 0xC649, 0xC64A, 0xDCB4, 0xB0AC, 0xDCB5,
+ /* U+8280 */ 0xC64B, 0xC64C, 0xBDDA, 0xC64D, 0xDCB9, 0xC64E, 0xC64F, 0xC650,
+ /* U+8288 */ 0xD8C2, 0xC651, 0xDCB7, 0xD3F3, 0xC652, 0xC9D6, 0xDCBA, 0xDCB6,
+ /* U+8290 */ 0xC653, 0xDCBB, 0xC3A2, 0xC654, 0xC655, 0xC656, 0xC657, 0xDCBC,
+ /* U+8298 */ 0xDCC5, 0xDCBD, 0xC658, 0xC659, 0xCEDF, 0xD6A5, 0xC65A, 0xDCCF,
+ /* U+82A0 */ 0xC65B, 0xDCCD, 0xC65C, 0xC65D, 0xDCD2, 0xBDE6, 0xC2AB, 0xC65E,
+ /* U+82A8 */ 0xDCB8, 0xDCCB, 0xDCCE, 0xDCBE, 0xB7D2, 0xB0C5, 0xDCC7, 0xD0BE,
+ /* U+82B0 */ 0xDCC1, 0xBBA8, 0xC65F, 0xB7BC, 0xDCCC, 0xC660, 0xC661, 0xDCC6,
+ /* U+82B8 */ 0xDCBF, 0xC7DB, 0xC662, 0xC663, 0xC664, 0xD1BF, 0xDCC0, 0xC665,
+ /* U+82C0 */ 0xC666, 0xDCCA, 0xC667, 0xC668, 0xDCD0, 0xC669, 0xC66A, 0xCEAD,
+ /* U+82C8 */ 0xDCC2, 0xC66B, 0xDCC3, 0xDCC8, 0xDCC9, 0xB2D4, 0xDCD1, 0xCBD5,
+ /* U+82D0 */ 0xC66C, 0xD4B7, 0xDCDB, 0xDCDF, 0xCCA6, 0xDCE6, 0xC66D, 0xC3E7,
+ /* U+82D8 */ 0xDCDC, 0xC66E, 0xC66F, 0xBFC1, 0xDCD9, 0xC670, 0xB0FA, 0xB9B6,
+ /* U+82E0 */ 0xDCE5, 0xDCD3, 0xC671, 0xDCC4, 0xDCD6, 0xC8F4, 0xBFE0, 0xC672,
+ /* U+82E8 */ 0xC673, 0xC674, 0xC675, 0xC9BB, 0xC676, 0xC677, 0xC678, 0xB1BD,
+ /* U+82F0 */ 0xC679, 0xD3A2, 0xC67A, 0xC67B, 0xDCDA, 0xC67C, 0xC67D, 0xDCD5,
+ /* U+82F8 */ 0xC67E, 0xC6BB, 0xC680, 0xDCDE, 0xC681, 0xC682, 0xC683, 0xC684,
+ /* U+8300 */ 0xC685, 0xD7C2, 0xC3AF, 0xB7B6, 0xC7D1, 0xC3A9, 0xDCE2, 0xDCD8,
+ /* U+8308 */ 0xDCEB, 0xDCD4, 0xC686, 0xC687, 0xDCDD, 0xC688, 0xBEA5, 0xDCD7,
+ /* U+8310 */ 0xC689, 0xDCE0, 0xC68A, 0xC68B, 0xDCE3, 0xDCE4, 0xC68C, 0xDCF8,
+ /* U+8318 */ 0xC68D, 0xC68E, 0xDCE1, 0xDDA2, 0xDCE7, 0xC68F, 0xC690, 0xC691,
+ /* U+8320 */ 0xC692, 0xC693, 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xBCEB,
+ /* U+8328 */ 0xB4C4, 0xC699, 0xC69A, 0xC3A3, 0xB2E7, 0xDCFA, 0xC69B, 0xDCF2,
+ /* U+8330 */ 0xC69C, 0xDCEF, 0xC69D, 0xDCFC, 0xDCEE, 0xD2F0, 0xB2E8, 0xC69E,
+ /* U+8338 */ 0xC8D7, 0xC8E3, 0xDCFB, 0xC69F, 0xDCED, 0xC6A0, 0xC740, 0xC741,
+ /* U+8340 */ 0xDCF7, 0xC742, 0xC743, 0xDCF5, 0xC744, 0xC745, 0xBEA3, 0xDCF4,
+ /* U+8348 */ 0xC746, 0xB2DD, 0xC747, 0xC748, 0xC749, 0xC74A, 0xC74B, 0xDCF3,
+ /* U+8350 */ 0xBCF6, 0xDCE8, 0xBBC4, 0xC74C, 0xC0F3, 0xC74D, 0xC74E, 0xC74F,
+ /* U+8358 */ 0xC750, 0xC751, 0xBCD4, 0xDCE9, 0xDCEA, 0xC752, 0xDCF1, 0xDCF6,
+ /* U+8360 */ 0xDCF9, 0xB5B4, 0xC753, 0xC8D9, 0xBBE7, 0xDCFE, 0xDCFD, 0xD3AB,
+ /* U+8368 */ 0xDDA1, 0xDDA3, 0xDDA5, 0xD2F1, 0xDDA4, 0xDDA6, 0xDDA7, 0xD2A9,
+ /* U+8370 */ 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC759, 0xC75A, 0xBAC9,
+ /* U+8378 */ 0xDDA9, 0xC75B, 0xC75C, 0xDDB6, 0xDDB1, 0xDDB4, 0xC75D, 0xC75E,
+ /* U+8380 */ 0xC75F, 0xC760, 0xC761, 0xC762, 0xC763, 0xDDB0, 0xC6CE, 0xC764,
+ /* U+8388 */ 0xC765, 0xC0F2, 0xC766, 0xC767, 0xC768, 0xC769, 0xC9AF, 0xC76A,
+ /* U+8390 */ 0xC76B, 0xC76C, 0xDCEC, 0xDDAE, 0xC76D, 0xC76E, 0xC76F, 0xC770,
+ /* U+8398 */ 0xDDB7, 0xC771, 0xC772, 0xDCF0, 0xDDAF, 0xC773, 0xDDB8, 0xC774,
+ /* U+83A0 */ 0xDDAC, 0xC775, 0xC776, 0xC777, 0xC778, 0xC779, 0xC77A, 0xC77B,
+ /* U+83A8 */ 0xDDB9, 0xDDB3, 0xDDAD, 0xC4AA, 0xC77C, 0xC77D, 0xC77E, 0xC780,
+ /* U+83B0 */ 0xDDA8, 0xC0B3, 0xC1AB, 0xDDAA, 0xDDAB, 0xC781, 0xDDB2, 0xBBF1,
+ /* U+83B8 */ 0xDDB5, 0xD3A8, 0xDDBA, 0xC782, 0xDDBB, 0xC3A7, 0xC783, 0xC784,
+ /* U+83C0 */ 0xDDD2, 0xDDBC, 0xC785, 0xC786, 0xC787, 0xDDD1, 0xC788, 0xB9BD,
+ /* U+83C8 */ 0xC789, 0xC78A, 0xBED5, 0xC78B, 0xBEFA, 0xC78C, 0xC78D, 0xBACA,
+ /* U+83D0 */ 0xC78E, 0xC78F, 0xC790, 0xC791, 0xDDCA, 0xC792, 0xDDC5, 0xC793,
+ /* U+83D8 */ 0xDDBF, 0xC794, 0xC795, 0xC796, 0xB2CB, 0xDDC3, 0xC797, 0xDDCB,
+ /* U+83E0 */ 0xB2A4, 0xDDD5, 0xC798, 0xC799, 0xC79A, 0xDDBE, 0xC79B, 0xC79C,
+ /* U+83E8 */ 0xC79D, 0xC6D0, 0xDDD0, 0xC79E, 0xC79F, 0xC7A0, 0xC840, 0xC841,
+ /* U+83F0 */ 0xDDD4, 0xC1E2, 0xB7C6, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846,
+ /* U+83F8 */ 0xDDCE, 0xDDCF, 0xC847, 0xC848, 0xC849, 0xDDC4, 0xC84A, 0xC84B,
+ /* U+8400 */ 0xC84C, 0xDDBD, 0xC84D, 0xDDCD, 0xCCD1, 0xC84E, 0xDDC9, 0xC84F,
+ /* U+8408 */ 0xC850, 0xC851, 0xC852, 0xDDC2, 0xC3C8, 0xC6BC, 0xCEAE, 0xDDCC,
+ /* U+8410 */ 0xC853, 0xDDC8, 0xC854, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859,
+ /* U+8418 */ 0xDDC1, 0xC85A, 0xC85B, 0xC85C, 0xDDC6, 0xC2DC, 0xC85D, 0xC85E,
+ /* U+8420 */ 0xC85F, 0xC860, 0xC861, 0xC862, 0xD3A9, 0xD3AA, 0xDDD3, 0xCFF4,
+ /* U+8428 */ 0xC8F8, 0xC863, 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869,
+ /* U+8430 */ 0xC86A, 0xDDE6, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0xC870,
+ /* U+8438 */ 0xDDC7, 0xC871, 0xC872, 0xC873, 0xDDE0, 0xC2E4, 0xC874, 0xC875,
+ /* U+8440 */ 0xC876, 0xC877, 0xC878, 0xC879, 0xC87A, 0xC87B, 0xDDE1, 0xC87C,
+ /* U+8448 */ 0xC87D, 0xC87E, 0xC880, 0xC881, 0xC882, 0xC883, 0xC884, 0xC885,
+ /* U+8450 */ 0xC886, 0xDDD7, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, 0xD6F8,
+ /* U+8458 */ 0xC88C, 0xDDD9, 0xDDD8, 0xB8F0, 0xDDD6, 0xC88D, 0xC88E, 0xC88F,
+ /* U+8460 */ 0xC890, 0xC6CF, 0xC891, 0xB6AD, 0xC892, 0xC893, 0xC894, 0xC895,
+ /* U+8468 */ 0xC896, 0xDDE2, 0xC897, 0xBAF9, 0xD4E1, 0xDDE7, 0xC898, 0xC899,
+ /* U+8470 */ 0xC89A, 0xB4D0, 0xC89B, 0xDDDA, 0xC89C, 0xBFFB, 0xDDE3, 0xC89D,
+ /* U+8478 */ 0xDDDF, 0xC89E, 0xDDDD, 0xC89F, 0xC8A0, 0xC940, 0xC941, 0xC942,
+ /* U+8480 */ 0xC943, 0xC944, 0xB5D9, 0xC945, 0xC946, 0xC947, 0xC948, 0xDDDB,
+ /* U+8488 */ 0xDDDC, 0xDDDE, 0xC949, 0xBDAF, 0xDDE4, 0xC94A, 0xDDE5, 0xC94B,
+ /* U+8490 */ 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC950, 0xC951, 0xC952, 0xDDF5,
+ /* U+8498 */ 0xC953, 0xC3C9, 0xC954, 0xC955, 0xCBE2, 0xC956, 0xC957, 0xC958,
+ /* U+84A0 */ 0xC959, 0xDDF2, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F,
+ /* U+84A8 */ 0xC960, 0xC961, 0xC962, 0xC963, 0xC964, 0xC965, 0xC966, 0xD8E1,
+ /* U+84B0 */ 0xC967, 0xC968, 0xC6D1, 0xC969, 0xDDF4, 0xC96A, 0xC96B, 0xC96C,
+ /* U+84B8 */ 0xD5F4, 0xDDF3, 0xDDF0, 0xC96D, 0xC96E, 0xDDEC, 0xC96F, 0xDDEF,
+ /* U+84C0 */ 0xC970, 0xDDE8, 0xC971, 0xC972, 0xD0EE, 0xC973, 0xC974, 0xC975,
+ /* U+84C8 */ 0xC976, 0xC8D8, 0xDDEE, 0xC977, 0xC978, 0xDDE9, 0xC979, 0xC97A,
+ /* U+84D0 */ 0xDDEA, 0xCBF2, 0xC97B, 0xDDED, 0xC97C, 0xC97D, 0xB1CD, 0xC97E,
+ /* U+84D8 */ 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC0B6, 0xC985, 0xBCBB,
+ /* U+84E0 */ 0xDDF1, 0xC986, 0xC987, 0xDDF7, 0xC988, 0xDDF6, 0xDDEB, 0xC989,
+ /* U+84E8 */ 0xC98A, 0xC98B, 0xC98C, 0xC98D, 0xC5EE, 0xC98E, 0xC98F, 0xC990,
+ /* U+84F0 */ 0xDDFB, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997,
+ /* U+84F8 */ 0xC998, 0xC999, 0xC99A, 0xC99B, 0xDEA4, 0xC99C, 0xC99D, 0xDEA3,
+ /* U+8500 */ 0xC99E, 0xC99F, 0xC9A0, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44,
+ /* U+8508 */ 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xDDF8, 0xCA49, 0xCA4A, 0xCA4B,
+ /* U+8510 */ 0xCA4C, 0xC3EF, 0xCA4D, 0xC2FB, 0xCA4E, 0xCA4F, 0xCA50, 0xD5E1,
+ /* U+8518 */ 0xCA51, 0xCA52, 0xCEB5, 0xCA53, 0xCA54, 0xCA55, 0xCA56, 0xDDFD,
+ /* U+8520 */ 0xCA57, 0xB2CC, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5C, 0xCA5D,
+ /* U+8528 */ 0xCA5E, 0xCA5F, 0xCA60, 0xC4E8, 0xCADF, 0xCA61, 0xCA62, 0xCA63,
+ /* U+8530 */ 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA68, 0xCA69, 0xCA6A, 0xC7BE,
+ /* U+8538 */ 0xDDFA, 0xDDFC, 0xDDFE, 0xDEA2, 0xB0AA, 0xB1CE, 0xCA6B, 0xCA6C,
+ /* U+8540 */ 0xCA6D, 0xCA6E, 0xCA6F, 0xDEAC, 0xCA70, 0xCA71, 0xCA72, 0xCA73,
+ /* U+8548 */ 0xDEA6, 0xBDB6, 0xC8EF, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78,
+ /* U+8550 */ 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D, 0xCA7E, 0xDEA1, 0xCA80,
+ /* U+8558 */ 0xCA81, 0xDEA5, 0xCA82, 0xCA83, 0xCA84, 0xCA85, 0xDEA9, 0xCA86,
+ /* U+8560 */ 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xDEA8, 0xCA8B, 0xCA8C, 0xCA8D,
+ /* U+8568 */ 0xDEA7, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94,
+ /* U+8570 */ 0xCA95, 0xCA96, 0xDEAD, 0xCA97, 0xD4CC, 0xCA98, 0xCA99, 0xCA9A,
+ /* U+8578 */ 0xCA9B, 0xDEB3, 0xDEAA, 0xDEAE, 0xCA9C, 0xCA9D, 0xC0D9, 0xCA9E,
+ /* U+8580 */ 0xCA9F, 0xCAA0, 0xCB40, 0xCB41, 0xB1A1, 0xDEB6, 0xCB42, 0xDEB1,
+ /* U+8588 */ 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB48, 0xCB49, 0xDEB2,
+ /* U+8590 */ 0xCB4A, 0xCB4B, 0xCB4C, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB50, 0xCB51,
+ /* U+8598 */ 0xCB52, 0xCB53, 0xCB54, 0xD1A6, 0xDEB5, 0xCB55, 0xCB56, 0xCB57,
+ /* U+85A0 */ 0xCB58, 0xCB59, 0xCB5A, 0xCB5B, 0xDEAF, 0xCB5C, 0xCB5D, 0xCB5E,
+ /* U+85A8 */ 0xDEB0, 0xCB5F, 0xD0BD, 0xCB60, 0xCB61, 0xCB62, 0xDEB4, 0xCAED,
+ /* U+85B0 */ 0xDEB9, 0xCB63, 0xCB64, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xDEB8,
+ /* U+85B8 */ 0xCB69, 0xDEB7, 0xCB6A, 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F,
+ /* U+85C0 */ 0xCB70, 0xDEBB, 0xCB71, 0xCB72, 0xCB73, 0xCB74, 0xCB75, 0xCB76,
+ /* U+85C8 */ 0xCB77, 0xBDE5, 0xCB78, 0xCB79, 0xCB7A, 0xCB7B, 0xCB7C, 0xB2D8,
+ /* U+85D0 */ 0xC3EA, 0xCB7D, 0xCB7E, 0xDEBA, 0xCB80, 0xC5BA, 0xCB81, 0xCB82,
+ /* U+85D8 */ 0xCB83, 0xCB84, 0xCB85, 0xCB86, 0xDEBC, 0xCB87, 0xCB88, 0xCB89,
+ /* U+85E0 */ 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCCD9, 0xCB8E, 0xCB8F, 0xCB90,
+ /* U+85E8 */ 0xCB91, 0xB7AA, 0xCB92, 0xCB93, 0xCB94, 0xCB95, 0xCB96, 0xCB97,
+ /* U+85F0 */ 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9C, 0xCB9D, 0xCB9E, 0xCB9F,
+ /* U+85F8 */ 0xCBA0, 0xCC40, 0xCC41, 0xD4E5, 0xCC42, 0xCC43, 0xCC44, 0xDEBD,
+ /* U+8600 */ 0xCC45, 0xCC46, 0xCC47, 0xCC48, 0xCC49, 0xDEBF, 0xCC4A, 0xCC4B,
+ /* U+8608 */ 0xCC4C, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,
+ /* U+8610 */ 0xCC54, 0xC4A2, 0xCC55, 0xCC56, 0xCC57, 0xCC58, 0xDEC1, 0xCC59,
+ /* U+8618 */ 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC60, 0xCC61,
+ /* U+8620 */ 0xCC62, 0xCC63, 0xCC64, 0xCC65, 0xCC66, 0xCC67, 0xCC68, 0xDEBE,
+ /* U+8628 */ 0xCC69, 0xDEC0, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, 0xCC6F,
+ /* U+8630 */ 0xCC70, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC75, 0xCC76, 0xCC77,
+ /* U+8638 */ 0xD5BA, 0xCC78, 0xCC79, 0xCC7A, 0xDEC2, 0xCC7B, 0xCC7C, 0xCC7D,
+ /* U+8640 */ 0xCC7E, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86,
+ /* U+8648 */ 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xF2AE, 0xBBA2, 0xC2B2,
+ /* U+8650 */ 0xC5B0, 0xC2C7, 0xCC8C, 0xCC8D, 0xF2AF, 0xCC8E, 0xCC8F, 0xCC90,
+ /* U+8658 */ 0xCC91, 0xCC92, 0xD0E9, 0xCC93, 0xCC94, 0xCC95, 0xD3DD, 0xCC96,
+ /* U+8660 */ 0xCC97, 0xCC98, 0xEBBD, 0xCC99, 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D,
+ /* U+8668 */ 0xCC9E, 0xCC9F, 0xCCA0, 0xB3E6, 0xF2B0, 0xCD40, 0xF2B1, 0xCD41,
+ /* U+8670 */ 0xCD42, 0xCAAD, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48,
+ /* U+8678 */ 0xCD49, 0xBAE7, 0xF2B3, 0xF2B5, 0xF2B4, 0xCBE4, 0xCFBA, 0xF2B2,
+ /* U+8680 */ 0xCAB4, 0xD2CF, 0xC2EC, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E,
+ /* U+8688 */ 0xCD4F, 0xCD50, 0xCEC3, 0xF2B8, 0xB0F6, 0xF2B7, 0xCD51, 0xCD52,
+ /* U+8690 */ 0xCD53, 0xCD54, 0xCD55, 0xF2BE, 0xCD56, 0xB2CF, 0xCD57, 0xCD58,
+ /* U+8698 */ 0xCD59, 0xCD5A, 0xCD5B, 0xCD5C, 0xD1C1, 0xF2BA, 0xCD5D, 0xCD5E,
+ /* U+86A0 */ 0xCD5F, 0xCD60, 0xCD61, 0xF2BC, 0xD4E9, 0xCD62, 0xCD63, 0xF2BB,
+ /* U+86A8 */ 0xF2B6, 0xF2BF, 0xF2BD, 0xCD64, 0xF2B9, 0xCD65, 0xCD66, 0xF2C7,
+ /* U+86B0 */ 0xF2C4, 0xF2C6, 0xCD67, 0xCD68, 0xF2CA, 0xF2C2, 0xF2C0, 0xCD69,
+ /* U+86B8 */ 0xCD6A, 0xCD6B, 0xF2C5, 0xCD6C, 0xCD6D, 0xCD6E, 0xCD6F, 0xCD70,
+ /* U+86C0 */ 0xD6FB, 0xCD71, 0xCD72, 0xCD73, 0xF2C1, 0xCD74, 0xC7F9, 0xC9DF,
+ /* U+86C8 */ 0xCD75, 0xF2C8, 0xB9C6, 0xB5B0, 0xCD76, 0xCD77, 0xF2C3, 0xF2C9,
+ /* U+86D0 */ 0xF2D0, 0xF2D6, 0xCD78, 0xCD79, 0xBBD7, 0xCD7A, 0xCD7B, 0xCD7C,
+ /* U+86D8 */ 0xF2D5, 0xCDDC, 0xCD7D, 0xD6EB, 0xCD7E, 0xCD80, 0xF2D2, 0xF2D4,
+ /* U+86E0 */ 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xB8F2, 0xCD85, 0xCD86, 0xCD87,
+ /* U+86E8 */ 0xCD88, 0xF2CB, 0xCD89, 0xCD8A, 0xCD8B, 0xF2CE, 0xC2F9, 0xCD8C,
+ /* U+86F0 */ 0xD5DD, 0xF2CC, 0xF2CD, 0xF2CF, 0xF2D3, 0xCD8D, 0xCD8E, 0xCD8F,
+ /* U+86F8 */ 0xF2D9, 0xD3BC, 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0xB6EA, 0xCD94,
+ /* U+8700 */ 0xCAF1, 0xCD95, 0xB7E4, 0xF2D7, 0xCD96, 0xCD97, 0xCD98, 0xF2D8,
+ /* U+8708 */ 0xF2DA, 0xF2DD, 0xF2DB, 0xCD99, 0xCD9A, 0xF2DC, 0xCD9B, 0xCD9C,
+ /* U+8710 */ 0xCD9D, 0xCD9E, 0xD1D1, 0xF2D1, 0xCD9F, 0xCDC9, 0xCDA0, 0xCECF,
+ /* U+8718 */ 0xD6A9, 0xCE40, 0xF2E3, 0xCE41, 0xC3DB, 0xCE42, 0xF2E0, 0xCE43,
+ /* U+8720 */ 0xCE44, 0xC0AF, 0xF2EC, 0xF2DE, 0xCE45, 0xF2E1, 0xCE46, 0xCE47,
+ /* U+8728 */ 0xCE48, 0xF2E8, 0xCE49, 0xCE4A, 0xCE4B, 0xCE4C, 0xF2E2, 0xCE4D,
+ /* U+8730 */ 0xCE4E, 0xF2E7, 0xCE4F, 0xCE50, 0xF2E6, 0xCE51, 0xCE52, 0xF2E9,
+ /* U+8738 */ 0xCE53, 0xCE54, 0xCE55, 0xF2DF, 0xCE56, 0xCE57, 0xF2E4, 0xF2EA,
+ /* U+8740 */ 0xCE58, 0xCE59, 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE5E, 0xD3AC,
+ /* U+8748 */ 0xF2E5, 0xB2F5, 0xCE5F, 0xCE60, 0xF2F2, 0xCE61, 0xD0AB, 0xCE62,
+ /* U+8750 */ 0xCE63, 0xCE64, 0xCE65, 0xF2F5, 0xCE66, 0xCE67, 0xCE68, 0xBBC8,
+ /* U+8758 */ 0xCE69, 0xF2F9, 0xCE6A, 0xCE6B, 0xCE6C, 0xCE6D, 0xCE6E, 0xCE6F,
+ /* U+8760 */ 0xF2F0, 0xCE70, 0xCE71, 0xF2F6, 0xF2F8, 0xF2FA, 0xCE72, 0xCE73,
+ /* U+8768 */ 0xCE74, 0xCE75, 0xCE76, 0xCE77, 0xCE78, 0xCE79, 0xF2F3, 0xCE7A,
+ /* U+8770 */ 0xF2F1, 0xCE7B, 0xCE7C, 0xCE7D, 0xBAFB, 0xCE7E, 0xB5FB, 0xCE80,
+ /* U+8778 */ 0xCE81, 0xCE82, 0xCE83, 0xF2EF, 0xF2F7, 0xF2ED, 0xF2EE, 0xCE84,
+ /* U+8780 */ 0xCE85, 0xCE86, 0xF2EB, 0xF3A6, 0xCE87, 0xF3A3, 0xCE88, 0xCE89,
+ /* U+8788 */ 0xF3A2, 0xCE8A, 0xCE8B, 0xF2F4, 0xCE8C, 0xC8DA, 0xCE8D, 0xCE8E,
+ /* U+8790 */ 0xCE8F, 0xCE90, 0xCE91, 0xF2FB, 0xCE92, 0xCE93, 0xCE94, 0xF3A5,
+ /* U+8798 */ 0xCE95, 0xCE96, 0xCE97, 0xCE98, 0xCE99, 0xCE9A, 0xCE9B, 0xC3F8,
+ /* U+87A0 */ 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA0, 0xCF40, 0xCF41, 0xCF42,
+ /* U+87A8 */ 0xF2FD, 0xCF43, 0xCF44, 0xF3A7, 0xF3A9, 0xF3A4, 0xCF45, 0xF2FC,
+ /* U+87B0 */ 0xCF46, 0xCF47, 0xCF48, 0xF3AB, 0xCF49, 0xF3AA, 0xCF4A, 0xCF4B,
+ /* U+87B8 */ 0xCF4C, 0xCF4D, 0xC2DD, 0xCF4E, 0xCF4F, 0xF3AE, 0xCF50, 0xCF51,
+ /* U+87C0 */ 0xF3B0, 0xCF52, 0xCF53, 0xCF54, 0xCF55, 0xCF56, 0xF3A1, 0xCF57,
+ /* U+87C8 */ 0xCF58, 0xCF59, 0xF3B1, 0xF3AC, 0xCF5A, 0xCF5B, 0xCF5C, 0xCF5D,
+ /* U+87D0 */ 0xCF5E, 0xF3AF, 0xF2FE, 0xF3AD, 0xCF5F, 0xCF60, 0xCF61, 0xCF62,
+ /* U+87D8 */ 0xCF63, 0xCF64, 0xCF65, 0xF3B2, 0xCF66, 0xCF67, 0xCF68, 0xCF69,
+ /* U+87E0 */ 0xF3B4, 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xF3A8, 0xCF6E, 0xCF6F,
+ /* U+87E8 */ 0xCF70, 0xCF71, 0xF3B3, 0xCF72, 0xCF73, 0xCF74, 0xF3B5, 0xCF75,
+ /* U+87F0 */ 0xCF76, 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D,
+ /* U+87F8 */ 0xCF7E, 0xD0B7, 0xCF80, 0xCF81, 0xCF82, 0xCF83, 0xF3B8, 0xCF84,
+ /* U+8800 */ 0xCF85, 0xCF86, 0xCF87, 0xD9F9, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B,
+ /* U+8808 */ 0xCF8C, 0xCF8D, 0xF3B9, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,
+ /* U+8810 */ 0xCF93, 0xCF94, 0xCF95, 0xF3B7, 0xCF96, 0xC8E4, 0xF3B6, 0xCF97,
+ /* U+8818 */ 0xCF98, 0xCF99, 0xCF9A, 0xF3BA, 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E,
+ /* U+8820 */ 0xCF9F, 0xF3BB, 0xB4C0, 0xCFA0, 0xD040, 0xD041, 0xD042, 0xD043,
+ /* U+8828 */ 0xD044, 0xD045, 0xD046, 0xD047, 0xD048, 0xD049, 0xD04A, 0xD04B,
+ /* U+8830 */ 0xD04C, 0xD04D, 0xEEC3, 0xD04E, 0xD04F, 0xD050, 0xD051, 0xD052,
+ /* U+8838 */ 0xD053, 0xF3BC, 0xD054, 0xD055, 0xF3BD, 0xD056, 0xD057, 0xD058,
+ /* U+8840 */ 0xD1AA, 0xD059, 0xD05A, 0xD05B, 0xF4AC, 0xD0C6, 0xD05C, 0xD05D,
+ /* U+8848 */ 0xD05E, 0xD05F, 0xD060, 0xD061, 0xD0D0, 0xD1DC, 0xD062, 0xD063,
+ /* U+8850 */ 0xD064, 0xD065, 0xD066, 0xD067, 0xCFCE, 0xD068, 0xD069, 0xBDD6,
+ /* U+8858 */ 0xD06A, 0xD1C3, 0xD06B, 0xD06C, 0xD06D, 0xD06E, 0xD06F, 0xD070,
+ /* U+8860 */ 0xD071, 0xBAE2, 0xE1E9, 0xD2C2, 0xF1C2, 0xB2B9, 0xD072, 0xD073,
+ /* U+8868 */ 0xB1ED, 0xF1C3, 0xD074, 0xC9C0, 0xB3C4, 0xD075, 0xD9F2, 0xD076,
+ /* U+8870 */ 0xCBA5, 0xD077, 0xF1C4, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD6D4,
+ /* U+8878 */ 0xD07C, 0xD07D, 0xD07E, 0xD080, 0xD081, 0xF1C5, 0xF4C0, 0xF1C6,
+ /* U+8880 */ 0xD082, 0xD4AC, 0xF1C7, 0xD083, 0xB0C0, 0xF4C1, 0xD084, 0xD085,
+ /* U+8888 */ 0xF4C2, 0xD086, 0xD087, 0xB4FC, 0xD088, 0xC5DB, 0xD089, 0xD08A,
+ /* U+8890 */ 0xD08B, 0xD08C, 0xCCBB, 0xD08D, 0xD08E, 0xD08F, 0xD0E4, 0xD090,
+ /* U+8898 */ 0xD091, 0xD092, 0xD093, 0xD094, 0xCDE0, 0xD095, 0xD096, 0xD097,
+ /* U+88A0 */ 0xD098, 0xD099, 0xF1C8, 0xD09A, 0xD9F3, 0xD09B, 0xD09C, 0xD09D,
+ /* U+88A8 */ 0xD09E, 0xD09F, 0xD0A0, 0xB1BB, 0xD140, 0xCFAE, 0xD141, 0xD142,
+ /* U+88B0 */ 0xD143, 0xB8A4, 0xD144, 0xD145, 0xD146, 0xD147, 0xD148, 0xF1CA,
+ /* U+88B8 */ 0xD149, 0xD14A, 0xD14B, 0xD14C, 0xF1CB, 0xD14D, 0xD14E, 0xD14F,
+ /* U+88C0 */ 0xD150, 0xB2C3, 0xC1D1, 0xD151, 0xD152, 0xD7B0, 0xF1C9, 0xD153,
+ /* U+88C8 */ 0xD154, 0xF1CC, 0xD155, 0xD156, 0xD157, 0xD158, 0xF1CE, 0xD159,
+ /* U+88D0 */ 0xD15A, 0xD15B, 0xD9F6, 0xD15C, 0xD2E1, 0xD4A3, 0xD15D, 0xD15E,
+ /* U+88D8 */ 0xF4C3, 0xC8B9, 0xD15F, 0xD160, 0xD161, 0xD162, 0xD163, 0xF4C4,
+ /* U+88E0 */ 0xD164, 0xD165, 0xF1CD, 0xF1CF, 0xBFE3, 0xF1D0, 0xD166, 0xD167,
+ /* U+88E8 */ 0xF1D4, 0xD168, 0xD169, 0xD16A, 0xD16B, 0xD16C, 0xD16D, 0xD16E,
+ /* U+88F0 */ 0xF1D6, 0xF1D1, 0xD16F, 0xC9D1, 0xC5E1, 0xD170, 0xD171, 0xD172,
+ /* U+88F8 */ 0xC2E3, 0xB9FC, 0xD173, 0xD174, 0xF1D3, 0xD175, 0xF1D5, 0xD176,
+ /* U+8900 */ 0xD177, 0xD178, 0xB9D3, 0xD179, 0xD17A, 0xD17B, 0xD17C, 0xD17D,
+ /* U+8908 */ 0xD17E, 0xD180, 0xF1DB, 0xD181, 0xD182, 0xD183, 0xD184, 0xD185,
+ /* U+8910 */ 0xBAD6, 0xD186, 0xB0FD, 0xF1D9, 0xD187, 0xD188, 0xD189, 0xD18A,
+ /* U+8918 */ 0xD18B, 0xF1D8, 0xF1D2, 0xF1DA, 0xD18C, 0xD18D, 0xD18E, 0xD18F,
+ /* U+8920 */ 0xD190, 0xF1D7, 0xD191, 0xD192, 0xD193, 0xC8EC, 0xD194, 0xD195,
+ /* U+8928 */ 0xD196, 0xD197, 0xCDCA, 0xF1DD, 0xD198, 0xD199, 0xD19A, 0xD19B,
+ /* U+8930 */ 0xE5BD, 0xD19C, 0xD19D, 0xD19E, 0xF1DC, 0xD19F, 0xF1DE, 0xD1A0,
+ /* U+8938 */ 0xD240, 0xD241, 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247,
+ /* U+8940 */ 0xD248, 0xF1DF, 0xD249, 0xD24A, 0xCFE5, 0xD24B, 0xD24C, 0xD24D,
+ /* U+8948 */ 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255,
+ /* U+8950 */ 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D,
+ /* U+8958 */ 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xF4C5, 0xBDF3,
+ /* U+8960 */ 0xD264, 0xD265, 0xD266, 0xD267, 0xD268, 0xD269, 0xF1E0, 0xD26A,
+ /* U+8968 */ 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272,
+ /* U+8970 */ 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, 0xD27A,
+ /* U+8978 */ 0xD27B, 0xD27C, 0xD27D, 0xF1E1, 0xD27E, 0xD280, 0xD281, 0xCEF7,
+ /* U+8980 */ 0xD282, 0xD2AA, 0xD283, 0xF1FB, 0xD284, 0xD285, 0xB8B2, 0xD286,
+ /* U+8988 */ 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E,
+ /* U+8990 */ 0xD28F, 0xD290, 0xD291, 0xD292, 0xD293, 0xD294, 0xD295, 0xD296,
+ /* U+8998 */ 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29C, 0xD29D, 0xD29E,
+ /* U+89A0 */ 0xD29F, 0xD2A0, 0xD340, 0xD341, 0xD342, 0xD343, 0xD344, 0xD345,
+ /* U+89A8 */ 0xD346, 0xD347, 0xD348, 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D,
+ /* U+89B0 */ 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD352, 0xD353, 0xD354, 0xD355,
+ /* U+89B8 */ 0xD356, 0xD357, 0xD358, 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D,
+ /* U+89C0 */ 0xD35E, 0xBCFB, 0xB9DB, 0xD35F, 0xB9E6, 0xC3D9, 0xCAD3, 0xEAE8,
+ /* U+89C8 */ 0xC0C0, 0xBEF5, 0xEAE9, 0xEAEA, 0xEAEB, 0xD360, 0xEAEC, 0xEAED,
+ /* U+89D0 */ 0xEAEE, 0xEAEF, 0xBDC7, 0xD361, 0xD362, 0xD363, 0xF5FB, 0xD364,
+ /* U+89D8 */ 0xD365, 0xD366, 0xF5FD, 0xD367, 0xF5FE, 0xD368, 0xF5FC, 0xD369,
+ /* U+89E0 */ 0xD36A, 0xD36B, 0xD36C, 0xBDE2, 0xD36D, 0xF6A1, 0xB4A5, 0xD36E,
+ /* U+89E8 */ 0xD36F, 0xD370, 0xD371, 0xF6A2, 0xD372, 0xD373, 0xD374, 0xF6A3,
+ /* U+89F0 */ 0xD375, 0xD376, 0xD377, 0xECB2, 0xD378, 0xD379, 0xD37A, 0xD37B,
+ /* U+89F8 */ 0xD37C, 0xD37D, 0xD37E, 0xD380, 0xD381, 0xD382, 0xD383, 0xD384,
+ /* U+8A00 */ 0xD1D4, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD9EA,
+ /* U+8A08 */ 0xD38B, 0xD38C, 0xD38D, 0xD38E, 0xD38F, 0xD390, 0xD391, 0xD392,
+ /* U+8A10 */ 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD398, 0xD399, 0xD39A,
+ /* U+8A18 */ 0xD39B, 0xD39C, 0xD39D, 0xD39E, 0xD39F, 0xD3A0, 0xD440, 0xD441,
+ /* U+8A20 */ 0xD442, 0xD443, 0xD444, 0xD445, 0xD446, 0xD447, 0xD448, 0xD449,
+ /* U+8A28 */ 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450, 0xD451,
+ /* U+8A30 */ 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458, 0xD459,
+ /* U+8A38 */ 0xD45A, 0xD45B, 0xD45C, 0xD45D, 0xD45E, 0xD45F, 0xF6A4, 0xD460,
+ /* U+8A40 */ 0xD461, 0xD462, 0xD463, 0xD464, 0xD465, 0xD466, 0xD467, 0xD468,
+ /* U+8A48 */ 0xEEBA, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46D, 0xD46E, 0xD46F,
+ /* U+8A50 */ 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477,
+ /* U+8A58 */ 0xD478, 0xD479, 0xD47A, 0xD47B, 0xD47C, 0xD47D, 0xD47E, 0xD480,
+ /* U+8A60 */ 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, 0xD488,
+ /* U+8A68 */ 0xD489, 0xD48A, 0xD48B, 0xD48C, 0xD48D, 0xD48E, 0xD48F, 0xD490,
+ /* U+8A70 */ 0xD491, 0xD492, 0xD493, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498,
+ /* U+8A78 */ 0xD499, 0xD5B2, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F,
+ /* U+8A80 */ 0xD4A0, 0xD540, 0xD541, 0xD542, 0xD543, 0xD544, 0xD545, 0xD546,
+ /* U+8A88 */ 0xD547, 0xD3FE, 0xCCDC, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54C,
+ /* U+8A90 */ 0xD54D, 0xD54E, 0xD54F, 0xCAC4, 0xD550, 0xD551, 0xD552, 0xD553,
+ /* U+8A98 */ 0xD554, 0xD555, 0xD556, 0xD557, 0xD558, 0xD559, 0xD55A, 0xD55B,
+ /* U+8AA0 */ 0xD55C, 0xD55D, 0xD55E, 0xD55F, 0xD560, 0xD561, 0xD562, 0xD563,
+ /* U+8AA8 */ 0xD564, 0xD565, 0xD566, 0xD567, 0xD568, 0xD569, 0xD56A, 0xD56B,
+ /* U+8AB0 */ 0xD56C, 0xD56D, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573,
+ /* U+8AB8 */ 0xD574, 0xD575, 0xD576, 0xD577, 0xD578, 0xD579, 0xD57A, 0xD57B,
+ /* U+8AC0 */ 0xD57C, 0xD57D, 0xD57E, 0xD580, 0xD581, 0xD582, 0xD583, 0xD584,
+ /* U+8AC8 */ 0xD585, 0xD586, 0xD587, 0xD588, 0xD589, 0xD58A, 0xD58B, 0xD58C,
+ /* U+8AD0 */ 0xD58D, 0xD58E, 0xD58F, 0xD590, 0xD591, 0xD592, 0xD593, 0xD594,
+ /* U+8AD8 */ 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C,
+ /* U+8AE0 */ 0xD59D, 0xD59E, 0xD59F, 0xD5A0, 0xD640, 0xD641, 0xD642, 0xD643,
+ /* U+8AE8 */ 0xD644, 0xD645, 0xD646, 0xD647, 0xD648, 0xD649, 0xD64A, 0xD64B,
+ /* U+8AF0 */ 0xD64C, 0xD64D, 0xD64E, 0xD64F, 0xD650, 0xD651, 0xD652, 0xD653,
+ /* U+8AF8 */ 0xD654, 0xD655, 0xD656, 0xD657, 0xD658, 0xD659, 0xD65A, 0xD65B,
+ /* U+8B00 */ 0xD65C, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662, 0xE5C0,
+ /* U+8B08 */ 0xD663, 0xD664, 0xD665, 0xD666, 0xD667, 0xD668, 0xD669, 0xD66A,
+ /* U+8B10 */ 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD670, 0xD671, 0xD672,
+ /* U+8B18 */ 0xD673, 0xD674, 0xD675, 0xD676, 0xD677, 0xD678, 0xD679, 0xD67A,
+ /* U+8B20 */ 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD680, 0xD681, 0xF6A5, 0xD682,
+ /* U+8B28 */ 0xD683, 0xD684, 0xD685, 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A,
+ /* U+8B30 */ 0xD68B, 0xD68C, 0xD68D, 0xD68E, 0xD68F, 0xD690, 0xD691, 0xD692,
+ /* U+8B38 */ 0xD693, 0xD694, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A,
+ /* U+8B40 */ 0xD69B, 0xD69C, 0xD69D, 0xD69E, 0xD69F, 0xD6A0, 0xD740, 0xD741,
+ /* U+8B48 */ 0xD742, 0xD743, 0xD744, 0xD745, 0xD746, 0xD747, 0xD748, 0xD749,
+ /* U+8B50 */ 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0xD750, 0xD751,
+ /* U+8B58 */ 0xD752, 0xD753, 0xD754, 0xD755, 0xD756, 0xD757, 0xD758, 0xD759,
+ /* U+8B60 */ 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, 0xD75F, 0xBEAF, 0xD760,
+ /* U+8B68 */ 0xD761, 0xD762, 0xD763, 0xD764, 0xC6A9, 0xD765, 0xD766, 0xD767,
+ /* U+8B70 */ 0xD768, 0xD769, 0xD76A, 0xD76B, 0xD76C, 0xD76D, 0xD76E, 0xD76F,
+ /* U+8B78 */ 0xD770, 0xD771, 0xD772, 0xD773, 0xD774, 0xD775, 0xD776, 0xD777,
+ /* U+8B80 */ 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77C, 0xD77D, 0xD77E, 0xD780,
+ /* U+8B88 */ 0xD781, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD788,
+ /* U+8B90 */ 0xD789, 0xD78A, 0xD78B, 0xD78C, 0xD78D, 0xD78E, 0xD78F, 0xD790,
+ /* U+8B98 */ 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796, 0xD797, 0xD798,
+ /* U+8BA0 */ 0xDAA5, 0xBCC6, 0xB6A9, 0xB8BC, 0xC8CF, 0xBCA5, 0xDAA6, 0xDAA7,
+ /* U+8BA8 */ 0xCCD6, 0xC8C3, 0xDAA8, 0xC6FD, 0xD799, 0xD1B5, 0xD2E9, 0xD1B6,
+ /* U+8BB0 */ 0xBCC7, 0xD79A, 0xBDB2, 0xBBE4, 0xDAA9, 0xDAAA, 0xD1C8, 0xDAAB,
+ /* U+8BB8 */ 0xD0ED, 0xB6EF, 0xC2DB, 0xD79B, 0xCBCF, 0xB7ED, 0xC9E8, 0xB7C3,
+ /* U+8BC0 */ 0xBEF7, 0xD6A4, 0xDAAC, 0xDAAD, 0xC6C0, 0xD7E7, 0xCAB6, 0xD79C,
+ /* U+8BC8 */ 0xD5A9, 0xCBDF, 0xD5EF, 0xDAAE, 0xD6DF, 0xB4CA, 0xDAB0, 0xDAAF,
+ /* U+8BD0 */ 0xD79D, 0xD2EB, 0xDAB1, 0xDAB2, 0xDAB3, 0xCAD4, 0xDAB4, 0xCAAB,
+ /* U+8BD8 */ 0xDAB5, 0xDAB6, 0xB3CF, 0xD6EF, 0xDAB7, 0xBBB0, 0xB5AE, 0xDAB8,
+ /* U+8BE0 */ 0xDAB9, 0xB9EE, 0xD1AF, 0xD2E8, 0xDABA, 0xB8C3, 0xCFEA, 0xB2EF,
+ /* U+8BE8 */ 0xDABB, 0xDABC, 0xD79E, 0xBDEB, 0xCEDC, 0xD3EF, 0xDABD, 0xCEF3,
+ /* U+8BF0 */ 0xDABE, 0xD3D5, 0xBBE5, 0xDABF, 0xCBB5, 0xCBD0, 0xDAC0, 0xC7EB,
+ /* U+8BF8 */ 0xD6EE, 0xDAC1, 0xC5B5, 0xB6C1, 0xDAC2, 0xB7CC, 0xBFCE, 0xDAC3,
+ /* U+8C00 */ 0xDAC4, 0xCBAD, 0xDAC5, 0xB5F7, 0xDAC6, 0xC1C2, 0xD7BB, 0xDAC7,
+ /* U+8C08 */ 0xCCB8, 0xD79F, 0xD2EA, 0xC4B1, 0xDAC8, 0xB5FD, 0xBBD1, 0xDAC9,
+ /* U+8C10 */ 0xD0B3, 0xDACA, 0xDACB, 0xCEBD, 0xDACC, 0xDACD, 0xDACE, 0xB2F7,
+ /* U+8C18 */ 0xDAD1, 0xDACF, 0xD1E8, 0xDAD0, 0xC3D5, 0xDAD2, 0xD7A0, 0xDAD3,
+ /* U+8C20 */ 0xDAD4, 0xDAD5, 0xD0BB, 0xD2A5, 0xB0F9, 0xDAD6, 0xC7AB, 0xDAD7,
+ /* U+8C28 */ 0xBDF7, 0xC3A1, 0xDAD8, 0xDAD9, 0xC3FD, 0xCCB7, 0xDADA, 0xDADB,
+ /* U+8C30 */ 0xC0BE, 0xC6D7, 0xDADC, 0xDADD, 0xC7B4, 0xDADE, 0xDADF, 0xB9C8,
+ /* U+8C38 */ 0xD840, 0xD841, 0xD842, 0xD843, 0xD844, 0xD845, 0xD846, 0xD847,
+ /* U+8C40 */ 0xD848, 0xBBED, 0xD849, 0xD84A, 0xD84B, 0xD84C, 0xB6B9, 0xF4F8,
+ /* U+8C48 */ 0xD84D, 0xF4F9, 0xD84E, 0xD84F, 0xCDE3, 0xD850, 0xD851, 0xD852,
+ /* U+8C50 */ 0xD853, 0xD854, 0xD855, 0xD856, 0xD857, 0xF5B9, 0xD858, 0xD859,
+ /* U+8C58 */ 0xD85A, 0xD85B, 0xEBE0, 0xD85C, 0xD85D, 0xD85E, 0xD85F, 0xD860,
+ /* U+8C60 */ 0xD861, 0xCFF3, 0xBBBF, 0xD862, 0xD863, 0xD864, 0xD865, 0xD866,
+ /* U+8C68 */ 0xD867, 0xD868, 0xBAC0, 0xD4A5, 0xD869, 0xD86A, 0xD86B, 0xD86C,
+ /* U+8C70 */ 0xD86D, 0xD86E, 0xD86F, 0xE1D9, 0xD870, 0xD871, 0xD872, 0xD873,
+ /* U+8C78 */ 0xF5F4, 0xB1AA, 0xB2F2, 0xD874, 0xD875, 0xD876, 0xD877, 0xD878,
+ /* U+8C80 */ 0xD879, 0xD87A, 0xF5F5, 0xD87B, 0xD87C, 0xF5F7, 0xD87D, 0xD87E,
+ /* U+8C88 */ 0xD880, 0xBAD1, 0xF5F6, 0xD881, 0xC3B2, 0xD882, 0xD883, 0xD884,
+ /* U+8C90 */ 0xD885, 0xD886, 0xD887, 0xD888, 0xF5F9, 0xD889, 0xD88A, 0xD88B,
+ /* U+8C98 */ 0xF5F8, 0xD88C, 0xD88D, 0xD88E, 0xD88F, 0xD890, 0xD891, 0xD892,
+ /* U+8CA0 */ 0xD893, 0xD894, 0xD895, 0xD896, 0xD897, 0xD898, 0xD899, 0xD89A,
+ /* U+8CA8 */ 0xD89B, 0xD89C, 0xD89D, 0xD89E, 0xD89F, 0xD8A0, 0xD940, 0xD941,
+ /* U+8CB0 */ 0xD942, 0xD943, 0xD944, 0xD945, 0xD946, 0xD947, 0xD948, 0xD949,
+ /* U+8CB8 */ 0xD94A, 0xD94B, 0xD94C, 0xD94D, 0xD94E, 0xD94F, 0xD950, 0xD951,
+ /* U+8CC0 */ 0xD952, 0xD953, 0xD954, 0xD955, 0xD956, 0xD957, 0xD958, 0xD959,
+ /* U+8CC8 */ 0xD95A, 0xD95B, 0xD95C, 0xD95D, 0xD95E, 0xD95F, 0xD960, 0xD961,
+ /* U+8CD0 */ 0xD962, 0xD963, 0xD964, 0xD965, 0xD966, 0xD967, 0xD968, 0xD969,
+ /* U+8CD8 */ 0xD96A, 0xD96B, 0xD96C, 0xD96D, 0xD96E, 0xD96F, 0xD970, 0xD971,
+ /* U+8CE0 */ 0xD972, 0xD973, 0xD974, 0xD975, 0xD976, 0xD977, 0xD978, 0xD979,
+ /* U+8CE8 */ 0xD97A, 0xD97B, 0xD97C, 0xD97D, 0xD97E, 0xD980, 0xD981, 0xD982,
+ /* U+8CF0 */ 0xD983, 0xD984, 0xD985, 0xD986, 0xD987, 0xD988, 0xD989, 0xD98A,
+ /* U+8CF8 */ 0xD98B, 0xD98C, 0xD98D, 0xD98E, 0xD98F, 0xD990, 0xD991, 0xD992,
+ /* U+8D00 */ 0xD993, 0xD994, 0xD995, 0xD996, 0xD997, 0xD998, 0xD999, 0xD99A,
+ /* U+8D08 */ 0xD99B, 0xD99C, 0xD99D, 0xD99E, 0xD99F, 0xD9A0, 0xDA40, 0xDA41,
+ /* U+8D10 */ 0xDA42, 0xDA43, 0xDA44, 0xDA45, 0xDA46, 0xDA47, 0xDA48, 0xDA49,
+ /* U+8D18 */ 0xDA4A, 0xDA4B, 0xDA4C, 0xDA4D, 0xDA4E, 0xB1B4, 0xD5EA, 0xB8BA,
+ /* U+8D20 */ 0xDA4F, 0xB9B1, 0xB2C6, 0xD4F0, 0xCFCD, 0xB0DC, 0xD5CB, 0xBBF5,
+ /* U+8D28 */ 0xD6CA, 0xB7B7, 0xCCB0, 0xC6B6, 0xB1E1, 0xB9BA, 0xD6FC, 0xB9E1,
+ /* U+8D30 */ 0xB7A1, 0xBCFA, 0xEADA, 0xEADB, 0xCCF9, 0xB9F3, 0xEADC, 0xB4FB,
+ /* U+8D38 */ 0xC3B3, 0xB7D1, 0xBAD8, 0xEADD, 0xD4F4, 0xEADE, 0xBCD6, 0xBBDF,
+ /* U+8D40 */ 0xEADF, 0xC1DE, 0xC2B8, 0xD4DF, 0xD7CA, 0xEAE0, 0xEAE1, 0xEAE4,
+ /* U+8D48 */ 0xEAE2, 0xEAE3, 0xC9DE, 0xB8B3, 0xB6C4, 0xEAE5, 0xCAEA, 0xC9CD,
+ /* U+8D50 */ 0xB4CD, 0xDA50, 0xDA51, 0xE2D9, 0xC5E2, 0xEAE6, 0xC0B5, 0xDA52,
+ /* U+8D58 */ 0xD7B8, 0xEAE7, 0xD7AC, 0xC8FC, 0xD8D3, 0xD8CD, 0xD4DE, 0xDA53,
+ /* U+8D60 */ 0xD4F9, 0xC9C4, 0xD3AE, 0xB8D3, 0xB3E0, 0xDA54, 0xC9E2, 0xF4F6,
+ /* U+8D68 */ 0xDA55, 0xDA56, 0xDA57, 0xBAD5, 0xDA58, 0xF4F7, 0xDA59, 0xDA5A,
+ /* U+8D70 */ 0xD7DF, 0xDA5B, 0xDA5C, 0xF4F1, 0xB8B0, 0xD5D4, 0xB8CF, 0xC6F0,
+ /* U+8D78 */ 0xDA5D, 0xDA5E, 0xDA5F, 0xDA60, 0xDA61, 0xDA62, 0xDA63, 0xDA64,
+ /* U+8D80 */ 0xDA65, 0xB3C3, 0xDA66, 0xDA67, 0xF4F2, 0xB3AC, 0xDA68, 0xDA69,
+ /* U+8D88 */ 0xDA6A, 0xDA6B, 0xD4BD, 0xC7F7, 0xDA6C, 0xDA6D, 0xDA6E, 0xDA6F,
+ /* U+8D90 */ 0xDA70, 0xF4F4, 0xDA71, 0xDA72, 0xF4F3, 0xDA73, 0xDA74, 0xDA75,
+ /* U+8D98 */ 0xDA76, 0xDA77, 0xDA78, 0xDA79, 0xDA7A, 0xDA7B, 0xDA7C, 0xCCCB,
+ /* U+8DA0 */ 0xDA7D, 0xDA7E, 0xDA80, 0xC8A4, 0xDA81, 0xDA82, 0xDA83, 0xDA84,
+ /* U+8DA8 */ 0xDA85, 0xDA86, 0xDA87, 0xDA88, 0xDA89, 0xDA8A, 0xDA8B, 0xDA8C,
+ /* U+8DB0 */ 0xDA8D, 0xF4F5, 0xDA8E, 0xD7E3, 0xC5BF, 0xF5C0, 0xDA8F, 0xDA90,
+ /* U+8DB8 */ 0xF5BB, 0xDA91, 0xF5C3, 0xDA92, 0xF5C2, 0xDA93, 0xD6BA, 0xF5C1,
+ /* U+8DC0 */ 0xDA94, 0xDA95, 0xDA96, 0xD4BE, 0xF5C4, 0xDA97, 0xF5CC, 0xDA98,
+ /* U+8DC8 */ 0xDA99, 0xDA9A, 0xDA9B, 0xB0CF, 0xB5F8, 0xDA9C, 0xF5C9, 0xF5CA,
+ /* U+8DD0 */ 0xDA9D, 0xC5DC, 0xDA9E, 0xDA9F, 0xDAA0, 0xDB40, 0xF5C5, 0xF5C6,
+ /* U+8DD8 */ 0xDB41, 0xDB42, 0xF5C7, 0xF5CB, 0xDB43, 0xBEE0, 0xF5C8, 0xB8FA,
+ /* U+8DE0 */ 0xDB44, 0xDB45, 0xDB46, 0xF5D0, 0xF5D3, 0xDB47, 0xDB48, 0xDB49,
+ /* U+8DE8 */ 0xBFE7, 0xDB4A, 0xB9F2, 0xF5BC, 0xF5CD, 0xDB4B, 0xDB4C, 0xC2B7,
+ /* U+8DF0 */ 0xDB4D, 0xDB4E, 0xDB4F, 0xCCF8, 0xDB50, 0xBCF9, 0xDB51, 0xF5CE,
+ /* U+8DF8 */ 0xF5CF, 0xF5D1, 0xB6E5, 0xF5D2, 0xDB52, 0xF5D5, 0xDB53, 0xDB54,
+ /* U+8E00 */ 0xDB55, 0xDB56, 0xDB57, 0xDB58, 0xDB59, 0xF5BD, 0xDB5A, 0xDB5B,
+ /* U+8E08 */ 0xDB5C, 0xF5D4, 0xD3BB, 0xDB5D, 0xB3EC, 0xDB5E, 0xDB5F, 0xCCA4,
+ /* U+8E10 */ 0xDB60, 0xDB61, 0xDB62, 0xDB63, 0xF5D6, 0xDB64, 0xDB65, 0xDB66,
+ /* U+8E18 */ 0xDB67, 0xDB68, 0xDB69, 0xDB6A, 0xDB6B, 0xF5D7, 0xBEE1, 0xF5D8,
+ /* U+8E20 */ 0xDB6C, 0xDB6D, 0xCCDF, 0xF5DB, 0xDB6E, 0xDB6F, 0xDB70, 0xDB71,
+ /* U+8E28 */ 0xDB72, 0xB2C8, 0xD7D9, 0xDB73, 0xF5D9, 0xDB74, 0xF5DA, 0xF5DC,
+ /* U+8E30 */ 0xDB75, 0xF5E2, 0xDB76, 0xDB77, 0xDB78, 0xF5E0, 0xDB79, 0xDB7A,
+ /* U+8E38 */ 0xDB7B, 0xF5DF, 0xF5DD, 0xDB7C, 0xDB7D, 0xF5E1, 0xDB7E, 0xDB80,
+ /* U+8E40 */ 0xF5DE, 0xF5E4, 0xF5E5, 0xDB81, 0xCCE3, 0xDB82, 0xDB83, 0xE5BF,
+ /* U+8E48 */ 0xB5B8, 0xF5E3, 0xF5E8, 0xCCA3, 0xDB84, 0xDB85, 0xDB86, 0xDB87,
+ /* U+8E50 */ 0xDB88, 0xF5E6, 0xF5E7, 0xDB89, 0xDB8A, 0xDB8B, 0xDB8C, 0xDB8D,
+ /* U+8E58 */ 0xDB8E, 0xF5BE, 0xDB8F, 0xDB90, 0xDB91, 0xDB92, 0xDB93, 0xDB94,
+ /* U+8E60 */ 0xDB95, 0xDB96, 0xDB97, 0xDB98, 0xDB99, 0xDB9A, 0xB1C4, 0xDB9B,
+ /* U+8E68 */ 0xDB9C, 0xF5BF, 0xDB9D, 0xDB9E, 0xB5C5, 0xB2E4, 0xDB9F, 0xF5EC,
+ /* U+8E70 */ 0xF5E9, 0xDBA0, 0xB6D7, 0xDC40, 0xF5ED, 0xDC41, 0xF5EA, 0xDC42,
+ /* U+8E78 */ 0xDC43, 0xDC44, 0xDC45, 0xDC46, 0xF5EB, 0xDC47, 0xDC48, 0xB4DA,
+ /* U+8E80 */ 0xDC49, 0xD4EA, 0xDC4A, 0xDC4B, 0xDC4C, 0xF5EE, 0xDC4D, 0xB3F9,
+ /* U+8E88 */ 0xDC4E, 0xDC4F, 0xDC50, 0xDC51, 0xDC52, 0xDC53, 0xDC54, 0xF5EF,
+ /* U+8E90 */ 0xF5F1, 0xDC55, 0xDC56, 0xDC57, 0xF5F0, 0xDC58, 0xDC59, 0xDC5A,
+ /* U+8E98 */ 0xDC5B, 0xDC5C, 0xDC5D, 0xDC5E, 0xF5F2, 0xDC5F, 0xF5F3, 0xDC60,
+ /* U+8EA0 */ 0xDC61, 0xDC62, 0xDC63, 0xDC64, 0xDC65, 0xDC66, 0xDC67, 0xDC68,
+ /* U+8EA8 */ 0xDC69, 0xDC6A, 0xDC6B, 0xC9ED, 0xB9AA, 0xDC6C, 0xDC6D, 0xC7FB,
+ /* U+8EB0 */ 0xDC6E, 0xDC6F, 0xB6E3, 0xDC70, 0xDC71, 0xDC72, 0xDC73, 0xDC74,
+ /* U+8EB8 */ 0xDC75, 0xDC76, 0xCCC9, 0xDC77, 0xDC78, 0xDC79, 0xDC7A, 0xDC7B,
+ /* U+8EC0 */ 0xDC7C, 0xDC7D, 0xDC7E, 0xDC80, 0xDC81, 0xDC82, 0xDC83, 0xDC84,
+ /* U+8EC8 */ 0xDC85, 0xDC86, 0xDC87, 0xDC88, 0xDC89, 0xDC8A, 0xEAA6, 0xDC8B,
+ /* U+8ED0 */ 0xDC8C, 0xDC8D, 0xDC8E, 0xDC8F, 0xDC90, 0xDC91, 0xDC92, 0xDC93,
+ /* U+8ED8 */ 0xDC94, 0xDC95, 0xDC96, 0xDC97, 0xDC98, 0xDC99, 0xDC9A, 0xDC9B,
+ /* U+8EE0 */ 0xDC9C, 0xDC9D, 0xDC9E, 0xDC9F, 0xDCA0, 0xDD40, 0xDD41, 0xDD42,
+ /* U+8EE8 */ 0xDD43, 0xDD44, 0xDD45, 0xDD46, 0xDD47, 0xDD48, 0xDD49, 0xDD4A,
+ /* U+8EF0 */ 0xDD4B, 0xDD4C, 0xDD4D, 0xDD4E, 0xDD4F, 0xDD50, 0xDD51, 0xDD52,
+ /* U+8EF8 */ 0xDD53, 0xDD54, 0xDD55, 0xDD56, 0xDD57, 0xDD58, 0xDD59, 0xDD5A,
+ /* U+8F00 */ 0xDD5B, 0xDD5C, 0xDD5D, 0xDD5E, 0xDD5F, 0xDD60, 0xDD61, 0xDD62,
+ /* U+8F08 */ 0xDD63, 0xDD64, 0xDD65, 0xDD66, 0xDD67, 0xDD68, 0xDD69, 0xDD6A,
+ /* U+8F10 */ 0xDD6B, 0xDD6C, 0xDD6D, 0xDD6E, 0xDD6F, 0xDD70, 0xDD71, 0xDD72,
+ /* U+8F18 */ 0xDD73, 0xDD74, 0xDD75, 0xDD76, 0xDD77, 0xDD78, 0xDD79, 0xDD7A,
+ /* U+8F20 */ 0xDD7B, 0xDD7C, 0xDD7D, 0xDD7E, 0xDD80, 0xDD81, 0xDD82, 0xDD83,
+ /* U+8F28 */ 0xDD84, 0xDD85, 0xDD86, 0xDD87, 0xDD88, 0xDD89, 0xDD8A, 0xDD8B,
+ /* U+8F30 */ 0xDD8C, 0xDD8D, 0xDD8E, 0xDD8F, 0xDD90, 0xDD91, 0xDD92, 0xDD93,
+ /* U+8F38 */ 0xDD94, 0xDD95, 0xDD96, 0xDD97, 0xDD98, 0xDD99, 0xDD9A, 0xDD9B,
+ /* U+8F40 */ 0xDD9C, 0xDD9D, 0xDD9E, 0xDD9F, 0xDDA0, 0xDE40, 0xDE41, 0xDE42,
+ /* U+8F48 */ 0xDE43, 0xDE44, 0xDE45, 0xDE46, 0xDE47, 0xDE48, 0xDE49, 0xDE4A,
+ /* U+8F50 */ 0xDE4B, 0xDE4C, 0xDE4D, 0xDE4E, 0xDE4F, 0xDE50, 0xDE51, 0xDE52,
+ /* U+8F58 */ 0xDE53, 0xDE54, 0xDE55, 0xDE56, 0xDE57, 0xDE58, 0xDE59, 0xDE5A,
+ /* U+8F60 */ 0xDE5B, 0xDE5C, 0xDE5D, 0xDE5E, 0xDE5F, 0xDE60, 0xB3B5, 0xD4FE,
+ /* U+8F68 */ 0xB9EC, 0xD0F9, 0xDE61, 0xE9ED, 0xD7AA, 0xE9EE, 0xC2D6, 0xC8ED,
+ /* U+8F70 */ 0xBAE4, 0xE9EF, 0xE9F0, 0xE9F1, 0xD6E1, 0xE9F2, 0xE9F3, 0xE9F5,
+ /* U+8F78 */ 0xE9F4, 0xE9F6, 0xE9F7, 0xC7E1, 0xE9F8, 0xD4D8, 0xE9F9, 0xBDCE,
+ /* U+8F80 */ 0xDE62, 0xE9FA, 0xE9FB, 0xBDCF, 0xE9FC, 0xB8A8, 0xC1BE, 0xE9FD,
+ /* U+8F88 */ 0xB1B2, 0xBBD4, 0xB9F5, 0xE9FE, 0xDE63, 0xEAA1, 0xEAA2, 0xEAA3,
+ /* U+8F90 */ 0xB7F8, 0xBCAD, 0xDE64, 0xCAE4, 0xE0CE, 0xD4AF, 0xCFBD, 0xD5B7,
+ /* U+8F98 */ 0xEAA4, 0xD5DE, 0xEAA5, 0xD0C1, 0xB9BC, 0xDE65, 0xB4C7, 0xB1D9,
+ /* U+8FA0 */ 0xDE66, 0xDE67, 0xDE68, 0xC0B1, 0xDE69, 0xDE6A, 0xDE6B, 0xDE6C,
+ /* U+8FA8 */ 0xB1E6, 0xB1E7, 0xDE6D, 0xB1E8, 0xDE6E, 0xDE6F, 0xDE70, 0xDE71,
+ /* U+8FB0 */ 0xB3BD, 0xC8E8, 0xDE72, 0xDE73, 0xDE74, 0xDE75, 0xE5C1, 0xDE76,
+ /* U+8FB8 */ 0xDE77, 0xB1DF, 0xDE78, 0xDE79, 0xDE7A, 0xC1C9, 0xB4EF, 0xDE7B,
+ /* U+8FC0 */ 0xDE7C, 0xC7A8, 0xD3D8, 0xDE7D, 0xC6F9, 0xD1B8, 0xDE7E, 0xB9FD,
+ /* U+8FC8 */ 0xC2F5, 0xDE80, 0xDE81, 0xDE82, 0xDE83, 0xDE84, 0xD3AD, 0xDE85,
+ /* U+8FD0 */ 0xD4CB, 0xBDFC, 0xDE86, 0xE5C2, 0xB7B5, 0xE5C3, 0xDE87, 0xDE88,
+ /* U+8FD8 */ 0xBBB9, 0xD5E2, 0xDE89, 0xBDF8, 0xD4B6, 0xCEA5, 0xC1AC, 0xB3D9,
+ /* U+8FE0 */ 0xDE8A, 0xDE8B, 0xCCF6, 0xDE8C, 0xE5C6, 0xE5C4, 0xE5C8, 0xDE8D,
+ /* U+8FE8 */ 0xE5CA, 0xE5C7, 0xB5CF, 0xC6C8, 0xDE8E, 0xB5FC, 0xE5C5, 0xDE8F,
+ /* U+8FF0 */ 0xCAF6, 0xDE90, 0xDE91, 0xE5C9, 0xDE92, 0xDE93, 0xDE94, 0xC3D4,
+ /* U+8FF8 */ 0xB1C5, 0xBCA3, 0xDE95, 0xDE96, 0xDE97, 0xD7B7, 0xDE98, 0xDE99,
+ /* U+9000 */ 0xCDCB, 0xCBCD, 0xCACA, 0xCCD3, 0xE5CC, 0xE5CB, 0xC4E6, 0xDE9A,
+ /* U+9008 */ 0xDE9B, 0xD1A1, 0xD1B7, 0xE5CD, 0xDE9C, 0xE5D0, 0xDE9D, 0xCDB8,
+ /* U+9010 */ 0xD6F0, 0xE5CF, 0xB5DD, 0xDE9E, 0xCDBE, 0xDE9F, 0xE5D1, 0xB6BA,
+ /* U+9018 */ 0xDEA0, 0xDF40, 0xCDA8, 0xB9E4, 0xDF41, 0xCAC5, 0xB3D1, 0xCBD9,
+ /* U+9020 */ 0xD4EC, 0xE5D2, 0xB7EA, 0xDF42, 0xDF43, 0xDF44, 0xE5CE, 0xDF45,
+ /* U+9028 */ 0xDF46, 0xDF47, 0xDF48, 0xDF49, 0xDF4A, 0xE5D5, 0xB4FE, 0xE5D6,
+ /* U+9030 */ 0xDF4B, 0xDF4C, 0xDF4D, 0xDF4E, 0xDF4F, 0xE5D3, 0xE5D4, 0xDF50,
+ /* U+9038 */ 0xD2DD, 0xDF51, 0xDF52, 0xC2DF, 0xB1C6, 0xDF53, 0xD3E2, 0xDF54,
+ /* U+9040 */ 0xDF55, 0xB6DD, 0xCBEC, 0xDF56, 0xE5D7, 0xDF57, 0xDF58, 0xD3F6,
+ /* U+9048 */ 0xDF59, 0xDF5A, 0xDF5B, 0xDF5C, 0xDF5D, 0xB1E9, 0xDF5E, 0xB6F4,
+ /* U+9050 */ 0xE5DA, 0xE5D8, 0xE5D9, 0xB5C0, 0xDF5F, 0xDF60, 0xDF61, 0xD2C5,
+ /* U+9058 */ 0xE5DC, 0xDF62, 0xDF63, 0xE5DE, 0xDF64, 0xDF65, 0xDF66, 0xDF67,
+ /* U+9060 */ 0xDF68, 0xDF69, 0xE5DD, 0xC7B2, 0xDF6A, 0xD2A3, 0xDF6B, 0xDF6C,
+ /* U+9068 */ 0xE5DB, 0xDF6D, 0xDF6E, 0xDF6F, 0xDF70, 0xD4E2, 0xD5DA, 0xDF71,
+ /* U+9070 */ 0xDF72, 0xDF73, 0xDF74, 0xDF75, 0xE5E0, 0xD7F1, 0xDF76, 0xDF77,
+ /* U+9078 */ 0xDF78, 0xDF79, 0xDF7A, 0xDF7B, 0xDF7C, 0xE5E1, 0xDF7D, 0xB1DC,
+ /* U+9080 */ 0xD1FB, 0xDF7E, 0xE5E2, 0xE5E4, 0xDF80, 0xDF81, 0xDF82, 0xDF83,
+ /* U+9088 */ 0xE5E3, 0xDF84, 0xDF85, 0xE5E5, 0xDF86, 0xDF87, 0xDF88, 0xDF89,
+ /* U+9090 */ 0xDF8A, 0xD2D8, 0xDF8B, 0xB5CB, 0xDF8C, 0xE7DF, 0xDF8D, 0xDAF5,
+ /* U+9098 */ 0xDF8E, 0xDAF8, 0xDF8F, 0xDAF6, 0xDF90, 0xDAF7, 0xDF91, 0xDF92,
+ /* U+90A0 */ 0xDF93, 0xDAFA, 0xD0CF, 0xC4C7, 0xDF94, 0xDF95, 0xB0EE, 0xDF96,
+ /* U+90A8 */ 0xDF97, 0xDF98, 0xD0B0, 0xDF99, 0xDAF9, 0xDF9A, 0xD3CA, 0xBAAA,
+ /* U+90B0 */ 0xDBA2, 0xC7F1, 0xDF9B, 0xDAFC, 0xDAFB, 0xC9DB, 0xDAFD, 0xDF9C,
+ /* U+90B8 */ 0xDBA1, 0xD7DE, 0xDAFE, 0xC1DA, 0xDF9D, 0xDF9E, 0xDBA5, 0xDF9F,
+ /* U+90C0 */ 0xDFA0, 0xD3F4, 0xE040, 0xE041, 0xDBA7, 0xDBA4, 0xE042, 0xDBA8,
+ /* U+90C8 */ 0xE043, 0xE044, 0xBDBC, 0xE045, 0xE046, 0xE047, 0xC0C9, 0xDBA3,
+ /* U+90D0 */ 0xDBA6, 0xD6A3, 0xE048, 0xDBA9, 0xE049, 0xE04A, 0xE04B, 0xDBAD,
+ /* U+90D8 */ 0xE04C, 0xE04D, 0xE04E, 0xDBAE, 0xDBAC, 0xBAC2, 0xE04F, 0xE050,
+ /* U+90E0 */ 0xE051, 0xBFA4, 0xDBAB, 0xE052, 0xE053, 0xE054, 0xDBAA, 0xD4C7,
+ /* U+90E8 */ 0xB2BF, 0xE055, 0xE056, 0xDBAF, 0xE057, 0xB9F9, 0xE058, 0xDBB0,
+ /* U+90F0 */ 0xE059, 0xE05A, 0xE05B, 0xE05C, 0xB3BB, 0xE05D, 0xE05E, 0xE05F,
+ /* U+90F8 */ 0xB5A6, 0xE060, 0xE061, 0xE062, 0xE063, 0xB6BC, 0xDBB1, 0xE064,
+ /* U+9100 */ 0xE065, 0xE066, 0xB6F5, 0xE067, 0xDBB2, 0xE068, 0xE069, 0xE06A,
+ /* U+9108 */ 0xE06B, 0xE06C, 0xE06D, 0xE06E, 0xE06F, 0xE070, 0xE071, 0xE072,
+ /* U+9110 */ 0xE073, 0xE074, 0xE075, 0xE076, 0xE077, 0xE078, 0xE079, 0xE07A,
+ /* U+9118 */ 0xE07B, 0xB1C9, 0xE07C, 0xE07D, 0xE07E, 0xE080, 0xDBB4, 0xE081,
+ /* U+9120 */ 0xE082, 0xE083, 0xDBB3, 0xDBB5, 0xE084, 0xE085, 0xE086, 0xE087,
+ /* U+9128 */ 0xE088, 0xE089, 0xE08A, 0xE08B, 0xE08C, 0xE08D, 0xE08E, 0xDBB7,
+ /* U+9130 */ 0xE08F, 0xDBB6, 0xE090, 0xE091, 0xE092, 0xE093, 0xE094, 0xE095,
+ /* U+9138 */ 0xE096, 0xDBB8, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C,
+ /* U+9140 */ 0xE09D, 0xE09E, 0xE09F, 0xDBB9, 0xE0A0, 0xE140, 0xDBBA, 0xE141,
+ /* U+9148 */ 0xE142, 0xD3CF, 0xF4FA, 0xC7F5, 0xD7C3, 0xC5E4, 0xF4FC, 0xF4FD,
+ /* U+9150 */ 0xF4FB, 0xE143, 0xBEC6, 0xE144, 0xE145, 0xE146, 0xE147, 0xD0EF,
+ /* U+9158 */ 0xE148, 0xE149, 0xB7D3, 0xE14A, 0xE14B, 0xD4CD, 0xCCAA, 0xE14C,
+ /* U+9160 */ 0xE14D, 0xF5A2, 0xF5A1, 0xBAA8, 0xF4FE, 0xCBD6, 0xE14E, 0xE14F,
+ /* U+9168 */ 0xE150, 0xF5A4, 0xC0D2, 0xE151, 0xB3EA, 0xE152, 0xCDAA, 0xF5A5,
+ /* U+9170 */ 0xF5A3, 0xBDB4, 0xF5A8, 0xE153, 0xF5A9, 0xBDCD, 0xC3B8, 0xBFE1,
+ /* U+9178 */ 0xCBE1, 0xF5AA, 0xE154, 0xE155, 0xE156, 0xF5A6, 0xF5A7, 0xC4F0,
+ /* U+9180 */ 0xE157, 0xE158, 0xE159, 0xE15A, 0xE15B, 0xF5AC, 0xE15C, 0xB4BC,
+ /* U+9188 */ 0xE15D, 0xD7ED, 0xE15E, 0xB4D7, 0xF5AB, 0xF5AE, 0xE15F, 0xE160,
+ /* U+9190 */ 0xF5AD, 0xF5AF, 0xD0D1, 0xE161, 0xE162, 0xE163, 0xE164, 0xE165,
+ /* U+9198 */ 0xE166, 0xE167, 0xC3D1, 0xC8A9, 0xE168, 0xE169, 0xE16A, 0xE16B,
+ /* U+91A0 */ 0xE16C, 0xE16D, 0xF5B0, 0xF5B1, 0xE16E, 0xE16F, 0xE170, 0xE171,
+ /* U+91A8 */ 0xE172, 0xE173, 0xF5B2, 0xE174, 0xE175, 0xF5B3, 0xF5B4, 0xF5B5,
+ /* U+91B0 */ 0xE176, 0xE177, 0xE178, 0xE179, 0xF5B7, 0xF5B6, 0xE17A, 0xE17B,
+ /* U+91B8 */ 0xE17C, 0xE17D, 0xF5B8, 0xE17E, 0xE180, 0xE181, 0xE182, 0xE183,
+ /* U+91C0 */ 0xE184, 0xE185, 0xE186, 0xE187, 0xE188, 0xE189, 0xE18A, 0xB2C9,
+ /* U+91C8 */ 0xE18B, 0xD3D4, 0xCACD, 0xE18C, 0xC0EF, 0xD6D8, 0xD2B0, 0xC1BF,
+ /* U+91D0 */ 0xE18D, 0xBDF0, 0xE18E, 0xE18F, 0xE190, 0xE191, 0xE192, 0xE193,
+ /* U+91D8 */ 0xE194, 0xE195, 0xE196, 0xE197, 0xB8AA, 0xE198, 0xE199, 0xE19A,
+ /* U+91E0 */ 0xE19B, 0xE19C, 0xE19D, 0xE19E, 0xE19F, 0xE1A0, 0xE240, 0xE241,
+ /* U+91E8 */ 0xE242, 0xE243, 0xE244, 0xE245, 0xE246, 0xE247, 0xE248, 0xE249,
+ /* U+91F0 */ 0xE24A, 0xE24B, 0xE24C, 0xE24D, 0xE24E, 0xE24F, 0xE250, 0xE251,
+ /* U+91F8 */ 0xE252, 0xE253, 0xE254, 0xE255, 0xE256, 0xE257, 0xE258, 0xE259,
+ /* U+9200 */ 0xE25A, 0xE25B, 0xE25C, 0xE25D, 0xE25E, 0xE25F, 0xE260, 0xE261,
+ /* U+9208 */ 0xE262, 0xE263, 0xE264, 0xE265, 0xE266, 0xE267, 0xE268, 0xE269,
+ /* U+9210 */ 0xE26A, 0xE26B, 0xE26C, 0xE26D, 0xE26E, 0xE26F, 0xE270, 0xE271,
+ /* U+9218 */ 0xE272, 0xE273, 0xE274, 0xE275, 0xE276, 0xE277, 0xE278, 0xE279,
+ /* U+9220 */ 0xE27A, 0xE27B, 0xE27C, 0xE27D, 0xE27E, 0xE280, 0xE281, 0xE282,
+ /* U+9228 */ 0xE283, 0xE284, 0xE285, 0xE286, 0xE287, 0xE288, 0xE289, 0xE28A,
+ /* U+9230 */ 0xE28B, 0xE28C, 0xE28D, 0xE28E, 0xE28F, 0xE290, 0xE291, 0xE292,
+ /* U+9238 */ 0xE293, 0xE294, 0xE295, 0xE296, 0xE297, 0xE298, 0xE299, 0xE29A,
+ /* U+9240 */ 0xE29B, 0xE29C, 0xE29D, 0xE29E, 0xE29F, 0xE2A0, 0xE340, 0xE341,
+ /* U+9248 */ 0xE342, 0xE343, 0xE344, 0xE345, 0xE346, 0xE347, 0xE348, 0xE349,
+ /* U+9250 */ 0xE34A, 0xE34B, 0xE34C, 0xE34D, 0xE34E, 0xE34F, 0xE350, 0xE351,
+ /* U+9258 */ 0xE352, 0xE353, 0xE354, 0xE355, 0xE356, 0xE357, 0xE358, 0xE359,
+ /* U+9260 */ 0xE35A, 0xE35B, 0xE35C, 0xE35D, 0xE35E, 0xE35F, 0xE360, 0xE361,
+ /* U+9268 */ 0xE362, 0xE363, 0xE364, 0xE365, 0xE366, 0xE367, 0xE368, 0xE369,
+ /* U+9270 */ 0xE36A, 0xE36B, 0xE36C, 0xE36D, 0xBCF8, 0xE36E, 0xE36F, 0xE370,
+ /* U+9278 */ 0xE371, 0xE372, 0xE373, 0xE374, 0xE375, 0xE376, 0xE377, 0xE378,
+ /* U+9280 */ 0xE379, 0xE37A, 0xE37B, 0xE37C, 0xE37D, 0xE37E, 0xE380, 0xE381,
+ /* U+9288 */ 0xE382, 0xE383, 0xE384, 0xE385, 0xE386, 0xE387, 0xF6C6, 0xE388,
+ /* U+9290 */ 0xE389, 0xE38A, 0xE38B, 0xE38C, 0xE38D, 0xE38E, 0xE38F, 0xE390,
+ /* U+9298 */ 0xE391, 0xE392, 0xE393, 0xE394, 0xE395, 0xE396, 0xE397, 0xE398,
+ /* U+92A0 */ 0xE399, 0xE39A, 0xE39B, 0xE39C, 0xE39D, 0xE39E, 0xE39F, 0xE3A0,
+ /* U+92A8 */ 0xE440, 0xE441, 0xE442, 0xE443, 0xE444, 0xE445, 0xF6C7, 0xE446,
+ /* U+92B0 */ 0xE447, 0xE448, 0xE449, 0xE44A, 0xE44B, 0xE44C, 0xE44D, 0xE44E,
+ /* U+92B8 */ 0xE44F, 0xE450, 0xE451, 0xE452, 0xE453, 0xE454, 0xE455, 0xE456,
+ /* U+92C0 */ 0xE457, 0xE458, 0xE459, 0xE45A, 0xE45B, 0xE45C, 0xE45D, 0xE45E,
+ /* U+92C8 */ 0xF6C8, 0xE45F, 0xE460, 0xE461, 0xE462, 0xE463, 0xE464, 0xE465,
+ /* U+92D0 */ 0xE466, 0xE467, 0xE468, 0xE469, 0xE46A, 0xE46B, 0xE46C, 0xE46D,
+ /* U+92D8 */ 0xE46E, 0xE46F, 0xE470, 0xE471, 0xE472, 0xE473, 0xE474, 0xE475,
+ /* U+92E0 */ 0xE476, 0xE477, 0xE478, 0xE479, 0xE47A, 0xE47B, 0xE47C, 0xE47D,
+ /* U+92E8 */ 0xE47E, 0xE480, 0xE481, 0xE482, 0xE483, 0xE484, 0xE485, 0xE486,
+ /* U+92F0 */ 0xE487, 0xE488, 0xE489, 0xE48A, 0xE48B, 0xE48C, 0xE48D, 0xE48E,
+ /* U+92F8 */ 0xE48F, 0xE490, 0xE491, 0xE492, 0xE493, 0xE494, 0xE495, 0xE496,
+ /* U+9300 */ 0xE497, 0xE498, 0xE499, 0xE49A, 0xE49B, 0xE49C, 0xE49D, 0xE49E,
+ /* U+9308 */ 0xE49F, 0xE4A0, 0xE540, 0xE541, 0xE542, 0xE543, 0xE544, 0xE545,
+ /* U+9310 */ 0xE546, 0xE547, 0xE548, 0xE549, 0xE54A, 0xE54B, 0xE54C, 0xE54D,
+ /* U+9318 */ 0xE54E, 0xE54F, 0xE550, 0xE551, 0xE552, 0xE553, 0xE554, 0xE555,
+ /* U+9320 */ 0xE556, 0xE557, 0xE558, 0xE559, 0xE55A, 0xE55B, 0xE55C, 0xE55D,
+ /* U+9328 */ 0xE55E, 0xE55F, 0xE560, 0xE561, 0xE562, 0xE563, 0xE564, 0xE565,
+ /* U+9330 */ 0xE566, 0xE567, 0xE568, 0xE569, 0xE56A, 0xE56B, 0xE56C, 0xE56D,
+ /* U+9338 */ 0xE56E, 0xE56F, 0xE570, 0xE571, 0xE572, 0xE573, 0xF6C9, 0xE574,
+ /* U+9340 */ 0xE575, 0xE576, 0xE577, 0xE578, 0xE579, 0xE57A, 0xE57B, 0xE57C,
+ /* U+9348 */ 0xE57D, 0xE57E, 0xE580, 0xE581, 0xE582, 0xE583, 0xE584, 0xE585,
+ /* U+9350 */ 0xE586, 0xE587, 0xE588, 0xE589, 0xE58A, 0xE58B, 0xE58C, 0xE58D,
+ /* U+9358 */ 0xE58E, 0xE58F, 0xE590, 0xE591, 0xE592, 0xE593, 0xE594, 0xE595,
+ /* U+9360 */ 0xE596, 0xE597, 0xE598, 0xE599, 0xE59A, 0xE59B, 0xE59C, 0xE59D,
+ /* U+9368 */ 0xE59E, 0xE59F, 0xF6CA, 0xE5A0, 0xE640, 0xE641, 0xE642, 0xE643,
+ /* U+9370 */ 0xE644, 0xE645, 0xE646, 0xE647, 0xE648, 0xE649, 0xE64A, 0xE64B,
+ /* U+9378 */ 0xE64C, 0xE64D, 0xE64E, 0xE64F, 0xE650, 0xE651, 0xE652, 0xE653,
+ /* U+9380 */ 0xE654, 0xE655, 0xE656, 0xE657, 0xE658, 0xE659, 0xE65A, 0xE65B,
+ /* U+9388 */ 0xE65C, 0xE65D, 0xE65E, 0xE65F, 0xE660, 0xE661, 0xE662, 0xF6CC,
+ /* U+9390 */ 0xE663, 0xE664, 0xE665, 0xE666, 0xE667, 0xE668, 0xE669, 0xE66A,
+ /* U+9398 */ 0xE66B, 0xE66C, 0xE66D, 0xE66E, 0xE66F, 0xE670, 0xE671, 0xE672,
+ /* U+93A0 */ 0xE673, 0xE674, 0xE675, 0xE676, 0xE677, 0xE678, 0xE679, 0xE67A,
+ /* U+93A8 */ 0xE67B, 0xE67C, 0xE67D, 0xE67E, 0xE680, 0xE681, 0xE682, 0xE683,
+ /* U+93B0 */ 0xE684, 0xE685, 0xE686, 0xE687, 0xE688, 0xE689, 0xE68A, 0xE68B,
+ /* U+93B8 */ 0xE68C, 0xE68D, 0xE68E, 0xE68F, 0xE690, 0xE691, 0xE692, 0xE693,
+ /* U+93C0 */ 0xE694, 0xE695, 0xE696, 0xE697, 0xE698, 0xE699, 0xE69A, 0xE69B,
+ /* U+93C8 */ 0xE69C, 0xE69D, 0xF6CB, 0xE69E, 0xE69F, 0xE6A0, 0xE740, 0xE741,
+ /* U+93D0 */ 0xE742, 0xE743, 0xE744, 0xE745, 0xE746, 0xE747, 0xF7E9, 0xE748,
+ /* U+93D8 */ 0xE749, 0xE74A, 0xE74B, 0xE74C, 0xE74D, 0xE74E, 0xE74F, 0xE750,
+ /* U+93E0 */ 0xE751, 0xE752, 0xE753, 0xE754, 0xE755, 0xE756, 0xE757, 0xE758,
+ /* U+93E8 */ 0xE759, 0xE75A, 0xE75B, 0xE75C, 0xE75D, 0xE75E, 0xE75F, 0xE760,
+ /* U+93F0 */ 0xE761, 0xE762, 0xE763, 0xE764, 0xE765, 0xE766, 0xE767, 0xE768,
+ /* U+93F8 */ 0xE769, 0xE76A, 0xE76B, 0xE76C, 0xE76D, 0xE76E, 0xE76F, 0xE770,
+ /* U+9400 */ 0xE771, 0xE772, 0xE773, 0xE774, 0xE775, 0xE776, 0xE777, 0xE778,
+ /* U+9408 */ 0xE779, 0xE77A, 0xE77B, 0xE77C, 0xE77D, 0xE77E, 0xE780, 0xE781,
+ /* U+9410 */ 0xE782, 0xE783, 0xE784, 0xE785, 0xE786, 0xE787, 0xE788, 0xE789,
+ /* U+9418 */ 0xE78A, 0xE78B, 0xE78C, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791,
+ /* U+9420 */ 0xE792, 0xE793, 0xE794, 0xE795, 0xE796, 0xE797, 0xE798, 0xE799,
+ /* U+9428 */ 0xE79A, 0xE79B, 0xE79C, 0xE79D, 0xE79E, 0xE79F, 0xE7A0, 0xE840,
+ /* U+9430 */ 0xE841, 0xE842, 0xE843, 0xE844, 0xE845, 0xE846, 0xE847, 0xE848,
+ /* U+9438 */ 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, 0xE84E, 0xF6CD, 0xE84F,
+ /* U+9440 */ 0xE850, 0xE851, 0xE852, 0xE853, 0xE854, 0xE855, 0xE856, 0xE857,
+ /* U+9448 */ 0xE858, 0xE859, 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, 0xE85F,
+ /* U+9450 */ 0xE860, 0xE861, 0xE862, 0xE863, 0xE864, 0xE865, 0xE866, 0xE867,
+ /* U+9458 */ 0xE868, 0xE869, 0xE86A, 0xE86B, 0xE86C, 0xE86D, 0xE86E, 0xE86F,
+ /* U+9460 */ 0xE870, 0xE871, 0xE872, 0xE873, 0xE874, 0xE875, 0xE876, 0xE877,
+ /* U+9468 */ 0xE878, 0xE879, 0xE87A, 0xF6CE, 0xE87B, 0xE87C, 0xE87D, 0xE87E,
+ /* U+9470 */ 0xE880, 0xE881, 0xE882, 0xE883, 0xE884, 0xE885, 0xE886, 0xE887,
+ /* U+9478 */ 0xE888, 0xE889, 0xE88A, 0xE88B, 0xE88C, 0xE88D, 0xE88E, 0xE88F,
+ /* U+9480 */ 0xE890, 0xE891, 0xE892, 0xE893, 0xE894, 0xEEC4, 0xEEC5, 0xEEC6,
+ /* U+9488 */ 0xD5EB, 0xB6A4, 0xEEC8, 0xEEC7, 0xEEC9, 0xEECA, 0xC7A5, 0xEECB,
+ /* U+9490 */ 0xEECC, 0xE895, 0xB7B0, 0xB5F6, 0xEECD, 0xEECF, 0xE896, 0xEECE,
+ /* U+9498 */ 0xE897, 0xB8C6, 0xEED0, 0xEED1, 0xEED2, 0xB6DB, 0xB3AE, 0xD6D3,
+ /* U+94A0 */ 0xC4C6, 0xB1B5, 0xB8D6, 0xEED3, 0xEED4, 0xD4BF, 0xC7D5, 0xBEFB,
+ /* U+94A8 */ 0xCED9, 0xB9B3, 0xEED6, 0xEED5, 0xEED8, 0xEED7, 0xC5A5, 0xEED9,
+ /* U+94B0 */ 0xEEDA, 0xC7AE, 0xEEDB, 0xC7AF, 0xEEDC, 0xB2A7, 0xEEDD, 0xEEDE,
+ /* U+94B8 */ 0xEEDF, 0xEEE0, 0xEEE1, 0xD7EA, 0xEEE2, 0xEEE3, 0xBCD8, 0xEEE4,
+ /* U+94C0 */ 0xD3CB, 0xCCFA, 0xB2AC, 0xC1E5, 0xEEE5, 0xC7A6, 0xC3AD, 0xE898,
+ /* U+94C8 */ 0xEEE6, 0xEEE7, 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB, 0xEEEC, 0xE899,
+ /* U+94D0 */ 0xEEED, 0xEEEE, 0xEEEF, 0xE89A, 0xE89B, 0xEEF0, 0xEEF1, 0xEEF2,
+ /* U+94D8 */ 0xEEF4, 0xEEF3, 0xE89C, 0xEEF5, 0xCDAD, 0xC2C1, 0xEEF6, 0xEEF7,
+ /* U+94E0 */ 0xEEF8, 0xD5A1, 0xEEF9, 0xCFB3, 0xEEFA, 0xEEFB, 0xE89D, 0xEEFC,
+ /* U+94E8 */ 0xEEFD, 0xEFA1, 0xEEFE, 0xEFA2, 0xB8F5, 0xC3FA, 0xEFA3, 0xEFA4,
+ /* U+94F0 */ 0xBDC2, 0xD2BF, 0xB2F9, 0xEFA5, 0xEFA6, 0xEFA7, 0xD2F8, 0xEFA8,
+ /* U+94F8 */ 0xD6FD, 0xEFA9, 0xC6CC, 0xE89E, 0xEFAA, 0xEFAB, 0xC1B4, 0xEFAC,
+ /* U+9500 */ 0xCFFA, 0xCBF8, 0xEFAE, 0xEFAD, 0xB3FA, 0xB9F8, 0xEFAF, 0xEFB0,
+ /* U+9508 */ 0xD0E2, 0xEFB1, 0xEFB2, 0xB7E6, 0xD0BF, 0xEFB3, 0xEFB4, 0xEFB5,
+ /* U+9510 */ 0xC8F1, 0xCCE0, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9, 0xEFBA, 0xD5E0,
+ /* U+9518 */ 0xEFBB, 0xB4ED, 0xC3AA, 0xEFBC, 0xE89F, 0xEFBD, 0xEFBE, 0xEFBF,
+ /* U+9520 */ 0xE8A0, 0xCEFD, 0xEFC0, 0xC2E0, 0xB4B8, 0xD7B6, 0xBDF5, 0xE940,
+ /* U+9528 */ 0xCFC7, 0xEFC3, 0xEFC1, 0xEFC2, 0xEFC4, 0xB6A7, 0xBCFC, 0xBEE2,
+ /* U+9530 */ 0xC3CC, 0xEFC5, 0xEFC6, 0xE941, 0xEFC7, 0xEFCF, 0xEFC8, 0xEFC9,
+ /* U+9538 */ 0xEFCA, 0xC7C2, 0xEFF1, 0xB6CD, 0xEFCB, 0xE942, 0xEFCC, 0xEFCD,
+ /* U+9540 */ 0xB6C6, 0xC3BE, 0xEFCE, 0xE943, 0xEFD0, 0xEFD1, 0xEFD2, 0xD5F2,
+ /* U+9548 */ 0xE944, 0xEFD3, 0xC4F7, 0xE945, 0xEFD4, 0xC4F8, 0xEFD5, 0xEFD6,
+ /* U+9550 */ 0xB8E4, 0xB0F7, 0xEFD7, 0xEFD8, 0xEFD9, 0xE946, 0xEFDA, 0xEFDB,
+ /* U+9558 */ 0xEFDC, 0xEFDD, 0xE947, 0xEFDE, 0xBEB5, 0xEFE1, 0xEFDF, 0xEFE0,
+ /* U+9560 */ 0xE948, 0xEFE2, 0xEFE3, 0xC1CD, 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7,
+ /* U+9568 */ 0xEFE8, 0xEFE9, 0xEFEA, 0xEFEB, 0xEFEC, 0xC0D8, 0xE949, 0xEFED,
+ /* U+9570 */ 0xC1AD, 0xEFEE, 0xEFEF, 0xEFF0, 0xE94A, 0xE94B, 0xCFE2, 0xE94C,
+ /* U+9578 */ 0xE94D, 0xE94E, 0xE94F, 0xE950, 0xE951, 0xE952, 0xE953, 0xB3A4,
+ /* U+9580 */ 0xE954, 0xE955, 0xE956, 0xE957, 0xE958, 0xE959, 0xE95A, 0xE95B,
+ /* U+9588 */ 0xE95C, 0xE95D, 0xE95E, 0xE95F, 0xE960, 0xE961, 0xE962, 0xE963,
+ /* U+9590 */ 0xE964, 0xE965, 0xE966, 0xE967, 0xE968, 0xE969, 0xE96A, 0xE96B,
+ /* U+9598 */ 0xE96C, 0xE96D, 0xE96E, 0xE96F, 0xE970, 0xE971, 0xE972, 0xE973,
+ /* U+95A0 */ 0xE974, 0xE975, 0xE976, 0xE977, 0xE978, 0xE979, 0xE97A, 0xE97B,
+ /* U+95A8 */ 0xE97C, 0xE97D, 0xE97E, 0xE980, 0xE981, 0xE982, 0xE983, 0xE984,
+ /* U+95B0 */ 0xE985, 0xE986, 0xE987, 0xE988, 0xE989, 0xE98A, 0xE98B, 0xE98C,
+ /* U+95B8 */ 0xE98D, 0xE98E, 0xE98F, 0xE990, 0xE991, 0xE992, 0xE993, 0xE994,
+ /* U+95C0 */ 0xE995, 0xE996, 0xE997, 0xE998, 0xE999, 0xE99A, 0xE99B, 0xE99C,
+ /* U+95C8 */ 0xE99D, 0xE99E, 0xE99F, 0xE9A0, 0xEA40, 0xEA41, 0xEA42, 0xEA43,
+ /* U+95D0 */ 0xEA44, 0xEA45, 0xEA46, 0xEA47, 0xEA48, 0xEA49, 0xEA4A, 0xEA4B,
+ /* U+95D8 */ 0xEA4C, 0xEA4D, 0xEA4E, 0xEA4F, 0xEA50, 0xEA51, 0xEA52, 0xEA53,
+ /* U+95E0 */ 0xEA54, 0xEA55, 0xEA56, 0xEA57, 0xEA58, 0xEA59, 0xEA5A, 0xEA5B,
+ /* U+95E8 */ 0xC3C5, 0xE3C5, 0xC9C1, 0xE3C6, 0xEA5C, 0xB1D5, 0xCECA, 0xB4B3,
+ /* U+95F0 */ 0xC8F2, 0xE3C7, 0xCFD0, 0xE3C8, 0xBCE4, 0xE3C9, 0xE3CA, 0xC3C6,
+ /* U+95F8 */ 0xD5A2, 0xC4D6, 0xB9EB, 0xCEC5, 0xE3CB, 0xC3F6, 0xE3CC, 0xEA5D,
+ /* U+9600 */ 0xB7A7, 0xB8F3, 0xBAD2, 0xE3CD, 0xE3CE, 0xD4C4, 0xE3CF, 0xEA5E,
+ /* U+9608 */ 0xE3D0, 0xD1CB, 0xE3D1, 0xE3D2, 0xE3D3, 0xE3D4, 0xD1D6, 0xE3D5,
+ /* U+9610 */ 0xB2FB, 0xC0BB, 0xE3D6, 0xEA5F, 0xC0AB, 0xE3D7, 0xE3D8, 0xE3D9,
+ /* U+9618 */ 0xEA60, 0xE3DA, 0xE3DB, 0xEA61, 0xB8B7, 0xDAE2, 0xEA62, 0xB6D3,
+ /* U+9620 */ 0xEA63, 0xDAE4, 0xDAE3, 0xEA64, 0xEA65, 0xEA66, 0xEA67, 0xEA68,
+ /* U+9628 */ 0xEA69, 0xEA6A, 0xDAE6, 0xEA6B, 0xEA6C, 0xEA6D, 0xC8EE, 0xEA6E,
+ /* U+9630 */ 0xEA6F, 0xDAE5, 0xB7C0, 0xD1F4, 0xD2F5, 0xD5F3, 0xBDD7, 0xEA70,
+ /* U+9638 */ 0xEA71, 0xEA72, 0xEA73, 0xD7E8, 0xDAE8, 0xDAE7, 0xEA74, 0xB0A2,
+ /* U+9640 */ 0xCDD3, 0xEA75, 0xDAE9, 0xEA76, 0xB8BD, 0xBCCA, 0xC2BD, 0xC2A4,
+ /* U+9648 */ 0xB3C2, 0xDAEA, 0xEA77, 0xC2AA, 0xC4B0, 0xBDB5, 0xEA78, 0xEA79,
+ /* U+9650 */ 0xCFDE, 0xEA7A, 0xEA7B, 0xEA7C, 0xDAEB, 0xC9C2, 0xEA7D, 0xEA7E,
+ /* U+9658 */ 0xEA80, 0xEA81, 0xEA82, 0xB1DD, 0xEA83, 0xEA84, 0xEA85, 0xDAEC,
+ /* U+9660 */ 0xEA86, 0xB6B8, 0xD4BA, 0xEA87, 0xB3FD, 0xEA88, 0xEA89, 0xDAED,
+ /* U+9668 */ 0xD4C9, 0xCFD5, 0xC5E3, 0xEA8A, 0xDAEE, 0xEA8B, 0xEA8C, 0xEA8D,
+ /* U+9670 */ 0xEA8E, 0xEA8F, 0xDAEF, 0xEA90, 0xDAF0, 0xC1EA, 0xCCD5, 0xCFDD,
+ /* U+9678 */ 0xEA91, 0xEA92, 0xEA93, 0xEA94, 0xEA95, 0xEA96, 0xEA97, 0xEA98,
+ /* U+9680 */ 0xEA99, 0xEA9A, 0xEA9B, 0xEA9C, 0xEA9D, 0xD3E7, 0xC2A1, 0xEA9E,
+ /* U+9688 */ 0xDAF1, 0xEA9F, 0xEAA0, 0xCBE5, 0xEB40, 0xDAF2, 0xEB41, 0xCBE6,
+ /* U+9690 */ 0xD2FE, 0xEB42, 0xEB43, 0xEB44, 0xB8F4, 0xEB45, 0xEB46, 0xDAF3,
+ /* U+9698 */ 0xB0AF, 0xCFB6, 0xEB47, 0xEB48, 0xD5CF, 0xEB49, 0xEB4A, 0xEB4B,
+ /* U+96A0 */ 0xEB4C, 0xEB4D, 0xEB4E, 0xEB4F, 0xEB50, 0xEB51, 0xEB52, 0xCBED,
+ /* U+96A8 */ 0xEB53, 0xEB54, 0xEB55, 0xEB56, 0xEB57, 0xEB58, 0xEB59, 0xEB5A,
+ /* U+96B0 */ 0xDAF4, 0xEB5B, 0xEB5C, 0xE3C4, 0xEB5D, 0xEB5E, 0xC1A5, 0xEB5F,
+ /* U+96B8 */ 0xEB60, 0xF6BF, 0xEB61, 0xEB62, 0xF6C0, 0xF6C1, 0xC4D1, 0xEB63,
+ /* U+96C0 */ 0xC8B8, 0xD1E3, 0xEB64, 0xEB65, 0xD0DB, 0xD1C5, 0xBCAF, 0xB9CD,
+ /* U+96C8 */ 0xEB66, 0xEFF4, 0xEB67, 0xEB68, 0xB4C6, 0xD3BA, 0xF6C2, 0xB3FB,
+ /* U+96D0 */ 0xEB69, 0xEB6A, 0xF6C3, 0xEB6B, 0xEB6C, 0xB5F1, 0xEB6D, 0xEB6E,
+ /* U+96D8 */ 0xEB6F, 0xEB70, 0xEB71, 0xEB72, 0xEB73, 0xEB74, 0xEB75, 0xEB76,
+ /* U+96E0 */ 0xF6C5, 0xEB77, 0xEB78, 0xEB79, 0xEB7A, 0xEB7B, 0xEB7C, 0xEB7D,
+ /* U+96E8 */ 0xD3EA, 0xF6A7, 0xD1A9, 0xEB7E, 0xEB80, 0xEB81, 0xEB82, 0xF6A9,
+ /* U+96F0 */ 0xEB83, 0xEB84, 0xEB85, 0xF6A8, 0xEB86, 0xEB87, 0xC1E3, 0xC0D7,
+ /* U+96F8 */ 0xEB88, 0xB1A2, 0xEB89, 0xEB8A, 0xEB8B, 0xEB8C, 0xCEED, 0xEB8D,
+ /* U+9700 */ 0xD0E8, 0xF6AB, 0xEB8E, 0xEB8F, 0xCFF6, 0xEB90, 0xF6AA, 0xD5F0,
+ /* U+9708 */ 0xF6AC, 0xC3B9, 0xEB91, 0xEB92, 0xEB93, 0xBBF4, 0xF6AE, 0xF6AD,
+ /* U+9710 */ 0xEB94, 0xEB95, 0xEB96, 0xC4DE, 0xEB97, 0xEB98, 0xC1D8, 0xEB99,
+ /* U+9718 */ 0xEB9A, 0xEB9B, 0xEB9C, 0xEB9D, 0xCBAA, 0xEB9E, 0xCFBC, 0xEB9F,
+ /* U+9720 */ 0xEBA0, 0xEC40, 0xEC41, 0xEC42, 0xEC43, 0xEC44, 0xEC45, 0xEC46,
+ /* U+9728 */ 0xEC47, 0xEC48, 0xF6AF, 0xEC49, 0xEC4A, 0xF6B0, 0xEC4B, 0xEC4C,
+ /* U+9730 */ 0xF6B1, 0xEC4D, 0xC2B6, 0xEC4E, 0xEC4F, 0xEC50, 0xEC51, 0xEC52,
+ /* U+9738 */ 0xB0D4, 0xC5F9, 0xEC53, 0xEC54, 0xEC55, 0xEC56, 0xF6B2, 0xEC57,
+ /* U+9740 */ 0xEC58, 0xEC59, 0xEC5A, 0xEC5B, 0xEC5C, 0xEC5D, 0xEC5E, 0xEC5F,
+ /* U+9748 */ 0xEC60, 0xEC61, 0xEC62, 0xEC63, 0xEC64, 0xEC65, 0xEC66, 0xEC67,
+ /* U+9750 */ 0xEC68, 0xEC69, 0xC7E0, 0xF6A6, 0xEC6A, 0xEC6B, 0xBEB8, 0xEC6C,
+ /* U+9758 */ 0xEC6D, 0xBEB2, 0xEC6E, 0xB5E5, 0xEC6F, 0xEC70, 0xB7C7, 0xEC71,
+ /* U+9760 */ 0xBFBF, 0xC3D2, 0xC3E6, 0xEC72, 0xEC73, 0xD8CC, 0xEC74, 0xEC75,
+ /* U+9768 */ 0xEC76, 0xB8EF, 0xEC77, 0xEC78, 0xEC79, 0xEC7A, 0xEC7B, 0xEC7C,
+ /* U+9770 */ 0xEC7D, 0xEC7E, 0xEC80, 0xBDF9, 0xD1A5, 0xEC81, 0xB0D0, 0xEC82,
+ /* U+9778 */ 0xEC83, 0xEC84, 0xEC85, 0xEC86, 0xF7B0, 0xEC87, 0xEC88, 0xEC89,
+ /* U+9780 */ 0xEC8A, 0xEC8B, 0xEC8C, 0xEC8D, 0xEC8E, 0xF7B1, 0xEC8F, 0xEC90,
+ /* U+9788 */ 0xEC91, 0xEC92, 0xEC93, 0xD0AC, 0xEC94, 0xB0B0, 0xEC95, 0xEC96,
+ /* U+9790 */ 0xEC97, 0xF7B2, 0xF7B3, 0xEC98, 0xF7B4, 0xEC99, 0xEC9A, 0xEC9B,
+ /* U+9798 */ 0xC7CA, 0xEC9C, 0xEC9D, 0xEC9E, 0xEC9F, 0xECA0, 0xED40, 0xED41,
+ /* U+97A0 */ 0xBECF, 0xED42, 0xED43, 0xF7B7, 0xED44, 0xED45, 0xED46, 0xED47,
+ /* U+97A8 */ 0xED48, 0xED49, 0xED4A, 0xF7B6, 0xED4B, 0xB1DE, 0xED4C, 0xF7B5,
+ /* U+97B0 */ 0xED4D, 0xED4E, 0xF7B8, 0xED4F, 0xF7B9, 0xED50, 0xED51, 0xED52,
+ /* U+97B8 */ 0xED53, 0xED54, 0xED55, 0xED56, 0xED57, 0xED58, 0xED59, 0xED5A,
+ /* U+97C0 */ 0xED5B, 0xED5C, 0xED5D, 0xED5E, 0xED5F, 0xED60, 0xED61, 0xED62,
+ /* U+97C8 */ 0xED63, 0xED64, 0xED65, 0xED66, 0xED67, 0xED68, 0xED69, 0xED6A,
+ /* U+97D0 */ 0xED6B, 0xED6C, 0xED6D, 0xED6E, 0xED6F, 0xED70, 0xED71, 0xED72,
+ /* U+97D8 */ 0xED73, 0xED74, 0xED75, 0xED76, 0xED77, 0xED78, 0xED79, 0xED7A,
+ /* U+97E0 */ 0xED7B, 0xED7C, 0xED7D, 0xED7E, 0xED80, 0xED81, 0xCEA4, 0xC8CD,
+ /* U+97E8 */ 0xED82, 0xBAAB, 0xE8B8, 0xE8B9, 0xE8BA, 0xBEC2, 0xED83, 0xED84,
+ /* U+97F0 */ 0xED85, 0xED86, 0xED87, 0xD2F4, 0xED88, 0xD4CF, 0xC9D8, 0xED89,
+ /* U+97F8 */ 0xED8A, 0xED8B, 0xED8C, 0xED8D, 0xED8E, 0xED8F, 0xED90, 0xED91,
+ /* U+9800 */ 0xED92, 0xED93, 0xED94, 0xED95, 0xED96, 0xED97, 0xED98, 0xED99,
+ /* U+9808 */ 0xED9A, 0xED9B, 0xED9C, 0xED9D, 0xED9E, 0xED9F, 0xEDA0, 0xEE40,
+ /* U+9810 */ 0xEE41, 0xEE42, 0xEE43, 0xEE44, 0xEE45, 0xEE46, 0xEE47, 0xEE48,
+ /* U+9818 */ 0xEE49, 0xEE4A, 0xEE4B, 0xEE4C, 0xEE4D, 0xEE4E, 0xEE4F, 0xEE50,
+ /* U+9820 */ 0xEE51, 0xEE52, 0xEE53, 0xEE54, 0xEE55, 0xEE56, 0xEE57, 0xEE58,
+ /* U+9828 */ 0xEE59, 0xEE5A, 0xEE5B, 0xEE5C, 0xEE5D, 0xEE5E, 0xEE5F, 0xEE60,
+ /* U+9830 */ 0xEE61, 0xEE62, 0xEE63, 0xEE64, 0xEE65, 0xEE66, 0xEE67, 0xEE68,
+ /* U+9838 */ 0xEE69, 0xEE6A, 0xEE6B, 0xEE6C, 0xEE6D, 0xEE6E, 0xEE6F, 0xEE70,
+ /* U+9840 */ 0xEE71, 0xEE72, 0xEE73, 0xEE74, 0xEE75, 0xEE76, 0xEE77, 0xEE78,
+ /* U+9848 */ 0xEE79, 0xEE7A, 0xEE7B, 0xEE7C, 0xEE7D, 0xEE7E, 0xEE80, 0xEE81,
+ /* U+9850 */ 0xEE82, 0xEE83, 0xEE84, 0xEE85, 0xEE86, 0xEE87, 0xEE88, 0xEE89,
+ /* U+9858 */ 0xEE8A, 0xEE8B, 0xEE8C, 0xEE8D, 0xEE8E, 0xEE8F, 0xEE90, 0xEE91,
+ /* U+9860 */ 0xEE92, 0xEE93, 0xEE94, 0xEE95, 0xEE96, 0xEE97, 0xEE98, 0xEE99,
+ /* U+9868 */ 0xEE9A, 0xEE9B, 0xEE9C, 0xEE9D, 0xEE9E, 0xEE9F, 0xEEA0, 0xEF40,
+ /* U+9870 */ 0xEF41, 0xEF42, 0xEF43, 0xEF44, 0xEF45, 0xD2B3, 0xB6A5, 0xC7EA,
+ /* U+9878 */ 0xF1FC, 0xCFEE, 0xCBB3, 0xD0EB, 0xE7EF, 0xCDE7, 0xB9CB, 0xB6D9,
+ /* U+9880 */ 0xF1FD, 0xB0E4, 0xCBCC, 0xF1FE, 0xD4A4, 0xC2AD, 0xC1EC, 0xC6C4,
+ /* U+9888 */ 0xBEB1, 0xF2A1, 0xBCD5, 0xEF46, 0xF2A2, 0xF2A3, 0xEF47, 0xF2A4,
+ /* U+9890 */ 0xD2C3, 0xC6B5, 0xEF48, 0xCDC7, 0xF2A5, 0xEF49, 0xD3B1, 0xBFC5,
+ /* U+9898 */ 0xCCE2, 0xEF4A, 0xF2A6, 0xF2A7, 0xD1D5, 0xB6EE, 0xF2A8, 0xF2A9,
+ /* U+98A0 */ 0xB5DF, 0xF2AA, 0xF2AB, 0xEF4B, 0xB2FC, 0xF2AC, 0xF2AD, 0xC8A7,
+ /* U+98A8 */ 0xEF4C, 0xEF4D, 0xEF4E, 0xEF4F, 0xEF50, 0xEF51, 0xEF52, 0xEF53,
+ /* U+98B0 */ 0xEF54, 0xEF55, 0xEF56, 0xEF57, 0xEF58, 0xEF59, 0xEF5A, 0xEF5B,
+ /* U+98B8 */ 0xEF5C, 0xEF5D, 0xEF5E, 0xEF5F, 0xEF60, 0xEF61, 0xEF62, 0xEF63,
+ /* U+98C0 */ 0xEF64, 0xEF65, 0xEF66, 0xEF67, 0xEF68, 0xEF69, 0xEF6A, 0xEF6B,
+ /* U+98C8 */ 0xEF6C, 0xEF6D, 0xEF6E, 0xEF6F, 0xEF70, 0xEF71, 0xB7E7, 0xEF72,
+ /* U+98D0 */ 0xEF73, 0xECA9, 0xECAA, 0xECAB, 0xEF74, 0xECAC, 0xEF75, 0xEF76,
+ /* U+98D8 */ 0xC6AE, 0xECAD, 0xECAE, 0xEF77, 0xEF78, 0xEF79, 0xB7C9, 0xCAB3,
+ /* U+98E0 */ 0xEF7A, 0xEF7B, 0xEF7C, 0xEF7D, 0xEF7E, 0xEF80, 0xEF81, 0xE2B8,
+ /* U+98E8 */ 0xF7CF, 0xEF82, 0xEF83, 0xEF84, 0xEF85, 0xEF86, 0xEF87, 0xEF88,
+ /* U+98F0 */ 0xEF89, 0xEF8A, 0xEF8B, 0xEF8C, 0xEF8D, 0xEF8E, 0xEF8F, 0xEF90,
+ /* U+98F8 */ 0xEF91, 0xEF92, 0xEF93, 0xEF94, 0xEF95, 0xEF96, 0xEF97, 0xEF98,
+ /* U+9900 */ 0xEF99, 0xEF9A, 0xEF9B, 0xEF9C, 0xEF9D, 0xEF9E, 0xEF9F, 0xEFA0,
+ /* U+9908 */ 0xF040, 0xF041, 0xF042, 0xF043, 0xF044, 0xF7D0, 0xF045, 0xF046,
+ /* U+9910 */ 0xB2CD, 0xF047, 0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D,
+ /* U+9918 */ 0xF04E, 0xF04F, 0xF050, 0xF051, 0xF052, 0xF053, 0xF054, 0xF055,
+ /* U+9920 */ 0xF056, 0xF057, 0xF058, 0xF059, 0xF05A, 0xF05B, 0xF05C, 0xF05D,
+ /* U+9928 */ 0xF05E, 0xF05F, 0xF060, 0xF061, 0xF062, 0xF063, 0xF7D1, 0xF064,
+ /* U+9930 */ 0xF065, 0xF066, 0xF067, 0xF068, 0xF069, 0xF06A, 0xF06B, 0xF06C,
+ /* U+9938 */ 0xF06D, 0xF06E, 0xF06F, 0xF070, 0xF071, 0xF072, 0xF073, 0xF074,
+ /* U+9940 */ 0xF075, 0xF076, 0xF077, 0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C,
+ /* U+9948 */ 0xF07D, 0xF07E, 0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085,
+ /* U+9950 */ 0xF086, 0xF087, 0xF088, 0xF089, 0xF7D3, 0xF7D2, 0xF08A, 0xF08B,
+ /* U+9958 */ 0xF08C, 0xF08D, 0xF08E, 0xF08F, 0xF090, 0xF091, 0xF092, 0xF093,
+ /* U+9960 */ 0xF094, 0xF095, 0xF096, 0xE2BB, 0xF097, 0xBCA2, 0xF098, 0xE2BC,
+ /* U+9968 */ 0xE2BD, 0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, 0xB7B9, 0xD2FB, 0xBDA4,
+ /* U+9970 */ 0xCACE, 0xB1A5, 0xCBC7, 0xF099, 0xE2C2, 0xB6FC, 0xC8C4, 0xE2C3,
+ /* U+9978 */ 0xF09A, 0xF09B, 0xBDC8, 0xF09C, 0xB1FD, 0xE2C4, 0xF09D, 0xB6F6,
+ /* U+9980 */ 0xE2C5, 0xC4D9, 0xF09E, 0xF09F, 0xE2C6, 0xCFDA, 0xB9DD, 0xE2C7,
+ /* U+9988 */ 0xC0A1, 0xF0A0, 0xE2C8, 0xB2F6, 0xF140, 0xE2C9, 0xF141, 0xC1F3,
+ /* U+9990 */ 0xE2CA, 0xE2CB, 0xC2F8, 0xE2CC, 0xE2CD, 0xE2CE, 0xCAD7, 0xD8B8,
+ /* U+9998 */ 0xD9E5, 0xCFE3, 0xF142, 0xF143, 0xF144, 0xF145, 0xF146, 0xF147,
+ /* U+99A0 */ 0xF148, 0xF149, 0xF14A, 0xF14B, 0xF14C, 0xF0A5, 0xF14D, 0xF14E,
+ /* U+99A8 */ 0xDCB0, 0xF14F, 0xF150, 0xF151, 0xF152, 0xF153, 0xF154, 0xF155,
+ /* U+99B0 */ 0xF156, 0xF157, 0xF158, 0xF159, 0xF15A, 0xF15B, 0xF15C, 0xF15D,
+ /* U+99B8 */ 0xF15E, 0xF15F, 0xF160, 0xF161, 0xF162, 0xF163, 0xF164, 0xF165,
+ /* U+99C0 */ 0xF166, 0xF167, 0xF168, 0xF169, 0xF16A, 0xF16B, 0xF16C, 0xF16D,
+ /* U+99C8 */ 0xF16E, 0xF16F, 0xF170, 0xF171, 0xF172, 0xF173, 0xF174, 0xF175,
+ /* U+99D0 */ 0xF176, 0xF177, 0xF178, 0xF179, 0xF17A, 0xF17B, 0xF17C, 0xF17D,
+ /* U+99D8 */ 0xF17E, 0xF180, 0xF181, 0xF182, 0xF183, 0xF184, 0xF185, 0xF186,
+ /* U+99E0 */ 0xF187, 0xF188, 0xF189, 0xF18A, 0xF18B, 0xF18C, 0xF18D, 0xF18E,
+ /* U+99E8 */ 0xF18F, 0xF190, 0xF191, 0xF192, 0xF193, 0xF194, 0xF195, 0xF196,
+ /* U+99F0 */ 0xF197, 0xF198, 0xF199, 0xF19A, 0xF19B, 0xF19C, 0xF19D, 0xF19E,
+ /* U+99F8 */ 0xF19F, 0xF1A0, 0xF240, 0xF241, 0xF242, 0xF243, 0xF244, 0xF245,
+ /* U+9A00 */ 0xF246, 0xF247, 0xF248, 0xF249, 0xF24A, 0xF24B, 0xF24C, 0xF24D,
+ /* U+9A08 */ 0xF24E, 0xF24F, 0xF250, 0xF251, 0xF252, 0xF253, 0xF254, 0xF255,
+ /* U+9A10 */ 0xF256, 0xF257, 0xF258, 0xF259, 0xF25A, 0xF25B, 0xF25C, 0xF25D,
+ /* U+9A18 */ 0xF25E, 0xF25F, 0xF260, 0xF261, 0xF262, 0xF263, 0xF264, 0xF265,
+ /* U+9A20 */ 0xF266, 0xF267, 0xF268, 0xF269, 0xF26A, 0xF26B, 0xF26C, 0xF26D,
+ /* U+9A28 */ 0xF26E, 0xF26F, 0xF270, 0xF271, 0xF272, 0xF273, 0xF274, 0xF275,
+ /* U+9A30 */ 0xF276, 0xF277, 0xF278, 0xF279, 0xF27A, 0xF27B, 0xF27C, 0xF27D,
+ /* U+9A38 */ 0xF27E, 0xF280, 0xF281, 0xF282, 0xF283, 0xF284, 0xF285, 0xF286,
+ /* U+9A40 */ 0xF287, 0xF288, 0xF289, 0xF28A, 0xF28B, 0xF28C, 0xF28D, 0xF28E,
+ /* U+9A48 */ 0xF28F, 0xF290, 0xF291, 0xF292, 0xF293, 0xF294, 0xF295, 0xF296,
+ /* U+9A50 */ 0xF297, 0xF298, 0xF299, 0xF29A, 0xF29B, 0xF29C, 0xF29D, 0xF29E,
+ /* U+9A58 */ 0xF29F, 0xF2A0, 0xF340, 0xF341, 0xF342, 0xF343, 0xF344, 0xF345,
+ /* U+9A60 */ 0xF346, 0xF347, 0xF348, 0xF349, 0xF34A, 0xF34B, 0xF34C, 0xF34D,
+ /* U+9A68 */ 0xF34E, 0xF34F, 0xF350, 0xF351, 0xC2ED, 0xD4A6, 0xCDD4, 0xD1B1,
+ /* U+9A70 */ 0xB3DB, 0xC7FD, 0xF352, 0xB2B5, 0xC2BF, 0xE6E0, 0xCABB, 0xE6E1,
+ /* U+9A78 */ 0xE6E2, 0xBED4, 0xE6E3, 0xD7A4, 0xCDD5, 0xE6E5, 0xBCDD, 0xE6E4,
+ /* U+9A80 */ 0xE6E6, 0xE6E7, 0xC2EE, 0xF353, 0xBDBE, 0xE6E8, 0xC2E6, 0xBAA7,
+ /* U+9A88 */ 0xE6E9, 0xF354, 0xE6EA, 0xB3D2, 0xD1E9, 0xF355, 0xF356, 0xBFA5,
+ /* U+9A90 */ 0xE6EB, 0xC6EF, 0xE6EC, 0xE6ED, 0xF357, 0xF358, 0xE6EE, 0xC6AD,
+ /* U+9A98 */ 0xE6EF, 0xF359, 0xC9A7, 0xE6F0, 0xE6F1, 0xE6F2, 0xE5B9, 0xE6F3,
+ /* U+9AA0 */ 0xE6F4, 0xC2E2, 0xE6F5, 0xE6F6, 0xD6E8, 0xE6F7, 0xF35A, 0xE6F8,
+ /* U+9AA8 */ 0xB9C7, 0xF35B, 0xF35C, 0xF35D, 0xF35E, 0xF35F, 0xF360, 0xF361,
+ /* U+9AB0 */ 0xF7BB, 0xF7BA, 0xF362, 0xF363, 0xF364, 0xF365, 0xF7BE, 0xF7BC,
+ /* U+9AB8 */ 0xBAA1, 0xF366, 0xF7BF, 0xF367, 0xF7C0, 0xF368, 0xF369, 0xF36A,
+ /* U+9AC0 */ 0xF7C2, 0xF7C1, 0xF7C4, 0xF36B, 0xF36C, 0xF7C3, 0xF36D, 0xF36E,
+ /* U+9AC8 */ 0xF36F, 0xF370, 0xF371, 0xF7C5, 0xF7C6, 0xF372, 0xF373, 0xF374,
+ /* U+9AD0 */ 0xF375, 0xF7C7, 0xF376, 0xCBE8, 0xF377, 0xF378, 0xF379, 0xF37A,
+ /* U+9AD8 */ 0xB8DF, 0xF37B, 0xF37C, 0xF37D, 0xF37E, 0xF380, 0xF381, 0xF7D4,
+ /* U+9AE0 */ 0xF382, 0xF7D5, 0xF383, 0xF384, 0xF385, 0xF386, 0xF7D6, 0xF387,
+ /* U+9AE8 */ 0xF388, 0xF389, 0xF38A, 0xF7D8, 0xF38B, 0xF7DA, 0xF38C, 0xF7D7,
+ /* U+9AF0 */ 0xF38D, 0xF38E, 0xF38F, 0xF390, 0xF391, 0xF392, 0xF393, 0xF394,
+ /* U+9AF8 */ 0xF395, 0xF7DB, 0xF396, 0xF7D9, 0xF397, 0xF398, 0xF399, 0xF39A,
+ /* U+9B00 */ 0xF39B, 0xF39C, 0xF39D, 0xD7D7, 0xF39E, 0xF39F, 0xF3A0, 0xF440,
+ /* U+9B08 */ 0xF7DC, 0xF441, 0xF442, 0xF443, 0xF444, 0xF445, 0xF446, 0xF7DD,
+ /* U+9B10 */ 0xF447, 0xF448, 0xF449, 0xF7DE, 0xF44A, 0xF44B, 0xF44C, 0xF44D,
+ /* U+9B18 */ 0xF44E, 0xF44F, 0xF450, 0xF451, 0xF452, 0xF453, 0xF454, 0xF7DF,
+ /* U+9B20 */ 0xF455, 0xF456, 0xF457, 0xF7E0, 0xF458, 0xF459, 0xF45A, 0xF45B,
+ /* U+9B28 */ 0xF45C, 0xF45D, 0xF45E, 0xF45F, 0xF460, 0xF461, 0xF462, 0xDBCB,
+ /* U+9B30 */ 0xF463, 0xF464, 0xD8AA, 0xF465, 0xF466, 0xF467, 0xF468, 0xF469,
+ /* U+9B38 */ 0xF46A, 0xF46B, 0xF46C, 0xE5F7, 0xB9ED, 0xF46D, 0xF46E, 0xF46F,
+ /* U+9B40 */ 0xF470, 0xBFFD, 0xBBEA, 0xF7C9, 0xC6C7, 0xF7C8, 0xF471, 0xF7CA,
+ /* U+9B48 */ 0xF7CC, 0xF7CB, 0xF472, 0xF473, 0xF474, 0xF7CD, 0xF475, 0xCEBA,
+ /* U+9B50 */ 0xF476, 0xF7CE, 0xF477, 0xF478, 0xC4A7, 0xF479, 0xF47A, 0xF47B,
+ /* U+9B58 */ 0xF47C, 0xF47D, 0xF47E, 0xF480, 0xF481, 0xF482, 0xF483, 0xF484,
+ /* U+9B60 */ 0xF485, 0xF486, 0xF487, 0xF488, 0xF489, 0xF48A, 0xF48B, 0xF48C,
+ /* U+9B68 */ 0xF48D, 0xF48E, 0xF48F, 0xF490, 0xF491, 0xF492, 0xF493, 0xF494,
+ /* U+9B70 */ 0xF495, 0xF496, 0xF497, 0xF498, 0xF499, 0xF49A, 0xF49B, 0xF49C,
+ /* U+9B78 */ 0xF49D, 0xF49E, 0xF49F, 0xF4A0, 0xF540, 0xF541, 0xF542, 0xF543,
+ /* U+9B80 */ 0xF544, 0xF545, 0xF546, 0xF547, 0xF548, 0xF549, 0xF54A, 0xF54B,
+ /* U+9B88 */ 0xF54C, 0xF54D, 0xF54E, 0xF54F, 0xF550, 0xF551, 0xF552, 0xF553,
+ /* U+9B90 */ 0xF554, 0xF555, 0xF556, 0xF557, 0xF558, 0xF559, 0xF55A, 0xF55B,
+ /* U+9B98 */ 0xF55C, 0xF55D, 0xF55E, 0xF55F, 0xF560, 0xF561, 0xF562, 0xF563,
+ /* U+9BA0 */ 0xF564, 0xF565, 0xF566, 0xF567, 0xF568, 0xF569, 0xF56A, 0xF56B,
+ /* U+9BA8 */ 0xF56C, 0xF56D, 0xF56E, 0xF56F, 0xF570, 0xF571, 0xF572, 0xF573,
+ /* U+9BB0 */ 0xF574, 0xF575, 0xF576, 0xF577, 0xF578, 0xF579, 0xF57A, 0xF57B,
+ /* U+9BB8 */ 0xF57C, 0xF57D, 0xF57E, 0xF580, 0xF581, 0xF582, 0xF583, 0xF584,
+ /* U+9BC0 */ 0xF585, 0xF586, 0xF587, 0xF588, 0xF589, 0xF58A, 0xF58B, 0xF58C,
+ /* U+9BC8 */ 0xF58D, 0xF58E, 0xF58F, 0xF590, 0xF591, 0xF592, 0xF593, 0xF594,
+ /* U+9BD0 */ 0xF595, 0xF596, 0xF597, 0xF598, 0xF599, 0xF59A, 0xF59B, 0xF59C,
+ /* U+9BD8 */ 0xF59D, 0xF59E, 0xF59F, 0xF5A0, 0xF640, 0xF641, 0xF642, 0xF643,
+ /* U+9BE0 */ 0xF644, 0xF645, 0xF646, 0xF647, 0xF648, 0xF649, 0xF64A, 0xF64B,
+ /* U+9BE8 */ 0xF64C, 0xF64D, 0xF64E, 0xF64F, 0xF650, 0xF651, 0xF652, 0xF653,
+ /* U+9BF0 */ 0xF654, 0xF655, 0xF656, 0xF657, 0xF658, 0xF659, 0xF65A, 0xF65B,
+ /* U+9BF8 */ 0xF65C, 0xF65D, 0xF65E, 0xF65F, 0xF660, 0xF661, 0xF662, 0xF663,
+ /* U+9C00 */ 0xF664, 0xF665, 0xF666, 0xF667, 0xF668, 0xF669, 0xF66A, 0xF66B,
+ /* U+9C08 */ 0xF66C, 0xF66D, 0xF66E, 0xF66F, 0xF670, 0xF671, 0xF672, 0xF673,
+ /* U+9C10 */ 0xF674, 0xF675, 0xF676, 0xF677, 0xF678, 0xF679, 0xF67A, 0xF67B,
+ /* U+9C18 */ 0xF67C, 0xF67D, 0xF67E, 0xF680, 0xF681, 0xF682, 0xF683, 0xF684,
+ /* U+9C20 */ 0xF685, 0xF686, 0xF687, 0xF688, 0xF689, 0xF68A, 0xF68B, 0xF68C,
+ /* U+9C28 */ 0xF68D, 0xF68E, 0xF68F, 0xF690, 0xF691, 0xF692, 0xF693, 0xF694,
+ /* U+9C30 */ 0xF695, 0xF696, 0xF697, 0xF698, 0xF699, 0xF69A, 0xF69B, 0xF69C,
+ /* U+9C38 */ 0xF69D, 0xF69E, 0xF69F, 0xF6A0, 0xF740, 0xF741, 0xF742, 0xF743,
+ /* U+9C40 */ 0xF744, 0xF745, 0xF746, 0xF747, 0xF748, 0xF749, 0xF74A, 0xF74B,
+ /* U+9C48 */ 0xF74C, 0xF74D, 0xF74E, 0xF74F, 0xF750, 0xF751, 0xF752, 0xF753,
+ /* U+9C50 */ 0xF754, 0xF755, 0xF756, 0xF757, 0xF758, 0xF759, 0xF75A, 0xF75B,
+ /* U+9C58 */ 0xF75C, 0xF75D, 0xF75E, 0xF75F, 0xF760, 0xF761, 0xF762, 0xF763,
+ /* U+9C60 */ 0xF764, 0xF765, 0xF766, 0xF767, 0xF768, 0xF769, 0xF76A, 0xF76B,
+ /* U+9C68 */ 0xF76C, 0xF76D, 0xF76E, 0xF76F, 0xF770, 0xF771, 0xF772, 0xF773,
+ /* U+9C70 */ 0xF774, 0xF775, 0xF776, 0xF777, 0xF778, 0xF779, 0xF77A, 0xF77B,
+ /* U+9C78 */ 0xF77C, 0xF77D, 0xF77E, 0xF780, 0xD3E3, 0xF781, 0xF782, 0xF6CF,
+ /* U+9C80 */ 0xF783, 0xC2B3, 0xF6D0, 0xF784, 0xF785, 0xF6D1, 0xF6D2, 0xF6D3,
+ /* U+9C88 */ 0xF6D4, 0xF786, 0xF787, 0xF6D6, 0xF788, 0xB1AB, 0xF6D7, 0xF789,
+ /* U+9C90 */ 0xF6D8, 0xF6D9, 0xF6DA, 0xF78A, 0xF6DB, 0xF6DC, 0xF78B, 0xF78C,
+ /* U+9C98 */ 0xF78D, 0xF78E, 0xF6DD, 0xF6DE, 0xCFCA, 0xF78F, 0xF6DF, 0xF6E0,
+ /* U+9CA0 */ 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xC0F0, 0xF6E5, 0xF6E6, 0xF6E7,
+ /* U+9CA8 */ 0xF6E8, 0xF6E9, 0xF790, 0xF6EA, 0xF791, 0xF6EB, 0xF6EC, 0xF792,
+ /* U+9CB0 */ 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0, 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4,
+ /* U+9CB8 */ 0xBEA8, 0xF793, 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, 0xF794, 0xF795,
+ /* U+9CC0 */ 0xF796, 0xF797, 0xF798, 0xC8FA, 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC,
+ /* U+9CC8 */ 0xF799, 0xF79A, 0xF6FD, 0xF6FE, 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4,
+ /* U+9CD0 */ 0xF7A5, 0xF79B, 0xF79C, 0xF7A6, 0xF7A7, 0xF7A8, 0xB1EE, 0xF7A9,
+ /* U+9CD8 */ 0xF7AA, 0xF7AB, 0xF79D, 0xF79E, 0xF7AC, 0xF7AD, 0xC1DB, 0xF7AE,
+ /* U+9CE0 */ 0xF79F, 0xF7A0, 0xF7AF, 0xF840, 0xF841, 0xF842, 0xF843, 0xF844,
+ /* U+9CE8 */ 0xF845, 0xF846, 0xF847, 0xF848, 0xF849, 0xF84A, 0xF84B, 0xF84C,
+ /* U+9CF0 */ 0xF84D, 0xF84E, 0xF84F, 0xF850, 0xF851, 0xF852, 0xF853, 0xF854,
+ /* U+9CF8 */ 0xF855, 0xF856, 0xF857, 0xF858, 0xF859, 0xF85A, 0xF85B, 0xF85C,
+ /* U+9D00 */ 0xF85D, 0xF85E, 0xF85F, 0xF860, 0xF861, 0xF862, 0xF863, 0xF864,
+ /* U+9D08 */ 0xF865, 0xF866, 0xF867, 0xF868, 0xF869, 0xF86A, 0xF86B, 0xF86C,
+ /* U+9D10 */ 0xF86D, 0xF86E, 0xF86F, 0xF870, 0xF871, 0xF872, 0xF873, 0xF874,
+ /* U+9D18 */ 0xF875, 0xF876, 0xF877, 0xF878, 0xF879, 0xF87A, 0xF87B, 0xF87C,
+ /* U+9D20 */ 0xF87D, 0xF87E, 0xF880, 0xF881, 0xF882, 0xF883, 0xF884, 0xF885,
+ /* U+9D28 */ 0xF886, 0xF887, 0xF888, 0xF889, 0xF88A, 0xF88B, 0xF88C, 0xF88D,
+ /* U+9D30 */ 0xF88E, 0xF88F, 0xF890, 0xF891, 0xF892, 0xF893, 0xF894, 0xF895,
+ /* U+9D38 */ 0xF896, 0xF897, 0xF898, 0xF899, 0xF89A, 0xF89B, 0xF89C, 0xF89D,
+ /* U+9D40 */ 0xF89E, 0xF89F, 0xF8A0, 0xF940, 0xF941, 0xF942, 0xF943, 0xF944,
+ /* U+9D48 */ 0xF945, 0xF946, 0xF947, 0xF948, 0xF949, 0xF94A, 0xF94B, 0xF94C,
+ /* U+9D50 */ 0xF94D, 0xF94E, 0xF94F, 0xF950, 0xF951, 0xF952, 0xF953, 0xF954,
+ /* U+9D58 */ 0xF955, 0xF956, 0xF957, 0xF958, 0xF959, 0xF95A, 0xF95B, 0xF95C,
+ /* U+9D60 */ 0xF95D, 0xF95E, 0xF95F, 0xF960, 0xF961, 0xF962, 0xF963, 0xF964,
+ /* U+9D68 */ 0xF965, 0xF966, 0xF967, 0xF968, 0xF969, 0xF96A, 0xF96B, 0xF96C,
+ /* U+9D70 */ 0xF96D, 0xF96E, 0xF96F, 0xF970, 0xF971, 0xF972, 0xF973, 0xF974,
+ /* U+9D78 */ 0xF975, 0xF976, 0xF977, 0xF978, 0xF979, 0xF97A, 0xF97B, 0xF97C,
+ /* U+9D80 */ 0xF97D, 0xF97E, 0xF980, 0xF981, 0xF982, 0xF983, 0xF984, 0xF985,
+ /* U+9D88 */ 0xF986, 0xF987, 0xF988, 0xF989, 0xF98A, 0xF98B, 0xF98C, 0xF98D,
+ /* U+9D90 */ 0xF98E, 0xF98F, 0xF990, 0xF991, 0xF992, 0xF993, 0xF994, 0xF995,
+ /* U+9D98 */ 0xF996, 0xF997, 0xF998, 0xF999, 0xF99A, 0xF99B, 0xF99C, 0xF99D,
+ /* U+9DA0 */ 0xF99E, 0xF99F, 0xF9A0, 0xFA40, 0xFA41, 0xFA42, 0xFA43, 0xFA44,
+ /* U+9DA8 */ 0xFA45, 0xFA46, 0xFA47, 0xFA48, 0xFA49, 0xFA4A, 0xFA4B, 0xFA4C,
+ /* U+9DB0 */ 0xFA4D, 0xFA4E, 0xFA4F, 0xFA50, 0xFA51, 0xFA52, 0xFA53, 0xFA54,
+ /* U+9DB8 */ 0xFA55, 0xFA56, 0xFA57, 0xFA58, 0xFA59, 0xFA5A, 0xFA5B, 0xFA5C,
+ /* U+9DC0 */ 0xFA5D, 0xFA5E, 0xFA5F, 0xFA60, 0xFA61, 0xFA62, 0xFA63, 0xFA64,
+ /* U+9DC8 */ 0xFA65, 0xFA66, 0xFA67, 0xFA68, 0xFA69, 0xFA6A, 0xFA6B, 0xFA6C,
+ /* U+9DD0 */ 0xFA6D, 0xFA6E, 0xFA6F, 0xFA70, 0xFA71, 0xFA72, 0xFA73, 0xFA74,
+ /* U+9DD8 */ 0xFA75, 0xFA76, 0xFA77, 0xFA78, 0xFA79, 0xFA7A, 0xFA7B, 0xFA7C,
+ /* U+9DE0 */ 0xFA7D, 0xFA7E, 0xFA80, 0xFA81, 0xFA82, 0xFA83, 0xFA84, 0xFA85,
+ /* U+9DE8 */ 0xFA86, 0xFA87, 0xFA88, 0xFA89, 0xFA8A, 0xFA8B, 0xFA8C, 0xFA8D,
+ /* U+9DF0 */ 0xFA8E, 0xFA8F, 0xFA90, 0xFA91, 0xFA92, 0xFA93, 0xFA94, 0xFA95,
+ /* U+9DF8 */ 0xFA96, 0xFA97, 0xFA98, 0xFA99, 0xFA9A, 0xFA9B, 0xFA9C, 0xFA9D,
+ /* U+9E00 */ 0xFA9E, 0xFA9F, 0xFAA0, 0xFB40, 0xFB41, 0xFB42, 0xFB43, 0xFB44,
+ /* U+9E08 */ 0xFB45, 0xFB46, 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C,
+ /* U+9E10 */ 0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52, 0xFB53, 0xFB54,
+ /* U+9E18 */ 0xFB55, 0xFB56, 0xFB57, 0xFB58, 0xFB59, 0xFB5A, 0xFB5B, 0xC4F1,
+ /* U+9E20 */ 0xF0AF, 0xBCA6, 0xF0B0, 0xC3F9, 0xFB5C, 0xC5B8, 0xD1BB, 0xFB5D,
+ /* U+9E28 */ 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xD1BC, 0xFB5E, 0xD1EC,
+ /* U+9E30 */ 0xFB5F, 0xF0B7, 0xF0B6, 0xD4A7, 0xFB60, 0xCDD2, 0xF0B8, 0xF0BA,
+ /* U+9E38 */ 0xF0B9, 0xF0BB, 0xF0BC, 0xFB61, 0xFB62, 0xB8EB, 0xF0BD, 0xBAE8,
+ /* U+9E40 */ 0xFB63, 0xF0BE, 0xF0BF, 0xBEE9, 0xF0C0, 0xB6EC, 0xF0C1, 0xF0C2,
+ /* U+9E48 */ 0xF0C3, 0xF0C4, 0xC8B5, 0xF0C5, 0xF0C6, 0xFB64, 0xF0C7, 0xC5F4,
+ /* U+9E50 */ 0xFB65, 0xF0C8, 0xFB66, 0xFB67, 0xFB68, 0xF0C9, 0xFB69, 0xF0CA,
+ /* U+9E58 */ 0xF7BD, 0xFB6A, 0xF0CB, 0xF0CC, 0xF0CD, 0xFB6B, 0xF0CE, 0xFB6C,
+ /* U+9E60 */ 0xFB6D, 0xFB6E, 0xFB6F, 0xF0CF, 0xBAD7, 0xFB70, 0xF0D0, 0xF0D1,
+ /* U+9E68 */ 0xF0D2, 0xF0D3, 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D8, 0xFB71, 0xFB72,
+ /* U+9E70 */ 0xD3A5, 0xF0D7, 0xFB73, 0xF0D9, 0xFB74, 0xFB75, 0xFB76, 0xFB77,
+ /* U+9E78 */ 0xFB78, 0xFB79, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, 0xF5BA, 0xC2B9,
+ /* U+9E80 */ 0xFB7E, 0xFB80, 0xF7E4, 0xFB81, 0xFB82, 0xFB83, 0xFB84, 0xF7E5,
+ /* U+9E88 */ 0xF7E6, 0xFB85, 0xFB86, 0xF7E7, 0xFB87, 0xFB88, 0xFB89, 0xFB8A,
+ /* U+9E90 */ 0xFB8B, 0xFB8C, 0xF7E8, 0xC2B4, 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90,
+ /* U+9E98 */ 0xFB91, 0xFB92, 0xFB93, 0xFB94, 0xFB95, 0xF7EA, 0xFB96, 0xF7EB,
+ /* U+9EA0 */ 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C, 0xC2F3, 0xFB9D,
+ /* U+9EA8 */ 0xFB9E, 0xFB9F, 0xFBA0, 0xFC40, 0xFC41, 0xFC42, 0xFC43, 0xFC44,
+ /* U+9EB0 */ 0xFC45, 0xFC46, 0xFC47, 0xFC48, 0xF4F0, 0xFC49, 0xFC4A, 0xFC4B,
+ /* U+9EB8 */ 0xF4EF, 0xFC4C, 0xFC4D, 0xC2E9, 0xFC4E, 0xF7E1, 0xF7E2, 0xFC4F,
+ /* U+9EC0 */ 0xFC50, 0xFC51, 0xFC52, 0xFC53, 0xBBC6, 0xFC54, 0xFC55, 0xFC56,
+ /* U+9EC8 */ 0xFC57, 0xD9E4, 0xFC58, 0xFC59, 0xFC5A, 0xCAF2, 0xC0E8, 0xF0A4,
+ /* U+9ED0 */ 0xFC5B, 0xBADA, 0xFC5C, 0xFC5D, 0xC7AD, 0xFC5E, 0xFC5F, 0xFC60,
+ /* U+9ED8 */ 0xC4AC, 0xFC61, 0xFC62, 0xF7EC, 0xF7ED, 0xF7EE, 0xFC63, 0xF7F0,
+ /* U+9EE0 */ 0xF7EF, 0xFC64, 0xF7F1, 0xFC65, 0xFC66, 0xF7F4, 0xFC67, 0xF7F3,
+ /* U+9EE8 */ 0xFC68, 0xF7F2, 0xF7F5, 0xFC69, 0xFC6A, 0xFC6B, 0xFC6C, 0xF7F6,
+ /* U+9EF0 */ 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70, 0xFC71, 0xFC72, 0xFC73, 0xFC74,
+ /* U+9EF8 */ 0xFC75, 0xEDE9, 0xFC76, 0xEDEA, 0xEDEB, 0xFC77, 0xF6BC, 0xFC78,
+ /* U+9F00 */ 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D, 0xFC7E, 0xFC80, 0xFC81,
+ /* U+9F08 */ 0xFC82, 0xFC83, 0xFC84, 0xF6BD, 0xFC85, 0xF6BE, 0xB6A6, 0xFC86,
+ /* U+9F10 */ 0xD8BE, 0xFC87, 0xFC88, 0xB9C4, 0xFC89, 0xFC8A, 0xFC8B, 0xD8BB,
+ /* U+9F18 */ 0xFC8C, 0xDCB1, 0xFC8D, 0xFC8E, 0xFC8F, 0xFC90, 0xFC91, 0xFC92,
+ /* U+9F20 */ 0xCAF3, 0xFC93, 0xF7F7, 0xFC94, 0xFC95, 0xFC96, 0xFC97, 0xFC98,
+ /* U+9F28 */ 0xFC99, 0xFC9A, 0xFC9B, 0xFC9C, 0xF7F8, 0xFC9D, 0xFC9E, 0xF7F9,
+ /* U+9F30 */ 0xFC9F, 0xFCA0, 0xFD40, 0xFD41, 0xFD42, 0xFD43, 0xFD44, 0xF7FB,
+ /* U+9F38 */ 0xFD45, 0xF7FA, 0xFD46, 0xB1C7, 0xFD47, 0xF7FC, 0xF7FD, 0xFD48,
+ /* U+9F40 */ 0xFD49, 0xFD4A, 0xFD4B, 0xFD4C, 0xF7FE, 0xFD4D, 0xFD4E, 0xFD4F,
+ /* U+9F48 */ 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55, 0xFD56, 0xFD57,
+ /* U+9F50 */ 0xC6EB, 0xECB4, 0xFD58, 0xFD59, 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D,
+ /* U+9F58 */ 0xFD5E, 0xFD5F, 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65,
+ /* U+9F60 */ 0xFD66, 0xFD67, 0xFD68, 0xFD69, 0xFD6A, 0xFD6B, 0xFD6C, 0xFD6D,
+ /* U+9F68 */ 0xFD6E, 0xFD6F, 0xFD70, 0xFD71, 0xFD72, 0xFD73, 0xFD74, 0xFD75,
+ /* U+9F70 */ 0xFD76, 0xFD77, 0xFD78, 0xFD79, 0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D,
+ /* U+9F78 */ 0xFD7E, 0xFD80, 0xFD81, 0xFD82, 0xFD83, 0xFD84, 0xFD85, 0xB3DD,
+ /* U+9F80 */ 0xF6B3, 0xFD86, 0xFD87, 0xF6B4, 0xC1E4, 0xF6B5, 0xF6B6, 0xF6B7,
+ /* U+9F88 */ 0xF6B8, 0xF6B9, 0xF6BA, 0xC8A3, 0xF6BB, 0xFD88, 0xFD89, 0xFD8A,
+ /* U+9F90 */ 0xFD8B, 0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD90, 0xFD91, 0xFD92,
+ /* U+9F98 */ 0xFD93, 0xC1FA, 0xB9A8, 0xEDE8, 0xFD94, 0xFD95, 0xFD96, 0xB9EA,
+ /* U+9FA0 */ 0xD9DF, 0xFD97, 0xFD98, 0xFD99, 0xFD9A, 0xFD9B,
+ /* Contiguous area: U+E766 .. U+E864 */
+ /* U+E766 */ 0xA2AB, 0xA2AC,
+ /* U+E768 */ 0xA2AD, 0xA2AE, 0xA2AF, 0xA2B0, 0x6469, 0xA2E4, 0xA2EF, 0xA2F0,
+ /* U+E770 */ 0xA2FD, 0xA2FE, 0xA4F4, 0xA4F5, 0xA4F6, 0xA4F7, 0xA4F8, 0xA4F9,
+ /* U+E778 */ 0xA4FA, 0xA4FB, 0xA4FC, 0xA4FD, 0xA4FE, 0xA5F7, 0xA5F8, 0xA5F9,
+ /* U+E780 */ 0xA5FA, 0xA5FB, 0xA5FC, 0xA5FD, 0xA5FE, 0xA6B9, 0xA6BA, 0xA6BB,
+ /* U+E788 */ 0xA6BC, 0xA6BD, 0xA6BE, 0xA6BF, 0xA6C0, 0xA6D9, 0xA6DA, 0xA6DB,
+ /* U+E790 */ 0xA6DC, 0xA6DD, 0xA6DE, 0xA6DF, 0xA6EC, 0xA6ED, 0xA6F3, 0xA6F6,
+ /* U+E798 */ 0xA6F7, 0xA6F8, 0xA6F9, 0xA6FA, 0xA6FB, 0xA6FC, 0xA6FD, 0xA6FE,
+ /* U+E7A0 */ 0xA7C2, 0xA7C3, 0xA7C4, 0xA7C5, 0xA7C6, 0xA7C7, 0xA7C8, 0xA7C9,
+ /* U+E7A8 */ 0xA7CA, 0xA7CB, 0xA7CC, 0xA7CD, 0xA7CE, 0xA7CF, 0xA7D0, 0xA7F2,
+ /* U+E7B0 */ 0xA7F3, 0xA7F4, 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, 0xA7F9, 0xA7FA,
+ /* U+E7B8 */ 0xA7FB, 0xA7FC, 0xA7FD, 0xA7FE, 0xA896, 0xA897, 0xA898, 0xA899,
+ /* U+E7C0 */ 0xA89A, 0xA89B, 0xA89C, 0xA89D, 0xA89E, 0xA89F, 0xA8A0, 0xA8BC,
+ /* U+E7C8 */ 0x6470, 0xA8C1, 0xA8C2, 0xA8C3, 0xA8C4, 0xA8EA, 0xA8EB, 0xA8EC,
+ /* U+E7D0 */ 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xA8F2, 0xA8F3, 0xA8F4,
+ /* U+E7D8 */ 0xA8F5, 0xA8F6, 0xA8F7, 0xA8F8, 0xA8F9, 0xA8FA, 0xA8FB, 0xA8FC,
+ /* U+E7E0 */ 0xA8FD, 0xA8FE, 0xA958, 0xA95B, 0xA95D, 0xA95E, 0xA95F, 0x6471,
+ /* U+E7E8 */ 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x6478, 0x6479,
+ /* U+E7F0 */ 0x6480, 0x6481, 0x6482, 0x6483, 0xA997, 0xA998, 0xA999, 0xA99A,
+ /* U+E7F8 */ 0xA99B, 0xA99C, 0xA99D, 0xA99E, 0xA99F, 0xA9A0, 0xA9A1, 0xA9A2,
+ /* U+E800 */ 0xA9A3, 0xA9F0, 0xA9F1, 0xA9F2, 0xA9F3, 0xA9F4, 0xA9F5, 0xA9F6,
+ /* U+E808 */ 0xA9F7, 0xA9F8, 0xA9F9, 0xA9FA, 0xA9FB, 0xA9FC, 0xA9FD, 0xA9FE,
+ /* U+E810 */ 0xD7FA, 0xD7FB, 0xD7FC, 0xD7FD, 0xD7FE, 0x6484, 0xFE51, 0xFE52,
+ /* U+E818 */ 0xFE53, 0x6485, 0x6486, 0x6487, 0x6488, 0x6489, 0xFE59, 0x6490,
+ /* U+E820 */ 0x6491, 0x6492, 0x6493, 0x6494, 0x6495, 0x6496, 0xFE61, 0x6497,
+ /* U+E828 */ 0x6498, 0x6499, 0x64A0, 0xFE66, 0xFE67, 0x64A1, 0x64A2, 0x64A3,
+ /* U+E830 */ 0x64A4, 0xFE6C, 0xFE6D, 0x64A5, 0x64A6, 0x64A7, 0x64A8, 0x64A9,
+ /* U+E838 */ 0x64B0, 0x64B1, 0x64B2, 0xFE76, 0x64B3, 0x64B4, 0x64B5, 0x64B6,
+ /* U+E840 */ 0x64B7, 0x64B8, 0x64B9, 0xFE7E, 0x64C0, 0x64C1, 0x64C2, 0x64C3,
+ /* U+E848 */ 0x64C4, 0x64C5, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64D0, 0x64D1,
+ /* U+E850 */ 0x64D2, 0x64D3, 0x64D4, 0x64D5, 0xFE90, 0xFE91, 0x64D6, 0x64D7,
+ /* U+E858 */ 0x64D8, 0x64D9, 0x64E0, 0x64E1, 0x64E2, 0x64E3, 0x64E4, 0x64E5,
+ /* U+E860 */ 0x64E6, 0x64E7, 0x64E8, 0x64E9, 0xFEA0,
+ /* Contiguous area: U+F92C .. U+FA29 */
+ /* U+F92C */ 0xFD9C, 0x7045, 0x7046, 0x7047,
+ /* U+F930 */ 0x7048, 0x7049, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055,
+ /* U+F938 */ 0x7056, 0x7057, 0x7058, 0x7059, 0x7060, 0x7061, 0x7062, 0x7063,
+ /* U+F940 */ 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x7070, 0x7071,
+ /* U+F948 */ 0x7072, 0x7073, 0x7074, 0x7075, 0x7076, 0x7077, 0x7078, 0x7079,
+ /* U+F950 */ 0x7080, 0x7081, 0x7082, 0x7083, 0x7084, 0x7085, 0x7086, 0x7087,
+ /* U+F958 */ 0x7088, 0x7089, 0x7090, 0x7091, 0x7092, 0x7093, 0x7094, 0x7095,
+ /* U+F960 */ 0x7096, 0x7097, 0x7098, 0x7099, 0x70A0, 0x70A1, 0x70A2, 0x70A3,
+ /* U+F968 */ 0x70A4, 0x70A5, 0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70B0, 0x70B1,
+ /* U+F970 */ 0x70B2, 0x70B3, 0x70B4, 0x70B5, 0x70B6, 0x70B7, 0x70B8, 0x70B9,
+ /* U+F978 */ 0x70C0, 0xFD9D, 0x70C1, 0x70C2, 0x70C3, 0x70C4, 0x70C5, 0x70C6,
+ /* U+F980 */ 0x70C7, 0x70C8, 0x70C9, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4,
+ /* U+F988 */ 0x70D5, 0x70D6, 0x70D7, 0x70D8, 0x70D9, 0x70E0, 0x70E1, 0x70E2,
+ /* U+F990 */ 0x70E3, 0x70E4, 0x70E5, 0x70E6, 0x70E7, 0xFD9E, 0x70E8, 0x70E9,
+ /* U+F998 */ 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F7,
+ /* U+F9A0 */ 0x70F8, 0x70F9, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105,
+ /* U+F9A8 */ 0x7106, 0x7107, 0x7108, 0x7109, 0x7110, 0x7111, 0x7112, 0x7113,
+ /* U+F9B0 */ 0x7114, 0x7115, 0x7116, 0x7117, 0x7118, 0x7119, 0x7120, 0x7121,
+ /* U+F9B8 */ 0x7122, 0x7123, 0x7124, 0x7125, 0x7126, 0x7127, 0x7128, 0x7129,
+ /* U+F9C0 */ 0x7130, 0x7131, 0x7132, 0x7133, 0x7134, 0x7135, 0x7136, 0x7137,
+ /* U+F9C8 */ 0x7138, 0x7139, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7145,
+ /* U+F9D0 */ 0x7146, 0x7147, 0x7148, 0x7149, 0x7150, 0x7151, 0x7152, 0x7153,
+ /* U+F9D8 */ 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x7160, 0x7161,
+ /* U+F9E0 */ 0x7162, 0x7163, 0x7164, 0x7165, 0x7166, 0x7167, 0x7168, 0xFD9F,
+ /* U+F9E8 */ 0x7169, 0x7170, 0x7171, 0x7172, 0x7173, 0x7174, 0x7175, 0x7176,
+ /* U+F9F0 */ 0x7177, 0xFDA0, 0x7178, 0x7179, 0x7180, 0x7181, 0x7182, 0x7183,
+ /* U+F9F8 */ 0x7184, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x7190, 0x7191,
+ /* U+FA00 */ 0x7192, 0x7193, 0x7194, 0x7195, 0x7196, 0x7197, 0x7198, 0x7199,
+ /* U+FA08 */ 0x71A0, 0x71A1, 0x71A2, 0x71A3, 0xFE40, 0xFE41, 0xFE42, 0xFE43,
+ /* U+FA10 */ 0x71A4, 0xFE44, 0x71A5, 0xFE45, 0xFE46, 0x71A6, 0x71A7, 0x71A8,
+ /* U+FA18 */ 0xFE47, 0x71A9, 0x71B0, 0x71B1, 0x71B2, 0x71B3, 0x71B4, 0xFE48,
+ /* U+FA20 */ 0xFE49, 0xFE4A, 0x71B5, 0xFE4B, 0xFE4C, 0x71B6, 0x71B7, 0xFE4D,
+ /* U+FA28 */ 0xFE4E, 0xFE4F,
+ /* Contiguous area: U+FE30 .. U+FFE5 */
+ /* U+FE30 */ 0xA955, 0xA6F2, 0x7848, 0xA6F4, 0xA6F5, 0xA6E0, 0xA6E1, 0xA6F0,
+ /* U+FE38 */ 0xA6F1, 0xA6E2, 0xA6E3, 0xA6EE, 0xA6EF, 0xA6E6, 0xA6E7, 0xA6E4,
+ /* U+FE40 */ 0xA6E5, 0xA6E8, 0xA6E9, 0xA6EA, 0xA6EB, 0x7849, 0x7850, 0x7851,
+ /* U+FE48 */ 0x7852, 0xA968, 0xA969, 0xA96A, 0xA96B, 0xA96C, 0xA96D, 0xA96E,
+ /* U+FE50 */ 0xA96F, 0xA970, 0xA971, 0x7853, 0xA972, 0xA973, 0xA974, 0xA975,
+ /* U+FE58 */ 0x7854, 0xA976, 0xA977, 0xA978, 0xA979, 0xA97A, 0xA97B, 0xA97C,
+ /* U+FE60 */ 0xA97D, 0xA97E, 0xA980, 0xA981, 0xA982, 0xA983, 0xA984, 0x7855,
+ /* U+FE68 */ 0xA985, 0xA986, 0xA987, 0xA988, 0x7856, 0x7857, 0x7858, 0x7859,
+ /* U+FE70 */ 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867,
+ /* U+FE78 */ 0x7868, 0x7869, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875,
+ /* U+FE80 */ 0x7876, 0x7877, 0x7878, 0x7879, 0x7880, 0x7881, 0x7882, 0x7883,
+ /* U+FE88 */ 0x7884, 0x7885, 0x7886, 0x7887, 0x7888, 0x7889, 0x7890, 0x7891,
+ /* U+FE90 */ 0x7892, 0x7893, 0x7894, 0x7895, 0x7896, 0x7897, 0x7898, 0x7899,
+ /* U+FE98 */ 0x78A0, 0x78A1, 0x78A2, 0x78A3, 0x78A4, 0x78A5, 0x78A6, 0x78A7,
+ /* U+FEA0 */ 0x78A8, 0x78A9, 0x78B0, 0x78B1, 0x78B2, 0x78B3, 0x78B4, 0x78B5,
+ /* U+FEA8 */ 0x78B6, 0x78B7, 0x78B8, 0x78B9, 0x78C0, 0x78C1, 0x78C2, 0x78C3,
+ /* U+FEB0 */ 0x78C4, 0x78C5, 0x78C6, 0x78C7, 0x78C8, 0x78C9, 0x78D0, 0x78D1,
+ /* U+FEB8 */ 0x78D2, 0x78D3, 0x78D4, 0x78D5, 0x78D6, 0x78D7, 0x78D8, 0x78D9,
+ /* U+FEC0 */ 0x78E0, 0x78E1, 0x78E2, 0x78E3, 0x78E4, 0x78E5, 0x78E6, 0x78E7,
+ /* U+FEC8 */ 0x78E8, 0x78E9, 0x78F0, 0x78F1, 0x78F2, 0x78F3, 0x78F4, 0x78F5,
+ /* U+FED0 */ 0x78F6, 0x78F7, 0x78F8, 0x78F9, 0x7900, 0x7901, 0x7902, 0x7903,
+ /* U+FED8 */ 0x7904, 0x7905, 0x7906, 0x7907, 0x7908, 0x7909, 0x7910, 0x7911,
+ /* U+FEE0 */ 0x7912, 0x7913, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919,
+ /* U+FEE8 */ 0x7920, 0x7921, 0x7922, 0x7923, 0x7924, 0x7925, 0x7926, 0x7927,
+ /* U+FEF0 */ 0x7928, 0x7929, 0x7930, 0x7931, 0x7932, 0x7933, 0x7934, 0x7935,
+ /* U+FEF8 */ 0x7936, 0x7937, 0x7938, 0x7939, 0x7940, 0x7941, 0x7942, 0x7943,
+ /* U+FF00 */ 0x7944, 0xA3A1, 0xA3A2, 0xA3A3, 0xA1E7, 0xA3A5, 0xA3A6, 0xA3A7,
+ /* U+FF08 */ 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF,
+ /* U+FF10 */ 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7,
+ /* U+FF18 */ 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF,
+ /* U+FF20 */ 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7,
+ /* U+FF28 */ 0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF,
+ /* U+FF30 */ 0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7,
+ /* U+FF38 */ 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF,
+ /* U+FF40 */ 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7,
+ /* U+FF48 */ 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF,
+ /* U+FF50 */ 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7,
+ /* U+FF58 */ 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AB, 0x7945,
+ /* U+FF60 */ 0x7946, 0x7947, 0x7948, 0x7949, 0x7950, 0x7951, 0x7952, 0x7953,
+ /* U+FF68 */ 0x7954, 0x7955, 0x7956, 0x7957, 0x7958, 0x7959, 0x7960, 0x7961,
+ /* U+FF70 */ 0x7962, 0x7963, 0x7964, 0x7965, 0x7966, 0x7967, 0x7968, 0x7969,
+ /* U+FF78 */ 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7977,
+ /* U+FF80 */ 0x7978, 0x7979, 0x7980, 0x7981, 0x7982, 0x7983, 0x7984, 0x7985,
+ /* U+FF88 */ 0x7986, 0x7987, 0x7988, 0x7989, 0x7990, 0x7991, 0x7992, 0x7993,
+ /* U+FF90 */ 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x79A0, 0x79A1,
+ /* U+FF98 */ 0x79A2, 0x79A3, 0x79A4, 0x79A5, 0x79A6, 0x79A7, 0x79A8, 0x79A9,
+ /* U+FFA0 */ 0x79B0, 0x79B1, 0x79B2, 0x79B3, 0x79B4, 0x79B5, 0x79B6, 0x79B7,
+ /* U+FFA8 */ 0x79B8, 0x79B9, 0x79C0, 0x79C1, 0x79C2, 0x79C3, 0x79C4, 0x79C5,
+ /* U+FFB0 */ 0x79C6, 0x79C7, 0x79C8, 0x79C9, 0x79D0, 0x79D1, 0x79D2, 0x79D3,
+ /* U+FFB8 */ 0x79D4, 0x79D5, 0x79D6, 0x79D7, 0x79D8, 0x79D9, 0x79E0, 0x79E1,
+ /* U+FFC0 */ 0x79E2, 0x79E3, 0x79E4, 0x79E5, 0x79E6, 0x79E7, 0x79E8, 0x79E9,
+ /* U+FFC8 */ 0x79F0, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7,
+ /* U+FFD0 */ 0x79F8, 0x79F9, 0x7A00, 0x7A01, 0x7A02, 0x7A03, 0x7A04, 0x7A05,
+ /* U+FFD8 */ 0x7A06, 0x7A07, 0x7A08, 0x7A09, 0x7A10, 0x7A11, 0x7A12, 0x7A13,
+ /* U+FFE0 */ 0xA1E9, 0xA1EA, 0xA956, 0xA3FE, 0xA957, 0xA3A4,
+};
+
+static quint16 const gb18030_2byte_to_ucs[22046] = {
+ /* GB 0x8140..0x817E */
+ 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F,
+ 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31,
+ 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44,
+ 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62,
+ 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C,
+ 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77,
+ 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80,
+ 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A,
+ /* GB 0x8180..0x81FE */
+ 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3,
+ 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8,
+ 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0,
+ 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7,
+ 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9,
+ 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05,
+ 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14,
+ 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29,
+ 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39,
+ 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45,
+ 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54,
+ 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D,
+ 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A,
+ 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A,
+ 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98,
+ 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2,
+ /* GB 0x8240..0x827E */
+ 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4,
+ 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD,
+ 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9,
+ 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6,
+ 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB,
+ 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9,
+ 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003,
+ 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500A,
+ /* GB 0x8280..0x82FE */
+ 0x500B, 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017,
+ 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027,
+ 0x502B, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035,
+ 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F, 0x5040,
+ 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B,
+ 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057,
+ 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061,
+ 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A,
+ 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073,
+ 0x5074, 0x5075, 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081,
+ 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B,
+ 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094,
+ 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509A, 0x509B, 0x509C,
+ 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6,
+ 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3,
+ 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, 0x50BC,
+ /* GB 0x8340..0x837E */
+ 0x50BD, 0x50BE, 0x50BF, 0x50C0, 0x50C1, 0x50C2, 0x50C3, 0x50C4,
+ 0x50C5, 0x50C6, 0x50C7, 0x50C8, 0x50C9, 0x50CA, 0x50CB, 0x50CC,
+ 0x50CD, 0x50CE, 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5,
+ 0x50D7, 0x50D8, 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DE, 0x50DF,
+ 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, 0x50E5, 0x50E8, 0x50E9,
+ 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6,
+ 0x50F7, 0x50F8, 0x50F9, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF,
+ 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108,
+ /* GB 0x8380..0x83FE */
+ 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111,
+ 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511A,
+ 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, 0x5120, 0x5122, 0x5123,
+ 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512A, 0x512B,
+ 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5132, 0x5133,
+ 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513A, 0x513B,
+ 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E,
+ 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B,
+ 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166,
+ 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F,
+ 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F,
+ 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E,
+ 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA,
+ 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF,
+ 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE,
+ 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7,
+ /* GB 0x8440..0x847E */
+ 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3,
+ 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE,
+ 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209,
+ 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C,
+ 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227,
+ 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C,
+ 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B,
+ 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258,
+ /* GB 0x8480..0x84FE */
+ 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263,
+ 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270,
+ 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279,
+ 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, 0x5285,
+ 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E,
+ 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298,
+ 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE,
+ 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9,
+ 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, 0x52C4,
+ 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF,
+ 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB,
+ 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, 0x52E5,
+ 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED,
+ 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, 0x52F6,
+ 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303,
+ 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E,
+ /* GB 0x8540..0x857E */
+ 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E,
+ 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B,
+ 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334,
+ 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342,
+ 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358,
+ 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D,
+ 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380,
+ 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F,
+ /* GB 0x8580..0x85FE */
+ 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399,
+ 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA,
+ 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3,
+ 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD,
+ 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE,
+ 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD,
+ 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF,
+ 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419,
+ 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433,
+ 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444,
+ 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451,
+ 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465,
+ 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F,
+ 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483,
+ 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493,
+ 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1,
+ /* GB 0x8640..0x867E */
+ 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7,
+ 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB,
+ 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4,
+ 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6,
+ 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503,
+ 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E,
+ 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A,
+ 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526,
+ /* GB 0x8680..0x86FE */
+ 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536,
+ 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545,
+ 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551,
+ 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B,
+ 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569,
+ 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579,
+ 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E,
+ 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B,
+ 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6,
+ 0x55A8, 0x55A9, 0x55AA, 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF,
+ 0x55B0, 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF,
+ 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA,
+ 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9,
+ 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED,
+ 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA,
+ 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605,
+ /* GB 0x8740..0x877E */
+ 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612,
+ 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C,
+ 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629,
+ 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637,
+ 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5641, 0x5642,
+ 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A,
+ 0x564B, 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656,
+ 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661,
+ /* GB 0x8780..0x87FE */
+ 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670,
+ 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A,
+ 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684,
+ 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690,
+ 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699,
+ 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1,
+ 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AA,
+ 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, 0x56B1, 0x56B2, 0x56B3,
+ 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD,
+ 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, 0x56C3, 0x56C4, 0x56C5,
+ 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, 0x56CC, 0x56CD, 0x56CE,
+ 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8,
+ 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9,
+ 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7,
+ 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707,
+ 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, 0x5710, 0x5711,
+ /* GB 0x8840..0x887E */
+ 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719,
+ 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724,
+ 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735,
+ 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743,
+ 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753,
+ 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765,
+ 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775,
+ 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780,
+ /* GB 0x8880..0x88FE */
+ 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F,
+ 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799,
+ 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA,
+ 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7,
+ 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0,
+ 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA,
+ 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB,
+ 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7,
+ 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1,
+ 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE,
+ 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A,
+ 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816,
+ 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822,
+ 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C,
+ 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836,
+ 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D,
+ /* GB 0x8940..0x897E */
+ 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846,
+ 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850,
+ 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B,
+ 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864,
+ 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F,
+ 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877,
+ 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882,
+ 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C,
+ /* GB 0x8980..0x89FE */
+ 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896,
+ 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2,
+ 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC,
+ 0x58AD, 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4,
+ 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD,
+ 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7,
+ 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF,
+ 0x58D0, 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9,
+ 0x58DA, 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1,
+ 0x58E2, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA,
+ 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8,
+ 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901,
+ 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C,
+ 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B,
+ 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928,
+ 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B,
+ /* GB 0x8A40..0x8A7E */
+ 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A,
+ 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C,
+ 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967,
+ 0x5968, 0x5969, 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F,
+ 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C,
+ 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E,
+ 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B,
+ 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6,
+ /* GB 0x8A80..0x8AFE */
+ 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5,
+ 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0,
+ 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9,
+ 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB,
+ 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7,
+ 0x59E9, 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1,
+ 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA,
+ 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D,
+ 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17,
+ 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24,
+ 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E,
+ 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A,
+ 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44,
+ 0x5A45, 0x5A47, 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F,
+ 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58,
+ 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60,
+ /* GB 0x8B40..0x8B7E */
+ 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, 0x5A6B,
+ 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73,
+ 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81,
+ 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86, 0x5A87, 0x5A88, 0x5A89,
+ 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, 0x5A8F, 0x5A90, 0x5A91,
+ 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, 0x5A99, 0x5A9C,
+ 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4,
+ 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC,
+ /* GB 0x8B80..0x8BFE */
+ 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7,
+ 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3,
+ 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD,
+ 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9,
+ 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5,
+ 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0,
+ 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9,
+ 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, 0x5AFF, 0x5B00, 0x5B01,
+ 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, 0x5B08, 0x5B0A,
+ 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12,
+ 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, 0x5B1A, 0x5B1B, 0x5B1C,
+ 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, 0x5B22, 0x5B23, 0x5B24,
+ 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2A, 0x5B2B, 0x5B2C,
+ 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, 0x5B33, 0x5B35, 0x5B36,
+ 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F,
+ 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, 0x5B46, 0x5B47,
+ /* GB 0x8C40..0x8C7E */
+ 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, 0x5B4E, 0x5B4F,
+ 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B,
+ 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78,
+ 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A,
+ 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F,
+ 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1,
+ 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3,
+ 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF,
+ /* GB 0x8C80..0x8CFE */
+ 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA,
+ 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9,
+ 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3,
+ 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02,
+ 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E,
+ 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F,
+ 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B,
+ 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36,
+ 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52,
+ 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C,
+ 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A,
+ 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75,
+ 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80,
+ 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B,
+ 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F,
+ 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8,
+ /* GB 0x8D40..0x8D7E */
+ 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9,
+ 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5,
+ 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE,
+ 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7,
+ 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0,
+ 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF,
+ 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8,
+ 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00,
+ /* GB 0x8D80..0x8DFE */
+ 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C,
+ 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17,
+ 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21,
+ 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F,
+ 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38,
+ 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42,
+ 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E,
+ 0x5D4F, 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56,
+ 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61,
+ 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A,
+ 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76,
+ 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E,
+ 0x5D7F, 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87,
+ 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F,
+ 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97,
+ 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0,
+ /* GB 0x8E40..0x8E7E */
+ 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8,
+ 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0,
+ 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9,
+ 0x5DBA, 0x5DBB, 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1,
+ 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA,
+ 0x5DCB, 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3,
+ 0x5DD4, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC,
+ 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED,
+ /* GB 0x8E80..0x8EFE */
+ 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC,
+ 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D,
+ 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21,
+ 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B,
+ 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36,
+ 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46,
+ 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F,
+ 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59,
+ 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65,
+ 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D,
+ 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E,
+ 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D,
+ 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3,
+ 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF,
+ 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD,
+ 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5,
+ /* GB 0x8F40..0x8F7E */
+ 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF,
+ 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC,
+ 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4,
+ 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE,
+ 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9,
+ 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C,
+ 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A,
+ 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24,
+ /* GB 0x8F80..0x8FFE */
+ 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34,
+ 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F,
+ 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F46, 0x5F47, 0x5F48,
+ 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, 0x5F4E, 0x5F4F, 0x5F51,
+ 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60,
+ 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72,
+ 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F,
+ 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94,
+ 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2,
+ 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC,
+ 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8,
+ 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2,
+ 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5,
+ 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5,
+ 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3,
+ 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007,
+ /* GB 0x9040..0x907E */
+ 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017,
+ 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C,
+ 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036,
+ 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044,
+ 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E,
+ 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B,
+ 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E,
+ 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080,
+ /* GB 0x9080..0x90FE */
+ 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B,
+ 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098,
+ 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7,
+ 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7,
+ 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2,
+ 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE,
+ 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9,
+ 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA,
+ 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD,
+ 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A,
+ 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116,
+ 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121,
+ 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E,
+ 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136,
+ 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, 0x613E,
+ 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146,
+ /* GB 0x9140..0x917E */
+ 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153,
+ 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C,
+ 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166,
+ 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171,
+ 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B,
+ 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183,
+ 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C,
+ 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195,
+ /* GB 0x9180..0x91FE */
+ 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E,
+ 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6,
+ 0x61AA, 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2,
+ 0x61B3, 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB,
+ 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5,
+ 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0,
+ 0x61D3, 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB,
+ 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3,
+ 0x61E4, 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC,
+ 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4,
+ 0x61F6, 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD,
+ 0x61FE, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207,
+ 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220,
+ 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F,
+ 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A,
+ 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A,
+ /* GB 0x9240..0x927E */
+ 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C,
+ 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265,
+ 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A,
+ 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287,
+ 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294,
+ 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9,
+ 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4,
+ 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1,
+ /* GB 0x9280..0x92FE */
+ 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0,
+ 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8,
+ 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306,
+ 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313,
+ 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327,
+ 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334,
+ 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F,
+ 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352,
+ 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B,
+ 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A,
+ 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375,
+ 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383,
+ 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394,
+ 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E,
+ 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2,
+ 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0,
+ /* GB 0x9340..0x937E */
+ 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB,
+ 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9,
+ 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5,
+ 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0,
+ 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC,
+ 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A,
+ 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418,
+ 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424,
+ /* GB 0x9380..0x93FE */
+ 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430,
+ 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439,
+ 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B,
+ 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455,
+ 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F,
+ 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468,
+ 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, 0x6470, 0x6471, 0x6472,
+ 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647B, 0x647C, 0x647D,
+ 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489,
+ 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6493,
+ 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F,
+ 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8,
+ 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6,
+ 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4,
+ 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF,
+ 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA,
+ /* GB 0x9440..0x947E */
+ 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5,
+ 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, 0x64ED, 0x64EE,
+ 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, 0x64F5, 0x64F6,
+ 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, 0x64FD, 0x64FE,
+ 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507,
+ 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, 0x650F, 0x6510,
+ 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651A,
+ 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, 0x6521,
+ /* GB 0x9480..0x94FE */
+ 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652A,
+ 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A,
+ 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546,
+ 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553,
+ 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561,
+ 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E,
+ 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657A,
+ 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6582,
+ 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, 0x658D,
+ 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A,
+ 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA,
+ 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6,
+ 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2,
+ 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3,
+ 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD,
+ 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB,
+ /* GB 0x9540..0x957E */
+ 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC,
+ 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608,
+ 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617,
+ 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623,
+ 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630,
+ 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D,
+ 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648,
+ 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658,
+ /* GB 0x9580..0x95FE */
+ 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663,
+ 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671,
+ 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D,
+ 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689,
+ 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693,
+ 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E,
+ 0x669F, 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6,
+ 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1,
+ 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB,
+ 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4,
+ 0x66C5, 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC,
+ 0x66CD, 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4,
+ 0x66D5, 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0,
+ 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA,
+ 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6,
+ 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703,
+ /* GB 0x9640..0x967E */
+ 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711,
+ 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E,
+ 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729,
+ 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739,
+ 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747,
+ 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758,
+ 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766,
+ 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776,
+ /* GB 0x9680..0x96FE */
+ 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783,
+ 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F,
+ 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F,
+ 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1,
+ 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE,
+ 0x67BF, 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9,
+ 0x67CA, 0x67CB, 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7,
+ 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8,
+ 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7,
+ 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802,
+ 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815,
+ 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820,
+ 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B,
+ 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835,
+ 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F,
+ 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685A, 0x685B,
+ /* GB 0x9740..0x977E */
+ 0x685C, 0x685D, 0x685E, 0x685F, 0x686A, 0x686C, 0x686D, 0x686E,
+ 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879,
+ 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, 0x6880, 0x6882,
+ 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D,
+ 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898,
+ 0x6899, 0x689A, 0x689B, 0x689C, 0x689D, 0x689E, 0x689F, 0x68A0,
+ 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC,
+ 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8,
+ /* GB 0x9780..0x97FE */
+ 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1,
+ 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC,
+ 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7,
+ 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2,
+ 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, 0x68E9, 0x68EA, 0x68EB,
+ 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7,
+ 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903,
+ 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F,
+ 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919,
+ 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, 0x6921, 0x6922, 0x6923,
+ 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C,
+ 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937,
+ 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, 0x6943,
+ 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694A, 0x694B,
+ 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6953,
+ 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F,
+ /* GB 0x9840..0x987E */
+ 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A,
+ 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975,
+ 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983,
+ 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991,
+ 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E,
+ 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6,
+ 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3,
+ 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD,
+ /* GB 0x9880..0x98FE */
+ 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6,
+ 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2,
+ 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC,
+ 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6,
+ 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF,
+ 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8,
+ 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, 0x6A02,
+ 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, 0x6A0B,
+ 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, 0x6A13,
+ 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D,
+ 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27,
+ 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33,
+ 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C,
+ 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48,
+ 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51,
+ 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A,
+ /* GB 0x9940..0x997E */
+ 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64,
+ 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D,
+ 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76,
+ 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81,
+ 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A,
+ 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95,
+ 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E,
+ 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6,
+ /* GB 0x9980..0x99FE */
+ 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1,
+ 0x6AB2, 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9,
+ 0x6ABA, 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1,
+ 0x6AC2, 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9,
+ 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1,
+ 0x6AD2, 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9,
+ 0x6ADA, 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1,
+ 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9,
+ 0x6AEA, 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1,
+ 0x6AF2, 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9,
+ 0x6AFA, 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01,
+ 0x6B02, 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09,
+ 0x6B0A, 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11,
+ 0x6B12, 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19,
+ 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26,
+ 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E,
+ /* GB 0x9A40..0x9A7E */
+ 0x6B2F, 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38,
+ 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44,
+ 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50,
+ 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58,
+ 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61,
+ 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70,
+ 0x6B71, 0x6B72, 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78,
+ 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88,
+ /* GB 0x9A80..0x9AFE */
+ 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97,
+ 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2,
+ 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB,
+ 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6,
+ 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0,
+ 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC,
+ 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE,
+ 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7,
+ 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2,
+ 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE,
+ 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09,
+ 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D,
+ 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31,
+ 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E,
+ 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D,
+ 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58,
+ /* GB 0x9B40..0x9B7E */
+ 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B,
+ 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77,
+ 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87,
+ 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96,
+ 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2,
+ 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7,
+ 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8,
+ 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8,
+ /* GB 0x9B80..0x9BFE */
+ 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7,
+ 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00,
+ 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D,
+ 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18,
+ 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24,
+ 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34,
+ 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44,
+ 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B,
+ 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68,
+ 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75,
+ 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80,
+ 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D,
+ 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A,
+ 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3,
+ 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD,
+ 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA,
+ /* GB 0x9C40..0x9C7E */
+ 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5,
+ 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5,
+ 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2,
+ 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF,
+ 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08,
+ 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19,
+ 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28,
+ 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35,
+ /* GB 0x9C80..0x9CFE */
+ 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F,
+ 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49,
+ 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55,
+ 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, 0x6E61,
+ 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69,
+ 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, 0x6E73,
+ 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B,
+ 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88,
+ 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93,
+ 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D,
+ 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9,
+ 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8,
+ 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5,
+ 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0,
+ 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3,
+ 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF,
+ /* GB 0x9D40..0x9D7E */
+ 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8,
+ 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01,
+ 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C,
+ 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18,
+ 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21,
+ 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E,
+ 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A,
+ 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42,
+ /* GB 0x9D80..0x9DFE */
+ 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E,
+ 0x6F4F, 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56,
+ 0x6F57, 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61,
+ 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B,
+ 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77,
+ 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82,
+ 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90,
+ 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98,
+ 0x6F99, 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2,
+ 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB,
+ 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4,
+ 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE,
+ 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8,
+ 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3,
+ 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB,
+ 0x6FDC, 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5,
+ /* GB 0x9E40..0x9E7E */
+ 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED,
+ 0x6FF0, 0x6FF1, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7,
+ 0x6FF8, 0x6FF9, 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF,
+ 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007,
+ 0x7008, 0x7009, 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F,
+ 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018,
+ 0x7019, 0x701C, 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022,
+ 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702A,
+ /* GB 0x9E80..0x9EFE */
+ 0x702B, 0x702C, 0x702D, 0x702E, 0x702F, 0x7030, 0x7031, 0x7032,
+ 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, 0x703C,
+ 0x703D, 0x703E, 0x703F, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044,
+ 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D,
+ 0x704E, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056,
+ 0x7057, 0x7058, 0x7059, 0x705A, 0x705B, 0x705C, 0x705D, 0x705F,
+ 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067,
+ 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073, 0x7074,
+ 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083,
+ 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F,
+ 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E,
+ 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6,
+ 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5,
+ 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7,
+ 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1,
+ 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA,
+ /* GB 0x9F40..0x9F7E */
+ 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5,
+ 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5,
+ 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100,
+ 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108,
+ 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114,
+ 0x7117, 0x711B, 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7121,
+ 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712A,
+ 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134,
+ /* GB 0x9F80..0x9FFE */
+ 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D,
+ 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146,
+ 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, 0x714F, 0x7150, 0x7151,
+ 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159,
+ 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163,
+ 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170,
+ 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C,
+ 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186,
+ 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190,
+ 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B,
+ 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5,
+ 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF,
+ 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA,
+ 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, 0x71C0, 0x71C1, 0x71C2,
+ 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, 0x71C9, 0x71CA, 0x71CB,
+ 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D2, 0x71D3,
+ /* GB 0xA040..0xA07E */
+ 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, 0x71DC, 0x71DD,
+ 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8,
+ 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, 0x71F0, 0x71F1,
+ 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA,
+ 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, 0x7201, 0x7202,
+ 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B,
+ 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, 0x7212, 0x7213,
+ 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A,
+ /* GB 0xA080..0xA0FE */
+ 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, 0x7223,
+ 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, 0x722E,
+ 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240,
+ 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A,
+ 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255,
+ 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264,
+ 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271,
+ 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D,
+ 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C,
+ 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297,
+ 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0,
+ 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, 0x72A8,
+ 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5,
+ 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5,
+ 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1,
+ 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB,
+ /* Skip: GB 0xA140..0xA17E, 0xA180..0xA1A0 (UDA 3) */
+ /* GB 0xA2A1..0xA2FE */
+ 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8,
+ 0x3003, 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B,
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011,
+ 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F,
+ 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220,
+ 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D,
+ 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235,
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04,
+ 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605,
+ 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3,
+ 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013,
+ /* Skip: GB 0xA240..0xA27E, 0xA280..0xA2A0 (UDA 3) */
+ /* GB 0xA3A1..0xA3FE */
+ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176,
+ 0x2177, 0x2178, 0x2179, 0xE766, 0xE767, 0xE768, 0xE769, 0xE76A,
+ 0xE76B, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E,
+ 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496,
+ 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476,
+ 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E,
+ 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486,
+ 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466,
+ 0x2467, 0x2468, 0x2469, 0x20AC, 0xE76D, 0x3220, 0x3221, 0x3222,
+ 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xE76E,
+ 0xE76F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166,
+ 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0xE770, 0xE771,
+ /* Skip: GB 0xA340..0xA37E, 0xA380..0xA3A0 (UDA 3) */
+ /* GB 0xA4A1..0xA4FE */
+ 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07,
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F,
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17,
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F,
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27,
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F,
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37,
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F,
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F,
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57,
+ 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3,
+ /* Skip: GB 0xA440..0xA47E, 0xA480..0xA4A0 (UDA 3) */
+ /* GB 0xA5A1..0xA5FE */
+ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, 0xE772, 0xE773, 0xE774, 0xE775,
+ 0xE776, 0xE777, 0xE778, 0xE779, 0xE77A, 0xE77B, 0xE77C,
+ /* Skip: GB 0xA540..0xA57E, 0xA580..0xA5A0 (UDA 3) */
+ /* GB 0xA6A1..0xA6FE */
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF,
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7,
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF,
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7,
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7,
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF,
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0xE77D,
+ 0xE77E, 0xE77F, 0xE780, 0xE781, 0xE782, 0xE783, 0xE784,
+ /* Skip: GB 0xA640..0xA67E, 0xA680..0xA6A0 (UDA 3) */
+ /* GB 0xA7A1..0xA7FE */
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+ 0x03A9, 0xE785, 0xE786, 0xE787, 0xE788, 0xE789, 0xE78A, 0xE78B,
+ 0xE78C, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+ 0x03C9, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791, 0xE792, 0xE793,
+ 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E,
+ 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xE794, 0xE795, 0xFE3B, 0xFE3C,
+ 0xFE37, 0xFE38, 0xFE31, 0xE796, 0xFE33, 0xFE34, 0xE797, 0xE798,
+ 0xE799, 0xE79A, 0xE79B, 0xE79C, 0xE79D, 0xE79E, 0xE79F,
+ /* Skip: GB 0xA740..0xA77E, 0xA780..0xA7A0 (UDA 3) */
+ /* GB 0xA8A1..0xA8FE */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D,
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D,
+ 0x042E, 0x042F, 0xE7A0, 0xE7A1, 0xE7A2, 0xE7A3, 0xE7A4, 0xE7A5,
+ 0xE7A6, 0xE7A7, 0xE7A8, 0xE7A9, 0xE7AA, 0xE7AB, 0xE7AC, 0xE7AD,
+ 0xE7AE, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451,
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+ 0x044E, 0x044F, 0xE7AF, 0xE7B0, 0xE7B1, 0xE7B2, 0xE7B3, 0xE7B4,
+ 0xE7B5, 0xE7B6, 0xE7B7, 0xE7B8, 0xE7B9, 0xE7BA, 0xE7BB,
+ /* GB 0xA840..0xA87E */
+ 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105,
+ 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223,
+ 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, 0x2552, 0x2553,
+ 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B,
+ 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x2562, 0x2563,
+ 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B,
+ 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573,
+ 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587,
+ /* GB 0xA880..0xA8FE */
+ 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F,
+ 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4,
+ 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0xE7BC, 0xE7BD,
+ 0xE7BE, 0xE7BF, 0xE7C0, 0xE7C1, 0xE7C2, 0xE7C3, 0xE7C4, 0xE7C5,
+ 0xE7C6, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B,
+ 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2,
+ 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA,
+ 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0x01F9,
+ 0x0261, 0xE7C9, 0xE7CA, 0xE7CB, 0xE7CC, 0x3105, 0x3106, 0x3107,
+ 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F,
+ 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117,
+ 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F,
+ 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127,
+ 0x3128, 0x3129, 0xE7CD, 0xE7CE, 0xE7CF, 0xE7D0, 0xE7D1, 0xE7D2,
+ 0xE7D3, 0xE7D4, 0xE7D5, 0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, 0xE7DA,
+ 0xE7DB, 0xE7DC, 0xE7DD, 0xE7DE, 0xE7DF, 0xE7E0, 0xE7E1,
+ /* GB 0xA940..0xA97E */
+ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028,
+ 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1,
+ 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4,
+ 0xE7E2, 0x2121, 0x3231, 0xE7E3, 0x2010, 0xE7E4, 0xE7E5, 0xE7E6,
+ 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E,
+ 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50,
+ 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A,
+ 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61,
+ /* GB 0xA980..0xA9FE */
+ 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A,
+ 0xFE6B, 0x303E, 0x2FF0, 0x2FF1, 0x2FF2, 0x2FF3, 0x2FF4, 0x2FF5,
+ 0x2FF6, 0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, 0x2FFB, 0x3007, 0xE7F4,
+ 0xE7F5, 0xE7F6, 0xE7F7, 0xE7F8, 0xE7F9, 0xE7FA, 0xE7FB, 0xE7FC,
+ 0xE7FD, 0xE7FE, 0xE7FF, 0xE800, 0x2500, 0x2501, 0x2502, 0x2503,
+ 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B,
+ 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513,
+ 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B,
+ 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523,
+ 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B,
+ 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533,
+ 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B,
+ 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543,
+ 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B,
+ 0xE801, 0xE802, 0xE803, 0xE804, 0xE805, 0xE806, 0xE807, 0xE808,
+ 0xE809, 0xE80A, 0xE80B, 0xE80C, 0xE80D, 0xE80E, 0xE80F,
+ /* GB 0xAA40..0xAA7E */
+ 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6,
+ 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE,
+ 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308,
+ 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312,
+ 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324,
+ 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333,
+ 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341,
+ 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348,
+ /* GB 0xAA80..0xAAA0 */
+ 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353,
+ 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C,
+ 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365,
+ 0x7366, 0x7367, 0x7368, 0x7369, 0x736A, 0x736B, 0x736E, 0x7370,
+ 0x7371, /* Skip: GB 0xAAA1..0xAAFE (UDA 1) */
+ /* GB 0xAB40..0xAB7E */
+ 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379,
+ 0x737A, 0x737B, 0x737C, 0x737D, 0x737F, 0x7380, 0x7381, 0x7382,
+ 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F,
+ 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399,
+ 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4,
+ 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1,
+ 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE,
+ 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7,
+ /* GB 0xAB80..0xABA0 */
+ 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6,
+ 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1,
+ 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC,
+ 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6,
+ 0x73F7, /* Skip: GB 0xABA1..0xABFE (UDA 1) */
+ /* GB 0xAC40..0xAC7E */
+ 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FE, 0x73FF,
+ 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740B, 0x740C,
+ 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416,
+ 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, 0x741F, 0x7420,
+ 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F,
+ 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D,
+ 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446,
+ 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, 0x744D,
+ /* GB 0xAC80..0xACA0 */
+ 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456,
+ 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465,
+ 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, 0x746E,
+ 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479,
+ 0x747A, /* Skip: GB 0xACA1..0xACFE (UDA 1) */
+ /* GB 0xAD40..0xAD7E */
+ 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486,
+ 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492,
+ 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A,
+ 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4,
+ 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF,
+ 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7,
+ 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0,
+ 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7,
+ /* GB 0xAD80..0xADA0 */
+ 0x74C8, 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF,
+ 0x74D0, 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8,
+ 0x74D9, 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7,
+ 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1,
+ 0x74F2, /* Skip: GB 0xADA1..0xADFE (UDA 1) */
+ /* GB 0xAE40..0xAE7E */
+ 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD,
+ 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507,
+ 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512,
+ 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520,
+ 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E,
+ 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542,
+ 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550,
+ 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558,
+ /* GB 0xAE80..0xAEA0 */
+ 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564,
+ 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F,
+ 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B,
+ 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585,
+ 0x7587, /* Skip: GB 0xAEA1..0xAEFE (UDA 1) */
+ /* GB 0xAF40..0xAF7E */
+ 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593,
+ 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7,
+ 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB,
+ 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF,
+ 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD,
+ 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE,
+ 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA,
+ 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607,
+ /* GB 0xAF80..0xAFA0 */
+ 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612,
+ 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621,
+ 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632,
+ 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642,
+ 0x7644, /* Skip: GB 0xAFA1..0xAFFE (UDA 1) */
+ /* GB 0xB040..0xB07E */
+ 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E,
+ 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658,
+ 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662,
+ 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C,
+ 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675,
+ 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681,
+ 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690,
+ 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, 0x769B,
+ /* GB 0xB080..0xB0FE */
+ 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3,
+ 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC,
+ 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B8,
+ 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, 0x76C1,
+ 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0,
+ 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698,
+ 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA,
+ 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1,
+ 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252,
+ 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB,
+ 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D,
+ 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591,
+ 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E,
+ 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E,
+ 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551,
+ 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265,
+ /* GB 0xB140..0xB17E */
+ 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9,
+ 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3,
+ 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC,
+ 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB,
+ 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A,
+ 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714,
+ 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E,
+ 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B,
+ /* GB 0xB180..0xB1FE */
+ 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739,
+ 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746,
+ 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F,
+ 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759,
+ 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1,
+ 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2,
+ 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8,
+ 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28,
+ 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B,
+ 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5,
+ 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A,
+ 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9,
+ 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9,
+ 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B,
+ 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448,
+ 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3,
+ /* GB 0xB240..0xB27E */
+ 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A,
+ 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774,
+ 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781,
+ 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B,
+ 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798,
+ 0x7799, 0x779A, 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3,
+ 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1,
+ 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA,
+ /* GB 0xB280..0xB2FE */
+ 0x77BC, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5,
+ 0x77C6, 0x77C7, 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE,
+ 0x77CF, 0x77D0, 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6,
+ 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1,
+ 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5,
+ 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B,
+ 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C,
+ 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8,
+ 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C,
+ 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695,
+ 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7,
+ 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56,
+ 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C,
+ 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7,
+ 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17,
+ 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316,
+ /* GB 0xB340..0xB37E */
+ 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4,
+ 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804,
+ 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F,
+ 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821,
+ 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831,
+ 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842,
+ 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D,
+ 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A,
+ /* GB 0xB380..0xB3FE */
+ 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, 0x7863,
+ 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786F, 0x7870,
+ 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879,
+ 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882,
+ 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382,
+ 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D,
+ 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4,
+ 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668,
+ 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE,
+ 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA,
+ 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319,
+ 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A,
+ 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07,
+ 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79,
+ 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71,
+ 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A,
+ /* GB 0xB440..0xB47E */
+ 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F, 0x7890,
+ 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0,
+ 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC,
+ 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA,
+ 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4,
+ 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1,
+ 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, 0x78DB, 0x78DC,
+ 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E3,
+ /* GB 0xB480..0xB4FE */
+ 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, 0x78ED,
+ 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8,
+ 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902,
+ 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B,
+ 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3,
+ 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE,
+ 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376,
+ 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF,
+ 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E,
+ 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A,
+ 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B,
+ 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC,
+ 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8,
+ 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE,
+ 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234,
+ 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E,
+ /* GB 0xB540..0xB57E */
+ 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915,
+ 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D,
+ 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927,
+ 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F,
+ 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938,
+ 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947,
+ 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951,
+ 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963,
+ /* GB 0xB580..0xB5FE */
+ 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970,
+ 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B,
+ 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987,
+ 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991,
+ 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8,
+ 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39,
+ 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363,
+ 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC,
+ 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B,
+ 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA,
+ 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95,
+ 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0,
+ 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535,
+ 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889,
+ 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03,
+ 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0,
+ /* GB 0xB640..0xB67E */
+ 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B,
+ 0x799C, 0x799D, 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3,
+ 0x79A4, 0x79A5, 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC,
+ 0x79AD, 0x79AE, 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5,
+ 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5,
+ 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3,
+ 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD,
+ 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA,
+ /* GB 0xB680..0xB6FE */
+ 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6,
+ 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04,
+ 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10,
+ 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B,
+ 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D,
+ 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8,
+ 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597,
+ 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A,
+ 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A,
+ 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD,
+ 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72,
+ 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6,
+ 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241,
+ 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9,
+ 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069,
+ 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C,
+ /* GB 0xB740..0xB77E */
+ 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27,
+ 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F,
+ 0x7A30, 0x7A31, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A,
+ 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47,
+ 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F,
+ 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59,
+ 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E, 0x7A5F, 0x7A60, 0x7A61,
+ 0x7A62, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68,
+ /* GB 0xB780..0xB7FE */
+ 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71,
+ 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82,
+ 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F,
+ 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1,
+ 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600,
+ 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE,
+ 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29,
+ 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F,
+ 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E,
+ 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F,
+ 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7,
+ 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124,
+ 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE,
+ 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4,
+ 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2,
+ 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D,
+ /* GB 0xB840..0xB87E */
+ 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF,
+ 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, 0x7AB7, 0x7AB8,
+ 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1,
+ 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, 0x7AC8, 0x7AC9,
+ 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2,
+ 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC,
+ 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA,
+ 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, 0x7AF3,
+ /* GB 0xB880..0xB8FE */
+ 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE,
+ 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D,
+ 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A,
+ 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29,
+ 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A,
+ 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150,
+ 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C,
+ 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A,
+ 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6,
+ 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76,
+ 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38,
+ 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8,
+ 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5,
+ 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769,
+ 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404,
+ 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9,
+ /* GB 0xB940..0xB97E */
+ 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39,
+ 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44,
+ 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57,
+ 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65,
+ 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D,
+ 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C,
+ 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87,
+ 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F,
+ /* GB 0xB980..0xB9FE */
+ 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B,
+ 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF,
+ 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA,
+ 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3,
+ 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D,
+ 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E,
+ 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7,
+ 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D,
+ 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8,
+ 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC,
+ 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA,
+ 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF,
+ 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D,
+ 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678,
+ 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD,
+ 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8,
+ /* GB 0xBA40..0xBA7E */
+ 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF,
+ 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB,
+ 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7,
+ 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2,
+ 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB,
+ 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05,
+ 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11,
+ 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19,
+ /* GB 0xBA80..0xBAFE */
+ 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22,
+ 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D,
+ 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35,
+ 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E,
+ 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87,
+ 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD,
+ 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D,
+ 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E,
+ 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475,
+ 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408,
+ 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64,
+ 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC,
+ 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679,
+ 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334,
+ 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A,
+ 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56,
+ /* GB 0xBB40..0xBB7E */
+ 0x7C43, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A,
+ 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53,
+ 0x7C54, 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B,
+ 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, 0x7C60, 0x7C61, 0x7C62, 0x7C63,
+ 0x7C64, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C69, 0x7C6A, 0x7C6B,
+ 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, 0x7C70, 0x7C71, 0x7C72, 0x7C75,
+ 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80,
+ 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87,
+ /* GB 0xBB80..0xBBFE */
+ 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90,
+ 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1,
+ 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD,
+ 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA,
+ 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237,
+ 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316,
+ 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF,
+ 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62,
+ 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA,
+ 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C,
+ 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4,
+ 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F,
+ 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364,
+ 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19,
+ 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB,
+ 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95,
+ /* GB 0xBC40..0xBC7E */
+ 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB,
+ 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8,
+ 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4,
+ 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED,
+ 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6,
+ 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, 0x7CFF, 0x7D00,
+ 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, 0x7D07, 0x7D08,
+ 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, 0x7D10,
+ /* GB 0xBC80..0xBCFE */
+ 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, 0x7D18,
+ 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, 0x7D21,
+ 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C,
+ 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, 0x7D35,
+ 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC,
+ 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6,
+ 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324,
+ 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E,
+ 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0,
+ 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7,
+ 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532,
+ 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C,
+ 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9,
+ 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877,
+ 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB,
+ 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6,
+ /* GB 0xBD40..0xBD7E */
+ 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E,
+ 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46,
+ 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E,
+ 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56,
+ 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E,
+ 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66,
+ 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F,
+ 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76,
+ /* GB 0xBD80..0xBDFE */
+ 0x7D78, 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F,
+ 0x7D80, 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87,
+ 0x7D88, 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F,
+ 0x7D90, 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97,
+ 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7,
+ 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B,
+ 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912,
+ 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07,
+ 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2,
+ 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83,
+ 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636,
+ 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED,
+ 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C,
+ 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4,
+ 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28,
+ 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78,
+ /* GB 0xBE40..0xBE7E */
+ 0x7D99, 0x7D9A, 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0,
+ 0x7DA1, 0x7DA2, 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9,
+ 0x7DAA, 0x7DAB, 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2,
+ 0x7DB3, 0x7DB4, 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA,
+ 0x7DBB, 0x7DBC, 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2,
+ 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA,
+ 0x7DCB, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2,
+ 0x7DD3, 0x7DD4, 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9,
+ /* GB 0xBE80..0xBEFE */
+ 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1,
+ 0x7DE2, 0x7DE3, 0x7DE4, 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9,
+ 0x7DEA, 0x7DEB, 0x7DEC, 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1,
+ 0x7DF2, 0x7DF3, 0x7DF4, 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9,
+ 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676,
+ 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66,
+ 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9,
+ 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76,
+ 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9,
+ 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0,
+ 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480,
+ 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177,
+ 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267,
+ 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485,
+ 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0,
+ 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB,
+ /* GB 0xBF40..0xBF7E */
+ 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02,
+ 0x7E03, 0x7E04, 0x7E05, 0x7E06, 0x7E07, 0x7E08, 0x7E09, 0x7E0A,
+ 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E10, 0x7E11, 0x7E12,
+ 0x7E13, 0x7E14, 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A,
+ 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, 0x7E1F, 0x7E20, 0x7E21, 0x7E22,
+ 0x7E23, 0x7E24, 0x7E25, 0x7E26, 0x7E27, 0x7E28, 0x7E29, 0x7E2A,
+ 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, 0x7E2F, 0x7E30, 0x7E31, 0x7E32,
+ 0x7E33, 0x7E34, 0x7E35, 0x7E36, 0x7E37, 0x7E38, 0x7E39,
+ /* GB 0xBF80..0xBFFE */
+ 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43,
+ 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C,
+ 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E52, 0x7E53, 0x7E54,
+ 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5A, 0x7E5B, 0x7E5C,
+ 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496,
+ 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A,
+ 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0,
+ 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760,
+ 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3,
+ 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF,
+ 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54,
+ 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F,
+ 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8,
+ 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321,
+ 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F,
+ 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080,
+ /* GB 0xC040..0xC07E */
+ 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, 0x7E64, 0x7E65,
+ 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, 0x7E6C, 0x7E6D,
+ 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, 0x7E74, 0x7E75,
+ 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, 0x7E7C, 0x7E7D,
+ 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86,
+ 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, 0x7E8D, 0x7E8E,
+ 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, 0x7E95, 0x7E96,
+ 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, 0x7E9E,
+ /* GB 0xC080..0xC0FE */
+ 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9,
+ 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D,
+ 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48,
+ 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, 0x7F52,
+ 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0,
+ 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721,
+ 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A,
+ 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD,
+ 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC,
+ 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001,
+ 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7,
+ 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B,
+ 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281,
+ 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC,
+ 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389,
+ 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0,
+ /* GB 0xC140..0xC17E */
+ 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63,
+ 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F,
+ 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B,
+ 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85,
+ 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90,
+ 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99,
+ 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8,
+ 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1,
+ /* GB 0xC180..0xC1FE */
+ 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE,
+ 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9,
+ 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6,
+ 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2,
+ 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483,
+ 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C,
+ 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3,
+ 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF,
+ 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE,
+ 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599,
+ 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7,
+ 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D,
+ 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A,
+ 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C,
+ 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41,
+ 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF,
+ /* GB 0xC240..0xC27E */
+ 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF,
+ 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA,
+ 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A,
+ 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E,
+ 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E,
+ 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E,
+ 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E,
+ 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057,
+ /* GB 0xC280..0xC2FE */
+ 0x8059, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061,
+ 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B,
+ 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8072, 0x8073, 0x8074,
+ 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807A, 0x807B, 0x807C,
+ 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402,
+ 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089,
+ 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF,
+ 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74,
+ 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651,
+ 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A,
+ 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26,
+ 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B,
+ 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC,
+ 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B,
+ 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792,
+ 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B,
+ /* GB 0xC340..0xC37E */
+ 0x807E, 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E,
+ 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099,
+ 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3,
+ 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8,
+ 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3,
+ 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6,
+ 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100,
+ 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B,
+ /* GB 0xC380..0xC3FE */
+ 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, 0x811F,
+ 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127,
+ 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133,
+ 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D,
+ 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD,
+ 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302,
+ 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885,
+ 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF,
+ 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC,
+ 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F,
+ 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73,
+ 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720,
+ 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7,
+ 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511,
+ 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E,
+ 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478,
+ /* GB 0xC440..0xC47E */
+ 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149,
+ 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B,
+ 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164,
+ 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173,
+ 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185,
+ 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190,
+ 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A,
+ 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5,
+ /* GB 0xC480..0xC4FE */
+ 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0,
+ 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9,
+ 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8,
+ 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2,
+ 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54,
+ 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE,
+ 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6,
+ 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE,
+ 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3,
+ 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357,
+ 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6,
+ 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A,
+ 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA,
+ 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18,
+ 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A,
+ 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81,
+ /* GB 0xC540..0xC57E */
+ 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB,
+ 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4,
+ 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0,
+ 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA,
+ 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B,
+ 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218,
+ 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227,
+ 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F,
+ /* GB 0xC580..0xC5FE */
+ 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A,
+ 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254,
+ 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E,
+ 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267,
+ 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113,
+ 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696,
+ 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27,
+ 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4,
+ 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98,
+ 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554,
+ 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B,
+ 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA,
+ 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7,
+ 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA,
+ 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F,
+ 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7,
+ /* GB 0xC640..0xC67E */
+ 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277,
+ 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286,
+ 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296,
+ 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2,
+ 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2,
+ 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA,
+ 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED,
+ 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8,
+ /* GB 0xC680..0xC6FE */
+ 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B,
+ 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D,
+ 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325,
+ 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B,
+ 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB,
+ 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02,
+ 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1,
+ 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6,
+ 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44,
+ 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461,
+ 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31,
+ 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03,
+ 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67,
+ 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91,
+ 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668,
+ 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390,
+ /* GB 0xC740..0xC77E */
+ 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A,
+ 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357,
+ 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373,
+ 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380,
+ 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B,
+ 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396,
+ 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3,
+ 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE,
+ /* GB 0xC780..0xC7FE */
+ 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4,
+ 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1,
+ 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE,
+ 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC,
+ 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343,
+ 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3,
+ 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20,
+ 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A,
+ 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54,
+ 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D,
+ 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2,
+ 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81,
+ 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674,
+ 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB,
+ 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B,
+ 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20,
+ /* GB 0xC840..0xC87E */
+ 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA,
+ 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407,
+ 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415,
+ 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420,
+ 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D,
+ 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436,
+ 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441,
+ 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449,
+ /* GB 0xC880..0xC8FE */
+ 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8452,
+ 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F,
+ 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A,
+ 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B,
+ 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7,
+ 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238,
+ 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E,
+ 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4,
+ 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9,
+ 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4,
+ 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338,
+ 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197,
+ 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982,
+ 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A,
+ 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12,
+ 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1,
+ /* GB 0xC940..0xC97E */
+ 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485,
+ 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493,
+ 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E,
+ 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7,
+ 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0,
+ 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE,
+ 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB,
+ 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7,
+ /* GB 0xC980..0xC9FE */
+ 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2,
+ 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE,
+ 0x84EF, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7,
+ 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501,
+ 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A,
+ 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E,
+ 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E,
+ 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D,
+ 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55,
+ 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A,
+ 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA,
+ 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7,
+ 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E,
+ 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20,
+ 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E,
+ 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3,
+ /* GB 0xCA40..0xCA7E */
+ 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A,
+ 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515,
+ 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520,
+ 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529,
+ 0x852A, 0x852D, 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533,
+ 0x8534, 0x8535, 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542,
+ 0x8544, 0x8545, 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E,
+ 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555,
+ /* GB 0xCA80..0xCAFE */
+ 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560,
+ 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856A,
+ 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573,
+ 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580,
+ 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931,
+ 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3,
+ 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2,
+ 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB,
+ 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F,
+ 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F,
+ 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996,
+ 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C,
+ 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1,
+ 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9,
+ 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811,
+ 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31,
+ /* GB 0xCB40..0xCB7E */
+ 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C,
+ 0x858D, 0x858E, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,
+ 0x8596, 0x8597, 0x8598, 0x8599, 0x859A, 0x859D, 0x859E, 0x859F,
+ 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9,
+ 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5,
+ 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF,
+ 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8,
+ 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2,
+ /* GB 0xCB80..0xCBFE */
+ 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD,
+ 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6,
+ 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF,
+ 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7,
+ 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05,
+ 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761,
+ 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714,
+ 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D,
+ 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972,
+ 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC,
+ 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7,
+ 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9,
+ 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5,
+ 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59,
+ 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22,
+ 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854,
+ /* GB 0xCC40..0xCC7E */
+ 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602,
+ 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B,
+ 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, 0x8613, 0x8614,
+ 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D,
+ 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625,
+ 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F,
+ 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637,
+ 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, 0x8640,
+ /* GB 0xCC80..0xCCFE */
+ 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648,
+ 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, 0x8656,
+ 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660,
+ 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669,
+ 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC,
+ 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A,
+ 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D,
+ 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD,
+ 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6,
+ 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4,
+ 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957,
+ 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22,
+ 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F,
+ 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530,
+ 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A,
+ 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3,
+ /* GB 0xCD40..0xCD7E */
+ 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676,
+ 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688,
+ 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696,
+ 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0,
+ 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2,
+ 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE,
+ 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD,
+ 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC,
+ /* GB 0xCD80..0xCDFE */
+ 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7,
+ 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7,
+ 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705,
+ 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714,
+ 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247,
+ 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5,
+ 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934,
+ 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82,
+ 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893,
+ 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6,
+ 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5,
+ 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6,
+ 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D,
+ 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB,
+ 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789,
+ 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01,
+ /* GB 0xCE40..0xCE7E */
+ 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727,
+ 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732,
+ 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D,
+ 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A,
+ 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755,
+ 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F,
+ 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B,
+ 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775,
+ /* GB 0xCE80..0xCEFE */
+ 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784,
+ 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790,
+ 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A,
+ 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3,
+ 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4,
+ 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4,
+ 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F,
+ 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170,
+ 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B,
+ 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717,
+ 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB,
+ 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C,
+ 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348,
+ 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269,
+ 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F,
+ 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A,
+ /* GB 0xCF40..0xCF7E */
+ 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1,
+ 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC,
+ 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7,
+ 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4,
+ 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD,
+ 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7,
+ 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, 0x87EF, 0x87F0, 0x87F1,
+ 0x87F2, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8,
+ /* GB 0xCF80..0xCFFE */
+ 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802,
+ 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C,
+ 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817,
+ 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820,
+ 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC,
+ 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D,
+ 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F,
+ 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1,
+ 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528,
+ 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237,
+ 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E,
+ 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF,
+ 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61,
+ 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7,
+ 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A,
+ 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653,
+ /* GB 0xD040..0xD07E */
+ 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B,
+ 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, 0x8833, 0x8834,
+ 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E,
+ 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849,
+ 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853,
+ 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E,
+ 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871,
+ 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A,
+ /* GB 0xD080..0xD0FE */
+ 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A,
+ 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895,
+ 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F,
+ 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9,
+ 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548,
+ 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A,
+ 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9,
+ 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C,
+ 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F,
+ 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2,
+ 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6,
+ 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E,
+ 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C,
+ 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157,
+ 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA,
+ 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384,
+ /* GB 0xD140..0xD17E */
+ 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5,
+ 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF,
+ 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC,
+ 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA,
+ 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7,
+ 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2,
+ 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900,
+ 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908,
+ /* GB 0xD180..0xD1FE */
+ 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914,
+ 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F,
+ 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929,
+ 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935,
+ 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66,
+ 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2,
+ 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A,
+ 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD,
+ 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A,
+ 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25,
+ 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E,
+ 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830,
+ 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4,
+ 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C,
+ 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2,
+ 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476,
+ /* GB 0xD240..0xD27E */
+ 0x8938, 0x8939, 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F,
+ 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949,
+ 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951,
+ 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959,
+ 0x895A, 0x895B, 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963,
+ 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C,
+ 0x896D, 0x896E, 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974,
+ 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C,
+ /* GB 0xD280..0xD2FE */
+ 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988,
+ 0x8989, 0x898A, 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990,
+ 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998,
+ 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0,
+ 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC,
+ 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237,
+ 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3,
+ 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1,
+ 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA,
+ 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681,
+ 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613,
+ 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB,
+ 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2,
+ 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE,
+ 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F,
+ 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690,
+ /* GB 0xD340..0xD37E */
+ 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, 0x89A9,
+ 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1,
+ 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9,
+ 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0x89BF, 0x89C0, 0x89C3,
+ 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB,
+ 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8,
+ 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2,
+ 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, 0x89FA,
+ /* GB 0xD380..0xD3FE */
+ 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A01, 0x8A02, 0x8A03,
+ 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, 0x8A0A, 0x8A0B, 0x8A0C,
+ 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, 0x8A12, 0x8A13, 0x8A14,
+ 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, 0x8A1A, 0x8A1B, 0x8A1C,
+ 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28,
+ 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8,
+ 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3,
+ 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C,
+ 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7,
+ 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149,
+ 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C,
+ 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206,
+ 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685,
+ 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED,
+ 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB,
+ 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89,
+ /* GB 0xD440..0xD47E */
+ 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, 0x8A24, 0x8A25,
+ 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, 0x8A2C, 0x8A2D,
+ 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, 0x8A34, 0x8A35,
+ 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, 0x8A3C, 0x8A3D,
+ 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A46,
+ 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4E, 0x8A4F,
+ 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57,
+ 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E,
+ /* GB 0xD480..0xD4FE */
+ 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66,
+ 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E,
+ 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76,
+ 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, 0x8A7F,
+ 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33,
+ 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95,
+ 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1,
+ 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5,
+ 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7,
+ 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5,
+ 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0,
+ 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43,
+ 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9,
+ 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5,
+ 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E,
+ 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67,
+ /* GB 0xD540..0xD57E */
+ 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88,
+ 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92,
+ 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B,
+ 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3,
+ 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB,
+ 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3,
+ 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB,
+ 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2,
+ /* GB 0xD580..0xD5FE */
+ 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA,
+ 0x8ACB, 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2,
+ 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA,
+ 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2,
+ 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D,
+ 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8,
+ 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97,
+ 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B,
+ 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8,
+ 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C,
+ 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146,
+ 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005,
+ 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504,
+ 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA,
+ 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81,
+ 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F,
+ /* GB 0xD640..0xD67E */
+ 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB,
+ 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3,
+ 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB,
+ 0x8AFC, 0x8AFD, 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03,
+ 0x8B04, 0x8B05, 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C,
+ 0x8B0D, 0x8B0E, 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14,
+ 0x8B15, 0x8B16, 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C,
+ 0x8B1D, 0x8B1E, 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23,
+ /* GB 0xD680..0xD6FE */
+ 0x8B24, 0x8B25, 0x8B27, 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C,
+ 0x8B2D, 0x8B2E, 0x8B2F, 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34,
+ 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C,
+ 0x8B3D, 0x8B3E, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44,
+ 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F,
+ 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7,
+ 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740,
+ 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A,
+ 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A,
+ 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92,
+ 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF,
+ 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC,
+ 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C,
+ 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB,
+ 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B,
+ 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51,
+ /* GB 0xD740..0xD77E */
+ 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D,
+ 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55,
+ 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D,
+ 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65,
+ 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F,
+ 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77,
+ 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F,
+ 0x8B80, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, 0x8B86,
+ /* GB 0xD780..0xD7FE */
+ 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, 0x8B8E,
+ 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, 0x8B96,
+ 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, 0x8B9E,
+ 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09,
+ 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD,
+ 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84,
+ 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD,
+ 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353,
+ 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A,
+ 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B,
+ 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03,
+ 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70,
+ 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5,
+ 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A,
+ 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C,
+ 0x5750, 0x5EA7, 0xE810, 0xE811, 0xE812, 0xE813, 0xE814,
+ /* GB 0xD840..0xD87E */
+ 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F,
+ 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B,
+ 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54,
+ 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E,
+ 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68,
+ 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72,
+ 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E,
+ 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87,
+ /* GB 0xD880..0xD8FE */
+ 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92,
+ 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C,
+ 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4,
+ 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC,
+ 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15,
+ 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F,
+ 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4,
+ 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C,
+ 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D,
+ 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5,
+ 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208,
+ 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261,
+ 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182,
+ 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB,
+ 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27,
+ 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D,
+ /* GB 0xD940..0xD97E */
+ 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5,
+ 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD,
+ 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5,
+ 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD,
+ 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5,
+ 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD,
+ 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5,
+ 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC,
+ /* GB 0xD980..0xD9FE */
+ 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4,
+ 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC,
+ 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04,
+ 0x8D05, 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C,
+ 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91,
+ 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC,
+ 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC,
+ 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F,
+ 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E,
+ 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7,
+ 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE,
+ 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0,
+ 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914,
+ 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0,
+ 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980,
+ 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC,
+ /* GB 0xDA40..0xDA7E */
+ 0x8D0E, 0x8D0F, 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15,
+ 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20,
+ 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A,
+ 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A,
+ 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83,
+ 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F,
+ 0x8D90, 0x8D92, 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99,
+ 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1,
+ /* GB 0xDA80..0xDAFE */
+ 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA,
+ 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6,
+ 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5,
+ 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3,
+ 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7,
+ 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF,
+ 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC,
+ 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3,
+ 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07,
+ 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19,
+ 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27,
+ 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36,
+ 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D,
+ 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672,
+ 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D,
+ 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA,
+ /* GB 0xDB40..0xDB7E */
+ 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5,
+ 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2,
+ 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02,
+ 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E,
+ 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18,
+ 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25,
+ 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33,
+ 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E,
+ /* GB 0xDB80..0xDBFE */
+ 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F,
+ 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E5A,
+ 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62,
+ 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E,
+ 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4,
+ 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB,
+ 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F,
+ 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD,
+ 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD,
+ 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF,
+ 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729,
+ 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B,
+ 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768,
+ 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF,
+ 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9,
+ 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD,
+ /* GB 0xDC40..0xDC7E */
+ 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D,
+ 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89,
+ 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93,
+ 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D,
+ 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6,
+ 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1,
+ 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB,
+ 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, 0x8EC2,
+ /* GB 0xDC80..0xDCFE */
+ 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECA,
+ 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3,
+ 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB,
+ 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3,
+ 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819,
+ 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880,
+ 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A,
+ 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8,
+ 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE,
+ 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F,
+ 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F,
+ 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3,
+ 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C,
+ 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331,
+ 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340,
+ 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365,
+ /* GB 0xDD40..0xDD7E */
+ 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC,
+ 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4,
+ 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC,
+ 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04,
+ 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C,
+ 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14,
+ 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C,
+ 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23,
+ /* GB 0xDD80..0xDDFE */
+ 0x8F24, 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B,
+ 0x8F2C, 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33,
+ 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B,
+ 0x8F3C, 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43,
+ 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E,
+ 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C,
+ 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398,
+ 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8,
+ 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438,
+ 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9,
+ 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451,
+ 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478,
+ 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D,
+ 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF,
+ 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3,
+ 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A,
+ /* GB 0xDE40..0xDE7E */
+ 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C,
+ 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54,
+ 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C,
+ 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64,
+ 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1,
+ 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD,
+ 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8,
+ 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6,
+ /* GB 0xDE80..0xDEFE */
+ 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6,
+ 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF,
+ 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC,
+ 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015,
+ 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568,
+ 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4,
+ 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9,
+ 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605,
+ 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037,
+ 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34,
+ 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE,
+ 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371,
+ 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE,
+ 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE,
+ 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420,
+ 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496,
+ /* GB 0xDF40..0xDF7E */
+ 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029,
+ 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034,
+ 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045,
+ 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054,
+ 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F,
+ 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B,
+ 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077,
+ 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081,
+ /* GB 0xDF80..0xDFFE */
+ 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D,
+ 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A,
+ 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8,
+ 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF,
+ 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0,
+ 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2,
+ 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB,
+ 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456,
+ 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494,
+ 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466,
+ 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6,
+ 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC,
+ 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF,
+ 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522,
+ 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5,
+ 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C,
+ /* GB 0xE040..0xE07E */
+ 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD,
+ 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE,
+ 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC,
+ 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7,
+ 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103,
+ 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, 0x910B, 0x910C,
+ 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114,
+ 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C,
+ /* GB 0xE080..0xE0FE */
+ 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127,
+ 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x9130,
+ 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913A,
+ 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142,
+ 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530,
+ 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581,
+ 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE,
+ 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB,
+ 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2,
+ 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E,
+ 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627,
+ 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659,
+ 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B,
+ 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1,
+ 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C,
+ 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C,
+ /* GB 0xE140..0xE17E */
+ 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156,
+ 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167,
+ 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180,
+ 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E,
+ 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199,
+ 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5,
+ 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1,
+ 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB,
+ /* GB 0xE180..0xE1FE */
+ 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3,
+ 0x91C4, 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3,
+ 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB,
+ 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4,
+ 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C,
+ 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91,
+ 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1,
+ 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5,
+ 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06,
+ 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F,
+ 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99,
+ 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87,
+ 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5,
+ 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8,
+ 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9,
+ 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA,
+ /* GB 0xE240..0xE27E */
+ 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED,
+ 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5,
+ 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD,
+ 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,
+ 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D,
+ 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,
+ 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D,
+ 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224,
+ /* GB 0xE280..0xE2FE */
+ 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C,
+ 0x922D, 0x922E, 0x922F, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234,
+ 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C,
+ 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244,
+ 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D,
+ 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350,
+ 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925,
+ 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A,
+ 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987,
+ 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80,
+ 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE,
+ 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA,
+ 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1,
+ 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019,
+ 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A,
+ 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042,
+ /* GB 0xE340..0xE37E */
+ 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D,
+ 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255,
+ 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D,
+ 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265,
+ 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D,
+ 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276,
+ 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E,
+ 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285,
+ /* GB 0xE380..0xE3FE */
+ 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D,
+ 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296,
+ 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E,
+ 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6,
+ 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083,
+ 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8,
+ 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4,
+ 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7,
+ 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1,
+ 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606,
+ 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615,
+ 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35,
+ 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C,
+ 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4,
+ 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6,
+ 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE,
+ /* GB 0xE440..0xE47E */
+ 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AF, 0x92B0,
+ 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8,
+ 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0,
+ 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C9,
+ 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1,
+ 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9,
+ 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1,
+ 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8,
+ /* GB 0xE480..0xE4FE */
+ 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0,
+ 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8,
+ 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300,
+ 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308,
+ 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04,
+ 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F,
+ 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E,
+ 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7,
+ 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD,
+ 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E,
+ 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25,
+ 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5,
+ 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F,
+ 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9,
+ 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89,
+ 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1,
+ /* GB 0xE540..0xE57E */
+ 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311,
+ 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319,
+ 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321,
+ 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329,
+ 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331,
+ 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339,
+ 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342,
+ 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349,
+ /* GB 0xE580..0xE5FE */
+ 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351,
+ 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359,
+ 0x935A, 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361,
+ 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369,
+ 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE,
+ 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035,
+ 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8,
+ 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47,
+ 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9,
+ 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011,
+ 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044,
+ 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9,
+ 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57,
+ 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63,
+ 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B,
+ 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3,
+ /* GB 0xE640..0xE67E */
+ 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373,
+ 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B,
+ 0x937C, 0x937D, 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383,
+ 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B,
+ 0x938C, 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394,
+ 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C,
+ 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4,
+ 0x93A5, 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB,
+ /* GB 0xE680..0xE6FE */
+ 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3,
+ 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB,
+ 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3,
+ 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC,
+ 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2,
+ 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3,
+ 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23,
+ 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75,
+ 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2,
+ 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6,
+ 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40,
+ 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62,
+ 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81,
+ 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98,
+ 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5,
+ 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9,
+ /* GB 0xE740..0xE77E */
+ 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5,
+ 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE,
+ 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6,
+ 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE,
+ 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6,
+ 0x93F7, 0x93F8, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE,
+ 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406,
+ 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, 0x940C, 0x940D,
+ /* GB 0xE780..0xE7FE */
+ 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415,
+ 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D,
+ 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425,
+ 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D,
+ 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9,
+ 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1,
+ 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6,
+ 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08,
+ 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C,
+ 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26,
+ 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31,
+ 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095,
+ 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1,
+ 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C,
+ 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A,
+ 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C,
+ /* GB 0xE840..0xE87E */
+ 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436,
+ 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943F,
+ 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447,
+ 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F,
+ 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457,
+ 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F,
+ 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467,
+ 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, 0x946F,
+ /* GB 0xE880..0xE8FE */
+ 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477,
+ 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, 0x947F,
+ 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498,
+ 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C,
+ 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459,
+ 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487,
+ 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA,
+ 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769,
+ 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8,
+ 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8,
+ 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3,
+ 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD,
+ 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864,
+ 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E,
+ 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893,
+ 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9,
+ /* GB 0xE940..0xE97E */
+ 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A,
+ 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A,
+ 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583,
+ 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B,
+ 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593,
+ 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B,
+ 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3,
+ 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA,
+ /* GB 0xE980..0xE9FE */
+ 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2,
+ 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA,
+ 0x95BB, 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2,
+ 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA,
+ 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910,
+ 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980,
+ 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989,
+ 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD,
+ 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D,
+ 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44,
+ 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D,
+ 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB,
+ 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93,
+ 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71,
+ 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A,
+ 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B,
+ /* GB 0xEA40..0xEA7E */
+ 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3,
+ 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB,
+ 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3,
+ 0x95E4, 0x95E5, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613,
+ 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626,
+ 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630,
+ 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A,
+ 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657,
+ /* GB 0xEA80..0xEAFE */
+ 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663,
+ 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671,
+ 0x9673, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, 0x967E,
+ 0x967F, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689,
+ 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B,
+ 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C,
+ 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534,
+ 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615,
+ 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635,
+ 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657,
+ 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC,
+ 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40,
+ 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59,
+ 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1,
+ 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284,
+ 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0,
+ /* GB 0xEB40..0xEB7E */
+ 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A,
+ 0x969B, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, 0x96A2, 0x96A3,
+ 0x96A4, 0x96A5, 0x96A6, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC,
+ 0x96AD, 0x96AE, 0x96AF, 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7,
+ 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA,
+ 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D6, 0x96D7, 0x96D8,
+ 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E1,
+ 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB,
+ /* GB 0xEB80..0xEBFE */
+ 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5,
+ 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703,
+ 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714,
+ 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, 0x971F,
+ 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5,
+ 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19,
+ 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555,
+ 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F,
+ 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD,
+ 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2,
+ 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1,
+ 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112,
+ 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C,
+ 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C,
+ 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191,
+ 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB,
+ /* GB 0xEC40..0xEC7E */
+ 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728,
+ 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734,
+ 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, 0x973F,
+ 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747,
+ 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F,
+ 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C,
+ 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976A,
+ 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771,
+ /* GB 0xEC80..0xECFE */
+ 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D,
+ 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786,
+ 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790,
+ 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C,
+ 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46,
+ 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3,
+ 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6,
+ 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C,
+ 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8,
+ 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C,
+ 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3,
+ 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D,
+ 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243,
+ 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C,
+ 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A,
+ 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0,
+ /* GB 0xED40..0xED7E */
+ 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7,
+ 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3,
+ 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC,
+ 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4,
+ 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC,
+ 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4,
+ 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC,
+ 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3,
+ /* GB 0xED80..0xEDFE */
+ 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2,
+ 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD,
+ 0x97FE, 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805,
+ 0x9806, 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D,
+ 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063,
+ 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1,
+ 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8,
+ 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C,
+ 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C,
+ 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850,
+ 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C,
+ 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9,
+ 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934,
+ 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9,
+ 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735,
+ 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768,
+ /* GB 0xEE40..0xEE7E */
+ 0x980F, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816,
+ 0x9817, 0x9818, 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E,
+ 0x981F, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826,
+ 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E,
+ 0x982F, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836,
+ 0x9837, 0x9838, 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E,
+ 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846,
+ 0x9847, 0x9848, 0x9849, 0x984A, 0x984B, 0x984C, 0x984D,
+ /* GB 0xEE80..0xEEFE */
+ 0x984E, 0x984F, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855,
+ 0x9856, 0x9857, 0x9858, 0x9859, 0x985A, 0x985B, 0x985C, 0x985D,
+ 0x985E, 0x985F, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865,
+ 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, 0x986B, 0x986C, 0x986D,
+ 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C,
+ 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540,
+ 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58,
+ 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81,
+ 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B,
+ 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495,
+ 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD,
+ 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8,
+ 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9,
+ 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2,
+ 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF,
+ 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA,
+ /* GB 0xEF40..0xEF7E */
+ 0x986F, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988B, 0x988E,
+ 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A8, 0x98A9, 0x98AA, 0x98AB,
+ 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3,
+ 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB,
+ 0x98BC, 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3,
+ 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB,
+ 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB,
+ 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4,
+ /* GB 0xEF80..0xEFFE */
+ 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE,
+ 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6,
+ 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x98FE,
+ 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906,
+ 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5,
+ 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506,
+ 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513,
+ 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F,
+ 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534,
+ 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535,
+ 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552,
+ 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E,
+ 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567,
+ 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572,
+ 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3,
+ 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14,
+ /* GB 0xF040..0xF07E */
+ 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, 0x990F, 0x9911,
+ 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919,
+ 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, 0x9920, 0x9921,
+ 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929,
+ 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932,
+ 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993A,
+ 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, 0x9941, 0x9942,
+ 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949,
+ /* GB 0xF080..0xF0FE */
+ 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951,
+ 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B,
+ 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, 0x9964,
+ 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983,
+ 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688,
+ 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20,
+ 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31,
+ 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42,
+ 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E,
+ 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63,
+ 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71,
+ 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC,
+ 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3,
+ 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB,
+ 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605,
+ 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619,
+ /* GB 0xF140..0xF17E */
+ 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F,
+ 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9,
+ 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1,
+ 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9,
+ 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1,
+ 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9,
+ 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1,
+ 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8,
+ /* GB 0xF180..0xF1FE */
+ 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0,
+ 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8,
+ 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0,
+ 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8,
+ 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630,
+ 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654,
+ 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79,
+ 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8,
+ 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882,
+ 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3,
+ 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921,
+ 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941,
+ 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012,
+ 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027,
+ 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D,
+ 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883,
+ /* GB 0xF240..0xF27E */
+ 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01,
+ 0x9A02, 0x9A03, 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09,
+ 0x9A0A, 0x9A0B, 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11,
+ 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19,
+ 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21,
+ 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29,
+ 0x9A2A, 0x9A2B, 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31,
+ 0x9A32, 0x9A33, 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38,
+ /* GB 0xF280..0xF2FE */
+ 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40,
+ 0x9A41, 0x9A42, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48,
+ 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50,
+ 0x9A51, 0x9A52, 0x9A53, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58,
+ 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B,
+ 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654,
+ 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D,
+ 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9,
+ 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF,
+ 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3,
+ 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703,
+ 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B,
+ 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731,
+ 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B,
+ 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C,
+ 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2,
+ /* GB 0xF340..0xF37E */
+ 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A5F, 0x9A60, 0x9A61,
+ 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69,
+ 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94,
+ 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD,
+ 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB,
+ 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8,
+ 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4,
+ 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC,
+ /* GB 0xF380..0xF3FE */
+ 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7,
+ 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, 0x9AF0, 0x9AF1, 0x9AF2,
+ 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC,
+ 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05,
+ 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB,
+ 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1,
+ 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813,
+ 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42,
+ 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04,
+ 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19,
+ 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E,
+ 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E,
+ 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8,
+ 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB,
+ 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6,
+ 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B,
+ /* GB 0xF440..0xF47E */
+ 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10,
+ 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19,
+ 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B22,
+ 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2B,
+ 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35,
+ 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F,
+ 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52,
+ 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A,
+ /* GB 0xF480..0xF4FE */
+ 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, 0x9B62,
+ 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A,
+ 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72,
+ 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A,
+ 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE,
+ 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223,
+ 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234,
+ 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268,
+ 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F,
+ 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D,
+ 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7,
+ 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8,
+ 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE,
+ 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8,
+ 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D,
+ 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164,
+ /* GB 0xF540..0xF57E */
+ 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83,
+ 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B,
+ 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93,
+ 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B,
+ 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3,
+ 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB,
+ 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3,
+ 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA,
+ /* GB 0xF580..0xF5FE */
+ 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2,
+ 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA,
+ 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2,
+ 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA,
+ 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E,
+ 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191,
+ 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4,
+ 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69,
+ 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA,
+ 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8,
+ 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D,
+ 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39,
+ 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52,
+ 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F,
+ 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85,
+ 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC,
+ /* GB 0xF640..0xF67E */
+ 0x9BDC, 0x9BDD, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3,
+ 0x9BE4, 0x9BE5, 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB,
+ 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3,
+ 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB,
+ 0x9BFC, 0x9BFD, 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03,
+ 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B,
+ 0x9C0C, 0x9C0D, 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13,
+ 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A,
+ /* GB 0xF680..0xF6FE */
+ 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22,
+ 0x9C23, 0x9C24, 0x9C25, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A,
+ 0x9C2B, 0x9C2C, 0x9C2D, 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32,
+ 0x9C33, 0x9C34, 0x9C35, 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A,
+ 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9,
+ 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A,
+ 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87,
+ 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9,
+ 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE,
+ 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F,
+ 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E,
+ 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E,
+ 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7,
+ 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2,
+ 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC,
+ 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB,
+ /* GB 0xF740..0xF77E */
+ 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43,
+ 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, 0x9C4A, 0x9C4B,
+ 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0x9C53,
+ 0x9C54, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C5B,
+ 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63,
+ 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B,
+ 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73,
+ 0x9C74, 0x9C75, 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A,
+ /* GB 0xF780..0xF7FE */
+ 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A,
+ 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D,
+ 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1,
+ 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0,
+ 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4,
+ 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2,
+ 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3,
+ 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA,
+ 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1,
+ 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8,
+ 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF,
+ 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F,
+ 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B,
+ 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0,
+ 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22,
+ 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44,
+ /* GB 0xF840..0xF87E */
+ 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA,
+ 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2,
+ 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA,
+ 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02,
+ 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, 0x9D09, 0x9D0A,
+ 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, 0x9D11, 0x9D12,
+ 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, 0x9D19, 0x9D1A,
+ 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, 0x9D21,
+ /* GB 0xF880..0xF8A0 */
+ 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, 0x9D29,
+ 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, 0x9D31,
+ 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39,
+ 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, 0x9D41,
+ 0x9D42, /* Skip: GB 0xF8A1..0xF8FE (UDA 2) */
+ /* GB 0xF940..0xF97E */
+ 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A,
+ 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52,
+ 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A,
+ 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62,
+ 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A,
+ 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72,
+ 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A,
+ 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81,
+ /* GB 0xF980..0xF9A0 */
+ 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89,
+ 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91,
+ 0x9D92, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99,
+ 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1,
+ 0x9DA2, /* Skip: GB 0xF9A1..0xF9FE (UDA 2) */
+ /* GB 0xFA40..0xFA7E */
+ 0x9DA3, 0x9DA4, 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA,
+ 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2,
+ 0x9DB3, 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA,
+ 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2,
+ 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA,
+ 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2,
+ 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA,
+ 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1,
+ /* GB 0xFA80..0xFAA0 */
+ 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9,
+ 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1,
+ 0x9DF2, 0x9DF3, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9,
+ 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01,
+ 0x9E02, /* Skip: GB 0xFAA1..0xFAFE (UDA 2) */
+ /* GB 0xFB40..0xFB7E */
+ 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A,
+ 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10, 0x9E11, 0x9E12,
+ 0x9E13, 0x9E14, 0x9E15, 0x9E16, 0x9E17, 0x9E18, 0x9E19, 0x9E1A,
+ 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, 0x9E24, 0x9E27, 0x9E2E, 0x9E30,
+ 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53,
+ 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62,
+ 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E75, 0x9E76, 0x9E77,
+ 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E80,
+ /* GB 0xFB80..0xFBA0 */
+ 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C,
+ 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96,
+ 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0,
+ 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA7, 0x9EA8, 0x9EA9,
+ 0x9EAA, /* Skip: GB 0xFBA1..0xFBFE (UDA 2) */
+ /* GB 0xFC40..0xFC7E */
+ 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB2,
+ 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF,
+ 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8,
+ 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6,
+ 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6,
+ 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2,
+ 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EFA, 0x9EFD,
+ 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05,
+ /* GB 0xFC80..0xFCA0 */
+ 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11,
+ 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C,
+ 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26,
+ 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30,
+ 0x9F31, /* Skip: GB 0xFCA1..0xFCFE (UDA 2) */
+ /* GB 0xFD40..0xFD7E */
+ 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C,
+ 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47,
+ 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F,
+ 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59,
+ 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61,
+ 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69,
+ 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71,
+ 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78,
+ /* GB 0xFD80..0xFDA0 */
+ 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82,
+ 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94,
+ 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1,
+ 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7,
+ 0xF9F1, /* Skip: GB 0xFDA1..0xFDFE (UDA 2) */
+ /* GB 0xFE40..0xFE7E */
+ 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18,
+ 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29,
+ 0x2E81, 0xE816, 0xE817, 0xE818, 0x2E84, 0x3473, 0x3447, 0x2E88,
+ 0x2E8B, 0xE81E, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E,
+ 0x3918, 0xE826, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0xE82B, 0xE82C,
+ 0x3B4E, 0x3C6E, 0x3CE0, 0x2EA7, 0xE831, 0xE832, 0x2EAA, 0x4056,
+ 0x415F, 0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0xE83B, 0x43B1,
+ 0x43AC, 0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0xE843,
+ /* GB 0xFE80..0xFEA0 */
+ 0x4723, 0x4729, 0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D,
+ 0x4982, 0x4983, 0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6,
+ 0xE854, 0xE855, 0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2,
+ 0x4D13, 0x4D14, 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE,
+ 0xE864, /* Skip: GB 0xFEA1..0xFEFE (UDA 2) */
+};
+
+static quint16 const gb18030_4byte_to_ucs[6793] = {
+ /* Contiguous area: GB+81 30 81 30 .. GB+81 30 D2 39 */
+ /* GB+81 30 81 30 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084,
+ /* GB+81 30 81 35 */ 0x0085, 0x0086, 0x0087, 0x0088, 0x0089,
+ /* GB+81 30 82 30 */ 0x008A, 0x008B, 0x008C, 0x008D, 0x008E,
+ /* GB+81 30 82 35 */ 0x008F, 0x0090, 0x0091, 0x0092, 0x0093,
+ /* GB+81 30 83 30 */ 0x0094, 0x0095, 0x0096, 0x0097, 0x0098,
+ /* GB+81 30 83 35 */ 0x0099, 0x009A, 0x009B, 0x009C, 0x009D,
+ /* GB+81 30 84 30 */ 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2,
+ /* GB+81 30 84 35 */ 0x00A3, 0x00A5, 0x00A6, 0x00A9, 0x00AA,
+ /* GB+81 30 85 30 */ 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ /* GB+81 30 85 35 */ 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6,
+ /* GB+81 30 86 30 */ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC,
+ /* GB+81 30 86 35 */ 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
+ /* GB+81 30 87 30 */ 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6,
+ /* GB+81 30 87 35 */ 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB,
+ /* GB+81 30 88 30 */ 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0,
+ /* GB+81 30 88 35 */ 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
+ /* GB+81 30 89 30 */ 0x00D6, 0x00D8, 0x00D9, 0x00DA, 0x00DB,
+ /* GB+81 30 89 35 */ 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E2,
+ /* GB+81 30 8A 30 */ 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ /* GB+81 30 8A 35 */ 0x00EB, 0x00EE, 0x00EF, 0x00F0, 0x00F1,
+ /* GB+81 30 8B 30 */ 0x00F4, 0x00F5, 0x00F6, 0x00F8, 0x00FB,
+ /* GB+81 30 8B 35 */ 0x00FD, 0x00FE, 0x00FF, 0x0100, 0x0102,
+ /* GB+81 30 8C 30 */ 0x0103, 0x0104, 0x0105, 0x0106, 0x0107,
+ /* GB+81 30 8C 35 */ 0x0108, 0x0109, 0x010A, 0x010B, 0x010C,
+ /* GB+81 30 8D 30 */ 0x010D, 0x010E, 0x010F, 0x0110, 0x0111,
+ /* GB+81 30 8D 35 */ 0x0112, 0x0114, 0x0115, 0x0116, 0x0117,
+ /* GB+81 30 8E 30 */ 0x0118, 0x0119, 0x011A, 0x011C, 0x011D,
+ /* GB+81 30 8E 35 */ 0x011E, 0x011F, 0x0120, 0x0121, 0x0122,
+ /* GB+81 30 8F 30 */ 0x0123, 0x0124, 0x0125, 0x0126, 0x0127,
+ /* GB+81 30 8F 35 */ 0x0128, 0x0129, 0x012A, 0x012C, 0x012D,
+ /* GB+81 30 90 30 */ 0x012E, 0x012F, 0x0130, 0x0131, 0x0132,
+ /* GB+81 30 90 35 */ 0x0133, 0x0134, 0x0135, 0x0136, 0x0137,
+ /* GB+81 30 91 30 */ 0x0138, 0x0139, 0x013A, 0x013B, 0x013C,
+ /* GB+81 30 91 35 */ 0x013D, 0x013E, 0x013F, 0x0140, 0x0141,
+ /* GB+81 30 92 30 */ 0x0142, 0x0143, 0x0145, 0x0146, 0x0147,
+ /* GB+81 30 92 35 */ 0x0149, 0x014A, 0x014B, 0x014C, 0x014E,
+ /* GB+81 30 93 30 */ 0x014F, 0x0150, 0x0151, 0x0152, 0x0153,
+ /* GB+81 30 93 35 */ 0x0154, 0x0155, 0x0156, 0x0157, 0x0158,
+ /* GB+81 30 94 30 */ 0x0159, 0x015A, 0x015B, 0x015C, 0x015D,
+ /* GB+81 30 94 35 */ 0x015E, 0x015F, 0x0160, 0x0161, 0x0162,
+ /* GB+81 30 95 30 */ 0x0163, 0x0164, 0x0165, 0x0166, 0x0167,
+ /* GB+81 30 95 35 */ 0x0168, 0x0169, 0x016A, 0x016C, 0x016D,
+ /* GB+81 30 96 30 */ 0x016E, 0x016F, 0x0170, 0x0171, 0x0172,
+ /* GB+81 30 96 35 */ 0x0173, 0x0174, 0x0175, 0x0176, 0x0177,
+ /* GB+81 30 97 30 */ 0x0178, 0x0179, 0x017A, 0x017B, 0x017C,
+ /* GB+81 30 97 35 */ 0x017D, 0x017E, 0x017F, 0x0180, 0x0181,
+ /* GB+81 30 98 30 */ 0x0182, 0x0183, 0x0184, 0x0185, 0x0186,
+ /* GB+81 30 98 35 */ 0x0187, 0x0188, 0x0189, 0x018A, 0x018B,
+ /* GB+81 30 99 30 */ 0x018C, 0x018D, 0x018E, 0x018F, 0x0190,
+ /* GB+81 30 99 35 */ 0x0191, 0x0192, 0x0193, 0x0194, 0x0195,
+ /* GB+81 30 9A 30 */ 0x0196, 0x0197, 0x0198, 0x0199, 0x019A,
+ /* GB+81 30 9A 35 */ 0x019B, 0x019C, 0x019D, 0x019E, 0x019F,
+ /* GB+81 30 9B 30 */ 0x01A0, 0x01A1, 0x01A2, 0x01A3, 0x01A4,
+ /* GB+81 30 9B 35 */ 0x01A5, 0x01A6, 0x01A7, 0x01A8, 0x01A9,
+ /* GB+81 30 9C 30 */ 0x01AA, 0x01AB, 0x01AC, 0x01AD, 0x01AE,
+ /* GB+81 30 9C 35 */ 0x01AF, 0x01B0, 0x01B1, 0x01B2, 0x01B3,
+ /* GB+81 30 9D 30 */ 0x01B4, 0x01B5, 0x01B6, 0x01B7, 0x01B8,
+ /* GB+81 30 9D 35 */ 0x01B9, 0x01BA, 0x01BB, 0x01BC, 0x01BD,
+ /* GB+81 30 9E 30 */ 0x01BE, 0x01BF, 0x01C0, 0x01C1, 0x01C2,
+ /* GB+81 30 9E 35 */ 0x01C3, 0x01C4, 0x01C5, 0x01C6, 0x01C7,
+ /* GB+81 30 9F 30 */ 0x01C8, 0x01C9, 0x01CA, 0x01CB, 0x01CC,
+ /* GB+81 30 9F 35 */ 0x01CD, 0x01CF, 0x01D1, 0x01D3, 0x01D5,
+ /* GB+81 30 A0 30 */ 0x01D7, 0x01D9, 0x01DB, 0x01DD, 0x01DE,
+ /* GB+81 30 A0 35 */ 0x01DF, 0x01E0, 0x01E1, 0x01E2, 0x01E3,
+ /* GB+81 30 A1 30 */ 0x01E4, 0x01E5, 0x01E6, 0x01E7, 0x01E8,
+ /* GB+81 30 A1 35 */ 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED,
+ /* GB+81 30 A2 30 */ 0x01EE, 0x01EF, 0x01F0, 0x01F1, 0x01F2,
+ /* GB+81 30 A2 35 */ 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7,
+ /* GB+81 30 A3 30 */ 0x01F8, 0x01FA, 0x01FB, 0x01FC, 0x01FD,
+ /* GB+81 30 A3 35 */ 0x01FE, 0x01FF, 0x0200, 0x0201, 0x0202,
+ /* GB+81 30 A4 30 */ 0x0203, 0x0204, 0x0205, 0x0206, 0x0207,
+ /* GB+81 30 A4 35 */ 0x0208, 0x0209, 0x020A, 0x020B, 0x020C,
+ /* GB+81 30 A5 30 */ 0x020D, 0x020E, 0x020F, 0x0210, 0x0211,
+ /* GB+81 30 A5 35 */ 0x0212, 0x0213, 0x0214, 0x0215, 0x0216,
+ /* GB+81 30 A6 30 */ 0x0217, 0x0218, 0x0219, 0x021A, 0x021B,
+ /* GB+81 30 A6 35 */ 0x021C, 0x021D, 0x021E, 0x021F, 0x0220,
+ /* GB+81 30 A7 30 */ 0x0221, 0x0222, 0x0223, 0x0224, 0x0225,
+ /* GB+81 30 A7 35 */ 0x0226, 0x0227, 0x0228, 0x0229, 0x022A,
+ /* GB+81 30 A8 30 */ 0x022B, 0x022C, 0x022D, 0x022E, 0x022F,
+ /* GB+81 30 A8 35 */ 0x0230, 0x0231, 0x0232, 0x0233, 0x0234,
+ /* GB+81 30 A9 30 */ 0x0235, 0x0236, 0x0237, 0x0238, 0x0239,
+ /* GB+81 30 A9 35 */ 0x023A, 0x023B, 0x023C, 0x023D, 0x023E,
+ /* GB+81 30 AA 30 */ 0x023F, 0x0240, 0x0241, 0x0242, 0x0243,
+ /* GB+81 30 AA 35 */ 0x0244, 0x0245, 0x0246, 0x0247, 0x0248,
+ /* GB+81 30 AB 30 */ 0x0249, 0x024A, 0x024B, 0x024C, 0x024D,
+ /* GB+81 30 AB 35 */ 0x024E, 0x024F, 0x0250, 0x0252, 0x0253,
+ /* GB+81 30 AC 30 */ 0x0254, 0x0255, 0x0256, 0x0257, 0x0258,
+ /* GB+81 30 AC 35 */ 0x0259, 0x025A, 0x025B, 0x025C, 0x025D,
+ /* GB+81 30 AD 30 */ 0x025E, 0x025F, 0x0260, 0x0262, 0x0263,
+ /* GB+81 30 AD 35 */ 0x0264, 0x0265, 0x0266, 0x0267, 0x0268,
+ /* GB+81 30 AE 30 */ 0x0269, 0x026A, 0x026B, 0x026C, 0x026D,
+ /* GB+81 30 AE 35 */ 0x026E, 0x026F, 0x0270, 0x0271, 0x0272,
+ /* GB+81 30 AF 30 */ 0x0273, 0x0274, 0x0275, 0x0276, 0x0277,
+ /* GB+81 30 AF 35 */ 0x0278, 0x0279, 0x027A, 0x027B, 0x027C,
+ /* GB+81 30 B0 30 */ 0x027D, 0x027E, 0x027F, 0x0280, 0x0281,
+ /* GB+81 30 B0 35 */ 0x0282, 0x0283, 0x0284, 0x0285, 0x0286,
+ /* GB+81 30 B1 30 */ 0x0287, 0x0288, 0x0289, 0x028A, 0x028B,
+ /* GB+81 30 B1 35 */ 0x028C, 0x028D, 0x028E, 0x028F, 0x0290,
+ /* GB+81 30 B2 30 */ 0x0291, 0x0292, 0x0293, 0x0294, 0x0295,
+ /* GB+81 30 B2 35 */ 0x0296, 0x0297, 0x0298, 0x0299, 0x029A,
+ /* GB+81 30 B3 30 */ 0x029B, 0x029C, 0x029D, 0x029E, 0x029F,
+ /* GB+81 30 B3 35 */ 0x02A0, 0x02A1, 0x02A2, 0x02A3, 0x02A4,
+ /* GB+81 30 B4 30 */ 0x02A5, 0x02A6, 0x02A7, 0x02A8, 0x02A9,
+ /* GB+81 30 B4 35 */ 0x02AA, 0x02AB, 0x02AC, 0x02AD, 0x02AE,
+ /* GB+81 30 B5 30 */ 0x02AF, 0x02B0, 0x02B1, 0x02B2, 0x02B3,
+ /* GB+81 30 B5 35 */ 0x02B4, 0x02B5, 0x02B6, 0x02B7, 0x02B8,
+ /* GB+81 30 B6 30 */ 0x02B9, 0x02BA, 0x02BB, 0x02BC, 0x02BD,
+ /* GB+81 30 B6 35 */ 0x02BE, 0x02BF, 0x02C0, 0x02C1, 0x02C2,
+ /* GB+81 30 B7 30 */ 0x02C3, 0x02C4, 0x02C5, 0x02C6, 0x02C8,
+ /* GB+81 30 B7 35 */ 0x02CC, 0x02CD, 0x02CE, 0x02CF, 0x02D0,
+ /* GB+81 30 B8 30 */ 0x02D1, 0x02D2, 0x02D3, 0x02D4, 0x02D5,
+ /* GB+81 30 B8 35 */ 0x02D6, 0x02D7, 0x02D8, 0x02DA, 0x02DB,
+ /* GB+81 30 B9 30 */ 0x02DC, 0x02DD, 0x02DE, 0x02DF, 0x02E0,
+ /* GB+81 30 B9 35 */ 0x02E1, 0x02E2, 0x02E3, 0x02E4, 0x02E5,
+ /* GB+81 30 BA 30 */ 0x02E6, 0x02E7, 0x02E8, 0x02E9, 0x02EA,
+ /* GB+81 30 BA 35 */ 0x02EB, 0x02EC, 0x02ED, 0x02EE, 0x02EF,
+ /* GB+81 30 BB 30 */ 0x02F0, 0x02F1, 0x02F2, 0x02F3, 0x02F4,
+ /* GB+81 30 BB 35 */ 0x02F5, 0x02F6, 0x02F7, 0x02F8, 0x02F9,
+ /* GB+81 30 BC 30 */ 0x02FA, 0x02FB, 0x02FC, 0x02FD, 0x02FE,
+ /* GB+81 30 BC 35 */ 0x02FF, 0x0300, 0x0301, 0x0302, 0x0303,
+ /* GB+81 30 BD 30 */ 0x0304, 0x0305, 0x0306, 0x0307, 0x0308,
+ /* GB+81 30 BD 35 */ 0x0309, 0x030A, 0x030B, 0x030C, 0x030D,
+ /* GB+81 30 BE 30 */ 0x030E, 0x030F, 0x0310, 0x0311, 0x0312,
+ /* GB+81 30 BE 35 */ 0x0313, 0x0314, 0x0315, 0x0316, 0x0317,
+ /* GB+81 30 BF 30 */ 0x0318, 0x0319, 0x031A, 0x031B, 0x031C,
+ /* GB+81 30 BF 35 */ 0x031D, 0x031E, 0x031F, 0x0320, 0x0321,
+ /* GB+81 30 C0 30 */ 0x0322, 0x0323, 0x0324, 0x0325, 0x0326,
+ /* GB+81 30 C0 35 */ 0x0327, 0x0328, 0x0329, 0x032A, 0x032B,
+ /* GB+81 30 C1 30 */ 0x032C, 0x032D, 0x032E, 0x032F, 0x0330,
+ /* GB+81 30 C1 35 */ 0x0331, 0x0332, 0x0333, 0x0334, 0x0335,
+ /* GB+81 30 C2 30 */ 0x0336, 0x0337, 0x0338, 0x0339, 0x033A,
+ /* GB+81 30 C2 35 */ 0x033B, 0x033C, 0x033D, 0x033E, 0x033F,
+ /* GB+81 30 C3 30 */ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344,
+ /* GB+81 30 C3 35 */ 0x0345, 0x0346, 0x0347, 0x0348, 0x0349,
+ /* GB+81 30 C4 30 */ 0x034A, 0x034B, 0x034C, 0x034D, 0x034E,
+ /* GB+81 30 C4 35 */ 0x034F, 0x0350, 0x0351, 0x0352, 0x0353,
+ /* GB+81 30 C5 30 */ 0x0354, 0x0355, 0x0356, 0x0357, 0x0358,
+ /* GB+81 30 C5 35 */ 0x0359, 0x035A, 0x035B, 0x035C, 0x035D,
+ /* GB+81 30 C6 30 */ 0x035E, 0x035F, 0x0360, 0x0361, 0x0362,
+ /* GB+81 30 C6 35 */ 0x0363, 0x0364, 0x0365, 0x0366, 0x0367,
+ /* GB+81 30 C7 30 */ 0x0368, 0x0369, 0x036A, 0x036B, 0x036C,
+ /* GB+81 30 C7 35 */ 0x036D, 0x036E, 0x036F, 0x0370, 0x0371,
+ /* GB+81 30 C8 30 */ 0x0372, 0x0373, 0x0374, 0x0375, 0x0376,
+ /* GB+81 30 C8 35 */ 0x0377, 0x0378, 0x0379, 0x037A, 0x037B,
+ /* GB+81 30 C9 30 */ 0x037C, 0x037D, 0x037E, 0x037F, 0x0380,
+ /* GB+81 30 C9 35 */ 0x0381, 0x0382, 0x0383, 0x0384, 0x0385,
+ /* GB+81 30 CA 30 */ 0x0386, 0x0387, 0x0388, 0x0389, 0x038A,
+ /* GB+81 30 CA 35 */ 0x038B, 0x038C, 0x038D, 0x038E, 0x038F,
+ /* GB+81 30 CB 30 */ 0x0390, 0x03A2, 0x03AA, 0x03AB, 0x03AC,
+ /* GB+81 30 CB 35 */ 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03C2,
+ /* GB+81 30 CC 30 */ 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE,
+ /* GB+81 30 CC 35 */ 0x03CF, 0x03D0, 0x03D1, 0x03D2, 0x03D3,
+ /* GB+81 30 CD 30 */ 0x03D4, 0x03D5, 0x03D6, 0x03D7, 0x03D8,
+ /* GB+81 30 CD 35 */ 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD,
+ /* GB+81 30 CE 30 */ 0x03DE, 0x03DF, 0x03E0, 0x03E1, 0x03E2,
+ /* GB+81 30 CE 35 */ 0x03E3, 0x03E4, 0x03E5, 0x03E6, 0x03E7,
+ /* GB+81 30 CF 30 */ 0x03E8, 0x03E9, 0x03EA, 0x03EB, 0x03EC,
+ /* GB+81 30 CF 35 */ 0x03ED, 0x03EE, 0x03EF, 0x03F0, 0x03F1,
+ /* GB+81 30 D0 30 */ 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6,
+ /* GB+81 30 D0 35 */ 0x03F7, 0x03F8, 0x03F9, 0x03FA, 0x03FB,
+ /* GB+81 30 D1 30 */ 0x03FC, 0x03FD, 0x03FE, 0x03FF, 0x0400,
+ /* GB+81 30 D1 35 */ 0x0402, 0x0403, 0x0404, 0x0405, 0x0406,
+ /* GB+81 30 D2 30 */ 0x0407, 0x0408, 0x0409, 0x040A, 0x040B,
+ /* GB+81 30 D2 35 */ 0x040C, 0x040D, 0x040E, 0x040F, 0x0450,
+ /* Contiguous area: GB+81 36 A5 32 .. GB+81 37 A8 38 */
+ /* GB+81 36 A5 32 */ 0x2011, 0x2012, 0x2017,
+ /* GB+81 36 A5 35 */ 0x201A, 0x201B, 0x201E, 0x201F, 0x2020,
+ /* GB+81 36 A6 30 */ 0x2021, 0x2022, 0x2023, 0x2024, 0x2027,
+ /* GB+81 36 A6 35 */ 0x2028, 0x2029, 0x202A, 0x202B, 0x202C,
+ /* GB+81 36 A7 30 */ 0x202D, 0x202E, 0x202F, 0x2031, 0x2034,
+ /* GB+81 36 A7 35 */ 0x2036, 0x2037, 0x2038, 0x2039, 0x203A,
+ /* GB+81 36 A8 30 */ 0x203C, 0x203D, 0x203E, 0x203F, 0x2040,
+ /* GB+81 36 A8 35 */ 0x2041, 0x2042, 0x2043, 0x2044, 0x2045,
+ /* GB+81 36 A9 30 */ 0x2046, 0x2047, 0x2048, 0x2049, 0x204A,
+ /* GB+81 36 A9 35 */ 0x204B, 0x204C, 0x204D, 0x204E, 0x204F,
+ /* GB+81 36 AA 30 */ 0x2050, 0x2051, 0x2052, 0x2053, 0x2054,
+ /* GB+81 36 AA 35 */ 0x2055, 0x2056, 0x2057, 0x2058, 0x2059,
+ /* GB+81 36 AB 30 */ 0x205A, 0x205B, 0x205C, 0x205D, 0x205E,
+ /* GB+81 36 AB 35 */ 0x205F, 0x2060, 0x2061, 0x2062, 0x2063,
+ /* GB+81 36 AC 30 */ 0x2064, 0x2065, 0x2066, 0x2067, 0x2068,
+ /* GB+81 36 AC 35 */ 0x2069, 0x206A, 0x206B, 0x206C, 0x206D,
+ /* GB+81 36 AD 30 */ 0x206E, 0x206F, 0x2070, 0x2071, 0x2072,
+ /* GB+81 36 AD 35 */ 0x2073, 0x2074, 0x2075, 0x2076, 0x2077,
+ /* GB+81 36 AE 30 */ 0x2078, 0x2079, 0x207A, 0x207B, 0x207C,
+ /* GB+81 36 AE 35 */ 0x207D, 0x207E, 0x207F, 0x2080, 0x2081,
+ /* GB+81 36 AF 30 */ 0x2082, 0x2083, 0x2084, 0x2085, 0x2086,
+ /* GB+81 36 AF 35 */ 0x2087, 0x2088, 0x2089, 0x208A, 0x208B,
+ /* GB+81 36 B0 30 */ 0x208C, 0x208D, 0x208E, 0x208F, 0x2090,
+ /* GB+81 36 B0 35 */ 0x2091, 0x2092, 0x2093, 0x2094, 0x2095,
+ /* GB+81 36 B1 30 */ 0x2096, 0x2097, 0x2098, 0x2099, 0x209A,
+ /* GB+81 36 B1 35 */ 0x209B, 0x209C, 0x209D, 0x209E, 0x209F,
+ /* GB+81 36 B2 30 */ 0x20A0, 0x20A1, 0x20A2, 0x20A3, 0x20A4,
+ /* GB+81 36 B2 35 */ 0x20A5, 0x20A6, 0x20A7, 0x20A8, 0x20A9,
+ /* GB+81 36 B3 30 */ 0x20AA, 0x20AB, 0x20AD, 0x20AE, 0x20AF,
+ /* GB+81 36 B3 35 */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4,
+ /* GB+81 36 B4 30 */ 0x20B5, 0x20B6, 0x20B7, 0x20B8, 0x20B9,
+ /* GB+81 36 B4 35 */ 0x20BA, 0x20BB, 0x20BC, 0x20BD, 0x20BE,
+ /* GB+81 36 B5 30 */ 0x20BF, 0x20C0, 0x20C1, 0x20C2, 0x20C3,
+ /* GB+81 36 B5 35 */ 0x20C4, 0x20C5, 0x20C6, 0x20C7, 0x20C8,
+ /* GB+81 36 B6 30 */ 0x20C9, 0x20CA, 0x20CB, 0x20CC, 0x20CD,
+ /* GB+81 36 B6 35 */ 0x20CE, 0x20CF, 0x20D0, 0x20D1, 0x20D2,
+ /* GB+81 36 B7 30 */ 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7,
+ /* GB+81 36 B7 35 */ 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC,
+ /* GB+81 36 B8 30 */ 0x20DD, 0x20DE, 0x20DF, 0x20E0, 0x20E1,
+ /* GB+81 36 B8 35 */ 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6,
+ /* GB+81 36 B9 30 */ 0x20E7, 0x20E8, 0x20E9, 0x20EA, 0x20EB,
+ /* GB+81 36 B9 35 */ 0x20EC, 0x20ED, 0x20EE, 0x20EF, 0x20F0,
+ /* GB+81 36 BA 30 */ 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5,
+ /* GB+81 36 BA 35 */ 0x20F6, 0x20F7, 0x20F8, 0x20F9, 0x20FA,
+ /* GB+81 36 BB 30 */ 0x20FB, 0x20FC, 0x20FD, 0x20FE, 0x20FF,
+ /* GB+81 36 BB 35 */ 0x2100, 0x2101, 0x2102, 0x2104, 0x2106,
+ /* GB+81 36 BC 30 */ 0x2107, 0x2108, 0x210A, 0x210B, 0x210C,
+ /* GB+81 36 BC 35 */ 0x210D, 0x210E, 0x210F, 0x2110, 0x2111,
+ /* GB+81 36 BD 30 */ 0x2112, 0x2113, 0x2114, 0x2115, 0x2117,
+ /* GB+81 36 BD 35 */ 0x2118, 0x2119, 0x211A, 0x211B, 0x211C,
+ /* GB+81 36 BE 30 */ 0x211D, 0x211E, 0x211F, 0x2120, 0x2122,
+ /* GB+81 36 BE 35 */ 0x2123, 0x2124, 0x2125, 0x2126, 0x2127,
+ /* GB+81 36 BF 30 */ 0x2128, 0x2129, 0x212A, 0x212B, 0x212C,
+ /* GB+81 36 BF 35 */ 0x212D, 0x212E, 0x212F, 0x2130, 0x2131,
+ /* GB+81 36 C0 30 */ 0x2132, 0x2133, 0x2134, 0x2135, 0x2136,
+ /* GB+81 36 C0 35 */ 0x2137, 0x2138, 0x2139, 0x213A, 0x213B,
+ /* GB+81 36 C1 30 */ 0x213C, 0x213D, 0x213E, 0x213F, 0x2140,
+ /* GB+81 36 C1 35 */ 0x2141, 0x2142, 0x2143, 0x2144, 0x2145,
+ /* GB+81 36 C2 30 */ 0x2146, 0x2147, 0x2148, 0x2149, 0x214A,
+ /* GB+81 36 C2 35 */ 0x214B, 0x214C, 0x214D, 0x214E, 0x214F,
+ /* GB+81 36 C3 30 */ 0x2150, 0x2151, 0x2152, 0x2153, 0x2154,
+ /* GB+81 36 C3 35 */ 0x2155, 0x2156, 0x2157, 0x2158, 0x2159,
+ /* GB+81 36 C4 30 */ 0x215A, 0x215B, 0x215C, 0x215D, 0x215E,
+ /* GB+81 36 C4 35 */ 0x215F, 0x216C, 0x216D, 0x216E, 0x216F,
+ /* GB+81 36 C5 30 */ 0x217A, 0x217B, 0x217C, 0x217D, 0x217E,
+ /* GB+81 36 C5 35 */ 0x217F, 0x2180, 0x2181, 0x2182, 0x2183,
+ /* GB+81 36 C6 30 */ 0x2184, 0x2185, 0x2186, 0x2187, 0x2188,
+ /* GB+81 36 C6 35 */ 0x2189, 0x218A, 0x218B, 0x218C, 0x218D,
+ /* GB+81 36 C7 30 */ 0x218E, 0x218F, 0x2194, 0x2195, 0x219A,
+ /* GB+81 36 C7 35 */ 0x219B, 0x219C, 0x219D, 0x219E, 0x219F,
+ /* GB+81 36 C8 30 */ 0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4,
+ /* GB+81 36 C8 35 */ 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9,
+ /* GB+81 36 C9 30 */ 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE,
+ /* GB+81 36 C9 35 */ 0x21AF, 0x21B0, 0x21B1, 0x21B2, 0x21B3,
+ /* GB+81 36 CA 30 */ 0x21B4, 0x21B5, 0x21B6, 0x21B7, 0x21B8,
+ /* GB+81 36 CA 35 */ 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD,
+ /* GB+81 36 CB 30 */ 0x21BE, 0x21BF, 0x21C0, 0x21C1, 0x21C2,
+ /* GB+81 36 CB 35 */ 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7,
+ /* GB+81 36 CC 30 */ 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC,
+ /* GB+81 36 CC 35 */ 0x21CD, 0x21CE, 0x21CF, 0x21D0, 0x21D1,
+ /* GB+81 36 CD 30 */ 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6,
+ /* GB+81 36 CD 35 */ 0x21D7, 0x21D8, 0x21D9, 0x21DA, 0x21DB,
+ /* GB+81 36 CE 30 */ 0x21DC, 0x21DD, 0x21DE, 0x21DF, 0x21E0,
+ /* GB+81 36 CE 35 */ 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5,
+ /* GB+81 36 CF 30 */ 0x21E6, 0x21E7, 0x21E8, 0x21E9, 0x21EA,
+ /* GB+81 36 CF 35 */ 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF,
+ /* GB+81 36 D0 30 */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4,
+ /* GB+81 36 D0 35 */ 0x21F5, 0x21F6, 0x21F7, 0x21F8, 0x21F9,
+ /* GB+81 36 D1 30 */ 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE,
+ /* GB+81 36 D1 35 */ 0x21FF, 0x2200, 0x2201, 0x2202, 0x2203,
+ /* GB+81 36 D2 30 */ 0x2204, 0x2205, 0x2206, 0x2207, 0x2209,
+ /* GB+81 36 D2 35 */ 0x220A, 0x220B, 0x220C, 0x220D, 0x220E,
+ /* GB+81 36 D3 30 */ 0x2210, 0x2212, 0x2213, 0x2214, 0x2216,
+ /* GB+81 36 D3 35 */ 0x2217, 0x2218, 0x2219, 0x221B, 0x221C,
+ /* GB+81 36 D4 30 */ 0x2221, 0x2222, 0x2224, 0x2226, 0x222C,
+ /* GB+81 36 D4 35 */ 0x222D, 0x222F, 0x2230, 0x2231, 0x2232,
+ /* GB+81 36 D5 30 */ 0x2233, 0x2238, 0x2239, 0x223A, 0x223B,
+ /* GB+81 36 D5 35 */ 0x223C, 0x223E, 0x223F, 0x2240, 0x2241,
+ /* GB+81 36 D6 30 */ 0x2242, 0x2243, 0x2244, 0x2245, 0x2246,
+ /* GB+81 36 D6 35 */ 0x2247, 0x2249, 0x224A, 0x224B, 0x224D,
+ /* GB+81 36 D7 30 */ 0x224E, 0x224F, 0x2250, 0x2251, 0x2253,
+ /* GB+81 36 D7 35 */ 0x2254, 0x2255, 0x2256, 0x2257, 0x2258,
+ /* GB+81 36 D8 30 */ 0x2259, 0x225A, 0x225B, 0x225C, 0x225D,
+ /* GB+81 36 D8 35 */ 0x225E, 0x225F, 0x2262, 0x2263, 0x2268,
+ /* GB+81 36 D9 30 */ 0x2269, 0x226A, 0x226B, 0x226C, 0x226D,
+ /* GB+81 36 D9 35 */ 0x2270, 0x2271, 0x2272, 0x2273, 0x2274,
+ /* GB+81 36 DA 30 */ 0x2275, 0x2276, 0x2277, 0x2278, 0x2279,
+ /* GB+81 36 DA 35 */ 0x227A, 0x227B, 0x227C, 0x227D, 0x227E,
+ /* GB+81 36 DB 30 */ 0x227F, 0x2280, 0x2281, 0x2282, 0x2283,
+ /* GB+81 36 DB 35 */ 0x2284, 0x2285, 0x2286, 0x2287, 0x2288,
+ /* GB+81 36 DC 30 */ 0x2289, 0x228A, 0x228B, 0x228C, 0x228D,
+ /* GB+81 36 DC 35 */ 0x228E, 0x228F, 0x2290, 0x2291, 0x2292,
+ /* GB+81 36 DD 30 */ 0x2293, 0x2294, 0x2296, 0x2297, 0x2298,
+ /* GB+81 36 DD 35 */ 0x229A, 0x229B, 0x229C, 0x229D, 0x229E,
+ /* GB+81 36 DE 30 */ 0x229F, 0x22A0, 0x22A1, 0x22A2, 0x22A3,
+ /* GB+81 36 DE 35 */ 0x22A4, 0x22A6, 0x22A7, 0x22A8, 0x22A9,
+ /* GB+81 36 DF 30 */ 0x22AA, 0x22AB, 0x22AC, 0x22AD, 0x22AE,
+ /* GB+81 36 DF 35 */ 0x22AF, 0x22B0, 0x22B1, 0x22B2, 0x22B3,
+ /* GB+81 36 E0 30 */ 0x22B4, 0x22B5, 0x22B6, 0x22B7, 0x22B8,
+ /* GB+81 36 E0 35 */ 0x22B9, 0x22BA, 0x22BB, 0x22BC, 0x22BD,
+ /* GB+81 36 E1 30 */ 0x22BE, 0x22C0, 0x22C1, 0x22C2, 0x22C3,
+ /* GB+81 36 E1 35 */ 0x22C4, 0x22C5, 0x22C6, 0x22C7, 0x22C8,
+ /* GB+81 36 E2 30 */ 0x22C9, 0x22CA, 0x22CB, 0x22CC, 0x22CD,
+ /* GB+81 36 E2 35 */ 0x22CE, 0x22CF, 0x22D0, 0x22D1, 0x22D2,
+ /* GB+81 36 E3 30 */ 0x22D3, 0x22D4, 0x22D5, 0x22D6, 0x22D7,
+ /* GB+81 36 E3 35 */ 0x22D8, 0x22D9, 0x22DA, 0x22DB, 0x22DC,
+ /* GB+81 36 E4 30 */ 0x22DD, 0x22DE, 0x22DF, 0x22E0, 0x22E1,
+ /* GB+81 36 E4 35 */ 0x22E2, 0x22E3, 0x22E4, 0x22E5, 0x22E6,
+ /* GB+81 36 E5 30 */ 0x22E7, 0x22E8, 0x22E9, 0x22EA, 0x22EB,
+ /* GB+81 36 E5 35 */ 0x22EC, 0x22ED, 0x22EE, 0x22EF, 0x22F0,
+ /* GB+81 36 E6 30 */ 0x22F1, 0x22F2, 0x22F3, 0x22F4, 0x22F5,
+ /* GB+81 36 E6 35 */ 0x22F6, 0x22F7, 0x22F8, 0x22F9, 0x22FA,
+ /* GB+81 36 E7 30 */ 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22FF,
+ /* GB+81 36 E7 35 */ 0x2300, 0x2301, 0x2302, 0x2303, 0x2304,
+ /* GB+81 36 E8 30 */ 0x2305, 0x2306, 0x2307, 0x2308, 0x2309,
+ /* GB+81 36 E8 35 */ 0x230A, 0x230B, 0x230C, 0x230D, 0x230E,
+ /* GB+81 36 E9 30 */ 0x230F, 0x2310, 0x2311, 0x2313, 0x2314,
+ /* GB+81 36 E9 35 */ 0x2315, 0x2316, 0x2317, 0x2318, 0x2319,
+ /* GB+81 36 EA 30 */ 0x231A, 0x231B, 0x231C, 0x231D, 0x231E,
+ /* GB+81 36 EA 35 */ 0x231F, 0x2320, 0x2321, 0x2322, 0x2323,
+ /* GB+81 36 EB 30 */ 0x2324, 0x2325, 0x2326, 0x2327, 0x2328,
+ /* GB+81 36 EB 35 */ 0x2329, 0x232A, 0x232B, 0x232C, 0x232D,
+ /* GB+81 36 EC 30 */ 0x232E, 0x232F, 0x2330, 0x2331, 0x2332,
+ /* GB+81 36 EC 35 */ 0x2333, 0x2334, 0x2335, 0x2336, 0x2337,
+ /* GB+81 36 ED 30 */ 0x2338, 0x2339, 0x233A, 0x233B, 0x233C,
+ /* GB+81 36 ED 35 */ 0x233D, 0x233E, 0x233F, 0x2340, 0x2341,
+ /* GB+81 36 EE 30 */ 0x2342, 0x2343, 0x2344, 0x2345, 0x2346,
+ /* GB+81 36 EE 35 */ 0x2347, 0x2348, 0x2349, 0x234A, 0x234B,
+ /* GB+81 36 EF 30 */ 0x234C, 0x234D, 0x234E, 0x234F, 0x2350,
+ /* GB+81 36 EF 35 */ 0x2351, 0x2352, 0x2353, 0x2354, 0x2355,
+ /* GB+81 36 F0 30 */ 0x2356, 0x2357, 0x2358, 0x2359, 0x235A,
+ /* GB+81 36 F0 35 */ 0x235B, 0x235C, 0x235D, 0x235E, 0x235F,
+ /* GB+81 36 F1 30 */ 0x2360, 0x2361, 0x2362, 0x2363, 0x2364,
+ /* GB+81 36 F1 35 */ 0x2365, 0x2366, 0x2367, 0x2368, 0x2369,
+ /* GB+81 36 F2 30 */ 0x236A, 0x236B, 0x236C, 0x236D, 0x236E,
+ /* GB+81 36 F2 35 */ 0x236F, 0x2370, 0x2371, 0x2372, 0x2373,
+ /* GB+81 36 F3 30 */ 0x2374, 0x2375, 0x2376, 0x2377, 0x2378,
+ /* GB+81 36 F3 35 */ 0x2379, 0x237A, 0x237B, 0x237C, 0x237D,
+ /* GB+81 36 F4 30 */ 0x237E, 0x237F, 0x2380, 0x2381, 0x2382,
+ /* GB+81 36 F4 35 */ 0x2383, 0x2384, 0x2385, 0x2386, 0x2387,
+ /* GB+81 36 F5 30 */ 0x2388, 0x2389, 0x238A, 0x238B, 0x238C,
+ /* GB+81 36 F5 35 */ 0x238D, 0x238E, 0x238F, 0x2390, 0x2391,
+ /* GB+81 36 F6 30 */ 0x2392, 0x2393, 0x2394, 0x2395, 0x2396,
+ /* GB+81 36 F6 35 */ 0x2397, 0x2398, 0x2399, 0x239A, 0x239B,
+ /* GB+81 36 F7 30 */ 0x239C, 0x239D, 0x239E, 0x239F, 0x23A0,
+ /* GB+81 36 F7 35 */ 0x23A1, 0x23A2, 0x23A3, 0x23A4, 0x23A5,
+ /* GB+81 36 F8 30 */ 0x23A6, 0x23A7, 0x23A8, 0x23A9, 0x23AA,
+ /* GB+81 36 F8 35 */ 0x23AB, 0x23AC, 0x23AD, 0x23AE, 0x23AF,
+ /* GB+81 36 F9 30 */ 0x23B0, 0x23B1, 0x23B2, 0x23B3, 0x23B4,
+ /* GB+81 36 F9 35 */ 0x23B5, 0x23B6, 0x23B7, 0x23B8, 0x23B9,
+ /* GB+81 36 FA 30 */ 0x23BA, 0x23BB, 0x23BC, 0x23BD, 0x23BE,
+ /* GB+81 36 FA 35 */ 0x23BF, 0x23C0, 0x23C1, 0x23C2, 0x23C3,
+ /* GB+81 36 FB 30 */ 0x23C4, 0x23C5, 0x23C6, 0x23C7, 0x23C8,
+ /* GB+81 36 FB 35 */ 0x23C9, 0x23CA, 0x23CB, 0x23CC, 0x23CD,
+ /* GB+81 36 FC 30 */ 0x23CE, 0x23CF, 0x23D0, 0x23D1, 0x23D2,
+ /* GB+81 36 FC 35 */ 0x23D3, 0x23D4, 0x23D5, 0x23D6, 0x23D7,
+ /* GB+81 36 FD 30 */ 0x23D8, 0x23D9, 0x23DA, 0x23DB, 0x23DC,
+ /* GB+81 36 FD 35 */ 0x23DD, 0x23DE, 0x23DF, 0x23E0, 0x23E1,
+ /* GB+81 36 FE 30 */ 0x23E2, 0x23E3, 0x23E4, 0x23E5, 0x23E6,
+ /* GB+81 36 FE 35 */ 0x23E7, 0x23E8, 0x23E9, 0x23EA, 0x23EB,
+ /* GB+81 37 81 30 */ 0x23EC, 0x23ED, 0x23EE, 0x23EF, 0x23F0,
+ /* GB+81 37 81 35 */ 0x23F1, 0x23F2, 0x23F3, 0x23F4, 0x23F5,
+ /* GB+81 37 82 30 */ 0x23F6, 0x23F7, 0x23F8, 0x23F9, 0x23FA,
+ /* GB+81 37 82 35 */ 0x23FB, 0x23FC, 0x23FD, 0x23FE, 0x23FF,
+ /* GB+81 37 83 30 */ 0x2400, 0x2401, 0x2402, 0x2403, 0x2404,
+ /* GB+81 37 83 35 */ 0x2405, 0x2406, 0x2407, 0x2408, 0x2409,
+ /* GB+81 37 84 30 */ 0x240A, 0x240B, 0x240C, 0x240D, 0x240E,
+ /* GB+81 37 84 35 */ 0x240F, 0x2410, 0x2411, 0x2412, 0x2413,
+ /* GB+81 37 85 30 */ 0x2414, 0x2415, 0x2416, 0x2417, 0x2418,
+ /* GB+81 37 85 35 */ 0x2419, 0x241A, 0x241B, 0x241C, 0x241D,
+ /* GB+81 37 86 30 */ 0x241E, 0x241F, 0x2420, 0x2421, 0x2422,
+ /* GB+81 37 86 35 */ 0x2423, 0x2424, 0x2425, 0x2426, 0x2427,
+ /* GB+81 37 87 30 */ 0x2428, 0x2429, 0x242A, 0x242B, 0x242C,
+ /* GB+81 37 87 35 */ 0x242D, 0x242E, 0x242F, 0x2430, 0x2431,
+ /* GB+81 37 88 30 */ 0x2432, 0x2433, 0x2434, 0x2435, 0x2436,
+ /* GB+81 37 88 35 */ 0x2437, 0x2438, 0x2439, 0x243A, 0x243B,
+ /* GB+81 37 89 30 */ 0x243C, 0x243D, 0x243E, 0x243F, 0x2440,
+ /* GB+81 37 89 35 */ 0x2441, 0x2442, 0x2443, 0x2444, 0x2445,
+ /* GB+81 37 8A 30 */ 0x2446, 0x2447, 0x2448, 0x2449, 0x244A,
+ /* GB+81 37 8A 35 */ 0x244B, 0x244C, 0x244D, 0x244E, 0x244F,
+ /* GB+81 37 8B 30 */ 0x2450, 0x2451, 0x2452, 0x2453, 0x2454,
+ /* GB+81 37 8B 35 */ 0x2455, 0x2456, 0x2457, 0x2458, 0x2459,
+ /* GB+81 37 8C 30 */ 0x245A, 0x245B, 0x245C, 0x245D, 0x245E,
+ /* GB+81 37 8C 35 */ 0x245F, 0x246A, 0x246B, 0x246C, 0x246D,
+ /* GB+81 37 8D 30 */ 0x246E, 0x246F, 0x2470, 0x2471, 0x2472,
+ /* GB+81 37 8D 35 */ 0x2473, 0x249C, 0x249D, 0x249E, 0x249F,
+ /* GB+81 37 8E 30 */ 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4,
+ /* GB+81 37 8E 35 */ 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9,
+ /* GB+81 37 8F 30 */ 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE,
+ /* GB+81 37 8F 35 */ 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3,
+ /* GB+81 37 90 30 */ 0x24B4, 0x24B5, 0x24B6, 0x24B7, 0x24B8,
+ /* GB+81 37 90 35 */ 0x24B9, 0x24BA, 0x24BB, 0x24BC, 0x24BD,
+ /* GB+81 37 91 30 */ 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2,
+ /* GB+81 37 91 35 */ 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7,
+ /* GB+81 37 92 30 */ 0x24C8, 0x24C9, 0x24CA, 0x24CB, 0x24CC,
+ /* GB+81 37 92 35 */ 0x24CD, 0x24CE, 0x24CF, 0x24D0, 0x24D1,
+ /* GB+81 37 93 30 */ 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6,
+ /* GB+81 37 93 35 */ 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB,
+ /* GB+81 37 94 30 */ 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0,
+ /* GB+81 37 94 35 */ 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5,
+ /* GB+81 37 95 30 */ 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x24EA,
+ /* GB+81 37 95 35 */ 0x24EB, 0x24EC, 0x24ED, 0x24EE, 0x24EF,
+ /* GB+81 37 96 30 */ 0x24F0, 0x24F1, 0x24F2, 0x24F3, 0x24F4,
+ /* GB+81 37 96 35 */ 0x24F5, 0x24F6, 0x24F7, 0x24F8, 0x24F9,
+ /* GB+81 37 97 30 */ 0x24FA, 0x24FB, 0x24FC, 0x24FD, 0x24FE,
+ /* GB+81 37 97 35 */ 0x24FF, 0x254C, 0x254D, 0x254E, 0x254F,
+ /* GB+81 37 98 30 */ 0x2574, 0x2575, 0x2576, 0x2577, 0x2578,
+ /* GB+81 37 98 35 */ 0x2579, 0x257A, 0x257B, 0x257C, 0x257D,
+ /* GB+81 37 99 30 */ 0x257E, 0x257F, 0x2580, 0x2590, 0x2591,
+ /* GB+81 37 99 35 */ 0x2592, 0x2596, 0x2597, 0x2598, 0x2599,
+ /* GB+81 37 9A 30 */ 0x259A, 0x259B, 0x259C, 0x259D, 0x259E,
+ /* GB+81 37 9A 35 */ 0x259F, 0x25A2, 0x25A3, 0x25A4, 0x25A5,
+ /* GB+81 37 9B 30 */ 0x25A6, 0x25A7, 0x25A8, 0x25A9, 0x25AA,
+ /* GB+81 37 9B 35 */ 0x25AB, 0x25AC, 0x25AD, 0x25AE, 0x25AF,
+ /* GB+81 37 9C 30 */ 0x25B0, 0x25B1, 0x25B4, 0x25B5, 0x25B6,
+ /* GB+81 37 9C 35 */ 0x25B7, 0x25B8, 0x25B9, 0x25BA, 0x25BB,
+ /* GB+81 37 9D 30 */ 0x25BE, 0x25BF, 0x25C0, 0x25C1, 0x25C2,
+ /* GB+81 37 9D 35 */ 0x25C3, 0x25C4, 0x25C5, 0x25C8, 0x25C9,
+ /* GB+81 37 9E 30 */ 0x25CA, 0x25CC, 0x25CD, 0x25D0, 0x25D1,
+ /* GB+81 37 9E 35 */ 0x25D2, 0x25D3, 0x25D4, 0x25D5, 0x25D6,
+ /* GB+81 37 9F 30 */ 0x25D7, 0x25D8, 0x25D9, 0x25DA, 0x25DB,
+ /* GB+81 37 9F 35 */ 0x25DC, 0x25DD, 0x25DE, 0x25DF, 0x25E0,
+ /* GB+81 37 A0 30 */ 0x25E1, 0x25E6, 0x25E7, 0x25E8, 0x25E9,
+ /* GB+81 37 A0 35 */ 0x25EA, 0x25EB, 0x25EC, 0x25ED, 0x25EE,
+ /* GB+81 37 A1 30 */ 0x25EF, 0x25F0, 0x25F1, 0x25F2, 0x25F3,
+ /* GB+81 37 A1 35 */ 0x25F4, 0x25F5, 0x25F6, 0x25F7, 0x25F8,
+ /* GB+81 37 A2 30 */ 0x25F9, 0x25FA, 0x25FB, 0x25FC, 0x25FD,
+ /* GB+81 37 A2 35 */ 0x25FE, 0x25FF, 0x2600, 0x2601, 0x2602,
+ /* GB+81 37 A3 30 */ 0x2603, 0x2604, 0x2607, 0x2608, 0x260A,
+ /* GB+81 37 A3 35 */ 0x260B, 0x260C, 0x260D, 0x260E, 0x260F,
+ /* GB+81 37 A4 30 */ 0x2610, 0x2611, 0x2612, 0x2613, 0x2614,
+ /* GB+81 37 A4 35 */ 0x2615, 0x2616, 0x2617, 0x2618, 0x2619,
+ /* GB+81 37 A5 30 */ 0x261A, 0x261B, 0x261C, 0x261D, 0x261E,
+ /* GB+81 37 A5 35 */ 0x261F, 0x2620, 0x2621, 0x2622, 0x2623,
+ /* GB+81 37 A6 30 */ 0x2624, 0x2625, 0x2626, 0x2627, 0x2628,
+ /* GB+81 37 A6 35 */ 0x2629, 0x262A, 0x262B, 0x262C, 0x262D,
+ /* GB+81 37 A7 30 */ 0x262E, 0x262F, 0x2630, 0x2631, 0x2632,
+ /* GB+81 37 A7 35 */ 0x2633, 0x2634, 0x2635, 0x2636, 0x2637,
+ /* GB+81 37 A8 30 */ 0x2638, 0x2639, 0x263A, 0x263B, 0x263C,
+ /* GB+81 37 A8 35 */ 0x263D, 0x263E, 0x263F, 0x2641,
+ /* Contiguous area: GB+81 38 FD 39 .. GB+82 30 A6 32 */
+ /* GB+81 38 FD 39 */ 0x2E82,
+ /* GB+81 38 FE 30 */ 0x2E83, 0x2E85, 0x2E86, 0x2E87, 0x2E89,
+ /* GB+81 38 FE 35 */ 0x2E8A, 0x2E8D, 0x2E8E, 0x2E8F, 0x2E90,
+ /* GB+81 39 81 30 */ 0x2E91, 0x2E92, 0x2E93, 0x2E94, 0x2E95,
+ /* GB+81 39 81 35 */ 0x2E96, 0x2E98, 0x2E99, 0x2E9A, 0x2E9B,
+ /* GB+81 39 82 30 */ 0x2E9C, 0x2E9D, 0x2E9E, 0x2E9F, 0x2EA0,
+ /* GB+81 39 82 35 */ 0x2EA1, 0x2EA2, 0x2EA3, 0x2EA4, 0x2EA5,
+ /* GB+81 39 83 30 */ 0x2EA6, 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC,
+ /* GB+81 39 83 35 */ 0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2,
+ /* GB+81 39 84 30 */ 0x2EB4, 0x2EB5, 0x2EB8, 0x2EB9, 0x2EBA,
+ /* GB+81 39 84 35 */ 0x2EBC, 0x2EBD, 0x2EBE, 0x2EBF, 0x2EC0,
+ /* GB+81 39 85 30 */ 0x2EC1, 0x2EC2, 0x2EC3, 0x2EC4, 0x2EC5,
+ /* GB+81 39 85 35 */ 0x2EC6, 0x2EC7, 0x2EC8, 0x2EC9, 0x2ECB,
+ /* GB+81 39 86 30 */ 0x2ECC, 0x2ECD, 0x2ECE, 0x2ECF, 0x2ED0,
+ /* GB+81 39 86 35 */ 0x2ED1, 0x2ED2, 0x2ED3, 0x2ED4, 0x2ED5,
+ /* GB+81 39 87 30 */ 0x2ED6, 0x2ED7, 0x2ED8, 0x2ED9, 0x2EDA,
+ /* GB+81 39 87 35 */ 0x2EDB, 0x2EDC, 0x2EDD, 0x2EDE, 0x2EDF,
+ /* GB+81 39 88 30 */ 0x2EE0, 0x2EE1, 0x2EE2, 0x2EE3, 0x2EE4,
+ /* GB+81 39 88 35 */ 0x2EE5, 0x2EE6, 0x2EE7, 0x2EE8, 0x2EE9,
+ /* GB+81 39 89 30 */ 0x2EEA, 0x2EEB, 0x2EEC, 0x2EED, 0x2EEE,
+ /* GB+81 39 89 35 */ 0x2EEF, 0x2EF0, 0x2EF1, 0x2EF2, 0x2EF3,
+ /* GB+81 39 8A 30 */ 0x2EF4, 0x2EF5, 0x2EF6, 0x2EF7, 0x2EF8,
+ /* GB+81 39 8A 35 */ 0x2EF9, 0x2EFA, 0x2EFB, 0x2EFC, 0x2EFD,
+ /* GB+81 39 8B 30 */ 0x2EFE, 0x2EFF, 0x2F00, 0x2F01, 0x2F02,
+ /* GB+81 39 8B 35 */ 0x2F03, 0x2F04, 0x2F05, 0x2F06, 0x2F07,
+ /* GB+81 39 8C 30 */ 0x2F08, 0x2F09, 0x2F0A, 0x2F0B, 0x2F0C,
+ /* GB+81 39 8C 35 */ 0x2F0D, 0x2F0E, 0x2F0F, 0x2F10, 0x2F11,
+ /* GB+81 39 8D 30 */ 0x2F12, 0x2F13, 0x2F14, 0x2F15, 0x2F16,
+ /* GB+81 39 8D 35 */ 0x2F17, 0x2F18, 0x2F19, 0x2F1A, 0x2F1B,
+ /* GB+81 39 8E 30 */ 0x2F1C, 0x2F1D, 0x2F1E, 0x2F1F, 0x2F20,
+ /* GB+81 39 8E 35 */ 0x2F21, 0x2F22, 0x2F23, 0x2F24, 0x2F25,
+ /* GB+81 39 8F 30 */ 0x2F26, 0x2F27, 0x2F28, 0x2F29, 0x2F2A,
+ /* GB+81 39 8F 35 */ 0x2F2B, 0x2F2C, 0x2F2D, 0x2F2E, 0x2F2F,
+ /* GB+81 39 90 30 */ 0x2F30, 0x2F31, 0x2F32, 0x2F33, 0x2F34,
+ /* GB+81 39 90 35 */ 0x2F35, 0x2F36, 0x2F37, 0x2F38, 0x2F39,
+ /* GB+81 39 91 30 */ 0x2F3A, 0x2F3B, 0x2F3C, 0x2F3D, 0x2F3E,
+ /* GB+81 39 91 35 */ 0x2F3F, 0x2F40, 0x2F41, 0x2F42, 0x2F43,
+ /* GB+81 39 92 30 */ 0x2F44, 0x2F45, 0x2F46, 0x2F47, 0x2F48,
+ /* GB+81 39 92 35 */ 0x2F49, 0x2F4A, 0x2F4B, 0x2F4C, 0x2F4D,
+ /* GB+81 39 93 30 */ 0x2F4E, 0x2F4F, 0x2F50, 0x2F51, 0x2F52,
+ /* GB+81 39 93 35 */ 0x2F53, 0x2F54, 0x2F55, 0x2F56, 0x2F57,
+ /* GB+81 39 94 30 */ 0x2F58, 0x2F59, 0x2F5A, 0x2F5B, 0x2F5C,
+ /* GB+81 39 94 35 */ 0x2F5D, 0x2F5E, 0x2F5F, 0x2F60, 0x2F61,
+ /* GB+81 39 95 30 */ 0x2F62, 0x2F63, 0x2F64, 0x2F65, 0x2F66,
+ /* GB+81 39 95 35 */ 0x2F67, 0x2F68, 0x2F69, 0x2F6A, 0x2F6B,
+ /* GB+81 39 96 30 */ 0x2F6C, 0x2F6D, 0x2F6E, 0x2F6F, 0x2F70,
+ /* GB+81 39 96 35 */ 0x2F71, 0x2F72, 0x2F73, 0x2F74, 0x2F75,
+ /* GB+81 39 97 30 */ 0x2F76, 0x2F77, 0x2F78, 0x2F79, 0x2F7A,
+ /* GB+81 39 97 35 */ 0x2F7B, 0x2F7C, 0x2F7D, 0x2F7E, 0x2F7F,
+ /* GB+81 39 98 30 */ 0x2F80, 0x2F81, 0x2F82, 0x2F83, 0x2F84,
+ /* GB+81 39 98 35 */ 0x2F85, 0x2F86, 0x2F87, 0x2F88, 0x2F89,
+ /* GB+81 39 99 30 */ 0x2F8A, 0x2F8B, 0x2F8C, 0x2F8D, 0x2F8E,
+ /* GB+81 39 99 35 */ 0x2F8F, 0x2F90, 0x2F91, 0x2F92, 0x2F93,
+ /* GB+81 39 9A 30 */ 0x2F94, 0x2F95, 0x2F96, 0x2F97, 0x2F98,
+ /* GB+81 39 9A 35 */ 0x2F99, 0x2F9A, 0x2F9B, 0x2F9C, 0x2F9D,
+ /* GB+81 39 9B 30 */ 0x2F9E, 0x2F9F, 0x2FA0, 0x2FA1, 0x2FA2,
+ /* GB+81 39 9B 35 */ 0x2FA3, 0x2FA4, 0x2FA5, 0x2FA6, 0x2FA7,
+ /* GB+81 39 9C 30 */ 0x2FA8, 0x2FA9, 0x2FAA, 0x2FAB, 0x2FAC,
+ /* GB+81 39 9C 35 */ 0x2FAD, 0x2FAE, 0x2FAF, 0x2FB0, 0x2FB1,
+ /* GB+81 39 9D 30 */ 0x2FB2, 0x2FB3, 0x2FB4, 0x2FB5, 0x2FB6,
+ /* GB+81 39 9D 35 */ 0x2FB7, 0x2FB8, 0x2FB9, 0x2FBA, 0x2FBB,
+ /* GB+81 39 9E 30 */ 0x2FBC, 0x2FBD, 0x2FBE, 0x2FBF, 0x2FC0,
+ /* GB+81 39 9E 35 */ 0x2FC1, 0x2FC2, 0x2FC3, 0x2FC4, 0x2FC5,
+ /* GB+81 39 9F 30 */ 0x2FC6, 0x2FC7, 0x2FC8, 0x2FC9, 0x2FCA,
+ /* GB+81 39 9F 35 */ 0x2FCB, 0x2FCC, 0x2FCD, 0x2FCE, 0x2FCF,
+ /* GB+81 39 A0 30 */ 0x2FD0, 0x2FD1, 0x2FD2, 0x2FD3, 0x2FD4,
+ /* GB+81 39 A0 35 */ 0x2FD5, 0x2FD6, 0x2FD7, 0x2FD8, 0x2FD9,
+ /* GB+81 39 A1 30 */ 0x2FDA, 0x2FDB, 0x2FDC, 0x2FDD, 0x2FDE,
+ /* GB+81 39 A1 35 */ 0x2FDF, 0x2FE0, 0x2FE1, 0x2FE2, 0x2FE3,
+ /* GB+81 39 A2 30 */ 0x2FE4, 0x2FE5, 0x2FE6, 0x2FE7, 0x2FE8,
+ /* GB+81 39 A2 35 */ 0x2FE9, 0x2FEA, 0x2FEB, 0x2FEC, 0x2FED,
+ /* GB+81 39 A3 30 */ 0x2FEE, 0x2FEF, 0x2FFC, 0x2FFD, 0x2FFE,
+ /* GB+81 39 A3 35 */ 0x2FFF, 0x3004, 0x3018, 0x3019, 0x301A,
+ /* GB+81 39 A4 30 */ 0x301B, 0x301C, 0x301F, 0x3020, 0x302A,
+ /* GB+81 39 A4 35 */ 0x302B, 0x302C, 0x302D, 0x302E, 0x302F,
+ /* GB+81 39 A5 30 */ 0x3030, 0x3031, 0x3032, 0x3033, 0x3034,
+ /* GB+81 39 A5 35 */ 0x3035, 0x3036, 0x3037, 0x3038, 0x3039,
+ /* GB+81 39 A6 30 */ 0x303A, 0x303B, 0x303C, 0x303D, 0x303F,
+ /* GB+81 39 A6 35 */ 0x3040, 0x3094, 0x3095, 0x3096, 0x3097,
+ /* GB+81 39 A7 30 */ 0x3098, 0x3099, 0x309A, 0x309F, 0x30A0,
+ /* GB+81 39 A7 35 */ 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x30FB,
+ /* GB+81 39 A8 30 */ 0x30FF, 0x3100, 0x3101, 0x3102, 0x3103,
+ /* GB+81 39 A8 35 */ 0x3104, 0x312A, 0x312B, 0x312C, 0x312D,
+ /* GB+81 39 A9 30 */ 0x312E, 0x312F, 0x3130, 0x3131, 0x3132,
+ /* GB+81 39 A9 35 */ 0x3133, 0x3134, 0x3135, 0x3136, 0x3137,
+ /* GB+81 39 AA 30 */ 0x3138, 0x3139, 0x313A, 0x313B, 0x313C,
+ /* GB+81 39 AA 35 */ 0x313D, 0x313E, 0x313F, 0x3140, 0x3141,
+ /* GB+81 39 AB 30 */ 0x3142, 0x3143, 0x3144, 0x3145, 0x3146,
+ /* GB+81 39 AB 35 */ 0x3147, 0x3148, 0x3149, 0x314A, 0x314B,
+ /* GB+81 39 AC 30 */ 0x314C, 0x314D, 0x314E, 0x314F, 0x3150,
+ /* GB+81 39 AC 35 */ 0x3151, 0x3152, 0x3153, 0x3154, 0x3155,
+ /* GB+81 39 AD 30 */ 0x3156, 0x3157, 0x3158, 0x3159, 0x315A,
+ /* GB+81 39 AD 35 */ 0x315B, 0x315C, 0x315D, 0x315E, 0x315F,
+ /* GB+81 39 AE 30 */ 0x3160, 0x3161, 0x3162, 0x3163, 0x3164,
+ /* GB+81 39 AE 35 */ 0x3165, 0x3166, 0x3167, 0x3168, 0x3169,
+ /* GB+81 39 AF 30 */ 0x316A, 0x316B, 0x316C, 0x316D, 0x316E,
+ /* GB+81 39 AF 35 */ 0x316F, 0x3170, 0x3171, 0x3172, 0x3173,
+ /* GB+81 39 B0 30 */ 0x3174, 0x3175, 0x3176, 0x3177, 0x3178,
+ /* GB+81 39 B0 35 */ 0x3179, 0x317A, 0x317B, 0x317C, 0x317D,
+ /* GB+81 39 B1 30 */ 0x317E, 0x317F, 0x3180, 0x3181, 0x3182,
+ /* GB+81 39 B1 35 */ 0x3183, 0x3184, 0x3185, 0x3186, 0x3187,
+ /* GB+81 39 B2 30 */ 0x3188, 0x3189, 0x318A, 0x318B, 0x318C,
+ /* GB+81 39 B2 35 */ 0x318D, 0x318E, 0x318F, 0x3190, 0x3191,
+ /* GB+81 39 B3 30 */ 0x3192, 0x3193, 0x3194, 0x3195, 0x3196,
+ /* GB+81 39 B3 35 */ 0x3197, 0x3198, 0x3199, 0x319A, 0x319B,
+ /* GB+81 39 B4 30 */ 0x319C, 0x319D, 0x319E, 0x319F, 0x31A0,
+ /* GB+81 39 B4 35 */ 0x31A1, 0x31A2, 0x31A3, 0x31A4, 0x31A5,
+ /* GB+81 39 B5 30 */ 0x31A6, 0x31A7, 0x31A8, 0x31A9, 0x31AA,
+ /* GB+81 39 B5 35 */ 0x31AB, 0x31AC, 0x31AD, 0x31AE, 0x31AF,
+ /* GB+81 39 B6 30 */ 0x31B0, 0x31B1, 0x31B2, 0x31B3, 0x31B4,
+ /* GB+81 39 B6 35 */ 0x31B5, 0x31B6, 0x31B7, 0x31B8, 0x31B9,
+ /* GB+81 39 B7 30 */ 0x31BA, 0x31BB, 0x31BC, 0x31BD, 0x31BE,
+ /* GB+81 39 B7 35 */ 0x31BF, 0x31C0, 0x31C1, 0x31C2, 0x31C3,
+ /* GB+81 39 B8 30 */ 0x31C4, 0x31C5, 0x31C6, 0x31C7, 0x31C8,
+ /* GB+81 39 B8 35 */ 0x31C9, 0x31CA, 0x31CB, 0x31CC, 0x31CD,
+ /* GB+81 39 B9 30 */ 0x31CE, 0x31CF, 0x31D0, 0x31D1, 0x31D2,
+ /* GB+81 39 B9 35 */ 0x31D3, 0x31D4, 0x31D5, 0x31D6, 0x31D7,
+ /* GB+81 39 BA 30 */ 0x31D8, 0x31D9, 0x31DA, 0x31DB, 0x31DC,
+ /* GB+81 39 BA 35 */ 0x31DD, 0x31DE, 0x31DF, 0x31E0, 0x31E1,
+ /* GB+81 39 BB 30 */ 0x31E2, 0x31E3, 0x31E4, 0x31E5, 0x31E6,
+ /* GB+81 39 BB 35 */ 0x31E7, 0x31E8, 0x31E9, 0x31EA, 0x31EB,
+ /* GB+81 39 BC 30 */ 0x31EC, 0x31ED, 0x31EE, 0x31EF, 0x31F0,
+ /* GB+81 39 BC 35 */ 0x31F1, 0x31F2, 0x31F3, 0x31F4, 0x31F5,
+ /* GB+81 39 BD 30 */ 0x31F6, 0x31F7, 0x31F8, 0x31F9, 0x31FA,
+ /* GB+81 39 BD 35 */ 0x31FB, 0x31FC, 0x31FD, 0x31FE, 0x31FF,
+ /* GB+81 39 BE 30 */ 0x3200, 0x3201, 0x3202, 0x3203, 0x3204,
+ /* GB+81 39 BE 35 */ 0x3205, 0x3206, 0x3207, 0x3208, 0x3209,
+ /* GB+81 39 BF 30 */ 0x320A, 0x320B, 0x320C, 0x320D, 0x320E,
+ /* GB+81 39 BF 35 */ 0x320F, 0x3210, 0x3211, 0x3212, 0x3213,
+ /* GB+81 39 C0 30 */ 0x3214, 0x3215, 0x3216, 0x3217, 0x3218,
+ /* GB+81 39 C0 35 */ 0x3219, 0x321A, 0x321B, 0x321C, 0x321D,
+ /* GB+81 39 C1 30 */ 0x321E, 0x321F, 0x322A, 0x322B, 0x322C,
+ /* GB+81 39 C1 35 */ 0x322D, 0x322E, 0x322F, 0x3230, 0x3232,
+ /* GB+81 39 C2 30 */ 0x3233, 0x3234, 0x3235, 0x3236, 0x3237,
+ /* GB+81 39 C2 35 */ 0x3238, 0x3239, 0x323A, 0x323B, 0x323C,
+ /* GB+81 39 C3 30 */ 0x323D, 0x323E, 0x323F, 0x3240, 0x3241,
+ /* GB+81 39 C3 35 */ 0x3242, 0x3243, 0x3244, 0x3245, 0x3246,
+ /* GB+81 39 C4 30 */ 0x3247, 0x3248, 0x3249, 0x324A, 0x324B,
+ /* GB+81 39 C4 35 */ 0x324C, 0x324D, 0x324E, 0x324F, 0x3250,
+ /* GB+81 39 C5 30 */ 0x3251, 0x3252, 0x3253, 0x3254, 0x3255,
+ /* GB+81 39 C5 35 */ 0x3256, 0x3257, 0x3258, 0x3259, 0x325A,
+ /* GB+81 39 C6 30 */ 0x325B, 0x325C, 0x325D, 0x325E, 0x325F,
+ /* GB+81 39 C6 35 */ 0x3260, 0x3261, 0x3262, 0x3263, 0x3264,
+ /* GB+81 39 C7 30 */ 0x3265, 0x3266, 0x3267, 0x3268, 0x3269,
+ /* GB+81 39 C7 35 */ 0x326A, 0x326B, 0x326C, 0x326D, 0x326E,
+ /* GB+81 39 C8 30 */ 0x326F, 0x3270, 0x3271, 0x3272, 0x3273,
+ /* GB+81 39 C8 35 */ 0x3274, 0x3275, 0x3276, 0x3277, 0x3278,
+ /* GB+81 39 C9 30 */ 0x3279, 0x327A, 0x327B, 0x327C, 0x327D,
+ /* GB+81 39 C9 35 */ 0x327E, 0x327F, 0x3280, 0x3281, 0x3282,
+ /* GB+81 39 CA 30 */ 0x3283, 0x3284, 0x3285, 0x3286, 0x3287,
+ /* GB+81 39 CA 35 */ 0x3288, 0x3289, 0x328A, 0x328B, 0x328C,
+ /* GB+81 39 CB 30 */ 0x328D, 0x328E, 0x328F, 0x3290, 0x3291,
+ /* GB+81 39 CB 35 */ 0x3292, 0x3293, 0x3294, 0x3295, 0x3296,
+ /* GB+81 39 CC 30 */ 0x3297, 0x3298, 0x3299, 0x329A, 0x329B,
+ /* GB+81 39 CC 35 */ 0x329C, 0x329D, 0x329E, 0x329F, 0x32A0,
+ /* GB+81 39 CD 30 */ 0x32A1, 0x32A2, 0x32A4, 0x32A5, 0x32A6,
+ /* GB+81 39 CD 35 */ 0x32A7, 0x32A8, 0x32A9, 0x32AA, 0x32AB,
+ /* GB+81 39 CE 30 */ 0x32AC, 0x32AD, 0x32AE, 0x32AF, 0x32B0,
+ /* GB+81 39 CE 35 */ 0x32B1, 0x32B2, 0x32B3, 0x32B4, 0x32B5,
+ /* GB+81 39 CF 30 */ 0x32B6, 0x32B7, 0x32B8, 0x32B9, 0x32BA,
+ /* GB+81 39 CF 35 */ 0x32BB, 0x32BC, 0x32BD, 0x32BE, 0x32BF,
+ /* GB+81 39 D0 30 */ 0x32C0, 0x32C1, 0x32C2, 0x32C3, 0x32C4,
+ /* GB+81 39 D0 35 */ 0x32C5, 0x32C6, 0x32C7, 0x32C8, 0x32C9,
+ /* GB+81 39 D1 30 */ 0x32CA, 0x32CB, 0x32CC, 0x32CD, 0x32CE,
+ /* GB+81 39 D1 35 */ 0x32CF, 0x32D0, 0x32D1, 0x32D2, 0x32D3,
+ /* GB+81 39 D2 30 */ 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8,
+ /* GB+81 39 D2 35 */ 0x32D9, 0x32DA, 0x32DB, 0x32DC, 0x32DD,
+ /* GB+81 39 D3 30 */ 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2,
+ /* GB+81 39 D3 35 */ 0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7,
+ /* GB+81 39 D4 30 */ 0x32E8, 0x32E9, 0x32EA, 0x32EB, 0x32EC,
+ /* GB+81 39 D4 35 */ 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1,
+ /* GB+81 39 D5 30 */ 0x32F2, 0x32F3, 0x32F4, 0x32F5, 0x32F6,
+ /* GB+81 39 D5 35 */ 0x32F7, 0x32F8, 0x32F9, 0x32FA, 0x32FB,
+ /* GB+81 39 D6 30 */ 0x32FC, 0x32FD, 0x32FE, 0x32FF, 0x3300,
+ /* GB+81 39 D6 35 */ 0x3301, 0x3302, 0x3303, 0x3304, 0x3305,
+ /* GB+81 39 D7 30 */ 0x3306, 0x3307, 0x3308, 0x3309, 0x330A,
+ /* GB+81 39 D7 35 */ 0x330B, 0x330C, 0x330D, 0x330E, 0x330F,
+ /* GB+81 39 D8 30 */ 0x3310, 0x3311, 0x3312, 0x3313, 0x3314,
+ /* GB+81 39 D8 35 */ 0x3315, 0x3316, 0x3317, 0x3318, 0x3319,
+ /* GB+81 39 D9 30 */ 0x331A, 0x331B, 0x331C, 0x331D, 0x331E,
+ /* GB+81 39 D9 35 */ 0x331F, 0x3320, 0x3321, 0x3322, 0x3323,
+ /* GB+81 39 DA 30 */ 0x3324, 0x3325, 0x3326, 0x3327, 0x3328,
+ /* GB+81 39 DA 35 */ 0x3329, 0x332A, 0x332B, 0x332C, 0x332D,
+ /* GB+81 39 DB 30 */ 0x332E, 0x332F, 0x3330, 0x3331, 0x3332,
+ /* GB+81 39 DB 35 */ 0x3333, 0x3334, 0x3335, 0x3336, 0x3337,
+ /* GB+81 39 DC 30 */ 0x3338, 0x3339, 0x333A, 0x333B, 0x333C,
+ /* GB+81 39 DC 35 */ 0x333D, 0x333E, 0x333F, 0x3340, 0x3341,
+ /* GB+81 39 DD 30 */ 0x3342, 0x3343, 0x3344, 0x3345, 0x3346,
+ /* GB+81 39 DD 35 */ 0x3347, 0x3348, 0x3349, 0x334A, 0x334B,
+ /* GB+81 39 DE 30 */ 0x334C, 0x334D, 0x334E, 0x334F, 0x3350,
+ /* GB+81 39 DE 35 */ 0x3351, 0x3352, 0x3353, 0x3354, 0x3355,
+ /* GB+81 39 DF 30 */ 0x3356, 0x3357, 0x3358, 0x3359, 0x335A,
+ /* GB+81 39 DF 35 */ 0x335B, 0x335C, 0x335D, 0x335E, 0x335F,
+ /* GB+81 39 E0 30 */ 0x3360, 0x3361, 0x3362, 0x3363, 0x3364,
+ /* GB+81 39 E0 35 */ 0x3365, 0x3366, 0x3367, 0x3368, 0x3369,
+ /* GB+81 39 E1 30 */ 0x336A, 0x336B, 0x336C, 0x336D, 0x336E,
+ /* GB+81 39 E1 35 */ 0x336F, 0x3370, 0x3371, 0x3372, 0x3373,
+ /* GB+81 39 E2 30 */ 0x3374, 0x3375, 0x3376, 0x3377, 0x3378,
+ /* GB+81 39 E2 35 */ 0x3379, 0x337A, 0x337B, 0x337C, 0x337D,
+ /* GB+81 39 E3 30 */ 0x337E, 0x337F, 0x3380, 0x3381, 0x3382,
+ /* GB+81 39 E3 35 */ 0x3383, 0x3384, 0x3385, 0x3386, 0x3387,
+ /* GB+81 39 E4 30 */ 0x3388, 0x3389, 0x338A, 0x338B, 0x338C,
+ /* GB+81 39 E4 35 */ 0x338D, 0x3390, 0x3391, 0x3392, 0x3393,
+ /* GB+81 39 E5 30 */ 0x3394, 0x3395, 0x3396, 0x3397, 0x3398,
+ /* GB+81 39 E5 35 */ 0x3399, 0x339A, 0x339B, 0x339F, 0x33A0,
+ /* GB+81 39 E6 30 */ 0x33A2, 0x33A3, 0x33A4, 0x33A5, 0x33A6,
+ /* GB+81 39 E6 35 */ 0x33A7, 0x33A8, 0x33A9, 0x33AA, 0x33AB,
+ /* GB+81 39 E7 30 */ 0x33AC, 0x33AD, 0x33AE, 0x33AF, 0x33B0,
+ /* GB+81 39 E7 35 */ 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5,
+ /* GB+81 39 E8 30 */ 0x33B6, 0x33B7, 0x33B8, 0x33B9, 0x33BA,
+ /* GB+81 39 E8 35 */ 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF,
+ /* GB+81 39 E9 30 */ 0x33C0, 0x33C1, 0x33C2, 0x33C3, 0x33C5,
+ /* GB+81 39 E9 35 */ 0x33C6, 0x33C7, 0x33C8, 0x33C9, 0x33CA,
+ /* GB+81 39 EA 30 */ 0x33CB, 0x33CC, 0x33CD, 0x33CF, 0x33D0,
+ /* GB+81 39 EA 35 */ 0x33D3, 0x33D4, 0x33D6, 0x33D7, 0x33D8,
+ /* GB+81 39 EB 30 */ 0x33D9, 0x33DA, 0x33DB, 0x33DC, 0x33DD,
+ /* GB+81 39 EB 35 */ 0x33DE, 0x33DF, 0x33E0, 0x33E1, 0x33E2,
+ /* GB+81 39 EC 30 */ 0x33E3, 0x33E4, 0x33E5, 0x33E6, 0x33E7,
+ /* GB+81 39 EC 35 */ 0x33E8, 0x33E9, 0x33EA, 0x33EB, 0x33EC,
+ /* GB+81 39 ED 30 */ 0x33ED, 0x33EE, 0x33EF, 0x33F0, 0x33F1,
+ /* GB+81 39 ED 35 */ 0x33F2, 0x33F3, 0x33F4, 0x33F5, 0x33F6,
+ /* GB+81 39 EE 30 */ 0x33F7, 0x33F8, 0x33F9, 0x33FA, 0x33FB,
+ /* GB+81 39 EE 35 */ 0x33FC, 0x33FD, 0x33FE, 0x33FF, 0x3400,
+ /* GB+81 39 EF 30 */ 0x3401, 0x3402, 0x3403, 0x3404, 0x3405,
+ /* GB+81 39 EF 35 */ 0x3406, 0x3407, 0x3408, 0x3409, 0x340A,
+ /* GB+81 39 F0 30 */ 0x340B, 0x340C, 0x340D, 0x340E, 0x340F,
+ /* GB+81 39 F0 35 */ 0x3410, 0x3411, 0x3412, 0x3413, 0x3414,
+ /* GB+81 39 F1 30 */ 0x3415, 0x3416, 0x3417, 0x3418, 0x3419,
+ /* GB+81 39 F1 35 */ 0x341A, 0x341B, 0x341C, 0x341D, 0x341E,
+ /* GB+81 39 F2 30 */ 0x341F, 0x3420, 0x3421, 0x3422, 0x3423,
+ /* GB+81 39 F2 35 */ 0x3424, 0x3425, 0x3426, 0x3427, 0x3428,
+ /* GB+81 39 F3 30 */ 0x3429, 0x342A, 0x342B, 0x342C, 0x342D,
+ /* GB+81 39 F3 35 */ 0x342E, 0x342F, 0x3430, 0x3431, 0x3432,
+ /* GB+81 39 F4 30 */ 0x3433, 0x3434, 0x3435, 0x3436, 0x3437,
+ /* GB+81 39 F4 35 */ 0x3438, 0x3439, 0x343A, 0x343B, 0x343C,
+ /* GB+81 39 F5 30 */ 0x343D, 0x343E, 0x343F, 0x3440, 0x3441,
+ /* GB+81 39 F5 35 */ 0x3442, 0x3443, 0x3444, 0x3445, 0x3446,
+ /* GB+81 39 F6 30 */ 0x3448, 0x3449, 0x344A, 0x344B, 0x344C,
+ /* GB+81 39 F6 35 */ 0x344D, 0x344E, 0x344F, 0x3450, 0x3451,
+ /* GB+81 39 F7 30 */ 0x3452, 0x3453, 0x3454, 0x3455, 0x3456,
+ /* GB+81 39 F7 35 */ 0x3457, 0x3458, 0x3459, 0x345A, 0x345B,
+ /* GB+81 39 F8 30 */ 0x345C, 0x345D, 0x345E, 0x345F, 0x3460,
+ /* GB+81 39 F8 35 */ 0x3461, 0x3462, 0x3463, 0x3464, 0x3465,
+ /* GB+81 39 F9 30 */ 0x3466, 0x3467, 0x3468, 0x3469, 0x346A,
+ /* GB+81 39 F9 35 */ 0x346B, 0x346C, 0x346D, 0x346E, 0x346F,
+ /* GB+81 39 FA 30 */ 0x3470, 0x3471, 0x3472, 0x3474, 0x3475,
+ /* GB+81 39 FA 35 */ 0x3476, 0x3477, 0x3478, 0x3479, 0x347A,
+ /* GB+81 39 FB 30 */ 0x347B, 0x347C, 0x347D, 0x347E, 0x347F,
+ /* GB+81 39 FB 35 */ 0x3480, 0x3481, 0x3482, 0x3483, 0x3484,
+ /* GB+81 39 FC 30 */ 0x3485, 0x3486, 0x3487, 0x3488, 0x3489,
+ /* GB+81 39 FC 35 */ 0x348A, 0x348B, 0x348C, 0x348D, 0x348E,
+ /* GB+81 39 FD 30 */ 0x348F, 0x3490, 0x3491, 0x3492, 0x3493,
+ /* GB+81 39 FD 35 */ 0x3494, 0x3495, 0x3496, 0x3497, 0x3498,
+ /* GB+81 39 FE 30 */ 0x3499, 0x349A, 0x349B, 0x349C, 0x349D,
+ /* GB+81 39 FE 35 */ 0x349E, 0x349F, 0x34A0, 0x34A1, 0x34A2,
+ /* GB+82 30 81 30 */ 0x34A3, 0x34A4, 0x34A5, 0x34A6, 0x34A7,
+ /* GB+82 30 81 35 */ 0x34A8, 0x34A9, 0x34AA, 0x34AB, 0x34AC,
+ /* GB+82 30 82 30 */ 0x34AD, 0x34AE, 0x34AF, 0x34B0, 0x34B1,
+ /* GB+82 30 82 35 */ 0x34B2, 0x34B3, 0x34B4, 0x34B5, 0x34B6,
+ /* GB+82 30 83 30 */ 0x34B7, 0x34B8, 0x34B9, 0x34BA, 0x34BB,
+ /* GB+82 30 83 35 */ 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x34C0,
+ /* GB+82 30 84 30 */ 0x34C1, 0x34C2, 0x34C3, 0x34C4, 0x34C5,
+ /* GB+82 30 84 35 */ 0x34C6, 0x34C7, 0x34C8, 0x34C9, 0x34CA,
+ /* GB+82 30 85 30 */ 0x34CB, 0x34CC, 0x34CD, 0x34CE, 0x34CF,
+ /* GB+82 30 85 35 */ 0x34D0, 0x34D1, 0x34D2, 0x34D3, 0x34D4,
+ /* GB+82 30 86 30 */ 0x34D5, 0x34D6, 0x34D7, 0x34D8, 0x34D9,
+ /* GB+82 30 86 35 */ 0x34DA, 0x34DB, 0x34DC, 0x34DD, 0x34DE,
+ /* GB+82 30 87 30 */ 0x34DF, 0x34E0, 0x34E1, 0x34E2, 0x34E3,
+ /* GB+82 30 87 35 */ 0x34E4, 0x34E5, 0x34E6, 0x34E7, 0x34E8,
+ /* GB+82 30 88 30 */ 0x34E9, 0x34EA, 0x34EB, 0x34EC, 0x34ED,
+ /* GB+82 30 88 35 */ 0x34EE, 0x34EF, 0x34F0, 0x34F1, 0x34F2,
+ /* GB+82 30 89 30 */ 0x34F3, 0x34F4, 0x34F5, 0x34F6, 0x34F7,
+ /* GB+82 30 89 35 */ 0x34F8, 0x34F9, 0x34FA, 0x34FB, 0x34FC,
+ /* GB+82 30 8A 30 */ 0x34FD, 0x34FE, 0x34FF, 0x3500, 0x3501,
+ /* GB+82 30 8A 35 */ 0x3502, 0x3503, 0x3504, 0x3505, 0x3506,
+ /* GB+82 30 8B 30 */ 0x3507, 0x3508, 0x3509, 0x350A, 0x350B,
+ /* GB+82 30 8B 35 */ 0x350C, 0x350D, 0x350E, 0x350F, 0x3510,
+ /* GB+82 30 8C 30 */ 0x3511, 0x3512, 0x3513, 0x3514, 0x3515,
+ /* GB+82 30 8C 35 */ 0x3516, 0x3517, 0x3518, 0x3519, 0x351A,
+ /* GB+82 30 8D 30 */ 0x351B, 0x351C, 0x351D, 0x351E, 0x351F,
+ /* GB+82 30 8D 35 */ 0x3520, 0x3521, 0x3522, 0x3523, 0x3524,
+ /* GB+82 30 8E 30 */ 0x3525, 0x3526, 0x3527, 0x3528, 0x3529,
+ /* GB+82 30 8E 35 */ 0x352A, 0x352B, 0x352C, 0x352D, 0x352E,
+ /* GB+82 30 8F 30 */ 0x352F, 0x3530, 0x3531, 0x3532, 0x3533,
+ /* GB+82 30 8F 35 */ 0x3534, 0x3535, 0x3536, 0x3537, 0x3538,
+ /* GB+82 30 90 30 */ 0x3539, 0x353A, 0x353B, 0x353C, 0x353D,
+ /* GB+82 30 90 35 */ 0x353E, 0x353F, 0x3540, 0x3541, 0x3542,
+ /* GB+82 30 91 30 */ 0x3543, 0x3544, 0x3545, 0x3546, 0x3547,
+ /* GB+82 30 91 35 */ 0x3548, 0x3549, 0x354A, 0x354B, 0x354C,
+ /* GB+82 30 92 30 */ 0x354D, 0x354E, 0x354F, 0x3550, 0x3551,
+ /* GB+82 30 92 35 */ 0x3552, 0x3553, 0x3554, 0x3555, 0x3556,
+ /* GB+82 30 93 30 */ 0x3557, 0x3558, 0x3559, 0x355A, 0x355B,
+ /* GB+82 30 93 35 */ 0x355C, 0x355D, 0x355E, 0x355F, 0x3560,
+ /* GB+82 30 94 30 */ 0x3561, 0x3562, 0x3563, 0x3564, 0x3565,
+ /* GB+82 30 94 35 */ 0x3566, 0x3567, 0x3568, 0x3569, 0x356A,
+ /* GB+82 30 95 30 */ 0x356B, 0x356C, 0x356D, 0x356E, 0x356F,
+ /* GB+82 30 95 35 */ 0x3570, 0x3571, 0x3572, 0x3573, 0x3574,
+ /* GB+82 30 96 30 */ 0x3575, 0x3576, 0x3577, 0x3578, 0x3579,
+ /* GB+82 30 96 35 */ 0x357A, 0x357B, 0x357C, 0x357D, 0x357E,
+ /* GB+82 30 97 30 */ 0x357F, 0x3580, 0x3581, 0x3582, 0x3583,
+ /* GB+82 30 97 35 */ 0x3584, 0x3585, 0x3586, 0x3587, 0x3588,
+ /* GB+82 30 98 30 */ 0x3589, 0x358A, 0x358B, 0x358C, 0x358D,
+ /* GB+82 30 98 35 */ 0x358E, 0x358F, 0x3590, 0x3591, 0x3592,
+ /* GB+82 30 99 30 */ 0x3593, 0x3594, 0x3595, 0x3596, 0x3597,
+ /* GB+82 30 99 35 */ 0x3598, 0x3599, 0x359A, 0x359B, 0x359C,
+ /* GB+82 30 9A 30 */ 0x359D, 0x359F, 0x35A0, 0x35A1, 0x35A2,
+ /* GB+82 30 9A 35 */ 0x35A3, 0x35A4, 0x35A5, 0x35A6, 0x35A7,
+ /* GB+82 30 9B 30 */ 0x35A8, 0x35A9, 0x35AA, 0x35AB, 0x35AC,
+ /* GB+82 30 9B 35 */ 0x35AD, 0x35AE, 0x35AF, 0x35B0, 0x35B1,
+ /* GB+82 30 9C 30 */ 0x35B2, 0x35B3, 0x35B4, 0x35B5, 0x35B6,
+ /* GB+82 30 9C 35 */ 0x35B7, 0x35B8, 0x35B9, 0x35BA, 0x35BB,
+ /* GB+82 30 9D 30 */ 0x35BC, 0x35BD, 0x35BE, 0x35BF, 0x35C0,
+ /* GB+82 30 9D 35 */ 0x35C1, 0x35C2, 0x35C3, 0x35C4, 0x35C5,
+ /* GB+82 30 9E 30 */ 0x35C6, 0x35C7, 0x35C8, 0x35C9, 0x35CA,
+ /* GB+82 30 9E 35 */ 0x35CB, 0x35CC, 0x35CD, 0x35CE, 0x35CF,
+ /* GB+82 30 9F 30 */ 0x35D0, 0x35D1, 0x35D2, 0x35D3, 0x35D4,
+ /* GB+82 30 9F 35 */ 0x35D5, 0x35D6, 0x35D7, 0x35D8, 0x35D9,
+ /* GB+82 30 A0 30 */ 0x35DA, 0x35DB, 0x35DC, 0x35DD, 0x35DE,
+ /* GB+82 30 A0 35 */ 0x35DF, 0x35E0, 0x35E1, 0x35E2, 0x35E3,
+ /* GB+82 30 A1 30 */ 0x35E4, 0x35E5, 0x35E6, 0x35E7, 0x35E8,
+ /* GB+82 30 A1 35 */ 0x35E9, 0x35EA, 0x35EB, 0x35EC, 0x35ED,
+ /* GB+82 30 A2 30 */ 0x35EE, 0x35EF, 0x35F0, 0x35F1, 0x35F2,
+ /* GB+82 30 A2 35 */ 0x35F3, 0x35F4, 0x35F5, 0x35F6, 0x35F7,
+ /* GB+82 30 A3 30 */ 0x35F8, 0x35F9, 0x35FA, 0x35FB, 0x35FC,
+ /* GB+82 30 A3 35 */ 0x35FD, 0x35FE, 0x35FF, 0x3600, 0x3601,
+ /* GB+82 30 A4 30 */ 0x3602, 0x3603, 0x3604, 0x3605, 0x3606,
+ /* GB+82 30 A4 35 */ 0x3607, 0x3608, 0x3609, 0x360A, 0x360B,
+ /* GB+82 30 A5 30 */ 0x360C, 0x360D, 0x360F, 0x3610, 0x3611,
+ /* GB+82 30 A5 35 */ 0x3612, 0x3613, 0x3614, 0x3615, 0x3616,
+ /* GB+82 30 A6 30 */ 0x3617, 0x3618, 0x3619,
+ /* Contiguous area: GB+82 30 F2 38 .. GB+82 31 D4 37 */
+ /* GB+82 30 F2 38 */ 0x3919, 0x391A,
+ /* GB+82 30 F3 30 */ 0x391B, 0x391C, 0x391D, 0x391E, 0x391F,
+ /* GB+82 30 F3 35 */ 0x3920, 0x3921, 0x3922, 0x3923, 0x3924,
+ /* GB+82 30 F4 30 */ 0x3925, 0x3926, 0x3927, 0x3928, 0x3929,
+ /* GB+82 30 F4 35 */ 0x392A, 0x392B, 0x392C, 0x392D, 0x392E,
+ /* GB+82 30 F5 30 */ 0x392F, 0x3930, 0x3931, 0x3932, 0x3933,
+ /* GB+82 30 F5 35 */ 0x3934, 0x3935, 0x3936, 0x3937, 0x3938,
+ /* GB+82 30 F6 30 */ 0x3939, 0x393A, 0x393B, 0x393C, 0x393D,
+ /* GB+82 30 F6 35 */ 0x393E, 0x393F, 0x3940, 0x3941, 0x3942,
+ /* GB+82 30 F7 30 */ 0x3943, 0x3944, 0x3945, 0x3946, 0x3947,
+ /* GB+82 30 F7 35 */ 0x3948, 0x3949, 0x394A, 0x394B, 0x394C,
+ /* GB+82 30 F8 30 */ 0x394D, 0x394E, 0x394F, 0x3950, 0x3951,
+ /* GB+82 30 F8 35 */ 0x3952, 0x3953, 0x3954, 0x3955, 0x3956,
+ /* GB+82 30 F9 30 */ 0x3957, 0x3958, 0x3959, 0x395A, 0x395B,
+ /* GB+82 30 F9 35 */ 0x395C, 0x395D, 0x395E, 0x395F, 0x3960,
+ /* GB+82 30 FA 30 */ 0x3961, 0x3962, 0x3963, 0x3964, 0x3965,
+ /* GB+82 30 FA 35 */ 0x3966, 0x3967, 0x3968, 0x3969, 0x396A,
+ /* GB+82 30 FB 30 */ 0x396B, 0x396C, 0x396D, 0x396F, 0x3970,
+ /* GB+82 30 FB 35 */ 0x3971, 0x3972, 0x3973, 0x3974, 0x3975,
+ /* GB+82 30 FC 30 */ 0x3976, 0x3977, 0x3978, 0x3979, 0x397A,
+ /* GB+82 30 FC 35 */ 0x397B, 0x397C, 0x397D, 0x397E, 0x397F,
+ /* GB+82 30 FD 30 */ 0x3980, 0x3981, 0x3982, 0x3983, 0x3984,
+ /* GB+82 30 FD 35 */ 0x3985, 0x3986, 0x3987, 0x3988, 0x3989,
+ /* GB+82 30 FE 30 */ 0x398A, 0x398B, 0x398C, 0x398D, 0x398E,
+ /* GB+82 30 FE 35 */ 0x398F, 0x3990, 0x3991, 0x3992, 0x3993,
+ /* GB+82 31 81 30 */ 0x3994, 0x3995, 0x3996, 0x3997, 0x3998,
+ /* GB+82 31 81 35 */ 0x3999, 0x399A, 0x399B, 0x399C, 0x399D,
+ /* GB+82 31 82 30 */ 0x399E, 0x399F, 0x39A0, 0x39A1, 0x39A2,
+ /* GB+82 31 82 35 */ 0x39A3, 0x39A4, 0x39A5, 0x39A6, 0x39A7,
+ /* GB+82 31 83 30 */ 0x39A8, 0x39A9, 0x39AA, 0x39AB, 0x39AC,
+ /* GB+82 31 83 35 */ 0x39AD, 0x39AE, 0x39AF, 0x39B0, 0x39B1,
+ /* GB+82 31 84 30 */ 0x39B2, 0x39B3, 0x39B4, 0x39B5, 0x39B6,
+ /* GB+82 31 84 35 */ 0x39B7, 0x39B8, 0x39B9, 0x39BA, 0x39BB,
+ /* GB+82 31 85 30 */ 0x39BC, 0x39BD, 0x39BE, 0x39BF, 0x39C0,
+ /* GB+82 31 85 35 */ 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5,
+ /* GB+82 31 86 30 */ 0x39C6, 0x39C7, 0x39C8, 0x39C9, 0x39CA,
+ /* GB+82 31 86 35 */ 0x39CB, 0x39CC, 0x39CD, 0x39CE, 0x39D1,
+ /* GB+82 31 87 30 */ 0x39D2, 0x39D3, 0x39D4, 0x39D5, 0x39D6,
+ /* GB+82 31 87 35 */ 0x39D7, 0x39D8, 0x39D9, 0x39DA, 0x39DB,
+ /* GB+82 31 88 30 */ 0x39DC, 0x39DD, 0x39DE, 0x39E0, 0x39E1,
+ /* GB+82 31 88 35 */ 0x39E2, 0x39E3, 0x39E4, 0x39E5, 0x39E6,
+ /* GB+82 31 89 30 */ 0x39E7, 0x39E8, 0x39E9, 0x39EA, 0x39EB,
+ /* GB+82 31 89 35 */ 0x39EC, 0x39ED, 0x39EE, 0x39EF, 0x39F0,
+ /* GB+82 31 8A 30 */ 0x39F1, 0x39F2, 0x39F3, 0x39F4, 0x39F5,
+ /* GB+82 31 8A 35 */ 0x39F6, 0x39F7, 0x39F8, 0x39F9, 0x39FA,
+ /* GB+82 31 8B 30 */ 0x39FB, 0x39FC, 0x39FD, 0x39FE, 0x39FF,
+ /* GB+82 31 8B 35 */ 0x3A00, 0x3A01, 0x3A02, 0x3A03, 0x3A04,
+ /* GB+82 31 8C 30 */ 0x3A05, 0x3A06, 0x3A07, 0x3A08, 0x3A09,
+ /* GB+82 31 8C 35 */ 0x3A0A, 0x3A0B, 0x3A0C, 0x3A0D, 0x3A0E,
+ /* GB+82 31 8D 30 */ 0x3A0F, 0x3A10, 0x3A11, 0x3A12, 0x3A13,
+ /* GB+82 31 8D 35 */ 0x3A14, 0x3A15, 0x3A16, 0x3A17, 0x3A18,
+ /* GB+82 31 8E 30 */ 0x3A19, 0x3A1A, 0x3A1B, 0x3A1C, 0x3A1D,
+ /* GB+82 31 8E 35 */ 0x3A1E, 0x3A1F, 0x3A20, 0x3A21, 0x3A22,
+ /* GB+82 31 8F 30 */ 0x3A23, 0x3A24, 0x3A25, 0x3A26, 0x3A27,
+ /* GB+82 31 8F 35 */ 0x3A28, 0x3A29, 0x3A2A, 0x3A2B, 0x3A2C,
+ /* GB+82 31 90 30 */ 0x3A2D, 0x3A2E, 0x3A2F, 0x3A30, 0x3A31,
+ /* GB+82 31 90 35 */ 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36,
+ /* GB+82 31 91 30 */ 0x3A37, 0x3A38, 0x3A39, 0x3A3A, 0x3A3B,
+ /* GB+82 31 91 35 */ 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A40,
+ /* GB+82 31 92 30 */ 0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45,
+ /* GB+82 31 92 35 */ 0x3A46, 0x3A47, 0x3A48, 0x3A49, 0x3A4A,
+ /* GB+82 31 93 30 */ 0x3A4B, 0x3A4C, 0x3A4D, 0x3A4E, 0x3A4F,
+ /* GB+82 31 93 35 */ 0x3A50, 0x3A51, 0x3A52, 0x3A53, 0x3A54,
+ /* GB+82 31 94 30 */ 0x3A55, 0x3A56, 0x3A57, 0x3A58, 0x3A59,
+ /* GB+82 31 94 35 */ 0x3A5A, 0x3A5B, 0x3A5C, 0x3A5D, 0x3A5E,
+ /* GB+82 31 95 30 */ 0x3A5F, 0x3A60, 0x3A61, 0x3A62, 0x3A63,
+ /* GB+82 31 95 35 */ 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68,
+ /* GB+82 31 96 30 */ 0x3A69, 0x3A6A, 0x3A6B, 0x3A6C, 0x3A6D,
+ /* GB+82 31 96 35 */ 0x3A6E, 0x3A6F, 0x3A70, 0x3A71, 0x3A72,
+ /* GB+82 31 97 30 */ 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78,
+ /* GB+82 31 97 35 */ 0x3A79, 0x3A7A, 0x3A7B, 0x3A7C, 0x3A7D,
+ /* GB+82 31 98 30 */ 0x3A7E, 0x3A7F, 0x3A80, 0x3A81, 0x3A82,
+ /* GB+82 31 98 35 */ 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87,
+ /* GB+82 31 99 30 */ 0x3A88, 0x3A89, 0x3A8A, 0x3A8B, 0x3A8C,
+ /* GB+82 31 99 35 */ 0x3A8D, 0x3A8E, 0x3A8F, 0x3A90, 0x3A91,
+ /* GB+82 31 9A 30 */ 0x3A92, 0x3A93, 0x3A94, 0x3A95, 0x3A96,
+ /* GB+82 31 9A 35 */ 0x3A97, 0x3A98, 0x3A99, 0x3A9A, 0x3A9B,
+ /* GB+82 31 9B 30 */ 0x3A9C, 0x3A9D, 0x3A9E, 0x3A9F, 0x3AA0,
+ /* GB+82 31 9B 35 */ 0x3AA1, 0x3AA2, 0x3AA3, 0x3AA4, 0x3AA5,
+ /* GB+82 31 9C 30 */ 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9, 0x3AAA,
+ /* GB+82 31 9C 35 */ 0x3AAB, 0x3AAC, 0x3AAD, 0x3AAE, 0x3AAF,
+ /* GB+82 31 9D 30 */ 0x3AB0, 0x3AB1, 0x3AB2, 0x3AB3, 0x3AB4,
+ /* GB+82 31 9D 35 */ 0x3AB5, 0x3AB6, 0x3AB7, 0x3AB8, 0x3AB9,
+ /* GB+82 31 9E 30 */ 0x3ABA, 0x3ABB, 0x3ABC, 0x3ABD, 0x3ABE,
+ /* GB+82 31 9E 35 */ 0x3ABF, 0x3AC0, 0x3AC1, 0x3AC2, 0x3AC3,
+ /* GB+82 31 9F 30 */ 0x3AC4, 0x3AC5, 0x3AC6, 0x3AC7, 0x3AC8,
+ /* GB+82 31 9F 35 */ 0x3AC9, 0x3ACA, 0x3ACB, 0x3ACC, 0x3ACD,
+ /* GB+82 31 A0 30 */ 0x3ACE, 0x3ACF, 0x3AD0, 0x3AD1, 0x3AD2,
+ /* GB+82 31 A0 35 */ 0x3AD3, 0x3AD4, 0x3AD5, 0x3AD6, 0x3AD7,
+ /* GB+82 31 A1 30 */ 0x3AD8, 0x3AD9, 0x3ADA, 0x3ADB, 0x3ADC,
+ /* GB+82 31 A1 35 */ 0x3ADD, 0x3ADE, 0x3ADF, 0x3AE0, 0x3AE1,
+ /* GB+82 31 A2 30 */ 0x3AE2, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6,
+ /* GB+82 31 A2 35 */ 0x3AE7, 0x3AE8, 0x3AE9, 0x3AEA, 0x3AEB,
+ /* GB+82 31 A3 30 */ 0x3AEC, 0x3AED, 0x3AEE, 0x3AEF, 0x3AF0,
+ /* GB+82 31 A3 35 */ 0x3AF1, 0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5,
+ /* GB+82 31 A4 30 */ 0x3AF6, 0x3AF7, 0x3AF8, 0x3AF9, 0x3AFA,
+ /* GB+82 31 A4 35 */ 0x3AFB, 0x3AFC, 0x3AFD, 0x3AFE, 0x3AFF,
+ /* GB+82 31 A5 30 */ 0x3B00, 0x3B01, 0x3B02, 0x3B03, 0x3B04,
+ /* GB+82 31 A5 35 */ 0x3B05, 0x3B06, 0x3B07, 0x3B08, 0x3B09,
+ /* GB+82 31 A6 30 */ 0x3B0A, 0x3B0B, 0x3B0C, 0x3B0D, 0x3B0E,
+ /* GB+82 31 A6 35 */ 0x3B0F, 0x3B10, 0x3B11, 0x3B12, 0x3B13,
+ /* GB+82 31 A7 30 */ 0x3B14, 0x3B15, 0x3B16, 0x3B17, 0x3B18,
+ /* GB+82 31 A7 35 */ 0x3B19, 0x3B1A, 0x3B1B, 0x3B1C, 0x3B1D,
+ /* GB+82 31 A8 30 */ 0x3B1E, 0x3B1F, 0x3B20, 0x3B21, 0x3B22,
+ /* GB+82 31 A8 35 */ 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27,
+ /* GB+82 31 A9 30 */ 0x3B28, 0x3B29, 0x3B2A, 0x3B2B, 0x3B2C,
+ /* GB+82 31 A9 35 */ 0x3B2D, 0x3B2E, 0x3B2F, 0x3B30, 0x3B31,
+ /* GB+82 31 AA 30 */ 0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36,
+ /* GB+82 31 AA 35 */ 0x3B37, 0x3B38, 0x3B39, 0x3B3A, 0x3B3B,
+ /* GB+82 31 AB 30 */ 0x3B3C, 0x3B3D, 0x3B3E, 0x3B3F, 0x3B40,
+ /* GB+82 31 AB 35 */ 0x3B41, 0x3B42, 0x3B43, 0x3B44, 0x3B45,
+ /* GB+82 31 AC 30 */ 0x3B46, 0x3B47, 0x3B48, 0x3B49, 0x3B4A,
+ /* GB+82 31 AC 35 */ 0x3B4B, 0x3B4C, 0x3B4D, 0x3B4F, 0x3B50,
+ /* GB+82 31 AD 30 */ 0x3B51, 0x3B52, 0x3B53, 0x3B54, 0x3B55,
+ /* GB+82 31 AD 35 */ 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B5A,
+ /* GB+82 31 AE 30 */ 0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3B5F,
+ /* GB+82 31 AE 35 */ 0x3B60, 0x3B61, 0x3B62, 0x3B63, 0x3B64,
+ /* GB+82 31 AF 30 */ 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69,
+ /* GB+82 31 AF 35 */ 0x3B6A, 0x3B6B, 0x3B6C, 0x3B6D, 0x3B6E,
+ /* GB+82 31 B0 30 */ 0x3B6F, 0x3B70, 0x3B71, 0x3B72, 0x3B73,
+ /* GB+82 31 B0 35 */ 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78,
+ /* GB+82 31 B1 30 */ 0x3B79, 0x3B7A, 0x3B7B, 0x3B7C, 0x3B7D,
+ /* GB+82 31 B1 35 */ 0x3B7E, 0x3B7F, 0x3B80, 0x3B81, 0x3B82,
+ /* GB+82 31 B2 30 */ 0x3B83, 0x3B84, 0x3B85, 0x3B86, 0x3B87,
+ /* GB+82 31 B2 35 */ 0x3B88, 0x3B89, 0x3B8A, 0x3B8B, 0x3B8C,
+ /* GB+82 31 B3 30 */ 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91,
+ /* GB+82 31 B3 35 */ 0x3B92, 0x3B93, 0x3B94, 0x3B95, 0x3B96,
+ /* GB+82 31 B4 30 */ 0x3B97, 0x3B98, 0x3B99, 0x3B9A, 0x3B9B,
+ /* GB+82 31 B4 35 */ 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0,
+ /* GB+82 31 B5 30 */ 0x3BA1, 0x3BA2, 0x3BA3, 0x3BA4, 0x3BA5,
+ /* GB+82 31 B5 35 */ 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BAA,
+ /* GB+82 31 B6 30 */ 0x3BAB, 0x3BAC, 0x3BAD, 0x3BAE, 0x3BAF,
+ /* GB+82 31 B6 35 */ 0x3BB0, 0x3BB1, 0x3BB2, 0x3BB3, 0x3BB4,
+ /* GB+82 31 B7 30 */ 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, 0x3BB9,
+ /* GB+82 31 B7 35 */ 0x3BBA, 0x3BBB, 0x3BBC, 0x3BBD, 0x3BBE,
+ /* GB+82 31 B8 30 */ 0x3BBF, 0x3BC0, 0x3BC1, 0x3BC2, 0x3BC3,
+ /* GB+82 31 B8 35 */ 0x3BC4, 0x3BC5, 0x3BC6, 0x3BC7, 0x3BC8,
+ /* GB+82 31 B9 30 */ 0x3BC9, 0x3BCA, 0x3BCB, 0x3BCC, 0x3BCD,
+ /* GB+82 31 B9 35 */ 0x3BCE, 0x3BCF, 0x3BD0, 0x3BD1, 0x3BD2,
+ /* GB+82 31 BA 30 */ 0x3BD3, 0x3BD4, 0x3BD5, 0x3BD6, 0x3BD7,
+ /* GB+82 31 BA 35 */ 0x3BD8, 0x3BD9, 0x3BDA, 0x3BDB, 0x3BDC,
+ /* GB+82 31 BB 30 */ 0x3BDD, 0x3BDE, 0x3BDF, 0x3BE0, 0x3BE1,
+ /* GB+82 31 BB 35 */ 0x3BE2, 0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6,
+ /* GB+82 31 BC 30 */ 0x3BE7, 0x3BE8, 0x3BE9, 0x3BEA, 0x3BEB,
+ /* GB+82 31 BC 35 */ 0x3BEC, 0x3BED, 0x3BEE, 0x3BEF, 0x3BF0,
+ /* GB+82 31 BD 30 */ 0x3BF1, 0x3BF2, 0x3BF3, 0x3BF4, 0x3BF5,
+ /* GB+82 31 BD 35 */ 0x3BF6, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA,
+ /* GB+82 31 BE 30 */ 0x3BFB, 0x3BFC, 0x3BFD, 0x3BFE, 0x3BFF,
+ /* GB+82 31 BE 35 */ 0x3C00, 0x3C01, 0x3C02, 0x3C03, 0x3C04,
+ /* GB+82 31 BF 30 */ 0x3C05, 0x3C06, 0x3C07, 0x3C08, 0x3C09,
+ /* GB+82 31 BF 35 */ 0x3C0A, 0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E,
+ /* GB+82 31 C0 30 */ 0x3C0F, 0x3C10, 0x3C11, 0x3C12, 0x3C13,
+ /* GB+82 31 C0 35 */ 0x3C14, 0x3C15, 0x3C16, 0x3C17, 0x3C18,
+ /* GB+82 31 C1 30 */ 0x3C19, 0x3C1A, 0x3C1B, 0x3C1C, 0x3C1D,
+ /* GB+82 31 C1 35 */ 0x3C1E, 0x3C1F, 0x3C20, 0x3C21, 0x3C22,
+ /* GB+82 31 C2 30 */ 0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27,
+ /* GB+82 31 C2 35 */ 0x3C28, 0x3C29, 0x3C2A, 0x3C2B, 0x3C2C,
+ /* GB+82 31 C3 30 */ 0x3C2D, 0x3C2E, 0x3C2F, 0x3C30, 0x3C31,
+ /* GB+82 31 C3 35 */ 0x3C32, 0x3C33, 0x3C34, 0x3C35, 0x3C36,
+ /* GB+82 31 C4 30 */ 0x3C37, 0x3C38, 0x3C39, 0x3C3A, 0x3C3B,
+ /* GB+82 31 C4 35 */ 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40,
+ /* GB+82 31 C5 30 */ 0x3C41, 0x3C42, 0x3C43, 0x3C44, 0x3C45,
+ /* GB+82 31 C5 35 */ 0x3C46, 0x3C47, 0x3C48, 0x3C49, 0x3C4A,
+ /* GB+82 31 C6 30 */ 0x3C4B, 0x3C4C, 0x3C4D, 0x3C4E, 0x3C4F,
+ /* GB+82 31 C6 35 */ 0x3C50, 0x3C51, 0x3C52, 0x3C53, 0x3C54,
+ /* GB+82 31 C7 30 */ 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59,
+ /* GB+82 31 C7 35 */ 0x3C5A, 0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E,
+ /* GB+82 31 C8 30 */ 0x3C5F, 0x3C60, 0x3C61, 0x3C62, 0x3C63,
+ /* GB+82 31 C8 35 */ 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68,
+ /* GB+82 31 C9 30 */ 0x3C69, 0x3C6A, 0x3C6B, 0x3C6C, 0x3C6D,
+ /* GB+82 31 C9 35 */ 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C73,
+ /* GB+82 31 CA 30 */ 0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78,
+ /* GB+82 31 CA 35 */ 0x3C79, 0x3C7A, 0x3C7B, 0x3C7C, 0x3C7D,
+ /* GB+82 31 CB 30 */ 0x3C7E, 0x3C7F, 0x3C80, 0x3C81, 0x3C82,
+ /* GB+82 31 CB 35 */ 0x3C83, 0x3C84, 0x3C85, 0x3C86, 0x3C87,
+ /* GB+82 31 CC 30 */ 0x3C88, 0x3C89, 0x3C8A, 0x3C8B, 0x3C8C,
+ /* GB+82 31 CC 35 */ 0x3C8D, 0x3C8E, 0x3C8F, 0x3C90, 0x3C91,
+ /* GB+82 31 CD 30 */ 0x3C92, 0x3C93, 0x3C94, 0x3C95, 0x3C96,
+ /* GB+82 31 CD 35 */ 0x3C97, 0x3C98, 0x3C99, 0x3C9A, 0x3C9B,
+ /* GB+82 31 CE 30 */ 0x3C9C, 0x3C9D, 0x3C9E, 0x3C9F, 0x3CA0,
+ /* GB+82 31 CE 35 */ 0x3CA1, 0x3CA2, 0x3CA3, 0x3CA4, 0x3CA5,
+ /* GB+82 31 CF 30 */ 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9, 0x3CAA,
+ /* GB+82 31 CF 35 */ 0x3CAB, 0x3CAC, 0x3CAD, 0x3CAE, 0x3CAF,
+ /* GB+82 31 D0 30 */ 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3, 0x3CB4,
+ /* GB+82 31 D0 35 */ 0x3CB5, 0x3CB6, 0x3CB7, 0x3CB8, 0x3CB9,
+ /* GB+82 31 D1 30 */ 0x3CBA, 0x3CBB, 0x3CBC, 0x3CBD, 0x3CBE,
+ /* GB+82 31 D1 35 */ 0x3CBF, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3,
+ /* GB+82 31 D2 30 */ 0x3CC4, 0x3CC5, 0x3CC6, 0x3CC7, 0x3CC8,
+ /* GB+82 31 D2 35 */ 0x3CC9, 0x3CCA, 0x3CCB, 0x3CCC, 0x3CCD,
+ /* GB+82 31 D3 30 */ 0x3CCE, 0x3CCF, 0x3CD0, 0x3CD1, 0x3CD2,
+ /* GB+82 31 D3 35 */ 0x3CD3, 0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7,
+ /* GB+82 31 D4 30 */ 0x3CD8, 0x3CD9, 0x3CDA, 0x3CDB, 0x3CDC,
+ /* GB+82 31 D4 35 */ 0x3CDD, 0x3CDE, 0x3CDF,
+ /* Contiguous area: GB+82 32 AF 33 .. GB+82 32 C9 36 */
+ /* GB+82 32 AF 33 */ 0x4057, 0x4058,
+ /* GB+82 32 AF 35 */ 0x4059, 0x405A, 0x405B, 0x405C, 0x405D,
+ /* GB+82 32 B0 30 */ 0x405E, 0x405F, 0x4060, 0x4061, 0x4062,
+ /* GB+82 32 B0 35 */ 0x4063, 0x4064, 0x4065, 0x4066, 0x4067,
+ /* GB+82 32 B1 30 */ 0x4068, 0x4069, 0x406A, 0x406B, 0x406C,
+ /* GB+82 32 B1 35 */ 0x406D, 0x406E, 0x406F, 0x4070, 0x4071,
+ /* GB+82 32 B2 30 */ 0x4072, 0x4073, 0x4074, 0x4075, 0x4076,
+ /* GB+82 32 B2 35 */ 0x4077, 0x4078, 0x4079, 0x407A, 0x407B,
+ /* GB+82 32 B3 30 */ 0x407C, 0x407D, 0x407E, 0x407F, 0x4080,
+ /* GB+82 32 B3 35 */ 0x4081, 0x4082, 0x4083, 0x4084, 0x4085,
+ /* GB+82 32 B4 30 */ 0x4086, 0x4087, 0x4088, 0x4089, 0x408A,
+ /* GB+82 32 B4 35 */ 0x408B, 0x408C, 0x408D, 0x408E, 0x408F,
+ /* GB+82 32 B5 30 */ 0x4090, 0x4091, 0x4092, 0x4093, 0x4094,
+ /* GB+82 32 B5 35 */ 0x4095, 0x4096, 0x4097, 0x4098, 0x4099,
+ /* GB+82 32 B6 30 */ 0x409A, 0x409B, 0x409C, 0x409D, 0x409E,
+ /* GB+82 32 B6 35 */ 0x409F, 0x40A0, 0x40A1, 0x40A2, 0x40A3,
+ /* GB+82 32 B7 30 */ 0x40A4, 0x40A5, 0x40A6, 0x40A7, 0x40A8,
+ /* GB+82 32 B7 35 */ 0x40A9, 0x40AA, 0x40AB, 0x40AC, 0x40AD,
+ /* GB+82 32 B8 30 */ 0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2,
+ /* GB+82 32 B8 35 */ 0x40B3, 0x40B4, 0x40B5, 0x40B6, 0x40B7,
+ /* GB+82 32 B9 30 */ 0x40B8, 0x40B9, 0x40BA, 0x40BB, 0x40BC,
+ /* GB+82 32 B9 35 */ 0x40BD, 0x40BE, 0x40BF, 0x40C0, 0x40C1,
+ /* GB+82 32 BA 30 */ 0x40C2, 0x40C3, 0x40C4, 0x40C5, 0x40C6,
+ /* GB+82 32 BA 35 */ 0x40C7, 0x40C8, 0x40C9, 0x40CA, 0x40CB,
+ /* GB+82 32 BB 30 */ 0x40CC, 0x40CD, 0x40CE, 0x40CF, 0x40D0,
+ /* GB+82 32 BB 35 */ 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40D5,
+ /* GB+82 32 BC 30 */ 0x40D6, 0x40D7, 0x40D8, 0x40D9, 0x40DA,
+ /* GB+82 32 BC 35 */ 0x40DB, 0x40DC, 0x40DD, 0x40DE, 0x40DF,
+ /* GB+82 32 BD 30 */ 0x40E0, 0x40E1, 0x40E2, 0x40E3, 0x40E4,
+ /* GB+82 32 BD 35 */ 0x40E5, 0x40E6, 0x40E7, 0x40E8, 0x40E9,
+ /* GB+82 32 BE 30 */ 0x40EA, 0x40EB, 0x40EC, 0x40ED, 0x40EE,
+ /* GB+82 32 BE 35 */ 0x40EF, 0x40F0, 0x40F1, 0x40F2, 0x40F3,
+ /* GB+82 32 BF 30 */ 0x40F4, 0x40F5, 0x40F6, 0x40F7, 0x40F8,
+ /* GB+82 32 BF 35 */ 0x40F9, 0x40FA, 0x40FB, 0x40FC, 0x40FD,
+ /* GB+82 32 C0 30 */ 0x40FE, 0x40FF, 0x4100, 0x4101, 0x4102,
+ /* GB+82 32 C0 35 */ 0x4103, 0x4104, 0x4105, 0x4106, 0x4107,
+ /* GB+82 32 C1 30 */ 0x4108, 0x4109, 0x410A, 0x410B, 0x410C,
+ /* GB+82 32 C1 35 */ 0x410D, 0x410E, 0x410F, 0x4110, 0x4111,
+ /* GB+82 32 C2 30 */ 0x4112, 0x4113, 0x4114, 0x4115, 0x4116,
+ /* GB+82 32 C2 35 */ 0x4117, 0x4118, 0x4119, 0x411A, 0x411B,
+ /* GB+82 32 C3 30 */ 0x411C, 0x411D, 0x411E, 0x411F, 0x4120,
+ /* GB+82 32 C3 35 */ 0x4121, 0x4122, 0x4123, 0x4124, 0x4125,
+ /* GB+82 32 C4 30 */ 0x4126, 0x4127, 0x4128, 0x4129, 0x412A,
+ /* GB+82 32 C4 35 */ 0x412B, 0x412C, 0x412D, 0x412E, 0x412F,
+ /* GB+82 32 C5 30 */ 0x4130, 0x4131, 0x4132, 0x4133, 0x4134,
+ /* GB+82 32 C5 35 */ 0x4135, 0x4136, 0x4137, 0x4138, 0x4139,
+ /* GB+82 32 C6 30 */ 0x413A, 0x413B, 0x413C, 0x413D, 0x413E,
+ /* GB+82 32 C6 35 */ 0x413F, 0x4140, 0x4141, 0x4142, 0x4143,
+ /* GB+82 32 C7 30 */ 0x4144, 0x4145, 0x4146, 0x4147, 0x4148,
+ /* GB+82 32 C7 35 */ 0x4149, 0x414A, 0x414B, 0x414C, 0x414D,
+ /* GB+82 32 C8 30 */ 0x414E, 0x414F, 0x4150, 0x4151, 0x4152,
+ /* GB+82 32 C8 35 */ 0x4153, 0x4154, 0x4155, 0x4156, 0x4157,
+ /* GB+82 32 C9 30 */ 0x4158, 0x4159, 0x415A, 0x415B, 0x415C,
+ /* GB+82 32 C9 35 */ 0x415D, 0x415E,
+ /* Contiguous area: GB+82 32 F8 38 .. GB+82 33 A3 38 */
+ /* GB+82 32 F8 38 */ 0x4338, 0x4339,
+ /* GB+82 32 F9 30 */ 0x433A, 0x433B, 0x433C, 0x433D, 0x433E,
+ /* GB+82 32 F9 35 */ 0x433F, 0x4340, 0x4341, 0x4342, 0x4343,
+ /* GB+82 32 FA 30 */ 0x4344, 0x4345, 0x4346, 0x4347, 0x4348,
+ /* GB+82 32 FA 35 */ 0x4349, 0x434A, 0x434B, 0x434C, 0x434D,
+ /* GB+82 32 FB 30 */ 0x434E, 0x434F, 0x4350, 0x4351, 0x4352,
+ /* GB+82 32 FB 35 */ 0x4353, 0x4354, 0x4355, 0x4356, 0x4357,
+ /* GB+82 32 FC 30 */ 0x4358, 0x4359, 0x435A, 0x435B, 0x435C,
+ /* GB+82 32 FC 35 */ 0x435D, 0x435E, 0x435F, 0x4360, 0x4361,
+ /* GB+82 32 FD 30 */ 0x4362, 0x4363, 0x4364, 0x4365, 0x4366,
+ /* GB+82 32 FD 35 */ 0x4367, 0x4368, 0x4369, 0x436A, 0x436B,
+ /* GB+82 32 FE 30 */ 0x436C, 0x436D, 0x436E, 0x436F, 0x4370,
+ /* GB+82 32 FE 35 */ 0x4371, 0x4372, 0x4373, 0x4374, 0x4375,
+ /* GB+82 33 81 30 */ 0x4376, 0x4377, 0x4378, 0x4379, 0x437A,
+ /* GB+82 33 81 35 */ 0x437B, 0x437C, 0x437D, 0x437E, 0x437F,
+ /* GB+82 33 82 30 */ 0x4380, 0x4381, 0x4382, 0x4383, 0x4384,
+ /* GB+82 33 82 35 */ 0x4385, 0x4386, 0x4387, 0x4388, 0x4389,
+ /* GB+82 33 83 30 */ 0x438A, 0x438B, 0x438C, 0x438D, 0x438E,
+ /* GB+82 33 83 35 */ 0x438F, 0x4390, 0x4391, 0x4392, 0x4393,
+ /* GB+82 33 84 30 */ 0x4394, 0x4395, 0x4396, 0x4397, 0x4398,
+ /* GB+82 33 84 35 */ 0x4399, 0x439A, 0x439B, 0x439C, 0x439D,
+ /* GB+82 33 85 30 */ 0x439E, 0x439F, 0x43A0, 0x43A1, 0x43A2,
+ /* GB+82 33 85 35 */ 0x43A3, 0x43A4, 0x43A5, 0x43A6, 0x43A7,
+ /* GB+82 33 86 30 */ 0x43A8, 0x43A9, 0x43AA, 0x43AB, 0x43AD,
+ /* GB+82 33 86 35 */ 0x43AE, 0x43AF, 0x43B0, 0x43B2, 0x43B3,
+ /* GB+82 33 87 30 */ 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8,
+ /* GB+82 33 87 35 */ 0x43B9, 0x43BA, 0x43BB, 0x43BC, 0x43BD,
+ /* GB+82 33 88 30 */ 0x43BE, 0x43BF, 0x43C0, 0x43C1, 0x43C2,
+ /* GB+82 33 88 35 */ 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7,
+ /* GB+82 33 89 30 */ 0x43C8, 0x43C9, 0x43CA, 0x43CB, 0x43CC,
+ /* GB+82 33 89 35 */ 0x43CD, 0x43CE, 0x43CF, 0x43D0, 0x43D1,
+ /* GB+82 33 8A 30 */ 0x43D2, 0x43D3, 0x43D4, 0x43D5, 0x43D6,
+ /* GB+82 33 8A 35 */ 0x43D7, 0x43D8, 0x43D9, 0x43DA, 0x43DB,
+ /* GB+82 33 8B 30 */ 0x43DC, 0x43DE, 0x43DF, 0x43E0, 0x43E1,
+ /* GB+82 33 8B 35 */ 0x43E2, 0x43E3, 0x43E4, 0x43E5, 0x43E6,
+ /* GB+82 33 8C 30 */ 0x43E7, 0x43E8, 0x43E9, 0x43EA, 0x43EB,
+ /* GB+82 33 8C 35 */ 0x43EC, 0x43ED, 0x43EE, 0x43EF, 0x43F0,
+ /* GB+82 33 8D 30 */ 0x43F1, 0x43F2, 0x43F3, 0x43F4, 0x43F5,
+ /* GB+82 33 8D 35 */ 0x43F6, 0x43F7, 0x43F8, 0x43F9, 0x43FA,
+ /* GB+82 33 8E 30 */ 0x43FB, 0x43FC, 0x43FD, 0x43FE, 0x43FF,
+ /* GB+82 33 8E 35 */ 0x4400, 0x4401, 0x4402, 0x4403, 0x4404,
+ /* GB+82 33 8F 30 */ 0x4405, 0x4406, 0x4407, 0x4408, 0x4409,
+ /* GB+82 33 8F 35 */ 0x440A, 0x440B, 0x440C, 0x440D, 0x440E,
+ /* GB+82 33 90 30 */ 0x440F, 0x4410, 0x4411, 0x4412, 0x4413,
+ /* GB+82 33 90 35 */ 0x4414, 0x4415, 0x4416, 0x4417, 0x4418,
+ /* GB+82 33 91 30 */ 0x4419, 0x441A, 0x441B, 0x441C, 0x441D,
+ /* GB+82 33 91 35 */ 0x441E, 0x441F, 0x4420, 0x4421, 0x4422,
+ /* GB+82 33 92 30 */ 0x4423, 0x4424, 0x4425, 0x4426, 0x4427,
+ /* GB+82 33 92 35 */ 0x4428, 0x4429, 0x442A, 0x442B, 0x442C,
+ /* GB+82 33 93 30 */ 0x442D, 0x442E, 0x442F, 0x4430, 0x4431,
+ /* GB+82 33 93 35 */ 0x4432, 0x4433, 0x4434, 0x4435, 0x4436,
+ /* GB+82 33 94 30 */ 0x4437, 0x4438, 0x4439, 0x443A, 0x443B,
+ /* GB+82 33 94 35 */ 0x443C, 0x443D, 0x443E, 0x443F, 0x4440,
+ /* GB+82 33 95 30 */ 0x4441, 0x4442, 0x4443, 0x4444, 0x4445,
+ /* GB+82 33 95 35 */ 0x4446, 0x4447, 0x4448, 0x4449, 0x444A,
+ /* GB+82 33 96 30 */ 0x444B, 0x444C, 0x444D, 0x444E, 0x444F,
+ /* GB+82 33 96 35 */ 0x4450, 0x4451, 0x4452, 0x4453, 0x4454,
+ /* GB+82 33 97 30 */ 0x4455, 0x4456, 0x4457, 0x4458, 0x4459,
+ /* GB+82 33 97 35 */ 0x445A, 0x445B, 0x445C, 0x445D, 0x445E,
+ /* GB+82 33 98 30 */ 0x445F, 0x4460, 0x4461, 0x4462, 0x4463,
+ /* GB+82 33 98 35 */ 0x4464, 0x4465, 0x4466, 0x4467, 0x4468,
+ /* GB+82 33 99 30 */ 0x4469, 0x446A, 0x446B, 0x446C, 0x446D,
+ /* GB+82 33 99 35 */ 0x446E, 0x446F, 0x4470, 0x4471, 0x4472,
+ /* GB+82 33 9A 30 */ 0x4473, 0x4474, 0x4475, 0x4476, 0x4477,
+ /* GB+82 33 9A 35 */ 0x4478, 0x4479, 0x447A, 0x447B, 0x447C,
+ /* GB+82 33 9B 30 */ 0x447D, 0x447E, 0x447F, 0x4480, 0x4481,
+ /* GB+82 33 9B 35 */ 0x4482, 0x4483, 0x4484, 0x4485, 0x4486,
+ /* GB+82 33 9C 30 */ 0x4487, 0x4488, 0x4489, 0x448A, 0x448B,
+ /* GB+82 33 9C 35 */ 0x448C, 0x448D, 0x448E, 0x448F, 0x4490,
+ /* GB+82 33 9D 30 */ 0x4491, 0x4492, 0x4493, 0x4494, 0x4495,
+ /* GB+82 33 9D 35 */ 0x4496, 0x4497, 0x4498, 0x4499, 0x449A,
+ /* GB+82 33 9E 30 */ 0x449B, 0x449C, 0x449D, 0x449E, 0x449F,
+ /* GB+82 33 9E 35 */ 0x44A0, 0x44A1, 0x44A2, 0x44A3, 0x44A4,
+ /* GB+82 33 9F 30 */ 0x44A5, 0x44A6, 0x44A7, 0x44A8, 0x44A9,
+ /* GB+82 33 9F 35 */ 0x44AA, 0x44AB, 0x44AC, 0x44AD, 0x44AE,
+ /* GB+82 33 A0 30 */ 0x44AF, 0x44B0, 0x44B1, 0x44B2, 0x44B3,
+ /* GB+82 33 A0 35 */ 0x44B4, 0x44B5, 0x44B6, 0x44B7, 0x44B8,
+ /* GB+82 33 A1 30 */ 0x44B9, 0x44BA, 0x44BB, 0x44BC, 0x44BD,
+ /* GB+82 33 A1 35 */ 0x44BE, 0x44BF, 0x44C0, 0x44C1, 0x44C2,
+ /* GB+82 33 A2 30 */ 0x44C3, 0x44C4, 0x44C5, 0x44C6, 0x44C7,
+ /* GB+82 33 A2 35 */ 0x44C8, 0x44C9, 0x44CA, 0x44CB, 0x44CC,
+ /* GB+82 33 A3 30 */ 0x44CD, 0x44CE, 0x44CF, 0x44D0, 0x44D1,
+ /* GB+82 33 A3 35 */ 0x44D2, 0x44D3, 0x44D4, 0x44D5,
+ /* Contiguous area: GB+82 33 C9 32 .. GB+82 33 E8 37 */
+ /* GB+82 33 C9 32 */ 0x464D, 0x464E, 0x464F,
+ /* GB+82 33 C9 35 */ 0x4650, 0x4651, 0x4652, 0x4653, 0x4654,
+ /* GB+82 33 CA 30 */ 0x4655, 0x4656, 0x4657, 0x4658, 0x4659,
+ /* GB+82 33 CA 35 */ 0x465A, 0x465B, 0x465C, 0x465D, 0x465E,
+ /* GB+82 33 CB 30 */ 0x465F, 0x4660, 0x4662, 0x4663, 0x4664,
+ /* GB+82 33 CB 35 */ 0x4665, 0x4666, 0x4667, 0x4668, 0x4669,
+ /* GB+82 33 CC 30 */ 0x466A, 0x466B, 0x466C, 0x466D, 0x466E,
+ /* GB+82 33 CC 35 */ 0x466F, 0x4670, 0x4671, 0x4672, 0x4673,
+ /* GB+82 33 CD 30 */ 0x4674, 0x4675, 0x4676, 0x4677, 0x4678,
+ /* GB+82 33 CD 35 */ 0x4679, 0x467A, 0x467B, 0x467C, 0x467D,
+ /* GB+82 33 CE 30 */ 0x467E, 0x467F, 0x4680, 0x4681, 0x4682,
+ /* GB+82 33 CE 35 */ 0x4683, 0x4684, 0x4685, 0x4686, 0x4687,
+ /* GB+82 33 CF 30 */ 0x4688, 0x4689, 0x468A, 0x468B, 0x468C,
+ /* GB+82 33 CF 35 */ 0x468D, 0x468E, 0x468F, 0x4690, 0x4691,
+ /* GB+82 33 D0 30 */ 0x4692, 0x4693, 0x4694, 0x4695, 0x4696,
+ /* GB+82 33 D0 35 */ 0x4697, 0x4698, 0x4699, 0x469A, 0x469B,
+ /* GB+82 33 D1 30 */ 0x469C, 0x469D, 0x469E, 0x469F, 0x46A0,
+ /* GB+82 33 D1 35 */ 0x46A1, 0x46A2, 0x46A3, 0x46A4, 0x46A5,
+ /* GB+82 33 D2 30 */ 0x46A6, 0x46A7, 0x46A8, 0x46A9, 0x46AA,
+ /* GB+82 33 D2 35 */ 0x46AB, 0x46AC, 0x46AD, 0x46AE, 0x46AF,
+ /* GB+82 33 D3 30 */ 0x46B0, 0x46B1, 0x46B2, 0x46B3, 0x46B4,
+ /* GB+82 33 D3 35 */ 0x46B5, 0x46B6, 0x46B7, 0x46B8, 0x46B9,
+ /* GB+82 33 D4 30 */ 0x46BA, 0x46BB, 0x46BC, 0x46BD, 0x46BE,
+ /* GB+82 33 D4 35 */ 0x46BF, 0x46C0, 0x46C1, 0x46C2, 0x46C3,
+ /* GB+82 33 D5 30 */ 0x46C4, 0x46C5, 0x46C6, 0x46C7, 0x46C8,
+ /* GB+82 33 D5 35 */ 0x46C9, 0x46CA, 0x46CB, 0x46CC, 0x46CD,
+ /* GB+82 33 D6 30 */ 0x46CE, 0x46CF, 0x46D0, 0x46D1, 0x46D2,
+ /* GB+82 33 D6 35 */ 0x46D3, 0x46D4, 0x46D5, 0x46D6, 0x46D7,
+ /* GB+82 33 D7 30 */ 0x46D8, 0x46D9, 0x46DA, 0x46DB, 0x46DC,
+ /* GB+82 33 D7 35 */ 0x46DD, 0x46DE, 0x46DF, 0x46E0, 0x46E1,
+ /* GB+82 33 D8 30 */ 0x46E2, 0x46E3, 0x46E4, 0x46E5, 0x46E6,
+ /* GB+82 33 D8 35 */ 0x46E7, 0x46E8, 0x46E9, 0x46EA, 0x46EB,
+ /* GB+82 33 D9 30 */ 0x46EC, 0x46ED, 0x46EE, 0x46EF, 0x46F0,
+ /* GB+82 33 D9 35 */ 0x46F1, 0x46F2, 0x46F3, 0x46F4, 0x46F5,
+ /* GB+82 33 DA 30 */ 0x46F6, 0x46F7, 0x46F8, 0x46F9, 0x46FA,
+ /* GB+82 33 DA 35 */ 0x46FB, 0x46FC, 0x46FD, 0x46FE, 0x46FF,
+ /* GB+82 33 DB 30 */ 0x4700, 0x4701, 0x4702, 0x4703, 0x4704,
+ /* GB+82 33 DB 35 */ 0x4705, 0x4706, 0x4707, 0x4708, 0x4709,
+ /* GB+82 33 DC 30 */ 0x470A, 0x470B, 0x470C, 0x470D, 0x470E,
+ /* GB+82 33 DC 35 */ 0x470F, 0x4710, 0x4711, 0x4712, 0x4713,
+ /* GB+82 33 DD 30 */ 0x4714, 0x4715, 0x4716, 0x4717, 0x4718,
+ /* GB+82 33 DD 35 */ 0x4719, 0x471A, 0x471B, 0x471C, 0x471D,
+ /* GB+82 33 DE 30 */ 0x471E, 0x471F, 0x4720, 0x4721, 0x4722,
+ /* GB+82 33 DE 35 */ 0x4724, 0x4725, 0x4726, 0x4727, 0x4728,
+ /* GB+82 33 DF 30 */ 0x472A, 0x472B, 0x472C, 0x472D, 0x472E,
+ /* GB+82 33 DF 35 */ 0x472F, 0x4730, 0x4731, 0x4732, 0x4733,
+ /* GB+82 33 E0 30 */ 0x4734, 0x4735, 0x4736, 0x4737, 0x4738,
+ /* GB+82 33 E0 35 */ 0x4739, 0x473A, 0x473B, 0x473C, 0x473D,
+ /* GB+82 33 E1 30 */ 0x473E, 0x473F, 0x4740, 0x4741, 0x4742,
+ /* GB+82 33 E1 35 */ 0x4743, 0x4744, 0x4745, 0x4746, 0x4747,
+ /* GB+82 33 E2 30 */ 0x4748, 0x4749, 0x474A, 0x474B, 0x474C,
+ /* GB+82 33 E2 35 */ 0x474D, 0x474E, 0x474F, 0x4750, 0x4751,
+ /* GB+82 33 E3 30 */ 0x4752, 0x4753, 0x4754, 0x4755, 0x4756,
+ /* GB+82 33 E3 35 */ 0x4757, 0x4758, 0x4759, 0x475A, 0x475B,
+ /* GB+82 33 E4 30 */ 0x475C, 0x475D, 0x475E, 0x475F, 0x4760,
+ /* GB+82 33 E4 35 */ 0x4761, 0x4762, 0x4763, 0x4764, 0x4765,
+ /* GB+82 33 E5 30 */ 0x4766, 0x4767, 0x4768, 0x4769, 0x476A,
+ /* GB+82 33 E5 35 */ 0x476B, 0x476C, 0x476D, 0x476E, 0x476F,
+ /* GB+82 33 E6 30 */ 0x4770, 0x4771, 0x4772, 0x4773, 0x4774,
+ /* GB+82 33 E6 35 */ 0x4775, 0x4776, 0x4777, 0x4778, 0x4779,
+ /* GB+82 33 E7 30 */ 0x477A, 0x477B, 0x477D, 0x477E, 0x477F,
+ /* GB+82 33 E7 35 */ 0x4780, 0x4781, 0x4782, 0x4783, 0x4784,
+ /* GB+82 33 E8 30 */ 0x4785, 0x4786, 0x4787, 0x4788, 0x4789,
+ /* GB+82 33 E8 35 */ 0x478A, 0x478B, 0x478C,
+ /* Contiguous area: GB+82 34 96 39 .. GB+82 34 A1 30 */
+ /* GB+82 34 96 39 */ 0x4948,
+ /* GB+82 34 97 30 */ 0x4949, 0x494A, 0x494B, 0x494C, 0x494D,
+ /* GB+82 34 97 35 */ 0x494E, 0x494F, 0x4950, 0x4951, 0x4952,
+ /* GB+82 34 98 30 */ 0x4953, 0x4954, 0x4955, 0x4956, 0x4957,
+ /* GB+82 34 98 35 */ 0x4958, 0x4959, 0x495A, 0x495B, 0x495C,
+ /* GB+82 34 99 30 */ 0x495D, 0x495E, 0x495F, 0x4960, 0x4961,
+ /* GB+82 34 99 35 */ 0x4962, 0x4963, 0x4964, 0x4965, 0x4966,
+ /* GB+82 34 9A 30 */ 0x4967, 0x4968, 0x4969, 0x496A, 0x496B,
+ /* GB+82 34 9A 35 */ 0x496C, 0x496D, 0x496E, 0x496F, 0x4970,
+ /* GB+82 34 9B 30 */ 0x4971, 0x4972, 0x4973, 0x4974, 0x4975,
+ /* GB+82 34 9B 35 */ 0x4976, 0x4977, 0x4978, 0x4979, 0x497B,
+ /* GB+82 34 9C 30 */ 0x497C, 0x497E, 0x497F, 0x4980, 0x4981,
+ /* GB+82 34 9C 35 */ 0x4984, 0x4987, 0x4988, 0x4989, 0x498A,
+ /* GB+82 34 9D 30 */ 0x498B, 0x498C, 0x498D, 0x498E, 0x498F,
+ /* GB+82 34 9D 35 */ 0x4990, 0x4991, 0x4992, 0x4993, 0x4994,
+ /* GB+82 34 9E 30 */ 0x4995, 0x4996, 0x4997, 0x4998, 0x4999,
+ /* GB+82 34 9E 35 */ 0x499A, 0x499C, 0x499D, 0x499E, 0x49A0,
+ /* GB+82 34 9F 30 */ 0x49A1, 0x49A2, 0x49A3, 0x49A4, 0x49A5,
+ /* GB+82 34 9F 35 */ 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49AA,
+ /* GB+82 34 A0 30 */ 0x49AB, 0x49AC, 0x49AD, 0x49AE, 0x49AF,
+ /* GB+82 34 A0 35 */ 0x49B0, 0x49B1, 0x49B2, 0x49B3, 0x49B4,
+ /* GB+82 34 A1 30 */ 0x49B5,
+ /* Contiguous area: GB+82 34 E7 34 .. GB+82 35 8F 32 */
+ /* GB+82 34 E7 34 */ 0x4C78,
+ /* GB+82 34 E7 35 */ 0x4C79, 0x4C7A, 0x4C7B, 0x4C7C, 0x4C7D,
+ /* GB+82 34 E8 30 */ 0x4C7E, 0x4C7F, 0x4C80, 0x4C81, 0x4C82,
+ /* GB+82 34 E8 35 */ 0x4C83, 0x4C84, 0x4C85, 0x4C86, 0x4C87,
+ /* GB+82 34 E9 30 */ 0x4C88, 0x4C89, 0x4C8A, 0x4C8B, 0x4C8C,
+ /* GB+82 34 E9 35 */ 0x4C8D, 0x4C8E, 0x4C8F, 0x4C90, 0x4C91,
+ /* GB+82 34 EA 30 */ 0x4C92, 0x4C93, 0x4C94, 0x4C95, 0x4C96,
+ /* GB+82 34 EA 35 */ 0x4C97, 0x4C98, 0x4C99, 0x4C9A, 0x4C9B,
+ /* GB+82 34 EB 30 */ 0x4C9C, 0x4C9D, 0x4C9E, 0x4CA4, 0x4CA5,
+ /* GB+82 34 EB 35 */ 0x4CA6, 0x4CA7, 0x4CA8, 0x4CA9, 0x4CAA,
+ /* GB+82 34 EC 30 */ 0x4CAB, 0x4CAC, 0x4CAD, 0x4CAE, 0x4CAF,
+ /* GB+82 34 EC 35 */ 0x4CB0, 0x4CB1, 0x4CB2, 0x4CB3, 0x4CB4,
+ /* GB+82 34 ED 30 */ 0x4CB5, 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9,
+ /* GB+82 34 ED 35 */ 0x4CBA, 0x4CBB, 0x4CBC, 0x4CBD, 0x4CBE,
+ /* GB+82 34 EE 30 */ 0x4CBF, 0x4CC0, 0x4CC1, 0x4CC2, 0x4CC3,
+ /* GB+82 34 EE 35 */ 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8,
+ /* GB+82 34 EF 30 */ 0x4CC9, 0x4CCA, 0x4CCB, 0x4CCC, 0x4CCD,
+ /* GB+82 34 EF 35 */ 0x4CCE, 0x4CCF, 0x4CD0, 0x4CD1, 0x4CD2,
+ /* GB+82 34 F0 30 */ 0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7,
+ /* GB+82 34 F0 35 */ 0x4CD8, 0x4CD9, 0x4CDA, 0x4CDB, 0x4CDC,
+ /* GB+82 34 F1 30 */ 0x4CDD, 0x4CDE, 0x4CDF, 0x4CE0, 0x4CE1,
+ /* GB+82 34 F1 35 */ 0x4CE2, 0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6,
+ /* GB+82 34 F2 30 */ 0x4CE7, 0x4CE8, 0x4CE9, 0x4CEA, 0x4CEB,
+ /* GB+82 34 F2 35 */ 0x4CEC, 0x4CED, 0x4CEE, 0x4CEF, 0x4CF0,
+ /* GB+82 34 F3 30 */ 0x4CF1, 0x4CF2, 0x4CF3, 0x4CF4, 0x4CF5,
+ /* GB+82 34 F3 35 */ 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4CFA,
+ /* GB+82 34 F4 30 */ 0x4CFB, 0x4CFC, 0x4CFD, 0x4CFE, 0x4CFF,
+ /* GB+82 34 F4 35 */ 0x4D00, 0x4D01, 0x4D02, 0x4D03, 0x4D04,
+ /* GB+82 34 F5 30 */ 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09,
+ /* GB+82 34 F5 35 */ 0x4D0A, 0x4D0B, 0x4D0C, 0x4D0D, 0x4D0E,
+ /* GB+82 34 F6 30 */ 0x4D0F, 0x4D10, 0x4D11, 0x4D12, 0x4D1A,
+ /* GB+82 34 F6 35 */ 0x4D1B, 0x4D1C, 0x4D1D, 0x4D1E, 0x4D1F,
+ /* GB+82 34 F7 30 */ 0x4D20, 0x4D21, 0x4D22, 0x4D23, 0x4D24,
+ /* GB+82 34 F7 35 */ 0x4D25, 0x4D26, 0x4D27, 0x4D28, 0x4D29,
+ /* GB+82 34 F8 30 */ 0x4D2A, 0x4D2B, 0x4D2C, 0x4D2D, 0x4D2E,
+ /* GB+82 34 F8 35 */ 0x4D2F, 0x4D30, 0x4D31, 0x4D32, 0x4D33,
+ /* GB+82 34 F9 30 */ 0x4D34, 0x4D35, 0x4D36, 0x4D37, 0x4D38,
+ /* GB+82 34 F9 35 */ 0x4D39, 0x4D3A, 0x4D3B, 0x4D3C, 0x4D3D,
+ /* GB+82 34 FA 30 */ 0x4D3E, 0x4D3F, 0x4D40, 0x4D41, 0x4D42,
+ /* GB+82 34 FA 35 */ 0x4D43, 0x4D44, 0x4D45, 0x4D46, 0x4D47,
+ /* GB+82 34 FB 30 */ 0x4D48, 0x4D49, 0x4D4A, 0x4D4B, 0x4D4C,
+ /* GB+82 34 FB 35 */ 0x4D4D, 0x4D4E, 0x4D4F, 0x4D50, 0x4D51,
+ /* GB+82 34 FC 30 */ 0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56,
+ /* GB+82 34 FC 35 */ 0x4D57, 0x4D58, 0x4D59, 0x4D5A, 0x4D5B,
+ /* GB+82 34 FD 30 */ 0x4D5C, 0x4D5D, 0x4D5E, 0x4D5F, 0x4D60,
+ /* GB+82 34 FD 35 */ 0x4D61, 0x4D62, 0x4D63, 0x4D64, 0x4D65,
+ /* GB+82 34 FE 30 */ 0x4D66, 0x4D67, 0x4D68, 0x4D69, 0x4D6A,
+ /* GB+82 34 FE 35 */ 0x4D6B, 0x4D6C, 0x4D6D, 0x4D6E, 0x4D6F,
+ /* GB+82 35 81 30 */ 0x4D70, 0x4D71, 0x4D72, 0x4D73, 0x4D74,
+ /* GB+82 35 81 35 */ 0x4D75, 0x4D76, 0x4D77, 0x4D78, 0x4D79,
+ /* GB+82 35 82 30 */ 0x4D7A, 0x4D7B, 0x4D7C, 0x4D7D, 0x4D7E,
+ /* GB+82 35 82 35 */ 0x4D7F, 0x4D80, 0x4D81, 0x4D82, 0x4D83,
+ /* GB+82 35 83 30 */ 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88,
+ /* GB+82 35 83 35 */ 0x4D89, 0x4D8A, 0x4D8B, 0x4D8C, 0x4D8D,
+ /* GB+82 35 84 30 */ 0x4D8E, 0x4D8F, 0x4D90, 0x4D91, 0x4D92,
+ /* GB+82 35 84 35 */ 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97,
+ /* GB+82 35 85 30 */ 0x4D98, 0x4D99, 0x4D9A, 0x4D9B, 0x4D9C,
+ /* GB+82 35 85 35 */ 0x4D9D, 0x4D9E, 0x4D9F, 0x4DA0, 0x4DA1,
+ /* GB+82 35 86 30 */ 0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6,
+ /* GB+82 35 86 35 */ 0x4DA7, 0x4DA8, 0x4DA9, 0x4DAA, 0x4DAB,
+ /* GB+82 35 87 30 */ 0x4DAC, 0x4DAD, 0x4DAF, 0x4DB0, 0x4DB1,
+ /* GB+82 35 87 35 */ 0x4DB2, 0x4DB3, 0x4DB4, 0x4DB5, 0x4DB6,
+ /* GB+82 35 88 30 */ 0x4DB7, 0x4DB8, 0x4DB9, 0x4DBA, 0x4DBB,
+ /* GB+82 35 88 35 */ 0x4DBC, 0x4DBD, 0x4DBE, 0x4DBF, 0x4DC0,
+ /* GB+82 35 89 30 */ 0x4DC1, 0x4DC2, 0x4DC3, 0x4DC4, 0x4DC5,
+ /* GB+82 35 89 35 */ 0x4DC6, 0x4DC7, 0x4DC8, 0x4DC9, 0x4DCA,
+ /* GB+82 35 8A 30 */ 0x4DCB, 0x4DCC, 0x4DCD, 0x4DCE, 0x4DCF,
+ /* GB+82 35 8A 35 */ 0x4DD0, 0x4DD1, 0x4DD2, 0x4DD3, 0x4DD4,
+ /* GB+82 35 8B 30 */ 0x4DD5, 0x4DD6, 0x4DD7, 0x4DD8, 0x4DD9,
+ /* GB+82 35 8B 35 */ 0x4DDA, 0x4DDB, 0x4DDC, 0x4DDD, 0x4DDE,
+ /* GB+82 35 8C 30 */ 0x4DDF, 0x4DE0, 0x4DE1, 0x4DE2, 0x4DE3,
+ /* GB+82 35 8C 35 */ 0x4DE4, 0x4DE5, 0x4DE6, 0x4DE7, 0x4DE8,
+ /* GB+82 35 8D 30 */ 0x4DE9, 0x4DEA, 0x4DEB, 0x4DEC, 0x4DED,
+ /* GB+82 35 8D 35 */ 0x4DEE, 0x4DEF, 0x4DF0, 0x4DF1, 0x4DF2,
+ /* GB+82 35 8E 30 */ 0x4DF3, 0x4DF4, 0x4DF5, 0x4DF6, 0x4DF7,
+ /* GB+82 35 8E 35 */ 0x4DF8, 0x4DF9, 0x4DFA, 0x4DFB, 0x4DFC,
+ /* GB+82 35 8F 30 */ 0x4DFD, 0x4DFE, 0x4DFF,
+ /* Contiguous area: GB+83 36 C7 39 .. GB+83 36 CF 39 */
+ /* GB+83 36 C7 39 */ 0xE76C,
+ /* GB+83 36 C8 30 */ 0xE7C8, 0xE7E7, 0xE7E8, 0xE7E9, 0xE7EA,
+ /* GB+83 36 C8 35 */ 0xE7EB, 0xE7EC, 0xE7ED, 0xE7EE, 0xE7EF,
+ /* GB+83 36 C9 30 */ 0xE7F0, 0xE7F1, 0xE7F2, 0xE7F3, 0xE815,
+ /* GB+83 36 C9 35 */ 0xE819, 0xE81A, 0xE81B, 0xE81C, 0xE81D,
+ /* GB+83 36 CA 30 */ 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823,
+ /* GB+83 36 CA 35 */ 0xE824, 0xE825, 0xE827, 0xE828, 0xE829,
+ /* GB+83 36 CB 30 */ 0xE82A, 0xE82D, 0xE82E, 0xE82F, 0xE830,
+ /* GB+83 36 CB 35 */ 0xE833, 0xE834, 0xE835, 0xE836, 0xE837,
+ /* GB+83 36 CC 30 */ 0xE838, 0xE839, 0xE83A, 0xE83C, 0xE83D,
+ /* GB+83 36 CC 35 */ 0xE83E, 0xE83F, 0xE840, 0xE841, 0xE842,
+ /* GB+83 36 CD 30 */ 0xE844, 0xE845, 0xE846, 0xE847, 0xE848,
+ /* GB+83 36 CD 35 */ 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D,
+ /* GB+83 36 CE 30 */ 0xE84E, 0xE84F, 0xE850, 0xE851, 0xE852,
+ /* GB+83 36 CE 35 */ 0xE853, 0xE856, 0xE857, 0xE858, 0xE859,
+ /* GB+83 36 CF 30 */ 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E,
+ /* GB+83 36 CF 35 */ 0xE85F, 0xE860, 0xE861, 0xE862, 0xE863,
+ /* Contiguous area: GB+84 30 85 35 .. GB+84 30 9C 37 */
+ /* GB+84 30 85 35 */ 0xF92D, 0xF92E, 0xF92F, 0xF930, 0xF931,
+ /* GB+84 30 86 30 */ 0xF932, 0xF933, 0xF934, 0xF935, 0xF936,
+ /* GB+84 30 86 35 */ 0xF937, 0xF938, 0xF939, 0xF93A, 0xF93B,
+ /* GB+84 30 87 30 */ 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940,
+ /* GB+84 30 87 35 */ 0xF941, 0xF942, 0xF943, 0xF944, 0xF945,
+ /* GB+84 30 88 30 */ 0xF946, 0xF947, 0xF948, 0xF949, 0xF94A,
+ /* GB+84 30 88 35 */ 0xF94B, 0xF94C, 0xF94D, 0xF94E, 0xF94F,
+ /* GB+84 30 89 30 */ 0xF950, 0xF951, 0xF952, 0xF953, 0xF954,
+ /* GB+84 30 89 35 */ 0xF955, 0xF956, 0xF957, 0xF958, 0xF959,
+ /* GB+84 30 8A 30 */ 0xF95A, 0xF95B, 0xF95C, 0xF95D, 0xF95E,
+ /* GB+84 30 8A 35 */ 0xF95F, 0xF960, 0xF961, 0xF962, 0xF963,
+ /* GB+84 30 8B 30 */ 0xF964, 0xF965, 0xF966, 0xF967, 0xF968,
+ /* GB+84 30 8B 35 */ 0xF969, 0xF96A, 0xF96B, 0xF96C, 0xF96D,
+ /* GB+84 30 8C 30 */ 0xF96E, 0xF96F, 0xF970, 0xF971, 0xF972,
+ /* GB+84 30 8C 35 */ 0xF973, 0xF974, 0xF975, 0xF976, 0xF977,
+ /* GB+84 30 8D 30 */ 0xF978, 0xF97A, 0xF97B, 0xF97C, 0xF97D,
+ /* GB+84 30 8D 35 */ 0xF97E, 0xF97F, 0xF980, 0xF981, 0xF982,
+ /* GB+84 30 8E 30 */ 0xF983, 0xF984, 0xF985, 0xF986, 0xF987,
+ /* GB+84 30 8E 35 */ 0xF988, 0xF989, 0xF98A, 0xF98B, 0xF98C,
+ /* GB+84 30 8F 30 */ 0xF98D, 0xF98E, 0xF98F, 0xF990, 0xF991,
+ /* GB+84 30 8F 35 */ 0xF992, 0xF993, 0xF994, 0xF996, 0xF997,
+ /* GB+84 30 90 30 */ 0xF998, 0xF999, 0xF99A, 0xF99B, 0xF99C,
+ /* GB+84 30 90 35 */ 0xF99D, 0xF99E, 0xF99F, 0xF9A0, 0xF9A1,
+ /* GB+84 30 91 30 */ 0xF9A2, 0xF9A3, 0xF9A4, 0xF9A5, 0xF9A6,
+ /* GB+84 30 91 35 */ 0xF9A7, 0xF9A8, 0xF9A9, 0xF9AA, 0xF9AB,
+ /* GB+84 30 92 30 */ 0xF9AC, 0xF9AD, 0xF9AE, 0xF9AF, 0xF9B0,
+ /* GB+84 30 92 35 */ 0xF9B1, 0xF9B2, 0xF9B3, 0xF9B4, 0xF9B5,
+ /* GB+84 30 93 30 */ 0xF9B6, 0xF9B7, 0xF9B8, 0xF9B9, 0xF9BA,
+ /* GB+84 30 93 35 */ 0xF9BB, 0xF9BC, 0xF9BD, 0xF9BE, 0xF9BF,
+ /* GB+84 30 94 30 */ 0xF9C0, 0xF9C1, 0xF9C2, 0xF9C3, 0xF9C4,
+ /* GB+84 30 94 35 */ 0xF9C5, 0xF9C6, 0xF9C7, 0xF9C8, 0xF9C9,
+ /* GB+84 30 95 30 */ 0xF9CA, 0xF9CB, 0xF9CC, 0xF9CD, 0xF9CE,
+ /* GB+84 30 95 35 */ 0xF9CF, 0xF9D0, 0xF9D1, 0xF9D2, 0xF9D3,
+ /* GB+84 30 96 30 */ 0xF9D4, 0xF9D5, 0xF9D6, 0xF9D7, 0xF9D8,
+ /* GB+84 30 96 35 */ 0xF9D9, 0xF9DA, 0xF9DB, 0xF9DC, 0xF9DD,
+ /* GB+84 30 97 30 */ 0xF9DE, 0xF9DF, 0xF9E0, 0xF9E1, 0xF9E2,
+ /* GB+84 30 97 35 */ 0xF9E3, 0xF9E4, 0xF9E5, 0xF9E6, 0xF9E8,
+ /* GB+84 30 98 30 */ 0xF9E9, 0xF9EA, 0xF9EB, 0xF9EC, 0xF9ED,
+ /* GB+84 30 98 35 */ 0xF9EE, 0xF9EF, 0xF9F0, 0xF9F2, 0xF9F3,
+ /* GB+84 30 99 30 */ 0xF9F4, 0xF9F5, 0xF9F6, 0xF9F7, 0xF9F8,
+ /* GB+84 30 99 35 */ 0xF9F9, 0xF9FA, 0xF9FB, 0xF9FC, 0xF9FD,
+ /* GB+84 30 9A 30 */ 0xF9FE, 0xF9FF, 0xFA00, 0xFA01, 0xFA02,
+ /* GB+84 30 9A 35 */ 0xFA03, 0xFA04, 0xFA05, 0xFA06, 0xFA07,
+ /* GB+84 30 9B 30 */ 0xFA08, 0xFA09, 0xFA0A, 0xFA0B, 0xFA10,
+ /* GB+84 30 9B 35 */ 0xFA12, 0xFA15, 0xFA16, 0xFA17, 0xFA19,
+ /* GB+84 30 9C 30 */ 0xFA1A, 0xFA1B, 0xFA1C, 0xFA1D, 0xFA1E,
+ /* GB+84 30 9C 35 */ 0xFA22, 0xFA25, 0xFA26,
+ /* Contiguous area: GB+84 31 85 38 .. GB+84 31 A2 33 */
+ /* GB+84 31 85 38 */ 0xFE32, 0xFE45,
+ /* GB+84 31 86 30 */ 0xFE46, 0xFE47, 0xFE48, 0xFE53, 0xFE58,
+ /* GB+84 31 86 35 */ 0xFE67, 0xFE6C, 0xFE6D, 0xFE6E, 0xFE6F,
+ /* GB+84 31 87 30 */ 0xFE70, 0xFE71, 0xFE72, 0xFE73, 0xFE74,
+ /* GB+84 31 87 35 */ 0xFE75, 0xFE76, 0xFE77, 0xFE78, 0xFE79,
+ /* GB+84 31 88 30 */ 0xFE7A, 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E,
+ /* GB+84 31 88 35 */ 0xFE7F, 0xFE80, 0xFE81, 0xFE82, 0xFE83,
+ /* GB+84 31 89 30 */ 0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88,
+ /* GB+84 31 89 35 */ 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, 0xFE8D,
+ /* GB+84 31 8A 30 */ 0xFE8E, 0xFE8F, 0xFE90, 0xFE91, 0xFE92,
+ /* GB+84 31 8A 35 */ 0xFE93, 0xFE94, 0xFE95, 0xFE96, 0xFE97,
+ /* GB+84 31 8B 30 */ 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C,
+ /* GB+84 31 8B 35 */ 0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0, 0xFEA1,
+ /* GB+84 31 8C 30 */ 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6,
+ /* GB+84 31 8C 35 */ 0xFEA7, 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB,
+ /* GB+84 31 8D 30 */ 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, 0xFEB0,
+ /* GB+84 31 8D 35 */ 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5,
+ /* GB+84 31 8E 30 */ 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9, 0xFEBA,
+ /* GB+84 31 8E 35 */ 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF,
+ /* GB+84 31 8F 30 */ 0xFEC0, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4,
+ /* GB+84 31 8F 35 */ 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9,
+ /* GB+84 31 90 30 */ 0xFECA, 0xFECB, 0xFECC, 0xFECD, 0xFECE,
+ /* GB+84 31 90 35 */ 0xFECF, 0xFED0, 0xFED1, 0xFED2, 0xFED3,
+ /* GB+84 31 91 30 */ 0xFED4, 0xFED5, 0xFED6, 0xFED7, 0xFED8,
+ /* GB+84 31 91 35 */ 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD,
+ /* GB+84 31 92 30 */ 0xFEDE, 0xFEDF, 0xFEE0, 0xFEE1, 0xFEE2,
+ /* GB+84 31 92 35 */ 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6, 0xFEE7,
+ /* GB+84 31 93 30 */ 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC,
+ /* GB+84 31 93 35 */ 0xFEED, 0xFEEE, 0xFEEF, 0xFEF0, 0xFEF1,
+ /* GB+84 31 94 30 */ 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6,
+ /* GB+84 31 94 35 */ 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB,
+ /* GB+84 31 95 30 */ 0xFEFC, 0xFEFD, 0xFEFE, 0xFEFF, 0xFF00,
+ /* GB+84 31 95 35 */ 0xFF5F, 0xFF60, 0xFF61, 0xFF62, 0xFF63,
+ /* GB+84 31 96 30 */ 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68,
+ /* GB+84 31 96 35 */ 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D,
+ /* GB+84 31 97 30 */ 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72,
+ /* GB+84 31 97 35 */ 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77,
+ /* GB+84 31 98 30 */ 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C,
+ /* GB+84 31 98 35 */ 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
+ /* GB+84 31 99 30 */ 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86,
+ /* GB+84 31 99 35 */ 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B,
+ /* GB+84 31 9A 30 */ 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90,
+ /* GB+84 31 9A 35 */ 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95,
+ /* GB+84 31 9B 30 */ 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A,
+ /* GB+84 31 9B 35 */ 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F,
+ /* GB+84 31 9C 30 */ 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4,
+ /* GB+84 31 9C 35 */ 0xFFA5, 0xFFA6, 0xFFA7, 0xFFA8, 0xFFA9,
+ /* GB+84 31 9D 30 */ 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE,
+ /* GB+84 31 9D 35 */ 0xFFAF, 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3,
+ /* GB+84 31 9E 30 */ 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, 0xFFB8,
+ /* GB+84 31 9E 35 */ 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD,
+ /* GB+84 31 9F 30 */ 0xFFBE, 0xFFBF, 0xFFC0, 0xFFC1, 0xFFC2,
+ /* GB+84 31 9F 35 */ 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7,
+ /* GB+84 31 A0 30 */ 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC,
+ /* GB+84 31 A0 35 */ 0xFFCD, 0xFFCE, 0xFFCF, 0xFFD0, 0xFFD1,
+ /* GB+84 31 A1 30 */ 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6,
+ /* GB+84 31 A1 35 */ 0xFFD7, 0xFFD8, 0xFFD9, 0xFFDA, 0xFFDB,
+ /* GB+84 31 A2 30 */ 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF,
+};
+
+static inline uint gb4lin_to_gb(uint gb4lin) {
+ uchar a, b, c, d;
+ a = 0x81 + gb4lin / 12600;
+ b = 0x30 + (gb4lin / 1260) % 10;
+ c = 0x81 + (gb4lin / 10) % 126;
+ d = 0x30 + gb4lin % 10;
+ return ((a << 24) | (b << 16) | (c << 8) | d);
+}
+
+static uint qt_Gb18030ToUnicode(const uchar *gbstr, int& len) {
+ /* Returns Unicode. */
+ uint uni;
+ uchar first = *gbstr;
+
+ if (IsLatin(first)) {
+ len = 1;
+ uni = (uint)first;
+ }
+ else if (Is1stByte(first) && len >= 2) {
+ uchar second = gbstr[1];
+
+ if (Is2ndByteIn2Bytes(second)) {
+ len = 2;
+
+ if (IsUDA1(first, second))
+ uni = 0xE000 + (first - 0xAA) * 94 + (second - 0xA1);
+ else if (IsUDA2(first, second))
+ uni = 0xE234 + (first - 0xF8) * 94 + (second - 0xA1);
+ else if (IsUDA3(first, second))
+ uni = 0xE4C6 + (first - 0xA1) * 96 + (second - 0x40)
+ - ((second >= 0x80) ? 1 : 0);
+ else {
+ // Use the mapping table
+ uint i;
+
+ i = (first - 0x81) * 190 + (second - 0x40)
+ - ((second >= 0x80) ? 1 : 0);
+
+ if (InRange(first, 0xA1, 0xA7))
+ i -= (first - 0xA0) * 96;
+ if (first > 0xA7)
+ i -= 672;
+ if (InRange(first, 0xAA, 0xAF))
+ i -= (first - 0xAA) * 94;
+ if (first > 0xAF)
+ i -= 564;
+ if (first >= 0xF8)
+ i -= (first - 0xF8) * 94;
+
+ uni = (uint)gb18030_2byte_to_ucs[i];
+ }
+ }
+ else if (Is2ndByteIn4Bytes(second) && len >= 4) {
+ uchar third = gbstr[2],
+ fourth = gbstr[3];
+
+ if (Is3rdByte(third) && Is4thByte(fourth)) {
+ // Valid 4-byte GB18030, whether defined or not
+ uint gb4lin;
+ indexTbl_t g2u;
+
+ gb4lin = (first - 0x81) * 12600 + (second - 0x30) * 1260
+ + (third - 0x81) * 10 + (fourth - 0x30);
+
+ len = 4;
+ if (gb4lin <= 0x99FB) {
+ /* GB+81308130 - GB+8431A439 */
+ g2u = gb18030_to_ucs_index[gb4lin >> 8];
+
+ if ((quint8)(gb4lin & 0xFF) >= g2u.tblBegin &&
+ (quint8)(gb4lin & 0xFF) <= g2u.tblEnd) {
+
+ uni = (uint)gb18030_4byte_to_ucs[gb4lin - g2u.tblOffset];
+ }
+ else {
+ uni = g2u.algOffset + (gb4lin & 0xFF);
+ }
+ } else if (InRange(gb4lin, 0x2E248, 0x12E247)) {
+ /* GB+90308130 - GB+E3329A35 */
+ uni = gb4lin - 0xE248;
+ } else {
+ /* undefined or reserved area */
+ len = 1;
+ uni = QChar::ReplacementCharacter;
+ }
+ }
+ else {
+ len = 1;
+ uni = QChar::ReplacementCharacter;
+ }
+ }
+ else {
+ len = 1;
+ uni = QChar::ReplacementCharacter;
+ }
+ }
+ else {
+ len = 1;
+ uni = QChar::ReplacementCharacter;
+ }
+ return uni;
+}
+
+
+int qt_UnicodeToGb18030(uint uni, uchar *gbchar) {
+ /* Returns the bytesize of the GB18030 character. */
+ uint gb, gb4lin;
+ indexTbl_t u2g;
+
+ if (IsLatin(uni)) {
+ *gbchar = (uchar)uni;
+ return 1;
+ }
+ else if (uni <= 0xD7FF || InRange(uni, 0xE766, 0xFFFF)) {
+ u2g = ucs_to_gb18030_index[uni >> 8];
+
+ if ((quint8)(uni & 0xFF) >= u2g.tblBegin && (quint8)(uni & 0xFF) <= u2g.tblEnd) {
+ // Use mapping table (2-byte or 4-byte GB18030)
+ uint tblEntry;
+
+ tblEntry = ucs_to_gb18030[uni - u2g.tblOffset];
+
+ if (tblEntry > 0x8000) {
+ // 2-byte GB18030
+ gb = tblEntry;
+ }
+ else {
+ // 4-byte GB18030 stored in a special compact format
+ uchar a, b;
+ a = 0x81;
+ b = 0x30 + (tblEntry >> 11);
+ if (tblEntry >= 0x7000) {
+ a += 3;
+ b -= 14;
+ } else if (tblEntry >= 0x6000) {
+ a += 2;
+ b -= 6;
+ } else if (tblEntry >= 0x3000) {
+ a += 1;
+ b -= 6;
+ } else if (b >= 0x31) {
+ b += 5;
+ }
+ gbchar[0] = a;
+ gbchar[1] = b;
+ gbchar[2] = 0x81 + ((tblEntry >> 4) & 0x7F);
+ gbchar[3] = 0x30 + (tblEntry & 0xF);
+ return 4;
+ }
+ }
+ else {
+ // 4-byte GB18030 calculated algorithmically
+ gb4lin = u2g.algOffset + (uni & 0xFF);
+ // Yikes, my index table could not cover all the bases...
+ if (InRange(uni, 0x49B8, 0x49FF))
+ gb4lin -= 11;
+ gb = gb4lin_to_gb(gb4lin);
+ }
+ }
+ else if (InRange(uni, 0xE000, 0xE765)) {
+ // User-defined areas in GB18030 (2-byte)
+ if (uni <= 0xE233)
+ gb = 0xAAA1 + (((uni - 0xE000) / 94) << 8) + (uni - 0xE000) % 94;
+ else if (uni <= 0xE4C5)
+ gb = 0xF8A1 + (((uni - 0xE234) / 94) << 8) + (uni - 0xE234) % 94;
+ else {
+ gb = 0xA140 + (((uni - 0xE4C6) / 96) << 8) + (uni - 0xE4C6) % 96;
+ // Skip the gap at 0x7F
+ if ((gb & 0xFF) >= 0x7F)
+ gb++;
+ }
+ }
+ else if (InRange(uni, 0x10000, 0x10FFFF)) {
+ // Qt 3.x does not support beyond BMP yet, but what the heck...
+ // (U+10000 = GB+90308130) to (U+10FFFF = GB+E3329A35)
+ gb = gb4lin_to_gb(0x1E248 + uni);
+ }
+ else {
+ // Surrogate area and other undefined/reserved areas (discard)
+ *gbchar = 0;
+ return 0;
+ }
+
+ if (gb <= 0xFFFF) {
+ gbchar[0] = (uchar)((gb >> 8) & 0xFF);
+ gbchar[1] = (uchar)(gb & 0xFF);
+ return 2;
+ } else {
+ gbchar[0] = (uchar)((gb >> 24) & 0xFF);
+ gbchar[1] = (uchar)((gb >> 16) & 0xFF);
+ gbchar[2] = (uchar)((gb >> 8) & 0xFF);
+ gbchar[3] = (uchar)(gb & 0xFF);
+ return 4;
+ }
+}
+
+
+int qt_UnicodeToGbk(uint uni, uchar *gbchar) {
+ /* Returns the bytesize of the GBK character. */
+ /* Intended for improving performance of GB2312 and GBK functions. */
+ uint gb;
+ indexTbl_t u2g;
+
+ if (IsLatin(uni)) {
+ *gbchar = (uchar)uni;
+ return 1;
+ }
+ else if (uni <= 0xD7FF || InRange(uni, 0xE766, 0xFFFF)) {
+ u2g = ucs_to_gb18030_index[uni >> 8];
+
+ if ((quint8)(uni & 0xFF) >= u2g.tblBegin && (quint8)(uni & 0xFF) <= u2g.tblEnd) {
+ // Use mapping table (2-byte GBK or 4-byte GB18030)
+ uint tblEntry;
+
+ tblEntry = ucs_to_gb18030[uni - u2g.tblOffset];
+
+ if (tblEntry > 0x8000) {
+ // GBK
+ gb = tblEntry;
+ }
+ else {
+ // 4-byte GB18030 stored in a special compact format (discard)
+ *gbchar = 0;
+ return 0;
+ }
+ }
+ else {
+ // 4-byte GB18030 calculated algorithmically (discard)
+ *gbchar = 0;
+ return 0;
+ }
+ }
+ else if (InRange(uni, 0xE000, 0xE765)) {
+ // User-defined areas in GB18030 (2-byte)
+ if (uni <= 0xE233)
+ gb = 0xAAA1 + (((uni - 0xE000) / 94) << 8) + (uni - 0xE000) % 94;
+ else if (uni <= 0xE4C5)
+ gb = 0xF8A1 + (((uni - 0xE234) / 94) << 8) + (uni - 0xE234) % 94;
+ else {
+ gb = 0xA140 + (((uni - 0xE4C6) / 96) << 8) + (uni - 0xE4C6) % 96;
+ // Skip the gap at 0x7F
+ if ((gb & 0xFF) >= 0x7F)
+ gb++;
+ }
+ }
+ else {
+ // Surrogate area and other undefined/reserved areas (discard)
+ *gbchar = 0;
+ return 0;
+ }
+
+ gbchar[0] = (uchar)((gb >> 8) & 0xFF);
+ gbchar[1] = (uchar)(gb & 0xFF);
+ return 2;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_TEXTCODEC
diff --git a/src/plugins/codecs/cn/qgb18030codec.h b/src/plugins/codecs/cn/qgb18030codec.h
new file mode 100644
index 0000000000..1a56129822
--- /dev/null
+++ b/src/plugins/codecs/cn/qgb18030codec.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Contributed by James Su <suzhe@gnuchina.org>
+
+#ifndef QGB18030CODEC_H
+#define QGB18030CODEC_H
+
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+class QGb18030Codec : public QTextCodec {
+public:
+ QGb18030Codec();
+
+ static QByteArray _name() { return "GB18030"; }
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum() { return 114; }
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+class QGbkCodec : public QGb18030Codec {
+public:
+ QGbkCodec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases();
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+class QGb2312Codec : public QGb18030Codec {
+public:
+ QGb2312Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+#ifdef Q_WS_X11
+
+class QFontGb2312Codec : public QTextCodec
+{
+public:
+ QFontGb2312Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+
+class QFontGbkCodec : public QTextCodec
+{
+public:
+ QFontGbkCodec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+class QFontGb18030_0Codec : public QTextCodec
+{
+public:
+ QFontGb18030_0Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+#endif // Q_WS_X11
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
+
+#endif // QGB18030CODEC_H
diff --git a/src/plugins/codecs/codecs.pro b/src/plugins/codecs/codecs.pro
new file mode 100644
index 0000000000..8474a88bc7
--- /dev/null
+++ b/src/plugins/codecs/codecs.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+
+SUBDIRS = cn jp tw kr
+
diff --git a/src/plugins/codecs/jp/jp.pro b/src/plugins/codecs/jp/jp.pro
new file mode 100644
index 0000000000..6480e43418
--- /dev/null
+++ b/src/plugins/codecs/jp/jp.pro
@@ -0,0 +1,27 @@
+TARGET = qjpcodecs
+include(../../qpluginbase.pri)
+
+CONFIG += warn_on
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/codecs
+QT = core
+
+HEADERS = qjpunicode.h \
+ qeucjpcodec.h \
+ qjiscodec.h \
+ qsjiscodec.h
+
+SOURCES = qeucjpcodec.cpp \
+ qjiscodec.cpp \
+ qsjiscodec.cpp \
+ qjpunicode.cpp \
+ main.cpp
+
+unix {
+ HEADERS += qfontjpcodec.h
+ SOURCES += qfontjpcodec.cpp
+}
+
+target.path += $$[QT_INSTALL_PLUGINS]/codecs
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001E614
diff --git a/src/plugins/codecs/jp/main.cpp b/src/plugins/codecs/jp/main.cpp
new file mode 100644
index 0000000000..2a7d46eaa5
--- /dev/null
+++ b/src/plugins/codecs/jp/main.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtextcodecplugin.h>
+#include <qtextcodec.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_TEXTCODECPLUGIN
+
+#include "qeucjpcodec.h"
+#include "qjiscodec.h"
+#include "qsjiscodec.h"
+#ifdef Q_WS_X11
+#include "qfontjpcodec.h"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class JPTextCodecs : public QTextCodecPlugin
+{
+public:
+ JPTextCodecs() {}
+
+ QList<QByteArray> names() const;
+ QList<QByteArray> aliases() const;
+ QList<int> mibEnums() const;
+
+ QTextCodec *createForMib(int);
+ QTextCodec *createForName(const QByteArray &);
+};
+
+QList<QByteArray> JPTextCodecs::names() const
+{
+ QList<QByteArray> list;
+ list += QEucJpCodec::_name();
+ list += QJisCodec::_name();
+ list += QSjisCodec::_name();
+#ifdef Q_WS_X11
+ list += QFontJis0201Codec::_name();
+ list += QFontJis0208Codec::_name();
+#endif
+ return list;
+}
+
+QList<QByteArray> JPTextCodecs::aliases() const
+{
+ QList<QByteArray> list;
+ list += QEucJpCodec::_aliases();
+ list += QJisCodec::_aliases();
+ list += QSjisCodec::_aliases();
+#ifdef Q_WS_X11
+ list += QFontJis0201Codec::_aliases();
+ list += QFontJis0208Codec::_aliases();
+#endif
+ return list;
+}
+
+QList<int> JPTextCodecs::mibEnums() const
+{
+ QList<int> list;
+ list += QEucJpCodec::_mibEnum();
+ list += QJisCodec::_mibEnum();
+ list += QSjisCodec::_mibEnum();
+#ifdef Q_WS_X11
+ list += QFontJis0201Codec::_mibEnum();
+ list += QFontJis0208Codec::_mibEnum();
+#endif
+ return list;
+}
+
+QTextCodec *JPTextCodecs::createForMib(int mib)
+{
+ if (mib == QEucJpCodec::_mibEnum())
+ return new QEucJpCodec;
+ if (mib == QJisCodec::_mibEnum())
+ return new QJisCodec;
+ if (mib == QSjisCodec::_mibEnum())
+ return new QSjisCodec;
+#ifdef Q_WS_X11
+ if (mib == QFontJis0208Codec::_mibEnum())
+ return new QFontJis0208Codec;
+ if (mib == QFontJis0201Codec::_mibEnum())
+ return new QFontJis0201Codec;
+#endif
+ return 0;
+}
+
+
+QTextCodec *JPTextCodecs::createForName(const QByteArray &name)
+{
+ if (name == QEucJpCodec::_name() || QEucJpCodec::_aliases().contains(name))
+ return new QEucJpCodec;
+ if (name == QJisCodec::_name() || QJisCodec::_aliases().contains(name))
+ return new QJisCodec;
+ if (name == QSjisCodec::_name() || QSjisCodec::_aliases().contains(name))
+ return new QSjisCodec;
+#ifdef Q_WS_X11
+ if (name == QFontJis0208Codec::_name() || QFontJis0208Codec::_aliases().contains(name))
+ return new QFontJis0208Codec;
+ if (name == QFontJis0201Codec::_name() || QFontJis0201Codec::_aliases().contains(name))
+ return new QFontJis0201Codec;
+#endif
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(JPTextCodecs);
+Q_EXPORT_PLUGIN2(qjpcodecs, JPTextCodecs);
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_TEXTCODECPLUGIN
diff --git a/src/plugins/codecs/jp/qeucjpcodec.cpp b/src/plugins/codecs/jp/qeucjpcodec.cpp
new file mode 100644
index 0000000000..b2959ed661
--- /dev/null
+++ b/src/plugins/codecs/jp/qeucjpcodec.cpp
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission,
+// and the grateful thanks of the Qt team.
+
+/*! \class QEucJpCodec
+ \reentrant
+ \internal
+*/
+
+/*
+ * Copyright (C) 1999 Serika Kurusugawa, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "qeucjpcodec.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+static const uchar Ss2 = 0x8e; // Single Shift 2
+static const uchar Ss3 = 0x8f; // Single Shift 3
+
+#define IsKana(c) (((c) >= 0xa1) && ((c) <= 0xdf))
+#define IsEucChar(c) (((c) >= 0xa1) && ((c) <= 0xfe))
+
+#define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar(QChar::ReplacementCharacter))
+
+/*!
+ Constructs a QEucJpCodec.
+*/
+QEucJpCodec::QEucJpCodec() : conv(QJpUnicodeConv::newConverter(QJpUnicodeConv::Default))
+{
+}
+
+/*!
+ Destroys the codec.
+*/
+QEucJpCodec::~QEucJpCodec()
+{
+ delete (QJpUnicodeConv*)conv;
+ conv = 0;
+}
+
+QByteArray QEucJpCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ int rlen = 3*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i = 0; i < len; i++) {
+ QChar ch = uc[i];
+ uint j;
+ if (ch.unicode() < 0x80) {
+ // ASCII
+ *cursor++ = ch.cell();
+ } else if ((j = conv->unicodeToJisx0201(ch.row(), ch.cell())) != 0) {
+ if (j < 0x80) {
+ // JIS X 0201 Latin ?
+ *cursor++ = j;
+ } else {
+ // JIS X 0201 Kana
+ *cursor++ = Ss2;
+ *cursor++ = j;
+ }
+ } else if ((j = conv->unicodeToJisx0208(ch.row(), ch.cell())) != 0) {
+ // JIS X 0208
+ *cursor++ = (j >> 8) | 0x80;
+ *cursor++ = (j & 0xff) | 0x80;
+ } else if ((j = conv->unicodeToJisx0212(ch.row(), ch.cell())) != 0) {
+ // JIS X 0212
+ *cursor++ = Ss3;
+ *cursor++ = (j >> 8) | 0x80;
+ *cursor++ = (j & 0xff) | 0x80;
+ } else {
+ // Error
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+
+QString QEucJpCodec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[2] = {0, 0};
+ int nbuf = 0;
+ QChar replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80) {
+ // ASCII
+ result += QLatin1Char(ch);
+ } else if (ch == Ss2 || ch == Ss3) {
+ // JIS X 0201 Kana or JIS X 0212
+ buf[0] = ch;
+ nbuf = 1;
+ } else if (IsEucChar(ch)) {
+ // JIS X 0208
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ break;
+ case 1:
+ if (buf[0] == Ss2) {
+ // JIS X 0201 Kana
+ if (IsKana(ch)) {
+ uint u = conv->jisx0201ToUnicode(ch);
+ result += QValidChar(u);
+ } else {
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ } else if (buf[0] == Ss3) {
+ // JIS X 0212-1990
+ if (IsEucChar(ch)) {
+ buf[1] = ch;
+ nbuf = 2;
+ } else {
+ // Error
+ result += replacement;
+ ++invalid;
+ nbuf = 0;
+ }
+ } else {
+ // JIS X 0208-1990
+ if (IsEucChar(ch)) {
+ uint u = conv->jisx0208ToUnicode(buf[0] & 0x7f, ch & 0x7f);
+ result += QValidChar(u);
+ } else {
+ // Error
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ }
+ break;
+ case 2:
+ // JIS X 0212
+ if (IsEucChar(ch)) {
+ uint u = conv->jisx0212ToUnicode(buf[1] & 0x7f, ch & 0x7f);
+ result += QValidChar(u);
+ } else {
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ }
+ }
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+int QEucJpCodec::_mibEnum()
+{
+ return 18;
+}
+
+QByteArray QEucJpCodec::_name()
+{
+ return "EUC-JP";
+}
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/jp/qeucjpcodec.h b/src/plugins/codecs/jp/qeucjpcodec.h
new file mode 100644
index 0000000000..35967998d7
--- /dev/null
+++ b/src/plugins/codecs/jp/qeucjpcodec.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission,
+// and the grateful thanks of the Qt team.
+
+/*
+ * Copyright (C) 1999 Serika Kurusugawa, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef QEUCJPCODEC_H
+#define QEUCJPCODEC_H
+
+#include "qjpunicode.h"
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+class QEucJpCodec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+
+ QEucJpCodec();
+ ~QEucJpCodec();
+
+protected:
+ const QJpUnicodeConv *conv;
+};
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
+
+#endif // QEUCJPCODEC_H
diff --git a/src/plugins/codecs/jp/qfontjpcodec.cpp b/src/plugins/codecs/jp/qfontjpcodec.cpp
new file mode 100644
index 0000000000..f05eda1c22
--- /dev/null
+++ b/src/plugins/codecs/jp/qfontjpcodec.cpp
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qfontjpcodec.h"
+
+#include "qjpunicode.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_WS_X11
+// JIS X 0201
+
+QFontJis0201Codec::QFontJis0201Codec()
+{
+}
+
+QByteArray QFontJis0201Codec::_name()
+{
+ return "jisx0201*-0";
+}
+
+int QFontJis0201Codec::_mibEnum()
+{
+ return 15;
+}
+
+QByteArray QFontJis0201Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ QByteArray rstring;
+ rstring.resize(len);
+ uchar *rdata = (uchar *) rstring.data();
+ const QChar *sdata = uc;
+ int i = 0;
+ for (; i < len; ++i, ++sdata, ++rdata) {
+ if (sdata->unicode() < 0x80) {
+ *rdata = (uchar) sdata->unicode();
+ } else if (sdata->unicode() >= 0xff61 && sdata->unicode() <= 0xff9f) {
+ *rdata = (uchar) (sdata->unicode() - 0xff61 + 0xa1);
+ } else {
+ *rdata = 0;
+ }
+ }
+ return rstring;
+}
+
+QString QFontJis0201Codec::convertToUnicode(const char *, int, ConverterState *) const
+{
+ return QString();
+}
+
+// JIS X 0208
+
+QFontJis0208Codec::QFontJis0208Codec()
+{
+ convJP = QJpUnicodeConv::newConverter(QJpUnicodeConv::Default);
+}
+
+
+QFontJis0208Codec::~QFontJis0208Codec()
+{
+ delete convJP;
+ convJP = 0;
+}
+
+
+QByteArray QFontJis0208Codec::_name()
+{
+ return "jisx0208*-0";
+}
+
+
+int QFontJis0208Codec::_mibEnum()
+{
+ return 63;
+}
+
+
+QString QFontJis0208Codec::convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontJis0208Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+ ch = convJP->unicodeToJisx0208(ch.unicode());
+
+ if (!ch.isNull()) {
+ *rdata++ = ch.row();
+ *rdata++ = ch.cell();
+ } else {
+ *rdata++ = 0;
+ *rdata++ = 0;
+ }
+ }
+ return result;
+}
+
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/jp/qfontjpcodec.h b/src/plugins/codecs/jp/qfontjpcodec.h
new file mode 100644
index 0000000000..0cf89e8e00
--- /dev/null
+++ b/src/plugins/codecs/jp/qfontjpcodec.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFONTJPCODEC_H
+#define QFONTJPCODEC_H
+
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QJpUnicodeConv;
+
+#ifdef Q_WS_X11
+class QFontJis0201Codec : public QTextCodec
+{
+public:
+ QFontJis0201Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QByteArray convertFromUnicode(const QChar *uc, int len, ConverterState *) const;
+ QString convertToUnicode(const char*, int, ConverterState *) const;
+};
+
+class QFontJis0208Codec : public QTextCodec
+{
+public:
+ QFontJis0208Codec();
+ ~QFontJis0208Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *uc, int len, ConverterState *) const;
+private:
+ QJpUnicodeConv *convJP;
+};
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QFONTJPCODEC_H
diff --git a/src/plugins/codecs/jp/qjiscodec.cpp b/src/plugins/codecs/jp/qjiscodec.cpp
new file mode 100644
index 0000000000..b4c6d5fbc5
--- /dev/null
+++ b/src/plugins/codecs/jp/qjiscodec.cpp
@@ -0,0 +1,367 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa,
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission
+// and the grateful thanks of the Qt team.
+
+/*! \class QJisCodec
+ \reentrant
+ \internal
+*/
+
+#include "qjiscodec.h"
+#include "qlist.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+enum {
+ Esc = 0x1b,
+ So = 0x0e, // Shift Out
+ Si = 0x0f, // Shift In
+
+ ReverseSolidus = 0x5c,
+ YenSign = 0x5c,
+ Tilde = 0x7e,
+ Overline = 0x7e
+};
+
+#define IsKana(c) (((c) >= 0xa1) && ((c) <= 0xdf))
+#define IsJisChar(c) (((c) >= 0x21) && ((c) <= 0x7e))
+
+#define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar(QChar::ReplacementCharacter))
+
+enum Iso2022State{ Ascii, MinState = Ascii,
+ JISX0201_Latin, JISX0201_Kana,
+ JISX0208_1978, JISX0208_1983,
+ JISX0212, MaxState = JISX0212,
+ UnknownState };
+
+static const char Esc_CHARS[] = "()*+-./";
+
+static const char Esc_Ascii[] = {Esc, '(', 'B', 0 };
+static const char Esc_JISX0201_Latin[] = {Esc, '(', 'J', 0 };
+static const char Esc_JISX0201_Kana[] = {Esc, '(', 'I', 0 };
+static const char Esc_JISX0208_1978[] = {Esc, '$', '@', 0 };
+static const char Esc_JISX0208_1983[] = {Esc, '$', 'B', 0 };
+static const char Esc_JISX0212[] = {Esc, '$', '(', 'D', 0 };
+static const char * const Esc_SEQ[] = { Esc_Ascii,
+ Esc_JISX0201_Latin,
+ Esc_JISX0201_Kana,
+ Esc_JISX0208_1978,
+ Esc_JISX0208_1983,
+ Esc_JISX0212 };
+
+/*! \internal */
+QJisCodec::QJisCodec() : conv(QJpUnicodeConv::newConverter(QJpUnicodeConv::Default))
+{
+}
+
+
+/*! \internal */
+QJisCodec::~QJisCodec()
+{
+ delete (QJpUnicodeConv*)conv;
+ conv = 0;
+}
+
+QByteArray QJisCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *cs) const
+{
+ char replacement = '?';
+ if (cs) {
+ if (cs->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ QByteArray result;
+ Iso2022State state = Ascii;
+ Iso2022State prev = Ascii;
+ for (int i = 0; i < len; i++) {
+ QChar ch = uc[i];
+ uint j;
+ if (ch.row() == 0x00 && ch.cell() < 0x80) {
+ // Ascii
+ if (state != JISX0201_Latin ||
+ ch.cell() == ReverseSolidus || ch.cell() == Tilde) {
+ state = Ascii;
+ }
+ j = ch.cell();
+ } else if ((j = conv->unicodeToJisx0201(ch.row(), ch.cell())) != 0) {
+ if (j < 0x80) {
+ // JIS X 0201 Latin
+ if (state != Ascii ||
+ ch.cell() == YenSign || ch.cell() == Overline) {
+ state = JISX0201_Latin;
+ }
+ } else {
+ // JIS X 0201 Kana
+ state = JISX0201_Kana;
+ j &= 0x7f;
+ }
+ } else if ((j = conv->unicodeToJisx0208(ch.row(), ch.cell())) != 0) {
+ // JIS X 0208
+ state = JISX0208_1983;
+ } else if ((j = conv->unicodeToJisx0212(ch.row(), ch.cell())) != 0) {
+ // JIS X 0212
+ state = JISX0212;
+ } else {
+ // Invalid
+ state = UnknownState;
+ j = replacement;
+ ++invalid;
+ }
+ if (state != prev) {
+ if (state == UnknownState) {
+ result += Esc_Ascii;
+ } else {
+ result += Esc_SEQ[state - MinState];
+ }
+ prev = state;
+ }
+ if (j < 0x0100) {
+ result += j & 0xff;
+ } else {
+ result += (j >> 8) & 0xff;
+ result += j & 0xff;
+ }
+ }
+ if (prev != Ascii) {
+ result += Esc_Ascii;
+ }
+
+ if (cs) {
+ cs->invalidChars += invalid;
+ }
+ return result;
+}
+
+QString QJisCodec::convertToUnicode(const char* chars, int len, ConverterState *cs) const
+{
+ uchar buf[4] = {0, 0, 0, 0};
+ int nbuf = 0;
+ Iso2022State state = Ascii, prev = Ascii;
+ bool esc = false;
+ QChar replacement = QChar::ReplacementCharacter;
+ if (cs) {
+ if (cs->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = cs->remainingChars;
+ buf[0] = (cs->state_data[0] >> 24) & 0xff;
+ buf[1] = (cs->state_data[0] >> 16) & 0xff;
+ buf[2] = (cs->state_data[0] >> 8) & 0xff;
+ buf[3] = (cs->state_data[0] >> 0) & 0xff;
+ state = (Iso2022State)((cs->state_data[1] >> 0) & 0xff);
+ prev = (Iso2022State)((cs->state_data[1] >> 8) & 0xff);
+ esc = cs->state_data[2];
+ }
+ int invalid = 0;
+
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ if (esc) {
+ // Escape sequence
+ state = UnknownState;
+ switch (nbuf) {
+ case 0:
+ if (ch == '$' || strchr(Esc_CHARS, ch)) {
+ buf[nbuf++] = ch;
+ } else {
+ nbuf = 0;
+ esc = false;
+ }
+ break;
+ case 1:
+ if (buf[0] == '$') {
+ if (strchr(Esc_CHARS, ch)) {
+ buf[nbuf++] = ch;
+ } else {
+ switch (ch) {
+ case '@':
+ state = JISX0208_1978; // Esc $ @
+ break;
+ case 'B':
+ state = JISX0208_1983; // Esc $ B
+ break;
+ }
+ nbuf = 0;
+ esc = false;
+ }
+ } else {
+ if (buf[0] == '(') {
+ switch (ch) {
+ case 'B':
+ state = Ascii; // Esc (B
+ break;
+ case 'I':
+ state = JISX0201_Kana; // Esc (I
+ break;
+ case 'J':
+ state = JISX0201_Latin; // Esc (J
+ break;
+ }
+ }
+ nbuf = 0;
+ esc = false;
+ }
+ break;
+ case 2:
+ if (buf[1] == '(') {
+ switch (ch) {
+ case 'D':
+ state = JISX0212; // Esc $ (D
+ break;
+ }
+ }
+ nbuf = 0;
+ esc = false;
+ break;
+ }
+ } else {
+ if (ch == Esc) {
+ // Escape sequence
+ nbuf = 0;
+ esc = true;
+ } else if (ch == So) {
+ // Shift out
+ prev = state;
+ state = JISX0201_Kana;
+ nbuf = 0;
+ } else if (ch == Si) {
+ // Shift in
+ if (prev == Ascii || prev == JISX0201_Latin) {
+ state = prev;
+ } else {
+ state = Ascii;
+ }
+ nbuf = 0;
+ } else {
+ uint u;
+ switch (nbuf) {
+ case 0:
+ switch (state) {
+ case Ascii:
+ if (ch < 0x80) {
+ result += QLatin1Char(ch);
+ break;
+ }
+ /* fall through */
+ case JISX0201_Latin:
+ u = conv->jisx0201ToUnicode(ch);
+ result += QValidChar(u);
+ break;
+ case JISX0201_Kana:
+ u = conv->jisx0201ToUnicode(ch | 0x80);
+ result += QValidChar(u);
+ break;
+ case JISX0208_1978:
+ case JISX0208_1983:
+ case JISX0212:
+ buf[nbuf++] = ch;
+ break;
+ default:
+ result += QChar::ReplacementCharacter;
+ break;
+ }
+ break;
+ case 1:
+ switch (state) {
+ case JISX0208_1978:
+ case JISX0208_1983:
+ u = conv->jisx0208ToUnicode(buf[0] & 0x7f, ch & 0x7f);
+ result += QValidChar(u);
+ break;
+ case JISX0212:
+ u = conv->jisx0212ToUnicode(buf[0] & 0x7f, ch & 0x7f);
+ result += QValidChar(u);
+ break;
+ default:
+ result += replacement;
+ ++invalid;
+ break;
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+ }
+ }
+
+ if (cs) {
+ cs->remainingChars = nbuf;
+ cs->invalidChars += invalid;
+ cs->state_data[0] = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
+ cs->state_data[1] = (prev << 8) + state;
+ cs->state_data[2] = esc;
+ }
+
+ return result;
+}
+
+
+
+/*! \internal */
+int QJisCodec::_mibEnum()
+{
+ return 39;
+}
+
+/*! \internal */
+QByteArray QJisCodec::_name()
+{
+ return "ISO-2022-JP";
+}
+
+/*!
+ Returns the codec's mime name.
+*/
+QList<QByteArray> QJisCodec::_aliases()
+{
+ QList<QByteArray> list;
+ list << "JIS7"; // Qt 3 compat
+ return list;
+}
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/jp/qjiscodec.h b/src/plugins/codecs/jp/qjiscodec.h
new file mode 100644
index 0000000000..60aa059b83
--- /dev/null
+++ b/src/plugins/codecs/jp/qjiscodec.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission,
+// and the grateful thanks of the Qt team.
+
+/*
+ * Copyright (C) 1999 Serika Kurusugawa, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef QJISCODEC_H
+#define QJISCODEC_H
+
+#include "qjpunicode.h"
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+class QJisCodec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases();
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+
+ QJisCodec();
+ ~QJisCodec();
+
+protected:
+ const QJpUnicodeConv *conv;
+};
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
+
+#endif // QJISCODEC_H
diff --git a/src/plugins/codecs/jp/qjpunicode.cpp b/src/plugins/codecs/jp/qjpunicode.cpp
new file mode 100644
index 0000000000..a15f8d3816
--- /dev/null
+++ b/src/plugins/codecs/jp/qjpunicode.cpp
@@ -0,0 +1,10700 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*! \class QJpUnicodeConv
+ \reentrant
+ \internal
+*/
+
+#include "qjpunicode.h"
+
+#include "qbytearray.h"
+#include <stdlib.h>
+
+QT_BEGIN_NAMESPACE
+
+#define USE_JISX0212
+
+#define Q_STRICT
+
+#define IsLatin(c) (/*((c) >= 0x00) &&*/ ((c) <= 0x7f))
+#define IsKana(c) (((c) >= 0xa1) && ((c) <= 0xdf))
+#define IsJisChar(c) (((c) >= 0x21) && ((c) <= 0x7e))
+#define IsSjisChar1(c) ((((c) >= 0x81) && ((c) <= 0x9f)) || \
+ (((c) >= 0xe0) && ((c) <= 0xfc)))
+#define IsSjisUDC1(c) (((c) >= 0xf0) && ((c) <= 0xfc))
+#define IsSjisChar2(c) (((c) >= 0x40) && ((c) != 0x7f) && ((c) <= 0xfc))
+
+#define IsSjisIBMVDCChar1(c) (((c) >= 0xfa) && ((c) <= 0xfc))
+
+static uint jisx0208ToSjis(uint h, uint l);
+static
+inline uint jisx0208ToSjis(uint jis)
+{
+ return jisx0208ToSjis((jis & 0xff00) >> 8, (jis & 0x00ff));
+}
+
+static uint sjisToJisx0208(uint h, uint l);
+#if 0
+static
+inline uint sjisToJisx0208(uint sjis)
+{
+ return sjisToJisx0208((sjis & 0xff00) >> 8, (sjis & 0x00ff));
+}
+#endif
+
+static uint jisx0201ToUnicode11(uint h, uint l);
+static uint jisx0208ToUnicode11(uint h, uint l);
+static uint jisx0212ToUnicode11(uint h, uint l);
+
+static uint unicode11ToJisx0201(uint h, uint l);
+static uint unicode11ToJisx0208(uint h, uint l);
+static uint unicode11ToJisx0212(uint h, uint l);
+
+/*
+ * Unicode 1.1 conversion.
+ */
+
+/*!
+ \fn QJpUnicodeConv::QJpUnicodeConv (int r)
+ \internal
+*/
+
+
+/*! \internal */
+uint QJpUnicodeConv::asciiToUnicode(uint h, uint l) const
+{
+ if ((h == 0) && (l < 0x80)) {
+ return l;
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::jisx0201ToUnicode(uint h, uint l) const
+{
+ if (h == 0) {
+ if (IsLatin(l)) {
+ return jisx0201LatinToUnicode(h, l);
+ } else if (IsKana(l)) {
+ return jisx0201KanaToUnicode(h, l);
+ }
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::jisx0201LatinToUnicode(uint h, uint l) const
+{
+ if ((h == 0) && IsLatin(l)) {
+ return jisx0201ToUnicode11(h, l);
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::jisx0201KanaToUnicode(uint h, uint l) const
+{
+ if ((h == 0) && IsKana(l)) {
+ return jisx0201ToUnicode11(h, l);
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::jisx0208ToUnicode(uint h, uint l) const
+{
+ if (rule & UDC){
+ if ((0x75 <= h) && (h <= 0x7e) && IsJisChar(l)/*0x21 - 0x7e*/) {
+ // User Defined Char (mapped to Private Use Area)
+ return 0xe000 + (h - 0x75) * 0x5e + (l - 0x21);
+ }
+ }
+ if ((rule & NEC_VDC) == 0) {
+ if ((h == 0x2d) && (IsJisChar(l)/*0x21 - 0x7c*/)) {
+ // NEC Vendor Defined Char
+ return 0x0000;
+ }
+ }
+ return jisx0208ToUnicode11(h, l);
+}
+
+/*! \internal */
+uint QJpUnicodeConv::jisx0212ToUnicode(uint h, uint l) const
+{
+ if (rule & UDC){
+ if ((0x75 <= h) && (h <= 0x7e) && IsJisChar(l)/*0x21 - 0x7e*/) {
+ // User Defined Char (mapped to Private Use Area)
+ return 0xe3ac + (h - 0x75) * 0x5e + (l - 0x21);
+ }
+ }
+ if ((rule & IBM_VDC) == 0){
+ if (((h == 0x73) && (0x73 <= l) && (l <= 0x7e)) ||
+ ((h == 0x74) && (IsJisChar(l)/*0x21 - 0x7e*/))) {
+ // IBM Vendor Defined Char
+ return 0x0000;
+ }
+ }
+ return jisx0212ToUnicode11(h, l);
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToAscii(uint h, uint l) const
+{
+ if ((h == 0) && (l < 0x80)) {
+ return l;
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToJisx0201(uint h, uint l) const
+{
+ uint jis;
+ if ((jis = unicodeToJisx0201Latin(h, l)) != 0) {
+ return jis;
+ } else if ((jis = unicodeToJisx0201Kana(h, l)) != 0) {
+ return jis;
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToJisx0201Latin(uint h, uint l) const
+{
+ uint jis = unicode11ToJisx0201(h, l);
+ if (IsLatin(jis)) {
+ return jis;
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToJisx0201Kana(uint h, uint l) const
+{
+ uint jis = unicode11ToJisx0201(h, l);
+ if (IsKana(jis)) {
+ return jis;
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToJisx0208(uint h, uint l) const
+{
+ if (rule & UDC){
+ uint unicode = (h << 8) | l;
+ if ((0xe000 <= unicode) && (unicode <= 0xe3ab)) {
+ // User Defined Char (mapped to Private Use Area)
+ unicode -= 0xe000;
+ return ((0x75 + unicode / 0x5e) << 8) | (0x21 + unicode % 0x5e);
+ }
+ }
+ uint jis = unicode11ToJisx0208(h, l);
+ if ((rule & NEC_VDC) == 0) {
+ if ((0x2d21 <= jis) && (jis <= 0x2d7c)) {
+ // NEC Vendor Defined Char
+ return 0x0000;
+ }
+ }
+ return jis;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToJisx0212(uint h, uint l) const
+{
+ if (rule & UDC){
+ uint unicode = (h << 8) | l;
+ if ((0xe3ac <= unicode) && (unicode <= 0xe757)) {
+ // User Defined Char (mapped to Private Use Area)
+ unicode -= 0xe3ac;
+ return ((0x75 + unicode / 0x5e) << 8) | (0x21 + unicode % 0x5e);
+ }
+ }
+ uint jis = unicode11ToJisx0212(h, l);
+ if ((rule & IBM_VDC) == 0){
+ if (((0x7373 <= jis) && (jis <= 0x737e)) ||
+ ((0x7421 <= jis) && (jis <= 0x747e))) {
+ // IBM Vendor Defined Char
+ return 0x0000;
+ }
+ }
+ return jis;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::sjisToUnicode(uint h, uint l) const
+{
+ if (h == 0) {
+ return jisx0201ToUnicode(h, l);
+ } else if (IsSjisChar1(h) && IsSjisChar2(l)) {
+ return jisx0208ToUnicode(sjisToJisx0208(h, l));
+ }
+ return 0x0000;
+}
+
+/*! \internal */
+uint QJpUnicodeConv::unicodeToSjis(uint h, uint l) const
+{
+ uint jis;
+ if ((jis = unicodeToJisx0201(h, l)) != 0x0000) {
+ return jis;
+ } else if ((jis = unicodeToJisx0208(h, l)) != 0x0000) {
+ return jisx0208ToSjis(jis);
+ } else if ((jis = unicodeToJisx0212(h, l)) != 0x0000) {
+ return 0x0000;
+ }
+ return 0x0000;
+}
+
+/*
+ * Unicode 1.1 with JISX0201 conversion.
+ */
+
+class QJpUnicodeConv_Unicode_JISX0201 : public QJpUnicodeConv {
+public:
+ QJpUnicodeConv_Unicode_JISX0201(int r) : QJpUnicodeConv(r) {}
+
+// uint AsciiToUnicode(uint h, uint l) const;
+// uint Jisx0201ToUnicode(uint h, uint l) const;
+// uint Jisx0201LatinToUnicode(uint h, uint l) const;
+// uint Jisx0201KanaToUnicode(uint h, uint l) const;
+// uint Jisx0208ToUnicode(uint h, uint l) const;
+// uint Jisx0212ToUnicode(uint h, uint l) const;
+
+// uint UnicodeToAscii(uint h, uint l) const;
+// uint UnicodeToJisx0201(uint h, uint l) const;
+// uint UnicodeToJisx0201Latin(uint h, uint l) const;
+// uint UnicodeToJisx0201Kana(uint h, uint l) const;
+// uint UnicodeToJisx0208(uint h, uint l) const;
+// uint UnicodeToJisx0212(uint h, uint l) const;
+};
+
+/*
+ * Unicode 1.1 with ASCII conversion.
+ */
+
+class QJpUnicodeConv_Unicode_ASCII : public QJpUnicodeConv {
+public:
+ QJpUnicodeConv_Unicode_ASCII(int r) : QJpUnicodeConv(r) {}
+
+// uint AsciiToUnicode(uint h, uint l) const;
+// uint Jisx0201ToUnicode(uint h, uint l) const;
+// uint Jisx0201LatinToUnicode(uint h, uint l) const;
+// uint Jisx0201KanaToUnicode(uint h, uint l) const;
+ uint jisx0208ToUnicode(uint h, uint l) const;
+ uint jisx0212ToUnicode(uint h, uint l) const;
+
+// uint UnicodeToAscii(uint h, uint l) const;
+// uint UnicodeToJisx0201(uint h, uint l) const;
+// uint UnicodeToJisx0201Latin(uint h, uint l) const;
+// uint UnicodeToJisx0201Kana(uint h, uint l) const;
+ uint unicodeToJisx0208(uint h, uint l) const;
+ uint unicodeToJisx0212(uint h, uint l) const;
+};
+
+uint QJpUnicodeConv_Unicode_ASCII::jisx0208ToUnicode(uint h, uint l) const
+{
+ if ((h == 0x21) && (l == 0x40)) {
+ return 0xff3c;
+ }
+ return QJpUnicodeConv::jisx0208ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Unicode_ASCII::jisx0212ToUnicode(uint h, uint l) const
+{
+ if ((h == 0x22) && (l == 0x37)) {
+ return 0xff5e;
+ }
+ return QJpUnicodeConv::jisx0212ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Unicode_ASCII::unicodeToJisx0208(uint h, uint l) const
+{
+ if ((h == 0x00) && (l == 0x5c)) {
+ return 0x0000;
+ }
+ return QJpUnicodeConv::unicodeToJisx0208(h, l);
+}
+
+/*! \internal */
+uint QJpUnicodeConv_Unicode_ASCII::unicodeToJisx0212(uint h, uint l) const
+{
+ if ((h == 0x00) && (l == 0x7e)) {
+ return 0x0000;
+ }
+ if ((h == 0xff) && (l == 0x5e)) {
+ return 0x2237;
+ }
+ return QJpUnicodeConv::unicodeToJisx0208(h, l);
+}
+
+/*
+ * JISX0221 with JISX0201 conversion.
+ */
+
+class QJpUnicodeConv_JISX0221_JISX0201 : public QJpUnicodeConv {
+public:
+ QJpUnicodeConv_JISX0221_JISX0201(int r) : QJpUnicodeConv(r) {}
+
+ uint asciiToUnicode(uint h, uint l) const;
+// uint Jisx0201ToUnicode(uint h, uint l) const;
+// uint Jisx0201LatinToUnicode(uint h, uint l) const;
+// uint Jisx0201KanaToUnicode(uint h, uint l) const;
+ uint jisx0208ToUnicode(uint h, uint l) const;
+// uint Jisx0212ToUnicode(uint h, uint l) const;
+
+ uint unicodeToAscii(uint h, uint l) const;
+// uint UnicodeToJisx0201(uint h, uint l) const;
+// uint UnicodeToJisx0201Latin(uint h, uint l) const;
+// uint UnicodeToJisx0201Kana(uint h, uint l) const;
+ uint unicodeToJisx0208(uint h, uint l) const;
+// uint UnicodeToJisx0212(uint h, uint l) const;
+};
+
+uint QJpUnicodeConv_JISX0221_JISX0201::asciiToUnicode(uint h, uint l) const
+{
+ return jisx0201LatinToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_JISX0201::jisx0208ToUnicode(uint h, uint l) const
+{
+ if ((h == 0x21) && (l == 0x3d)) {
+ return 0x2014;
+ }
+ return QJpUnicodeConv::jisx0208ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_JISX0201::unicodeToAscii(uint h, uint l) const
+{
+ return unicodeToJisx0201Latin(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_JISX0201::unicodeToJisx0208(uint h, uint l) const
+{
+#ifdef Q_STRICT
+ if ((h == 0x20) && (l == 0x15)) {
+ return 0x0000;
+ }
+#endif
+ if ((h == 0x20) && (l == 0x14)) {
+ return 0x213d;
+ }
+ return QJpUnicodeConv::unicodeToJisx0208(h, l);
+}
+
+/*
+ * JISX0221 with ASCII conversion.
+ */
+
+class QJpUnicodeConv_JISX0221_ASCII : public QJpUnicodeConv {
+public:
+ QJpUnicodeConv_JISX0221_ASCII(int r) : QJpUnicodeConv(r) {}
+
+// uint AsciiToUnicode(uint h, uint l) const;
+// uint Jisx0201ToUnicode(uint h, uint l) const;
+ uint jisx0201LatinToUnicode(uint h, uint l) const;
+// uint Jisx0201KanaToUnicode(uint h, uint l) const;
+ uint jisx0208ToUnicode(uint h, uint l) const;
+ uint jisx0212ToUnicode(uint h, uint l) const;
+
+// uint UnicodeToAscii(uint h, uint l) const;
+// uint UnicodeToJisx0201(uint h, uint l) const;
+ uint unicodeToJisx0201Latin(uint h, uint l) const;
+// uint UnicodeToJisx0201Kana(uint h, uint l) const;
+ uint unicodeToJisx0208(uint h, uint l) const;
+ uint unicodeToJisx0212(uint h, uint l) const;
+};
+
+uint QJpUnicodeConv_JISX0221_ASCII::jisx0201LatinToUnicode(uint h, uint l) const
+{
+ return asciiToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_ASCII::jisx0208ToUnicode(uint h, uint l) const
+{
+ if (h == 0x21) {
+ if (l == 0x31) {
+ return 0x203e;
+ } else if (l == 0x3d) {
+ return 0x02014;
+ } else if (l == 0x40) {
+ return 0xff3c;
+ } else if (l == 0x6f) {
+ return 0x00a5;
+ }
+ }
+ return QJpUnicodeConv::jisx0208ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_ASCII::jisx0212ToUnicode(uint h, uint l) const
+{
+ if ((h == 0x22) && (l == 0x37)) {
+ return 0xff5e;
+ }
+ return QJpUnicodeConv::jisx0212ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_ASCII::unicodeToJisx0201Latin(uint h, uint l) const
+{
+ return QJpUnicodeConv::unicodeToAscii(h, l);
+}
+
+uint QJpUnicodeConv_JISX0221_ASCII::unicodeToJisx0208(uint h, uint l) const
+{
+#ifdef Q_STRICT
+ if (((h == 0x00) && (l == 0x5c)) ||
+ ((h == 0x20) && (l == 0x15)) ||
+ ((h == 0xff) && ((l == 0xe3) || (l == 0xe5)))) {
+ return 0x0000;
+ }
+#else
+ if ((h == 0x00) && (l == 0x5c)) {
+ return 0x0000;
+ }
+#endif
+ if ((h == 0x00) && (l == 0xa5)) {
+ return 0x216f;
+ } else if (h == 0x20) {
+ if (l == 0x14) {
+ return 0x213d;
+ } else if (l == 0x3e) {
+ return 0x2131;
+ }
+ }
+ return QJpUnicodeConv::unicodeToJisx0208(h, l);
+}
+
+/*! \internal */
+uint QJpUnicodeConv_JISX0221_ASCII::unicodeToJisx0212(uint h, uint l) const
+{
+ if ((h == 0x00) && (l == 0x7e)) {
+ return 0x0000;
+ }
+ if ((h == 0xff) && (l == 0x5e)) {
+ return 0x2237;
+ }
+ return QJpUnicodeConv::unicodeToJisx0212(h, l);
+}
+
+/*
+ * Sun Microsystems conversion.
+ */
+
+class QJpUnicodeConv_Sun : public QJpUnicodeConv {
+public:
+ QJpUnicodeConv_Sun(int r) : QJpUnicodeConv(r) {}
+
+// uint AsciiToUnicode(uint h, uint l) const;
+// uint Jisx0201ToUnicode(uint h, uint l) const;
+ uint jisx0201LatinToUnicode(uint h, uint l) const;
+// uint Jisx0201KanaToUnicode(uint h, uint l) const;
+ uint jisx0208ToUnicode(uint h, uint l) const;
+ uint jisx0212ToUnicode(uint h, uint l) const;
+
+ uint unicodeToAscii(uint h, uint l) const;
+// uint UnicodeToJisx0201(uint h, uint l) const;
+ uint unicodeToJisx0201Latin(uint h, uint l) const;
+// uint UnicodeToJisx0201Kana(uint h, uint l) const;
+ uint unicodeToJisx0208(uint h, uint l) const;
+ uint unicodeToJisx0212(uint h, uint l) const;
+};
+
+uint QJpUnicodeConv_Sun::jisx0201LatinToUnicode(uint h, uint l) const
+{
+ return asciiToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Sun::jisx0208ToUnicode(uint h, uint l) const
+{
+ if ((h == 0x21) && (l == 0x40)) {
+ return 0xff3c;
+ }
+ return QJpUnicodeConv::jisx0208ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Sun::jisx0212ToUnicode(uint h, uint l) const
+{
+#if 1
+ // Added by Serika Kususugawa to avoid conflict on U+007c.
+ if ((h == 0x22) && (l == 0x37)) {
+ return 0xff5e;
+ }
+#endif
+ return QJpUnicodeConv::jisx0212ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Sun::unicodeToAscii(uint h, uint l) const
+{
+ if ((h == 0x00) && (l == 0xa5)) {
+ return 0x005c;
+ } else if ((h == 0x20) && (l == 0x3e)) {
+ return 0x007e;
+ }
+ return QJpUnicodeConv::unicodeToAscii(h, l);
+}
+
+uint QJpUnicodeConv_Sun::unicodeToJisx0201Latin(uint h, uint l) const
+{
+ return QJpUnicodeConv::unicodeToAscii(h, l);
+}
+
+uint QJpUnicodeConv_Sun::unicodeToJisx0208(uint h, uint l) const
+{
+ if ((h == 0x00) && (l == 0xa5)) {
+ return 0x0000;
+ } else if ((h == 0x20) && (l == 0x3e)) {
+ return 0x0000;
+ }
+ return QJpUnicodeConv::unicodeToJisx0208(h, l);
+}
+
+/*! \internal */
+uint QJpUnicodeConv_Sun::unicodeToJisx0212(uint h, uint l) const
+{
+#if 1
+ // Added by Serika Kususugawa to avoid conflict on U+007c.
+ if ((h == 0x00) && (l == 0x7e)) {
+ return 0x0000;
+ }
+ if ((h == 0xff) && (l == 0x5e)) {
+ return 0x2237;
+ }
+#endif
+ return QJpUnicodeConv::unicodeToJisx0212(h, l);
+}
+
+/*
+ * Microsoft conversion.
+ */
+
+class QJpUnicodeConv_Microsoft : public QJpUnicodeConv {
+public:
+ QJpUnicodeConv_Microsoft(int r) : QJpUnicodeConv(r) {}
+
+// uint AsciiToUnicode(uint h, uint l) const;
+// uint Jisx0201ToUnicode(uint h, uint l) const;
+ uint jisx0201LatinToUnicode(uint h, uint l) const;
+// uint Jisx0201KanaToUnicode(uint h, uint l) const;
+ uint jisx0208ToUnicode(uint h, uint l) const;
+ uint jisx0212ToUnicode(uint h, uint l) const;
+
+// uint UnicodeToAscii(uint h, uint l) const;
+// uint UnicodeToJisx0201(uint h, uint l) const;
+ uint unicodeToJisx0201Latin(uint h, uint l) const;
+// uint UnicodeToJisx0201Kana(uint h, uint l) const;
+ uint unicodeToJisx0208(uint h, uint l) const;
+ uint unicodeToJisx0212(uint h, uint l) const;
+};
+
+uint QJpUnicodeConv_Microsoft::jisx0201LatinToUnicode(uint h, uint l) const
+{
+ return asciiToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Microsoft::jisx0208ToUnicode(uint h, uint l) const
+{
+ if (h == 0x21) {
+ if (l == 0x40) {
+ return 0xff3c;
+ } else if (l == 0x41) {
+ return 0xff5e;
+ } else if (l == 0x42) {
+ return 0x2225;
+ } else if (l == 0x5d) {
+ return 0xff0d;
+ } else if (l == 0x71) {
+ return 0xffe0;
+ } else if (l == 0x72) {
+ return 0xffe1;
+ }
+ } else if (h == 0x22) {
+ if (l == 0x4c) {
+ return 0xffe2;
+ }
+ }
+ return QJpUnicodeConv::jisx0208ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Microsoft::jisx0212ToUnicode(uint h, uint l) const
+{
+ if (h == 0x22) {
+ if (l == 0x37) {
+ return 0xff5e;
+ } else if (l == 0x43) {
+ return 0xffe4;
+ }
+ }
+ return QJpUnicodeConv::jisx0212ToUnicode(h, l);
+}
+
+uint QJpUnicodeConv_Microsoft::unicodeToJisx0201Latin(uint h, uint l) const
+{
+ return QJpUnicodeConv::unicodeToAscii(h, l);
+}
+
+uint QJpUnicodeConv_Microsoft::unicodeToJisx0208(uint h, uint l) const
+{
+#ifdef Q_STRICT
+ if (((h == 0x00) && ((l == 0x5c) || (l == 0xa2) || (l == 0xa3) || (l == 0xac))) ||
+ ((h == 0x20) && (l == 0x16)) ||
+ ((h == 0x22) && (l == 0x12)) ||
+ ((h == 0x30) && (l == 0x1c))) {
+ return 0x0000;
+ }
+#else
+ if ((h == 0x00) && (l == 0x5c)) {
+ return 0x0000;
+ }
+#endif
+ if ((h == 0x22) && (l == 0x25)) {
+ return 0x2142;
+ } else if (h == 0xff) {
+ if (l == 0x0d) {
+ return 0x215d;
+ } else if (l == 0xe0) {
+ return 0x2171;
+ } else if (l == 0xe1) {
+ return 0x2172;
+ } else if (l == 0xe2) {
+ return 0x224c;
+ }
+ }
+ return QJpUnicodeConv::unicodeToJisx0208(h, l);
+}
+
+uint QJpUnicodeConv_Microsoft::unicodeToJisx0212(uint h, uint l) const
+{
+#ifdef Q_STRICT
+ if ((h == 0x00) && ((l == 0x7e) || (l == 0xa6))) {
+ return 0x0000;
+ }
+#else
+ if ((h == 0x00) && (l == 0x7e)) {
+ return 0x0000;
+ }
+#endif
+ if (h == 0xff) {
+ if (l == 0x5e) {
+ return 0x2237;
+ } else if (l == 0xe4) {
+ return 0x2243;
+ }
+ }
+ return QJpUnicodeConv::unicodeToJisx0212(h, l);
+}
+
+
+/*! \internal */
+QJpUnicodeConv *QJpUnicodeConv::newConverter(int rule)
+{
+ QByteArray env = qgetenv("UNICODEMAP_JP");
+ if (rule == Default && !env.isNull()) {
+ for (int i = 0; i < (int)env.length();) {
+ int j = env.indexOf(',', i);
+ QByteArray s;
+ if (j < 0) {
+ s = env.mid(i).trimmed();
+ i = env.length();
+ } else {
+ s = env.mid(i, j - i).trimmed();
+ i = j + 1;
+ }
+ if (qstricmp(s, "unicode-0.9") == 0) {
+ rule = (rule & 0xff00) | Unicode;
+ } else if (qstricmp(s, "unicode-0201") == 0) {
+ rule = (rule & 0xff00) | Unicode_JISX0201;
+ } else if (qstricmp(s, "unicode-ascii") == 0) {
+ rule = (rule & 0xff00) | Unicode_ASCII;
+ } else if (qstricmp(s, "jisx0221-1995") == 0) {
+ rule = (rule & 0xff00) | JISX0221_JISX0201;
+ } else if ((qstricmp(s, "open-0201") == 0) ||
+ (qstricmp(s, "open-19970715-0201") == 0)) {
+ rule = (rule & 0xff00) | JISX0221_JISX0201;
+ } else if ((qstricmp(s, "open-ascii") == 0) ||
+ (qstricmp(s, "open-19970715-ascii") == 0)) {
+ rule = (rule & 0xff00) | JISX0221_ASCII;
+ } else if ((qstricmp(s, "open-ms") == 0) ||
+ (qstricmp(s, "open-19970715-ms") == 0)) {
+ rule = (rule & 0xff00) | Microsoft_CP932;
+ } else if (qstricmp(s, "cp932") == 0) {
+ rule = (rule & 0xff00) | Microsoft_CP932;
+ } else if (qstricmp(s, "jdk1.1.7") == 0) {
+ rule = (rule & 0xff00) | Sun_JDK117;
+ } else if (qstricmp(s, "nec-vdc") == 0) {
+ rule = rule | NEC_VDC;
+ } else if (qstricmp(s, "ibm-vdc") == 0) {
+ rule = rule | IBM_VDC;
+ } else if (qstricmp(s, "udc") == 0) {
+ rule = rule | UDC;
+ }
+ }
+ }
+
+ switch (rule & 0x00ff) {
+ case Unicode_JISX0201:
+ return new QJpUnicodeConv_Unicode_JISX0201(rule);
+ case Unicode_ASCII:
+ return new QJpUnicodeConv_Unicode_ASCII(rule);
+ case JISX0221_JISX0201:
+ return new QJpUnicodeConv_JISX0221_JISX0201(rule);
+ case JISX0221_ASCII:
+ return new QJpUnicodeConv_JISX0221_ASCII(rule);
+ case Sun_JDK117:
+ return new QJpUnicodeConv_Sun(rule);
+ case Microsoft_CP932:
+ return new QJpUnicodeConv_Microsoft(rule);
+ default:
+ return new QJpUnicodeConv_Unicode_ASCII(rule);
+ }
+}
+
+/*
+ * JISX0208 <-> ShiftJIS conversion.
+ */
+
+static uint jisx0208ToSjis(uint h, uint l)
+{
+ if ((0x0021 <= h) && (h <= 0x007e) && (0x0021 <= l) && (l <= 0x007e)) {
+ return ((((h - 1) >> 1) + ((h <= 0x5e) ? 0x71 : 0xb1)) << 8) |
+ (l + ((h & 1) ? ((l < 0x60) ? 0x1f : 0x20) : 0x7e));
+ }
+ return 0x0000;
+}
+
+static uint sjisToJisx0208(uint h, uint l)
+{
+ if ((((0x81 <= h) && (h <= 0x9f)) || ((0xe0 <= h) && (h <= 0xef))) &&
+ ((0x40 <= l) && (l != 0x7f) && (l <= 0xfc))) {
+ if (l < 0x9f) {
+ return (((h << 1) - ((h <= 0x9f) ? 0x00e1 : 0x0161)) << 8) |
+ (l - ((l <= 0x7f) ? 0x1f : 0x20));
+ } else {
+ return (((h << 1) - ((h <= 0x9f) ? 0x00e1 : 0x0161) + 1) << 8) |
+ (l - 0x7e);
+ }
+ }
+ return 0x0000;
+}
+
+/*
+ * This function is derived from Unicode 1.1,
+ * JIS X 0201 (1976) to Unicode mapping table version 0.9 .
+ */
+
+#define JISX0201_YEN_SIGN 0x005c
+#define UNICODE_YEN_SIGN 0x00a5
+
+#define JISX0201_OVERLINE 0x007e
+#define UNICODE_OVERLINE 0x203e
+
+static uint jisx0201ToUnicode11(uint h, uint l)
+{
+ if (h == 0x00) {
+ if (l < 0x80) {
+ if (l == JISX0201_YEN_SIGN) {
+ return UNICODE_YEN_SIGN;
+ } else if (l == JISX0201_OVERLINE) {
+ return UNICODE_OVERLINE;
+ } else {
+ return l;
+ }
+ } else if ((0xa1 <= l) && (l <= 0x00df)) {
+ return 0xff61 + l - 0x00a1;
+ }
+ }
+ return 0x0000;
+}
+
+/*
+ * This function is derived from Unicode 1.1,
+ * JIS X 0201 (1976) to Unicode mapping table version 0.9 .
+ */
+
+static uint unicode11ToJisx0201(uint h, uint l)
+{
+ if ((h == 0x00) && (l < 0x80)) {
+ if ((l == JISX0201_YEN_SIGN) ||
+ (l == JISX0201_OVERLINE)) {
+ return 0x0000;
+ }
+ return l;
+ } else if ((h == 0x00) && (l == 0xa5)) {
+ return JISX0201_YEN_SIGN;
+ } else if ((h == 0x20) && (l == 0x3e)) {
+ return JISX0201_OVERLINE;
+ } else if ((h == 0xff) && (0x61 <= l) && (l <= 0x9f)) {
+ return 0x00a1 + l - 0x61;
+ }
+ return 0x0000;
+}
+
+/*
+ * This data is derived from Unicode 1.1,
+ * JIS X 0208 (1990) to Unicode mapping table version 0.9 .
+ * (In addition NEC Vender Defined Char included)
+ */
+static unsigned short const jisx0208_to_unicode[] = {
+ /* 0x2121 - 0x217e */
+ 0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a,
+ 0xff1b, 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8,
+ 0xff3e, 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003,
+ 0x4edd, 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f,
+ 0x005c, 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019,
+ 0x201c, 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d,
+ 0xff5b, 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d,
+ 0x300e, 0x300f, 0x3010, 0x3011, 0xff0b, 0xff0d, 0x00b1, 0x00d7,
+ 0x00f7, 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e,
+ 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5,
+ 0xff04, 0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20,
+ 0x00a7, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7,
+ /* 0x2221 - 0x227e */
+ 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc,
+ 0x203b, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283,
+ 0x222a, 0x2229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200,
+ 0x2203, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2220, 0x22a5, 0x2312, 0x2202,
+ 0x2207, 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d,
+ 0x2235, 0x222b, 0x222c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020,
+ 0x2021, 0x00b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x25ef,
+ /* 0x2321 - 0x237e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17,
+ 0xff18, 0xff19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27,
+ 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f,
+ 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37,
+ 0xff38, 0xff39, 0xff3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47,
+ 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f,
+ 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57,
+ 0xff58, 0xff59, 0xff5a, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2421 - 0x247e */
+ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f,
+ 0x3090, 0x3091, 0x3092, 0x3093, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2521 - 0x257e */
+ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7,
+ 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af,
+ 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7,
+ 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf,
+ 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7,
+ 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf,
+ 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7,
+ 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df,
+ 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7,
+ 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef,
+ 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2621 - 0x267e */
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
+ 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8,
+ 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+ 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+ 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8,
+ 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2721 - 0x277e */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d,
+ 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d,
+ 0x042e, 0x042f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451,
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d,
+ 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d,
+ 0x044e, 0x044f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2821 - 0x287e */
+ 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c,
+ 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513,
+ 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520,
+ 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538,
+ 0x2542, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2921 - 0x297e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2a21 - 0x2a7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2b21 - 0x2b7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2c21 - 0x2c7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2d21 - 0x2d7e */
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466,
+ 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e,
+ 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162,
+ 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0000,
+ 0x3349, 0x3314, 0x3322, 0x334d, 0x3318, 0x3327, 0x3303, 0x3336,
+ 0x3351, 0x3357, 0x330d, 0x3326, 0x3323, 0x332b, 0x334a, 0x333b,
+ 0x339c, 0x339d, 0x339e, 0x338e, 0x338f, 0x33c4, 0x33a1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x337b,
+ 0x301d, 0x301f, 0x2116, 0x33cd, 0x2121, 0x32a4, 0x32a5, 0x32a6,
+ 0x32a7, 0x32a8, 0x3231, 0x3232, 0x3239, 0x337e, 0x337d, 0x337c,
+ 0x2252, 0x2261, 0x222b, 0x222e, 0x2211, 0x221a, 0x22a5, 0x2220,
+ 0x221f, 0x22bf, 0x2235, 0x2229, 0x222a, 0x0000, 0x0000,
+ /* 0x2e21 - 0x2e7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2f21 - 0x2f7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x3021 - 0x307e */
+ 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328,
+ 0x59f6, 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25,
+ 0x65ed, 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271,
+ 0x5b9b, 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216,
+ 0x7c9f, 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7,
+ 0x978d, 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2,
+ 0x5937, 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613,
+ 0x6905, 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3,
+ 0x840e, 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5,
+ 0x57df, 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038,
+ 0x7a32, 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1,
+ 0x56e0, 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d,
+ /* 0x3121 - 0x317e */
+ 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87,
+ 0x70cf, 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11,
+ 0x7893, 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b,
+ 0x59e5, 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b,
+ 0x96f2, 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620,
+ 0x66f3, 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e,
+ 0x9834, 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca,
+ 0x99c5, 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186,
+ 0x5712, 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4,
+ 0x6cbf, 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01,
+ 0x8276, 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc,
+ 0x6c5a, 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc,
+ /* 0x3221 - 0x327e */
+ 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1,
+ 0x8956, 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104,
+ 0x5c4b, 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378,
+ 0x6069, 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55,
+ 0x4f3d, 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1,
+ 0x5bb6, 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3,
+ 0x706b, 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db,
+ 0x8304, 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8,
+ 0x8fe6, 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259,
+ 0x753b, 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5,
+ 0x4ecb, 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb,
+ 0x602a, 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539,
+ /* 0x3321 - 0x337e */
+ 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686,
+ 0x7d75, 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be,
+ 0x5916, 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d,
+ 0x84cb, 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9,
+ 0x57a3, 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3,
+ 0x62e1, 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b,
+ 0x899a, 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769,
+ 0x5b66, 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b,
+ 0x6a7f, 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec,
+ 0x6d3b, 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39,
+ 0x53f6, 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2,
+ 0x91dc, 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431,
+ /* 0x3421 - 0x347e */
+ 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0,
+ 0x5bd2, 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6,
+ 0x5b8c, 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163,
+ 0x61be, 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53,
+ 0x6c57, 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b,
+ 0x7aff, 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266,
+ 0x839e, 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591,
+ 0x95a2, 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8,
+ 0x5dcc, 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1,
+ 0x9811, 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668,
+ 0x57fa, 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc,
+ 0x63ee, 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4,
+ /* 0x3521 - 0x357e */
+ 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948,
+ 0x5b63, 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77,
+ 0x8ecc, 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100,
+ 0x5993, 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591,
+ 0x7947, 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0,
+ 0x5409, 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775,
+ 0x9ecd, 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45,
+ 0x4ec7, 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551,
+ 0x673d, 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae,
+ 0x7b08, 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45,
+ 0x5de8, 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd,
+ 0x92f8, 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac,
+ /* 0x3621 - 0x367e */
+ 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6,
+ 0x5354, 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37,
+ 0x5f4a, 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1,
+ 0x72c2, 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7,
+ 0x93e1, 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681,
+ 0x696d, 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5,
+ 0x52e4, 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434,
+ 0x7981, 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f,
+ 0x8b39, 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5,
+ 0x533a, 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8,
+ 0x99d2, 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3,
+ 0x9047, 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48,
+ /* 0x3721 - 0x377e */
+ 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a,
+ 0x9688, 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b,
+ 0x85ab, 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941,
+ 0x4fc2, 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b,
+ 0x5951, 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2,
+ 0x643a, 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb,
+ 0x7d4c, 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08,
+ 0x8a63, 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8,
+ 0x5287, 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20,
+ 0x6c7a, 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6,
+ 0x5039, 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f,
+ 0x5805, 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372,
+ /* 0x3821 - 0x387e */
+ 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f,
+ 0x7d79, 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063,
+ 0x9375, 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3,
+ 0x5e7b, 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237,
+ 0x8a00, 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa,
+ 0x59d1, 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af,
+ 0x6e56, 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e,
+ 0x8a87, 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92,
+ 0x4f0d, 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f,
+ 0x68a7, 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190,
+ 0x4e5e, 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149,
+ 0x516c, 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411,
+ /* 0x3921 - 0x397e */
+ 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d,
+ 0x5b8f, 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7,
+ 0x5f18, 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602,
+ 0x6643, 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a,
+ 0x6d69, 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0,
+ 0x7d05, 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1,
+ 0x8154, 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2,
+ 0x8cfc, 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d,
+ 0x9805, 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408,
+ 0x58d5, 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b,
+ 0x544a, 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09,
+ 0x8170, 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc,
+ /* 0x3a21 - 0x3a7e */
+ 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a,
+ 0x6068, 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5,
+ 0x7d3a, 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f,
+ 0x5de6, 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396,
+ 0x88df, 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700,
+ 0x54c9, 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d,
+ 0x6b73, 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d,
+ 0x658e, 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728,
+ 0x6750, 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a,
+ 0x80b4, 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a,
+ 0x548b, 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22,
+ 0x932f, 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237,
+ /* 0x3b21 - 0x3b7e */
+ 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9,
+ 0x96d1, 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652,
+ 0x4e09, 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f,
+ 0x71e6, 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb,
+ 0x9178, 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a,
+ 0x4f7f, 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb,
+ 0x59c9, 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d,
+ 0x6307, 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62,
+ 0x6b7b, 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b,
+ 0x80a2, 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c,
+ 0x8aee, 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c,
+ 0x4f8d, 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642,
+ /* 0x3c21 - 0x3c7e */
+ 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1,
+ 0x793a, 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f,
+ 0x5f0f, 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03,
+ 0x53f1, 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06,
+ 0x75be, 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d,
+ 0x5c61, 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66,
+ 0x659c, 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e,
+ 0x86c7, 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235,
+ 0x914c, 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b,
+ 0x53d6, 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e,
+ 0x816b, 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff,
+ 0x6388, 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468,
+ /* 0x3d21 - 0x3d7e */
+ 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32,
+ 0x79c0, 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490,
+ 0x8846, 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c,
+ 0x96c6, 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e,
+ 0x67d4, 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4,
+ 0x5919, 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f,
+ 0x51fa, 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3,
+ 0x821c, 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3,
+ 0x6e96, 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806,
+ 0x51e6, 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2,
+ 0x7f72, 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973,
+ 0x5e8f, 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f,
+ /* 0x3e21 - 0x3e7e */
+ 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531,
+ 0x5617, 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11,
+ 0x5c1a, 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db,
+ 0x638c, 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2,
+ 0x6a1f, 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126,
+ 0x7167, 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0,
+ 0x7b11, 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d,
+ 0x88f3, 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4,
+ 0x9266, 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e,
+ 0x4e57, 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38,
+ 0x60c5, 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63,
+ 0x84b8, 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe,
+ /* 0x3f21 - 0x3f7e */
+ 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272,
+ 0x89e6, 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5,
+ 0x5507, 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0,
+ 0x664b, 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f,
+ 0x795e, 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a,
+ 0x8eab, 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203,
+ 0x5875, 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5,
+ 0x9663, 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8,
+ 0x9017, 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761,
+ 0x7c8b, 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f,
+ 0x745e, 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db,
+ 0x636e, 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe,
+ /* 0x4021 - 0x407e */
+ 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f,
+ 0x51c4, 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f,
+ 0x6574, 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272,
+ 0x751f, 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0,
+ 0x8a93, 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e,
+ 0x8106, 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790,
+ 0x77f3, 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1,
+ 0x8e5f, 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d,
+ 0x7a83, 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9,
+ 0x5148, 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226,
+ 0x6247, 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3,
+ 0x6f5c, 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda,
+ /* 0x4121 - 0x417e */
+ 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e,
+ 0x8cce, 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae,
+ 0x524d, 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3,
+ 0x7cce, 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a,
+ 0x72d9, 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20,
+ 0x7d44, 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275,
+ 0x53cc, 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b,
+ 0x5c64, 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb,
+ 0x64cd, 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5,
+ 0x4e89, 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061,
+ 0x8349, 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001,
+ 0x906d, 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e,
+ /* 0x4221 - 0x427e */
+ 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247,
+ 0x5373, 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7,
+ 0x5c5e, 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3,
+ 0x5b58, 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a,
+ 0x592a, 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253,
+ 0x67c1, 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806,
+ 0x5bfe, 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234,
+ 0x66ff, 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8,
+ 0x9000, 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927,
+ 0x7b2c, 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544,
+ 0x5b85, 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17,
+ 0x9438, 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea,
+ /* 0x4321 - 0x437e */
+ 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd,
+ 0x7aea, 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0,
+ 0x4e39, 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e,
+ 0x6de1, 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d,
+ 0x80c6, 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad,
+ 0x6696, 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730,
+ 0x5f1b, 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4,
+ 0x8718, 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4,
+ 0x9010, 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2,
+ 0x5b99, 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877,
+ 0x8a3b, 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7,
+ 0x8457, 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5,
+ /* 0x4421 - 0x447e */
+ 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4,
+ 0x61f2, 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a,
+ 0x8074, 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3,
+ 0x929a, 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715,
+ 0x6c88, 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e,
+ 0x69cc, 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4,
+ 0x69fb, 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354,
+ 0x693f, 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a,
+ 0x91e3, 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e,
+ 0x5448, 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f,
+ 0x608c, 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e,
+ 0x7a0b, 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013,
+ /* 0x4521 - 0x457e */
+ 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2,
+ 0x6575, 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2,
+ 0x5fb9, 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929,
+ 0x5c55, 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b,
+ 0x70b9, 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410,
+ 0x5835, 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21,
+ 0x767b, 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a,
+ 0x52aa, 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac,
+ 0x51cd, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6,
+ 0x5d8b, 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df,
+ 0x76d7, 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8,
+ 0x7977, 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230,
+ /* 0x4621 - 0x467e */
+ 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f,
+ 0x9003, 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd,
+ 0x52d5, 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3,
+ 0x7ae5, 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f,
+ 0x5f97, 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2,
+ 0x72ec, 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a,
+ 0x9cf6, 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7,
+ 0x6566, 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d,
+ 0x5948, 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058,
+ 0x637a, 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960,
+ 0x8edf, 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302,
+ 0x8cd1, 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165,
+ /* 0x4721 - 0x477e */
+ 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d,
+ 0x6fe1, 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74,
+ 0x5ff5, 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b,
+ 0x57dc, 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf,
+ 0x8fb2, 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777,
+ 0x6ce2, 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac,
+ 0x4ff3, 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c,
+ 0x80cc, 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885,
+ 0x6973, 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019,
+ 0x877f, 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd,
+ 0x67cf, 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb,
+ 0x66dd, 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6,
+ /* 0x4821 - 0x487e */
+ 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8,
+ 0x5e61, 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a,
+ 0x9197, 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9,
+ 0x567a, 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd,
+ 0x53db, 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248,
+ 0x72af, 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4,
+ 0x91c6, 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4,
+ 0x78d0, 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87,
+ 0x5f7c, 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc,
+ 0x75b2, 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab,
+ 0x8ab9, 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099,
+ 0x5c3e, 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e,
+ /* 0x4921 - 0x497e */
+ 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66,
+ 0x819d, 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c,
+ 0x6867, 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a,
+ 0x6a19, 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79,
+ 0x5edf, 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c,
+ 0x86ed, 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7,
+ 0x8cd3, 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b,
+ 0x5a66, 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577,
+ 0x65a7, 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299,
+ 0x8b5c, 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab,
+ 0x6b66, 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8,
+ 0x847a, 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d,
+ /* 0x4a21 - 0x4a7e */
+ 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255,
+ 0x6cb8, 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3,
+ 0x61a4, 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0,
+ 0x6587, 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73,
+ 0x5f0a, 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801,
+ 0x50fb, 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86,
+ 0x504f, 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d,
+ 0x4fbf, 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea,
+ 0x5703, 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df,
+ 0x5893, 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023,
+ 0x4ff8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef,
+ 0x5d29, 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b,
+ /* 0x4b21 - 0x4b7e */
+ 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3,
+ 0x840c, 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2,
+ 0x98fd, 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a,
+ 0x59a8, 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0,
+ 0x68d2, 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf,
+ 0x927e, 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8,
+ 0x64b2, 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1,
+ 0x6b86, 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6,
+ 0x6469, 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a,
+ 0x6bce, 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe,
+ 0x9c52, 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab,
+ 0x8fc4, 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80,
+ /* 0x4c21 - 0x4c7e */
+ 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95,
+ 0x5cac, 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999,
+ 0x7c8d, 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db,
+ 0x9727, 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d,
+ 0x660e, 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5,
+ 0x514d, 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21,
+ 0x8302, 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017,
+ 0x8499, 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905,
+ 0x5c24, 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580,
+ 0x5301, 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25,
+ 0x77e2, 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756,
+ 0x67f3, 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652,
+ /* 0x4d21 - 0x4d7e */
+ 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb,
+ 0x5ba5, 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67,
+ 0x6d8c, 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a,
+ 0x9091, 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e,
+ 0x8a89, 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8,
+ 0x63da, 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6,
+ 0x7194, 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981,
+ 0x8b21, 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32,
+ 0x6c83, 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8,
+ 0x6765, 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a,
+ 0x4e71, 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7,
+ 0x5229, 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483,
+ /* 0x4e21 - 0x4e7e */
+ 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b,
+ 0x7387, 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c,
+ 0x7409, 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6,
+ 0x616e, 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc,
+ 0x5bee, 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c,
+ 0x7ce7, 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b,
+ 0x7dd1, 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8,
+ 0x8f2a, 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f,
+ 0x985e, 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c,
+ 0x73b2, 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97,
+ 0x9f62, 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9,
+ 0x604b, 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f,
+ /* 0x4f21 - 0x4f7e */
+ 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089,
+ 0x8cc2, 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717,
+ 0x697c, 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001,
+ 0x807e, 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332,
+ 0x8ad6, 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1,
+ 0x67a0, 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568,
+ 0x6900, 0x6e7e, 0x7897, 0x8155, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x5021 - 0x507e */
+ 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c,
+ 0x4e3f, 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a,
+ 0x8212, 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0,
+ 0x4eb3, 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7,
+ 0x4ede, 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b,
+ 0x4f5d, 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b,
+ 0x4f69, 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4,
+ 0x4fdf, 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4,
+ 0x4fe5, 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c,
+ 0x4ff6, 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006,
+ 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056,
+ 0x506c, 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2,
+ /* 0x5121 - 0x517e */
+ 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5,
+ 0x50ed, 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102,
+ 0x5116, 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c,
+ 0x513b, 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8,
+ 0x5169, 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189,
+ 0x518f, 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2,
+ 0x51a9, 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5,
+ 0x51bd, 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed,
+ 0x51f0, 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227,
+ 0x522a, 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c,
+ 0x525e, 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d,
+ 0x528d, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8,
+ /* 0x5221 - 0x527e */
+ 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd,
+ 0x52d7, 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5,
+ 0x52f8, 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f,
+ 0x5315, 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340,
+ 0x5346, 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369,
+ 0x536e, 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6,
+ 0x53a5, 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df,
+ 0x66fc, 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d,
+ 0x5440, 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d,
+ 0x544e, 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470,
+ 0x5492, 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7,
+ 0x54a2, 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8,
+ /* 0x5321 - 0x537e */
+ 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5,
+ 0x54e6, 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2,
+ 0x5539, 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556,
+ 0x5557, 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a,
+ 0x559f, 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583,
+ 0x55a9, 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc,
+ 0x55e4, 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b,
+ 0x55f9, 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638,
+ 0x566b, 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a,
+ 0x56a0, 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2,
+ 0x56bc, 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3,
+ 0x56d7, 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709,
+ /* 0x5421 - 0x547e */
+ 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7,
+ 0x571c, 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f,
+ 0x5769, 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0,
+ 0x57b3, 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2,
+ 0x57d3, 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872,
+ 0x5821, 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879,
+ 0x5885, 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8,
+ 0x58ae, 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5,
+ 0x58dc, 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc,
+ 0x58fd, 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c,
+ 0x592d, 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e,
+ 0x595a, 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969,
+ /* 0x5521 - 0x557e */
+ 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2,
+ 0x59c6, 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f,
+ 0x5a11, 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35,
+ 0x5a36, 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2,
+ 0x5abd, 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb,
+ 0x5b0c, 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e,
+ 0x5b43, 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65,
+ 0x5b69, 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80,
+ 0x5b83, 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0,
+ 0x5be4, 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6,
+ 0x5bf3, 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22,
+ 0x5c28, 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53,
+ /* 0x5621 - 0x567e */
+ 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76,
+ 0x5c79, 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6,
+ 0x5cbc, 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd,
+ 0x5cfa, 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c,
+ 0x5d1f, 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18,
+ 0x5d4c, 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87,
+ 0x5d84, 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90,
+ 0x5db7, 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb,
+ 0x5deb, 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b,
+ 0x5e36, 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54,
+ 0x5e5f, 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc,
+ 0x5e7f, 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf,
+ /* 0x5721 - 0x577e */
+ 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1,
+ 0x5ee8, 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8,
+ 0x5efe, 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16,
+ 0x5f29, 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f,
+ 0x5f51, 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77,
+ 0x5f83, 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e,
+ 0x5f99, 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb,
+ 0x5fe4, 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060,
+ 0x6019, 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b,
+ 0x6026, 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f,
+ 0x604a, 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c,
+ 0x606b, 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a,
+ /* 0x5821 - 0x587e */
+ 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b,
+ 0x60e1, 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6,
+ 0x60b5, 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100,
+ 0x60f4, 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e,
+ 0x6147, 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c,
+ 0x6134, 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159,
+ 0x615a, 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d,
+ 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a,
+ 0x618a, 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7,
+ 0x61c8, 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6,
+ 0x61e3, 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe,
+ 0x6200, 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b,
+ /* 0x5921 - 0x597e */
+ 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233,
+ 0x6241, 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c,
+ 0x6282, 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283,
+ 0x6294, 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4,
+ 0x62c8, 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9,
+ 0x630c, 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5,
+ 0x6350, 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380,
+ 0x63ab, 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b,
+ 0x6369, 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2,
+ 0x63f6, 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436,
+ 0x651d, 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e,
+ 0x652a, 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc,
+ /* 0x5a21 - 0x5a7e */
+ 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2,
+ 0x64f1, 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef,
+ 0x652c, 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518,
+ 0x651c, 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537,
+ 0x6536, 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558,
+ 0x655e, 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b,
+ 0x659f, 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc,
+ 0x65d2, 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a,
+ 0x6603, 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f,
+ 0x6644, 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668,
+ 0x665f, 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684,
+ 0x6698, 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc,
+ /* 0x5b21 - 0x5b7e */
+ 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6,
+ 0x66e9, 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726,
+ 0x6727, 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737,
+ 0x6746, 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770,
+ 0x67a9, 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785,
+ 0x67b7, 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4,
+ 0x67de, 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7,
+ 0x6a9c, 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e,
+ 0x68b3, 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f,
+ 0x68ad, 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874,
+ 0x68b5, 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca,
+ 0x6908, 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd,
+ /* 0x5c21 - 0x5c7e */
+ 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7,
+ 0x68e3, 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a,
+ 0x6923, 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b,
+ 0x6954, 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930,
+ 0x6961, 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0,
+ 0x69bf, 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd,
+ 0x69bb, 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995,
+ 0x69b4, 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9,
+ 0x69f2, 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb,
+ 0x6a0a, 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72,
+ 0x6a36, 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38,
+ 0x6a22, 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3,
+ /* 0x5d21 - 0x5d7e */
+ 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3,
+ 0x6aac, 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb,
+ 0x6b05, 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38,
+ 0x6b37, 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50,
+ 0x6b59, 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f,
+ 0x6b80, 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4,
+ 0x6baa, 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc,
+ 0x6bc6, 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef,
+ 0x9ebe, 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e,
+ 0x6c55, 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b,
+ 0x6c7e, 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3,
+ 0x6cbd, 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe,
+ /* 0x5e21 - 0x5e7e */
+ 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d,
+ 0x6d36, 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12,
+ 0x6d0c, 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e,
+ 0x6d95, 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7,
+ 0x6de6, 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2,
+ 0x6dc5, 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d,
+ 0x6e6e, 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b,
+ 0x6e2b, 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24,
+ 0x6eff, 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7,
+ 0x6ed3, 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f,
+ 0x6ea5, 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8,
+ 0x6efe, 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc,
+ /* 0x5f21 - 0x5f7e */
+ 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81,
+ 0x6f80, 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58,
+ 0x6f8e, 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4,
+ 0x6fb9, 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8,
+ 0x6ff1, 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001,
+ 0x700f, 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f,
+ 0x7030, 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af,
+ 0x70f1, 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd,
+ 0x70d9, 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188,
+ 0x7166, 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184,
+ 0x7195, 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9,
+ 0x71d4, 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc,
+ /* 0x6021 - 0x607e */
+ 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d,
+ 0x722c, 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246,
+ 0x724b, 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292,
+ 0x7296, 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4,
+ 0x72ce, 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f,
+ 0x7317, 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329,
+ 0x7325, 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368,
+ 0x7370, 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce,
+ 0x73bb, 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f,
+ 0x7425, 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459,
+ 0x7441, 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e,
+ 0x748b, 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1,
+ /* 0x6121 - 0x617e */
+ 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0,
+ 0x74f1, 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e,
+ 0x750d, 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544,
+ 0x754d, 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564,
+ 0x7567, 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574,
+ 0x758a, 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3,
+ 0x75c2, 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1,
+ 0x75cd, 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff,
+ 0x75fc, 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d,
+ 0x7609, 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634,
+ 0x7630, 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661,
+ 0x7662, 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670,
+ /* 0x6221 - 0x627e */
+ 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688,
+ 0x768b, 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4,
+ 0x76b8, 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de,
+ 0x76e1, 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707,
+ 0x7704, 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737,
+ 0x7738, 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f,
+ 0x777e, 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0,
+ 0x77b6, 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd,
+ 0x77d7, 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812,
+ 0x7926, 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c,
+ 0x789a, 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6,
+ 0x78cb, 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec,
+ /* 0x6321 - 0x637e */
+ 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911,
+ 0x7919, 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a,
+ 0x7955, 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b,
+ 0x79aa, 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7,
+ 0x79ec, 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20,
+ 0x7a1f, 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57,
+ 0x7a49, 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d,
+ 0x7a88, 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0,
+ 0x7ab6, 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd,
+ 0x7acf, 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2,
+ 0x7ae6, 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33,
+ 0x7b18, 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50,
+ /* 0x6421 - 0x647e */
+ 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75,
+ 0x7b65, 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d,
+ 0x7b98, 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f,
+ 0x7b5d, 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6,
+ 0x7bdd, 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00,
+ 0x7c07, 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23,
+ 0x7c27, 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43,
+ 0x7c54, 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56,
+ 0x7c65, 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2,
+ 0x7cab, 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9,
+ 0x7cbd, 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2,
+ 0x9b3b, 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06,
+ /* 0x6521 - 0x657e */
+ 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e,
+ 0x7d32, 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72,
+ 0x7d68, 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f,
+ 0x7d7d, 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd,
+ 0x7dab, 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0,
+ 0x7dd8, 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05,
+ 0x7e0a, 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b,
+ 0x7e22, 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37,
+ 0x7e32, 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a,
+ 0x7e79, 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d,
+ 0x8fae, 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93,
+ 0x7e94, 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a,
+ /* 0x6621 - 0x667e */
+ 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55,
+ 0x7f54, 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78,
+ 0x7f82, 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e,
+ 0x7f9d, 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6,
+ 0x7fb8, 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1,
+ 0x7fe6, 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b,
+ 0x8012, 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b,
+ 0x804a, 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068,
+ 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084,
+ 0x8086, 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac,
+ 0x80db, 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109,
+ 0x80ef, 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b,
+ /* 0x6721 - 0x677e */
+ 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171,
+ 0x816e, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180,
+ 0x8182, 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9,
+ 0x81b0, 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba,
+ 0x81c9, 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df,
+ 0x81e0, 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205,
+ 0x8207, 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238,
+ 0x8233, 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264,
+ 0x8262, 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278,
+ 0x827e, 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1,
+ 0x82e3, 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303,
+ 0x82fb, 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9,
+ /* 0x6821 - 0x687e */
+ 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339,
+ 0x8350, 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a,
+ 0x83aa, 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a,
+ 0x837c, 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4,
+ 0x8413, 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1,
+ 0x83f7, 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd,
+ 0x8438, 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484,
+ 0x8477, 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c,
+ 0x846f, 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f,
+ 0x84d9, 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6,
+ 0x84a1, 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f,
+ 0x8515, 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548,
+ /* 0x6921 - 0x697e */
+ 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588,
+ 0x8591, 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587,
+ 0x859c, 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9,
+ 0x85d0, 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613,
+ 0x860b, 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f,
+ 0x864d, 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3,
+ 0x86a9, 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6,
+ 0x86b0, 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec,
+ 0x86df, 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703,
+ 0x86fb, 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f,
+ 0x8737, 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778,
+ 0x874c, 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759,
+ /* 0x6a21 - 0x6a7e */
+ 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782,
+ 0x87af, 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4,
+ 0x87b3, 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f,
+ 0x880d, 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816,
+ 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b,
+ 0x8844, 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881,
+ 0x887e, 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897,
+ 0x8892, 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf,
+ 0x88b1, 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9,
+ 0x8902, 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a,
+ 0x8913, 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944,
+ 0x893b, 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e,
+ /* 0x6b21 - 0x6b7e */
+ 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977,
+ 0x897e, 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9,
+ 0x89a6, 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0,
+ 0x89da, 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16,
+ 0x8a10, 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b,
+ 0x8a52, 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85,
+ 0x8a82, 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a,
+ 0x8aa3, 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7,
+ 0x8ae4, 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb,
+ 0x8b0c, 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20,
+ 0x8b33, 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c,
+ 0x8b4f, 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b,
+ /* 0x6c21 - 0x6c7e */
+ 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c,
+ 0x8b8e, 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41,
+ 0x8c3f, 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c,
+ 0x8c78, 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e,
+ 0x8c94, 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2,
+ 0x8cb3, 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda,
+ 0x8cfd, 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f,
+ 0x8d0d, 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67,
+ 0x8d6d, 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba,
+ 0x8dcf, 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb,
+ 0x8ddf, 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e,
+ 0x8e10, 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a,
+ /* 0x6d21 - 0x6d7e */
+ 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64,
+ 0x8e60, 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81,
+ 0x8e87, 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94,
+ 0x8e99, 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe,
+ 0x8ec5, 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb,
+ 0x8efe, 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c,
+ 0x8f1f, 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45,
+ 0x8f42, 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c,
+ 0x8f62, 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf,
+ 0x8fb7, 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4,
+ 0x9005, 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e,
+ 0x9016, 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8,
+ /* 0x6e21 - 0x6e7e */
+ 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e,
+ 0x9056, 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072,
+ 0x9082, 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8,
+ 0x90af, 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102,
+ 0x9112, 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163,
+ 0x9165, 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2,
+ 0x91ab, 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1,
+ 0x91c9, 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc,
+ 0x91f5, 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211,
+ 0x925e, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f,
+ 0x924b, 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf,
+ 0x92b9, 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e,
+ /* 0x6f21 - 0x6f7e */
+ 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b,
+ 0x935c, 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad,
+ 0x9394, 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3,
+ 0x93dd, 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403,
+ 0x9407, 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441,
+ 0x9452, 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229,
+ 0x9470, 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481,
+ 0x947f, 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599,
+ 0x95a0, 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be,
+ 0x95ca, 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6,
+ 0x95dc, 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f,
+ 0x9642, 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e,
+ /* 0x7021 - 0x707e */
+ 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698,
+ 0x9695, 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4,
+ 0x96b6, 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d,
+ 0x96dc, 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713,
+ 0x970e, 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730,
+ 0x9739, 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749,
+ 0x975c, 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771,
+ 0x9779, 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f,
+ 0x9790, 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3,
+ 0x97c6, 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf,
+ 0x97f6, 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837,
+ 0x983d, 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870,
+ /* 0x7121 - 0x717e */
+ 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6,
+ 0x98c4, 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912,
+ 0x9914, 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c,
+ 0x992e, 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b,
+ 0x9951, 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad,
+ 0x99ae, 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed,
+ 0x99ee, 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05,
+ 0x99e2, 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43,
+ 0x9a3e, 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65,
+ 0x9a64, 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0,
+ 0x9acf, 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3,
+ 0x9ae6, 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7,
+ /* 0x7221 - 0x727e */
+ 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23,
+ 0x9b25, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32,
+ 0x9b44, 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74,
+ 0x9b93, 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8,
+ 0x9bb4, 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2,
+ 0x9be3, 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1,
+ 0x9bf0, 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08,
+ 0x9c12, 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21,
+ 0x9c30, 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67,
+ 0x9c76, 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb,
+ 0x9d03, 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44,
+ 0x9d15, 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48,
+ /* 0x7321 - 0x737e */
+ 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72,
+ 0x9d89, 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9,
+ 0x9db2, 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf,
+ 0x9dc2, 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd,
+ 0x9e1a, 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88,
+ 0x9e8b, 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9,
+ 0x9eb8, 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0,
+ 0x9ed4, 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef,
+ 0x9ef4, 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07,
+ 0x9f08, 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52,
+ 0x9f54, 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c,
+ 0x9f6a, 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0,
+ /* 0x7421 - 0x747e */
+ 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7521 - 0x757e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7621 - 0x767e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7721 - 0x777e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7821 - 0x787e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7921 - 0x797e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7a21 - 0x7a7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7b21 - 0x7b7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7c21 - 0x7c7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7d21 - 0x7d7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7e21 - 0x7e7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static uint jisx0208ToUnicode11(uint h, uint l)
+{
+ if ((0x0021 <= h) && (h <= 0x007e) && (0x0021 <= l) && (l <= 0x007e)) {
+ return jisx0208_to_unicode[(h - 0x0021) * 0x005e + (l - 0x0021)];
+ }
+ return 0x0000;
+}
+
+/*
+ * This data is derived from Unicode 1.1,
+ * JIS X 0208 (1990) to Unicode mapping table version 0.9 .
+ * (In addition NEC Vender Defined Char included)
+ */
+static unsigned short const unicode_to_jisx0208_00[] = {
+ /* 0x0000 - 0x00ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2140, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2171, 0x2172, 0x0000, 0x0000, 0x0000, 0x2178,
+ 0x212f, 0x0000, 0x0000, 0x0000, 0x224c, 0x0000, 0x0000, 0x0000,
+ 0x216b, 0x215e, 0x0000, 0x0000, 0x212d, 0x0000, 0x2279, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x215f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2160,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_03[] = {
+ /* 0x0300 - 0x03ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627,
+ 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f,
+ 0x2630, 0x2631, 0x0000, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636,
+ 0x2637, 0x2638, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647,
+ 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f,
+ 0x2650, 0x2651, 0x0000, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656,
+ 0x2657, 0x2658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_04[] = {
+ /* 0x0400 - 0x04ff */
+ 0x0000, 0x2727, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729,
+ 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731,
+ 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739,
+ 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741,
+ 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759,
+ 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761,
+ 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769,
+ 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771,
+ 0x0000, 0x2757, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_20[] = {
+ /* 0x2000 - 0x20ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x213e, 0x0000, 0x0000, 0x0000, 0x0000, 0x213d, 0x2142, 0x0000,
+ 0x2146, 0x2147, 0x0000, 0x0000, 0x2148, 0x2149, 0x0000, 0x0000,
+ 0x2277, 0x2278, 0x0000, 0x0000, 0x0000, 0x2145, 0x2144, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2273, 0x0000, 0x216c, 0x216d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2228, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_21[] = {
+ /* 0x2100 - 0x21ff */
+ 0x0000, 0x0000, 0x0000, 0x216e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d62, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2272, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2d35, 0x2d36, 0x2d37, 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c,
+ 0x2d3d, 0x2d3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x222b, 0x222c, 0x222a, 0x222d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x224d, 0x0000, 0x224e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_22[] = {
+ /* 0x2200 - 0x22ff */
+ 0x224f, 0x0000, 0x225f, 0x2250, 0x0000, 0x0000, 0x0000, 0x2260,
+ 0x223a, 0x0000, 0x0000, 0x223b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2d74, 0x215d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2265, 0x0000, 0x0000, 0x2267, 0x2167, 0x2d78,
+ 0x225c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x224a,
+ 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x0000, 0x2d73, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2168, 0x2268, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2266, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2162, 0x2261, 0x0000, 0x0000, 0x0000, 0x0000, 0x2165, 0x2166,
+ 0x0000, 0x0000, 0x2263, 0x2264, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x223e, 0x223f, 0x0000, 0x0000, 0x223c, 0x223d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x225d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d79,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_23[] = {
+ /* 0x2300 - 0x23ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x225e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_24[] = {
+ /* 0x2400 - 0x24ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x2d26, 0x2d27, 0x2d28,
+ 0x2d29, 0x2d2a, 0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e, 0x2d2f, 0x2d30,
+ 0x2d31, 0x2d32, 0x2d33, 0x2d34, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_25[] = {
+ /* 0x2500 - 0x25ff */
+ 0x2821, 0x282c, 0x2822, 0x282d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2823, 0x0000, 0x0000, 0x282e,
+ 0x2824, 0x0000, 0x0000, 0x282f, 0x2826, 0x0000, 0x0000, 0x2831,
+ 0x2825, 0x0000, 0x0000, 0x2830, 0x2827, 0x283c, 0x0000, 0x0000,
+ 0x2837, 0x0000, 0x0000, 0x2832, 0x2829, 0x283e, 0x0000, 0x0000,
+ 0x2839, 0x0000, 0x0000, 0x2834, 0x2828, 0x0000, 0x0000, 0x2838,
+ 0x283d, 0x0000, 0x0000, 0x2833, 0x282a, 0x0000, 0x0000, 0x283a,
+ 0x283f, 0x0000, 0x0000, 0x2835, 0x282b, 0x0000, 0x0000, 0x283b,
+ 0x0000, 0x0000, 0x2840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2836, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2223, 0x2222, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2225, 0x2224, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2227, 0x2226, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2221, 0x217e,
+ 0x0000, 0x0000, 0x0000, 0x217b, 0x0000, 0x0000, 0x217d, 0x217c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x227e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_26[] = {
+ /* 0x2600 - 0x26ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217a, 0x2179, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x216a, 0x0000, 0x2169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2276, 0x0000, 0x0000, 0x2275, 0x0000, 0x2274,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_30[] = {
+ /* 0x3000 - 0x30ff */
+ 0x2121, 0x2122, 0x2123, 0x2137, 0x0000, 0x2139, 0x213a, 0x213b,
+ 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159,
+ 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2141, 0x2d60, 0x0000, 0x2d61,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427,
+ 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f,
+ 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437,
+ 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f,
+ 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447,
+ 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f,
+ 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457,
+ 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f,
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
+ 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f,
+ 0x2470, 0x2471, 0x2472, 0x2473, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x212b, 0x212c, 0x2135, 0x2136, 0x0000,
+ 0x0000, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527,
+ 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f,
+ 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537,
+ 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f,
+ 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547,
+ 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f,
+ 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557,
+ 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f,
+ 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567,
+ 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f,
+ 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2126, 0x213c, 0x2133, 0x2134, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_32[] = {
+ /* 0x3200 - 0x32ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2d6a, 0x2d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2d6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2d65, 0x2d66, 0x2d67, 0x2d68,
+ 0x2d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_33[] = {
+ /* 0x3300 - 0x33ff */
+ 0x0000, 0x0000, 0x0000, 0x2d46, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d4a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2d41, 0x0000, 0x0000, 0x0000,
+ 0x2d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2d42, 0x2d4c, 0x0000, 0x0000, 0x2d4b, 0x2d45,
+ 0x0000, 0x0000, 0x0000, 0x2d4d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d47, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2d4f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2d40, 0x2d4e, 0x0000, 0x0000, 0x2d43, 0x0000, 0x0000,
+ 0x0000, 0x2d48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d49,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2d5f, 0x2d6f, 0x2d6e, 0x2d6d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d53, 0x2d54,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2d50, 0x2d51, 0x2d52, 0x0000,
+ 0x0000, 0x2d56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2d55, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d63, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_4e[] = {
+ /* 0x4e00 - 0x4eff */
+ 0x306c, 0x437a, 0x0000, 0x3c37, 0x0000, 0x0000, 0x0000, 0x4b7c,
+ 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x0000, 0x4954, 0x4d3f, 0x0000,
+ 0x5022, 0x312f, 0x0000, 0x0000, 0x336e, 0x5023, 0x4024, 0x5242,
+ 0x3556, 0x4a3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e67, 0x0000,
+ 0x0000, 0x4e3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a42, 0x0000,
+ 0x0000, 0x0000, 0x5024, 0x0000, 0x0000, 0x4366, 0x0000, 0x0000,
+ 0x0000, 0x5025, 0x367a, 0x0000, 0x0000, 0x0000, 0x5026, 0x0000,
+ 0x345d, 0x4330, 0x0000, 0x3c67, 0x5027, 0x0000, 0x0000, 0x5028,
+ 0x0000, 0x0000, 0x5029, 0x4735, 0x0000, 0x3557, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4737, 0x0000, 0x4663, 0x3843, 0x4b33,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6949, 0x502a, 0x3e68,
+ 0x502b, 0x3235, 0x0000, 0x0000, 0x0000, 0x3665, 0x3870, 0x4c69,
+ 0x0000, 0x0000, 0x5626, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4d70, 0x0000, 0x467d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3425, 0x0000,
+ 0x3535, 0x0000, 0x502c, 0x0000, 0x0000, 0x502d, 0x4e3b, 0x0000,
+ 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x0000, 0x5032, 0x0000,
+ 0x0000, 0x313e, 0x385f, 0x0000, 0x385e, 0x3066, 0x0000, 0x0000,
+ 0x4f4b, 0x4f4a, 0x0000, 0x3a33, 0x3021, 0x0000, 0x5033, 0x5034,
+ 0x5035, 0x4b34, 0x5036, 0x0000, 0x3872, 0x3067, 0x4b72, 0x0000,
+ 0x357c, 0x0000, 0x0000, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x0000,
+ 0x5037, 0x0000, 0x0000, 0x5038, 0x0000, 0x0000, 0x5039, 0x0000,
+ 0x0000, 0x0000, 0x3f4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3d3a, 0x3f4e, 0x503e, 0x0000, 0x503c, 0x0000, 0x503d, 0x3558,
+ 0x0000, 0x0000, 0x3a23, 0x3270, 0x0000, 0x503b, 0x503a, 0x4a29,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3b46, 0x3b45, 0x423e, 0x503f,
+ 0x4955, 0x4067, 0x0000, 0x0000, 0x0000, 0x2138, 0x5040, 0x5042,
+ 0x0000, 0x0000, 0x0000, 0x4265, 0x4e61, 0x304a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5041, 0x323e, 0x0000,
+ 0x3644, 0x0000, 0x4367, 0x0000, 0x0000, 0x0000, 0x376f, 0x5043,
+ 0x0000, 0x0000, 0x0000, 0x4724, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_4f[] = {
+ /* 0x4f00 - 0x4fff */
+ 0x0000, 0x346b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5044, 0x304b, 0x0000, 0x0000, 0x3860, 0x346c, 0x497a,
+ 0x4832, 0x3559, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3271, 0x0000, 0x5067, 0x4541, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x476c,
+ 0x5046, 0x0000, 0x0000, 0x0000, 0x483c, 0x0000, 0x4e62, 0x0000,
+ 0x3f2d, 0x0000, 0x3b47, 0x0000, 0x3b77, 0x3240, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4451, 0x0000, 0x0000, 0x4322, 0x504a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x304c, 0x4463, 0x3d3b,
+ 0x3a34, 0x4d24, 0x0000, 0x424e, 0x0000, 0x323f, 0x0000, 0x5049,
+ 0x0000, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5053,
+ 0x5051, 0x0000, 0x0000, 0x3242, 0x0000, 0x4a3b, 0x504b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x504f, 0x3873, 0x0000, 0x0000, 0x3b48,
+ 0x0000, 0x0000, 0x0000, 0x3426, 0x0000, 0x0000, 0x5054, 0x0000,
+ 0x504c, 0x0000, 0x0000, 0x4e63, 0x0000, 0x3b78, 0x0000, 0x504d,
+ 0x0000, 0x5052, 0x0000, 0x0000, 0x0000, 0x0000, 0x5055, 0x0000,
+ 0x504e, 0x0000, 0x0000, 0x3621, 0x0000, 0x304d, 0x0000, 0x0000,
+ 0x3622, 0x3241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5525, 0x0000, 0x4b79, 0x496e, 0x3874,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f2f, 0x4e37, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a58,
+ 0x0000, 0x0000, 0x3738, 0x4225, 0x3264, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3d53, 0x0000, 0x0000, 0x0000, 0x5059, 0x0000,
+ 0x505e, 0x505c, 0x0000, 0x0000, 0x5057, 0x0000, 0x0000, 0x422f,
+ 0x505a, 0x0000, 0x505d, 0x505b, 0x0000, 0x4a5d, 0x0000, 0x5058,
+ 0x0000, 0x3f2e, 0x0000, 0x4b73, 0x505f, 0x5060, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d24, 0x506d,
+ 0x0000, 0x0000, 0x0000, 0x4750, 0x0000, 0x4936, 0x5068, 0x0000,
+ 0x4a70, 0x0000, 0x3236, 0x0000, 0x0000, 0x0000, 0x506c, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_50[] = {
+ /* 0x5000 - 0x50ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5066, 0x506f, 0x0000,
+ 0x0000, 0x4152, 0x0000, 0x3844, 0x0000, 0x475c, 0x0000, 0x6047,
+ 0x0000, 0x506e, 0x455d, 0x0000, 0x5063, 0x0000, 0x3876, 0x0000,
+ 0x0000, 0x3875, 0x5061, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c5a,
+ 0x0000, 0x5069, 0x0000, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x0000,
+ 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3666, 0x0000,
+ 0x0000, 0x3770, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5070, 0x0000, 0x0000, 0x0000, 0x5071,
+ 0x5075, 0x304e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a50,
+ 0x5074, 0x0000, 0x0000, 0x0000, 0x0000, 0x5073, 0x5077, 0x0000,
+ 0x0000, 0x0000, 0x5076, 0x0000, 0x4464, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3772, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5078, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3c45, 0x0000, 0x4226, 0x4465, 0x3676, 0x0000,
+ 0x5079, 0x0000, 0x0000, 0x0000, 0x0000, 0x3536, 0x0000, 0x0000,
+ 0x507a, 0x0000, 0x0000, 0x0000, 0x0000, 0x507c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b35, 0x0000, 0x0000,
+ 0x0000, 0x3766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3b31, 0x4877, 0x507b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3a45, 0x4d43, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x507e, 0x5123, 0x507d, 0x3a44, 0x0000, 0x3d7d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3739, 0x0000,
+ 0x0000, 0x0000, 0x5124, 0x0000, 0x0000, 0x364f, 0x0000, 0x0000,
+ 0x0000, 0x5121, 0x5122, 0x0000, 0x0000, 0x462f, 0x0000, 0x417c,
+ 0x0000, 0x3623, 0x0000, 0x0000, 0x0000, 0x4b4d, 0x5125, 0x0000,
+ 0x0000, 0x0000, 0x4e3d, 0x0000, 0x0000, 0x0000, 0x5126, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5129, 0x0000, 0x5127, 0x0000, 0x414e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5128, 0x512a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x512c, 0x0000, 0x0000,
+ 0x0000, 0x512b, 0x0000, 0x4a48, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_51[] = {
+ /* 0x5100 - 0x51ff */
+ 0x3537, 0x512e, 0x512f, 0x0000, 0x322f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x512d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3c74, 0x0000, 0x5132, 0x5131, 0x5130, 0x0000,
+ 0x5056, 0x0000, 0x5133, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d7e,
+ 0x0000, 0x5134, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c59, 0x0000, 0x0000, 0x0000, 0x0000, 0x5136,
+ 0x0000, 0x0000, 0x5135, 0x5138, 0x5137, 0x0000, 0x0000, 0x5139,
+ 0x513a, 0x3074, 0x0000, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624,
+ 0x4068, 0x3877, 0x0000, 0x396e, 0x513c, 0x4c48, 0x4546, 0x0000,
+ 0x3b79, 0x0000, 0x513b, 0x0000, 0x513d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x455e, 0x0000, 0x3375, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x513e, 0x0000, 0x0000, 0x467e, 0x0000, 0x0000,
+ 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x0000,
+ 0x0000, 0x3626, 0x0000, 0x0000, 0x0000, 0x4a3c, 0x4236, 0x3671,
+ 0x4535, 0x0000, 0x0000, 0x0000, 0x3773, 0x0000, 0x0000, 0x0000,
+ 0x5143, 0x0000, 0x5144, 0x0000, 0x0000, 0x4662, 0x315f, 0x0000,
+ 0x0000, 0x5147, 0x3a7d, 0x0000, 0x5146, 0x3a46, 0x0000, 0x5148,
+ 0x666e, 0x5149, 0x4b41, 0x514a, 0x0000, 0x514b, 0x514c, 0x3e69,
+ 0x0000, 0x3c4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3427, 0x0000, 0x514f, 0x0000, 0x514d, 0x4c3d, 0x514e, 0x0000,
+ 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0x0000, 0x0000, 0x0000,
+ 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5158, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4028, 0x5159, 0x3d5a, 0x0000,
+ 0x0000, 0x515a, 0x0000, 0x437c, 0x4e3f, 0x4560, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5245, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x515b, 0x7425, 0x3645, 0x0000, 0x0000,
+ 0x515c, 0x4b5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d68, 0x427c,
+ 0x0000, 0x515e, 0x4664, 0x0000, 0x0000, 0x515f, 0x0000, 0x0000,
+ 0x5160, 0x332e, 0x0000, 0x0000, 0x0000, 0x5161, 0x3627, 0x0000,
+ 0x464c, 0x317a, 0x3d50, 0x0000, 0x0000, 0x4821, 0x5162, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_52[] = {
+ /* 0x5200 - 0x52ff */
+ 0x4561, 0x0000, 0x0000, 0x3f4f, 0x5163, 0x0000, 0x4a2c, 0x405a,
+ 0x3422, 0x0000, 0x3429, 0x5164, 0x0000, 0x0000, 0x5166, 0x0000,
+ 0x0000, 0x373a, 0x0000, 0x0000, 0x5165, 0x0000, 0x0000, 0x4e73,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d69, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x483d, 0x4a4c, 0x0000, 0x5167,
+ 0x0000, 0x4d78, 0x5168, 0x0000, 0x0000, 0x0000, 0x5169, 0x0000,
+ 0x457e, 0x0000, 0x0000, 0x516a, 0x0000, 0x0000, 0x4029, 0x3a7e,
+ 0x3774, 0x516b, 0x3b49, 0x396f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4466, 0x516d, 0x0000, 0x0000, 0x4227,
+ 0x0000, 0x0000, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x0000, 0x516c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5171, 0x0000, 0x4b36, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3964, 0x0000, 0x0000, 0x5170, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3775, 0x3a5e, 0x476d, 0x0000, 0x0000,
+ 0x0000, 0x5174, 0x5172, 0x0000, 0x0000, 0x0000, 0x0000, 0x497b,
+ 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5177, 0x0000, 0x5176,
+ 0x0000, 0x0000, 0x0000, 0x3344, 0x0000, 0x0000, 0x0000, 0x3760,
+ 0x517c, 0x4e2d, 0x0000, 0x0000, 0x0000, 0x5178, 0x0000, 0x0000,
+ 0x0000, 0x517d, 0x517a, 0x0000, 0x5179, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4e4f, 0x0000, 0x0000, 0x0000, 0x3879,
+ 0x3243, 0x0000, 0x0000, 0x4e74, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x0000, 0x0000,
+ 0x0000, 0x4e65, 0x0000, 0x0000, 0x4f2b, 0x5225, 0x0000, 0x0000,
+ 0x0000, 0x387a, 0x0000, 0x0000, 0x5224, 0x0000, 0x332f, 0x0000,
+ 0x0000, 0x5226, 0x0000, 0x4b56, 0x0000, 0x443c, 0x0000, 0x4d26,
+ 0x0000, 0x4a59, 0x0000, 0x0000, 0x0000, 0x5227, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x7055, 0x0000, 0x0000, 0x4630, 0x0000, 0x5228,
+ 0x342a, 0x4c33, 0x0000, 0x0000, 0x0000, 0x3e21, 0x5229, 0x4a67,
+ 0x522d, 0x0000, 0x402a, 0x522a, 0x3650, 0x0000, 0x522b, 0x342b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x372e, 0x522e, 0x0000, 0x522f, 0x0000, 0x0000,
+ 0x5230, 0x5231, 0x3c5b, 0x0000, 0x0000, 0x0000, 0x387b, 0x4c5e,
+};
+
+static unsigned short const unicode_to_jisx0208_53[] = {
+ /* 0x5300 - 0x53ff */
+ 0x0000, 0x4c68, 0x4677, 0x0000, 0x0000, 0x4a71, 0x5232, 0x0000,
+ 0x5233, 0x0000, 0x0000, 0x0000, 0x0000, 0x5235, 0x0000, 0x5237,
+ 0x5236, 0x0000, 0x0000, 0x0000, 0x0000, 0x5238, 0x323d, 0x4b4c,
+ 0x0000, 0x3a7c, 0x5239, 0x0000, 0x0000, 0x4159, 0x0000, 0x0000,
+ 0x3e22, 0x3629, 0x0000, 0x523a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x485b, 0x0000, 0x0000, 0x0000, 0x0000, 0x523b,
+ 0x0000, 0x523c, 0x0000, 0x523d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x523e, 0x4924, 0x3668, 0x3065, 0x0000, 0x0000, 0x0000, 0x463f,
+ 0x523f, 0x3d3d, 0x0000, 0x4069, 0x0000, 0x5241, 0x5240, 0x3e23,
+ 0x3861, 0x5243, 0x483e, 0x0000, 0x0000, 0x5244, 0x0000, 0x0000,
+ 0x0000, 0x485c, 0x4234, 0x426e, 0x3628, 0x0000, 0x0000, 0x466e,
+ 0x4331, 0x0000, 0x476e, 0x0000, 0x4b4e, 0x0000, 0x5246, 0x0000,
+ 0x406a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3735, 0x0000,
+ 0x0000, 0x5247, 0x0000, 0x0000, 0x0000, 0x0000, 0x5248, 0x312c,
+ 0x3075, 0x346d, 0x0000, 0x4228, 0x3551, 0x4d71, 0x0000, 0x524b,
+ 0x3237, 0x0000, 0x0000, 0x524a, 0x0000, 0x0000, 0x0000, 0x362a,
+ 0x0000, 0x0000, 0x524c, 0x0000, 0x4c71, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x524d, 0x0000,
+ 0x4e52, 0x0000, 0x387c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3836,
+ 0x524e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5250, 0x524f, 0x0000,
+ 0x3f5f, 0x3139, 0x0000, 0x0000, 0x0000, 0x315e, 0x5251, 0x0000,
+ 0x5252, 0x0000, 0x0000, 0x3837, 0x0000, 0x0000, 0x5253, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x356e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b32, 0x5254, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d47, 0x0000, 0x3c68, 0x3c75,
+ 0x0000, 0x3d76, 0x0000, 0x4840, 0x0000, 0x0000, 0x0000, 0x5257,
+ 0x0000, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x0000, 0x0000,
+ 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244,
+ 0x4266, 0x3c38, 0x3b4b, 0x3126, 0x0000, 0x0000, 0x3370, 0x3966,
+ 0x3b4a, 0x0000, 0x525d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_54[] = {
+ /* 0x5400 - 0x54ff */
+ 0x0000, 0x525e, 0x0000, 0x3549, 0x3346, 0x0000, 0x0000, 0x0000,
+ 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79,
+ 0x4547, 0x387e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x372f, 0x0000, 0x5267, 0x0000, 0x3663,
+ 0x4b4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x485d, 0x0000,
+ 0x0000, 0x5266, 0x0000, 0x345e, 0x5261, 0x5262, 0x5264, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5265, 0x0000,
+ 0x355b, 0x3f61, 0x0000, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x0000,
+ 0x5260, 0x0000, 0x4f24, 0x0000, 0x0000, 0x0000, 0x4a72, 0x0000,
+ 0x4468, 0x3862, 0x3970, 0x0000, 0x0000, 0x0000, 0x5268, 0x0000,
+ 0x0000, 0x465d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x526c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c7e, 0x0000, 0x3c76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x526f, 0x526d, 0x0000, 0x4c23, 0x0000, 0x526a, 0x5273, 0x526e,
+ 0x0000, 0x0000, 0x0000, 0x5271, 0x3846, 0x4c3f, 0x0000, 0x0000,
+ 0x5272, 0x0000, 0x0000, 0x0000, 0x5274, 0x0000, 0x5276, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3a70, 0x4f42, 0x0000, 0x526b, 0x5269,
+ 0x5275, 0x0000, 0x5270, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5278, 0x0000, 0x5323, 0x527a, 0x0000, 0x0000,
+ 0x527e, 0x0000, 0x0000, 0x5321, 0x527b, 0x0000, 0x0000, 0x533e,
+ 0x0000, 0x0000, 0x3a69, 0x3331, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5279, 0x0000, 0x0000, 0x0000, 0x5325, 0x3076, 0x5324, 0x0000,
+ 0x3025, 0x494a, 0x5322, 0x0000, 0x527c, 0x0000, 0x0000, 0x5277,
+ 0x527d, 0x3a48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3077, 0x532f, 0x0000, 0x0000, 0x5327, 0x5328, 0x0000,
+ 0x3e25, 0x4b69, 0x0000, 0x0000, 0x0000, 0x532d, 0x532c, 0x0000,
+ 0x0000, 0x0000, 0x452f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x532e, 0x0000, 0x0000, 0x532b, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_55[] = {
+ /* 0x5500 - 0x55ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3134, 0x0000, 0x3a36, 0x3f30,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5329,
+ 0x4562, 0x0000, 0x0000, 0x0000, 0x532a, 0x0000, 0x3022, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5334, 0x4d23,
+ 0x0000, 0x3e27, 0x0000, 0x533a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5339, 0x5330, 0x0000, 0x0000, 0x0000, 0x0000, 0x4243, 0x0000,
+ 0x5331, 0x0000, 0x0000, 0x0000, 0x426f, 0x5336, 0x3e26, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5333, 0x0000, 0x0000, 0x4c64,
+ 0x0000, 0x0000, 0x0000, 0x373c, 0x0000, 0x0000, 0x5337, 0x5338,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5335, 0x533b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5332, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5341, 0x5346, 0x0000, 0x5342, 0x0000,
+ 0x533d, 0x0000, 0x0000, 0x5347, 0x4131, 0x0000, 0x0000, 0x5349,
+ 0x0000, 0x3922, 0x533f, 0x437d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5343, 0x533c, 0x342d, 0x0000, 0x346e, 0x3365, 0x5344, 0x5340,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3776,
+ 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x0000, 0x5345, 0x0000,
+ 0x3674, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3144, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x534e, 0x534c, 0x0000, 0x5427,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5351, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x534b, 0x0000, 0x534f, 0x0000, 0x0000, 0x534d,
+ 0x0000, 0x0000, 0x0000, 0x3b4c, 0x5350, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5353,
+ 0x0000, 0x5358, 0x0000, 0x0000, 0x0000, 0x5356, 0x5355, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_56[] = {
+ /* 0x5600 - 0x56ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4332, 0x0000,
+ 0x0000, 0x3245, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5352, 0x0000, 0x5354, 0x3e28,
+ 0x3133, 0x0000, 0x0000, 0x5357, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x325e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5362,
+ 0x0000, 0x3e7c, 0x535e, 0x0000, 0x535c, 0x0000, 0x535d, 0x0000,
+ 0x535f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x313d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4139, 0x0000, 0x5359, 0x0000,
+ 0x535a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x337a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5361, 0x0000, 0x0000, 0x0000,
+ 0x346f, 0x0000, 0x5364, 0x5360, 0x5363, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a2e, 0x0000, 0x0000, 0x0000,
+ 0x4655, 0x0000, 0x4838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5366, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5365, 0x3345,
+ 0x0000, 0x0000, 0x5367, 0x0000, 0x0000, 0x0000, 0x0000, 0x536a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5369, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5368, 0x0000, 0x4739, 0x0000, 0x0000, 0x536b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x536c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x536e, 0x0000, 0x536d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5370, 0x0000, 0x0000, 0x0000,
+ 0x5373, 0x5371, 0x536f, 0x5372, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5374, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5375, 0x0000,
+ 0x0000, 0x5376, 0x0000, 0x5377, 0x0000, 0x0000, 0x0000, 0x5378,
+ 0x5145, 0x0000, 0x3c7c, 0x3b4d, 0x0000, 0x0000, 0x3273, 0x0000,
+ 0x3078, 0x0000, 0x0000, 0x4344, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5379, 0x0000,
+ 0x3a24, 0x0000, 0x304f, 0x3f5e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x537a, 0x3847, 0x0000, 0x0000, 0x3971, 0x0000, 0x537c,
+};
+
+static unsigned short const unicode_to_jisx0208_57[] = {
+ /* 0x5700 - 0x57ff */
+ 0x537b, 0x0000, 0x0000, 0x4a60, 0x537d, 0x0000, 0x0000, 0x0000,
+ 0x5421, 0x537e, 0x0000, 0x5422, 0x0000, 0x5423, 0x0000, 0x3777,
+ 0x0000, 0x0000, 0x3160, 0x5424, 0x0000, 0x0000, 0x5426, 0x0000,
+ 0x5425, 0x0000, 0x0000, 0x0000, 0x5428, 0x0000, 0x0000, 0x455a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5429, 0x3035,
+ 0x3a5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x373d, 0x0000, 0x0000,
+ 0x434f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x542a,
+ 0x542b, 0x0000, 0x0000, 0x542d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x542e, 0x0000, 0x3a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x3651,
+ 0x0000, 0x0000, 0x4b37, 0x0000, 0x0000, 0x0000, 0x542c, 0x542f,
+ 0x3a41, 0x3923, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5433, 0x0000, 0x0000, 0x3a25, 0x0000, 0x4333, 0x0000,
+ 0x0000, 0x5430, 0x445a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5434,
+ 0x0000, 0x0000, 0x3f62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5432, 0x5435, 0x0000, 0x373f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5436, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5437, 0x0000, 0x3924, 0x3340, 0x5439, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x543a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x543b, 0x0000, 0x0000, 0x5438, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5431, 0x0000, 0x0000, 0x543c, 0x0000, 0x0000, 0x543d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4b64, 0x0000, 0x0000, 0x3e6b, 0x0000,
+ 0x0000, 0x0000, 0x543f, 0x5440, 0x543e, 0x0000, 0x5442, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4738, 0x0000, 0x0000, 0x3068,
+ 0x4956, 0x0000, 0x0000, 0x5443, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3e7d, 0x0000, 0x0000, 0x3c39,
+ 0x0000, 0x475d, 0x3470, 0x0000, 0x3a6b, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_58[] = {
+ /* 0x5800 - 0x58ff */
+ 0x4b59, 0x0000, 0x4632, 0x0000, 0x0000, 0x3778, 0x424f, 0x0000,
+ 0x0000, 0x0000, 0x5441, 0x5444, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4244, 0x0000, 0x0000,
+ 0x0000, 0x5445, 0x0000, 0x0000, 0x0000, 0x5446, 0x0000, 0x0000,
+ 0x0000, 0x5448, 0x0000, 0x0000, 0x4469, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x342e, 0x0000, 0x0000, 0x0000, 0x0000, 0x7421,
+ 0x3161, 0x4a73, 0x0000, 0x0000, 0x3e6c, 0x4548, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a66, 0x0000, 0x0000, 0x544e, 0x0000, 0x0000,
+ 0x4a3d, 0x4e5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3274, 0x544a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x413a, 0x544d, 0x0000, 0x4563, 0x0000, 0x0000, 0x4549,
+ 0x4564, 0x4839, 0x444d, 0x0000, 0x0000, 0x0000, 0x3a49, 0x0000,
+ 0x0000, 0x0000, 0x5449, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3176, 0x0000, 0x4536, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x544b, 0x0000, 0x5447, 0x0000, 0x0000, 0x3f50, 0x0000, 0x0000,
+ 0x0000, 0x544f, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d4e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x362d, 0x0000, 0x5450, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a68, 0x0000, 0x0000, 0x0000, 0x417d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4446, 0x0000, 0x0000, 0x5452,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4b4f, 0x0000, 0x0000, 0x5453, 0x0000, 0x0000, 0x5458, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a2f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5457, 0x5451, 0x5454, 0x5456, 0x0000, 0x0000, 0x3a26, 0x0000,
+ 0x0000, 0x4a49, 0x0000, 0x0000, 0x0000, 0x5459, 0x0000, 0x4345,
+ 0x0000, 0x0000, 0x3275, 0x0000, 0x3e6d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x545b, 0x0000, 0x545a, 0x0000, 0x3968, 0x0000, 0x545c,
+ 0x545e, 0x545d, 0x0000, 0x0000, 0x5460, 0x0000, 0x5455, 0x5462,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5461, 0x545f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b4e, 0x3f51, 0x0000, 0x4154, 0x5463,
+ 0x403c, 0x306d, 0x4764, 0x0000, 0x0000, 0x0000, 0x0000, 0x445b,
+ 0x0000, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_59[] = {
+ /* 0x5900 - 0x59ff */
+ 0x0000, 0x0000, 0x5469, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a51, 0x546a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3246,
+ 0x546b, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d3c, 0x3330, 0x0000,
+ 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c34, 0x0000, 0x0000, 0x546e, 0x0000, 0x4267,
+ 0x0000, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x0000,
+ 0x0000, 0x3c3a, 0x5471, 0x0000, 0x0000, 0x0000, 0x0000, 0x3050,
+ 0x5472, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5473, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3162, 0x0000, 0x0000, 0x3471,
+ 0x4660, 0x4a74, 0x0000, 0x0000, 0x0000, 0x0000, 0x5477, 0x4155,
+ 0x5476, 0x3740, 0x0000, 0x0000, 0x4b5b, 0x5475, 0x0000, 0x4565,
+ 0x5479, 0x0000, 0x5478, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x547b, 0x0000, 0x547a, 0x0000, 0x0000, 0x317c, 0x0000, 0x547c,
+ 0x3e29, 0x547e, 0x4325, 0x0000, 0x547d, 0x0000, 0x4a33, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3d77, 0x455b, 0x0000, 0x0000, 0x0000,
+ 0x5521, 0x0000, 0x0000, 0x0000, 0x0000, 0x3925, 0x0000, 0x0000,
+ 0x0000, 0x5522, 0x4721, 0x485e, 0x4c51, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4725, 0x0000, 0x0000, 0x552b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3538, 0x0000, 0x0000, 0x4d45, 0x0000,
+ 0x0000, 0x4c2f, 0x0000, 0x562c, 0x0000, 0x5523, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5526, 0x0000, 0x4245, 0x0000, 0x0000,
+ 0x4b38, 0x0000, 0x0000, 0x0000, 0x454a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5527, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4b65, 0x0000, 0x3a4a, 0x0000, 0x0000, 0x3e2a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5528, 0x0000,
+ 0x0000, 0x3b50, 0x0000, 0x3b4f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3039, 0x3848, 0x0000, 0x402b, 0x3051, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x552c, 0x552d, 0x0000, 0x552a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3138, 0x342f, 0x0000,
+ 0x5529, 0x0000, 0x4c45, 0x4931, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3028, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3079, 0x0000, 0x0000, 0x0000, 0x3b51,
+};
+
+static unsigned short const unicode_to_jisx0208_5a[] = {
+ /* 0x5a00 - 0x5aff */
+ 0x0000, 0x3052, 0x0000, 0x3023, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5532, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5530, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c3c, 0x0000, 0x5533, 0x0000, 0x5531, 0x0000, 0x0000, 0x552f,
+ 0x3f31, 0x0000, 0x0000, 0x0000, 0x0000, 0x552e, 0x0000, 0x0000,
+ 0x0000, 0x4a5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3864,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5537, 0x5538, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3e2b, 0x0000, 0x0000, 0x0000,
+ 0x5534, 0x4f2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x474c, 0x0000,
+ 0x0000, 0x5536, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5539, 0x0000, 0x0000, 0x0000, 0x4958, 0x0000,
+ 0x0000, 0x0000, 0x553a, 0x0000, 0x5535, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c3b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x475e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x553b, 0x4932, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x553c, 0x5540, 0x553d, 0x0000,
+ 0x0000, 0x3247, 0x553f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c3b, 0x0000, 0x553e, 0x3779, 0x0000, 0x0000, 0x0000,
+ 0x554c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5545, 0x5542,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4364, 0x0000, 0x5541, 0x0000, 0x0000, 0x5543, 0x0000,
+ 0x0000, 0x5544, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5546, 0x5547, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_5b[] = {
+ /* 0x5b00 - 0x5bff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3472, 0x0000, 0x5549, 0x5548, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x554a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3e6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x554d, 0x0000, 0x445c, 0x0000, 0x0000, 0x0000,
+ 0x3145, 0x0000, 0x554b, 0x0000, 0x0000, 0x0000, 0x554e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x554f, 0x0000,
+ 0x5552, 0x0000, 0x0000, 0x5550, 0x0000, 0x5551, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3b52, 0x5553, 0x0000, 0x0000, 0x3926, 0x5554, 0x0000, 0x3b7a,
+ 0x4238, 0x0000, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x0000, 0x4c52,
+ 0x0000, 0x0000, 0x0000, 0x3528, 0x3849, 0x5557, 0x3358, 0x0000,
+ 0x0000, 0x5558, 0x0000, 0x4239, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5559, 0x5623, 0x0000, 0x555a, 0x0000, 0x555b, 0x0000, 0x0000,
+ 0x555c, 0x0000, 0x555e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x555f, 0x0000, 0x0000, 0x5560, 0x0000, 0x4270, 0x0000, 0x3127,
+ 0x3c69, 0x3042, 0x0000, 0x4157, 0x3430, 0x3c35, 0x0000, 0x3928,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4566, 0x0000, 0x3d21,
+ 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x0000, 0x3c42,
+ 0x0000, 0x0000, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x355c, 0x0000,
+ 0x3a4b, 0x0000, 0x0000, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x0000,
+ 0x5562, 0x4d46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d49,
+ 0x0000, 0x0000, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564,
+ 0x0000, 0x5565, 0x0000, 0x0000, 0x4959, 0x0000, 0x0000, 0x0000,
+ 0x5567, 0x0000, 0x3428, 0x3677, 0x5566, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3432, 0x0000, 0x3f32, 0x556b, 0x3b21,
+ 0x0000, 0x3249, 0x556a, 0x0000, 0x5568, 0x556c, 0x5569, 0x472b,
+ 0x5c4d, 0x3f33, 0x0000, 0x556d, 0x0000, 0x0000, 0x4e40, 0x0000,
+ 0x556e, 0x0000, 0x0000, 0x5570, 0x0000, 0x437e, 0x556f, 0x0000,
+ 0x4023, 0x0000, 0x3b7b, 0x0000, 0x0000, 0x0000, 0x4250, 0x3c77,
+};
+
+static unsigned short const unicode_to_jisx0208_5c[] = {
+ /* 0x5c00 - 0x5cff */
+ 0x0000, 0x4975, 0x406c, 0x0000, 0x3c4d, 0x5571, 0x3e2d, 0x5572,
+ 0x5573, 0x3053, 0x423a, 0x3f52, 0x0000, 0x5574, 0x4633, 0x3e2e,
+ 0x0000, 0x3e2f, 0x0000, 0x5575, 0x0000, 0x0000, 0x406d, 0x0000,
+ 0x0000, 0x0000, 0x3e30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5576, 0x0000, 0x5577, 0x0000, 0x4c60, 0x0000, 0x0000, 0x0000,
+ 0x5578, 0x0000, 0x0000, 0x0000, 0x0000, 0x3646, 0x0000, 0x0000,
+ 0x0000, 0x3d22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722,
+ 0x3649, 0x557b, 0x0000, 0x0000, 0x0000, 0x356f, 0x557c, 0x0000,
+ 0x367e, 0x0000, 0x464f, 0x3230, 0x0000, 0x3b53, 0x557d, 0x5622,
+ 0x5621, 0x367d, 0x0000, 0x557e, 0x0000, 0x4538, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4230, 0x0000,
+ 0x454b, 0x3c48, 0x0000, 0x0000, 0x4158, 0x4d7a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5624, 0x0000, 0x5625, 0x4656,
+ 0x0000, 0x3b33, 0x0000, 0x0000, 0x0000, 0x0000, 0x5627, 0x0000,
+ 0x0000, 0x5628, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5629, 0x0000, 0x0000, 0x0000,
+ 0x3474, 0x562a, 0x0000, 0x0000, 0x562b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x322c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x413b, 0x3464, 0x0000, 0x562d, 0x4c28, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4252, 0x0000, 0x3359, 0x0000, 0x0000, 0x562f, 0x5631,
+ 0x345f, 0x0000, 0x0000, 0x562e, 0x5630, 0x0000, 0x5633, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5632, 0x0000, 0x5634,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5635, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x463d, 0x362e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3265, 0x5636, 0x563b, 0x0000, 0x0000, 0x5639, 0x0000, 0x4a77,
+ 0x4a76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4567, 0x0000,
+ 0x0000, 0x0000, 0x5638, 0x3d54, 0x0000, 0x5637, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_5d[] = {
+ /* 0x5d00 - 0x5dff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f72,
+ 0x0000, 0x0000, 0x0000, 0x563c, 0x0000, 0x0000, 0x3a6a, 0x0000,
+ 0x0000, 0x5642, 0x0000, 0x0000, 0x5643, 0x563d, 0x3333, 0x563e,
+ 0x5647, 0x5646, 0x5645, 0x5641, 0x0000, 0x0000, 0x0000, 0x5640,
+ 0x0000, 0x0000, 0x5644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x564b, 0x5648, 0x0000, 0x564a, 0x0000,
+ 0x4d72, 0x0000, 0x5649, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x563f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3f73, 0x0000, 0x0000, 0x564c, 0x0000, 0x0000, 0x3a37,
+ 0x0000, 0x0000, 0x0000, 0x564d, 0x0000, 0x0000, 0x564e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5651, 0x0000, 0x5650, 0x0000, 0x0000, 0x564f,
+ 0x0000, 0x0000, 0x0000, 0x4568, 0x563a, 0x0000, 0x0000, 0x0000,
+ 0x5657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5653, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5654, 0x0000, 0x5655, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5658,
+ 0x0000, 0x0000, 0x4e66, 0x0000, 0x5659, 0x5656, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x565a, 0x0000, 0x0000, 0x3460, 0x565b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x565d, 0x565c, 0x0000, 0x0000, 0x565e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x565f, 0x0000, 0x406e, 0x3d23, 0x0000,
+ 0x0000, 0x3d64, 0x0000, 0x4163, 0x0000, 0x3929, 0x3a38, 0x392a,
+ 0x3570, 0x0000, 0x0000, 0x5660, 0x0000, 0x0000, 0x3a39, 0x0000,
+ 0x0000, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x0000, 0x392b,
+ 0x0000, 0x0000, 0x0000, 0x342c, 0x0000, 0x4327, 0x3652, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_5e[] = {
+ /* 0x5e00 - 0x5eff */
+ 0x0000, 0x0000, 0x3b54, 0x495b, 0x0000, 0x0000, 0x4841, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5663, 0x3475, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5666, 0x0000, 0x0000, 0x0000, 0x0000, 0x4421, 0x0000,
+ 0x0000, 0x5665, 0x5664, 0x5667, 0x0000, 0x446b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f63, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b55, 0x0000, 0x404a, 0x0000, 0x4253,
+ 0x3522, 0x0000, 0x0000, 0x4422, 0x0000, 0x0000, 0x5668, 0x5669,
+ 0x3e6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b39, 0x0000, 0x0000,
+ 0x566c, 0x0000, 0x0000, 0x566b, 0x566a, 0x497d, 0x0000, 0x5673,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4b5a, 0x0000, 0x566d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x566f, 0x4b6b, 0x0000, 0x566e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5670,
+ 0x0000, 0x4828, 0x5671, 0x4a3e, 0x5672, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x0000,
+ 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678,
+ 0x0000, 0x4423, 0x0000, 0x392d, 0x3e31, 0x0000, 0x0000, 0x485f,
+ 0x0000, 0x0000, 0x3e32, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d78,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x446c, 0x4a79, 0x4539,
+ 0x0000, 0x0000, 0x392e, 0x0000, 0x495c, 0x0000, 0x0000, 0x0000,
+ 0x5679, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4559, 0x3a42,
+ 0x0000, 0x0000, 0x0000, 0x384b, 0x0000, 0x446d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3043, 0x3d6e, 0x392f,
+ 0x4d47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x567a, 0x567b, 0x4751, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x567c, 0x4e77, 0x4f2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x567e,
+ 0x567d, 0x0000, 0x0000, 0x3347, 0x0000, 0x0000, 0x5721, 0x0000,
+ 0x0000, 0x0000, 0x5724, 0x5725, 0x0000, 0x5723, 0x0000, 0x4940,
+ 0x3e33, 0x5727, 0x5726, 0x5722, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5728, 0x5729, 0x0000, 0x0000, 0x572a, 0x0000, 0x0000, 0x0000,
+ 0x572d, 0x572b, 0x0000, 0x572c, 0x572e, 0x0000, 0x3164, 0x446e,
+ 0x572f, 0x0000, 0x377a, 0x3276, 0x4736, 0x0000, 0x5730, 0x467b,
+};
+
+static unsigned short const unicode_to_jisx0208_5f[] = {
+ /* 0x5f00 - 0x5fff */
+ 0x0000, 0x4a5b, 0x0000, 0x5731, 0x4f2e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x0000, 0x3c30,
+ 0x4675, 0x5736, 0x0000, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26,
+ 0x3930, 0x0000, 0x0000, 0x4350, 0x0000, 0x0000, 0x0000, 0x446f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c6f, 0x3839, 0x384c,
+ 0x0000, 0x5738, 0x0000, 0x0000, 0x0000, 0x5739, 0x0000, 0x573f,
+ 0x0000, 0x3c65, 0x0000, 0x0000, 0x0000, 0x4425, 0x0000, 0x362f,
+ 0x573a, 0x0000, 0x0000, 0x0000, 0x492b, 0x0000, 0x4346, 0x0000,
+ 0x0000, 0x573b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x573c, 0x0000, 0x3630, 0x0000, 0x573d, 0x0000, 0x573e, 0x0000,
+ 0x0000, 0x5740, 0x0000, 0x4576, 0x0000, 0x0000, 0x5741, 0x5742,
+ 0x0000, 0x5743, 0x0000, 0x0000, 0x5734, 0x5733, 0x0000, 0x0000,
+ 0x0000, 0x5744, 0x3741, 0x0000, 0x0000, 0x0000, 0x4927, 0x0000,
+ 0x0000, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x0000, 0x0000,
+ 0x3e34, 0x3146, 0x0000, 0x5746, 0x0000, 0x0000, 0x0000, 0x5747,
+ 0x0000, 0x4c72, 0x0000, 0x0000, 0x4860, 0x0000, 0x0000, 0x574a,
+ 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x0000, 0x574e,
+ 0x574c, 0x0000, 0x574b, 0x4e27, 0x3865, 0x0000, 0x0000, 0x0000,
+ 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x0000, 0x0000, 0x0000, 0x4640,
+ 0x5751, 0x5750, 0x0000, 0x0000, 0x0000, 0x0000, 0x574f, 0x0000,
+ 0x5752, 0x3866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5753, 0x497c, 0x3d5b, 0x0000, 0x0000, 0x5754, 0x4879, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4641, 0x4427, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4530, 0x0000, 0x0000, 0x5755, 0x352b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3f34, 0x0000, 0x492c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3477, 0x4726, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5756, 0x3b56,
+ 0x4b3a, 0x4b3b, 0x0000, 0x0000, 0x317e, 0x575b, 0x0000, 0x0000,
+ 0x4369, 0x0000, 0x0000, 0x0000, 0x5758, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3277, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x582d, 0x575a, 0x0000, 0x0000, 0x0000, 0x4730, 0x0000, 0x0000,
+ 0x5759, 0x0000, 0x0000, 0x5757, 0x0000, 0x397a, 0x0000, 0x575d,
+};
+
+static unsigned short const unicode_to_jisx0208_60[] = {
+ /* 0x6000 - 0x60ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5763, 0x5769,
+ 0x5761, 0x0000, 0x455c, 0x0000, 0x0000, 0x5766, 0x495d, 0x0000,
+ 0x0000, 0x5760, 0x0000, 0x5765, 0x4e67, 0x3b57, 0x0000, 0x0000,
+ 0x4255, 0x575e, 0x0000, 0x0000, 0x0000, 0x355e, 0x5768, 0x402d,
+ 0x3165, 0x5762, 0x3278, 0x5767, 0x0000, 0x0000, 0x0000, 0x3631,
+ 0x0000, 0x5764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x576a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x576c, 0x5776, 0x5774, 0x0000, 0x0000, 0x5771, 0x0000,
+ 0x0000, 0x0000, 0x5770, 0x4e78, 0x0000, 0x5772, 0x0000, 0x0000,
+ 0x3632, 0x0000, 0x3931, 0x0000, 0x0000, 0x3d7a, 0x0000, 0x0000,
+ 0x0000, 0x5779, 0x576b, 0x0000, 0x0000, 0x0000, 0x0000, 0x576f,
+ 0x575f, 0x0000, 0x327a, 0x5773, 0x5775, 0x4351, 0x0000, 0x0000,
+ 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x0000, 0x4229,
+ 0x3366, 0x0000, 0x0000, 0x0000, 0x0000, 0x3743, 0x0000, 0x576e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x577a, 0x0000, 0x577d, 0x5821, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c3d, 0x0000, 0x5827, 0x4470, 0x577b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5825, 0x0000, 0x3279, 0x0000, 0x5823, 0x5824,
+ 0x0000, 0x0000, 0x577e, 0x5822, 0x0000, 0x0000, 0x0000, 0x3867,
+ 0x4d2a, 0x0000, 0x0000, 0x3435, 0x0000, 0x0000, 0x3159, 0x5826,
+ 0x0000, 0x473a, 0x302d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x0000,
+ 0x5829, 0x0000, 0x0000, 0x0000, 0x4569, 0x582e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e70, 0x582f, 0x4657,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4f47, 0x0000, 0x582b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5831, 0x0000, 0x397b, 0x0000, 0x404b, 0x0000, 0x0000, 0x3054,
+ 0x582a, 0x5828, 0x0000, 0x415a, 0x0000, 0x0000, 0x0000, 0x577c,
+ 0x3b34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4246, 0x583d, 0x0000, 0x415b, 0x5838, 0x0000, 0x5835, 0x5836,
+ 0x0000, 0x3c66, 0x5839, 0x583c, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_61[] = {
+ /* 0x6100 - 0x61ff */
+ 0x5837, 0x3d25, 0x0000, 0x583a, 0x0000, 0x0000, 0x5834, 0x0000,
+ 0x4c7c, 0x4c7b, 0x0000, 0x0000, 0x0000, 0x583e, 0x583f, 0x3055,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5833, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3672, 0x3026, 0x0000, 0x0000, 0x0000, 0x3436,
+ 0x0000, 0x583b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5843,
+ 0x5842, 0x0000, 0x0000, 0x0000, 0x5847, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5848, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5846, 0x5849, 0x5841, 0x5845,
+ 0x0000, 0x0000, 0x584a, 0x0000, 0x584b, 0x0000, 0x0000, 0x5840,
+ 0x3b7c, 0x0000, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5858, 0x0000, 0x4a69, 0x0000, 0x0000,
+ 0x584e, 0x584f, 0x5850, 0x0000, 0x0000, 0x5857, 0x0000, 0x5856,
+ 0x0000, 0x0000, 0x4b7d, 0x3437, 0x0000, 0x5854, 0x0000, 0x3745,
+ 0x3334, 0x0000, 0x0000, 0x5851, 0x0000, 0x0000, 0x4e38, 0x5853,
+ 0x3056, 0x5855, 0x0000, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d5d, 0x0000,
+ 0x0000, 0x0000, 0x4d2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x585c,
+ 0x0000, 0x0000, 0x5860, 0x0000, 0x0000, 0x0000, 0x417e, 0x0000,
+ 0x4e79, 0x5861, 0x0000, 0x0000, 0x585e, 0x0000, 0x585b, 0x0000,
+ 0x0000, 0x585a, 0x585f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a30, 0x0000, 0x0000, 0x4634,
+ 0x0000, 0x3746, 0x0000, 0x5862, 0x585d, 0x0000, 0x5863, 0x0000,
+ 0x0000, 0x0000, 0x377b, 0x0000, 0x0000, 0x0000, 0x3231, 0x0000,
+ 0x0000, 0x0000, 0x586b, 0x0000, 0x0000, 0x0000, 0x3438, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5869, 0x0000, 0x0000, 0x586a, 0x3a29,
+ 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x0000, 0x0000,
+ 0x327b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5870, 0x0000, 0x0000, 0x586f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4428, 0x0000, 0x5873, 0x0000, 0x5871, 0x5867,
+ 0x377c, 0x0000, 0x5872, 0x0000, 0x5876, 0x5875, 0x5877, 0x5874,
+};
+
+static unsigned short const unicode_to_jisx0208_62[] = {
+ /* 0x6200 - 0x62ff */
+ 0x5878, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5879, 0x587a, 0x4a6a, 0x0000, 0x587c, 0x587b, 0x3d3f, 0x0000,
+ 0x402e, 0x3266, 0x327c, 0x0000, 0x587d, 0x0000, 0x303f, 0x0000,
+ 0x0000, 0x0000, 0x404c, 0x587e, 0x0000, 0x6c43, 0x5921, 0x3761,
+ 0x0000, 0x5922, 0x0000, 0x0000, 0x0000, 0x0000, 0x406f, 0x0000,
+ 0x0000, 0x0000, 0x5923, 0x0000, 0x0000, 0x0000, 0x5924, 0x353a,
+ 0x5925, 0x0000, 0x5926, 0x5927, 0x4257, 0x0000, 0x0000, 0x0000,
+ 0x384d, 0x0000, 0x0000, 0x4c61, 0x0000, 0x0000, 0x0000, 0x4b3c,
+ 0x3d6a, 0x5928, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4070,
+ 0x6e3d, 0x4862, 0x0000, 0x3c6a, 0x0000, 0x3a4d, 0x5929, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4247, 0x0000, 0x4a27, 0x0000, 0x0000,
+ 0x4271, 0x0000, 0x0000, 0x592c, 0x0000, 0x0000, 0x592a, 0x0000,
+ 0x592d, 0x0000, 0x0000, 0x592b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x592e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a31, 0x0000,
+ 0x0000, 0x3037, 0x0000, 0x0000, 0x0000, 0x0000, 0x495e, 0x0000,
+ 0x0000, 0x4863, 0x0000, 0x0000, 0x592f, 0x0000, 0x5932, 0x3e35,
+ 0x353b, 0x0000, 0x5930, 0x5937, 0x3e36, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5931, 0x4744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933,
+ 0x405e, 0x0000, 0x0000, 0x5946, 0x4834, 0x0000, 0x4272, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4864, 0x5a2d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a7a, 0x0000, 0x0000, 0x0000, 0x4471, 0x0000, 0x0000,
+ 0x0000, 0x4b75, 0x0000, 0x593b, 0x3221, 0x436a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5944, 0x0000, 0x0000, 0x4334, 0x593e, 0x5945,
+ 0x5940, 0x5947, 0x5943, 0x0000, 0x5942, 0x476f, 0x0000, 0x593c,
+ 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0x0000, 0x0000, 0x5939,
+ 0x3934, 0x405b, 0x0000, 0x3e37, 0x5941, 0x4752, 0x0000, 0x0000,
+ 0x3572, 0x3348, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3367, 0x3f21, 0x5949, 0x594e,
+ 0x0000, 0x594a, 0x0000, 0x377d, 0x0000, 0x594f, 0x3b22, 0x3969,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d26, 0x593d,
+};
+
+static unsigned short const unicode_to_jisx0208_63[] = {
+ /* 0x6300 - 0x63ff */
+ 0x0000, 0x3b7d, 0x594c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b58,
+ 0x594d, 0x3044, 0x0000, 0x0000, 0x5948, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4429, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3573, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3634,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x594b,
+ 0x3027, 0x0000, 0x0000, 0x3a43, 0x0000, 0x0000, 0x0000, 0x3f36,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4472, 0x0000, 0x0000, 0x4854, 0x5951, 0x415e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x422a, 0x0000, 0x0000, 0x3b2b, 0x5952, 0x0000, 0x5954,
+ 0x5950, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a61, 0x0000, 0x443d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x415c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a7b,
+ 0x3c4e, 0x5960, 0x0000, 0x595f, 0x0000, 0x0000, 0x3f78, 0x0000,
+ 0x0000, 0x0000, 0x377e, 0x0000, 0x0000, 0x0000, 0x5959, 0x3e39,
+ 0x0000, 0x0000, 0x4668, 0x4731, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5957, 0x0000, 0x0000, 0x415d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c78, 0x595c, 0x0000, 0x0000, 0x3e38, 0x0000, 0x5956, 0x595b,
+ 0x0000, 0x0000, 0x4753, 0x0000, 0x0000, 0x0000, 0x5955, 0x0000,
+ 0x3721, 0x0000, 0x0000, 0x335d, 0x0000, 0x0000, 0x0000, 0x595d,
+ 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x0000, 0x405c, 0x0000, 0x3935,
+ 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3747, 0x0000, 0x444f, 0x595e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x415f, 0x0000, 0x0000, 0x5961, 0x0000,
+ 0x5963, 0x0000, 0x0000, 0x4237, 0x5969, 0x0000, 0x5964, 0x0000,
+ 0x0000, 0x5966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4941,
+ 0x4473, 0x0000, 0x5967, 0x0000, 0x0000, 0x0000, 0x4d2c, 0x0000,
+ 0x0000, 0x0000, 0x4d48, 0x3439, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x302e, 0x0000, 0x5965, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5962, 0x0000, 0x0000, 0x0000, 0x0000, 0x3478, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3167, 0x0000, 0x5968, 0x0000,
+ 0x0000, 0x0000, 0x4d49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_64[] = {
+ /* 0x6400 - 0x64ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x596c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x423b, 0x0000, 0x5973,
+ 0x0000, 0x0000, 0x0000, 0x596d, 0x0000, 0x0000, 0x596a, 0x5971,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5953, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x596e, 0x0000,
+ 0x5972, 0x0000, 0x0000, 0x0000, 0x4842, 0x456b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x596b, 0x0000, 0x596f, 0x0000,
+ 0x0000, 0x0000, 0x3748, 0x0000, 0x0000, 0x0000, 0x3a71, 0x0000,
+ 0x0000, 0x0000, 0x405d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5977, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5974,
+ 0x0000, 0x4b60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5975,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5976, 0x0000,
+ 0x4c4e, 0x0000, 0x4022, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3762, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x597d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b35, 0x597a, 0x0000, 0x5979, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4732, 0x0000, 0x0000, 0x0000, 0x4635, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4531, 0x597b, 0x0000, 0x0000,
+ 0x0000, 0x597c, 0x0000, 0x496f, 0x0000, 0x4745, 0x3b23, 0x0000,
+ 0x4071, 0x0000, 0x4b50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3349, 0x0000, 0x5a25, 0x597e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4d4a, 0x5a27, 0x0000, 0x0000, 0x5a23, 0x0000, 0x5a24,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4160, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5a22, 0x0000, 0x593f, 0x0000, 0x0000, 0x0000,
+ 0x5a26, 0x0000, 0x5a21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x0000, 0x0000, 0x3b24, 0x5a29,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x353c, 0x0000, 0x0000, 0x5a2f,
+ 0x0000, 0x5a28, 0x5a33, 0x0000, 0x5a32, 0x0000, 0x5a31, 0x0000,
+ 0x0000, 0x0000, 0x5a34, 0x0000, 0x0000, 0x5a36, 0x3e71, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_65[] = {
+ /* 0x6500 - 0x65ff */
+ 0x5a35, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a39, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5a37, 0x0000, 0x0000, 0x0000, 0x5a38, 0x5970, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5a3b, 0x5a3a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5978, 0x5a3c, 0x5a30, 0x0000, 0x0000, 0x3b59,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f,
+ 0x5a41, 0x327e, 0x0000, 0x3936, 0x0000, 0x0000, 0x4a7c, 0x402f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x384e, 0x0000, 0x0000,
+ 0x5a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a46, 0x0000, 0x4952,
+ 0x0000, 0x355f, 0x0000, 0x0000, 0x0000, 0x5a45, 0x5a44, 0x4754,
+ 0x5a47, 0x3635, 0x0000, 0x0000, 0x0000, 0x5a49, 0x5a48, 0x0000,
+ 0x0000, 0x0000, 0x343a, 0x3b36, 0x0000, 0x0000, 0x4658, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3749, 0x0000, 0x0000, 0x0000,
+ 0x3f74, 0x0000, 0x5a4a, 0x0000, 0x4030, 0x4528, 0x0000, 0x495f,
+ 0x5a4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5a4c, 0x5a4d, 0x0000, 0x0000, 0x0000, 0x4a38,
+ 0x555d, 0x4046, 0x0000, 0x0000, 0x494c, 0x0000, 0x3a58, 0x0000,
+ 0x4865, 0x4843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x454d,
+ 0x0000, 0x4e41, 0x0000, 0x5a4f, 0x3c50, 0x0000, 0x0000, 0x5a50,
+ 0x0000, 0x3036, 0x0000, 0x0000, 0x3654, 0x404d, 0x0000, 0x4960,
+ 0x0000, 0x0000, 0x0000, 0x5a51, 0x3b42, 0x4347, 0x0000, 0x3b5b,
+ 0x3f37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a52,
+ 0x0000, 0x4a7d, 0x0000, 0x0000, 0x3177, 0x3b5c, 0x0000, 0x0000,
+ 0x0000, 0x5a55, 0x0000, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x407b, 0x5a57, 0x0000, 0x0000, 0x4232,
+ 0x0000, 0x0000, 0x5a58, 0x0000, 0x0000, 0x0000, 0x0000, 0x347a,
+ 0x0000, 0x5a5a, 0x0000, 0x5a59, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5a5b, 0x5a5c, 0x347b, 0x0000, 0x0000, 0x467c, 0x4336, 0x356c,
+ 0x3b5d, 0x4161, 0x0000, 0x0000, 0x3d5c, 0x3030, 0x0000, 0x0000,
+ 0x0000, 0x5a5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3222, 0x5a61, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_66[] = {
+ /* 0x6600 - 0x66ff */
+ 0x0000, 0x0000, 0x3937, 0x5a60, 0x0000, 0x0000, 0x3a2b, 0x3e3a,
+ 0x0000, 0x0000, 0x5a5f, 0x0000, 0x3e3b, 0x0000, 0x4c40, 0x3a2a,
+ 0x0000, 0x0000, 0x0000, 0x3057, 0x404e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5a66, 0x0000, 0x0000, 0x4031,
+ 0x3147, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d55, 0x0000, 0x4b66,
+ 0x3a72, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e3c, 0x0000, 0x4027,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5a65, 0x5a63, 0x5a64, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x436b, 0x0000, 0x0000, 0x5b26,
+ 0x0000, 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5a69, 0x0000, 0x3f38, 0x0000, 0x0000, 0x0000, 0x5a67,
+ 0x0000, 0x0000, 0x3b2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a6c, 0x5a6b, 0x5a70,
+ 0x0000, 0x0000, 0x5a71, 0x0000, 0x5a6d, 0x0000, 0x3322, 0x5a6e,
+ 0x5a6f, 0x4855, 0x0000, 0x0000, 0x0000, 0x0000, 0x4961, 0x374a,
+ 0x5a72, 0x0000, 0x0000, 0x0000, 0x4032, 0x0000, 0x3e3d, 0x0000,
+ 0x0000, 0x0000, 0x4352, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3647, 0x0000, 0x5a73, 0x5a77, 0x0000, 0x0000, 0x324b,
+ 0x5a74, 0x5a76, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a75, 0x0000,
+ 0x0000, 0x3d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x4348, 0x3045,
+ 0x5a78, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a79, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x442a, 0x0000, 0x0000, 0x0000, 0x4e71, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b43, 0x0000, 0x0000, 0x4a6b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4b3d, 0x0000, 0x0000, 0x0000,
+ 0x5b22, 0x5a7b, 0x0000, 0x0000, 0x5a7e, 0x0000, 0x5a7d, 0x0000,
+ 0x0000, 0x5a7a, 0x0000, 0x0000, 0x5b21, 0x0000, 0x0000, 0x465e,
+ 0x0000, 0x5a7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b23, 0x0000,
+ 0x0000, 0x3d6c, 0x5b24, 0x0000, 0x4d4b, 0x4778, 0x0000, 0x0000,
+ 0x5b25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b27, 0x0000,
+ 0x0000, 0x5b28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b29, 0x0000, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x0000, 0x5b2b,
+ 0x3d71, 0x4162, 0x0000, 0x0000, 0x5258, 0x413e, 0x413d, 0x4258,
+};
+
+static unsigned short const unicode_to_jisx0208_67[] = {
+ /* 0x6700 - 0x67ff */
+ 0x3a47, 0x0000, 0x0000, 0x5072, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x376e, 0x4d2d, 0x0000, 0x4a7e, 0x0000, 0x497e, 0x0000, 0x5b2c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3a73, 0x443f, 0x5b2d, 0x4f2f,
+ 0x0000, 0x0000, 0x0000, 0x4b3e, 0x0000, 0x442b, 0x5b2e, 0x347c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b2f, 0x5b30,
+ 0x4c5a, 0x0000, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x0000,
+ 0x0000, 0x3c6b, 0x0000, 0x0000, 0x4b51, 0x0000, 0x5b34, 0x5b37,
+ 0x5b36, 0x0000, 0x3479, 0x0000, 0x0000, 0x3560, 0x0000, 0x5b33,
+ 0x0000, 0x5b35, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b38, 0x0000,
+ 0x0000, 0x3f79, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d7b, 0x3049,
+ 0x3a60, 0x423c, 0x0000, 0x3c5d, 0x0000, 0x0000, 0x3e73, 0x0000,
+ 0x0000, 0x5b3b, 0x0000, 0x0000, 0x454e, 0x0000, 0x5b39, 0x422b,
+ 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5b42, 0x0000, 0x0000, 0x393a, 0x0000, 0x4755,
+ 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x0000, 0x354f, 0x0000, 0x4747,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5b41, 0x0000, 0x3e3e, 0x4844,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b47, 0x0000, 0x487a,
+ 0x0000, 0x5b3e, 0x0000, 0x5b44, 0x5b43, 0x0000, 0x0000, 0x0000,
+ 0x404f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b6d, 0x0000, 0x4e53,
+ 0x0000, 0x0000, 0x4b67, 0x0000, 0x324c, 0x3b5e, 0x0000, 0x0000,
+ 0x4f48, 0x5b46, 0x3f75, 0x0000, 0x0000, 0x0000, 0x5b45, 0x0000,
+ 0x0000, 0x5b40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x384f,
+ 0x0000, 0x0000, 0x0000, 0x5b4c, 0x5b4a, 0x0000, 0x324d, 0x5b48,
+ 0x5b4e, 0x5b54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4248, 0x0000, 0x0000, 0x4a41, 0x0000, 0x5b56, 0x0000,
+ 0x0000, 0x0000, 0x4922, 0x0000, 0x0000, 0x0000, 0x5b55, 0x4770,
+ 0x4b3f, 0x343b, 0x0000, 0x4077, 0x3d40, 0x0000, 0x0000, 0x0000,
+ 0x4453, 0x0000, 0x4d2e, 0x0000, 0x0000, 0x5b51, 0x5b50, 0x0000,
+ 0x0000, 0x0000, 0x5b52, 0x0000, 0x5b4f, 0x0000, 0x0000, 0x5b57,
+ 0x0000, 0x5b4d, 0x0000, 0x0000, 0x5b4b, 0x0000, 0x5b53, 0x5b49,
+ 0x0000, 0x436c, 0x0000, 0x4c78, 0x3c46, 0x3a74, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3a3a, 0x0000, 0x0000, 0x4b6f, 0x3341,
+};
+
+static unsigned short const unicode_to_jisx0208_68[] = {
+ /* 0x6800 - 0x68ff */
+ 0x0000, 0x0000, 0x444e, 0x464a, 0x3149, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4072, 0x0000, 0x0000, 0x4034, 0x372a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b59, 0x0000,
+ 0x0000, 0x393b, 0x337c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5b5b, 0x3374, 0x5b61, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5b5e, 0x0000, 0x4073, 0x0000, 0x0000, 0x0000,
+ 0x334b, 0x3a2c, 0x0000, 0x0000, 0x334a, 0x3a4f, 0x0000, 0x0000,
+ 0x5b5c, 0x3765, 0x374b, 0x456d, 0x0000, 0x0000, 0x5b5a, 0x0000,
+ 0x3046, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b5d, 0x5b5f, 0x0000,
+ 0x364d, 0x372c, 0x0000, 0x343c, 0x354b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5b62, 0x0000, 0x0000, 0x3a79, 0x4b71, 0x0000, 0x3b37,
+ 0x0000, 0x0000, 0x0000, 0x5b63, 0x0000, 0x0000, 0x0000, 0x4930,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5b6f, 0x0000, 0x3233, 0x5b64,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b75, 0x5b65,
+ 0x0000, 0x4e42, 0x0000, 0x5b6c, 0x0000, 0x475f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b74, 0x0000, 0x5b67,
+ 0x0000, 0x0000, 0x0000, 0x3034, 0x5b69, 0x0000, 0x0000, 0x393c,
+ 0x0000, 0x0000, 0x0000, 0x5b6b, 0x0000, 0x5b6a, 0x0000, 0x5b66,
+ 0x5b71, 0x0000, 0x3e3f, 0x0000, 0x0000, 0x0000, 0x546d, 0x3868,
+ 0x4d7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b68, 0x0000, 0x4474,
+ 0x3323, 0x3a2d, 0x0000, 0x5b60, 0x0000, 0x5b70, 0x3361, 0x0000,
+ 0x0000, 0x5b6e, 0x5b72, 0x0000, 0x456e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x347e, 0x0000, 0x5c32, 0x0000,
+ 0x0000, 0x4c49, 0x5b77, 0x347d, 0x0000, 0x5b7e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4b40, 0x0000, 0x5c21, 0x5c23, 0x0000, 0x5c27,
+ 0x5b79, 0x0000, 0x432a, 0x0000, 0x0000, 0x0000, 0x0000, 0x456f,
+ 0x5c2b, 0x5b7c, 0x0000, 0x5c28, 0x0000, 0x0000, 0x0000, 0x5c22,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f39, 0x5c2c,
+ 0x0000, 0x0000, 0x4033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c2a, 0x343d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_69[] = {
+ /* 0x6900 - 0x69ff */
+ 0x4f50, 0x5b76, 0x0000, 0x0000, 0x5c26, 0x3058, 0x0000, 0x0000,
+ 0x5b78, 0x0000, 0x0000, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73,
+ 0x0000, 0x0000, 0x5c25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c31, 0x5b7a, 0x5c30, 0x0000, 0x5c29, 0x5b7b, 0x0000,
+ 0x5c2d, 0x0000, 0x5c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5c3f, 0x0000, 0x0000, 0x0000, 0x464e, 0x0000, 0x5c24, 0x0000,
+ 0x0000, 0x5c3b, 0x0000, 0x0000, 0x0000, 0x5c3d, 0x0000, 0x4458,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4976, 0x5c38, 0x424a, 0x0000, 0x0000,
+ 0x0000, 0x5c3e, 0x413f, 0x0000, 0x5c35, 0x5c42, 0x5c41, 0x0000,
+ 0x466f, 0x5c40, 0x466a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c44, 0x5c37, 0x0000, 0x3648, 0x5c3a, 0x3d5d,
+ 0x0000, 0x0000, 0x0000, 0x4760, 0x5c3c, 0x364b, 0x0000, 0x5c34,
+ 0x5c36, 0x5c33, 0x0000, 0x0000, 0x4f30, 0x335a, 0x5c39, 0x0000,
+ 0x0000, 0x5c43, 0x3335, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a67, 0x0000, 0x0000, 0x0000, 0x315d, 0x0000,
+ 0x0000, 0x5c54, 0x0000, 0x0000, 0x4f31, 0x5c57, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3f3a, 0x5c56, 0x0000, 0x0000, 0x0000,
+ 0x5c55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c52,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c46, 0x0000,
+ 0x0000, 0x5c63, 0x5c45, 0x0000, 0x5c58, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5c50, 0x0000, 0x0000, 0x5c4b, 0x5c48,
+ 0x0000, 0x5c49, 0x0000, 0x5c51, 0x0000, 0x0000, 0x0000, 0x7422,
+ 0x0000, 0x0000, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x0000,
+ 0x5c47, 0x0000, 0x0000, 0x5c4a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4d4d, 0x4b6a, 0x0000, 0x0000, 0x0000, 0x5c4f, 0x5c59, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c61,
+ 0x5c5a, 0x0000, 0x0000, 0x5c67, 0x0000, 0x5c65, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c5f, 0x0000, 0x4450, 0x0000, 0x4165, 0x0000, 0x5c5d,
+};
+
+static unsigned short const unicode_to_jisx0208_6a[] = {
+ /* 0x6a00 - 0x6aff */
+ 0x0000, 0x0000, 0x5c5b, 0x0000, 0x0000, 0x5c62, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c68, 0x4875, 0x5c6e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c69, 0x5c6c, 0x5c66, 0x0000, 0x0000, 0x4374,
+ 0x0000, 0x4938, 0x0000, 0x5c5c, 0x0000, 0x0000, 0x5c64, 0x3e40,
+ 0x0000, 0x4c4f, 0x5c78, 0x5c6b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3822, 0x3223, 0x335f, 0x0000, 0x0000, 0x5c53, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e41, 0x5c70, 0x0000,
+ 0x5c77, 0x3c79, 0x3372, 0x0000, 0x0000, 0x432e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5c6d, 0x0000, 0x0000, 0x5c72,
+ 0x5c76, 0x0000, 0x0000, 0x3636, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x354c, 0x5c74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3521,
+ 0x0000, 0x464b, 0x5c73, 0x0000, 0x0000, 0x0000, 0x5c75, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5c71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3360,
+ 0x4349, 0x0000, 0x0000, 0x0000, 0x5c7c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c7a, 0x3869, 0x0000,
+ 0x5c79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d21,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5b58, 0x0000, 0x0000, 0x0000,
+ 0x5c7b, 0x0000, 0x5c7d, 0x5c7e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5d2c, 0x0000, 0x5d28, 0x0000, 0x5b6d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d27, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5d26, 0x0000, 0x0000, 0x5d23, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c6a, 0x5d25, 0x5d24, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5d2a, 0x0000, 0x4f26, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5d2d, 0x367b, 0x0000, 0x0000, 0x5d29, 0x5d2b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4827, 0x0000, 0x5d2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5d32, 0x5d2f, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_6b[] = {
+ /* 0x6b00 - 0x6bff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d73, 0x5d30, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5d33, 0x0000, 0x0000, 0x0000, 0x5d34, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3135, 0x0000, 0x5d36,
+ 0x3767, 0x3c21, 0x0000, 0x3655, 0x0000, 0x0000, 0x0000, 0x3224,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d38,
+ 0x5d37, 0x5d3a, 0x353d, 0x0000, 0x0000, 0x3656, 0x343e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d3d, 0x0000, 0x0000, 0x0000, 0x5d3c,
+ 0x0000, 0x5d3e, 0x0000, 0x0000, 0x324e, 0x0000, 0x4337, 0x0000,
+ 0x5d3f, 0x0000, 0x0000, 0x343f, 0x5d41, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5d40, 0x0000, 0x5d42, 0x0000, 0x0000, 0x0000, 0x5d43,
+ 0x0000, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x0000, 0x4970, 0x0000,
+ 0x0000, 0x4a62, 0x4f44, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b75,
+ 0x0000, 0x0000, 0x0000, 0x3a50, 0x4e72, 0x0000, 0x0000, 0x0000,
+ 0x5d45, 0x5d46, 0x0000, 0x3b60, 0x0000, 0x0000, 0x0000, 0x5d47,
+ 0x5d48, 0x0000, 0x0000, 0x5d4a, 0x5d49, 0x0000, 0x4b58, 0x0000,
+ 0x0000, 0x3d5e, 0x3c6c, 0x3b44, 0x0000, 0x5d4b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4d, 0x3f23, 0x0000,
+ 0x5d4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5d50, 0x5d51, 0x0000, 0x0000, 0x0000, 0x5d52,
+ 0x0000, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x0000, 0x5d56,
+ 0x0000, 0x0000, 0x3b26, 0x334c, 0x5d57, 0x0000, 0x0000, 0x4542,
+ 0x544c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3523, 0x5d58, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d59, 0x0000, 0x4a6c, 0x4b68, 0x0000,
+ 0x0000, 0x0000, 0x4647, 0x5d5a, 0x4866, 0x0000, 0x0000, 0x0000,
+ 0x487b, 0x0000, 0x0000, 0x4c53, 0x0000, 0x0000, 0x0000, 0x5d5b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d5d, 0x5d5c, 0x0000, 0x0000, 0x5d5f,
+ 0x0000, 0x0000, 0x0000, 0x5d5e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_6c[] = {
+ /* 0x6c00 - 0x6cff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5d61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b61,
+ 0x0000, 0x4c31, 0x0000, 0x5d62, 0x5d63, 0x0000, 0x0000, 0x3524,
+ 0x0000, 0x0000, 0x0000, 0x5d64, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d66, 0x5d65, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f65, 0x0000, 0x0000, 0x4939,
+ 0x314a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4845, 0x0000,
+ 0x4475, 0x3d41, 0x3561, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4846, 0x0000,
+ 0x3c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d68, 0x0000, 0x3440,
+ 0x0000, 0x0000, 0x3178, 0x0000, 0x0000, 0x4672, 0x5d67, 0x393e,
+ 0x4353, 0x0000, 0x5d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5d71, 0x0000, 0x5d6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4241, 0x0000, 0x3562, 0x5d72, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3768, 0x0000, 0x0000, 0x3525, 0x5d70, 0x0000,
+ 0x0000, 0x5d6e, 0x5d6b, 0x4d60, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4440, 0x0000, 0x0000, 0x0000, 0x4659, 0x5d6c, 0x0000, 0x0000,
+ 0x5d74, 0x0000, 0x5d73, 0x3723, 0x0000, 0x0000, 0x322d, 0x0000,
+ 0x0000, 0x3a3b, 0x5d6d, 0x5d6f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4b57, 0x4274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4b77, 0x0000, 0x0000, 0x5d7c, 0x0000,
+ 0x0000, 0x5d7d, 0x0000, 0x324f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168,
+ 0x0000, 0x3637, 0x0000, 0x0000, 0x5d75, 0x5d7a, 0x0000, 0x0000,
+ 0x0000, 0x4074, 0x4771, 0x0000, 0x4867, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d77, 0x0000, 0x4b21, 0x0000, 0x5d79,
+ 0x0000, 0x5e24, 0x0000, 0x5e22, 0x0000, 0x5d7b, 0x0000, 0x0000,
+ 0x0000, 0x4b22, 0x4748, 0x3563, 0x0000, 0x4525, 0x0000, 0x0000,
+ 0x436d, 0x0000, 0x5e25, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e23,
+ 0x4259, 0x5d76, 0x0000, 0x314b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_6d[] = {
+ /* 0x6d00 - 0x6dff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4d4e, 0x5e30, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5e2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4076,
+ 0x0000, 0x5e2c, 0x0000, 0x4d6c, 0x0000, 0x0000, 0x4636, 0x5e26,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4445, 0x0000, 0x0000,
+ 0x0000, 0x314c, 0x393f, 0x5e29, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3d27, 0x5e2e, 0x0000, 0x5e2d, 0x5e28, 0x0000,
+ 0x5e2b, 0x0000, 0x0000, 0x3368, 0x0000, 0x5e2a, 0x4749, 0x0000,
+ 0x0000, 0x4e2e, 0x0000, 0x0000, 0x3e74, 0x4075, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5e36, 0x5e34, 0x0000, 0x494d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e31, 0x5e33, 0x0000, 0x313a, 0x0000,
+ 0x0000, 0x3940, 0x4f32, 0x0000, 0x333d, 0x0000, 0x4962, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d61, 0x0000, 0x0000, 0x3324,
+ 0x3f3b, 0x5e35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e3a, 0x0000, 0x0000,
+ 0x3e43, 0x0000, 0x0000, 0x0000, 0x4d30, 0x0000, 0x5e37, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e32, 0x0000, 0x5e38, 0x0000, 0x0000,
+ 0x0000, 0x4e5e, 0x0000, 0x4573, 0x4642, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3336,
+ 0x0000, 0x0000, 0x3155, 0x0000, 0x0000, 0x5e3e, 0x0000, 0x0000,
+ 0x5e41, 0x0000, 0x0000, 0x0000, 0x4e43, 0x0000, 0x0000, 0x0000,
+ 0x4d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e48, 0x5e42, 0x5e3f,
+ 0x0000, 0x0000, 0x0000, 0x4e54, 0x5e45, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3d4a, 0x5e47, 0x0000, 0x0000, 0x5e4c, 0x0000, 0x0000,
+ 0x4571, 0x5e4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e44, 0x0000,
+ 0x0000, 0x4338, 0x0000, 0x0000, 0x5e4b, 0x0000, 0x5e40, 0x0000,
+ 0x5e46, 0x0000, 0x5e4d, 0x307c, 0x5e43, 0x0000, 0x5e4e, 0x0000,
+ 0x0000, 0x3f3c, 0x0000, 0x3d5f, 0x0000, 0x4a25, 0x0000, 0x3a2e,
+ 0x0000, 0x5e3b, 0x5e49, 0x453a, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_6e[] = {
+ /* 0x6e00 - 0x6eff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4036, 0x0000, 0x3369,
+ 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x374c, 0x0000, 0x5e3c, 0x0000, 0x0000,
+ 0x0000, 0x5e52, 0x3d6d, 0x383a, 0x0000, 0x5e61, 0x0000, 0x5e5b,
+ 0x3574, 0x454f, 0x0000, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0x0000,
+ 0x0000, 0x3239, 0x0000, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5e62, 0x0000, 0x5e5d, 0x0000, 0x0000, 0x0000, 0x5e55, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e5c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c2b, 0x0000, 0x0000, 0x5e5a, 0x5e5e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3850, 0x0000,
+ 0x3e45, 0x0000, 0x0000, 0x4339, 0x0000, 0x0000, 0x0000, 0x5e54,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d2f,
+ 0x0000, 0x0000, 0x0000, 0x5e57, 0x0000, 0x0000, 0x5e50, 0x4572,
+ 0x0000, 0x0000, 0x5e53, 0x0000, 0x0000, 0x0000, 0x5e59, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f51, 0x3c3e,
+ 0x4b7e, 0x0000, 0x5e63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x482e, 0x0000, 0x0000, 0x5e6f,
+ 0x383b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d60, 0x0000,
+ 0x5e65, 0x0000, 0x0000, 0x0000, 0x4e2f, 0x3942, 0x0000, 0x5e72,
+ 0x0000, 0x0000, 0x306e, 0x0000, 0x0000, 0x5e70, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5e64, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e6a,
+ 0x0000, 0x0000, 0x5e6c, 0x0000, 0x0000, 0x0000, 0x4d4f, 0x5e67,
+ 0x0000, 0x0000, 0x452e, 0x0000, 0x0000, 0x5e69, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5e71, 0x0000, 0x5e6b, 0x4c47, 0x0000, 0x0000,
+ 0x0000, 0x5e66, 0x0000, 0x3c22, 0x5e7e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x336a, 0x0000, 0x5e68, 0x5e6d, 0x5e6e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x426c, 0x425a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e76, 0x0000, 0x0000, 0x5e7c,
+ 0x0000, 0x0000, 0x5e7a, 0x0000, 0x4529, 0x0000, 0x0000, 0x5f23,
+ 0x5e77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e78, 0x5e60,
+};
+
+static unsigned short const unicode_to_jisx0208_6f[] = {
+ /* 0x6f00 - 0x6fff */
+ 0x0000, 0x3579, 0x493a, 0x0000, 0x0000, 0x0000, 0x3c3f, 0x0000,
+ 0x0000, 0x3977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f33,
+ 0x0000, 0x5e74, 0x0000, 0x5f22, 0x3169, 0x4166, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4779, 0x0000, 0x3441, 0x4e7a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4c21, 0x4452, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5e7b, 0x5e7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f21, 0x5e79,
+ 0x0000, 0x5e73, 0x0000, 0x0000, 0x0000, 0x3443, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3769, 0x0000, 0x0000, 0x0000,
+ 0x5f2f, 0x0000, 0x0000, 0x5f2a, 0x4078, 0x0000, 0x0000, 0x3363,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d61, 0x0000, 0x5f33, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f2c, 0x442c, 0x5f29,
+ 0x4459, 0x0000, 0x0000, 0x0000, 0x5f4c, 0x0000, 0x0000, 0x0000,
+ 0x5f26, 0x0000, 0x5f25, 0x0000, 0x5f2e, 0x0000, 0x0000, 0x0000,
+ 0x5f28, 0x5f27, 0x5f2d, 0x0000, 0x4021, 0x0000, 0x5f24, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f30, 0x0000,
+ 0x0000, 0x5f31, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3442,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f36, 0x0000, 0x5f35, 0x5f37, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5f3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4543, 0x0000, 0x5f34, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3763, 0x4279, 0x5f32, 0x473b, 0x0000, 0x0000, 0x5f39, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f3e, 0x5f3c, 0x0000, 0x0000,
+ 0x5f3f, 0x0000, 0x0000, 0x5f42, 0x0000, 0x0000, 0x0000, 0x5f3b,
+ 0x396a, 0x4728, 0x0000, 0x0000, 0x5e39, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4d74, 0x5f3d, 0x0000, 0x5f41, 0x4275,
+ 0x0000, 0x5f40, 0x0000, 0x5f2b, 0x0000, 0x0000, 0x6f69, 0x0000,
+ 0x0000, 0x0000, 0x5f45, 0x0000, 0x0000, 0x0000, 0x5f49, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_70[] = {
+ /* 0x7000 - 0x70ff */
+ 0x0000, 0x5f47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f43, 0x0000, 0x5f44, 0x0000, 0x0000, 0x0000, 0x5f48,
+ 0x0000, 0x5f46, 0x0000, 0x0000, 0x0000, 0x494e, 0x0000, 0x0000,
+ 0x5f4e, 0x0000, 0x5f4b, 0x5f4a, 0x0000, 0x5f4d, 0x4654, 0x5f4f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4375, 0x426d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4025, 0x0000, 0x0000, 0x0000,
+ 0x5f50, 0x0000, 0x5f52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f51, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e75, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4667, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5f54, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3250, 0x0000, 0x0000, 0x0000, 0x4574,
+ 0x3325, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3564, 0x0000, 0x0000, 0x0000, 0x3c5e, 0x3a52, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4f27, 0x3f66, 0x0000, 0x0000, 0x0000, 0x316a, 0x0000,
+ 0x0000, 0x0000, 0x5f56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f59, 0x433a, 0x5f5c, 0x5f57,
+ 0x0000, 0x0000, 0x0000, 0x5f5b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5f5a, 0x4540, 0x3059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4e75, 0x0000, 0x0000, 0x5f5e, 0x0000, 0x0000, 0x0000, 0x3128,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f60, 0x0000, 0x0000, 0x0000, 0x5f5f, 0x0000, 0x5f5d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f58, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4b23, 0x0000, 0x0000, 0x0000, 0x5f62, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_71[] = {
+ /* 0x7100 - 0x71ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x316b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f64, 0x4a32, 0x0000, 0x5f63, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4c35, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e47, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4133, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3e46, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4e7b, 0x0000, 0x0000, 0x5f6a, 0x0000, 0x4079, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f66, 0x5f6b, 0x0000,
+ 0x0000, 0x316c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5f69, 0x0000, 0x4761, 0x5f65, 0x5f68, 0x3e48,
+ 0x0000, 0x4851, 0x0000, 0x0000, 0x5f6c, 0x0000, 0x3c51, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x407a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f6f, 0x0000, 0x0000, 0x0000,
+ 0x5f67, 0x0000, 0x3727, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f6d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d50, 0x5f70, 0x0000, 0x0000,
+ 0x0000, 0x7426, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d4f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5f71, 0x0000, 0x0000, 0x0000, 0x5f72, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x472e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f74, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f75, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4733, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4575, 0x5f77, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f79, 0x0000,
+ 0x4e55, 0x0000, 0x5f76, 0x0000, 0x5f78, 0x316d, 0x0000, 0x5f73,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x535b,
+ 0x5f7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x4167, 0x3b38, 0x5f7c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f7b, 0x3f24, 0x5259, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f7d, 0x0000, 0x0000,
+ 0x0000, 0x6021, 0x0000, 0x5f6e, 0x5f7e, 0x0000, 0x0000, 0x6022,
+};
+
+static unsigned short const unicode_to_jisx0208_72[] = {
+ /* 0x7200 - 0x72ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x477a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6023, 0x0000, 0x0000,
+ 0x6024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6025, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6026, 0x0000, 0x445e, 0x0000, 0x6028, 0x6027, 0x0000, 0x0000,
+ 0x6029, 0x0000, 0x602a, 0x0000, 0x0000, 0x3c5f, 0x4963, 0x0000,
+ 0x0000, 0x0000, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d,
+ 0x602e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x602f, 0x4a52,
+ 0x4847, 0x0000, 0x0000, 0x6030, 0x4757, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x442d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6031, 0x3267, 0x0000, 0x356d, 0x0000, 0x4c46, 0x0000, 0x4c36,
+ 0x0000, 0x3234, 0x4f34, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b52,
+ 0x0000, 0x4a2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4037, 0x0000, 0x6032, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4643, 0x0000, 0x0000, 0x0000, 0x3823, 0x6033, 0x0000,
+ 0x3a54, 0x6035, 0x6034, 0x0000, 0x0000, 0x0000, 0x0000, 0x6036,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6037, 0x0000, 0x0000, 0x0000, 0x6038, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x353e, 0x0000, 0x6039, 0x0000, 0x0000, 0x0000, 0x0000, 0x603a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3824, 0x0000, 0x0000, 0x4848,
+ 0x0000, 0x0000, 0x603c, 0x0000, 0x0000, 0x0000, 0x3e75, 0x0000,
+ 0x0000, 0x603b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3638, 0x603d, 0x603f, 0x0000, 0x603e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6040, 0x0000,
+ 0x3851, 0x0000, 0x6041, 0x0000, 0x0000, 0x0000, 0x0000, 0x3669,
+ 0x0000, 0x4140, 0x0000, 0x397d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6043, 0x6044, 0x6042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c6d, 0x0000, 0x0000, 0x4648, 0x3639, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6046,
+ 0x432c, 0x6045, 0x0000, 0x0000, 0x4f35, 0x4762, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_73[] = {
+ /* 0x7300 - 0x73ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x604b, 0x6048,
+ 0x0000, 0x0000, 0x0000, 0x4c54, 0x604a, 0x604c, 0x0000, 0x4e44,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6050, 0x0000, 0x0000,
+ 0x0000, 0x604f, 0x4376, 0x472d, 0x0000, 0x0000, 0x3825, 0x604e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x604d, 0x0000, 0x4d31, 0x4d32,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6051, 0x316e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3976, 0x3b62, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6052, 0x6053,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6055,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3d43, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6057, 0x0000, 0x6056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6058, 0x0000, 0x334d, 0x0000, 0x0000, 0x605a, 0x0000, 0x0000,
+ 0x6059, 0x0000, 0x605c, 0x605b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x383c, 0x0000, 0x0000, 0x4e28,
+ 0x0000, 0x364c, 0x0000, 0x3226, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x366a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3461, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4e68, 0x605e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6060, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6061, 0x0000, 0x3251, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x605d, 0x0000, 0x3b39, 0x0000, 0x0000, 0x4441, 0x605f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6064, 0x0000,
+ 0x3c6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6062, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x373e, 0x0000, 0x0000, 0x4849, 0x6063, 0x0000,
+ 0x0000, 0x607e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x383d, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_74[] = {
+ /* 0x7400 - 0x74ff */
+ 0x0000, 0x0000, 0x0000, 0x3565, 0x0000, 0x6066, 0x4d7d, 0x0000,
+ 0x0000, 0x4e30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4276, 0x0000, 0x0000, 0x6068, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0x0000,
+ 0x0000, 0x0000, 0x606b, 0x0000, 0x0000, 0x0000, 0x0000, 0x606d,
+ 0x0000, 0x6070, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x606c, 0x0000, 0x0000,
+ 0x0000, 0x606f, 0x386a, 0x314d, 0x6071, 0x0000, 0x3f70, 0x606e,
+ 0x4e5c, 0x0000, 0x0000, 0x6074, 0x7424, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6072, 0x6075, 0x0000, 0x0000, 0x0000, 0x0000, 0x6067,
+ 0x6073, 0x0000, 0x0000, 0x3a3c, 0x0000, 0x0000, 0x6076, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6077, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4d7e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6078, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6079, 0x0000,
+ 0x0000, 0x0000, 0x6065, 0x0000, 0x0000, 0x0000, 0x0000, 0x607a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3444, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c25, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x607b, 0x0000, 0x0000, 0x0000, 0x0000, 0x607c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x607d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x313b, 0x0000, 0x0000, 0x0000,
+ 0x6121, 0x0000, 0x493b, 0x6122, 0x0000, 0x0000, 0x3424, 0x6123,
+ 0x0000, 0x6124, 0x0000, 0x0000, 0x0000, 0x0000, 0x6125, 0x0000,
+ 0x6127, 0x6128, 0x6126, 0x0000, 0x0000, 0x0000, 0x4953, 0x612a,
+ 0x6129, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_75[] = {
+ /* 0x7500 - 0x75ff */
+ 0x0000, 0x0000, 0x0000, 0x612c, 0x612b, 0x612d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x612e, 0x6130, 0x612f, 0x0000,
+ 0x0000, 0x3979, 0x0000, 0x6132, 0x0000, 0x6131, 0x0000, 0x0000,
+ 0x3445, 0x0000, 0x3f53, 0x0000, 0x453c, 0x0000, 0x6133, 0x4038,
+ 0x0000, 0x0000, 0x0000, 0x3b3a, 0x0000, 0x3179, 0x6134, 0x0000,
+ 0x4d51, 0x0000, 0x0000, 0x4a63, 0x6135, 0x0000, 0x0000, 0x0000,
+ 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x0000, 0x0000, 0x0000, 0x434b,
+ 0x5234, 0x0000, 0x442e, 0x3268, 0x6136, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6137, 0x0000, 0x613c, 0x0000,
+ 0x0000, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0x0000, 0x305a,
+ 0x0000, 0x482a, 0x0000, 0x0000, 0x484a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x0000, 0x0000,
+ 0x482b, 0x0000, 0x492d, 0x0000, 0x613f, 0x4e2c, 0x374d, 0x6140,
+ 0x0000, 0x613e, 0x4856, 0x6141, 0x0000, 0x6142, 0x0000, 0x0000,
+ 0x305b, 0x0000, 0x0000, 0x3e76, 0x6147, 0x0000, 0x6144, 0x466d,
+ 0x6143, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3526,
+ 0x0000, 0x0000, 0x614a, 0x0000, 0x0000, 0x0000, 0x6145, 0x6146,
+ 0x0000, 0x6149, 0x6148, 0x4925, 0x0000, 0x0000, 0x4142, 0x4141,
+ 0x0000, 0x353f, 0x0000, 0x0000, 0x614b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x614c, 0x0000, 0x0000, 0x614d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x614f, 0x0000, 0x614e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3156, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6157, 0x4868, 0x6151, 0x0000, 0x6153, 0x0000, 0x0000,
+ 0x6155, 0x3f3e, 0x0000, 0x0000, 0x6156, 0x6154, 0x3c40, 0x0000,
+ 0x0000, 0x0000, 0x6150, 0x6152, 0x0000, 0x4942, 0x0000, 0x3e49,
+ 0x0000, 0x0000, 0x6159, 0x0000, 0x0000, 0x6158, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x615a, 0x0000, 0x3c26, 0x3a2f, 0x0000, 0x0000,
+ 0x4577, 0x615b, 0x0000, 0x444b, 0x0000, 0x0000, 0x615d, 0x0000,
+ 0x0000, 0x0000, 0x4e21, 0x615c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6162, 0x0000, 0x6164, 0x6165, 0x4354, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6163, 0x0000, 0x6160, 0x0000, 0x615e, 0x615f,
+};
+
+static unsigned short const unicode_to_jisx0208_76[] = {
+ /* 0x7600 - 0x76ff */
+ 0x0000, 0x6161, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6168, 0x0000, 0x6166, 0x0000, 0x6167, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6169,
+ 0x616b, 0x616c, 0x616d, 0x0000, 0x616e, 0x0000, 0x0000, 0x616a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6170, 0x0000, 0x0000, 0x0000, 0x616f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6171, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4e45, 0x0000, 0x0000, 0x0000, 0x6174, 0x6172,
+ 0x6173, 0x0000, 0x0000, 0x0000, 0x3462, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c7e, 0x0000, 0x0000, 0x0000, 0x4a4a, 0x0000,
+ 0x6176, 0x0000, 0x0000, 0x0000, 0x6175, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6177, 0x6178, 0x0000, 0x0000, 0x0000, 0x0000, 0x617c,
+ 0x6179, 0x617a, 0x617b, 0x0000, 0x617d, 0x0000, 0x0000, 0x0000,
+ 0x617e, 0x0000, 0x6221, 0x0000, 0x0000, 0x0000, 0x6222, 0x0000,
+ 0x6223, 0x0000, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, 0x0000,
+ 0x6225, 0x0000, 0x0000, 0x6226, 0x452a, 0x0000, 0x3327, 0x3944,
+ 0x6227, 0x0000, 0x0000, 0x6228, 0x0000, 0x0000, 0x6229, 0x0000,
+ 0x3b29, 0x0000, 0x0000, 0x622b, 0x0000, 0x0000, 0x622a, 0x0000,
+ 0x0000, 0x622c, 0x622d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4869, 0x0000,
+ 0x622e, 0x0000, 0x0000, 0x0000, 0x622f, 0x0000, 0x0000, 0x7369,
+ 0x6230, 0x6231, 0x6232, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b2e,
+ 0x0000, 0x0000, 0x6233, 0x4756, 0x0000, 0x0000, 0x4b5f, 0x0000,
+ 0x314e, 0x0000, 0x3157, 0x0000, 0x0000, 0x6234, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6236, 0x0000, 0x0000, 0x0000, 0x6235, 0x4570,
+ 0x0000, 0x0000, 0x0000, 0x4039, 0x5d39, 0x0000, 0x6237, 0x4c41,
+ 0x0000, 0x6238, 0x0000, 0x3446, 0x4857, 0x6239, 0x0000, 0x623a,
+ 0x0000, 0x0000, 0x623b, 0x0000, 0x0000, 0x0000, 0x4c5c, 0x0000,
+ 0x0000, 0x0000, 0x4c55, 0x0000, 0x443e, 0x0000, 0x0000, 0x0000,
+ 0x416a, 0x0000, 0x0000, 0x623d, 0x0000, 0x0000, 0x3d62, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_77[] = {
+ /* 0x7700 - 0x77ff */
+ 0x0000, 0x3e4a, 0x0000, 0x0000, 0x6240, 0x0000, 0x0000, 0x623f,
+ 0x623e, 0x487d, 0x0000, 0x3447, 0x3829, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6246, 0x0000, 0x0000, 0x6243, 0x3f3f,
+ 0x4c32, 0x0000, 0x0000, 0x0000, 0x6242, 0x6244, 0x6245, 0x0000,
+ 0x0000, 0x6241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6247,
+ 0x6248, 0x0000, 0x442f, 0x0000, 0x3463, 0x0000, 0x0000, 0x0000,
+ 0x4365, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6249,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x624a, 0x624d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3f67, 0x0000, 0x4644, 0x0000, 0x624e, 0x4b53, 0x0000,
+ 0x624b, 0x0000, 0x0000, 0x624c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6251, 0x0000, 0x0000, 0x0000, 0x0000, 0x6250, 0x624f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6253, 0x0000, 0x0000, 0x6252, 0x0000,
+ 0x0000, 0x6254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6256, 0x0000,
+ 0x6255, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a4d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d56, 0x4e46, 0x0000, 0x0000,
+ 0x6257, 0x0000, 0x0000, 0x4637, 0x0000, 0x0000, 0x6258, 0x0000,
+ 0x0000, 0x6259, 0x0000, 0x625d, 0x625b, 0x625c, 0x0000, 0x625a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6260,
+ 0x0000, 0x0000, 0x6261, 0x4c37, 0x6262, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c70, 0x6263, 0x0000, 0x434e, 0x0000, 0x476a,
+ 0x0000, 0x366b, 0x0000, 0x0000, 0x0000, 0x433b, 0x6264, 0x363a,
+ 0x0000, 0x0000, 0x0000, 0x4050, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6265, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_78[] = {
+ /* 0x7800 - 0x78ff */
+ 0x0000, 0x0000, 0x3a3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6266, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6267, 0x0000, 0x3826, 0x3a55, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6269, 0x0000, 0x0000, 0x0000, 0x0000, 0x4556, 0x3a56, 0x354e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4b24, 0x0000, 0x474b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4557, 0x0000, 0x0000, 0x0000, 0x0000, 0x395c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x626b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e4b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4e32, 0x3945, 0x0000, 0x0000, 0x3827,
+ 0x0000, 0x0000, 0x4823, 0x0000, 0x626d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x626f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x386b, 0x0000, 0x0000, 0x0000, 0x0000, 0x626e, 0x4476,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6271, 0x3337, 0x626c, 0x0000,
+ 0x0000, 0x486a, 0x0000, 0x3130, 0x0000, 0x3a6c, 0x0000, 0x4f52,
+ 0x0000, 0x0000, 0x6270, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6272, 0x0000, 0x0000, 0x0000, 0x4a4b,
+ 0x0000, 0x4059, 0x6274, 0x0000, 0x0000, 0x0000, 0x0000, 0x6275,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6273, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x334e, 0x0000, 0x627b, 0x0000, 0x627a, 0x0000,
+ 0x0000, 0x3c27, 0x0000, 0x0000, 0x0000, 0x627c, 0x6277, 0x0000,
+ 0x0000, 0x0000, 0x627d, 0x6278, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4858, 0x6276, 0x0000, 0x0000, 0x6279, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6322, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6321,
+ 0x4b61, 0x0000, 0x0000, 0x0000, 0x627e, 0x0000, 0x0000, 0x306b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6324, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6323, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_79[] = {
+ /* 0x7900 - 0x79ff */
+ 0x0000, 0x3e4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6325,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4143, 0x0000,
+ 0x0000, 0x6327, 0x6326, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6268, 0x0000,
+ 0x0000, 0x0000, 0x626a, 0x632a, 0x6329, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3c28, 0x0000, 0x4e69, 0x0000, 0x3c52, 0x0000,
+ 0x632b, 0x3737, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3540,
+ 0x3527, 0x3b63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4d34, 0x0000, 0x0000, 0x6331, 0x0000, 0x6330, 0x4144, 0x632d,
+ 0x0000, 0x0000, 0x632f, 0x0000, 0x0000, 0x3d4b, 0x3f40, 0x632e,
+ 0x632c, 0x0000, 0x472a, 0x0000, 0x0000, 0x3e4d, 0x0000, 0x0000,
+ 0x493c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a57, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4578,
+ 0x0000, 0x0000, 0x6332, 0x0000, 0x0000, 0x0000, 0x0000, 0x6333,
+ 0x6349, 0x3658, 0x0000, 0x0000, 0x4f3d, 0x4135, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6334, 0x0000, 0x0000, 0x3252, 0x4477, 0x4a21,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6335, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x357a, 0x6336,
+ 0x0000, 0x0000, 0x6338, 0x0000, 0x0000, 0x0000, 0x6339, 0x0000,
+ 0x4729, 0x0000, 0x0000, 0x633a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x633b, 0x633c, 0x0000, 0x0000, 0x3659, 0x3253, 0x4645,
+ 0x3d28, 0x3b64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x633d, 0x0000, 0x3d29, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x324a, 0x4943, 0x0000, 0x0000, 0x633e, 0x0000, 0x0000,
+ 0x486b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4145,
+ 0x0000, 0x6341, 0x0000, 0x6342, 0x4769, 0x0000, 0x3f41, 0x633f,
+ 0x0000, 0x4361, 0x0000, 0x0000, 0x6340, 0x0000, 0x0000, 0x0000,
+ 0x3e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x305c, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_7a[] = {
+ /* 0x7a00 - 0x7aff */
+ 0x3529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6343, 0x0000, 0x0000, 0x4478, 0x0000, 0x6344, 0x4047, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4c2d, 0x0000, 0x0000, 0x4923,
+ 0x6345, 0x6346, 0x4355, 0x0000, 0x4e47, 0x0000, 0x0000, 0x6348,
+ 0x6347, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c6f, 0x0000,
+ 0x0000, 0x634a, 0x3070, 0x0000, 0x0000, 0x0000, 0x0000, 0x634d,
+ 0x0000, 0x0000, 0x0000, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946,
+ 0x3972, 0x0000, 0x4a66, 0x634e, 0x0000, 0x0000, 0x4b54, 0x0000,
+ 0x0000, 0x6350, 0x0000, 0x0000, 0x0000, 0x4051, 0x314f, 0x323a,
+ 0x302c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x634f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6351, 0x6352, 0x3e77, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6353, 0x0000, 0x334f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6355, 0x0000, 0x0000, 0x0000, 0x376a, 0x0000, 0x3566, 0x0000,
+ 0x0000, 0x6356, 0x3675, 0x0000, 0x0000, 0x6357, 0x0000, 0x407c,
+ 0x0000, 0x464d, 0x0000, 0x4060, 0x3a75, 0x0000, 0x0000, 0x0000,
+ 0x6358, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4362, 0x416b, 0x0000, 0x635a, 0x635c, 0x6359,
+ 0x635b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3722,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x635d, 0x3726, 0x0000, 0x0000, 0x0000, 0x3567, 0x4d52,
+ 0x635f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6360, 0x0000,
+ 0x0000, 0x0000, 0x312e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6363,
+ 0x0000, 0x0000, 0x0000, 0x3376, 0x6362, 0x6361, 0x0000, 0x6365,
+ 0x635e, 0x0000, 0x6366, 0x4e29, 0x0000, 0x6367, 0x0000, 0x6368,
+ 0x0000, 0x0000, 0x5474, 0x636a, 0x0000, 0x6369, 0x0000, 0x0000,
+ 0x0000, 0x636b, 0x636c, 0x0000, 0x4e35, 0x636d, 0x0000, 0x706f,
+ 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x0000, 0x4638, 0x6370, 0x0000,
+ 0x0000, 0x0000, 0x4328, 0x0000, 0x0000, 0x6371, 0x0000, 0x433c,
+ 0x6372, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3625, 0x0000,
+ 0x513f, 0x435d, 0x3c33, 0x0000, 0x0000, 0x0000, 0x0000, 0x3448,
+};
+
+static unsigned short const unicode_to_jisx0208_7b[] = {
+ /* 0x7b00 - 0x7bff */
+ 0x0000, 0x0000, 0x6373, 0x0000, 0x6422, 0x0000, 0x6376, 0x0000,
+ 0x3568, 0x0000, 0x6375, 0x6424, 0x0000, 0x0000, 0x0000, 0x6374,
+ 0x0000, 0x3e50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6378, 0x6379, 0x0000, 0x452b, 0x0000, 0x0000, 0x637a, 0x0000,
+ 0x335e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f5a, 0x4964, 0x0000,
+ 0x637c, 0x0000, 0x0000, 0x0000, 0x4268, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6377, 0x0000, 0x637b, 0x637d, 0x0000,
+ 0x0000, 0x3a7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6426, 0x492e, 0x0000,
+ 0x4826, 0x4579, 0x0000, 0x365a, 0x6425, 0x6423, 0x0000, 0x4835,
+ 0x637e, 0x435e, 0x457b, 0x0000, 0x457a, 0x0000, 0x3a76, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6438, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6428, 0x0000, 0x642a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x642d, 0x0000, 0x642e, 0x0000,
+ 0x642b, 0x642c, 0x0000, 0x0000, 0x6429, 0x6427, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a4f, 0x3255,
+ 0x0000, 0x0000, 0x0000, 0x6435, 0x0000, 0x6432, 0x0000, 0x6437,
+ 0x0000, 0x0000, 0x6436, 0x0000, 0x4773, 0x4c27, 0x0000, 0x3b3b,
+ 0x6430, 0x6439, 0x6434, 0x0000, 0x6433, 0x642f, 0x0000, 0x6431,
+ 0x0000, 0x3449, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x433d, 0x0000, 0x0000, 0x407d, 0x0000, 0x0000,
+ 0x0000, 0x4822, 0x0000, 0x0000, 0x643e, 0x0000, 0x0000, 0x0000,
+ 0x4824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4061, 0x643b, 0x0000, 0x0000, 0x484f, 0x0000, 0x643f, 0x4a53,
+ 0x0000, 0x435b, 0x0000, 0x643a, 0x643c, 0x0000, 0x0000, 0x643d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6440, 0x0000, 0x0000,
+ 0x3c44, 0x0000, 0x0000, 0x0000, 0x4646, 0x6445, 0x6444, 0x0000,
+ 0x0000, 0x6441, 0x0000, 0x0000, 0x0000, 0x4f36, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x644a, 0x0000, 0x0000, 0x644e, 0x644b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_7c[] = {
+ /* 0x7c00 - 0x7cff */
+ 0x6447, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6448,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x644d, 0x0000, 0x0000,
+ 0x0000, 0x6442, 0x5255, 0x6449, 0x6443, 0x0000, 0x0000, 0x644c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6452,
+ 0x0000, 0x344a, 0x0000, 0x644f, 0x0000, 0x0000, 0x0000, 0x6450,
+ 0x0000, 0x0000, 0x6451, 0x6454, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6453,
+ 0x4876, 0x0000, 0x0000, 0x0000, 0x0000, 0x6455, 0x4e7c, 0x4a6d,
+ 0x645a, 0x0000, 0x0000, 0x6457, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6456, 0x4052, 0x0000, 0x6459,
+ 0x645b, 0x0000, 0x0000, 0x0000, 0x6458, 0x0000, 0x645f, 0x0000,
+ 0x645c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x645d,
+ 0x6446, 0x0000, 0x0000, 0x0000, 0x645e, 0x6460, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6461, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a46, 0x0000, 0x6462, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c62, 0x0000,
+ 0x0000, 0x364e, 0x3729, 0x6463, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a34, 0x0000, 0x3f68, 0x0000, 0x4c30, 0x0000, 0x0000,
+ 0x6464, 0x0000, 0x4e33, 0x0000, 0x0000, 0x4774, 0x0000, 0x4146,
+ 0x4734, 0x0000, 0x0000, 0x3d4d, 0x0000, 0x0000, 0x0000, 0x3040,
+ 0x0000, 0x6469, 0x6467, 0x0000, 0x6465, 0x3421, 0x0000, 0x3e51,
+ 0x646a, 0x0000, 0x0000, 0x6468, 0x0000, 0x6466, 0x646e, 0x0000,
+ 0x0000, 0x646d, 0x646c, 0x646b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x646f, 0x0000, 0x0000, 0x0000, 0x6470, 0x403a, 0x0000,
+ 0x6471, 0x0000, 0x6473, 0x0000, 0x0000, 0x6472, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3852, 0x0000, 0x0000, 0x0000, 0x4138, 0x0000,
+ 0x0000, 0x0000, 0x6475, 0x0000, 0x0000, 0x0000, 0x457c, 0x0000,
+ 0x6474, 0x0000, 0x0000, 0x0000, 0x6476, 0x0000, 0x4a35, 0x416c,
+ 0x3947, 0x0000, 0x6477, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e48,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6479,
+ 0x0000, 0x0000, 0x647a, 0x0000, 0x647b, 0x0000, 0x647c, 0x0000,
+ 0x3b65, 0x0000, 0x647d, 0x374f, 0x0000, 0x0000, 0x356a, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_7d[] = {
+ /* 0x7d00 - 0x7dff */
+ 0x352a, 0x0000, 0x6521, 0x0000, 0x4c73, 0x3948, 0x647e, 0x0000,
+ 0x0000, 0x0000, 0x6524, 0x4c66, 0x0000, 0x473c, 0x0000, 0x0000,
+ 0x4933, 0x0000, 0x0000, 0x0000, 0x3d63, 0x6523, 0x0000, 0x3c53,
+ 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x0000, 0x0000, 0x0000,
+ 0x4147, 0x4b42, 0x3a77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b67, 0x445d, 0x0000, 0x6527, 0x4e5f,
+ 0x3a59, 0x0000, 0x6528, 0x3f42, 0x0000, 0x652a, 0x0000, 0x0000,
+ 0x0000, 0x3e52, 0x3a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x6529,
+ 0x0000, 0x0000, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6526, 0x3750, 0x0000, 0x652e, 0x6532,
+ 0x376b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x652d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6536, 0x0000, 0x0000, 0x394a, 0x0000,
+ 0x0000, 0x4d6d, 0x303c, 0x6533, 0x0000, 0x0000, 0x356b, 0x0000,
+ 0x6530, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6531, 0x0000,
+ 0x0000, 0x457d, 0x652f, 0x652c, 0x0000, 0x3328, 0x4064, 0x0000,
+ 0x0000, 0x3828, 0x0000, 0x0000, 0x0000, 0x6538, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6537,
+ 0x0000, 0x0000, 0x0000, 0x6534, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3751, 0x4233, 0x6539, 0x416e, 0x0000, 0x0000, 0x6546,
+ 0x0000, 0x0000, 0x6542, 0x653c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543,
+ 0x6547, 0x394b, 0x4c56, 0x0000, 0x4456, 0x653d, 0x0000, 0x0000,
+ 0x6545, 0x0000, 0x653a, 0x433e, 0x0000, 0x653f, 0x303d, 0x4c4a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x653e,
+ 0x0000, 0x0000, 0x365b, 0x486c, 0x0000, 0x0000, 0x0000, 0x416d,
+ 0x0000, 0x4e50, 0x3d6f, 0x0000, 0x0000, 0x656e, 0x0000, 0x0000,
+ 0x6548, 0x0000, 0x407e, 0x0000, 0x6544, 0x6549, 0x654b, 0x0000,
+ 0x4479, 0x654e, 0x0000, 0x0000, 0x654a, 0x0000, 0x0000, 0x0000,
+ 0x4a54, 0x344b, 0x0000, 0x0000, 0x4c4b, 0x0000, 0x0000, 0x305e,
+ 0x0000, 0x0000, 0x654d, 0x0000, 0x4e7d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x654c, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_7e[] = {
+ /* 0x7e00 - 0x7eff */
+ 0x0000, 0x316f, 0x0000, 0x0000, 0x466c, 0x654f, 0x0000, 0x0000,
+ 0x0000, 0x6556, 0x6550, 0x6557, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x477b, 0x0000, 0x0000, 0x3c4a, 0x6555,
+ 0x0000, 0x6552, 0x6558, 0x6551, 0x0000, 0x0000, 0x3d44, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4b25, 0x0000, 0x0000, 0x3d4c, 0x0000,
+ 0x0000, 0x6554, 0x6560, 0x0000, 0x0000, 0x655c, 0x0000, 0x655f,
+ 0x0000, 0x655d, 0x6561, 0x655b, 0x0000, 0x6541, 0x4053, 0x0000,
+ 0x0000, 0x484b, 0x0000, 0x655e, 0x0000, 0x0000, 0x6559, 0x0000,
+ 0x0000, 0x0000, 0x4121, 0x3752, 0x0000, 0x3d2b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f25, 0x4136, 0x6564, 0x0000,
+ 0x0000, 0x6566, 0x6567, 0x0000, 0x0000, 0x6563, 0x6565, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x655a, 0x6562,
+ 0x0000, 0x656a, 0x6569, 0x0000, 0x0000, 0x4b7a, 0x0000, 0x0000,
+ 0x372b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6568, 0x0000, 0x656c, 0x656b, 0x656f, 0x0000, 0x6571,
+ 0x0000, 0x0000, 0x3b3c, 0x656d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6572, 0x6573, 0x0000, 0x0000, 0x6574, 0x0000, 0x657a, 0x453b,
+ 0x6576, 0x0000, 0x6575, 0x6577, 0x6578, 0x0000, 0x6579, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x657b, 0x657c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_7f[] = {
+ /* 0x7f00 - 0x7fff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x344c, 0x0000,
+ 0x657d, 0x0000, 0x657e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6621, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6622, 0x6623, 0x6624, 0x0000,
+ 0x6625, 0x6626, 0x0000, 0x0000, 0x6628, 0x6627, 0x0000, 0x0000,
+ 0x6629, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x662a,
+ 0x662b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x662e,
+ 0x662c, 0x662d, 0x3a61, 0x3753, 0x0000, 0x0000, 0x4356, 0x0000,
+ 0x4833, 0x0000, 0x3d70, 0x0000, 0x0000, 0x474d, 0x0000, 0x486d,
+ 0x662f, 0x586d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6630, 0x6632, 0x0000, 0x4d65, 0x6631, 0x6634,
+ 0x6633, 0x0000, 0x4d53, 0x0000, 0x6635, 0x0000, 0x487e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6636, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6639, 0x0000, 0x0000, 0x6638, 0x6637, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x663a, 0x3732, 0x0000, 0x0000, 0x0000,
+ 0x4122, 0x3541, 0x0000, 0x0000, 0x0000, 0x0000, 0x663e, 0x663b,
+ 0x0000, 0x0000, 0x663c, 0x0000, 0x0000, 0x0000, 0x663f, 0x0000,
+ 0x6640, 0x663d, 0x0000, 0x0000, 0x0000, 0x3129, 0x0000, 0x0000,
+ 0x0000, 0x3227, 0x0000, 0x0000, 0x0000, 0x6642, 0x6643, 0x0000,
+ 0x0000, 0x0000, 0x6644, 0x0000, 0x4d62, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3d2c, 0x0000, 0x6646, 0x6645, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3f69, 0x6647, 0x0000, 0x0000, 0x0000, 0x0000, 0x6648, 0x0000,
+ 0x0000, 0x6649, 0x0000, 0x3465, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x344d, 0x0000, 0x0000, 0x664a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x664b, 0x0000, 0x4b5d, 0x4d63, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_80[] = {
+ /* 0x8000 - 0x80ff */
+ 0x4d54, 0x4f37, 0x0000, 0x394d, 0x664e, 0x3c54, 0x664d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x664f, 0x3c29, 0x0000, 0x0000, 0x0000,
+ 0x4251, 0x0000, 0x6650, 0x0000, 0x0000, 0x394c, 0x0000, 0x4c57,
+ 0x6651, 0x6652, 0x0000, 0x0000, 0x6653, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6654, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6655, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c2a, 0x0000, 0x0000, 0x4c6d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6657, 0x0000, 0x433f, 0x0000, 0x6656,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6659, 0x0000,
+ 0x0000, 0x0000, 0x6658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x665a, 0x0000, 0x0000, 0x0000, 0x403b, 0x0000,
+ 0x665b, 0x0000, 0x665c, 0x0000, 0x0000, 0x0000, 0x4a39, 0x665d,
+ 0x0000, 0x416f, 0x665e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x665f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e7e,
+ 0x6662, 0x0000, 0x6661, 0x6660, 0x4430, 0x0000, 0x6663, 0x3f26,
+ 0x0000, 0x6664, 0x0000, 0x0000, 0x0000, 0x6665, 0x4f38, 0x6666,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6667, 0x6669, 0x6668, 0x4825,
+ 0x0000, 0x4679, 0x0000, 0x4f3e, 0x4829, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x666b, 0x0000, 0x0000, 0x3e53, 0x0000,
+ 0x492a, 0x0000, 0x666c, 0x666a, 0x0000, 0x344e, 0x0000, 0x0000,
+ 0x0000, 0x3854, 0x3b68, 0x0000, 0x0000, 0x486e, 0x0000, 0x0000,
+ 0x0000, 0x382a, 0x4b43, 0x0000, 0x666f, 0x666d, 0x0000, 0x394e,
+ 0x0000, 0x394f, 0x3069, 0x0000, 0x3a68, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x305f, 0x6674, 0x0000, 0x4340, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4758, 0x0000, 0x425b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6676, 0x0000,
+ 0x0000, 0x6672, 0x6675, 0x6670, 0x0000, 0x6673, 0x4b26, 0x0000,
+ 0x0000, 0x3855, 0x0000, 0x0000, 0x307d, 0x6671, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6678,
+ 0x0000, 0x6679, 0x0000, 0x0000, 0x4639, 0x0000, 0x0000, 0x0000,
+ 0x363b, 0x0000, 0x0000, 0x0000, 0x6726, 0x473d, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_81[] = {
+ /* 0x8100 - 0x81ff */
+ 0x0000, 0x0000, 0x3b69, 0x0000, 0x0000, 0x363c, 0x4048, 0x4f46,
+ 0x4c2e, 0x6677, 0x4054, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3553, 0x667a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x667c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x667b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667d,
+ 0x0000, 0x4326, 0x0000, 0x473e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4431, 0x0000, 0x0000, 0x0000, 0x0000, 0x6723, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6722, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x667e, 0x0000, 0x0000, 0x3f55, 0x0000,
+ 0x4965, 0x6725, 0x0000, 0x6724, 0x3950, 0x4f53, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6735,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6729, 0x672a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c70, 0x0000, 0x0000, 0x6728, 0x0000,
+ 0x3978, 0x6727, 0x0000, 0x0000, 0x672b, 0x0000, 0x0000, 0x0000,
+ 0x4432, 0x4a22, 0x4123, 0x0000, 0x0000, 0x0000, 0x0000, 0x425c,
+ 0x672f, 0x0000, 0x6730, 0x672c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x672d, 0x0000, 0x672e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3951,
+ 0x0000, 0x0000, 0x0000, 0x6736, 0x0000, 0x6732, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4966, 0x0000, 0x4b6c, 0x4928, 0x0000, 0x0000,
+ 0x6731, 0x0000, 0x0000, 0x6734, 0x6733, 0x0000, 0x0000, 0x0000,
+ 0x4b44, 0x6737, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6738, 0x0000, 0x0000, 0x4137, 0x0000, 0x6739, 0x0000, 0x0000,
+ 0x673b, 0x0000, 0x673f, 0x0000, 0x0000, 0x673c, 0x673a, 0x473f,
+ 0x673d, 0x0000, 0x673e, 0x0000, 0x0000, 0x0000, 0x3232, 0x0000,
+ 0x6745, 0x6740, 0x0000, 0x0000, 0x0000, 0x6741, 0x0000, 0x0000,
+ 0x0000, 0x6742, 0x0000, 0x4221, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6744, 0x6743, 0x6746, 0x0000, 0x0000, 0x0000, 0x0000, 0x6747,
+ 0x6748, 0x0000, 0x0000, 0x3f43, 0x0000, 0x3269, 0x0000, 0x6749,
+ 0x4e57, 0x0000, 0x3c2b, 0x0000, 0x0000, 0x3d2d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b6a, 0x4357, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x674a, 0x674b, 0x3131, 0x0000, 0x674c, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_82[] = {
+ /* 0x8200 - 0x82ff */
+ 0x0000, 0x674d, 0x674e, 0x0000, 0x0000, 0x674f, 0x0000, 0x6750,
+ 0x363d, 0x5a2a, 0x6751, 0x0000, 0x4065, 0x6752, 0x3c4b, 0x0000,
+ 0x6753, 0x0000, 0x5030, 0x0000, 0x0000, 0x0000, 0x6754, 0x4a5e,
+ 0x345c, 0x0000, 0x0000, 0x4124, 0x3d58, 0x0000, 0x4971, 0x3d2e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6755, 0x3952, 0x6756, 0x484c, 0x0000, 0x6764, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6758, 0x0000, 0x4249, 0x4775, 0x383f,
+ 0x6757, 0x4125, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6759, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x447a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x675b, 0x675a, 0x675d, 0x0000, 0x0000, 0x675c, 0x0000, 0x675e,
+ 0x0000, 0x0000, 0x6760, 0x0000, 0x675f, 0x0000, 0x344f, 0x0000,
+ 0x6761, 0x0000, 0x6762, 0x6763, 0x0000, 0x0000, 0x3a31, 0x4e49,
+ 0x0000, 0x6765, 0x3f27, 0x0000, 0x0000, 0x0000, 0x3170, 0x6766,
+ 0x6767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6768, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3072, 0x0000, 0x6769, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x676a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4967, 0x0000, 0x0000, 0x0000, 0x3c47, 0x0000, 0x676c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3329, 0x3032, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x676b, 0x676e, 0x474e, 0x0000, 0x3f44,
+ 0x0000, 0x3256, 0x0000, 0x4b27, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x375d, 0x365c, 0x0000, 0x676d, 0x0000, 0x326a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3423, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x0000, 0x0000, 0x4944,
+ 0x0000, 0x677e, 0x0000, 0x3257, 0x677c, 0x0000, 0x677a, 0x6771,
+ 0x0000, 0x676f, 0x0000, 0x6770, 0x0000, 0x3c63, 0x366c, 0x4377,
+ 0x0000, 0x0000, 0x0000, 0x4651, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3151, 0x0000, 0x6774, 0x6773, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6779, 0x6775, 0x6778, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_83[] = {
+ /* 0x8300 - 0x83ff */
+ 0x0000, 0x0000, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x0000,
+ 0x0000, 0x677d, 0x0000, 0x0000, 0x0000, 0x0000, 0x3754, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6823, 0x682c,
+ 0x682d, 0x0000, 0x0000, 0x0000, 0x302b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6834, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3071, 0x0000, 0x0000, 0x682b, 0x0000, 0x0000, 0x0000, 0x682a,
+ 0x0000, 0x6825, 0x6824, 0x0000, 0x6822, 0x6821, 0x4363, 0x0000,
+ 0x427b, 0x6827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6826, 0x0000, 0x0000, 0x0000, 0x0000, 0x6829, 0x0000, 0x0000,
+ 0x0000, 0x4170, 0x3755, 0x0000, 0x0000, 0x0000, 0x0000, 0x3141,
+ 0x6828, 0x0000, 0x3953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4171, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x683a, 0x0000, 0x683b, 0x0000, 0x3259,
+ 0x0000, 0x0000, 0x0000, 0x322e, 0x6838, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x682e, 0x0000, 0x6836,
+ 0x0000, 0x683d, 0x6837, 0x0000, 0x0000, 0x0000, 0x6835, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6776, 0x0000, 0x0000, 0x6833, 0x0000,
+ 0x0000, 0x0000, 0x682f, 0x0000, 0x0000, 0x0000, 0x3450, 0x6831,
+ 0x683c, 0x0000, 0x6832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x683e, 0x0000, 0x6830, 0x477c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4d69, 0x0000, 0x0000, 0x0000, 0x6839, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x684f, 0x0000, 0x0000,
+ 0x0000, 0x6847, 0x0000, 0x0000, 0x0000, 0x3f7b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3546, 0x0000, 0x365d, 0x0000, 0x6842, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x325b, 0x0000, 0x0000, 0x3e54, 0x0000,
+ 0x6845, 0x0000, 0x0000, 0x0000, 0x3a5a, 0x0000, 0x0000, 0x4551,
+ 0x684a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a6e, 0x0000, 0x6841, 0x0000, 0x0000, 0x0000, 0x325a,
+ 0x3856, 0x4929, 0x684b, 0x0000, 0x683f, 0x0000, 0x0000, 0x6848,
+ 0x0000, 0x0000, 0x0000, 0x6852, 0x0000, 0x6843, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_84[] = {
+ /* 0x8400 - 0x84ff */
+ 0x0000, 0x0000, 0x0000, 0x6844, 0x463a, 0x0000, 0x0000, 0x6849,
+ 0x0000, 0x0000, 0x0000, 0x6846, 0x4b28, 0x684c, 0x3060, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6840, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x684e, 0x0000, 0x684d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x476b, 0x6854, 0x0000, 0x685f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x337e, 0x0000, 0x0000, 0x0000, 0x6862, 0x0000, 0x0000,
+ 0x6850, 0x0000, 0x0000, 0x0000, 0x6855, 0x4d6e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x685e, 0x0000,
+ 0x0000, 0x4d55, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e2a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4378,
+ 0x0000, 0x0000, 0x0000, 0x336b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4972, 0x6864, 0x4621, 0x0000, 0x0000, 0x3031, 0x0000,
+ 0x0000, 0x685d, 0x0000, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860,
+ 0x0000, 0x472c, 0x0000, 0x0000, 0x0000, 0x302a, 0x0000, 0x6858,
+ 0x0000, 0x6861, 0x4978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x685c, 0x0000, 0x6857, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3e55, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3d2f, 0x0000, 0x0000, 0x0000, 0x3c2c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4c58, 0x0000, 0x0000, 0x4947, 0x0000, 0x0000, 0x6867,
+ 0x0000, 0x6870, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x685a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3377, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3e78, 0x6865, 0x0000, 0x686a, 0x4173, 0x0000, 0x0000, 0x6866,
+ 0x0000, 0x686d, 0x0000, 0x0000, 0x435f, 0x0000, 0x686e, 0x0000,
+ 0x0000, 0x4d56, 0x6863, 0x3338, 0x0000, 0x6869, 0x0000, 0x0000,
+ 0x686c, 0x4c2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x686f, 0x0000,
+ 0x0000, 0x6868, 0x686b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4b29, 0x0000, 0x4f21, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6873, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x687a, 0x0000, 0x0000, 0x6872,
+};
+
+static unsigned short const unicode_to_jisx0208_85[] = {
+ /* 0x8500 - 0x85ff */
+ 0x3c43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6851, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a4e, 0x0000, 0x4c22, 0x6879, 0x6878, 0x0000, 0x6874,
+ 0x6875, 0x0000, 0x3136, 0x0000, 0x0000, 0x0000, 0x0000, 0x6877,
+ 0x0000, 0x6871, 0x0000, 0x0000, 0x0000, 0x0000, 0x4455, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6876, 0x307e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4222, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a43, 0x0000, 0x0000,
+ 0x687b, 0x6921, 0x0000, 0x4859, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x687e, 0x3e56, 0x3c49, 0x6923, 0x0000, 0x0000, 0x363e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6924, 0x0000, 0x4979,
+ 0x687d, 0x0000, 0x6856, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x687c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4f4f, 0x4622, 0x4973, 0x0000, 0x0000, 0x692b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6931,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6932, 0x0000,
+ 0x6925, 0x0000, 0x0000, 0x0000, 0x4776, 0x0000, 0x0000, 0x692f,
+ 0x6927, 0x0000, 0x6929, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6933, 0x6928, 0x0000, 0x0000, 0x692c, 0x0000, 0x0000, 0x3172,
+ 0x0000, 0x4665, 0x0000, 0x692d, 0x6930, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6926, 0x0000, 0x4126, 0x0000,
+ 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x0000, 0x4c79, 0x3d72,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6937, 0x6935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4f4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6934, 0x0000, 0x0000, 0x0000, 0x4d75, 0x0000, 0x6936,
+ 0x6938, 0x0000, 0x0000, 0x0000, 0x0000, 0x6939, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x693c, 0x693a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4623, 0x693b, 0x0000, 0x0000,
+ 0x0000, 0x484d, 0x692e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d73,
+ 0x0000, 0x693d, 0x6942, 0x4174, 0x0000, 0x0000, 0x6941, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_86[] = {
+ /* 0x8600 - 0x86ff */
+ 0x0000, 0x0000, 0x6922, 0x0000, 0x0000, 0x0000, 0x6943, 0x4149,
+ 0x0000, 0x0000, 0x693e, 0x6940, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x693f, 0x0000, 0x0000, 0x5d31, 0x5d22,
+ 0x0000, 0x0000, 0x6945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d76, 0x0000, 0x623c,
+ 0x6946, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6947,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6948, 0x3857, 0x0000,
+ 0x3554, 0x0000, 0x0000, 0x0000, 0x694a, 0x515d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3575, 0x0000, 0x4e3a, 0x0000, 0x3673, 0x694b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x694c,
+ 0x0000, 0x0000, 0x0000, 0x436e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x694d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x467a, 0x0000, 0x303a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3263, 0x6952, 0x6953, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x694e, 0x0000, 0x3b3d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x694f, 0x4742, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6950, 0x6951, 0x695b, 0x0000, 0x0000, 0x0000, 0x6955,
+ 0x6958, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6954, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6956, 0x0000, 0x6957, 0x3c58,
+ 0x0000, 0x6959, 0x0000, 0x4341, 0x0000, 0x3756, 0x3342, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x695c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x333f, 0x0000, 0x6961, 0x0000, 0x0000, 0x695d, 0x6960,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x483a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x695e, 0x0000, 0x0000, 0x695f, 0x4948, 0x485a, 0x6962,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x427d, 0x696c, 0x0000, 0x6968, 0x0000, 0x0000, 0x326b, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_87[] = {
+ /* 0x8700 - 0x87ff */
+ 0x6966, 0x0000, 0x4b2a, 0x6967, 0x0000, 0x0000, 0x6964, 0x0000,
+ 0x6965, 0x696a, 0x696d, 0x0000, 0x0000, 0x696b, 0x0000, 0x0000,
+ 0x0000, 0x6969, 0x6963, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4358, 0x0000, 0x6974, 0x0000, 0x4c2a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6972, 0x0000, 0x0000,
+ 0x0000, 0x6973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x696e, 0x0000, 0x0000, 0x6970,
+ 0x0000, 0x0000, 0x0000, 0x6971, 0x0000, 0x0000, 0x0000, 0x696f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4066, 0x0000, 0x4f39, 0x6978, 0x0000, 0x6979, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6a21, 0x0000, 0x3f2a, 0x0000, 0x697b,
+ 0x0000, 0x697e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6976,
+ 0x6975, 0x0000, 0x0000, 0x6a22, 0x0000, 0x0000, 0x325c, 0x0000,
+ 0x697c, 0x0000, 0x6a23, 0x0000, 0x0000, 0x0000, 0x697d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x697a, 0x0000, 0x4433, 0x0000,
+ 0x6977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4768,
+ 0x0000, 0x0000, 0x6a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d3b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a26,
+ 0x0000, 0x0000, 0x6a25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6a2e, 0x0000, 0x0000, 0x0000, 0x6a28,
+ 0x0000, 0x0000, 0x0000, 0x6a30, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d66, 0x6a33, 0x0000, 0x6a2a, 0x0000, 0x0000,
+ 0x6a2b, 0x0000, 0x0000, 0x0000, 0x6a2f, 0x0000, 0x6a32, 0x6a31,
+ 0x0000, 0x0000, 0x0000, 0x6a29, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6a2c, 0x0000, 0x6a3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6a36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a34,
+ 0x0000, 0x0000, 0x6a35, 0x0000, 0x0000, 0x0000, 0x6a3a, 0x6a3b,
+ 0x0000, 0x332a, 0x0000, 0x3542, 0x0000, 0x0000, 0x6a39, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_88[] = {
+ /* 0x8800 - 0x88ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a24, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a38, 0x6a3c, 0x6a37,
+ 0x0000, 0x6a3e, 0x0000, 0x0000, 0x0000, 0x6a40, 0x6a3f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6a42, 0x6a41, 0x695a, 0x0000, 0x0000, 0x0000, 0x6a46,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6a43, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a44, 0x0000,
+ 0x0000, 0x6a45, 0x0000, 0x6a47, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x376c, 0x0000, 0x6a49, 0x0000, 0x6a48, 0x0000, 0x3d30, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3954, 0x5e27, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6a4a, 0x3d51, 0x0000, 0x0000, 0x0000, 0x3339,
+ 0x0000, 0x6a4b, 0x0000, 0x3152, 0x0000, 0x3e57, 0x6a4c, 0x0000,
+ 0x0000, 0x3955, 0x6a4d, 0x3061, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x493d, 0x0000, 0x0000, 0x6a4e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3f6a, 0x0000, 0x6a55, 0x0000, 0x0000, 0x6a52, 0x0000, 0x436f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a53, 0x6a50, 0x365e,
+ 0x0000, 0x6a4f, 0x6a56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3736, 0x0000, 0x0000, 0x425e, 0x0000, 0x6a5c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6a58, 0x0000, 0x0000, 0x0000, 0x4235, 0x6a57,
+ 0x0000, 0x6a5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a51, 0x0000,
+ 0x0000, 0x0000, 0x6a5b, 0x0000, 0x6a5d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x486f, 0x0000, 0x0000, 0x6a59, 0x0000,
+ 0x6a5e, 0x6a60, 0x0000, 0x0000, 0x3853, 0x6a54, 0x0000, 0x3041,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a5f,
+ 0x0000, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e22,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6a63, 0x4d35, 0x0000, 0x0000,
+ 0x6a64, 0x6a65, 0x0000, 0x0000, 0x4a64, 0x6a66, 0x0000, 0x3a40,
+ 0x0000, 0x4e23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6a6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6a6c, 0x3e58, 0x6a6a, 0x0000, 0x0000, 0x0000,
+ 0x4d67, 0x6a67, 0x0000, 0x0000, 0x6a69, 0x403d, 0x3f7e, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_89[] = {
+ /* 0x8900 - 0x89ff */
+ 0x0000, 0x0000, 0x6a68, 0x0000, 0x6a6d, 0x0000, 0x0000, 0x4a23,
+ 0x0000, 0x0000, 0x6a6f, 0x0000, 0x6a6e, 0x0000, 0x0000, 0x0000,
+ 0x336c, 0x0000, 0x4b2b, 0x6a70, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a7c, 0x6a72, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a73, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6a74, 0x6a75, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a79, 0x0000,
+ 0x6a7a, 0x0000, 0x0000, 0x6a78, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6a76, 0x0000, 0x6a71, 0x6a77, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6a7b, 0x7037, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3228, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a7e, 0x365f,
+ 0x6a7d, 0x0000, 0x0000, 0x0000, 0x6b22, 0x0000, 0x6b21, 0x0000,
+ 0x0000, 0x0000, 0x6b24, 0x0000, 0x0000, 0x6b23, 0x0000, 0x6b25,
+ 0x0000, 0x0000, 0x3d31, 0x0000, 0x6b26, 0x0000, 0x0000, 0x6b27,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b28, 0x403e,
+ 0x0000, 0x4d57, 0x0000, 0x6b29, 0x0000, 0x0000, 0x4a24, 0x4746,
+ 0x6b2a, 0x0000, 0x6b2b, 0x382b, 0x0000, 0x0000, 0x0000, 0x352c,
+ 0x0000, 0x0000, 0x0000, 0x6b2c, 0x0000, 0x0000, 0x3b6b, 0x4741,
+ 0x6b2d, 0x0000, 0x3350, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6b2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b30, 0x4d77,
+ 0x0000, 0x6b2f, 0x3f46, 0x0000, 0x6b31, 0x0000, 0x0000, 0x6b32,
+ 0x0000, 0x0000, 0x6b33, 0x3451, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6b34, 0x0000, 0x0000, 0x6b35, 0x0000, 0x6b36,
+ 0x6b37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3351, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6b38, 0x0000, 0x6b39, 0x6b3a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3272, 0x0000, 0x0000, 0x3f28, 0x6b3b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6b3c, 0x0000, 0x0000, 0x0000,
+ 0x6b3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_8a[] = {
+ /* 0x8a00 - 0x8aff */
+ 0x3840, 0x0000, 0x447b, 0x6b3e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3757, 0x0000, 0x3f56, 0x0000, 0x6b41, 0x0000, 0x4624, 0x0000,
+ 0x6b40, 0x0000, 0x0000, 0x3731, 0x0000, 0x0000, 0x6b3f, 0x4277,
+ 0x352d, 0x0000, 0x0000, 0x6b42, 0x0000, 0x6b43, 0x0000, 0x3e59,
+ 0x0000, 0x0000, 0x0000, 0x376d, 0x0000, 0x6b44, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4b2c, 0x0000, 0x0000, 0x405f, 0x0000, 0x0000,
+ 0x0000, 0x3576, 0x0000, 0x4c75, 0x414a, 0x0000, 0x6b45, 0x0000,
+ 0x0000, 0x0000, 0x3f47, 0x4370, 0x3e5a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6b46, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b49, 0x0000,
+ 0x6b4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3a3e, 0x4242, 0x6b48, 0x0000, 0x3e5b, 0x493e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b47, 0x0000, 0x0000, 0x3b6c, 0x0000,
+ 0x3153, 0x0000, 0x6b4e, 0x3758, 0x0000, 0x0000, 0x3b6e, 0x0000,
+ 0x0000, 0x3b6d, 0x0000, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x0000,
+ 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6b4b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6b50, 0x0000, 0x6b51, 0x6b4f, 0x0000, 0x3858,
+ 0x0000, 0x4d40, 0x0000, 0x0000, 0x3b6f, 0x4727, 0x0000, 0x0000,
+ 0x0000, 0x6b54, 0x0000, 0x4040, 0x0000, 0x4342, 0x0000, 0x0000,
+ 0x4d36, 0x0000, 0x6b57, 0x0000, 0x0000, 0x0000, 0x386c, 0x0000,
+ 0x403f, 0x6b53, 0x0000, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x0000,
+ 0x6b52, 0x0000, 0x0000, 0x0000, 0x4062, 0x4649, 0x0000, 0x0000,
+ 0x432f, 0x0000, 0x325d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4870, 0x0000, 0x0000, 0x3543, 0x0000, 0x0000, 0x4434,
+ 0x0000, 0x0000, 0x6b5b, 0x0000, 0x6b59, 0x0000, 0x0000, 0x434c,
+ 0x0000, 0x0000, 0x0000, 0x4041, 0x3452, 0x6b5a, 0x0000, 0x3f5b,
+ 0x0000, 0x0000, 0x4e4a, 0x0000, 0x0000, 0x0000, 0x4f40, 0x0000,
+ 0x0000, 0x0000, 0x6b5c, 0x6b67, 0x4435, 0x0000, 0x6b66, 0x0000,
+ 0x6b63, 0x6b6b, 0x6b64, 0x0000, 0x6b60, 0x0000, 0x447c, 0x6b5f,
+ 0x0000, 0x0000, 0x0000, 0x6b5d, 0x0000, 0x4d21, 0x3b70, 0x0000,
+ 0x0000, 0x6b61, 0x0000, 0x6b5e, 0x0000, 0x0000, 0x0000, 0x6b65,
+ 0x3d74, 0x0000, 0x3841, 0x0000, 0x0000, 0x0000, 0x427a, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_8b[] = {
+ /* 0x8b00 - 0x8bff */
+ 0x4b45, 0x315a, 0x3062, 0x0000, 0x4625, 0x0000, 0x0000, 0x6b69,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6b68, 0x0000, 0x4666, 0x0000,
+ 0x6b6d, 0x0000, 0x0000, 0x0000, 0x6b62, 0x0000, 0x6b6c, 0x6b6e,
+ 0x0000, 0x382c, 0x6b6a, 0x3956, 0x0000, 0x3c55, 0x0000, 0x0000,
+ 0x6b6f, 0x4d58, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b72, 0x0000,
+ 0x6b75, 0x0000, 0x0000, 0x6b73, 0x4935, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b70, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3660, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b74, 0x0000,
+ 0x0000, 0x6b76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6b7a, 0x0000, 0x0000, 0x6b77, 0x0000, 0x6b79, 0x6b78,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b7b, 0x0000,
+ 0x3c31, 0x0000, 0x6b7d, 0x6b7c, 0x4968, 0x0000, 0x0000, 0x6c21,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3759, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b7e, 0x6c22, 0x0000, 0x0000, 0x6c23,
+ 0x3544, 0x6641, 0x3e79, 0x0000, 0x6c24, 0x0000, 0x0000, 0x386e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c25, 0x0000, 0x0000,
+ 0x6c26, 0x0000, 0x0000, 0x3b3e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5a4e, 0x0000, 0x6c27, 0x0000, 0x6c28, 0x0000,
+ 0x3d32, 0x0000, 0x6c29, 0x6c2a, 0x0000, 0x0000, 0x6c2b, 0x0000,
+ 0x0000, 0x6c2c, 0x6c2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_8c[] = {
+ /* 0x8c00 - 0x8cff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x432b,
+ 0x0000, 0x0000, 0x6c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c30,
+ 0x0000, 0x6c2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4626, 0x0000,
+ 0x6c31, 0x0000, 0x4b2d, 0x0000, 0x6c32, 0x0000, 0x6c33, 0x0000,
+ 0x6c34, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c35, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x465a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3e5d, 0x6c36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x396b, 0x502e, 0x6c37, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6c38, 0x493f, 0x6c39, 0x0000, 0x6c41, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c3a, 0x0000, 0x0000, 0x6c3c, 0x0000, 0x0000,
+ 0x0000, 0x6c3b, 0x6c3d, 0x0000, 0x4b46, 0x6c3e, 0x6c3f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c40, 0x0000, 0x0000, 0x0000,
+ 0x6c42, 0x0000, 0x0000, 0x0000, 0x0000, 0x332d, 0x4467, 0x0000,
+ 0x4969, 0x3a62, 0x3957, 0x0000, 0x0000, 0x0000, 0x0000, 0x494f,
+ 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379,
+ 0x4c63, 0x0000, 0x6c47, 0x6c48, 0x352e, 0x0000, 0x6c4a, 0x4763,
+ 0x425f, 0x0000, 0x0000, 0x4871, 0x453d, 0x6c46, 0x0000, 0x4b47,
+ 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x0000, 0x0000, 0x3b71,
+ 0x6c4b, 0x0000, 0x4231, 0x0000, 0x0000, 0x6c5c, 0x4128, 0x0000,
+ 0x0000, 0x4678, 0x0000, 0x4950, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c4f, 0x3b3f, 0x3b72, 0x0000, 0x3e5e, 0x0000,
+ 0x4765, 0x0000, 0x382d, 0x6c4e, 0x6c4d, 0x0000, 0x496a, 0x0000,
+ 0x0000, 0x0000, 0x3c41, 0x0000, 0x0000, 0x4552, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_8d[] = {
+ /* 0x8d00 - 0x8dff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c53, 0x6c54, 0x0000, 0x6c56,
+ 0x4223, 0x0000, 0x6c55, 0x3466, 0x0000, 0x6c58, 0x0000, 0x6c57,
+ 0x6c59, 0x0000, 0x0000, 0x6c5b, 0x6c5d, 0x0000, 0x6c5e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4056, 0x0000, 0x3c4f, 0x6c5f,
+ 0x0000, 0x0000, 0x0000, 0x3352, 0x0000, 0x6c60, 0x0000, 0x0000,
+ 0x4176, 0x6c61, 0x0000, 0x6c62, 0x496b, 0x0000, 0x0000, 0x352f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6c63, 0x0000, 0x0000, 0x0000, 0x4436, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x315b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6c64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c71, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3f76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x422d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c67, 0x0000, 0x0000, 0x0000, 0x6c66, 0x0000,
+ 0x0000, 0x0000, 0x6c65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6c6d, 0x6c6b, 0x0000, 0x0000, 0x6c68,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c6a, 0x0000,
+ 0x0000, 0x0000, 0x6c69, 0x6c6c, 0x0000, 0x3577, 0x0000, 0x6c70,
+ 0x0000, 0x4057, 0x0000, 0x6c71, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3859, 0x0000, 0x6c6e, 0x6c6f, 0x0000, 0x0000, 0x0000, 0x4f29,
+ 0x0000, 0x0000, 0x0000, 0x4437, 0x0000, 0x4129, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c72, 0x0000, 0x0000, 0x6c75,
+};
+
+static unsigned short const unicode_to_jisx0208_8e[] = {
+ /* 0x8e00 - 0x8eff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6c73, 0x6c74, 0x4d59, 0x0000, 0x0000, 0x0000, 0x0000, 0x4627,
+ 0x6c78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c76, 0x6c77, 0x6c79,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6c7c, 0x0000, 0x0000, 0x0000, 0x6c7d, 0x6c7b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c7a, 0x0000, 0x447d, 0x0000, 0x0000, 0x6d21,
+ 0x6d25, 0x6d22, 0x6c7e, 0x0000, 0x6d23, 0x0000, 0x0000, 0x0000,
+ 0x6d24, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d2b, 0x0000, 0x0000,
+ 0x0000, 0x6d26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4058,
+ 0x6d28, 0x0000, 0x0000, 0x6d2a, 0x6d27, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d2d, 0x0000, 0x3d33, 0x0000, 0x6d2c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6d2e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6d2f, 0x0000, 0x0000, 0x6d32, 0x6d31, 0x0000, 0x6d30,
+ 0x0000, 0x0000, 0x6d34, 0x6d33, 0x0000, 0x4c76, 0x0000, 0x0000,
+ 0x0000, 0x6d36, 0x0000, 0x6d35, 0x6d37, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6d38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6d3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d39, 0x3f48, 0x6d3b, 0x0000, 0x0000, 0x366d,
+ 0x6d3c, 0x6d3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d3f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d40, 0x6d3d, 0x0000,
+ 0x6d41, 0x0000, 0x3c56, 0x6d42, 0x3530, 0x3733, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x382e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6d43, 0x0000, 0x0000, 0x0000, 0x4670,
+ 0x0000, 0x0000, 0x453e, 0x6d44, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6d47, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c34, 0x0000, 0x0000, 0x6d46, 0x6d45, 0x375a, 0x6d48, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_8f[] = {
+ /* 0x8f00 - 0x8fff */
+ 0x0000, 0x0000, 0x0000, 0x3353, 0x0000, 0x6d4a, 0x0000, 0x0000,
+ 0x0000, 0x3a5c, 0x6d49, 0x0000, 0x6d52, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x0000, 0x0000,
+ 0x0000, 0x6d4d, 0x0000, 0x6d51, 0x6d4f, 0x3531, 0x0000, 0x6d50,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d53, 0x0000,
+ 0x0000, 0x475a, 0x4e58, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d34,
+ 0x0000, 0x0000, 0x0000, 0x6d54, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4d22, 0x6d56, 0x0000, 0x6d55, 0x0000, 0x0000, 0x6d59, 0x4d41,
+ 0x0000, 0x0000, 0x6d58, 0x0000, 0x336d, 0x6d57, 0x6d5c, 0x0000,
+ 0x0000, 0x6d5b, 0x0000, 0x0000, 0x6d5a, 0x4532, 0x6d5d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d5e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6d5f, 0x0000, 0x0000, 0x396c,
+ 0x0000, 0x3725, 0x6d60, 0x6d61, 0x6d62, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3f49, 0x6d63, 0x0000, 0x3c2d, 0x6d64,
+ 0x0000, 0x0000, 0x0000, 0x6d65, 0x0000, 0x0000, 0x0000, 0x5221,
+ 0x517e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d66, 0x6570, 0x6d67,
+ 0x4324, 0x3f2b, 0x4740, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d68,
+ 0x0000, 0x0000, 0x4a55, 0x4454, 0x397e, 0x0000, 0x0000, 0x4329,
+ 0x0000, 0x0000, 0x312a, 0x0000, 0x4b78, 0x3f57, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x375e, 0x0000,
+ 0x0000, 0x3661, 0x0000, 0x0000, 0x4a56, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d6b, 0x0000, 0x0000, 0x6d6a, 0x3260, 0x0000,
+ 0x0000, 0x4676, 0x6d6c, 0x4777, 0x0000, 0x4533, 0x0000, 0x6d6d,
+ 0x3d52, 0x0000, 0x0000, 0x0000, 0x6d6f, 0x0000, 0x0000, 0x4c42,
+ 0x6d7e, 0x6d71, 0x6d72, 0x0000, 0x0000, 0x4449, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_90[] = {
+ /* 0x9000 - 0x90ff */
+ 0x4260, 0x4177, 0x0000, 0x4628, 0x0000, 0x6d70, 0x3555, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6d79, 0x0000, 0x6d76, 0x6e25, 0x4629,
+ 0x4360, 0x6d73, 0x0000, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60,
+ 0x0000, 0x4767, 0x444c, 0x0000, 0x0000, 0x4042, 0x6d77, 0x422e,
+ 0x4224, 0x6d75, 0x3029, 0x4f22, 0x0000, 0x0000, 0x0000, 0x6d7a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4261, 0x0000,
+ 0x0000, 0x3d35, 0x3f4a, 0x0000, 0x0000, 0x6d7c, 0x6d7b, 0x0000,
+ 0x306f, 0x6d7d, 0x0000, 0x0000, 0x492f, 0x0000, 0x6e27, 0x0000,
+ 0x0000, 0x465b, 0x3f6b, 0x0000, 0x0000, 0x4359, 0x0000, 0x3678,
+ 0x0000, 0x6e26, 0x4d37, 0x313f, 0x0000, 0x4a57, 0x3261, 0x6e21,
+ 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x0000,
+ 0x6e29, 0x7423, 0x0000, 0x0000, 0x423d, 0x0000, 0x6e2a, 0x0000,
+ 0x3173, 0x414c, 0x0000, 0x382f, 0x0000, 0x4d5a, 0x0000, 0x0000,
+ 0x6e2b, 0x452c, 0x0000, 0x0000, 0x0000, 0x4178, 0x3c57, 0x6e2c,
+ 0x0000, 0x0000, 0x6e2f, 0x0000, 0x0000, 0x3d65, 0x6e2d, 0x412b,
+ 0x412a, 0x0000, 0x3064, 0x0000, 0x4e4b, 0x6e31, 0x0000, 0x4872,
+ 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0x0000, 0x0000, 0x6d6e,
+ 0x0000, 0x6e35, 0x6e34, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e36,
+ 0x0000, 0x4d38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4661, 0x0000, 0x0000, 0x4b2e, 0x0000,
+ 0x6e37, 0x0000, 0x3c59, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e38,
+ 0x0000, 0x6e39, 0x0000, 0x0000, 0x0000, 0x6e3a, 0x0000, 0x0000,
+ 0x4521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x306a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3959, 0x0000, 0x0000, 0x0000, 0x4f3a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6e3e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3734, 0x6e3b, 0x0000, 0x6e3c, 0x0000, 0x0000, 0x0000,
+ 0x4974, 0x0000, 0x0000, 0x0000, 0x0000, 0x3354, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d39, 0x0000, 0x363f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4554, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_91[] = {
+ /* 0x9100 - 0x91ff */
+ 0x0000, 0x0000, 0x6e3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6e40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6e41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4522, 0x0000, 0x0000,
+ 0x6e43, 0x0000, 0x6e42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x0000,
+ 0x0000, 0x0000, 0x3c72, 0x0000, 0x3f6c, 0x0000, 0x6e45, 0x0000,
+ 0x6e46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3f5d, 0x6e47, 0x0000, 0x6e48, 0x0000, 0x0000,
+ 0x0000, 0x6e49, 0x4d6f, 0x0000, 0x3d37, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6e4b, 0x6e4a, 0x0000, 0x395a, 0x0000, 0x3973,
+ 0x3b40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d66,
+ 0x0000, 0x6e4d, 0x0000, 0x6e4c, 0x0000, 0x4269, 0x0000, 0x0000,
+ 0x386f, 0x0000, 0x4043, 0x0000, 0x0000, 0x0000, 0x0000, 0x4830,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d39, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6e4f, 0x0000, 0x3e5f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6e52, 0x6e50, 0x0000, 0x0000, 0x0000, 0x6e51,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6e54, 0x6e53, 0x0000, 0x0000,
+ 0x3e7a, 0x0000, 0x6e55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6e56, 0x6e57, 0x0000, 0x0000, 0x0000, 0x0000, 0x4850, 0x3a53,
+ 0x3c61, 0x6e58, 0x0000, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c,
+ 0x6e5a, 0x3662, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e5b, 0x0000,
+ 0x4523, 0x0000, 0x0000, 0x6e5e, 0x3378, 0x3f4b, 0x0000, 0x6e5c,
+ 0x0000, 0x6e5d, 0x0000, 0x4460, 0x0000, 0x0000, 0x4b55, 0x367c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e60, 0x6e61, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6e5f, 0x0000, 0x0000, 0x6e63,
+};
+
+static unsigned short const unicode_to_jisx0208_92[] = {
+ /* 0x9200 - 0x92ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x465f, 0x3343, 0x0000,
+ 0x0000, 0x6e67, 0x0000, 0x0000, 0x6e64, 0x6e66, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e62, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f4f, 0x0000, 0x0000, 0x6e65, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4e6b, 0x0000, 0x0000, 0x385a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e6f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4534, 0x6e6a, 0x0000, 0x0000,
+ 0x6e6d, 0x6e6b, 0x0000, 0x6e70, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6e71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e69,
+ 0x0000, 0x0000, 0x6e76, 0x3174, 0x0000, 0x0000, 0x6e68, 0x0000,
+ 0x0000, 0x0000, 0x482d, 0x0000, 0x6e6c, 0x0000, 0x3e60, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x395b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b48, 0x0000,
+ 0x3664, 0x0000, 0x0000, 0x3d46, 0x0000, 0x463c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x412d, 0x0000, 0x6e74, 0x0000, 0x6e6e, 0x6e73, 0x0000,
+ 0x4c43, 0x0000, 0x4438, 0x6e75, 0x6e72, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x412c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e79,
+ 0x0000, 0x6e78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e77,
+ 0x0000, 0x0000, 0x4b2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d7b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6e7a, 0x4a5f, 0x0000, 0x0000, 0x3154, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4946, 0x4372, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3578, 0x0000, 0x6e7c, 0x0000, 0x395d, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_93[] = {
+ /* 0x9300 - 0x93ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b2c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e7b,
+ 0x3f6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3f6e, 0x6f21, 0x6f23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3e7b, 0x0000, 0x6f22, 0x6f24, 0x0000, 0x0000, 0x3653, 0x0000,
+ 0x4945, 0x0000, 0x0000, 0x3c62, 0x4f23, 0x0000, 0x6e7e, 0x3a78,
+ 0x0000, 0x0000, 0x4f3f, 0x0000, 0x0000, 0x6f26, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6f25, 0x6f27, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6e7d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4669, 0x0000, 0x4555, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4457, 0x0000, 0x6f2c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4343, 0x6f28, 0x0000, 0x0000, 0x0000,
+ 0x6f29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x372d, 0x0000, 0x6f2b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3830, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6f2a, 0x0000, 0x3e61, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3379, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6f30, 0x0000, 0x3a3f, 0x4179,
+ 0x0000, 0x0000, 0x444a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x333b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6f2e, 0x6f2f, 0x4443, 0x0000,
+ 0x6f2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f31, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6f37, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6f3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6f39, 0x452d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f32, 0x6f33,
+ 0x6f36, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f38, 0x0000, 0x0000,
+ 0x0000, 0x3640, 0x0000, 0x0000, 0x6f3b, 0x6f35, 0x0000, 0x0000,
+ 0x6f34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_94[] = {
+ /* 0x9400 - 0x94ff */
+ 0x0000, 0x0000, 0x0000, 0x6f3f, 0x0000, 0x0000, 0x0000, 0x6f40,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6f41, 0x0000, 0x0000, 0x6f3e, 0x6f3d, 0x0000, 0x0000, 0x0000,
+ 0x3e62, 0x462a, 0x6f3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6f43, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f44, 0x6f42, 0x0000,
+ 0x4278, 0x0000, 0x6f46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f47, 0x0000, 0x0000, 0x6f49, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3455, 0x6f48, 0x4c7a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6f54, 0x6f4a, 0x0000, 0x0000, 0x6f4d, 0x0000,
+ 0x6f4b, 0x0000, 0x6f4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6f4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6f50, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f51, 0x0000, 0x6f52,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6f55, 0x6f53, 0x6f56, 0x6f58,
+ 0x0000, 0x6f57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_95[] = {
+ /* 0x9500 - 0x95ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4439,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c67, 0x0000, 0x6f59, 0x412e, 0x0000, 0x0000, 0x0000, 0x6f5a,
+ 0x0000, 0x4a44, 0x6f5b, 0x332b, 0x0000, 0x0000, 0x0000, 0x313c,
+ 0x0000, 0x3457, 0x0000, 0x3456, 0x6f5c, 0x0000, 0x6f5d, 0x0000,
+ 0x6f5e, 0x6f5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6f60, 0x0000, 0x3458, 0x3355, 0x395e, 0x4836, 0x0000, 0x6f62,
+ 0x6f61, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f63, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x315c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f66, 0x0000, 0x6f65, 0x6f64, 0x0000, 0x6f67, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6f6a, 0x0000, 0x0000, 0x0000, 0x3047,
+ 0x0000, 0x0000, 0x6f68, 0x0000, 0x6f6c, 0x6f6b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6f6e, 0x6f6d, 0x6f6f, 0x0000,
+ 0x462e, 0x0000, 0x0000, 0x0000, 0x6f70, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f71, 0x6f73, 0x0000, 0x0000, 0x6f72, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_96[] = {
+ /* 0x9600 - 0x96ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x496c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6f74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6f75, 0x0000, 0x3a65, 0x0000, 0x0000, 0x0000, 0x6f76, 0x6f77,
+ 0x0000, 0x0000, 0x4b49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x414b, 0x0000, 0x0000, 0x0000, 0x3024,
+ 0x424b, 0x0000, 0x6f78, 0x0000, 0x496d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6f7b, 0x6f79, 0x395f, 0x0000, 0x6f7a,
+ 0x3842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022,
+ 0x0000, 0x0000, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x0000,
+ 0x0000, 0x0000, 0x4766, 0x0000, 0x7025, 0x0000, 0x0000, 0x0000,
+ 0x3122, 0x0000, 0x7024, 0x4444, 0x0000, 0x4e4d, 0x462b, 0x6f7c,
+ 0x4e26, 0x0000, 0x3831, 0x0000, 0x0000, 0x4d5b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3679, 0x4e34, 0x0000,
+ 0x3728, 0x0000, 0x4262, 0x6721, 0x0000, 0x7026, 0x332c, 0x3f6f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3356, 0x7028, 0x0000, 0x7029,
+ 0x7027, 0x3764, 0x0000, 0x3a5d, 0x3e63, 0x0000, 0x0000, 0x0000,
+ 0x3123, 0x0000, 0x0000, 0x4e59, 0x0000, 0x0000, 0x0000, 0x702b,
+ 0x6e2e, 0x0000, 0x702a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x702e, 0x702c, 0x702d, 0x0000, 0x702f, 0x0000, 0x7030, 0x4e6c,
+ 0x7031, 0x7032, 0x0000, 0x4049, 0x483b, 0x0000, 0x0000, 0x0000,
+ 0x3f7d, 0x3467, 0x0000, 0x0000, 0x4d3a, 0x326d, 0x3d38, 0x385b,
+ 0x0000, 0x7035, 0x0000, 0x7034, 0x3b73, 0x7036, 0x7033, 0x0000,
+ 0x0000, 0x3b28, 0x0000, 0x0000, 0x0000, 0x703a, 0x6a2d, 0x0000,
+ 0x0000, 0x5256, 0x0000, 0x3f77, 0x7038, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4e25, 0x4671, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x312b, 0x0000, 0x4063, 0x3c36, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a37, 0x0000, 0x3140, 0x0000, 0x0000, 0x0000, 0x4e6d, 0x4d6b,
+ 0x0000, 0x703b, 0x0000, 0x4545, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_97[] = {
+ /* 0x9700 - 0x97ff */
+ 0x3c7b, 0x0000, 0x0000, 0x0000, 0x703c, 0x0000, 0x703d, 0x3f4c,
+ 0x703e, 0x0000, 0x4e6e, 0x0000, 0x0000, 0x7039, 0x7040, 0x7042,
+ 0x0000, 0x7041, 0x0000, 0x703f, 0x0000, 0x0000, 0x7043, 0x0000,
+ 0x0000, 0x7044, 0x0000, 0x0000, 0x417a, 0x0000, 0x3262, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7045, 0x0000, 0x0000, 0x4c38,
+ 0x0000, 0x0000, 0x7046, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7047, 0x0000, 0x4f2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b31, 0x7048, 0x0000, 0x0000, 0x0000, 0x7049, 0x704a, 0x0000,
+ 0x0000, 0x0000, 0x704e, 0x0000, 0x704b, 0x0000, 0x704c, 0x0000,
+ 0x704d, 0x704f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4044, 0x0000, 0x0000, 0x0000, 0x4c77, 0x0000,
+ 0x0000, 0x4045, 0x0000, 0x0000, 0x7050, 0x0000, 0x4873, 0x0000,
+ 0x7051, 0x7353, 0x4c4c, 0x0000, 0x7052, 0x0000, 0x7053, 0x0000,
+ 0x7054, 0x3357, 0x0000, 0x7056, 0x0000, 0x3f59, 0x0000, 0x0000,
+ 0x0000, 0x7057, 0x0000, 0x0000, 0x3724, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7058, 0x705c, 0x0000, 0x705a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x705b, 0x0000, 0x0000, 0x3373, 0x7059, 0x705d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x705e, 0x0000, 0x3048, 0x0000, 0x705f,
+ 0x7060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3e64, 0x0000, 0x0000, 0x0000, 0x7061, 0x0000, 0x0000, 0x0000,
+ 0x3547, 0x0000, 0x0000, 0x7064, 0x0000, 0x0000, 0x7063, 0x0000,
+ 0x7062, 0x0000, 0x0000, 0x6b71, 0x0000, 0x4a5c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7065, 0x7066, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7067, 0x0000, 0x0000, 0x7068, 0x0000,
+ 0x7069, 0x0000, 0x0000, 0x706a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x345a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x706b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x706c, 0x4723, 0x0000,
+ 0x0000, 0x0000, 0x706e, 0x323b, 0x0000, 0x7071, 0x7070, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3124, 0x0000, 0x0000, 0x0000, 0x3641,
+};
+
+static unsigned short const unicode_to_jisx0208_98[] = {
+ /* 0x9800 - 0x98ff */
+ 0x0000, 0x4a47, 0x443a, 0x3a22, 0x0000, 0x3960, 0x3d67, 0x0000,
+ 0x3f5c, 0x0000, 0x0000, 0x0000, 0x7073, 0x0000, 0x0000, 0x7072,
+ 0x4d42, 0x3468, 0x4852, 0x465c, 0x0000, 0x0000, 0x0000, 0x3f7c,
+ 0x4e4e, 0x0000, 0x375b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7076, 0x0000, 0x0000, 0x7075, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4b4b, 0x462c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3150, 0x0000, 0x0000, 0x7077,
+ 0x7074, 0x0000, 0x0000, 0x4951, 0x4d6a, 0x7078, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7079, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3469, 0x3832, 0x0000, 0x0000,
+ 0x346a, 0x0000, 0x0000, 0x453f, 0x0000, 0x0000, 0x4e60, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x385c,
+ 0x0000, 0x0000, 0x0000, 0x707c, 0x0000, 0x0000, 0x0000, 0x707d,
+ 0x707e, 0x7121, 0x0000, 0x7123, 0x7122, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4977, 0x0000, 0x7124, 0x0000, 0x0000, 0x0000, 0x0000, 0x7125,
+ 0x0000, 0x7126, 0x0000, 0x0000, 0x0000, 0x0000, 0x7127, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7129, 0x7128, 0x0000, 0x712a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4874, 0x664c, 0x0000, 0x0000, 0x3f29,
+ 0x0000, 0x0000, 0x3532, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x712b, 0x0000, 0x712c, 0x0000, 0x522c, 0x5d3b, 0x4853,
+ 0x0000, 0x0000, 0x307b, 0x0000, 0x303b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3b74, 0x4b30, 0x3e7e, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_99[] = {
+ /* 0x9900 - 0x99ff */
+ 0x0000, 0x0000, 0x0000, 0x712d, 0x0000, 0x4c5f, 0x0000, 0x0000,
+ 0x0000, 0x712e, 0x4d5c, 0x0000, 0x3142, 0x0000, 0x0000, 0x0000,
+ 0x3b41, 0x0000, 0x712f, 0x326e, 0x7130, 0x0000, 0x0000, 0x0000,
+ 0x7131, 0x0000, 0x0000, 0x0000, 0x0000, 0x7133, 0x7134, 0x0000,
+ 0x7136, 0x7132, 0x0000, 0x0000, 0x7135, 0x0000, 0x0000, 0x0000,
+ 0x345b, 0x0000, 0x0000, 0x0000, 0x7137, 0x0000, 0x7138, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7139, 0x713a, 0x0000,
+ 0x0000, 0x0000, 0x713b, 0x0000, 0x0000, 0x713d, 0x0000, 0x0000,
+ 0x0000, 0x713c, 0x0000, 0x713f, 0x7142, 0x0000, 0x0000, 0x0000,
+ 0x713e, 0x7140, 0x7141, 0x0000, 0x0000, 0x7143, 0x0000, 0x3642,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c73, 0x7144,
+ 0x7145, 0x3961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7146, 0x0000, 0x0000,
+ 0x333e, 0x0000, 0x0000, 0x0000, 0x474f, 0x7147, 0x7148, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x435a, 0x466b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7149, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x477d, 0x0000, 0x0000, 0x424c, 0x3158, 0x366e, 0x0000,
+ 0x366f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4373, 0x714e, 0x3670, 0x0000, 0x0000, 0x326f, 0x0000, 0x0000,
+ 0x714d, 0x0000, 0x0000, 0x714b, 0x0000, 0x714c, 0x0000, 0x714a,
+ 0x0000, 0x0000, 0x7158, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x714f, 0x7150, 0x0000,
+ 0x0000, 0x7151, 0x7152, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7154, 0x0000, 0x0000, 0x7153, 0x0000, 0x0000, 0x0000, 0x3d59,
+};
+
+static unsigned short const unicode_to_jisx0208_9a[] = {
+ /* 0x9a00 - 0x9aff */
+ 0x0000, 0x7155, 0x0000, 0x0000, 0x0000, 0x7157, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3533, 0x7156,
+ 0x0000, 0x0000, 0x417b, 0x3833, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7159, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x424d, 0x0000, 0x0000, 0x715a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x462d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x715b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7160, 0x0000,
+ 0x715e, 0x0000, 0x715d, 0x715f, 0x0000, 0x715c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7162, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7161, 0x0000, 0x7164,
+ 0x0000, 0x0000, 0x3643, 0x7163, 0x0000, 0x0000, 0x0000, 0x7165,
+ 0x0000, 0x0000, 0x7166, 0x0000, 0x7168, 0x7167, 0x0000, 0x0000,
+ 0x0000, 0x7169, 0x716b, 0x716a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x397c, 0x0000, 0x0000, 0x0000, 0x0000, 0x716c, 0x0000, 0x0000,
+ 0x716d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x333c, 0x0000, 0x0000, 0x0000, 0x716e, 0x0000, 0x0000, 0x0000,
+ 0x716f, 0x0000, 0x0000, 0x0000, 0x3f71, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7170,
+ 0x0000, 0x7171, 0x0000, 0x7172, 0x7173, 0x0000, 0x0000, 0x0000,
+ 0x3962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7174, 0x7175,
+ 0x0000, 0x0000, 0x7176, 0x7177, 0x0000, 0x0000, 0x7178, 0x0000,
+ 0x0000, 0x0000, 0x4831, 0x717a, 0x0000, 0x4926, 0x717b, 0x7179,
+ 0x0000, 0x717d, 0x0000, 0x0000, 0x717c, 0x0000, 0x0000, 0x717e,
+ 0x0000, 0x0000, 0x0000, 0x7221, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_9b[] = {
+ /* 0x9b00 - 0x9bff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7222, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7223, 0x0000, 0x7224, 0x0000, 0x0000, 0x0000, 0x0000, 0x7225,
+ 0x0000, 0x0000, 0x7226, 0x7227, 0x0000, 0x7228, 0x0000, 0x7229,
+ 0x722a, 0x722b, 0x722c, 0x0000, 0x0000, 0x0000, 0x722d, 0x722e,
+ 0x0000, 0x5d35, 0x722f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6478, 0x3534, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7233, 0x7234, 0x7232,
+ 0x0000, 0x7235, 0x0000, 0x0000, 0x4b62, 0x0000, 0x0000, 0x0000,
+ 0x7236, 0x0000, 0x357b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f25,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7237, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7239, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x303e, 0x0000,
+ 0x0000, 0x723a, 0x4a2b, 0x7238, 0x0000, 0x0000, 0x723b, 0x723c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x723d,
+ 0x723e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x723f, 0x0000, 0x4b6e, 0x3b2d, 0x0000, 0x3a7a, 0x412f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7240, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7243, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7241, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7244, 0x0000,
+ 0x0000, 0x3871, 0x7242, 0x0000, 0x0000, 0x0000, 0x0000, 0x7245,
+ 0x0000, 0x7246, 0x7247, 0x0000, 0x724b, 0x0000, 0x3b2a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4264, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x724c, 0x7249, 0x7248, 0x724a, 0x0000, 0x0000, 0x0000,
+ 0x375f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7250, 0x724f, 0x724e, 0x0000, 0x0000, 0x3033, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_9c[] = {
+ /* 0x9c00 - 0x9cff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x725a, 0x0000, 0x7256, 0x0000,
+ 0x7257, 0x7253, 0x7259, 0x0000, 0x7255, 0x3362, 0x0000, 0x0000,
+ 0x4f4c, 0x0000, 0x7258, 0x7254, 0x7252, 0x7251, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x725c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x725f, 0x0000, 0x0000, 0x725e, 0x725d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4949, 0x725b, 0x3073,
+ 0x7260, 0x0000, 0x7262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x336f, 0x724d, 0x3137, 0x0000, 0x0000, 0x7264, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7263, 0x7261,
+ 0x432d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4b70, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e5a,
+ 0x0000, 0x0000, 0x7265, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7267,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7268, 0x0000,
+ 0x7269, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x443b, 0x0000, 0x726a,
+ 0x0000, 0x4837, 0x0000, 0x726f, 0x726b, 0x0000, 0x0000, 0x0000,
+ 0x726c, 0x0000, 0x0000, 0x4b31, 0x4c44, 0x0000, 0x4650, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_9d[] = {
+ /* 0x9d00 - 0x9dff */
+ 0x0000, 0x0000, 0x0000, 0x7270, 0x0000, 0x0000, 0x7271, 0x463e,
+ 0x726e, 0x726d, 0x0000, 0x0000, 0x0000, 0x0000, 0x322a, 0x0000,
+ 0x0000, 0x0000, 0x7279, 0x0000, 0x0000, 0x7278, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3175, 0x0000, 0x0000, 0x0000, 0x7276,
+ 0x0000, 0x0000, 0x0000, 0x7275, 0x0000, 0x0000, 0x7273, 0x0000,
+ 0x337b, 0x0000, 0x7272, 0x3c32, 0x3229, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3963, 0x0000, 0x0000, 0x727c, 0x727b,
+ 0x0000, 0x727a, 0x0000, 0x0000, 0x7277, 0x0000, 0x727d, 0x0000,
+ 0x727e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7325, 0x7324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7326, 0x0000, 0x0000, 0x312d, 0x7321, 0x7322, 0x0000,
+ 0x3974, 0x4c39, 0x0000, 0x0000, 0x7323, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4b32, 0x0000, 0x0000, 0x732b,
+ 0x0000, 0x0000, 0x7327, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x732c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7329,
+ 0x0000, 0x7328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x375c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x732d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x732e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x732f, 0x0000, 0x732a, 0x0000, 0x0000, 0x0000, 0x7274,
+ 0x0000, 0x0000, 0x7330, 0x0000, 0x4461, 0x0000, 0x0000, 0x0000,
+ 0x7334, 0x0000, 0x7335, 0x7333, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7332, 0x7338, 0x0000, 0x7331, 0x0000, 0x7336, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7337,
+ 0x0000, 0x0000, 0x0000, 0x733a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7339, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x733c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x733d, 0x0000, 0x733e,
+ 0x0000, 0x0000, 0x4f49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x733b, 0x426b, 0x3a6d, 0x0000, 0x0000, 0x733f, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_9e[] = {
+ /* 0x9e00 - 0x9eff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x7340, 0x7341, 0x0000, 0x0000, 0x7342, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7343, 0x0000, 0x0000,
+ 0x3834, 0x7344, 0x0000, 0x0000, 0x0000, 0x7345, 0x0000, 0x3c2f,
+ 0x0000, 0x7346, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7347, 0x0000, 0x0000, 0x7348, 0x7349, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x734c, 0x734a, 0x4f3c, 0x0000, 0x734b, 0x0000, 0x4e6f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x734d, 0x0000, 0x4e5b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x734e, 0x477e, 0x0000,
+ 0x0000, 0x734f, 0x7351, 0x0000, 0x0000, 0x7352, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x0000, 0x5d60, 0x4b7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x322b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7354, 0x3550, 0x7355, 0x7356,
+ 0x7357, 0x0000, 0x3975, 0x0000, 0x7358, 0x0000, 0x0000, 0x0000,
+ 0x6054, 0x4c5b, 0x0000, 0x4263, 0x7359, 0x735b, 0x735a, 0x0000,
+ 0x735c, 0x0000, 0x0000, 0x0000, 0x0000, 0x735d, 0x0000, 0x0000,
+ 0x735e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x735f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7360, 0x0000, 0x7361, 0x7362,
+ 0x0000, 0x7363, 0x0000, 0x7364, 0x7365, 0x7366, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_9f[] = {
+ /* 0x9f00 - 0x9fff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7367,
+ 0x7368, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4524, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x385d, 0x0000, 0x736a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x414d, 0x736b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x736c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4921, 0x0000, 0x0000, 0x736d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x736e, 0x6337, 0x0000, 0x0000, 0x6c5a, 0x706d,
+ 0x0000, 0x0000, 0x736f, 0x0000, 0x7370, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7372,
+ 0x7373, 0x7374, 0x4e70, 0x7371, 0x0000, 0x0000, 0x7375, 0x7376,
+ 0x0000, 0x0000, 0x7378, 0x0000, 0x7377, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x737a, 0x0000, 0x0000, 0x0000, 0x737b, 0x7379,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e36, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x737c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x737d, 0x6354, 0x0000, 0x0000,
+ 0x737e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0208_ff[] = {
+ /* 0xff00 - 0xffff */
+ 0x0000, 0x212a, 0x2149, 0x2174, 0x2170, 0x2173, 0x2175, 0x216d,
+ 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x213e, 0x2125, 0x213f,
+ 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337,
+ 0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129,
+ 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347,
+ 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f,
+ 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357,
+ 0x2358, 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132,
+ 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367,
+ 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f,
+ 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377,
+ 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2141, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2131, 0x0000, 0x216f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const * const unicode_to_jisx0208_map[0x100] = {
+ /* 0x00XX - 0x0fXX */
+ unicode_to_jisx0208_00,
+ 0, 0,
+ unicode_to_jisx0208_03,
+ unicode_to_jisx0208_04,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x10XX - 0x1fXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x20XX - 0x2fXX */
+ unicode_to_jisx0208_20,
+ unicode_to_jisx0208_21,
+ unicode_to_jisx0208_22,
+ unicode_to_jisx0208_23,
+ unicode_to_jisx0208_24,
+ unicode_to_jisx0208_25,
+ unicode_to_jisx0208_26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x30XX - 0x3fXX */
+ unicode_to_jisx0208_30,
+ 0,
+ unicode_to_jisx0208_32,
+ unicode_to_jisx0208_33,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x40XX - 0x4fXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ unicode_to_jisx0208_4e,
+ unicode_to_jisx0208_4f,
+ /* 0x50XX - 0x5fXX */
+ unicode_to_jisx0208_50,
+ unicode_to_jisx0208_51,
+ unicode_to_jisx0208_52,
+ unicode_to_jisx0208_53,
+ unicode_to_jisx0208_54,
+ unicode_to_jisx0208_55,
+ unicode_to_jisx0208_56,
+ unicode_to_jisx0208_57,
+ unicode_to_jisx0208_58,
+ unicode_to_jisx0208_59,
+ unicode_to_jisx0208_5a,
+ unicode_to_jisx0208_5b,
+ unicode_to_jisx0208_5c,
+ unicode_to_jisx0208_5d,
+ unicode_to_jisx0208_5e,
+ unicode_to_jisx0208_5f,
+ /* 0x60XX - 0x6fXX */
+ unicode_to_jisx0208_60,
+ unicode_to_jisx0208_61,
+ unicode_to_jisx0208_62,
+ unicode_to_jisx0208_63,
+ unicode_to_jisx0208_64,
+ unicode_to_jisx0208_65,
+ unicode_to_jisx0208_66,
+ unicode_to_jisx0208_67,
+ unicode_to_jisx0208_68,
+ unicode_to_jisx0208_69,
+ unicode_to_jisx0208_6a,
+ unicode_to_jisx0208_6b,
+ unicode_to_jisx0208_6c,
+ unicode_to_jisx0208_6d,
+ unicode_to_jisx0208_6e,
+ unicode_to_jisx0208_6f,
+ /* 0x70XX - 0x7fXX */
+ unicode_to_jisx0208_70,
+ unicode_to_jisx0208_71,
+ unicode_to_jisx0208_72,
+ unicode_to_jisx0208_73,
+ unicode_to_jisx0208_74,
+ unicode_to_jisx0208_75,
+ unicode_to_jisx0208_76,
+ unicode_to_jisx0208_77,
+ unicode_to_jisx0208_78,
+ unicode_to_jisx0208_79,
+ unicode_to_jisx0208_7a,
+ unicode_to_jisx0208_7b,
+ unicode_to_jisx0208_7c,
+ unicode_to_jisx0208_7d,
+ unicode_to_jisx0208_7e,
+ unicode_to_jisx0208_7f,
+ /* 0x80XX - 0x8fXX */
+ unicode_to_jisx0208_80,
+ unicode_to_jisx0208_81,
+ unicode_to_jisx0208_82,
+ unicode_to_jisx0208_83,
+ unicode_to_jisx0208_84,
+ unicode_to_jisx0208_85,
+ unicode_to_jisx0208_86,
+ unicode_to_jisx0208_87,
+ unicode_to_jisx0208_88,
+ unicode_to_jisx0208_89,
+ unicode_to_jisx0208_8a,
+ unicode_to_jisx0208_8b,
+ unicode_to_jisx0208_8c,
+ unicode_to_jisx0208_8d,
+ unicode_to_jisx0208_8e,
+ unicode_to_jisx0208_8f,
+ /* 0x90XX - 0x9fXX */
+ unicode_to_jisx0208_90,
+ unicode_to_jisx0208_91,
+ unicode_to_jisx0208_92,
+ unicode_to_jisx0208_93,
+ unicode_to_jisx0208_94,
+ unicode_to_jisx0208_95,
+ unicode_to_jisx0208_96,
+ unicode_to_jisx0208_97,
+ unicode_to_jisx0208_98,
+ unicode_to_jisx0208_99,
+ unicode_to_jisx0208_9a,
+ unicode_to_jisx0208_9b,
+ unicode_to_jisx0208_9c,
+ unicode_to_jisx0208_9d,
+ unicode_to_jisx0208_9e,
+ unicode_to_jisx0208_9f,
+ /* 0xa0XX - 0xafXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0XX - 0xbfXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0XX - 0xcfXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0XX - 0xdfXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0XX - 0xefXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0XX - 0xffXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ unicode_to_jisx0208_ff,
+};
+
+static uint unicode11ToJisx0208(uint h, uint l)
+{
+ unsigned short const *table;
+
+ table = unicode_to_jisx0208_map[h];
+ if (table != 0) {
+ return table[l];
+ }
+ return 0x0000;
+}
+
+#ifdef USE_JISX0212
+
+/*
+ * This data is derived from Unicode 1.1,
+ * JIS X 0212 (1990) to Unicode mapping table version 0.9 .
+ * (In addition IBM Vender Defined Char included)
+ */
+static unsigned short const jisx0212_to_unicode[] = {
+ /* 0x2121 - 0x217e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2221 - 0x227e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02d8,
+ 0x02c7, 0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da, 0x007e,
+ 0x0384, 0x0385, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00a1, 0x00a6, 0x00bf, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00ba, 0x00aa, 0x00a9, 0x00ae, 0x2122,
+ 0x00a4, 0x2116, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2321 - 0x237e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2421 - 0x247e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2521 - 0x257e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2621 - 0x267e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c,
+ 0x0000, 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc,
+ 0x03c2, 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000,
+ /* 0x2721 - 0x277e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040e, 0x040f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f,
+ /* 0x2821 - 0x287e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2921 - 0x297e */
+ 0x00c6, 0x0110, 0x0000, 0x0126, 0x0000, 0x0132, 0x0000,
+ 0x0141, 0x013f, 0x0000, 0x014a, 0x00d8, 0x0152, 0x0000, 0x0166,
+ 0x00de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138,
+ 0x0142, 0x0140, 0x0149, 0x014b, 0x00f8, 0x0153, 0x00df, 0x0167,
+ 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2a21 - 0x2a7e */
+ 0x00c1, 0x00c0, 0x00c4, 0x00c2, 0x0102, 0x01cd, 0x0100,
+ 0x0104, 0x00c5, 0x00c3, 0x0106, 0x0108, 0x010c, 0x00c7, 0x010a,
+ 0x010e, 0x00c9, 0x00c8, 0x00cb, 0x00ca, 0x011a, 0x0116, 0x0112,
+ 0x0118, 0x0000, 0x011c, 0x011e, 0x0122, 0x0120, 0x0124, 0x00cd,
+ 0x00cc, 0x00cf, 0x00ce, 0x01cf, 0x0130, 0x012a, 0x012e, 0x0128,
+ 0x0134, 0x0136, 0x0139, 0x013d, 0x013b, 0x0143, 0x0147, 0x0145,
+ 0x00d1, 0x00d3, 0x00d2, 0x00d6, 0x00d4, 0x01d1, 0x0150, 0x014c,
+ 0x00d5, 0x0154, 0x0158, 0x0156, 0x015a, 0x015c, 0x0160, 0x015e,
+ 0x0164, 0x0162, 0x00da, 0x00d9, 0x00dc, 0x00db, 0x016c, 0x01d3,
+ 0x0170, 0x016a, 0x0172, 0x016e, 0x0168, 0x01d7, 0x01db, 0x01d9,
+ 0x01d5, 0x0174, 0x00dd, 0x0178, 0x0176, 0x0179, 0x017d, 0x017b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2b21 - 0x2b7e */
+ 0x00e1, 0x00e0, 0x00e4, 0x00e2, 0x0103, 0x01ce, 0x0101,
+ 0x0105, 0x00e5, 0x00e3, 0x0107, 0x0109, 0x010d, 0x00e7, 0x010b,
+ 0x010f, 0x00e9, 0x00e8, 0x00eb, 0x00ea, 0x011b, 0x0117, 0x0113,
+ 0x0119, 0x01f5, 0x011d, 0x011f, 0x0000, 0x0121, 0x0125, 0x00ed,
+ 0x00ec, 0x00ef, 0x00ee, 0x01d0, 0x0000, 0x012b, 0x012f, 0x0129,
+ 0x0135, 0x0137, 0x013a, 0x013e, 0x013c, 0x0144, 0x0148, 0x0146,
+ 0x00f1, 0x00f3, 0x00f2, 0x00f6, 0x00f4, 0x01d2, 0x0151, 0x014d,
+ 0x00f5, 0x0155, 0x0159, 0x0157, 0x015b, 0x015d, 0x0161, 0x015f,
+ 0x0165, 0x0163, 0x00fa, 0x00f9, 0x00fc, 0x00fb, 0x016d, 0x01d4,
+ 0x0171, 0x016b, 0x0173, 0x016f, 0x0169, 0x01d8, 0x01dc, 0x01da,
+ 0x01d6, 0x0175, 0x00fd, 0x00ff, 0x0177, 0x017a, 0x017e, 0x017c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2c21 - 0x2c7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2d21 - 0x2d7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2e21 - 0x2e7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2f21 - 0x2f7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x3021 - 0x307e */
+ 0x4e02, 0x4e04, 0x4e05, 0x4e0c, 0x4e12, 0x4e1f, 0x4e23,
+ 0x4e24, 0x4e28, 0x4e2b, 0x4e2e, 0x4e2f, 0x4e30, 0x4e35, 0x4e40,
+ 0x4e41, 0x4e44, 0x4e47, 0x4e51, 0x4e5a, 0x4e5c, 0x4e63, 0x4e68,
+ 0x4e69, 0x4e74, 0x4e75, 0x4e79, 0x4e7f, 0x4e8d, 0x4e96, 0x4e97,
+ 0x4e9d, 0x4eaf, 0x4eb9, 0x4ec3, 0x4ed0, 0x4eda, 0x4edb, 0x4ee0,
+ 0x4ee1, 0x4ee2, 0x4ee8, 0x4eef, 0x4ef1, 0x4ef3, 0x4ef5, 0x4efd,
+ 0x4efe, 0x4eff, 0x4f00, 0x4f02, 0x4f03, 0x4f08, 0x4f0b, 0x4f0c,
+ 0x4f12, 0x4f15, 0x4f16, 0x4f17, 0x4f19, 0x4f2e, 0x4f31, 0x4f60,
+ 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f40, 0x4f42,
+ 0x4f48, 0x4f49, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f58,
+ 0x4f5f, 0x4f63, 0x4f6a, 0x4f6c, 0x4f6e, 0x4f71, 0x4f77, 0x4f78,
+ 0x4f79, 0x4f7a, 0x4f7d, 0x4f7e, 0x4f81, 0x4f82, 0x4f84,
+ /* 0x3121 - 0x317e */
+ 0x4f85, 0x4f89, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92,
+ 0x4f93, 0x4f94, 0x4f97, 0x4f99, 0x4f9a, 0x4f9e, 0x4f9f, 0x4fb2,
+ 0x4fb7, 0x4fb9, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1,
+ 0x4fc5, 0x4fc6, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fcf,
+ 0x4fd2, 0x4fdc, 0x4fe0, 0x4fe2, 0x4ff0, 0x4ff2, 0x4ffc, 0x4ffd,
+ 0x4fff, 0x5000, 0x5001, 0x5004, 0x5007, 0x500a, 0x500c, 0x500e,
+ 0x5010, 0x5013, 0x5017, 0x5018, 0x501b, 0x501c, 0x501d, 0x501e,
+ 0x5022, 0x5027, 0x502e, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040,
+ 0x5041, 0x5042, 0x5045, 0x5046, 0x504a, 0x504c, 0x504e, 0x5051,
+ 0x5052, 0x5053, 0x5057, 0x5059, 0x505f, 0x5060, 0x5062, 0x5063,
+ 0x5066, 0x5067, 0x506a, 0x506d, 0x5070, 0x5071, 0x503b, 0x5081,
+ 0x5083, 0x5084, 0x5086, 0x508a, 0x508e, 0x508f, 0x5090,
+ /* 0x3221 - 0x327e */
+ 0x5092, 0x5093, 0x5094, 0x5096, 0x509b, 0x509c, 0x509e,
+ 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50aa, 0x50af, 0x50b0, 0x50b9,
+ 0x50ba, 0x50bd, 0x50c0, 0x50c3, 0x50c4, 0x50c7, 0x50cc, 0x50ce,
+ 0x50d0, 0x50d3, 0x50d4, 0x50d8, 0x50dc, 0x50dd, 0x50df, 0x50e2,
+ 0x50e4, 0x50e6, 0x50e8, 0x50e9, 0x50ef, 0x50f1, 0x50f6, 0x50fa,
+ 0x50fe, 0x5103, 0x5106, 0x5107, 0x5108, 0x510b, 0x510c, 0x510d,
+ 0x510e, 0x50f2, 0x5110, 0x5117, 0x5119, 0x511b, 0x511c, 0x511d,
+ 0x511e, 0x5123, 0x5127, 0x5128, 0x512c, 0x512d, 0x512f, 0x5131,
+ 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514a, 0x514f,
+ 0x5153, 0x5155, 0x5157, 0x5158, 0x515f, 0x5164, 0x5166, 0x517e,
+ 0x5183, 0x5184, 0x518b, 0x518e, 0x5198, 0x519d, 0x51a1, 0x51a3,
+ 0x51ad, 0x51b8, 0x51ba, 0x51bc, 0x51be, 0x51bf, 0x51c2,
+ /* 0x3321 - 0x337e */
+ 0x51c8, 0x51cf, 0x51d1, 0x51d2, 0x51d3, 0x51d5, 0x51d8,
+ 0x51de, 0x51e2, 0x51e5, 0x51ee, 0x51f2, 0x51f3, 0x51f4, 0x51f7,
+ 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218,
+ 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523c, 0x5245, 0x5249,
+ 0x5255, 0x5257, 0x5258, 0x525a, 0x525c, 0x525f, 0x5260, 0x5261,
+ 0x5266, 0x526e, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285,
+ 0x528a, 0x528c, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529a,
+ 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52af, 0x52b0, 0x52b6,
+ 0x52b7, 0x52b8, 0x52ba, 0x52bb, 0x52bd, 0x52c0, 0x52c4, 0x52c6,
+ 0x52c8, 0x52cc, 0x52cf, 0x52d1, 0x52d4, 0x52d6, 0x52db, 0x52dc,
+ 0x52e1, 0x52e5, 0x52e8, 0x52e9, 0x52ea, 0x52ec, 0x52f0, 0x52f1,
+ 0x52f4, 0x52f6, 0x52f7, 0x5300, 0x5303, 0x530a, 0x530b,
+ /* 0x3421 - 0x347e */
+ 0x530c, 0x5311, 0x5313, 0x5318, 0x531b, 0x531c, 0x531e,
+ 0x531f, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d,
+ 0x5330, 0x5332, 0x5335, 0x533c, 0x533d, 0x533e, 0x5342, 0x534c,
+ 0x534b, 0x5359, 0x535b, 0x5361, 0x5363, 0x5365, 0x536c, 0x536d,
+ 0x5372, 0x5379, 0x537e, 0x5383, 0x5387, 0x5388, 0x538e, 0x5393,
+ 0x5394, 0x5399, 0x539d, 0x53a1, 0x53a4, 0x53aa, 0x53ab, 0x53af,
+ 0x53b2, 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53ba, 0x53bd, 0x53c0,
+ 0x53c5, 0x53cf, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dd, 0x53de,
+ 0x53e0, 0x53e6, 0x53e7, 0x53f5, 0x5402, 0x5413, 0x541a, 0x5421,
+ 0x5427, 0x5428, 0x542a, 0x542f, 0x5431, 0x5434, 0x5435, 0x5443,
+ 0x5444, 0x5447, 0x544d, 0x544f, 0x545e, 0x5462, 0x5464, 0x5466,
+ 0x5467, 0x5469, 0x546b, 0x546d, 0x546e, 0x5474, 0x547f,
+ /* 0x3521 - 0x357e */
+ 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548d, 0x5491,
+ 0x5495, 0x5496, 0x549c, 0x549f, 0x54a1, 0x54a6, 0x54a7, 0x54a9,
+ 0x54aa, 0x54ad, 0x54ae, 0x54b1, 0x54b7, 0x54b9, 0x54ba, 0x54bb,
+ 0x54bf, 0x54c6, 0x54ca, 0x54cd, 0x54ce, 0x54e0, 0x54ea, 0x54ec,
+ 0x54ef, 0x54f6, 0x54fc, 0x54fe, 0x54ff, 0x5500, 0x5501, 0x5505,
+ 0x5508, 0x5509, 0x550c, 0x550d, 0x550e, 0x5515, 0x552a, 0x552b,
+ 0x5532, 0x5535, 0x5536, 0x553b, 0x553c, 0x553d, 0x5541, 0x5547,
+ 0x5549, 0x554a, 0x554d, 0x5550, 0x5551, 0x5558, 0x555a, 0x555b,
+ 0x555e, 0x5560, 0x5561, 0x5564, 0x5566, 0x557f, 0x5581, 0x5582,
+ 0x5586, 0x5588, 0x558e, 0x558f, 0x5591, 0x5592, 0x5593, 0x5594,
+ 0x5597, 0x55a3, 0x55a4, 0x55ad, 0x55b2, 0x55bf, 0x55c1, 0x55c3,
+ 0x55c6, 0x55c9, 0x55cb, 0x55cc, 0x55ce, 0x55d1, 0x55d2,
+ /* 0x3621 - 0x367e */
+ 0x55d3, 0x55d7, 0x55d8, 0x55db, 0x55de, 0x55e2, 0x55e9,
+ 0x55f6, 0x55ff, 0x5605, 0x5608, 0x560a, 0x560d, 0x560e, 0x560f,
+ 0x5610, 0x5611, 0x5612, 0x5619, 0x562c, 0x5630, 0x5633, 0x5635,
+ 0x5637, 0x5639, 0x563b, 0x563c, 0x563d, 0x563f, 0x5640, 0x5641,
+ 0x5643, 0x5644, 0x5646, 0x5649, 0x564b, 0x564d, 0x564f, 0x5654,
+ 0x565e, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566d,
+ 0x566f, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568b,
+ 0x568c, 0x5695, 0x5699, 0x569a, 0x569d, 0x569e, 0x569f, 0x56a6,
+ 0x56a7, 0x56a8, 0x56a9, 0x56ab, 0x56ac, 0x56ad, 0x56b1, 0x56b3,
+ 0x56b7, 0x56be, 0x56c5, 0x56c9, 0x56ca, 0x56cb, 0x56cf, 0x56d0,
+ 0x56cc, 0x56cd, 0x56d9, 0x56dc, 0x56dd, 0x56df, 0x56e1, 0x56e4,
+ 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56f1, 0x56eb, 0x56ed,
+ /* 0x3721 - 0x377e */
+ 0x56f6, 0x56f7, 0x5701, 0x5702, 0x5707, 0x570a, 0x570c,
+ 0x5711, 0x5715, 0x571a, 0x571b, 0x571d, 0x5720, 0x5722, 0x5723,
+ 0x5724, 0x5725, 0x5729, 0x572a, 0x572c, 0x572e, 0x572f, 0x5733,
+ 0x5734, 0x573d, 0x573e, 0x573f, 0x5745, 0x5746, 0x574c, 0x574d,
+ 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576b, 0x576d, 0x576e,
+ 0x576f, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779,
+ 0x577a, 0x577b, 0x577c, 0x577e, 0x5781, 0x5783, 0x578c, 0x5794,
+ 0x5797, 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a1,
+ 0x5795, 0x57a7, 0x57a8, 0x57a9, 0x57ac, 0x57b8, 0x57bd, 0x57c7,
+ 0x57c8, 0x57cc, 0x57cf, 0x57d5, 0x57dd, 0x57de, 0x57e4, 0x57e6,
+ 0x57e7, 0x57e9, 0x57ed, 0x57f0, 0x57f5, 0x57f6, 0x57f8, 0x57fd,
+ 0x57fe, 0x57ff, 0x5803, 0x5804, 0x5808, 0x5809, 0x57e1,
+ /* 0x3821 - 0x387e */
+ 0x580c, 0x580d, 0x581b, 0x581e, 0x581f, 0x5820, 0x5826,
+ 0x5827, 0x582d, 0x5832, 0x5839, 0x583f, 0x5849, 0x584c, 0x584d,
+ 0x584f, 0x5850, 0x5855, 0x585f, 0x5861, 0x5864, 0x5867, 0x5868,
+ 0x5878, 0x587c, 0x587f, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889,
+ 0x588a, 0x588c, 0x588d, 0x588f, 0x5890, 0x5894, 0x5896, 0x589d,
+ 0x58a0, 0x58a1, 0x58a2, 0x58a6, 0x58a9, 0x58b1, 0x58b2, 0x58c4,
+ 0x58bc, 0x58c2, 0x58c8, 0x58cd, 0x58ce, 0x58d0, 0x58d2, 0x58d4,
+ 0x58d6, 0x58da, 0x58dd, 0x58e1, 0x58e2, 0x58e9, 0x58f3, 0x5905,
+ 0x5906, 0x590b, 0x590c, 0x5912, 0x5913, 0x5914, 0x8641, 0x591d,
+ 0x5921, 0x5923, 0x5924, 0x5928, 0x592f, 0x5930, 0x5933, 0x5935,
+ 0x5936, 0x593f, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595b,
+ 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x596b, 0x596d,
+ /* 0x3921 - 0x397e */
+ 0x596f, 0x5972, 0x5975, 0x5976, 0x5979, 0x597b, 0x597c,
+ 0x598b, 0x598c, 0x598e, 0x5992, 0x5995, 0x5997, 0x599f, 0x59a4,
+ 0x59a7, 0x59ad, 0x59ae, 0x59af, 0x59b0, 0x59b3, 0x59b7, 0x59ba,
+ 0x59bc, 0x59c1, 0x59c3, 0x59c4, 0x59c8, 0x59ca, 0x59cd, 0x59d2,
+ 0x59dd, 0x59de, 0x59df, 0x59e3, 0x59e4, 0x59e7, 0x59ee, 0x59ef,
+ 0x59f1, 0x59f2, 0x59f4, 0x59f7, 0x5a00, 0x5a04, 0x5a0c, 0x5a0d,
+ 0x5a0e, 0x5a12, 0x5a13, 0x5a1e, 0x5a23, 0x5a24, 0x5a27, 0x5a28,
+ 0x5a2a, 0x5a2d, 0x5a30, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4c,
+ 0x5a50, 0x5a55, 0x5a5e, 0x5a63, 0x5a65, 0x5a67, 0x5a6d, 0x5a77,
+ 0x5a7a, 0x5a7b, 0x5a7e, 0x5a8b, 0x5a90, 0x5a93, 0x5a96, 0x5a99,
+ 0x5a9c, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa2, 0x5aa7, 0x5aac, 0x5ab1,
+ 0x5ab2, 0x5ab3, 0x5ab5, 0x5ab8, 0x5aba, 0x5abb, 0x5abf,
+ /* 0x3a21 - 0x3a7e */
+ 0x5ac4, 0x5ac6, 0x5ac8, 0x5acf, 0x5ada, 0x5adc, 0x5ae0,
+ 0x5ae5, 0x5aea, 0x5aee, 0x5af5, 0x5af6, 0x5afd, 0x5b00, 0x5b01,
+ 0x5b08, 0x5b17, 0x5b34, 0x5b19, 0x5b1b, 0x5b1d, 0x5b21, 0x5b25,
+ 0x5b2d, 0x5b38, 0x5b41, 0x5b4b, 0x5b4c, 0x5b52, 0x5b56, 0x5b5e,
+ 0x5b68, 0x5b6e, 0x5b6f, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, 0x5b81,
+ 0x5b84, 0x5b86, 0x5b8a, 0x5b8e, 0x5b90, 0x5b91, 0x5b93, 0x5b94,
+ 0x5b96, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5baf, 0x5bb1, 0x5bb2,
+ 0x5bb7, 0x5bba, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bcd, 0x5bcf, 0x5bd6,
+ 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5be0, 0x5bef, 0x5bf1, 0x5bf4,
+ 0x5bfd, 0x5c0c, 0x5c17, 0x5c1e, 0x5c1f, 0x5c23, 0x5c26, 0x5c29,
+ 0x5c2b, 0x5c2c, 0x5c2e, 0x5c30, 0x5c32, 0x5c35, 0x5c36, 0x5c59,
+ 0x5c5a, 0x5c5c, 0x5c62, 0x5c63, 0x5c67, 0x5c68, 0x5c69,
+ /* 0x3b21 - 0x3b7e */
+ 0x5c6d, 0x5c70, 0x5c74, 0x5c75, 0x5c7a, 0x5c7b, 0x5c7c,
+ 0x5c7d, 0x5c87, 0x5c88, 0x5c8a, 0x5c8f, 0x5c92, 0x5c9d, 0x5c9f,
+ 0x5ca0, 0x5ca2, 0x5ca3, 0x5ca6, 0x5caa, 0x5cb2, 0x5cb4, 0x5cb5,
+ 0x5cba, 0x5cc9, 0x5ccb, 0x5cd2, 0x5cdd, 0x5cd7, 0x5cee, 0x5cf1,
+ 0x5cf2, 0x5cf4, 0x5d01, 0x5d06, 0x5d0d, 0x5d12, 0x5d2b, 0x5d23,
+ 0x5d24, 0x5d26, 0x5d27, 0x5d31, 0x5d34, 0x5d39, 0x5d3d, 0x5d3f,
+ 0x5d42, 0x5d43, 0x5d46, 0x5d48, 0x5d55, 0x5d51, 0x5d59, 0x5d4a,
+ 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d64, 0x5d6a, 0x5d6d, 0x5d70,
+ 0x5d79, 0x5d7a, 0x5d7e, 0x5d7f, 0x5d81, 0x5d83, 0x5d88, 0x5d8a,
+ 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d99, 0x5d9b, 0x5d9f, 0x5da0,
+ 0x5da7, 0x5dab, 0x5db0, 0x5db4, 0x5db8, 0x5db9, 0x5dc3, 0x5dc7,
+ 0x5dcb, 0x5dd0, 0x5dce, 0x5dd8, 0x5dd9, 0x5de0, 0x5de4,
+ /* 0x3c21 - 0x3c7e */
+ 0x5de9, 0x5df8, 0x5df9, 0x5e00, 0x5e07, 0x5e0d, 0x5e12,
+ 0x5e14, 0x5e15, 0x5e18, 0x5e1f, 0x5e20, 0x5e2e, 0x5e28, 0x5e32,
+ 0x5e35, 0x5e3e, 0x5e4b, 0x5e50, 0x5e49, 0x5e51, 0x5e56, 0x5e58,
+ 0x5e5b, 0x5e5c, 0x5e5e, 0x5e68, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d,
+ 0x5e6e, 0x5e70, 0x5e80, 0x5e8b, 0x5e8e, 0x5ea2, 0x5ea4, 0x5ea5,
+ 0x5ea8, 0x5eaa, 0x5eac, 0x5eb1, 0x5eb3, 0x5ebd, 0x5ebe, 0x5ebf,
+ 0x5ec6, 0x5ecc, 0x5ecb, 0x5ece, 0x5ed1, 0x5ed2, 0x5ed4, 0x5ed5,
+ 0x5edc, 0x5ede, 0x5ee5, 0x5eeb, 0x5f02, 0x5f06, 0x5f07, 0x5f08,
+ 0x5f0e, 0x5f19, 0x5f1c, 0x5f1d, 0x5f21, 0x5f22, 0x5f23, 0x5f24,
+ 0x5f28, 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f34, 0x5f36, 0x5f3b,
+ 0x5f3d, 0x5f3f, 0x5f40, 0x5f44, 0x5f45, 0x5f47, 0x5f4d, 0x5f50,
+ 0x5f54, 0x5f58, 0x5f5b, 0x5f60, 0x5f63, 0x5f64, 0x5f67,
+ /* 0x3d21 - 0x3d7e */
+ 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f78, 0x5f7a, 0x5f7d,
+ 0x5f7e, 0x5f89, 0x5f8d, 0x5f8f, 0x5f96, 0x5f9c, 0x5f9d, 0x5fa2,
+ 0x5fa7, 0x5fab, 0x5fa4, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb8,
+ 0x5fc4, 0x5fc7, 0x5fc8, 0x5fc9, 0x5fcb, 0x5fd0, 0x5fd1, 0x5fd2,
+ 0x5fd3, 0x5fd4, 0x5fde, 0x5fe1, 0x5fe2, 0x5fe8, 0x5fe9, 0x5fea,
+ 0x5fec, 0x5fed, 0x5fee, 0x5fef, 0x5ff2, 0x5ff3, 0x5ff6, 0x5ffa,
+ 0x5ffc, 0x6007, 0x600a, 0x600d, 0x6013, 0x6014, 0x6017, 0x6018,
+ 0x601a, 0x601f, 0x6024, 0x602d, 0x6033, 0x6035, 0x6040, 0x6047,
+ 0x6048, 0x6049, 0x604c, 0x6051, 0x6054, 0x6056, 0x6057, 0x605d,
+ 0x6061, 0x6067, 0x6071, 0x607e, 0x607f, 0x6082, 0x6086, 0x6088,
+ 0x608a, 0x608e, 0x6091, 0x6093, 0x6095, 0x6098, 0x609d, 0x609e,
+ 0x60a2, 0x60a4, 0x60a5, 0x60a8, 0x60b0, 0x60b1, 0x60b7,
+ /* 0x3e21 - 0x3e7e */
+ 0x60bb, 0x60be, 0x60c2, 0x60c4, 0x60c8, 0x60c9, 0x60ca,
+ 0x60cb, 0x60ce, 0x60cf, 0x60d4, 0x60d5, 0x60d9, 0x60db, 0x60dd,
+ 0x60de, 0x60e2, 0x60e5, 0x60f2, 0x60f5, 0x60f8, 0x60fc, 0x60fd,
+ 0x6102, 0x6107, 0x610a, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113,
+ 0x6114, 0x6116, 0x6117, 0x6119, 0x611c, 0x611e, 0x6122, 0x612a,
+ 0x612b, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141,
+ 0x6145, 0x6146, 0x6149, 0x615e, 0x6160, 0x616c, 0x6172, 0x6178,
+ 0x617b, 0x617c, 0x617f, 0x6180, 0x6181, 0x6183, 0x6184, 0x618b,
+ 0x618d, 0x6192, 0x6193, 0x6197, 0x6198, 0x619c, 0x619d, 0x619f,
+ 0x61a0, 0x61a5, 0x61a8, 0x61aa, 0x61ad, 0x61b8, 0x61b9, 0x61bc,
+ 0x61c0, 0x61c1, 0x61c2, 0x61ce, 0x61cf, 0x61d5, 0x61dc, 0x61dd,
+ 0x61de, 0x61df, 0x61e1, 0x61e2, 0x61e7, 0x61e9, 0x61e5,
+ /* 0x3f21 - 0x3f7e */
+ 0x61ec, 0x61ed, 0x61ef, 0x6201, 0x6203, 0x6204, 0x6207,
+ 0x6213, 0x6215, 0x621c, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229,
+ 0x622b, 0x6239, 0x623d, 0x6242, 0x6243, 0x6244, 0x6246, 0x624c,
+ 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625a, 0x625c, 0x6264,
+ 0x626d, 0x626f, 0x6273, 0x627a, 0x627d, 0x628d, 0x628e, 0x628f,
+ 0x6290, 0x62a6, 0x62a8, 0x62b3, 0x62b6, 0x62b7, 0x62ba, 0x62be,
+ 0x62bf, 0x62c4, 0x62ce, 0x62d5, 0x62d6, 0x62da, 0x62ea, 0x62f2,
+ 0x62f4, 0x62fc, 0x62fd, 0x6303, 0x6304, 0x630a, 0x630b, 0x630d,
+ 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632a, 0x632d, 0x6335,
+ 0x6336, 0x6339, 0x633c, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346,
+ 0x634a, 0x634b, 0x634e, 0x6352, 0x6353, 0x6354, 0x6358, 0x635b,
+ 0x6365, 0x6366, 0x636c, 0x636d, 0x6371, 0x6374, 0x6375,
+ /* 0x4021 - 0x407e */
+ 0x6378, 0x637c, 0x637d, 0x637f, 0x6382, 0x6384, 0x6387,
+ 0x638a, 0x6390, 0x6394, 0x6395, 0x6399, 0x639a, 0x639e, 0x63a4,
+ 0x63a6, 0x63ad, 0x63ae, 0x63af, 0x63bd, 0x63c1, 0x63c5, 0x63c8,
+ 0x63ce, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63dc, 0x63e0, 0x63e5,
+ 0x63ea, 0x63ec, 0x63f2, 0x63f3, 0x63f5, 0x63f8, 0x63f9, 0x6409,
+ 0x640a, 0x6410, 0x6412, 0x6414, 0x6418, 0x641e, 0x6420, 0x6422,
+ 0x6424, 0x6425, 0x6429, 0x642a, 0x642f, 0x6430, 0x6435, 0x643d,
+ 0x643f, 0x644b, 0x644f, 0x6451, 0x6452, 0x6453, 0x6454, 0x645a,
+ 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6463, 0x646d,
+ 0x6473, 0x6474, 0x647b, 0x647d, 0x6485, 0x6487, 0x648f, 0x6490,
+ 0x6491, 0x6498, 0x6499, 0x649b, 0x649d, 0x649f, 0x64a1, 0x64a3,
+ 0x64a6, 0x64a8, 0x64ac, 0x64b3, 0x64bd, 0x64be, 0x64bf,
+ /* 0x4121 - 0x417e */
+ 0x64c4, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64ce, 0x64d0,
+ 0x64d1, 0x64d5, 0x64d7, 0x64e4, 0x64e5, 0x64e9, 0x64ea, 0x64ed,
+ 0x64f0, 0x64f5, 0x64f7, 0x64fb, 0x64ff, 0x6501, 0x6504, 0x6508,
+ 0x6509, 0x650a, 0x650f, 0x6513, 0x6514, 0x6516, 0x6519, 0x651b,
+ 0x651e, 0x651f, 0x6522, 0x6526, 0x6529, 0x652e, 0x6531, 0x653a,
+ 0x653c, 0x653d, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554,
+ 0x655f, 0x6560, 0x6567, 0x656b, 0x657a, 0x657d, 0x6581, 0x6585,
+ 0x658a, 0x6592, 0x6595, 0x6598, 0x659d, 0x65a0, 0x65a3, 0x65a6,
+ 0x65ae, 0x65b2, 0x65b3, 0x65b4, 0x65bf, 0x65c2, 0x65c8, 0x65c9,
+ 0x65ce, 0x65d0, 0x65d4, 0x65d6, 0x65d8, 0x65df, 0x65f0, 0x65f2,
+ 0x65f4, 0x65f5, 0x65f9, 0x65fe, 0x65ff, 0x6600, 0x6604, 0x6608,
+ 0x6609, 0x660d, 0x6611, 0x6612, 0x6615, 0x6616, 0x661d,
+ /* 0x4221 - 0x427e */
+ 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629,
+ 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, 0x6631, 0x6633, 0x6639,
+ 0x6637, 0x6640, 0x6645, 0x6646, 0x664a, 0x664c, 0x6651, 0x664e,
+ 0x6657, 0x6658, 0x6659, 0x665b, 0x665c, 0x6660, 0x6661, 0x66fb,
+ 0x666a, 0x666b, 0x666c, 0x667e, 0x6673, 0x6675, 0x667f, 0x6677,
+ 0x6678, 0x6679, 0x667b, 0x6680, 0x667c, 0x668b, 0x668c, 0x668d,
+ 0x6690, 0x6692, 0x6699, 0x669a, 0x669b, 0x669c, 0x669f, 0x66a0,
+ 0x66a4, 0x66ad, 0x66b1, 0x66b2, 0x66b5, 0x66bb, 0x66bf, 0x66c0,
+ 0x66c2, 0x66c3, 0x66c8, 0x66cc, 0x66ce, 0x66cf, 0x66d4, 0x66db,
+ 0x66df, 0x66e8, 0x66eb, 0x66ec, 0x66ee, 0x66fa, 0x6705, 0x6707,
+ 0x670e, 0x6713, 0x6719, 0x671c, 0x6720, 0x6722, 0x6733, 0x673e,
+ 0x6745, 0x6747, 0x6748, 0x674c, 0x6754, 0x6755, 0x675d,
+ /* 0x4321 - 0x437e */
+ 0x6766, 0x676c, 0x676e, 0x6774, 0x6776, 0x677b, 0x6781,
+ 0x6784, 0x678e, 0x678f, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799,
+ 0x679b, 0x67b0, 0x67b1, 0x67b2, 0x67b5, 0x67bb, 0x67bc, 0x67bd,
+ 0x67f9, 0x67c0, 0x67c2, 0x67c3, 0x67c5, 0x67c8, 0x67c9, 0x67d2,
+ 0x67d7, 0x67d9, 0x67dc, 0x67e1, 0x67e6, 0x67f0, 0x67f2, 0x67f6,
+ 0x67f7, 0x6852, 0x6814, 0x6819, 0x681d, 0x681f, 0x6828, 0x6827,
+ 0x682c, 0x682d, 0x682f, 0x6830, 0x6831, 0x6833, 0x683b, 0x683f,
+ 0x6844, 0x6845, 0x684a, 0x684c, 0x6855, 0x6857, 0x6858, 0x685b,
+ 0x686b, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879,
+ 0x687a, 0x687b, 0x687c, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896,
+ 0x6898, 0x689a, 0x689c, 0x68a1, 0x68a3, 0x68a5, 0x68a9, 0x68aa,
+ 0x68ae, 0x68b2, 0x68bb, 0x68c5, 0x68c8, 0x68cc, 0x68cf,
+ /* 0x4421 - 0x447e */
+ 0x68d0, 0x68d1, 0x68d3, 0x68d6, 0x68d9, 0x68dc, 0x68dd,
+ 0x68e5, 0x68e8, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68f0, 0x68f1,
+ 0x68f5, 0x68f6, 0x68fb, 0x68fc, 0x68fd, 0x6906, 0x6909, 0x690a,
+ 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935,
+ 0x6938, 0x693b, 0x6942, 0x6945, 0x6949, 0x694e, 0x6957, 0x695b,
+ 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696c, 0x6970,
+ 0x6971, 0x6972, 0x697a, 0x697b, 0x697f, 0x6980, 0x698d, 0x6992,
+ 0x6996, 0x6998, 0x69a1, 0x69a5, 0x69a6, 0x69a8, 0x69ab, 0x69ad,
+ 0x69af, 0x69b7, 0x69b8, 0x69ba, 0x69bc, 0x69c5, 0x69c8, 0x69d1,
+ 0x69d6, 0x69d7, 0x69e2, 0x69e5, 0x69ee, 0x69ef, 0x69f1, 0x69f3,
+ 0x69f5, 0x69fe, 0x6a00, 0x6a01, 0x6a03, 0x6a0f, 0x6a11, 0x6a15,
+ 0x6a1a, 0x6a1d, 0x6a20, 0x6a24, 0x6a28, 0x6a30, 0x6a32,
+ /* 0x4521 - 0x457e */
+ 0x6a34, 0x6a37, 0x6a3b, 0x6a3e, 0x6a3f, 0x6a45, 0x6a46,
+ 0x6a49, 0x6a4a, 0x6a4e, 0x6a50, 0x6a51, 0x6a52, 0x6a55, 0x6a56,
+ 0x6a5b, 0x6a64, 0x6a67, 0x6a6a, 0x6a71, 0x6a73, 0x6a7e, 0x6a81,
+ 0x6a83, 0x6a86, 0x6a87, 0x6a89, 0x6a8b, 0x6a91, 0x6a9b, 0x6a9d,
+ 0x6a9e, 0x6a9f, 0x6aa5, 0x6aab, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab4,
+ 0x6abd, 0x6abe, 0x6abf, 0x6ac6, 0x6ac9, 0x6ac8, 0x6acc, 0x6ad0,
+ 0x6ad4, 0x6ad5, 0x6ad6, 0x6adc, 0x6add, 0x6ae4, 0x6ae7, 0x6aec,
+ 0x6af0, 0x6af1, 0x6af2, 0x6afc, 0x6afd, 0x6b02, 0x6b03, 0x6b06,
+ 0x6b07, 0x6b09, 0x6b0f, 0x6b10, 0x6b11, 0x6b17, 0x6b1b, 0x6b1e,
+ 0x6b24, 0x6b28, 0x6b2b, 0x6b2c, 0x6b2f, 0x6b35, 0x6b36, 0x6b3b,
+ 0x6b3f, 0x6b46, 0x6b4a, 0x6b4d, 0x6b52, 0x6b56, 0x6b58, 0x6b5d,
+ 0x6b60, 0x6b67, 0x6b6b, 0x6b6e, 0x6b70, 0x6b75, 0x6b7d,
+ /* 0x4621 - 0x467e */
+ 0x6b7e, 0x6b82, 0x6b85, 0x6b97, 0x6b9b, 0x6b9f, 0x6ba0,
+ 0x6ba2, 0x6ba3, 0x6ba8, 0x6ba9, 0x6bac, 0x6bad, 0x6bae, 0x6bb0,
+ 0x6bb8, 0x6bb9, 0x6bbd, 0x6bbe, 0x6bc3, 0x6bc4, 0x6bc9, 0x6bcc,
+ 0x6bd6, 0x6bda, 0x6be1, 0x6be3, 0x6be6, 0x6be7, 0x6bee, 0x6bf1,
+ 0x6bf7, 0x6bf9, 0x6bff, 0x6c02, 0x6c04, 0x6c05, 0x6c09, 0x6c0d,
+ 0x6c0e, 0x6c10, 0x6c12, 0x6c19, 0x6c1f, 0x6c26, 0x6c27, 0x6c28,
+ 0x6c2c, 0x6c2e, 0x6c33, 0x6c35, 0x6c36, 0x6c3a, 0x6c3b, 0x6c3f,
+ 0x6c4a, 0x6c4b, 0x6c4d, 0x6c4f, 0x6c52, 0x6c54, 0x6c59, 0x6c5b,
+ 0x6c5c, 0x6c6b, 0x6c6d, 0x6c6f, 0x6c74, 0x6c76, 0x6c78, 0x6c79,
+ 0x6c7b, 0x6c85, 0x6c86, 0x6c87, 0x6c89, 0x6c94, 0x6c95, 0x6c97,
+ 0x6c98, 0x6c9c, 0x6c9f, 0x6cb0, 0x6cb2, 0x6cb4, 0x6cc2, 0x6cc6,
+ 0x6ccd, 0x6ccf, 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd4, 0x6cd6,
+ /* 0x4721 - 0x477e */
+ 0x6cda, 0x6cdc, 0x6ce0, 0x6ce7, 0x6ce9, 0x6ceb, 0x6cec,
+ 0x6cee, 0x6cf2, 0x6cf4, 0x6d04, 0x6d07, 0x6d0a, 0x6d0e, 0x6d0f,
+ 0x6d11, 0x6d13, 0x6d1a, 0x6d26, 0x6d27, 0x6d28, 0x6c67, 0x6d2e,
+ 0x6d2f, 0x6d31, 0x6d39, 0x6d3c, 0x6d3f, 0x6d57, 0x6d5e, 0x6d5f,
+ 0x6d61, 0x6d65, 0x6d67, 0x6d6f, 0x6d70, 0x6d7c, 0x6d82, 0x6d87,
+ 0x6d91, 0x6d92, 0x6d94, 0x6d96, 0x6d97, 0x6d98, 0x6daa, 0x6dac,
+ 0x6db4, 0x6db7, 0x6db9, 0x6dbd, 0x6dbf, 0x6dc4, 0x6dc8, 0x6dca,
+ 0x6dce, 0x6dcf, 0x6dd6, 0x6ddb, 0x6ddd, 0x6ddf, 0x6de0, 0x6de2,
+ 0x6de5, 0x6de9, 0x6def, 0x6df0, 0x6df4, 0x6df6, 0x6dfc, 0x6e00,
+ 0x6e04, 0x6e1e, 0x6e22, 0x6e27, 0x6e32, 0x6e36, 0x6e39, 0x6e3b,
+ 0x6e3c, 0x6e44, 0x6e45, 0x6e48, 0x6e49, 0x6e4b, 0x6e4f, 0x6e51,
+ 0x6e52, 0x6e53, 0x6e54, 0x6e57, 0x6e5c, 0x6e5d, 0x6e5e,
+ /* 0x4821 - 0x487e */
+ 0x6e62, 0x6e63, 0x6e68, 0x6e73, 0x6e7b, 0x6e7d, 0x6e8d,
+ 0x6e93, 0x6e99, 0x6ea0, 0x6ea7, 0x6ead, 0x6eae, 0x6eb1, 0x6eb3,
+ 0x6ebb, 0x6ebf, 0x6ec0, 0x6ec1, 0x6ec3, 0x6ec7, 0x6ec8, 0x6eca,
+ 0x6ecd, 0x6ece, 0x6ecf, 0x6eeb, 0x6eed, 0x6eee, 0x6ef9, 0x6efb,
+ 0x6efd, 0x6f04, 0x6f08, 0x6f0a, 0x6f0c, 0x6f0d, 0x6f16, 0x6f18,
+ 0x6f1a, 0x6f1b, 0x6f26, 0x6f29, 0x6f2a, 0x6f2f, 0x6f30, 0x6f33,
+ 0x6f36, 0x6f3b, 0x6f3c, 0x6f2d, 0x6f4f, 0x6f51, 0x6f52, 0x6f53,
+ 0x6f57, 0x6f59, 0x6f5a, 0x6f5d, 0x6f5e, 0x6f61, 0x6f62, 0x6f68,
+ 0x6f6c, 0x6f7d, 0x6f7e, 0x6f83, 0x6f87, 0x6f88, 0x6f8b, 0x6f8c,
+ 0x6f8d, 0x6f90, 0x6f92, 0x6f93, 0x6f94, 0x6f96, 0x6f9a, 0x6f9f,
+ 0x6fa0, 0x6fa5, 0x6fa6, 0x6fa7, 0x6fa8, 0x6fae, 0x6faf, 0x6fb0,
+ 0x6fb5, 0x6fb6, 0x6fbc, 0x6fc5, 0x6fc7, 0x6fc8, 0x6fca,
+ /* 0x4921 - 0x497e */
+ 0x6fda, 0x6fde, 0x6fe8, 0x6fe9, 0x6ff0, 0x6ff5, 0x6ff9,
+ 0x6ffc, 0x6ffd, 0x7000, 0x7005, 0x7006, 0x7007, 0x700d, 0x7017,
+ 0x7020, 0x7023, 0x702f, 0x7034, 0x7037, 0x7039, 0x703c, 0x7043,
+ 0x7044, 0x7048, 0x7049, 0x704a, 0x704b, 0x7054, 0x7055, 0x705d,
+ 0x705e, 0x704e, 0x7064, 0x7065, 0x706c, 0x706e, 0x7075, 0x7076,
+ 0x707e, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097,
+ 0x7098, 0x709b, 0x70a4, 0x70ab, 0x70b0, 0x70b1, 0x70b4, 0x70b7,
+ 0x70ca, 0x70d1, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d8, 0x70dc,
+ 0x70e4, 0x70fa, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710b,
+ 0x710c, 0x710f, 0x711e, 0x7120, 0x712b, 0x712d, 0x712f, 0x7130,
+ 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714a, 0x714b,
+ 0x7150, 0x7152, 0x7157, 0x715a, 0x715c, 0x715e, 0x7160,
+ /* 0x4a21 - 0x4a7e */
+ 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718c, 0x7192,
+ 0x719a, 0x719b, 0x71a0, 0x71a2, 0x71af, 0x71b0, 0x71b2, 0x71b3,
+ 0x71ba, 0x71bf, 0x71c0, 0x71c1, 0x71c4, 0x71cb, 0x71cc, 0x71d3,
+ 0x71d6, 0x71d9, 0x71da, 0x71dc, 0x71f8, 0x71fe, 0x7200, 0x7207,
+ 0x7208, 0x7209, 0x7213, 0x7217, 0x721a, 0x721d, 0x721f, 0x7224,
+ 0x722b, 0x722f, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243,
+ 0x7245, 0x724e, 0x724f, 0x7250, 0x7253, 0x7255, 0x7256, 0x725a,
+ 0x725c, 0x725e, 0x7260, 0x7263, 0x7268, 0x726b, 0x726e, 0x726f,
+ 0x7271, 0x7277, 0x7278, 0x727b, 0x727c, 0x727f, 0x7284, 0x7289,
+ 0x728d, 0x728e, 0x7293, 0x729b, 0x72a8, 0x72ad, 0x72ae, 0x72b1,
+ 0x72b4, 0x72be, 0x72c1, 0x72c7, 0x72c9, 0x72cc, 0x72d5, 0x72d6,
+ 0x72d8, 0x72df, 0x72e5, 0x72f3, 0x72f4, 0x72fa, 0x72fb,
+ /* 0x4b21 - 0x4b7e */
+ 0x72fe, 0x7302, 0x7304, 0x7305, 0x7307, 0x730b, 0x730d,
+ 0x7312, 0x7313, 0x7318, 0x7319, 0x731e, 0x7322, 0x7324, 0x7327,
+ 0x7328, 0x732c, 0x7331, 0x7332, 0x7335, 0x733a, 0x733b, 0x733d,
+ 0x7343, 0x734d, 0x7350, 0x7352, 0x7356, 0x7358, 0x735d, 0x735e,
+ 0x735f, 0x7360, 0x7366, 0x7367, 0x7369, 0x736b, 0x736c, 0x736e,
+ 0x736f, 0x7371, 0x7377, 0x7379, 0x737c, 0x7380, 0x7381, 0x7383,
+ 0x7385, 0x7386, 0x738e, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398,
+ 0x739c, 0x739e, 0x739f, 0x73a0, 0x73a2, 0x73a5, 0x73a6, 0x73aa,
+ 0x73ab, 0x73ad, 0x73b5, 0x73b7, 0x73b9, 0x73bc, 0x73bd, 0x73bf,
+ 0x73c5, 0x73c6, 0x73c9, 0x73cb, 0x73cc, 0x73cf, 0x73d2, 0x73d3,
+ 0x73d6, 0x73d9, 0x73dd, 0x73e1, 0x73e3, 0x73e6, 0x73e7, 0x73e9,
+ 0x73f4, 0x73f5, 0x73f7, 0x73f9, 0x73fa, 0x73fb, 0x73fd,
+ /* 0x4c21 - 0x4c7e */
+ 0x73ff, 0x7400, 0x7401, 0x7404, 0x7407, 0x740a, 0x7411,
+ 0x741a, 0x741b, 0x7424, 0x7426, 0x7428, 0x7429, 0x742a, 0x742b,
+ 0x742c, 0x742d, 0x742e, 0x742f, 0x7430, 0x7431, 0x7439, 0x7440,
+ 0x7443, 0x7444, 0x7446, 0x7447, 0x744b, 0x744d, 0x7451, 0x7452,
+ 0x7457, 0x745d, 0x7462, 0x7466, 0x7467, 0x7468, 0x746b, 0x746d,
+ 0x746e, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487,
+ 0x7489, 0x748f, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749a,
+ 0x749c, 0x749f, 0x74a0, 0x74a1, 0x74a3, 0x74a6, 0x74a8, 0x74a9,
+ 0x74aa, 0x74ab, 0x74ae, 0x74af, 0x74b1, 0x74b2, 0x74b5, 0x74b9,
+ 0x74bb, 0x74bf, 0x74c8, 0x74c9, 0x74cc, 0x74d0, 0x74d3, 0x74d8,
+ 0x74da, 0x74db, 0x74de, 0x74df, 0x74e4, 0x74e8, 0x74ea, 0x74eb,
+ 0x74ef, 0x74f4, 0x74fa, 0x74fb, 0x74fc, 0x74ff, 0x7506,
+ /* 0x4d21 - 0x4d7e */
+ 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527,
+ 0x7529, 0x752a, 0x752f, 0x7536, 0x7539, 0x753d, 0x753e, 0x753f,
+ 0x7540, 0x7543, 0x7547, 0x7548, 0x754e, 0x7550, 0x7552, 0x7557,
+ 0x755e, 0x755f, 0x7561, 0x756f, 0x7571, 0x7579, 0x757a, 0x757b,
+ 0x757c, 0x757d, 0x757e, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593,
+ 0x7595, 0x7599, 0x759c, 0x75a2, 0x75a4, 0x75b4, 0x75ba, 0x75bf,
+ 0x75c0, 0x75c1, 0x75c4, 0x75c6, 0x75cc, 0x75ce, 0x75cf, 0x75d7,
+ 0x75dc, 0x75df, 0x75e0, 0x75e1, 0x75e4, 0x75e7, 0x75ec, 0x75ee,
+ 0x75ef, 0x75f1, 0x75f9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607,
+ 0x7608, 0x760a, 0x760c, 0x760f, 0x7612, 0x7613, 0x7615, 0x7616,
+ 0x7619, 0x761b, 0x761c, 0x761d, 0x761e, 0x7623, 0x7625, 0x7626,
+ 0x7629, 0x762d, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639,
+ /* 0x4e21 - 0x4e7e */
+ 0x763a, 0x763c, 0x764a, 0x7640, 0x7641, 0x7643, 0x7644,
+ 0x7645, 0x7649, 0x764b, 0x7655, 0x7659, 0x765f, 0x7664, 0x7665,
+ 0x766d, 0x766e, 0x766f, 0x7671, 0x7674, 0x7681, 0x7685, 0x768c,
+ 0x768d, 0x7695, 0x769b, 0x769c, 0x769d, 0x769f, 0x76a0, 0x76a2,
+ 0x76a3, 0x76a4, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76aa, 0x76ad,
+ 0x76bd, 0x76c1, 0x76c5, 0x76c9, 0x76cb, 0x76cc, 0x76ce, 0x76d4,
+ 0x76d9, 0x76e0, 0x76e6, 0x76e8, 0x76ec, 0x76f0, 0x76f1, 0x76f6,
+ 0x76f9, 0x76fc, 0x7700, 0x7706, 0x770a, 0x770e, 0x7712, 0x7714,
+ 0x7715, 0x7717, 0x7719, 0x771a, 0x771c, 0x7722, 0x7728, 0x772d,
+ 0x772e, 0x772f, 0x7734, 0x7735, 0x7736, 0x7739, 0x773d, 0x773e,
+ 0x7742, 0x7745, 0x7746, 0x774a, 0x774d, 0x774e, 0x774f, 0x7752,
+ 0x7756, 0x7757, 0x775c, 0x775e, 0x775f, 0x7760, 0x7762,
+ /* 0x4f21 - 0x4f7e */
+ 0x7764, 0x7767, 0x776a, 0x776c, 0x7770, 0x7772, 0x7773,
+ 0x7774, 0x777a, 0x777d, 0x7780, 0x7784, 0x778c, 0x778d, 0x7794,
+ 0x7795, 0x7796, 0x779a, 0x779f, 0x77a2, 0x77a7, 0x77aa, 0x77ae,
+ 0x77af, 0x77b1, 0x77b5, 0x77be, 0x77c3, 0x77c9, 0x77d1, 0x77d2,
+ 0x77d5, 0x77d9, 0x77de, 0x77df, 0x77e0, 0x77e4, 0x77e6, 0x77ea,
+ 0x77ec, 0x77f0, 0x77f1, 0x77f4, 0x77f8, 0x77fb, 0x7805, 0x7806,
+ 0x7809, 0x780d, 0x780e, 0x7811, 0x781d, 0x7821, 0x7822, 0x7823,
+ 0x782d, 0x782e, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847,
+ 0x7848, 0x784c, 0x784e, 0x7852, 0x785c, 0x785e, 0x7860, 0x7861,
+ 0x7863, 0x7864, 0x7868, 0x786a, 0x786e, 0x787a, 0x787e, 0x788a,
+ 0x788f, 0x7894, 0x7898, 0x78a1, 0x789d, 0x789e, 0x789f, 0x78a4,
+ 0x78a8, 0x78ac, 0x78ad, 0x78b0, 0x78b1, 0x78b2, 0x78b3,
+ /* 0x5021 - 0x507e */
+ 0x78bb, 0x78bd, 0x78bf, 0x78c7, 0x78c8, 0x78c9, 0x78cc,
+ 0x78ce, 0x78d2, 0x78d3, 0x78d5, 0x78d6, 0x78e4, 0x78db, 0x78df,
+ 0x78e0, 0x78e1, 0x78e6, 0x78ea, 0x78f2, 0x78f3, 0x7900, 0x78f6,
+ 0x78f7, 0x78fa, 0x78fb, 0x78ff, 0x7906, 0x790c, 0x7910, 0x791a,
+ 0x791c, 0x791e, 0x791f, 0x7920, 0x7925, 0x7927, 0x7929, 0x792d,
+ 0x7931, 0x7934, 0x7935, 0x793b, 0x793d, 0x793f, 0x7944, 0x7945,
+ 0x7946, 0x794a, 0x794b, 0x794f, 0x7951, 0x7954, 0x7958, 0x795b,
+ 0x795c, 0x7967, 0x7969, 0x796b, 0x7972, 0x7979, 0x797b, 0x797c,
+ 0x797e, 0x798b, 0x798c, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996,
+ 0x7998, 0x799b, 0x799c, 0x79a1, 0x79a8, 0x79a9, 0x79ab, 0x79af,
+ 0x79b1, 0x79b4, 0x79b8, 0x79bb, 0x79c2, 0x79c4, 0x79c7, 0x79c8,
+ 0x79ca, 0x79cf, 0x79d4, 0x79d6, 0x79da, 0x79dd, 0x79de,
+ /* 0x5121 - 0x517e */
+ 0x79e0, 0x79e2, 0x79e5, 0x79ea, 0x79eb, 0x79ed, 0x79f1,
+ 0x79f8, 0x79fc, 0x7a02, 0x7a03, 0x7a07, 0x7a09, 0x7a0a, 0x7a0c,
+ 0x7a11, 0x7a15, 0x7a1b, 0x7a1e, 0x7a21, 0x7a27, 0x7a2b, 0x7a2d,
+ 0x7a2f, 0x7a30, 0x7a34, 0x7a35, 0x7a38, 0x7a39, 0x7a3a, 0x7a44,
+ 0x7a45, 0x7a47, 0x7a48, 0x7a4c, 0x7a55, 0x7a56, 0x7a59, 0x7a5c,
+ 0x7a5d, 0x7a5f, 0x7a60, 0x7a65, 0x7a67, 0x7a6a, 0x7a6d, 0x7a75,
+ 0x7a78, 0x7a7e, 0x7a80, 0x7a82, 0x7a85, 0x7a86, 0x7a8a, 0x7a8b,
+ 0x7a90, 0x7a91, 0x7a94, 0x7a9e, 0x7aa0, 0x7aa3, 0x7aac, 0x7ab3,
+ 0x7ab5, 0x7ab9, 0x7abb, 0x7abc, 0x7ac6, 0x7ac9, 0x7acc, 0x7ace,
+ 0x7ad1, 0x7adb, 0x7ae8, 0x7ae9, 0x7aeb, 0x7aec, 0x7af1, 0x7af4,
+ 0x7afb, 0x7afd, 0x7afe, 0x7b07, 0x7b14, 0x7b1f, 0x7b23, 0x7b27,
+ 0x7b29, 0x7b2a, 0x7b2b, 0x7b2d, 0x7b2e, 0x7b2f, 0x7b30,
+ /* 0x5221 - 0x527e */
+ 0x7b31, 0x7b34, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b47,
+ 0x7b4e, 0x7b55, 0x7b60, 0x7b64, 0x7b66, 0x7b69, 0x7b6a, 0x7b6d,
+ 0x7b6f, 0x7b72, 0x7b73, 0x7b77, 0x7b84, 0x7b89, 0x7b8e, 0x7b90,
+ 0x7b91, 0x7b96, 0x7b9b, 0x7b9e, 0x7ba0, 0x7ba5, 0x7bac, 0x7baf,
+ 0x7bb0, 0x7bb2, 0x7bb5, 0x7bb6, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd,
+ 0x7bc2, 0x7bc5, 0x7bc8, 0x7bca, 0x7bd4, 0x7bd6, 0x7bd7, 0x7bd9,
+ 0x7bda, 0x7bdb, 0x7be8, 0x7bea, 0x7bf2, 0x7bf4, 0x7bf5, 0x7bf8,
+ 0x7bf9, 0x7bfa, 0x7bfc, 0x7bfe, 0x7c01, 0x7c02, 0x7c03, 0x7c04,
+ 0x7c06, 0x7c09, 0x7c0b, 0x7c0c, 0x7c0e, 0x7c0f, 0x7c19, 0x7c1b,
+ 0x7c20, 0x7c25, 0x7c26, 0x7c28, 0x7c2c, 0x7c31, 0x7c33, 0x7c34,
+ 0x7c36, 0x7c39, 0x7c3a, 0x7c46, 0x7c4a, 0x7c55, 0x7c51, 0x7c52,
+ 0x7c53, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e,
+ /* 0x5321 - 0x537e */
+ 0x7c61, 0x7c63, 0x7c67, 0x7c69, 0x7c6d, 0x7c6e, 0x7c70,
+ 0x7c72, 0x7c79, 0x7c7c, 0x7c7d, 0x7c86, 0x7c87, 0x7c8f, 0x7c94,
+ 0x7c9e, 0x7ca0, 0x7ca6, 0x7cb0, 0x7cb6, 0x7cb7, 0x7cba, 0x7cbb,
+ 0x7cbc, 0x7cbf, 0x7cc4, 0x7cc7, 0x7cc8, 0x7cc9, 0x7ccd, 0x7ccf,
+ 0x7cd3, 0x7cd4, 0x7cd5, 0x7cd7, 0x7cd9, 0x7cda, 0x7cdd, 0x7ce6,
+ 0x7ce9, 0x7ceb, 0x7cf5, 0x7d03, 0x7d07, 0x7d08, 0x7d09, 0x7d0f,
+ 0x7d11, 0x7d12, 0x7d13, 0x7d16, 0x7d1d, 0x7d1e, 0x7d23, 0x7d26,
+ 0x7d2a, 0x7d2d, 0x7d31, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d40, 0x7d41,
+ 0x7d47, 0x7d48, 0x7d4d, 0x7d51, 0x7d53, 0x7d57, 0x7d59, 0x7d5a,
+ 0x7d5c, 0x7d5d, 0x7d65, 0x7d67, 0x7d6a, 0x7d70, 0x7d78, 0x7d7a,
+ 0x7d7b, 0x7d7f, 0x7d81, 0x7d82, 0x7d83, 0x7d85, 0x7d86, 0x7d88,
+ 0x7d8b, 0x7d8c, 0x7d8d, 0x7d91, 0x7d96, 0x7d97, 0x7d9d,
+ /* 0x5421 - 0x547e */
+ 0x7d9e, 0x7da6, 0x7da7, 0x7daa, 0x7db3, 0x7db6, 0x7db7,
+ 0x7db9, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dcc, 0x7dcd,
+ 0x7dce, 0x7dd7, 0x7dd9, 0x7e00, 0x7de2, 0x7de5, 0x7de6, 0x7dea,
+ 0x7deb, 0x7ded, 0x7df1, 0x7df5, 0x7df6, 0x7df9, 0x7dfa, 0x7e08,
+ 0x7e10, 0x7e11, 0x7e15, 0x7e17, 0x7e1c, 0x7e1d, 0x7e20, 0x7e27,
+ 0x7e28, 0x7e2c, 0x7e2d, 0x7e2f, 0x7e33, 0x7e36, 0x7e3f, 0x7e44,
+ 0x7e45, 0x7e47, 0x7e4e, 0x7e50, 0x7e52, 0x7e58, 0x7e5f, 0x7e61,
+ 0x7e62, 0x7e65, 0x7e6b, 0x7e6e, 0x7e6f, 0x7e73, 0x7e78, 0x7e7e,
+ 0x7e81, 0x7e86, 0x7e87, 0x7e8a, 0x7e8d, 0x7e91, 0x7e95, 0x7e98,
+ 0x7e9a, 0x7e9d, 0x7e9e, 0x7f3c, 0x7f3b, 0x7f3d, 0x7f3e, 0x7f3f,
+ 0x7f43, 0x7f44, 0x7f47, 0x7f4f, 0x7f52, 0x7f53, 0x7f5b, 0x7f5c,
+ 0x7f5d, 0x7f61, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f6d,
+ /* 0x5521 - 0x557e */
+ 0x7f71, 0x7f7d, 0x7f7e, 0x7f7f, 0x7f80, 0x7f8b, 0x7f8d,
+ 0x7f8f, 0x7f90, 0x7f91, 0x7f96, 0x7f97, 0x7f9c, 0x7fa1, 0x7fa2,
+ 0x7fa6, 0x7faa, 0x7fad, 0x7fb4, 0x7fbc, 0x7fbf, 0x7fc0, 0x7fc3,
+ 0x7fc8, 0x7fce, 0x7fcf, 0x7fdb, 0x7fdf, 0x7fe3, 0x7fe5, 0x7fe8,
+ 0x7fec, 0x7fee, 0x7fef, 0x7ff2, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff,
+ 0x8007, 0x8008, 0x800a, 0x800d, 0x800e, 0x800f, 0x8011, 0x8013,
+ 0x8014, 0x8016, 0x801d, 0x801e, 0x801f, 0x8020, 0x8024, 0x8026,
+ 0x802c, 0x802e, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803a,
+ 0x803c, 0x803e, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806d,
+ 0x8071, 0x8075, 0x8081, 0x8088, 0x808e, 0x809c, 0x809e, 0x80a6,
+ 0x80a7, 0x80ab, 0x80b8, 0x80b9, 0x80c8, 0x80cd, 0x80cf, 0x80d2,
+ 0x80d4, 0x80d5, 0x80d7, 0x80d8, 0x80e0, 0x80ed, 0x80ee,
+ /* 0x5621 - 0x567e */
+ 0x80f0, 0x80f2, 0x80f3, 0x80f6, 0x80f9, 0x80fa, 0x80fe,
+ 0x8103, 0x810b, 0x8116, 0x8117, 0x8118, 0x811c, 0x811e, 0x8120,
+ 0x8124, 0x8127, 0x812c, 0x8130, 0x8135, 0x813a, 0x813c, 0x8145,
+ 0x8147, 0x814a, 0x814c, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167,
+ 0x8168, 0x8169, 0x816d, 0x816f, 0x8177, 0x8181, 0x8190, 0x8184,
+ 0x8185, 0x8186, 0x818b, 0x818e, 0x8196, 0x8198, 0x819b, 0x819e,
+ 0x81a2, 0x81ae, 0x81b2, 0x81b4, 0x81bb, 0x81cb, 0x81c3, 0x81c5,
+ 0x81ca, 0x81ce, 0x81cf, 0x81d5, 0x81d7, 0x81db, 0x81dd, 0x81de,
+ 0x81e1, 0x81e4, 0x81eb, 0x81ec, 0x81f0, 0x81f1, 0x81f2, 0x81f5,
+ 0x81f6, 0x81f8, 0x81f9, 0x81fd, 0x81ff, 0x8200, 0x8203, 0x820f,
+ 0x8213, 0x8214, 0x8219, 0x821a, 0x821d, 0x8221, 0x8222, 0x8228,
+ 0x8232, 0x8234, 0x823a, 0x8243, 0x8244, 0x8245, 0x8246,
+ /* 0x5721 - 0x577e */
+ 0x824b, 0x824e, 0x824f, 0x8251, 0x8256, 0x825c, 0x8260,
+ 0x8263, 0x8267, 0x826d, 0x8274, 0x827b, 0x827d, 0x827f, 0x8280,
+ 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828a, 0x828e, 0x8291,
+ 0x8294, 0x8296, 0x8298, 0x829a, 0x829b, 0x82a0, 0x82a1, 0x82a3,
+ 0x82a4, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ae, 0x82b0, 0x82b2,
+ 0x82b4, 0x82b7, 0x82ba, 0x82bc, 0x82be, 0x82bf, 0x82c6, 0x82d0,
+ 0x82d5, 0x82da, 0x82e0, 0x82e2, 0x82e4, 0x82e8, 0x82ea, 0x82ed,
+ 0x82ef, 0x82f6, 0x82f7, 0x82fd, 0x82fe, 0x8300, 0x8301, 0x8307,
+ 0x8308, 0x830a, 0x830b, 0x8354, 0x831b, 0x831d, 0x831e, 0x831f,
+ 0x8321, 0x8322, 0x832c, 0x832d, 0x832e, 0x8330, 0x8333, 0x8337,
+ 0x833a, 0x833c, 0x833d, 0x8342, 0x8343, 0x8344, 0x8347, 0x834d,
+ 0x834e, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378,
+ /* 0x5821 - 0x587e */
+ 0x837d, 0x837f, 0x8380, 0x8382, 0x8384, 0x8386, 0x838d,
+ 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839b, 0x839c, 0x839d,
+ 0x83a6, 0x83a7, 0x83a9, 0x83ac, 0x83be, 0x83bf, 0x83c0, 0x83c7,
+ 0x83c9, 0x83cf, 0x83d0, 0x83d1, 0x83d4, 0x83dd, 0x8353, 0x83e8,
+ 0x83ea, 0x83f6, 0x83f8, 0x83f9, 0x83fc, 0x8401, 0x8406, 0x840a,
+ 0x840f, 0x8411, 0x8415, 0x8419, 0x83ad, 0x842f, 0x8439, 0x8445,
+ 0x8447, 0x8448, 0x844a, 0x844d, 0x844f, 0x8451, 0x8452, 0x8456,
+ 0x8458, 0x8459, 0x845a, 0x845c, 0x8460, 0x8464, 0x8465, 0x8467,
+ 0x846a, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847c, 0x847d,
+ 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849e, 0x84a6, 0x84a8,
+ 0x84a9, 0x84aa, 0x84af, 0x84b1, 0x84b4, 0x84ba, 0x84bd, 0x84be,
+ 0x84c0, 0x84c2, 0x84c7, 0x84c8, 0x84cc, 0x84cf, 0x84d3,
+ /* 0x5921 - 0x597e */
+ 0x84dc, 0x84e7, 0x84ea, 0x84ef, 0x84f0, 0x84f1, 0x84f2,
+ 0x84f7, 0x8532, 0x84fa, 0x84fb, 0x84fd, 0x8502, 0x8503, 0x8507,
+ 0x850c, 0x850e, 0x8510, 0x851c, 0x851e, 0x8522, 0x8523, 0x8524,
+ 0x8525, 0x8527, 0x852a, 0x852b, 0x852f, 0x8533, 0x8534, 0x8536,
+ 0x853f, 0x8546, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556,
+ 0x8559, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562,
+ 0x8564, 0x856b, 0x856f, 0x8579, 0x857a, 0x857b, 0x857d, 0x857f,
+ 0x8581, 0x8585, 0x8586, 0x8589, 0x858b, 0x858c, 0x858f, 0x8593,
+ 0x8598, 0x859d, 0x859f, 0x85a0, 0x85a2, 0x85a5, 0x85a7, 0x85b4,
+ 0x85b6, 0x85b7, 0x85b8, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c2,
+ 0x85c7, 0x85ca, 0x85cb, 0x85ce, 0x85ad, 0x85d8, 0x85da, 0x85df,
+ 0x85e0, 0x85e6, 0x85e8, 0x85ed, 0x85f3, 0x85f6, 0x85fc,
+ /* 0x5a21 - 0x5a7e */
+ 0x85ff, 0x8600, 0x8604, 0x8605, 0x860d, 0x860e, 0x8610,
+ 0x8611, 0x8612, 0x8618, 0x8619, 0x861b, 0x861e, 0x8621, 0x8627,
+ 0x8629, 0x8636, 0x8638, 0x863a, 0x863c, 0x863d, 0x8640, 0x8642,
+ 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865d,
+ 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866c, 0x866f,
+ 0x8675, 0x8676, 0x8677, 0x867a, 0x868d, 0x8691, 0x8696, 0x8698,
+ 0x869a, 0x869c, 0x86a1, 0x86a6, 0x86a7, 0x86a8, 0x86ad, 0x86b1,
+ 0x86b3, 0x86b4, 0x86b5, 0x86b7, 0x86b8, 0x86b9, 0x86bf, 0x86c0,
+ 0x86c1, 0x86c3, 0x86c5, 0x86d1, 0x86d2, 0x86d5, 0x86d7, 0x86da,
+ 0x86dc, 0x86e0, 0x86e3, 0x86e5, 0x86e7, 0x8688, 0x86fa, 0x86fc,
+ 0x86fd, 0x8704, 0x8705, 0x8707, 0x870b, 0x870e, 0x870f, 0x8710,
+ 0x8713, 0x8714, 0x8719, 0x871e, 0x871f, 0x8721, 0x8723,
+ /* 0x5b21 - 0x5b7e */
+ 0x8728, 0x872e, 0x872f, 0x8731, 0x8732, 0x8739, 0x873a,
+ 0x873c, 0x873d, 0x873e, 0x8740, 0x8743, 0x8745, 0x874d, 0x8758,
+ 0x875d, 0x8761, 0x8764, 0x8765, 0x876f, 0x8771, 0x8772, 0x877b,
+ 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878b,
+ 0x878c, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879e,
+ 0x87a0, 0x87a3, 0x87a7, 0x87ac, 0x87ad, 0x87ae, 0x87b1, 0x87b5,
+ 0x87be, 0x87bf, 0x87c1, 0x87c8, 0x87c9, 0x87ca, 0x87ce, 0x87d5,
+ 0x87d6, 0x87d9, 0x87da, 0x87dc, 0x87df, 0x87e2, 0x87e3, 0x87e4,
+ 0x87ea, 0x87eb, 0x87ed, 0x87f1, 0x87f3, 0x87f8, 0x87fa, 0x87ff,
+ 0x8801, 0x8803, 0x8806, 0x8809, 0x880a, 0x880b, 0x8810, 0x8819,
+ 0x8812, 0x8813, 0x8814, 0x8818, 0x881a, 0x881b, 0x881c, 0x881e,
+ 0x881f, 0x8828, 0x882d, 0x882e, 0x8830, 0x8832, 0x8835,
+ /* 0x5c21 - 0x5c7e */
+ 0x883a, 0x883c, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849,
+ 0x884a, 0x884b, 0x884e, 0x8851, 0x8855, 0x8856, 0x8858, 0x885a,
+ 0x885c, 0x885f, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887b,
+ 0x8880, 0x8898, 0x889a, 0x889b, 0x889c, 0x889f, 0x88a0, 0x88a8,
+ 0x88aa, 0x88ba, 0x88bd, 0x88be, 0x88c0, 0x88ca, 0x88cb, 0x88cc,
+ 0x88cd, 0x88ce, 0x88d1, 0x88d2, 0x88d3, 0x88db, 0x88de, 0x88e7,
+ 0x88ef, 0x88f0, 0x88f1, 0x88f5, 0x88f7, 0x8901, 0x8906, 0x890d,
+ 0x890e, 0x890f, 0x8915, 0x8916, 0x8918, 0x8919, 0x891a, 0x891c,
+ 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935,
+ 0x8939, 0x893a, 0x893e, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949,
+ 0x894f, 0x8952, 0x8957, 0x895a, 0x895b, 0x895c, 0x8961, 0x8962,
+ 0x8963, 0x896b, 0x896e, 0x8970, 0x8973, 0x8975, 0x897a,
+ /* 0x5d21 - 0x5d7e */
+ 0x897b, 0x897c, 0x897d, 0x8989, 0x898d, 0x8990, 0x8994,
+ 0x8995, 0x899b, 0x899c, 0x899f, 0x89a0, 0x89a5, 0x89b0, 0x89b4,
+ 0x89b5, 0x89b6, 0x89b7, 0x89bc, 0x89d4, 0x89d5, 0x89d6, 0x89d7,
+ 0x89d8, 0x89e5, 0x89e9, 0x89eb, 0x89ed, 0x89f1, 0x89f3, 0x89f6,
+ 0x89f9, 0x89fd, 0x89ff, 0x8a04, 0x8a05, 0x8a07, 0x8a0f, 0x8a11,
+ 0x8a12, 0x8a14, 0x8a15, 0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26,
+ 0x8a2b, 0x8a2c, 0x8a2f, 0x8a35, 0x8a37, 0x8a3d, 0x8a3e, 0x8a40,
+ 0x8a43, 0x8a45, 0x8a47, 0x8a49, 0x8a4d, 0x8a4e, 0x8a53, 0x8a56,
+ 0x8a57, 0x8a58, 0x8a5c, 0x8a5d, 0x8a61, 0x8a65, 0x8a67, 0x8a75,
+ 0x8a76, 0x8a77, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7e, 0x8a7f, 0x8a80,
+ 0x8a83, 0x8a86, 0x8a8b, 0x8a8f, 0x8a90, 0x8a92, 0x8a96, 0x8a97,
+ 0x8a99, 0x8a9f, 0x8aa7, 0x8aa9, 0x8aae, 0x8aaf, 0x8ab3,
+ /* 0x5e21 - 0x5e7e */
+ 0x8ab6, 0x8ab7, 0x8abb, 0x8abe, 0x8ac3, 0x8ac6, 0x8ac8,
+ 0x8ac9, 0x8aca, 0x8ad1, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad7, 0x8add,
+ 0x8adf, 0x8aec, 0x8af0, 0x8af4, 0x8af5, 0x8af6, 0x8afc, 0x8aff,
+ 0x8b05, 0x8b06, 0x8b0b, 0x8b11, 0x8b1c, 0x8b1e, 0x8b1f, 0x8b0a,
+ 0x8b2d, 0x8b30, 0x8b37, 0x8b3c, 0x8b42, 0x8b43, 0x8b44, 0x8b45,
+ 0x8b46, 0x8b48, 0x8b52, 0x8b53, 0x8b54, 0x8b59, 0x8b4d, 0x8b5e,
+ 0x8b63, 0x8b6d, 0x8b76, 0x8b78, 0x8b79, 0x8b7c, 0x8b7e, 0x8b81,
+ 0x8b84, 0x8b85, 0x8b8b, 0x8b8d, 0x8b8f, 0x8b94, 0x8b95, 0x8b9c,
+ 0x8b9e, 0x8b9f, 0x8c38, 0x8c39, 0x8c3d, 0x8c3e, 0x8c45, 0x8c47,
+ 0x8c49, 0x8c4b, 0x8c4f, 0x8c51, 0x8c53, 0x8c54, 0x8c57, 0x8c58,
+ 0x8c5b, 0x8c5d, 0x8c59, 0x8c63, 0x8c64, 0x8c66, 0x8c68, 0x8c69,
+ 0x8c6d, 0x8c73, 0x8c75, 0x8c76, 0x8c7b, 0x8c7e, 0x8c86,
+ /* 0x5f21 - 0x5f7e */
+ 0x8c87, 0x8c8b, 0x8c90, 0x8c92, 0x8c93, 0x8c99, 0x8c9b,
+ 0x8c9c, 0x8ca4, 0x8cb9, 0x8cba, 0x8cc5, 0x8cc6, 0x8cc9, 0x8ccb,
+ 0x8ccf, 0x8cd6, 0x8cd5, 0x8cd9, 0x8cdd, 0x8ce1, 0x8ce8, 0x8cec,
+ 0x8cef, 0x8cf0, 0x8cf2, 0x8cf5, 0x8cf7, 0x8cf8, 0x8cfe, 0x8cff,
+ 0x8d01, 0x8d03, 0x8d09, 0x8d12, 0x8d17, 0x8d1b, 0x8d65, 0x8d69,
+ 0x8d6c, 0x8d6e, 0x8d7f, 0x8d82, 0x8d84, 0x8d88, 0x8d8d, 0x8d90,
+ 0x8d91, 0x8d95, 0x8d9e, 0x8d9f, 0x8da0, 0x8da6, 0x8dab, 0x8dac,
+ 0x8daf, 0x8db2, 0x8db5, 0x8db7, 0x8db9, 0x8dbb, 0x8dc0, 0x8dc5,
+ 0x8dc6, 0x8dc7, 0x8dc8, 0x8dca, 0x8dce, 0x8dd1, 0x8dd4, 0x8dd5,
+ 0x8dd7, 0x8dd9, 0x8de4, 0x8de5, 0x8de7, 0x8dec, 0x8df0, 0x8dbc,
+ 0x8df1, 0x8df2, 0x8df4, 0x8dfd, 0x8e01, 0x8e04, 0x8e05, 0x8e06,
+ 0x8e0b, 0x8e11, 0x8e14, 0x8e16, 0x8e20, 0x8e21, 0x8e22,
+ /* 0x6021 - 0x607e */
+ 0x8e23, 0x8e26, 0x8e27, 0x8e31, 0x8e33, 0x8e36, 0x8e37,
+ 0x8e38, 0x8e39, 0x8e3d, 0x8e40, 0x8e41, 0x8e4b, 0x8e4d, 0x8e4e,
+ 0x8e4f, 0x8e54, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e61, 0x8e62,
+ 0x8e69, 0x8e6c, 0x8e6d, 0x8e6f, 0x8e70, 0x8e71, 0x8e79, 0x8e7a,
+ 0x8e7b, 0x8e82, 0x8e83, 0x8e89, 0x8e90, 0x8e92, 0x8e95, 0x8e9a,
+ 0x8e9b, 0x8e9d, 0x8e9e, 0x8ea2, 0x8ea7, 0x8ea9, 0x8ead, 0x8eae,
+ 0x8eb3, 0x8eb5, 0x8eba, 0x8ebb, 0x8ec0, 0x8ec1, 0x8ec3, 0x8ec4,
+ 0x8ec7, 0x8ecf, 0x8ed1, 0x8ed4, 0x8edc, 0x8ee8, 0x8eee, 0x8ef0,
+ 0x8ef1, 0x8ef7, 0x8ef9, 0x8efa, 0x8eed, 0x8f00, 0x8f02, 0x8f07,
+ 0x8f08, 0x8f0f, 0x8f10, 0x8f16, 0x8f17, 0x8f18, 0x8f1e, 0x8f20,
+ 0x8f21, 0x8f23, 0x8f25, 0x8f27, 0x8f28, 0x8f2c, 0x8f2d, 0x8f2e,
+ 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f3a, 0x8f40, 0x8f41,
+ /* 0x6121 - 0x617e */
+ 0x8f43, 0x8f47, 0x8f4f, 0x8f51, 0x8f52, 0x8f53, 0x8f54,
+ 0x8f55, 0x8f58, 0x8f5d, 0x8f5e, 0x8f65, 0x8f9d, 0x8fa0, 0x8fa1,
+ 0x8fa4, 0x8fa5, 0x8fa6, 0x8fb5, 0x8fb6, 0x8fb8, 0x8fbe, 0x8fc0,
+ 0x8fc1, 0x8fc6, 0x8fca, 0x8fcb, 0x8fcd, 0x8fd0, 0x8fd2, 0x8fd3,
+ 0x8fd5, 0x8fe0, 0x8fe3, 0x8fe4, 0x8fe8, 0x8fee, 0x8ff1, 0x8ff5,
+ 0x8ff6, 0x8ffb, 0x8ffe, 0x9002, 0x9004, 0x9008, 0x900c, 0x9018,
+ 0x901b, 0x9028, 0x9029, 0x902f, 0x902a, 0x902c, 0x902d, 0x9033,
+ 0x9034, 0x9037, 0x903f, 0x9043, 0x9044, 0x904c, 0x905b, 0x905d,
+ 0x9062, 0x9066, 0x9067, 0x906c, 0x9070, 0x9074, 0x9079, 0x9085,
+ 0x9088, 0x908b, 0x908c, 0x908e, 0x9090, 0x9095, 0x9097, 0x9098,
+ 0x9099, 0x909b, 0x90a0, 0x90a1, 0x90a2, 0x90a5, 0x90b0, 0x90b2,
+ 0x90b3, 0x90b4, 0x90b6, 0x90bd, 0x90cc, 0x90be, 0x90c3,
+ /* 0x6221 - 0x627e */
+ 0x90c4, 0x90c5, 0x90c7, 0x90c8, 0x90d5, 0x90d7, 0x90d8,
+ 0x90d9, 0x90dc, 0x90dd, 0x90df, 0x90e5, 0x90d2, 0x90f6, 0x90eb,
+ 0x90ef, 0x90f0, 0x90f4, 0x90fe, 0x90ff, 0x9100, 0x9104, 0x9105,
+ 0x9106, 0x9108, 0x910d, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118,
+ 0x911a, 0x911c, 0x911e, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127,
+ 0x9129, 0x912e, 0x912f, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139,
+ 0x913a, 0x913c, 0x913d, 0x9143, 0x9147, 0x9148, 0x914f, 0x9153,
+ 0x9157, 0x9159, 0x915a, 0x915b, 0x9161, 0x9164, 0x9167, 0x916d,
+ 0x9174, 0x9179, 0x917a, 0x917b, 0x9181, 0x9183, 0x9185, 0x9186,
+ 0x918a, 0x918e, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919e,
+ 0x91a1, 0x91a6, 0x91a8, 0x91ac, 0x91ad, 0x91ae, 0x91b0, 0x91b1,
+ 0x91b2, 0x91b3, 0x91b6, 0x91bb, 0x91bc, 0x91bd, 0x91bf,
+ /* 0x6321 - 0x637e */
+ 0x91c2, 0x91c3, 0x91c5, 0x91d3, 0x91d4, 0x91d7, 0x91d9,
+ 0x91da, 0x91de, 0x91e4, 0x91e5, 0x91e9, 0x91ea, 0x91ec, 0x91ed,
+ 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f7, 0x91f9, 0x91fb, 0x91fd,
+ 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920a,
+ 0x920c, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921c, 0x921d,
+ 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922e, 0x922f, 0x9230,
+ 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923a, 0x923c, 0x923e,
+ 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924a, 0x924d, 0x924e,
+ 0x924f, 0x9251, 0x9258, 0x9259, 0x925c, 0x925d, 0x9260, 0x9261,
+ 0x9265, 0x9267, 0x9268, 0x9269, 0x926e, 0x926f, 0x9270, 0x9275,
+ 0x9276, 0x9277, 0x9278, 0x9279, 0x927b, 0x927c, 0x927d, 0x927f,
+ 0x9288, 0x9289, 0x928a, 0x928d, 0x928e, 0x9292, 0x9297,
+ /* 0x6421 - 0x647e */
+ 0x9299, 0x929f, 0x92a0, 0x92a4, 0x92a5, 0x92a7, 0x92a8,
+ 0x92ab, 0x92af, 0x92b2, 0x92b6, 0x92b8, 0x92ba, 0x92bb, 0x92bc,
+ 0x92bd, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c5, 0x92c6,
+ 0x92c7, 0x92c8, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92d0, 0x92d3,
+ 0x92d5, 0x92d7, 0x92d8, 0x92d9, 0x92dc, 0x92dd, 0x92df, 0x92e0,
+ 0x92e1, 0x92e3, 0x92e5, 0x92e7, 0x92e8, 0x92ec, 0x92ee, 0x92f0,
+ 0x92f9, 0x92fb, 0x92ff, 0x9300, 0x9302, 0x9308, 0x930d, 0x9311,
+ 0x9314, 0x9315, 0x931c, 0x931d, 0x931e, 0x931f, 0x9321, 0x9324,
+ 0x9325, 0x9327, 0x9329, 0x932a, 0x9333, 0x9334, 0x9336, 0x9337,
+ 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357,
+ 0x9358, 0x935a, 0x935e, 0x9364, 0x9365, 0x9367, 0x9369, 0x936a,
+ 0x936d, 0x936f, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376,
+ /* 0x6521 - 0x657e */
+ 0x937a, 0x937d, 0x937f, 0x9380, 0x9381, 0x9382, 0x9388,
+ 0x938a, 0x938b, 0x938d, 0x938f, 0x9392, 0x9395, 0x9398, 0x939b,
+ 0x939e, 0x93a1, 0x93a3, 0x93a4, 0x93a6, 0x93a8, 0x93ab, 0x93b4,
+ 0x93b5, 0x93b6, 0x93ba, 0x93a9, 0x93c1, 0x93c4, 0x93c5, 0x93c6,
+ 0x93c7, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93d3, 0x93d9,
+ 0x93dc, 0x93de, 0x93df, 0x93e2, 0x93e6, 0x93e7, 0x93f9, 0x93f7,
+ 0x93f8, 0x93fa, 0x93fb, 0x93fd, 0x9401, 0x9402, 0x9404, 0x9408,
+ 0x9409, 0x940d, 0x940e, 0x940f, 0x9415, 0x9416, 0x9417, 0x941f,
+ 0x942e, 0x942f, 0x9431, 0x9432, 0x9433, 0x9434, 0x943b, 0x943f,
+ 0x943d, 0x9443, 0x9445, 0x9448, 0x944a, 0x944c, 0x9455, 0x9459,
+ 0x945c, 0x945f, 0x9461, 0x9463, 0x9468, 0x946b, 0x946d, 0x946e,
+ 0x946f, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579,
+ /* 0x6621 - 0x667e */
+ 0x957e, 0x9584, 0x9588, 0x958c, 0x958d, 0x958e, 0x959d,
+ 0x959e, 0x959f, 0x95a1, 0x95a6, 0x95a9, 0x95ab, 0x95ac, 0x95b4,
+ 0x95b6, 0x95ba, 0x95bd, 0x95bf, 0x95c6, 0x95c8, 0x95c9, 0x95cb,
+ 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d9, 0x95da, 0x95dd, 0x95de,
+ 0x95df, 0x95e0, 0x95e4, 0x95e6, 0x961d, 0x961e, 0x9622, 0x9624,
+ 0x9625, 0x9626, 0x962c, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639,
+ 0x963a, 0x963c, 0x963d, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657,
+ 0x9658, 0x9661, 0x966e, 0x9674, 0x967b, 0x967c, 0x967e, 0x967f,
+ 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969a,
+ 0x969d, 0x969f, 0x96a4, 0x96a5, 0x96a6, 0x96a9, 0x96ae, 0x96af,
+ 0x96b3, 0x96ba, 0x96ca, 0x96d2, 0x5db2, 0x96d8, 0x96da, 0x96dd,
+ 0x96de, 0x96df, 0x96e9, 0x96ef, 0x96f1, 0x96fa, 0x9702,
+ /* 0x6721 - 0x677e */
+ 0x9703, 0x9705, 0x9709, 0x971a, 0x971b, 0x971d, 0x9721,
+ 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974a,
+ 0x974e, 0x974f, 0x9755, 0x9757, 0x9758, 0x975a, 0x975b, 0x9763,
+ 0x9767, 0x976a, 0x976e, 0x9773, 0x9776, 0x9777, 0x9778, 0x977b,
+ 0x977d, 0x977f, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799,
+ 0x979a, 0x979e, 0x979f, 0x97a2, 0x97ac, 0x97ae, 0x97b1, 0x97b2,
+ 0x97b5, 0x97b6, 0x97b8, 0x97b9, 0x97ba, 0x97bc, 0x97be, 0x97bf,
+ 0x97c1, 0x97c4, 0x97c5, 0x97c7, 0x97c9, 0x97ca, 0x97cc, 0x97cd,
+ 0x97ce, 0x97d0, 0x97d1, 0x97d4, 0x97d7, 0x97d8, 0x97d9, 0x97dd,
+ 0x97de, 0x97e0, 0x97db, 0x97e1, 0x97e4, 0x97ef, 0x97f1, 0x97f4,
+ 0x97f7, 0x97f8, 0x97fa, 0x9807, 0x980a, 0x9819, 0x980d, 0x980e,
+ 0x9814, 0x9816, 0x981c, 0x981e, 0x9820, 0x9823, 0x9826,
+ /* 0x6821 - 0x687e */
+ 0x982b, 0x982e, 0x982f, 0x9830, 0x9832, 0x9833, 0x9835,
+ 0x9825, 0x983e, 0x9844, 0x9847, 0x984a, 0x9851, 0x9852, 0x9853,
+ 0x9856, 0x9857, 0x9859, 0x985a, 0x9862, 0x9863, 0x9865, 0x9866,
+ 0x986a, 0x986c, 0x98ab, 0x98ad, 0x98ae, 0x98b0, 0x98b4, 0x98b7,
+ 0x98b8, 0x98ba, 0x98bb, 0x98bf, 0x98c2, 0x98c5, 0x98c8, 0x98cc,
+ 0x98e1, 0x98e3, 0x98e5, 0x98e6, 0x98e7, 0x98ea, 0x98f3, 0x98f6,
+ 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991a,
+ 0x991b, 0x991c, 0x991f, 0x9922, 0x9926, 0x9927, 0x992b, 0x9931,
+ 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993a, 0x993b, 0x993c,
+ 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994d, 0x994e, 0x9954,
+ 0x9958, 0x9959, 0x995b, 0x995c, 0x995e, 0x995f, 0x9960, 0x999b,
+ 0x999d, 0x999f, 0x99a6, 0x99b0, 0x99b1, 0x99b2, 0x99b5,
+ /* 0x6921 - 0x697e */
+ 0x99b9, 0x99ba, 0x99bd, 0x99bf, 0x99c3, 0x99c9, 0x99d3,
+ 0x99d4, 0x99d9, 0x99da, 0x99dc, 0x99de, 0x99e7, 0x99ea, 0x99eb,
+ 0x99ec, 0x99f0, 0x99f4, 0x99f5, 0x99f9, 0x99fd, 0x99fe, 0x9a02,
+ 0x9a03, 0x9a04, 0x9a0b, 0x9a0c, 0x9a10, 0x9a11, 0x9a16, 0x9a1e,
+ 0x9a20, 0x9a22, 0x9a23, 0x9a24, 0x9a27, 0x9a2d, 0x9a2e, 0x9a33,
+ 0x9a35, 0x9a36, 0x9a38, 0x9a47, 0x9a41, 0x9a44, 0x9a4a, 0x9a4b,
+ 0x9a4c, 0x9a4e, 0x9a51, 0x9a54, 0x9a56, 0x9a5d, 0x9aaa, 0x9aac,
+ 0x9aae, 0x9aaf, 0x9ab2, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab9, 0x9abb,
+ 0x9abe, 0x9abf, 0x9ac1, 0x9ac3, 0x9ac6, 0x9ac8, 0x9ace, 0x9ad0,
+ 0x9ad2, 0x9ad5, 0x9ad6, 0x9ad7, 0x9adb, 0x9adc, 0x9ae0, 0x9ae4,
+ 0x9ae5, 0x9ae7, 0x9ae9, 0x9aec, 0x9af2, 0x9af3, 0x9af5, 0x9af9,
+ 0x9afa, 0x9afd, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b03,
+ /* 0x6a21 - 0x6a7e */
+ 0x9b04, 0x9b05, 0x9b08, 0x9b09, 0x9b0b, 0x9b0c, 0x9b0d,
+ 0x9b0e, 0x9b10, 0x9b12, 0x9b16, 0x9b19, 0x9b1b, 0x9b1c, 0x9b20,
+ 0x9b26, 0x9b2b, 0x9b2d, 0x9b33, 0x9b34, 0x9b35, 0x9b37, 0x9b39,
+ 0x9b3a, 0x9b3d, 0x9b48, 0x9b4b, 0x9b4c, 0x9b55, 0x9b56, 0x9b57,
+ 0x9b5b, 0x9b5e, 0x9b61, 0x9b63, 0x9b65, 0x9b66, 0x9b68, 0x9b6a,
+ 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b73, 0x9b75, 0x9b77, 0x9b78,
+ 0x9b79, 0x9b7f, 0x9b80, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b89,
+ 0x9b8a, 0x9b8b, 0x9b8d, 0x9b8f, 0x9b90, 0x9b94, 0x9b9a, 0x9b9d,
+ 0x9b9e, 0x9ba6, 0x9ba7, 0x9ba9, 0x9bac, 0x9bb0, 0x9bb1, 0x9bb2,
+ 0x9bb7, 0x9bb8, 0x9bbb, 0x9bbc, 0x9bbe, 0x9bbf, 0x9bc1, 0x9bc7,
+ 0x9bc8, 0x9bce, 0x9bd0, 0x9bd7, 0x9bd8, 0x9bdd, 0x9bdf, 0x9be5,
+ 0x9be7, 0x9bea, 0x9beb, 0x9bef, 0x9bf3, 0x9bf7, 0x9bf8,
+ /* 0x6b21 - 0x6b7e */
+ 0x9bf9, 0x9bfa, 0x9bfd, 0x9bff, 0x9c00, 0x9c02, 0x9c0b,
+ 0x9c0f, 0x9c11, 0x9c16, 0x9c18, 0x9c19, 0x9c1a, 0x9c1c, 0x9c1e,
+ 0x9c22, 0x9c23, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c31,
+ 0x9c35, 0x9c36, 0x9c37, 0x9c3d, 0x9c41, 0x9c43, 0x9c44, 0x9c45,
+ 0x9c49, 0x9c4a, 0x9c4e, 0x9c4f, 0x9c50, 0x9c53, 0x9c54, 0x9c56,
+ 0x9c58, 0x9c5b, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c63, 0x9c69, 0x9c6a,
+ 0x9c5c, 0x9c6b, 0x9c68, 0x9c6e, 0x9c70, 0x9c72, 0x9c75, 0x9c77,
+ 0x9c7b, 0x9ce6, 0x9cf2, 0x9cf7, 0x9cf9, 0x9d0b, 0x9d02, 0x9d11,
+ 0x9d17, 0x9d18, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d2f, 0x9d30, 0x9d32,
+ 0x9d33, 0x9d34, 0x9d3a, 0x9d3c, 0x9d45, 0x9d3d, 0x9d42, 0x9d43,
+ 0x9d47, 0x9d4a, 0x9d53, 0x9d54, 0x9d5f, 0x9d63, 0x9d62, 0x9d65,
+ 0x9d69, 0x9d6a, 0x9d6b, 0x9d70, 0x9d76, 0x9d77, 0x9d7b,
+ /* 0x6c21 - 0x6c7e */
+ 0x9d7c, 0x9d7e, 0x9d83, 0x9d84, 0x9d86, 0x9d8a, 0x9d8d,
+ 0x9d8e, 0x9d92, 0x9d93, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9da1,
+ 0x9daa, 0x9dac, 0x9dae, 0x9db1, 0x9db5, 0x9db9, 0x9dbc, 0x9dbf,
+ 0x9dc3, 0x9dc7, 0x9dc9, 0x9dca, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7,
+ 0x9dda, 0x9dde, 0x9ddf, 0x9de0, 0x9de5, 0x9de7, 0x9de9, 0x9deb,
+ 0x9dee, 0x9df0, 0x9df3, 0x9df4, 0x9dfe, 0x9e0a, 0x9e02, 0x9e07,
+ 0x9e0e, 0x9e10, 0x9e11, 0x9e12, 0x9e15, 0x9e16, 0x9e19, 0x9e1c,
+ 0x9e1d, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e80, 0x9e82, 0x9e83, 0x9e84,
+ 0x9e85, 0x9e87, 0x9e8e, 0x9e8f, 0x9e96, 0x9e98, 0x9e9b, 0x9e9e,
+ 0x9ea4, 0x9ea8, 0x9eac, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb3, 0x9eb4,
+ 0x9eb5, 0x9ec6, 0x9ec8, 0x9ecb, 0x9ed5, 0x9edf, 0x9ee4, 0x9ee7,
+ 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef5,
+ /* 0x6d21 - 0x6d7e */
+ 0x9ef8, 0x9eff, 0x9f02, 0x9f03, 0x9f09, 0x9f0f, 0x9f10,
+ 0x9f11, 0x9f12, 0x9f14, 0x9f16, 0x9f17, 0x9f19, 0x9f1a, 0x9f1b,
+ 0x9f1f, 0x9f22, 0x9f26, 0x9f2a, 0x9f2b, 0x9f2f, 0x9f31, 0x9f32,
+ 0x9f34, 0x9f37, 0x9f39, 0x9f3a, 0x9f3c, 0x9f3d, 0x9f3f, 0x9f41,
+ 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f53, 0x9f55, 0x9f56,
+ 0x9f57, 0x9f58, 0x9f5a, 0x9f5d, 0x9f5e, 0x9f68, 0x9f69, 0x9f6d,
+ 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f73, 0x9f75, 0x9f7a, 0x9f7d,
+ 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f94, 0x9f96, 0x9f97, 0x9f9e,
+ 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x6e21 - 0x6e7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x6f21 - 0x6f7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7021 - 0x707e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7121 - 0x717e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7221 - 0x727e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7321 - 0x737e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,
+ 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161,
+ /* 0x7421 - 0x747e */
+ 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+ 0x2169, 0xff07, 0xff02, 0x3231, 0x2116, 0x2121, 0x70bb, 0x4efc,
+ 0x50f4, 0x51ec, 0x5307, 0x5324, 0xfa0e, 0x548a, 0x5759, 0xfa0f,
+ 0xfa10, 0x589e, 0x5bec, 0x5cf5, 0x5d53, 0xfa11, 0x5fb7, 0x6085,
+ 0x6120, 0x654e, 0x663b, 0x6665, 0xfa12, 0xf929, 0x6801, 0xfa13,
+ 0xfa14, 0x6a6b, 0x6ae2, 0x6df8, 0x6df2, 0x7028, 0xfa15, 0xfa16,
+ 0x7501, 0x7682, 0x769e, 0xfa17, 0x7930, 0xfa18, 0xfa19, 0xfa1a,
+ 0xfa1b, 0x7ae7, 0xfa1c, 0xfa1d, 0x7da0, 0x7dd6, 0xfa1e, 0x8362,
+ 0xfa1f, 0x85b0, 0xfa20, 0xfa21, 0x8807, 0xfa22, 0x8b7f, 0x8cf4,
+ 0x8d76, 0xfa23, 0xfa24, 0xfa25, 0x90de, 0xfa26, 0x9115, 0xfa27,
+ 0xfa28, 0x9592, 0xf9dc, 0xfa29, 0x973b, 0x974d, 0x9751, 0xfa2a,
+ 0xfa2b, 0xfa2c, 0x999e, 0x9ad9, 0x9b72, 0xfa2d, 0x9ed1,
+ /* 0x7521 - 0x757e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7621 - 0x767e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7721 - 0x777e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7821 - 0x787e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7921 - 0x797e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7a21 - 0x7a7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7b21 - 0x7b7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7c21 - 0x7c7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7d21 - 0x7d7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x7e21 - 0x7e7e */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+#endif
+
+#ifdef USE_JISX0212
+static uint jisx0212ToUnicode11(uint h, uint l)
+{
+ if ((0x0021 <= h) && (h <= 0x007e) && (0x0021 <= l) && (l <= 0x007e)) {
+ return jisx0212_to_unicode[(h - 0x0021) * 0x005e + (l - 0x0021)];
+ }
+ return 0x0000;
+}
+#else
+static uint jisx0212ToUnicode11(uint h, uint l)
+{
+ return 0x0000;
+}
+#endif
+
+#ifdef USE_JISX0212
+
+/*
+ * This data is derived from Unicode 1.1,
+ * JIS X 0212 (1990) to Unicode mapping table version 0.9 .
+ * (In addition IBM Vender Defined Char included)
+ */
+static unsigned short const unicode_to_jisx0212_00[] = {
+ /* 0x0000 - 0x00ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2237, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2242, 0x0000, 0x0000, 0x2270, 0x0000, 0x2243, 0x0000,
+ 0x0000, 0x226d, 0x226c, 0x0000, 0x0000, 0x0000, 0x226e, 0x2234,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2231, 0x0000, 0x226b, 0x0000, 0x0000, 0x0000, 0x0000, 0x2244,
+ 0x2a22, 0x2a21, 0x2a24, 0x2a2a, 0x2a23, 0x2a29, 0x2921, 0x2a2e,
+ 0x2a32, 0x2a31, 0x2a34, 0x2a33, 0x2a40, 0x2a3f, 0x2a42, 0x2a41,
+ 0x0000, 0x2a50, 0x2a52, 0x2a51, 0x2a54, 0x2a58, 0x2a53, 0x0000,
+ 0x292c, 0x2a63, 0x2a62, 0x2a65, 0x2a64, 0x2a72, 0x2930, 0x294e,
+ 0x2b22, 0x2b21, 0x2b24, 0x2b2a, 0x2b23, 0x2b29, 0x2941, 0x2b2e,
+ 0x2b32, 0x2b31, 0x2b34, 0x2b33, 0x2b40, 0x2b3f, 0x2b42, 0x2b41,
+ 0x2943, 0x2b50, 0x2b52, 0x2b51, 0x2b54, 0x2b58, 0x2b53, 0x0000,
+ 0x294c, 0x2b63, 0x2b62, 0x2b65, 0x2b64, 0x2b72, 0x2950, 0x2b73,
+};
+
+static unsigned short const unicode_to_jisx0212_01[] = {
+ /* 0x0100 - 0x01ff */
+ 0x2a27, 0x2b27, 0x2a25, 0x2b25, 0x2a28, 0x2b28, 0x2a2b, 0x2b2b,
+ 0x2a2c, 0x2b2c, 0x2a2f, 0x2b2f, 0x2a2d, 0x2b2d, 0x2a30, 0x2b30,
+ 0x2922, 0x2942, 0x2a37, 0x2b37, 0x0000, 0x0000, 0x2a36, 0x2b36,
+ 0x2a38, 0x2b38, 0x2a35, 0x2b35, 0x2a3a, 0x2b3a, 0x2a3b, 0x2b3b,
+ 0x2a3d, 0x2b3d, 0x2a3c, 0x0000, 0x2a3e, 0x2b3e, 0x2924, 0x2944,
+ 0x2a47, 0x2b47, 0x2a45, 0x2b45, 0x0000, 0x0000, 0x2a46, 0x2b46,
+ 0x2a44, 0x2945, 0x2926, 0x2946, 0x2a48, 0x2b48, 0x2a49, 0x2b49,
+ 0x2947, 0x2a4a, 0x2b4a, 0x2a4c, 0x2b4c, 0x2a4b, 0x2b4b, 0x2929,
+ 0x2949, 0x2928, 0x2948, 0x2a4d, 0x2b4d, 0x2a4f, 0x2b4f, 0x2a4e,
+ 0x2b4e, 0x294a, 0x292b, 0x294b, 0x2a57, 0x2b57, 0x0000, 0x0000,
+ 0x2a56, 0x2b56, 0x292d, 0x294d, 0x2a59, 0x2b59, 0x2a5b, 0x2b5b,
+ 0x2a5a, 0x2b5a, 0x2a5c, 0x2b5c, 0x2a5d, 0x2b5d, 0x2a5f, 0x2b5f,
+ 0x2a5e, 0x2b5e, 0x2a61, 0x2b61, 0x2a60, 0x2b60, 0x292f, 0x294f,
+ 0x2a6c, 0x2b6c, 0x2a69, 0x2b69, 0x2a66, 0x2b66, 0x2a6b, 0x2b6b,
+ 0x2a68, 0x2b68, 0x2a6a, 0x2b6a, 0x2a71, 0x2b71, 0x2a74, 0x2b74,
+ 0x2a73, 0x2a75, 0x2b75, 0x2a77, 0x2b77, 0x2a76, 0x2b76, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a26, 0x2b26, 0x2a43,
+ 0x2b43, 0x2a55, 0x2b55, 0x2a67, 0x2b67, 0x2a70, 0x2b70, 0x2a6d,
+ 0x2b6d, 0x2a6f, 0x2b6f, 0x2a6e, 0x2b6e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2b39, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_02[] = {
+ /* 0x0200 - 0x02ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2230,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x222f, 0x2232, 0x2236, 0x2235, 0x0000, 0x2233, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_03[] = {
+ /* 0x0300 - 0x03ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2238, 0x2239, 0x2661, 0x0000,
+ 0x2662, 0x2663, 0x2664, 0x0000, 0x2667, 0x0000, 0x2669, 0x266c,
+ 0x2676, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2665, 0x266a, 0x2671, 0x2672, 0x2673, 0x2674,
+ 0x267b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2678, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2675, 0x267a, 0x2677, 0x2679, 0x267c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_04[] = {
+ /* 0x0400 - 0x04ff */
+ 0x0000, 0x0000, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,
+ 0x2748, 0x2749, 0x274a, 0x274b, 0x274c, 0x0000, 0x274d, 0x274e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776, 0x2777,
+ 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x0000, 0x277d, 0x277e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_21[] = {
+ /* 0x2100 - 0x21ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2271, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x742d, 0x226f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x737d, 0x737e, 0x7421, 0x7422, 0x7423, 0x7424, 0x7425, 0x7426,
+ 0x7427, 0x7428, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737a,
+ 0x737b, 0x737c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_32[] = {
+ /* 0x3200 - 0x32ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x742b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_4e[] = {
+ /* 0x4e00 - 0x4eff */
+ 0x0000, 0x0000, 0x3021, 0x0000, 0x3022, 0x3023, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3024, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3025, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3026,
+ 0x0000, 0x0000, 0x0000, 0x3027, 0x3028, 0x0000, 0x0000, 0x0000,
+ 0x3029, 0x0000, 0x0000, 0x302a, 0x0000, 0x0000, 0x302b, 0x302c,
+ 0x302d, 0x0000, 0x0000, 0x0000, 0x0000, 0x302e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x302f, 0x3030, 0x0000, 0x0000, 0x3031, 0x0000, 0x0000, 0x3032,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3034, 0x0000, 0x3035, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3036, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3037, 0x3038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3039, 0x303a, 0x0000, 0x0000,
+ 0x0000, 0x303b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x303c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x303d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x303e, 0x303f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3040, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3041,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3043, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3045, 0x3046, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3047, 0x3048, 0x3049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x304a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x304b,
+ 0x0000, 0x304c, 0x0000, 0x304d, 0x0000, 0x304e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x742f, 0x304f, 0x3050, 0x3051,
+};
+
+static unsigned short const unicode_to_jisx0212_4f[] = {
+ /* 0x4f00 - 0x4fff */
+ 0x3052, 0x0000, 0x3053, 0x3054, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3055, 0x0000, 0x0000, 0x3056, 0x3057, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3058, 0x0000, 0x0000, 0x3059, 0x305a, 0x305b,
+ 0x0000, 0x305c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x305d, 0x0000,
+ 0x0000, 0x305e, 0x0000, 0x3060, 0x0000, 0x3061, 0x0000, 0x3062,
+ 0x0000, 0x3063, 0x0000, 0x3064, 0x0000, 0x0000, 0x3065, 0x0000,
+ 0x3066, 0x0000, 0x3067, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3068, 0x3069, 0x0000, 0x306a, 0x306b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x306c, 0x0000, 0x306d, 0x0000, 0x306e, 0x0000,
+ 0x306f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3070,
+ 0x305f, 0x0000, 0x0000, 0x3071, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3072, 0x0000, 0x3073, 0x0000, 0x3074, 0x0000,
+ 0x0000, 0x3075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3076,
+ 0x3077, 0x3078, 0x3079, 0x0000, 0x0000, 0x307a, 0x307b, 0x0000,
+ 0x0000, 0x307c, 0x307d, 0x0000, 0x307e, 0x3121, 0x0000, 0x0000,
+ 0x0000, 0x3122, 0x3123, 0x0000, 0x3124, 0x0000, 0x3125, 0x0000,
+ 0x3126, 0x0000, 0x3127, 0x3128, 0x3129, 0x0000, 0x0000, 0x312a,
+ 0x0000, 0x312b, 0x312c, 0x0000, 0x0000, 0x0000, 0x312d, 0x312e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x312f, 0x0000, 0x0000, 0x0000, 0x0000, 0x3130,
+ 0x0000, 0x3131, 0x0000, 0x3132, 0x3133, 0x3134, 0x3135, 0x0000,
+ 0x3136, 0x3137, 0x0000, 0x0000, 0x0000, 0x3138, 0x3139, 0x0000,
+ 0x313a, 0x313b, 0x0000, 0x313c, 0x313d, 0x313e, 0x0000, 0x313f,
+ 0x0000, 0x0000, 0x3140, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3141, 0x0000, 0x0000, 0x0000,
+ 0x3142, 0x0000, 0x3143, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3144, 0x0000, 0x3145, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3146, 0x3147, 0x0000, 0x3148,
+};
+
+static unsigned short const unicode_to_jisx0212_50[] = {
+ /* 0x5000 - 0x50ff */
+ 0x3149, 0x314a, 0x0000, 0x0000, 0x314b, 0x0000, 0x0000, 0x314c,
+ 0x0000, 0x0000, 0x314d, 0x0000, 0x314e, 0x0000, 0x314f, 0x0000,
+ 0x3150, 0x0000, 0x0000, 0x3151, 0x0000, 0x0000, 0x0000, 0x3152,
+ 0x3153, 0x0000, 0x0000, 0x3154, 0x3155, 0x3156, 0x3157, 0x0000,
+ 0x0000, 0x0000, 0x3158, 0x0000, 0x0000, 0x0000, 0x0000, 0x3159,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315a, 0x0000,
+ 0x315b, 0x0000, 0x315c, 0x315d, 0x0000, 0x315e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3176, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x315f, 0x3160, 0x3161, 0x0000, 0x0000, 0x3162, 0x3163, 0x0000,
+ 0x0000, 0x0000, 0x3164, 0x0000, 0x3165, 0x0000, 0x3166, 0x0000,
+ 0x0000, 0x3167, 0x3168, 0x3169, 0x0000, 0x0000, 0x0000, 0x316a,
+ 0x0000, 0x316b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x316c,
+ 0x316d, 0x0000, 0x316e, 0x316f, 0x0000, 0x0000, 0x3170, 0x3171,
+ 0x0000, 0x0000, 0x3172, 0x0000, 0x0000, 0x3173, 0x0000, 0x0000,
+ 0x3174, 0x3175, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3177, 0x0000, 0x3178, 0x3179, 0x0000, 0x317a, 0x0000,
+ 0x0000, 0x0000, 0x317b, 0x0000, 0x0000, 0x0000, 0x317c, 0x317d,
+ 0x317e, 0x0000, 0x3221, 0x3222, 0x3223, 0x0000, 0x3224, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3225, 0x3226, 0x0000, 0x3227, 0x3228,
+ 0x3229, 0x322a, 0x322b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x322c, 0x0000, 0x0000, 0x0000, 0x0000, 0x322d,
+ 0x322e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x322f, 0x3230, 0x0000, 0x0000, 0x3231, 0x0000, 0x0000,
+ 0x3232, 0x0000, 0x0000, 0x3233, 0x3234, 0x0000, 0x0000, 0x3235,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3236, 0x0000, 0x3237, 0x0000,
+ 0x3238, 0x0000, 0x0000, 0x3239, 0x323a, 0x0000, 0x0000, 0x0000,
+ 0x323b, 0x0000, 0x0000, 0x0000, 0x323c, 0x323d, 0x0000, 0x323e,
+ 0x0000, 0x0000, 0x323f, 0x0000, 0x3240, 0x0000, 0x3241, 0x0000,
+ 0x3242, 0x3243, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3244,
+ 0x0000, 0x3245, 0x3251, 0x0000, 0x7430, 0x0000, 0x3246, 0x0000,
+ 0x0000, 0x0000, 0x3247, 0x0000, 0x0000, 0x0000, 0x3248, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_51[] = {
+ /* 0x5100 - 0x51ff */
+ 0x0000, 0x0000, 0x0000, 0x3249, 0x0000, 0x0000, 0x324a, 0x324b,
+ 0x324c, 0x0000, 0x0000, 0x324d, 0x324e, 0x324f, 0x3250, 0x0000,
+ 0x3252, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3253,
+ 0x0000, 0x3254, 0x0000, 0x3255, 0x3256, 0x3257, 0x3258, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3259, 0x0000, 0x0000, 0x0000, 0x325a,
+ 0x325b, 0x0000, 0x0000, 0x0000, 0x325c, 0x325d, 0x0000, 0x325e,
+ 0x0000, 0x325f, 0x0000, 0x3260, 0x3261, 0x3262, 0x0000, 0x0000,
+ 0x3263, 0x3264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3265, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3266, 0x0000, 0x0000, 0x0000, 0x0000, 0x3267,
+ 0x0000, 0x0000, 0x0000, 0x3268, 0x0000, 0x3269, 0x0000, 0x326a,
+ 0x326b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x326c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x326d, 0x0000, 0x326e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x326f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3270, 0x3271, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3272, 0x0000, 0x0000, 0x3273, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3274, 0x0000, 0x0000, 0x0000, 0x0000, 0x3275, 0x0000, 0x0000,
+ 0x0000, 0x3276, 0x0000, 0x3277, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3278, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3279, 0x0000, 0x327a, 0x0000, 0x327b, 0x0000, 0x327c, 0x327d,
+ 0x0000, 0x0000, 0x327e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3321, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3322,
+ 0x0000, 0x3323, 0x3324, 0x3325, 0x0000, 0x3326, 0x0000, 0x0000,
+ 0x3327, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3328, 0x0000,
+ 0x0000, 0x0000, 0x3329, 0x0000, 0x0000, 0x332a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7431, 0x0000, 0x332b, 0x0000,
+ 0x0000, 0x0000, 0x332c, 0x332d, 0x332e, 0x0000, 0x0000, 0x332f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_52[] = {
+ /* 0x5200 - 0x52ff */
+ 0x0000, 0x3330, 0x3331, 0x0000, 0x0000, 0x3332, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3333, 0x3334, 0x0000, 0x3335, 0x3336, 0x0000,
+ 0x3337, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3338, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3339, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x333a, 0x333b, 0x0000, 0x0000, 0x333c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x333d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x333e, 0x0000, 0x0000,
+ 0x0000, 0x333f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3340, 0x0000, 0x3341,
+ 0x3342, 0x0000, 0x3343, 0x0000, 0x3344, 0x0000, 0x0000, 0x3345,
+ 0x3346, 0x3347, 0x0000, 0x0000, 0x0000, 0x0000, 0x3348, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3349, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x334a,
+ 0x334b, 0x334c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x334d, 0x0000, 0x334e, 0x0000, 0x0000, 0x334f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3350, 0x0000, 0x3351, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3352, 0x0000, 0x3353, 0x3354, 0x3355,
+ 0x3356, 0x0000, 0x3357, 0x0000, 0x3358, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3359, 0x335a, 0x335b, 0x335c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x335d,
+ 0x335e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x335f, 0x3360,
+ 0x3361, 0x0000, 0x3362, 0x3363, 0x0000, 0x3364, 0x0000, 0x0000,
+ 0x3365, 0x0000, 0x0000, 0x0000, 0x3366, 0x0000, 0x3367, 0x0000,
+ 0x3368, 0x0000, 0x0000, 0x0000, 0x3369, 0x0000, 0x0000, 0x336a,
+ 0x0000, 0x336b, 0x0000, 0x0000, 0x336c, 0x0000, 0x336d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x336e, 0x336f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3370, 0x0000, 0x0000, 0x0000, 0x3371, 0x0000, 0x0000,
+ 0x3372, 0x3373, 0x3374, 0x0000, 0x3375, 0x0000, 0x0000, 0x0000,
+ 0x3376, 0x3377, 0x0000, 0x0000, 0x3378, 0x0000, 0x3379, 0x337a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_53[] = {
+ /* 0x5300 - 0x53ff */
+ 0x337b, 0x0000, 0x0000, 0x337c, 0x0000, 0x0000, 0x0000, 0x7432,
+ 0x0000, 0x0000, 0x337d, 0x337e, 0x3421, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3422, 0x0000, 0x3423, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3424, 0x0000, 0x0000, 0x3425, 0x3426, 0x0000, 0x3427, 0x3428,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7433, 0x3429, 0x0000, 0x342a,
+ 0x342b, 0x342c, 0x0000, 0x342d, 0x342e, 0x342f, 0x0000, 0x0000,
+ 0x3430, 0x0000, 0x3431, 0x0000, 0x0000, 0x3432, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3433, 0x3434, 0x3435, 0x0000,
+ 0x0000, 0x0000, 0x3436, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3438, 0x3437, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3439, 0x0000, 0x343a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x343b, 0x0000, 0x343c, 0x0000, 0x343d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x343e, 0x343f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3440, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3441, 0x0000, 0x0000, 0x0000, 0x0000, 0x3442, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3443, 0x0000, 0x0000, 0x0000, 0x3444,
+ 0x3445, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3446, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3447, 0x3448, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3449, 0x0000, 0x0000, 0x0000, 0x344a, 0x0000, 0x0000,
+ 0x0000, 0x344b, 0x0000, 0x0000, 0x344c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x344d, 0x344e, 0x0000, 0x0000, 0x0000, 0x344f,
+ 0x0000, 0x0000, 0x3450, 0x0000, 0x3451, 0x3452, 0x0000, 0x3453,
+ 0x3454, 0x0000, 0x3455, 0x0000, 0x0000, 0x3456, 0x0000, 0x0000,
+ 0x3457, 0x0000, 0x0000, 0x0000, 0x0000, 0x3458, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3459,
+ 0x0000, 0x0000, 0x345a, 0x345b, 0x0000, 0x345c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x345d, 0x0000, 0x0000, 0x345e, 0x345f, 0x0000,
+ 0x3460, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3461, 0x3462,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3463, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_54[] = {
+ /* 0x5400 - 0x54ff */
+ 0x0000, 0x0000, 0x3464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3465, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3466, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3467, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3468,
+ 0x3469, 0x0000, 0x346a, 0x0000, 0x0000, 0x0000, 0x0000, 0x346b,
+ 0x0000, 0x346c, 0x0000, 0x0000, 0x346d, 0x346e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x346f, 0x3470, 0x0000, 0x0000, 0x3471,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3472, 0x0000, 0x3473,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3474, 0x0000,
+ 0x0000, 0x0000, 0x3475, 0x0000, 0x3476, 0x0000, 0x3477, 0x3478,
+ 0x0000, 0x3479, 0x0000, 0x347a, 0x0000, 0x347b, 0x347c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x347d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x347e,
+ 0x0000, 0x3521, 0x0000, 0x3522, 0x0000, 0x3523, 0x0000, 0x0000,
+ 0x3524, 0x3525, 0x7435, 0x0000, 0x0000, 0x3526, 0x0000, 0x0000,
+ 0x0000, 0x3527, 0x0000, 0x0000, 0x0000, 0x3528, 0x3529, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x352a, 0x0000, 0x0000, 0x352b,
+ 0x0000, 0x352c, 0x0000, 0x0000, 0x0000, 0x0000, 0x352d, 0x352e,
+ 0x0000, 0x352f, 0x3530, 0x0000, 0x0000, 0x3531, 0x3532, 0x0000,
+ 0x0000, 0x3533, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3534,
+ 0x0000, 0x3535, 0x3536, 0x3537, 0x0000, 0x0000, 0x0000, 0x3538,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3539, 0x0000,
+ 0x0000, 0x0000, 0x353a, 0x0000, 0x0000, 0x353b, 0x353c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x353d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x353e, 0x0000, 0x353f, 0x0000, 0x0000, 0x3540,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3541, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3542, 0x0000, 0x3543, 0x3544,
+};
+
+static unsigned short const unicode_to_jisx0212_55[] = {
+ /* 0x5500 - 0x55ff */
+ 0x3545, 0x3546, 0x0000, 0x0000, 0x0000, 0x3547, 0x0000, 0x0000,
+ 0x3548, 0x3549, 0x0000, 0x0000, 0x354a, 0x354b, 0x354c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x354d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x354e, 0x354f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3550, 0x0000, 0x0000, 0x3551, 0x3552, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3553, 0x3554, 0x3555, 0x0000, 0x0000,
+ 0x0000, 0x3556, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3557,
+ 0x0000, 0x3558, 0x3559, 0x0000, 0x0000, 0x355a, 0x0000, 0x0000,
+ 0x355b, 0x355c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x355d, 0x0000, 0x355e, 0x355f, 0x0000, 0x0000, 0x3560, 0x0000,
+ 0x3561, 0x3562, 0x0000, 0x0000, 0x3563, 0x0000, 0x3564, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3565,
+ 0x0000, 0x3566, 0x3567, 0x0000, 0x0000, 0x0000, 0x3568, 0x0000,
+ 0x3569, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x356a, 0x356b,
+ 0x0000, 0x356c, 0x356d, 0x356e, 0x356f, 0x0000, 0x0000, 0x3570,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3571, 0x3572, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3573, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3574, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3575,
+ 0x0000, 0x3576, 0x0000, 0x3577, 0x0000, 0x0000, 0x3578, 0x0000,
+ 0x0000, 0x3579, 0x0000, 0x357a, 0x357b, 0x0000, 0x357c, 0x0000,
+ 0x0000, 0x357d, 0x357e, 0x3621, 0x0000, 0x0000, 0x0000, 0x3622,
+ 0x3623, 0x0000, 0x0000, 0x3624, 0x0000, 0x0000, 0x3625, 0x0000,
+ 0x0000, 0x0000, 0x3626, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3627, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3628, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3629,
+};
+
+static unsigned short const unicode_to_jisx0212_56[] = {
+ /* 0x5600 - 0x56ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x362a, 0x0000, 0x0000,
+ 0x362b, 0x0000, 0x362c, 0x0000, 0x0000, 0x362d, 0x362e, 0x362f,
+ 0x3630, 0x3631, 0x3632, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3633, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3634, 0x0000, 0x0000, 0x0000,
+ 0x3635, 0x0000, 0x0000, 0x3636, 0x0000, 0x3637, 0x0000, 0x3638,
+ 0x0000, 0x3639, 0x0000, 0x363a, 0x363b, 0x363c, 0x0000, 0x363d,
+ 0x363e, 0x363f, 0x0000, 0x3640, 0x3641, 0x0000, 0x3642, 0x0000,
+ 0x0000, 0x3643, 0x0000, 0x3644, 0x0000, 0x3645, 0x0000, 0x3646,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3647, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3648, 0x0000,
+ 0x3649, 0x364a, 0x364b, 0x364c, 0x0000, 0x0000, 0x364d, 0x0000,
+ 0x0000, 0x364e, 0x0000, 0x0000, 0x0000, 0x364f, 0x0000, 0x3650,
+ 0x0000, 0x3651, 0x3652, 0x0000, 0x0000, 0x3653, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3654, 0x3655, 0x0000, 0x0000,
+ 0x3656, 0x0000, 0x0000, 0x3657, 0x3658, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3659, 0x0000, 0x0000,
+ 0x0000, 0x365a, 0x365b, 0x0000, 0x0000, 0x365c, 0x365d, 0x365e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x365f, 0x3660,
+ 0x3661, 0x3662, 0x0000, 0x3663, 0x3664, 0x3665, 0x0000, 0x0000,
+ 0x0000, 0x3666, 0x0000, 0x3667, 0x0000, 0x0000, 0x0000, 0x3668,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3669, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x366a, 0x0000, 0x0000,
+ 0x0000, 0x366b, 0x366c, 0x366d, 0x3670, 0x3671, 0x0000, 0x366e,
+ 0x366f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3672, 0x0000, 0x0000, 0x3673, 0x3674, 0x0000, 0x3675,
+ 0x0000, 0x3676, 0x0000, 0x0000, 0x3677, 0x3678, 0x3679, 0x367a,
+ 0x367b, 0x0000, 0x0000, 0x367d, 0x0000, 0x367e, 0x0000, 0x0000,
+ 0x0000, 0x367c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3721, 0x3722,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_57[] = {
+ /* 0x5700 - 0x57ff */
+ 0x0000, 0x3723, 0x3724, 0x0000, 0x0000, 0x0000, 0x0000, 0x3725,
+ 0x0000, 0x0000, 0x3726, 0x0000, 0x3727, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3728, 0x0000, 0x0000, 0x0000, 0x3729, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x372a, 0x372b, 0x0000, 0x372c, 0x0000, 0x0000,
+ 0x372d, 0x0000, 0x372e, 0x372f, 0x3730, 0x3731, 0x0000, 0x0000,
+ 0x0000, 0x3732, 0x3733, 0x0000, 0x3734, 0x0000, 0x3735, 0x3736,
+ 0x0000, 0x0000, 0x0000, 0x3737, 0x3738, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3739, 0x373a, 0x373b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x373c, 0x373d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x373e, 0x373f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3740, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7436, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3741, 0x0000, 0x0000, 0x3742, 0x0000, 0x3743,
+ 0x3744, 0x0000, 0x0000, 0x3745, 0x0000, 0x3746, 0x3747, 0x3748,
+ 0x3749, 0x374a, 0x0000, 0x374b, 0x374c, 0x374d, 0x0000, 0x374e,
+ 0x0000, 0x374f, 0x3750, 0x3751, 0x3752, 0x0000, 0x3753, 0x0000,
+ 0x0000, 0x3754, 0x0000, 0x3755, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3756, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3757, 0x3760, 0x0000, 0x3758,
+ 0x0000, 0x3759, 0x375a, 0x0000, 0x375b, 0x375c, 0x375d, 0x375e,
+ 0x0000, 0x375f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3761,
+ 0x3762, 0x3763, 0x0000, 0x0000, 0x3764, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3765, 0x0000, 0x0000, 0x0000, 0x0000, 0x3766, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3767,
+ 0x3768, 0x0000, 0x0000, 0x0000, 0x3769, 0x0000, 0x0000, 0x376a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x376b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x376c, 0x376d, 0x0000,
+ 0x0000, 0x377e, 0x0000, 0x0000, 0x376e, 0x0000, 0x376f, 0x3770,
+ 0x0000, 0x3771, 0x0000, 0x0000, 0x0000, 0x3772, 0x0000, 0x0000,
+ 0x3773, 0x0000, 0x0000, 0x0000, 0x0000, 0x3774, 0x3775, 0x0000,
+ 0x3776, 0x0000, 0x0000, 0x0000, 0x0000, 0x3777, 0x3778, 0x3779,
+};
+
+static unsigned short const unicode_to_jisx0212_58[] = {
+ /* 0x5800 - 0x58ff */
+ 0x0000, 0x0000, 0x0000, 0x377a, 0x377b, 0x0000, 0x0000, 0x0000,
+ 0x377c, 0x377d, 0x0000, 0x0000, 0x3821, 0x3822, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3823, 0x0000, 0x0000, 0x3824, 0x3825,
+ 0x3826, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3827, 0x3828,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3829, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x382a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x382b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x382c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x382d, 0x0000, 0x0000, 0x382e, 0x382f, 0x0000, 0x3830,
+ 0x3831, 0x0000, 0x0000, 0x0000, 0x0000, 0x3832, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3833,
+ 0x0000, 0x3834, 0x0000, 0x0000, 0x3835, 0x0000, 0x0000, 0x3836,
+ 0x3837, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3838, 0x0000, 0x0000, 0x0000, 0x3839, 0x0000, 0x0000, 0x383a,
+ 0x383b, 0x383c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x383d,
+ 0x383e, 0x383f, 0x3840, 0x0000, 0x3841, 0x3842, 0x0000, 0x3843,
+ 0x3844, 0x0000, 0x0000, 0x0000, 0x3845, 0x0000, 0x3846, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3847, 0x7439, 0x0000,
+ 0x3848, 0x3849, 0x384a, 0x0000, 0x0000, 0x0000, 0x384b, 0x0000,
+ 0x0000, 0x384c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x384d, 0x384e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3850, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3851, 0x0000, 0x384f, 0x0000, 0x0000, 0x0000,
+ 0x3852, 0x0000, 0x0000, 0x0000, 0x0000, 0x3853, 0x3854, 0x0000,
+ 0x3855, 0x0000, 0x3856, 0x0000, 0x3857, 0x0000, 0x3858, 0x0000,
+ 0x0000, 0x0000, 0x3859, 0x0000, 0x0000, 0x385a, 0x0000, 0x0000,
+ 0x0000, 0x385b, 0x385c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x385d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x385e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_59[] = {
+ /* 0x5900 - 0x59ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x385f, 0x3860, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3861, 0x3862, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3863, 0x3864, 0x3865, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3867, 0x0000, 0x0000,
+ 0x0000, 0x3868, 0x0000, 0x3869, 0x386a, 0x0000, 0x0000, 0x0000,
+ 0x386b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x386c,
+ 0x386d, 0x0000, 0x0000, 0x386e, 0x0000, 0x386f, 0x3870, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3871,
+ 0x0000, 0x0000, 0x0000, 0x3872, 0x0000, 0x0000, 0x3873, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3874, 0x3875, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3876, 0x0000, 0x3877, 0x0000, 0x3878, 0x3879, 0x387a,
+ 0x0000, 0x387b, 0x0000, 0x387c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x387d, 0x0000, 0x387e, 0x0000, 0x3921,
+ 0x0000, 0x0000, 0x3922, 0x0000, 0x0000, 0x3923, 0x3924, 0x0000,
+ 0x0000, 0x3925, 0x0000, 0x3926, 0x3927, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3928, 0x3929, 0x0000, 0x392a, 0x0000,
+ 0x0000, 0x0000, 0x392b, 0x0000, 0x0000, 0x392c, 0x0000, 0x392d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x392e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x392f, 0x0000, 0x0000, 0x3930,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3931, 0x3932, 0x3933,
+ 0x3934, 0x0000, 0x0000, 0x3935, 0x0000, 0x0000, 0x0000, 0x3936,
+ 0x0000, 0x0000, 0x3937, 0x0000, 0x3938, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3939, 0x0000, 0x393a, 0x393b, 0x0000, 0x0000, 0x0000,
+ 0x393c, 0x0000, 0x393d, 0x0000, 0x0000, 0x393e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x393f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3940, 0x3941, 0x3942,
+ 0x0000, 0x0000, 0x0000, 0x3943, 0x3944, 0x0000, 0x0000, 0x3945,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3946, 0x3947,
+ 0x0000, 0x3948, 0x3949, 0x0000, 0x394a, 0x0000, 0x0000, 0x394b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_5a[] = {
+ /* 0x5a00 - 0x5aff */
+ 0x394c, 0x0000, 0x0000, 0x0000, 0x394d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x394e, 0x394f, 0x3950, 0x0000,
+ 0x0000, 0x0000, 0x3951, 0x3952, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3953, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3954, 0x3955, 0x0000, 0x0000, 0x3956,
+ 0x3957, 0x0000, 0x3958, 0x0000, 0x0000, 0x3959, 0x0000, 0x0000,
+ 0x395a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x395b, 0x395c, 0x0000, 0x395d,
+ 0x395e, 0x0000, 0x0000, 0x0000, 0x395f, 0x0000, 0x0000, 0x0000,
+ 0x3960, 0x0000, 0x0000, 0x0000, 0x0000, 0x3961, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3962, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3963, 0x0000, 0x3964, 0x0000, 0x3965,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3966, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3967,
+ 0x0000, 0x0000, 0x3968, 0x3969, 0x0000, 0x0000, 0x396a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x396b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x396c, 0x0000, 0x0000, 0x396d, 0x0000, 0x0000, 0x396e, 0x0000,
+ 0x0000, 0x396f, 0x0000, 0x0000, 0x3970, 0x0000, 0x3971, 0x3972,
+ 0x3973, 0x0000, 0x3974, 0x0000, 0x0000, 0x0000, 0x0000, 0x3975,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3976, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3977, 0x3978, 0x3979, 0x0000, 0x397a, 0x0000, 0x0000,
+ 0x397b, 0x0000, 0x397c, 0x397d, 0x0000, 0x0000, 0x0000, 0x397e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3a21, 0x0000, 0x3a22, 0x0000,
+ 0x3a23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a24,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a25, 0x0000, 0x3a26, 0x0000, 0x0000, 0x0000,
+ 0x3a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a28, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a29, 0x0000, 0x0000, 0x0000, 0x3a2a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a2b, 0x3a2c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a2d, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_5b[] = {
+ /* 0x5b00 - 0x5bff */
+ 0x3a2e, 0x3a2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a31,
+ 0x0000, 0x3a33, 0x0000, 0x3a34, 0x0000, 0x3a35, 0x0000, 0x0000,
+ 0x0000, 0x3a36, 0x0000, 0x0000, 0x0000, 0x3a37, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a38, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3a32, 0x0000, 0x0000, 0x0000,
+ 0x3a39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3a3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3a3b, 0x3a3c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a3d, 0x0000, 0x0000, 0x0000, 0x3a3e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a3f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3a40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a41, 0x3a42,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3a43, 0x3a44, 0x3a45, 0x3a46,
+ 0x0000, 0x3a47, 0x0000, 0x0000, 0x3a48, 0x0000, 0x3a49, 0x0000,
+ 0x0000, 0x0000, 0x3a4a, 0x0000, 0x0000, 0x0000, 0x3a4b, 0x0000,
+ 0x3a4c, 0x3a4d, 0x0000, 0x3a4e, 0x3a4f, 0x0000, 0x3a50, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3a51, 0x3a52, 0x0000, 0x0000, 0x3a53, 0x3a54, 0x0000, 0x3a55,
+ 0x0000, 0x3a56, 0x3a57, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a58,
+ 0x0000, 0x0000, 0x3a59, 0x0000, 0x3a5a, 0x0000, 0x0000, 0x0000,
+ 0x3a5b, 0x3a5c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a5d, 0x0000, 0x3a5e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a5f, 0x3a60,
+ 0x3a61, 0x3a62, 0x3a63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x743a, 0x0000, 0x0000, 0x3a65,
+ 0x0000, 0x3a66, 0x0000, 0x0000, 0x3a67, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a68, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_5c[] = {
+ /* 0x5c00 - 0x5cff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3a69, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a6a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a6b, 0x3a6c,
+ 0x0000, 0x0000, 0x0000, 0x3a6d, 0x0000, 0x0000, 0x3a6e, 0x0000,
+ 0x0000, 0x3a6f, 0x0000, 0x3a70, 0x3a71, 0x0000, 0x3a72, 0x0000,
+ 0x3a73, 0x0000, 0x3a74, 0x0000, 0x0000, 0x3a75, 0x3a76, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3a77, 0x3a78, 0x0000, 0x3a79, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3a7a, 0x3a7b, 0x0000, 0x0000, 0x0000, 0x3a7c,
+ 0x3a7d, 0x3a7e, 0x0000, 0x0000, 0x0000, 0x3b21, 0x0000, 0x0000,
+ 0x3b22, 0x0000, 0x0000, 0x0000, 0x3b23, 0x3b24, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b25, 0x3b26, 0x3b27, 0x3b28, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b29,
+ 0x3b2a, 0x0000, 0x3b2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b2c,
+ 0x0000, 0x0000, 0x3b2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b2e, 0x0000, 0x3b2f,
+ 0x3b30, 0x0000, 0x3b31, 0x3b32, 0x0000, 0x0000, 0x3b33, 0x0000,
+ 0x0000, 0x0000, 0x3b34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b35, 0x0000, 0x3b36, 0x3b37, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3b39, 0x0000, 0x3b3a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b3d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b3c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b3e, 0x0000,
+ 0x0000, 0x3b3f, 0x3b40, 0x0000, 0x3b41, 0x743b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_5d[] = {
+ /* 0x5d00 - 0x5dff */
+ 0x0000, 0x3b42, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b43, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b44, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b47, 0x3b48, 0x0000, 0x3b49, 0x3b4a,
+ 0x0000, 0x0000, 0x0000, 0x3b46, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3b4b, 0x0000, 0x0000, 0x3b4c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3b4d, 0x0000, 0x0000, 0x0000, 0x3b4e, 0x0000, 0x3b4f,
+ 0x0000, 0x0000, 0x3b50, 0x3b51, 0x0000, 0x0000, 0x3b52, 0x0000,
+ 0x3b53, 0x0000, 0x3b57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3b55, 0x0000, 0x743c, 0x0000, 0x3b54, 0x0000, 0x0000,
+ 0x0000, 0x3b56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b58,
+ 0x3b59, 0x3b5a, 0x3b5b, 0x0000, 0x3b5c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b5d, 0x0000, 0x0000, 0x3b5e, 0x0000, 0x0000,
+ 0x3b5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3b60, 0x3b61, 0x0000, 0x0000, 0x0000, 0x3b62, 0x3b63,
+ 0x0000, 0x3b64, 0x0000, 0x3b65, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3b66, 0x0000, 0x3b67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x0000, 0x0000,
+ 0x0000, 0x3b6c, 0x0000, 0x3b6d, 0x0000, 0x0000, 0x0000, 0x3b6e,
+ 0x3b6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b70,
+ 0x0000, 0x0000, 0x0000, 0x3b71, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3b72, 0x0000, 0x6674, 0x0000, 0x3b73, 0x0000, 0x0000, 0x0000,
+ 0x3b74, 0x3b75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3b76, 0x0000, 0x0000, 0x0000, 0x3b77,
+ 0x0000, 0x0000, 0x0000, 0x3b78, 0x0000, 0x0000, 0x3b7a, 0x0000,
+ 0x3b79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3b7b, 0x3b7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3b7d, 0x0000, 0x0000, 0x0000, 0x3b7e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c22, 0x3c23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_5e[] = {
+ /* 0x5e00 - 0x5eff */
+ 0x3c24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c25,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c26, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3c27, 0x0000, 0x3c28, 0x3c29, 0x0000, 0x0000,
+ 0x3c2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c2b,
+ 0x3c2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c2d, 0x0000,
+ 0x0000, 0x0000, 0x3c2f, 0x0000, 0x0000, 0x3c30, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c31, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c34, 0x0000, 0x3c32, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c33, 0x3c35, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c36, 0x0000,
+ 0x3c37, 0x0000, 0x0000, 0x3c38, 0x3c39, 0x0000, 0x3c3a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c3b, 0x0000, 0x3c3c, 0x3c3d, 0x3c3e, 0x3c3f, 0x3c40, 0x0000,
+ 0x3c41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c43, 0x0000, 0x0000, 0x3c44, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3c45, 0x0000, 0x3c46, 0x3c47, 0x0000, 0x0000,
+ 0x3c48, 0x0000, 0x3c49, 0x0000, 0x3c4a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c4b, 0x0000, 0x3c4c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c4d, 0x3c4e, 0x3c4f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c50, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c52, 0x3c51, 0x0000, 0x3c53, 0x0000,
+ 0x0000, 0x3c54, 0x3c55, 0x0000, 0x3c56, 0x3c57, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3c58, 0x0000, 0x3c59, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c5a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c5b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_5f[] = {
+ /* 0x5f00 - 0x5fff */
+ 0x0000, 0x0000, 0x3c5c, 0x0000, 0x0000, 0x0000, 0x3c5d, 0x3c5e,
+ 0x3c5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c60, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c61, 0x0000, 0x0000, 0x3c62, 0x3c63, 0x0000, 0x0000,
+ 0x0000, 0x3c64, 0x3c65, 0x3c66, 0x3c67, 0x0000, 0x0000, 0x0000,
+ 0x3c68, 0x0000, 0x0000, 0x3c69, 0x3c6a, 0x0000, 0x3c6b, 0x0000,
+ 0x3c6c, 0x0000, 0x0000, 0x0000, 0x3c6d, 0x0000, 0x3c6e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c6f, 0x0000, 0x3c70, 0x0000, 0x3c71,
+ 0x3c72, 0x0000, 0x0000, 0x0000, 0x3c73, 0x3c74, 0x0000, 0x3c75,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c76, 0x0000, 0x0000,
+ 0x3c77, 0x0000, 0x0000, 0x0000, 0x3c78, 0x0000, 0x0000, 0x0000,
+ 0x3c79, 0x0000, 0x0000, 0x3c7a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c7b, 0x0000, 0x0000, 0x3c7c, 0x3c7d, 0x0000, 0x0000, 0x3c7e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d21,
+ 0x0000, 0x0000, 0x3d22, 0x0000, 0x3d23, 0x3d24, 0x0000, 0x0000,
+ 0x3d25, 0x0000, 0x3d26, 0x0000, 0x0000, 0x3d27, 0x3d28, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3d29, 0x0000, 0x0000, 0x0000, 0x3d2a, 0x0000, 0x3d2b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d2c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d2d, 0x3d2e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3d2f, 0x0000, 0x3d32, 0x0000, 0x0000, 0x3d30,
+ 0x0000, 0x0000, 0x0000, 0x3d31, 0x3d33, 0x0000, 0x0000, 0x3d34,
+ 0x3d35, 0x3d36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x743e,
+ 0x3d37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d38, 0x0000, 0x0000, 0x3d39,
+ 0x3d3a, 0x3d3b, 0x0000, 0x3d3c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40, 0x3d41, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d42, 0x0000,
+ 0x0000, 0x3d43, 0x3d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3d45, 0x3d46, 0x3d47, 0x0000, 0x3d48, 0x3d49, 0x3d4a, 0x3d4b,
+ 0x0000, 0x0000, 0x3d4c, 0x3d4d, 0x0000, 0x0000, 0x3d4e, 0x0000,
+ 0x0000, 0x0000, 0x3d4f, 0x0000, 0x3d50, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_60[] = {
+ /* 0x6000 - 0x60ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d51,
+ 0x0000, 0x0000, 0x3d52, 0x0000, 0x0000, 0x3d53, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3d54, 0x3d55, 0x0000, 0x0000, 0x3d56,
+ 0x3d57, 0x0000, 0x3d58, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d59,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3d5a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d5b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3d5c, 0x0000, 0x3d5d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3d5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d5f,
+ 0x3d60, 0x3d61, 0x0000, 0x0000, 0x3d62, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3d63, 0x0000, 0x0000, 0x3d64, 0x0000, 0x3d65, 0x3d66,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d67, 0x0000, 0x0000,
+ 0x0000, 0x3d68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d69,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3d6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d6b, 0x3d6c,
+ 0x0000, 0x0000, 0x3d6d, 0x0000, 0x0000, 0x743f, 0x3d6e, 0x0000,
+ 0x3d6f, 0x0000, 0x3d70, 0x0000, 0x0000, 0x0000, 0x3d71, 0x0000,
+ 0x0000, 0x3d72, 0x0000, 0x3d73, 0x0000, 0x3d74, 0x0000, 0x0000,
+ 0x3d75, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d76, 0x3d77, 0x0000,
+ 0x0000, 0x0000, 0x3d78, 0x0000, 0x3d79, 0x3d7a, 0x0000, 0x0000,
+ 0x3d7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3d7c, 0x3d7d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d7e,
+ 0x0000, 0x0000, 0x0000, 0x3e21, 0x0000, 0x0000, 0x3e22, 0x0000,
+ 0x0000, 0x0000, 0x3e23, 0x0000, 0x3e24, 0x0000, 0x0000, 0x0000,
+ 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x0000, 0x0000, 0x3e29, 0x3e2a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3e2b, 0x3e2c, 0x0000, 0x0000,
+ 0x0000, 0x3e2d, 0x0000, 0x3e2e, 0x0000, 0x3e2f, 0x3e30, 0x0000,
+ 0x0000, 0x0000, 0x3e31, 0x0000, 0x0000, 0x3e32, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3e33, 0x0000, 0x0000, 0x3e34, 0x0000, 0x0000,
+ 0x3e35, 0x0000, 0x0000, 0x0000, 0x3e36, 0x3e37, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_61[] = {
+ /* 0x6100 - 0x61ff */
+ 0x0000, 0x0000, 0x3e38, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e39,
+ 0x0000, 0x0000, 0x3e3a, 0x0000, 0x3e3b, 0x0000, 0x0000, 0x0000,
+ 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x0000, 0x3e41, 0x3e42,
+ 0x0000, 0x3e43, 0x0000, 0x0000, 0x3e44, 0x0000, 0x3e45, 0x0000,
+ 0x7440, 0x0000, 0x3e46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3e47, 0x3e48, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3e49, 0x3e4a, 0x0000, 0x0000, 0x0000, 0x3e4b, 0x3e4c, 0x3e4d,
+ 0x0000, 0x3e4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3e4f, 0x0000, 0x0000, 0x0000, 0x3e50, 0x3e51, 0x0000,
+ 0x0000, 0x3e52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e53, 0x0000,
+ 0x3e54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3e55, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3e56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3e57, 0x0000, 0x0000, 0x3e58, 0x3e59, 0x0000, 0x0000, 0x3e5a,
+ 0x3e5b, 0x3e5c, 0x0000, 0x3e5d, 0x3e5e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3e5f, 0x0000, 0x3e60, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3e61, 0x3e62, 0x0000, 0x0000, 0x0000, 0x3e63,
+ 0x3e64, 0x0000, 0x0000, 0x0000, 0x3e65, 0x3e66, 0x0000, 0x3e67,
+ 0x3e68, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e69, 0x0000, 0x0000,
+ 0x3e6a, 0x0000, 0x3e6b, 0x0000, 0x0000, 0x3e6c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3e6d, 0x3e6e, 0x0000, 0x0000, 0x3e6f, 0x0000, 0x0000, 0x0000,
+ 0x3e70, 0x3e71, 0x3e72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e73, 0x3e74,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e75, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3e76, 0x3e77, 0x3e78, 0x3e79,
+ 0x0000, 0x3e7a, 0x3e7b, 0x0000, 0x0000, 0x3e7e, 0x0000, 0x3e7c,
+ 0x0000, 0x3e7d, 0x0000, 0x0000, 0x3f21, 0x3f22, 0x0000, 0x3f23,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_62[] = {
+ /* 0x6200 - 0x62ff */
+ 0x0000, 0x3f24, 0x0000, 0x3f25, 0x3f26, 0x0000, 0x0000, 0x3f27,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3f28, 0x0000, 0x3f29, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f2a, 0x0000, 0x0000, 0x0000,
+ 0x3f2b, 0x0000, 0x3f2c, 0x3f2d, 0x0000, 0x0000, 0x0000, 0x3f2e,
+ 0x0000, 0x3f2f, 0x0000, 0x3f30, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3f31, 0x0000, 0x0000, 0x0000, 0x3f32, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3f33, 0x3f34, 0x3f35, 0x0000, 0x3f36, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f37, 0x0000, 0x0000, 0x0000,
+ 0x3f38, 0x3f39, 0x3f3a, 0x0000, 0x3f3b, 0x0000, 0x3f3c, 0x0000,
+ 0x0000, 0x0000, 0x3f3d, 0x0000, 0x3f3e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f3f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f40, 0x0000, 0x3f41,
+ 0x0000, 0x0000, 0x0000, 0x3f42, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3f43, 0x0000, 0x0000, 0x3f44, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f45, 0x3f46, 0x3f47,
+ 0x3f48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f49, 0x0000,
+ 0x3f4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3f4b, 0x0000, 0x0000, 0x3f4c, 0x3f4d,
+ 0x0000, 0x0000, 0x3f4e, 0x0000, 0x0000, 0x0000, 0x3f4f, 0x3f50,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f51, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f52, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f53, 0x3f54, 0x0000,
+ 0x0000, 0x0000, 0x3f55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3f56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3f57, 0x0000, 0x3f58, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f59, 0x3f5a, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_63[] = {
+ /* 0x6300 - 0x63ff */
+ 0x0000, 0x0000, 0x0000, 0x3f5b, 0x3f5c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3f5d, 0x3f5e, 0x0000, 0x3f5f, 0x0000, 0x0000,
+ 0x3f60, 0x0000, 0x0000, 0x3f61, 0x0000, 0x0000, 0x3f62, 0x0000,
+ 0x3f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3f64, 0x3f65, 0x0000, 0x0000, 0x3f66, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f67, 0x3f68, 0x0000,
+ 0x0000, 0x3f69, 0x0000, 0x0000, 0x3f6a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x0000, 0x3f6f, 0x0000,
+ 0x0000, 0x0000, 0x3f70, 0x3f71, 0x0000, 0x0000, 0x3f72, 0x0000,
+ 0x0000, 0x0000, 0x3f73, 0x3f74, 0x3f75, 0x0000, 0x0000, 0x0000,
+ 0x3f76, 0x0000, 0x0000, 0x3f77, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f78, 0x3f79, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3f7a, 0x3f7b, 0x0000, 0x0000,
+ 0x0000, 0x3f7c, 0x0000, 0x0000, 0x3f7d, 0x3f7e, 0x0000, 0x0000,
+ 0x4021, 0x0000, 0x0000, 0x0000, 0x4022, 0x4023, 0x0000, 0x4024,
+ 0x0000, 0x0000, 0x4025, 0x0000, 0x4026, 0x0000, 0x0000, 0x4027,
+ 0x0000, 0x0000, 0x4028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4029, 0x0000, 0x0000, 0x0000, 0x402a, 0x402b, 0x0000, 0x0000,
+ 0x0000, 0x402c, 0x402d, 0x0000, 0x0000, 0x0000, 0x402e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x402f, 0x0000, 0x4030, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4031, 0x4032, 0x4033,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4034, 0x0000, 0x0000,
+ 0x0000, 0x4035, 0x0000, 0x0000, 0x0000, 0x4036, 0x0000, 0x0000,
+ 0x4037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4038, 0x0000,
+ 0x0000, 0x4039, 0x0000, 0x403a, 0x403b, 0x403c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x403d, 0x0000, 0x0000, 0x0000,
+ 0x403e, 0x0000, 0x0000, 0x0000, 0x0000, 0x403f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4040, 0x0000, 0x4041, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4042, 0x4043, 0x0000, 0x4044, 0x0000, 0x0000,
+ 0x4045, 0x4046, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_64[] = {
+ /* 0x6400 - 0x64ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4047, 0x4048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4049, 0x0000, 0x404a, 0x0000, 0x404b, 0x0000, 0x0000, 0x0000,
+ 0x404c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x404d, 0x0000,
+ 0x404e, 0x0000, 0x404f, 0x0000, 0x4050, 0x4051, 0x0000, 0x0000,
+ 0x0000, 0x4052, 0x4053, 0x0000, 0x0000, 0x0000, 0x0000, 0x4054,
+ 0x4055, 0x0000, 0x0000, 0x0000, 0x0000, 0x4056, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4057, 0x0000, 0x4058,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4059, 0x0000, 0x0000, 0x0000, 0x405a,
+ 0x0000, 0x405b, 0x405c, 0x405d, 0x405e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x405f, 0x4060, 0x4061, 0x4062, 0x0000, 0x4063,
+ 0x4064, 0x4065, 0x0000, 0x4066, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4067, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4068, 0x4069, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x406a, 0x0000, 0x406b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x406c, 0x0000, 0x406d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x406e,
+ 0x406f, 0x4070, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4071, 0x4072, 0x0000, 0x4073, 0x0000, 0x4074, 0x0000, 0x4075,
+ 0x0000, 0x4076, 0x0000, 0x4077, 0x0000, 0x0000, 0x4078, 0x0000,
+ 0x4079, 0x0000, 0x0000, 0x0000, 0x407a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x407b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x407c, 0x407d, 0x407e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4121, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4122, 0x4123, 0x4124, 0x4125, 0x0000, 0x4126, 0x0000,
+ 0x4127, 0x4128, 0x0000, 0x0000, 0x0000, 0x4129, 0x0000, 0x412a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x412b, 0x412c, 0x0000, 0x0000,
+ 0x0000, 0x412d, 0x412e, 0x0000, 0x0000, 0x412f, 0x0000, 0x0000,
+ 0x4130, 0x0000, 0x0000, 0x0000, 0x0000, 0x4131, 0x0000, 0x4132,
+ 0x0000, 0x0000, 0x0000, 0x4133, 0x0000, 0x0000, 0x0000, 0x4134,
+};
+
+static unsigned short const unicode_to_jisx0212_65[] = {
+ /* 0x6500 - 0x65ff */
+ 0x0000, 0x4135, 0x0000, 0x0000, 0x4136, 0x0000, 0x0000, 0x0000,
+ 0x4137, 0x4138, 0x4139, 0x0000, 0x0000, 0x0000, 0x0000, 0x413a,
+ 0x0000, 0x0000, 0x0000, 0x413b, 0x413c, 0x0000, 0x413d, 0x0000,
+ 0x0000, 0x413e, 0x0000, 0x413f, 0x0000, 0x0000, 0x4140, 0x4141,
+ 0x0000, 0x0000, 0x4142, 0x0000, 0x0000, 0x0000, 0x4143, 0x0000,
+ 0x0000, 0x4144, 0x0000, 0x0000, 0x0000, 0x0000, 0x4145, 0x0000,
+ 0x0000, 0x4146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4147, 0x0000, 0x4148, 0x4149, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x414a, 0x0000, 0x0000, 0x0000, 0x414b,
+ 0x0000, 0x414c, 0x0000, 0x0000, 0x0000, 0x0000, 0x7441, 0x0000,
+ 0x414d, 0x0000, 0x414e, 0x0000, 0x414f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4150,
+ 0x4151, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4152,
+ 0x0000, 0x0000, 0x0000, 0x4153, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4154, 0x0000, 0x0000, 0x4155, 0x0000, 0x0000,
+ 0x0000, 0x4156, 0x0000, 0x0000, 0x0000, 0x4157, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4158, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4159, 0x0000, 0x0000, 0x415a, 0x0000, 0x0000,
+ 0x415b, 0x0000, 0x0000, 0x0000, 0x0000, 0x415c, 0x0000, 0x0000,
+ 0x415d, 0x0000, 0x0000, 0x415e, 0x0000, 0x0000, 0x415f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4160, 0x0000,
+ 0x0000, 0x0000, 0x4161, 0x4162, 0x4163, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4164,
+ 0x0000, 0x0000, 0x4165, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4166, 0x4167, 0x0000, 0x0000, 0x0000, 0x0000, 0x4168, 0x0000,
+ 0x4169, 0x0000, 0x0000, 0x0000, 0x416a, 0x0000, 0x416b, 0x0000,
+ 0x416c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x416d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x416e, 0x0000, 0x416f, 0x0000, 0x4170, 0x4171, 0x0000, 0x0000,
+ 0x0000, 0x4172, 0x0000, 0x0000, 0x0000, 0x0000, 0x4173, 0x4174,
+};
+
+static unsigned short const unicode_to_jisx0212_66[] = {
+ /* 0x6600 - 0x66ff */
+ 0x4175, 0x0000, 0x0000, 0x0000, 0x4176, 0x0000, 0x0000, 0x0000,
+ 0x4177, 0x4178, 0x0000, 0x0000, 0x0000, 0x4179, 0x0000, 0x0000,
+ 0x0000, 0x417a, 0x417b, 0x0000, 0x0000, 0x417c, 0x417d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x417e, 0x4221, 0x0000,
+ 0x0000, 0x4222, 0x4223, 0x4224, 0x4225, 0x0000, 0x4226, 0x0000,
+ 0x0000, 0x4227, 0x4228, 0x4229, 0x422a, 0x0000, 0x422b, 0x0000,
+ 0x422c, 0x422d, 0x0000, 0x422e, 0x0000, 0x0000, 0x0000, 0x4230,
+ 0x0000, 0x422f, 0x0000, 0x7442, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4231, 0x0000, 0x0000, 0x0000, 0x0000, 0x4232, 0x4233, 0x0000,
+ 0x0000, 0x0000, 0x4234, 0x0000, 0x4235, 0x0000, 0x4237, 0x0000,
+ 0x0000, 0x4236, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4238,
+ 0x4239, 0x423a, 0x0000, 0x423b, 0x423c, 0x0000, 0x0000, 0x0000,
+ 0x423d, 0x423e, 0x0000, 0x0000, 0x0000, 0x7443, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4240, 0x4241, 0x4242, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4244, 0x0000, 0x4245, 0x0000, 0x4247,
+ 0x4248, 0x4249, 0x0000, 0x424a, 0x424c, 0x0000, 0x4243, 0x4246,
+ 0x424b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x424d, 0x424e, 0x424f, 0x0000, 0x0000,
+ 0x4250, 0x0000, 0x4251, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4252, 0x4253, 0x4254, 0x4255, 0x0000, 0x0000, 0x4256,
+ 0x4257, 0x0000, 0x0000, 0x0000, 0x4258, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4259, 0x0000, 0x0000,
+ 0x0000, 0x425a, 0x425b, 0x0000, 0x0000, 0x425c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x425d, 0x0000, 0x0000, 0x0000, 0x425e,
+ 0x425f, 0x0000, 0x4260, 0x4261, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4262, 0x0000, 0x0000, 0x0000, 0x4263, 0x0000, 0x4264, 0x4265,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4266, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4267, 0x0000, 0x0000, 0x0000, 0x4268,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4269, 0x0000, 0x0000, 0x426a, 0x426b, 0x0000, 0x426c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x426d, 0x423f, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_67[] = {
+ /* 0x6700 - 0x67ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x426e, 0x0000, 0x426f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4270, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4271, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4272, 0x0000, 0x0000, 0x4273, 0x0000, 0x0000, 0x0000,
+ 0x4274, 0x0000, 0x4275, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4276, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4277, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4278, 0x0000, 0x4279,
+ 0x427a, 0x0000, 0x0000, 0x0000, 0x427b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x427c, 0x427d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x427e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4321, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4322, 0x0000, 0x4323, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4324, 0x0000, 0x4325, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4326, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4327, 0x0000, 0x0000, 0x4328, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4329, 0x432a,
+ 0x0000, 0x432b, 0x0000, 0x432c, 0x0000, 0x0000, 0x432d, 0x0000,
+ 0x432e, 0x432f, 0x0000, 0x4330, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4331, 0x4332, 0x4333, 0x0000, 0x0000, 0x4334, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4335, 0x4336, 0x4337, 0x0000, 0x0000,
+ 0x4339, 0x0000, 0x433a, 0x433b, 0x0000, 0x433c, 0x0000, 0x0000,
+ 0x433d, 0x433e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x433f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4340,
+ 0x0000, 0x4341, 0x0000, 0x0000, 0x4342, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4343, 0x0000, 0x0000, 0x0000, 0x0000, 0x4344, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4345, 0x0000, 0x4346, 0x0000, 0x0000, 0x0000, 0x4347, 0x4348,
+ 0x0000, 0x4338, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_68[] = {
+ /* 0x6800 - 0x68ff */
+ 0x0000, 0x7446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x434a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x434b, 0x0000, 0x0000, 0x0000, 0x434c, 0x0000, 0x434d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x434f,
+ 0x434e, 0x0000, 0x0000, 0x0000, 0x4350, 0x4351, 0x0000, 0x4352,
+ 0x4353, 0x4354, 0x0000, 0x4355, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4356, 0x0000, 0x0000, 0x0000, 0x4357,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4358, 0x4359, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x435a, 0x0000, 0x435b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4349, 0x0000, 0x0000, 0x435c, 0x0000, 0x435d,
+ 0x435e, 0x0000, 0x0000, 0x435f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4360, 0x0000, 0x0000, 0x4361, 0x4362,
+ 0x4363, 0x4364, 0x4365, 0x0000, 0x0000, 0x4366, 0x0000, 0x0000,
+ 0x0000, 0x4367, 0x4368, 0x4369, 0x436a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x436b, 0x0000, 0x436c, 0x0000, 0x436d, 0x0000,
+ 0x436e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x436f, 0x0000,
+ 0x4370, 0x0000, 0x4371, 0x0000, 0x4372, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4373, 0x0000, 0x4374, 0x0000, 0x4375, 0x0000, 0x0000,
+ 0x0000, 0x4376, 0x4377, 0x0000, 0x0000, 0x0000, 0x4378, 0x0000,
+ 0x0000, 0x0000, 0x4379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x437a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x437b, 0x0000, 0x0000,
+ 0x437c, 0x0000, 0x0000, 0x0000, 0x437d, 0x0000, 0x0000, 0x437e,
+ 0x4421, 0x4422, 0x0000, 0x4423, 0x0000, 0x0000, 0x4424, 0x0000,
+ 0x0000, 0x4425, 0x0000, 0x0000, 0x4426, 0x4427, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4428, 0x0000, 0x0000,
+ 0x4429, 0x0000, 0x442a, 0x442b, 0x442c, 0x442d, 0x0000, 0x0000,
+ 0x442e, 0x442f, 0x0000, 0x0000, 0x0000, 0x4430, 0x4431, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4432, 0x4433, 0x4434, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_69[] = {
+ /* 0x6900 - 0x69ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4435, 0x0000,
+ 0x0000, 0x4436, 0x4437, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4438, 0x4439, 0x0000, 0x443a, 0x0000, 0x0000, 0x443b, 0x443c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x443d, 0x0000, 0x443e, 0x0000, 0x443f, 0x0000, 0x0000,
+ 0x4440, 0x0000, 0x0000, 0x4441, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4442, 0x0000, 0x0000, 0x4443, 0x0000, 0x0000,
+ 0x0000, 0x4444, 0x0000, 0x0000, 0x0000, 0x0000, 0x4445, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4446,
+ 0x0000, 0x0000, 0x0000, 0x4447, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4448, 0x4449, 0x444a, 0x444b, 0x0000,
+ 0x444c, 0x444d, 0x0000, 0x0000, 0x444e, 0x0000, 0x0000, 0x0000,
+ 0x444f, 0x4450, 0x4451, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4452, 0x4453, 0x0000, 0x0000, 0x0000, 0x4454,
+ 0x4455, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4456, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4457, 0x0000, 0x0000, 0x0000, 0x4458, 0x0000,
+ 0x4459, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x445a, 0x0000, 0x0000, 0x0000, 0x445b, 0x445c, 0x0000,
+ 0x445d, 0x0000, 0x0000, 0x445e, 0x0000, 0x445f, 0x0000, 0x4460,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4461,
+ 0x4462, 0x0000, 0x4463, 0x0000, 0x4464, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4465, 0x0000, 0x0000,
+ 0x4466, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4467, 0x0000, 0x0000, 0x0000, 0x0000, 0x4468, 0x4469,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x446a, 0x0000, 0x0000, 0x446b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x446c, 0x446d,
+ 0x0000, 0x446e, 0x0000, 0x446f, 0x0000, 0x4470, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4471, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_6a[] = {
+ /* 0x6a00 - 0x6aff */
+ 0x4472, 0x4473, 0x0000, 0x4474, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4475,
+ 0x0000, 0x4476, 0x0000, 0x0000, 0x0000, 0x4477, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4478, 0x0000, 0x0000, 0x4479, 0x0000, 0x0000,
+ 0x447a, 0x0000, 0x0000, 0x0000, 0x447b, 0x0000, 0x0000, 0x0000,
+ 0x447c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x447d, 0x0000, 0x447e, 0x0000, 0x4521, 0x0000, 0x0000, 0x4522,
+ 0x0000, 0x0000, 0x0000, 0x4523, 0x0000, 0x0000, 0x4524, 0x4525,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4526, 0x4527, 0x0000,
+ 0x0000, 0x4528, 0x4529, 0x0000, 0x0000, 0x0000, 0x452a, 0x0000,
+ 0x452b, 0x452c, 0x452d, 0x0000, 0x0000, 0x452e, 0x452f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4530, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4531, 0x0000, 0x0000, 0x4532,
+ 0x0000, 0x0000, 0x4533, 0x7449, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4534, 0x0000, 0x4535, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4536, 0x0000,
+ 0x0000, 0x4537, 0x0000, 0x4538, 0x0000, 0x0000, 0x4539, 0x453a,
+ 0x0000, 0x453b, 0x0000, 0x453c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x453d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x453e, 0x0000, 0x453f, 0x4540, 0x4541,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4542, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4543, 0x0000, 0x0000, 0x0000, 0x4544,
+ 0x4545, 0x4546, 0x0000, 0x0000, 0x4547, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4548, 0x4549, 0x454a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x454b, 0x0000,
+ 0x454d, 0x454c, 0x0000, 0x0000, 0x454e, 0x0000, 0x0000, 0x0000,
+ 0x454f, 0x0000, 0x0000, 0x0000, 0x4550, 0x4551, 0x4552, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4553, 0x4554, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x744a, 0x0000, 0x4555, 0x0000, 0x0000, 0x4556,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4557, 0x0000, 0x0000, 0x0000,
+ 0x4558, 0x4559, 0x455a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x455b, 0x455c, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_6b[] = {
+ /* 0x6b00 - 0x6bff */
+ 0x0000, 0x0000, 0x455d, 0x455e, 0x0000, 0x0000, 0x455f, 0x4560,
+ 0x0000, 0x4561, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4562,
+ 0x4563, 0x4564, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4565,
+ 0x0000, 0x0000, 0x0000, 0x4566, 0x0000, 0x0000, 0x4567, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4568, 0x0000, 0x0000, 0x0000,
+ 0x4569, 0x0000, 0x0000, 0x456a, 0x456b, 0x0000, 0x0000, 0x456c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x456d, 0x456e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x456f, 0x0000, 0x0000, 0x0000, 0x4570,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4571, 0x0000,
+ 0x0000, 0x0000, 0x4572, 0x0000, 0x0000, 0x4573, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4574, 0x0000, 0x0000, 0x0000, 0x4575, 0x0000,
+ 0x4576, 0x0000, 0x0000, 0x0000, 0x0000, 0x4577, 0x0000, 0x0000,
+ 0x4578, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4579,
+ 0x0000, 0x0000, 0x0000, 0x457a, 0x0000, 0x0000, 0x457b, 0x0000,
+ 0x457c, 0x0000, 0x0000, 0x0000, 0x0000, 0x457d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x457e, 0x4621, 0x0000,
+ 0x0000, 0x0000, 0x4622, 0x0000, 0x0000, 0x4623, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4624,
+ 0x0000, 0x0000, 0x0000, 0x4625, 0x0000, 0x0000, 0x0000, 0x4626,
+ 0x4627, 0x0000, 0x4628, 0x4629, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x462a, 0x462b, 0x0000, 0x0000, 0x462c, 0x462d, 0x462e, 0x0000,
+ 0x462f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4630, 0x4631, 0x0000, 0x0000, 0x0000, 0x4632, 0x4633, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4634, 0x4635, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4636, 0x0000, 0x0000, 0x4637, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4638, 0x0000,
+ 0x0000, 0x0000, 0x4639, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x463a, 0x0000, 0x463b, 0x0000, 0x0000, 0x463c, 0x463d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x463e, 0x0000,
+ 0x0000, 0x463f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4640,
+ 0x0000, 0x4641, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4642,
+};
+
+static unsigned short const unicode_to_jisx0212_6c[] = {
+ /* 0x6c00 - 0x6cff */
+ 0x0000, 0x0000, 0x4643, 0x0000, 0x4644, 0x4645, 0x0000, 0x0000,
+ 0x0000, 0x4646, 0x0000, 0x0000, 0x0000, 0x4647, 0x4648, 0x0000,
+ 0x4649, 0x0000, 0x464a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x464b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x464c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x464d, 0x464e,
+ 0x464f, 0x0000, 0x0000, 0x0000, 0x4650, 0x0000, 0x4651, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4652, 0x0000, 0x4653, 0x4654, 0x0000,
+ 0x0000, 0x0000, 0x4655, 0x4656, 0x0000, 0x0000, 0x0000, 0x4657,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4658, 0x4659, 0x0000, 0x465a, 0x0000, 0x465b,
+ 0x0000, 0x0000, 0x465c, 0x0000, 0x465d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x465e, 0x0000, 0x465f, 0x4660, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4736,
+ 0x0000, 0x0000, 0x0000, 0x4661, 0x0000, 0x4662, 0x0000, 0x4663,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4664, 0x0000, 0x4665, 0x0000,
+ 0x4666, 0x4667, 0x0000, 0x4668, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4669, 0x466a, 0x466b,
+ 0x0000, 0x466c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x466d, 0x466e, 0x0000, 0x466f,
+ 0x4670, 0x0000, 0x0000, 0x0000, 0x4671, 0x0000, 0x0000, 0x4672,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4673, 0x0000, 0x4674, 0x0000, 0x4675, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4676, 0x0000, 0x0000, 0x0000, 0x4677, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4678, 0x0000, 0x4679,
+ 0x467a, 0x467b, 0x467c, 0x0000, 0x467d, 0x0000, 0x467e, 0x0000,
+ 0x0000, 0x0000, 0x4721, 0x0000, 0x4722, 0x0000, 0x0000, 0x0000,
+ 0x4723, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4724,
+ 0x0000, 0x4725, 0x0000, 0x4726, 0x4727, 0x0000, 0x4728, 0x0000,
+ 0x0000, 0x0000, 0x4729, 0x0000, 0x472a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_6d[] = {
+ /* 0x6d00 - 0x6dff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x472b, 0x0000, 0x0000, 0x472c,
+ 0x0000, 0x0000, 0x472d, 0x0000, 0x0000, 0x0000, 0x472e, 0x472f,
+ 0x0000, 0x4730, 0x0000, 0x4731, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4732, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4733, 0x4734,
+ 0x4735, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4737, 0x4738,
+ 0x0000, 0x4739, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x473a, 0x0000, 0x0000, 0x473b, 0x0000, 0x0000, 0x473c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x473d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x473e, 0x473f,
+ 0x0000, 0x4740, 0x0000, 0x0000, 0x0000, 0x4741, 0x0000, 0x4742,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4743,
+ 0x4744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4745, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4746, 0x0000, 0x0000, 0x0000, 0x0000, 0x4747,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4748, 0x4749, 0x0000, 0x474a, 0x0000, 0x474b, 0x474c,
+ 0x474d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x474e, 0x0000, 0x474f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4750, 0x0000, 0x0000, 0x4751,
+ 0x0000, 0x4752, 0x0000, 0x0000, 0x0000, 0x4753, 0x0000, 0x4754,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4755, 0x0000, 0x0000, 0x0000,
+ 0x4756, 0x0000, 0x4757, 0x0000, 0x0000, 0x0000, 0x4758, 0x4759,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x475a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x475b, 0x0000, 0x475c, 0x0000, 0x475d,
+ 0x475e, 0x0000, 0x475f, 0x0000, 0x0000, 0x4760, 0x0000, 0x0000,
+ 0x0000, 0x4761, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4762,
+ 0x4763, 0x0000, 0x744c, 0x0000, 0x4764, 0x0000, 0x4765, 0x0000,
+ 0x744b, 0x0000, 0x0000, 0x0000, 0x4766, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_6e[] = {
+ /* 0x6e00 - 0x6eff */
+ 0x4767, 0x0000, 0x0000, 0x0000, 0x4768, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4769, 0x0000,
+ 0x0000, 0x0000, 0x476a, 0x0000, 0x0000, 0x0000, 0x0000, 0x476b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x476c, 0x0000, 0x0000, 0x0000, 0x476d, 0x0000,
+ 0x0000, 0x476e, 0x0000, 0x476f, 0x4770, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4771, 0x4772, 0x0000, 0x0000,
+ 0x4773, 0x4774, 0x0000, 0x4775, 0x0000, 0x0000, 0x0000, 0x4776,
+ 0x0000, 0x4777, 0x4778, 0x4779, 0x477a, 0x0000, 0x0000, 0x477b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x477c, 0x477d, 0x477e, 0x0000,
+ 0x0000, 0x0000, 0x4821, 0x4822, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4823, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4824, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4825, 0x0000, 0x4826, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4827, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4828, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x482a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x482b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x482c, 0x482d, 0x0000,
+ 0x0000, 0x482e, 0x0000, 0x482f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4830, 0x0000, 0x0000, 0x0000, 0x4831,
+ 0x4832, 0x4833, 0x0000, 0x4834, 0x0000, 0x0000, 0x0000, 0x4835,
+ 0x4836, 0x0000, 0x4837, 0x0000, 0x0000, 0x4838, 0x4839, 0x483a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x483b, 0x0000, 0x483c, 0x483d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x483e, 0x0000, 0x483f, 0x0000, 0x4840, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_6f[] = {
+ /* 0x6f00 - 0x6fff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4841, 0x0000, 0x0000, 0x0000,
+ 0x4842, 0x0000, 0x4843, 0x0000, 0x4844, 0x4845, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4846, 0x0000,
+ 0x4847, 0x0000, 0x4848, 0x4849, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x484a, 0x0000,
+ 0x0000, 0x484b, 0x484c, 0x0000, 0x0000, 0x4853, 0x0000, 0x484d,
+ 0x484e, 0x0000, 0x0000, 0x484f, 0x0000, 0x0000, 0x4850, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4851, 0x4852, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4854,
+ 0x0000, 0x4855, 0x4856, 0x4857, 0x0000, 0x0000, 0x0000, 0x4858,
+ 0x0000, 0x4859, 0x485a, 0x0000, 0x0000, 0x485b, 0x485c, 0x0000,
+ 0x0000, 0x485d, 0x485e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x485f, 0x0000, 0x0000, 0x0000, 0x4860, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4861, 0x4862, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4863, 0x0000, 0x0000, 0x0000, 0x4864,
+ 0x4865, 0x0000, 0x0000, 0x4866, 0x4867, 0x4868, 0x0000, 0x0000,
+ 0x4869, 0x0000, 0x486a, 0x486b, 0x486c, 0x0000, 0x486d, 0x0000,
+ 0x0000, 0x0000, 0x486e, 0x0000, 0x0000, 0x0000, 0x0000, 0x486f,
+ 0x4870, 0x0000, 0x0000, 0x0000, 0x0000, 0x4871, 0x4872, 0x4873,
+ 0x4874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4875, 0x4876,
+ 0x4877, 0x0000, 0x0000, 0x0000, 0x0000, 0x4878, 0x4879, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x487a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x487b, 0x0000, 0x487c,
+ 0x487d, 0x0000, 0x487e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4921, 0x0000, 0x0000, 0x0000, 0x4922, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4923, 0x4924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4925, 0x0000, 0x0000, 0x0000, 0x0000, 0x4926, 0x0000, 0x0000,
+ 0x0000, 0x4927, 0x0000, 0x0000, 0x4928, 0x4929, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_70[] = {
+ /* 0x7000 - 0x70ff */
+ 0x492a, 0x0000, 0x0000, 0x0000, 0x0000, 0x492b, 0x492c, 0x492d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x492e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x492f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4930, 0x0000, 0x0000, 0x4931, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x744d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4932,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4933, 0x0000, 0x0000, 0x4934,
+ 0x0000, 0x4935, 0x0000, 0x0000, 0x4936, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4937, 0x4938, 0x0000, 0x0000, 0x0000,
+ 0x4939, 0x493a, 0x493b, 0x493c, 0x0000, 0x0000, 0x4941, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x493d, 0x493e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x493f, 0x4940, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4942, 0x4943, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4944, 0x0000, 0x4945, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4946, 0x4947, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4948, 0x0000,
+ 0x0000, 0x4949, 0x0000, 0x0000, 0x0000, 0x494a, 0x494b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x494c, 0x494d, 0x494e, 0x494f,
+ 0x4950, 0x0000, 0x0000, 0x4951, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4952, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4953, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4954, 0x4955, 0x0000, 0x0000, 0x4956, 0x0000, 0x0000, 0x4957,
+ 0x0000, 0x0000, 0x0000, 0x742e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4958, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4959, 0x0000, 0x495a, 0x495b, 0x495c, 0x495d, 0x0000,
+ 0x495e, 0x0000, 0x0000, 0x0000, 0x495f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4960, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_71[] = {
+ /* 0x7100 - 0x71ff */
+ 0x0000, 0x0000, 0x0000, 0x4962, 0x4963, 0x4964, 0x4965, 0x4966,
+ 0x0000, 0x0000, 0x0000, 0x4967, 0x4968, 0x0000, 0x0000, 0x4969,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x496a, 0x0000,
+ 0x496b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x496c, 0x0000, 0x496d, 0x0000, 0x496e,
+ 0x496f, 0x4970, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4971, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4972, 0x0000, 0x0000, 0x0000, 0x4973, 0x4974, 0x4975,
+ 0x0000, 0x0000, 0x4976, 0x4977, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4978, 0x0000, 0x4979, 0x0000, 0x0000, 0x0000, 0x0000, 0x497a,
+ 0x0000, 0x0000, 0x497b, 0x0000, 0x497c, 0x0000, 0x497d, 0x0000,
+ 0x497e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a23, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a24, 0x0000, 0x4a25,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a26, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4a27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4a28, 0x4a29, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a2a, 0x0000, 0x4a2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a2c,
+ 0x4a2d, 0x0000, 0x4a2e, 0x4a2f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a31,
+ 0x4a32, 0x4a33, 0x0000, 0x0000, 0x4a34, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a35, 0x4a36, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a37, 0x0000, 0x0000, 0x4a38, 0x0000,
+ 0x0000, 0x4a39, 0x4a3a, 0x0000, 0x4a3b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a3d, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_72[] = {
+ /* 0x7200 - 0x72ff */
+ 0x4a3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a3f,
+ 0x4a40, 0x4a41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a42, 0x0000, 0x0000, 0x0000, 0x4a43,
+ 0x0000, 0x0000, 0x4a44, 0x0000, 0x0000, 0x4a45, 0x0000, 0x4a46,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a47, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a48, 0x0000, 0x0000, 0x0000, 0x4a49,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a4a, 0x0000, 0x0000, 0x0000,
+ 0x4a4b, 0x4a4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a4d, 0x4a4e, 0x4a4f, 0x0000, 0x4a50, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a51, 0x4a52,
+ 0x4a53, 0x0000, 0x0000, 0x4a54, 0x0000, 0x4a55, 0x4a56, 0x0000,
+ 0x0000, 0x0000, 0x4a57, 0x0000, 0x4a58, 0x0000, 0x4a59, 0x0000,
+ 0x4a5a, 0x0000, 0x0000, 0x4a5b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a5c, 0x0000, 0x0000, 0x4a5d, 0x0000, 0x0000, 0x4a5e, 0x4a5f,
+ 0x0000, 0x4a60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a61,
+ 0x4a62, 0x0000, 0x0000, 0x4a63, 0x4a64, 0x0000, 0x0000, 0x4a65,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a66, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a67, 0x0000, 0x0000, 0x0000, 0x4a68, 0x4a69, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a6a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a6b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a6d, 0x4a6e, 0x0000,
+ 0x0000, 0x4a6f, 0x0000, 0x0000, 0x4a70, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a71, 0x0000,
+ 0x0000, 0x4a72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a73,
+ 0x0000, 0x4a74, 0x0000, 0x0000, 0x4a75, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a76, 0x4a77, 0x0000,
+ 0x4a78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a79,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a7a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a7b, 0x4a7c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4a7d, 0x4a7e, 0x0000, 0x0000, 0x4b21, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_73[] = {
+ /* 0x7300 - 0x73ff */
+ 0x0000, 0x0000, 0x4b22, 0x0000, 0x4b23, 0x4b24, 0x0000, 0x4b25,
+ 0x0000, 0x0000, 0x0000, 0x4b26, 0x0000, 0x4b27, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4b28, 0x4b29, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4b2a, 0x4b2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b2c, 0x0000,
+ 0x0000, 0x0000, 0x4b2d, 0x0000, 0x4b2e, 0x0000, 0x0000, 0x4b2f,
+ 0x4b30, 0x0000, 0x0000, 0x0000, 0x4b31, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4b32, 0x4b33, 0x0000, 0x0000, 0x4b34, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4b35, 0x4b36, 0x0000, 0x4b37, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4b38, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b39, 0x0000, 0x0000,
+ 0x4b3a, 0x0000, 0x4b3b, 0x0000, 0x0000, 0x0000, 0x4b3c, 0x0000,
+ 0x4b3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b3e, 0x4b3f, 0x4b40,
+ 0x4b41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b42, 0x4b43,
+ 0x0000, 0x4b44, 0x0000, 0x4b45, 0x4b46, 0x0000, 0x4b47, 0x4b48,
+ 0x0000, 0x4b49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b4a,
+ 0x0000, 0x4b4b, 0x0000, 0x0000, 0x4b4c, 0x0000, 0x0000, 0x0000,
+ 0x4b4d, 0x4b4e, 0x0000, 0x4b4f, 0x0000, 0x4b50, 0x4b51, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b52, 0x0000,
+ 0x4b53, 0x0000, 0x0000, 0x4b54, 0x0000, 0x4b55, 0x0000, 0x4b56,
+ 0x4b57, 0x0000, 0x0000, 0x0000, 0x4b58, 0x0000, 0x4b59, 0x4b5a,
+ 0x4b5b, 0x0000, 0x4b5c, 0x0000, 0x0000, 0x4b5d, 0x4b5e, 0x0000,
+ 0x0000, 0x0000, 0x4b5f, 0x4b60, 0x0000, 0x4b61, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b62, 0x0000, 0x4b63,
+ 0x0000, 0x4b64, 0x0000, 0x0000, 0x4b65, 0x4b66, 0x0000, 0x4b67,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b68, 0x4b69, 0x0000,
+ 0x0000, 0x4b6a, 0x0000, 0x4b6b, 0x4b6c, 0x0000, 0x0000, 0x4b6d,
+ 0x0000, 0x0000, 0x4b6e, 0x4b6f, 0x0000, 0x0000, 0x4b70, 0x0000,
+ 0x0000, 0x4b71, 0x0000, 0x0000, 0x0000, 0x4b72, 0x0000, 0x0000,
+ 0x0000, 0x4b73, 0x0000, 0x4b74, 0x0000, 0x0000, 0x4b75, 0x4b76,
+ 0x0000, 0x4b77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4b78, 0x4b79, 0x0000, 0x4b7a,
+ 0x0000, 0x4b7b, 0x4b7c, 0x4b7d, 0x0000, 0x4b7e, 0x0000, 0x4c21,
+};
+
+static unsigned short const unicode_to_jisx0212_74[] = {
+ /* 0x7400 - 0x74ff */
+ 0x4c22, 0x4c23, 0x0000, 0x0000, 0x4c24, 0x0000, 0x0000, 0x4c25,
+ 0x0000, 0x0000, 0x4c26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4c27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c28, 0x4c29, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4c2a, 0x0000, 0x4c2b, 0x0000,
+ 0x4c2c, 0x4c2d, 0x4c2e, 0x4c2f, 0x4c30, 0x4c31, 0x4c32, 0x4c33,
+ 0x4c34, 0x4c35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4c36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c37, 0x0000, 0x0000, 0x4c38, 0x4c39, 0x0000, 0x4c3a, 0x4c3b,
+ 0x0000, 0x0000, 0x0000, 0x4c3c, 0x0000, 0x4c3d, 0x0000, 0x0000,
+ 0x0000, 0x4c3e, 0x4c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c40,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c41, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c42, 0x0000, 0x0000, 0x0000, 0x4c43, 0x4c44,
+ 0x4c45, 0x0000, 0x0000, 0x4c46, 0x0000, 0x4c47, 0x4c48, 0x0000,
+ 0x0000, 0x4c49, 0x4c4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c4b, 0x4c4c, 0x0000, 0x0000, 0x0000, 0x4c4d, 0x4c4e, 0x4c4f,
+ 0x0000, 0x4c50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c51,
+ 0x4c52, 0x4c53, 0x4c54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c55, 0x4c56, 0x4c57, 0x0000, 0x4c58, 0x0000, 0x0000, 0x4c59,
+ 0x4c5a, 0x4c5b, 0x0000, 0x4c5c, 0x0000, 0x0000, 0x4c5d, 0x0000,
+ 0x4c5e, 0x4c5f, 0x4c60, 0x4c61, 0x0000, 0x0000, 0x4c62, 0x4c63,
+ 0x0000, 0x4c64, 0x4c65, 0x0000, 0x0000, 0x4c66, 0x0000, 0x0000,
+ 0x0000, 0x4c67, 0x0000, 0x4c68, 0x0000, 0x0000, 0x0000, 0x4c69,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c6a, 0x4c6b, 0x0000, 0x0000, 0x4c6c, 0x0000, 0x0000, 0x0000,
+ 0x4c6d, 0x0000, 0x0000, 0x4c6e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4c6f, 0x0000, 0x4c70, 0x4c71, 0x0000, 0x0000, 0x4c72, 0x4c73,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4c74, 0x0000, 0x0000, 0x0000,
+ 0x4c75, 0x0000, 0x4c76, 0x4c77, 0x0000, 0x0000, 0x0000, 0x4c78,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4c79, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4c7a, 0x4c7b, 0x4c7c, 0x0000, 0x0000, 0x4c7d,
+};
+
+static unsigned short const unicode_to_jisx0212_75[] = {
+ /* 0x7500 - 0x75ff */
+ 0x0000, 0x7450, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c7e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d21, 0x0000, 0x0000, 0x0000, 0x4d22, 0x4d23,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4d24, 0x4d25, 0x0000, 0x0000, 0x4d26, 0x0000, 0x0000, 0x4d27,
+ 0x0000, 0x4d28, 0x4d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d2a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d2b, 0x0000,
+ 0x0000, 0x4d2c, 0x0000, 0x0000, 0x0000, 0x4d2d, 0x4d2e, 0x4d2f,
+ 0x4d30, 0x0000, 0x0000, 0x4d31, 0x0000, 0x0000, 0x0000, 0x4d32,
+ 0x4d33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d34, 0x0000,
+ 0x4d35, 0x0000, 0x4d36, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d37,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d38, 0x4d39,
+ 0x0000, 0x4d3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d3b,
+ 0x0000, 0x4d3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4d3d, 0x4d3e, 0x4d3f, 0x4d40, 0x4d41, 0x4d42, 0x0000,
+ 0x0000, 0x4d43, 0x0000, 0x0000, 0x0000, 0x4d44, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4d45, 0x0000, 0x4d46, 0x4d47, 0x0000, 0x4d48, 0x0000, 0x0000,
+ 0x0000, 0x4d49, 0x0000, 0x0000, 0x4d4a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d4b, 0x0000, 0x4d4c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d4d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d4f,
+ 0x4d50, 0x4d51, 0x0000, 0x0000, 0x4d52, 0x0000, 0x4d53, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d54, 0x0000, 0x4d55, 0x4d56,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d57,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d58, 0x0000, 0x0000, 0x4d59,
+ 0x4d5a, 0x4d5b, 0x0000, 0x0000, 0x4d5c, 0x0000, 0x0000, 0x4d5d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4d5e, 0x0000, 0x4d5f, 0x4d60,
+ 0x0000, 0x4d61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4d62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_76[] = {
+ /* 0x7600 - 0x76ff */
+ 0x4d63, 0x0000, 0x4d64, 0x4d65, 0x4d66, 0x0000, 0x0000, 0x4d67,
+ 0x4d68, 0x0000, 0x4d69, 0x0000, 0x4d6a, 0x0000, 0x0000, 0x4d6b,
+ 0x0000, 0x0000, 0x4d6c, 0x4d6d, 0x0000, 0x4d6e, 0x4d6f, 0x0000,
+ 0x0000, 0x4d70, 0x0000, 0x4d71, 0x4d72, 0x4d73, 0x4d74, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4d75, 0x0000, 0x4d76, 0x4d77, 0x0000,
+ 0x0000, 0x4d78, 0x0000, 0x0000, 0x0000, 0x4d79, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4d7a, 0x4d7b, 0x0000, 0x4d7c, 0x0000, 0x0000,
+ 0x4d7d, 0x4d7e, 0x4e21, 0x0000, 0x4e22, 0x0000, 0x0000, 0x0000,
+ 0x4e24, 0x4e25, 0x0000, 0x4e26, 0x4e27, 0x4e28, 0x0000, 0x0000,
+ 0x0000, 0x4e29, 0x4e23, 0x4e2a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e2b, 0x0000, 0x0000,
+ 0x0000, 0x4e2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e2d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4e2e, 0x4e2f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e30, 0x4e31, 0x4e32,
+ 0x0000, 0x4e33, 0x0000, 0x0000, 0x4e34, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4e35, 0x7451, 0x0000, 0x0000, 0x4e36, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4e37, 0x4e38, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e39, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4e3a, 0x4e3b, 0x4e3c, 0x7452, 0x4e3d,
+ 0x4e3e, 0x0000, 0x4e3f, 0x4e40, 0x4e41, 0x4e42, 0x4e43, 0x4e44,
+ 0x4e45, 0x0000, 0x4e46, 0x0000, 0x0000, 0x4e47, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e48, 0x0000, 0x0000,
+ 0x0000, 0x4e49, 0x0000, 0x0000, 0x0000, 0x4e4a, 0x0000, 0x0000,
+ 0x0000, 0x4e4b, 0x0000, 0x4e4c, 0x4e4d, 0x0000, 0x4e4e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4e4f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4e50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4e51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e52, 0x0000,
+ 0x4e53, 0x0000, 0x0000, 0x0000, 0x4e54, 0x0000, 0x0000, 0x0000,
+ 0x4e55, 0x4e56, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e57, 0x0000,
+ 0x0000, 0x4e58, 0x0000, 0x0000, 0x4e59, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_77[] = {
+ /* 0x7700 - 0x77ff */
+ 0x4e5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e5b, 0x0000,
+ 0x0000, 0x0000, 0x4e5c, 0x0000, 0x0000, 0x0000, 0x4e5d, 0x0000,
+ 0x0000, 0x0000, 0x4e5e, 0x0000, 0x4e5f, 0x4e60, 0x0000, 0x4e61,
+ 0x0000, 0x4e62, 0x4e63, 0x0000, 0x4e64, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4e65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4e66, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e67, 0x4e68, 0x4e69,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4e6a, 0x4e6b, 0x4e6c, 0x0000,
+ 0x0000, 0x4e6d, 0x0000, 0x0000, 0x0000, 0x4e6e, 0x4e6f, 0x0000,
+ 0x0000, 0x0000, 0x4e70, 0x0000, 0x0000, 0x4e71, 0x4e72, 0x0000,
+ 0x0000, 0x0000, 0x4e73, 0x0000, 0x0000, 0x4e74, 0x4e75, 0x4e76,
+ 0x0000, 0x0000, 0x4e77, 0x0000, 0x0000, 0x0000, 0x4e78, 0x4e79,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4e7a, 0x0000, 0x4e7b, 0x4e7c,
+ 0x4e7d, 0x0000, 0x4e7e, 0x0000, 0x4f21, 0x0000, 0x0000, 0x4f22,
+ 0x0000, 0x0000, 0x4f23, 0x0000, 0x4f24, 0x0000, 0x0000, 0x0000,
+ 0x4f25, 0x0000, 0x4f26, 0x4f27, 0x4f28, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4f29, 0x0000, 0x0000, 0x4f2a, 0x0000, 0x0000,
+ 0x4f2b, 0x0000, 0x0000, 0x0000, 0x4f2c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4f2d, 0x4f2e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4f2f, 0x4f30, 0x4f31, 0x0000,
+ 0x0000, 0x0000, 0x4f32, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f33,
+ 0x0000, 0x0000, 0x4f34, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f35,
+ 0x0000, 0x0000, 0x4f36, 0x0000, 0x0000, 0x0000, 0x4f37, 0x4f38,
+ 0x0000, 0x4f39, 0x0000, 0x0000, 0x0000, 0x4f3a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f3b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4f3c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4f3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4f3e, 0x4f3f, 0x0000, 0x0000, 0x4f40, 0x0000, 0x0000,
+ 0x0000, 0x4f41, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f42, 0x4f43,
+ 0x4f44, 0x0000, 0x0000, 0x0000, 0x4f45, 0x0000, 0x4f46, 0x0000,
+ 0x0000, 0x0000, 0x4f47, 0x0000, 0x4f48, 0x0000, 0x0000, 0x0000,
+ 0x4f49, 0x4f4a, 0x0000, 0x0000, 0x4f4b, 0x0000, 0x0000, 0x0000,
+ 0x4f4c, 0x0000, 0x0000, 0x4f4d, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_78[] = {
+ /* 0x7800 - 0x78ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f4e, 0x4f4f, 0x0000,
+ 0x0000, 0x4f50, 0x0000, 0x0000, 0x0000, 0x4f51, 0x4f52, 0x0000,
+ 0x0000, 0x4f53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f54, 0x0000, 0x0000,
+ 0x0000, 0x4f55, 0x4f56, 0x4f57, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f58, 0x4f59, 0x0000,
+ 0x4f5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f5b, 0x0000, 0x4f5c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4f5d, 0x4f5e, 0x0000, 0x0000, 0x4f5f,
+ 0x4f60, 0x0000, 0x0000, 0x0000, 0x4f61, 0x0000, 0x4f62, 0x0000,
+ 0x0000, 0x0000, 0x4f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4f64, 0x0000, 0x4f65, 0x0000,
+ 0x4f66, 0x4f67, 0x0000, 0x4f68, 0x4f69, 0x0000, 0x0000, 0x0000,
+ 0x4f6a, 0x0000, 0x4f6b, 0x0000, 0x0000, 0x0000, 0x4f6c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4f6d, 0x0000, 0x0000, 0x0000, 0x4f6e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4f6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f70,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4f71, 0x0000, 0x0000, 0x0000,
+ 0x4f72, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f74, 0x4f75, 0x4f76,
+ 0x0000, 0x4f73, 0x0000, 0x0000, 0x4f77, 0x0000, 0x0000, 0x0000,
+ 0x4f78, 0x0000, 0x0000, 0x0000, 0x4f79, 0x4f7a, 0x0000, 0x0000,
+ 0x4f7b, 0x4f7c, 0x4f7d, 0x4f7e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5021, 0x0000, 0x5022, 0x0000, 0x5023,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5024,
+ 0x5025, 0x5026, 0x0000, 0x0000, 0x5027, 0x0000, 0x5028, 0x0000,
+ 0x0000, 0x0000, 0x5029, 0x502a, 0x0000, 0x502b, 0x502c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x502e, 0x0000, 0x0000, 0x0000, 0x502f,
+ 0x5030, 0x5031, 0x0000, 0x0000, 0x502d, 0x0000, 0x5032, 0x0000,
+ 0x0000, 0x0000, 0x5033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5034, 0x5035, 0x0000, 0x0000, 0x5037, 0x5038,
+ 0x0000, 0x0000, 0x5039, 0x503a, 0x0000, 0x0000, 0x0000, 0x503b,
+};
+
+static unsigned short const unicode_to_jisx0212_79[] = {
+ /* 0x7900 - 0x79ff */
+ 0x5036, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x503c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x503d, 0x0000, 0x0000, 0x0000,
+ 0x503e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x503f, 0x0000, 0x5040, 0x0000, 0x5041, 0x5042,
+ 0x5043, 0x0000, 0x0000, 0x0000, 0x0000, 0x5044, 0x0000, 0x5045,
+ 0x0000, 0x5046, 0x0000, 0x0000, 0x0000, 0x5047, 0x0000, 0x0000,
+ 0x7454, 0x5048, 0x0000, 0x0000, 0x5049, 0x504a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x504b, 0x0000, 0x504c, 0x0000, 0x504d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x504e, 0x504f, 0x5050, 0x0000,
+ 0x0000, 0x0000, 0x5051, 0x5052, 0x0000, 0x0000, 0x0000, 0x5053,
+ 0x0000, 0x5054, 0x0000, 0x0000, 0x5055, 0x0000, 0x0000, 0x0000,
+ 0x5056, 0x0000, 0x0000, 0x5057, 0x5058, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5059,
+ 0x0000, 0x505a, 0x0000, 0x505b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x505c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x505d, 0x0000, 0x505e, 0x505f, 0x0000, 0x5060, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5061, 0x5062, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5063, 0x0000, 0x5064, 0x5065, 0x5066, 0x5067, 0x0000,
+ 0x5068, 0x0000, 0x0000, 0x5069, 0x506a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x506b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x506c, 0x506d, 0x0000, 0x506e, 0x0000, 0x0000, 0x0000, 0x506f,
+ 0x0000, 0x5070, 0x0000, 0x0000, 0x5071, 0x0000, 0x0000, 0x0000,
+ 0x5072, 0x0000, 0x0000, 0x5073, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5074, 0x0000, 0x5075, 0x0000, 0x0000, 0x5076,
+ 0x5077, 0x0000, 0x5078, 0x0000, 0x0000, 0x0000, 0x0000, 0x5079,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x507a, 0x0000, 0x507b, 0x0000,
+ 0x0000, 0x0000, 0x507c, 0x0000, 0x0000, 0x507d, 0x507e, 0x0000,
+ 0x5121, 0x0000, 0x5122, 0x0000, 0x0000, 0x5123, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5124, 0x5125, 0x0000, 0x5126, 0x0000, 0x0000,
+ 0x0000, 0x5127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5128, 0x0000, 0x0000, 0x0000, 0x5129, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_7a[] = {
+ /* 0x7a00 - 0x7aff */
+ 0x0000, 0x0000, 0x512a, 0x512b, 0x0000, 0x0000, 0x0000, 0x512c,
+ 0x0000, 0x512d, 0x512e, 0x0000, 0x512f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5130, 0x0000, 0x0000, 0x0000, 0x5131, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5132, 0x0000, 0x0000, 0x5133, 0x0000,
+ 0x0000, 0x5134, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5135,
+ 0x0000, 0x0000, 0x0000, 0x5136, 0x0000, 0x5137, 0x0000, 0x5138,
+ 0x5139, 0x0000, 0x0000, 0x0000, 0x513a, 0x513b, 0x0000, 0x0000,
+ 0x513c, 0x513d, 0x513e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x513f, 0x5140, 0x0000, 0x5141,
+ 0x5142, 0x0000, 0x0000, 0x0000, 0x5143, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5144, 0x5145, 0x0000,
+ 0x0000, 0x5146, 0x0000, 0x0000, 0x5147, 0x5148, 0x0000, 0x5149,
+ 0x514a, 0x0000, 0x0000, 0x0000, 0x0000, 0x514b, 0x0000, 0x514c,
+ 0x0000, 0x0000, 0x514d, 0x0000, 0x0000, 0x514e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x514f, 0x0000, 0x0000,
+ 0x5150, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5151, 0x0000,
+ 0x5152, 0x0000, 0x5153, 0x0000, 0x0000, 0x5154, 0x5155, 0x0000,
+ 0x0000, 0x0000, 0x5156, 0x5157, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5158, 0x5159, 0x0000, 0x0000, 0x515a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x515b, 0x0000,
+ 0x515c, 0x0000, 0x0000, 0x515d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x515e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x515f, 0x0000, 0x5160, 0x0000, 0x0000,
+ 0x0000, 0x5161, 0x0000, 0x5162, 0x5163, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5164, 0x0000,
+ 0x0000, 0x5165, 0x0000, 0x0000, 0x5166, 0x0000, 0x5167, 0x0000,
+ 0x0000, 0x5168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5169, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7459,
+ 0x516a, 0x516b, 0x0000, 0x516c, 0x516d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x516e, 0x0000, 0x0000, 0x516f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5170, 0x0000, 0x5171, 0x5172, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_7b[] = {
+ /* 0x7b00 - 0x7bff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5173,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5174, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5175,
+ 0x0000, 0x0000, 0x0000, 0x5176, 0x0000, 0x0000, 0x0000, 0x5177,
+ 0x0000, 0x5178, 0x5179, 0x517a, 0x0000, 0x517b, 0x517c, 0x517d,
+ 0x517e, 0x5221, 0x0000, 0x0000, 0x5222, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5223, 0x0000, 0x5224,
+ 0x5225, 0x5226, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5227,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5228, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5229, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x522a, 0x0000, 0x0000, 0x0000, 0x522b, 0x0000, 0x522c, 0x0000,
+ 0x0000, 0x522d, 0x522e, 0x0000, 0x0000, 0x522f, 0x0000, 0x5230,
+ 0x0000, 0x0000, 0x5231, 0x5232, 0x0000, 0x0000, 0x0000, 0x5233,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5234, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5235, 0x0000, 0x0000, 0x0000, 0x0000, 0x5236, 0x0000,
+ 0x5237, 0x5238, 0x0000, 0x0000, 0x0000, 0x0000, 0x5239, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x523a, 0x0000, 0x0000, 0x523b, 0x0000,
+ 0x523c, 0x0000, 0x0000, 0x0000, 0x0000, 0x523d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x523e, 0x0000, 0x0000, 0x523f,
+ 0x5240, 0x0000, 0x5241, 0x0000, 0x0000, 0x5242, 0x5243, 0x0000,
+ 0x0000, 0x0000, 0x5244, 0x5245, 0x5246, 0x5247, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5248, 0x0000, 0x0000, 0x5249, 0x0000, 0x0000,
+ 0x524a, 0x0000, 0x524b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x524c, 0x0000, 0x524d, 0x524e,
+ 0x0000, 0x524f, 0x5250, 0x5251, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5252, 0x0000, 0x5253, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5254, 0x0000, 0x5255, 0x5256, 0x0000, 0x0000,
+ 0x5257, 0x5258, 0x5259, 0x0000, 0x525a, 0x0000, 0x525b, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_7c[] = {
+ /* 0x7c00 - 0x7cff */
+ 0x0000, 0x525c, 0x525d, 0x525e, 0x525f, 0x0000, 0x5260, 0x0000,
+ 0x0000, 0x5261, 0x0000, 0x5262, 0x5263, 0x0000, 0x5264, 0x5265,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5266, 0x0000, 0x5267, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5268, 0x0000, 0x0000, 0x0000, 0x0000, 0x5269, 0x526a, 0x0000,
+ 0x526b, 0x0000, 0x0000, 0x0000, 0x526c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x526d, 0x0000, 0x526e, 0x526f, 0x0000, 0x5270, 0x0000,
+ 0x0000, 0x5271, 0x5272, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5273, 0x0000,
+ 0x0000, 0x0000, 0x5274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5276, 0x5277, 0x5278, 0x0000, 0x5275, 0x0000, 0x0000,
+ 0x0000, 0x5279, 0x527a, 0x527b, 0x527c, 0x527d, 0x527e, 0x0000,
+ 0x0000, 0x5321, 0x0000, 0x5322, 0x0000, 0x0000, 0x0000, 0x5323,
+ 0x0000, 0x5324, 0x0000, 0x0000, 0x0000, 0x5325, 0x5326, 0x0000,
+ 0x5327, 0x0000, 0x5328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5329, 0x0000, 0x0000, 0x532a, 0x532b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x532c, 0x532d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x532e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x532f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5330, 0x0000,
+ 0x5331, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5332, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5333, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5334, 0x5335,
+ 0x0000, 0x0000, 0x5336, 0x5337, 0x5338, 0x0000, 0x0000, 0x5339,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x533a, 0x0000, 0x0000, 0x533b,
+ 0x533c, 0x533d, 0x0000, 0x0000, 0x0000, 0x533e, 0x0000, 0x533f,
+ 0x0000, 0x0000, 0x0000, 0x5340, 0x5341, 0x5342, 0x0000, 0x5343,
+ 0x0000, 0x5344, 0x5345, 0x0000, 0x0000, 0x5346, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5347, 0x0000,
+ 0x0000, 0x5348, 0x0000, 0x5349, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x534a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_7d[] = {
+ /* 0x7d00 - 0x7dff */
+ 0x0000, 0x0000, 0x0000, 0x534b, 0x0000, 0x0000, 0x0000, 0x534c,
+ 0x534d, 0x534e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x534f,
+ 0x0000, 0x5350, 0x5351, 0x5352, 0x0000, 0x0000, 0x5353, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5354, 0x5355, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5356, 0x0000, 0x0000, 0x5357, 0x0000,
+ 0x0000, 0x0000, 0x5358, 0x0000, 0x0000, 0x5359, 0x0000, 0x0000,
+ 0x0000, 0x535a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x535b, 0x535c, 0x535d, 0x0000,
+ 0x535e, 0x535f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5360,
+ 0x5361, 0x0000, 0x0000, 0x0000, 0x0000, 0x5362, 0x0000, 0x0000,
+ 0x0000, 0x5363, 0x0000, 0x5364, 0x0000, 0x0000, 0x0000, 0x5365,
+ 0x0000, 0x5366, 0x5367, 0x0000, 0x5368, 0x5369, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x536a, 0x0000, 0x536b,
+ 0x0000, 0x0000, 0x536c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x536d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x536e, 0x0000, 0x536f, 0x5370, 0x0000, 0x0000, 0x0000, 0x5371,
+ 0x0000, 0x5372, 0x5373, 0x5374, 0x0000, 0x5375, 0x5376, 0x0000,
+ 0x5377, 0x0000, 0x0000, 0x5378, 0x5379, 0x537a, 0x0000, 0x0000,
+ 0x0000, 0x537b, 0x0000, 0x0000, 0x0000, 0x0000, 0x537c, 0x537d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x537e, 0x5421, 0x0000,
+ 0x745c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5422, 0x5423,
+ 0x0000, 0x0000, 0x5424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5425, 0x0000, 0x0000, 0x5426, 0x5427,
+ 0x0000, 0x5428, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5429, 0x542a, 0x542b, 0x542c, 0x542d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x542e, 0x542f, 0x5430, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x745d, 0x5431,
+ 0x0000, 0x5432, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5434, 0x0000, 0x0000, 0x5435, 0x5436, 0x0000,
+ 0x0000, 0x0000, 0x5437, 0x5438, 0x0000, 0x5439, 0x0000, 0x0000,
+ 0x0000, 0x543a, 0x0000, 0x0000, 0x0000, 0x543b, 0x543c, 0x0000,
+ 0x0000, 0x543d, 0x543e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_7e[] = {
+ /* 0x7e00 - 0x7eff */
+ 0x5433, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x543f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5440, 0x5441, 0x0000, 0x0000, 0x0000, 0x5442, 0x0000, 0x5443,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5444, 0x5445, 0x0000, 0x0000,
+ 0x5446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5447,
+ 0x5448, 0x0000, 0x0000, 0x0000, 0x5449, 0x544a, 0x0000, 0x544b,
+ 0x0000, 0x0000, 0x0000, 0x544c, 0x0000, 0x0000, 0x544d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x544e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x544f, 0x5450, 0x0000, 0x5451,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5452, 0x0000,
+ 0x5453, 0x0000, 0x5454, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5455, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5456,
+ 0x0000, 0x5457, 0x5458, 0x0000, 0x0000, 0x5459, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x545a, 0x0000, 0x0000, 0x545b, 0x545c,
+ 0x0000, 0x0000, 0x0000, 0x545d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x545e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x545f, 0x0000,
+ 0x0000, 0x5460, 0x0000, 0x0000, 0x0000, 0x0000, 0x5461, 0x5462,
+ 0x0000, 0x0000, 0x5463, 0x0000, 0x0000, 0x5464, 0x0000, 0x0000,
+ 0x0000, 0x5465, 0x0000, 0x0000, 0x0000, 0x5466, 0x0000, 0x0000,
+ 0x5467, 0x0000, 0x5468, 0x0000, 0x0000, 0x5469, 0x546a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_7f[] = {
+ /* 0x7f00 - 0x7fff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x546c, 0x546b, 0x546d, 0x546e, 0x546f,
+ 0x0000, 0x0000, 0x0000, 0x5470, 0x5471, 0x0000, 0x0000, 0x5472,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5473,
+ 0x0000, 0x0000, 0x5474, 0x5475, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5476, 0x5477, 0x5478, 0x0000, 0x0000,
+ 0x0000, 0x5479, 0x0000, 0x547a, 0x547b, 0x547c, 0x547d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x547e, 0x0000, 0x0000,
+ 0x0000, 0x5521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5522, 0x5523, 0x5524,
+ 0x5525, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5526, 0x0000, 0x5527, 0x0000, 0x5528,
+ 0x5529, 0x552a, 0x0000, 0x0000, 0x0000, 0x0000, 0x552b, 0x552c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x552d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x552e, 0x552f, 0x0000, 0x0000, 0x0000, 0x5530, 0x0000,
+ 0x0000, 0x0000, 0x5531, 0x0000, 0x0000, 0x5532, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5533, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5534, 0x0000, 0x0000, 0x5535,
+ 0x5536, 0x0000, 0x0000, 0x5537, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5538, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5539, 0x553a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x553b, 0x0000, 0x0000, 0x0000, 0x553c,
+ 0x0000, 0x0000, 0x0000, 0x553d, 0x0000, 0x553e, 0x0000, 0x0000,
+ 0x553f, 0x0000, 0x0000, 0x0000, 0x5540, 0x0000, 0x5541, 0x5542,
+ 0x0000, 0x0000, 0x5543, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5544, 0x0000, 0x0000, 0x5545, 0x5546, 0x5547,
+};
+
+static unsigned short const unicode_to_jisx0212_80[] = {
+ /* 0x8000 - 0x80ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5548,
+ 0x5549, 0x0000, 0x554a, 0x0000, 0x0000, 0x554b, 0x554c, 0x554d,
+ 0x0000, 0x554e, 0x0000, 0x554f, 0x5550, 0x0000, 0x5551, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5552, 0x5553, 0x5554,
+ 0x5555, 0x0000, 0x0000, 0x0000, 0x5556, 0x0000, 0x5557, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5558, 0x0000, 0x5559, 0x0000,
+ 0x555a, 0x0000, 0x0000, 0x0000, 0x555b, 0x555c, 0x0000, 0x555d,
+ 0x0000, 0x555e, 0x555f, 0x0000, 0x5560, 0x0000, 0x5561, 0x0000,
+ 0x5562, 0x0000, 0x0000, 0x0000, 0x5563, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5564, 0x0000, 0x0000, 0x0000, 0x5565, 0x0000, 0x5566, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5567, 0x0000, 0x0000,
+ 0x0000, 0x5568, 0x0000, 0x0000, 0x0000, 0x5569, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x556a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x556b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x556c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x556d, 0x0000, 0x556e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x556f, 0x5570,
+ 0x0000, 0x0000, 0x0000, 0x5571, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5572, 0x5573, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5574, 0x0000, 0x0000, 0x0000, 0x0000, 0x5575, 0x0000, 0x5576,
+ 0x0000, 0x0000, 0x5577, 0x0000, 0x5578, 0x5579, 0x0000, 0x557a,
+ 0x557b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x557c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x557d, 0x557e, 0x0000,
+ 0x5621, 0x0000, 0x5622, 0x5623, 0x0000, 0x0000, 0x5624, 0x0000,
+ 0x0000, 0x5625, 0x5626, 0x0000, 0x0000, 0x0000, 0x5627, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_81[] = {
+ /* 0x8100 - 0x81ff */
+ 0x0000, 0x0000, 0x0000, 0x5628, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5629, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x562a, 0x562b,
+ 0x562c, 0x0000, 0x0000, 0x0000, 0x562d, 0x0000, 0x562e, 0x0000,
+ 0x562f, 0x0000, 0x0000, 0x0000, 0x5630, 0x0000, 0x0000, 0x5631,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5632, 0x0000, 0x0000, 0x0000,
+ 0x5633, 0x0000, 0x0000, 0x0000, 0x0000, 0x5634, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5635, 0x0000, 0x5636, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5637, 0x0000, 0x5638,
+ 0x0000, 0x0000, 0x5639, 0x0000, 0x563a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x563b, 0x0000, 0x0000, 0x0000, 0x0000, 0x563c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x563d, 0x563e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x563f,
+ 0x5640, 0x5641, 0x0000, 0x0000, 0x0000, 0x5642, 0x0000, 0x5643,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5644,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5645, 0x0000, 0x0000, 0x5647, 0x5648, 0x5649, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x564a, 0x0000, 0x0000, 0x564b, 0x0000,
+ 0x5646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x564c, 0x0000,
+ 0x564d, 0x0000, 0x0000, 0x564e, 0x0000, 0x0000, 0x564f, 0x0000,
+ 0x0000, 0x0000, 0x5650, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5651, 0x0000,
+ 0x0000, 0x0000, 0x5652, 0x0000, 0x5653, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5654, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5656, 0x0000, 0x5657, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5658, 0x5655, 0x0000, 0x0000, 0x5659, 0x565a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x565b, 0x0000, 0x565c,
+ 0x0000, 0x0000, 0x0000, 0x565d, 0x0000, 0x565e, 0x565f, 0x0000,
+ 0x0000, 0x5660, 0x0000, 0x0000, 0x5661, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5662, 0x5663, 0x0000, 0x0000, 0x0000,
+ 0x5664, 0x5665, 0x5666, 0x0000, 0x0000, 0x5667, 0x5668, 0x0000,
+ 0x5669, 0x566a, 0x0000, 0x0000, 0x0000, 0x566b, 0x0000, 0x566c,
+};
+
+static unsigned short const unicode_to_jisx0212_82[] = {
+ /* 0x8200 - 0x82ff */
+ 0x566d, 0x0000, 0x0000, 0x566e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x566f,
+ 0x0000, 0x0000, 0x0000, 0x5670, 0x5671, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5672, 0x5673, 0x0000, 0x0000, 0x5674, 0x0000, 0x0000,
+ 0x0000, 0x5675, 0x5676, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5677, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5678, 0x0000, 0x5679, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x567a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x567b, 0x567c, 0x567d, 0x567e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5721, 0x0000, 0x0000, 0x5722, 0x5723,
+ 0x0000, 0x5724, 0x0000, 0x0000, 0x0000, 0x0000, 0x5725, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5726, 0x0000, 0x0000, 0x0000,
+ 0x5727, 0x0000, 0x0000, 0x5728, 0x0000, 0x0000, 0x0000, 0x5729,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x572a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x572b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x572c, 0x0000, 0x572d, 0x0000, 0x572e,
+ 0x572f, 0x5730, 0x0000, 0x5731, 0x5732, 0x0000, 0x0000, 0x5733,
+ 0x0000, 0x5734, 0x5735, 0x0000, 0x0000, 0x0000, 0x5736, 0x0000,
+ 0x0000, 0x5737, 0x0000, 0x0000, 0x5738, 0x0000, 0x5739, 0x0000,
+ 0x573a, 0x0000, 0x573b, 0x573c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x573d, 0x573e, 0x0000, 0x573f, 0x5740, 0x0000, 0x0000, 0x5741,
+ 0x5742, 0x5743, 0x5744, 0x0000, 0x0000, 0x0000, 0x5745, 0x0000,
+ 0x5746, 0x0000, 0x5747, 0x0000, 0x5748, 0x0000, 0x0000, 0x5749,
+ 0x0000, 0x0000, 0x574a, 0x0000, 0x574b, 0x0000, 0x574c, 0x574d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x574e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x574f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5750, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5751, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5752, 0x0000, 0x5753, 0x0000, 0x5754, 0x0000, 0x0000, 0x0000,
+ 0x5755, 0x0000, 0x5756, 0x0000, 0x0000, 0x5757, 0x0000, 0x5758,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5759, 0x575a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x575b, 0x575c, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_83[] = {
+ /* 0x8300 - 0x83ff */
+ 0x575d, 0x575e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x575f,
+ 0x5760, 0x0000, 0x5761, 0x5762, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5764, 0x0000, 0x5765, 0x5766, 0x5767,
+ 0x0000, 0x5768, 0x5769, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x576a, 0x576b, 0x576c, 0x0000,
+ 0x576d, 0x0000, 0x0000, 0x576e, 0x0000, 0x0000, 0x0000, 0x576f,
+ 0x0000, 0x0000, 0x5770, 0x0000, 0x5771, 0x5772, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5773, 0x5774, 0x5775, 0x0000, 0x0000, 0x5776,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5777, 0x5778, 0x0000,
+ 0x0000, 0x5779, 0x0000, 0x583e, 0x5763, 0x577a, 0x577b, 0x577c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x745f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x577d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x577e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5821, 0x0000, 0x5822,
+ 0x5823, 0x0000, 0x5824, 0x0000, 0x5825, 0x0000, 0x5826, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5827, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5828, 0x0000, 0x5829, 0x582a, 0x0000, 0x0000,
+ 0x582b, 0x582c, 0x0000, 0x582d, 0x582e, 0x582f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5830, 0x5831,
+ 0x0000, 0x5832, 0x0000, 0x0000, 0x5833, 0x584c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5834, 0x5835,
+ 0x5836, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5837,
+ 0x0000, 0x5838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5839,
+ 0x583a, 0x583b, 0x0000, 0x0000, 0x583c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x583d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x583f, 0x0000, 0x5840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5841, 0x0000,
+ 0x5842, 0x5843, 0x0000, 0x0000, 0x5844, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_84[] = {
+ /* 0x8400 - 0x84ff */
+ 0x0000, 0x5845, 0x0000, 0x0000, 0x0000, 0x0000, 0x5846, 0x0000,
+ 0x0000, 0x0000, 0x5847, 0x0000, 0x0000, 0x0000, 0x0000, 0x5848,
+ 0x0000, 0x5849, 0x0000, 0x0000, 0x0000, 0x584a, 0x0000, 0x0000,
+ 0x0000, 0x584b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x584d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x584e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x584f, 0x0000, 0x5850,
+ 0x5851, 0x0000, 0x5852, 0x0000, 0x0000, 0x5853, 0x0000, 0x5854,
+ 0x0000, 0x5855, 0x5856, 0x0000, 0x0000, 0x0000, 0x5857, 0x0000,
+ 0x5858, 0x5859, 0x585a, 0x0000, 0x585b, 0x0000, 0x0000, 0x0000,
+ 0x585c, 0x0000, 0x0000, 0x0000, 0x585d, 0x585e, 0x0000, 0x585f,
+ 0x0000, 0x0000, 0x5860, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5861, 0x0000, 0x0000, 0x5862, 0x5863, 0x0000, 0x5864, 0x0000,
+ 0x5865, 0x0000, 0x0000, 0x0000, 0x5866, 0x5867, 0x0000, 0x0000,
+ 0x0000, 0x5868, 0x0000, 0x0000, 0x0000, 0x5869, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x586a, 0x586b, 0x0000, 0x586c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x586d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x586e, 0x0000,
+ 0x586f, 0x5870, 0x5871, 0x0000, 0x0000, 0x0000, 0x0000, 0x5872,
+ 0x0000, 0x5873, 0x0000, 0x0000, 0x5874, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5875, 0x0000, 0x0000, 0x5876, 0x5877, 0x0000,
+ 0x5878, 0x0000, 0x5879, 0x0000, 0x0000, 0x0000, 0x0000, 0x587a,
+ 0x587b, 0x0000, 0x0000, 0x0000, 0x587c, 0x0000, 0x0000, 0x587d,
+ 0x0000, 0x0000, 0x0000, 0x587e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5921, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5922,
+ 0x0000, 0x0000, 0x5923, 0x0000, 0x0000, 0x0000, 0x0000, 0x5924,
+ 0x5925, 0x5926, 0x5927, 0x0000, 0x0000, 0x0000, 0x0000, 0x5928,
+ 0x0000, 0x0000, 0x592a, 0x592b, 0x0000, 0x592c, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_85[] = {
+ /* 0x8500 - 0x85ff */
+ 0x0000, 0x0000, 0x592d, 0x592e, 0x0000, 0x0000, 0x0000, 0x592f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5930, 0x0000, 0x5931, 0x0000,
+ 0x5932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5933, 0x0000, 0x5934, 0x0000,
+ 0x0000, 0x0000, 0x5935, 0x5936, 0x5937, 0x5938, 0x0000, 0x5939,
+ 0x0000, 0x0000, 0x593a, 0x593b, 0x0000, 0x0000, 0x0000, 0x593c,
+ 0x0000, 0x0000, 0x5929, 0x593d, 0x593e, 0x0000, 0x593f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5940,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5941, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5942,
+ 0x5943, 0x5944, 0x5945, 0x5946, 0x0000, 0x0000, 0x5947, 0x0000,
+ 0x0000, 0x5948, 0x0000, 0x0000, 0x5949, 0x594a, 0x594b, 0x594c,
+ 0x594d, 0x594e, 0x594f, 0x0000, 0x5950, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5951, 0x0000, 0x0000, 0x0000, 0x5952,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5953, 0x5954, 0x5955, 0x0000, 0x5956, 0x0000, 0x5957,
+ 0x0000, 0x5958, 0x0000, 0x0000, 0x0000, 0x5959, 0x595a, 0x0000,
+ 0x0000, 0x595b, 0x0000, 0x595c, 0x595d, 0x0000, 0x0000, 0x595e,
+ 0x0000, 0x0000, 0x0000, 0x595f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5960, 0x0000, 0x0000, 0x0000, 0x0000, 0x5961, 0x0000, 0x5962,
+ 0x5963, 0x0000, 0x5964, 0x0000, 0x0000, 0x5965, 0x0000, 0x5966,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5974, 0x0000, 0x0000,
+ 0x7461, 0x0000, 0x0000, 0x0000, 0x5967, 0x0000, 0x5968, 0x5969,
+ 0x596a, 0x0000, 0x0000, 0x0000, 0x596b, 0x596c, 0x596d, 0x596e,
+ 0x0000, 0x0000, 0x596f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5970,
+ 0x0000, 0x0000, 0x5971, 0x5972, 0x0000, 0x0000, 0x5973, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5975, 0x0000, 0x5976, 0x0000, 0x0000, 0x0000, 0x0000, 0x5977,
+ 0x5978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5979, 0x0000,
+ 0x597a, 0x0000, 0x0000, 0x0000, 0x0000, 0x597b, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x597c, 0x0000, 0x0000, 0x597d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x597e, 0x0000, 0x0000, 0x5a21,
+};
+
+static unsigned short const unicode_to_jisx0212_86[] = {
+ /* 0x8600 - 0x86ff */
+ 0x5a22, 0x0000, 0x0000, 0x0000, 0x5a23, 0x5a24, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a25, 0x5a26, 0x0000,
+ 0x5a27, 0x5a28, 0x5a29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5a2a, 0x5a2b, 0x0000, 0x5a2c, 0x0000, 0x0000, 0x5a2d, 0x0000,
+ 0x0000, 0x5a2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a2f,
+ 0x0000, 0x5a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a31, 0x0000,
+ 0x5a32, 0x0000, 0x5a33, 0x0000, 0x5a34, 0x5a35, 0x0000, 0x0000,
+ 0x5a36, 0x3866, 0x5a37, 0x0000, 0x0000, 0x0000, 0x5a38, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5a39, 0x5a3a, 0x0000, 0x0000, 0x5a3b, 0x5a3c,
+ 0x5a3d, 0x5a3e, 0x0000, 0x0000, 0x0000, 0x5a3f, 0x0000, 0x0000,
+ 0x5a40, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5a45, 0x0000, 0x0000, 0x5a46, 0x0000, 0x0000, 0x5a47,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a48, 0x5a49, 0x5a4a,
+ 0x0000, 0x0000, 0x5a4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5a6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a4c, 0x0000, 0x0000,
+ 0x0000, 0x5a4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a4e, 0x0000,
+ 0x5a4f, 0x0000, 0x5a50, 0x0000, 0x5a51, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5a52, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a53, 0x5a54,
+ 0x5a55, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a56, 0x0000, 0x0000,
+ 0x0000, 0x5a57, 0x0000, 0x5a58, 0x5a59, 0x5a5a, 0x0000, 0x5a5b,
+ 0x5a5c, 0x5a5d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a5e,
+ 0x5a5f, 0x5a60, 0x0000, 0x5a61, 0x0000, 0x5a62, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5a63, 0x5a64, 0x0000, 0x0000, 0x5a65, 0x0000, 0x5a66,
+ 0x0000, 0x0000, 0x5a67, 0x0000, 0x5a68, 0x0000, 0x0000, 0x0000,
+ 0x5a69, 0x0000, 0x0000, 0x5a6a, 0x0000, 0x5a6b, 0x0000, 0x5a6c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5a6e, 0x0000, 0x5a6f, 0x5a70, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_87[] = {
+ /* 0x8700 - 0x87ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5a71, 0x5a72, 0x0000, 0x5a73,
+ 0x0000, 0x0000, 0x0000, 0x5a74, 0x0000, 0x0000, 0x5a75, 0x5a76,
+ 0x5a77, 0x0000, 0x0000, 0x5a78, 0x5a79, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5a7a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a7b, 0x5a7c,
+ 0x0000, 0x5a7d, 0x0000, 0x5a7e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b22, 0x5b23,
+ 0x0000, 0x5b24, 0x5b25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5b26, 0x5b27, 0x0000, 0x5b28, 0x5b29, 0x5b2a, 0x0000,
+ 0x5b2b, 0x0000, 0x0000, 0x5b2c, 0x0000, 0x5b2d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b2e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b30, 0x0000, 0x0000,
+ 0x0000, 0x5b31, 0x0000, 0x0000, 0x5b32, 0x5b33, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b34,
+ 0x0000, 0x5b35, 0x5b36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5b37, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c,
+ 0x5b3d, 0x5b3e, 0x0000, 0x5b3f, 0x5b40, 0x0000, 0x0000, 0x0000,
+ 0x5b41, 0x0000, 0x0000, 0x5b42, 0x0000, 0x5b43, 0x0000, 0x5b44,
+ 0x5b45, 0x5b46, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b47, 0x0000,
+ 0x5b48, 0x0000, 0x0000, 0x5b49, 0x0000, 0x0000, 0x0000, 0x5b4a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5b4b, 0x5b4c, 0x5b4d, 0x0000,
+ 0x0000, 0x5b4e, 0x0000, 0x0000, 0x0000, 0x5b4f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b50, 0x5b51,
+ 0x0000, 0x5b52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b53, 0x5b54, 0x5b55, 0x0000, 0x0000, 0x0000, 0x5b56, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b57, 0x5b58, 0x0000,
+ 0x0000, 0x5b59, 0x5b5a, 0x0000, 0x5b5b, 0x0000, 0x0000, 0x5b5c,
+ 0x0000, 0x0000, 0x5b5d, 0x5b5e, 0x5b5f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5b60, 0x5b61, 0x0000, 0x5b62, 0x0000, 0x0000,
+ 0x0000, 0x5b63, 0x0000, 0x5b64, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b65, 0x0000, 0x5b66, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b67,
+};
+
+static unsigned short const unicode_to_jisx0212_88[] = {
+ /* 0x8800 - 0x88ff */
+ 0x0000, 0x5b68, 0x0000, 0x5b69, 0x0000, 0x0000, 0x5b6a, 0x7464,
+ 0x0000, 0x5b6b, 0x5b6c, 0x5b6d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b6e, 0x0000, 0x5b70, 0x5b71, 0x5b72, 0x0000, 0x0000, 0x0000,
+ 0x5b73, 0x5b6f, 0x5b74, 0x5b75, 0x5b76, 0x0000, 0x5b77, 0x5b78,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5b79, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b7a, 0x5b7b, 0x0000,
+ 0x5b7c, 0x0000, 0x5b7d, 0x0000, 0x0000, 0x5b7e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c21, 0x0000, 0x5c22, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c23, 0x0000, 0x5c24, 0x0000, 0x5c25, 0x0000, 0x0000,
+ 0x5c26, 0x5c27, 0x5c28, 0x5c29, 0x0000, 0x0000, 0x5c2a, 0x0000,
+ 0x0000, 0x5c2b, 0x0000, 0x0000, 0x0000, 0x5c2c, 0x5c2d, 0x0000,
+ 0x5c2e, 0x0000, 0x5c2f, 0x0000, 0x5c30, 0x0000, 0x0000, 0x5c31,
+ 0x5c32, 0x0000, 0x0000, 0x0000, 0x5c33, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c36, 0x0000, 0x5c37, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5c38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5c39, 0x0000, 0x5c3a, 0x5c3b, 0x5c3c, 0x0000, 0x0000, 0x5c3d,
+ 0x5c3e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5c3f, 0x0000, 0x5c40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c41, 0x0000, 0x0000, 0x5c42, 0x5c43, 0x0000,
+ 0x5c44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c45, 0x5c46, 0x5c47, 0x5c48, 0x5c49, 0x0000,
+ 0x0000, 0x5c4a, 0x5c4b, 0x5c4c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5c4d, 0x0000, 0x0000, 0x5c4e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c4f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c50,
+ 0x5c51, 0x5c52, 0x0000, 0x0000, 0x0000, 0x5c53, 0x0000, 0x5c54,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_89[] = {
+ /* 0x8900 - 0x89ff */
+ 0x0000, 0x5c55, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c56, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c57, 0x5c58, 0x5c59,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c5a, 0x5c5b, 0x0000,
+ 0x5c5c, 0x5c5d, 0x5c5e, 0x0000, 0x5c5f, 0x0000, 0x0000, 0x0000,
+ 0x5c60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c61, 0x5c62,
+ 0x5c63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5c64, 0x5c65, 0x5c66, 0x0000, 0x0000, 0x5c67, 0x0000, 0x0000,
+ 0x0000, 0x5c68, 0x5c69, 0x0000, 0x0000, 0x0000, 0x5c6a, 0x0000,
+ 0x5c6b, 0x0000, 0x5c6c, 0x0000, 0x0000, 0x5c6d, 0x5c6e, 0x0000,
+ 0x0000, 0x5c6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c70,
+ 0x0000, 0x0000, 0x5c71, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c72,
+ 0x0000, 0x0000, 0x5c73, 0x5c74, 0x5c75, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5c76, 0x5c77, 0x5c78, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5c79, 0x0000, 0x0000, 0x5c7a, 0x0000,
+ 0x5c7b, 0x0000, 0x0000, 0x5c7c, 0x0000, 0x5c7d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5c7e, 0x5d21, 0x5d22, 0x5d23, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5d24, 0x0000, 0x0000, 0x0000, 0x5d25, 0x0000, 0x0000,
+ 0x5d26, 0x0000, 0x0000, 0x0000, 0x5d27, 0x5d28, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d29, 0x5d2a, 0x0000, 0x0000, 0x5d2b,
+ 0x5d2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d2d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5d2e, 0x0000, 0x0000, 0x0000, 0x5d2f, 0x5d30, 0x5d31, 0x5d32,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5d33, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5d34, 0x5d35, 0x5d36, 0x5d37,
+ 0x5d38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d39, 0x0000, 0x0000,
+ 0x0000, 0x5d3a, 0x0000, 0x5d3b, 0x0000, 0x5d3c, 0x0000, 0x0000,
+ 0x0000, 0x5d3d, 0x0000, 0x5d3e, 0x0000, 0x0000, 0x5d3f, 0x0000,
+ 0x0000, 0x5d40, 0x0000, 0x0000, 0x0000, 0x5d41, 0x0000, 0x5d42,
+};
+
+static unsigned short const unicode_to_jisx0212_8a[] = {
+ /* 0x8a00 - 0x8aff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5d43, 0x5d44, 0x0000, 0x5d45,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d46,
+ 0x0000, 0x5d47, 0x5d48, 0x0000, 0x5d49, 0x5d4a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d4b, 0x0000,
+ 0x5d4c, 0x0000, 0x5d4d, 0x0000, 0x5d4e, 0x0000, 0x5d4f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d50, 0x5d51, 0x0000, 0x0000, 0x5d52,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d53, 0x0000, 0x5d54,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d55, 0x5d56, 0x0000,
+ 0x5d57, 0x0000, 0x0000, 0x5d58, 0x0000, 0x5d59, 0x0000, 0x5d5a,
+ 0x0000, 0x5d5b, 0x0000, 0x0000, 0x0000, 0x5d5c, 0x5d5d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d5e, 0x0000, 0x0000, 0x5d5f, 0x5d60,
+ 0x5d61, 0x0000, 0x0000, 0x0000, 0x5d62, 0x5d63, 0x0000, 0x0000,
+ 0x0000, 0x5d64, 0x0000, 0x0000, 0x0000, 0x5d65, 0x0000, 0x5d66,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d67, 0x5d68, 0x5d69,
+ 0x0000, 0x5d6a, 0x5d6b, 0x5d6c, 0x0000, 0x0000, 0x5d6d, 0x5d6e,
+ 0x5d6f, 0x0000, 0x0000, 0x5d70, 0x0000, 0x0000, 0x5d71, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5d72, 0x0000, 0x0000, 0x0000, 0x5d73,
+ 0x5d74, 0x0000, 0x5d75, 0x0000, 0x0000, 0x0000, 0x5d76, 0x5d77,
+ 0x0000, 0x5d78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d79,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d7a,
+ 0x0000, 0x5d7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d7c, 0x5d7d,
+ 0x0000, 0x0000, 0x0000, 0x5d7e, 0x0000, 0x0000, 0x5e21, 0x5e22,
+ 0x0000, 0x0000, 0x0000, 0x5e23, 0x0000, 0x0000, 0x5e24, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e25, 0x0000, 0x0000, 0x5e26, 0x0000,
+ 0x5e27, 0x5e28, 0x5e29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5e2a, 0x0000, 0x5e2b, 0x5e2c, 0x5e2d, 0x0000, 0x5e2e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e2f, 0x0000, 0x5e30,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e31, 0x0000, 0x0000, 0x0000,
+ 0x5e32, 0x0000, 0x0000, 0x0000, 0x5e33, 0x5e34, 0x5e35, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e36, 0x0000, 0x0000, 0x5e37,
+};
+
+static unsigned short const unicode_to_jisx0212_8b[] = {
+ /* 0x8b00 - 0x8bff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e38, 0x5e39, 0x0000,
+ 0x0000, 0x0000, 0x5e3f, 0x5e3a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5e3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e3c, 0x0000, 0x5e3d, 0x5e3e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e40, 0x0000, 0x0000,
+ 0x5e41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e42,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e43, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5e44, 0x5e45, 0x5e46, 0x5e47, 0x5e48, 0x0000,
+ 0x5e49, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e4e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5e4a, 0x5e4b, 0x5e4c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5e4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e4f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e50, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e51, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e52, 0x0000,
+ 0x5e53, 0x5e54, 0x0000, 0x0000, 0x5e55, 0x0000, 0x5e56, 0x7466,
+ 0x0000, 0x5e57, 0x0000, 0x0000, 0x5e58, 0x5e59, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e5a, 0x0000, 0x5e5b, 0x0000, 0x5e5c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e5d, 0x5e5e, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5e5f, 0x0000, 0x5e60, 0x5e61,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_8c[] = {
+ /* 0x8c00 - 0x8cff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5e62, 0x5e63, 0x0000, 0x0000, 0x0000, 0x5e64, 0x5e65, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e66, 0x0000, 0x5e67,
+ 0x0000, 0x5e68, 0x0000, 0x5e69, 0x0000, 0x0000, 0x0000, 0x5e6a,
+ 0x0000, 0x5e6b, 0x0000, 0x5e6c, 0x5e6d, 0x0000, 0x0000, 0x5e6e,
+ 0x5e6f, 0x5e72, 0x0000, 0x5e70, 0x0000, 0x5e71, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e73, 0x5e74, 0x0000, 0x5e75, 0x0000,
+ 0x5e76, 0x5e77, 0x0000, 0x0000, 0x0000, 0x5e78, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e79, 0x0000, 0x5e7a, 0x5e7b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5e7c, 0x0000, 0x0000, 0x5e7d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e7e, 0x5f21,
+ 0x0000, 0x0000, 0x0000, 0x5f22, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5f23, 0x0000, 0x5f24, 0x5f25, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f26, 0x0000, 0x5f27, 0x5f28, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f29, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f2a, 0x5f2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f2c, 0x5f2d, 0x0000,
+ 0x0000, 0x5f2e, 0x0000, 0x5f2f, 0x0000, 0x0000, 0x0000, 0x5f30,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f32, 0x5f31, 0x0000,
+ 0x0000, 0x5f33, 0x0000, 0x0000, 0x0000, 0x5f34, 0x0000, 0x0000,
+ 0x0000, 0x5f35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5f36, 0x0000, 0x0000, 0x0000, 0x5f37, 0x0000, 0x0000, 0x5f38,
+ 0x5f39, 0x0000, 0x5f3a, 0x0000, 0x7467, 0x5f3b, 0x0000, 0x5f3c,
+ 0x5f3d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f3e, 0x5f3f,
+};
+
+static unsigned short const unicode_to_jisx0212_8d[] = {
+ /* 0x8d00 - 0x8dff */
+ 0x0000, 0x5f40, 0x0000, 0x5f41, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5f43, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f44,
+ 0x0000, 0x0000, 0x0000, 0x5f45, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f46, 0x0000, 0x0000,
+ 0x0000, 0x5f47, 0x0000, 0x0000, 0x5f48, 0x0000, 0x5f49, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7468, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f4a,
+ 0x0000, 0x0000, 0x5f4b, 0x0000, 0x5f4c, 0x0000, 0x0000, 0x0000,
+ 0x5f4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f4e, 0x0000, 0x0000,
+ 0x5f4f, 0x5f50, 0x0000, 0x0000, 0x0000, 0x5f51, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f52, 0x5f53,
+ 0x5f54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f55, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5f56, 0x5f57, 0x0000, 0x0000, 0x5f58,
+ 0x0000, 0x0000, 0x5f59, 0x0000, 0x0000, 0x5f5a, 0x0000, 0x5f5b,
+ 0x0000, 0x5f5c, 0x0000, 0x5f5d, 0x5f6f, 0x0000, 0x0000, 0x0000,
+ 0x5f5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f5f, 0x5f60, 0x5f61,
+ 0x5f62, 0x0000, 0x5f63, 0x0000, 0x0000, 0x0000, 0x5f64, 0x0000,
+ 0x0000, 0x5f65, 0x0000, 0x0000, 0x5f66, 0x5f67, 0x0000, 0x5f68,
+ 0x0000, 0x5f69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f6a, 0x5f6b, 0x0000, 0x5f6c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5f6d, 0x0000, 0x0000, 0x0000,
+ 0x5f6e, 0x5f70, 0x5f71, 0x0000, 0x5f72, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f73, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_8e[] = {
+ /* 0x8e00 - 0x8eff */
+ 0x0000, 0x5f74, 0x0000, 0x0000, 0x5f75, 0x5f76, 0x5f77, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5f78, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5f79, 0x0000, 0x0000, 0x5f7a, 0x0000, 0x5f7b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5f7c, 0x5f7d, 0x5f7e, 0x6021, 0x0000, 0x0000, 0x6022, 0x6023,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6024, 0x0000, 0x6025, 0x0000, 0x0000, 0x6026, 0x6027,
+ 0x6028, 0x6029, 0x0000, 0x0000, 0x0000, 0x602a, 0x0000, 0x0000,
+ 0x602b, 0x602c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x602d, 0x0000, 0x602e, 0x602f, 0x6030,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6031, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6032, 0x6033, 0x6034, 0x6035, 0x0000,
+ 0x0000, 0x6036, 0x6037, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6038, 0x0000, 0x0000, 0x6039, 0x603a, 0x0000, 0x603b,
+ 0x603c, 0x603d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x603e, 0x603f, 0x6040, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6041, 0x6042, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6044, 0x0000, 0x6045, 0x0000, 0x0000, 0x6046, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6047, 0x6048, 0x0000, 0x6049, 0x604a, 0x0000,
+ 0x0000, 0x0000, 0x604b, 0x0000, 0x0000, 0x0000, 0x0000, 0x604c,
+ 0x0000, 0x604d, 0x0000, 0x0000, 0x0000, 0x604e, 0x604f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6050, 0x0000, 0x6051, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6052, 0x6053, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6054, 0x6055, 0x0000, 0x6056, 0x6057, 0x0000, 0x0000, 0x6058,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6059,
+ 0x0000, 0x605a, 0x0000, 0x0000, 0x605b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x605c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x605d, 0x0000, 0x0000, 0x0000, 0x0000, 0x6064, 0x605e, 0x0000,
+ 0x605f, 0x6060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6061,
+ 0x0000, 0x6062, 0x6063, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_8f[] = {
+ /* 0x8f00 - 0x8fff */
+ 0x6065, 0x0000, 0x6066, 0x0000, 0x0000, 0x0000, 0x0000, 0x6067,
+ 0x6068, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6069,
+ 0x606a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x606b, 0x606c,
+ 0x606d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x606e, 0x0000,
+ 0x606f, 0x6070, 0x0000, 0x6071, 0x0000, 0x6072, 0x0000, 0x6073,
+ 0x6074, 0x0000, 0x0000, 0x0000, 0x6075, 0x6076, 0x6077, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6078, 0x6079, 0x607a, 0x607b,
+ 0x0000, 0x0000, 0x607c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x607d, 0x607e, 0x0000, 0x6121, 0x0000, 0x0000, 0x0000, 0x6122,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6123,
+ 0x0000, 0x6124, 0x6125, 0x6126, 0x6127, 0x6128, 0x0000, 0x0000,
+ 0x6129, 0x0000, 0x0000, 0x0000, 0x0000, 0x612a, 0x612b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x612c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x612d, 0x0000, 0x0000,
+ 0x612e, 0x612f, 0x0000, 0x0000, 0x6130, 0x6131, 0x6132, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6133, 0x6134, 0x0000,
+ 0x6135, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6136, 0x0000,
+ 0x6137, 0x6138, 0x0000, 0x0000, 0x0000, 0x0000, 0x6139, 0x0000,
+ 0x0000, 0x0000, 0x613a, 0x613b, 0x0000, 0x613c, 0x0000, 0x0000,
+ 0x613d, 0x0000, 0x613e, 0x613f, 0x0000, 0x6140, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6141, 0x0000, 0x0000, 0x6142, 0x6143, 0x0000, 0x0000, 0x0000,
+ 0x6144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6145, 0x0000,
+ 0x0000, 0x6146, 0x0000, 0x0000, 0x0000, 0x6147, 0x6148, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6149, 0x0000, 0x0000, 0x614a, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_90[] = {
+ /* 0x9000 - 0x90ff */
+ 0x0000, 0x0000, 0x614b, 0x0000, 0x614c, 0x0000, 0x0000, 0x0000,
+ 0x614d, 0x0000, 0x0000, 0x0000, 0x614e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x614f, 0x0000, 0x0000, 0x6150, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6151, 0x6152, 0x6154, 0x0000, 0x6155, 0x6156, 0x0000, 0x6153,
+ 0x0000, 0x0000, 0x0000, 0x6157, 0x6158, 0x0000, 0x0000, 0x6159,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x615a,
+ 0x0000, 0x0000, 0x0000, 0x615b, 0x615c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x615d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x615e, 0x0000, 0x615f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6160, 0x0000, 0x0000, 0x0000, 0x6161, 0x6162,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6163, 0x0000, 0x0000, 0x0000,
+ 0x6164, 0x0000, 0x0000, 0x0000, 0x6165, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6166, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6167, 0x0000, 0x0000,
+ 0x6168, 0x0000, 0x0000, 0x6169, 0x616a, 0x0000, 0x616b, 0x0000,
+ 0x616c, 0x0000, 0x0000, 0x0000, 0x0000, 0x616d, 0x0000, 0x616e,
+ 0x616f, 0x6170, 0x0000, 0x6171, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6172, 0x6173, 0x6174, 0x0000, 0x0000, 0x6175, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6176, 0x0000, 0x6177, 0x6178, 0x6179, 0x0000, 0x617a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x617b, 0x617d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x617e, 0x6221, 0x6222, 0x0000, 0x6223,
+ 0x6224, 0x0000, 0x0000, 0x0000, 0x617c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x622d, 0x0000, 0x0000, 0x6225, 0x0000, 0x6226,
+ 0x6227, 0x6228, 0x0000, 0x0000, 0x6229, 0x622a, 0x746c, 0x622b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x622c, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x622f, 0x0000, 0x0000, 0x0000, 0x6230,
+ 0x6231, 0x0000, 0x0000, 0x0000, 0x6232, 0x0000, 0x622e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6233, 0x6234,
+};
+
+static unsigned short const unicode_to_jisx0212_91[] = {
+ /* 0x9100 - 0x91ff */
+ 0x6235, 0x0000, 0x0000, 0x0000, 0x6236, 0x6237, 0x6238, 0x0000,
+ 0x6239, 0x0000, 0x0000, 0x0000, 0x0000, 0x623a, 0x0000, 0x0000,
+ 0x623b, 0x0000, 0x0000, 0x0000, 0x623c, 0x746e, 0x623d, 0x623e,
+ 0x623f, 0x0000, 0x6240, 0x0000, 0x6241, 0x0000, 0x6242, 0x0000,
+ 0x6243, 0x0000, 0x6245, 0x6246, 0x0000, 0x6244, 0x0000, 0x6247,
+ 0x0000, 0x6248, 0x0000, 0x0000, 0x0000, 0x0000, 0x6249, 0x624a,
+ 0x0000, 0x624b, 0x0000, 0x0000, 0x624c, 0x0000, 0x624d, 0x624e,
+ 0x0000, 0x624f, 0x6250, 0x0000, 0x6251, 0x6252, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6253, 0x0000, 0x0000, 0x0000, 0x6254,
+ 0x6255, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6256,
+ 0x0000, 0x0000, 0x0000, 0x6257, 0x0000, 0x0000, 0x0000, 0x6258,
+ 0x0000, 0x6259, 0x625a, 0x625b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x625c, 0x0000, 0x0000, 0x625d, 0x0000, 0x0000, 0x625e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6260, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6261, 0x6262, 0x6263, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6264, 0x0000, 0x6265, 0x0000, 0x6266, 0x6267, 0x0000,
+ 0x0000, 0x0000, 0x6268, 0x0000, 0x0000, 0x0000, 0x6269, 0x0000,
+ 0x0000, 0x626a, 0x0000, 0x626b, 0x626c, 0x626d, 0x0000, 0x0000,
+ 0x626e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x626f, 0x0000,
+ 0x0000, 0x6270, 0x0000, 0x0000, 0x0000, 0x0000, 0x6271, 0x0000,
+ 0x6272, 0x0000, 0x0000, 0x0000, 0x6273, 0x6274, 0x6275, 0x0000,
+ 0x6276, 0x6277, 0x6278, 0x6279, 0x0000, 0x0000, 0x627a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x627b, 0x627c, 0x627d, 0x0000, 0x627e,
+ 0x0000, 0x0000, 0x6321, 0x6322, 0x0000, 0x6323, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6324, 0x6325, 0x0000, 0x0000, 0x6326,
+ 0x0000, 0x6327, 0x6328, 0x0000, 0x0000, 0x0000, 0x6329, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x632a, 0x632b, 0x0000, 0x0000,
+ 0x0000, 0x632c, 0x632d, 0x0000, 0x632e, 0x632f, 0x6330, 0x6331,
+ 0x6332, 0x6333, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6334,
+ 0x0000, 0x6335, 0x0000, 0x6336, 0x0000, 0x6337, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_92[] = {
+ /* 0x9200 - 0x92ff */
+ 0x6338, 0x6339, 0x0000, 0x0000, 0x633a, 0x633b, 0x633c, 0x633d,
+ 0x0000, 0x633e, 0x633f, 0x0000, 0x6340, 0x0000, 0x0000, 0x0000,
+ 0x6341, 0x0000, 0x6342, 0x6343, 0x0000, 0x0000, 0x6344, 0x0000,
+ 0x6345, 0x0000, 0x0000, 0x0000, 0x6346, 0x6347, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6348, 0x6349, 0x634a, 0x634b, 0x0000,
+ 0x634c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x634d, 0x634e,
+ 0x634f, 0x0000, 0x0000, 0x6350, 0x0000, 0x6351, 0x6352, 0x0000,
+ 0x6353, 0x6354, 0x6355, 0x0000, 0x6356, 0x0000, 0x6357, 0x0000,
+ 0x6358, 0x0000, 0x6359, 0x635a, 0x0000, 0x0000, 0x635b, 0x635c,
+ 0x0000, 0x0000, 0x635d, 0x0000, 0x0000, 0x635e, 0x635f, 0x6360,
+ 0x0000, 0x6361, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6362, 0x6363, 0x0000, 0x0000, 0x6364, 0x6365, 0x0000, 0x0000,
+ 0x6366, 0x6367, 0x0000, 0x0000, 0x0000, 0x6368, 0x0000, 0x6369,
+ 0x636a, 0x636b, 0x0000, 0x0000, 0x0000, 0x0000, 0x636c, 0x636d,
+ 0x636e, 0x0000, 0x0000, 0x0000, 0x0000, 0x636f, 0x6370, 0x6371,
+ 0x6372, 0x6373, 0x0000, 0x6374, 0x6375, 0x6376, 0x0000, 0x6377,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6378, 0x6379, 0x637a, 0x0000, 0x0000, 0x637b, 0x637c, 0x0000,
+ 0x0000, 0x0000, 0x637d, 0x0000, 0x0000, 0x0000, 0x0000, 0x637e,
+ 0x0000, 0x6421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6422,
+ 0x6423, 0x0000, 0x0000, 0x0000, 0x6424, 0x6425, 0x0000, 0x6426,
+ 0x6427, 0x0000, 0x0000, 0x6428, 0x0000, 0x0000, 0x0000, 0x6429,
+ 0x0000, 0x0000, 0x642a, 0x0000, 0x0000, 0x0000, 0x642b, 0x0000,
+ 0x642c, 0x0000, 0x642d, 0x642e, 0x642f, 0x6430, 0x0000, 0x6431,
+ 0x6432, 0x6433, 0x6434, 0x6435, 0x0000, 0x6436, 0x6437, 0x6438,
+ 0x6439, 0x0000, 0x0000, 0x643a, 0x643b, 0x643c, 0x643d, 0x0000,
+ 0x643e, 0x0000, 0x0000, 0x643f, 0x0000, 0x6440, 0x0000, 0x6441,
+ 0x6442, 0x6443, 0x0000, 0x0000, 0x6444, 0x6445, 0x0000, 0x6446,
+ 0x6447, 0x6448, 0x0000, 0x6449, 0x0000, 0x644a, 0x0000, 0x644b,
+ 0x644c, 0x0000, 0x0000, 0x0000, 0x644d, 0x0000, 0x644e, 0x0000,
+ 0x644f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6450, 0x0000, 0x6451, 0x0000, 0x0000, 0x0000, 0x6452,
+};
+
+static unsigned short const unicode_to_jisx0212_93[] = {
+ /* 0x9300 - 0x93ff */
+ 0x6453, 0x0000, 0x6454, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6455, 0x0000, 0x0000, 0x0000, 0x0000, 0x6456, 0x0000, 0x0000,
+ 0x0000, 0x6457, 0x0000, 0x0000, 0x6458, 0x6459, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x645a, 0x645b, 0x645c, 0x645d,
+ 0x0000, 0x645e, 0x0000, 0x0000, 0x645f, 0x6460, 0x0000, 0x6461,
+ 0x0000, 0x6462, 0x6463, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6464, 0x6465, 0x0000, 0x6466, 0x6467,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6468,
+ 0x6469, 0x646a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x646b, 0x646c, 0x646d, 0x0000, 0x0000, 0x646e, 0x0000, 0x646f,
+ 0x6470, 0x0000, 0x6471, 0x0000, 0x0000, 0x0000, 0x6472, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6473, 0x6474, 0x0000, 0x6475,
+ 0x0000, 0x6476, 0x6477, 0x0000, 0x0000, 0x6478, 0x0000, 0x6479,
+ 0x647a, 0x647b, 0x0000, 0x647c, 0x647d, 0x0000, 0x647e, 0x0000,
+ 0x0000, 0x0000, 0x6521, 0x0000, 0x0000, 0x6522, 0x0000, 0x6523,
+ 0x6524, 0x6525, 0x6526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6527, 0x0000, 0x6528, 0x6529, 0x0000, 0x652a, 0x0000, 0x652b,
+ 0x0000, 0x0000, 0x652c, 0x0000, 0x0000, 0x652d, 0x0000, 0x0000,
+ 0x652e, 0x0000, 0x0000, 0x652f, 0x0000, 0x0000, 0x6530, 0x0000,
+ 0x0000, 0x6531, 0x0000, 0x6532, 0x6533, 0x0000, 0x6534, 0x0000,
+ 0x6535, 0x653b, 0x0000, 0x6536, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6537, 0x6538, 0x6539, 0x0000,
+ 0x0000, 0x0000, 0x653a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x653c, 0x0000, 0x0000, 0x653d, 0x653e, 0x653f, 0x6540,
+ 0x0000, 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6546, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6547, 0x0000, 0x0000, 0x6548, 0x0000, 0x6549, 0x654a,
+ 0x0000, 0x0000, 0x654b, 0x0000, 0x0000, 0x0000, 0x654c, 0x654d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x654f,
+ 0x6550, 0x654e, 0x6551, 0x6552, 0x0000, 0x6553, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_94[] = {
+ /* 0x9400 - 0x94ff */
+ 0x0000, 0x6554, 0x6555, 0x0000, 0x6556, 0x0000, 0x0000, 0x0000,
+ 0x6557, 0x6558, 0x0000, 0x0000, 0x0000, 0x6559, 0x655a, 0x655b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x655c, 0x655d, 0x655e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x655f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6560, 0x6561,
+ 0x0000, 0x6562, 0x6563, 0x6564, 0x6565, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6566, 0x0000, 0x6568, 0x0000, 0x6567,
+ 0x0000, 0x0000, 0x0000, 0x6569, 0x0000, 0x656a, 0x0000, 0x0000,
+ 0x656b, 0x0000, 0x656c, 0x0000, 0x656d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x656e, 0x0000, 0x0000,
+ 0x0000, 0x656f, 0x0000, 0x0000, 0x6570, 0x0000, 0x0000, 0x6571,
+ 0x0000, 0x6572, 0x0000, 0x6573, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6574, 0x0000, 0x0000, 0x6575, 0x0000, 0x6576, 0x6577, 0x6578,
+ 0x0000, 0x6579, 0x657a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x657c, 0x657b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_95[] = {
+ /* 0x9500 - 0x95ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x657d, 0x657e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6621, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6622, 0x0000, 0x0000, 0x0000,
+ 0x6623, 0x0000, 0x0000, 0x0000, 0x6624, 0x6625, 0x6626, 0x0000,
+ 0x0000, 0x0000, 0x7471, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6627, 0x6628, 0x6629,
+ 0x0000, 0x662a, 0x0000, 0x0000, 0x0000, 0x0000, 0x662b, 0x0000,
+ 0x0000, 0x662c, 0x0000, 0x662d, 0x662e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x662f, 0x0000, 0x6630, 0x0000,
+ 0x0000, 0x0000, 0x6631, 0x0000, 0x0000, 0x6632, 0x0000, 0x6633,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6634, 0x0000,
+ 0x6635, 0x6636, 0x0000, 0x6637, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6638, 0x6639, 0x663a, 0x663b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x663c, 0x663d, 0x0000, 0x0000, 0x663e, 0x663f, 0x6640,
+ 0x6641, 0x0000, 0x0000, 0x0000, 0x6642, 0x0000, 0x6643, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_96[] = {
+ /* 0x9600 - 0x96ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6644, 0x6645, 0x0000,
+ 0x0000, 0x0000, 0x6646, 0x0000, 0x6647, 0x6648, 0x6649, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x664a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x664b, 0x0000, 0x664c, 0x0000, 0x0000, 0x0000, 0x664d,
+ 0x664e, 0x664f, 0x6650, 0x0000, 0x6651, 0x6652, 0x0000, 0x0000,
+ 0x0000, 0x6653, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6654, 0x0000, 0x6655, 0x0000, 0x6656, 0x6657,
+ 0x6658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6659, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x665a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x665b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x665c, 0x665d, 0x0000, 0x665e, 0x665f,
+ 0x0000, 0x6660, 0x6661, 0x6662, 0x6663, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6664, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6665, 0x0000, 0x0000, 0x0000, 0x0000, 0x6666, 0x0000,
+ 0x0000, 0x0000, 0x6667, 0x0000, 0x0000, 0x6668, 0x0000, 0x6669,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x666a, 0x666b, 0x666c, 0x0000,
+ 0x0000, 0x666d, 0x0000, 0x0000, 0x0000, 0x0000, 0x666e, 0x666f,
+ 0x0000, 0x0000, 0x0000, 0x6670, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6671, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6672, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6673, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6675, 0x0000, 0x6676, 0x0000, 0x0000, 0x6677, 0x6678, 0x6679,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x667a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667b,
+ 0x0000, 0x667c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x667d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_97[] = {
+ /* 0x9700 - 0x97ff */
+ 0x0000, 0x0000, 0x667e, 0x6721, 0x0000, 0x6722, 0x0000, 0x0000,
+ 0x0000, 0x6723, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6724, 0x6725, 0x0000, 0x6726, 0x0000, 0x0000,
+ 0x0000, 0x6727, 0x6728, 0x6729, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x672a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x672b, 0x0000, 0x672c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7474, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x672d, 0x0000, 0x672e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x672f, 0x0000, 0x0000, 0x7475, 0x6730, 0x6731,
+ 0x0000, 0x7476, 0x0000, 0x0000, 0x0000, 0x6732, 0x0000, 0x6733,
+ 0x6734, 0x0000, 0x6735, 0x6736, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6737, 0x0000, 0x0000, 0x0000, 0x6738,
+ 0x0000, 0x0000, 0x6739, 0x0000, 0x0000, 0x0000, 0x673a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x673b, 0x0000, 0x0000, 0x673c, 0x673d,
+ 0x673e, 0x0000, 0x0000, 0x673f, 0x0000, 0x6740, 0x0000, 0x6741,
+ 0x6742, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6743, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6744, 0x6745, 0x6746,
+ 0x0000, 0x6747, 0x6748, 0x0000, 0x0000, 0x0000, 0x6749, 0x674a,
+ 0x0000, 0x0000, 0x674b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x674c, 0x0000, 0x674d, 0x0000,
+ 0x0000, 0x674e, 0x674f, 0x0000, 0x0000, 0x6750, 0x6751, 0x0000,
+ 0x6752, 0x6753, 0x6754, 0x0000, 0x6755, 0x0000, 0x6756, 0x6757,
+ 0x0000, 0x6758, 0x0000, 0x0000, 0x6759, 0x675a, 0x0000, 0x675b,
+ 0x0000, 0x675c, 0x675d, 0x0000, 0x675e, 0x675f, 0x6760, 0x0000,
+ 0x6761, 0x6762, 0x0000, 0x0000, 0x6763, 0x0000, 0x0000, 0x6764,
+ 0x6765, 0x6766, 0x0000, 0x676a, 0x0000, 0x6767, 0x6768, 0x0000,
+ 0x6769, 0x676b, 0x0000, 0x0000, 0x676c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x676d,
+ 0x0000, 0x676e, 0x0000, 0x0000, 0x676f, 0x0000, 0x0000, 0x6770,
+ 0x6771, 0x0000, 0x6772, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_98[] = {
+ /* 0x9800 - 0x98ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6773,
+ 0x0000, 0x0000, 0x6774, 0x0000, 0x0000, 0x6776, 0x6777, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6778, 0x0000, 0x6779, 0x0000,
+ 0x0000, 0x6775, 0x0000, 0x0000, 0x677a, 0x0000, 0x677b, 0x0000,
+ 0x677c, 0x0000, 0x0000, 0x677d, 0x0000, 0x6828, 0x677e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6821, 0x0000, 0x0000, 0x6822, 0x6823,
+ 0x6824, 0x0000, 0x6825, 0x6826, 0x0000, 0x6827, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6829, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x682a, 0x0000, 0x0000, 0x682b,
+ 0x0000, 0x0000, 0x682c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x682d, 0x682e, 0x682f, 0x0000, 0x0000, 0x6830, 0x6831,
+ 0x0000, 0x6832, 0x6833, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6834, 0x6835, 0x0000, 0x6836, 0x6837, 0x0000,
+ 0x0000, 0x0000, 0x6838, 0x0000, 0x6839, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x683a, 0x0000, 0x683b, 0x683c, 0x0000,
+ 0x683d, 0x0000, 0x0000, 0x0000, 0x683e, 0x0000, 0x0000, 0x683f,
+ 0x6840, 0x0000, 0x6841, 0x6842, 0x0000, 0x0000, 0x0000, 0x6843,
+ 0x0000, 0x0000, 0x6844, 0x0000, 0x0000, 0x6845, 0x0000, 0x0000,
+ 0x6846, 0x0000, 0x0000, 0x0000, 0x6847, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6848, 0x0000, 0x6849, 0x0000, 0x684a, 0x684b, 0x684c,
+ 0x0000, 0x0000, 0x684d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x684e, 0x0000, 0x0000, 0x684f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_99[] = {
+ /* 0x9900 - 0x99ff */
+ 0x0000, 0x0000, 0x6850, 0x0000, 0x0000, 0x0000, 0x0000, 0x6851,
+ 0x6852, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6853, 0x0000, 0x0000, 0x0000, 0x6854, 0x6855, 0x6856,
+ 0x0000, 0x0000, 0x6857, 0x6858, 0x6859, 0x0000, 0x0000, 0x685a,
+ 0x0000, 0x0000, 0x685b, 0x0000, 0x0000, 0x0000, 0x685c, 0x685d,
+ 0x0000, 0x0000, 0x0000, 0x685e, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x685f, 0x6860, 0x6861, 0x6862, 0x6863, 0x0000, 0x0000,
+ 0x0000, 0x6864, 0x6865, 0x6866, 0x6867, 0x0000, 0x0000, 0x0000,
+ 0x6868, 0x6869, 0x0000, 0x0000, 0x0000, 0x0000, 0x686a, 0x686b,
+ 0x686c, 0x0000, 0x0000, 0x0000, 0x0000, 0x686d, 0x686e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x686f, 0x0000, 0x0000, 0x0000,
+ 0x6870, 0x6871, 0x0000, 0x6872, 0x6873, 0x0000, 0x6874, 0x6875,
+ 0x6876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6877, 0x0000, 0x6878, 0x747a, 0x6879,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x687a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x687b, 0x687c, 0x687d, 0x0000, 0x0000, 0x687e, 0x0000, 0x0000,
+ 0x0000, 0x6921, 0x6922, 0x0000, 0x0000, 0x6923, 0x0000, 0x6924,
+ 0x0000, 0x0000, 0x0000, 0x6925, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6927, 0x6928, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6929, 0x692a, 0x0000, 0x692b, 0x0000, 0x692c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x692d,
+ 0x0000, 0x0000, 0x692e, 0x692f, 0x6930, 0x0000, 0x0000, 0x0000,
+ 0x6931, 0x0000, 0x0000, 0x0000, 0x6932, 0x6933, 0x0000, 0x0000,
+ 0x0000, 0x6934, 0x0000, 0x0000, 0x0000, 0x6935, 0x6936, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_9a[] = {
+ /* 0x9a00 - 0x9aff */
+ 0x0000, 0x0000, 0x6937, 0x6938, 0x6939, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x693a, 0x693b, 0x0000, 0x0000, 0x0000,
+ 0x693c, 0x693d, 0x0000, 0x0000, 0x0000, 0x0000, 0x693e, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x693f, 0x0000,
+ 0x6940, 0x0000, 0x6941, 0x6942, 0x6943, 0x0000, 0x0000, 0x6944,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6945, 0x6946, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6947, 0x0000, 0x6948, 0x6949, 0x0000,
+ 0x694a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x694c, 0x0000, 0x0000, 0x694d, 0x0000, 0x0000, 0x694b,
+ 0x0000, 0x0000, 0x694e, 0x694f, 0x6950, 0x0000, 0x6951, 0x0000,
+ 0x0000, 0x6952, 0x0000, 0x0000, 0x6953, 0x0000, 0x6954, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6955, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6956, 0x0000, 0x6957, 0x0000, 0x6958, 0x6959,
+ 0x0000, 0x0000, 0x695a, 0x0000, 0x695b, 0x695c, 0x695d, 0x0000,
+ 0x0000, 0x695e, 0x0000, 0x695f, 0x0000, 0x0000, 0x6960, 0x6961,
+ 0x0000, 0x6962, 0x0000, 0x6963, 0x0000, 0x0000, 0x6964, 0x0000,
+ 0x6965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6966, 0x0000,
+ 0x6967, 0x0000, 0x6968, 0x0000, 0x0000, 0x6969, 0x696a, 0x696b,
+ 0x0000, 0x747b, 0x0000, 0x696c, 0x696d, 0x0000, 0x0000, 0x0000,
+ 0x696e, 0x0000, 0x0000, 0x0000, 0x696f, 0x6970, 0x0000, 0x6971,
+ 0x0000, 0x6972, 0x0000, 0x0000, 0x6973, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6974, 0x6975, 0x0000, 0x6976, 0x0000, 0x0000,
+ 0x0000, 0x6977, 0x6978, 0x0000, 0x0000, 0x6979, 0x0000, 0x697a,
+};
+
+static unsigned short const unicode_to_jisx0212_9b[] = {
+ /* 0x9b00 - 0x9bff */
+ 0x697b, 0x697c, 0x697d, 0x697e, 0x6a21, 0x6a22, 0x0000, 0x0000,
+ 0x6a23, 0x6a24, 0x0000, 0x6a25, 0x6a26, 0x6a27, 0x6a28, 0x0000,
+ 0x6a29, 0x0000, 0x6a2a, 0x0000, 0x0000, 0x0000, 0x6a2b, 0x0000,
+ 0x0000, 0x6a2c, 0x0000, 0x6a2d, 0x6a2e, 0x0000, 0x0000, 0x0000,
+ 0x6a2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a30, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6a31, 0x0000, 0x6a32, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6a33, 0x6a34, 0x6a35, 0x0000, 0x6a36,
+ 0x0000, 0x6a37, 0x6a38, 0x0000, 0x0000, 0x6a39, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6a3a, 0x0000, 0x0000, 0x6a3b, 0x6a3c, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a3d, 0x6a3e, 0x6a3f,
+ 0x0000, 0x0000, 0x0000, 0x6a40, 0x0000, 0x0000, 0x6a41, 0x0000,
+ 0x0000, 0x6a42, 0x0000, 0x6a43, 0x0000, 0x6a44, 0x6a45, 0x0000,
+ 0x6a46, 0x0000, 0x6a47, 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x0000,
+ 0x0000, 0x0000, 0x747c, 0x6a4c, 0x0000, 0x6a4d, 0x0000, 0x6a4e,
+ 0x6a4f, 0x6a50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a51,
+ 0x6a52, 0x0000, 0x0000, 0x0000, 0x6a53, 0x6a54, 0x6a55, 0x6a56,
+ 0x0000, 0x6a57, 0x6a58, 0x6a59, 0x0000, 0x6a5a, 0x0000, 0x6a5b,
+ 0x6a5c, 0x0000, 0x0000, 0x0000, 0x6a5d, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6a5e, 0x0000, 0x0000, 0x6a5f, 0x6a60, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a61, 0x6a62,
+ 0x0000, 0x6a63, 0x0000, 0x0000, 0x6a64, 0x0000, 0x0000, 0x0000,
+ 0x6a65, 0x6a66, 0x6a67, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a68,
+ 0x6a69, 0x0000, 0x0000, 0x6a6a, 0x6a6b, 0x0000, 0x6a6c, 0x6a6d,
+ 0x0000, 0x6a6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a6f,
+ 0x6a70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a71, 0x0000,
+ 0x6a72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a73,
+ 0x6a74, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a75, 0x0000, 0x6a76,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a77, 0x0000, 0x6a78,
+ 0x0000, 0x0000, 0x6a79, 0x6a7a, 0x0000, 0x0000, 0x0000, 0x6a7b,
+ 0x0000, 0x0000, 0x0000, 0x6a7c, 0x0000, 0x0000, 0x0000, 0x6a7d,
+ 0x6a7e, 0x6b21, 0x6b22, 0x0000, 0x0000, 0x6b23, 0x0000, 0x6b24,
+};
+
+static unsigned short const unicode_to_jisx0212_9c[] = {
+ /* 0x9c00 - 0x9cff */
+ 0x6b25, 0x0000, 0x6b26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b27, 0x0000, 0x0000, 0x0000, 0x6b28,
+ 0x0000, 0x6b29, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b2a, 0x0000,
+ 0x6b2b, 0x6b2c, 0x6b2d, 0x0000, 0x6b2e, 0x0000, 0x6b2f, 0x0000,
+ 0x0000, 0x0000, 0x6b30, 0x6b31, 0x0000, 0x0000, 0x6b32, 0x6b33,
+ 0x6b34, 0x6b35, 0x6b36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6b37, 0x0000, 0x0000, 0x0000, 0x6b38, 0x6b39, 0x6b3a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b3b, 0x0000, 0x0000,
+ 0x0000, 0x6b3c, 0x0000, 0x6b3d, 0x6b3e, 0x6b3f, 0x0000, 0x0000,
+ 0x0000, 0x6b40, 0x6b41, 0x0000, 0x0000, 0x0000, 0x6b42, 0x6b43,
+ 0x6b44, 0x0000, 0x0000, 0x6b45, 0x6b46, 0x0000, 0x6b47, 0x0000,
+ 0x6b48, 0x0000, 0x0000, 0x6b49, 0x6b50, 0x6b4a, 0x6b4b, 0x6b4c,
+ 0x0000, 0x0000, 0x0000, 0x6b4d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6b52, 0x6b4e, 0x6b4f, 0x6b51, 0x0000, 0x0000, 0x6b53, 0x0000,
+ 0x6b54, 0x0000, 0x6b55, 0x0000, 0x0000, 0x6b56, 0x0000, 0x6b57,
+ 0x0000, 0x0000, 0x0000, 0x6b58, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b59, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6b5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b5b,
+ 0x0000, 0x6b5c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_9d[] = {
+ /* 0x9d00 - 0x9dff */
+ 0x0000, 0x0000, 0x6b5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b5d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6b5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b60,
+ 0x6b61, 0x0000, 0x0000, 0x0000, 0x6b62, 0x6b63, 0x6b64, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b65,
+ 0x6b66, 0x0000, 0x6b67, 0x6b68, 0x6b69, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6b6a, 0x0000, 0x6b6b, 0x6b6d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6b6e, 0x6b6f, 0x0000, 0x6b6c, 0x0000, 0x6b70,
+ 0x0000, 0x0000, 0x6b71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b72, 0x6b73, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b74,
+ 0x0000, 0x0000, 0x6b76, 0x6b75, 0x0000, 0x6b77, 0x0000, 0x0000,
+ 0x0000, 0x6b78, 0x6b79, 0x6b7a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6b7b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b7c, 0x6b7d,
+ 0x0000, 0x0000, 0x0000, 0x6b7e, 0x6c21, 0x0000, 0x6c22, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6c23, 0x6c24, 0x0000, 0x6c25, 0x0000,
+ 0x0000, 0x0000, 0x6c26, 0x0000, 0x0000, 0x6c27, 0x6c28, 0x0000,
+ 0x0000, 0x0000, 0x6c29, 0x6c2a, 0x0000, 0x6c2b, 0x6c2c, 0x6c2d,
+ 0x6c2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6c2f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c30, 0x0000, 0x6c31, 0x0000, 0x6c32, 0x0000,
+ 0x0000, 0x6c33, 0x0000, 0x0000, 0x0000, 0x6c34, 0x0000, 0x0000,
+ 0x0000, 0x6c35, 0x0000, 0x0000, 0x6c36, 0x0000, 0x0000, 0x6c37,
+ 0x0000, 0x0000, 0x0000, 0x6c38, 0x0000, 0x0000, 0x0000, 0x6c39,
+ 0x0000, 0x6c3a, 0x6c3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c3c, 0x6c3d, 0x6c3e, 0x6c3f,
+ 0x0000, 0x0000, 0x6c40, 0x0000, 0x0000, 0x0000, 0x6c41, 0x6c42,
+ 0x6c43, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c44, 0x0000, 0x6c45,
+ 0x0000, 0x6c46, 0x0000, 0x6c47, 0x0000, 0x0000, 0x6c48, 0x0000,
+ 0x6c49, 0x0000, 0x0000, 0x6c4a, 0x6c4b, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c4c, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_9e[] = {
+ /* 0x9e00 - 0x9eff */
+ 0x0000, 0x0000, 0x6c4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c4f,
+ 0x0000, 0x0000, 0x6c4d, 0x0000, 0x0000, 0x0000, 0x6c50, 0x0000,
+ 0x6c51, 0x6c52, 0x6c53, 0x0000, 0x0000, 0x6c54, 0x6c55, 0x0000,
+ 0x0000, 0x6c56, 0x0000, 0x0000, 0x6c57, 0x6c58, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6c59, 0x6c5a, 0x6c5b, 0x0000, 0x0000, 0x0000,
+ 0x6c5c, 0x0000, 0x6c5d, 0x6c5e, 0x6c5f, 0x6c60, 0x0000, 0x6c61,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c62, 0x6c63,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c64, 0x0000,
+ 0x6c65, 0x0000, 0x0000, 0x6c66, 0x0000, 0x0000, 0x6c67, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c68, 0x0000, 0x0000, 0x0000,
+ 0x6c69, 0x0000, 0x0000, 0x0000, 0x6c6a, 0x0000, 0x6c6b, 0x6c6c,
+ 0x6c6d, 0x0000, 0x0000, 0x6c6e, 0x6c6f, 0x6c70, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c71, 0x0000,
+ 0x6c72, 0x0000, 0x0000, 0x6c73, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x747e, 0x0000, 0x0000, 0x0000, 0x6c74, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c75,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c76, 0x0000, 0x0000, 0x6c77,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6c78, 0x6c79, 0x6c7a, 0x0000,
+ 0x6c7b, 0x6c7c, 0x6c7d, 0x0000, 0x0000, 0x6c7e, 0x0000, 0x0000,
+ 0x6d21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d22,
+};
+
+static unsigned short const unicode_to_jisx0212_9f[] = {
+ /* 0x9f00 - 0x9fff */
+ 0x0000, 0x0000, 0x6d23, 0x6d24, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x6d25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d26,
+ 0x6d27, 0x6d28, 0x6d29, 0x0000, 0x6d2a, 0x0000, 0x6d2b, 0x6d2c,
+ 0x0000, 0x6d2d, 0x6d2e, 0x6d2f, 0x0000, 0x0000, 0x0000, 0x6d30,
+ 0x0000, 0x0000, 0x6d31, 0x0000, 0x0000, 0x0000, 0x6d32, 0x0000,
+ 0x0000, 0x0000, 0x6d33, 0x6d34, 0x0000, 0x0000, 0x0000, 0x6d35,
+ 0x0000, 0x6d36, 0x6d37, 0x0000, 0x6d38, 0x0000, 0x0000, 0x6d39,
+ 0x0000, 0x6d3a, 0x6d3b, 0x0000, 0x6d3c, 0x6d3d, 0x0000, 0x6d3e,
+ 0x0000, 0x6d3f, 0x0000, 0x6d40, 0x6d41, 0x6d42, 0x6d43, 0x6d44,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6d45, 0x0000, 0x6d46, 0x6d47, 0x6d48,
+ 0x6d49, 0x0000, 0x6d4a, 0x0000, 0x0000, 0x6d4b, 0x6d4c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6d4d, 0x6d4e, 0x0000, 0x0000, 0x0000, 0x6d4f, 0x6d50, 0x6d51,
+ 0x6d52, 0x6d53, 0x0000, 0x6d54, 0x0000, 0x6d55, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6d56, 0x0000, 0x0000, 0x6d57, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d58,
+ 0x6d59, 0x6d5a, 0x6d5b, 0x0000, 0x6d5c, 0x0000, 0x6d5d, 0x6d5e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d5f, 0x0000,
+ 0x0000, 0x6d60, 0x6d61, 0x6d62, 0x0000, 0x6d63, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_f9[] = {
+ /* 0xf900 - 0xf9ff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x7445, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x7472, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_fa[] = {
+ /* 0xfa00 - 0xfaff */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7434, 0x7437,
+ 0x7438, 0x743d, 0x7444, 0x7447, 0x7448, 0x744e, 0x744f, 0x7453,
+ 0x7455, 0x7456, 0x7457, 0x7458, 0x745a, 0x745b, 0x745e, 0x7460,
+ 0x7462, 0x7463, 0x7465, 0x7469, 0x746a, 0x746b, 0x746d, 0x746f,
+ 0x7470, 0x7473, 0x7477, 0x7478, 0x7479, 0x747d, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const unicode_to_jisx0212_ff[] = {
+ /* 0xff00 - 0xffff */
+ 0x0000, 0x0000, 0x742a, 0x0000, 0x0000, 0x0000, 0x0000, 0x7429,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+static unsigned short const * const unicode_to_jisx0212_map[0x100] = {
+ /* 0x00XX - 0x0fXX */
+ unicode_to_jisx0212_00,
+ unicode_to_jisx0212_01,
+ unicode_to_jisx0212_02,
+ unicode_to_jisx0212_03,
+ unicode_to_jisx0212_04,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x10XX - 0x1fXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x20XX - 0x2fXX */
+ 0,
+ unicode_to_jisx0212_21,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x30XX - 0x3fXX */
+ 0, 0,
+ unicode_to_jisx0212_32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x40XX - 0x4fXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ unicode_to_jisx0212_4e,
+ unicode_to_jisx0212_4f,
+ /* 0x50XX - 0x5fXX */
+ unicode_to_jisx0212_50,
+ unicode_to_jisx0212_51,
+ unicode_to_jisx0212_52,
+ unicode_to_jisx0212_53,
+ unicode_to_jisx0212_54,
+ unicode_to_jisx0212_55,
+ unicode_to_jisx0212_56,
+ unicode_to_jisx0212_57,
+ unicode_to_jisx0212_58,
+ unicode_to_jisx0212_59,
+ unicode_to_jisx0212_5a,
+ unicode_to_jisx0212_5b,
+ unicode_to_jisx0212_5c,
+ unicode_to_jisx0212_5d,
+ unicode_to_jisx0212_5e,
+ unicode_to_jisx0212_5f,
+ /* 0x60XX - 0x6fXX */
+ unicode_to_jisx0212_60,
+ unicode_to_jisx0212_61,
+ unicode_to_jisx0212_62,
+ unicode_to_jisx0212_63,
+ unicode_to_jisx0212_64,
+ unicode_to_jisx0212_65,
+ unicode_to_jisx0212_66,
+ unicode_to_jisx0212_67,
+ unicode_to_jisx0212_68,
+ unicode_to_jisx0212_69,
+ unicode_to_jisx0212_6a,
+ unicode_to_jisx0212_6b,
+ unicode_to_jisx0212_6c,
+ unicode_to_jisx0212_6d,
+ unicode_to_jisx0212_6e,
+ unicode_to_jisx0212_6f,
+ /* 0x70XX - 0x7fXX */
+ unicode_to_jisx0212_70,
+ unicode_to_jisx0212_71,
+ unicode_to_jisx0212_72,
+ unicode_to_jisx0212_73,
+ unicode_to_jisx0212_74,
+ unicode_to_jisx0212_75,
+ unicode_to_jisx0212_76,
+ unicode_to_jisx0212_77,
+ unicode_to_jisx0212_78,
+ unicode_to_jisx0212_79,
+ unicode_to_jisx0212_7a,
+ unicode_to_jisx0212_7b,
+ unicode_to_jisx0212_7c,
+ unicode_to_jisx0212_7d,
+ unicode_to_jisx0212_7e,
+ unicode_to_jisx0212_7f,
+ /* 0x80XX - 0x8fXX */
+ unicode_to_jisx0212_80,
+ unicode_to_jisx0212_81,
+ unicode_to_jisx0212_82,
+ unicode_to_jisx0212_83,
+ unicode_to_jisx0212_84,
+ unicode_to_jisx0212_85,
+ unicode_to_jisx0212_86,
+ unicode_to_jisx0212_87,
+ unicode_to_jisx0212_88,
+ unicode_to_jisx0212_89,
+ unicode_to_jisx0212_8a,
+ unicode_to_jisx0212_8b,
+ unicode_to_jisx0212_8c,
+ unicode_to_jisx0212_8d,
+ unicode_to_jisx0212_8e,
+ unicode_to_jisx0212_8f,
+ /* 0x90XX - 0x9fXX */
+ unicode_to_jisx0212_90,
+ unicode_to_jisx0212_91,
+ unicode_to_jisx0212_92,
+ unicode_to_jisx0212_93,
+ unicode_to_jisx0212_94,
+ unicode_to_jisx0212_95,
+ unicode_to_jisx0212_96,
+ unicode_to_jisx0212_97,
+ unicode_to_jisx0212_98,
+ unicode_to_jisx0212_99,
+ unicode_to_jisx0212_9a,
+ unicode_to_jisx0212_9b,
+ unicode_to_jisx0212_9c,
+ unicode_to_jisx0212_9d,
+ unicode_to_jisx0212_9e,
+ unicode_to_jisx0212_9f,
+ /* 0xa0XX - 0xafXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0XX - 0xbfXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0XX - 0xcfXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0XX - 0xdfXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0XX - 0xefXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0XX - 0xffXX */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ unicode_to_jisx0212_f9,
+ unicode_to_jisx0212_fa,
+ 0, 0, 0, 0,
+ unicode_to_jisx0212_ff,
+};
+
+#endif
+
+#ifdef USE_JISX0212
+static uint unicode11ToJisx0212(uint h, uint l)
+{
+ unsigned short const *table;
+
+ table = unicode_to_jisx0212_map[h];
+ if (table != 0) {
+ return table[l];
+ }
+ return 0x0000;
+}
+#else
+static uint unicode11ToJisx0212(uint h, uint l)
+{
+ return 0x0000;
+}
+#endif
+
+static unsigned short const sjis208ibmvdc_unicode[] = {
+ /*0xfa40 -0xfafc*/
+ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+ 0x2178, 0x2179, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165,
+ 0x2166, 0x2167, 0x2168, 0x2169, 0xffe2, 0xffe4, 0xff07, 0xff02,
+ 0x3231, 0x2116, 0x2121, 0x2235, 0x7e8a, 0x891c, 0x9348, 0x9288,
+ 0x84dc, 0x4fc9, 0x70bb, 0x6631, 0x68c8, 0x92f9, 0x66fb, 0x5f45,
+ 0x4e28, 0x4ee1, 0x4efc, 0x4f00, 0x4f03, 0x4f39, 0x4f56, 0x4f92,
+ 0x4f8a, 0x4f9a, 0x4f94, 0x4fcd, 0x5040, 0x5022, 0x4fff, 0x501e,
+ 0x5046, 0x5070, 0x5042, 0x5094, 0x50f4, 0x50d8, 0x514a, 0x30fb,
+ 0x5164, 0x519d, 0x51be, 0x51ec, 0x5215, 0x529c, 0x52a6, 0x52c0,
+ 0x52db, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53b2, 0x53dd,
+ 0xfa0e, 0x549c, 0x548a, 0x54a9, 0x54ff, 0x5586, 0x5759, 0x5765,
+ 0x57ac, 0x57c8, 0x57c7, 0xfa0f, 0xfa10, 0x589e, 0x58b2, 0x590b,
+ 0x5953, 0x595b, 0x595d, 0x5963, 0x59a4, 0x59ba, 0x5b56, 0x5bc0,
+ 0x752f, 0x5bd8, 0x5bec, 0x5c1e, 0x5ca6, 0x5cba, 0x5cf5, 0x5d27,
+ 0x5d53, 0xfa11, 0x5d42, 0x5d6d, 0x5db8, 0x5db9, 0x5dd0, 0x5f21,
+ 0x5f34, 0x5f67, 0x5fb7, 0x5fde, 0x605d, 0x6085, 0x608a, 0x60de,
+ 0x60d5, 0x6120, 0x60f2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213,
+ 0x62a6, 0x63f5, 0x6460, 0x649d, 0x64ce, 0x654e, 0x6600, 0x6615,
+ 0x663b, 0x6609, 0x662e, 0x661e, 0x6624, 0x6665, 0x6657, 0x6659,
+ 0xfa12, 0x6673, 0x6699, 0x66a0, 0x66b2, 0x66bf, 0x66fa, 0x670e,
+ 0xf929, 0x6766, 0x67bb, 0x6852, 0x67c0, 0x6801, 0x6844, 0x68cf,
+ 0xfa13, 0x6968, 0xfa14, 0x6998, 0x69e2, 0x6a30, 0x6a6b, 0x6a46,
+ 0x6a73, 0x6a7e, 0x6ae2, 0x6ae4, 0x6bd6, 0x6c3f, 0x6c5c, 0x6c86,
+ 0x6c6f, 0x6cda, 0x6d04, 0x6d87, 0x6d6f,
+ /*0xfb40 -0xfbfc*/
+ 0x6d96, 0x6dac, 0x6dcf, 0x6df8, 0x6df2, 0x6dfc, 0x6e39, 0x6e5c,
+ 0x6e27, 0x6e3c, 0x6ebf, 0x6f88, 0x6fb5, 0x6ff5, 0x7005, 0x7007,
+ 0x7028, 0x7085, 0x70ab, 0x710f, 0x7104, 0x715c, 0x7146, 0x7147,
+ 0xfa15, 0x71c1, 0x71fe, 0x72b1, 0x72be, 0x7324, 0xfa16, 0x7377,
+ 0x73bd, 0x73c9, 0x73d6, 0x73e3, 0x73d2, 0x7407, 0x73f5, 0x7426,
+ 0x742a, 0x7429, 0x742e, 0x7462, 0x7489, 0x749f, 0x7501, 0x756f,
+ 0x7682, 0x769c, 0x769e, 0x769b, 0x76a6, 0xfa17, 0x7746, 0x52af,
+ 0x7821, 0x784e, 0x7864, 0x787a, 0x7930, 0xfa18, 0xfa19, 0x30fb,
+ 0xfa1a, 0x7994, 0xfa1b, 0x799b, 0x7ad1, 0x7ae7, 0xfa1c, 0x7aeb,
+ 0x7b9e, 0xfa1d, 0x7d48, 0x7d5c, 0x7db7, 0x7da0, 0x7dd6, 0x7e52,
+ 0x7f47, 0x7fa1, 0xfa1e, 0x8301, 0x8362, 0x837f, 0x83c7, 0x83f6,
+ 0x8448, 0x84b4, 0x8553, 0x8559, 0x856b, 0xfa1f, 0x85b0, 0xfa20,
+ 0xfa21, 0x8807, 0x88f5, 0x8a12, 0x8a37, 0x8a79, 0x8aa7, 0x8abe,
+ 0x8adf, 0xfa22, 0x8af6, 0x8b53, 0x8b7f, 0x8cf0, 0x8cf4, 0x8d12,
+ 0x8d76, 0xfa23, 0x8ecf, 0xfa24, 0xfa25, 0x9067, 0x90de, 0xfa26,
+ 0x9115, 0x9127, 0x91da, 0x91d7, 0x91de, 0x91ed, 0x91ee, 0x91e4,
+ 0x91e5, 0x9206, 0x9210, 0x920a, 0x923a, 0x9240, 0x923c, 0x924e,
+ 0x9259, 0x9251, 0x9239, 0x9267, 0x92a7, 0x9277, 0x9278, 0x92e7,
+ 0x92d7, 0x92d9, 0x92d0, 0xfa27, 0x92d5, 0x92e0, 0x92d3, 0x9325,
+ 0x9321, 0x92fb, 0xfa28, 0x931e, 0x92ff, 0x931d, 0x9302, 0x9370,
+ 0x9357, 0x93a4, 0x93c6, 0x93de, 0x93f8, 0x9431, 0x9445, 0x9448,
+ 0x9592, 0xf9dc, 0xfa29, 0x969d, 0x96af, 0x9733, 0x973b, 0x9743,
+ 0x974d, 0x974f, 0x9751, 0x9755, 0x9857, 0x9865, 0xfa2a, 0xfa2b,
+ 0x9927, 0xfa2c, 0x999e, 0x9a4e, 0x9ad9,
+ /*0xfc40 -0xfc4b*/
+ 0x9adc, 0x9b75, 0x9b72, 0x9b8f, 0x9bb1, 0x9bbb, 0x9c00, 0x9d70,
+ 0x9d6b, 0xfa2d, 0x9e19, 0x9ed1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+uint QJpUnicodeConv::sjisibmvdcToUnicode(uint h, uint l) const
+{
+ if (((rule & IBM_VDC) || (rule & Microsoft_CP932)) && IsSjisIBMVDCChar1(h))
+ return sjis208ibmvdc_unicode[((h - 0x00fa)*189 + (l-0x0040))];
+ else
+ return 0;
+}
+
+uint QJpUnicodeConv::unicodeToSjisibmvdc(uint h, uint l) const
+{
+ if ((rule & IBM_VDC) || (rule & Microsoft_CP932)) {
+ uint u = (h<<8) | l;
+ //since there is no direct mapping, do a linear search
+ for (uint i =0; i<sizeof(sjis208ibmvdc_unicode)/sizeof(short) ; i++) {
+ //the table has zeros after 0xfc4b
+ if (!sjis208ibmvdc_unicode[i])
+ return 0;
+ if (u==sjis208ibmvdc_unicode[i]){
+ return (((0x00fa +(i/189))<<8) | (0x0040+(i%189)));
+ }
+ }
+ }
+ return 0;
+}
+
+static unsigned short const cp932_87_unicode[] = {
+ /*0x8740 -0x879c*/
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
+ 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f,
+ 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162, 0x2163,
+ 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0000, 0x3349,
+ 0x3314, 0x3322, 0x334d, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351,
+ 0x3357, 0x330d, 0x3326, 0x3323, 0x332b, 0x334a, 0x333b, 0x339c,
+ 0x339d, 0x339e, 0x338e, 0x338f, 0x33c4, 0x33a1, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x337b, 0x0000,
+ 0x301d, 0x301f, 0x2116, 0x33cd, 0x2121, 0x32a4, 0x32a5, 0x32a6,
+ 0x32a7, 0x32a8, 0x3231, 0x3232, 0x3239, 0x337e, 0x337d, 0x337c,
+ 0x2252, 0x2261, 0x222b, 0x222e, 0x2211, 0x221a, 0x22a5, 0x2220,
+ 0x221f, 0x22bf, 0x2235, 0x2229, 0x222a
+};
+
+static unsigned short const cp932_ed_ee_unicode[] = {
+ /*0xed40-0xedfc*/
+ 0x7e8a, 0x891c, 0x9348, 0x9288, 0x84dc, 0x4fc9, 0x70bb, 0x6631,
+ 0x68c8, 0x92f9, 0x66fb, 0x5f45, 0x4e28, 0x4ee1, 0x4efc, 0x4f00,
+ 0x4f03, 0x4f39, 0x4f56, 0x4f92, 0x4f8a, 0x4f9a, 0x4f94, 0x4fcd,
+ 0x5040, 0x5022, 0x4fff, 0x501e, 0x5046, 0x5070, 0x5042, 0x5094,
+ 0x50f4, 0x50d8, 0x514a, 0x5164, 0x519d, 0x51be, 0x51ec, 0x5215,
+ 0x529c, 0x52a6, 0x52c0, 0x52db, 0x5300, 0x5307, 0x5324, 0x5372,
+ 0x5393, 0x53b2, 0x53dd, 0xfa0e, 0x549c, 0x548a, 0x54a9, 0x54ff,
+ 0x5586, 0x5759, 0x5765, 0x57ac, 0x57c8, 0x57c7, 0xfa0f, 0x0000,
+ 0xfa10, 0x589e, 0x58b2, 0x590b, 0x5953, 0x595b, 0x595d, 0x5963,
+ 0x59a4, 0x59ba, 0x5b56, 0x5bc0, 0x752f, 0x5bd8, 0x5bec, 0x5c1e,
+ 0x5ca6, 0x5cba, 0x5cf5, 0x5d27, 0x5d53, 0xfa11, 0x5d42, 0x5d6d,
+ 0x5db8, 0x5db9, 0x5dd0, 0x5f21, 0x5f34, 0x5f67, 0x5fb7, 0x5fde,
+ 0x605d, 0x6085, 0x608a, 0x60de, 0x60d5, 0x6120, 0x60f2, 0x6111,
+ 0x6137, 0x6130, 0x6198, 0x6213, 0x62a6, 0x63f5, 0x6460, 0x649d,
+ 0x64ce, 0x654e, 0x6600, 0x6615, 0x663b, 0x6609, 0x662e, 0x661e,
+ 0x6624, 0x6665, 0x6657, 0x6659, 0xfa12, 0x6673, 0x6699, 0x66a0,
+ 0x66b2, 0x66bf, 0x66fa, 0x670e, 0xf929, 0x6766, 0x67bb, 0x6852,
+ 0x67c0, 0x6801, 0x6844, 0x68cf, 0xfa13, 0x6968, 0xfa14, 0x6998,
+ 0x69e2, 0x6a30, 0x6a6b, 0x6a46, 0x6a73, 0x6a7e, 0x6ae2, 0x6ae4,
+ 0x6bd6, 0x6c3f, 0x6c5c, 0x6c86, 0x6c6f, 0x6cda, 0x6d04, 0x6d87,
+ 0x6d6f, 0x6d96, 0x6dac, 0x6dcf, 0x6df8, 0x6df2, 0x6dfc, 0x6e39,
+ 0x6e5c, 0x6e27, 0x6e3c, 0x6ebf, 0x6f88, 0x6fb5, 0x6ff5, 0x7005,
+ 0x7007, 0x7028, 0x7085, 0x70ab, 0x710f, 0x7104, 0x715c, 0x7146,
+ 0x7147, 0xfa15, 0x71c1, 0x71fe, 0x72b1,
+ /*0xee40-0xeefc*/
+ 0x72be, 0x7324, 0xfa16, 0x7377, 0x73bd, 0x73c9, 0x73d6, 0x73e3,
+ 0x73d2, 0x7407, 0x73f5, 0x7426, 0x742a, 0x7429, 0x742e, 0x7462,
+ 0x7489, 0x749f, 0x7501, 0x756f, 0x7682, 0x769c, 0x769e, 0x769b,
+ 0x76a6, 0xfa17, 0x7746, 0x52af, 0x7821, 0x784e, 0x7864, 0x787a,
+ 0x7930, 0xfa18, 0xfa19, 0xfa1a, 0x7994, 0xfa1b, 0x799b, 0x7ad1,
+ 0x7ae7, 0xfa1c, 0x7aeb, 0x7b9e, 0xfa1d, 0x7d48, 0x7d5c, 0x7db7,
+ 0x7da0, 0x7dd6, 0x7e52, 0x7f47, 0x7fa1, 0xfa1e, 0x8301, 0x8362,
+ 0x837f, 0x83c7, 0x83f6, 0x8448, 0x84b4, 0x8553, 0x8559, 0x0000,
+ 0x856b, 0xfa1f, 0x85b0, 0xfa20, 0xfa21, 0x8807, 0x88f5, 0x8a12,
+ 0x8a37, 0x8a79, 0x8aa7, 0x8abe, 0x8adf, 0xfa22, 0x8af6, 0x8b53,
+ 0x8b7f, 0x8cf0, 0x8cf4, 0x8d12, 0x8d76, 0xfa23, 0x8ecf, 0xfa24,
+ 0xfa25, 0x9067, 0x90de, 0xfa26, 0x9115, 0x9127, 0x91da, 0x91d7,
+ 0x91de, 0x91ed, 0x91ee, 0x91e4, 0x91e5, 0x9206, 0x9210, 0x920a,
+ 0x923a, 0x9240, 0x923c, 0x924e, 0x9259, 0x9251, 0x9239, 0x9267,
+ 0x92a7, 0x9277, 0x9278, 0x92e7, 0x92d7, 0x92d9, 0x92d0, 0xfa27,
+ 0x92d5, 0x92e0, 0x92d3, 0x9325, 0x9321, 0x92fb, 0xfa28, 0x931e,
+ 0x92ff, 0x931d, 0x9302, 0x9370, 0x9357, 0x93a4, 0x93c6, 0x93de,
+ 0x93f8, 0x9431, 0x9445, 0x9448, 0x9592, 0xf9dc, 0xfa29, 0x969d,
+ 0x96af, 0x9733, 0x973b, 0x9743, 0x974d, 0x974f, 0x9751, 0x9755,
+ 0x9857, 0x9865, 0xfa2a, 0xfa2b, 0x9927, 0xfa2c, 0x999e, 0x9a4e,
+ 0x9ad9, 0x9adc, 0x9b75, 0x9b72, 0x9b8f, 0x9bb1, 0x9bbb, 0x9c00,
+ 0x9d70, 0x9d6b, 0xfa2d, 0x9e19, 0x9ed1, 0x0000, 0x0000, 0x2170,
+ 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178,
+ 0x2179, 0xffe2, 0xffe4, 0xff07, 0xff02
+};
+
+uint QJpUnicodeConv::cp932ToUnicode(uint h, uint l) const
+{
+ if (rule & Microsoft_CP932) {
+ if (h == 0x0087 && (l >= 0x0040 && l <= 0x009c))
+ return cp932_87_unicode[l-0x0040];
+ else if ((h == 0x00ed || h == 0x00ee) && (l >= 0x0040 && l <= 0x00fc))
+ return cp932_ed_ee_unicode[((h - 0x00ed)*189 + (l-0x0040))];
+ }
+ return 0;
+}
+
+uint QJpUnicodeConv::unicodeToCp932(uint h, uint l) const
+{
+ if ((rule & Microsoft_CP932)) {
+ uint u = (h<<8) | l;
+ //since there is no direct mapping, do a linear search
+ for (uint i =0; i<sizeof(cp932_87_unicode)/sizeof(short) ; i++) {
+ //the table has zeros for some characters
+ if (!cp932_87_unicode[i])
+ return 0;
+ if (u == cp932_87_unicode[i]){
+ return ((0x0087<<8) | (0x0040+i));
+ }
+ }
+ for (uint j =0; j<sizeof(cp932_ed_ee_unicode)/sizeof(short) ; j++) {
+ if (!cp932_ed_ee_unicode[j])
+ return 0;
+ if (u==cp932_ed_ee_unicode[j]){
+ return (((0x00ed +(j/189))<<8) | (0x0040+(j%189)));
+ }
+ }
+ }
+ return 0;
+}
+
+// and now for the inlines:
+
+/*! \fn uint QJpUnicodeConv::asciiToUnicode (uint ascii) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::jisx0201ToUnicode (uint jis) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::jisx0201LatinToUnicode (uint jis) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::jisx0201KanaToUnicode (uint jis) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::jisx0208ToUnicode (uint jis) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::jisx0212ToUnicode (uint jis) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToAscii (uint unicode) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToJisx0201 (uint unicode) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToJisx0201Latin (uint unicode) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToJisx0201Kana (uint unicode) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToJisx0208 (uint unicode) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToJisx0212 (uint unicode) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::sjisToUnicode (uint sjis) const
+
+\internal
+*/
+
+/*! \fn uint QJpUnicodeConv::unicodeToSjis (uint unicode) const
+
+\internal
+*/
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/jp/qjpunicode.h b/src/plugins/codecs/jp/qjpunicode.h
new file mode 100644
index 0000000000..995f105ea9
--- /dev/null
+++ b/src/plugins/codecs/jp/qjpunicode.h
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission,
+// and the grateful thanks of the Qt team.
+
+/*
+ * Copyright (C) 1999 Serika Kurusugawa, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef QJPUNICODE_H
+#define QJPUNICODE_H
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+class QJpUnicodeConv {
+public:
+ virtual ~QJpUnicodeConv() {}
+ enum Rules {
+ // "ASCII" is ANSI X.3.4-1986, a.k.a. US-ASCII here.
+ Default = 0x0000,
+
+ Unicode = 0x0001,
+ Unicode_JISX0201 = 0x0001,
+ Unicode_ASCII = 0x0002,
+ JISX0221_JISX0201 = 0x0003,
+ JISX0221_ASCII = 0x0004,
+ Sun_JDK117 = 0x0005,
+ Microsoft_CP932 = 0x0006,
+
+ NEC_VDC = 0x0100, // NEC Vender Defined Char
+ UDC = 0x0200, // User Defined Char
+ IBM_VDC = 0x0400 // IBM Vender Defined Char
+ };
+ static QJpUnicodeConv *newConverter(int rule);
+
+ virtual uint asciiToUnicode(uint h, uint l) const;
+ /*virtual*/ uint jisx0201ToUnicode(uint h, uint l) const;
+ virtual uint jisx0201LatinToUnicode(uint h, uint l) const;
+ /*virtual*/ uint jisx0201KanaToUnicode(uint h, uint l) const;
+ virtual uint jisx0208ToUnicode(uint h, uint l) const;
+ virtual uint jisx0212ToUnicode(uint h, uint l) const;
+
+ uint asciiToUnicode(uint ascii) const {
+ return asciiToUnicode((ascii & 0xff00) >> 8, (ascii & 0x00ff));
+ }
+ uint jisx0201ToUnicode(uint jis) const {
+ return jisx0201ToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff));
+ }
+ uint jisx0201LatinToUnicode(uint jis) const {
+ return jisx0201LatinToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff));
+ }
+ uint jisx0201KanaToUnicode(uint jis) const {
+ return jisx0201KanaToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff));
+ }
+ uint jisx0208ToUnicode(uint jis) const {
+ return jisx0208ToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff));
+ }
+ uint jisx0212ToUnicode(uint jis) const {
+ return jisx0212ToUnicode((jis & 0xff00) >> 8, (jis & 0x00ff));
+ }
+
+ virtual uint unicodeToAscii(uint h, uint l) const;
+ /*virtual*/ uint unicodeToJisx0201(uint h, uint l) const;
+ virtual uint unicodeToJisx0201Latin(uint h, uint l) const;
+ /*virtual*/ uint unicodeToJisx0201Kana(uint h, uint l) const;
+ virtual uint unicodeToJisx0208(uint h, uint l) const;
+ virtual uint unicodeToJisx0212(uint h, uint l) const;
+
+ uint unicodeToAscii(uint unicode) const {
+ return unicodeToAscii((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+ uint unicodeToJisx0201(uint unicode) const {
+ return unicodeToJisx0201((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+ uint unicodeToJisx0201Latin(uint unicode) const {
+ return unicodeToJisx0201Latin((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+ uint unicodeToJisx0201Kana(uint unicode) const {
+ return unicodeToJisx0201Kana((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+ uint unicodeToJisx0208(uint unicode) const {
+ return unicodeToJisx0208((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+ uint unicodeToJisx0212(uint unicode) const {
+ return unicodeToJisx0212((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+
+ uint sjisToUnicode(uint h, uint l) const;
+ uint unicodeToSjis(uint h, uint l) const;
+ uint sjisibmvdcToUnicode(uint h, uint l) const;
+ uint unicodeToSjisibmvdc(uint h, uint l) const;
+ uint cp932ToUnicode(uint h, uint l) const;
+ uint unicodeToCp932(uint h, uint l) const;
+
+ uint sjisToUnicode(uint sjis) const {
+ return sjisToUnicode((sjis & 0xff00) >> 8, (sjis & 0x00ff));
+ }
+ uint unicodeToSjis(uint unicode) const {
+ return unicodeToSjis((unicode & 0xff00) >> 8, (unicode & 0x00ff));
+ }
+
+protected:
+ explicit QJpUnicodeConv(int r) : rule(r) {}
+
+private:
+ int rule;
+};
+
+QT_END_NAMESPACE
+
+#endif // QJPUNICODE_H
diff --git a/src/plugins/codecs/jp/qsjiscodec.cpp b/src/plugins/codecs/jp/qsjiscodec.cpp
new file mode 100644
index 0000000000..49190d310f
--- /dev/null
+++ b/src/plugins/codecs/jp/qsjiscodec.cpp
@@ -0,0 +1,227 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission,
+// and the grateful thanks of the Qt team.
+
+/*! \class QSjisCodec
+ \reentrant
+ \internal
+*/
+
+#include "qsjiscodec.h"
+#include "qlist.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+enum {
+ Esc = 0x1b
+};
+
+#define IsKana(c) (((c) >= 0xa1) && ((c) <= 0xdf))
+#define IsSjisChar1(c) ((((c) >= 0x81) && ((c) <= 0x9f)) || \
+ (((c) >= 0xe0) && ((c) <= 0xfc)))
+#define IsSjisChar2(c) (((c) >= 0x40) && ((c) != 0x7f) && ((c) <= 0xfc))
+#define IsUserDefinedChar1(c) (((c) >= 0xf0) && ((c) <= 0xfc))
+
+#define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar(QChar::ReplacementCharacter))
+
+/*!
+ Creates a Shift-JIS codec. Note that this is done automatically by
+ the QApplication, you do not need construct your own.
+*/
+QSjisCodec::QSjisCodec() : conv(QJpUnicodeConv::newConverter(QJpUnicodeConv::Default))
+{
+}
+
+
+/*!
+ Destroys the Shift-JIS codec.
+*/
+QSjisCodec::~QSjisCodec()
+{
+ delete (QJpUnicodeConv*)conv;
+ conv = 0;
+}
+
+
+QByteArray QSjisCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i = 0; i < len; i++) {
+ QChar ch = uc[i];
+ uint j;
+ if (ch.row() == 0x00 && ch.cell() < 0x80) {
+ // ASCII
+ *cursor++ = ch.cell();
+ } else if ((j = conv->unicodeToJisx0201(ch.row(), ch.cell())) != 0) {
+ // JIS X 0201 Latin or JIS X 0201 Kana
+ *cursor++ = j;
+ } else if ((j = conv->unicodeToSjis(ch.row(), ch.cell())) != 0) {
+ // JIS X 0208
+ *cursor++ = (j >> 8);
+ *cursor++ = (j & 0xff);
+ } else if ((j = conv->unicodeToSjisibmvdc(ch.row(), ch.cell())) != 0) {
+ // JIS X 0208 IBM VDC
+ *cursor++ = (j >> 8);
+ *cursor++ = (j & 0xff);
+ } else if ((j = conv->unicodeToCp932(ch.row(), ch.cell())) != 0) {
+ // CP932 (for lead bytes 87, ee & ed)
+ *cursor++ = (j >> 8);
+ *cursor++ = (j & 0xff);
+ } else if ((j = conv->unicodeToJisx0212(ch.row(), ch.cell())) != 0) {
+ // JIS X 0212 (can't be encoded in ShiftJIS !)
+ *cursor++ = 0x81; // white square
+ *cursor++ = 0xa0; // white square
+ } else {
+ // Error
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (const uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+QString QSjisCodec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[1] = {0};
+ int nbuf = 0;
+ QChar replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ }
+ int invalid = 0;
+ uint u= 0;
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80 || IsKana(ch)) {
+ // JIS X 0201 Latin or JIS X 0201 Kana
+ u = conv->jisx0201ToUnicode(ch);
+ result += QValidChar(u);
+ } else if (IsSjisChar1(ch)) {
+ // JIS X 0208
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ break;
+ case 1:
+ // JIS X 0208
+ if (IsSjisChar2(ch)) {
+ if ((u = conv->sjisibmvdcToUnicode(buf[0], ch))) {
+ result += QValidChar(u);
+ } else if ((u = conv->cp932ToUnicode(buf[0], ch))) {
+ result += QValidChar(u);
+ }
+ else if (IsUserDefinedChar1(buf[0])) {
+ result += QChar::ReplacementCharacter;
+ } else {
+ u = conv->sjisToUnicode(buf[0], ch);
+ result += QValidChar(u);
+ }
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+
+int QSjisCodec::_mibEnum()
+{
+ return 17;
+}
+
+QByteArray QSjisCodec::_name()
+{
+ return "Shift_JIS";
+}
+
+/*!
+ Returns the codec's mime name.
+*/
+QList<QByteArray> QSjisCodec::_aliases()
+{
+ QList<QByteArray> list;
+ list << "SJIS" // Qt 3 compat
+ << "MS_Kanji";
+ return list;
+}
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/jp/qsjiscodec.h b/src/plugins/codecs/jp/qsjiscodec.h
new file mode 100644
index 0000000000..263b4d509c
--- /dev/null
+++ b/src/plugins/codecs/jp/qsjiscodec.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Serika Kurusugawa
+// a.k.a. Junji Takagi, and is included in Qt with the author's permission,
+// and the grateful thanks of the Qt team.
+
+/*
+ * Copyright (C) 1999 Serika Kurusugawa, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef QSJISCODEC_H
+#define QSJISCODEC_H
+
+#include "qjpunicode.h"
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+class QSjisCodec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases();
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+
+ QSjisCodec();
+ ~QSjisCodec();
+
+protected:
+ const QJpUnicodeConv *conv;
+};
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
+
+#endif // QSJISCODEC_H
diff --git a/src/plugins/codecs/kr/cp949codetbl.h b/src/plugins/codecs/kr/cp949codetbl.h
new file mode 100644
index 0000000000..61643b6364
--- /dev/null
+++ b/src/plugins/codecs/kr/cp949codetbl.h
@@ -0,0 +1,632 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+static const unsigned short cp949_icode_to_unicode[] = {
+0xac02, 0xac03, 0xac05, 0xac06, 0xac0b, 0xac0c, 0xac0d, 0xac0e, 0xac0f, 0xac18, 0xac1e, 0xac1f, 0xac21, 0xac22, 0xac23,
+0xac25, 0xac26, 0xac27, 0xac28, 0xac29, 0xac2a, 0xac2b, 0xac2e, 0xac32, 0xac33, 0xac34, 0xac35, 0xac36, 0xac37, 0xac3a,
+0xac3b, 0xac3d, 0xac3e, 0xac3f, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, 0xac4a, 0xac4c,
+0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac55, 0xac56, 0xac57, 0xac59, 0xac5a, 0xac5b, 0xac5d, 0xac5e, 0xac5f,
+0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e,
+0xac6f, 0xac72, 0xac73, 0xac75, 0xac76, 0xac79, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac7f, 0xac82, 0xac87, 0xac88, 0xac8d,
+0xac8e, 0xac8f, 0xac91, 0xac92, 0xac93, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9e, 0xaca2, 0xaca3,
+0xaca4, 0xaca5, 0xaca6, 0xaca7, 0xacab, 0xacad, 0xacae, 0xacb1, 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, 0xacba,
+0xacbe, 0xacbf, 0xacc0, 0xacc2, 0xacc3, 0xacc5, 0xacc6, 0xacc7, 0xacc9, 0xacca, 0xaccb, 0xaccd, 0xacce, 0xaccf, 0xacd0,
+0xacd1, 0xacd2, 0xacd3, 0xacd4, 0xacd6, 0xacd8, 0xacd9, 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, 0xace2, 0xace3,
+0xace5, 0xace6, 0xace9, 0xaceb, 0xaced, 0xacee, 0xacf2, 0xacf4, 0xacf7, 0xacf8, 0xacf9, 0xacfa, 0xacfb, 0xacfe, 0xacff,
+0xad01, 0xad02, 0xad03, 0xad05, 0xad07, 0xad08, 0xad09, 0xad0a, 0xad0b, 0xad0e, 0xad10, 0xad12, 0xad13, 0xad14, 0xad15,
+0xad16, 0xad17, 0xad19, 0xad1a, 0xad1b, 0xad1d, 0xad1e, 0xad1f, 0xad21, 0xad22, 0xad23, 0xad24, 0xad25, 0xad26, 0xad27,
+0xad28, 0xad2a, 0xad2b, 0xad2e, 0xad2f, 0xad30, 0xad31, 0xad32, 0xad33, 0xad36, 0xad37, 0xad39, 0xad3a, 0xad3b, 0xad3d,
+0xad3e, 0xad3f, 0xad40, 0xad41, 0xad42, 0xad43, 0xad46, 0xad48, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad51,
+0xad52, 0xad53, 0xad55, 0xad56, 0xad57, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad62, 0xad64,
+0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6e, 0xad6f, 0xad71, 0xad72, 0xad77, 0xad78, 0xad79, 0xad7a,
+0xad7e, 0xad80, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad8a, 0xad8b, 0xad8d, 0xad8e, 0xad8f, 0xad91, 0xad92, 0xad93,
+0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9e, 0xad9f, 0xada0, 0xada1, 0xada2, 0xada3, 0xada5,
+0xada6, 0xada7, 0xada8, 0xada9, 0xadaa, 0xadab, 0xadac, 0xadad, 0xadae, 0xadaf, 0xadb0, 0xadb1, 0xadb2, 0xadb3, 0xadb4,
+0xadb5, 0xadb6, 0xadb8, 0xadb9, 0xadba, 0xadbb, 0xadbc, 0xadbd, 0xadbe, 0xadbf, 0xadc2, 0xadc3, 0xadc5, 0xadc6, 0xadc7,
+0xadc9, 0xadca, 0xadcb, 0xadcc, 0xadcd, 0xadce, 0xadcf, 0xadd2, 0xadd4, 0xadd5, 0xadd6, 0xadd7, 0xadd8, 0xadd9, 0xadda,
+0xaddb, 0xaddd, 0xadde, 0xaddf, 0xade1, 0xade2, 0xade3, 0xade5, 0xade6, 0xade7, 0xade8, 0xade9, 0xadea, 0xadeb, 0xadec,
+0xaded, 0xadee, 0xadef, 0xadf0, 0xadf1, 0xadf2, 0xadf3, 0xadf4, 0xadf5, 0xadf6, 0xadf7, 0xadfa, 0xadfb, 0xadfd, 0xadfe,
+0xae02, 0xae03, 0xae04, 0xae05, 0xae06, 0xae07, 0xae0a, 0xae0c, 0xae0e, 0xae0f, 0xae10, 0xae11, 0xae12, 0xae13, 0xae15,
+0xae16, 0xae17, 0xae18, 0xae19, 0xae1a, 0xae1b, 0xae1c, 0xae1d, 0xae1e, 0xae1f, 0xae20, 0xae21, 0xae22, 0xae23, 0xae24,
+0xae25, 0xae26, 0xae27, 0xae28, 0xae29, 0xae2a, 0xae2b, 0xae2c, 0xae2d, 0xae2e, 0xae2f, 0xae32, 0xae33, 0xae35, 0xae36,
+0xae39, 0xae3b, 0xae3c, 0xae3d, 0xae3e, 0xae3f, 0xae42, 0xae44, 0xae47, 0xae48, 0xae49, 0xae4b, 0xae4f, 0xae51, 0xae52,
+0xae53, 0xae55, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5e, 0xae62, 0xae63, 0xae64, 0xae66, 0xae67, 0xae6a, 0xae6b,
+0xae6d, 0xae6e, 0xae6f, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae7a, 0xae7e, 0xae7f, 0xae80, 0xae81,
+0xae82, 0xae83, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93,
+0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaea1, 0xaea2,
+0xaea3, 0xaea4, 0xaea5, 0xaea6, 0xaea7, 0xaea8, 0xaea9, 0xaeaa, 0xaeab, 0xaeac, 0xaead, 0xaeae, 0xaeaf, 0xaeb0, 0xaeb1,
+0xaeb2, 0xaeb3, 0xaeb4, 0xaeb5, 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, 0xaebb, 0xaebf, 0xaec1, 0xaec2, 0xaec3, 0xaec5,
+0xaec6, 0xaec7, 0xaec8, 0xaec9, 0xaeca, 0xaecb, 0xaece, 0xaed2, 0xaed3, 0xaed4, 0xaed5, 0xaed6, 0xaed7, 0xaeda, 0xaedb,
+0xaedd, 0xaede, 0xaedf, 0xaee0, 0xaee1, 0xaee2, 0xaee3, 0xaee4, 0xaee5, 0xaee6, 0xaee7, 0xaee9, 0xaeea, 0xaeec, 0xaeee,
+0xaeef, 0xaef0, 0xaef1, 0xaef2, 0xaef3, 0xaef5, 0xaef6, 0xaef7, 0xaef9, 0xaefa, 0xaefb, 0xaefd, 0xaefe, 0xaeff, 0xaf00,
+0xaf01, 0xaf02, 0xaf03, 0xaf04, 0xaf05, 0xaf06, 0xaf09, 0xaf0a, 0xaf0b, 0xaf0c, 0xaf0e, 0xaf0f, 0xaf11, 0xaf12, 0xaf13,
+0xaf14, 0xaf15, 0xaf16, 0xaf17, 0xaf18, 0xaf19, 0xaf1a, 0xaf1b, 0xaf1c, 0xaf1d, 0xaf1e, 0xaf1f, 0xaf20, 0xaf21, 0xaf22,
+0xaf23, 0xaf24, 0xaf25, 0xaf26, 0xaf27, 0xaf28, 0xaf29, 0xaf2a, 0xaf2b, 0xaf2e, 0xaf2f, 0xaf31, 0xaf33, 0xaf35, 0xaf36,
+0xaf37, 0xaf38, 0xaf39, 0xaf3a, 0xaf3b, 0xaf3e, 0xaf40, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d,
+0xaf4e, 0xaf4f, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5e, 0xaf5f,
+0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70,
+0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf7f, 0xaf81,
+0xaf82, 0xaf83, 0xaf85, 0xaf86, 0xaf87, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf92, 0xaf93, 0xaf94,
+0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xafa1, 0xafa2, 0xafa3, 0xafa4, 0xafa5,
+0xafa6, 0xafa7, 0xafa8, 0xafa9, 0xafaa, 0xafab, 0xafac, 0xafad, 0xafae, 0xafaf, 0xafb0, 0xafb1, 0xafb2, 0xafb3, 0xafb4,
+0xafb5, 0xafb6, 0xafb7, 0xafba, 0xafbb, 0xafbd, 0xafbe, 0xafbf, 0xafc1, 0xafc2, 0xafc3, 0xafc4, 0xafc5, 0xafc6, 0xafca,
+0xafcc, 0xafcf, 0xafd0, 0xafd1, 0xafd2, 0xafd3, 0xafd5, 0xafd6, 0xafd7, 0xafd8, 0xafd9, 0xafda, 0xafdb, 0xafdd, 0xafde,
+0xafdf, 0xafe0, 0xafe1, 0xafe2, 0xafe3, 0xafe4, 0xafe5, 0xafe6, 0xafe7, 0xafea, 0xafeb, 0xafec, 0xafed, 0xafee, 0xafef,
+0xaff2, 0xaff3, 0xaff5, 0xaff6, 0xaff7, 0xaff9, 0xaffa, 0xaffb, 0xaffc, 0xaffd, 0xaffe, 0xafff, 0xb002, 0xb003, 0xb005,
+0xb006, 0xb007, 0xb008, 0xb009, 0xb00a, 0xb00b, 0xb00d, 0xb00e, 0xb00f, 0xb011, 0xb012, 0xb013, 0xb015, 0xb016, 0xb017,
+0xb018, 0xb019, 0xb01a, 0xb01b, 0xb01e, 0xb01f, 0xb020, 0xb021, 0xb022, 0xb023, 0xb024, 0xb025, 0xb026, 0xb027, 0xb029,
+0xb02a, 0xb02b, 0xb02c, 0xb02d, 0xb02e, 0xb02f, 0xb030, 0xb031, 0xb032, 0xb033, 0xb034, 0xb035, 0xb036, 0xb037, 0xb038,
+0xb039, 0xb03a, 0xb03b, 0xb03c, 0xb03d, 0xb03e, 0xb03f, 0xb040, 0xb041, 0xb042, 0xb043, 0xb046, 0xb047, 0xb049, 0xb04b,
+0xb04d, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb056, 0xb058, 0xb05a, 0xb05b, 0xb05c, 0xb05e, 0xb05f, 0xb060, 0xb061, 0xb062,
+0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071,
+0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07e, 0xb07f, 0xb081, 0xb082, 0xb083,
+0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08e, 0xb090, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097,
+0xb09b, 0xb09d, 0xb09e, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0aa, 0xb0b0, 0xb0b2, 0xb0b6, 0xb0b7, 0xb0b9, 0xb0ba,
+0xb0bb, 0xb0bd, 0xb0be, 0xb0bf, 0xb0c0, 0xb0c1, 0xb0c2, 0xb0c3, 0xb0c6, 0xb0ca, 0xb0cb, 0xb0cc, 0xb0cd, 0xb0ce, 0xb0cf,
+0xb0d2, 0xb0d3, 0xb0d5, 0xb0d6, 0xb0d7, 0xb0d9, 0xb0da, 0xb0db, 0xb0dc, 0xb0dd, 0xb0de, 0xb0df, 0xb0e1, 0xb0e2, 0xb0e3,
+0xb0e4, 0xb0e6, 0xb0e7, 0xb0e8, 0xb0e9, 0xb0ea, 0xb0eb, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ef, 0xb0f0, 0xb0f1, 0xb0f2, 0xb0f3,
+0xb0f4, 0xb0f5, 0xb0f6, 0xb0f7, 0xb0f8, 0xb0f9, 0xb0fa, 0xb0fb, 0xb0fc, 0xb0fd, 0xb0fe, 0xb0ff, 0xb100, 0xb101, 0xb102,
+0xb103, 0xb104, 0xb105, 0xb106, 0xb107, 0xb10a, 0xb10d, 0xb10e, 0xb10f, 0xb111, 0xb114, 0xb115, 0xb116, 0xb117, 0xb11a,
+0xb11e, 0xb11f, 0xb120, 0xb121, 0xb122, 0xb126, 0xb127, 0xb129, 0xb12a, 0xb12b, 0xb12d, 0xb12e, 0xb12f, 0xb130, 0xb131,
+0xb132, 0xb133, 0xb136, 0xb13a, 0xb13b, 0xb13c, 0xb13d, 0xb13e, 0xb13f, 0xb142, 0xb143, 0xb145, 0xb146, 0xb147, 0xb149,
+0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb152, 0xb153, 0xb156, 0xb157, 0xb159, 0xb15a, 0xb15b, 0xb15d, 0xb15e,
+0xb15f, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e,
+0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb17a, 0xb17b, 0xb17d, 0xb17e, 0xb17f, 0xb181,
+0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb18a, 0xb18c, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb195, 0xb196, 0xb197, 0xb199,
+0xb19a, 0xb19b, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb1a1, 0xb1a2, 0xb1a3, 0xb1a4, 0xb1a5, 0xb1a6, 0xb1a7, 0xb1a9, 0xb1aa,
+0xb1ab, 0xb1ac, 0xb1ad, 0xb1ae, 0xb1af, 0xb1b0, 0xb1b1, 0xb1b2, 0xb1b3, 0xb1b4, 0xb1b5, 0xb1b6, 0xb1b7, 0xb1b8, 0xb1b9,
+0xb1ba, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0xb1bf, 0xb1c0, 0xb1c1, 0xb1c2, 0xb1c3, 0xb1c4, 0xb1c5, 0xb1c6, 0xb1c7, 0xb1c8,
+0xb1c9, 0xb1ca, 0xb1cb, 0xb1cd, 0xb1ce, 0xb1cf, 0xb1d1, 0xb1d2, 0xb1d3, 0xb1d5, 0xb1d6, 0xb1d7, 0xb1d8, 0xb1d9, 0xb1da,
+0xb1db, 0xb1de, 0xb1e0, 0xb1e1, 0xb1e2, 0xb1e3, 0xb1e4, 0xb1e5, 0xb1e6, 0xb1e7, 0xb1ea, 0xb1eb, 0xb1ed, 0xb1ee, 0xb1ef,
+0xb1f1, 0xb1f2, 0xb1f3, 0xb1f4, 0xb1f5, 0xb1f6, 0xb1f7, 0xb1f8, 0xb1fa, 0xb1fc, 0xb1fe, 0xb1ff, 0xb200, 0xb201, 0xb202,
+0xb203, 0xb206, 0xb207, 0xb209, 0xb20a, 0xb20d, 0xb20e, 0xb20f, 0xb210, 0xb211, 0xb212, 0xb213, 0xb216, 0xb218, 0xb21a,
+0xb21b, 0xb21c, 0xb21d, 0xb21e, 0xb21f, 0xb221, 0xb222, 0xb223, 0xb224, 0xb225, 0xb226, 0xb227, 0xb228, 0xb229, 0xb22a,
+0xb22b, 0xb22c, 0xb22d, 0xb22e, 0xb22f, 0xb230, 0xb231, 0xb232, 0xb233, 0xb235, 0xb236, 0xb237, 0xb238, 0xb239, 0xb23a,
+0xb23b, 0xb23d, 0xb23e, 0xb23f, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a,
+0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb259, 0xb25a,
+0xb25b, 0xb25d, 0xb25e, 0xb25f, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb26a, 0xb26b, 0xb26c, 0xb26d,
+0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27d, 0xb27e, 0xb27f,
+0xb280, 0xb281, 0xb282, 0xb283, 0xb286, 0xb287, 0xb288, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb292, 0xb293,
+0xb295, 0xb296, 0xb297, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a2, 0xb2a4, 0xb2a7, 0xb2a8, 0xb2a9, 0xb2ab, 0xb2ad,
+0xb2ae, 0xb2af, 0xb2b1, 0xb2b2, 0xb2b3, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0xb2b9, 0xb2ba, 0xb2bb, 0xb2bc, 0xb2bd, 0xb2be,
+0xb2bf, 0xb2c0, 0xb2c1, 0xb2c2, 0xb2c3, 0xb2c4, 0xb2c5, 0xb2c6, 0xb2c7, 0xb2ca, 0xb2cb, 0xb2cd, 0xb2ce, 0xb2cf, 0xb2d1,
+0xb2d3, 0xb2d4, 0xb2d5, 0xb2d6, 0xb2d7, 0xb2da, 0xb2dc, 0xb2de, 0xb2df, 0xb2e0, 0xb2e1, 0xb2e3, 0xb2e7, 0xb2e9, 0xb2ea,
+0xb2f0, 0xb2f1, 0xb2f2, 0xb2f6, 0xb2fc, 0xb2fd, 0xb2fe, 0xb302, 0xb303, 0xb305, 0xb306, 0xb307, 0xb309, 0xb30a, 0xb30b,
+0xb30c, 0xb30d, 0xb30e, 0xb30f, 0xb312, 0xb316, 0xb317, 0xb318, 0xb319, 0xb31a, 0xb31b, 0xb31d, 0xb31e, 0xb31f, 0xb320,
+0xb321, 0xb322, 0xb323, 0xb324, 0xb325, 0xb326, 0xb327, 0xb328, 0xb329, 0xb32a, 0xb32b, 0xb32c, 0xb32d, 0xb32e, 0xb32f,
+0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, 0xb336, 0xb337, 0xb338, 0xb339, 0xb33a, 0xb33b, 0xb33c, 0xb33d, 0xb33e,
+0xb33f, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d,
+0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb357, 0xb359, 0xb35a, 0xb35d, 0xb360, 0xb361, 0xb362, 0xb363, 0xb366,
+0xb368, 0xb36a, 0xb36c, 0xb36d, 0xb36f, 0xb372, 0xb373, 0xb375, 0xb376, 0xb377, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d,
+0xb37e, 0xb37f, 0xb382, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38d, 0xb38e, 0xb38f, 0xb391, 0xb392, 0xb393,
+0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a2, 0xb3a3, 0xb3a4, 0xb3a5,
+0xb3a6, 0xb3a7, 0xb3a9, 0xb3aa, 0xb3ab, 0xb3ad, 0xb3ae, 0xb3af, 0xb3b0, 0xb3b1, 0xb3b2, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b6,
+0xb3b7, 0xb3b8, 0xb3b9, 0xb3ba, 0xb3bb, 0xb3bc, 0xb3bd, 0xb3be, 0xb3bf, 0xb3c0, 0xb3c1, 0xb3c2, 0xb3c3, 0xb3c6, 0xb3c7,
+0xb3c9, 0xb3ca, 0xb3cd, 0xb3cf, 0xb3d1, 0xb3d2, 0xb3d3, 0xb3d6, 0xb3d8, 0xb3da, 0xb3dc, 0xb3de, 0xb3df, 0xb3e1, 0xb3e2,
+0xb3e3, 0xb3e5, 0xb3e6, 0xb3e7, 0xb3e9, 0xb3ea, 0xb3eb, 0xb3ec, 0xb3ed, 0xb3ee, 0xb3ef, 0xb3f0, 0xb3f1, 0xb3f2, 0xb3f3,
+0xb3f4, 0xb3f5, 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f9, 0xb3fa, 0xb3fb, 0xb3fd, 0xb3fe, 0xb3ff, 0xb400, 0xb401, 0xb402, 0xb403,
+0xb404, 0xb405, 0xb406, 0xb407, 0xb408, 0xb409, 0xb40a, 0xb40b, 0xb40c, 0xb40d, 0xb40e, 0xb40f, 0xb411, 0xb412, 0xb413,
+0xb414, 0xb415, 0xb416, 0xb417, 0xb419, 0xb41a, 0xb41b, 0xb41d, 0xb41e, 0xb41f, 0xb421, 0xb422, 0xb423, 0xb424, 0xb425,
+0xb426, 0xb427, 0xb42a, 0xb42c, 0xb42d, 0xb42e, 0xb42f, 0xb430, 0xb431, 0xb432, 0xb433, 0xb435, 0xb436, 0xb437, 0xb438,
+0xb439, 0xb43a, 0xb43b, 0xb43c, 0xb43d, 0xb43e, 0xb43f, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447,
+0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb452, 0xb453, 0xb455, 0xb456, 0xb457, 0xb459, 0xb45a,
+0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb462, 0xb464, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46d, 0xb46e,
+0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d,
+0xb47e, 0xb47f, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e,
+0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49e,
+0xb49f, 0xb4a0, 0xb4a1, 0xb4a2, 0xb4a3, 0xb4a5, 0xb4a6, 0xb4a7, 0xb4a9, 0xb4aa, 0xb4ab, 0xb4ad, 0xb4ae, 0xb4af, 0xb4b0,
+0xb4b1, 0xb4b2, 0xb4b3, 0xb4b4, 0xb4b6, 0xb4b8, 0xb4ba, 0xb4bb, 0xb4bc, 0xb4bd, 0xb4be, 0xb4bf, 0xb4c1, 0xb4c2, 0xb4c3,
+0xb4c5, 0xb4c6, 0xb4c7, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb4cd, 0xb4ce, 0xb4cf, 0xb4d1, 0xb4d2, 0xb4d3, 0xb4d4, 0xb4d6,
+0xb4d7, 0xb4d8, 0xb4d9, 0xb4da, 0xb4db, 0xb4de, 0xb4df, 0xb4e1, 0xb4e2, 0xb4e5, 0xb4e7, 0xb4e8, 0xb4e9, 0xb4ea, 0xb4eb,
+0xb4ee, 0xb4f0, 0xb4f2, 0xb4f3, 0xb4f4, 0xb4f5, 0xb4f6, 0xb4f7, 0xb4f9, 0xb4fa, 0xb4fb, 0xb4fc, 0xb4fd, 0xb4fe, 0xb4ff,
+0xb500, 0xb501, 0xb502, 0xb503, 0xb504, 0xb505, 0xb506, 0xb507, 0xb508, 0xb509, 0xb50a, 0xb50b, 0xb50c, 0xb50d, 0xb50e,
+0xb50f, 0xb510, 0xb511, 0xb512, 0xb513, 0xb516, 0xb517, 0xb519, 0xb51a, 0xb51d, 0xb51e, 0xb51f, 0xb520, 0xb521, 0xb522,
+0xb523, 0xb526, 0xb52b, 0xb52c, 0xb52d, 0xb52e, 0xb52f, 0xb532, 0xb533, 0xb535, 0xb536, 0xb537, 0xb539, 0xb53a, 0xb53b,
+0xb53c, 0xb53d, 0xb53e, 0xb53f, 0xb542, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54e, 0xb54f, 0xb551, 0xb552, 0xb553,
+0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55e, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568,
+0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577,
+0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb57f, 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586,
+0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595,
+0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a2, 0xb5a3, 0xb5a5, 0xb5a6, 0xb5a7,
+0xb5a9, 0xb5ac, 0xb5ad, 0xb5ae, 0xb5af, 0xb5b2, 0xb5b6, 0xb5b7, 0xb5b8, 0xb5b9, 0xb5ba, 0xb5be, 0xb5bf, 0xb5c1, 0xb5c2,
+0xb5c3, 0xb5c5, 0xb5c6, 0xb5c7, 0xb5c8, 0xb5c9, 0xb5ca, 0xb5cb, 0xb5ce, 0xb5d2, 0xb5d3, 0xb5d4, 0xb5d5, 0xb5d6, 0xb5d7,
+0xb5d9, 0xb5da, 0xb5db, 0xb5dc, 0xb5dd, 0xb5de, 0xb5df, 0xb5e0, 0xb5e1, 0xb5e2, 0xb5e3, 0xb5e4, 0xb5e5, 0xb5e6, 0xb5e7,
+0xb5e8, 0xb5e9, 0xb5ea, 0xb5eb, 0xb5ed, 0xb5ee, 0xb5ef, 0xb5f0, 0xb5f1, 0xb5f2, 0xb5f3, 0xb5f4, 0xb5f5, 0xb5f6, 0xb5f7,
+0xb5f8, 0xb5f9, 0xb5fa, 0xb5fb, 0xb5fc, 0xb5fd, 0xb5fe, 0xb5ff, 0xb600, 0xb601, 0xb602, 0xb603, 0xb604, 0xb605, 0xb606,
+0xb607, 0xb608, 0xb609, 0xb60a, 0xb60b, 0xb60c, 0xb60d, 0xb60e, 0xb60f, 0xb612, 0xb613, 0xb615, 0xb616, 0xb617, 0xb619,
+0xb61a, 0xb61b, 0xb61c, 0xb61d, 0xb61e, 0xb61f, 0xb620, 0xb621, 0xb622, 0xb623, 0xb624, 0xb626, 0xb627, 0xb628, 0xb629,
+0xb62a, 0xb62b, 0xb62d, 0xb62e, 0xb62f, 0xb630, 0xb631, 0xb632, 0xb633, 0xb635, 0xb636, 0xb637, 0xb638, 0xb639, 0xb63a,
+0xb63b, 0xb63c, 0xb63d, 0xb63e, 0xb63f, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb649, 0xb64a,
+0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659,
+0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0xb665, 0xb666, 0xb667, 0xb669, 0xb66a,
+0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679,
+0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb67f, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688,
+0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697,
+0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69e, 0xb69f, 0xb6a1, 0xb6a2, 0xb6a3, 0xb6a5, 0xb6a6, 0xb6a7, 0xb6a8, 0xb6a9, 0xb6aa,
+0xb6ad, 0xb6ae, 0xb6af, 0xb6b0, 0xb6b2, 0xb6b3, 0xb6b4, 0xb6b5, 0xb6b6, 0xb6b7, 0xb6b8, 0xb6b9, 0xb6ba, 0xb6bb, 0xb6bc,
+0xb6bd, 0xb6be, 0xb6bf, 0xb6c0, 0xb6c1, 0xb6c2, 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c6, 0xb6c7, 0xb6c8, 0xb6c9, 0xb6ca, 0xb6cb,
+0xb6cc, 0xb6cd, 0xb6ce, 0xb6cf, 0xb6d0, 0xb6d1, 0xb6d2, 0xb6d3, 0xb6d5, 0xb6d6, 0xb6d7, 0xb6d8, 0xb6d9, 0xb6da, 0xb6db,
+0xb6dc, 0xb6dd, 0xb6de, 0xb6df, 0xb6e0, 0xb6e1, 0xb6e2, 0xb6e3, 0xb6e4, 0xb6e5, 0xb6e6, 0xb6e7, 0xb6e8, 0xb6e9, 0xb6ea,
+0xb6eb, 0xb6ec, 0xb6ed, 0xb6ee, 0xb6ef, 0xb6f1, 0xb6f2, 0xb6f3, 0xb6f5, 0xb6f6, 0xb6f7, 0xb6f9, 0xb6fa, 0xb6fb, 0xb6fc,
+0xb6fd, 0xb6fe, 0xb6ff, 0xb702, 0xb703, 0xb704, 0xb706, 0xb707, 0xb708, 0xb709, 0xb70a, 0xb70b, 0xb70c, 0xb70d, 0xb70e,
+0xb70f, 0xb710, 0xb711, 0xb712, 0xb713, 0xb714, 0xb715, 0xb716, 0xb717, 0xb718, 0xb719, 0xb71a, 0xb71b, 0xb71c, 0xb71d,
+0xb71e, 0xb71f, 0xb720, 0xb721, 0xb722, 0xb723, 0xb724, 0xb725, 0xb726, 0xb727, 0xb72a, 0xb72b, 0xb72d, 0xb72e, 0xb731,
+0xb732, 0xb733, 0xb734, 0xb735, 0xb736, 0xb737, 0xb73a, 0xb73c, 0xb73d, 0xb73e, 0xb73f, 0xb740, 0xb741, 0xb742, 0xb743,
+0xb745, 0xb746, 0xb747, 0xb749, 0xb74a, 0xb74b, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb756, 0xb757,
+0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb761, 0xb762, 0xb763, 0xb765, 0xb766, 0xb767, 0xb769,
+0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb772, 0xb774, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77e,
+0xb77f, 0xb781, 0xb782, 0xb783, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78e, 0xb793, 0xb794, 0xb795,
+0xb79a, 0xb79b, 0xb79d, 0xb79e, 0xb79f, 0xb7a1, 0xb7a2, 0xb7a3, 0xb7a4, 0xb7a5, 0xb7a6, 0xb7a7, 0xb7aa, 0xb7ae, 0xb7af,
+0xb7b0, 0xb7b1, 0xb7b2, 0xb7b3, 0xb7b6, 0xb7b7, 0xb7b9, 0xb7ba, 0xb7bb, 0xb7bc, 0xb7bd, 0xb7be, 0xb7bf, 0xb7c0, 0xb7c1,
+0xb7c2, 0xb7c3, 0xb7c4, 0xb7c5, 0xb7c6, 0xb7c8, 0xb7ca, 0xb7cb, 0xb7cc, 0xb7cd, 0xb7ce, 0xb7cf, 0xb7d0, 0xb7d1, 0xb7d2,
+0xb7d3, 0xb7d4, 0xb7d5, 0xb7d6, 0xb7d7, 0xb7d8, 0xb7d9, 0xb7da, 0xb7db, 0xb7dc, 0xb7dd, 0xb7de, 0xb7df, 0xb7e0, 0xb7e1,
+0xb7e2, 0xb7e3, 0xb7e4, 0xb7e5, 0xb7e6, 0xb7e7, 0xb7e8, 0xb7e9, 0xb7ea, 0xb7eb, 0xb7ee, 0xb7ef, 0xb7f1, 0xb7f2, 0xb7f3,
+0xb7f5, 0xb7f6, 0xb7f7, 0xb7f8, 0xb7f9, 0xb7fa, 0xb7fb, 0xb7fe, 0xb802, 0xb803, 0xb804, 0xb805, 0xb806, 0xb80a, 0xb80b,
+0xb80d, 0xb80e, 0xb80f, 0xb811, 0xb812, 0xb813, 0xb814, 0xb815, 0xb816, 0xb817, 0xb81a, 0xb81c, 0xb81e, 0xb81f, 0xb820,
+0xb821, 0xb822, 0xb823, 0xb826, 0xb827, 0xb829, 0xb82a, 0xb82b, 0xb82d, 0xb82e, 0xb82f, 0xb830, 0xb831, 0xb832, 0xb833,
+0xb836, 0xb83a, 0xb83b, 0xb83c, 0xb83d, 0xb83e, 0xb83f, 0xb841, 0xb842, 0xb843, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849,
+0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb852, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a,
+0xb85b, 0xb85e, 0xb85f, 0xb861, 0xb862, 0xb863, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86e, 0xb870,
+0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb879, 0xb87a, 0xb87b, 0xb87d, 0xb87e, 0xb87f, 0xb880, 0xb881, 0xb882,
+0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892,
+0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb8a1,
+0xb8a2, 0xb8a3, 0xb8a4, 0xb8a5, 0xb8a6, 0xb8a7, 0xb8a9, 0xb8aa, 0xb8ab, 0xb8ac, 0xb8ad, 0xb8ae, 0xb8af, 0xb8b1, 0xb8b2,
+0xb8b3, 0xb8b5, 0xb8b6, 0xb8b7, 0xb8b9, 0xb8ba, 0xb8bb, 0xb8bc, 0xb8bd, 0xb8be, 0xb8bf, 0xb8c2, 0xb8c4, 0xb8c6, 0xb8c7,
+0xb8c8, 0xb8c9, 0xb8ca, 0xb8cb, 0xb8cd, 0xb8ce, 0xb8cf, 0xb8d1, 0xb8d2, 0xb8d3, 0xb8d5, 0xb8d6, 0xb8d7, 0xb8d8, 0xb8d9,
+0xb8da, 0xb8db, 0xb8dc, 0xb8de, 0xb8e0, 0xb8e2, 0xb8e3, 0xb8e4, 0xb8e5, 0xb8e6, 0xb8e7, 0xb8ea, 0xb8eb, 0xb8ed, 0xb8ee,
+0xb8ef, 0xb8f1, 0xb8f2, 0xb8f3, 0xb8f4, 0xb8f5, 0xb8f6, 0xb8f7, 0xb8fa, 0xb8fc, 0xb8fe, 0xb8ff, 0xb900, 0xb901, 0xb902,
+0xb903, 0xb905, 0xb906, 0xb907, 0xb908, 0xb909, 0xb90a, 0xb90b, 0xb90c, 0xb90d, 0xb90e, 0xb90f, 0xb910, 0xb911, 0xb912,
+0xb913, 0xb914, 0xb915, 0xb916, 0xb917, 0xb919, 0xb91a, 0xb91b, 0xb91c, 0xb91d, 0xb91e, 0xb91f, 0xb921, 0xb922, 0xb923,
+0xb924, 0xb925, 0xb926, 0xb927, 0xb928, 0xb929, 0xb92a, 0xb92b, 0xb92c, 0xb92d, 0xb92e, 0xb92f, 0xb930, 0xb931, 0xb932,
+0xb933, 0xb934, 0xb935, 0xb936, 0xb937, 0xb938, 0xb939, 0xb93a, 0xb93b, 0xb93e, 0xb93f, 0xb941, 0xb942, 0xb943, 0xb945,
+0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94d, 0xb94e, 0xb950, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957,
+0xb95a, 0xb95b, 0xb95d, 0xb95e, 0xb95f, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb96a, 0xb96c, 0xb96e,
+0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb976, 0xb977, 0xb979, 0xb97a, 0xb97b, 0xb97d, 0xb97e, 0xb97f, 0xb980, 0xb981,
+0xb982, 0xb983, 0xb986, 0xb988, 0xb98b, 0xb98c, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997,
+0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xb9a1, 0xb9a2, 0xb9a3, 0xb9a4, 0xb9a5, 0xb9a6,
+0xb9a7, 0xb9a8, 0xb9a9, 0xb9aa, 0xb9ab, 0xb9ae, 0xb9af, 0xb9b1, 0xb9b2, 0xb9b3, 0xb9b5, 0xb9b6, 0xb9b7, 0xb9b8, 0xb9b9,
+0xb9ba, 0xb9bb, 0xb9be, 0xb9c0, 0xb9c2, 0xb9c3, 0xb9c4, 0xb9c5, 0xb9c6, 0xb9c7, 0xb9ca, 0xb9cb, 0xb9cd, 0xb9d3, 0xb9d4,
+0xb9d5, 0xb9d6, 0xb9d7, 0xb9da, 0xb9dc, 0xb9df, 0xb9e0, 0xb9e2, 0xb9e6, 0xb9e7, 0xb9e9, 0xb9ea, 0xb9eb, 0xb9ed, 0xb9ee,
+0xb9ef, 0xb9f0, 0xb9f1, 0xb9f2, 0xb9f3, 0xb9f6, 0xb9fb, 0xb9fc, 0xb9fd, 0xb9fe, 0xb9ff, 0xba02, 0xba03, 0xba04, 0xba05,
+0xba06, 0xba07, 0xba09, 0xba0a, 0xba0b, 0xba0c, 0xba0d, 0xba0e, 0xba0f, 0xba10, 0xba11, 0xba12, 0xba13, 0xba14, 0xba16,
+0xba17, 0xba18, 0xba19, 0xba1a, 0xba1b, 0xba1c, 0xba1d, 0xba1e, 0xba1f, 0xba20, 0xba21, 0xba22, 0xba23, 0xba24, 0xba25,
+0xba26, 0xba27, 0xba28, 0xba29, 0xba2a, 0xba2b, 0xba2c, 0xba2d, 0xba2e, 0xba2f, 0xba30, 0xba31, 0xba32, 0xba33, 0xba34,
+0xba35, 0xba36, 0xba37, 0xba3a, 0xba3b, 0xba3d, 0xba3e, 0xba3f, 0xba41, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba4a,
+0xba4c, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba56, 0xba57, 0xba59, 0xba5a, 0xba5b, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61,
+0xba62, 0xba63, 0xba66, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba72, 0xba73, 0xba75, 0xba76, 0xba77, 0xba79,
+0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba7f, 0xba80, 0xba81, 0xba82, 0xba86, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8d,
+0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c,
+0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa4, 0xbaa5, 0xbaa6, 0xbaa7, 0xbaaa, 0xbaad, 0xbaae, 0xbaaf,
+0xbab1, 0xbab3, 0xbab4, 0xbab5, 0xbab6, 0xbab7, 0xbaba, 0xbabc, 0xbabe, 0xbabf, 0xbac0, 0xbac1, 0xbac2, 0xbac3, 0xbac5,
+0xbac6, 0xbac7, 0xbac9, 0xbaca, 0xbacb, 0xbacc, 0xbacd, 0xbace, 0xbacf, 0xbad0, 0xbad1, 0xbad2, 0xbad3, 0xbad4, 0xbad5,
+0xbad6, 0xbad7, 0xbada, 0xbadb, 0xbadc, 0xbadd, 0xbade, 0xbadf, 0xbae0, 0xbae1, 0xbae2, 0xbae3, 0xbae4, 0xbae5, 0xbae6,
+0xbae7, 0xbae8, 0xbae9, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0xbaee, 0xbaef, 0xbaf0, 0xbaf1, 0xbaf2, 0xbaf3, 0xbaf4, 0xbaf5,
+0xbaf6, 0xbaf7, 0xbaf8, 0xbaf9, 0xbafa, 0xbafb, 0xbafd, 0xbafe, 0xbaff, 0xbb01, 0xbb02, 0xbb03, 0xbb05, 0xbb06, 0xbb07,
+0xbb08, 0xbb09, 0xbb0a, 0xbb0b, 0xbb0c, 0xbb0e, 0xbb10, 0xbb12, 0xbb13, 0xbb14, 0xbb15, 0xbb16, 0xbb17, 0xbb19, 0xbb1a,
+0xbb1b, 0xbb1d, 0xbb1e, 0xbb1f, 0xbb21, 0xbb22, 0xbb23, 0xbb24, 0xbb25, 0xbb26, 0xbb27, 0xbb28, 0xbb2a, 0xbb2c, 0xbb2d,
+0xbb2e, 0xbb2f, 0xbb30, 0xbb31, 0xbb32, 0xbb33, 0xbb37, 0xbb39, 0xbb3a, 0xbb3f, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb46,
+0xbb48, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4e, 0xbb51, 0xbb52, 0xbb53, 0xbb55, 0xbb56, 0xbb57, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c,
+0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb62, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6d, 0xbb6e,
+0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d,
+0xbb7e, 0xbb7f, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8d, 0xbb8e,
+0xbb8f, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e,
+0xbb9f, 0xbba0, 0xbba1, 0xbba2, 0xbba3, 0xbba5, 0xbba6, 0xbba7, 0xbba9, 0xbbaa, 0xbbab, 0xbbad, 0xbbae, 0xbbaf, 0xbbb0,
+0xbbb1, 0xbbb2, 0xbbb3, 0xbbb5, 0xbbb6, 0xbbb8, 0xbbb9, 0xbbba, 0xbbbb, 0xbbbc, 0xbbbd, 0xbbbe, 0xbbbf, 0xbbc1, 0xbbc2,
+0xbbc3, 0xbbc5, 0xbbc6, 0xbbc7, 0xbbc9, 0xbbca, 0xbbcb, 0xbbcc, 0xbbcd, 0xbbce, 0xbbcf, 0xbbd1, 0xbbd2, 0xbbd4, 0xbbd5,
+0xbbd6, 0xbbd7, 0xbbd8, 0xbbd9, 0xbbda, 0xbbdb, 0xbbdc, 0xbbdd, 0xbbde, 0xbbdf, 0xbbe0, 0xbbe1, 0xbbe2, 0xbbe3, 0xbbe4,
+0xbbe5, 0xbbe6, 0xbbe7, 0xbbe8, 0xbbe9, 0xbbea, 0xbbeb, 0xbbec, 0xbbed, 0xbbee, 0xbbef, 0xbbf0, 0xbbf1, 0xbbf2, 0xbbf3,
+0xbbf4, 0xbbf5, 0xbbf6, 0xbbf7, 0xbbfa, 0xbbfb, 0xbbfd, 0xbbfe, 0xbc01, 0xbc03, 0xbc04, 0xbc05, 0xbc06, 0xbc07, 0xbc0a,
+0xbc0e, 0xbc10, 0xbc12, 0xbc13, 0xbc19, 0xbc1a, 0xbc20, 0xbc21, 0xbc22, 0xbc23, 0xbc26, 0xbc28, 0xbc2a, 0xbc2b, 0xbc2c,
+0xbc2e, 0xbc2f, 0xbc32, 0xbc33, 0xbc35, 0xbc36, 0xbc37, 0xbc39, 0xbc3a, 0xbc3b, 0xbc3c, 0xbc3d, 0xbc3e, 0xbc3f, 0xbc42,
+0xbc46, 0xbc47, 0xbc48, 0xbc4a, 0xbc4b, 0xbc4e, 0xbc4f, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58,
+0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68,
+0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77,
+0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc7f, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc86, 0xbc87, 0xbc89,
+0xbc8a, 0xbc8d, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc96, 0xbc98, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca2,
+0xbca3, 0xbca5, 0xbca6, 0xbca9, 0xbcaa, 0xbcab, 0xbcac, 0xbcad, 0xbcae, 0xbcaf, 0xbcb2, 0xbcb6, 0xbcb7, 0xbcb8, 0xbcb9,
+0xbcba, 0xbcbb, 0xbcbe, 0xbcbf, 0xbcc1, 0xbcc2, 0xbcc3, 0xbcc5, 0xbcc6, 0xbcc7, 0xbcc8, 0xbcc9, 0xbcca, 0xbccb, 0xbccc,
+0xbcce, 0xbcd2, 0xbcd3, 0xbcd4, 0xbcd6, 0xbcd7, 0xbcd9, 0xbcda, 0xbcdb, 0xbcdd, 0xbcde, 0xbcdf, 0xbce0, 0xbce1, 0xbce2,
+0xbce3, 0xbce4, 0xbce5, 0xbce6, 0xbce7, 0xbce8, 0xbce9, 0xbcea, 0xbceb, 0xbcec, 0xbced, 0xbcee, 0xbcef, 0xbcf0, 0xbcf1,
+0xbcf2, 0xbcf3, 0xbcf7, 0xbcf9, 0xbcfa, 0xbcfb, 0xbcfd, 0xbcfe, 0xbcff, 0xbd00, 0xbd01, 0xbd02, 0xbd03, 0xbd06, 0xbd08,
+0xbd0a, 0xbd0b, 0xbd0c, 0xbd0d, 0xbd0e, 0xbd0f, 0xbd11, 0xbd12, 0xbd13, 0xbd15, 0xbd16, 0xbd17, 0xbd18, 0xbd19, 0xbd1a,
+0xbd1b, 0xbd1c, 0xbd1d, 0xbd1e, 0xbd1f, 0xbd20, 0xbd21, 0xbd22, 0xbd23, 0xbd25, 0xbd26, 0xbd27, 0xbd28, 0xbd29, 0xbd2a,
+0xbd2b, 0xbd2d, 0xbd2e, 0xbd2f, 0xbd30, 0xbd31, 0xbd32, 0xbd33, 0xbd34, 0xbd35, 0xbd36, 0xbd37, 0xbd38, 0xbd39, 0xbd3a,
+0xbd3b, 0xbd3c, 0xbd3d, 0xbd3e, 0xbd3f, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd4a, 0xbd4b, 0xbd4d,
+0xbd4e, 0xbd4f, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f,
+0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd65, 0xbd66, 0xbd67, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70,
+0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd7f,
+0xbd82, 0xbd83, 0xbd85, 0xbd86, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd92, 0xbd94, 0xbd96, 0xbd97, 0xbd98, 0xbd9b,
+0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbda1, 0xbda2, 0xbda3, 0xbda5, 0xbda6, 0xbda7, 0xbda8, 0xbda9, 0xbdaa, 0xbdab, 0xbdac,
+0xbdad, 0xbdae, 0xbdaf, 0xbdb1, 0xbdb2, 0xbdb3, 0xbdb4, 0xbdb5, 0xbdb6, 0xbdb7, 0xbdb9, 0xbdba, 0xbdbb, 0xbdbc, 0xbdbd,
+0xbdbe, 0xbdbf, 0xbdc0, 0xbdc1, 0xbdc2, 0xbdc3, 0xbdc4, 0xbdc5, 0xbdc6, 0xbdc7, 0xbdc8, 0xbdc9, 0xbdca, 0xbdcb, 0xbdcc,
+0xbdcd, 0xbdce, 0xbdcf, 0xbdd0, 0xbdd1, 0xbdd2, 0xbdd3, 0xbdd6, 0xbdd7, 0xbdd9, 0xbdda, 0xbddb, 0xbddd, 0xbdde, 0xbddf,
+0xbde0, 0xbde1, 0xbde2, 0xbde3, 0xbde4, 0xbde5, 0xbde6, 0xbde7, 0xbde8, 0xbdea, 0xbdeb, 0xbdec, 0xbded, 0xbdee, 0xbdef,
+0xbdf1, 0xbdf2, 0xbdf3, 0xbdf5, 0xbdf6, 0xbdf7, 0xbdf9, 0xbdfa, 0xbdfb, 0xbdfc, 0xbdfd, 0xbdfe, 0xbdff, 0xbe01, 0xbe02,
+0xbe04, 0xbe06, 0xbe07, 0xbe08, 0xbe09, 0xbe0a, 0xbe0b, 0xbe0e, 0xbe0f, 0xbe11, 0xbe12, 0xbe13, 0xbe15, 0xbe16, 0xbe17,
+0xbe18, 0xbe19, 0xbe1a, 0xbe1b, 0xbe1e, 0xbe20, 0xbe21, 0xbe22, 0xbe23, 0xbe24, 0xbe25, 0xbe26, 0xbe27, 0xbe28, 0xbe29,
+0xbe2a, 0xbe2b, 0xbe2c, 0xbe2d, 0xbe2e, 0xbe2f, 0xbe30, 0xbe31, 0xbe32, 0xbe33, 0xbe34, 0xbe35, 0xbe36, 0xbe37, 0xbe38,
+0xbe39, 0xbe3a, 0xbe3b, 0xbe3c, 0xbe3d, 0xbe3e, 0xbe3f, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe46, 0xbe47, 0xbe49, 0xbe4a,
+0xbe4b, 0xbe4d, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe56, 0xbe58, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe62, 0xbe63,
+0xbe65, 0xbe66, 0xbe67, 0xbe69, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe72, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a,
+0xbe7e, 0xbe7f, 0xbe81, 0xbe82, 0xbe83, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8e, 0xbe92, 0xbe93,
+0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbea1, 0xbea2, 0xbea3, 0xbea4,
+0xbea5, 0xbea6, 0xbea7, 0xbea9, 0xbeaa, 0xbeab, 0xbeac, 0xbead, 0xbeae, 0xbeaf, 0xbeb0, 0xbeb1, 0xbeb2, 0xbeb3, 0xbeb4,
+0xbeb5, 0xbeb6, 0xbeb7, 0xbeb8, 0xbeb9, 0xbeba, 0xbebb, 0xbebc, 0xbebd, 0xbebe, 0xbebf, 0xbec0, 0xbec1, 0xbec2, 0xbec3,
+0xbec4, 0xbec5, 0xbec6, 0xbec7, 0xbec8, 0xbec9, 0xbeca, 0xbecb, 0xbecc, 0xbecd, 0xbece, 0xbecf, 0xbed2, 0xbed3, 0xbed5,
+0xbed6, 0xbed9, 0xbeda, 0xbedb, 0xbedc, 0xbedd, 0xbede, 0xbedf, 0xbee1, 0xbee2, 0xbee6, 0xbee7, 0xbee8, 0xbee9, 0xbeea,
+0xbeeb, 0xbeed, 0xbeee, 0xbeef, 0xbef0, 0xbef1, 0xbef2, 0xbef3, 0xbef4, 0xbef5, 0xbef6, 0xbef7, 0xbef8, 0xbef9, 0xbefa,
+0xbefb, 0xbefc, 0xbefd, 0xbefe, 0xbeff, 0xbf00, 0xbf02, 0xbf03, 0xbf04, 0xbf05, 0xbf06, 0xbf07, 0xbf0a, 0xbf0b, 0xbf0c,
+0xbf0d, 0xbf0e, 0xbf0f, 0xbf10, 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xbf16, 0xbf17, 0xbf1a, 0xbf1e, 0xbf1f, 0xbf20,
+0xbf21, 0xbf22, 0xbf23, 0xbf24, 0xbf25, 0xbf26, 0xbf27, 0xbf28, 0xbf29, 0xbf2a, 0xbf2b, 0xbf2c, 0xbf2d, 0xbf2e, 0xbf2f,
+0xbf30, 0xbf31, 0xbf32, 0xbf33, 0xbf34, 0xbf35, 0xbf36, 0xbf37, 0xbf38, 0xbf39, 0xbf3a, 0xbf3b, 0xbf3c, 0xbf3d, 0xbf3e,
+0xbf3f, 0xbf42, 0xbf43, 0xbf45, 0xbf46, 0xbf47, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf52, 0xbf53,
+0xbf54, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63,
+0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72,
+0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf7f, 0xbf80, 0xbf81,
+0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90,
+0xbf91, 0xbf92, 0xbf93, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0,
+0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, 0xbfab, 0xbfac, 0xbfad, 0xbfae, 0xbfaf,
+0xbfb1, 0xbfb2, 0xbfb3, 0xbfb4, 0xbfb5, 0xbfb6, 0xbfb7, 0xbfb8, 0xbfb9, 0xbfba, 0xbfbb, 0xbfbc, 0xbfbd, 0xbfbe, 0xbfbf,
+0xbfc0, 0xbfc1, 0xbfc2, 0xbfc3, 0xbfc4, 0xbfc6, 0xbfc7, 0xbfc8, 0xbfc9, 0xbfca, 0xbfcb, 0xbfce, 0xbfcf, 0xbfd1, 0xbfd2,
+0xbfd3, 0xbfd5, 0xbfd6, 0xbfd7, 0xbfd8, 0xbfd9, 0xbfda, 0xbfdb, 0xbfdd, 0xbfde, 0xbfe0, 0xbfe2, 0xbfe3, 0xbfe4, 0xbfe5,
+0xbfe6, 0xbfe7, 0xbfe8, 0xbfe9, 0xbfea, 0xbfeb, 0xbfec, 0xbfed, 0xbfee, 0xbfef, 0xbff0, 0xbff1, 0xbff2, 0xbff3, 0xbff4,
+0xbff5, 0xbff6, 0xbff7, 0xbff8, 0xbff9, 0xbffa, 0xbffb, 0xbffc, 0xbffd, 0xbffe, 0xbfff, 0xc000, 0xc001, 0xc002, 0xc003,
+0xc004, 0xc005, 0xc006, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d, 0xc00e, 0xc00f, 0xc010, 0xc011, 0xc012,
+0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018, 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020, 0xc021,
+0xc022, 0xc023, 0xc024, 0xc025, 0xc026, 0xc027, 0xc028, 0xc029, 0xc02a, 0xc02b, 0xc02c, 0xc02d, 0xc02e, 0xc02f, 0xc030,
+0xc031, 0xc032, 0xc033, 0xc034, 0xc035, 0xc036, 0xc037, 0xc038, 0xc039, 0xc03a, 0xc03b, 0xc03d, 0xc03e, 0xc03f, 0xc040,
+0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f,
+0xc050, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc059, 0xc05a, 0xc05b, 0xc05d, 0xc05e, 0xc05f, 0xc061, 0xc062,
+0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073,
+0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc07f, 0xc080, 0xc081, 0xc082,
+0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc092, 0xc093,
+0xc095, 0xc096, 0xc097, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a2, 0xc0a4, 0xc0a6, 0xc0a7, 0xc0a8,
+0xc0a9, 0xc0aa, 0xc0ab, 0xc0ae, 0xc0b1, 0xc0b2, 0xc0b7, 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0be, 0xc0c2, 0xc0c3, 0xc0c4,
+0xc0c6, 0xc0c7, 0xc0ca, 0xc0cb, 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d1, 0xc0d2, 0xc0d3, 0xc0d4, 0xc0d5, 0xc0d6, 0xc0d7, 0xc0da,
+0xc0de, 0xc0df, 0xc0e0, 0xc0e1, 0xc0e2, 0xc0e3, 0xc0e6, 0xc0e7, 0xc0e9, 0xc0ea, 0xc0eb, 0xc0ed, 0xc0ee, 0xc0ef, 0xc0f0,
+0xc0f1, 0xc0f2, 0xc0f3, 0xc0f6, 0xc0f8, 0xc0fa, 0xc0fb, 0xc0fc, 0xc0fd, 0xc0fe, 0xc0ff, 0xc101, 0xc102, 0xc103, 0xc105,
+0xc106, 0xc107, 0xc109, 0xc10a, 0xc10b, 0xc10c, 0xc10d, 0xc10e, 0xc10f, 0xc111, 0xc112, 0xc113, 0xc114, 0xc116, 0xc117,
+0xc118, 0xc119, 0xc11a, 0xc11b, 0xc121, 0xc122, 0xc125, 0xc128, 0xc129, 0xc12a, 0xc12b, 0xc12e, 0xc132, 0xc133, 0xc134,
+0xc135, 0xc137, 0xc13a, 0xc13b, 0xc13d, 0xc13e, 0xc13f, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc14a,
+0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc156, 0xc157, 0xc159, 0xc15a, 0xc15b, 0xc15d, 0xc15e, 0xc15f, 0xc160,
+0xc161, 0xc162, 0xc163, 0xc166, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc171, 0xc172, 0xc173, 0xc175, 0xc176,
+0xc177, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc17f, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc186, 0xc187,
+0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18f, 0xc191, 0xc192, 0xc193, 0xc195, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19e,
+0xc1a0, 0xc1a2, 0xc1a3, 0xc1a4, 0xc1a6, 0xc1a7, 0xc1aa, 0xc1ab, 0xc1ad, 0xc1ae, 0xc1af, 0xc1b1, 0xc1b2, 0xc1b3, 0xc1b4,
+0xc1b5, 0xc1b6, 0xc1b7, 0xc1b8, 0xc1b9, 0xc1ba, 0xc1bb, 0xc1bc, 0xc1be, 0xc1bf, 0xc1c0, 0xc1c1, 0xc1c2, 0xc1c3, 0xc1c5,
+0xc1c6, 0xc1c7, 0xc1c9, 0xc1ca, 0xc1cb, 0xc1cd, 0xc1ce, 0xc1cf, 0xc1d0, 0xc1d1, 0xc1d2, 0xc1d3, 0xc1d5, 0xc1d6, 0xc1d9,
+0xc1da, 0xc1db, 0xc1dc, 0xc1dd, 0xc1de, 0xc1df, 0xc1e1, 0xc1e2, 0xc1e3, 0xc1e5, 0xc1e6, 0xc1e7, 0xc1e9, 0xc1ea, 0xc1eb,
+0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f2, 0xc1f4, 0xc1f5, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9, 0xc1fa, 0xc1fb, 0xc1fe, 0xc1ff,
+0xc201, 0xc202, 0xc203, 0xc205, 0xc206, 0xc207, 0xc208, 0xc209, 0xc20a, 0xc20b, 0xc20e, 0xc210, 0xc212, 0xc213, 0xc214,
+0xc215, 0xc216, 0xc217, 0xc21a, 0xc21b, 0xc21d, 0xc21e, 0xc221, 0xc222, 0xc223, 0xc224, 0xc225, 0xc226, 0xc227, 0xc22a,
+0xc22c, 0xc22e, 0xc230, 0xc233, 0xc235, 0xc236, 0xc237, 0xc238, 0xc239, 0xc23a, 0xc23b, 0xc23c, 0xc23d, 0xc23e, 0xc23f,
+0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f,
+0xc252, 0xc253, 0xc255, 0xc256, 0xc257, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc261, 0xc262, 0xc263,
+0xc264, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26e, 0xc26f, 0xc271, 0xc272, 0xc273, 0xc275, 0xc276, 0xc277,
+0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27e, 0xc280, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc28a, 0xc28b, 0xc28c,
+0xc28d, 0xc28e, 0xc28f, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc299, 0xc29a, 0xc29c, 0xc29e, 0xc29f,
+0xc2a0, 0xc2a1, 0xc2a2, 0xc2a3, 0xc2a6, 0xc2a7, 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ae, 0xc2af, 0xc2b0, 0xc2b1, 0xc2b2, 0xc2b3,
+0xc2b6, 0xc2b8, 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2be, 0xc2bf, 0xc2c0, 0xc2c1, 0xc2c2, 0xc2c3, 0xc2c4, 0xc2c5, 0xc2c6,
+0xc2c7, 0xc2c8, 0xc2c9, 0xc2ca, 0xc2cb, 0xc2cc, 0xc2cd, 0xc2ce, 0xc2cf, 0xc2d0, 0xc2d1, 0xc2d2, 0xc2d3, 0xc2d4, 0xc2d5,
+0xc2d6, 0xc2d7, 0xc2d8, 0xc2d9, 0xc2da, 0xc2db, 0xc2de, 0xc2df, 0xc2e1, 0xc2e2, 0xc2e5, 0xc2e6, 0xc2e7, 0xc2e8, 0xc2e9,
+0xc2ea, 0xc2ee, 0xc2f0, 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f7, 0xc2fa, 0xc2fd, 0xc2fe, 0xc2ff, 0xc301, 0xc302, 0xc303,
+0xc304, 0xc305, 0xc306, 0xc307, 0xc30a, 0xc30b, 0xc30e, 0xc30f, 0xc310, 0xc311, 0xc312, 0xc316, 0xc317, 0xc319, 0xc31a,
+0xc31b, 0xc31d, 0xc31e, 0xc31f, 0xc320, 0xc321, 0xc322, 0xc323, 0xc326, 0xc327, 0xc32a, 0xc32b, 0xc32c, 0xc32d, 0xc32e,
+0xc32f, 0xc330, 0xc331, 0xc332, 0xc333, 0xc334, 0xc335, 0xc336, 0xc337, 0xc338, 0xc339, 0xc33a, 0xc33b, 0xc33c, 0xc33d,
+0xc33e, 0xc33f, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d,
+0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c,
+0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc36a, 0xc36b, 0xc36d, 0xc36e,
+0xc36f, 0xc371, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc37a, 0xc37b, 0xc37e, 0xc37f, 0xc380, 0xc381, 0xc382, 0xc383,
+0xc385, 0xc386, 0xc387, 0xc389, 0xc38a, 0xc38b, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395,
+0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4,
+0xc3a5, 0xc3a6, 0xc3a7, 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af, 0xc3b0, 0xc3b1, 0xc3b2, 0xc3b3,
+0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, 0xc3c1, 0xc3c2, 0xc3c3,
+0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, 0xc3c8, 0xc3c9, 0xc3ca, 0xc3cb, 0xc3cc, 0xc3cd, 0xc3ce, 0xc3cf, 0xc3d0, 0xc3d1, 0xc3d2,
+0xc3d3, 0xc3d4, 0xc3d5, 0xc3d6, 0xc3d7, 0xc3da, 0xc3db, 0xc3dd, 0xc3de, 0xc3e1, 0xc3e3, 0xc3e4, 0xc3e5, 0xc3e6, 0xc3e7,
+0xc3ea, 0xc3eb, 0xc3ec, 0xc3ee, 0xc3ef, 0xc3f0, 0xc3f1, 0xc3f2, 0xc3f3, 0xc3f6, 0xc3f7, 0xc3f9, 0xc3fa, 0xc3fb, 0xc3fc,
+0xc3fd, 0xc3fe, 0xc3ff, 0xc400, 0xc401, 0xc402, 0xc403, 0xc404, 0xc405, 0xc406, 0xc407, 0xc409, 0xc40a, 0xc40b, 0xc40c,
+0xc40d, 0xc40e, 0xc40f, 0xc411, 0xc412, 0xc413, 0xc414, 0xc415, 0xc416, 0xc417, 0xc418, 0xc419, 0xc41a, 0xc41b, 0xc41c,
+0xc41d, 0xc41e, 0xc41f, 0xc420, 0xc421, 0xc422, 0xc423, 0xc425, 0xc426, 0xc427, 0xc428, 0xc429, 0xc42a, 0xc42b, 0xc42d,
+0xc42e, 0xc42f, 0xc431, 0xc432, 0xc433, 0xc435, 0xc436, 0xc437, 0xc438, 0xc439, 0xc43a, 0xc43b, 0xc43e, 0xc43f, 0xc440,
+0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450,
+0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f,
+0xc460, 0xc461, 0xc462, 0xc463, 0xc466, 0xc467, 0xc469, 0xc46a, 0xc46b, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472,
+0xc473, 0xc476, 0xc477, 0xc478, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc47f, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485,
+0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc495,
+0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc4a1, 0xc4a2, 0xc4a3, 0xc4a4, 0xc4a5,
+0xc4a6, 0xc4a7, 0xc4a8, 0xc4a9, 0xc4aa, 0xc4ab, 0xc4ac, 0xc4ad, 0xc4ae, 0xc4af, 0xc4b0, 0xc4b1, 0xc4b2, 0xc4b3, 0xc4b4,
+0xc4b5, 0xc4b6, 0xc4b7, 0xc4b9, 0xc4ba, 0xc4bb, 0xc4bd, 0xc4be, 0xc4bf, 0xc4c0, 0xc4c1, 0xc4c2, 0xc4c3, 0xc4c4, 0xc4c5,
+0xc4c6, 0xc4c7, 0xc4c8, 0xc4c9, 0xc4ca, 0xc4cb, 0xc4cc, 0xc4cd, 0xc4ce, 0xc4cf, 0xc4d0, 0xc4d1, 0xc4d2, 0xc4d3, 0xc4d4,
+0xc4d5, 0xc4d6, 0xc4d7, 0xc4d8, 0xc4d9, 0xc4da, 0xc4db, 0xc4dc, 0xc4dd, 0xc4de, 0xc4df, 0xc4e0, 0xc4e1, 0xc4e2, 0xc4e3,
+0xc4e4, 0xc4e5, 0xc4e6, 0xc4e7, 0xc4e8, 0xc4ea, 0xc4eb, 0xc4ec, 0xc4ed, 0xc4ee, 0xc4ef, 0xc4f2, 0xc4f3, 0xc4f5, 0xc4f6,
+0xc4f7, 0xc4f9, 0xc4fb, 0xc4fc, 0xc4fd, 0xc4fe, 0xc502, 0xc503, 0xc504, 0xc505, 0xc506, 0xc507, 0xc508, 0xc509, 0xc50a,
+0xc50b, 0xc50d, 0xc50e, 0xc50f, 0xc511, 0xc512, 0xc513, 0xc515, 0xc516, 0xc517, 0xc518, 0xc519, 0xc51a, 0xc51b, 0xc51d,
+0xc51e, 0xc51f, 0xc520, 0xc521, 0xc522, 0xc523, 0xc524, 0xc525, 0xc526, 0xc527, 0xc52a, 0xc52b, 0xc52d, 0xc52e, 0xc52f,
+0xc531, 0xc532, 0xc533, 0xc534, 0xc535, 0xc536, 0xc537, 0xc53a, 0xc53c, 0xc53e, 0xc53f, 0xc540, 0xc541, 0xc542, 0xc543,
+0xc546, 0xc547, 0xc54b, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc556, 0xc55a, 0xc55b, 0xc55c, 0xc55f, 0xc562, 0xc563, 0xc565,
+0xc566, 0xc567, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc572, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a,
+0xc57b, 0xc57e, 0xc57f, 0xc581, 0xc582, 0xc583, 0xc585, 0xc586, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58e, 0xc590, 0xc592,
+0xc593, 0xc594, 0xc596, 0xc599, 0xc59a, 0xc59b, 0xc59d, 0xc59e, 0xc59f, 0xc5a1, 0xc5a2, 0xc5a3, 0xc5a4, 0xc5a5, 0xc5a6,
+0xc5a7, 0xc5a8, 0xc5aa, 0xc5ab, 0xc5ac, 0xc5ad, 0xc5ae, 0xc5af, 0xc5b0, 0xc5b1, 0xc5b2, 0xc5b3, 0xc5b6, 0xc5b7, 0xc5ba,
+0xc5bf, 0xc5c0, 0xc5c1, 0xc5c2, 0xc5c3, 0xc5cb, 0xc5cd, 0xc5cf, 0xc5d2, 0xc5d3, 0xc5d5, 0xc5d6, 0xc5d7, 0xc5d9, 0xc5da,
+0xc5db, 0xc5dc, 0xc5dd, 0xc5de, 0xc5df, 0xc5e2, 0xc5e4, 0xc5e6, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ef, 0xc5f1,
+0xc5f2, 0xc5f3, 0xc5f5, 0xc5f8, 0xc5f9, 0xc5fa, 0xc5fb, 0xc602, 0xc603, 0xc604, 0xc609, 0xc60a, 0xc60b, 0xc60d, 0xc60e,
+0xc60f, 0xc611, 0xc612, 0xc613, 0xc614, 0xc615, 0xc616, 0xc617, 0xc61a, 0xc61d, 0xc61e, 0xc61f, 0xc620, 0xc621, 0xc622,
+0xc623, 0xc626, 0xc627, 0xc629, 0xc62a, 0xc62b, 0xc62f, 0xc631, 0xc632, 0xc636, 0xc638, 0xc63a, 0xc63c, 0xc63d, 0xc63e,
+0xc63f, 0xc642, 0xc643, 0xc645, 0xc646, 0xc647, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc652, 0xc656,
+0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65e, 0xc65f, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668,
+0xc669, 0xc66a, 0xc66b, 0xc66d, 0xc66e, 0xc670, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc67a, 0xc67b, 0xc67d,
+0xc67e, 0xc67f, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc68a, 0xc68c, 0xc68e, 0xc68f, 0xc690, 0xc691,
+0xc692, 0xc693, 0xc696, 0xc697, 0xc699, 0xc69a, 0xc69b, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a6,
+0xc6a8, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b2, 0xc6b3, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6bb, 0xc6bc, 0xc6bd,
+0xc6be, 0xc6bf, 0xc6c2, 0xc6c4, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6ce, 0xc6cf, 0xc6d1, 0xc6d2, 0xc6d3,
+0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6de, 0xc6df, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7,
+0xc6ea, 0xc6eb, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6fa, 0xc6fb, 0xc6fc,
+0xc6fe, 0xc6ff, 0xc700, 0xc701, 0xc702, 0xc703, 0xc706, 0xc707, 0xc709, 0xc70a, 0xc70b, 0xc70d, 0xc70e, 0xc70f, 0xc710,
+0xc711, 0xc712, 0xc713, 0xc716, 0xc718, 0xc71a, 0xc71b, 0xc71c, 0xc71d, 0xc71e, 0xc71f, 0xc722, 0xc723, 0xc725, 0xc726,
+0xc727, 0xc729, 0xc72a, 0xc72b, 0xc72c, 0xc72d, 0xc72e, 0xc72f, 0xc732, 0xc734, 0xc736, 0xc738, 0xc739, 0xc73a, 0xc73b,
+0xc73e, 0xc73f, 0xc741, 0xc742, 0xc743, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74b, 0xc74e, 0xc750, 0xc759, 0xc75a,
+0xc75b, 0xc75d, 0xc75e, 0xc75f, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc769, 0xc76a, 0xc76c, 0xc76d,
+0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc776, 0xc777, 0xc779, 0xc77a, 0xc77b, 0xc77f, 0xc780, 0xc781, 0xc782,
+0xc786, 0xc78b, 0xc78c, 0xc78d, 0xc78f, 0xc792, 0xc793, 0xc795, 0xc799, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a2,
+0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ae, 0xc7af, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9,
+0xc7ba, 0xc7bb, 0xc7be, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7ca, 0xc7cb, 0xc7cd, 0xc7cf, 0xc7d1, 0xc7d2,
+0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3,
+0xc7e5, 0xc7e6, 0xc7e7, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5,
+0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc7ff, 0xc802, 0xc803, 0xc805, 0xc806, 0xc807,
+0xc809, 0xc80b, 0xc80c, 0xc80d, 0xc80e, 0xc80f, 0xc812, 0xc814, 0xc817, 0xc818, 0xc819, 0xc81a, 0xc81b, 0xc81e, 0xc81f,
+0xc821, 0xc822, 0xc823, 0xc825, 0xc826, 0xc827, 0xc828, 0xc829, 0xc82a, 0xc82b, 0xc82e, 0xc830, 0xc832, 0xc833, 0xc834,
+0xc835, 0xc836, 0xc837, 0xc839, 0xc83a, 0xc83b, 0xc83d, 0xc83e, 0xc83f, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846,
+0xc847, 0xc84a, 0xc84b, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a,
+0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869,
+0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc872, 0xc873, 0xc875, 0xc876, 0xc877, 0xc879, 0xc87b, 0xc87c, 0xc87d,
+0xc87e, 0xc87f, 0xc882, 0xc884, 0xc888, 0xc889, 0xc88a, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc895, 0xc896,
+0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89e, 0xc8a0, 0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, 0xc8a9,
+0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, 0xc8b0, 0xc8b1, 0xc8b2, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, 0xc8b8,
+0xc8b9, 0xc8ba, 0xc8bb, 0xc8be, 0xc8bf, 0xc8c0, 0xc8c1, 0xc8c2, 0xc8c3, 0xc8c5, 0xc8c6, 0xc8c7, 0xc8c9, 0xc8ca, 0xc8cb,
+0xc8cd, 0xc8ce, 0xc8cf, 0xc8d0, 0xc8d1, 0xc8d2, 0xc8d3, 0xc8d6, 0xc8d8, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df,
+0xc8e2, 0xc8e3, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1,
+0xc8f2, 0xc8f3, 0xc8f4, 0xc8f6, 0xc8f7, 0xc8f8, 0xc8f9, 0xc8fa, 0xc8fb, 0xc8fe, 0xc8ff, 0xc901, 0xc902, 0xc903, 0xc907,
+0xc908, 0xc909, 0xc90a, 0xc90b, 0xc90e, 0xc910, 0xc912, 0xc913, 0xc914, 0xc915, 0xc916, 0xc917, 0xc919, 0xc91a, 0xc91b,
+0xc91c, 0xc91d, 0xc91e, 0xc91f, 0xc920, 0xc921, 0xc922, 0xc923, 0xc924, 0xc925, 0xc926, 0xc927, 0xc928, 0xc929, 0xc92a,
+0xc92b, 0xc92d, 0xc92e, 0xc92f, 0xc930, 0xc931, 0xc932, 0xc933, 0xc935, 0xc936, 0xc937, 0xc938, 0xc939, 0xc93a, 0xc93b,
+0xc93c, 0xc93d, 0xc93e, 0xc93f, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a,
+0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc952, 0xc953, 0xc955, 0xc956, 0xc957, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d,
+0xc95e, 0xc95f, 0xc962, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96d, 0xc96e, 0xc96f, 0xc971,
+0xc972, 0xc973, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97d, 0xc97e, 0xc97f, 0xc980, 0xc981, 0xc982,
+0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc98a, 0xc98b, 0xc98d, 0xc98e, 0xc98f, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995,
+0xc996, 0xc997, 0xc99a, 0xc99c, 0xc99e, 0xc99f, 0xc9a0, 0xc9a1, 0xc9a2, 0xc9a3, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, 0xc9a8,
+0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, 0xc9b0, 0xc9b1, 0xc9b2, 0xc9b3, 0xc9b4, 0xc9b5, 0xc9b6, 0xc9b7,
+0xc9b8, 0xc9b9, 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9be, 0xc9bf, 0xc9c2, 0xc9c3, 0xc9c5, 0xc9c6, 0xc9c9, 0xc9cb, 0xc9cc,
+0xc9cd, 0xc9ce, 0xc9cf, 0xc9d2, 0xc9d4, 0xc9d7, 0xc9d8, 0xc9db, 0xc9de, 0xc9df, 0xc9e1, 0xc9e3, 0xc9e5, 0xc9e6, 0xc9e8,
+0xc9e9, 0xc9ea, 0xc9eb, 0xc9ee, 0xc9f2, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, 0xc9fa, 0xc9fb, 0xc9fd, 0xc9fe, 0xc9ff,
+0xca01, 0xca02, 0xca03, 0xca04, 0xca05, 0xca06, 0xca07, 0xca0a, 0xca0e, 0xca0f, 0xca10, 0xca11, 0xca12, 0xca13, 0xca15,
+0xca16, 0xca17, 0xca19, 0xca1a, 0xca1b, 0xca1c, 0xca1d, 0xca1e, 0xca1f, 0xca20, 0xca21, 0xca22, 0xca23, 0xca24, 0xca25,
+0xca26, 0xca27, 0xca28, 0xca2a, 0xca2b, 0xca2c, 0xca2d, 0xca2e, 0xca2f, 0xca30, 0xca31, 0xca32, 0xca33, 0xca34, 0xca35,
+0xca36, 0xca37, 0xca38, 0xca39, 0xca3a, 0xca3b, 0xca3c, 0xca3d, 0xca3e, 0xca3f, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44,
+0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4e, 0xca4f, 0xca51, 0xca52, 0xca53, 0xca55, 0xca56, 0xca57,
+0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5e, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca69, 0xca6a, 0xca6b, 0xca6c,
+0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b,
+0xca7c, 0xca7e, 0xca7f, 0xca80, 0xca81, 0xca82, 0xca83, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c,
+0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca99, 0xca9a, 0xca9b, 0xca9c,
+0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcaa1, 0xcaa2, 0xcaa3, 0xcaa4, 0xcaa5, 0xcaa6, 0xcaa7, 0xcaa8, 0xcaa9, 0xcaaa, 0xcaab,
+0xcaac, 0xcaad, 0xcaae, 0xcaaf, 0xcab0, 0xcab1, 0xcab2, 0xcab3, 0xcab4, 0xcab5, 0xcab6, 0xcab7, 0xcab8, 0xcab9, 0xcaba,
+0xcabb, 0xcabe, 0xcabf, 0xcac1, 0xcac2, 0xcac3, 0xcac5, 0xcac6, 0xcac7, 0xcac8, 0xcac9, 0xcaca, 0xcacb, 0xcace, 0xcad0,
+0xcad2, 0xcad4, 0xcad5, 0xcad6, 0xcad7, 0xcada, 0xcadb, 0xcadc, 0xcadd, 0xcade, 0xcadf, 0xcae1, 0xcae2, 0xcae3, 0xcae4,
+0xcae5, 0xcae6, 0xcae7, 0xcae8, 0xcae9, 0xcaea, 0xcaeb, 0xcaed, 0xcaee, 0xcaef, 0xcaf0, 0xcaf1, 0xcaf2, 0xcaf3, 0xcaf5,
+0xcaf6, 0xcaf7, 0xcaf8, 0xcaf9, 0xcafa, 0xcafb, 0xcafc, 0xcafd, 0xcafe, 0xcaff, 0xcb00, 0xcb01, 0xcb02, 0xcb03, 0xcb04,
+0xcb05, 0xcb06, 0xcb07, 0xcb09, 0xcb0a, 0xcb0b, 0xcb0c, 0xcb0d, 0xcb0e, 0xcb0f, 0xcb11, 0xcb12, 0xcb13, 0xcb15, 0xcb16,
+0xcb17, 0xcb19, 0xcb1a, 0xcb1b, 0xcb1c, 0xcb1d, 0xcb1e, 0xcb1f, 0xcb22, 0xcb23, 0xcb24, 0xcb25, 0xcb26, 0xcb27, 0xcb28,
+0xcb29, 0xcb2a, 0xcb2b, 0xcb2c, 0xcb2d, 0xcb2e, 0xcb2f, 0xcb30, 0xcb31, 0xcb32, 0xcb33, 0xcb34, 0xcb35, 0xcb36, 0xcb37,
+0xcb38, 0xcb39, 0xcb3a, 0xcb3b, 0xcb3c, 0xcb3d, 0xcb3e, 0xcb3f, 0xcb40, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47,
+0xcb4a, 0xcb4b, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb5a, 0xcb5b, 0xcb5c,
+0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d,
+0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e,
+0xcb7f, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d,
+0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9d,
+0xcb9e, 0xcb9f, 0xcba0, 0xcba1, 0xcba2, 0xcba3, 0xcba4, 0xcba5, 0xcba6, 0xcba7, 0xcba8, 0xcba9, 0xcbaa, 0xcbab, 0xcbac,
+0xcbad, 0xcbae, 0xcbaf, 0xcbb0, 0xcbb1, 0xcbb2, 0xcbb3, 0xcbb4, 0xcbb5, 0xcbb6, 0xcbb7, 0xcbb9, 0xcbba, 0xcbbb, 0xcbbc,
+0xcbbd, 0xcbbe, 0xcbbf, 0xcbc0, 0xcbc1, 0xcbc2, 0xcbc3, 0xcbc4, 0xcbc5, 0xcbc6, 0xcbc7, 0xcbc8, 0xcbc9, 0xcbca, 0xcbcb,
+0xcbcc, 0xcbcd, 0xcbce, 0xcbcf, 0xcbd0, 0xcbd1, 0xcbd2, 0xcbd3, 0xcbd5, 0xcbd6, 0xcbd7, 0xcbd8, 0xcbd9, 0xcbda, 0xcbdb,
+0xcbdc, 0xcbdd, 0xcbde, 0xcbdf, 0xcbe0, 0xcbe1, 0xcbe2, 0xcbe3, 0xcbe5, 0xcbe6, 0xcbe8, 0xcbea, 0xcbeb, 0xcbec, 0xcbed,
+0xcbee, 0xcbef, 0xcbf0, 0xcbf1, 0xcbf2, 0xcbf3, 0xcbf4, 0xcbf5, 0xcbf6, 0xcbf7, 0xcbf8, 0xcbf9, 0xcbfa, 0xcbfb, 0xcbfc,
+0xcbfd, 0xcbfe, 0xcbff, 0xcc00, 0xcc01, 0xcc02, 0xcc03, 0xcc04, 0xcc05, 0xcc06, 0xcc07, 0xcc08, 0xcc09, 0xcc0a, 0xcc0b,
+0xcc0e, 0xcc0f, 0xcc11, 0xcc12, 0xcc13, 0xcc15, 0xcc16, 0xcc17, 0xcc18, 0xcc19, 0xcc1a, 0xcc1b, 0xcc1e, 0xcc1f, 0xcc20,
+0xcc23, 0xcc24, 0xcc25, 0xcc26, 0xcc2a, 0xcc2b, 0xcc2d, 0xcc2f, 0xcc31, 0xcc32, 0xcc33, 0xcc34, 0xcc35, 0xcc36, 0xcc37,
+0xcc3a, 0xcc3f, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc46, 0xcc47, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50,
+0xcc51, 0xcc52, 0xcc53, 0xcc56, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc61, 0xcc62, 0xcc63, 0xcc65, 0xcc67,
+0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc76, 0xcc77, 0xcc78, 0xcc79,
+0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc7f, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88,
+0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97,
+0xcc9a, 0xcc9b, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca1, 0xcca2, 0xcca3, 0xcca4, 0xcca5, 0xcca6, 0xcca7, 0xccaa, 0xccae, 0xccaf,
+0xccb0, 0xccb1, 0xccb2, 0xccb3, 0xccb6, 0xccb7, 0xccb9, 0xccba, 0xccbb, 0xccbd, 0xccbe, 0xccbf, 0xccc0, 0xccc1, 0xccc2,
+0xccc3, 0xccc6, 0xccc8, 0xccca, 0xcccb, 0xcccc, 0xcccd, 0xccce, 0xcccf, 0xccd1, 0xccd2, 0xccd3, 0xccd5, 0xccd6, 0xccd7,
+0xccd8, 0xccd9, 0xccda, 0xccdb, 0xccdc, 0xccdd, 0xccde, 0xccdf, 0xcce0, 0xcce1, 0xcce2, 0xcce3, 0xcce5, 0xcce6, 0xcce7,
+0xcce8, 0xcce9, 0xccea, 0xcceb, 0xcced, 0xccee, 0xccef, 0xccf1, 0xccf2, 0xccf3, 0xccf4, 0xccf5, 0xccf6, 0xccf7, 0xccf8,
+0xccf9, 0xccfa, 0xccfb, 0xccfc, 0xccfd, 0xccfe, 0xccff, 0xcd00, 0xcd02, 0xcd03, 0xcd04, 0xcd05, 0xcd06, 0xcd07, 0xcd0a,
+0xcd0b, 0xcd0d, 0xcd0e, 0xcd0f, 0xcd11, 0xcd12, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0xcd17, 0xcd1a, 0xcd1c, 0xcd1e, 0xcd1f,
+0xcd20, 0xcd21, 0xcd22, 0xcd23, 0xcd25, 0xcd26, 0xcd27, 0xcd29, 0xcd2a, 0xcd2b, 0xcd2d, 0xcd2e, 0xcd2f, 0xcd30, 0xcd31,
+0xcd32, 0xcd33, 0xcd34, 0xcd35, 0xcd36, 0xcd37, 0xcd38, 0xcd3a, 0xcd3b, 0xcd3c, 0xcd3d, 0xcd3e, 0xcd3f, 0xcd40, 0xcd41,
+0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50,
+0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd61,
+0xcd62, 0xcd63, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6e, 0xcd70, 0xcd72, 0xcd73, 0xcd74, 0xcd75,
+0xcd76, 0xcd77, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd7f, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85,
+0xcd86, 0xcd87, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd96, 0xcd97,
+0xcd99, 0xcd9a, 0xcd9b, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xcda1, 0xcda2, 0xcda3, 0xcda6, 0xcda8, 0xcdaa, 0xcdab, 0xcdac,
+0xcdad, 0xcdae, 0xcdaf, 0xcdb1, 0xcdb2, 0xcdb3, 0xcdb4, 0xcdb5, 0xcdb6, 0xcdb7, 0xcdb8, 0xcdb9, 0xcdba, 0xcdbb, 0xcdbc,
+0xcdbd, 0xcdbe, 0xcdbf, 0xcdc0, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc5, 0xcdc6, 0xcdc7, 0xcdc8, 0xcdc9, 0xcdca, 0xcdcb, 0xcdcd,
+0xcdce, 0xcdcf, 0xcdd1, 0xcdd2, 0xcdd3, 0xcdd4, 0xcdd5, 0xcdd6, 0xcdd7, 0xcdd8, 0xcdd9, 0xcdda, 0xcddb, 0xcddc, 0xcddd,
+0xcdde, 0xcddf, 0xcde0, 0xcde1, 0xcde2, 0xcde3, 0xcde4, 0xcde5, 0xcde6, 0xcde7, 0xcde9, 0xcdea, 0xcdeb, 0xcded, 0xcdee,
+0xcdef, 0xcdf1, 0xcdf2, 0xcdf3, 0xcdf4, 0xcdf5, 0xcdf6, 0xcdf7, 0xcdfa, 0xcdfc, 0xcdfe, 0xcdff, 0xce00, 0xce01, 0xce02,
+0xce03, 0xce05, 0xce06, 0xce07, 0xce09, 0xce0a, 0xce0b, 0xce0d, 0xce0e, 0xce0f, 0xce10, 0xce11, 0xce12, 0xce13, 0xce15,
+0xce16, 0xce17, 0xce18, 0xce1a, 0xce1b, 0xce1c, 0xce1d, 0xce1e, 0xce1f, 0xce22, 0xce23, 0xce25, 0xce26, 0xce27, 0xce29,
+0xce2a, 0xce2b, 0xce2c, 0xce2d, 0xce2e, 0xce2f, 0xce32, 0xce34, 0xce36, 0xce37, 0xce38, 0xce39, 0xce3a, 0xce3b, 0xce3c,
+0xce3d, 0xce3e, 0xce3f, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b,
+0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce5a, 0xce5b, 0xce5d,
+0xce5e, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce6a, 0xce6c, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73,
+0xce76, 0xce77, 0xce79, 0xce7a, 0xce7b, 0xce7d, 0xce7e, 0xce7f, 0xce80, 0xce81, 0xce82, 0xce83, 0xce86, 0xce88, 0xce8a,
+0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce92, 0xce93, 0xce95, 0xce96, 0xce97, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d,
+0xce9e, 0xce9f, 0xcea2, 0xcea6, 0xcea7, 0xcea8, 0xcea9, 0xceaa, 0xceab, 0xceae, 0xceaf, 0xceb0, 0xceb1, 0xceb2, 0xceb3,
+0xceb4, 0xceb5, 0xceb6, 0xceb7, 0xceb8, 0xceb9, 0xceba, 0xcebb, 0xcebc, 0xcebd, 0xcebe, 0xcebf, 0xcec0, 0xcec2, 0xcec3,
+0xcec4, 0xcec5, 0xcec6, 0xcec7, 0xcec8, 0xcec9, 0xceca, 0xcecb, 0xcecc, 0xcecd, 0xcece, 0xcecf, 0xced0, 0xced1, 0xced2,
+0xced3, 0xced4, 0xced5, 0xced6, 0xced7, 0xced8, 0xced9, 0xceda, 0xcedb, 0xcedc, 0xcedd, 0xcede, 0xcedf, 0xcee0, 0xcee1,
+0xcee2, 0xcee3, 0xcee6, 0xcee7, 0xcee9, 0xceea, 0xceed, 0xceee, 0xceef, 0xcef0, 0xcef1, 0xcef2, 0xcef3, 0xcef6, 0xcefa,
+0xcefb, 0xcefc, 0xcefd, 0xcefe, 0xceff, 0xcf02, 0xcf03, 0xcf05, 0xcf06, 0xcf07, 0xcf09, 0xcf0a, 0xcf0b, 0xcf0c, 0xcf0d,
+0xcf0e, 0xcf0f, 0xcf12, 0xcf14, 0xcf16, 0xcf17, 0xcf18, 0xcf19, 0xcf1a, 0xcf1b, 0xcf1d, 0xcf1e, 0xcf1f, 0xcf21, 0xcf22,
+0xcf23, 0xcf25, 0xcf26, 0xcf27, 0xcf28, 0xcf29, 0xcf2a, 0xcf2b, 0xcf2e, 0xcf32, 0xcf33, 0xcf34, 0xcf35, 0xcf36, 0xcf37,
+0xcf39, 0xcf3a, 0xcf3b, 0xcf3c, 0xcf3d, 0xcf3e, 0xcf3f, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47,
+0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf56, 0xcf57, 0xcf59,
+0xcf5a, 0xcf5b, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf66, 0xcf68, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d,
+0xcf6e, 0xcf6f, 0xcf72, 0xcf73, 0xcf75, 0xcf76, 0xcf77, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf7f, 0xcf81,
+0xcf82, 0xcf83, 0xcf84, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92,
+0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xcfa2,
+0xcfa3, 0xcfa4, 0xcfa5, 0xcfa6, 0xcfa7, 0xcfa9, 0xcfaa, 0xcfab, 0xcfac, 0xcfad, 0xcfae, 0xcfaf, 0xcfb1, 0xcfb2, 0xcfb3,
+0xcfb4, 0xcfb5, 0xcfb6, 0xcfb7, 0xcfb8, 0xcfb9, 0xcfba, 0xcfbb, 0xcfbc, 0xcfbd, 0xcfbe, 0xcfbf, 0xcfc0, 0xcfc1, 0xcfc2,
+0xcfc3, 0xcfc5, 0xcfc6, 0xcfc7, 0xcfc8, 0xcfc9, 0xcfca, 0xcfcb, 0xcfcc, 0xcfcd, 0xcfce, 0xcfcf, 0xcfd0, 0xcfd1, 0xcfd2,
+0xcfd3, 0xcfd4, 0xcfd5, 0xcfd6, 0xcfd7, 0xcfd8, 0xcfd9, 0xcfda, 0xcfdb, 0xcfdc, 0xcfdd, 0xcfde, 0xcfdf, 0xcfe2, 0xcfe3,
+0xcfe5, 0xcfe6, 0xcfe7, 0xcfe9, 0xcfea, 0xcfeb, 0xcfec, 0xcfed, 0xcfee, 0xcfef, 0xcff2, 0xcff4, 0xcff6, 0xcff7, 0xcff8,
+0xcff9, 0xcffa, 0xcffb, 0xcffd, 0xcffe, 0xcfff, 0xd001, 0xd002, 0xd003, 0xd005, 0xd006, 0xd007, 0xd008, 0xd009, 0xd00a,
+0xd00b, 0xd00c, 0xd00d, 0xd00e, 0xd00f, 0xd010, 0xd012, 0xd013, 0xd014, 0xd015, 0xd016, 0xd017, 0xd019, 0xd01a, 0xd01b,
+0xd01c, 0xd01d, 0xd01e, 0xd01f, 0xd020, 0xd021, 0xd022, 0xd023, 0xd024, 0xd025, 0xd026, 0xd027, 0xd028, 0xd029, 0xd02a,
+0xd02b, 0xd02c, 0xd02e, 0xd02f, 0xd030, 0xd031, 0xd032, 0xd033, 0xd036, 0xd037, 0xd039, 0xd03a, 0xd03b, 0xd03d, 0xd03e,
+0xd03f, 0xd040, 0xd041, 0xd042, 0xd043, 0xd046, 0xd048, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd051, 0xd052,
+0xd053, 0xd055, 0xd056, 0xd057, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd061, 0xd062, 0xd063, 0xd064,
+0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06e, 0xd06f, 0xd071, 0xd072, 0xd073, 0xd075, 0xd076, 0xd077,
+0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07e, 0xd07f, 0xd080, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089,
+0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098,
+0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd0a1, 0xd0a2, 0xd0a3, 0xd0a6, 0xd0a7, 0xd0a9, 0xd0aa,
+0xd0ab, 0xd0ad, 0xd0ae, 0xd0af, 0xd0b0, 0xd0b1, 0xd0b2, 0xd0b3, 0xd0b6, 0xd0b8, 0xd0ba, 0xd0bb, 0xd0bc, 0xd0bd, 0xd0be,
+0xd0bf, 0xd0c2, 0xd0c3, 0xd0c5, 0xd0c6, 0xd0c7, 0xd0ca, 0xd0cb, 0xd0cc, 0xd0cd, 0xd0ce, 0xd0cf, 0xd0d2, 0xd0d6, 0xd0d7,
+0xd0d8, 0xd0d9, 0xd0da, 0xd0db, 0xd0de, 0xd0df, 0xd0e1, 0xd0e2, 0xd0e3, 0xd0e5, 0xd0e6, 0xd0e7, 0xd0e8, 0xd0e9, 0xd0ea,
+0xd0eb, 0xd0ee, 0xd0f2, 0xd0f3, 0xd0f4, 0xd0f5, 0xd0f6, 0xd0f7, 0xd0f9, 0xd0fa, 0xd0fb, 0xd0fc, 0xd0fd, 0xd0fe, 0xd0ff,
+0xd100, 0xd101, 0xd102, 0xd103, 0xd104, 0xd105, 0xd106, 0xd107, 0xd108, 0xd109, 0xd10a, 0xd10b, 0xd10c, 0xd10e, 0xd10f,
+0xd110, 0xd111, 0xd112, 0xd113, 0xd114, 0xd115, 0xd116, 0xd117, 0xd118, 0xd119, 0xd11a, 0xd11b, 0xd11c, 0xd11d, 0xd11e,
+0xd11f, 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0xd125, 0xd126, 0xd127, 0xd128, 0xd129, 0xd12a, 0xd12b, 0xd12c, 0xd12d,
+0xd12e, 0xd12f, 0xd132, 0xd133, 0xd135, 0xd136, 0xd137, 0xd139, 0xd13b, 0xd13c, 0xd13d, 0xd13e, 0xd13f, 0xd142, 0xd146,
+0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14e, 0xd14f, 0xd151, 0xd152, 0xd153, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159,
+0xd15a, 0xd15b, 0xd15e, 0xd160, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd169, 0xd16a, 0xd16b, 0xd16d, 0xd16e,
+0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17d, 0xd17e,
+0xd17f, 0xd180, 0xd181, 0xd182, 0xd183, 0xd185, 0xd186, 0xd187, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f,
+0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e,
+0xd19f, 0xd1a2, 0xd1a3, 0xd1a5, 0xd1a6, 0xd1a7, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1ad, 0xd1ae, 0xd1af, 0xd1b2, 0xd1b4,
+0xd1b6, 0xd1b7, 0xd1b8, 0xd1b9, 0xd1bb, 0xd1bd, 0xd1be, 0xd1bf, 0xd1c1, 0xd1c2, 0xd1c3, 0xd1c4, 0xd1c5, 0xd1c6, 0xd1c7,
+0xd1c8, 0xd1c9, 0xd1ca, 0xd1cb, 0xd1cc, 0xd1cd, 0xd1ce, 0xd1cf, 0xd1d0, 0xd1d1, 0xd1d2, 0xd1d3, 0xd1d4, 0xd1d5, 0xd1d6,
+0xd1d7, 0xd1d9, 0xd1da, 0xd1db, 0xd1dc, 0xd1dd, 0xd1de, 0xd1df, 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6,
+0xd1e7, 0xd1e8, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ec, 0xd1ed, 0xd1ee, 0xd1ef, 0xd1f0, 0xd1f1, 0xd1f2, 0xd1f3, 0xd1f5, 0xd1f6,
+0xd1f7, 0xd1f9, 0xd1fa, 0xd1fb, 0xd1fc, 0xd1fd, 0xd1fe, 0xd1ff, 0xd200, 0xd201, 0xd202, 0xd203, 0xd204, 0xd205, 0xd206,
+0xd208, 0xd20a, 0xd20b, 0xd20c, 0xd20d, 0xd20e, 0xd20f, 0xd211, 0xd212, 0xd213, 0xd214, 0xd215, 0xd216, 0xd217, 0xd218,
+0xd219, 0xd21a, 0xd21b, 0xd21c, 0xd21d, 0xd21e, 0xd21f, 0xd220, 0xd221, 0xd222, 0xd223, 0xd224, 0xd225, 0xd226, 0xd227,
+0xd228, 0xd229, 0xd22a, 0xd22b, 0xd22e, 0xd22f, 0xd231, 0xd232, 0xd233, 0xd235, 0xd236, 0xd237, 0xd238, 0xd239, 0xd23a,
+0xd23b, 0xd23e, 0xd240, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e,
+0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25d, 0xd25e,
+0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e,
+0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d,
+0xd27e, 0xd27f, 0xd282, 0xd283, 0xd285, 0xd286, 0xd287, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd292,
+0xd293, 0xd294, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29d, 0xd29e, 0xd29f, 0xd2a1, 0xd2a2, 0xd2a3, 0xd2a5,
+0xd2a6, 0xd2a7, 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ad, 0xd2ae, 0xd2af, 0xd2b0, 0xd2b2, 0xd2b3, 0xd2b4, 0xd2b5, 0xd2b6,
+0xd2b7, 0xd2ba, 0xd2bb, 0xd2bd, 0xd2be, 0xd2c1, 0xd2c3, 0xd2c4, 0xd2c5, 0xd2c6, 0xd2c7, 0xd2ca, 0xd2cc, 0xd2cd, 0xd2ce,
+0xd2cf, 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3, 0xd2d5, 0xd2d6, 0xd2d7, 0xd2d9, 0xd2da, 0xd2db, 0xd2dd, 0xd2de, 0xd2df, 0xd2e0,
+0xd2e1, 0xd2e2, 0xd2e3, 0xd2e6, 0xd2e7, 0xd2e8, 0xd2e9, 0xd2ea, 0xd2eb, 0xd2ec, 0xd2ed, 0xd2ee, 0xd2ef, 0xd2f2, 0xd2f3,
+0xd2f5, 0xd2f6, 0xd2f7, 0xd2f9, 0xd2fa, 0xd2fb, 0xd2fc, 0xd2fd, 0xd2fe, 0xd2ff, 0xd302, 0xd304, 0xd306, 0xd307, 0xd308,
+0xd309, 0xd30a, 0xd30b, 0xd30f, 0xd311, 0xd312, 0xd313, 0xd315, 0xd317, 0xd318, 0xd319, 0xd31a, 0xd31b, 0xd31e, 0xd322,
+0xd323, 0xd324, 0xd326, 0xd327, 0xd32a, 0xd32b, 0xd32d, 0xd32e, 0xd32f, 0xd331, 0xd332, 0xd333, 0xd334, 0xd335, 0xd336,
+0xd337, 0xd33a, 0xd33e, 0xd33f, 0xd340, 0xd341, 0xd342, 0xd343, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c,
+0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b,
+0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a,
+0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379,
+0xd37a, 0xd37b, 0xd37e, 0xd37f, 0xd381, 0xd382, 0xd383, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38e,
+0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd39a, 0xd39b, 0xd39d, 0xd39e, 0xd39f, 0xd3a1, 0xd3a2, 0xd3a3, 0xd3a4,
+0xd3a5, 0xd3a6, 0xd3a7, 0xd3aa, 0xd3ac, 0xd3ae, 0xd3af, 0xd3b0, 0xd3b1, 0xd3b2, 0xd3b3, 0xd3b5, 0xd3b6, 0xd3b7, 0xd3b9,
+0xd3ba, 0xd3bb, 0xd3bd, 0xd3be, 0xd3bf, 0xd3c0, 0xd3c1, 0xd3c2, 0xd3c3, 0xd3c6, 0xd3c7, 0xd3ca, 0xd3cb, 0xd3cc, 0xd3cd,
+0xd3ce, 0xd3cf, 0xd3d1, 0xd3d2, 0xd3d3, 0xd3d4, 0xd3d5, 0xd3d6, 0xd3d7, 0xd3d9, 0xd3da, 0xd3db, 0xd3dc, 0xd3dd, 0xd3de,
+0xd3df, 0xd3e0, 0xd3e2, 0xd3e4, 0xd3e5, 0xd3e6, 0xd3e7, 0xd3e8, 0xd3e9, 0xd3ea, 0xd3eb, 0xd3ee, 0xd3ef, 0xd3f1, 0xd3f2,
+0xd3f3, 0xd3f5, 0xd3f6, 0xd3f7, 0xd3f8, 0xd3f9, 0xd3fa, 0xd3fb, 0xd3fe, 0xd400, 0xd402, 0xd403, 0xd404, 0xd405, 0xd406,
+0xd407, 0xd409, 0xd40a, 0xd40b, 0xd40c, 0xd40d, 0xd40e, 0xd40f, 0xd410, 0xd411, 0xd412, 0xd413, 0xd414, 0xd415, 0xd416,
+0xd417, 0xd418, 0xd419, 0xd41a, 0xd41b, 0xd41c, 0xd41e, 0xd41f, 0xd420, 0xd421, 0xd422, 0xd423, 0xd424, 0xd425, 0xd426,
+0xd427, 0xd428, 0xd429, 0xd42a, 0xd42b, 0xd42c, 0xd42d, 0xd42e, 0xd42f, 0xd430, 0xd431, 0xd432, 0xd433, 0xd434, 0xd435,
+0xd436, 0xd437, 0xd438, 0xd439, 0xd43a, 0xd43b, 0xd43c, 0xd43d, 0xd43e, 0xd43f, 0xd441, 0xd442, 0xd443, 0xd445, 0xd446,
+0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455,
+0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45d, 0xd45e, 0xd45f, 0xd461, 0xd462, 0xd463, 0xd465, 0xd466, 0xd467,
+0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46e, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd47a,
+0xd47b, 0xd47d, 0xd47e, 0xd481, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd48a, 0xd48c, 0xd48e, 0xd48f, 0xd490, 0xd491,
+0xd492, 0xd493, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd4a1,
+0xd4a2, 0xd4a3, 0xd4a4, 0xd4a5, 0xd4a6, 0xd4a7, 0xd4a8, 0xd4aa, 0xd4ab, 0xd4ac, 0xd4ad, 0xd4ae, 0xd4af, 0xd4b0, 0xd4b1,
+0xd4b2, 0xd4b3, 0xd4b4, 0xd4b5, 0xd4b6, 0xd4b7, 0xd4b8, 0xd4b9, 0xd4ba, 0xd4bb, 0xd4bc, 0xd4bd, 0xd4be, 0xd4bf, 0xd4c0,
+0xd4c1, 0xd4c2, 0xd4c3, 0xd4c4, 0xd4c5, 0xd4c6, 0xd4c7, 0xd4c8, 0xd4c9, 0xd4ca, 0xd4cb, 0xd4cd, 0xd4ce, 0xd4cf, 0xd4d1,
+0xd4d2, 0xd4d3, 0xd4d5, 0xd4d6, 0xd4d7, 0xd4d8, 0xd4d9, 0xd4da, 0xd4db, 0xd4dd, 0xd4de, 0xd4e0, 0xd4e1, 0xd4e2, 0xd4e3,
+0xd4e4, 0xd4e5, 0xd4e6, 0xd4e7, 0xd4e9, 0xd4ea, 0xd4eb, 0xd4ed, 0xd4ee, 0xd4ef, 0xd4f1, 0xd4f2, 0xd4f3, 0xd4f4, 0xd4f5,
+0xd4f6, 0xd4f7, 0xd4f9, 0xd4fa, 0xd4fc, 0xd4fe, 0xd4ff, 0xd500, 0xd501, 0xd502, 0xd503, 0xd505, 0xd506, 0xd507, 0xd509,
+0xd50a, 0xd50b, 0xd50d, 0xd50e, 0xd50f, 0xd510, 0xd511, 0xd512, 0xd513, 0xd516, 0xd518, 0xd519, 0xd51a, 0xd51b, 0xd51c,
+0xd51d, 0xd51e, 0xd51f, 0xd520, 0xd521, 0xd522, 0xd523, 0xd524, 0xd525, 0xd526, 0xd527, 0xd528, 0xd529, 0xd52a, 0xd52b,
+0xd52c, 0xd52d, 0xd52e, 0xd52f, 0xd530, 0xd531, 0xd532, 0xd533, 0xd534, 0xd535, 0xd536, 0xd537, 0xd538, 0xd539, 0xd53a,
+0xd53b, 0xd53e, 0xd53f, 0xd541, 0xd542, 0xd543, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54e, 0xd550,
+0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd55a, 0xd55b, 0xd55d, 0xd55e, 0xd55f, 0xd561, 0xd562, 0xd563, 0xd564,
+0xd566, 0xd567, 0xd56a, 0xd56c, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd576, 0xd577, 0xd579, 0xd57a, 0xd57b,
+0xd57d, 0xd57e, 0xd57f, 0xd580, 0xd581, 0xd582, 0xd583, 0xd586, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd591,
+0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0,
+0xd5a1, 0xd5a2, 0xd5a3, 0xd5a4, 0xd5a6, 0xd5a7, 0xd5a8, 0xd5a9, 0xd5aa, 0xd5ab, 0xd5ac, 0xd5ad, 0xd5ae, 0xd5af, 0xd5b0,
+0xd5b1, 0xd5b2, 0xd5b3, 0xd5b4, 0xd5b5, 0xd5b6, 0xd5b7, 0xd5b8, 0xd5b9, 0xd5ba, 0xd5bb, 0xd5bc, 0xd5bd, 0xd5be, 0xd5bf,
+0xd5c0, 0xd5c1, 0xd5c2, 0xd5c3, 0xd5c4, 0xd5c5, 0xd5c6, 0xd5c7, 0xd5ca, 0xd5cb, 0xd5cd, 0xd5ce, 0xd5cf, 0xd5d1, 0xd5d3,
+0xd5d4, 0xd5d5, 0xd5d6, 0xd5d7, 0xd5da, 0xd5dc, 0xd5de, 0xd5df, 0xd5e0, 0xd5e1, 0xd5e2, 0xd5e3, 0xd5e6, 0xd5e7, 0xd5e9,
+0xd5ea, 0xd5eb, 0xd5ed, 0xd5ee, 0xd5ef, 0xd5f0, 0xd5f1, 0xd5f2, 0xd5f3, 0xd5f6, 0xd5f8, 0xd5fa, 0xd5fb, 0xd5fc, 0xd5fd,
+0xd5fe, 0xd5ff, 0xd602, 0xd603, 0xd605, 0xd606, 0xd607, 0xd609, 0xd60a, 0xd60b, 0xd60c, 0xd60d, 0xd60e, 0xd60f, 0xd612,
+0xd616, 0xd617, 0xd618, 0xd619, 0xd61a, 0xd61b, 0xd61d, 0xd61e, 0xd61f, 0xd621, 0xd622, 0xd623, 0xd625, 0xd626, 0xd627,
+0xd628, 0xd629, 0xd62a, 0xd62b, 0xd62c, 0xd62e, 0xd62f, 0xd630, 0xd631, 0xd632, 0xd633, 0xd634, 0xd635, 0xd636, 0xd637,
+0xd63a, 0xd63b, 0xd63d, 0xd63e, 0xd63f, 0xd641, 0xd642, 0xd643, 0xd644, 0xd646, 0xd647, 0xd64a, 0xd64c, 0xd64e, 0xd64f,
+0xd650, 0xd652, 0xd653, 0xd656, 0xd657, 0xd659, 0xd65a, 0xd65b, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663,
+0xd664, 0xd665, 0xd666, 0xd668, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd672, 0xd673, 0xd675, 0xd676, 0xd677,
+0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd67f, 0xd680, 0xd681, 0xd682, 0xd684, 0xd686, 0xd687, 0xd688,
+0xd689, 0xd68a, 0xd68b, 0xd68e, 0xd68f, 0xd691, 0xd692, 0xd693, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b,
+0xd69c, 0xd69e, 0xd6a0, 0xd6a2, 0xd6a3, 0xd6a4, 0xd6a5, 0xd6a6, 0xd6a7, 0xd6a9, 0xd6aa, 0xd6ab, 0xd6ad, 0xd6ae, 0xd6af,
+0xd6b1, 0xd6b2, 0xd6b3, 0xd6b4, 0xd6b5, 0xd6b6, 0xd6b7, 0xd6b8, 0xd6ba, 0xd6bc, 0xd6bd, 0xd6be, 0xd6bf, 0xd6c0, 0xd6c1,
+0xd6c2, 0xd6c3, 0xd6c6, 0xd6c7, 0xd6c9, 0xd6ca, 0xd6cb, 0xd6cd, 0xd6ce, 0xd6cf, 0xd6d0, 0xd6d2, 0xd6d3, 0xd6d5, 0xd6d6,
+0xd6d8, 0xd6da, 0xd6db, 0xd6dc, 0xd6dd, 0xd6de, 0xd6df, 0xd6e1, 0xd6e2, 0xd6e3, 0xd6e5, 0xd6e6, 0xd6e7, 0xd6e9, 0xd6ea,
+0xd6eb, 0xd6ec, 0xd6ed, 0xd6ee, 0xd6ef, 0xd6f1, 0xd6f2, 0xd6f3, 0xd6f4, 0xd6f6, 0xd6f7, 0xd6f8, 0xd6f9, 0xd6fa, 0xd6fb,
+0xd6fe, 0xd6ff, 0xd701, 0xd702, 0xd703, 0xd705, 0xd706, 0xd707, 0xd708, 0xd709, 0xd70a, 0xd70b, 0xd70c, 0xd70d, 0xd70e,
+0xd70f, 0xd710, 0xd712, 0xd713, 0xd714, 0xd715, 0xd716, 0xd717, 0xd71a, 0xd71b, 0xd71d, 0xd71e, 0xd71f, 0xd721, 0xd722,
+0xd723, 0xd724, 0xd725, 0xd726, 0xd727, 0xd72a, 0xd72c, 0xd72e, 0xd72f, 0xd730, 0xd731, 0xd732, 0xd733, 0xd736, 0xd737,
+0xd739, 0xd73a, 0xd73b, 0xd73d, 0xd73e, 0xd73f, 0xd740, 0xd741, 0xd742, 0xd743, 0xd745, 0xd746, 0xd748, 0xd74a, 0xd74b,
+0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd752, 0xd753, 0xd755, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd762, 0xd764,
+0xd766, 0xd767, 0xd768, 0xd76a, 0xd76b, 0xd76d, 0xd76e, 0xd76f, 0xd771, 0xd772, 0xd773, 0xd775, 0xd776, 0xd777, 0xd778,
+0xd779, 0xd77a, 0xd77b, 0xd77e, 0xd77f, 0xd780, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd78a, 0xd78b, 0xd78d,
+0xd78e, 0xd78f, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd79a, 0xd79c, 0xd79e, 0xd79f, 0xd7a0, 0xd7a1,
+0xd7a2, 0xd7a3
+};
diff --git a/src/plugins/codecs/kr/kr.pro b/src/plugins/codecs/kr/kr.pro
new file mode 100644
index 0000000000..1cc28d80a5
--- /dev/null
+++ b/src/plugins/codecs/kr/kr.pro
@@ -0,0 +1,20 @@
+TARGET = qkrcodecs
+include(../../qpluginbase.pri)
+
+CONFIG += warn_on
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/codecs
+QT = core
+
+HEADERS = qeuckrcodec.h \
+ cp949codetbl.h
+SOURCES = qeuckrcodec.cpp \
+ main.cpp
+
+wince*: {
+ SOURCES += ../../../corelib/kernel/qfunctions_wince.cpp
+}
+
+target.path += $$[QT_INSTALL_PLUGINS]/codecs
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001B2E5
diff --git a/src/plugins/codecs/kr/main.cpp b/src/plugins/codecs/kr/main.cpp
new file mode 100644
index 0000000000..14531ba3f5
--- /dev/null
+++ b/src/plugins/codecs/kr/main.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtextcodecplugin.h>
+#include <qtextcodec.h>
+#include <qstringlist.h>
+
+#include "qeuckrcodec.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODECPLUGIN
+
+class KRTextCodecs : public QTextCodecPlugin
+{
+public:
+ KRTextCodecs() {}
+
+ QList<QByteArray> names() const;
+ QList<QByteArray> aliases() const;
+ QList<int> mibEnums() const;
+
+ QTextCodec *createForMib(int);
+ QTextCodec *createForName(const QByteArray &);
+};
+
+QList<QByteArray> KRTextCodecs::names() const
+{
+ QList<QByteArray> list;
+ list += QEucKrCodec::_name();
+#ifdef Q_WS_X11
+ list += QFontKsc5601Codec::_name();
+#endif
+ list += QCP949Codec::_name();
+ return list;
+}
+
+QList<QByteArray> KRTextCodecs::aliases() const
+{
+ QList<QByteArray> list;
+ list += QEucKrCodec::_aliases();
+#ifdef Q_WS_X11
+ list += QFontKsc5601Codec::_aliases();
+#endif
+ list += QCP949Codec::_aliases();
+ return list;
+}
+
+QList<int> KRTextCodecs::mibEnums() const
+{
+ QList<int> list;
+ list += QEucKrCodec::_mibEnum();
+#ifdef Q_WS_X11
+ list += QFontKsc5601Codec::_mibEnum();
+#endif
+ list += QCP949Codec::_mibEnum();
+ return list;
+}
+
+QTextCodec *KRTextCodecs::createForMib(int mib)
+{
+ if (mib == QEucKrCodec::_mibEnum())
+ return new QEucKrCodec;
+#ifdef Q_WS_X11
+ if (mib == QFontKsc5601Codec::_mibEnum())
+ return new QFontKsc5601Codec;
+#endif
+ if (mib == QCP949Codec::_mibEnum())
+ return new QCP949Codec;
+ return 0;
+}
+
+
+QTextCodec *KRTextCodecs::createForName(const QByteArray &name)
+{
+ if (name == QEucKrCodec::_name() || QEucKrCodec::_aliases().contains(name))
+ return new QEucKrCodec;
+#ifdef Q_WS_X11
+ if (name == QFontKsc5601Codec::_name() || QFontKsc5601Codec::_aliases().contains(name))
+ return new QFontKsc5601Codec;
+#endif
+ if (name == QCP949Codec::_name() || QCP949Codec::_aliases().contains(name))
+ return new QCP949Codec;
+ return 0;
+}
+
+
+Q_EXPORT_STATIC_PLUGIN(KRTextCodecs);
+Q_EXPORT_PLUGIN2(qkrcodecs, KRTextCodecs);
+
+#endif // QT_NO_TEXTCODECPLUGIN
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/kr/qeuckrcodec.cpp b/src/plugins/codecs/kr/qeuckrcodec.cpp
new file mode 100644
index 0000000000..f490a82c0f
--- /dev/null
+++ b/src/plugins/codecs/kr/qeuckrcodec.cpp
@@ -0,0 +1,3571 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the cp949 code was originally written by Joon-Kyu Park, and is included
+// in Qt with the author's permission and the grateful thanks of the Qt team.
+
+/*! \class QEucKrCodec
+ \reentrant
+ \internal
+*/
+
+/*!
+ \class QCP949Codec
+ \internal
+ \brief The QCP949Codec class handles encoding and decoding of text in CP949 encoding.
+
+ CP949 stands for code page 949, default code page for Korean text on Windows.
+*/
+
+/* these must be made \internal
+ virtual int mibEnum() const;
+ const char* name() const;
+
+ QTextDecoder* makeDecoder() const;
+
+ QByteArray fromUnicode(const QString& uc, int& lenInOut) const;
+ QString toUnicode(const char* chars, int len) const;
+*/
+
+#include "qeuckrcodec.h"
+#include "cp949codetbl.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+unsigned int qt_Ksc5601ToUnicode(unsigned int code);
+
+unsigned int qt_UnicodeToKsc5601(unsigned int unicode);
+
+#define IsEucChar(c) (((c) >= 0xa1) && ((c) <= 0xfe))
+#define IsCP949Char(c) (((c) >= 0x81) && ((c) <= 0xa0))
+#define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar(QChar::ReplacementCharacter))
+
+/*!
+ \reimp
+*/
+
+QByteArray QEucKrCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i = 0; i < len; i++) {
+ unsigned short ch = uc[i].unicode();
+ uint j;
+ if (ch < 0x80) {
+ // ASCII
+ *cursor++ = ch;
+ } else if ((j = qt_UnicodeToKsc5601(ch))) {
+ // KSC 5601
+ *cursor++ = (j >> 8) | 0x80;
+ *cursor++ = (j & 0xff) | 0x80;
+ } else {
+ // Error
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+QString QEucKrCodec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[2] = {0, 0};
+ int nbuf = 0;
+ QChar replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ if (ch == 0)
+ break;
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80) {
+ // ASCII
+ result += QLatin1Char(ch);
+ } else if (IsEucChar(ch)) {
+ // KSC 5601
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ break;
+ case 1:
+ // KSC 5601
+ if (IsEucChar(ch)) {
+ uint u = qt_Ksc5601ToUnicode((buf[0] << 8) | ch);
+ result += QValidChar(u);
+ } else {
+ // Error
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+int QEucKrCodec::_mibEnum()
+{
+ return 38;
+}
+
+QByteArray QEucKrCodec::_name()
+{
+ return "EUC-KR";
+}
+
+
+#ifdef Q_WS_X11
+QFontKsc5601Codec::QFontKsc5601Codec()
+{
+}
+
+
+QByteArray QFontKsc5601Codec::_name()
+{
+ return "ksc5601.1987-0";
+}
+
+
+int QFontKsc5601Codec::_mibEnum()
+{
+ return 36;
+}
+
+
+QString QFontKsc5601Codec::convertToUnicode(const char*, int, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontKsc5601Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+ ch = qt_UnicodeToKsc5601(ch.unicode());
+
+ if (! ch.isNull()) {
+ *rdata++ = ch.row() & 0x7f ;
+ *rdata++ = ch.cell() & 0x7f;
+ } else {
+ //white square
+ *rdata++ = 0x21;
+ *rdata++ = 0x60;
+ }
+ }
+
+ return result;
+}
+#endif // Q_WS_X11
+
+// code converter wrapper
+
+static unsigned short ksc2unicode (unsigned short code);
+
+static unsigned short unicode2ksc (unsigned short code);
+
+unsigned int qt_Ksc5601ToUnicode(unsigned int code)
+{
+#if 0
+ printf("qt_Ksc5601ToUnicode : code = %x, unicode = %x\n",
+ code, ksc2unicode((unsigned short)code));
+#endif
+ return ksc2unicode((unsigned short)code);
+}
+
+unsigned int qt_UnicodeToKsc5601(unsigned int unicode)
+{
+#if 0
+ printf("qt_UnicodeToKsc5601 : unicode = %x, %x\n",
+ unicode, unicode2ksc((unsigned short)unicode));
+#endif
+ return unicode2ksc((unsigned short)unicode);
+}
+
+/* Table including ksc5601 hangul to unicode */
+static const unsigned short ksc5601_hangul_to_unicode[2350]=
+{
+ 0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10,
+ 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19,
+ 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d,
+ 0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b,
+ 0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77,
+ 0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86,
+ 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d,
+ 0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf,
+ 0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4,
+ 0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7,
+ 0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5,
+ 0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06, 0xad0c, 0xad0d,
+ 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29, 0xad2c, 0xad2d,
+ 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45, 0xad47, 0xad49,
+ 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c, 0xad6d, 0xad70,
+ 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c, 0xad7d, 0xad7f,
+ 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90, 0xad9c, 0xad9d,
+ 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8, 0xadd0, 0xadd1,
+ 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9, 0xadfc, 0xadff,
+ 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d, 0xae14, 0xae30,
+ 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40, 0xae41, 0xae43,
+ 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e, 0xae50, 0xae54,
+ 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61, 0xae65, 0xae68,
+ 0xae69, 0xae6c, 0xae70, 0xae78, 0xae79, 0xae7b, 0xae7c, 0xae7d,
+ 0xae84, 0xae85, 0xae8c, 0xaebc, 0xaebd, 0xaebe, 0xaec0, 0xaec4,
+ 0xaecc, 0xaecd, 0xaecf, 0xaed0, 0xaed1, 0xaed8, 0xaed9, 0xaedc,
+ 0xaee8, 0xaeeb, 0xaeed, 0xaef4, 0xaef8, 0xaefc, 0xaf07, 0xaf08,
+ 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d, 0xaf30, 0xaf32, 0xaf34, 0xaf3c,
+ 0xaf3d, 0xaf3f, 0xaf41, 0xaf42, 0xaf43, 0xaf48, 0xaf49, 0xaf50,
+ 0xaf5c, 0xaf5d, 0xaf64, 0xaf65, 0xaf79, 0xaf80, 0xaf84, 0xaf88,
+ 0xaf90, 0xaf91, 0xaf95, 0xaf9c, 0xafb8, 0xafb9, 0xafbc, 0xafc0,
+ 0xafc7, 0xafc8, 0xafc9, 0xafcb, 0xafcd, 0xafce, 0xafd4, 0xafdc,
+ 0xafe8, 0xafe9, 0xaff0, 0xaff1, 0xaff4, 0xaff8, 0xb000, 0xb001,
+ 0xb004, 0xb00c, 0xb010, 0xb014, 0xb01c, 0xb01d, 0xb028, 0xb044,
+ 0xb045, 0xb048, 0xb04a, 0xb04c, 0xb04e, 0xb053, 0xb054, 0xb055,
+ 0xb057, 0xb059, 0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c,
+ 0xb08d, 0xb08f, 0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f,
+ 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad,
+ 0xb0ae, 0xb0af, 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc,
+ 0xb0c4, 0xb0c5, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4,
+ 0xb0d8, 0xb0e0, 0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110,
+ 0xb112, 0xb113, 0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123,
+ 0xb124, 0xb125, 0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138,
+ 0xb139, 0xb140, 0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154,
+ 0xb155, 0xb158, 0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180,
+ 0xb182, 0xb188, 0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194,
+ 0xb198, 0xb19c, 0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd,
+ 0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd,
+ 0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217,
+ 0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268,
+ 0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290,
+ 0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3,
+ 0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9,
+ 0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2,
+ 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee,
+ 0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa,
+ 0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311,
+ 0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358,
+ 0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365, 0xb367, 0xb369,
+ 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378, 0xb380, 0xb381,
+ 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394, 0xb3a0, 0xb3a1,
+ 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb, 0xb3cc, 0xb3ce,
+ 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db, 0xb3dd, 0xb3e0,
+ 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c, 0xb420, 0xb428,
+ 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454, 0xb458, 0xb460,
+ 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488, 0xb49d, 0xb4a4,
+ 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0, 0xb4c4, 0xb4c8,
+ 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3, 0xb4e4, 0xb4e6,
+ 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514, 0xb515, 0xb518,
+ 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528, 0xb529, 0xb52a,
+ 0xb530, 0xb531, 0xb534, 0xb538, 0xb540, 0xb541, 0xb543, 0xb544,
+ 0xb545, 0xb54b, 0xb54c, 0xb54d, 0xb550, 0xb554, 0xb55c, 0xb55d,
+ 0xb55f, 0xb560, 0xb561, 0xb5a0, 0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa,
+ 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc,
+ 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc, 0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1,
+ 0xb5d8, 0xb5ec, 0xb610, 0xb611, 0xb614, 0xb618, 0xb625, 0xb62c,
+ 0xb634, 0xb648, 0xb664, 0xb668, 0xb69c, 0xb69d, 0xb6a0, 0xb6a4,
+ 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4, 0xb6f0, 0xb6f4, 0xb6f8, 0xb700,
+ 0xb701, 0xb705, 0xb728, 0xb729, 0xb72c, 0xb72f, 0xb730, 0xb738,
+ 0xb739, 0xb73b, 0xb744, 0xb748, 0xb74c, 0xb754, 0xb755, 0xb760,
+ 0xb764, 0xb768, 0xb770, 0xb771, 0xb773, 0xb775, 0xb77c, 0xb77d,
+ 0xb780, 0xb784, 0xb78c, 0xb78d, 0xb78f, 0xb790, 0xb791, 0xb792,
+ 0xb796, 0xb797, 0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9,
+ 0xb7ab, 0xb7ac, 0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9,
+ 0xb7ec, 0xb7ed, 0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800,
+ 0xb801, 0xb807, 0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819,
+ 0xb81b, 0xb81d, 0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835,
+ 0xb837, 0xb838, 0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c,
+ 0xb85d, 0xb860, 0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878,
+ 0xb87c, 0xb88d, 0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1,
+ 0xb8c3, 0xb8c5, 0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1,
+ 0xb8e8, 0xb8e9, 0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd,
+ 0xb904, 0xb918, 0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c,
+ 0xb94f, 0xb951, 0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969,
+ 0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985,
+ 0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0,
+ 0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc,
+ 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db,
+ 0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec,
+ 0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01,
+ 0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48,
+ 0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58,
+ 0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71,
+ 0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8,
+ 0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb,
+ 0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc, 0xbb00, 0xbb04,
+ 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20, 0xbb29, 0xbb2b,
+ 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e,
+ 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f, 0xbb50, 0xbb54,
+ 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c, 0xbb90, 0xbba4,
+ 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4, 0xbbc8, 0xbbd0,
+ 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00, 0xbc02, 0xbc08,
+ 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11, 0xbc14, 0xbc15,
+ 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f,
+ 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30, 0xbc31, 0xbc34,
+ 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45, 0xbc49, 0xbc4c,
+ 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88, 0xbc8b, 0xbc8c,
+ 0xbc8e, 0xbc94, 0xbc95, 0xbc97, 0xbc99, 0xbc9a, 0xbca0, 0xbca1,
+ 0xbca4, 0xbca7, 0xbca8, 0xbcb0, 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5,
+ 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4, 0xbccd, 0xbccf, 0xbcd0, 0xbcd1,
+ 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc,
+ 0xbd04, 0xbd05, 0xbd07, 0xbd09, 0xbd10, 0xbd14, 0xbd24, 0xbd2c,
+ 0xbd40, 0xbd48, 0xbd49, 0xbd4c, 0xbd50, 0xbd58, 0xbd59, 0xbd64,
+ 0xbd68, 0xbd80, 0xbd81, 0xbd84, 0xbd87, 0xbd88, 0xbd89, 0xbd8a,
+ 0xbd90, 0xbd91, 0xbd93, 0xbd95, 0xbd99, 0xbd9a, 0xbd9c, 0xbda4,
+ 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5, 0xbdd8, 0xbddc, 0xbde9, 0xbdf0,
+ 0xbdf4, 0xbdf8, 0xbe00, 0xbe03, 0xbe05, 0xbe0c, 0xbe0d, 0xbe10,
+ 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f, 0xbe44, 0xbe45, 0xbe48, 0xbe4c,
+ 0xbe4e, 0xbe54, 0xbe55, 0xbe57, 0xbe59, 0xbe5a, 0xbe5b, 0xbe60,
+ 0xbe61, 0xbe64, 0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74,
+ 0xbe75, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d,
+ 0xbe8f, 0xbe90, 0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1,
+ 0xbed4, 0xbed7, 0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec,
+ 0xbf01, 0xbf08, 0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d,
+ 0xbf40, 0xbf41, 0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94,
+ 0xbfb0, 0xbfc5, 0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf,
+ 0xbfe1, 0xc03c, 0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069,
+ 0xc090, 0xc091, 0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5,
+ 0xc0ac, 0xc0ad, 0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6,
+ 0xc0bc, 0xc0bd, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9,
+ 0xc0cc, 0xc0d0, 0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4,
+ 0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100,
+ 0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f,
+ 0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f,
+ 0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148,
+ 0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c,
+ 0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178,
+ 0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c,
+ 0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0,
+ 0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0,
+ 0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200,
+ 0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c,
+ 0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d, 0xc22f, 0xc231,
+ 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254, 0xc258, 0xc260,
+ 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c, 0xc27d, 0xc27f,
+ 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b, 0xc29d, 0xc2a4,
+ 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5, 0xc2b7, 0xc2b9,
+ 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb, 0xc2ec, 0xc2ed,
+ 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb, 0xc2fc, 0xc300,
+ 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314, 0xc315, 0xc318,
+ 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345, 0xc368, 0xc369,
+ 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c, 0xc37d, 0xc384,
+ 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc, 0xc3df, 0xc3e0,
+ 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5, 0xc3f8, 0xc408,
+ 0xc410, 0xc424, 0xc42c, 0xc430, 0xc434, 0xc43c, 0xc43d, 0xc448,
+ 0xc464, 0xc465, 0xc468, 0xc46c, 0xc474, 0xc475, 0xc479, 0xc480,
+ 0xc494, 0xc49c, 0xc4b8, 0xc4bc, 0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4,
+ 0xc4f8, 0xc4fa, 0xc4ff, 0xc500, 0xc501, 0xc50c, 0xc510, 0xc514,
+ 0xc51c, 0xc528, 0xc529, 0xc52c, 0xc530, 0xc538, 0xc539, 0xc53b,
+ 0xc53d, 0xc544, 0xc545, 0xc548, 0xc549, 0xc54a, 0xc54c, 0xc54d,
+ 0xc54e, 0xc553, 0xc554, 0xc555, 0xc557, 0xc558, 0xc559, 0xc55d,
+ 0xc55e, 0xc560, 0xc561, 0xc564, 0xc568, 0xc570, 0xc571, 0xc573,
+ 0xc574, 0xc575, 0xc57c, 0xc57d, 0xc580, 0xc584, 0xc587, 0xc58c,
+ 0xc58d, 0xc58f, 0xc591, 0xc595, 0xc597, 0xc598, 0xc59c, 0xc5a0,
+ 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8, 0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd,
+ 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca,
+ 0xc5cc, 0xc5ce, 0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1,
+ 0xc5e3, 0xc5e5, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6,
+ 0xc5f7, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605,
+ 0xc606, 0xc607, 0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b,
+ 0xc61c, 0xc624, 0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630,
+ 0xc633, 0xc634, 0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641,
+ 0xc644, 0xc648, 0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c,
+ 0xc65d, 0xc660, 0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c,
+ 0xc680, 0xc688, 0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698,
+ 0xc69c, 0xc6a4, 0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4,
+ 0xc6b8, 0xc6b9, 0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc,
+ 0xc6cd, 0xc6d0, 0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8,
+ 0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705,
+ 0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721,
+ 0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c,
+ 0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751,
+ 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c,
+ 0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d,
+ 0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a,
+ 0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a,
+ 0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad,
+ 0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8,
+ 0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8,
+ 0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a, 0xc810, 0xc811,
+ 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820, 0xc824, 0xc82c,
+ 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840, 0xc848, 0xc849,
+ 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874, 0xc878, 0xc87a,
+ 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887, 0xc88b, 0xc88c,
+ 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8, 0xc8bc, 0xc8bd,
+ 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7, 0xc8d9, 0xc8e0,
+ 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900, 0xc904, 0xc905,
+ 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918, 0xc92c, 0xc934,
+ 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961, 0xc963, 0xc96c,
+ 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c, 0xc990, 0xc998,
+ 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4, 0xc9c7, 0xc9c8,
+ 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3, 0xc9d5, 0xc9d6, 0xc9d9, 0xc9da,
+ 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2, 0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed,
+ 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8, 0xc9f9, 0xc9fc, 0xca00, 0xca08,
+ 0xca09, 0xca0b, 0xca0c, 0xca0d, 0xca14, 0xca18, 0xca29, 0xca4c,
+ 0xca4d, 0xca50, 0xca54, 0xca5c, 0xca5d, 0xca5f, 0xca60, 0xca61,
+ 0xca68, 0xca7d, 0xca84, 0xca98, 0xcabc, 0xcabd, 0xcac0, 0xcac4,
+ 0xcacc, 0xcacd, 0xcacf, 0xcad1, 0xcad3, 0xcad8, 0xcad9, 0xcae0,
+ 0xcaec, 0xcaf4, 0xcb08, 0xcb10, 0xcb14, 0xcb18, 0xcb20, 0xcb21,
+ 0xcb41, 0xcb48, 0xcb49, 0xcb4c, 0xcb50, 0xcb58, 0xcb59, 0xcb5d,
+ 0xcb64, 0xcb78, 0xcb79, 0xcb9c, 0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7,
+ 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10, 0xcc14, 0xcc1c, 0xcc1d, 0xcc21,
+ 0xcc22, 0xcc27, 0xcc28, 0xcc29, 0xcc2c, 0xcc2e, 0xcc30, 0xcc38,
+ 0xcc39, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48,
+ 0xcc4c, 0xcc54, 0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64,
+ 0xcc66, 0xcc68, 0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0,
+ 0xcca8, 0xcca9, 0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8,
+ 0xccbc, 0xccc4, 0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4,
+ 0xccec, 0xccf0, 0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18,
+ 0xcd19, 0xcd1b, 0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c,
+ 0xcd60, 0xcd64, 0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88,
+ 0xcd94, 0xcd95, 0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9,
+ 0xcdb0, 0xcdc4, 0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8,
+ 0xcdf9, 0xcdfb, 0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19,
+ 0xce20, 0xce21, 0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35,
+ 0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69,
+ 0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85,
+ 0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1,
+ 0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5,
+ 0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9,
+ 0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15,
+ 0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31,
+ 0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67,
+ 0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c,
+ 0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8,
+ 0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011,
+ 0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c, 0xd044, 0xd045,
+ 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060, 0xd06c, 0xd06d,
+ 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4, 0xd0a5, 0xd0a8,
+ 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0, 0xd0c1, 0xd0c4,
+ 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0dc,
+ 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef, 0xd0f0, 0xd0f1,
+ 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138, 0xd13a, 0xd140,
+ 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d, 0xd150, 0xd154,
+ 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c, 0xd17c, 0xd184,
+ 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0, 0xd1b1, 0xd1b3,
+ 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4, 0xd1f8, 0xd207,
+ 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234, 0xd23c, 0xd23d,
+ 0xd23f, 0xd241, 0xd248, 0xd25c, 0xd264, 0xd280, 0xd281, 0xd284,
+ 0xd288, 0xd290, 0xd291, 0xd295, 0xd29c, 0xd2a0, 0xd2a4, 0xd2ac,
+ 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc, 0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8,
+ 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8, 0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0,
+ 0xd2f1, 0xd2f4, 0xd2f8, 0xd300, 0xd301, 0xd303, 0xd305, 0xd30c,
+ 0xd30d, 0xd30e, 0xd310, 0xd314, 0xd316, 0xd31c, 0xd31d, 0xd31f,
+ 0xd320, 0xd321, 0xd325, 0xd328, 0xd329, 0xd32c, 0xd330, 0xd338,
+ 0xd339, 0xd33b, 0xd33c, 0xd33d, 0xd344, 0xd345, 0xd37c, 0xd37d,
+ 0xd380, 0xd384, 0xd38c, 0xd38d, 0xd38f, 0xd390, 0xd391, 0xd398,
+ 0xd399, 0xd39c, 0xd3a0, 0xd3a8, 0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4,
+ 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5, 0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8,
+ 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed, 0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd,
+ 0xd3ff, 0xd401, 0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460,
+ 0xd464, 0xd46d, 0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480,
+ 0xd482, 0xd488, 0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc,
+ 0xd4d0, 0xd4d4, 0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8,
+ 0xd4fb, 0xd4fd, 0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517,
+ 0xd53c, 0xd53d, 0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551,
+ 0xd558, 0xd559, 0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b,
+ 0xd56d, 0xd574, 0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587,
+ 0xd588, 0xd589, 0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0,
+ 0xd5d2, 0xd5d8, 0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8,
+ 0xd5ec, 0xd5f4, 0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604,
+ 0xd608, 0xd610, 0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620,
+ 0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648,
+ 0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c,
+ 0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c,
+ 0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac,
+ 0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1,
+ 0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5,
+ 0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c,
+ 0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738,
+ 0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756,
+ 0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769,
+ 0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789,
+ 0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d
+};
+
+/* Table including ksc5601 symbol to unicode */
+static const unsigned short ksc5601_symbol_to_unicode[1115]=
+{
+ 0x3000, 0x3001, 0x3002, 0x00b7, 0x2025, 0x2026, 0x00a8, 0x3003,
+ 0x00ad, 0x2015, 0x2225, 0xff3c, 0x223c, 0x2018, 0x2019, 0x201c,
+ 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
+ 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7,
+ 0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033,
+ 0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220,
+ 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b,
+ 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1,
+ 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191,
+ 0x2193, 0x2194, 0x3013, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d,
+ 0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282,
+ 0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2, 0x21d2, 0x21d4,
+ 0x2200, 0x2203, 0x00b4, 0xff5e, 0x02c7, 0x02d8, 0x02dd, 0x02da,
+ 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x02d0, 0x222e, 0x2211,
+ 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0, 0x25b7, 0x25b6,
+ 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, 0x2299, 0x25c8,
+ 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5, 0x25a8, 0x25a7,
+ 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c, 0x261e, 0x00b6,
+ 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266d,
+ 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116, 0x33c7, 0x2122,
+ 0x33c2, 0x33d8, 0x2121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xff01, 0xff02, 0xff03, 0xff04,
+ 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c,
+ 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14,
+ 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c,
+ 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24,
+ 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c,
+ 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34,
+ 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xffe6,
+ 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44,
+ 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c,
+ 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54,
+ 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c,
+ 0xff5d, 0xffe3, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136,
+ 0x3137, 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e,
+ 0x313f, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146,
+ 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e,
+ 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156,
+ 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e,
+ 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166,
+ 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e,
+ 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176,
+ 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e,
+ 0x317f, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186,
+ 0x3187, 0x3188, 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e,
+ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+ 0x2178, 0x2179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2160,
+ 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+ 0x2169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
+ 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
+ 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
+ 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
+ 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2500, 0x2502,
+ 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534,
+ 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523,
+ 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537,
+ 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512, 0x2511,
+ 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d, 0x251e, 0x251f,
+ 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a, 0x252d, 0x252e,
+ 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a, 0x253d, 0x253e,
+ 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,
+ 0x2549, 0x254a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3395, 0x3396, 0x3397, 0x2113,
+ 0x3398, 0x33c4, 0x33a3, 0x33a4, 0x33a5, 0x33a6, 0x3399, 0x339a,
+ 0x339b, 0x339c, 0x339d, 0x339e, 0x339f, 0x33a0, 0x33a1, 0x33a2,
+ 0x33ca, 0x338d, 0x338e, 0x338f, 0x33cf, 0x3388, 0x3389, 0x33c8,
+ 0x33a7, 0x33a8, 0x33b0, 0x33b1, 0x33b2, 0x33b3, 0x33b4, 0x33b5,
+ 0x33b6, 0x33b7, 0x33b8, 0x33b9, 0x3380, 0x3381, 0x3382, 0x3383,
+ 0x3384, 0x33ba, 0x33bb, 0x33bc, 0x33bd, 0x33be, 0x33bf, 0x3390,
+ 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33c0, 0x33c1, 0x338a,
+ 0x338b, 0x338c, 0x33d6, 0x33c5, 0x33ad, 0x33ae, 0x33af, 0x33db,
+ 0x33a9, 0x33aa, 0x33ab, 0x33ac, 0x33dd, 0x33d0, 0x33d3, 0x33c3,
+ 0x33c9, 0x33dc, 0x33c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00c6, 0x00d0, 0x00aa, 0x0126, 0x0000, 0x0132,
+ 0x0000, 0x013f, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166,
+ 0x014a, 0x0000, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265,
+ 0x3266, 0x3267, 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d,
+ 0x326e, 0x326f, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275,
+ 0x3276, 0x3277, 0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1,
+ 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9,
+ 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1,
+ 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9,
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
+ 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd,
+ 0x2153, 0x2154, 0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e,
+ 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140,
+ 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149,
+ 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207,
+ 0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f,
+ 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217,
+ 0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f,
+ 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7,
+ 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af,
+ 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475,
+ 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d,
+ 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3,
+ 0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084, 0x3041, 0x3042,
+ 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a,
+ 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052,
+ 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a,
+ 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062,
+ 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a,
+ 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072,
+ 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a,
+ 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082,
+ 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a,
+ 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092,
+ 0x3093, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x30a1, 0x30a2, 0x30a3, 0x30a4,
+ 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac,
+ 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4,
+ 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc,
+ 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4,
+ 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc,
+ 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4,
+ 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc,
+ 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4,
+ 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec,
+ 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4,
+ 0x30f5, 0x30f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
+ 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c,
+ 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,
+ 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c,
+ 0x042d, 0x042e, 0x042f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435,
+ 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c,
+ 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444,
+ 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c,
+ 0x044d, 0x044e, 0x044f
+};
+
+struct map
+{
+ unsigned short unicode;
+ unsigned short kscode;
+};
+
+/* Map Table including unicode to ksc5601 symbol */
+static const struct map unicode_to_ksc5601_symbol[986]=
+{
+ {0x00a1, 0x222e}, {0x00a4, 0x2234}, {0x00a7, 0x2157},
+ {0x00a8, 0x2127}, {0x00aa, 0x2823}, {0x00ad, 0x2129},
+ {0x00b0, 0x2146}, {0x00b1, 0x213e}, {0x00b2, 0x2977},
+ {0x00b3, 0x2978}, {0x00b4, 0x2225}, {0x00b6, 0x2252},
+ {0x00b7, 0x2124}, {0x00b8, 0x222c}, {0x00b9, 0x2976},
+ {0x00ba, 0x282c}, {0x00bc, 0x2879}, {0x00bd, 0x2876},
+ {0x00be, 0x287a}, {0x00bf, 0x222f}, {0x00c6, 0x2821},
+ {0x00d0, 0x2822}, {0x00d7, 0x213f}, {0x00d8, 0x282a},
+ {0x00de, 0x282d}, {0x00df, 0x292c}, {0x00e6, 0x2921},
+ {0x00f0, 0x2923}, {0x00f7, 0x2140}, {0x00f8, 0x292a},
+ {0x00fe, 0x292d}, {0x0111, 0x2922}, {0x0126, 0x2824},
+ {0x0127, 0x2924}, {0x0131, 0x2925}, {0x0132, 0x2826},
+ {0x0133, 0x2926}, {0x0138, 0x2927}, {0x013f, 0x2828},
+ {0x0140, 0x2928}, {0x0141, 0x2829}, {0x0142, 0x2929},
+ {0x0149, 0x2930}, {0x014a, 0x282f}, {0x014b, 0x292f},
+ {0x0152, 0x282b}, {0x0153, 0x292b}, {0x0166, 0x282e},
+ {0x0167, 0x292e}, {0x02c7, 0x2227}, {0x02d0, 0x2230},
+ {0x02d8, 0x2228}, {0x02d9, 0x222b}, {0x02da, 0x222a},
+ {0x02db, 0x222d}, {0x02dd, 0x2229}, {0x0391, 0x2541},
+ {0x0392, 0x2542}, {0x0393, 0x2543}, {0x0394, 0x2544},
+ {0x0395, 0x2545}, {0x0396, 0x2546}, {0x0397, 0x2547},
+ {0x0398, 0x2548}, {0x0399, 0x2549}, {0x039a, 0x254a},
+ {0x039b, 0x254b}, {0x039c, 0x254c}, {0x039d, 0x254d},
+ {0x039e, 0x254e}, {0x039f, 0x254f}, {0x03a0, 0x2550},
+ {0x03a1, 0x2551}, {0x03a3, 0x2552}, {0x03a4, 0x2553},
+ {0x03a5, 0x2554}, {0x03a6, 0x2555}, {0x03a7, 0x2556},
+ {0x03a8, 0x2557}, {0x03a9, 0x2558}, {0x03b1, 0x2561},
+ {0x03b2, 0x2562}, {0x03b3, 0x2563}, {0x03b4, 0x2564},
+ {0x03b5, 0x2565}, {0x03b6, 0x2566}, {0x03b7, 0x2567},
+ {0x03b8, 0x2568}, {0x03b9, 0x2569}, {0x03ba, 0x256a},
+ {0x03bb, 0x256b}, {0x03bc, 0x256c}, {0x03bd, 0x256d},
+ {0x03be, 0x256e}, {0x03bf, 0x256f}, {0x03c0, 0x2570},
+ {0x03c1, 0x2571}, {0x03c3, 0x2572}, {0x03c4, 0x2573},
+ {0x03c5, 0x2574}, {0x03c6, 0x2575}, {0x03c7, 0x2576},
+ {0x03c8, 0x2577}, {0x03c9, 0x2578}, {0x0401, 0x2c27},
+ {0x0410, 0x2c21}, {0x0411, 0x2c22}, {0x0412, 0x2c23},
+ {0x0413, 0x2c24}, {0x0414, 0x2c25}, {0x0415, 0x2c26},
+ {0x0416, 0x2c28}, {0x0417, 0x2c29}, {0x0418, 0x2c2a},
+ {0x0419, 0x2c2b}, {0x041a, 0x2c2c}, {0x041b, 0x2c2d},
+ {0x041c, 0x2c2e}, {0x041d, 0x2c2f}, {0x041e, 0x2c30},
+ {0x041f, 0x2c31}, {0x0420, 0x2c32}, {0x0421, 0x2c33},
+ {0x0422, 0x2c34}, {0x0423, 0x2c35}, {0x0424, 0x2c36},
+ {0x0425, 0x2c37}, {0x0426, 0x2c38}, {0x0427, 0x2c39},
+ {0x0428, 0x2c3a}, {0x0429, 0x2c3b}, {0x042a, 0x2c3c},
+ {0x042b, 0x2c3d}, {0x042c, 0x2c3e}, {0x042d, 0x2c3f},
+ {0x042e, 0x2c40}, {0x042f, 0x2c41}, {0x0430, 0x2c51},
+ {0x0431, 0x2c52}, {0x0432, 0x2c53}, {0x0433, 0x2c54},
+ {0x0434, 0x2c55}, {0x0435, 0x2c56}, {0x0436, 0x2c58},
+ {0x0437, 0x2c59}, {0x0438, 0x2c5a}, {0x0439, 0x2c5b},
+ {0x043a, 0x2c5c}, {0x043b, 0x2c5d}, {0x043c, 0x2c5e},
+ {0x043d, 0x2c5f}, {0x043e, 0x2c60}, {0x043f, 0x2c61},
+ {0x0440, 0x2c62}, {0x0441, 0x2c63}, {0x0442, 0x2c64},
+ {0x0443, 0x2c65}, {0x0444, 0x2c66}, {0x0445, 0x2c67},
+ {0x0446, 0x2c68}, {0x0447, 0x2c69}, {0x0448, 0x2c6a},
+ {0x0449, 0x2c6b}, {0x044a, 0x2c6c}, {0x044b, 0x2c6d},
+ {0x044c, 0x2c6e}, {0x044d, 0x2c6f}, {0x044e, 0x2c70},
+ {0x044f, 0x2c71}, {0x0451, 0x2c57}, {0x2015, 0x212a},
+ {0x2018, 0x212e}, {0x2019, 0x212f}, {0x201c, 0x2130},
+ {0x201d, 0x2131}, {0x2020, 0x2253}, {0x2021, 0x2254},
+ {0x2025, 0x2125}, {0x2026, 0x2126}, {0x2030, 0x2236},
+ {0x2032, 0x2147}, {0x2033, 0x2148}, {0x203b, 0x2158},
+ {0x2074, 0x2979}, {0x207f, 0x297a}, {0x2081, 0x297b},
+ {0x2082, 0x297c}, {0x2083, 0x297d}, {0x2084, 0x297e},
+ {0x2103, 0x2149}, {0x2109, 0x2235}, {0x2113, 0x2724},
+ {0x2116, 0x2260}, {0x2121, 0x2265}, {0x2122, 0x2262},
+ {0x2126, 0x2759}, {0x212b, 0x214a}, {0x2153, 0x2877},
+ {0x2154, 0x2878}, {0x215b, 0x287b}, {0x215c, 0x287c},
+ {0x215d, 0x287d}, {0x215e, 0x287e}, {0x2160, 0x2530},
+ {0x2161, 0x2531}, {0x2162, 0x2532}, {0x2163, 0x2533},
+ {0x2164, 0x2534}, {0x2165, 0x2535}, {0x2166, 0x2536},
+ {0x2167, 0x2537}, {0x2168, 0x2538}, {0x2169, 0x2539},
+ {0x2170, 0x2521}, {0x2171, 0x2522}, {0x2172, 0x2523},
+ {0x2173, 0x2524}, {0x2174, 0x2525}, {0x2175, 0x2526},
+ {0x2176, 0x2527}, {0x2177, 0x2528}, {0x2178, 0x2529},
+ {0x2179, 0x252a}, {0x2190, 0x2167}, {0x2191, 0x2168},
+ {0x2192, 0x2166}, {0x2193, 0x2169}, {0x2194, 0x216a},
+ {0x2195, 0x2255}, {0x2196, 0x2258}, {0x2197, 0x2256},
+ {0x2198, 0x2259}, {0x2199, 0x2257}, {0x21d2, 0x2221},
+ {0x21d4, 0x2222}, {0x2200, 0x2223}, {0x2202, 0x2153},
+ {0x2203, 0x2224}, {0x2207, 0x2154}, {0x2208, 0x2174},
+ {0x220b, 0x2175}, {0x220f, 0x2233}, {0x2211, 0x2232},
+ {0x221a, 0x216e}, {0x221d, 0x2170}, {0x221e, 0x2144},
+ {0x2220, 0x2150}, {0x2225, 0x212b}, {0x2227, 0x217c},
+ {0x2228, 0x217d}, {0x2229, 0x217b}, {0x222a, 0x217a},
+ {0x222b, 0x2172}, {0x222c, 0x2173}, {0x222e, 0x2231},
+ {0x2234, 0x2145}, {0x2235, 0x2171}, {0x223c, 0x212d},
+ {0x223d, 0x216f}, {0x2252, 0x2156}, {0x2260, 0x2141},
+ {0x2261, 0x2155}, {0x2264, 0x2142}, {0x2265, 0x2143},
+ {0x226a, 0x216c}, {0x226b, 0x216d}, {0x2282, 0x2178},
+ {0x2283, 0x2179}, {0x2286, 0x2176}, {0x2287, 0x2177},
+ {0x2299, 0x2241}, {0x22a5, 0x2151}, {0x2312, 0x2152},
+ {0x2460, 0x2867}, {0x2461, 0x2868}, {0x2462, 0x2869},
+ {0x2463, 0x286a}, {0x2464, 0x286b}, {0x2465, 0x286c},
+ {0x2466, 0x286d}, {0x2467, 0x286e}, {0x2468, 0x286f},
+ {0x2469, 0x2870}, {0x246a, 0x2871}, {0x246b, 0x2872},
+ {0x246c, 0x2873}, {0x246d, 0x2874}, {0x246e, 0x2875},
+ {0x2474, 0x2967}, {0x2475, 0x2968}, {0x2476, 0x2969},
+ {0x2477, 0x296a}, {0x2478, 0x296b}, {0x2479, 0x296c},
+ {0x247a, 0x296d}, {0x247b, 0x296e}, {0x247c, 0x296f},
+ {0x247d, 0x2970}, {0x247e, 0x2971}, {0x247f, 0x2972},
+ {0x2480, 0x2973}, {0x2481, 0x2974}, {0x2482, 0x2975},
+ {0x249c, 0x294d}, {0x249d, 0x294e}, {0x249e, 0x294f},
+ {0x249f, 0x2950}, {0x24a0, 0x2951}, {0x24a1, 0x2952},
+ {0x24a2, 0x2953}, {0x24a3, 0x2954}, {0x24a4, 0x2955},
+ {0x24a5, 0x2956}, {0x24a6, 0x2957}, {0x24a7, 0x2958},
+ {0x24a8, 0x2959}, {0x24a9, 0x295a}, {0x24aa, 0x295b},
+ {0x24ab, 0x295c}, {0x24ac, 0x295d}, {0x24ad, 0x295e},
+ {0x24ae, 0x295f}, {0x24af, 0x2960}, {0x24b0, 0x2961},
+ {0x24b1, 0x2962}, {0x24b2, 0x2963}, {0x24b3, 0x2964},
+ {0x24b4, 0x2965}, {0x24b5, 0x2966}, {0x24d0, 0x284d},
+ {0x24d1, 0x284e}, {0x24d2, 0x284f}, {0x24d3, 0x2850},
+ {0x24d4, 0x2851}, {0x24d5, 0x2852}, {0x24d6, 0x2853},
+ {0x24d7, 0x2854}, {0x24d8, 0x2855}, {0x24d9, 0x2856},
+ {0x24da, 0x2857}, {0x24db, 0x2858}, {0x24dc, 0x2859},
+ {0x24dd, 0x285a}, {0x24de, 0x285b}, {0x24df, 0x285c},
+ {0x24e0, 0x285d}, {0x24e1, 0x285e}, {0x24e2, 0x285f},
+ {0x24e3, 0x2860}, {0x24e4, 0x2861}, {0x24e5, 0x2862},
+ {0x24e6, 0x2863}, {0x24e7, 0x2864}, {0x24e8, 0x2865},
+ {0x24e9, 0x2866}, {0x2500, 0x2621}, {0x2501, 0x262c},
+ {0x2502, 0x2622}, {0x2503, 0x262d}, {0x250c, 0x2623},
+ {0x250d, 0x2648}, {0x250e, 0x2647}, {0x250f, 0x262e},
+ {0x2510, 0x2624}, {0x2511, 0x2642}, {0x2512, 0x2641},
+ {0x2513, 0x262f}, {0x2514, 0x2626}, {0x2515, 0x2646},
+ {0x2516, 0x2645}, {0x2517, 0x2631}, {0x2518, 0x2625},
+ {0x2519, 0x2644}, {0x251a, 0x2643}, {0x251b, 0x2630},
+ {0x251c, 0x2627}, {0x251d, 0x263c}, {0x251e, 0x2649},
+ {0x251f, 0x264a}, {0x2520, 0x2637}, {0x2521, 0x264b},
+ {0x2522, 0x264c}, {0x2523, 0x2632}, {0x2524, 0x2629},
+ {0x2525, 0x263e}, {0x2526, 0x264d}, {0x2527, 0x264e},
+ {0x2528, 0x2639}, {0x2529, 0x264f}, {0x252a, 0x2650},
+ {0x252b, 0x2634}, {0x252c, 0x2628}, {0x252d, 0x2651},
+ {0x252e, 0x2652}, {0x252f, 0x2638}, {0x2530, 0x263d},
+ {0x2531, 0x2653}, {0x2532, 0x2654}, {0x2533, 0x2633},
+ {0x2534, 0x262a}, {0x2535, 0x2655}, {0x2536, 0x2656},
+ {0x2537, 0x263a}, {0x2538, 0x263f}, {0x2539, 0x2657},
+ {0x253a, 0x2658}, {0x253b, 0x2635}, {0x253c, 0x262b},
+ {0x253d, 0x2659}, {0x253e, 0x265a}, {0x253f, 0x263b},
+ {0x2540, 0x265b}, {0x2541, 0x265c}, {0x2542, 0x2640},
+ {0x2543, 0x265d}, {0x2544, 0x265e}, {0x2545, 0x265f},
+ {0x2546, 0x2660}, {0x2547, 0x2661}, {0x2548, 0x2662},
+ {0x2549, 0x2663}, {0x254a, 0x2664}, {0x254b, 0x2636},
+ {0x2592, 0x2246}, {0x25a0, 0x2161}, {0x25a1, 0x2160},
+ {0x25a3, 0x2243}, {0x25a4, 0x2247}, {0x25a5, 0x2248},
+ {0x25a6, 0x224b}, {0x25a7, 0x224a}, {0x25a8, 0x2249},
+ {0x25a9, 0x224c}, {0x25b2, 0x2163}, {0x25b3, 0x2162},
+ {0x25b6, 0x223a}, {0x25b7, 0x2239}, {0x25bc, 0x2165},
+ {0x25bd, 0x2164}, {0x25c0, 0x2238}, {0x25c1, 0x2237},
+ {0x25c6, 0x215f}, {0x25c7, 0x215e}, {0x25c8, 0x2242},
+ {0x25cb, 0x215b}, {0x25ce, 0x215d}, {0x25cf, 0x215c},
+ {0x25d0, 0x2244}, {0x25d1, 0x2245}, {0x2605, 0x215a},
+ {0x2606, 0x2159}, {0x260e, 0x224f}, {0x260f, 0x224e},
+ {0x261c, 0x2250}, {0x261e, 0x2251}, {0x2640, 0x214f},
+ {0x2642, 0x214e}, {0x2660, 0x223c}, {0x2661, 0x223d},
+ {0x2663, 0x2240}, {0x2664, 0x223b}, {0x2665, 0x223e},
+ {0x2667, 0x223f}, {0x2668, 0x224d}, {0x2669, 0x225b},
+ {0x266a, 0x225c}, {0x266c, 0x225d}, {0x266d, 0x225a},
+ {0x3000, 0x2121}, {0x3001, 0x2122}, {0x3002, 0x2123},
+ {0x3003, 0x2128}, {0x3008, 0x2134}, {0x3009, 0x2135},
+ {0x300a, 0x2136}, {0x300b, 0x2137}, {0x300c, 0x2138},
+ {0x300d, 0x2139}, {0x300e, 0x213a}, {0x300f, 0x213b},
+ {0x3010, 0x213c}, {0x3011, 0x213d}, {0x3013, 0x216b},
+ {0x3014, 0x2132}, {0x3015, 0x2133}, {0x3041, 0x2a21},
+ {0x3042, 0x2a22}, {0x3043, 0x2a23}, {0x3044, 0x2a24},
+ {0x3045, 0x2a25}, {0x3046, 0x2a26}, {0x3047, 0x2a27},
+ {0x3048, 0x2a28}, {0x3049, 0x2a29}, {0x304a, 0x2a2a},
+ {0x304b, 0x2a2b}, {0x304c, 0x2a2c}, {0x304d, 0x2a2d},
+ {0x304e, 0x2a2e}, {0x304f, 0x2a2f}, {0x3050, 0x2a30},
+ {0x3051, 0x2a31}, {0x3052, 0x2a32}, {0x3053, 0x2a33},
+ {0x3054, 0x2a34}, {0x3055, 0x2a35}, {0x3056, 0x2a36},
+ {0x3057, 0x2a37}, {0x3058, 0x2a38}, {0x3059, 0x2a39},
+ {0x305a, 0x2a3a}, {0x305b, 0x2a3b}, {0x305c, 0x2a3c},
+ {0x305d, 0x2a3d}, {0x305e, 0x2a3e}, {0x305f, 0x2a3f},
+ {0x3060, 0x2a40}, {0x3061, 0x2a41}, {0x3062, 0x2a42},
+ {0x3063, 0x2a43}, {0x3064, 0x2a44}, {0x3065, 0x2a45},
+ {0x3066, 0x2a46}, {0x3067, 0x2a47}, {0x3068, 0x2a48},
+ {0x3069, 0x2a49}, {0x306a, 0x2a4a}, {0x306b, 0x2a4b},
+ {0x306c, 0x2a4c}, {0x306d, 0x2a4d}, {0x306e, 0x2a4e},
+ {0x306f, 0x2a4f}, {0x3070, 0x2a50}, {0x3071, 0x2a51},
+ {0x3072, 0x2a52}, {0x3073, 0x2a53}, {0x3074, 0x2a54},
+ {0x3075, 0x2a55}, {0x3076, 0x2a56}, {0x3077, 0x2a57},
+ {0x3078, 0x2a58}, {0x3079, 0x2a59}, {0x307a, 0x2a5a},
+ {0x307b, 0x2a5b}, {0x307c, 0x2a5c}, {0x307d, 0x2a5d},
+ {0x307e, 0x2a5e}, {0x307f, 0x2a5f}, {0x3080, 0x2a60},
+ {0x3081, 0x2a61}, {0x3082, 0x2a62}, {0x3083, 0x2a63},
+ {0x3084, 0x2a64}, {0x3085, 0x2a65}, {0x3086, 0x2a66},
+ {0x3087, 0x2a67}, {0x3088, 0x2a68}, {0x3089, 0x2a69},
+ {0x308a, 0x2a6a}, {0x308b, 0x2a6b}, {0x308c, 0x2a6c},
+ {0x308d, 0x2a6d}, {0x308e, 0x2a6e}, {0x308f, 0x2a6f},
+ {0x3090, 0x2a70}, {0x3091, 0x2a71}, {0x3092, 0x2a72},
+ {0x3093, 0x2a73}, {0x30a1, 0x2b21}, {0x30a2, 0x2b22},
+ {0x30a3, 0x2b23}, {0x30a4, 0x2b24}, {0x30a5, 0x2b25},
+ {0x30a6, 0x2b26}, {0x30a7, 0x2b27}, {0x30a8, 0x2b28},
+ {0x30a9, 0x2b29}, {0x30aa, 0x2b2a}, {0x30ab, 0x2b2b},
+ {0x30ac, 0x2b2c}, {0x30ad, 0x2b2d}, {0x30ae, 0x2b2e},
+ {0x30af, 0x2b2f}, {0x30b0, 0x2b30}, {0x30b1, 0x2b31},
+ {0x30b2, 0x2b32}, {0x30b3, 0x2b33}, {0x30b4, 0x2b34},
+ {0x30b5, 0x2b35}, {0x30b6, 0x2b36}, {0x30b7, 0x2b37},
+ {0x30b8, 0x2b38}, {0x30b9, 0x2b39}, {0x30ba, 0x2b3a},
+ {0x30bb, 0x2b3b}, {0x30bc, 0x2b3c}, {0x30bd, 0x2b3d},
+ {0x30be, 0x2b3e}, {0x30bf, 0x2b3f}, {0x30c0, 0x2b40},
+ {0x30c1, 0x2b41}, {0x30c2, 0x2b42}, {0x30c3, 0x2b43},
+ {0x30c4, 0x2b44}, {0x30c5, 0x2b45}, {0x30c6, 0x2b46},
+ {0x30c7, 0x2b47}, {0x30c8, 0x2b48}, {0x30c9, 0x2b49},
+ {0x30ca, 0x2b4a}, {0x30cb, 0x2b4b}, {0x30cc, 0x2b4c},
+ {0x30cd, 0x2b4d}, {0x30ce, 0x2b4e}, {0x30cf, 0x2b4f},
+ {0x30d0, 0x2b50}, {0x30d1, 0x2b51}, {0x30d2, 0x2b52},
+ {0x30d3, 0x2b53}, {0x30d4, 0x2b54}, {0x30d5, 0x2b55},
+ {0x30d6, 0x2b56}, {0x30d7, 0x2b57}, {0x30d8, 0x2b58},
+ {0x30d9, 0x2b59}, {0x30da, 0x2b5a}, {0x30db, 0x2b5b},
+ {0x30dc, 0x2b5c}, {0x30dd, 0x2b5d}, {0x30de, 0x2b5e},
+ {0x30df, 0x2b5f}, {0x30e0, 0x2b60}, {0x30e1, 0x2b61},
+ {0x30e2, 0x2b62}, {0x30e3, 0x2b63}, {0x30e4, 0x2b64},
+ {0x30e5, 0x2b65}, {0x30e6, 0x2b66}, {0x30e7, 0x2b67},
+ {0x30e8, 0x2b68}, {0x30e9, 0x2b69}, {0x30ea, 0x2b6a},
+ {0x30eb, 0x2b6b}, {0x30ec, 0x2b6c}, {0x30ed, 0x2b6d},
+ {0x30ee, 0x2b6e}, {0x30ef, 0x2b6f}, {0x30f0, 0x2b70},
+ {0x30f1, 0x2b71}, {0x30f2, 0x2b72}, {0x30f3, 0x2b73},
+ {0x30f4, 0x2b74}, {0x30f5, 0x2b75}, {0x30f6, 0x2b76},
+ {0x3131, 0x2421}, {0x3132, 0x2422}, {0x3133, 0x2423},
+ {0x3134, 0x2424}, {0x3135, 0x2425}, {0x3136, 0x2426},
+ {0x3137, 0x2427}, {0x3138, 0x2428}, {0x3139, 0x2429},
+ {0x313a, 0x242a}, {0x313b, 0x242b}, {0x313c, 0x242c},
+ {0x313d, 0x242d}, {0x313e, 0x242e}, {0x313f, 0x242f},
+ {0x3140, 0x2430}, {0x3141, 0x2431}, {0x3142, 0x2432},
+ {0x3143, 0x2433}, {0x3144, 0x2434}, {0x3145, 0x2435},
+ {0x3146, 0x2436}, {0x3147, 0x2437}, {0x3148, 0x2438},
+ {0x3149, 0x2439}, {0x314a, 0x243a}, {0x314b, 0x243b},
+ {0x314c, 0x243c}, {0x314d, 0x243d}, {0x314e, 0x243e},
+ {0x314f, 0x243f}, {0x3150, 0x2440}, {0x3151, 0x2441},
+ {0x3152, 0x2442}, {0x3153, 0x2443}, {0x3154, 0x2444},
+ {0x3155, 0x2445}, {0x3156, 0x2446}, {0x3157, 0x2447},
+ {0x3158, 0x2448}, {0x3159, 0x2449}, {0x315a, 0x244a},
+ {0x315b, 0x244b}, {0x315c, 0x244c}, {0x315d, 0x244d},
+ {0x315e, 0x244e}, {0x315f, 0x244f}, {0x3160, 0x2450},
+ {0x3161, 0x2451}, {0x3162, 0x2452}, {0x3163, 0x2453},
+ {0x3164, 0x2454}, {0x3165, 0x2455}, {0x3166, 0x2456},
+ {0x3167, 0x2457}, {0x3168, 0x2458}, {0x3169, 0x2459},
+ {0x316a, 0x245a}, {0x316b, 0x245b}, {0x316c, 0x245c},
+ {0x316d, 0x245d}, {0x316e, 0x245e}, {0x316f, 0x245f},
+ {0x3170, 0x2460}, {0x3171, 0x2461}, {0x3172, 0x2462},
+ {0x3173, 0x2463}, {0x3174, 0x2464}, {0x3175, 0x2465},
+ {0x3176, 0x2466}, {0x3177, 0x2467}, {0x3178, 0x2468},
+ {0x3179, 0x2469}, {0x317a, 0x246a}, {0x317b, 0x246b},
+ {0x317c, 0x246c}, {0x317d, 0x246d}, {0x317e, 0x246e},
+ {0x317f, 0x246f}, {0x3180, 0x2470}, {0x3181, 0x2471},
+ {0x3182, 0x2472}, {0x3183, 0x2473}, {0x3184, 0x2474},
+ {0x3185, 0x2475}, {0x3186, 0x2476}, {0x3187, 0x2477},
+ {0x3188, 0x2478}, {0x3189, 0x2479}, {0x318a, 0x247a},
+ {0x318b, 0x247b}, {0x318c, 0x247c}, {0x318d, 0x247d},
+ {0x318e, 0x247e}, {0x3200, 0x2931}, {0x3201, 0x2932},
+ {0x3202, 0x2933}, {0x3203, 0x2934}, {0x3204, 0x2935},
+ {0x3205, 0x2936}, {0x3206, 0x2937}, {0x3207, 0x2938},
+ {0x3208, 0x2939}, {0x3209, 0x293a}, {0x320a, 0x293b},
+ {0x320b, 0x293c}, {0x320c, 0x293d}, {0x320d, 0x293e},
+ {0x320e, 0x293f}, {0x320f, 0x2940}, {0x3210, 0x2941},
+ {0x3211, 0x2942}, {0x3212, 0x2943}, {0x3213, 0x2944},
+ {0x3214, 0x2945}, {0x3215, 0x2946}, {0x3216, 0x2947},
+ {0x3217, 0x2948}, {0x3218, 0x2949}, {0x3219, 0x294a},
+ {0x321a, 0x294b}, {0x321b, 0x294c}, {0x321c, 0x225f},
+ {0x3260, 0x2831}, {0x3261, 0x2832}, {0x3262, 0x2833},
+ {0x3263, 0x2834}, {0x3264, 0x2835}, {0x3265, 0x2836},
+ {0x3266, 0x2837}, {0x3267, 0x2838}, {0x3268, 0x2839},
+ {0x3269, 0x283a}, {0x326a, 0x283b}, {0x326b, 0x283c},
+ {0x326c, 0x283d}, {0x326d, 0x283e}, {0x326e, 0x283f},
+ {0x326f, 0x2840}, {0x3270, 0x2841}, {0x3271, 0x2842},
+ {0x3272, 0x2843}, {0x3273, 0x2844}, {0x3274, 0x2845},
+ {0x3275, 0x2846}, {0x3276, 0x2847}, {0x3277, 0x2848},
+ {0x3278, 0x2849}, {0x3279, 0x284a}, {0x327a, 0x284b},
+ {0x327b, 0x284c}, {0x327f, 0x225e}, {0x3380, 0x2749},
+ {0x3381, 0x274a}, {0x3382, 0x274b}, {0x3383, 0x274c},
+ {0x3384, 0x274d}, {0x3388, 0x273a}, {0x3389, 0x273b},
+ {0x338a, 0x275c}, {0x338b, 0x275d}, {0x338c, 0x275e},
+ {0x338d, 0x2736}, {0x338e, 0x2737}, {0x338f, 0x2738},
+ {0x3390, 0x2754}, {0x3391, 0x2755}, {0x3392, 0x2756},
+ {0x3393, 0x2757}, {0x3394, 0x2758}, {0x3395, 0x2721},
+ {0x3396, 0x2722}, {0x3397, 0x2723}, {0x3398, 0x2725},
+ {0x3399, 0x272b}, {0x339a, 0x272c}, {0x339b, 0x272d},
+ {0x339c, 0x272e}, {0x339d, 0x272f}, {0x339e, 0x2730},
+ {0x339f, 0x2731}, {0x33a0, 0x2732}, {0x33a1, 0x2733},
+ {0x33a2, 0x2734}, {0x33a3, 0x2727}, {0x33a4, 0x2728},
+ {0x33a5, 0x2729}, {0x33a6, 0x272a}, {0x33a7, 0x273d},
+ {0x33a8, 0x273e}, {0x33a9, 0x2765}, {0x33aa, 0x2766},
+ {0x33ab, 0x2767}, {0x33ac, 0x2768}, {0x33ad, 0x2761},
+ {0x33ae, 0x2762}, {0x33af, 0x2763}, {0x33b0, 0x273f},
+ {0x33b1, 0x2740}, {0x33b2, 0x2741}, {0x33b3, 0x2742},
+ {0x33b4, 0x2743}, {0x33b5, 0x2744}, {0x33b6, 0x2745},
+ {0x33b7, 0x2746}, {0x33b8, 0x2747}, {0x33b9, 0x2748},
+ {0x33ba, 0x274e}, {0x33bb, 0x274f}, {0x33bc, 0x2750},
+ {0x33bd, 0x2751}, {0x33be, 0x2752}, {0x33bf, 0x2753},
+ {0x33c0, 0x275a}, {0x33c1, 0x275b}, {0x33c2, 0x2263},
+ {0x33c3, 0x276c}, {0x33c4, 0x2726}, {0x33c5, 0x2760},
+ {0x33c6, 0x276f}, {0x33c7, 0x2261}, {0x33c8, 0x273c},
+ {0x33c9, 0x276d}, {0x33ca, 0x2735}, {0x33cf, 0x2739},
+ {0x33d0, 0x276a}, {0x33d3, 0x276b}, {0x33d6, 0x275f},
+ {0x33d8, 0x2264}, {0x33db, 0x2764}, {0x33dc, 0x276e},
+ {0x33dd, 0x2769}, {0xff01, 0x2321}, {0xff02, 0x2322},
+ {0xff03, 0x2323}, {0xff04, 0x2324}, {0xff05, 0x2325},
+ {0xff06, 0x2326}, {0xff07, 0x2327}, {0xff08, 0x2328},
+ {0xff09, 0x2329}, {0xff0a, 0x232a}, {0xff0b, 0x232b},
+ {0xff0c, 0x232c}, {0xff0d, 0x232d}, {0xff0e, 0x232e},
+ {0xff0f, 0x232f}, {0xff10, 0x2330}, {0xff11, 0x2331},
+ {0xff12, 0x2332}, {0xff13, 0x2333}, {0xff14, 0x2334},
+ {0xff15, 0x2335}, {0xff16, 0x2336}, {0xff17, 0x2337},
+ {0xff18, 0x2338}, {0xff19, 0x2339}, {0xff1a, 0x233a},
+ {0xff1b, 0x233b}, {0xff1c, 0x233c}, {0xff1d, 0x233d},
+ {0xff1e, 0x233e}, {0xff1f, 0x233f}, {0xff20, 0x2340},
+ {0xff21, 0x2341}, {0xff22, 0x2342}, {0xff23, 0x2343},
+ {0xff24, 0x2344}, {0xff25, 0x2345}, {0xff26, 0x2346},
+ {0xff27, 0x2347}, {0xff28, 0x2348}, {0xff29, 0x2349},
+ {0xff2a, 0x234a}, {0xff2b, 0x234b}, {0xff2c, 0x234c},
+ {0xff2d, 0x234d}, {0xff2e, 0x234e}, {0xff2f, 0x234f},
+ {0xff30, 0x2350}, {0xff31, 0x2351}, {0xff32, 0x2352},
+ {0xff33, 0x2353}, {0xff34, 0x2354}, {0xff35, 0x2355},
+ {0xff36, 0x2356}, {0xff37, 0x2357}, {0xff38, 0x2358},
+ {0xff39, 0x2359}, {0xff3a, 0x235a}, {0xff3b, 0x235b},
+ {0xff3c, 0x212c}, {0xff3d, 0x235d}, {0xff3e, 0x235e},
+ {0xff3f, 0x235f}, {0xff40, 0x2360}, {0xff41, 0x2361},
+ {0xff42, 0x2362}, {0xff43, 0x2363}, {0xff44, 0x2364},
+ {0xff45, 0x2365}, {0xff46, 0x2366}, {0xff47, 0x2367},
+ {0xff48, 0x2368}, {0xff49, 0x2369}, {0xff4a, 0x236a},
+ {0xff4b, 0x236b}, {0xff4c, 0x236c}, {0xff4d, 0x236d},
+ {0xff4e, 0x236e}, {0xff4f, 0x236f}, {0xff50, 0x2370},
+ {0xff51, 0x2371}, {0xff52, 0x2372}, {0xff53, 0x2373},
+ {0xff54, 0x2374}, {0xff55, 0x2375}, {0xff56, 0x2376},
+ {0xff57, 0x2377}, {0xff58, 0x2378}, {0xff59, 0x2379},
+ {0xff5a, 0x237a}, {0xff5b, 0x237b}, {0xff5c, 0x237c},
+ {0xff5d, 0x237d}, {0xff5e, 0x2226}, {0xffe0, 0x214b},
+ {0xffe1, 0x214c}, {0xffe2, 0x217e}, {0xffe3, 0x237e},
+ {0xffe5, 0x214d}, {0xffe6, 0x235c}
+};
+
+/* Table including ksc5601 hanja to unicode */
+static const unsigned short ksc5601_hanja_to_unicode[4888]=
+{
+ 0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5,
+ 0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c,
+ 0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36,
+ 0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404,
+ 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3,
+ 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7,
+ 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5,
+ 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593,
+ 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910,
+ 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x611f, 0x61be,
+ 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3,
+ 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95, 0x5323, 0x5cac,
+ 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808, 0x59dc, 0x5ca1,
+ 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f, 0x757a, 0x7586,
+ 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221, 0x8591, 0x8941,
+ 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x4ecb, 0x4ef7, 0x500b, 0x51f1,
+ 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea, 0x6f11, 0x75a5,
+ 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0xf900, 0x93a7, 0x958b,
+ 0x5580, 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9, 0x91b5, 0x5028,
+ 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da, 0x64e7, 0x6e20,
+ 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0xf902, 0x907d, 0x9245, 0x92f8,
+ 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171,
+ 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840,
+ 0x5109, 0x528d, 0x5292, 0x6aa2, 0x77bc, 0x9210, 0x9ed4, 0x52ab,
+ 0x602f, 0x8ff2, 0x5048, 0x61a9, 0x63ed, 0x64ca, 0x683c, 0x6a84,
+ 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, 0x727d, 0x72ac, 0x7504,
+ 0x7d79, 0x7e6d, 0x80a9, 0x898b, 0x8b74, 0x9063, 0x9d51, 0x6289,
+ 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x517c, 0x614a, 0x7b9d,
+ 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, 0x501e, 0x50be, 0x5106,
+ 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, 0x5e9a, 0x5f91, 0x6176,
+ 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, 0x66f4, 0x6897, 0x6d87,
+ 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, 0x75d9, 0x786c, 0x78ec,
+ 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, 0x803f, 0x811b, 0x8396,
+ 0x8b66, 0x8f15, 0x9015, 0x93e1, 0x9803, 0x9838, 0x9a5a, 0x9be8,
+ 0x4fc2, 0x5553, 0x583a, 0x5951, 0x5b63, 0x5c46, 0x60b8, 0x6212,
+ 0x6842, 0x68b0, 0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d,
+ 0x7cfb, 0x7e6b, 0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4,
+ 0x53e4, 0x53e9, 0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b,
+ 0x5eab, 0x62f7, 0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1,
+ 0x6cbd, 0x75fc, 0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1,
+ 0x818f, 0x82e6, 0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5,
+ 0xf903, 0x8f9c, 0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed,
+ 0x659b, 0x66f2, 0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764,
+ 0x5d11, 0x6606, 0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4,
+ 0x6c68, 0xf904, 0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54,
+ 0x5de5, 0x6050, 0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a,
+ 0x86a3, 0x8ca2, 0x978f, 0x4e32, 0x5be1, 0x6208, 0x679c, 0x74dc,
+ 0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846,
+ 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec,
+ 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50,
+ 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec,
+ 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38,
+ 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b,
+ 0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0,
+ 0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1,
+ 0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821,
+ 0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x81a0, 0x854e,
+ 0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18,
+ 0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe, 0x5340, 0x53e3,
+ 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7, 0x5d87, 0x5ed0,
+ 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb, 0x6b50, 0x6bc6,
+ 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396, 0x7403, 0x77bf,
+ 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205, 0x820a, 0x82df,
+ 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1, 0x9264, 0x92b6,
+ 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b, 0x5c40, 0x83ca,
+ 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd,
+ 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79,
+ 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708,
+ 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568,
+ 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d, 0x8ecc, 0x994b,
+ 0xf906, 0x6677, 0x6b78, 0x8cb4, 0x9b3c, 0xf907, 0x53eb, 0x572d,
+ 0x594e, 0x63c6, 0x69fb, 0x73ea, 0x7845, 0x7aba, 0x7ac5, 0x7cfe,
+ 0x8475, 0x898f, 0x8d73, 0x9035, 0x95a8, 0x52fb, 0x5747, 0x7547,
+ 0x7b60, 0x83cc, 0x921e, 0xf908, 0x6a58, 0x514b, 0x524b, 0x5287,
+ 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, 0x52e4, 0x61c3,
+ 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, 0x83eb, 0x89b2,
+ 0x8b39, 0x8fd1, 0x9949, 0xf909, 0x4eca, 0x5997, 0x64d2, 0x6611,
+ 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, 0x887f, 0x895f,
+ 0xf90a, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, 0x6c72, 0x7d1a,
+ 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x4f01, 0x4f0e, 0x5176,
+ 0x5180, 0x55dc, 0x5668, 0x573b, 0x57fa, 0x57fc, 0x5914, 0x5947,
+ 0x5993, 0x5bc4, 0x5c90, 0x5d0e, 0x5df1, 0x5e7e, 0x5fcc, 0x6280,
+ 0x65d7, 0x65e3, 0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f,
+ 0x6b3a, 0x6c23, 0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a,
+ 0x7482, 0x74a3, 0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947,
+ 0x7948, 0x797a, 0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d,
+ 0x808c, 0x8a18, 0x8b4f, 0x8c48, 0x8d77, 0x9321, 0x9324, 0x98e2,
+ 0x9951, 0x9a0e, 0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409,
+ 0x62ee, 0x6854, 0x91d1, 0x55ab, 0x513a, 0xf90b, 0xf90c, 0x5a1c,
+ 0x61e6, 0xf90d, 0x62cf, 0x62ff, 0xf90e, 0xf90f, 0xf910, 0xf911,
+ 0xf912, 0xf913, 0x90a3, 0xf914, 0xf915, 0xf916, 0xf917, 0xf918,
+ 0x8afe, 0xf919, 0xf91a, 0xf91b, 0xf91c, 0x6696, 0xf91d, 0x7156,
+ 0xf91e, 0xf91f, 0x96e3, 0xf920, 0x634f, 0x637a, 0x5357, 0xf921,
+ 0x678f, 0x6960, 0x6e73, 0xf922, 0x7537, 0xf923, 0xf924, 0xf925,
+ 0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, 0x5a18, 0xf928, 0xf929,
+ 0xf92a, 0xf92b, 0xf92c, 0x4e43, 0xf92d, 0x5167, 0x5948, 0x67f0,
+ 0x8010, 0xf92e, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c,
+ 0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0xf92f, 0x5974, 0x5f29,
+ 0x6012, 0xf930, 0xf931, 0xf932, 0x7459, 0xf933, 0xf934, 0xf935,
+ 0xf936, 0xf937, 0xf938, 0x99d1, 0xf939, 0xf93a, 0xf93b, 0xf93c,
+ 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, 0xf943, 0x6fc3,
+ 0xf944, 0xf945, 0x81bf, 0x8fb2, 0x60f1, 0xf946, 0xf947, 0x8166,
+ 0xf948, 0xf949, 0x5c3f, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e,
+ 0xf94f, 0xf950, 0xf951, 0x5ae9, 0x8a25, 0x677b, 0x7d10, 0xf952,
+ 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, 0xf959,
+ 0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336, 0x4e39, 0x4eb6,
+ 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80,
+ 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892,
+ 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556,
+ 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9,
+ 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f,
+ 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858,
+ 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8,
+ 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1, 0x5e36, 0x5f85,
+ 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8, 0x968a, 0x9edb,
+ 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835,
+ 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6, 0x5f92, 0x60bc,
+ 0x6311, 0x6389, 0x6417, 0x6843, 0x68f9, 0x6ac2, 0x6dd8, 0x6e21,
+ 0x6ed4, 0x6fe4, 0x71fe, 0x76dc, 0x7779, 0x79b1, 0x7a3b, 0x8404,
+ 0x89a9, 0x8ced, 0x8df3, 0x8e48, 0x9003, 0x9014, 0x9053, 0x90fd,
+ 0x934d, 0x9676, 0x97dc, 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368,
+ 0x7763, 0x79bf, 0x7be4, 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566,
+ 0x65fd, 0x66be, 0x6c8c, 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d,
+ 0x7a81, 0x4edd, 0x51ac, 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771,
+ 0x6850, 0x68df, 0x6d1e, 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4,
+ 0x8463, 0x9285, 0x515c, 0x6597, 0x675c, 0x6793, 0x75d8, 0x7ac7,
+ 0x8373, 0xf95a, 0x8c46, 0x9017, 0x982d, 0x5c6f, 0x81c0, 0x829a,
+ 0x9041, 0x906f, 0x920d, 0x5f97, 0x5d9d, 0x6a59, 0x71c8, 0x767b,
+ 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0x5587, 0x61f6, 0xf95b,
+ 0x7669, 0x7f85, 0x863f, 0x87ba, 0x88f8, 0x908f, 0xf95c, 0x6d1b,
+ 0x70d9, 0x73de, 0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, 0xf95e,
+ 0x4e82, 0x5375, 0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, 0x9e1e,
+ 0x524c, 0x8fa3, 0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, 0x7c43,
+ 0x7e9c, 0x85cd, 0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, 0x5eca,
+ 0x6717, 0x6d6a, 0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, 0x4f86,
+ 0x5d0d, 0x5fa0, 0x840a, 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006,
+ 0x5169, 0x51c9, 0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f,
+ 0x8ad2, 0x8f1b, 0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec,
+ 0x616e, 0x623e, 0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823,
+ 0x95ad, 0x9a62, 0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77,
+ 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23,
+ 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a,
+ 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582,
+ 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0xf95f,
+ 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046,
+ 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7,
+ 0x79ae, 0x91b4, 0x96b7, 0x52de, 0xf960, 0x6488, 0x64c4, 0x6ad3,
+ 0x6f5e, 0x7018, 0x7210, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def,
+ 0x8f05, 0x9732, 0x9b6f, 0x9dfa, 0x9e75, 0x788c, 0x797f, 0x7da0,
+ 0x83c9, 0x9304, 0x9e7f, 0x9e93, 0x8ad6, 0x58df, 0x5f04, 0x6727,
+ 0x7027, 0x74cf, 0x7c60, 0x807e, 0x5121, 0x7028, 0x7262, 0x78ca,
+ 0x8cc2, 0x8cda, 0x8cf4, 0x96f7, 0x4e86, 0x50da, 0x5bee, 0x5ed6,
+ 0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc, 0x907c, 0x9b27,
+ 0x9f8d, 0x58d8, 0x5a41, 0x5c62, 0x6a13, 0x6dda, 0x6f0f, 0x763b,
+ 0x7d2f, 0x7e37, 0x851e, 0x8938, 0x93e4, 0x964b, 0x5289, 0x65d2,
+ 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409, 0x7460, 0x7559,
+ 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e, 0x9678, 0x4f96,
+ 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817,
+ 0xf961, 0x9686, 0x52d2, 0x808b, 0x51dc, 0x51cc, 0x695e, 0x7a1c,
+ 0x7dbe, 0x83f1, 0x9675, 0x4fda, 0x5229, 0x5398, 0x540f, 0x550e,
+ 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281, 0x72f8, 0x7406,
+ 0x7483, 0xf962, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8, 0x8389, 0x88cf,
+ 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d, 0x6f7e, 0x71d0,
+ 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f, 0x6797, 0x6dcb,
+ 0x7433, 0x81e8, 0x9716, 0x782c, 0x7acb, 0x7b20, 0x7c92, 0x6469,
+ 0x746a, 0x75f2, 0x78bc, 0x78e8, 0x99ac, 0x9b54, 0x9ebb, 0x5bde,
+ 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, 0x4e07, 0x534d, 0x5a29,
+ 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, 0x66fc, 0x6eff, 0x6f2b,
+ 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, 0x8f13, 0x9945, 0x9c3b,
+ 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x4ea1,
+ 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, 0x7f54, 0x8292, 0x832b,
+ 0x83bd, 0x8f1e, 0x9099, 0x57cb, 0x59b9, 0x5a92, 0x5bd0, 0x6627,
+ 0x679a, 0x6885, 0x6bcf, 0x7164, 0x7f75, 0x8cb7, 0x8ce3, 0x9081,
+ 0x9b45, 0x8108, 0x8c8a, 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13,
+ 0x731b, 0x76f2, 0x76df, 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195,
+ 0x52c9, 0x68c9, 0x6c94, 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762,
+ 0x9eb5, 0x6ec5, 0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d,
+ 0x6927, 0x6e9f, 0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169,
+ 0x9298, 0x9cf4, 0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d,
+ 0x6155, 0x6478, 0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb,
+ 0x725f, 0x7261, 0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305,
+ 0x8b00, 0x8b28, 0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766,
+ 0x7a46, 0x9da9, 0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f,
+ 0x5893, 0x5999, 0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b,
+ 0x7ad7, 0x82d7, 0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a,
+ 0x62c7, 0x64ab, 0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7,
+ 0x755d, 0x7e46, 0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727,
+ 0x9d61, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587,
+ 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff,
+ 0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae,
+ 0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e,
+ 0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d,
+ 0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9,
+ 0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd,
+ 0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94,
+ 0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1,
+ 0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591,
+ 0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc,
+ 0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812,
+ 0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb,
+ 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8,
+ 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609,
+ 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b,
+ 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90,
+ 0x500d, 0x4ff3, 0xf963, 0x57f9, 0x5f98, 0x62dc, 0x6392, 0x676f,
+ 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4, 0x88f5, 0x8919,
+ 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70, 0x5e1b, 0x67cf,
+ 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a, 0x7169, 0x71d4,
+ 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, 0x98dc, 0x4f10, 0x7b4f,
+ 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e, 0x6c4e, 0x6cdb,
+ 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb, 0x5288, 0x58c1,
+ 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x78a7, 0x8617, 0x95e2, 0x9739,
+ 0xf965, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, 0x8faf, 0x908a, 0x5225,
+ 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, 0x5175, 0x5c5b, 0x5e77,
+ 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, 0x7501, 0x75c5, 0x79c9,
+ 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4fdd, 0x5821, 0x5831, 0x5bf6,
+ 0x666e, 0x6b65, 0x6d11, 0x6e7a, 0x6f7d, 0x73e4, 0x752b, 0x83e9,
+ 0x88dc, 0x8913, 0x8b5c, 0x8f14, 0x4f0f, 0x50d5, 0x5310, 0x535c,
+ 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, 0x832f, 0x8514, 0x8907,
+ 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, 0x672c, 0x4e76, 0x4ff8,
+ 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, 0x68d2, 0x70fd, 0x71a2,
+ 0x742b, 0x7e2b, 0x84ec, 0x8702, 0x9022, 0x92d2, 0x9cf3, 0x4e0d,
+ 0x4ed8, 0x4fef, 0x5085, 0x5256, 0x526f, 0x5426, 0x5490, 0x57e0,
+ 0x592b, 0x5a66, 0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0xf966, 0x6276,
+ 0x6577, 0x65a7, 0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36,
+ 0x8150, 0x8151, 0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0,
+ 0x8ce6, 0x8cfb, 0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644,
+ 0x99d9, 0x9ce7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954,
+ 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6,
+ 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b,
+ 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43,
+ 0x9d6c, 0x4e15, 0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62,
+ 0x5e87, 0x60b2, 0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7,
+ 0x6bd4, 0x6bd6, 0x6bd7, 0x6bd8, 0x6cb8, 0xf968, 0x7435, 0x75fa,
+ 0x7812, 0x7891, 0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5,
+ 0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb,
+ 0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c,
+ 0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7,
+ 0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b,
+ 0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2,
+ 0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb,
+ 0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c,
+ 0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23,
+ 0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9,
+ 0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x86c7, 0x88df,
+ 0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc,
+ 0x99df, 0x9e9d, 0x524a, 0xf969, 0x6714, 0xf96a, 0x5098, 0x522a,
+ 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, 0x849c,
+ 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x4e09,
+ 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, 0x63f7,
+ 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, 0x5546,
+ 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, 0x5ea0,
+ 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, 0x72c0,
+ 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, 0x8c61,
+ 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7, 0xf96c, 0x7a61,
+ 0x7d22, 0x8272, 0x7272, 0x751f, 0x7525, 0xf96d, 0x7b19, 0x5885,
+ 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055, 0x6292, 0x637f,
+ 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2, 0x7280, 0x745e,
+ 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72, 0x80e5, 0x8212, 0x85af, 0x897f,
+ 0x8a93, 0x901d, 0x92e4, 0x9ecd, 0x9f20, 0x5915, 0x596d, 0x5e2d,
+ 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3,
+ 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584,
+ 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401,
+ 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8,
+ 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078,
+ 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4,
+ 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea,
+ 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583,
+ 0x965d, 0x651d, 0x6d89, 0x71ee, 0xf96e, 0x57ce, 0x59d3, 0x5bac,
+ 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db,
+ 0x7701, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16,
+ 0x52e2, 0x6b72, 0x6d17, 0x7a05, 0x7b39, 0x7d30, 0xf96f, 0x8cb0,
+ 0x53ec, 0x562f, 0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240,
+ 0x6383, 0x6414, 0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f,
+ 0x70a4, 0x71d2, 0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0,
+ 0x7c2b, 0x7d20, 0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d,
+ 0x9061, 0x90b5, 0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f,
+ 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd,
+ 0x640d, 0x84c0, 0x905c, 0x98e1, 0x7387, 0x5b8b, 0x609a, 0x677e,
+ 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x5237, 0xf970, 0x7051,
+ 0x788e, 0x9396, 0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da,
+ 0x5782, 0x58fd, 0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101,
+ 0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x6578, 0x6a39, 0x6b8a,
+ 0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2,
+ 0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac,
+ 0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896,
+ 0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9,
+ 0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3,
+ 0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a,
+ 0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa,
+ 0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3,
+ 0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340,
+ 0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4,
+ 0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f,
+ 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e,
+ 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805,
+ 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4, 0x5c38, 0x5c4e,
+ 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f, 0x6642, 0x67be,
+ 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494, 0x84cd, 0x8996,
+ 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4, 0x5bd4, 0x5f0f,
+ 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, 0x7bd2, 0x8755,
+ 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, 0x4fe1, 0x547b,
+ 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, 0x7533, 0x795e,
+ 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, 0x8703, 0x8a0a,
+ 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4, 0x5be6, 0x6089,
+ 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0xf972, 0x6df1, 0x700b, 0x751a,
+ 0x82af, 0x8af6, 0x4ec0, 0x5341, 0xf973, 0x96d9, 0x6c0f, 0x4e9e,
+ 0x4fc4, 0x5152, 0x555e, 0x5a25, 0x5ce8, 0x6211, 0x7259, 0x82bd,
+ 0x83aa, 0x86fe, 0x8859, 0x8a1d, 0x963f, 0x96c5, 0x9913, 0x9d09,
+ 0x9d5d, 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1,
+ 0x6a02, 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89,
+ 0x5cb8, 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854,
+ 0x9b9f, 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6,
+ 0x5eb5, 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce,
+ 0x9d28, 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26,
+ 0x5393, 0x54c0, 0x57c3, 0x5d16, 0x611b, 0x66d6, 0x6daf, 0x788d,
+ 0x827e, 0x9698, 0x9744, 0x5384, 0x627c, 0x6396, 0x6db2, 0x7e0a,
+ 0x814b, 0x984d, 0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b,
+ 0x51b6, 0x591c, 0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0xf974,
+ 0x91ce, 0x5f31, 0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, 0x84bb,
+ 0x85e5, 0x8e8d, 0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, 0x5b43,
+ 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, 0x6a23,
+ 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0xf97b,
+ 0x7f8a, 0xf97c, 0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, 0xf97e,
+ 0x990a, 0x5704, 0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e,
+ 0x99ad, 0x9b5a, 0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6,
+ 0x5043, 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616,
+ 0x4ffa, 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d,
+ 0x5186, 0x4e88, 0x4f59, 0xf97f, 0xf980, 0xf981, 0x5982, 0xf982,
+ 0xf983, 0x6b5f, 0x6c5d, 0xf984, 0x74b5, 0x7916, 0xf985, 0x8207,
+ 0x8245, 0x8339, 0x8f3f, 0x8f5d, 0xf986, 0x9918, 0xf987, 0xf988,
+ 0xf989, 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c,
+ 0x75ab, 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827,
+ 0x59f8, 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350,
+ 0x633b, 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5,
+ 0x6f14, 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5,
+ 0xf994, 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f,
+ 0xf997, 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b,
+ 0x9cf6, 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1,
+ 0xf9a0, 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3,
+ 0xf9a5, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0xf9a6, 0x95bb,
+ 0x9ae5, 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449, 0xf9a8, 0xf9a9,
+ 0x584b, 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac, 0x6620, 0x668e,
+ 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b,
+ 0x702f, 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b, 0xf9ae, 0x74d4,
+ 0x76c8, 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1, 0x8a60, 0x8fce,
+ 0xf9b1, 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4, 0x4e42, 0x502a,
+ 0xf9b5, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca, 0x730a, 0x777f,
+ 0x7a62, 0x82ae, 0x85dd, 0x8602, 0xf9b6, 0x88d4, 0x8a63, 0x8b7d,
+ 0x8c6b, 0xf9b7, 0x92b3, 0xf9b8, 0x9713, 0x9810, 0x4e94, 0x4f0d,
+ 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da, 0x5862, 0x58ba,
+ 0x5967, 0x5a1b, 0x5be4, 0x609f, 0xf9b9, 0x61ca, 0x6556, 0x65ff,
+ 0x6664, 0x68a7, 0x6c5a, 0x6fb3, 0x70cf, 0x71ac, 0x7352, 0x7b7d,
+ 0x8708, 0x8aa4, 0x9c32, 0x9f07, 0x5c4b, 0x6c83, 0x7344, 0x7389,
+ 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, 0x5140,
+ 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, 0x96cd,
+ 0x9954, 0x6e26, 0x74e6, 0x7aa9, 0x7aaa, 0x81e5, 0x86d9, 0x8778,
+ 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, 0x73a9,
+ 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, 0x839e,
+ 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, 0x6c6a,
+ 0x738b, 0x502d, 0x5a03, 0x6b6a, 0x77ee, 0x5916, 0x5d6c, 0x5dcd,
+ 0x7325, 0x754f, 0xf9ba, 0xf9bb, 0x50e5, 0x51f9, 0x582f, 0x592d,
+ 0x5996, 0x59da, 0x5be5, 0xf9bc, 0xf9bd, 0x5da2, 0x62d7, 0x6416,
+ 0x6493, 0x64fe, 0xf9be, 0x66dc, 0xf9bf, 0x6a48, 0xf9c0, 0x71ff,
+ 0x7464, 0xf9c1, 0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170,
+ 0xf9c2, 0x87ef, 0x8981, 0x8b20, 0x9059, 0xf9c3, 0x9080, 0x9952,
+ 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad,
+ 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995,
+ 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073,
+ 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0xf9c4, 0x4e8e, 0x4f51,
+ 0x5076, 0x512a, 0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24,
+ 0x611a, 0x6182, 0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950,
+ 0x7991, 0x79b9, 0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2,
+ 0x9047, 0x90f5, 0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67,
+ 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91,
+ 0xf9c5, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553,
+ 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a,
+ 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b,
+ 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72,
+ 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060,
+ 0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d,
+ 0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170,
+ 0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466,
+ 0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f,
+ 0x4e73, 0x4f91, 0x5112, 0x516a, 0xf9c7, 0x552f, 0x55a9, 0x5b7a,
+ 0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x6108, 0x6109,
+ 0x63c4, 0x6538, 0x6709, 0xf9c8, 0x67d4, 0x67da, 0xf9c9, 0x6961,
+ 0x6962, 0x6cb9, 0x6d27, 0xf9ca, 0x6e38, 0xf9cb, 0x6fe1, 0x7336,
+ 0x7337, 0xf9cc, 0x745c, 0x7531, 0xf9cd, 0x7652, 0xf9ce, 0xf9cf,
+ 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb, 0x8aed, 0x8e30,
+ 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9, 0x936e, 0xf9d0,
+ 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2, 0xf9d3, 0xf9d4,
+ 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64, 0x73a7, 0x80e4,
+ 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9, 0xf9da, 0xf9db,
+ 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc, 0x57a0, 0x6069,
+ 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, 0x6deb,
+ 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, 0x51dd,
+ 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100, 0x5b9c, 0x610f,
+ 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3, 0x7fa9, 0x8264,
+ 0x858f, 0x87fb, 0x8863, 0x8abc, 0x8b70, 0x91ab, 0x4e8c, 0x4ee5,
+ 0x4f0a, 0xf9dd, 0xf9de, 0x5937, 0x59e8, 0xf9df, 0x5df2, 0x5f1b,
+ 0x5f5b, 0x6021, 0xf9e0, 0xf9e1, 0xf9e2, 0xf9e3, 0x723e, 0x73e5,
+ 0xf9e4, 0x7570, 0x75cd, 0xf9e5, 0x79fb, 0xf9e6, 0x800c, 0x8033,
+ 0x8084, 0x82e1, 0x8351, 0xf9e7, 0xf9e8, 0x8cbd, 0x8cb3, 0x9087,
+ 0xf9e9, 0xf9ea, 0x98f4, 0x990c, 0xf9eb, 0xf9ec, 0x7037, 0x76ca,
+ 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370,
+ 0xf9ed, 0x54bd, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e,
+ 0xf9ee, 0xf9ef, 0x7d6a, 0x8335, 0xf9f0, 0x8693, 0x8a8d, 0xf9f1,
+ 0x976d, 0x9777, 0xf9f2, 0xf9f3, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9,
+ 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a,
+ 0x59d9, 0x6041, 0xf9f4, 0xf9f5, 0x7a14, 0xf9f6, 0x834f, 0x8cc3,
+ 0x5165, 0x5344, 0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55,
+ 0x82bf, 0x4ed4, 0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57,
+ 0x5b5c, 0x6063, 0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7,
+ 0x75b5, 0x78c1, 0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9,
+ 0x8aee, 0x8cc7, 0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628,
+ 0x707c, 0x70b8, 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72,
+ 0x5b71, 0x68e7, 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b,
+ 0x7bb4, 0x7c2a, 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834,
+ 0x58bb, 0x58ef, 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c,
+ 0x66b2, 0x6756, 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa,
+ 0x7350, 0x748b, 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a,
+ 0x846c, 0x8523, 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577,
+ 0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d,
+ 0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09,
+ 0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e,
+ 0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17,
+ 0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7,
+ 0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8,
+ 0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575,
+ 0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e,
+ 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea,
+ 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, 0x5178,
+ 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb,
+ 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, 0x7420,
+ 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, 0x7bc6,
+ 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, 0x942b,
+ 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, 0x6d59,
+ 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, 0x6f38,
+ 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, 0x8776,
+ 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, 0x5b9a,
+ 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, 0x6574,
+ 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, 0x6c40,
+ 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, 0x73fd,
+ 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, 0x7d8e,
+ 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, 0x9266,
+ 0x92cc, 0x9320, 0x9706, 0x9756, 0x975c, 0x9802, 0x9f0e, 0x5236,
+ 0x5291, 0x557c, 0x5824, 0x5e1d, 0x5f1f, 0x608c, 0x63d0, 0x68af,
+ 0x6fdf, 0x796d, 0x7b2c, 0x81cd, 0x85ba, 0x88fd, 0x8af8, 0x8e44,
+ 0x918d, 0x9664, 0x969b, 0x973d, 0x984c, 0x9f4a, 0x4fce, 0x5146,
+ 0x51cb, 0x52a9, 0x5632, 0x5f14, 0x5f6b, 0x63aa, 0x64cd, 0x65e9,
+ 0x6641, 0x66fa, 0x66f9, 0x671d, 0x689d, 0x68d7, 0x69fd, 0x6f15,
+ 0x6f6e, 0x7167, 0x71e5, 0x722a, 0x74aa, 0x773a, 0x7956, 0x795a,
+ 0x79df, 0x7a20, 0x7a95, 0x7c97, 0x7cdf, 0x7d44, 0x7e70, 0x8087,
+ 0x85fb, 0x86a4, 0x8a54, 0x8abf, 0x8d99, 0x8e81, 0x9020, 0x906d,
+ 0x91e3, 0x963b, 0x96d5, 0x9ce5, 0x65cf, 0x7c07, 0x8db3, 0x93c3,
+ 0x5b58, 0x5c0a, 0x5352, 0x62d9, 0x731d, 0x5027, 0x5b97, 0x5f9e,
+ 0x60b0, 0x616b, 0x68d5, 0x6dd9, 0x742e, 0x7a2e, 0x7d42, 0x7d9c,
+ 0x7e31, 0x816b, 0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750,
+ 0x5de6, 0x5ea7, 0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a,
+ 0x59dd, 0x80c4, 0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde,
+ 0x5eda, 0x665d, 0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a,
+ 0x6f8d, 0x70b7, 0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2,
+ 0x821f, 0x86db, 0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031,
+ 0x914e, 0x9152, 0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101,
+ 0x51c6, 0x57c8, 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96,
+ 0x6fec, 0x710c, 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb,
+ 0x99ff, 0x8301, 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb,
+ 0x696b, 0x6c41, 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd,
+ 0x7511, 0x75c7, 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea,
+ 0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f,
+ 0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c,
+ 0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3,
+ 0x829d, 0x82b7, 0x8718, 0x8a8c, 0xf9fc, 0x8d04, 0x8dbe, 0x9072,
+ 0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875,
+ 0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25,
+ 0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e,
+ 0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a,
+ 0x8cd1, 0x8eeb, 0x8fb0, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707,
+ 0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x74c6, 0x75be,
+ 0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f,
+ 0x6715, 0xf9fd, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f, 0x93f6, 0x96c6,
+ 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f, 0x53c9, 0x55df,
+ 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a, 0xf9fe, 0x8e49,
+ 0x8eca, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f,
+ 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12,
+ 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c,
+ 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed, 0x53c3, 0x5879,
+ 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009,
+ 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e,
+ 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621,
+ 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5, 0x57f0, 0x5bc0,
+ 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc, 0x8521, 0x91c7,
+ 0x91f5, 0x518a, 0x67f5, 0x7b56, 0x8cac, 0x51c4, 0x59bb, 0x60bd,
+ 0x8655, 0x501c, 0xf9ff, 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3,
+ 0x64f2, 0x65a5, 0x6ecc, 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb,
+ 0x4edf, 0x5343, 0x5598, 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa,
+ 0x7394, 0x7a7f, 0x821b, 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7,
+ 0x95e1, 0x9621, 0x97c6, 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4,
+ 0x6f88, 0x7db4, 0x8f1f, 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe,
+ 0x6dfb, 0x751b, 0x77bb, 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e,
+ 0x59be, 0x5e16, 0x6377, 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc,
+ 0x8f12, 0x5ef3, 0x6674, 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751,
+ 0x9bd6, 0xfa00, 0x5243, 0x66ff, 0x6d95, 0x6eef, 0x7de0, 0x8ae6,
+ 0x902e, 0x905e, 0x9ad4, 0x521d, 0x527f, 0x54e8, 0x6194, 0x6284,
+ 0x62db, 0x68a2, 0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d,
+ 0x7901, 0x790e, 0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349,
+ 0x8549, 0x8c82, 0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1,
+ 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8,
+ 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070,
+ 0x8525, 0x9283, 0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd,
+ 0x63a8, 0x690e, 0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb,
+ 0x8429, 0x8acf, 0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310,
+ 0x9318, 0x939a, 0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d,
+ 0x7afa, 0x7b51, 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8,
+ 0x9010, 0x6625, 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145,
+ 0x5fe0, 0x6c96, 0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403,
+ 0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0,
+ 0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074,
+ 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4,
+ 0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4,
+ 0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4,
+ 0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed,
+ 0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x6c88,
+ 0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31,
+ 0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253,
+ 0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x99dd, 0x502c,
+ 0x5353, 0x5544, 0x577c, 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b,
+ 0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451,
+ 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb,
+ 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854,
+ 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0xfa03, 0x8569, 0x514c,
+ 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70, 0x6cf0, 0x7b1e,
+ 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0xfa04, 0x64c7, 0x6fa4,
+ 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e, 0x615f, 0x6876,
+ 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806, 0x69cc, 0x817f,
+ 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac, 0x6295, 0x900f,
+ 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46, 0x5df4, 0x628a,
+ 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c, 0x7436, 0x7834,
+ 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742, 0x677f, 0x7248,
+ 0x74e3, 0x8ca9, 0x8fa6, 0x9211, 0x962a, 0x516b, 0x53ed, 0x634c,
+ 0x4f69, 0x5504, 0x6096, 0x6557, 0x6c9b, 0x6d7f, 0x724c, 0x72fd,
+ 0x7a17, 0x8987, 0x8c9d, 0x5f6d, 0x6f8e, 0x70f9, 0x81a8, 0x610e,
+ 0x4fbf, 0x504f, 0x6241, 0x7247, 0x7bc7, 0x7de8, 0x7fe9, 0x904d,
+ 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, 0x67b0, 0x840d, 0x8a55,
+ 0x5420, 0x5b16, 0x5e63, 0x5ee2, 0x5f0a, 0x6583, 0x80ba, 0x853d,
+ 0x9589, 0x965b, 0x4f48, 0x5305, 0x530d, 0x530f, 0x5486, 0x54fa,
+ 0x5703, 0x5e03, 0x6016, 0x629b, 0x62b1, 0x6355, 0xfa06, 0x6ce1,
+ 0x6d66, 0x75b1, 0x7832, 0x80de, 0x812f, 0x82de, 0x8461, 0x84b2,
+ 0x888d, 0x8912, 0x900b, 0x92ea, 0x98fd, 0x9b91, 0x5e45, 0x66b4,
+ 0x66dd, 0x7011, 0x7206, 0xfa07, 0x4ff5, 0x527d, 0x5f6a, 0x6153,
+ 0x6753, 0x6a19, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8c79, 0x98c7,
+ 0x98c4, 0x9a43, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8,
+ 0x99ae, 0x5f7c, 0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642,
+ 0x5339, 0x5f3c, 0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46,
+ 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f,
+ 0x5ec8, 0x6630, 0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050,
+ 0x971e, 0x9c15, 0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2,
+ 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55,
+ 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd,
+ 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266,
+ 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4,
+ 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052,
+ 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a,
+ 0xfa08, 0xfa09, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a,
+ 0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3,
+ 0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016,
+ 0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6,
+ 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b,
+ 0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57,
+ 0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8,
+ 0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d,
+ 0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0xfa0a, 0x8ce2, 0x9249,
+ 0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x4fe0, 0x5354,
+ 0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2,
+ 0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b, 0x5f62, 0x6cc2,
+ 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9, 0x7469, 0x834a,
+ 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8, 0x516e, 0x5f57,
+ 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af, 0x978b, 0x4e4e,
+ 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5, 0x5f27, 0x6236,
+ 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf, 0x6e56, 0x6ef8,
+ 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425, 0x745a, 0x74e0,
+ 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6, 0x846b, 0x84bf,
+ 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac, 0x9800, 0x9865,
+ 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, 0x6e3e, 0x743f,
+ 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, 0x6c5e, 0x6cd3,
+ 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, 0x5316, 0x548c,
+ 0x5b05, 0x6a3a, 0x706b, 0x7575, 0x798d, 0x79be, 0x82b1, 0x83ef,
+ 0x8a71, 0x8b41, 0x8ca8, 0x9774, 0xfa0b, 0x64f4, 0x652b, 0x78ba,
+ 0x78bb, 0x7a6b, 0x4e38, 0x559a, 0x5950, 0x5ba6, 0x5e7b, 0x60a3,
+ 0x63db, 0x6b61, 0x6665, 0x6853, 0x6e19, 0x7165, 0x74b0, 0x7d08,
+ 0x9084, 0x9a69, 0x9c25, 0x6d3b, 0x6ed1, 0x733e, 0x8c41, 0x95ca,
+ 0x51f0, 0x5e4c, 0x5fa8, 0x604d, 0x60f6, 0x6130, 0x614c, 0x6643,
+ 0x6644, 0x69a5, 0x6cc1, 0x6e5f, 0x6ec9, 0x6f62, 0x714c, 0x749c,
+ 0x7687, 0x7bc1, 0x7c27, 0x8352, 0x8757, 0x9051, 0x968d, 0x9ec3,
+ 0x532f, 0x56de, 0x5efb, 0x5f8a, 0x6062, 0x6094, 0x61f7, 0x6666,
+ 0x6703, 0x6a9c, 0x6dee, 0x6fae, 0x7070, 0x736a, 0x7e6a, 0x81be,
+ 0x8334, 0x86d4, 0x8aa8, 0x8cc4, 0x5283, 0x7372, 0x5b96, 0x6a6b,
+ 0x9404, 0x54ee, 0x5686, 0x5b5d, 0x6548, 0x6585, 0x66c9, 0x689f,
+ 0x6d8d, 0x6dc6, 0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019,
+ 0x539a, 0x540e, 0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d,
+ 0x7166, 0x73dd, 0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104,
+ 0x718f, 0x71fb, 0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684,
+ 0x714a, 0x8431, 0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee,
+ 0x6689, 0x7147, 0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb,
+ 0x7566, 0x8667, 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308,
+ 0x6d36, 0x80f8, 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403,
+ 0x5c79, 0x7d07, 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070,
+ 0x6d3d, 0x7fd5, 0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd,
+ 0x59ec, 0x5b09, 0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6,
+ 0x7199, 0x71b9, 0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70
+};
+
+/* Map Table including unicode to ksc5601 hanja */
+static const struct map unicode_to_ksc5601_hanja[4888]=
+{
+ {0x4e00, 0x6c69}, {0x4e01, 0x6f4b}, {0x4e03, 0x7652},
+ {0x4e07, 0x5832}, {0x4e08, 0x6d5b}, {0x4e09, 0x5f32},
+ {0x4e0a, 0x5f3e}, {0x4e0b, 0x793b}, {0x4e0d, 0x5c74},
+ {0x4e11, 0x7564}, {0x4e14, 0x7326}, {0x4e15, 0x5d60},
+ {0x4e16, 0x6126}, {0x4e18, 0x4e78}, {0x4e19, 0x5c30},
+ {0x4e1e, 0x632a}, {0x4e2d, 0x7169}, {0x4e32, 0x4d7a},
+ {0x4e38, 0x7c2f}, {0x4e39, 0x5321}, {0x4e3b, 0x712b},
+ {0x4e42, 0x6751}, {0x4e43, 0x522c}, {0x4e45, 0x4e79},
+ {0x4e4b, 0x717d}, {0x4e4d, 0x5e3f}, {0x4e4e, 0x7b3a},
+ {0x4e4f, 0x7939}, {0x4e56, 0x4e52}, {0x4e58, 0x632b},
+ {0x4e59, 0x6b60}, {0x4e5d, 0x4e7a}, {0x4e5e, 0x4b77},
+ {0x4e5f, 0x6525}, {0x4e6b, 0x4a61}, {0x4e6d, 0x544c},
+ {0x4e73, 0x6a61}, {0x4e76, 0x5c63}, {0x4e77, 0x5f2d},
+ {0x4e7e, 0x4b6b}, {0x4e82, 0x552f}, {0x4e86, 0x5675},
+ {0x4e88, 0x6578}, {0x4e8b, 0x5e40}, {0x4e8c, 0x6c23},
+ {0x4e8e, 0x694d}, {0x4e90, 0x6a27}, {0x4e91, 0x6976},
+ {0x4e92, 0x7b3b}, {0x4e94, 0x6769}, {0x4e95, 0x6f4c},
+ {0x4e98, 0x5066}, {0x4e9b, 0x5e41}, {0x4e9e, 0x642c},
+ {0x4ea1, 0x584c}, {0x4ea2, 0x7971}, {0x4ea4, 0x4e5f},
+ {0x4ea5, 0x7a24}, {0x4ea6, 0x6632}, {0x4ea8, 0x7a7b},
+ {0x4eab, 0x7a3d}, {0x4eac, 0x4c48}, {0x4ead, 0x6f4d},
+ {0x4eae, 0x5555}, {0x4eb6, 0x5322}, {0x4eba, 0x6c51},
+ {0x4ec0, 0x6427}, {0x4ec1, 0x6c52}, {0x4ec4, 0x7631},
+ {0x4ec7, 0x4e7b}, {0x4eca, 0x5051}, {0x4ecb, 0x4b3f},
+ {0x4ecd, 0x6d24}, {0x4ed4, 0x6d28}, {0x4ed5, 0x5e42},
+ {0x4ed6, 0x7662}, {0x4ed7, 0x6d5c}, {0x4ed8, 0x5c75},
+ {0x4ed9, 0x6039}, {0x4edd, 0x544e}, {0x4edf, 0x7435},
+ {0x4ee3, 0x535b}, {0x4ee4, 0x5635}, {0x4ee5, 0x6c24},
+ {0x4ef0, 0x6466}, {0x4ef2, 0x716a}, {0x4ef6, 0x4b6c},
+ {0x4ef7, 0x4b40}, {0x4efb, 0x6c72}, {0x4f01, 0x506a},
+ {0x4f09, 0x7972}, {0x4f0a, 0x6c25}, {0x4f0b, 0x505f},
+ {0x4f0d, 0x676a}, {0x4f0e, 0x506b}, {0x4f0f, 0x5c51},
+ {0x4f10, 0x5b69}, {0x4f11, 0x7d4c}, {0x4f2f, 0x5b57},
+ {0x4f34, 0x5a61}, {0x4f36, 0x5636}, {0x4f38, 0x635f},
+ {0x4f3a, 0x5e43}, {0x4f3c, 0x5e44}, {0x4f3d, 0x4a21},
+ {0x4f43, 0x6e6c}, {0x4f46, 0x5323}, {0x4f47, 0x6e37},
+ {0x4f48, 0x784f}, {0x4f4d, 0x6a48}, {0x4f4e, 0x6e38},
+ {0x4f4f, 0x712c}, {0x4f50, 0x7125}, {0x4f51, 0x694e},
+ {0x4f55, 0x793c}, {0x4f59, 0x6579}, {0x4f5a, 0x6c6a},
+ {0x4f5b, 0x5d56}, {0x4f5c, 0x6d42}, {0x4f69, 0x7825},
+ {0x4f6f, 0x653a}, {0x4f70, 0x5b58}, {0x4f73, 0x4a22},
+ {0x4f76, 0x514d}, {0x4f7a, 0x6e6d}, {0x4f7e, 0x6c6b},
+ {0x4f7f, 0x5e45}, {0x4f81, 0x6360}, {0x4f83, 0x4a49},
+ {0x4f84, 0x7269}, {0x4f86, 0x554e}, {0x4f88, 0x7636},
+ {0x4f8a, 0x4e42}, {0x4f8b, 0x5647}, {0x4f8d, 0x6334},
+ {0x4f8f, 0x712d}, {0x4f91, 0x6a62}, {0x4f96, 0x5742},
+ {0x4f98, 0x7327}, {0x4f9b, 0x4d6a}, {0x4f9d, 0x6b6e},
+ {0x4fae, 0x5932}, {0x4faf, 0x7d25}, {0x4fb5, 0x7655},
+ {0x4fb6, 0x5562}, {0x4fbf, 0x7835}, {0x4fc2, 0x4c75},
+ {0x4fc3, 0x7535}, {0x4fc4, 0x642d}, {0x4fc9, 0x676b},
+ {0x4fca, 0x7155}, {0x4fce, 0x703b}, {0x4fd1, 0x6935},
+ {0x4fd3, 0x4c49}, {0x4fd4, 0x7a55}, {0x4fd7, 0x6154},
+ {0x4fda, 0x5756}, {0x4fdd, 0x5c41}, {0x4fdf, 0x5e46},
+ {0x4fe0, 0x7a6f}, {0x4fe1, 0x6361}, {0x4fee, 0x6173},
+ {0x4fef, 0x5c76}, {0x4ff1, 0x4e7c}, {0x4ff3, 0x5b44},
+ {0x4ff5, 0x7871}, {0x4ff8, 0x5c64}, {0x4ffa, 0x656f},
+ {0x5002, 0x5c31}, {0x5006, 0x5556}, {0x5009, 0x735a},
+ {0x500b, 0x4b41}, {0x500d, 0x5b43}, {0x5011, 0x597a},
+ {0x5012, 0x536e}, {0x5016, 0x7a38}, {0x5019, 0x7d26},
+ {0x501a, 0x6b6f}, {0x501c, 0x7426}, {0x501e, 0x4c4a},
+ {0x501f, 0x7328}, {0x5021, 0x735b}, {0x5023, 0x5b27},
+ {0x5024, 0x7637}, {0x5026, 0x4f66}, {0x5027, 0x7072},
+ {0x5028, 0x4b5a}, {0x502a, 0x6752}, {0x502b, 0x5743},
+ {0x502c, 0x7670}, {0x502d, 0x685e}, {0x503b, 0x6526},
+ {0x5043, 0x6567}, {0x5047, 0x4a23}, {0x5048, 0x4c27},
+ {0x5049, 0x6a49}, {0x504f, 0x7836}, {0x5055, 0x7a25},
+ {0x505a, 0x712e}, {0x505c, 0x6f4e}, {0x5065, 0x4b6d},
+ {0x5074, 0x7630}, {0x5075, 0x6f4f}, {0x5076, 0x694f},
+ {0x5078, 0x775e}, {0x5080, 0x4e53}, {0x5085, 0x5c77},
+ {0x508d, 0x5b28}, {0x5091, 0x4b78}, {0x5098, 0x5f21},
+ {0x5099, 0x5d61}, {0x50ac, 0x754a}, {0x50ad, 0x6936},
+ {0x50b2, 0x676c}, {0x50b3, 0x6e6e}, {0x50b5, 0x7370},
+ {0x50b7, 0x5f3f}, {0x50be, 0x4c4b}, {0x50c5, 0x5041},
+ {0x50c9, 0x7452}, {0x50ca, 0x603a}, {0x50cf, 0x5f40},
+ {0x50d1, 0x4e60}, {0x50d5, 0x5c52}, {0x50d6, 0x7d6a},
+ {0x50da, 0x5676}, {0x50de, 0x6a4a}, {0x50e5, 0x6869},
+ {0x50e7, 0x632c}, {0x50ed, 0x7350}, {0x50f9, 0x4a24},
+ {0x50fb, 0x5b78}, {0x50ff, 0x5e47}, {0x5100, 0x6b70},
+ {0x5101, 0x7156}, {0x5104, 0x6562}, {0x5106, 0x4c4c},
+ {0x5109, 0x4b7b}, {0x5112, 0x6a63}, {0x511f, 0x5f41},
+ {0x5121, 0x566d}, {0x512a, 0x6950}, {0x5132, 0x6e39},
+ {0x5137, 0x5563}, {0x513a, 0x5153}, {0x513c, 0x6570},
+ {0x5140, 0x6834}, {0x5141, 0x6b43}, {0x5143, 0x6a2a},
+ {0x5144, 0x7a7c}, {0x5145, 0x7576}, {0x5146, 0x703c},
+ {0x5147, 0x7d54}, {0x5148, 0x603b}, {0x5149, 0x4e43},
+ {0x514b, 0x503a}, {0x514c, 0x773a}, {0x514d, 0x5873},
+ {0x514e, 0x774d}, {0x5152, 0x642e}, {0x515c, 0x545f},
+ {0x5162, 0x5067}, {0x5165, 0x6c7d}, {0x5167, 0x522e},
+ {0x5168, 0x6e6f}, {0x5169, 0x5557}, {0x516a, 0x6a64},
+ {0x516b, 0x7822}, {0x516c, 0x4d6b}, {0x516d, 0x573f},
+ {0x516e, 0x7b31}, {0x5171, 0x4d6c}, {0x5175, 0x5c32},
+ {0x5176, 0x506c}, {0x5177, 0x4e7d}, {0x5178, 0x6e70},
+ {0x517c, 0x4c42}, {0x5180, 0x506d}, {0x5186, 0x6577},
+ {0x518a, 0x737c}, {0x518d, 0x6e22}, {0x5192, 0x5933},
+ {0x5195, 0x5874}, {0x5197, 0x6937}, {0x51a0, 0x4e2e},
+ {0x51a5, 0x5922}, {0x51aa, 0x5871}, {0x51ac, 0x544f},
+ {0x51b6, 0x6527}, {0x51b7, 0x5552}, {0x51bd, 0x5629},
+ {0x51c4, 0x7422}, {0x51c6, 0x7157}, {0x51c9, 0x5558},
+ {0x51cb, 0x703d}, {0x51cc, 0x5750}, {0x51cd, 0x5450},
+ {0x51dc, 0x574f}, {0x51dd, 0x6b6a}, {0x51de, 0x7d6b},
+ {0x51e1, 0x5b6d}, {0x51f0, 0x7c45}, {0x51f1, 0x4b42},
+ {0x51f6, 0x7d55}, {0x51f8, 0x7448}, {0x51f9, 0x686a},
+ {0x51fa, 0x7573}, {0x51fd, 0x795e}, {0x5200, 0x536f},
+ {0x5203, 0x6c53}, {0x5206, 0x5d42}, {0x5207, 0x6f37},
+ {0x5208, 0x6754}, {0x520a, 0x4a4a}, {0x520e, 0x597b},
+ {0x5211, 0x7a7d}, {0x5217, 0x562a}, {0x521d, 0x7478},
+ {0x5224, 0x7777}, {0x5225, 0x5c2c}, {0x5229, 0x5757},
+ {0x522a, 0x5f22}, {0x522e, 0x4e3e}, {0x5230, 0x5370},
+ {0x5236, 0x7024}, {0x5237, 0x616c}, {0x5238, 0x4f67},
+ {0x5239, 0x734b}, {0x523a, 0x6d29}, {0x523b, 0x4a3e},
+ {0x5243, 0x746f}, {0x5247, 0x764e}, {0x524a, 0x5e7b},
+ {0x524b, 0x503b}, {0x524c, 0x5537}, {0x524d, 0x6e71},
+ {0x5254, 0x7428}, {0x5256, 0x5c78}, {0x525b, 0x4b27},
+ {0x525d, 0x5a4e}, {0x5261, 0x6066}, {0x5269, 0x6d25},
+ {0x526a, 0x6e72}, {0x526f, 0x5c79}, {0x5272, 0x795c},
+ {0x5275, 0x735c}, {0x527d, 0x7872}, {0x527f, 0x7479},
+ {0x5283, 0x7c71}, {0x5287, 0x503c}, {0x5288, 0x5b79},
+ {0x5289, 0x5731}, {0x528d, 0x4b7c}, {0x5291, 0x7025},
+ {0x5292, 0x4b7d}, {0x529b, 0x5574}, {0x529f, 0x4d6d},
+ {0x52a0, 0x4a25}, {0x52a3, 0x562b}, {0x52a4, 0x5042},
+ {0x52a9, 0x703e}, {0x52aa, 0x523d}, {0x52ab, 0x4c24},
+ {0x52be, 0x7a36}, {0x52c1, 0x4c4d}, {0x52c3, 0x5a7a},
+ {0x52c5, 0x764f}, {0x52c7, 0x6938}, {0x52c9, 0x5875},
+ {0x52cd, 0x4c4e}, {0x52d2, 0x574d}, {0x52d5, 0x5451},
+ {0x52d6, 0x696d}, {0x52d8, 0x4a6b}, {0x52d9, 0x5962},
+ {0x52db, 0x7d32}, {0x52dd, 0x632d}, {0x52de, 0x564c},
+ {0x52df, 0x5934}, {0x52e2, 0x6127}, {0x52e3, 0x6e53},
+ {0x52e4, 0x5043}, {0x52f3, 0x7d33}, {0x52f5, 0x5564},
+ {0x52f8, 0x4f68}, {0x52fa, 0x6d43}, {0x52fb, 0x5032},
+ {0x52fe, 0x4e7e}, {0x52ff, 0x5a28}, {0x5305, 0x7850},
+ {0x5308, 0x7d56}, {0x530d, 0x7851}, {0x530f, 0x7852},
+ {0x5310, 0x5c53}, {0x5315, 0x5d62}, {0x5316, 0x7b79},
+ {0x5317, 0x5d41}, {0x5319, 0x6335}, {0x5320, 0x6d5d},
+ {0x5321, 0x4e44}, {0x5323, 0x4b21}, {0x532a, 0x5d63},
+ {0x532f, 0x7c5d}, {0x5339, 0x792f}, {0x533f, 0x527b},
+ {0x5340, 0x4f21}, {0x5341, 0x6428}, {0x5343, 0x7436},
+ {0x5344, 0x6c7e}, {0x5347, 0x632e}, {0x5348, 0x676d},
+ {0x5349, 0x7d41}, {0x534a, 0x5a62}, {0x534d, 0x5833},
+ {0x5351, 0x5d64}, {0x5352, 0x706f}, {0x5353, 0x7671},
+ {0x5354, 0x7a70}, {0x5357, 0x5175}, {0x535a, 0x5a4f},
+ {0x535c, 0x5c54}, {0x535e, 0x5c26}, {0x5360, 0x6f3f},
+ {0x5366, 0x4e4f}, {0x5368, 0x6059}, {0x536f, 0x5956},
+ {0x5370, 0x6c54}, {0x5371, 0x6a4b}, {0x5374, 0x4a3f},
+ {0x5375, 0x5530}, {0x5377, 0x4f69}, {0x537d, 0x716d},
+ {0x537f, 0x4c4f}, {0x5384, 0x6478}, {0x5393, 0x646d},
+ {0x5398, 0x5758}, {0x539a, 0x7d27}, {0x539f, 0x6a2b},
+ {0x53a0, 0x7632}, {0x53a5, 0x4f70}, {0x53a6, 0x793d},
+ {0x53ad, 0x6674}, {0x53bb, 0x4b5b}, {0x53c3, 0x7351},
+ {0x53c8, 0x6951}, {0x53c9, 0x7329}, {0x53ca, 0x5060},
+ {0x53cb, 0x6952}, {0x53cd, 0x5a63}, {0x53d4, 0x6252},
+ {0x53d6, 0x7622}, {0x53d7, 0x6174}, {0x53db, 0x5a64},
+ {0x53e1, 0x6755}, {0x53e2, 0x753f}, {0x53e3, 0x4f22},
+ {0x53e4, 0x4d2f}, {0x53e5, 0x4f23}, {0x53e9, 0x4d30},
+ {0x53ea, 0x717e}, {0x53eb, 0x5023}, {0x53ec, 0x612f},
+ {0x53ed, 0x7823}, {0x53ef, 0x4a26}, {0x53f0, 0x773b},
+ {0x53f1, 0x726a}, {0x53f2, 0x5e48}, {0x53f3, 0x6953},
+ {0x53f8, 0x5e49}, {0x5403, 0x7d5e}, {0x5404, 0x4a40},
+ {0x5408, 0x796a}, {0x5409, 0x514e}, {0x540a, 0x6e54},
+ {0x540c, 0x5452}, {0x540d, 0x5923}, {0x540e, 0x7d28},
+ {0x540f, 0x5759}, {0x5410, 0x774e}, {0x5411, 0x7a3e},
+ {0x541b, 0x4f56}, {0x541d, 0x5770}, {0x541f, 0x6b61},
+ {0x5420, 0x7845}, {0x5426, 0x5c7a}, {0x5429, 0x5d43},
+ {0x542b, 0x795f}, {0x5433, 0x676f}, {0x5438, 0x7d65},
+ {0x5439, 0x7623}, {0x543b, 0x597c}, {0x543c, 0x7d29},
+ {0x543e, 0x676e}, {0x5442, 0x5565}, {0x5448, 0x6f50},
+ {0x544a, 0x4d31}, {0x5451, 0x7722}, {0x5468, 0x7132},
+ {0x546a, 0x7131}, {0x5471, 0x4d32}, {0x5473, 0x5a2b},
+ {0x5475, 0x4a27}, {0x547b, 0x6362}, {0x547c, 0x7b3c},
+ {0x547d, 0x5924}, {0x5480, 0x6e3a}, {0x5486, 0x7853},
+ {0x548c, 0x7b7a}, {0x548e, 0x4f24}, {0x5490, 0x5c7b},
+ {0x54a4, 0x7663}, {0x54a8, 0x6d2a}, {0x54ab, 0x7221},
+ {0x54ac, 0x4e61}, {0x54b3, 0x7a26}, {0x54b8, 0x7960},
+ {0x54bd, 0x6c56}, {0x54c0, 0x646e}, {0x54c1, 0x7921},
+ {0x54c4, 0x7b6f}, {0x54c8, 0x796b}, {0x54c9, 0x6e23},
+ {0x54e1, 0x6a2c}, {0x54e5, 0x4a28}, {0x54e8, 0x747a},
+ {0x54ed, 0x4d56}, {0x54ee, 0x7c76}, {0x54f2, 0x7449},
+ {0x54fa, 0x7854}, {0x5504, 0x7826}, {0x5506, 0x5e4a},
+ {0x5507, 0x7246}, {0x550e, 0x575a}, {0x5510, 0x5350},
+ {0x551c, 0x5845}, {0x552f, 0x6a66}, {0x5531, 0x735d},
+ {0x5535, 0x645a}, {0x553e, 0x7664}, {0x5544, 0x7672},
+ {0x5546, 0x5f42}, {0x554f, 0x597d}, {0x5553, 0x4c76},
+ {0x5556, 0x533a}, {0x555e, 0x642f}, {0x5563, 0x7961},
+ {0x557c, 0x7026}, {0x5580, 0x4b53}, {0x5584, 0x603c},
+ {0x5586, 0x744a}, {0x5587, 0x547a}, {0x5589, 0x7d2a},
+ {0x558a, 0x7962}, {0x5598, 0x7437}, {0x5599, 0x7d42},
+ {0x559a, 0x7c30}, {0x559c, 0x7d6c}, {0x559d, 0x4a62},
+ {0x55a7, 0x7d3d}, {0x55a9, 0x6a67}, {0x55aa, 0x5f43},
+ {0x55ab, 0x5152}, {0x55ac, 0x4e62}, {0x55ae, 0x5324},
+ {0x55c5, 0x7d2b}, {0x55c7, 0x5f60}, {0x55d4, 0x7247},
+ {0x55da, 0x6770}, {0x55dc, 0x506e}, {0x55df, 0x732a},
+ {0x55e3, 0x5e4b}, {0x55e4, 0x7638}, {0x55fd, 0x6175},
+ {0x55fe, 0x7133}, {0x5606, 0x7723}, {0x5609, 0x4a29},
+ {0x5614, 0x4f25}, {0x5617, 0x5f44}, {0x562f, 0x6130},
+ {0x5632, 0x703f}, {0x5634, 0x7624}, {0x5636, 0x6336},
+ {0x5653, 0x7a46}, {0x5668, 0x506f}, {0x566b, 0x7d6d},
+ {0x5674, 0x5d44}, {0x5686, 0x7c77}, {0x56a5, 0x663f},
+ {0x56ac, 0x5e2d}, {0x56ae, 0x7a3f}, {0x56b4, 0x6571},
+ {0x56bc, 0x6d44}, {0x56ca, 0x5225}, {0x56cd, 0x7d6e},
+ {0x56d1, 0x7536}, {0x56da, 0x6176}, {0x56db, 0x5e4c},
+ {0x56de, 0x7c5e}, {0x56e0, 0x6c57}, {0x56f0, 0x4d5d},
+ {0x56f9, 0x5637}, {0x56fa, 0x4d33}, {0x5703, 0x7855},
+ {0x5704, 0x6558}, {0x5708, 0x4f6a}, {0x570b, 0x4f50},
+ {0x570d, 0x6a4c}, {0x5712, 0x6a2e}, {0x5713, 0x6a2d},
+ {0x5716, 0x5371}, {0x5718, 0x5325}, {0x571f, 0x774f},
+ {0x5728, 0x6e24}, {0x572d, 0x5024}, {0x5730, 0x7222},
+ {0x573b, 0x5070}, {0x5740, 0x7223}, {0x5742, 0x7778},
+ {0x5747, 0x5033}, {0x574a, 0x5b29}, {0x574d, 0x533b},
+ {0x574e, 0x4a6c}, {0x5750, 0x7126}, {0x5751, 0x4b55},
+ {0x5761, 0x7767}, {0x5764, 0x4d5e}, {0x5766, 0x7724},
+ {0x576a, 0x7840}, {0x576e, 0x535d}, {0x5770, 0x4c50},
+ {0x5775, 0x4f26}, {0x577c, 0x7673}, {0x5782, 0x6177},
+ {0x5788, 0x535c}, {0x578b, 0x7a7e}, {0x5793, 0x7a27},
+ {0x57a0, 0x6b59}, {0x57a2, 0x4f27}, {0x57a3, 0x6a2f},
+ {0x57c3, 0x646f}, {0x57c7, 0x6939}, {0x57c8, 0x7158},
+ {0x57cb, 0x5858}, {0x57ce, 0x6072}, {0x57df, 0x6634},
+ {0x57e0, 0x5c7c}, {0x57f0, 0x7371}, {0x57f4, 0x6350},
+ {0x57f7, 0x727b}, {0x57f9, 0x5b46}, {0x57fa, 0x5071},
+ {0x57fc, 0x5072}, {0x5800, 0x4f5c}, {0x5802, 0x5351},
+ {0x5805, 0x4c31}, {0x5806, 0x7758}, {0x5808, 0x4b28},
+ {0x5809, 0x6b3c}, {0x580a, 0x643e}, {0x581e, 0x745c},
+ {0x5821, 0x5c42}, {0x5824, 0x7027}, {0x5827, 0x6640},
+ {0x582a, 0x4a6d}, {0x582f, 0x686b}, {0x5830, 0x6568},
+ {0x5831, 0x5c43}, {0x5834, 0x6d5e}, {0x5835, 0x5372},
+ {0x583a, 0x4c77}, {0x584a, 0x4e54}, {0x584b, 0x672b},
+ {0x584f, 0x4b43}, {0x5851, 0x6131}, {0x5854, 0x7732},
+ {0x5857, 0x5373}, {0x5858, 0x5352}, {0x585a, 0x7540},
+ {0x585e, 0x5f5d}, {0x5861, 0x6e73}, {0x5862, 0x6771},
+ {0x5864, 0x7d34}, {0x5875, 0x7248}, {0x5879, 0x7352},
+ {0x587c, 0x6e74}, {0x587e, 0x6253}, {0x5883, 0x4c51},
+ {0x5885, 0x5f6a}, {0x5889, 0x693a}, {0x5893, 0x5957},
+ {0x589c, 0x754d}, {0x589e, 0x7172}, {0x589f, 0x7a47},
+ {0x58a8, 0x5978}, {0x58a9, 0x5442}, {0x58ae, 0x7665},
+ {0x58b3, 0x5d45}, {0x58ba, 0x6772}, {0x58bb, 0x6d5f},
+ {0x58be, 0x4a4b}, {0x58c1, 0x5b7a}, {0x58c5, 0x6835},
+ {0x58c7, 0x5326}, {0x58ce, 0x7d35}, {0x58d1, 0x7949},
+ {0x58d3, 0x6462}, {0x58d5, 0x7b3d}, {0x58d8, 0x5724},
+ {0x58d9, 0x4e45}, {0x58de, 0x4e55}, {0x58df, 0x5666},
+ {0x58e4, 0x653d}, {0x58eb, 0x5e4d}, {0x58ec, 0x6c73},
+ {0x58ef, 0x6d60}, {0x58f9, 0x6c6c}, {0x58fa, 0x7b3e},
+ {0x58fb, 0x5f6b}, {0x58fd, 0x6178}, {0x590f, 0x793e},
+ {0x5914, 0x5073}, {0x5915, 0x602a}, {0x5916, 0x6862},
+ {0x5919, 0x6254}, {0x591a, 0x527d}, {0x591c, 0x6528},
+ {0x5922, 0x5953}, {0x5927, 0x535e}, {0x5929, 0x7438},
+ {0x592a, 0x773c}, {0x592b, 0x5c7d}, {0x592d, 0x686c},
+ {0x592e, 0x6467}, {0x5931, 0x6377}, {0x5937, 0x6c28},
+ {0x593e, 0x7a71}, {0x5944, 0x6572}, {0x5947, 0x5074},
+ {0x5948, 0x522f}, {0x5949, 0x5c65}, {0x594e, 0x5025},
+ {0x594f, 0x7134}, {0x5950, 0x7c31}, {0x5951, 0x4c78},
+ {0x5954, 0x5d46}, {0x5955, 0x7a51}, {0x5957, 0x775f},
+ {0x595a, 0x7a28}, {0x5960, 0x6e75}, {0x5962, 0x5e4e},
+ {0x5967, 0x6773}, {0x596a, 0x772c}, {0x596b, 0x6b44},
+ {0x596c, 0x6d61}, {0x596d, 0x602b}, {0x596e, 0x5d47},
+ {0x5973, 0x5233}, {0x5974, 0x523f}, {0x5978, 0x4a4c},
+ {0x597d, 0x7b3f}, {0x5982, 0x657d}, {0x5983, 0x5d65},
+ {0x5984, 0x584d}, {0x598a, 0x6c74}, {0x5993, 0x5075},
+ {0x5996, 0x686d}, {0x5997, 0x5052}, {0x5999, 0x5958},
+ {0x59a5, 0x7666}, {0x59a8, 0x5b2a}, {0x59ac, 0x7760},
+ {0x59b9, 0x5859}, {0x59bb, 0x7423}, {0x59be, 0x745d},
+ {0x59c3, 0x6f51}, {0x59c6, 0x5935}, {0x59c9, 0x6d2b},
+ {0x59cb, 0x6337}, {0x59d0, 0x6e3b}, {0x59d1, 0x4d34},
+ {0x59d3, 0x6073}, {0x59d4, 0x6a4d}, {0x59d9, 0x6c75},
+ {0x59da, 0x686e}, {0x59dc, 0x4b29}, {0x59dd, 0x712f},
+ {0x59e6, 0x4a4d}, {0x59e8, 0x6c29}, {0x59ea, 0x726b},
+ {0x59ec, 0x7d6f}, {0x59ee, 0x7973}, {0x59f8, 0x6641},
+ {0x59fb, 0x6c58}, {0x59ff, 0x6d2c}, {0x5a01, 0x6a4e},
+ {0x5a03, 0x685f}, {0x5a11, 0x5e4f}, {0x5a18, 0x5226},
+ {0x5a1b, 0x6774}, {0x5a1c, 0x5156}, {0x5a1f, 0x6642},
+ {0x5a20, 0x6363}, {0x5a25, 0x6430}, {0x5a29, 0x5834},
+ {0x5a36, 0x7625}, {0x5a3c, 0x735e}, {0x5a41, 0x5725},
+ {0x5a46, 0x7768}, {0x5a49, 0x6846}, {0x5a5a, 0x7b66},
+ {0x5a62, 0x5d66}, {0x5a66, 0x5c7e}, {0x5a92, 0x585a},
+ {0x5a9a, 0x5a2c}, {0x5a9b, 0x6a30}, {0x5aa4, 0x6338},
+ {0x5ac1, 0x4a2a}, {0x5ac2, 0x6179}, {0x5ac4, 0x6a31},
+ {0x5ac9, 0x726c}, {0x5acc, 0x7a6e}, {0x5ae1, 0x6e55},
+ {0x5ae6, 0x7974}, {0x5ae9, 0x526c}, {0x5b05, 0x7b7b},
+ {0x5b09, 0x7d70}, {0x5b0b, 0x603d}, {0x5b0c, 0x4e63},
+ {0x5b16, 0x7846}, {0x5b2a, 0x5e2e}, {0x5b40, 0x5f45},
+ {0x5b43, 0x653e}, {0x5b50, 0x6d2d}, {0x5b51, 0x7a6a},
+ {0x5b54, 0x4d6e}, {0x5b55, 0x6d26}, {0x5b57, 0x6d2e},
+ {0x5b58, 0x706d}, {0x5b5a, 0x5d21}, {0x5b5c, 0x6d2f},
+ {0x5b5d, 0x7c78}, {0x5b5f, 0x586b}, {0x5b63, 0x4c79},
+ {0x5b64, 0x4d35}, {0x5b69, 0x7a29}, {0x5b6b, 0x615d},
+ {0x5b70, 0x6255}, {0x5b71, 0x6d4f}, {0x5b75, 0x5d22},
+ {0x5b78, 0x794a}, {0x5b7a, 0x6a68}, {0x5b7c, 0x656d},
+ {0x5b85, 0x536b}, {0x5b87, 0x6954}, {0x5b88, 0x617a},
+ {0x5b89, 0x644c}, {0x5b8b, 0x6164}, {0x5b8c, 0x6847},
+ {0x5b8f, 0x4e5b}, {0x5b93, 0x5c55}, {0x5b95, 0x7735},
+ {0x5b96, 0x7c73}, {0x5b97, 0x7073}, {0x5b98, 0x4e2f},
+ {0x5b99, 0x7135}, {0x5b9a, 0x6f52}, {0x5b9b, 0x6848},
+ {0x5b9c, 0x6b71}, {0x5ba2, 0x4b54}, {0x5ba3, 0x603e},
+ {0x5ba4, 0x6378}, {0x5ba5, 0x6a69}, {0x5ba6, 0x7c32},
+ {0x5bac, 0x6074}, {0x5bae, 0x4f60}, {0x5bb0, 0x6e25},
+ {0x5bb3, 0x7a2a}, {0x5bb4, 0x6643}, {0x5bb5, 0x6132},
+ {0x5bb6, 0x4a2b}, {0x5bb8, 0x6364}, {0x5bb9, 0x693b},
+ {0x5bbf, 0x6256}, {0x5bc0, 0x7372}, {0x5bc2, 0x6e56},
+ {0x5bc3, 0x6a32}, {0x5bc4, 0x5076}, {0x5bc5, 0x6c59},
+ {0x5bc6, 0x5a4b}, {0x5bc7, 0x4f28}, {0x5bcc, 0x5d23},
+ {0x5bd0, 0x585b}, {0x5bd2, 0x794e}, {0x5bd3, 0x6955},
+ {0x5bd4, 0x6351}, {0x5bd7, 0x523c}, {0x5bde, 0x582c},
+ {0x5bdf, 0x734c}, {0x5be1, 0x4d7b}, {0x5be2, 0x7656},
+ {0x5be4, 0x6775}, {0x5be5, 0x686f}, {0x5be6, 0x6379},
+ {0x5be7, 0x523b}, {0x5be8, 0x7373}, {0x5be9, 0x637b},
+ {0x5beb, 0x5e50}, {0x5bec, 0x4e30}, {0x5bee, 0x5677},
+ {0x5bef, 0x7159}, {0x5bf5, 0x7541}, {0x5bf6, 0x5c44},
+ {0x5bf8, 0x753b}, {0x5bfa, 0x5e51}, {0x5c01, 0x5c66},
+ {0x5c04, 0x5e52}, {0x5c07, 0x6d62}, {0x5c08, 0x6e76},
+ {0x5c09, 0x6a4f}, {0x5c0a, 0x706e}, {0x5c0b, 0x637c},
+ {0x5c0d, 0x535f}, {0x5c0e, 0x5374}, {0x5c0f, 0x6133},
+ {0x5c11, 0x6134}, {0x5c16, 0x7453}, {0x5c19, 0x5f46},
+ {0x5c24, 0x6956}, {0x5c28, 0x5b2b}, {0x5c31, 0x7626},
+ {0x5c38, 0x6339}, {0x5c39, 0x6b45}, {0x5c3a, 0x7429},
+ {0x5c3b, 0x4d36}, {0x5c3c, 0x5279}, {0x5c3e, 0x5a2d},
+ {0x5c3f, 0x5263}, {0x5c40, 0x4f51}, {0x5c45, 0x4b5c},
+ {0x5c46, 0x4c7a}, {0x5c48, 0x4f5d}, {0x5c4b, 0x6829},
+ {0x5c4d, 0x633b}, {0x5c4e, 0x633a}, {0x5c51, 0x605a},
+ {0x5c55, 0x6e77}, {0x5c5b, 0x5c33}, {0x5c60, 0x5375},
+ {0x5c62, 0x5726}, {0x5c64, 0x7635}, {0x5c65, 0x575b},
+ {0x5c6c, 0x6155}, {0x5c6f, 0x546a}, {0x5c71, 0x5f23},
+ {0x5c79, 0x7d5f}, {0x5c90, 0x5077}, {0x5c91, 0x6d54},
+ {0x5ca1, 0x4b2a}, {0x5ca9, 0x645b}, {0x5cab, 0x617b},
+ {0x5cac, 0x4b22}, {0x5cb1, 0x5360}, {0x5cb3, 0x643f},
+ {0x5cb5, 0x7b40}, {0x5cb7, 0x5a3e}, {0x5cb8, 0x644d},
+ {0x5cba, 0x5639}, {0x5cbe, 0x6f40}, {0x5cc0, 0x617c},
+ {0x5cd9, 0x7639}, {0x5ce0, 0x5f47}, {0x5ce8, 0x6431},
+ {0x5cef, 0x5c67}, {0x5cf0, 0x5c68}, {0x5cf4, 0x7a56},
+ {0x5cf6, 0x5376}, {0x5cfb, 0x715a}, {0x5cfd, 0x7a72},
+ {0x5d07, 0x627d}, {0x5d0d, 0x554f}, {0x5d0e, 0x5078},
+ {0x5d11, 0x4d5f}, {0x5d14, 0x754b}, {0x5d16, 0x6470},
+ {0x5d17, 0x4b2b}, {0x5d19, 0x5744}, {0x5d27, 0x627e},
+ {0x5d29, 0x5d5a}, {0x5d4b, 0x5a2e}, {0x5d4c, 0x4a6e},
+ {0x5d50, 0x5539}, {0x5d69, 0x6321}, {0x5d6c, 0x6863},
+ {0x5d6f, 0x732b}, {0x5d87, 0x4f29}, {0x5d8b, 0x5377},
+ {0x5d9d, 0x5471}, {0x5da0, 0x4e64}, {0x5da2, 0x6872},
+ {0x5daa, 0x6575}, {0x5db8, 0x672e}, {0x5dba, 0x563a},
+ {0x5dbc, 0x5f6c}, {0x5dbd, 0x6440}, {0x5dcd, 0x6864},
+ {0x5dd2, 0x5835}, {0x5dd6, 0x645c}, {0x5ddd, 0x7439},
+ {0x5dde, 0x7136}, {0x5de1, 0x625e}, {0x5de2, 0x6135},
+ {0x5de5, 0x4d6f}, {0x5de6, 0x7127}, {0x5de7, 0x4e65},
+ {0x5de8, 0x4b5d}, {0x5deb, 0x5963}, {0x5dee, 0x732c},
+ {0x5df1, 0x5079}, {0x5df2, 0x6c2b}, {0x5df3, 0x5e53},
+ {0x5df4, 0x7769}, {0x5df7, 0x7975}, {0x5dfd, 0x615e},
+ {0x5dfe, 0x4b6e}, {0x5e02, 0x633c}, {0x5e03, 0x7856},
+ {0x5e06, 0x5b6e}, {0x5e0c, 0x7d71}, {0x5e11, 0x7736},
+ {0x5e16, 0x745e}, {0x5e19, 0x726d}, {0x5e1b, 0x5b59},
+ {0x5e1d, 0x7028}, {0x5e25, 0x617d}, {0x5e2b, 0x5e54},
+ {0x5e2d, 0x602c}, {0x5e33, 0x6d63}, {0x5e36, 0x5361},
+ {0x5e38, 0x5f48}, {0x5e3d, 0x5936}, {0x5e3f, 0x7d2c},
+ {0x5e40, 0x6f53}, {0x5e44, 0x6441}, {0x5e45, 0x786b},
+ {0x5e47, 0x5b2c}, {0x5e4c, 0x7c46}, {0x5e55, 0x582d},
+ {0x5e5f, 0x763a}, {0x5e61, 0x5b5f}, {0x5e62, 0x5353},
+ {0x5e63, 0x7847}, {0x5e72, 0x4a4e}, {0x5e73, 0x7841},
+ {0x5e74, 0x5234}, {0x5e77, 0x5c34}, {0x5e78, 0x7a39},
+ {0x5e79, 0x4a4f}, {0x5e7b, 0x7c33}, {0x5e7c, 0x6a6a},
+ {0x5e7d, 0x6a6b}, {0x5e7e, 0x507a}, {0x5e84, 0x6d64},
+ {0x5e87, 0x5d67}, {0x5e8a, 0x5f49}, {0x5e8f, 0x5f6d},
+ {0x5e95, 0x6e3c}, {0x5e97, 0x6f41}, {0x5e9a, 0x4c52},
+ {0x5e9c, 0x5d24}, {0x5ea0, 0x5f4a}, {0x5ea6, 0x5378},
+ {0x5ea7, 0x7128}, {0x5eab, 0x4d37}, {0x5ead, 0x6f54},
+ {0x5eb5, 0x645d}, {0x5eb6, 0x5f6e}, {0x5eb7, 0x4b2c},
+ {0x5eb8, 0x693c}, {0x5ebe, 0x6a6c}, {0x5ec2, 0x5f4b},
+ {0x5ec8, 0x793f}, {0x5ec9, 0x562f}, {0x5eca, 0x5546},
+ {0x5ed0, 0x4f2a}, {0x5ed3, 0x4e29}, {0x5ed6, 0x5678},
+ {0x5eda, 0x7137}, {0x5edb, 0x6e78}, {0x5edf, 0x5959},
+ {0x5ee0, 0x735f}, {0x5ee2, 0x7848}, {0x5ee3, 0x4e46},
+ {0x5eec, 0x5566}, {0x5ef3, 0x7466}, {0x5ef6, 0x6645},
+ {0x5ef7, 0x6f55}, {0x5efa, 0x4b6f}, {0x5efb, 0x7c5f},
+ {0x5f01, 0x5c27}, {0x5f04, 0x5667}, {0x5f0a, 0x7849},
+ {0x5f0f, 0x6352}, {0x5f11, 0x633d}, {0x5f13, 0x4f61},
+ {0x5f14, 0x7040}, {0x5f15, 0x6c5a}, {0x5f17, 0x5d57},
+ {0x5f18, 0x7b70}, {0x5f1b, 0x6c2c}, {0x5f1f, 0x7029},
+ {0x5f26, 0x7a57}, {0x5f27, 0x7b41}, {0x5f29, 0x5240},
+ {0x5f31, 0x6530}, {0x5f35, 0x6d65}, {0x5f3a, 0x4b2d},
+ {0x5f3c, 0x7930}, {0x5f48, 0x7725}, {0x5f4a, 0x4b2e},
+ {0x5f4c, 0x5a2f}, {0x5f4e, 0x5836}, {0x5f56, 0x5327},
+ {0x5f57, 0x7b32}, {0x5f59, 0x7d44}, {0x5f5b, 0x6c2d},
+ {0x5f62, 0x7b21}, {0x5f66, 0x6569}, {0x5f67, 0x696e},
+ {0x5f69, 0x7374}, {0x5f6a, 0x7873}, {0x5f6b, 0x7041},
+ {0x5f6c, 0x5e2f}, {0x5f6d, 0x7830}, {0x5f70, 0x7360},
+ {0x5f71, 0x672f}, {0x5f77, 0x5b2d}, {0x5f79, 0x6635},
+ {0x5f7c, 0x7928}, {0x5f7f, 0x5d58}, {0x5f80, 0x6859},
+ {0x5f81, 0x6f56}, {0x5f85, 0x5362}, {0x5f87, 0x625f},
+ {0x5f8a, 0x7c60}, {0x5f8b, 0x5748}, {0x5f8c, 0x7d2d},
+ {0x5f90, 0x5f6f}, {0x5f91, 0x4c53}, {0x5f92, 0x5379},
+ {0x5f97, 0x5470}, {0x5f98, 0x5b47}, {0x5f99, 0x5e55},
+ {0x5f9e, 0x7074}, {0x5fa0, 0x5550}, {0x5fa1, 0x6559},
+ {0x5fa8, 0x7c47}, {0x5fa9, 0x5c56}, {0x5faa, 0x6260},
+ {0x5fae, 0x5a30}, {0x5fb5, 0x7323}, {0x5fb7, 0x536c},
+ {0x5fb9, 0x744b}, {0x5fbd, 0x7d45}, {0x5fc3, 0x637d},
+ {0x5fc5, 0x7931}, {0x5fcc, 0x507b}, {0x5fcd, 0x6c5b},
+ {0x5fd6, 0x753c}, {0x5fd7, 0x7224}, {0x5fd8, 0x584e},
+ {0x5fd9, 0x584f}, {0x5fe0, 0x7577}, {0x5feb, 0x7661},
+ {0x5ff5, 0x5237}, {0x5ffd, 0x7b6c}, {0x5fff, 0x5d48},
+ {0x600f, 0x6468}, {0x6012, 0x5241}, {0x6016, 0x7857},
+ {0x601c, 0x563b}, {0x601d, 0x5e56}, {0x6020, 0x773d},
+ {0x6021, 0x6c2e}, {0x6025, 0x5061}, {0x6027, 0x6075},
+ {0x6028, 0x6a33}, {0x602a, 0x4e56}, {0x602f, 0x4c25},
+ {0x6041, 0x6c76}, {0x6042, 0x6261}, {0x6043, 0x633e},
+ {0x604d, 0x7c48}, {0x6050, 0x4d70}, {0x6052, 0x7976},
+ {0x6055, 0x5f70}, {0x6059, 0x653f}, {0x605d, 0x4e3f},
+ {0x6062, 0x7c61}, {0x6063, 0x6d30}, {0x6064, 0x7d51},
+ {0x6065, 0x763b}, {0x6068, 0x794f}, {0x6069, 0x6b5a},
+ {0x606a, 0x4a41}, {0x606c, 0x5238}, {0x606d, 0x4d71},
+ {0x606f, 0x6353}, {0x6070, 0x7d66}, {0x6085, 0x666d},
+ {0x6089, 0x637a}, {0x608c, 0x702a}, {0x608d, 0x7950},
+ {0x6094, 0x7c62}, {0x6096, 0x7827}, {0x609a, 0x6165},
+ {0x609b, 0x6e79}, {0x609f, 0x6776}, {0x60a0, 0x6a6d},
+ {0x60a3, 0x7c34}, {0x60a4, 0x7542}, {0x60a7, 0x575c},
+ {0x60b0, 0x7075}, {0x60b2, 0x5d68}, {0x60b3, 0x536d},
+ {0x60b4, 0x757c}, {0x60b6, 0x5a3f}, {0x60b8, 0x4c7b},
+ {0x60bc, 0x537a}, {0x60bd, 0x7424}, {0x60c5, 0x6f57},
+ {0x60c7, 0x5443}, {0x60d1, 0x7b63}, {0x60da, 0x7b6d},
+ {0x60dc, 0x602d}, {0x60df, 0x6a6e}, {0x60e0, 0x7b33},
+ {0x60e1, 0x6442}, {0x60f0, 0x7667}, {0x60f1, 0x525d},
+ {0x60f3, 0x5f4c}, {0x60f6, 0x7c49}, {0x60f9, 0x6529},
+ {0x60fa, 0x6076}, {0x60fb, 0x7633}, {0x6101, 0x617e},
+ {0x6106, 0x4b70}, {0x6108, 0x6a6f}, {0x6109, 0x6a70},
+ {0x610d, 0x5a40}, {0x610e, 0x7834}, {0x610f, 0x6b72},
+ {0x6115, 0x6443}, {0x611a, 0x6957}, {0x611b, 0x6471},
+ {0x611f, 0x4a6f}, {0x6127, 0x4e57}, {0x6130, 0x7c4a},
+ {0x6134, 0x7361}, {0x6137, 0x4b44}, {0x613c, 0x6365},
+ {0x613e, 0x4b45}, {0x613f, 0x6a34}, {0x6142, 0x693d},
+ {0x6144, 0x5749}, {0x6147, 0x6b5b}, {0x6148, 0x6d31},
+ {0x614a, 0x4c43}, {0x614b, 0x773e}, {0x614c, 0x7c4b},
+ {0x6153, 0x7874}, {0x6155, 0x5937}, {0x6158, 0x7353},
+ {0x6159, 0x7354}, {0x615d, 0x7764}, {0x615f, 0x7751},
+ {0x6162, 0x5837}, {0x6163, 0x4e31}, {0x6164, 0x4a42},
+ {0x6167, 0x7b34}, {0x6168, 0x4b46}, {0x616b, 0x7076},
+ {0x616e, 0x5567}, {0x6170, 0x6a50}, {0x6176, 0x4c54},
+ {0x6177, 0x4b2f}, {0x617d, 0x742a}, {0x617e, 0x692f},
+ {0x6181, 0x7543}, {0x6182, 0x6958}, {0x618a, 0x5d69},
+ {0x618e, 0x7173}, {0x6190, 0x557b}, {0x6191, 0x5e3b},
+ {0x6194, 0x747b}, {0x6198, 0x7d73}, {0x6199, 0x7d72},
+ {0x619a, 0x7726}, {0x61a4, 0x5d49}, {0x61a7, 0x5453},
+ {0x61a9, 0x4c28}, {0x61ab, 0x5a41}, {0x61ac, 0x4c55},
+ {0x61ae, 0x5964}, {0x61b2, 0x7a4a}, {0x61b6, 0x6563},
+ {0x61ba, 0x533c}, {0x61be, 0x4a70}, {0x61c3, 0x5044},
+ {0x61c7, 0x4a50}, {0x61c8, 0x7a2b}, {0x61c9, 0x6b6b},
+ {0x61ca, 0x6778}, {0x61cb, 0x5965}, {0x61e6, 0x5157},
+ {0x61f2, 0x7324}, {0x61f6, 0x547b}, {0x61f7, 0x7c63},
+ {0x61f8, 0x7a58}, {0x61fa, 0x7355}, {0x61fc, 0x4f2b},
+ {0x61ff, 0x6b73}, {0x6200, 0x557c}, {0x6207, 0x5354},
+ {0x6208, 0x4d7c}, {0x620a, 0x5966}, {0x620c, 0x6279},
+ {0x620d, 0x6221}, {0x620e, 0x6b54}, {0x6210, 0x6077},
+ {0x6211, 0x6432}, {0x6212, 0x4c7c}, {0x6216, 0x7b64},
+ {0x621a, 0x742b}, {0x621f, 0x503d}, {0x6221, 0x4a71},
+ {0x622a, 0x6f38}, {0x622e, 0x5740}, {0x6230, 0x6e7a},
+ {0x6231, 0x7d74}, {0x6234, 0x5363}, {0x6236, 0x7b42},
+ {0x623e, 0x5568}, {0x623f, 0x5b2e}, {0x6240, 0x6136},
+ {0x6241, 0x7837}, {0x6247, 0x603f}, {0x6248, 0x7b43},
+ {0x6249, 0x5d6a}, {0x624b, 0x6222}, {0x624d, 0x6e26},
+ {0x6253, 0x7668}, {0x6258, 0x7675}, {0x626e, 0x5d4a},
+ {0x6271, 0x5062}, {0x6276, 0x5d26}, {0x6279, 0x5d6b},
+ {0x627c, 0x6479}, {0x627f, 0x632f}, {0x6280, 0x507c},
+ {0x6284, 0x747c}, {0x6289, 0x4c3c}, {0x628a, 0x776a},
+ {0x6291, 0x6564}, {0x6292, 0x5f71}, {0x6295, 0x7761},
+ {0x6297, 0x7977}, {0x6298, 0x6f39}, {0x629b, 0x7858},
+ {0x62ab, 0x7929}, {0x62b1, 0x7859}, {0x62b5, 0x6e3d},
+ {0x62b9, 0x5846}, {0x62bc, 0x6463}, {0x62bd, 0x754e},
+ {0x62c2, 0x5d59}, {0x62c7, 0x5967}, {0x62c8, 0x5239},
+ {0x62c9, 0x5543}, {0x62cc, 0x5a65}, {0x62cd, 0x5a50},
+ {0x62cf, 0x5159}, {0x62d0, 0x4e58}, {0x62d2, 0x4b5e},
+ {0x62d3, 0x742c}, {0x62d4, 0x5a7b}, {0x62d6, 0x7669},
+ {0x62d7, 0x6873}, {0x62d8, 0x4f2c}, {0x62d9, 0x7070},
+ {0x62db, 0x747d}, {0x62dc, 0x5b48}, {0x62ec, 0x4e40},
+ {0x62ed, 0x6354}, {0x62ee, 0x514f}, {0x62ef, 0x7175},
+ {0x62f1, 0x4d72}, {0x62f3, 0x4f6b}, {0x62f7, 0x4d38},
+ {0x62fe, 0x6326}, {0x62ff, 0x515a}, {0x6301, 0x7225},
+ {0x6307, 0x7226}, {0x6309, 0x644e}, {0x6311, 0x537b},
+ {0x632b, 0x7129}, {0x632f, 0x7249}, {0x633a, 0x6f58},
+ {0x633b, 0x6649}, {0x633d, 0x5838}, {0x633e, 0x7a73},
+ {0x6349, 0x7335}, {0x634c, 0x7824}, {0x634f, 0x5173},
+ {0x6350, 0x6648}, {0x6355, 0x785a}, {0x6367, 0x5c69},
+ {0x6368, 0x5e57}, {0x636e, 0x4b5f}, {0x6372, 0x4f6c},
+ {0x6377, 0x745f}, {0x637a, 0x5174}, {0x637b, 0x523a},
+ {0x637f, 0x5f72}, {0x6383, 0x6137}, {0x6388, 0x6223},
+ {0x6389, 0x537c}, {0x638c, 0x6d66}, {0x6392, 0x5b49},
+ {0x6396, 0x647a}, {0x6398, 0x4f5e}, {0x639b, 0x4e50},
+ {0x63a0, 0x5553}, {0x63a1, 0x7375}, {0x63a2, 0x772e},
+ {0x63a5, 0x6f48}, {0x63a7, 0x4d73}, {0x63a8, 0x754f},
+ {0x63a9, 0x6573}, {0x63aa, 0x7042}, {0x63c0, 0x4a51},
+ {0x63c4, 0x6a71}, {0x63c6, 0x5026}, {0x63cf, 0x595a},
+ {0x63d0, 0x702b}, {0x63d6, 0x6b67}, {0x63da, 0x6540},
+ {0x63db, 0x7c35}, {0x63e1, 0x6444}, {0x63ed, 0x4c29},
+ {0x63ee, 0x7d46}, {0x63f4, 0x6a35}, {0x63f6, 0x652a},
+ {0x63f7, 0x5f3a}, {0x640d, 0x615f}, {0x640f, 0x5a51},
+ {0x6414, 0x6138}, {0x6416, 0x6874}, {0x6417, 0x537d},
+ {0x641c, 0x6224}, {0x6422, 0x724a}, {0x642c, 0x5a66},
+ {0x642d, 0x7733}, {0x643a, 0x7d4d}, {0x643e, 0x7336},
+ {0x6458, 0x6e57}, {0x6460, 0x7544}, {0x6469, 0x5824},
+ {0x646f, 0x7227}, {0x6478, 0x5938}, {0x6479, 0x5939},
+ {0x647a, 0x6f49}, {0x6488, 0x564e}, {0x6491, 0x774b},
+ {0x6492, 0x5f2e}, {0x6493, 0x6875}, {0x649a, 0x5235},
+ {0x649e, 0x5355}, {0x64a4, 0x744c}, {0x64a5, 0x5a7c},
+ {0x64ab, 0x5968}, {0x64ad, 0x776b}, {0x64ae, 0x7549},
+ {0x64b0, 0x733c}, {0x64b2, 0x5a52}, {0x64bb, 0x5335},
+ {0x64c1, 0x6836}, {0x64c4, 0x564f}, {0x64c5, 0x743a},
+ {0x64c7, 0x7749}, {0x64ca, 0x4c2a}, {0x64cd, 0x7043},
+ {0x64ce, 0x4c56}, {0x64d2, 0x5053}, {0x64d4, 0x533d},
+ {0x64d8, 0x5b7b}, {0x64da, 0x4b60}, {0x64e1, 0x5364},
+ {0x64e2, 0x7677}, {0x64e5, 0x553a}, {0x64e6, 0x734d},
+ {0x64e7, 0x4b61}, {0x64ec, 0x6b74}, {0x64f2, 0x742d},
+ {0x64f4, 0x7c2a}, {0x64fa, 0x776c}, {0x64fe, 0x6876},
+ {0x6500, 0x5a67}, {0x6504, 0x774c}, {0x6518, 0x6541},
+ {0x651d, 0x606e}, {0x6523, 0x557d}, {0x652a, 0x4e66},
+ {0x652b, 0x7c2b}, {0x652c, 0x553b}, {0x652f, 0x7228},
+ {0x6536, 0x6225}, {0x6537, 0x4d39}, {0x6538, 0x6a72},
+ {0x6539, 0x4b47}, {0x653b, 0x4d74}, {0x653e, 0x5b2f},
+ {0x653f, 0x6f59}, {0x6545, 0x4d3a}, {0x6548, 0x7c79},
+ {0x654d, 0x5f73}, {0x654e, 0x4e67}, {0x654f, 0x5a42},
+ {0x6551, 0x4f2d}, {0x6556, 0x6779}, {0x6557, 0x7828},
+ {0x655e, 0x7362}, {0x6562, 0x4a72}, {0x6563, 0x5f24},
+ {0x6566, 0x5444}, {0x656c, 0x4c57}, {0x656d, 0x6542},
+ {0x6572, 0x4d3b}, {0x6574, 0x6f5a}, {0x6575, 0x6e58},
+ {0x6577, 0x5d27}, {0x6578, 0x6226}, {0x657e, 0x6040},
+ {0x6582, 0x5630}, {0x6583, 0x784a}, {0x6585, 0x7c7a},
+ {0x6587, 0x597e}, {0x658c, 0x5e30}, {0x6590, 0x5d6c},
+ {0x6591, 0x5a68}, {0x6597, 0x5460}, {0x6599, 0x5679},
+ {0x659b, 0x4d57}, {0x659c, 0x5e58}, {0x659f, 0x7278},
+ {0x65a1, 0x6456}, {0x65a4, 0x5045}, {0x65a5, 0x742e},
+ {0x65a7, 0x5d28}, {0x65ab, 0x6d45}, {0x65ac, 0x7356},
+ {0x65af, 0x5e59}, {0x65b0, 0x6366}, {0x65b7, 0x5328},
+ {0x65b9, 0x5b30}, {0x65bc, 0x655a}, {0x65bd, 0x633f},
+ {0x65c1, 0x5b31}, {0x65c5, 0x5569}, {0x65cb, 0x6041},
+ {0x65cc, 0x6f5b}, {0x65cf, 0x7069}, {0x65d2, 0x5732},
+ {0x65d7, 0x507d}, {0x65e0, 0x5969}, {0x65e3, 0x507e},
+ {0x65e5, 0x6c6d}, {0x65e6, 0x5329}, {0x65e8, 0x7229},
+ {0x65e9, 0x7044}, {0x65ec, 0x6262}, {0x65ed, 0x696f},
+ {0x65f1, 0x7951}, {0x65f4, 0x6959}, {0x65fa, 0x685a},
+ {0x65fb, 0x5a43}, {0x65fc, 0x5a44}, {0x65fd, 0x5445},
+ {0x65ff, 0x677a}, {0x6606, 0x4d60}, {0x6607, 0x6330},
+ {0x6609, 0x5b32}, {0x660a, 0x7b44}, {0x660c, 0x7363},
+ {0x660e, 0x5925}, {0x660f, 0x7b67}, {0x6610, 0x5d4b},
+ {0x6611, 0x5054}, {0x6613, 0x6636}, {0x6614, 0x602e},
+ {0x6615, 0x7d5a}, {0x661e, 0x5c35}, {0x661f, 0x6078},
+ {0x6620, 0x6731}, {0x6625, 0x7570}, {0x6627, 0x585c},
+ {0x6628, 0x6d46}, {0x662d, 0x6139}, {0x662f, 0x6340},
+ {0x6630, 0x7940}, {0x6631, 0x6970}, {0x6634, 0x595b},
+ {0x6636, 0x7364}, {0x663a, 0x5c36}, {0x663b, 0x6469},
+ {0x6641, 0x7045}, {0x6642, 0x6341}, {0x6643, 0x7c4c},
+ {0x6644, 0x7c4d}, {0x6649, 0x724b}, {0x664b, 0x724c},
+ {0x664f, 0x644f}, {0x6659, 0x715b}, {0x665b, 0x7a59},
+ {0x665d, 0x7138}, {0x665e, 0x7d75}, {0x665f, 0x6079},
+ {0x6664, 0x677b}, {0x6665, 0x7c37}, {0x6666, 0x7c64},
+ {0x6667, 0x7b45}, {0x6668, 0x6367}, {0x6669, 0x5839},
+ {0x666b, 0x7678}, {0x666e, 0x5c45}, {0x666f, 0x4c58},
+ {0x6673, 0x602f}, {0x6674, 0x7467}, {0x6676, 0x6f5c},
+ {0x6677, 0x4f7c}, {0x6678, 0x6f5d}, {0x667a, 0x722a},
+ {0x6684, 0x7d3e}, {0x6687, 0x4a2c}, {0x6688, 0x7d3b},
+ {0x6689, 0x7d47}, {0x668e, 0x6732}, {0x6690, 0x6a51},
+ {0x6691, 0x5f74}, {0x6696, 0x516c}, {0x6697, 0x645e},
+ {0x6698, 0x6543}, {0x669d, 0x5926}, {0x66a0, 0x4d3c},
+ {0x66a2, 0x7365}, {0x66ab, 0x6d55}, {0x66ae, 0x593a},
+ {0x66b2, 0x6d67}, {0x66b3, 0x7b35}, {0x66b4, 0x786c},
+ {0x66b9, 0x6067}, {0x66bb, 0x4c59}, {0x66be, 0x5446},
+ {0x66c4, 0x6725}, {0x66c6, 0x5575}, {0x66c7, 0x533e},
+ {0x66c9, 0x7c7b}, {0x66d6, 0x6472}, {0x66d9, 0x5f75},
+ {0x66dc, 0x6878}, {0x66dd, 0x786d}, {0x66e0, 0x4e47},
+ {0x66e6, 0x7d76}, {0x66f0, 0x6858}, {0x66f2, 0x4d58},
+ {0x66f3, 0x6756}, {0x66f4, 0x4c5a}, {0x66f7, 0x4a63},
+ {0x66f8, 0x5f76}, {0x66f9, 0x7047}, {0x66fa, 0x7046},
+ {0x66fc, 0x583a}, {0x66fe, 0x7174}, {0x66ff, 0x7470},
+ {0x6700, 0x754c}, {0x6703, 0x7c65}, {0x6708, 0x6a45},
+ {0x6709, 0x6a73}, {0x670b, 0x5d5b}, {0x670d, 0x5c57},
+ {0x6714, 0x5e7d}, {0x6715, 0x7279}, {0x6717, 0x5547},
+ {0x671b, 0x5850}, {0x671d, 0x7048}, {0x671e, 0x5121},
+ {0x671f, 0x5122}, {0x6726, 0x5954}, {0x6727, 0x5668},
+ {0x6728, 0x594a}, {0x672a, 0x5a31}, {0x672b, 0x5847},
+ {0x672c, 0x5c62}, {0x672d, 0x734e}, {0x672e, 0x7574},
+ {0x6731, 0x7139}, {0x6734, 0x5a53}, {0x6736, 0x766a},
+ {0x673a, 0x4f75}, {0x673d, 0x7d2e}, {0x6746, 0x4a52},
+ {0x6749, 0x5f34}, {0x674e, 0x575d}, {0x674f, 0x7a3a},
+ {0x6750, 0x6e27}, {0x6751, 0x753d}, {0x6753, 0x7875},
+ {0x6756, 0x6d68}, {0x675c, 0x5461}, {0x675e, 0x5123},
+ {0x675f, 0x6156}, {0x676d, 0x7978}, {0x676f, 0x5b4a},
+ {0x6770, 0x4b79}, {0x6771, 0x5454}, {0x6773, 0x595c},
+ {0x6775, 0x6e3e}, {0x6777, 0x776d}, {0x677b, 0x526e},
+ {0x677e, 0x6166}, {0x677f, 0x7779}, {0x6787, 0x5d6d},
+ {0x6789, 0x685b}, {0x678b, 0x5b33}, {0x678f, 0x5177},
+ {0x6790, 0x6030}, {0x6793, 0x5462}, {0x6795, 0x7657},
+ {0x6797, 0x5779}, {0x679a, 0x585d}, {0x679c, 0x4d7d},
+ {0x679d, 0x722b}, {0x67af, 0x4d3d}, {0x67b0, 0x7842},
+ {0x67b3, 0x722c}, {0x67b6, 0x4a2d}, {0x67b7, 0x4a2e},
+ {0x67b8, 0x4f2e}, {0x67be, 0x6342}, {0x67c4, 0x5c37},
+ {0x67cf, 0x5b5a}, {0x67d0, 0x593b}, {0x67d1, 0x4a73},
+ {0x67d2, 0x7653}, {0x67d3, 0x6678}, {0x67d4, 0x6a75},
+ {0x67da, 0x6a76}, {0x67dd, 0x7679}, {0x67e9, 0x4f2f},
+ {0x67ec, 0x4a53}, {0x67ef, 0x4a2f}, {0x67f0, 0x5230},
+ {0x67f1, 0x713a}, {0x67f3, 0x5733}, {0x67f4, 0x6343},
+ {0x67f5, 0x737d}, {0x67f6, 0x5e5a}, {0x67fb, 0x5e5b},
+ {0x67fe, 0x6f5e}, {0x6812, 0x6263}, {0x6813, 0x6e7b},
+ {0x6816, 0x5f77}, {0x6817, 0x574a}, {0x6821, 0x4e68},
+ {0x6822, 0x5b5b}, {0x682a, 0x713b}, {0x682f, 0x6971},
+ {0x6838, 0x7a37}, {0x6839, 0x5046}, {0x683c, 0x4c2b},
+ {0x683d, 0x6e28}, {0x6840, 0x4b7a}, {0x6841, 0x7979},
+ {0x6842, 0x4c7d}, {0x6843, 0x537e}, {0x6848, 0x6450},
+ {0x684e, 0x726e}, {0x6850, 0x5455}, {0x6851, 0x5f4d},
+ {0x6853, 0x7c38}, {0x6854, 0x5150}, {0x686d, 0x724d},
+ {0x6876, 0x7752}, {0x687f, 0x4a54}, {0x6881, 0x5559},
+ {0x6885, 0x585e}, {0x688f, 0x4d59}, {0x6893, 0x6e29},
+ {0x6894, 0x763c}, {0x6897, 0x4c5b}, {0x689d, 0x7049},
+ {0x689f, 0x7c7c}, {0x68a1, 0x6849}, {0x68a2, 0x747e},
+ {0x68a7, 0x677c}, {0x68a8, 0x575e}, {0x68ad, 0x5e5c},
+ {0x68af, 0x702c}, {0x68b0, 0x4c7e}, {0x68b1, 0x4d61},
+ {0x68b3, 0x613a}, {0x68b5, 0x5b6f}, {0x68b6, 0x5a32},
+ {0x68c4, 0x5125}, {0x68c5, 0x5c38}, {0x68c9, 0x5876},
+ {0x68cb, 0x5124}, {0x68cd, 0x4d62}, {0x68d2, 0x5c6a},
+ {0x68d5, 0x7077}, {0x68d7, 0x704a}, {0x68d8, 0x503e},
+ {0x68da, 0x5d5c}, {0x68df, 0x5456}, {0x68e0, 0x5356},
+ {0x68e7, 0x6d50}, {0x68e8, 0x4d21}, {0x68ee, 0x5f35},
+ {0x68f2, 0x5f78}, {0x68f9, 0x5421}, {0x68fa, 0x4e32},
+ {0x6900, 0x684a}, {0x6905, 0x6b75}, {0x690d, 0x6355},
+ {0x690e, 0x7550}, {0x6912, 0x7521}, {0x6927, 0x5927},
+ {0x6930, 0x652b}, {0x693d, 0x664b}, {0x693f, 0x7571},
+ {0x694a, 0x6545}, {0x6953, 0x7923}, {0x6954, 0x605b},
+ {0x6955, 0x766b}, {0x6957, 0x4b71}, {0x6959, 0x596a},
+ {0x695a, 0x7522}, {0x695e, 0x5751}, {0x6960, 0x5178},
+ {0x6961, 0x6a78}, {0x6962, 0x6a79}, {0x6963, 0x5a33},
+ {0x6968, 0x6f5f}, {0x696b, 0x716f}, {0x696d, 0x6576},
+ {0x696e, 0x6e3f}, {0x696f, 0x6264}, {0x6975, 0x503f},
+ {0x6977, 0x7a2c}, {0x6978, 0x7551}, {0x6979, 0x6733},
+ {0x6995, 0x693e}, {0x699b, 0x724e}, {0x699c, 0x5b34},
+ {0x69a5, 0x7c4e}, {0x69a7, 0x5d6e}, {0x69ae, 0x6734},
+ {0x69b4, 0x5734}, {0x69bb, 0x7734}, {0x69c1, 0x4d3e},
+ {0x69c3, 0x5a69}, {0x69cb, 0x4f30}, {0x69cc, 0x7759},
+ {0x69cd, 0x7366}, {0x69d0, 0x4e59}, {0x69e8, 0x4e2a},
+ {0x69ea, 0x4b48}, {0x69fb, 0x5027}, {0x69fd, 0x704b},
+ {0x69ff, 0x5047}, {0x6a02, 0x6445}, {0x6a0a, 0x5b60},
+ {0x6a11, 0x555a}, {0x6a13, 0x5727}, {0x6a17, 0x6e40},
+ {0x6a19, 0x7876}, {0x6a1e, 0x7552}, {0x6a1f, 0x6d69},
+ {0x6a21, 0x593c}, {0x6a23, 0x6546}, {0x6a35, 0x7523},
+ {0x6a38, 0x5a54}, {0x6a39, 0x6227}, {0x6a3a, 0x7b7c},
+ {0x6a3d, 0x715c}, {0x6a44, 0x4a74}, {0x6a48, 0x687a},
+ {0x6a4b, 0x4e69}, {0x6a52, 0x6978}, {0x6a53, 0x6265},
+ {0x6a58, 0x5039}, {0x6a59, 0x5472}, {0x6a5f, 0x5126},
+ {0x6a61, 0x5f4e}, {0x6a6b, 0x7c74}, {0x6a80, 0x532a},
+ {0x6a84, 0x4c2c}, {0x6a89, 0x6f60}, {0x6a8d, 0x6565},
+ {0x6a8e, 0x5055}, {0x6a97, 0x5b7c}, {0x6a9c, 0x7c66},
+ {0x6aa2, 0x4b7e}, {0x6aa3, 0x6d6a}, {0x6ab3, 0x5e31},
+ {0x6abb, 0x7963}, {0x6ac2, 0x5422}, {0x6ac3, 0x4f76},
+ {0x6ad3, 0x5650}, {0x6ada, 0x556a}, {0x6adb, 0x716e},
+ {0x6af6, 0x7a4b}, {0x6afb, 0x6521}, {0x6b04, 0x5531},
+ {0x6b0a, 0x4f6d}, {0x6b0c, 0x6d6b}, {0x6b12, 0x5532},
+ {0x6b16, 0x553c}, {0x6b20, 0x7d62}, {0x6b21, 0x732d},
+ {0x6b23, 0x7d5b}, {0x6b32, 0x6930}, {0x6b3a, 0x5127},
+ {0x6b3d, 0x7d63}, {0x6b3e, 0x4e33}, {0x6b46, 0x7d64},
+ {0x6b47, 0x7a4e}, {0x6b4c, 0x4a30}, {0x6b4e, 0x7727},
+ {0x6b50, 0x4f31}, {0x6b5f, 0x6622}, {0x6b61, 0x7c36},
+ {0x6b62, 0x722d}, {0x6b63, 0x6f61}, {0x6b64, 0x732e},
+ {0x6b65, 0x5c46}, {0x6b66, 0x596b}, {0x6b6a, 0x6860},
+ {0x6b72, 0x6128}, {0x6b77, 0x5576}, {0x6b78, 0x4f7d},
+ {0x6b7b, 0x5e5d}, {0x6b7f, 0x5951}, {0x6b83, 0x646a},
+ {0x6b84, 0x724f}, {0x6b86, 0x773f}, {0x6b89, 0x6266},
+ {0x6b8a, 0x6228}, {0x6b96, 0x6356}, {0x6b98, 0x6d51},
+ {0x6b9e, 0x6979}, {0x6bae, 0x5631}, {0x6baf, 0x5e32},
+ {0x6bb2, 0x6068}, {0x6bb5, 0x532b}, {0x6bb7, 0x6b5c},
+ {0x6bba, 0x5f2f}, {0x6bbc, 0x4a43}, {0x6bbf, 0x6e7c},
+ {0x6bc1, 0x7d43}, {0x6bc5, 0x6b76}, {0x6bc6, 0x4f32},
+ {0x6bcb, 0x596c}, {0x6bcd, 0x593d}, {0x6bcf, 0x585f},
+ {0x6bd2, 0x5438}, {0x6bd3, 0x6b3e}, {0x6bd4, 0x5d6f},
+ {0x6bd6, 0x5d70}, {0x6bd7, 0x5d71}, {0x6bd8, 0x5d72},
+ {0x6bdb, 0x593e}, {0x6beb, 0x7b46}, {0x6bec, 0x4f33},
+ {0x6c08, 0x6e7d}, {0x6c0f, 0x642b}, {0x6c11, 0x5a45},
+ {0x6c13, 0x586c}, {0x6c23, 0x5128}, {0x6c34, 0x6229},
+ {0x6c37, 0x5e3c}, {0x6c38, 0x6735}, {0x6c3e, 0x5b70},
+ {0x6c40, 0x6f62}, {0x6c41, 0x7170}, {0x6c42, 0x4f34},
+ {0x6c4e, 0x5b71}, {0x6c50, 0x6031}, {0x6c55, 0x5f25},
+ {0x6c57, 0x7952}, {0x6c5a, 0x677d}, {0x6c5d, 0x6623},
+ {0x6c5e, 0x7b71}, {0x6c5f, 0x4b30}, {0x6c60, 0x722e},
+ {0x6c68, 0x4d67}, {0x6c6a, 0x685c}, {0x6c6d, 0x6757},
+ {0x6c70, 0x7740}, {0x6c72, 0x5063}, {0x6c76, 0x5a21},
+ {0x6c7a, 0x4c3d}, {0x6c7d, 0x5129}, {0x6c7e, 0x5d4c},
+ {0x6c81, 0x637e}, {0x6c82, 0x512a}, {0x6c83, 0x682a},
+ {0x6c85, 0x6a36}, {0x6c86, 0x797a}, {0x6c87, 0x664c},
+ {0x6c88, 0x7658}, {0x6c8c, 0x5447}, {0x6c90, 0x594b},
+ {0x6c92, 0x5952}, {0x6c93, 0x534b}, {0x6c94, 0x5877},
+ {0x6c95, 0x5a29}, {0x6c96, 0x7578}, {0x6c99, 0x5e5e},
+ {0x6c9a, 0x722f}, {0x6c9b, 0x7829}, {0x6cab, 0x5848},
+ {0x6cae, 0x6e41}, {0x6cb3, 0x7941}, {0x6cb8, 0x5d73},
+ {0x6cb9, 0x6a7a}, {0x6cbb, 0x763d}, {0x6cbc, 0x613b},
+ {0x6cbd, 0x4d3f}, {0x6cbe, 0x7454}, {0x6cbf, 0x664d},
+ {0x6cc1, 0x7c4f}, {0x6cc2, 0x7b22}, {0x6cc4, 0x605c},
+ {0x6cc9, 0x743b}, {0x6cca, 0x5a55}, {0x6ccc, 0x7932},
+ {0x6cd3, 0x7b72}, {0x6cd5, 0x5b76}, {0x6cd7, 0x5e5f},
+ {0x6cdb, 0x5b72}, {0x6ce1, 0x785c}, {0x6ce2, 0x776e},
+ {0x6ce3, 0x6b68}, {0x6ce5, 0x527a}, {0x6ce8, 0x713c},
+ {0x6ceb, 0x7a5a}, {0x6cee, 0x5a6a}, {0x6cef, 0x5a46},
+ {0x6cf0, 0x7741}, {0x6cf3, 0x6736}, {0x6d0b, 0x6547},
+ {0x6d0c, 0x562c}, {0x6d11, 0x5c47}, {0x6d17, 0x6129},
+ {0x6d19, 0x622a}, {0x6d1b, 0x5526}, {0x6d1e, 0x5457},
+ {0x6d25, 0x7250}, {0x6d27, 0x6a7b}, {0x6d29, 0x605d},
+ {0x6d2a, 0x7b73}, {0x6d32, 0x713d}, {0x6d35, 0x6267},
+ {0x6d36, 0x7d57}, {0x6d38, 0x4e48}, {0x6d39, 0x6a37},
+ {0x6d3b, 0x7c40}, {0x6d3d, 0x7d67}, {0x6d3e, 0x776f},
+ {0x6d41, 0x5735}, {0x6d59, 0x6f3a}, {0x6d5a, 0x715d},
+ {0x6d5c, 0x5e33}, {0x6d63, 0x684b}, {0x6d66, 0x785d},
+ {0x6d69, 0x7b47}, {0x6d6a, 0x5548}, {0x6d6c, 0x575f},
+ {0x6d6e, 0x5d29}, {0x6d74, 0x6931}, {0x6d77, 0x7a2d},
+ {0x6d78, 0x7659}, {0x6d79, 0x7a74}, {0x6d7f, 0x782a},
+ {0x6d85, 0x666e}, {0x6d87, 0x4c5c}, {0x6d88, 0x613c},
+ {0x6d89, 0x606f}, {0x6d8c, 0x693f}, {0x6d8d, 0x7c7d},
+ {0x6d8e, 0x664e}, {0x6d91, 0x6157}, {0x6d93, 0x664f},
+ {0x6d95, 0x7471}, {0x6daf, 0x6473}, {0x6db2, 0x647b},
+ {0x6db5, 0x7964}, {0x6dc0, 0x6f63}, {0x6dc3, 0x4f6e},
+ {0x6dc4, 0x763e}, {0x6dc5, 0x6032}, {0x6dc6, 0x7c7e},
+ {0x6dc7, 0x512b}, {0x6dcb, 0x577a}, {0x6dcf, 0x7b48},
+ {0x6dd1, 0x6257}, {0x6dd8, 0x5423}, {0x6dd9, 0x7078},
+ {0x6dda, 0x5728}, {0x6dde, 0x6167}, {0x6de1, 0x533f},
+ {0x6de8, 0x6f64}, {0x6dea, 0x5745}, {0x6deb, 0x6b62},
+ {0x6dee, 0x7c67}, {0x6df1, 0x6422}, {0x6df3, 0x6268},
+ {0x6df5, 0x6650}, {0x6df7, 0x7b68}, {0x6df8, 0x7468},
+ {0x6df9, 0x6574}, {0x6dfa, 0x743c}, {0x6dfb, 0x7455},
+ {0x6e17, 0x5f36}, {0x6e19, 0x7c39}, {0x6e1a, 0x6e42},
+ {0x6e1b, 0x4a75}, {0x6e1f, 0x6f65}, {0x6e20, 0x4b62},
+ {0x6e21, 0x5424}, {0x6e23, 0x5e60}, {0x6e24, 0x5a7d},
+ {0x6e25, 0x6446}, {0x6e26, 0x683e}, {0x6e2b, 0x605e},
+ {0x6e2c, 0x7634}, {0x6e2d, 0x6a52}, {0x6e2f, 0x797b},
+ {0x6e32, 0x6042}, {0x6e34, 0x4a64}, {0x6e36, 0x6737},
+ {0x6e38, 0x6a7d}, {0x6e3a, 0x595d}, {0x6e3c, 0x5a34},
+ {0x6e3d, 0x6e2a}, {0x6e3e, 0x7b69}, {0x6e43, 0x5b4b},
+ {0x6e44, 0x5a35}, {0x6e4a, 0x713e}, {0x6e4d, 0x532c},
+ {0x6e56, 0x7b49}, {0x6e58, 0x5f4f}, {0x6e5b, 0x5340},
+ {0x6e5c, 0x6357}, {0x6e5e, 0x6f66}, {0x6e5f, 0x7c50},
+ {0x6e67, 0x6940}, {0x6e6b, 0x7553}, {0x6e6e, 0x6c5c},
+ {0x6e6f, 0x7737}, {0x6e72, 0x6a38}, {0x6e73, 0x5179},
+ {0x6e7a, 0x5c48}, {0x6e90, 0x6a39}, {0x6e96, 0x715e},
+ {0x6e9c, 0x5736}, {0x6e9d, 0x4f35}, {0x6e9f, 0x5928},
+ {0x6ea2, 0x6c6e}, {0x6ea5, 0x5d2a}, {0x6eaa, 0x4d22},
+ {0x6eab, 0x682e}, {0x6eaf, 0x613d}, {0x6eb1, 0x7251},
+ {0x6eb6, 0x6941}, {0x6eba, 0x527c}, {0x6ec2, 0x5b35},
+ {0x6ec4, 0x7367}, {0x6ec5, 0x587e}, {0x6ec9, 0x7c51},
+ {0x6ecb, 0x6d32}, {0x6ecc, 0x742f}, {0x6ece, 0x7b23},
+ {0x6ed1, 0x7c41}, {0x6ed3, 0x6e2b}, {0x6ed4, 0x5425},
+ {0x6eef, 0x7472}, {0x6ef4, 0x6e59}, {0x6ef8, 0x7b4a},
+ {0x6efe, 0x4d63}, {0x6eff, 0x583b}, {0x6f01, 0x655b},
+ {0x6f02, 0x7877}, {0x6f06, 0x7654}, {0x6f0f, 0x5729},
+ {0x6f11, 0x4b49}, {0x6f14, 0x6651}, {0x6f15, 0x704c},
+ {0x6f20, 0x582e}, {0x6f22, 0x7953}, {0x6f23, 0x557e},
+ {0x6f2b, 0x583c}, {0x6f2c, 0x7230}, {0x6f31, 0x622b},
+ {0x6f32, 0x7368}, {0x6f38, 0x6f42}, {0x6f3f, 0x6d6c},
+ {0x6f41, 0x6738}, {0x6f51, 0x5a7e}, {0x6f54, 0x4c3e},
+ {0x6f57, 0x727c}, {0x6f58, 0x5a6b}, {0x6f5a, 0x6258},
+ {0x6f5b, 0x6d56}, {0x6f5e, 0x5651}, {0x6f5f, 0x6033},
+ {0x6f62, 0x7c52}, {0x6f64, 0x6b48}, {0x6f6d, 0x5341},
+ {0x6f6e, 0x704d}, {0x6f70, 0x4f77}, {0x6f7a, 0x6d52},
+ {0x6f7c, 0x5458}, {0x6f7d, 0x5c49}, {0x6f7e, 0x5771},
+ {0x6f81, 0x5f3b}, {0x6f84, 0x7325}, {0x6f88, 0x744d},
+ {0x6f8d, 0x713f}, {0x6f8e, 0x7831}, {0x6f90, 0x697a},
+ {0x6f94, 0x7b4b}, {0x6f97, 0x4a55}, {0x6fa3, 0x7954},
+ {0x6fa4, 0x774a}, {0x6fa7, 0x5648}, {0x6fae, 0x7c68},
+ {0x6faf, 0x733d}, {0x6fb1, 0x6e7e}, {0x6fb3, 0x677e},
+ {0x6fb9, 0x5342}, {0x6fbe, 0x5336}, {0x6fc0, 0x4c2d},
+ {0x6fc1, 0x767a}, {0x6fc2, 0x5632}, {0x6fc3, 0x5258},
+ {0x6fca, 0x6758}, {0x6fd5, 0x6325}, {0x6fda, 0x6739},
+ {0x6fdf, 0x702d}, {0x6fe0, 0x7b4c}, {0x6fe1, 0x6b21},
+ {0x6fe4, 0x5426}, {0x6fe9, 0x7b4d}, {0x6feb, 0x553d},
+ {0x6fec, 0x715f}, {0x6fef, 0x767b}, {0x6ff1, 0x5e34},
+ {0x6ffe, 0x556b}, {0x7001, 0x6548}, {0x7005, 0x7b24},
+ {0x7006, 0x5439}, {0x7009, 0x5e61}, {0x700b, 0x6423},
+ {0x700f, 0x5737}, {0x7011, 0x786e}, {0x7015, 0x5e35},
+ {0x7018, 0x5652}, {0x701a, 0x7955}, {0x701b, 0x673a},
+ {0x701c, 0x6b55}, {0x701d, 0x5577}, {0x701e, 0x6f67},
+ {0x701f, 0x613e}, {0x7023, 0x7a2e}, {0x7027, 0x5669},
+ {0x7028, 0x566e}, {0x702f, 0x673b}, {0x7037, 0x6c4b},
+ {0x703e, 0x5533}, {0x704c, 0x4e34}, {0x7050, 0x7b25},
+ {0x7051, 0x616e}, {0x7058, 0x7728}, {0x705d, 0x7b4e},
+ {0x7063, 0x583d}, {0x706b, 0x7b7d}, {0x7070, 0x7c69},
+ {0x7078, 0x4f36}, {0x707c, 0x6d47}, {0x707d, 0x6e2c},
+ {0x7085, 0x4c5d}, {0x708a, 0x7627}, {0x708e, 0x667a},
+ {0x7092, 0x7524}, {0x7098, 0x7d5c}, {0x7099, 0x6d33},
+ {0x709a, 0x4e49}, {0x70a1, 0x6f68}, {0x70a4, 0x613f},
+ {0x70ab, 0x7a5b}, {0x70ac, 0x4b63}, {0x70ad, 0x7729},
+ {0x70af, 0x7b26}, {0x70b3, 0x5c39}, {0x70b7, 0x7140},
+ {0x70b8, 0x6d48}, {0x70b9, 0x6f43}, {0x70c8, 0x562d},
+ {0x70cb, 0x7d4e}, {0x70cf, 0x6821}, {0x70d8, 0x7b74},
+ {0x70d9, 0x5527}, {0x70dd, 0x7176}, {0x70df, 0x6653},
+ {0x70f1, 0x4c5e}, {0x70f9, 0x7832}, {0x70fd, 0x5c6b},
+ {0x7104, 0x7d36}, {0x7109, 0x656a}, {0x710c, 0x7160},
+ {0x7119, 0x5b4c}, {0x711a, 0x5d4d}, {0x711e, 0x5448},
+ {0x7121, 0x596d}, {0x7126, 0x7525}, {0x7130, 0x667b},
+ {0x7136, 0x6654}, {0x7147, 0x7d48}, {0x7149, 0x5621},
+ {0x714a, 0x7d3f}, {0x714c, 0x7c53}, {0x714e, 0x6f21},
+ {0x7150, 0x673c}, {0x7156, 0x516e}, {0x7159, 0x6655},
+ {0x715c, 0x6972}, {0x715e, 0x5f30}, {0x7164, 0x5860},
+ {0x7165, 0x7c3a}, {0x7166, 0x7d2f}, {0x7167, 0x704e},
+ {0x7169, 0x5b61}, {0x716c, 0x6549}, {0x716e, 0x6d34},
+ {0x717d, 0x6043}, {0x7184, 0x6358}, {0x7189, 0x697b},
+ {0x718a, 0x6a28}, {0x718f, 0x7d37}, {0x7192, 0x7b27},
+ {0x7194, 0x6942}, {0x7199, 0x7d77}, {0x719f, 0x6259},
+ {0x71a2, 0x5c6c}, {0x71ac, 0x6822}, {0x71b1, 0x6670},
+ {0x71b9, 0x7d78}, {0x71ba, 0x7d79}, {0x71be, 0x763f},
+ {0x71c1, 0x6727}, {0x71c3, 0x6657}, {0x71c8, 0x5473},
+ {0x71c9, 0x5449}, {0x71ce, 0x567a}, {0x71d0, 0x5772},
+ {0x71d2, 0x6140}, {0x71d4, 0x5b62}, {0x71d5, 0x6658},
+ {0x71df, 0x673d}, {0x71e5, 0x704f}, {0x71e6, 0x733e},
+ {0x71e7, 0x622c}, {0x71ed, 0x7537}, {0x71ee, 0x6070},
+ {0x71fb, 0x7d38}, {0x71fc, 0x6368}, {0x71fe, 0x5427},
+ {0x71ff, 0x687c}, {0x7200, 0x7a52}, {0x7206, 0x786f},
+ {0x7210, 0x5653}, {0x721b, 0x5534}, {0x722a, 0x7050},
+ {0x722c, 0x7770}, {0x722d, 0x6e33}, {0x7230, 0x6a3a},
+ {0x7232, 0x6a53}, {0x7235, 0x6d49}, {0x7236, 0x5d2b},
+ {0x723a, 0x652c}, {0x723b, 0x7d21}, {0x723d, 0x5f50},
+ {0x723e, 0x6c33}, {0x7240, 0x5f51}, {0x7246, 0x6d6d},
+ {0x7247, 0x7838}, {0x7248, 0x777a}, {0x724c, 0x782b},
+ {0x7252, 0x7460}, {0x7258, 0x543a}, {0x7259, 0x6433},
+ {0x725b, 0x695a}, {0x725d, 0x5e36}, {0x725f, 0x593f},
+ {0x7261, 0x5940}, {0x7262, 0x566f}, {0x7267, 0x594c},
+ {0x7269, 0x5a2a}, {0x7272, 0x5f65}, {0x7279, 0x7765},
+ {0x727d, 0x4c32}, {0x7280, 0x5f79}, {0x7281, 0x5760},
+ {0x72a2, 0x543b}, {0x72a7, 0x7d7a}, {0x72ac, 0x4c33},
+ {0x72af, 0x5b73}, {0x72c0, 0x5f52}, {0x72c2, 0x4e4a},
+ {0x72c4, 0x6e5a}, {0x72ce, 0x6464}, {0x72d0, 0x7b4f},
+ {0x72d7, 0x4f37}, {0x72d9, 0x6e43}, {0x72e1, 0x4e6a},
+ {0x72e9, 0x622d}, {0x72f8, 0x5761}, {0x72f9, 0x7a75},
+ {0x72fc, 0x5549}, {0x72fd, 0x782c}, {0x730a, 0x6759},
+ {0x7316, 0x7369}, {0x731b, 0x586d}, {0x731c, 0x6344},
+ {0x731d, 0x7071}, {0x7325, 0x6865}, {0x7329, 0x607a},
+ {0x732a, 0x6e44}, {0x732b, 0x595e}, {0x7336, 0x6b22},
+ {0x7337, 0x6b23}, {0x733e, 0x7c42}, {0x733f, 0x6a3b},
+ {0x7344, 0x682b}, {0x7345, 0x5e62}, {0x7350, 0x6d6f},
+ {0x7352, 0x6823}, {0x7357, 0x4f71}, {0x7368, 0x543c},
+ {0x736a, 0x7c6a}, {0x7370, 0x673e}, {0x7372, 0x7c72},
+ {0x7375, 0x5634}, {0x7378, 0x622e}, {0x737a, 0x5337},
+ {0x737b, 0x7a4c}, {0x7384, 0x7a5c}, {0x7386, 0x6d35},
+ {0x7387, 0x6163}, {0x7389, 0x682c}, {0x738b, 0x685d},
+ {0x738e, 0x6f69}, {0x7394, 0x743d}, {0x7396, 0x4f38},
+ {0x7397, 0x695b}, {0x7398, 0x512c}, {0x739f, 0x5a47},
+ {0x73a7, 0x6b49}, {0x73a9, 0x684c}, {0x73ad, 0x5e37},
+ {0x73b2, 0x563c}, {0x73b3, 0x5365}, {0x73b9, 0x7a5d},
+ {0x73c0, 0x5a56}, {0x73c2, 0x4a31}, {0x73c9, 0x5a48},
+ {0x73ca, 0x5f26}, {0x73cc, 0x7933}, {0x73cd, 0x7252},
+ {0x73cf, 0x4a44}, {0x73d6, 0x4e4b}, {0x73d9, 0x4d75},
+ {0x73dd, 0x7d30}, {0x73de, 0x5528}, {0x73e0, 0x7141},
+ {0x73e3, 0x6269}, {0x73e4, 0x5c4a}, {0x73e5, 0x6c34},
+ {0x73e6, 0x7a40}, {0x73e9, 0x7b28}, {0x73ea, 0x5028},
+ {0x73ed, 0x5a6c}, {0x73f7, 0x596e}, {0x73f9, 0x607b},
+ {0x73fd, 0x6f6a}, {0x73fe, 0x7a5e}, {0x7401, 0x6044},
+ {0x7403, 0x4f39}, {0x7405, 0x554a}, {0x7406, 0x5762},
+ {0x7407, 0x622f}, {0x7409, 0x5738}, {0x7413, 0x684d},
+ {0x741b, 0x765a}, {0x7420, 0x6f22}, {0x7421, 0x625a},
+ {0x7422, 0x767c}, {0x7425, 0x7b50}, {0x7426, 0x512d},
+ {0x7428, 0x4d64}, {0x742a, 0x512e}, {0x742b, 0x5c6d},
+ {0x742c, 0x684e}, {0x742e, 0x7079}, {0x742f, 0x4e35},
+ {0x7430, 0x667c}, {0x7433, 0x577b}, {0x7434, 0x5056},
+ {0x7435, 0x5d75}, {0x7436, 0x7771}, {0x7438, 0x767d},
+ {0x743a, 0x5b77}, {0x743f, 0x7b6a}, {0x7440, 0x695c},
+ {0x7441, 0x5941}, {0x7443, 0x7572}, {0x7444, 0x6045},
+ {0x744b, 0x6a54}, {0x7455, 0x7942}, {0x7457, 0x6a3c},
+ {0x7459, 0x5245}, {0x745a, 0x7b51}, {0x745b, 0x6740},
+ {0x745c, 0x6b25}, {0x745e, 0x5f7a}, {0x745f, 0x6322},
+ {0x7460, 0x5739}, {0x7462, 0x6943}, {0x7464, 0x687d},
+ {0x7465, 0x682f}, {0x7468, 0x7253}, {0x7469, 0x7b29},
+ {0x746a, 0x5825}, {0x746f, 0x554b}, {0x747e, 0x5048},
+ {0x7482, 0x512f}, {0x7483, 0x5763}, {0x7487, 0x6046},
+ {0x7489, 0x5622}, {0x748b, 0x6d70}, {0x7498, 0x5773},
+ {0x749c, 0x7c54}, {0x749e, 0x5a57}, {0x749f, 0x4c5f},
+ {0x74a1, 0x7254}, {0x74a3, 0x5130}, {0x74a5, 0x4c60},
+ {0x74a7, 0x5b7d}, {0x74a8, 0x733f}, {0x74aa, 0x7051},
+ {0x74b0, 0x7c3b}, {0x74b2, 0x6230}, {0x74b5, 0x6625},
+ {0x74b9, 0x625b}, {0x74bd, 0x5f5e}, {0x74bf, 0x6047},
+ {0x74c6, 0x726f}, {0x74ca, 0x4c61}, {0x74cf, 0x566a},
+ {0x74d4, 0x6742}, {0x74d8, 0x4e36}, {0x74da, 0x7340},
+ {0x74dc, 0x4d7e}, {0x74e0, 0x7b52}, {0x74e2, 0x7878},
+ {0x74e3, 0x777b}, {0x74e6, 0x683f}, {0x74ee, 0x6837},
+ {0x74f7, 0x6d36}, {0x7501, 0x5c3a}, {0x7504, 0x4c34},
+ {0x7511, 0x7177}, {0x7515, 0x6838}, {0x7518, 0x4a76},
+ {0x751a, 0x6424}, {0x751b, 0x7456}, {0x751f, 0x5f66},
+ {0x7523, 0x5f27}, {0x7525, 0x5f67}, {0x7526, 0x6141},
+ {0x7528, 0x6944}, {0x752b, 0x5c4b}, {0x752c, 0x6945},
+ {0x7530, 0x6f23}, {0x7531, 0x6b26}, {0x7532, 0x4b23},
+ {0x7533, 0x6369}, {0x7537, 0x517b}, {0x7538, 0x6f24},
+ {0x753a, 0x6f6b}, {0x7547, 0x5034}, {0x754c, 0x4d23},
+ {0x754f, 0x6866}, {0x7551, 0x6f25}, {0x7553, 0x534c},
+ {0x7554, 0x5a6d}, {0x7559, 0x573a}, {0x755b, 0x7255},
+ {0x755c, 0x7565}, {0x755d, 0x596f}, {0x7562, 0x7934},
+ {0x7565, 0x5554}, {0x7566, 0x7d4f}, {0x756a, 0x5b63},
+ {0x756f, 0x7161}, {0x7570, 0x6c36}, {0x7575, 0x7b7e},
+ {0x7576, 0x5357}, {0x7578, 0x5131}, {0x757a, 0x4b31},
+ {0x757f, 0x5132}, {0x7586, 0x4b32}, {0x7587, 0x7142},
+ {0x758a, 0x7461}, {0x758b, 0x7935}, {0x758e, 0x6143},
+ {0x758f, 0x6142}, {0x7591, 0x6b77}, {0x759d, 0x5f28},
+ {0x75a5, 0x4b4a}, {0x75ab, 0x6639}, {0x75b1, 0x785e},
+ {0x75b2, 0x792a}, {0x75b3, 0x4a77}, {0x75b5, 0x6d37},
+ {0x75b8, 0x5338}, {0x75b9, 0x7256}, {0x75bc, 0x5459},
+ {0x75bd, 0x6e45}, {0x75be, 0x7270}, {0x75c2, 0x4a32},
+ {0x75c5, 0x5c3b}, {0x75c7, 0x7178}, {0x75cd, 0x6c37},
+ {0x75d2, 0x654a}, {0x75d4, 0x7640}, {0x75d5, 0x7d5d},
+ {0x75d8, 0x5463}, {0x75d9, 0x4c62}, {0x75db, 0x7754},
+ {0x75e2, 0x5765}, {0x75f0, 0x5343}, {0x75f2, 0x5826},
+ {0x75f4, 0x7641}, {0x75fa, 0x5d76}, {0x75fc, 0x4d40},
+ {0x7600, 0x655c}, {0x760d, 0x654b}, {0x7619, 0x6144},
+ {0x761f, 0x6830}, {0x7620, 0x7430}, {0x7621, 0x736a},
+ {0x7622, 0x5a6e}, {0x7624, 0x573b}, {0x7626, 0x6231},
+ {0x763b, 0x572a}, {0x7642, 0x567b}, {0x764c, 0x645f},
+ {0x764e, 0x4a56}, {0x7652, 0x6b28}, {0x7656, 0x5b7e},
+ {0x7661, 0x7642}, {0x7664, 0x6f3b}, {0x7669, 0x547d},
+ {0x766c, 0x6048}, {0x7670, 0x6839}, {0x7672, 0x6f26},
+ {0x7678, 0x4d24}, {0x767b, 0x5474}, {0x767c, 0x5b21},
+ {0x767d, 0x5b5c}, {0x767e, 0x5b5d}, {0x7684, 0x6e5c},
+ {0x7686, 0x4b4b}, {0x7687, 0x7c55}, {0x768e, 0x4e6b},
+ {0x7690, 0x4d41}, {0x7693, 0x7b53}, {0x76ae, 0x792b},
+ {0x76ba, 0x7554}, {0x76bf, 0x5929}, {0x76c2, 0x695d},
+ {0x76c3, 0x5b4d}, {0x76c6, 0x5d4e}, {0x76c8, 0x6743},
+ {0x76ca, 0x6c4c}, {0x76d2, 0x796c}, {0x76d6, 0x4b4c},
+ {0x76db, 0x607c}, {0x76dc, 0x5428}, {0x76de, 0x6d53},
+ {0x76df, 0x586f}, {0x76e1, 0x7257}, {0x76e3, 0x4a78},
+ {0x76e4, 0x5a6f}, {0x76e7, 0x5654}, {0x76ee, 0x594d},
+ {0x76f2, 0x586e}, {0x76f4, 0x7241}, {0x76f8, 0x5f53},
+ {0x76fc, 0x5a70}, {0x76fe, 0x626a}, {0x7701, 0x607d},
+ {0x7704, 0x5878}, {0x7708, 0x772f}, {0x7709, 0x5a36},
+ {0x770b, 0x4a57}, {0x771e, 0x7258}, {0x7720, 0x5879},
+ {0x7729, 0x7a5f}, {0x7737, 0x4f6f}, {0x7738, 0x5942},
+ {0x773a, 0x7052}, {0x773c, 0x6451}, {0x7740, 0x7337},
+ {0x774d, 0x7a60}, {0x775b, 0x6f6c}, {0x7761, 0x6232},
+ {0x7763, 0x543d}, {0x7766, 0x594e}, {0x776b, 0x7462},
+ {0x7779, 0x5429}, {0x777e, 0x4d42}, {0x777f, 0x675a},
+ {0x778b, 0x7259}, {0x7791, 0x592a}, {0x779e, 0x583e},
+ {0x77a5, 0x5c2d}, {0x77ac, 0x626b}, {0x77ad, 0x567c},
+ {0x77b0, 0x4a79}, {0x77b3, 0x545a}, {0x77bb, 0x7457},
+ {0x77bc, 0x4c21}, {0x77bf, 0x4f3a}, {0x77d7, 0x7538},
+ {0x77db, 0x5943}, {0x77dc, 0x5068}, {0x77e2, 0x6345},
+ {0x77e3, 0x6b78}, {0x77e5, 0x7231}, {0x77e9, 0x4f3b},
+ {0x77ed, 0x532d}, {0x77ee, 0x6861}, {0x77ef, 0x4e6c},
+ {0x77f3, 0x6034}, {0x7802, 0x5e63}, {0x7812, 0x5d77},
+ {0x7825, 0x7232}, {0x7826, 0x7376}, {0x7827, 0x765b},
+ {0x782c, 0x577e}, {0x7832, 0x785f}, {0x7834, 0x7772},
+ {0x7845, 0x5029}, {0x784f, 0x665a}, {0x785d, 0x7526},
+ {0x786b, 0x573c}, {0x786c, 0x4c63}, {0x786f, 0x665b},
+ {0x787c, 0x5d5d}, {0x7881, 0x5133}, {0x7887, 0x6f6d},
+ {0x788c, 0x565e}, {0x788d, 0x6474}, {0x788e, 0x616f},
+ {0x7891, 0x5d78}, {0x7897, 0x684f}, {0x78a3, 0x4a65},
+ {0x78a7, 0x5c21}, {0x78a9, 0x6035}, {0x78ba, 0x7c2c},
+ {0x78bb, 0x7c2d}, {0x78bc, 0x5827}, {0x78c1, 0x6d38},
+ {0x78c5, 0x5b36}, {0x78ca, 0x5670}, {0x78cb, 0x732f},
+ {0x78ce, 0x4d25}, {0x78d0, 0x5a71}, {0x78e8, 0x5828},
+ {0x78ec, 0x4c64}, {0x78ef, 0x5134}, {0x78f5, 0x4a58},
+ {0x78fb, 0x5a72}, {0x7901, 0x7527}, {0x790e, 0x7528},
+ {0x7916, 0x6626}, {0x792a, 0x556c}, {0x792b, 0x5578},
+ {0x792c, 0x5a73}, {0x793a, 0x6346}, {0x793e, 0x5e64},
+ {0x7940, 0x5e65}, {0x7941, 0x5135}, {0x7947, 0x5136},
+ {0x7948, 0x5137}, {0x7949, 0x7233}, {0x7950, 0x695e},
+ {0x7956, 0x7053}, {0x7957, 0x7234}, {0x795a, 0x7054},
+ {0x795b, 0x4b64}, {0x795c, 0x7b54}, {0x795d, 0x7566},
+ {0x795e, 0x636a}, {0x7960, 0x5e66}, {0x7965, 0x5f54},
+ {0x7968, 0x7879}, {0x796d, 0x702e}, {0x797a, 0x5138},
+ {0x797f, 0x565f}, {0x7981, 0x5057}, {0x798d, 0x7c21},
+ {0x798e, 0x6f6e}, {0x798f, 0x5c58}, {0x7991, 0x695f},
+ {0x79a6, 0x655d}, {0x79a7, 0x7d7b}, {0x79aa, 0x6049},
+ {0x79ae, 0x5649}, {0x79b1, 0x542a}, {0x79b3, 0x654c},
+ {0x79b9, 0x6960}, {0x79bd, 0x5058}, {0x79be, 0x7c22},
+ {0x79bf, 0x543e}, {0x79c0, 0x6233}, {0x79c1, 0x5e67},
+ {0x79c9, 0x5c3c}, {0x79ca, 0x5236}, {0x79cb, 0x7555},
+ {0x79d1, 0x4e21}, {0x79d2, 0x7529}, {0x79d5, 0x5d79},
+ {0x79d8, 0x5d7a}, {0x79df, 0x7055}, {0x79e4, 0x765f},
+ {0x79e6, 0x725a}, {0x79e7, 0x646b}, {0x79e9, 0x7271},
+ {0x79fb, 0x6c39}, {0x7a00, 0x7d7c}, {0x7a05, 0x612a},
+ {0x7a08, 0x4a59}, {0x7a0b, 0x6f6f}, {0x7a0d, 0x752a},
+ {0x7a14, 0x6c79}, {0x7a17, 0x782d}, {0x7a19, 0x7242},
+ {0x7a1a, 0x7643}, {0x7a1c, 0x5752}, {0x7a1f, 0x7922},
+ {0x7a20, 0x7056}, {0x7a2e, 0x707a}, {0x7a31, 0x7660},
+ {0x7a36, 0x6973}, {0x7a37, 0x7243}, {0x7a3b, 0x542b},
+ {0x7a3c, 0x4a33}, {0x7a3d, 0x4d26}, {0x7a3f, 0x4d43},
+ {0x7a40, 0x4d5a}, {0x7a46, 0x594f}, {0x7a49, 0x7644},
+ {0x7a4d, 0x6e5d}, {0x7a4e, 0x6744}, {0x7a57, 0x6234},
+ {0x7a61, 0x5f62}, {0x7a62, 0x675b}, {0x7a69, 0x6831},
+ {0x7a6b, 0x7c2e}, {0x7a70, 0x654d}, {0x7a74, 0x7a6b},
+ {0x7a76, 0x4f3c}, {0x7a79, 0x4f62}, {0x7a7a, 0x4d76},
+ {0x7a7d, 0x6f70}, {0x7a7f, 0x743e}, {0x7a81, 0x544d},
+ {0x7a84, 0x7338}, {0x7a88, 0x6921}, {0x7a92, 0x7272},
+ {0x7a93, 0x736b}, {0x7a95, 0x7057}, {0x7a98, 0x4f57},
+ {0x7a9f, 0x4f5f}, {0x7aa9, 0x6840}, {0x7aaa, 0x6841},
+ {0x7aae, 0x4f63}, {0x7aaf, 0x6922}, {0x7aba, 0x502a},
+ {0x7ac4, 0x7341}, {0x7ac5, 0x502b}, {0x7ac7, 0x5464},
+ {0x7aca, 0x6f3c}, {0x7acb, 0x5821}, {0x7ad7, 0x595f},
+ {0x7ad9, 0x7357}, {0x7add, 0x5c3d}, {0x7adf, 0x4c65},
+ {0x7ae0, 0x6d71}, {0x7ae3, 0x7162}, {0x7ae5, 0x545b},
+ {0x7aea, 0x6235}, {0x7aed, 0x4a66}, {0x7aef, 0x532e},
+ {0x7af6, 0x4c66}, {0x7af9, 0x7153}, {0x7afa, 0x7567},
+ {0x7aff, 0x4a5a}, {0x7b0f, 0x7b6e}, {0x7b11, 0x6145},
+ {0x7b19, 0x5f69}, {0x7b1b, 0x6e5e}, {0x7b1e, 0x7742},
+ {0x7b20, 0x5822}, {0x7b26, 0x5d2c}, {0x7b2c, 0x702f},
+ {0x7b2d, 0x563d}, {0x7b39, 0x612b}, {0x7b46, 0x7936},
+ {0x7b49, 0x5475}, {0x7b4b, 0x5049}, {0x7b4c, 0x6f27},
+ {0x7b4d, 0x626c}, {0x7b4f, 0x5b6a}, {0x7b50, 0x4e4c},
+ {0x7b51, 0x7568}, {0x7b52, 0x7755}, {0x7b54, 0x534d},
+ {0x7b56, 0x737e}, {0x7b60, 0x5035}, {0x7b6c, 0x607e},
+ {0x7b6e, 0x5f7b}, {0x7b75, 0x665d}, {0x7b7d, 0x6824},
+ {0x7b87, 0x4b4d}, {0x7b8b, 0x6f28}, {0x7b8f, 0x6e34},
+ {0x7b94, 0x5a58}, {0x7b95, 0x5139}, {0x7b97, 0x5f29},
+ {0x7b9a, 0x7330}, {0x7b9d, 0x4c44}, {0x7ba1, 0x4e37},
+ {0x7bad, 0x6f29}, {0x7bb1, 0x5f55}, {0x7bb4, 0x6d57},
+ {0x7bb8, 0x6e46}, {0x7bc0, 0x6f3d}, {0x7bc1, 0x7c56},
+ {0x7bc4, 0x5b74}, {0x7bc6, 0x6f2a}, {0x7bc7, 0x7839},
+ {0x7bc9, 0x7569}, {0x7bd2, 0x6359}, {0x7be0, 0x6146},
+ {0x7be4, 0x543f}, {0x7be9, 0x5e68}, {0x7c07, 0x706a},
+ {0x7c12, 0x7342}, {0x7c1e, 0x532f}, {0x7c21, 0x4a5b},
+ {0x7c27, 0x7c57}, {0x7c2a, 0x6d58}, {0x7c2b, 0x6147},
+ {0x7c3d, 0x7458}, {0x7c3e, 0x5633}, {0x7c3f, 0x5d2d},
+ {0x7c43, 0x553e}, {0x7c4c, 0x7143}, {0x7c4d, 0x6e5f},
+ {0x7c60, 0x566b}, {0x7c64, 0x7459}, {0x7c6c, 0x5766},
+ {0x7c73, 0x5a37}, {0x7c83, 0x5d7b}, {0x7c89, 0x5d4f},
+ {0x7c92, 0x5823}, {0x7c95, 0x5a59}, {0x7c97, 0x7058},
+ {0x7c98, 0x6f44}, {0x7c9f, 0x6158}, {0x7ca5, 0x7154},
+ {0x7ca7, 0x6d72}, {0x7cae, 0x555b}, {0x7cb1, 0x555c},
+ {0x7cb2, 0x7344}, {0x7cb3, 0x4b57}, {0x7cb9, 0x6236},
+ {0x7cbe, 0x6f71}, {0x7cca, 0x7b55}, {0x7cd6, 0x5358},
+ {0x7cde, 0x5d50}, {0x7cdf, 0x7059}, {0x7ce0, 0x4b33},
+ {0x7ce7, 0x555d}, {0x7cfb, 0x4d27}, {0x7cfe, 0x502c},
+ {0x7d00, 0x513a}, {0x7d02, 0x7144}, {0x7d04, 0x6533},
+ {0x7d05, 0x7b75}, {0x7d06, 0x6961}, {0x7d07, 0x7d60},
+ {0x7d08, 0x7c3c}, {0x7d0a, 0x5a22}, {0x7d0b, 0x5a23},
+ {0x7d0d, 0x5221}, {0x7d10, 0x526f}, {0x7d14, 0x626d},
+ {0x7d17, 0x5e69}, {0x7d18, 0x4e5c}, {0x7d19, 0x7235},
+ {0x7d1a, 0x5064}, {0x7d1b, 0x5d51}, {0x7d20, 0x6148},
+ {0x7d21, 0x5b37}, {0x7d22, 0x5f63}, {0x7d2b, 0x6d39},
+ {0x7d2c, 0x7145}, {0x7d2e, 0x734f}, {0x7d2f, 0x572b},
+ {0x7d30, 0x612c}, {0x7d33, 0x636b}, {0x7d35, 0x6e47},
+ {0x7d39, 0x6149}, {0x7d3a, 0x4a7a}, {0x7d42, 0x707b},
+ {0x7d43, 0x7a61}, {0x7d44, 0x705a}, {0x7d45, 0x4c67},
+ {0x7d46, 0x5a74}, {0x7d50, 0x4c3f}, {0x7d5e, 0x4e6d},
+ {0x7d61, 0x5529}, {0x7d62, 0x7a62}, {0x7d66, 0x5065},
+ {0x7d68, 0x6b56}, {0x7d6a, 0x6c5f}, {0x7d6e, 0x5f7c},
+ {0x7d71, 0x7756}, {0x7d72, 0x5e6a}, {0x7d73, 0x4b34},
+ {0x7d76, 0x6f3e}, {0x7d79, 0x4c35}, {0x7d7f, 0x4f3d},
+ {0x7d8e, 0x6f72}, {0x7d8f, 0x6237}, {0x7d93, 0x4c68},
+ {0x7d9c, 0x707c}, {0x7da0, 0x5660}, {0x7da2, 0x7146},
+ {0x7dac, 0x6238}, {0x7dad, 0x6b2b}, {0x7db1, 0x4b35},
+ {0x7db2, 0x5851}, {0x7db4, 0x744e}, {0x7db5, 0x7377},
+ {0x7db8, 0x5746}, {0x7dba, 0x513b}, {0x7dbb, 0x772a},
+ {0x7dbd, 0x6d4a}, {0x7dbe, 0x5753}, {0x7dbf, 0x587a},
+ {0x7dc7, 0x7645}, {0x7dca, 0x514c}, {0x7dcb, 0x5d7c},
+ {0x7dd6, 0x5f7d}, {0x7dd8, 0x7965}, {0x7dda, 0x604a},
+ {0x7ddd, 0x727d}, {0x7dde, 0x5330}, {0x7de0, 0x7473},
+ {0x7de1, 0x5a49}, {0x7de3, 0x665e}, {0x7de8, 0x783a},
+ {0x7de9, 0x6850}, {0x7dec, 0x587b}, {0x7def, 0x6a55},
+ {0x7df4, 0x5623}, {0x7dfb, 0x7646}, {0x7e09, 0x725b},
+ {0x7e0a, 0x647c}, {0x7e15, 0x6832}, {0x7e1b, 0x5a5a},
+ {0x7e1d, 0x725c}, {0x7e1e, 0x7b56}, {0x7e1f, 0x6932},
+ {0x7e21, 0x6e2d}, {0x7e23, 0x7a63}, {0x7e2b, 0x5c6e},
+ {0x7e2e, 0x756a}, {0x7e2f, 0x6660}, {0x7e31, 0x707d},
+ {0x7e37, 0x572c}, {0x7e3d, 0x7545}, {0x7e3e, 0x6e60},
+ {0x7e41, 0x5b65}, {0x7e43, 0x5d5e}, {0x7e46, 0x5970},
+ {0x7e47, 0x6923}, {0x7e52, 0x7179}, {0x7e54, 0x7244},
+ {0x7e55, 0x604b}, {0x7e5e, 0x6924}, {0x7e61, 0x6239},
+ {0x7e69, 0x6331}, {0x7e6a, 0x7c6b}, {0x7e6b, 0x4d28},
+ {0x7e6d, 0x4c36}, {0x7e70, 0x705b}, {0x7e79, 0x663a},
+ {0x7e7c, 0x4d29}, {0x7e82, 0x7343}, {0x7e8c, 0x6159},
+ {0x7e8f, 0x6f2b}, {0x7e93, 0x6745}, {0x7e96, 0x6069},
+ {0x7e98, 0x7345}, {0x7e9b, 0x5440}, {0x7e9c, 0x553f},
+ {0x7f36, 0x5d2e}, {0x7f38, 0x797c}, {0x7f3a, 0x4c40},
+ {0x7f4c, 0x6522}, {0x7f50, 0x4e38}, {0x7f54, 0x5852},
+ {0x7f55, 0x7956}, {0x7f6a, 0x712a}, {0x7f6b, 0x4e51},
+ {0x7f6e, 0x7647}, {0x7f70, 0x5b6b}, {0x7f72, 0x5f7e},
+ {0x7f75, 0x5861}, {0x7f77, 0x7773}, {0x7f79, 0x5767},
+ {0x7f85, 0x547e}, {0x7f88, 0x513c}, {0x7f8a, 0x654f},
+ {0x7f8c, 0x4b36}, {0x7f8e, 0x5a38}, {0x7f94, 0x4d44},
+ {0x7f9a, 0x563e}, {0x7f9e, 0x623a}, {0x7fa4, 0x4f58},
+ {0x7fa8, 0x604c}, {0x7fa9, 0x6b79}, {0x7fb2, 0x7d7d},
+ {0x7fb8, 0x5768}, {0x7fb9, 0x4b58}, {0x7fbd, 0x6962},
+ {0x7fc1, 0x683a}, {0x7fc5, 0x6347}, {0x7fca, 0x6c4d},
+ {0x7fcc, 0x6c4e}, {0x7fce, 0x563f}, {0x7fd2, 0x6327},
+ {0x7fd4, 0x5f56}, {0x7fd5, 0x7d68}, {0x7fdf, 0x6e61},
+ {0x7fe0, 0x7628}, {0x7fe1, 0x5d7d}, {0x7fe9, 0x783b},
+ {0x7feb, 0x6851}, {0x7ff0, 0x7957}, {0x7ff9, 0x4e6e},
+ {0x7ffc, 0x6c4f}, {0x8000, 0x6925}, {0x8001, 0x5655},
+ {0x8003, 0x4d45}, {0x8005, 0x6d3a}, {0x8006, 0x513d},
+ {0x8009, 0x4f3e}, {0x800c, 0x6c3b}, {0x8010, 0x5231},
+ {0x8015, 0x4c69}, {0x8017, 0x5944}, {0x8018, 0x697c},
+ {0x802d, 0x513e}, {0x8033, 0x6c3c}, {0x8036, 0x652d},
+ {0x803d, 0x7730}, {0x803f, 0x4c6a}, {0x8043, 0x5344},
+ {0x8046, 0x5640}, {0x804a, 0x567d}, {0x8056, 0x6121},
+ {0x8058, 0x5e3d}, {0x805a, 0x7629}, {0x805e, 0x5a24},
+ {0x806f, 0x5624}, {0x8070, 0x7546}, {0x8072, 0x6122},
+ {0x8073, 0x6946}, {0x8077, 0x7245}, {0x807d, 0x7469},
+ {0x807e, 0x566c}, {0x807f, 0x6b53}, {0x8084, 0x6c3d},
+ {0x8085, 0x625c}, {0x8086, 0x5e6b}, {0x8087, 0x705c},
+ {0x8089, 0x6b3f}, {0x808b, 0x574e}, {0x808c, 0x513f},
+ {0x8096, 0x752b}, {0x809b, 0x797d}, {0x809d, 0x4a5c},
+ {0x80a1, 0x4d46}, {0x80a2, 0x7236}, {0x80a5, 0x5d7e},
+ {0x80a9, 0x4c37}, {0x80aa, 0x5b38}, {0x80af, 0x5069},
+ {0x80b1, 0x4e5d}, {0x80b2, 0x6b40}, {0x80b4, 0x7d22},
+ {0x80ba, 0x784b}, {0x80c3, 0x6a56}, {0x80c4, 0x7130},
+ {0x80cc, 0x5b4e}, {0x80ce, 0x7743}, {0x80da, 0x5b4f},
+ {0x80db, 0x4b24}, {0x80de, 0x7860}, {0x80e1, 0x7b57},
+ {0x80e4, 0x6b4a}, {0x80e5, 0x6021}, {0x80f1, 0x4e4d},
+ {0x80f4, 0x545c}, {0x80f8, 0x7d58}, {0x80fd, 0x5276},
+ {0x8102, 0x7237}, {0x8105, 0x7a76}, {0x8106, 0x762a},
+ {0x8107, 0x7a77}, {0x8108, 0x5866}, {0x810a, 0x7431},
+ {0x8118, 0x6852}, {0x811a, 0x4a45}, {0x811b, 0x4c6b},
+ {0x8123, 0x626e}, {0x8129, 0x623b}, {0x812b, 0x772d},
+ {0x812f, 0x7861}, {0x8139, 0x736c}, {0x813e, 0x5e21},
+ {0x814b, 0x647d}, {0x814e, 0x636c}, {0x8150, 0x5d2f},
+ {0x8151, 0x5d30}, {0x8154, 0x4b37}, {0x8155, 0x6853},
+ {0x8165, 0x6123}, {0x8166, 0x5260}, {0x816b, 0x707e},
+ {0x8170, 0x6926}, {0x8171, 0x4b72}, {0x8178, 0x6d73},
+ {0x8179, 0x5c59}, {0x817a, 0x604d}, {0x817f, 0x775a},
+ {0x8180, 0x5b39}, {0x8188, 0x4c2e}, {0x818a, 0x5a5b},
+ {0x818f, 0x4d47}, {0x819a, 0x5d31}, {0x819c, 0x582f},
+ {0x819d, 0x6323}, {0x81a0, 0x4e6f}, {0x81a3, 0x7273},
+ {0x81a8, 0x7833}, {0x81b3, 0x604e}, {0x81b5, 0x757d},
+ {0x81ba, 0x6b6c}, {0x81bd, 0x5345}, {0x81be, 0x7c6c},
+ {0x81bf, 0x525b}, {0x81c0, 0x546b}, {0x81c2, 0x5e22},
+ {0x81c6, 0x6566}, {0x81cd, 0x7030}, {0x81d8, 0x5544},
+ {0x81df, 0x6d74}, {0x81e3, 0x636d}, {0x81e5, 0x6842},
+ {0x81e7, 0x6d75}, {0x81e8, 0x577c}, {0x81ea, 0x6d3b},
+ {0x81ed, 0x762b}, {0x81f3, 0x7238}, {0x81f4, 0x7648},
+ {0x81fa, 0x5366}, {0x81fb, 0x725d}, {0x81fc, 0x4f3f},
+ {0x81fe, 0x6b2c}, {0x8205, 0x4f40}, {0x8207, 0x6628},
+ {0x8208, 0x7d69}, {0x820a, 0x4f41}, {0x820c, 0x605f},
+ {0x820d, 0x5e6c}, {0x8212, 0x6022}, {0x821b, 0x743f},
+ {0x821c, 0x626f}, {0x821e, 0x5971}, {0x821f, 0x7147},
+ {0x8221, 0x4b38}, {0x822a, 0x797e}, {0x822b, 0x5b3a},
+ {0x822c, 0x5a75}, {0x8235, 0x766c}, {0x8236, 0x5a5c},
+ {0x8237, 0x7a64}, {0x8239, 0x604f}, {0x8240, 0x5d32},
+ {0x8245, 0x6629}, {0x8247, 0x6f73}, {0x8259, 0x736d},
+ {0x8264, 0x6b7a}, {0x8266, 0x7966}, {0x826e, 0x4a5d},
+ {0x826f, 0x555e}, {0x8271, 0x4a5e}, {0x8272, 0x5f64},
+ {0x8276, 0x667d}, {0x8278, 0x752c}, {0x827e, 0x6475},
+ {0x828b, 0x6963}, {0x828d, 0x6d4b}, {0x828e, 0x4f64},
+ {0x8292, 0x5853}, {0x8299, 0x5d33}, {0x829a, 0x546c},
+ {0x829d, 0x7239}, {0x829f, 0x5f37}, {0x82a5, 0x4b4e},
+ {0x82a6, 0x7b58}, {0x82a9, 0x5059}, {0x82ac, 0x5d52},
+ {0x82ad, 0x7774}, {0x82ae, 0x675c}, {0x82af, 0x6425},
+ {0x82b1, 0x7c23}, {0x82b3, 0x5b3b}, {0x82b7, 0x723a},
+ {0x82b8, 0x697d}, {0x82b9, 0x504a}, {0x82bb, 0x7556},
+ {0x82bc, 0x5945}, {0x82bd, 0x6434}, {0x82bf, 0x6d27},
+ {0x82d1, 0x6a3d}, {0x82d2, 0x667e}, {0x82d4, 0x7744},
+ {0x82d5, 0x752d}, {0x82d7, 0x5960}, {0x82db, 0x4a34},
+ {0x82de, 0x7862}, {0x82df, 0x4f42}, {0x82e1, 0x6c3e},
+ {0x82e5, 0x6534}, {0x82e6, 0x4d48}, {0x82e7, 0x6e48},
+ {0x82f1, 0x6748}, {0x82fd, 0x4d49}, {0x82fe, 0x7937},
+ {0x8301, 0x7168}, {0x8302, 0x5972}, {0x8303, 0x5b75},
+ {0x8304, 0x4a35}, {0x8305, 0x5946}, {0x8309, 0x5849},
+ {0x8317, 0x592b}, {0x8328, 0x6d3c}, {0x832b, 0x5854},
+ {0x832f, 0x5c5a}, {0x8331, 0x623c}, {0x8334, 0x7c6d},
+ {0x8335, 0x6c60}, {0x8336, 0x527e}, {0x8338, 0x6947},
+ {0x8339, 0x662a}, {0x8340, 0x6270}, {0x8347, 0x7a3b},
+ {0x8349, 0x752e}, {0x834a, 0x7b2a}, {0x834f, 0x6c7b},
+ {0x8351, 0x6c3f}, {0x8352, 0x7c58}, {0x8373, 0x5465},
+ {0x8377, 0x7943}, {0x837b, 0x6e62}, {0x8389, 0x5769},
+ {0x838a, 0x6d76}, {0x838e, 0x5e6d}, {0x8396, 0x4c6c},
+ {0x8398, 0x636e}, {0x839e, 0x6854}, {0x83a2, 0x7a78},
+ {0x83a9, 0x5d34}, {0x83aa, 0x6435}, {0x83ab, 0x5830},
+ {0x83bd, 0x5855}, {0x83c1, 0x746a}, {0x83c5, 0x4e39},
+ {0x83c9, 0x5661}, {0x83ca, 0x4f52}, {0x83cc, 0x5036},
+ {0x83d3, 0x4e22}, {0x83d6, 0x736e}, {0x83dc, 0x7378},
+ {0x83e9, 0x5c4c}, {0x83eb, 0x504b}, {0x83ef, 0x7c24},
+ {0x83f0, 0x4d4a}, {0x83f1, 0x5754}, {0x83f2, 0x5e23},
+ {0x83f4, 0x6460}, {0x83f9, 0x6e49}, {0x83fd, 0x625d},
+ {0x8403, 0x757e}, {0x8404, 0x542c}, {0x840a, 0x5551},
+ {0x840c, 0x5870}, {0x840d, 0x7843}, {0x840e, 0x6a57},
+ {0x8429, 0x7557}, {0x842c, 0x583f}, {0x8431, 0x7d40},
+ {0x8438, 0x6b2d}, {0x843d, 0x552a}, {0x8449, 0x6728},
+ {0x8457, 0x6e4a}, {0x845b, 0x4a67}, {0x8461, 0x7863},
+ {0x8463, 0x545d}, {0x8466, 0x6a58}, {0x846b, 0x7b59},
+ {0x846c, 0x6d77}, {0x846f, 0x6535}, {0x8475, 0x502d},
+ {0x847a, 0x7171}, {0x8490, 0x623d}, {0x8494, 0x6348},
+ {0x8499, 0x5955}, {0x849c, 0x5f2a}, {0x84a1, 0x5b3c},
+ {0x84b2, 0x7864}, {0x84b8, 0x717a}, {0x84bb, 0x6536},
+ {0x84bc, 0x736f}, {0x84bf, 0x7b5a}, {0x84c0, 0x6160},
+ {0x84c2, 0x592c}, {0x84c4, 0x756b}, {0x84c6, 0x6036},
+ {0x84c9, 0x6948}, {0x84cb, 0x4b4f}, {0x84cd, 0x6349},
+ {0x84d1, 0x5e6e}, {0x84da, 0x623e}, {0x84ec, 0x5c6f},
+ {0x84ee, 0x5625}, {0x84f4, 0x6271}, {0x84fc, 0x567e},
+ {0x8511, 0x5921}, {0x8513, 0x5840}, {0x8514, 0x5c5b},
+ {0x8517, 0x6d3d}, {0x8518, 0x5f38}, {0x851a, 0x6a25},
+ {0x851e, 0x572d}, {0x8521, 0x7379}, {0x8523, 0x6d78},
+ {0x8525, 0x7547}, {0x852c, 0x614a}, {0x852d, 0x6b63},
+ {0x852f, 0x725e}, {0x853d, 0x784c}, {0x853f, 0x6a59},
+ {0x8541, 0x5346}, {0x8543, 0x5b66}, {0x8549, 0x752f},
+ {0x854e, 0x4e70}, {0x8553, 0x697e}, {0x8559, 0x7b36},
+ {0x8563, 0x6272}, {0x8568, 0x4f72}, {0x8569, 0x7739},
+ {0x856a, 0x5973}, {0x856d, 0x614b}, {0x8584, 0x5a5d},
+ {0x8587, 0x5a39}, {0x858f, 0x6b7b}, {0x8591, 0x4b39},
+ {0x8594, 0x6d79}, {0x859b, 0x6060}, {0x85a6, 0x7440},
+ {0x85a8, 0x7d3c}, {0x85a9, 0x5f31}, {0x85aa, 0x636f},
+ {0x85af, 0x6023}, {0x85b0, 0x7d39}, {0x85ba, 0x7031},
+ {0x85c1, 0x4d4b}, {0x85c9, 0x6d3e}, {0x85cd, 0x5540},
+ {0x85ce, 0x6370}, {0x85cf, 0x6d7a}, {0x85d5, 0x6964},
+ {0x85dc, 0x556d}, {0x85dd, 0x675d}, {0x85e4, 0x5476},
+ {0x85e5, 0x6537}, {0x85e9, 0x5b67}, {0x85ea, 0x623f},
+ {0x85f7, 0x6e4b}, {0x85fa, 0x5774}, {0x85fb, 0x705d},
+ {0x85ff, 0x4e2b}, {0x8602, 0x675e}, {0x8606, 0x5656},
+ {0x8607, 0x614c}, {0x860a, 0x6833}, {0x8616, 0x656e},
+ {0x8617, 0x5c22}, {0x861a, 0x6050}, {0x862d, 0x5535},
+ {0x863f, 0x5521}, {0x864e, 0x7b5b}, {0x8650, 0x794b},
+ {0x8654, 0x4b73}, {0x8655, 0x7425}, {0x865b, 0x7a48},
+ {0x865c, 0x5657}, {0x865e, 0x6965}, {0x865f, 0x7b5c},
+ {0x8667, 0x7d50}, {0x8679, 0x7b76}, {0x868a, 0x5a25},
+ {0x868c, 0x5b3d}, {0x8693, 0x6c62}, {0x86a3, 0x4d77},
+ {0x86a4, 0x705e}, {0x86a9, 0x7649}, {0x86c7, 0x5e6f},
+ {0x86cb, 0x5331}, {0x86d4, 0x7c6e}, {0x86d9, 0x6843},
+ {0x86db, 0x7148}, {0x86df, 0x4e71}, {0x86e4, 0x796d},
+ {0x86ed, 0x7274}, {0x86fe, 0x6436}, {0x8700, 0x7539},
+ {0x8702, 0x5c70}, {0x8703, 0x6371}, {0x8708, 0x6825},
+ {0x8718, 0x723b}, {0x871a, 0x5e24}, {0x871c, 0x5a4c},
+ {0x874e, 0x4a69}, {0x8755, 0x635a}, {0x8757, 0x7c59},
+ {0x875f, 0x6a5a}, {0x8766, 0x7944}, {0x8768, 0x6324},
+ {0x8774, 0x7b5d}, {0x8776, 0x6f4a}, {0x8778, 0x6844},
+ {0x8782, 0x554c}, {0x878d, 0x6b57}, {0x879f, 0x592d},
+ {0x87a2, 0x7b2b}, {0x87b3, 0x5359}, {0x87ba, 0x5522},
+ {0x87c4, 0x765e}, {0x87e0, 0x5a76}, {0x87ec, 0x6051},
+ {0x87ef, 0x6928}, {0x87f2, 0x7579}, {0x87f9, 0x7a2f},
+ {0x87fb, 0x6b7c}, {0x87fe, 0x606a}, {0x8805, 0x6332},
+ {0x881f, 0x5545}, {0x8822, 0x7163}, {0x8823, 0x556e},
+ {0x8831, 0x4d4c}, {0x8836, 0x6d59}, {0x883b, 0x5841},
+ {0x8840, 0x7a6c}, {0x8846, 0x716b}, {0x884c, 0x7a3c},
+ {0x884d, 0x6662}, {0x8852, 0x7a65}, {0x8853, 0x627a},
+ {0x8857, 0x4a36}, {0x8859, 0x6437}, {0x885b, 0x6a5b},
+ {0x885d, 0x757a}, {0x8861, 0x7b2c}, {0x8862, 0x4f43},
+ {0x8863, 0x6b7d}, {0x8868, 0x787a}, {0x886b, 0x5f39},
+ {0x8870, 0x6171}, {0x8872, 0x5224}, {0x8877, 0x757b},
+ {0x887e, 0x505a}, {0x887f, 0x505b}, {0x8881, 0x6a3e},
+ {0x8882, 0x5931}, {0x8888, 0x4a37}, {0x888b, 0x5367},
+ {0x888d, 0x7865}, {0x8892, 0x5332}, {0x8896, 0x6240},
+ {0x8897, 0x725f}, {0x889e, 0x4d65}, {0x88ab, 0x792c},
+ {0x88b4, 0x4d4d}, {0x88c1, 0x6e2e}, {0x88c2, 0x562e},
+ {0x88cf, 0x576a}, {0x88d4, 0x6760}, {0x88d5, 0x6b2e},
+ {0x88d9, 0x4f59}, {0x88dc, 0x5c4d}, {0x88dd, 0x6d7b},
+ {0x88df, 0x5e70}, {0x88e1, 0x576b}, {0x88e8, 0x5e25},
+ {0x88f3, 0x5f57}, {0x88f4, 0x5b50}, {0x88f5, 0x5b51},
+ {0x88f8, 0x5523}, {0x88fd, 0x7032}, {0x8907, 0x5c5c},
+ {0x8910, 0x4a68}, {0x8912, 0x7866}, {0x8913, 0x5c4e},
+ {0x8918, 0x6a5c}, {0x8919, 0x5b52}, {0x8925, 0x6933},
+ {0x892a, 0x775b}, {0x8936, 0x6328}, {0x8938, 0x572e},
+ {0x893b, 0x6061}, {0x8941, 0x4b3a}, {0x8944, 0x6551},
+ {0x895f, 0x505c}, {0x8964, 0x5541}, {0x896a, 0x584a},
+ {0x8972, 0x6329}, {0x897f, 0x6024}, {0x8981, 0x6929},
+ {0x8983, 0x5347}, {0x8986, 0x5c5d}, {0x8987, 0x782e},
+ {0x898b, 0x4c38}, {0x898f, 0x502e}, {0x8993, 0x5872},
+ {0x8996, 0x634a}, {0x89a1, 0x4c2f}, {0x89a9, 0x542d},
+ {0x89aa, 0x7651}, {0x89b2, 0x504c}, {0x89ba, 0x4a46},
+ {0x89bd, 0x5542}, {0x89c0, 0x4e3a}, {0x89d2, 0x4a47},
+ {0x89e3, 0x7a30}, {0x89f4, 0x5f58}, {0x89f8, 0x753a},
+ {0x8a00, 0x656b}, {0x8a02, 0x6f74}, {0x8a03, 0x5d35},
+ {0x8a08, 0x4d2a}, {0x8a0a, 0x6372}, {0x8a0c, 0x7b77},
+ {0x8a0e, 0x7750}, {0x8a13, 0x7d3a}, {0x8a16, 0x7d61},
+ {0x8a17, 0x767e}, {0x8a18, 0x5140}, {0x8a1b, 0x6845},
+ {0x8a1d, 0x6438}, {0x8a1f, 0x6168}, {0x8a23, 0x4c41},
+ {0x8a25, 0x526d}, {0x8a2a, 0x5b3e}, {0x8a2d, 0x6062},
+ {0x8a31, 0x7a49}, {0x8a34, 0x614d}, {0x8a36, 0x4a38},
+ {0x8a3a, 0x7260}, {0x8a3b, 0x7149}, {0x8a50, 0x5e71},
+ {0x8a54, 0x705f}, {0x8a55, 0x7844}, {0x8a5b, 0x6e4c},
+ {0x8a5e, 0x5e72}, {0x8a60, 0x6749}, {0x8a62, 0x6273},
+ {0x8a63, 0x6761}, {0x8a66, 0x634b}, {0x8a69, 0x634c},
+ {0x8a6d, 0x4f78}, {0x8a6e, 0x6f2c}, {0x8a70, 0x7d7e},
+ {0x8a71, 0x7c25}, {0x8a72, 0x7a31}, {0x8a73, 0x5f59},
+ {0x8a75, 0x6052}, {0x8a79, 0x745a}, {0x8a85, 0x714a},
+ {0x8a87, 0x4e23}, {0x8a8c, 0x723c}, {0x8a8d, 0x6c63},
+ {0x8a93, 0x6025}, {0x8a95, 0x772b}, {0x8a98, 0x6b2f},
+ {0x8a9e, 0x655e}, {0x8aa0, 0x6124}, {0x8aa1, 0x4d2b},
+ {0x8aa3, 0x5974}, {0x8aa4, 0x6826}, {0x8aa5, 0x4d4e},
+ {0x8aa6, 0x6169}, {0x8aa8, 0x7c6f}, {0x8aaa, 0x6063},
+ {0x8ab0, 0x6241}, {0x8ab2, 0x4e24}, {0x8ab9, 0x5e26},
+ {0x8abc, 0x6b7e}, {0x8abe, 0x6b5d}, {0x8abf, 0x7060},
+ {0x8ac2, 0x745b}, {0x8ac4, 0x6274}, {0x8ac7, 0x5348},
+ {0x8acb, 0x746b}, {0x8acd, 0x6e35}, {0x8acf, 0x7558},
+ {0x8ad2, 0x555f}, {0x8ad6, 0x5665}, {0x8adb, 0x6b30},
+ {0x8adc, 0x7463}, {0x8ae1, 0x634d}, {0x8ae6, 0x7474},
+ {0x8ae7, 0x7a32}, {0x8aea, 0x6f75}, {0x8aeb, 0x4a5f},
+ {0x8aed, 0x6b31}, {0x8aee, 0x6d3f}, {0x8af1, 0x7d49},
+ {0x8af6, 0x6426}, {0x8af7, 0x7924}, {0x8af8, 0x7033},
+ {0x8afa, 0x656c}, {0x8afe, 0x5167}, {0x8b00, 0x5947},
+ {0x8b01, 0x6457}, {0x8b02, 0x6a5d}, {0x8b04, 0x5477},
+ {0x8b0e, 0x5a3a}, {0x8b10, 0x5a4d}, {0x8b14, 0x794c},
+ {0x8b16, 0x615a}, {0x8b17, 0x5b3f}, {0x8b19, 0x4c45},
+ {0x8b1a, 0x6c50}, {0x8b1b, 0x4b3b}, {0x8b1d, 0x5e73},
+ {0x8b20, 0x692a}, {0x8b28, 0x5948}, {0x8b2b, 0x6e63},
+ {0x8b2c, 0x573d}, {0x8b33, 0x4f44}, {0x8b39, 0x504d},
+ {0x8b41, 0x7c26}, {0x8b49, 0x717b}, {0x8b4e, 0x7d52},
+ {0x8b4f, 0x5141}, {0x8b58, 0x635b}, {0x8b5a, 0x5349},
+ {0x8b5c, 0x5c4f}, {0x8b66, 0x4c6d}, {0x8b6c, 0x5e27},
+ {0x8b6f, 0x663b}, {0x8b70, 0x6c21}, {0x8b74, 0x4c39},
+ {0x8b77, 0x7b5e}, {0x8b7d, 0x6762}, {0x8b80, 0x5441},
+ {0x8b8a, 0x5c28}, {0x8b90, 0x6242}, {0x8b92, 0x7358},
+ {0x8b93, 0x6553}, {0x8b96, 0x7359}, {0x8b9a, 0x7346},
+ {0x8c37, 0x4d5b}, {0x8c3f, 0x4d2c}, {0x8c41, 0x7c43},
+ {0x8c46, 0x5467}, {0x8c48, 0x5142}, {0x8c4a, 0x7925},
+ {0x8c4c, 0x6855}, {0x8c55, 0x634e}, {0x8c5a, 0x544a},
+ {0x8c61, 0x5f5a}, {0x8c6a, 0x7b5f}, {0x8c6b, 0x6763},
+ {0x8c79, 0x787b}, {0x8c7a, 0x634f}, {0x8c82, 0x7530},
+ {0x8c8a, 0x5867}, {0x8c8c, 0x5949}, {0x8c9d, 0x782f},
+ {0x8c9e, 0x6f76}, {0x8ca0, 0x5d36}, {0x8ca1, 0x6e2f},
+ {0x8ca2, 0x4d78}, {0x8ca7, 0x5e38}, {0x8ca8, 0x7c27},
+ {0x8ca9, 0x777c}, {0x8caa, 0x7731}, {0x8cab, 0x4e3b},
+ {0x8cac, 0x7421}, {0x8caf, 0x6e4d}, {0x8cb0, 0x612e},
+ {0x8cb3, 0x6c43}, {0x8cb4, 0x4f7e}, {0x8cb6, 0x783f},
+ {0x8cb7, 0x5862}, {0x8cb8, 0x5368}, {0x8cbb, 0x5e28},
+ {0x8cbc, 0x7464}, {0x8cbd, 0x6c42}, {0x8cbf, 0x5975},
+ {0x8cc0, 0x7945}, {0x8cc1, 0x5d53}, {0x8cc2, 0x5671},
+ {0x8cc3, 0x6c7c}, {0x8cc4, 0x7c70}, {0x8cc7, 0x6d40},
+ {0x8cc8, 0x4a39}, {0x8cca, 0x6e64}, {0x8cd1, 0x7261},
+ {0x8cd3, 0x5e39}, {0x8cda, 0x5672}, {0x8cdc, 0x5e74},
+ {0x8cde, 0x5f5b}, {0x8ce0, 0x5b53}, {0x8ce2, 0x7a67},
+ {0x8ce3, 0x5863}, {0x8ce4, 0x7441}, {0x8ce6, 0x5d37},
+ {0x8cea, 0x7275}, {0x8ced, 0x542e}, {0x8cf4, 0x5673},
+ {0x8cfb, 0x5d38}, {0x8cfc, 0x4f45}, {0x8cfd, 0x5f5f},
+ {0x8d04, 0x723e}, {0x8d05, 0x7621}, {0x8d07, 0x6b4b},
+ {0x8d08, 0x717c}, {0x8d0a, 0x7347}, {0x8d0d, 0x606b},
+ {0x8d13, 0x6d7c}, {0x8d16, 0x615b}, {0x8d64, 0x6e65},
+ {0x8d66, 0x5e75}, {0x8d6b, 0x7a53}, {0x8d70, 0x714b},
+ {0x8d73, 0x502f}, {0x8d74, 0x5d39}, {0x8d77, 0x5143},
+ {0x8d85, 0x7531}, {0x8d8a, 0x6a46}, {0x8d99, 0x7061},
+ {0x8da3, 0x762c}, {0x8da8, 0x7559}, {0x8db3, 0x706b},
+ {0x8dba, 0x5d3a}, {0x8dbe, 0x723f}, {0x8dc6, 0x7745},
+ {0x8dcb, 0x5b22}, {0x8dcc, 0x7276}, {0x8dcf, 0x4a3a},
+ {0x8ddb, 0x7775}, {0x8ddd, 0x4b65}, {0x8de1, 0x6e66},
+ {0x8de3, 0x6053}, {0x8de8, 0x4e25}, {0x8def, 0x5658},
+ {0x8df3, 0x542f}, {0x8e0a, 0x6949}, {0x8e0f, 0x534e},
+ {0x8e10, 0x7442}, {0x8e1e, 0x4b66}, {0x8e2a, 0x7121},
+ {0x8e30, 0x6b32}, {0x8e35, 0x7122}, {0x8e42, 0x6b33},
+ {0x8e44, 0x7034}, {0x8e47, 0x4b74}, {0x8e48, 0x5430},
+ {0x8e49, 0x7332}, {0x8e4a, 0x7b37}, {0x8e59, 0x756c},
+ {0x8e5f, 0x6e67}, {0x8e60, 0x7432}, {0x8e74, 0x756d},
+ {0x8e76, 0x4f73}, {0x8e81, 0x7062}, {0x8e87, 0x6e4e},
+ {0x8e8a, 0x714c}, {0x8e8d, 0x6538}, {0x8eaa, 0x5775},
+ {0x8eab, 0x6373}, {0x8eac, 0x4f65}, {0x8ec0, 0x4f46},
+ {0x8eca, 0x7333}, {0x8ecb, 0x6458}, {0x8ecc, 0x4f79},
+ {0x8ecd, 0x4f5a}, {0x8ed2, 0x7a4d}, {0x8edf, 0x6663},
+ {0x8eeb, 0x7262}, {0x8ef8, 0x756e}, {0x8efb, 0x4a3b},
+ {0x8efe, 0x635c}, {0x8f03, 0x4e72}, {0x8f05, 0x5659},
+ {0x8f09, 0x6e30}, {0x8f12, 0x7465}, {0x8f13, 0x5842},
+ {0x8f14, 0x5c50}, {0x8f15, 0x4c6e}, {0x8f1b, 0x5560},
+ {0x8f1c, 0x764a}, {0x8f1d, 0x7d4a}, {0x8f1e, 0x5856},
+ {0x8f1f, 0x744f}, {0x8f26, 0x5626}, {0x8f27, 0x5c3e},
+ {0x8f29, 0x5b54}, {0x8f2a, 0x5747}, {0x8f2f, 0x727e},
+ {0x8f33, 0x714d}, {0x8f38, 0x6243}, {0x8f39, 0x5c5e},
+ {0x8f3b, 0x5c5f}, {0x8f3e, 0x6f2d}, {0x8f3f, 0x662b},
+ {0x8f44, 0x795d}, {0x8f45, 0x6a3f}, {0x8f49, 0x6f2e},
+ {0x8f4d, 0x7450}, {0x8f4e, 0x4e73}, {0x8f5d, 0x662c},
+ {0x8f5f, 0x4e5e}, {0x8f62, 0x5579}, {0x8f9b, 0x6374},
+ {0x8f9c, 0x4d50}, {0x8fa3, 0x5538}, {0x8fa6, 0x777d},
+ {0x8fa8, 0x5c29}, {0x8fad, 0x5e76}, {0x8faf, 0x5c2a},
+ {0x8fb0, 0x7263}, {0x8fb1, 0x6934}, {0x8fb2, 0x525c},
+ {0x8fc2, 0x6966}, {0x8fc5, 0x6376}, {0x8fce, 0x674a},
+ {0x8fd1, 0x504e}, {0x8fd4, 0x5a77}, {0x8fe6, 0x4a3c},
+ {0x8fea, 0x6e68}, {0x8feb, 0x5a5e}, {0x8fed, 0x7277},
+ {0x8ff0, 0x627b}, {0x8ff2, 0x4c26}, {0x8ff7, 0x5a3b},
+ {0x8ff9, 0x6e69}, {0x8ffd, 0x755a}, {0x9000, 0x775c},
+ {0x9001, 0x616a}, {0x9002, 0x4e41}, {0x9003, 0x5431},
+ {0x9005, 0x7d31}, {0x9006, 0x663d}, {0x9008, 0x7b2d},
+ {0x900b, 0x7867}, {0x900d, 0x614e}, {0x900f, 0x7762},
+ {0x9010, 0x756f}, {0x9011, 0x4f47}, {0x9014, 0x5432},
+ {0x9015, 0x4c6f}, {0x9017, 0x5468}, {0x9019, 0x6e4f},
+ {0x901a, 0x7757}, {0x901d, 0x6026}, {0x901e, 0x5641},
+ {0x901f, 0x615c}, {0x9020, 0x7063}, {0x9021, 0x7164},
+ {0x9022, 0x5c71}, {0x9023, 0x5627}, {0x902e, 0x7475},
+ {0x9031, 0x714e}, {0x9032, 0x7264}, {0x9035, 0x5030},
+ {0x9038, 0x6c6f}, {0x903c, 0x793a}, {0x903e, 0x6b35},
+ {0x9041, 0x546d}, {0x9042, 0x6244}, {0x9047, 0x6967},
+ {0x904a, 0x6b34}, {0x904b, 0x6a21}, {0x904d, 0x783c},
+ {0x904e, 0x4e26}, {0x9050, 0x7946}, {0x9051, 0x7c5a},
+ {0x9053, 0x5433}, {0x9054, 0x5339}, {0x9055, 0x6a5e},
+ {0x9059, 0x692b}, {0x905c, 0x6161}, {0x905d, 0x534f},
+ {0x905e, 0x7476}, {0x9060, 0x6a40}, {0x9061, 0x614f},
+ {0x9063, 0x4c3a}, {0x9069, 0x6e6a}, {0x906d, 0x7064},
+ {0x906e, 0x7334}, {0x906f, 0x546e}, {0x9072, 0x7240},
+ {0x9075, 0x7165}, {0x9077, 0x7443}, {0x9078, 0x6054},
+ {0x907a, 0x6b36}, {0x907c, 0x5721}, {0x907d, 0x4b68},
+ {0x907f, 0x792d}, {0x9080, 0x692d}, {0x9081, 0x5864},
+ {0x9082, 0x7a33}, {0x9083, 0x6245}, {0x9084, 0x7c3d},
+ {0x9087, 0x6c44}, {0x9088, 0x5831}, {0x908a, 0x5c2b},
+ {0x908f, 0x5524}, {0x9091, 0x6b69}, {0x9095, 0x683b},
+ {0x9099, 0x5857}, {0x90a2, 0x7b2e}, {0x90a3, 0x5161},
+ {0x90a6, 0x5b40}, {0x90a8, 0x753e}, {0x90aa, 0x5e77},
+ {0x90af, 0x4a7b}, {0x90b0, 0x7746}, {0x90b1, 0x4f48},
+ {0x90b5, 0x6150}, {0x90b8, 0x6e50}, {0x90c1, 0x6974},
+ {0x90ca, 0x4e74}, {0x90de, 0x554d}, {0x90e1, 0x4f5b},
+ {0x90e8, 0x5d3b}, {0x90ed, 0x4e2c}, {0x90f5, 0x6968},
+ {0x90fd, 0x5434}, {0x9102, 0x6447}, {0x9112, 0x755b},
+ {0x9115, 0x7a41}, {0x9119, 0x5e29}, {0x9127, 0x5478},
+ {0x912d, 0x6f77}, {0x9132, 0x5333}, {0x9149, 0x6b37},
+ {0x914a, 0x6f78}, {0x914b, 0x755c}, {0x914c, 0x6d4c},
+ {0x914d, 0x5b55}, {0x914e, 0x714f}, {0x9152, 0x7150},
+ {0x9162, 0x7532}, {0x9169, 0x592e}, {0x916a, 0x552c},
+ {0x916c, 0x6246}, {0x9175, 0x7d23}, {0x9177, 0x7b65},
+ {0x9178, 0x5f2b}, {0x9187, 0x6275}, {0x9189, 0x762d},
+ {0x918b, 0x7533}, {0x918d, 0x7035}, {0x9192, 0x6125},
+ {0x919c, 0x755d}, {0x91ab, 0x6c22}, {0x91ac, 0x6d7d},
+ {0x91ae, 0x7534}, {0x91af, 0x7b38}, {0x91b1, 0x5b23},
+ {0x91b4, 0x564a}, {0x91b5, 0x4b59}, {0x91c0, 0x6554},
+ {0x91c7, 0x737a}, {0x91c9, 0x6b38}, {0x91cb, 0x6037},
+ {0x91cc, 0x576c}, {0x91cd, 0x716c}, {0x91ce, 0x652f},
+ {0x91cf, 0x5561}, {0x91d0, 0x576d}, {0x91d1, 0x5151},
+ {0x91d7, 0x6172}, {0x91d8, 0x6f79}, {0x91dc, 0x5d3c},
+ {0x91dd, 0x765c}, {0x91e3, 0x7065}, {0x91e7, 0x7444},
+ {0x91ea, 0x6969}, {0x91f5, 0x737b}, {0x920d, 0x546f},
+ {0x9210, 0x4c22}, {0x9211, 0x777e}, {0x9212, 0x5f3c},
+ {0x9217, 0x6b4d}, {0x921e, 0x5037}, {0x9234, 0x5642},
+ {0x923a, 0x682d}, {0x923f, 0x6f2f}, {0x9240, 0x4b25},
+ {0x9245, 0x4b69}, {0x9249, 0x7a68}, {0x9257, 0x4c46},
+ {0x925b, 0x6667}, {0x925e, 0x6a47}, {0x9262, 0x5b24},
+ {0x9264, 0x4f49}, {0x9265, 0x627c}, {0x9266, 0x6f7a},
+ {0x9280, 0x6b5e}, {0x9283, 0x7548}, {0x9285, 0x545e},
+ {0x9291, 0x6055}, {0x9293, 0x6f30}, {0x9296, 0x6247},
+ {0x9298, 0x592f}, {0x929c, 0x7967}, {0x92b3, 0x6765},
+ {0x92b6, 0x4f4a}, {0x92b7, 0x6151}, {0x92b9, 0x6248},
+ {0x92cc, 0x6f7b}, {0x92cf, 0x7a79}, {0x92d2, 0x5c72},
+ {0x92e4, 0x6027}, {0x92ea, 0x7868}, {0x92f8, 0x4b6a},
+ {0x92fc, 0x4b3c}, {0x9304, 0x5662}, {0x9310, 0x755e},
+ {0x9318, 0x755f}, {0x931a, 0x6e36}, {0x931e, 0x6276},
+ {0x931f, 0x534a}, {0x9320, 0x6f7c}, {0x9321, 0x5144},
+ {0x9322, 0x6f31}, {0x9324, 0x5145}, {0x9326, 0x505e},
+ {0x9328, 0x5961}, {0x932b, 0x6038}, {0x932e, 0x4d51},
+ {0x932f, 0x7339}, {0x9348, 0x674c}, {0x934a, 0x5628},
+ {0x934b, 0x4e27}, {0x934d, 0x5435}, {0x9354, 0x6448},
+ {0x935b, 0x5334}, {0x936e, 0x6b39}, {0x9375, 0x4b75},
+ {0x937c, 0x765d}, {0x937e, 0x7123}, {0x938c, 0x4c47},
+ {0x9394, 0x694a}, {0x9396, 0x6170}, {0x939a, 0x7560},
+ {0x93a3, 0x7b2f}, {0x93a7, 0x4b51}, {0x93ac, 0x7b60},
+ {0x93ad, 0x7265}, {0x93b0, 0x6c70}, {0x93c3, 0x706c},
+ {0x93d1, 0x6e6b}, {0x93de, 0x694b}, {0x93e1, 0x4c70},
+ {0x93e4, 0x572f}, {0x93f6, 0x7321}, {0x9404, 0x7c75},
+ {0x9418, 0x7124}, {0x9425, 0x6056}, {0x942b, 0x6f32},
+ {0x9435, 0x7451}, {0x9438, 0x7721}, {0x9444, 0x7151},
+ {0x9451, 0x4a7c}, {0x9452, 0x4a7d}, {0x945b, 0x4e4e},
+ {0x947d, 0x7348}, {0x947f, 0x733a}, {0x9577, 0x6d7e},
+ {0x9580, 0x5a26}, {0x9583, 0x606c}, {0x9589, 0x784d},
+ {0x958b, 0x4b52}, {0x958f, 0x6b4e}, {0x9591, 0x7958},
+ {0x9592, 0x7959}, {0x9593, 0x4a60}, {0x9594, 0x5a4a},
+ {0x9598, 0x4b26}, {0x95a3, 0x4a48}, {0x95a4, 0x796e},
+ {0x95a5, 0x5b6c}, {0x95a8, 0x5031}, {0x95ad, 0x556f},
+ {0x95b1, 0x6673}, {0x95bb, 0x6722}, {0x95bc, 0x6459},
+ {0x95c7, 0x6461}, {0x95ca, 0x7c44}, {0x95d4, 0x796f},
+ {0x95d5, 0x4f74}, {0x95d6, 0x7766}, {0x95dc, 0x4e3c},
+ {0x95e1, 0x7445}, {0x95e2, 0x5c23}, {0x961c, 0x5d3d},
+ {0x9621, 0x7446}, {0x962a, 0x7821}, {0x962e, 0x6856},
+ {0x9632, 0x5b41}, {0x963b, 0x7066}, {0x963f, 0x6439},
+ {0x9640, 0x766d}, {0x9642, 0x792e}, {0x9644, 0x5d3e},
+ {0x964b, 0x5730}, {0x964c, 0x5868}, {0x964d, 0x4b3d},
+ {0x9650, 0x795a}, {0x965b, 0x784e}, {0x965c, 0x7970},
+ {0x965d, 0x606d}, {0x965e, 0x6333}, {0x965f, 0x7433},
+ {0x9662, 0x6a42}, {0x9663, 0x7266}, {0x9664, 0x7036},
+ {0x966a, 0x5b56}, {0x9670, 0x6b64}, {0x9673, 0x7267},
+ {0x9675, 0x5755}, {0x9676, 0x5436}, {0x9677, 0x7968},
+ {0x9678, 0x5741}, {0x967d, 0x6555}, {0x9685, 0x696a},
+ {0x9686, 0x574c}, {0x968a, 0x5369}, {0x968b, 0x6249},
+ {0x968d, 0x7c5b}, {0x968e, 0x4d2d}, {0x9694, 0x4c30},
+ {0x9695, 0x6a22}, {0x9698, 0x6476}, {0x9699, 0x5040},
+ {0x969b, 0x7037}, {0x969c, 0x6e21}, {0x96a3, 0x5776},
+ {0x96a7, 0x624a}, {0x96a8, 0x624b}, {0x96aa, 0x7a4f},
+ {0x96b1, 0x6b5f}, {0x96b7, 0x564b}, {0x96bb, 0x7434},
+ {0x96c0, 0x6d4d}, {0x96c1, 0x6452}, {0x96c4, 0x6a29},
+ {0x96c5, 0x643a}, {0x96c6, 0x7322}, {0x96c7, 0x4d52},
+ {0x96c9, 0x764b}, {0x96cb, 0x7166}, {0x96cc, 0x6d41},
+ {0x96cd, 0x683c}, {0x96ce, 0x6e51}, {0x96d5, 0x7067},
+ {0x96d6, 0x624c}, {0x96d9, 0x642a}, {0x96db, 0x7561},
+ {0x96dc, 0x6d5a}, {0x96e2, 0x576e}, {0x96e3, 0x5171},
+ {0x96e8, 0x696b}, {0x96e9, 0x696c}, {0x96ea, 0x6064},
+ {0x96ef, 0x5a27}, {0x96f0, 0x5d54}, {0x96f2, 0x6a23},
+ {0x96f6, 0x5643}, {0x96f7, 0x5674}, {0x96f9, 0x5a5f},
+ {0x96fb, 0x6f33}, {0x9700, 0x624d}, {0x9706, 0x6f7d},
+ {0x9707, 0x7268}, {0x9711, 0x6f45}, {0x9713, 0x6767},
+ {0x9716, 0x577d}, {0x9719, 0x674e}, {0x971c, 0x5f5c},
+ {0x971e, 0x7947}, {0x9727, 0x5976}, {0x9730, 0x5f2c},
+ {0x9732, 0x565a}, {0x9739, 0x5c24}, {0x973d, 0x7038},
+ {0x9742, 0x557a}, {0x9744, 0x6477}, {0x9748, 0x5644},
+ {0x9751, 0x746c}, {0x9756, 0x6f7e}, {0x975c, 0x7021},
+ {0x975e, 0x5e2a}, {0x9761, 0x5a3c}, {0x9762, 0x587c},
+ {0x9769, 0x7a54}, {0x976d, 0x6c65}, {0x9774, 0x7c28},
+ {0x9777, 0x6c66}, {0x977a, 0x584b}, {0x978b, 0x7b39},
+ {0x978d, 0x6453}, {0x978f, 0x4d79}, {0x97a0, 0x4f53},
+ {0x97a8, 0x4a6a}, {0x97ab, 0x4f54}, {0x97ad, 0x783d},
+ {0x97c6, 0x7447}, {0x97cb, 0x6a5f}, {0x97d3, 0x795b},
+ {0x97dc, 0x5437}, {0x97f3, 0x6b65}, {0x97f6, 0x6152},
+ {0x97fb, 0x6a24}, {0x97ff, 0x7a42}, {0x9800, 0x7b61},
+ {0x9801, 0x7a6d}, {0x9802, 0x7022}, {0x9803, 0x4c71},
+ {0x9805, 0x7a23}, {0x9806, 0x6277}, {0x9808, 0x624e},
+ {0x980a, 0x6975}, {0x980c, 0x616b}, {0x9810, 0x6768},
+ {0x9811, 0x6857}, {0x9812, 0x5a78}, {0x9813, 0x544b},
+ {0x9817, 0x7776}, {0x9818, 0x5645}, {0x982d, 0x5469},
+ {0x9830, 0x7a7a}, {0x9838, 0x4c72}, {0x9839, 0x775d},
+ {0x983b, 0x5e3a}, {0x9846, 0x4e28}, {0x984c, 0x7039},
+ {0x984d, 0x647e}, {0x984e, 0x6449}, {0x9854, 0x6454},
+ {0x9858, 0x6a43}, {0x985a, 0x6f34}, {0x985e, 0x573e},
+ {0x9865, 0x7b62}, {0x9867, 0x4d53}, {0x986b, 0x6f35},
+ {0x986f, 0x7a69}, {0x98a8, 0x7926}, {0x98af, 0x5f3d},
+ {0x98b1, 0x7747}, {0x98c4, 0x787d}, {0x98c7, 0x787c},
+ {0x98db, 0x5e2b}, {0x98dc, 0x5b68}, {0x98df, 0x635d},
+ {0x98e1, 0x6162}, {0x98e2, 0x5146}, {0x98ed, 0x7650},
+ {0x98ee, 0x6b66}, {0x98ef, 0x5a79}, {0x98f4, 0x6c47},
+ {0x98fc, 0x5e78}, {0x98fd, 0x7869}, {0x98fe, 0x635e},
+ {0x9903, 0x4e75}, {0x9909, 0x7a43}, {0x990a, 0x6557},
+ {0x990c, 0x6c48}, {0x9910, 0x7349}, {0x9913, 0x643b},
+ {0x9918, 0x662e}, {0x991e, 0x6f36}, {0x9920, 0x5c3f},
+ {0x9928, 0x4e3d}, {0x9945, 0x5843}, {0x9949, 0x504f},
+ {0x994b, 0x4f7a}, {0x994c, 0x734a}, {0x994d, 0x6057},
+ {0x9951, 0x5147}, {0x9952, 0x692e}, {0x9954, 0x683d},
+ {0x9957, 0x7a44}, {0x9996, 0x624f}, {0x9999, 0x7a45},
+ {0x999d, 0x7938}, {0x99a5, 0x5c60}, {0x99a8, 0x7b30},
+ {0x99ac, 0x5829}, {0x99ad, 0x655f}, {0x99ae, 0x7927},
+ {0x99b1, 0x766e}, {0x99b3, 0x764c}, {0x99b4, 0x6278},
+ {0x99b9, 0x6c71}, {0x99c1, 0x5a60}, {0x99d0, 0x7152},
+ {0x99d1, 0x524c}, {0x99d2, 0x4f4b}, {0x99d5, 0x4a3d},
+ {0x99d9, 0x5d3f}, {0x99dd, 0x766f}, {0x99df, 0x5e79},
+ {0x99ed, 0x7a34}, {0x99f1, 0x552d}, {0x99ff, 0x7167},
+ {0x9a01, 0x5e3e}, {0x9a08, 0x5c40}, {0x9a0e, 0x5148},
+ {0x9a0f, 0x5149}, {0x9a19, 0x783e}, {0x9a2b, 0x4b76},
+ {0x9a30, 0x5479}, {0x9a36, 0x7562}, {0x9a37, 0x6153},
+ {0x9a40, 0x5869}, {0x9a43, 0x787e}, {0x9a45, 0x4f4c},
+ {0x9a4d, 0x7d24}, {0x9a55, 0x4e76}, {0x9a57, 0x7a50},
+ {0x9a5a, 0x4c73}, {0x9a5b, 0x663e}, {0x9a5f, 0x762e},
+ {0x9a62, 0x5570}, {0x9a65, 0x514a}, {0x9a69, 0x7c3e},
+ {0x9a6a, 0x5571}, {0x9aa8, 0x4d69}, {0x9ab8, 0x7a35},
+ {0x9ad3, 0x6250}, {0x9ad4, 0x7477}, {0x9ad8, 0x4d54},
+ {0x9ae5, 0x6723}, {0x9aee, 0x5b25}, {0x9b1a, 0x6251},
+ {0x9b27, 0x5722}, {0x9b2a, 0x7763}, {0x9b31, 0x6a26},
+ {0x9b3c, 0x5021}, {0x9b41, 0x4e5a}, {0x9b42, 0x7b6b},
+ {0x9b43, 0x5b26}, {0x9b44, 0x5b5e}, {0x9b45, 0x5865},
+ {0x9b4f, 0x6a60}, {0x9b54, 0x582a}, {0x9b5a, 0x6560},
+ {0x9b6f, 0x565b}, {0x9b8e, 0x6f46}, {0x9b91, 0x786a},
+ {0x9b9f, 0x6455}, {0x9bab, 0x4e77}, {0x9bae, 0x6058},
+ {0x9bc9, 0x576f}, {0x9bd6, 0x746d}, {0x9be4, 0x4d66},
+ {0x9be8, 0x4c74}, {0x9c0d, 0x7563}, {0x9c10, 0x644a},
+ {0x9c12, 0x5c61}, {0x9c15, 0x7948}, {0x9c25, 0x7c3f},
+ {0x9c32, 0x6827}, {0x9c3b, 0x5844}, {0x9c47, 0x4b3e},
+ {0x9c49, 0x5c2e}, {0x9c57, 0x5777}, {0x9ce5, 0x7068},
+ {0x9ce7, 0x5d40}, {0x9ce9, 0x4f4d}, {0x9cf3, 0x5c73},
+ {0x9cf4, 0x5930}, {0x9cf6, 0x6669}, {0x9d09, 0x643c},
+ {0x9d1b, 0x6a44}, {0x9d26, 0x646c}, {0x9d28, 0x6465},
+ {0x9d3b, 0x7b78}, {0x9d51, 0x4c3b}, {0x9d5d, 0x643d},
+ {0x9d60, 0x4d5c}, {0x9d61, 0x5977}, {0x9d6c, 0x5d5f},
+ {0x9d72, 0x6d4e}, {0x9da9, 0x5950}, {0x9daf, 0x6523},
+ {0x9db4, 0x794d}, {0x9dc4, 0x4d2e}, {0x9dd7, 0x4f4e},
+ {0x9df2, 0x762f}, {0x9df8, 0x7d53}, {0x9df9, 0x6b6d},
+ {0x9dfa, 0x565c}, {0x9e1a, 0x6524}, {0x9e1e, 0x5536},
+ {0x9e75, 0x565d}, {0x9e79, 0x7969}, {0x9e7d, 0x6724},
+ {0x9e7f, 0x5663}, {0x9e92, 0x514b}, {0x9e93, 0x5664},
+ {0x9e97, 0x5572}, {0x9e9d, 0x5e7a}, {0x9e9f, 0x5778},
+ {0x9ea5, 0x586a}, {0x9eb4, 0x4f55}, {0x9eb5, 0x587d},
+ {0x9ebb, 0x582b}, {0x9ebe, 0x7d4b}, {0x9ec3, 0x7c5c},
+ {0x9ecd, 0x6028}, {0x9ece, 0x5573}, {0x9ed1, 0x7d59},
+ {0x9ed4, 0x4c23}, {0x9ed8, 0x5979}, {0x9edb, 0x536a},
+ {0x9edc, 0x7575}, {0x9ede, 0x6f47}, {0x9ee8, 0x535a},
+ {0x9ef4, 0x5a3d}, {0x9f07, 0x6828}, {0x9f08, 0x5c2f},
+ {0x9f0e, 0x7023}, {0x9f13, 0x4d55}, {0x9f20, 0x6029},
+ {0x9f3b, 0x5e2c}, {0x9f4a, 0x703a}, {0x9f4b, 0x6e31},
+ {0x9f4e, 0x6e32}, {0x9f52, 0x764d}, {0x9f5f, 0x6e52},
+ {0x9f61, 0x5646}, {0x9f67, 0x6065}, {0x9f6a, 0x733b},
+ {0x9f6c, 0x6561}, {0x9f77, 0x644b}, {0x9f8d, 0x5723},
+ {0x9f90, 0x5b42}, {0x9f95, 0x4a7e}, {0x9f9c, 0x4f4f},
+ {0xf900, 0x4b50}, {0xf901, 0x4b56}, {0xf902, 0x4b67},
+ {0xf903, 0x4d4f}, {0xf904, 0x4d68}, {0xf905, 0x4e2d},
+ {0xf906, 0x4f7b}, {0xf907, 0x5022}, {0xf908, 0x5038},
+ {0xf909, 0x5050}, {0xf90a, 0x505d}, {0xf90b, 0x5154},
+ {0xf90c, 0x5155}, {0xf90d, 0x5158}, {0xf90e, 0x515b},
+ {0xf90f, 0x515c}, {0xf910, 0x515d}, {0xf911, 0x515e},
+ {0xf912, 0x515f}, {0xf913, 0x5160}, {0xf914, 0x5162},
+ {0xf915, 0x5163}, {0xf916, 0x5164}, {0xf917, 0x5165},
+ {0xf918, 0x5166}, {0xf919, 0x5168}, {0xf91a, 0x5169},
+ {0xf91b, 0x516a}, {0xf91c, 0x516b}, {0xf91d, 0x516d},
+ {0xf91e, 0x516f}, {0xf91f, 0x5170}, {0xf920, 0x5172},
+ {0xf921, 0x5176}, {0xf922, 0x517a}, {0xf923, 0x517c},
+ {0xf924, 0x517d}, {0xf925, 0x517e}, {0xf926, 0x5222},
+ {0xf927, 0x5223}, {0xf928, 0x5227}, {0xf929, 0x5228},
+ {0xf92a, 0x5229}, {0xf92b, 0x522a}, {0xf92c, 0x522b},
+ {0xf92d, 0x522d}, {0xf92e, 0x5232}, {0xf92f, 0x523e},
+ {0xf930, 0x5242}, {0xf931, 0x5243}, {0xf932, 0x5244},
+ {0xf933, 0x5246}, {0xf934, 0x5247}, {0xf935, 0x5248},
+ {0xf936, 0x5249}, {0xf937, 0x524a}, {0xf938, 0x524b},
+ {0xf939, 0x524d}, {0xf93a, 0x524e}, {0xf93b, 0x524f},
+ {0xf93c, 0x5250}, {0xf93d, 0x5251}, {0xf93e, 0x5252},
+ {0xf93f, 0x5253}, {0xf940, 0x5254}, {0xf941, 0x5255},
+ {0xf942, 0x5256}, {0xf943, 0x5257}, {0xf944, 0x5259},
+ {0xf945, 0x525a}, {0xf946, 0x525e}, {0xf947, 0x525f},
+ {0xf948, 0x5261}, {0xf949, 0x5262}, {0xf94a, 0x5264},
+ {0xf94b, 0x5265}, {0xf94c, 0x5266}, {0xf94d, 0x5267},
+ {0xf94e, 0x5268}, {0xf94f, 0x5269}, {0xf950, 0x526a},
+ {0xf951, 0x526b}, {0xf952, 0x5270}, {0xf953, 0x5271},
+ {0xf954, 0x5272}, {0xf955, 0x5273}, {0xf956, 0x5274},
+ {0xf957, 0x5275}, {0xf958, 0x5277}, {0xf959, 0x5278},
+ {0xf95a, 0x5466}, {0xf95b, 0x547c}, {0xf95c, 0x5525},
+ {0xf95d, 0x552b}, {0xf95e, 0x552e}, {0xf95f, 0x5638},
+ {0xf960, 0x564d}, {0xf961, 0x574b}, {0xf962, 0x5764},
+ {0xf963, 0x5b45}, {0xf964, 0x5b64}, {0xf965, 0x5c25},
+ {0xf966, 0x5d25}, {0xf967, 0x5d55}, {0xf968, 0x5d74},
+ {0xf969, 0x5e7c}, {0xf96a, 0x5e7e}, {0xf96b, 0x5f33},
+ {0xf96c, 0x5f61}, {0xf96d, 0x5f68}, {0xf96e, 0x6071},
+ {0xf96f, 0x612d}, {0xf970, 0x616d}, {0xf971, 0x6375},
+ {0xf972, 0x6421}, {0xf973, 0x6429}, {0xf974, 0x652e},
+ {0xf975, 0x6531}, {0xf976, 0x6532}, {0xf977, 0x6539},
+ {0xf978, 0x653b}, {0xf979, 0x653c}, {0xf97a, 0x6544},
+ {0xf97b, 0x654e}, {0xf97c, 0x6550}, {0xf97d, 0x6552},
+ {0xf97e, 0x6556}, {0xf97f, 0x657a}, {0xf980, 0x657b},
+ {0xf981, 0x657c}, {0xf982, 0x657e}, {0xf983, 0x6621},
+ {0xf984, 0x6624}, {0xf985, 0x6627}, {0xf986, 0x662d},
+ {0xf987, 0x662f}, {0xf988, 0x6630}, {0xf989, 0x6631},
+ {0xf98a, 0x6633}, {0xf98b, 0x6637}, {0xf98c, 0x6638},
+ {0xf98d, 0x663c}, {0xf98e, 0x6644}, {0xf98f, 0x6646},
+ {0xf990, 0x6647}, {0xf991, 0x664a}, {0xf992, 0x6652},
+ {0xf993, 0x6656}, {0xf994, 0x6659}, {0xf995, 0x665c},
+ {0xf996, 0x665f}, {0xf997, 0x6661}, {0xf998, 0x6664},
+ {0xf999, 0x6665}, {0xf99a, 0x6666}, {0xf99b, 0x6668},
+ {0xf99c, 0x666a}, {0xf99d, 0x666b}, {0xf99e, 0x666c},
+ {0xf99f, 0x666f}, {0xf9a0, 0x6671}, {0xf9a1, 0x6672},
+ {0xf9a2, 0x6675}, {0xf9a3, 0x6676}, {0xf9a4, 0x6677},
+ {0xf9a5, 0x6679}, {0xf9a6, 0x6721}, {0xf9a7, 0x6726},
+ {0xf9a8, 0x6729}, {0xf9a9, 0x672a}, {0xf9aa, 0x672c},
+ {0xf9ab, 0x672d}, {0xf9ac, 0x6730}, {0xf9ad, 0x673f},
+ {0xf9ae, 0x6741}, {0xf9af, 0x6746}, {0xf9b0, 0x6747},
+ {0xf9b1, 0x674b}, {0xf9b2, 0x674d}, {0xf9b3, 0x674f},
+ {0xf9b4, 0x6750}, {0xf9b5, 0x6753}, {0xf9b6, 0x675f},
+ {0xf9b7, 0x6764}, {0xf9b8, 0x6766}, {0xf9b9, 0x6777},
+ {0xf9ba, 0x6867}, {0xf9bb, 0x6868}, {0xf9bc, 0x6870},
+ {0xf9bd, 0x6871}, {0xf9be, 0x6877}, {0xf9bf, 0x6879},
+ {0xf9c0, 0x687b}, {0xf9c1, 0x687e}, {0xf9c2, 0x6927},
+ {0xf9c3, 0x692c}, {0xf9c4, 0x694c}, {0xf9c5, 0x6977},
+ {0xf9c6, 0x6a41}, {0xf9c7, 0x6a65}, {0xf9c8, 0x6a74},
+ {0xf9c9, 0x6a77}, {0xf9ca, 0x6a7c}, {0xf9cb, 0x6a7e},
+ {0xf9cc, 0x6b24}, {0xf9cd, 0x6b27}, {0xf9ce, 0x6b29},
+ {0xf9cf, 0x6b2a}, {0xf9d0, 0x6b3a}, {0xf9d1, 0x6b3b},
+ {0xf9d2, 0x6b3d}, {0xf9d3, 0x6b41}, {0xf9d4, 0x6b42},
+ {0xf9d5, 0x6b46}, {0xf9d6, 0x6b47}, {0xf9d7, 0x6b4c},
+ {0xf9d8, 0x6b4f}, {0xf9d9, 0x6b50}, {0xf9da, 0x6b51},
+ {0xf9db, 0x6b52}, {0xf9dc, 0x6b58}, {0xf9dd, 0x6c26},
+ {0xf9de, 0x6c27}, {0xf9df, 0x6c2a}, {0xf9e0, 0x6c2f},
+ {0xf9e1, 0x6c30}, {0xf9e2, 0x6c31}, {0xf9e3, 0x6c32},
+ {0xf9e4, 0x6c35}, {0xf9e5, 0x6c38}, {0xf9e6, 0x6c3a},
+ {0xf9e7, 0x6c40}, {0xf9e8, 0x6c41}, {0xf9e9, 0x6c45},
+ {0xf9ea, 0x6c46}, {0xf9eb, 0x6c49}, {0xf9ec, 0x6c4a},
+ {0xf9ed, 0x6c55}, {0xf9ee, 0x6c5d}, {0xf9ef, 0x6c5e},
+ {0xf9f0, 0x6c61}, {0xf9f1, 0x6c64}, {0xf9f2, 0x6c67},
+ {0xf9f3, 0x6c68}, {0xf9f4, 0x6c77}, {0xf9f5, 0x6c78},
+ {0xf9f6, 0x6c7a}, {0xf9f7, 0x6d21}, {0xf9f8, 0x6d22},
+ {0xf9f9, 0x6d23}, {0xf9fa, 0x6d6e}, {0xf9fb, 0x6e5b},
+ {0xf9fc, 0x723d}, {0xf9fd, 0x727a}, {0xf9fe, 0x7331},
+ {0xf9ff, 0x7427}, {0xfa00, 0x746e}, {0xfa01, 0x7674},
+ {0xfa02, 0x7676}, {0xfa03, 0x7738}, {0xfa04, 0x7748},
+ {0xfa05, 0x7753}, {0xfa06, 0x785b}, {0xfa07, 0x7870},
+ {0xfa08, 0x7a21}, {0xfa09, 0x7a22}, {0xfa0a, 0x7a66},
+ {0xfa0b, 0x7c29}
+};
+
+
+static unsigned short ksc2unicode(unsigned short code)
+{
+ int ch1 = code >> 8;
+ int ch2 = code & 0x00ff;
+ int idx;
+
+ if (ch1 < 0x80 || (ch1 - 0x80) <= 0x20 || (ch1 - 0x80) >= 0x7e
+ || (ch1 - 0x80) == 0x49)
+ return 0;
+
+ if (ch2 < 0x80 || (ch2 - 0x80) <= 0x20 || (ch2 - 0x80) >= 0x7f)
+ return 0;
+
+ idx = (ch1 - 0x80 - 0x21) * 94 + (ch2 - 0x80 - 0x21);
+
+ /* Hangul : row 16 - row 40 : 1410 = 15 * 94 ,
+ 3760 = 40 * 94 */
+ if (idx >= 1410 && idx < 1410 + 2350)
+ return ksc5601_hangul_to_unicode[idx - 1410];
+
+ else if (idx >= 3854)
+ /* Hanja : row 42 - row 93 : 3854 = 94 * (42-1) */
+ return ksc5601_hanja_to_unicode[idx - 3854];
+
+ else if(idx <= 1114)
+ return ksc5601_symbol_to_unicode[idx];
+
+ return 0;
+}
+
+static unsigned short unicode2ksc(unsigned short unicode)
+{
+ int lo, hi, mid, c2;
+ unsigned char s[2];
+
+ lo = mid = c2 = 0;
+
+ if (unicode >= 0xac00 && unicode <= 0xd7a3) {
+ // Hangul
+ hi = 2349;
+
+ while (lo <= hi) { // binary search
+ mid = (lo + hi) / 2;
+ c2 = ksc5601_hangul_to_unicode[mid];
+ if(unicode < c2)
+ hi = mid - 1;
+ else if(unicode > c2)
+ lo = mid + 1;
+ else { // unicode == c2
+ s[0] = (mid / 94) + 0x30;
+ s[1] = (mid % 94) + 0x21;
+
+ return ((s[0] << 8) | s[1]);
+ }
+ }
+ } else if ((unicode >= 0x4e00 && unicode <= 0x9fff)
+ || (unicode >= 0xf900 && unicode <= 0xfa0b)) {
+ // Hanja
+ hi = 4887;
+
+ while (lo <= hi) { // binary search
+ mid = (lo + hi) / 2;
+ c2 = unicode_to_ksc5601_hanja[mid].unicode;
+ if(unicode < c2)
+ hi = mid - 1;
+ else if(unicode > c2)
+ lo = mid + 1;
+ else { // unicode == c2
+ return unicode_to_ksc5601_hanja[mid].kscode;
+ }
+ }
+ } else {
+ // Symbol
+ hi = 985;
+
+ while (lo <= hi) { // binary search
+ mid = (lo + hi) / 2;
+ c2 = unicode_to_ksc5601_symbol[mid].unicode;
+ if(unicode < c2)
+ hi = mid - 1;
+ else if(unicode > c2)
+ lo = mid + 1;
+ else { // unicode == c2
+ return unicode_to_ksc5601_symbol[mid].kscode;
+ }
+ }
+ }
+ return 0;
+}
+
+int QCP949Codec::_mibEnum()
+{
+ return -949; // CP949 has no MIBenum. So we have to use fake value.
+}
+
+QByteArray QCP949Codec::_name()
+{
+ return "cp949";
+}
+
+/*!
+ \reimp
+*/
+QByteArray QCP949Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i = 0; i < len; i++) {
+ unsigned short ch = uc[i].unicode();
+ uint j;
+ if (ch < 0x80) {
+ // ASCII
+ *cursor++ = ch;
+ } else if ((j = qt_UnicodeToKsc5601(ch))) {
+ // KSC 5601
+ *cursor++ = (j >> 8) | 0x80;
+ *cursor++ = (j & 0xff) | 0x80;
+ } else {
+ const unsigned short *ptr = qBinaryFind(cp949_icode_to_unicode, cp949_icode_to_unicode + 8822, ch);
+ if (ptr == cp949_icode_to_unicode + 8822) {
+ // Error
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ else {
+ // The table 'cp949_icode_to_unicode' contains following
+ // 1. Elements of row 81-a0 (32 rows) consisting of 178 elements each.
+ // 2. Elements of row a1-fe not in EUC-KR consisting of 84 elements each.
+ // On each row the elements are distributed (41-5A), (61-7A), (81-FE) in order.
+ // http://www.microsoft.com/globaldev/reference/dbcs/949.mspx
+
+ // find the position of the current unicode in the table.
+ int internal_code = ptr - cp949_icode_to_unicode;
+
+ int row, column;
+ if(internal_code < 32 * 178) {
+ // code between row 81-a0
+ row = internal_code / 178;
+ column = internal_code % 178;
+ }
+ else {
+ // code between a1-fe
+ internal_code -= 3008;
+ row = internal_code / 84;
+ column = internal_code % 84;
+ }
+
+ unsigned char first, second;
+ first = row + 0x81;
+
+ if(column < 26)
+ second = column + 0x41; // between 41-5A
+ else if(column < 52)
+ second = column - 26 + 0x61; // between 61-7A
+ else
+ second = column - 52 + 0x81; // between 81-FE
+
+ *cursor++ = first;
+ *cursor++ = second;
+ }
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+/*!
+ \reimp
+*/
+QString QCP949Codec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[2] = {0, 0};
+ int nbuf = 0;
+ QChar replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ if (ch == 0)
+ break;
+ switch (nbuf) {
+ case 0:
+ if (ch < 0x80) {
+ // ASCII
+ result += QLatin1Char(ch);
+ } else if (IsEucChar(ch)) {
+ // KSC 5601
+ buf[0] = ch;
+ nbuf = 1;
+ } else if (IsCP949Char(ch)){
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ break;
+ case 1:
+ // KSC 5601
+ if (IsEucChar(ch) && !IsCP949Char(buf[0])) {
+ uint u = qt_Ksc5601ToUnicode((buf[0] << 8) | ch);
+ result += QValidChar(u);
+ } else {
+ // Rest of CP949
+ int row, column;
+ nbuf = 0;
+ row = buf[0] - 0x81;
+ if (0x41 <= ch && ch <= 0x5a)
+ column = ch - 0x41;
+ else if (0x61 <= ch && ch <= 0x7a)
+ column = ch - 0x61 + 26;
+ else if (0x81 <= ch && ch <= 0xfe)
+ column = ch - 0x81 + 52;
+ else {
+ result += replacement;
+ ++invalid;
+ break;
+ }
+
+ int internal_code;
+ if (row < 32)
+ internal_code = row * 178 + column;
+ else
+ internal_code = 3008 + row * 84 + column;
+ // check whether the conversion avialble in the table.
+ if (internal_code < 0 || internal_code >= 8822) {
+ result += replacement;
+ ++invalid;
+ break;
+ }
+ else
+ result += QValidChar(cp949_icode_to_unicode[internal_code]);
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/kr/qeuckrcodec.h b/src/plugins/codecs/kr/qeuckrcodec.h
new file mode 100644
index 0000000000..4fc1eab7d4
--- /dev/null
+++ b/src/plugins/codecs/kr/qeuckrcodec.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+ * Copyright (C) 1999-2000 Mizi Research Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef QEUCKRCODEC_H
+#define QEUCKRCODEC_H
+
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+class QEucKrCodec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+class QCP949Codec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+#ifdef Q_WS_X11
+class QFontKsc5601Codec : public QTextCodec
+{
+public:
+ QFontKsc5601Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+
+};
+#endif
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
+
+#endif // QEUCKRCODEC_H
diff --git a/src/plugins/codecs/tw/main.cpp b/src/plugins/codecs/tw/main.cpp
new file mode 100644
index 0000000000..2f38fb7f38
--- /dev/null
+++ b/src/plugins/codecs/tw/main.cpp
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtextcodecplugin.h>
+#include <qtextcodec.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_TEXTCODECPLUGIN
+
+#include "qbig5codec.h"
+
+QT_BEGIN_NAMESPACE
+
+class TWTextCodecs : public QTextCodecPlugin
+{
+public:
+ TWTextCodecs() {}
+
+ QList<QByteArray> names() const;
+ QList<QByteArray> aliases() const;
+ QList<int> mibEnums() const;
+
+ QTextCodec *createForMib(int);
+ QTextCodec *createForName(const QByteArray &);
+};
+
+QList<QByteArray> TWTextCodecs::names() const
+{
+ QList<QByteArray> list;
+ list += QBig5Codec::_name();
+ list += QBig5hkscsCodec::_name();
+#ifdef Q_WS_X11
+ list += QFontBig5Codec::_name();
+ list += QFontBig5hkscsCodec::_name();
+#endif
+ return list;
+}
+
+QList<QByteArray> TWTextCodecs::aliases() const
+{
+ QList<QByteArray> list;
+ list += QBig5Codec::_aliases();
+ list += QBig5hkscsCodec::_aliases();
+#ifdef Q_WS_X11
+ list += QFontBig5Codec::_aliases();
+ list += QFontBig5hkscsCodec::_aliases();
+#endif
+ return list;
+}
+
+QList<int> TWTextCodecs::mibEnums() const
+{
+ QList<int> list;
+ list += QBig5Codec::_mibEnum();
+ list += QBig5hkscsCodec::_mibEnum();
+#ifdef Q_WS_X11
+ list += QFontBig5Codec::_mibEnum();
+ list += QFontBig5hkscsCodec::_mibEnum();
+#endif
+ return list;
+}
+
+QTextCodec *TWTextCodecs::createForMib(int mib)
+{
+ if (mib == QBig5Codec::_mibEnum())
+ return new QBig5Codec;
+ if (mib == QBig5hkscsCodec::_mibEnum())
+ return new QBig5hkscsCodec;
+#ifdef Q_WS_X11
+ if (mib == QFontBig5hkscsCodec::_mibEnum())
+ return new QFontBig5hkscsCodec;
+ if (mib == QFontBig5Codec::_mibEnum())
+ return new QFontBig5Codec;
+#endif
+ return 0;
+}
+
+
+QTextCodec *TWTextCodecs::createForName(const QByteArray &name)
+{
+ if (name == QBig5Codec::_name() || QBig5Codec::_aliases().contains(name))
+ return new QBig5Codec;
+ if (name == QBig5hkscsCodec::_name() || QBig5hkscsCodec::_aliases().contains(name))
+ return new QBig5hkscsCodec;
+#ifdef Q_WS_X11
+ if (name == QFontBig5hkscsCodec::_name() || QFontBig5hkscsCodec::_aliases().contains(name))
+ return new QFontBig5hkscsCodec;
+ if (name == QFontBig5Codec::_name() || QFontBig5Codec::_aliases().contains(name))
+ return new QFontBig5Codec;
+#endif
+ return 0;
+}
+
+
+Q_EXPORT_STATIC_PLUGIN(TWTextCodecs);
+Q_EXPORT_PLUGIN2(qtwcodecs, TWTextCodecs);
+
+#endif // QT_NO_TEXTCODECPLUGIN
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/tw/qbig5codec.cpp b/src/plugins/codecs/tw/qbig5codec.cpp
new file mode 100644
index 0000000000..8f096f2d09
--- /dev/null
+++ b/src/plugins/codecs/tw/qbig5codec.cpp
@@ -0,0 +1,12788 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbig5codec.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+static int qt_Big5hkscsToUnicode(const uchar *s, uint *pwc);
+static int qt_UnicodeToBig5hkscs(uint wc, uchar *r);
+
+#define InRange(c, lower, upper) (((c) >= (lower)) && ((c) <= (upper)))
+#define IsLatin(c) ((c) < 0x80)
+#define IsFirstByte(c) (InRange((c), 0x81, 0xFE))
+#define IsSecondByteRange1(c) (InRange((c), 0x40, 0x7E))
+#define IsSecondByteRange2(c) (InRange((c), 0xA1, 0xFE))
+#define IsSecondByte(c) (IsSecondByteRange1(c) || IsSecondByteRange2(c))
+
+#define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar(QChar::ReplacementCharacter))
+
+
+int QBig5Codec::_mibEnum()
+{
+ return 2026;
+}
+
+QByteArray QBig5Codec::_name()
+{
+ return "Big5";
+}
+
+struct B5Map {
+ ushort x;
+ ushort y;
+};
+
+struct B5Index {
+ const B5Map * table;
+ ushort tableSize;
+};
+
+// Big 5 to Unicode maping tables.
+// Tables are in sorted order on X(all table together) & Y(individually)
+static const B5Map b5_8140_to_uc_map[] = {
+ /* 0x8140 - 0x8DFE */
+ {0x8140,0xeeb8}, {0x8141,0xeeb9}, {0x8142,0xeeba}, {0x8143,0xeebb},
+ {0x8144,0xeebc}, {0x8145,0xeebd}, {0x8146,0xeebe}, {0x8147,0xeebf},
+ {0x8148,0xeec0}, {0x8149,0xeec1}, {0x814a,0xeec2}, {0x814b,0xeec3},
+ {0x814c,0xeec4}, {0x814d,0xeec5}, {0x814e,0xeec6}, {0x814f,0xeec7},
+ {0x8150,0xeec8}, {0x8151,0xeec9}, {0x8152,0xeeca}, {0x8153,0xeecb},
+ {0x8154,0xeecc}, {0x8155,0xeecd}, {0x8156,0xeece}, {0x8157,0xeecf},
+ {0x8158,0xeed0}, {0x8159,0xeed1}, {0x815a,0xeed2}, {0x815b,0xeed3},
+ {0x815c,0xeed4}, {0x815d,0xeed5}, {0x815e,0xeed6}, {0x815f,0xeed7},
+ {0x8160,0xeed8}, {0x8161,0xeed9}, {0x8162,0xeeda}, {0x8163,0xeedb},
+ {0x8164,0xeedc}, {0x8165,0xeedd}, {0x8166,0xeede}, {0x8167,0xeedf},
+ {0x8168,0xeee0}, {0x8169,0xeee1}, {0x816a,0xeee2}, {0x816b,0xeee3},
+ {0x816c,0xeee4}, {0x816d,0xeee5}, {0x816e,0xeee6}, {0x816f,0xeee7},
+ {0x8170,0xeee8}, {0x8171,0xeee9}, {0x8172,0xeeea}, {0x8173,0xeeeb},
+ {0x8174,0xeeec}, {0x8175,0xeeed}, {0x8176,0xeeee}, {0x8177,0xeeef},
+ {0x8178,0xeef0}, {0x8179,0xeef1}, {0x817a,0xeef2}, {0x817b,0xeef3},
+ {0x817c,0xeef4}, {0x817d,0xeef5}, {0x817e,0xeef6}, {0x81a1,0xeef7},
+ {0x81a2,0xeef8}, {0x81a3,0xeef9}, {0x81a4,0xeefa}, {0x81a5,0xeefb},
+ {0x81a6,0xeefc}, {0x81a7,0xeefd}, {0x81a8,0xeefe}, {0x81a9,0xeeff},
+ {0x81aa,0xef00}, {0x81ab,0xef01}, {0x81ac,0xef02}, {0x81ad,0xef03},
+ {0x81ae,0xef04}, {0x81af,0xef05}, {0x81b0,0xef06}, {0x81b1,0xef07},
+ {0x81b2,0xef08}, {0x81b3,0xef09}, {0x81b4,0xef0a}, {0x81b5,0xef0b},
+ {0x81b6,0xef0c}, {0x81b7,0xef0d}, {0x81b8,0xef0e}, {0x81b9,0xef0f},
+ {0x81ba,0xef10}, {0x81bb,0xef11}, {0x81bc,0xef12}, {0x81bd,0xef13},
+ {0x81be,0xef14}, {0x81bf,0xef15}, {0x81c0,0xef16}, {0x81c1,0xef17},
+ {0x81c2,0xef18}, {0x81c3,0xef19}, {0x81c4,0xef1a}, {0x81c5,0xef1b},
+ {0x81c6,0xef1c}, {0x81c7,0xef1d}, {0x81c8,0xef1e}, {0x81c9,0xef1f},
+ {0x81ca,0xef20}, {0x81cb,0xef21}, {0x81cc,0xef22}, {0x81cd,0xef23},
+ {0x81ce,0xef24}, {0x81cf,0xef25}, {0x81d0,0xef26}, {0x81d1,0xef27},
+ {0x81d2,0xef28}, {0x81d3,0xef29}, {0x81d4,0xef2a}, {0x81d5,0xef2b},
+ {0x81d6,0xef2c}, {0x81d7,0xef2d}, {0x81d8,0xef2e}, {0x81d9,0xef2f},
+ {0x81da,0xef30}, {0x81db,0xef31}, {0x81dc,0xef32}, {0x81dd,0xef33},
+ {0x81de,0xef34}, {0x81df,0xef35}, {0x81e0,0xef36}, {0x81e1,0xef37},
+ {0x81e2,0xef38}, {0x81e3,0xef39}, {0x81e4,0xef3a}, {0x81e5,0xef3b},
+ {0x81e6,0xef3c}, {0x81e7,0xef3d}, {0x81e8,0xef3e}, {0x81e9,0xef3f},
+ {0x81ea,0xef40}, {0x81eb,0xef41}, {0x81ec,0xef42}, {0x81ed,0xef43},
+ {0x81ee,0xef44}, {0x81ef,0xef45}, {0x81f0,0xef46}, {0x81f1,0xef47},
+ {0x81f2,0xef48}, {0x81f3,0xef49}, {0x81f4,0xef4a}, {0x81f5,0xef4b},
+ {0x81f6,0xef4c}, {0x81f7,0xef4d}, {0x81f8,0xef4e}, {0x81f9,0xef4f},
+ {0x81fa,0xef50}, {0x81fb,0xef51}, {0x81fc,0xef52}, {0x81fd,0xef53},
+ {0x81fe,0xef54}, {0x8240,0xef55}, {0x8241,0xef56}, {0x8242,0xef57},
+ {0x8243,0xef58}, {0x8244,0xef59}, {0x8245,0xef5a}, {0x8246,0xef5b},
+ {0x8247,0xef5c}, {0x8248,0xef5d}, {0x8249,0xef5e}, {0x824a,0xef5f},
+ {0x824b,0xef60}, {0x824c,0xef61}, {0x824d,0xef62}, {0x824e,0xef63},
+ {0x824f,0xef64}, {0x8250,0xef65}, {0x8251,0xef66}, {0x8252,0xef67},
+ {0x8253,0xef68}, {0x8254,0xef69}, {0x8255,0xef6a}, {0x8256,0xef6b},
+ {0x8257,0xef6c}, {0x8258,0xef6d}, {0x8259,0xef6e}, {0x825a,0xef6f},
+ {0x825b,0xef70}, {0x825c,0xef71}, {0x825d,0xef72}, {0x825e,0xef73},
+ {0x825f,0xef74}, {0x8260,0xef75}, {0x8261,0xef76}, {0x8262,0xef77},
+ {0x8263,0xef78}, {0x8264,0xef79}, {0x8265,0xef7a}, {0x8266,0xef7b},
+ {0x8267,0xef7c}, {0x8268,0xef7d}, {0x8269,0xef7e}, {0x826a,0xef7f},
+ {0x826b,0xef80}, {0x826c,0xef81}, {0x826d,0xef82}, {0x826e,0xef83},
+ {0x826f,0xef84}, {0x8270,0xef85}, {0x8271,0xef86}, {0x8272,0xef87},
+ {0x8273,0xef88}, {0x8274,0xef89}, {0x8275,0xef8a}, {0x8276,0xef8b},
+ {0x8277,0xef8c}, {0x8278,0xef8d}, {0x8279,0xef8e}, {0x827a,0xef8f},
+ {0x827b,0xef90}, {0x827c,0xef91}, {0x827d,0xef92}, {0x827e,0xef93},
+ {0x82a1,0xef94}, {0x82a2,0xef95}, {0x82a3,0xef96}, {0x82a4,0xef97},
+ {0x82a5,0xef98}, {0x82a6,0xef99}, {0x82a7,0xef9a}, {0x82a8,0xef9b},
+ {0x82a9,0xef9c}, {0x82aa,0xef9d}, {0x82ab,0xef9e}, {0x82ac,0xef9f},
+ {0x82ad,0xefa0}, {0x82ae,0xefa1}, {0x82af,0xefa2}, {0x82b0,0xefa3},
+ {0x82b1,0xefa4}, {0x82b2,0xefa5}, {0x82b3,0xefa6}, {0x82b4,0xefa7},
+ {0x82b5,0xefa8}, {0x82b6,0xefa9}, {0x82b7,0xefaa}, {0x82b8,0xefab},
+ {0x82b9,0xefac}, {0x82ba,0xefad}, {0x82bb,0xefae}, {0x82bc,0xefaf},
+ {0x82bd,0xefb0}, {0x82be,0xefb1}, {0x82bf,0xefb2}, {0x82c0,0xefb3},
+ {0x82c1,0xefb4}, {0x82c2,0xefb5}, {0x82c3,0xefb6}, {0x82c4,0xefb7},
+ {0x82c5,0xefb8}, {0x82c6,0xefb9}, {0x82c7,0xefba}, {0x82c8,0xefbb},
+ {0x82c9,0xefbc}, {0x82ca,0xefbd}, {0x82cb,0xefbe}, {0x82cc,0xefbf},
+ {0x82cd,0xefc0}, {0x82ce,0xefc1}, {0x82cf,0xefc2}, {0x82d0,0xefc3},
+ {0x82d1,0xefc4}, {0x82d2,0xefc5}, {0x82d3,0xefc6}, {0x82d4,0xefc7},
+ {0x82d5,0xefc8}, {0x82d6,0xefc9}, {0x82d7,0xefca}, {0x82d8,0xefcb},
+ {0x82d9,0xefcc}, {0x82da,0xefcd}, {0x82db,0xefce}, {0x82dc,0xefcf},
+ {0x82dd,0xefd0}, {0x82de,0xefd1}, {0x82df,0xefd2}, {0x82e0,0xefd3},
+ {0x82e1,0xefd4}, {0x82e2,0xefd5}, {0x82e3,0xefd6}, {0x82e4,0xefd7},
+ {0x82e5,0xefd8}, {0x82e6,0xefd9}, {0x82e7,0xefda}, {0x82e8,0xefdb},
+ {0x82e9,0xefdc}, {0x82ea,0xefdd}, {0x82eb,0xefde}, {0x82ec,0xefdf},
+ {0x82ed,0xefe0}, {0x82ee,0xefe1}, {0x82ef,0xefe2}, {0x82f0,0xefe3},
+ {0x82f1,0xefe4}, {0x82f2,0xefe5}, {0x82f3,0xefe6}, {0x82f4,0xefe7},
+ {0x82f5,0xefe8}, {0x82f6,0xefe9}, {0x82f7,0xefea}, {0x82f8,0xefeb},
+ {0x82f9,0xefec}, {0x82fa,0xefed}, {0x82fb,0xefee}, {0x82fc,0xefef},
+ {0x82fd,0xeff0}, {0x82fe,0xeff1}, {0x8340,0xeff2}, {0x8341,0xeff3},
+ {0x8342,0xeff4}, {0x8343,0xeff5}, {0x8344,0xeff6}, {0x8345,0xeff7},
+ {0x8346,0xeff8}, {0x8347,0xeff9}, {0x8348,0xeffa}, {0x8349,0xeffb},
+ {0x834a,0xeffc}, {0x834b,0xeffd}, {0x834c,0xeffe}, {0x834d,0xefff},
+ {0x834e,0xf000}, {0x834f,0xf001}, {0x8350,0xf002}, {0x8351,0xf003},
+ {0x8352,0xf004}, {0x8353,0xf005}, {0x8354,0xf006}, {0x8355,0xf007},
+ {0x8356,0xf008}, {0x8357,0xf009}, {0x8358,0xf00a}, {0x8359,0xf00b},
+ {0x835a,0xf00c}, {0x835b,0xf00d}, {0x835c,0xf00e}, {0x835d,0xf00f},
+ {0x835e,0xf010}, {0x835f,0xf011}, {0x8360,0xf012}, {0x8361,0xf013},
+ {0x8362,0xf014}, {0x8363,0xf015}, {0x8364,0xf016}, {0x8365,0xf017},
+ {0x8366,0xf018}, {0x8367,0xf019}, {0x8368,0xf01a}, {0x8369,0xf01b},
+ {0x836a,0xf01c}, {0x836b,0xf01d}, {0x836c,0xf01e}, {0x836d,0xf01f},
+ {0x836e,0xf020}, {0x836f,0xf021}, {0x8370,0xf022}, {0x8371,0xf023},
+ {0x8372,0xf024}, {0x8373,0xf025}, {0x8374,0xf026}, {0x8375,0xf027},
+ {0x8376,0xf028}, {0x8377,0xf029}, {0x8378,0xf02a}, {0x8379,0xf02b},
+ {0x837a,0xf02c}, {0x837b,0xf02d}, {0x837c,0xf02e}, {0x837d,0xf02f},
+ {0x837e,0xf030}, {0x83a1,0xf031}, {0x83a2,0xf032}, {0x83a3,0xf033},
+ {0x83a4,0xf034}, {0x83a5,0xf035}, {0x83a6,0xf036}, {0x83a7,0xf037},
+ {0x83a8,0xf038}, {0x83a9,0xf039}, {0x83aa,0xf03a}, {0x83ab,0xf03b},
+ {0x83ac,0xf03c}, {0x83ad,0xf03d}, {0x83ae,0xf03e}, {0x83af,0xf03f},
+ {0x83b0,0xf040}, {0x83b1,0xf041}, {0x83b2,0xf042}, {0x83b3,0xf043},
+ {0x83b4,0xf044}, {0x83b5,0xf045}, {0x83b6,0xf046}, {0x83b7,0xf047},
+ {0x83b8,0xf048}, {0x83b9,0xf049}, {0x83ba,0xf04a}, {0x83bb,0xf04b},
+ {0x83bc,0xf04c}, {0x83bd,0xf04d}, {0x83be,0xf04e}, {0x83bf,0xf04f},
+ {0x83c0,0xf050}, {0x83c1,0xf051}, {0x83c2,0xf052}, {0x83c3,0xf053},
+ {0x83c4,0xf054}, {0x83c5,0xf055}, {0x83c6,0xf056}, {0x83c7,0xf057},
+ {0x83c8,0xf058}, {0x83c9,0xf059}, {0x83ca,0xf05a}, {0x83cb,0xf05b},
+ {0x83cc,0xf05c}, {0x83cd,0xf05d}, {0x83ce,0xf05e}, {0x83cf,0xf05f},
+ {0x83d0,0xf060}, {0x83d1,0xf061}, {0x83d2,0xf062}, {0x83d3,0xf063},
+ {0x83d4,0xf064}, {0x83d5,0xf065}, {0x83d6,0xf066}, {0x83d7,0xf067},
+ {0x83d8,0xf068}, {0x83d9,0xf069}, {0x83da,0xf06a}, {0x83db,0xf06b},
+ {0x83dc,0xf06c}, {0x83dd,0xf06d}, {0x83de,0xf06e}, {0x83df,0xf06f},
+ {0x83e0,0xf070}, {0x83e1,0xf071}, {0x83e2,0xf072}, {0x83e3,0xf073},
+ {0x83e4,0xf074}, {0x83e5,0xf075}, {0x83e6,0xf076}, {0x83e7,0xf077},
+ {0x83e8,0xf078}, {0x83e9,0xf079}, {0x83ea,0xf07a}, {0x83eb,0xf07b},
+ {0x83ec,0xf07c}, {0x83ed,0xf07d}, {0x83ee,0xf07e}, {0x83ef,0xf07f},
+ {0x83f0,0xf080}, {0x83f1,0xf081}, {0x83f2,0xf082}, {0x83f3,0xf083},
+ {0x83f4,0xf084}, {0x83f5,0xf085}, {0x83f6,0xf086}, {0x83f7,0xf087},
+ {0x83f8,0xf088}, {0x83f9,0xf089}, {0x83fa,0xf08a}, {0x83fb,0xf08b},
+ {0x83fc,0xf08c}, {0x83fd,0xf08d}, {0x83fe,0xf08e}, {0x8440,0xf08f},
+ {0x8441,0xf090}, {0x8442,0xf091}, {0x8443,0xf092}, {0x8444,0xf093},
+ {0x8445,0xf094}, {0x8446,0xf095}, {0x8447,0xf096}, {0x8448,0xf097},
+ {0x8449,0xf098}, {0x844a,0xf099}, {0x844b,0xf09a}, {0x844c,0xf09b},
+ {0x844d,0xf09c}, {0x844e,0xf09d}, {0x844f,0xf09e}, {0x8450,0xf09f},
+ {0x8451,0xf0a0}, {0x8452,0xf0a1}, {0x8453,0xf0a2}, {0x8454,0xf0a3},
+ {0x8455,0xf0a4}, {0x8456,0xf0a5}, {0x8457,0xf0a6}, {0x8458,0xf0a7},
+ {0x8459,0xf0a8}, {0x845a,0xf0a9}, {0x845b,0xf0aa}, {0x845c,0xf0ab},
+ {0x845d,0xf0ac}, {0x845e,0xf0ad}, {0x845f,0xf0ae}, {0x8460,0xf0af},
+ {0x8461,0xf0b0}, {0x8462,0xf0b1}, {0x8463,0xf0b2}, {0x8464,0xf0b3},
+ {0x8465,0xf0b4}, {0x8466,0xf0b5}, {0x8467,0xf0b6}, {0x8468,0xf0b7},
+ {0x8469,0xf0b8}, {0x846a,0xf0b9}, {0x846b,0xf0ba}, {0x846c,0xf0bb},
+ {0x846d,0xf0bc}, {0x846e,0xf0bd}, {0x846f,0xf0be}, {0x8470,0xf0bf},
+ {0x8471,0xf0c0}, {0x8472,0xf0c1}, {0x8473,0xf0c2}, {0x8474,0xf0c3},
+ {0x8475,0xf0c4}, {0x8476,0xf0c5}, {0x8477,0xf0c6}, {0x8478,0xf0c7},
+ {0x8479,0xf0c8}, {0x847a,0xf0c9}, {0x847b,0xf0ca}, {0x847c,0xf0cb},
+ {0x847d,0xf0cc}, {0x847e,0xf0cd}, {0x84a1,0xf0ce}, {0x84a2,0xf0cf},
+ {0x84a3,0xf0d0}, {0x84a4,0xf0d1}, {0x84a5,0xf0d2}, {0x84a6,0xf0d3},
+ {0x84a7,0xf0d4}, {0x84a8,0xf0d5}, {0x84a9,0xf0d6}, {0x84aa,0xf0d7},
+ {0x84ab,0xf0d8}, {0x84ac,0xf0d9}, {0x84ad,0xf0da}, {0x84ae,0xf0db},
+ {0x84af,0xf0dc}, {0x84b0,0xf0dd}, {0x84b1,0xf0de}, {0x84b2,0xf0df},
+ {0x84b3,0xf0e0}, {0x84b4,0xf0e1}, {0x84b5,0xf0e2}, {0x84b6,0xf0e3},
+ {0x84b7,0xf0e4}, {0x84b8,0xf0e5}, {0x84b9,0xf0e6}, {0x84ba,0xf0e7},
+ {0x84bb,0xf0e8}, {0x84bc,0xf0e9}, {0x84bd,0xf0ea}, {0x84be,0xf0eb},
+ {0x84bf,0xf0ec}, {0x84c0,0xf0ed}, {0x84c1,0xf0ee}, {0x84c2,0xf0ef},
+ {0x84c3,0xf0f0}, {0x84c4,0xf0f1}, {0x84c5,0xf0f2}, {0x84c6,0xf0f3},
+ {0x84c7,0xf0f4}, {0x84c8,0xf0f5}, {0x84c9,0xf0f6}, {0x84ca,0xf0f7},
+ {0x84cb,0xf0f8}, {0x84cc,0xf0f9}, {0x84cd,0xf0fa}, {0x84ce,0xf0fb},
+ {0x84cf,0xf0fc}, {0x84d0,0xf0fd}, {0x84d1,0xf0fe}, {0x84d2,0xf0ff},
+ {0x84d3,0xf100}, {0x84d4,0xf101}, {0x84d5,0xf102}, {0x84d6,0xf103},
+ {0x84d7,0xf104}, {0x84d8,0xf105}, {0x84d9,0xf106}, {0x84da,0xf107},
+ {0x84db,0xf108}, {0x84dc,0xf109}, {0x84dd,0xf10a}, {0x84de,0xf10b},
+ {0x84df,0xf10c}, {0x84e0,0xf10d}, {0x84e1,0xf10e}, {0x84e2,0xf10f},
+ {0x84e3,0xf110}, {0x84e4,0xf111}, {0x84e5,0xf112}, {0x84e6,0xf113},
+ {0x84e7,0xf114}, {0x84e8,0xf115}, {0x84e9,0xf116}, {0x84ea,0xf117},
+ {0x84eb,0xf118}, {0x84ec,0xf119}, {0x84ed,0xf11a}, {0x84ee,0xf11b},
+ {0x84ef,0xf11c}, {0x84f0,0xf11d}, {0x84f1,0xf11e}, {0x84f2,0xf11f},
+ {0x84f3,0xf120}, {0x84f4,0xf121}, {0x84f5,0xf122}, {0x84f6,0xf123},
+ {0x84f7,0xf124}, {0x84f8,0xf125}, {0x84f9,0xf126}, {0x84fa,0xf127},
+ {0x84fb,0xf128}, {0x84fc,0xf129}, {0x84fd,0xf12a}, {0x84fe,0xf12b},
+ {0x8540,0xf12c}, {0x8541,0xf12d}, {0x8542,0xf12e}, {0x8543,0xf12f},
+ {0x8544,0xf130}, {0x8545,0xf131}, {0x8546,0xf132}, {0x8547,0xf133},
+ {0x8548,0xf134}, {0x8549,0xf135}, {0x854a,0xf136}, {0x854b,0xf137},
+ {0x854c,0xf138}, {0x854d,0xf139}, {0x854e,0xf13a}, {0x854f,0xf13b},
+ {0x8550,0xf13c}, {0x8551,0xf13d}, {0x8552,0xf13e}, {0x8553,0xf13f},
+ {0x8554,0xf140}, {0x8555,0xf141}, {0x8556,0xf142}, {0x8557,0xf143},
+ {0x8558,0xf144}, {0x8559,0xf145}, {0x855a,0xf146}, {0x855b,0xf147},
+ {0x855c,0xf148}, {0x855d,0xf149}, {0x855e,0xf14a}, {0x855f,0xf14b},
+ {0x8560,0xf14c}, {0x8561,0xf14d}, {0x8562,0xf14e}, {0x8563,0xf14f},
+ {0x8564,0xf150}, {0x8565,0xf151}, {0x8566,0xf152}, {0x8567,0xf153},
+ {0x8568,0xf154}, {0x8569,0xf155}, {0x856a,0xf156}, {0x856b,0xf157},
+ {0x856c,0xf158}, {0x856d,0xf159}, {0x856e,0xf15a}, {0x856f,0xf15b},
+ {0x8570,0xf15c}, {0x8571,0xf15d}, {0x8572,0xf15e}, {0x8573,0xf15f},
+ {0x8574,0xf160}, {0x8575,0xf161}, {0x8576,0xf162}, {0x8577,0xf163},
+ {0x8578,0xf164}, {0x8579,0xf165}, {0x857a,0xf166}, {0x857b,0xf167},
+ {0x857c,0xf168}, {0x857d,0xf169}, {0x857e,0xf16a}, {0x85a1,0xf16b},
+ {0x85a2,0xf16c}, {0x85a3,0xf16d}, {0x85a4,0xf16e}, {0x85a5,0xf16f},
+ {0x85a6,0xf170}, {0x85a7,0xf171}, {0x85a8,0xf172}, {0x85a9,0xf173},
+ {0x85aa,0xf174}, {0x85ab,0xf175}, {0x85ac,0xf176}, {0x85ad,0xf177},
+ {0x85ae,0xf178}, {0x85af,0xf179}, {0x85b0,0xf17a}, {0x85b1,0xf17b},
+ {0x85b2,0xf17c}, {0x85b3,0xf17d}, {0x85b4,0xf17e}, {0x85b5,0xf17f},
+ {0x85b6,0xf180}, {0x85b7,0xf181}, {0x85b8,0xf182}, {0x85b9,0xf183},
+ {0x85ba,0xf184}, {0x85bb,0xf185}, {0x85bc,0xf186}, {0x85bd,0xf187},
+ {0x85be,0xf188}, {0x85bf,0xf189}, {0x85c0,0xf18a}, {0x85c1,0xf18b},
+ {0x85c2,0xf18c}, {0x85c3,0xf18d}, {0x85c4,0xf18e}, {0x85c5,0xf18f},
+ {0x85c6,0xf190}, {0x85c7,0xf191}, {0x85c8,0xf192}, {0x85c9,0xf193},
+ {0x85ca,0xf194}, {0x85cb,0xf195}, {0x85cc,0xf196}, {0x85cd,0xf197},
+ {0x85ce,0xf198}, {0x85cf,0xf199}, {0x85d0,0xf19a}, {0x85d1,0xf19b},
+ {0x85d2,0xf19c}, {0x85d3,0xf19d}, {0x85d4,0xf19e}, {0x85d5,0xf19f},
+ {0x85d6,0xf1a0}, {0x85d7,0xf1a1}, {0x85d8,0xf1a2}, {0x85d9,0xf1a3},
+ {0x85da,0xf1a4}, {0x85db,0xf1a5}, {0x85dc,0xf1a6}, {0x85dd,0xf1a7},
+ {0x85de,0xf1a8}, {0x85df,0xf1a9}, {0x85e0,0xf1aa}, {0x85e1,0xf1ab},
+ {0x85e2,0xf1ac}, {0x85e3,0xf1ad}, {0x85e4,0xf1ae}, {0x85e5,0xf1af},
+ {0x85e6,0xf1b0}, {0x85e7,0xf1b1}, {0x85e8,0xf1b2}, {0x85e9,0xf1b3},
+ {0x85ea,0xf1b4}, {0x85eb,0xf1b5}, {0x85ec,0xf1b6}, {0x85ed,0xf1b7},
+ {0x85ee,0xf1b8}, {0x85ef,0xf1b9}, {0x85f0,0xf1ba}, {0x85f1,0xf1bb},
+ {0x85f2,0xf1bc}, {0x85f3,0xf1bd}, {0x85f4,0xf1be}, {0x85f5,0xf1bf},
+ {0x85f6,0xf1c0}, {0x85f7,0xf1c1}, {0x85f8,0xf1c2}, {0x85f9,0xf1c3},
+ {0x85fa,0xf1c4}, {0x85fb,0xf1c5}, {0x85fc,0xf1c6}, {0x85fd,0xf1c7},
+ {0x85fe,0xf1c8}, {0x8640,0xf1c9}, {0x8641,0xf1ca}, {0x8642,0xf1cb},
+ {0x8643,0xf1cc}, {0x8644,0xf1cd}, {0x8645,0xf1ce}, {0x8646,0xf1cf},
+ {0x8647,0xf1d0}, {0x8648,0xf1d1}, {0x8649,0xf1d2}, {0x864a,0xf1d3},
+ {0x864b,0xf1d4}, {0x864c,0xf1d5}, {0x864d,0xf1d6}, {0x864e,0xf1d7},
+ {0x864f,0xf1d8}, {0x8650,0xf1d9}, {0x8651,0xf1da}, {0x8652,0xf1db},
+ {0x8653,0xf1dc}, {0x8654,0xf1dd}, {0x8655,0xf1de}, {0x8656,0xf1df},
+ {0x8657,0xf1e0}, {0x8658,0xf1e1}, {0x8659,0xf1e2}, {0x865a,0xf1e3},
+ {0x865b,0xf1e4}, {0x865c,0xf1e5}, {0x865d,0xf1e6}, {0x865e,0xf1e7},
+ {0x865f,0xf1e8}, {0x8660,0xf1e9}, {0x8661,0xf1ea}, {0x8662,0xf1eb},
+ {0x8663,0xf1ec}, {0x8664,0xf1ed}, {0x8665,0xf1ee}, {0x8666,0xf1ef},
+ {0x8667,0xf1f0}, {0x8668,0xf1f1}, {0x8669,0xf1f2}, {0x866a,0xf1f3},
+ {0x866b,0xf1f4}, {0x866c,0xf1f5}, {0x866d,0xf1f6}, {0x866e,0xf1f7},
+ {0x866f,0xf1f8}, {0x8670,0xf1f9}, {0x8671,0xf1fa}, {0x8672,0xf1fb},
+ {0x8673,0xf1fc}, {0x8674,0xf1fd}, {0x8675,0xf1fe}, {0x8676,0xf1ff},
+ {0x8677,0xf200}, {0x8678,0xf201}, {0x8679,0xf202}, {0x867a,0xf203},
+ {0x867b,0xf204}, {0x867c,0xf205}, {0x867d,0xf206}, {0x867e,0xf207},
+ {0x86a1,0xf208}, {0x86a2,0xf209}, {0x86a3,0xf20a}, {0x86a4,0xf20b},
+ {0x86a5,0xf20c}, {0x86a6,0xf20d}, {0x86a7,0xf20e}, {0x86a8,0xf20f},
+ {0x86a9,0xf210}, {0x86aa,0xf211}, {0x86ab,0xf212}, {0x86ac,0xf213},
+ {0x86ad,0xf214}, {0x86ae,0xf215}, {0x86af,0xf216}, {0x86b0,0xf217},
+ {0x86b1,0xf218}, {0x86b2,0xf219}, {0x86b3,0xf21a}, {0x86b4,0xf21b},
+ {0x86b5,0xf21c}, {0x86b6,0xf21d}, {0x86b7,0xf21e}, {0x86b8,0xf21f},
+ {0x86b9,0xf220}, {0x86ba,0xf221}, {0x86bb,0xf222}, {0x86bc,0xf223},
+ {0x86bd,0xf224}, {0x86be,0xf225}, {0x86bf,0xf226}, {0x86c0,0xf227},
+ {0x86c1,0xf228}, {0x86c2,0xf229}, {0x86c3,0xf22a}, {0x86c4,0xf22b},
+ {0x86c5,0xf22c}, {0x86c6,0xf22d}, {0x86c7,0xf22e}, {0x86c8,0xf22f},
+ {0x86c9,0xf230}, {0x86ca,0xf231}, {0x86cb,0xf232}, {0x86cc,0xf233},
+ {0x86cd,0xf234}, {0x86ce,0xf235}, {0x86cf,0xf236}, {0x86d0,0xf237},
+ {0x86d1,0xf238}, {0x86d2,0xf239}, {0x86d3,0xf23a}, {0x86d4,0xf23b},
+ {0x86d5,0xf23c}, {0x86d6,0xf23d}, {0x86d7,0xf23e}, {0x86d8,0xf23f},
+ {0x86d9,0xf240}, {0x86da,0xf241}, {0x86db,0xf242}, {0x86dc,0xf243},
+ {0x86dd,0xf244}, {0x86de,0xf245}, {0x86df,0xf246}, {0x86e0,0xf247},
+ {0x86e1,0xf248}, {0x86e2,0xf249}, {0x86e3,0xf24a}, {0x86e4,0xf24b},
+ {0x86e5,0xf24c}, {0x86e6,0xf24d}, {0x86e7,0xf24e}, {0x86e8,0xf24f},
+ {0x86e9,0xf250}, {0x86ea,0xf251}, {0x86eb,0xf252}, {0x86ec,0xf253},
+ {0x86ed,0xf254}, {0x86ee,0xf255}, {0x86ef,0xf256}, {0x86f0,0xf257},
+ {0x86f1,0xf258}, {0x86f2,0xf259}, {0x86f3,0xf25a}, {0x86f4,0xf25b},
+ {0x86f5,0xf25c}, {0x86f6,0xf25d}, {0x86f7,0xf25e}, {0x86f8,0xf25f},
+ {0x86f9,0xf260}, {0x86fa,0xf261}, {0x86fb,0xf262}, {0x86fc,0xf263},
+ {0x86fd,0xf264}, {0x86fe,0xf265}, {0x8740,0xf266}, {0x8741,0xf267},
+ {0x8742,0xf268}, {0x8743,0xf269}, {0x8744,0xf26a}, {0x8745,0xf26b},
+ {0x8746,0xf26c}, {0x8747,0xf26d}, {0x8748,0xf26e}, {0x8749,0xf26f},
+ {0x874a,0xf270}, {0x874b,0xf271}, {0x874c,0xf272}, {0x874d,0xf273},
+ {0x874e,0xf274}, {0x874f,0xf275}, {0x8750,0xf276}, {0x8751,0xf277},
+ {0x8752,0xf278}, {0x8753,0xf279}, {0x8754,0xf27a}, {0x8755,0xf27b},
+ {0x8756,0xf27c}, {0x8757,0xf27d}, {0x8758,0xf27e}, {0x8759,0xf27f},
+ {0x875a,0xf280}, {0x875b,0xf281}, {0x875c,0xf282}, {0x875d,0xf283},
+ {0x875e,0xf284}, {0x875f,0xf285}, {0x8760,0xf286}, {0x8761,0xf287},
+ {0x8762,0xf288}, {0x8763,0xf289}, {0x8764,0xf28a}, {0x8765,0xf28b},
+ {0x8766,0xf28c}, {0x8767,0xf28d}, {0x8768,0xf28e}, {0x8769,0xf28f},
+ {0x876a,0xf290}, {0x876b,0xf291}, {0x876c,0xf292}, {0x876d,0xf293},
+ {0x876e,0xf294}, {0x876f,0xf295}, {0x8770,0xf296}, {0x8771,0xf297},
+ {0x8772,0xf298}, {0x8773,0xf299}, {0x8774,0xf29a}, {0x8775,0xf29b},
+ {0x8776,0xf29c}, {0x8777,0xf29d}, {0x8778,0xf29e}, {0x8779,0xf29f},
+ {0x877a,0xf2a0}, {0x877b,0xf2a1}, {0x877c,0xf2a2}, {0x877d,0xf2a3},
+ {0x877e,0xf2a4}, {0x87a1,0xf2a5}, {0x87a2,0xf2a6}, {0x87a3,0xf2a7},
+ {0x87a4,0xf2a8}, {0x87a5,0xf2a9}, {0x87a6,0xf2aa}, {0x87a7,0xf2ab},
+ {0x87a8,0xf2ac}, {0x87a9,0xf2ad}, {0x87aa,0xf2ae}, {0x87ab,0xf2af},
+ {0x87ac,0xf2b0}, {0x87ad,0xf2b1}, {0x87ae,0xf2b2}, {0x87af,0xf2b3},
+ {0x87b0,0xf2b4}, {0x87b1,0xf2b5}, {0x87b2,0xf2b6}, {0x87b3,0xf2b7},
+ {0x87b4,0xf2b8}, {0x87b5,0xf2b9}, {0x87b6,0xf2ba}, {0x87b7,0xf2bb},
+ {0x87b8,0xf2bc}, {0x87b9,0xf2bd}, {0x87ba,0xf2be}, {0x87bb,0xf2bf},
+ {0x87bc,0xf2c0}, {0x87bd,0xf2c1}, {0x87be,0xf2c2}, {0x87bf,0xf2c3},
+ {0x87c0,0xf2c4}, {0x87c1,0xf2c5}, {0x87c2,0xf2c6}, {0x87c3,0xf2c7},
+ {0x87c4,0xf2c8}, {0x87c5,0xf2c9}, {0x87c6,0xf2ca}, {0x87c7,0xf2cb},
+ {0x87c8,0xf2cc}, {0x87c9,0xf2cd}, {0x87ca,0xf2ce}, {0x87cb,0xf2cf},
+ {0x87cc,0xf2d0}, {0x87cd,0xf2d1}, {0x87ce,0xf2d2}, {0x87cf,0xf2d3},
+ {0x87d0,0xf2d4}, {0x87d1,0xf2d5}, {0x87d2,0xf2d6}, {0x87d3,0xf2d7},
+ {0x87d4,0xf2d8}, {0x87d5,0xf2d9}, {0x87d6,0xf2da}, {0x87d7,0xf2db},
+ {0x87d8,0xf2dc}, {0x87d9,0xf2dd}, {0x87da,0xf2de}, {0x87db,0xf2df},
+ {0x87dc,0xf2e0}, {0x87dd,0xf2e1}, {0x87de,0xf2e2}, {0x87df,0xf2e3},
+ {0x87e0,0xf2e4}, {0x87e1,0xf2e5}, {0x87e2,0xf2e6}, {0x87e3,0xf2e7},
+ {0x87e4,0xf2e8}, {0x87e5,0xf2e9}, {0x87e6,0xf2ea}, {0x87e7,0xf2eb},
+ {0x87e8,0xf2ec}, {0x87e9,0xf2ed}, {0x87ea,0xf2ee}, {0x87eb,0xf2ef},
+ {0x87ec,0xf2f0}, {0x87ed,0xf2f1}, {0x87ee,0xf2f2}, {0x87ef,0xf2f3},
+ {0x87f0,0xf2f4}, {0x87f1,0xf2f5}, {0x87f2,0xf2f6}, {0x87f3,0xf2f7},
+ {0x87f4,0xf2f8}, {0x87f5,0xf2f9}, {0x87f6,0xf2fa}, {0x87f7,0xf2fb},
+ {0x87f8,0xf2fc}, {0x87f9,0xf2fd}, {0x87fa,0xf2fe}, {0x87fb,0xf2ff},
+ {0x87fc,0xf300}, {0x87fd,0xf301}, {0x87fe,0xf302}, {0x8840,0xf303},
+ {0x8841,0xf304}, {0x8842,0xf305}, {0x8843,0xf306}, {0x8844,0xf307},
+ {0x8845,0xf308}, {0x8846,0xf309}, {0x8847,0xf30a}, {0x8848,0xf30b},
+ {0x8849,0xf30c}, {0x884a,0xf30d}, {0x884b,0xf30e}, {0x884c,0xf30f},
+ {0x884d,0xf310}, {0x884e,0xf311}, {0x884f,0xf312}, {0x8850,0xf313},
+ {0x8851,0xf314}, {0x8852,0xf315}, {0x8853,0xf316}, {0x8854,0xf317},
+ {0x8855,0xf318}, {0x8856,0xf319}, {0x8857,0xf31a}, {0x8858,0xf31b},
+ {0x8859,0xf31c}, {0x885a,0xf31d}, {0x885b,0xf31e}, {0x885c,0xf31f},
+ {0x885d,0xf320}, {0x885e,0xf321}, {0x885f,0xf322}, {0x8860,0xf323},
+ {0x8861,0xf324}, {0x8862,0xf325}, {0x8863,0xf326}, {0x8864,0xf327},
+ {0x8865,0xf328}, {0x8866,0xf329}, {0x8867,0xf32a}, {0x8868,0xf32b},
+ {0x8869,0xf32c}, {0x886a,0xf32d}, {0x886b,0xf32e}, {0x886c,0xf32f},
+ {0x886d,0xf330}, {0x886e,0xf331}, {0x886f,0xf332}, {0x8870,0xf333},
+ {0x8871,0xf334}, {0x8872,0xf335}, {0x8873,0xf336}, {0x8874,0xf337},
+ {0x8875,0xf338}, {0x8876,0xf339}, {0x8877,0xf33a}, {0x8878,0xf33b},
+ {0x8879,0xf33c}, {0x887a,0xf33d}, {0x887b,0xf33e}, {0x887c,0xf33f},
+ {0x887d,0xf340}, {0x887e,0xf341}, {0x88a1,0xf342}, {0x88a2,0xf343},
+ {0x88a3,0xf344}, {0x88a4,0xf345}, {0x88a5,0xf346}, {0x88a6,0xf347},
+ {0x88a7,0xf348}, {0x88a8,0xf349}, {0x88a9,0xf34a}, {0x88aa,0xf34b},
+ {0x88ab,0xf34c}, {0x88ac,0xf34d}, {0x88ad,0xf34e}, {0x88ae,0xf34f},
+ {0x88af,0xf350}, {0x88b0,0xf351}, {0x88b1,0xf352}, {0x88b2,0xf353},
+ {0x88b3,0xf354}, {0x88b4,0xf355}, {0x88b5,0xf356}, {0x88b6,0xf357},
+ {0x88b7,0xf358}, {0x88b8,0xf359}, {0x88b9,0xf35a}, {0x88ba,0xf35b},
+ {0x88bb,0xf35c}, {0x88bc,0xf35d}, {0x88bd,0xf35e}, {0x88be,0xf35f},
+ {0x88bf,0xf360}, {0x88c0,0xf361}, {0x88c1,0xf362}, {0x88c2,0xf363},
+ {0x88c3,0xf364}, {0x88c4,0xf365}, {0x88c5,0xf366}, {0x88c6,0xf367},
+ {0x88c7,0xf368}, {0x88c8,0xf369}, {0x88c9,0xf36a}, {0x88ca,0xf36b},
+ {0x88cb,0xf36c}, {0x88cc,0xf36d}, {0x88cd,0xf36e}, {0x88ce,0xf36f},
+ {0x88cf,0xf370}, {0x88d0,0xf371}, {0x88d1,0xf372}, {0x88d2,0xf373},
+ {0x88d3,0xf374}, {0x88d4,0xf375}, {0x88d5,0xf376}, {0x88d6,0xf377},
+ {0x88d7,0xf378}, {0x88d8,0xf379}, {0x88d9,0xf37a}, {0x88da,0xf37b},
+ {0x88db,0xf37c}, {0x88dc,0xf37d}, {0x88dd,0xf37e}, {0x88de,0xf37f},
+ {0x88df,0xf380}, {0x88e0,0xf381}, {0x88e1,0xf382}, {0x88e2,0xf383},
+ {0x88e3,0xf384}, {0x88e4,0xf385}, {0x88e5,0xf386}, {0x88e6,0xf387},
+ {0x88e7,0xf388}, {0x88e8,0xf389}, {0x88e9,0xf38a}, {0x88ea,0xf38b},
+ {0x88eb,0xf38c}, {0x88ec,0xf38d}, {0x88ed,0xf38e}, {0x88ee,0xf38f},
+ {0x88ef,0xf390}, {0x88f0,0xf391}, {0x88f1,0xf392}, {0x88f2,0xf393},
+ {0x88f3,0xf394}, {0x88f4,0xf395}, {0x88f5,0xf396}, {0x88f6,0xf397},
+ {0x88f7,0xf398}, {0x88f8,0xf399}, {0x88f9,0xf39a}, {0x88fa,0xf39b},
+ {0x88fb,0xf39c}, {0x88fc,0xf39d}, {0x88fd,0xf39e}, {0x88fe,0xf39f},
+ {0x8940,0xf3a0}, {0x8941,0xf3a1}, {0x8942,0xf3a2}, {0x8943,0xf3a3},
+ {0x8944,0xf3a4}, {0x8945,0xf3a5}, {0x8946,0xf3a6}, {0x8947,0xf3a7},
+ {0x8948,0xf3a8}, {0x8949,0xf3a9}, {0x894a,0xf3aa}, {0x894b,0xf3ab},
+ {0x894c,0xf3ac}, {0x894d,0xf3ad}, {0x894e,0xf3ae}, {0x894f,0xf3af},
+ {0x8950,0xf3b0}, {0x8951,0xf3b1}, {0x8952,0xf3b2}, {0x8953,0xf3b3},
+ {0x8954,0xf3b4}, {0x8955,0xf3b5}, {0x8956,0xf3b6}, {0x8957,0xf3b7},
+ {0x8958,0xf3b8}, {0x8959,0xf3b9}, {0x895a,0xf3ba}, {0x895b,0xf3bb},
+ {0x895c,0xf3bc}, {0x895d,0xf3bd}, {0x895e,0xf3be}, {0x895f,0xf3bf},
+ {0x8960,0xf3c0}, {0x8961,0xf3c1}, {0x8962,0xf3c2}, {0x8963,0xf3c3},
+ {0x8964,0xf3c4}, {0x8965,0xf3c5}, {0x8966,0xf3c6}, {0x8967,0xf3c7},
+ {0x8968,0xf3c8}, {0x8969,0xf3c9}, {0x896a,0xf3ca}, {0x896b,0xf3cb},
+ {0x896c,0xf3cc}, {0x896d,0xf3cd}, {0x896e,0xf3ce}, {0x896f,0xf3cf},
+ {0x8970,0xf3d0}, {0x8971,0xf3d1}, {0x8972,0xf3d2}, {0x8973,0xf3d3},
+ {0x8974,0xf3d4}, {0x8975,0xf3d5}, {0x8976,0xf3d6}, {0x8977,0xf3d7},
+ {0x8978,0xf3d8}, {0x8979,0xf3d9}, {0x897a,0xf3da}, {0x897b,0xf3db},
+ {0x897c,0xf3dc}, {0x897d,0xf3dd}, {0x897e,0xf3de}, {0x89a1,0xf3df},
+ {0x89a2,0xf3e0}, {0x89a3,0xf3e1}, {0x89a4,0xf3e2}, {0x89a5,0xf3e3},
+ {0x89a6,0xf3e4}, {0x89a7,0xf3e5}, {0x89a8,0xf3e6}, {0x89a9,0xf3e7},
+ {0x89aa,0xf3e8}, {0x89ab,0xf3e9}, {0x89ac,0xf3ea}, {0x89ad,0xf3eb},
+ {0x89ae,0xf3ec}, {0x89af,0xf3ed}, {0x89b0,0xf3ee}, {0x89b1,0xf3ef},
+ {0x89b2,0xf3f0}, {0x89b3,0xf3f1}, {0x89b4,0xf3f2}, {0x89b5,0xf3f3},
+ {0x89b6,0xf3f4}, {0x89b7,0xf3f5}, {0x89b8,0xf3f6}, {0x89b9,0xf3f7},
+ {0x89ba,0xf3f8}, {0x89bb,0xf3f9}, {0x89bc,0xf3fa}, {0x89bd,0xf3fb},
+ {0x89be,0xf3fc}, {0x89bf,0xf3fd}, {0x89c0,0xf3fe}, {0x89c1,0xf3ff},
+ {0x89c2,0xf400}, {0x89c3,0xf401}, {0x89c4,0xf402}, {0x89c5,0xf403},
+ {0x89c6,0xf404}, {0x89c7,0xf405}, {0x89c8,0xf406}, {0x89c9,0xf407},
+ {0x89ca,0xf408}, {0x89cb,0xf409}, {0x89cc,0xf40a}, {0x89cd,0xf40b},
+ {0x89ce,0xf40c}, {0x89cf,0xf40d}, {0x89d0,0xf40e}, {0x89d1,0xf40f},
+ {0x89d2,0xf410}, {0x89d3,0xf411}, {0x89d4,0xf412}, {0x89d5,0xf413},
+ {0x89d6,0xf414}, {0x89d7,0xf415}, {0x89d8,0xf416}, {0x89d9,0xf417},
+ {0x89da,0xf418}, {0x89db,0xf419}, {0x89dc,0xf41a}, {0x89dd,0xf41b},
+ {0x89de,0xf41c}, {0x89df,0xf41d}, {0x89e0,0xf41e}, {0x89e1,0xf41f},
+ {0x89e2,0xf420}, {0x89e3,0xf421}, {0x89e4,0xf422}, {0x89e5,0xf423},
+ {0x89e6,0xf424}, {0x89e7,0xf425}, {0x89e8,0xf426}, {0x89e9,0xf427},
+ {0x89ea,0xf428}, {0x89eb,0xf429}, {0x89ec,0xf42a}, {0x89ed,0xf42b},
+ {0x89ee,0xf42c}, {0x89ef,0xf42d}, {0x89f0,0xf42e}, {0x89f1,0xf42f},
+ {0x89f2,0xf430}, {0x89f3,0xf431}, {0x89f4,0xf432}, {0x89f5,0xf433},
+ {0x89f6,0xf434}, {0x89f7,0xf435}, {0x89f8,0xf436}, {0x89f9,0xf437},
+ {0x89fa,0xf438}, {0x89fb,0xf439}, {0x89fc,0xf43a}, {0x89fd,0xf43b},
+ {0x89fe,0xf43c}, {0x8a40,0xf43d}, {0x8a41,0xf43e}, {0x8a42,0xf43f},
+ {0x8a43,0xf440}, {0x8a44,0xf441}, {0x8a45,0xf442}, {0x8a46,0xf443},
+ {0x8a47,0xf444}, {0x8a48,0xf445}, {0x8a49,0xf446}, {0x8a4a,0xf447},
+ {0x8a4b,0xf448}, {0x8a4c,0xf449}, {0x8a4d,0xf44a}, {0x8a4e,0xf44b},
+ {0x8a4f,0xf44c}, {0x8a50,0xf44d}, {0x8a51,0xf44e}, {0x8a52,0xf44f},
+ {0x8a53,0xf450}, {0x8a54,0xf451}, {0x8a55,0xf452}, {0x8a56,0xf453},
+ {0x8a57,0xf454}, {0x8a58,0xf455}, {0x8a59,0xf456}, {0x8a5a,0xf457},
+ {0x8a5b,0xf458}, {0x8a5c,0xf459}, {0x8a5d,0xf45a}, {0x8a5e,0xf45b},
+ {0x8a5f,0xf45c}, {0x8a60,0xf45d}, {0x8a61,0xf45e}, {0x8a62,0xf45f},
+ {0x8a63,0xf460}, {0x8a64,0xf461}, {0x8a65,0xf462}, {0x8a66,0xf463},
+ {0x8a67,0xf464}, {0x8a68,0xf465}, {0x8a69,0xf466}, {0x8a6a,0xf467},
+ {0x8a6b,0xf468}, {0x8a6c,0xf469}, {0x8a6d,0xf46a}, {0x8a6e,0xf46b},
+ {0x8a6f,0xf46c}, {0x8a70,0xf46d}, {0x8a71,0xf46e}, {0x8a72,0xf46f},
+ {0x8a73,0xf470}, {0x8a74,0xf471}, {0x8a75,0xf472}, {0x8a76,0xf473},
+ {0x8a77,0xf474}, {0x8a78,0xf475}, {0x8a79,0xf476}, {0x8a7a,0xf477},
+ {0x8a7b,0xf478}, {0x8a7c,0xf479}, {0x8a7d,0xf47a}, {0x8a7e,0xf47b},
+ {0x8aa1,0xf47c}, {0x8aa2,0xf47d}, {0x8aa3,0xf47e}, {0x8aa4,0xf47f},
+ {0x8aa5,0xf480}, {0x8aa6,0xf481}, {0x8aa7,0xf482}, {0x8aa8,0xf483},
+ {0x8aa9,0xf484}, {0x8aaa,0xf485}, {0x8aab,0xf486}, {0x8aac,0xf487},
+ {0x8aad,0xf488}, {0x8aae,0xf489}, {0x8aaf,0xf48a}, {0x8ab0,0xf48b},
+ {0x8ab1,0xf48c}, {0x8ab2,0xf48d}, {0x8ab3,0xf48e}, {0x8ab4,0xf48f},
+ {0x8ab5,0xf490}, {0x8ab6,0xf491}, {0x8ab7,0xf492}, {0x8ab8,0xf493},
+ {0x8ab9,0xf494}, {0x8aba,0xf495}, {0x8abb,0xf496}, {0x8abc,0xf497},
+ {0x8abd,0xf498}, {0x8abe,0xf499}, {0x8abf,0xf49a}, {0x8ac0,0xf49b},
+ {0x8ac1,0xf49c}, {0x8ac2,0xf49d}, {0x8ac3,0xf49e}, {0x8ac4,0xf49f},
+ {0x8ac5,0xf4a0}, {0x8ac6,0xf4a1}, {0x8ac7,0xf4a2}, {0x8ac8,0xf4a3},
+ {0x8ac9,0xf4a4}, {0x8aca,0xf4a5}, {0x8acb,0xf4a6}, {0x8acc,0xf4a7},
+ {0x8acd,0xf4a8}, {0x8ace,0xf4a9}, {0x8acf,0xf4aa}, {0x8ad0,0xf4ab},
+ {0x8ad1,0xf4ac}, {0x8ad2,0xf4ad}, {0x8ad3,0xf4ae}, {0x8ad4,0xf4af},
+ {0x8ad5,0xf4b0}, {0x8ad6,0xf4b1}, {0x8ad7,0xf4b2}, {0x8ad8,0xf4b3},
+ {0x8ad9,0xf4b4}, {0x8ada,0xf4b5}, {0x8adb,0xf4b6}, {0x8adc,0xf4b7},
+ {0x8add,0xf4b8}, {0x8ade,0xf4b9}, {0x8adf,0xf4ba}, {0x8ae0,0xf4bb},
+ {0x8ae1,0xf4bc}, {0x8ae2,0xf4bd}, {0x8ae3,0xf4be}, {0x8ae4,0xf4bf},
+ {0x8ae5,0xf4c0}, {0x8ae6,0xf4c1}, {0x8ae7,0xf4c2}, {0x8ae8,0xf4c3},
+ {0x8ae9,0xf4c4}, {0x8aea,0xf4c5}, {0x8aeb,0xf4c6}, {0x8aec,0xf4c7},
+ {0x8aed,0xf4c8}, {0x8aee,0xf4c9}, {0x8aef,0xf4ca}, {0x8af0,0xf4cb},
+ {0x8af1,0xf4cc}, {0x8af2,0xf4cd}, {0x8af3,0xf4ce}, {0x8af4,0xf4cf},
+ {0x8af5,0xf4d0}, {0x8af6,0xf4d1}, {0x8af7,0xf4d2}, {0x8af8,0xf4d3},
+ {0x8af9,0xf4d4}, {0x8afa,0xf4d5}, {0x8afb,0xf4d6}, {0x8afc,0xf4d7},
+ {0x8afd,0xf4d8}, {0x8afe,0xf4d9}, {0x8b40,0xf4da}, {0x8b41,0xf4db},
+ {0x8b42,0xf4dc}, {0x8b43,0xf4dd}, {0x8b44,0xf4de}, {0x8b45,0xf4df},
+ {0x8b46,0xf4e0}, {0x8b47,0xf4e1}, {0x8b48,0xf4e2}, {0x8b49,0xf4e3},
+ {0x8b4a,0xf4e4}, {0x8b4b,0xf4e5}, {0x8b4c,0xf4e6}, {0x8b4d,0xf4e7},
+ {0x8b4e,0xf4e8}, {0x8b4f,0xf4e9}, {0x8b50,0xf4ea}, {0x8b51,0xf4eb},
+ {0x8b52,0xf4ec}, {0x8b53,0xf4ed}, {0x8b54,0xf4ee}, {0x8b55,0xf4ef},
+ {0x8b56,0xf4f0}, {0x8b57,0xf4f1}, {0x8b58,0xf4f2}, {0x8b59,0xf4f3},
+ {0x8b5a,0xf4f4}, {0x8b5b,0xf4f5}, {0x8b5c,0xf4f6}, {0x8b5d,0xf4f7},
+ {0x8b5e,0xf4f8}, {0x8b5f,0xf4f9}, {0x8b60,0xf4fa}, {0x8b61,0xf4fb},
+ {0x8b62,0xf4fc}, {0x8b63,0xf4fd}, {0x8b64,0xf4fe}, {0x8b65,0xf4ff},
+ {0x8b66,0xf500}, {0x8b67,0xf501}, {0x8b68,0xf502}, {0x8b69,0xf503},
+ {0x8b6a,0xf504}, {0x8b6b,0xf505}, {0x8b6c,0xf506}, {0x8b6d,0xf507},
+ {0x8b6e,0xf508}, {0x8b6f,0xf509}, {0x8b70,0xf50a}, {0x8b71,0xf50b},
+ {0x8b72,0xf50c}, {0x8b73,0xf50d}, {0x8b74,0xf50e}, {0x8b75,0xf50f},
+ {0x8b76,0xf510}, {0x8b77,0xf511}, {0x8b78,0xf512}, {0x8b79,0xf513},
+ {0x8b7a,0xf514}, {0x8b7b,0xf515}, {0x8b7c,0xf516}, {0x8b7d,0xf517},
+ {0x8b7e,0xf518}, {0x8ba1,0xf519}, {0x8ba2,0xf51a}, {0x8ba3,0xf51b},
+ {0x8ba4,0xf51c}, {0x8ba5,0xf51d}, {0x8ba6,0xf51e}, {0x8ba7,0xf51f},
+ {0x8ba8,0xf520}, {0x8ba9,0xf521}, {0x8baa,0xf522}, {0x8bab,0xf523},
+ {0x8bac,0xf524}, {0x8bad,0xf525}, {0x8bae,0xf526}, {0x8baf,0xf527},
+ {0x8bb0,0xf528}, {0x8bb1,0xf529}, {0x8bb2,0xf52a}, {0x8bb3,0xf52b},
+ {0x8bb4,0xf52c}, {0x8bb5,0xf52d}, {0x8bb6,0xf52e}, {0x8bb7,0xf52f},
+ {0x8bb8,0xf530}, {0x8bb9,0xf531}, {0x8bba,0xf532}, {0x8bbb,0xf533},
+ {0x8bbc,0xf534}, {0x8bbd,0xf535}, {0x8bbe,0xf536}, {0x8bbf,0xf537},
+ {0x8bc0,0xf538}, {0x8bc1,0xf539}, {0x8bc2,0xf53a}, {0x8bc3,0xf53b},
+ {0x8bc4,0xf53c}, {0x8bc5,0xf53d}, {0x8bc6,0xf53e}, {0x8bc7,0xf53f},
+ {0x8bc8,0xf540}, {0x8bc9,0xf541}, {0x8bca,0xf542}, {0x8bcb,0xf543},
+ {0x8bcc,0xf544}, {0x8bcd,0xf545}, {0x8bce,0xf546}, {0x8bcf,0xf547},
+ {0x8bd0,0xf548}, {0x8bd1,0xf549}, {0x8bd2,0xf54a}, {0x8bd3,0xf54b},
+ {0x8bd4,0xf54c}, {0x8bd5,0xf54d}, {0x8bd6,0xf54e}, {0x8bd7,0xf54f},
+ {0x8bd8,0xf550}, {0x8bd9,0xf551}, {0x8bda,0xf552}, {0x8bdb,0xf553},
+ {0x8bdc,0xf554}, {0x8bdd,0xf555}, {0x8bde,0xf556}, {0x8bdf,0xf557},
+ {0x8be0,0xf558}, {0x8be1,0xf559}, {0x8be2,0xf55a}, {0x8be3,0xf55b},
+ {0x8be4,0xf55c}, {0x8be5,0xf55d}, {0x8be6,0xf55e}, {0x8be7,0xf55f},
+ {0x8be8,0xf560}, {0x8be9,0xf561}, {0x8bea,0xf562}, {0x8beb,0xf563},
+ {0x8bec,0xf564}, {0x8bed,0xf565}, {0x8bee,0xf566}, {0x8bef,0xf567},
+ {0x8bf0,0xf568}, {0x8bf1,0xf569}, {0x8bf2,0xf56a}, {0x8bf3,0xf56b},
+ {0x8bf4,0xf56c}, {0x8bf5,0xf56d}, {0x8bf6,0xf56e}, {0x8bf7,0xf56f},
+ {0x8bf8,0xf570}, {0x8bf9,0xf571}, {0x8bfa,0xf572}, {0x8bfb,0xf573},
+ {0x8bfc,0xf574}, {0x8bfd,0xf575}, {0x8bfe,0xf576}, {0x8c40,0xf577},
+ {0x8c41,0xf578}, {0x8c42,0xf579}, {0x8c43,0xf57a}, {0x8c44,0xf57b},
+ {0x8c45,0xf57c}, {0x8c46,0xf57d}, {0x8c47,0xf57e}, {0x8c48,0xf57f},
+ {0x8c49,0xf580}, {0x8c4a,0xf581}, {0x8c4b,0xf582}, {0x8c4c,0xf583},
+ {0x8c4d,0xf584}, {0x8c4e,0xf585}, {0x8c4f,0xf586}, {0x8c50,0xf587},
+ {0x8c51,0xf588}, {0x8c52,0xf589}, {0x8c53,0xf58a}, {0x8c54,0xf58b},
+ {0x8c55,0xf58c}, {0x8c56,0xf58d}, {0x8c57,0xf58e}, {0x8c58,0xf58f},
+ {0x8c59,0xf590}, {0x8c5a,0xf591}, {0x8c5b,0xf592}, {0x8c5c,0xf593},
+ {0x8c5d,0xf594}, {0x8c5e,0xf595}, {0x8c5f,0xf596}, {0x8c60,0xf597},
+ {0x8c61,0xf598}, {0x8c62,0xf599}, {0x8c63,0xf59a}, {0x8c64,0xf59b},
+ {0x8c65,0xf59c}, {0x8c66,0xf59d}, {0x8c67,0xf59e}, {0x8c68,0xf59f},
+ {0x8c69,0xf5a0}, {0x8c6a,0xf5a1}, {0x8c6b,0xf5a2}, {0x8c6c,0xf5a3},
+ {0x8c6d,0xf5a4}, {0x8c6e,0xf5a5}, {0x8c6f,0xf5a6}, {0x8c70,0xf5a7},
+ {0x8c71,0xf5a8}, {0x8c72,0xf5a9}, {0x8c73,0xf5aa}, {0x8c74,0xf5ab},
+ {0x8c75,0xf5ac}, {0x8c76,0xf5ad}, {0x8c77,0xf5ae}, {0x8c78,0xf5af},
+ {0x8c79,0xf5b0}, {0x8c7a,0xf5b1}, {0x8c7b,0xf5b2}, {0x8c7c,0xf5b3},
+ {0x8c7d,0xf5b4}, {0x8c7e,0xf5b5}, {0x8ca1,0xf5b6}, {0x8ca2,0xf5b7},
+ {0x8ca3,0xf5b8}, {0x8ca4,0xf5b9}, {0x8ca5,0xf5ba}, {0x8ca6,0xf5bb},
+ {0x8ca7,0xf5bc}, {0x8ca8,0xf5bd}, {0x8ca9,0xf5be}, {0x8caa,0xf5bf},
+ {0x8cab,0xf5c0}, {0x8cac,0xf5c1}, {0x8cad,0xf5c2}, {0x8cae,0xf5c3},
+ {0x8caf,0xf5c4}, {0x8cb0,0xf5c5}, {0x8cb1,0xf5c6}, {0x8cb2,0xf5c7},
+ {0x8cb3,0xf5c8}, {0x8cb4,0xf5c9}, {0x8cb5,0xf5ca}, {0x8cb6,0xf5cb},
+ {0x8cb7,0xf5cc}, {0x8cb8,0xf5cd}, {0x8cb9,0xf5ce}, {0x8cba,0xf5cf},
+ {0x8cbb,0xf5d0}, {0x8cbc,0xf5d1}, {0x8cbd,0xf5d2}, {0x8cbe,0xf5d3},
+ {0x8cbf,0xf5d4}, {0x8cc0,0xf5d5}, {0x8cc1,0xf5d6}, {0x8cc2,0xf5d7},
+ {0x8cc3,0xf5d8}, {0x8cc4,0xf5d9}, {0x8cc5,0xf5da}, {0x8cc6,0xf5db},
+ {0x8cc7,0xf5dc}, {0x8cc8,0xf5dd}, {0x8cc9,0xf5de}, {0x8cca,0xf5df},
+ {0x8ccb,0xf5e0}, {0x8ccc,0xf5e1}, {0x8ccd,0xf5e2}, {0x8cce,0xf5e3},
+ {0x8ccf,0xf5e4}, {0x8cd0,0xf5e5}, {0x8cd1,0xf5e6}, {0x8cd2,0xf5e7},
+ {0x8cd3,0xf5e8}, {0x8cd4,0xf5e9}, {0x8cd5,0xf5ea}, {0x8cd6,0xf5eb},
+ {0x8cd7,0xf5ec}, {0x8cd8,0xf5ed}, {0x8cd9,0xf5ee}, {0x8cda,0xf5ef},
+ {0x8cdb,0xf5f0}, {0x8cdc,0xf5f1}, {0x8cdd,0xf5f2}, {0x8cde,0xf5f3},
+ {0x8cdf,0xf5f4}, {0x8ce0,0xf5f5}, {0x8ce1,0xf5f6}, {0x8ce2,0xf5f7},
+ {0x8ce3,0xf5f8}, {0x8ce4,0xf5f9}, {0x8ce5,0xf5fa}, {0x8ce6,0xf5fb},
+ {0x8ce7,0xf5fc}, {0x8ce8,0xf5fd}, {0x8ce9,0xf5fe}, {0x8cea,0xf5ff},
+ {0x8ceb,0xf600}, {0x8cec,0xf601}, {0x8ced,0xf602}, {0x8cee,0xf603},
+ {0x8cef,0xf604}, {0x8cf0,0xf605}, {0x8cf1,0xf606}, {0x8cf2,0xf607},
+ {0x8cf3,0xf608}, {0x8cf4,0xf609}, {0x8cf5,0xf60a}, {0x8cf6,0xf60b},
+ {0x8cf7,0xf60c}, {0x8cf8,0xf60d}, {0x8cf9,0xf60e}, {0x8cfa,0xf60f},
+ {0x8cfb,0xf610}, {0x8cfc,0xf611}, {0x8cfd,0xf612}, {0x8cfe,0xf613},
+ {0x8d40,0xf614}, {0x8d41,0xf615}, {0x8d42,0xf616}, {0x8d43,0xf617},
+ {0x8d44,0xf618}, {0x8d45,0xf619}, {0x8d46,0xf61a}, {0x8d47,0xf61b},
+ {0x8d48,0xf61c}, {0x8d49,0xf61d}, {0x8d4a,0xf61e}, {0x8d4b,0xf61f},
+ {0x8d4c,0xf620}, {0x8d4d,0xf621}, {0x8d4e,0xf622}, {0x8d4f,0xf623},
+ {0x8d50,0xf624}, {0x8d51,0xf625}, {0x8d52,0xf626}, {0x8d53,0xf627},
+ {0x8d54,0xf628}, {0x8d55,0xf629}, {0x8d56,0xf62a}, {0x8d57,0xf62b},
+ {0x8d58,0xf62c}, {0x8d59,0xf62d}, {0x8d5a,0xf62e}, {0x8d5b,0xf62f},
+ {0x8d5c,0xf630}, {0x8d5d,0xf631}, {0x8d5e,0xf632}, {0x8d5f,0xf633},
+ {0x8d60,0xf634}, {0x8d61,0xf635}, {0x8d62,0xf636}, {0x8d63,0xf637},
+ {0x8d64,0xf638}, {0x8d65,0xf639}, {0x8d66,0xf63a}, {0x8d67,0xf63b},
+ {0x8d68,0xf63c}, {0x8d69,0xf63d}, {0x8d6a,0xf63e}, {0x8d6b,0xf63f},
+ {0x8d6c,0xf640}, {0x8d6d,0xf641}, {0x8d6e,0xf642}, {0x8d6f,0xf643},
+ {0x8d70,0xf644}, {0x8d71,0xf645}, {0x8d72,0xf646}, {0x8d73,0xf647},
+ {0x8d74,0xf648}, {0x8d75,0xf649}, {0x8d76,0xf64a}, {0x8d77,0xf64b},
+ {0x8d78,0xf64c}, {0x8d79,0xf64d}, {0x8d7a,0xf64e}, {0x8d7b,0xf64f},
+ {0x8d7c,0xf650}, {0x8d7d,0xf651}, {0x8d7e,0xf652}, {0x8da1,0xf653},
+ {0x8da2,0xf654}, {0x8da3,0xf655}, {0x8da4,0xf656}, {0x8da5,0xf657},
+ {0x8da6,0xf658}, {0x8da7,0xf659}, {0x8da8,0xf65a}, {0x8da9,0xf65b},
+ {0x8daa,0xf65c}, {0x8dab,0xf65d}, {0x8dac,0xf65e}, {0x8dad,0xf65f},
+ {0x8dae,0xf660}, {0x8daf,0xf661}, {0x8db0,0xf662}, {0x8db1,0xf663},
+ {0x8db2,0xf664}, {0x8db3,0xf665}, {0x8db4,0xf666}, {0x8db5,0xf667},
+ {0x8db6,0xf668}, {0x8db7,0xf669}, {0x8db8,0xf66a}, {0x8db9,0xf66b},
+ {0x8dba,0xf66c}, {0x8dbb,0xf66d}, {0x8dbc,0xf66e}, {0x8dbd,0xf66f},
+ {0x8dbe,0xf670}, {0x8dbf,0xf671}, {0x8dc0,0xf672}, {0x8dc1,0xf673},
+ {0x8dc2,0xf674}, {0x8dc3,0xf675}, {0x8dc4,0xf676}, {0x8dc5,0xf677},
+ {0x8dc6,0xf678}, {0x8dc7,0xf679}, {0x8dc8,0xf67a}, {0x8dc9,0xf67b},
+ {0x8dca,0xf67c}, {0x8dcb,0xf67d}, {0x8dcc,0xf67e}, {0x8dcd,0xf67f},
+ {0x8dce,0xf680}, {0x8dcf,0xf681}, {0x8dd0,0xf682}, {0x8dd1,0xf683},
+ {0x8dd2,0xf684}, {0x8dd3,0xf685}, {0x8dd4,0xf686}, {0x8dd5,0xf687},
+ {0x8dd6,0xf688}, {0x8dd7,0xf689}, {0x8dd8,0xf68a}, {0x8dd9,0xf68b},
+ {0x8dda,0xf68c}, {0x8ddb,0xf68d}, {0x8ddc,0xf68e}, {0x8ddd,0xf68f},
+ {0x8dde,0xf690}, {0x8ddf,0xf691}, {0x8de0,0xf692}, {0x8de1,0xf693},
+ {0x8de2,0xf694}, {0x8de3,0xf695}, {0x8de4,0xf696}, {0x8de5,0xf697},
+ {0x8de6,0xf698}, {0x8de7,0xf699}, {0x8de8,0xf69a}, {0x8de9,0xf69b},
+ {0x8dea,0xf69c}, {0x8deb,0xf69d}, {0x8dec,0xf69e}, {0x8ded,0xf69f},
+ {0x8dee,0xf6a0}, {0x8def,0xf6a1}, {0x8df0,0xf6a2}, {0x8df1,0xf6a3},
+ {0x8df2,0xf6a4}, {0x8df3,0xf6a5}, {0x8df4,0xf6a6}, {0x8df5,0xf6a7},
+ {0x8df6,0xf6a8}, {0x8df7,0xf6a9}, {0x8df8,0xf6aa}, {0x8df9,0xf6ab},
+ {0x8dfa,0xf6ac}, {0x8dfb,0xf6ad}, {0x8dfc,0xf6ae}, {0x8dfd,0xf6af},
+ {0x8dfe,0xf6b0}
+};
+static const B5Map b5_8E40_to_uc_map[] = {
+ /* 0x8E40 - 0xA0FE */
+ {0x8e40,0xe311}, {0x8e41,0xe312}, {0x8e42,0xe313}, {0x8e43,0xe314},
+ {0x8e44,0xe315}, {0x8e45,0xe316}, {0x8e46,0xe317}, {0x8e47,0xe318},
+ {0x8e48,0xe319}, {0x8e49,0xe31a}, {0x8e4a,0xe31b}, {0x8e4b,0xe31c},
+ {0x8e4c,0xe31d}, {0x8e4d,0xe31e}, {0x8e4e,0xe31f}, {0x8e4f,0xe320},
+ {0x8e50,0xe321}, {0x8e51,0xe322}, {0x8e52,0xe323}, {0x8e53,0xe324},
+ {0x8e54,0xe325}, {0x8e55,0xe326}, {0x8e56,0xe327}, {0x8e57,0xe328},
+ {0x8e58,0xe329}, {0x8e59,0xe32a}, {0x8e5a,0xe32b}, {0x8e5b,0xe32c},
+ {0x8e5c,0xe32d}, {0x8e5d,0xe32e}, {0x8e5e,0xe32f}, {0x8e5f,0xe330},
+ {0x8e60,0xe331}, {0x8e61,0xe332}, {0x8e62,0xe333}, {0x8e63,0xe334},
+ {0x8e64,0xe335}, {0x8e65,0xe336}, {0x8e66,0xe337}, {0x8e67,0xe338},
+ {0x8e68,0xe339}, {0x8e69,0xe33a}, {0x8e6a,0xe33b}, {0x8e6b,0xe33c},
+ {0x8e6c,0xe33d}, {0x8e6d,0xe33e}, {0x8e6e,0xe33f}, {0x8e6f,0xe340},
+ {0x8e70,0xe341}, {0x8e71,0xe342}, {0x8e72,0xe343}, {0x8e73,0xe344},
+ {0x8e74,0xe345}, {0x8e75,0xe346}, {0x8e76,0xe347}, {0x8e77,0xe348},
+ {0x8e78,0xe349}, {0x8e79,0xe34a}, {0x8e7a,0xe34b}, {0x8e7b,0xe34c},
+ {0x8e7c,0xe34d}, {0x8e7d,0xe34e}, {0x8e7e,0xe34f}, {0x8ea1,0xe350},
+ {0x8ea2,0xe351}, {0x8ea3,0xe352}, {0x8ea4,0xe353}, {0x8ea5,0xe354},
+ {0x8ea6,0xe355}, {0x8ea7,0xe356}, {0x8ea8,0xe357}, {0x8ea9,0xe358},
+ {0x8eaa,0xe359}, {0x8eab,0xe35a}, {0x8eac,0xe35b}, {0x8ead,0xe35c},
+ {0x8eae,0xe35d}, {0x8eaf,0xe35e}, {0x8eb0,0xe35f}, {0x8eb1,0xe360},
+ {0x8eb2,0xe361}, {0x8eb3,0xe362}, {0x8eb4,0xe363}, {0x8eb5,0xe364},
+ {0x8eb6,0xe365}, {0x8eb7,0xe366}, {0x8eb8,0xe367}, {0x8eb9,0xe368},
+ {0x8eba,0xe369}, {0x8ebb,0xe36a}, {0x8ebc,0xe36b}, {0x8ebd,0xe36c},
+ {0x8ebe,0xe36d}, {0x8ebf,0xe36e}, {0x8ec0,0xe36f}, {0x8ec1,0xe370},
+ {0x8ec2,0xe371}, {0x8ec3,0xe372}, {0x8ec4,0xe373}, {0x8ec5,0xe374},
+ {0x8ec6,0xe375}, {0x8ec7,0xe376}, {0x8ec8,0xe377}, {0x8ec9,0xe378},
+ {0x8eca,0xe379}, {0x8ecb,0xe37a}, {0x8ecc,0xe37b}, {0x8ecd,0xe37c},
+ {0x8ece,0xe37d}, {0x8ecf,0xe37e}, {0x8ed0,0xe37f}, {0x8ed1,0xe380},
+ {0x8ed2,0xe381}, {0x8ed3,0xe382}, {0x8ed4,0xe383}, {0x8ed5,0xe384},
+ {0x8ed6,0xe385}, {0x8ed7,0xe386}, {0x8ed8,0xe387}, {0x8ed9,0xe388},
+ {0x8eda,0xe389}, {0x8edb,0xe38a}, {0x8edc,0xe38b}, {0x8edd,0xe38c},
+ {0x8ede,0xe38d}, {0x8edf,0xe38e}, {0x8ee0,0xe38f}, {0x8ee1,0xe390},
+ {0x8ee2,0xe391}, {0x8ee3,0xe392}, {0x8ee4,0xe393}, {0x8ee5,0xe394},
+ {0x8ee6,0xe395}, {0x8ee7,0xe396}, {0x8ee8,0xe397}, {0x8ee9,0xe398},
+ {0x8eea,0xe399}, {0x8eeb,0xe39a}, {0x8eec,0xe39b}, {0x8eed,0xe39c},
+ {0x8eee,0xe39d}, {0x8eef,0xe39e}, {0x8ef0,0xe39f}, {0x8ef1,0xe3a0},
+ {0x8ef2,0xe3a1}, {0x8ef3,0xe3a2}, {0x8ef4,0xe3a3}, {0x8ef5,0xe3a4},
+ {0x8ef6,0xe3a5}, {0x8ef7,0xe3a6}, {0x8ef8,0xe3a7}, {0x8ef9,0xe3a8},
+ {0x8efa,0xe3a9}, {0x8efb,0xe3aa}, {0x8efc,0xe3ab}, {0x8efd,0xe3ac},
+ {0x8efe,0xe3ad}, {0x8f40,0xe3ae}, {0x8f41,0xe3af}, {0x8f42,0xe3b0},
+ {0x8f43,0xe3b1}, {0x8f44,0xe3b2}, {0x8f45,0xe3b3}, {0x8f46,0xe3b4},
+ {0x8f47,0xe3b5}, {0x8f48,0xe3b6}, {0x8f49,0xe3b7}, {0x8f4a,0xe3b8},
+ {0x8f4b,0xe3b9}, {0x8f4c,0xe3ba}, {0x8f4d,0xe3bb}, {0x8f4e,0xe3bc},
+ {0x8f4f,0xe3bd}, {0x8f50,0xe3be}, {0x8f51,0xe3bf}, {0x8f52,0xe3c0},
+ {0x8f53,0xe3c1}, {0x8f54,0xe3c2}, {0x8f55,0xe3c3}, {0x8f56,0xe3c4},
+ {0x8f57,0xe3c5}, {0x8f58,0xe3c6}, {0x8f59,0xe3c7}, {0x8f5a,0xe3c8},
+ {0x8f5b,0xe3c9}, {0x8f5c,0xe3ca}, {0x8f5d,0xe3cb}, {0x8f5e,0xe3cc},
+ {0x8f5f,0xe3cd}, {0x8f60,0xe3ce}, {0x8f61,0xe3cf}, {0x8f62,0xe3d0},
+ {0x8f63,0xe3d1}, {0x8f64,0xe3d2}, {0x8f65,0xe3d3}, {0x8f66,0xe3d4},
+ {0x8f67,0xe3d5}, {0x8f68,0xe3d6}, {0x8f69,0xe3d7}, {0x8f6a,0xe3d8},
+ {0x8f6b,0xe3d9}, {0x8f6c,0xe3da}, {0x8f6d,0xe3db}, {0x8f6e,0xe3dc},
+ {0x8f6f,0xe3dd}, {0x8f70,0xe3de}, {0x8f71,0xe3df}, {0x8f72,0xe3e0},
+ {0x8f73,0xe3e1}, {0x8f74,0xe3e2}, {0x8f75,0xe3e3}, {0x8f76,0xe3e4},
+ {0x8f77,0xe3e5}, {0x8f78,0xe3e6}, {0x8f79,0xe3e7}, {0x8f7a,0xe3e8},
+ {0x8f7b,0xe3e9}, {0x8f7c,0xe3ea}, {0x8f7d,0xe3eb}, {0x8f7e,0xe3ec},
+ {0x8fa1,0xe3ed}, {0x8fa2,0xe3ee}, {0x8fa3,0xe3ef}, {0x8fa4,0xe3f0},
+ {0x8fa5,0xe3f1}, {0x8fa6,0xe3f2}, {0x8fa7,0xe3f3}, {0x8fa8,0xe3f4},
+ {0x8fa9,0xe3f5}, {0x8faa,0xe3f6}, {0x8fab,0xe3f7}, {0x8fac,0xe3f8},
+ {0x8fad,0xe3f9}, {0x8fae,0xe3fa}, {0x8faf,0xe3fb}, {0x8fb0,0xe3fc},
+ {0x8fb1,0xe3fd}, {0x8fb2,0xe3fe}, {0x8fb3,0xe3ff}, {0x8fb4,0xe400},
+ {0x8fb5,0xe401}, {0x8fb6,0xe402}, {0x8fb7,0xe403}, {0x8fb8,0xe404},
+ {0x8fb9,0xe405}, {0x8fba,0xe406}, {0x8fbb,0xe407}, {0x8fbc,0xe408},
+ {0x8fbd,0xe409}, {0x8fbe,0xe40a}, {0x8fbf,0xe40b}, {0x8fc0,0xe40c},
+ {0x8fc1,0xe40d}, {0x8fc2,0xe40e}, {0x8fc3,0xe40f}, {0x8fc4,0xe410},
+ {0x8fc5,0xe411}, {0x8fc6,0xe412}, {0x8fc7,0xe413}, {0x8fc8,0xe414},
+ {0x8fc9,0xe415}, {0x8fca,0xe416}, {0x8fcb,0xe417}, {0x8fcc,0xe418},
+ {0x8fcd,0xe419}, {0x8fce,0xe41a}, {0x8fcf,0xe41b}, {0x8fd0,0xe41c},
+ {0x8fd1,0xe41d}, {0x8fd2,0xe41e}, {0x8fd3,0xe41f}, {0x8fd4,0xe420},
+ {0x8fd5,0xe421}, {0x8fd6,0xe422}, {0x8fd7,0xe423}, {0x8fd8,0xe424},
+ {0x8fd9,0xe425}, {0x8fda,0xe426}, {0x8fdb,0xe427}, {0x8fdc,0xe428},
+ {0x8fdd,0xe429}, {0x8fde,0xe42a}, {0x8fdf,0xe42b}, {0x8fe0,0xe42c},
+ {0x8fe1,0xe42d}, {0x8fe2,0xe42e}, {0x8fe3,0xe42f}, {0x8fe4,0xe430},
+ {0x8fe5,0xe431}, {0x8fe6,0xe432}, {0x8fe7,0xe433}, {0x8fe8,0xe434},
+ {0x8fe9,0xe435}, {0x8fea,0xe436}, {0x8feb,0xe437}, {0x8fec,0xe438},
+ {0x8fed,0xe439}, {0x8fee,0xe43a}, {0x8fef,0xe43b}, {0x8ff0,0xe43c},
+ {0x8ff1,0xe43d}, {0x8ff2,0xe43e}, {0x8ff3,0xe43f}, {0x8ff4,0xe440},
+ {0x8ff5,0xe441}, {0x8ff6,0xe442}, {0x8ff7,0xe443}, {0x8ff8,0xe444},
+ {0x8ff9,0xe445}, {0x8ffa,0xe446}, {0x8ffb,0xe447}, {0x8ffc,0xe448},
+ {0x8ffd,0xe449}, {0x8ffe,0xe44a}, {0x9040,0xe44b}, {0x9041,0xe44c},
+ {0x9042,0xe44d}, {0x9043,0xe44e}, {0x9044,0xe44f}, {0x9045,0xe450},
+ {0x9046,0xe451}, {0x9047,0xe452}, {0x9048,0xe453}, {0x9049,0xe454},
+ {0x904a,0xe455}, {0x904b,0xe456}, {0x904c,0xe457}, {0x904d,0xe458},
+ {0x904e,0xe459}, {0x904f,0xe45a}, {0x9050,0xe45b}, {0x9051,0xe45c},
+ {0x9052,0xe45d}, {0x9053,0xe45e}, {0x9054,0xe45f}, {0x9055,0xe460},
+ {0x9056,0xe461}, {0x9057,0xe462}, {0x9058,0xe463}, {0x9059,0xe464},
+ {0x905a,0xe465}, {0x905b,0xe466}, {0x905c,0xe467}, {0x905d,0xe468},
+ {0x905e,0xe469}, {0x905f,0xe46a}, {0x9060,0xe46b}, {0x9061,0xe46c},
+ {0x9062,0xe46d}, {0x9063,0xe46e}, {0x9064,0xe46f}, {0x9065,0xe470},
+ {0x9066,0xe471}, {0x9067,0xe472}, {0x9068,0xe473}, {0x9069,0xe474},
+ {0x906a,0xe475}, {0x906b,0xe476}, {0x906c,0xe477}, {0x906d,0xe478},
+ {0x906e,0xe479}, {0x906f,0xe47a}, {0x9070,0xe47b}, {0x9071,0xe47c},
+ {0x9072,0xe47d}, {0x9073,0xe47e}, {0x9074,0xe47f}, {0x9075,0xe480},
+ {0x9076,0xe481}, {0x9077,0xe482}, {0x9078,0xe483}, {0x9079,0xe484},
+ {0x907a,0xe485}, {0x907b,0xe486}, {0x907c,0xe487}, {0x907d,0xe488},
+ {0x907e,0xe489}, {0x90a1,0xe48a}, {0x90a2,0xe48b}, {0x90a3,0xe48c},
+ {0x90a4,0xe48d}, {0x90a5,0xe48e}, {0x90a6,0xe48f}, {0x90a7,0xe490},
+ {0x90a8,0xe491}, {0x90a9,0xe492}, {0x90aa,0xe493}, {0x90ab,0xe494},
+ {0x90ac,0xe495}, {0x90ad,0xe496}, {0x90ae,0xe497}, {0x90af,0xe498},
+ {0x90b0,0xe499}, {0x90b1,0xe49a}, {0x90b2,0xe49b}, {0x90b3,0xe49c},
+ {0x90b4,0xe49d}, {0x90b5,0xe49e}, {0x90b6,0xe49f}, {0x90b7,0xe4a0},
+ {0x90b8,0xe4a1}, {0x90b9,0xe4a2}, {0x90ba,0xe4a3}, {0x90bb,0xe4a4},
+ {0x90bc,0xe4a5}, {0x90bd,0xe4a6}, {0x90be,0xe4a7}, {0x90bf,0xe4a8},
+ {0x90c0,0xe4a9}, {0x90c1,0xe4aa}, {0x90c2,0xe4ab}, {0x90c3,0xe4ac},
+ {0x90c4,0xe4ad}, {0x90c5,0xe4ae}, {0x90c6,0xe4af}, {0x90c7,0xe4b0},
+ {0x90c8,0xe4b1}, {0x90c9,0xe4b2}, {0x90ca,0xe4b3}, {0x90cb,0xe4b4},
+ {0x90cc,0xe4b5}, {0x90cd,0xe4b6}, {0x90ce,0xe4b7}, {0x90cf,0xe4b8},
+ {0x90d0,0xe4b9}, {0x90d1,0xe4ba}, {0x90d2,0xe4bb}, {0x90d3,0xe4bc},
+ {0x90d4,0xe4bd}, {0x90d5,0xe4be}, {0x90d6,0xe4bf}, {0x90d7,0xe4c0},
+ {0x90d8,0xe4c1}, {0x90d9,0xe4c2}, {0x90da,0xe4c3}, {0x90db,0xe4c4},
+ {0x90dc,0xe4c5}, {0x90dd,0xe4c6}, {0x90de,0xe4c7}, {0x90df,0xe4c8},
+ {0x90e0,0xe4c9}, {0x90e1,0xe4ca}, {0x90e2,0xe4cb}, {0x90e3,0xe4cc},
+ {0x90e4,0xe4cd}, {0x90e5,0xe4ce}, {0x90e6,0xe4cf}, {0x90e7,0xe4d0},
+ {0x90e8,0xe4d1}, {0x90e9,0xe4d2}, {0x90ea,0xe4d3}, {0x90eb,0xe4d4},
+ {0x90ec,0xe4d5}, {0x90ed,0xe4d6}, {0x90ee,0xe4d7}, {0x90ef,0xe4d8},
+ {0x90f0,0xe4d9}, {0x90f1,0xe4da}, {0x90f2,0xe4db}, {0x90f3,0xe4dc},
+ {0x90f4,0xe4dd}, {0x90f5,0xe4de}, {0x90f6,0xe4df}, {0x90f7,0xe4e0},
+ {0x90f8,0xe4e1}, {0x90f9,0xe4e2}, {0x90fa,0xe4e3}, {0x90fb,0xe4e4},
+ {0x90fc,0xe4e5}, {0x90fd,0xe4e6}, {0x90fe,0xe4e7}, {0x9140,0xe4e8},
+ {0x9141,0xe4e9}, {0x9142,0xe4ea}, {0x9143,0xe4eb}, {0x9144,0xe4ec},
+ {0x9145,0xe4ed}, {0x9146,0xe4ee}, {0x9147,0xe4ef}, {0x9148,0xe4f0},
+ {0x9149,0xe4f1}, {0x914a,0xe4f2}, {0x914b,0xe4f3}, {0x914c,0xe4f4},
+ {0x914d,0xe4f5}, {0x914e,0xe4f6}, {0x914f,0xe4f7}, {0x9150,0xe4f8},
+ {0x9151,0xe4f9}, {0x9152,0xe4fa}, {0x9153,0xe4fb}, {0x9154,0xe4fc},
+ {0x9155,0xe4fd}, {0x9156,0xe4fe}, {0x9157,0xe4ff}, {0x9158,0xe500},
+ {0x9159,0xe501}, {0x915a,0xe502}, {0x915b,0xe503}, {0x915c,0xe504},
+ {0x915d,0xe505}, {0x915e,0xe506}, {0x915f,0xe507}, {0x9160,0xe508},
+ {0x9161,0xe509}, {0x9162,0xe50a}, {0x9163,0xe50b}, {0x9164,0xe50c},
+ {0x9165,0xe50d}, {0x9166,0xe50e}, {0x9167,0xe50f}, {0x9168,0xe510},
+ {0x9169,0xe511}, {0x916a,0xe512}, {0x916b,0xe513}, {0x916c,0xe514},
+ {0x916d,0xe515}, {0x916e,0xe516}, {0x916f,0xe517}, {0x9170,0xe518},
+ {0x9171,0xe519}, {0x9172,0xe51a}, {0x9173,0xe51b}, {0x9174,0xe51c},
+ {0x9175,0xe51d}, {0x9176,0xe51e}, {0x9177,0xe51f}, {0x9178,0xe520},
+ {0x9179,0xe521}, {0x917a,0xe522}, {0x917b,0xe523}, {0x917c,0xe524},
+ {0x917d,0xe525}, {0x917e,0xe526}, {0x91a1,0xe527}, {0x91a2,0xe528},
+ {0x91a3,0xe529}, {0x91a4,0xe52a}, {0x91a5,0xe52b}, {0x91a6,0xe52c},
+ {0x91a7,0xe52d}, {0x91a8,0xe52e}, {0x91a9,0xe52f}, {0x91aa,0xe530},
+ {0x91ab,0xe531}, {0x91ac,0xe532}, {0x91ad,0xe533}, {0x91ae,0xe534},
+ {0x91af,0xe535}, {0x91b0,0xe536}, {0x91b1,0xe537}, {0x91b2,0xe538},
+ {0x91b3,0xe539}, {0x91b4,0xe53a}, {0x91b5,0xe53b}, {0x91b6,0xe53c},
+ {0x91b7,0xe53d}, {0x91b8,0xe53e}, {0x91b9,0xe53f}, {0x91ba,0xe540},
+ {0x91bb,0xe541}, {0x91bc,0xe542}, {0x91bd,0xe543}, {0x91be,0xe544},
+ {0x91bf,0xe545}, {0x91c0,0xe546}, {0x91c1,0xe547}, {0x91c2,0xe548},
+ {0x91c3,0xe549}, {0x91c4,0xe54a}, {0x91c5,0xe54b}, {0x91c6,0xe54c},
+ {0x91c7,0xe54d}, {0x91c8,0xe54e}, {0x91c9,0xe54f}, {0x91ca,0xe550},
+ {0x91cb,0xe551}, {0x91cc,0xe552}, {0x91cd,0xe553}, {0x91ce,0xe554},
+ {0x91cf,0xe555}, {0x91d0,0xe556}, {0x91d1,0xe557}, {0x91d2,0xe558},
+ {0x91d3,0xe559}, {0x91d4,0xe55a}, {0x91d5,0xe55b}, {0x91d6,0xe55c},
+ {0x91d7,0xe55d}, {0x91d8,0xe55e}, {0x91d9,0xe55f}, {0x91da,0xe560},
+ {0x91db,0xe561}, {0x91dc,0xe562}, {0x91dd,0xe563}, {0x91de,0xe564},
+ {0x91df,0xe565}, {0x91e0,0xe566}, {0x91e1,0xe567}, {0x91e2,0xe568},
+ {0x91e3,0xe569}, {0x91e4,0xe56a}, {0x91e5,0xe56b}, {0x91e6,0xe56c},
+ {0x91e7,0xe56d}, {0x91e8,0xe56e}, {0x91e9,0xe56f}, {0x91ea,0xe570},
+ {0x91eb,0xe571}, {0x91ec,0xe572}, {0x91ed,0xe573}, {0x91ee,0xe574},
+ {0x91ef,0xe575}, {0x91f0,0xe576}, {0x91f1,0xe577}, {0x91f2,0xe578},
+ {0x91f3,0xe579}, {0x91f4,0xe57a}, {0x91f5,0xe57b}, {0x91f6,0xe57c},
+ {0x91f7,0xe57d}, {0x91f8,0xe57e}, {0x91f9,0xe57f}, {0x91fa,0xe580},
+ {0x91fb,0xe581}, {0x91fc,0xe582}, {0x91fd,0xe583}, {0x91fe,0xe584},
+ {0x9240,0xe585}, {0x9241,0xe586}, {0x9242,0xe587}, {0x9243,0xe588},
+ {0x9244,0xe589}, {0x9245,0xe58a}, {0x9246,0xe58b}, {0x9247,0xe58c},
+ {0x9248,0xe58d}, {0x9249,0xe58e}, {0x924a,0xe58f}, {0x924b,0xe590},
+ {0x924c,0xe591}, {0x924d,0xe592}, {0x924e,0xe593}, {0x924f,0xe594},
+ {0x9250,0xe595}, {0x9251,0xe596}, {0x9252,0xe597}, {0x9253,0xe598},
+ {0x9254,0xe599}, {0x9255,0xe59a}, {0x9256,0xe59b}, {0x9257,0xe59c},
+ {0x9258,0xe59d}, {0x9259,0xe59e}, {0x925a,0xe59f}, {0x925b,0xe5a0},
+ {0x925c,0xe5a1}, {0x925d,0xe5a2}, {0x925e,0xe5a3}, {0x925f,0xe5a4},
+ {0x9260,0xe5a5}, {0x9261,0xe5a6}, {0x9262,0xe5a7}, {0x9263,0xe5a8},
+ {0x9264,0xe5a9}, {0x9265,0xe5aa}, {0x9266,0xe5ab}, {0x9267,0xe5ac},
+ {0x9268,0xe5ad}, {0x9269,0xe5ae}, {0x926a,0xe5af}, {0x926b,0xe5b0},
+ {0x926c,0xe5b1}, {0x926d,0xe5b2}, {0x926e,0xe5b3}, {0x926f,0xe5b4},
+ {0x9270,0xe5b5}, {0x9271,0xe5b6}, {0x9272,0xe5b7}, {0x9273,0xe5b8},
+ {0x9274,0xe5b9}, {0x9275,0xe5ba}, {0x9276,0xe5bb}, {0x9277,0xe5bc},
+ {0x9278,0xe5bd}, {0x9279,0xe5be}, {0x927a,0xe5bf}, {0x927b,0xe5c0},
+ {0x927c,0xe5c1}, {0x927d,0xe5c2}, {0x927e,0xe5c3}, {0x92a1,0xe5c4},
+ {0x92a2,0xe5c5}, {0x92a3,0xe5c6}, {0x92a4,0xe5c7}, {0x92a5,0xe5c8},
+ {0x92a6,0xe5c9}, {0x92a7,0xe5ca}, {0x92a8,0xe5cb}, {0x92a9,0xe5cc},
+ {0x92aa,0xe5cd}, {0x92ab,0xe5ce}, {0x92ac,0xe5cf}, {0x92ad,0xe5d0},
+ {0x92ae,0xe5d1}, {0x92af,0xe5d2}, {0x92b0,0xe5d3}, {0x92b1,0xe5d4},
+ {0x92b2,0xe5d5}, {0x92b3,0xe5d6}, {0x92b4,0xe5d7}, {0x92b5,0xe5d8},
+ {0x92b6,0xe5d9}, {0x92b7,0xe5da}, {0x92b8,0xe5db}, {0x92b9,0xe5dc},
+ {0x92ba,0xe5dd}, {0x92bb,0xe5de}, {0x92bc,0xe5df}, {0x92bd,0xe5e0},
+ {0x92be,0xe5e1}, {0x92bf,0xe5e2}, {0x92c0,0xe5e3}, {0x92c1,0xe5e4},
+ {0x92c2,0xe5e5}, {0x92c3,0xe5e6}, {0x92c4,0xe5e7}, {0x92c5,0xe5e8},
+ {0x92c6,0xe5e9}, {0x92c7,0xe5ea}, {0x92c8,0xe5eb}, {0x92c9,0xe5ec},
+ {0x92ca,0xe5ed}, {0x92cb,0xe5ee}, {0x92cc,0xe5ef}, {0x92cd,0xe5f0},
+ {0x92ce,0xe5f1}, {0x92cf,0xe5f2}, {0x92d0,0xe5f3}, {0x92d1,0xe5f4},
+ {0x92d2,0xe5f5}, {0x92d3,0xe5f6}, {0x92d4,0xe5f7}, {0x92d5,0xe5f8},
+ {0x92d6,0xe5f9}, {0x92d7,0xe5fa}, {0x92d8,0xe5fb}, {0x92d9,0xe5fc},
+ {0x92da,0xe5fd}, {0x92db,0xe5fe}, {0x92dc,0xe5ff}, {0x92dd,0xe600},
+ {0x92de,0xe601}, {0x92df,0xe602}, {0x92e0,0xe603}, {0x92e1,0xe604},
+ {0x92e2,0xe605}, {0x92e3,0xe606}, {0x92e4,0xe607}, {0x92e5,0xe608},
+ {0x92e6,0xe609}, {0x92e7,0xe60a}, {0x92e8,0xe60b}, {0x92e9,0xe60c},
+ {0x92ea,0xe60d}, {0x92eb,0xe60e}, {0x92ec,0xe60f}, {0x92ed,0xe610},
+ {0x92ee,0xe611}, {0x92ef,0xe612}, {0x92f0,0xe613}, {0x92f1,0xe614},
+ {0x92f2,0xe615}, {0x92f3,0xe616}, {0x92f4,0xe617}, {0x92f5,0xe618},
+ {0x92f6,0xe619}, {0x92f7,0xe61a}, {0x92f8,0xe61b}, {0x92f9,0xe61c},
+ {0x92fa,0xe61d}, {0x92fb,0xe61e}, {0x92fc,0xe61f}, {0x92fd,0xe620},
+ {0x92fe,0xe621}, {0x9340,0xe622}, {0x9341,0xe623}, {0x9342,0xe624},
+ {0x9343,0xe625}, {0x9344,0xe626}, {0x9345,0xe627}, {0x9346,0xe628},
+ {0x9347,0xe629}, {0x9348,0xe62a}, {0x9349,0xe62b}, {0x934a,0xe62c},
+ {0x934b,0xe62d}, {0x934c,0xe62e}, {0x934d,0xe62f}, {0x934e,0xe630},
+ {0x934f,0xe631}, {0x9350,0xe632}, {0x9351,0xe633}, {0x9352,0xe634},
+ {0x9353,0xe635}, {0x9354,0xe636}, {0x9355,0xe637}, {0x9356,0xe638},
+ {0x9357,0xe639}, {0x9358,0xe63a}, {0x9359,0xe63b}, {0x935a,0xe63c},
+ {0x935b,0xe63d}, {0x935c,0xe63e}, {0x935d,0xe63f}, {0x935e,0xe640},
+ {0x935f,0xe641}, {0x9360,0xe642}, {0x9361,0xe643}, {0x9362,0xe644},
+ {0x9363,0xe645}, {0x9364,0xe646}, {0x9365,0xe647}, {0x9366,0xe648},
+ {0x9367,0xe649}, {0x9368,0xe64a}, {0x9369,0xe64b}, {0x936a,0xe64c},
+ {0x936b,0xe64d}, {0x936c,0xe64e}, {0x936d,0xe64f}, {0x936e,0xe650},
+ {0x936f,0xe651}, {0x9370,0xe652}, {0x9371,0xe653}, {0x9372,0xe654},
+ {0x9373,0xe655}, {0x9374,0xe656}, {0x9375,0xe657}, {0x9376,0xe658},
+ {0x9377,0xe659}, {0x9378,0xe65a}, {0x9379,0xe65b}, {0x937a,0xe65c},
+ {0x937b,0xe65d}, {0x937c,0xe65e}, {0x937d,0xe65f}, {0x937e,0xe660},
+ {0x93a1,0xe661}, {0x93a2,0xe662}, {0x93a3,0xe663}, {0x93a4,0xe664},
+ {0x93a5,0xe665}, {0x93a6,0xe666}, {0x93a7,0xe667}, {0x93a8,0xe668},
+ {0x93a9,0xe669}, {0x93aa,0xe66a}, {0x93ab,0xe66b}, {0x93ac,0xe66c},
+ {0x93ad,0xe66d}, {0x93ae,0xe66e}, {0x93af,0xe66f}, {0x93b0,0xe670},
+ {0x93b1,0xe671}, {0x93b2,0xe672}, {0x93b3,0xe673}, {0x93b4,0xe674},
+ {0x93b5,0xe675}, {0x93b6,0xe676}, {0x93b7,0xe677}, {0x93b8,0xe678},
+ {0x93b9,0xe679}, {0x93ba,0xe67a}, {0x93bb,0xe67b}, {0x93bc,0xe67c},
+ {0x93bd,0xe67d}, {0x93be,0xe67e}, {0x93bf,0xe67f}, {0x93c0,0xe680},
+ {0x93c1,0xe681}, {0x93c2,0xe682}, {0x93c3,0xe683}, {0x93c4,0xe684},
+ {0x93c5,0xe685}, {0x93c6,0xe686}, {0x93c7,0xe687}, {0x93c8,0xe688},
+ {0x93c9,0xe689}, {0x93ca,0xe68a}, {0x93cb,0xe68b}, {0x93cc,0xe68c},
+ {0x93cd,0xe68d}, {0x93ce,0xe68e}, {0x93cf,0xe68f}, {0x93d0,0xe690},
+ {0x93d1,0xe691}, {0x93d2,0xe692}, {0x93d3,0xe693}, {0x93d4,0xe694},
+ {0x93d5,0xe695}, {0x93d6,0xe696}, {0x93d7,0xe697}, {0x93d8,0xe698},
+ {0x93d9,0xe699}, {0x93da,0xe69a}, {0x93db,0xe69b}, {0x93dc,0xe69c},
+ {0x93dd,0xe69d}, {0x93de,0xe69e}, {0x93df,0xe69f}, {0x93e0,0xe6a0},
+ {0x93e1,0xe6a1}, {0x93e2,0xe6a2}, {0x93e3,0xe6a3}, {0x93e4,0xe6a4},
+ {0x93e5,0xe6a5}, {0x93e6,0xe6a6}, {0x93e7,0xe6a7}, {0x93e8,0xe6a8},
+ {0x93e9,0xe6a9}, {0x93ea,0xe6aa}, {0x93eb,0xe6ab}, {0x93ec,0xe6ac},
+ {0x93ed,0xe6ad}, {0x93ee,0xe6ae}, {0x93ef,0xe6af}, {0x93f0,0xe6b0},
+ {0x93f1,0xe6b1}, {0x93f2,0xe6b2}, {0x93f3,0xe6b3}, {0x93f4,0xe6b4},
+ {0x93f5,0xe6b5}, {0x93f6,0xe6b6}, {0x93f7,0xe6b7}, {0x93f8,0xe6b8},
+ {0x93f9,0xe6b9}, {0x93fa,0xe6ba}, {0x93fb,0xe6bb}, {0x93fc,0xe6bc},
+ {0x93fd,0xe6bd}, {0x93fe,0xe6be}, {0x9440,0xe6bf}, {0x9441,0xe6c0},
+ {0x9442,0xe6c1}, {0x9443,0xe6c2}, {0x9444,0xe6c3}, {0x9445,0xe6c4},
+ {0x9446,0xe6c5}, {0x9447,0xe6c6}, {0x9448,0xe6c7}, {0x9449,0xe6c8},
+ {0x944a,0xe6c9}, {0x944b,0xe6ca}, {0x944c,0xe6cb}, {0x944d,0xe6cc},
+ {0x944e,0xe6cd}, {0x944f,0xe6ce}, {0x9450,0xe6cf}, {0x9451,0xe6d0},
+ {0x9452,0xe6d1}, {0x9453,0xe6d2}, {0x9454,0xe6d3}, {0x9455,0xe6d4},
+ {0x9456,0xe6d5}, {0x9457,0xe6d6}, {0x9458,0xe6d7}, {0x9459,0xe6d8},
+ {0x945a,0xe6d9}, {0x945b,0xe6da}, {0x945c,0xe6db}, {0x945d,0xe6dc},
+ {0x945e,0xe6dd}, {0x945f,0xe6de}, {0x9460,0xe6df}, {0x9461,0xe6e0},
+ {0x9462,0xe6e1}, {0x9463,0xe6e2}, {0x9464,0xe6e3}, {0x9465,0xe6e4},
+ {0x9466,0xe6e5}, {0x9467,0xe6e6}, {0x9468,0xe6e7}, {0x9469,0xe6e8},
+ {0x946a,0xe6e9}, {0x946b,0xe6ea}, {0x946c,0xe6eb}, {0x946d,0xe6ec},
+ {0x946e,0xe6ed}, {0x946f,0xe6ee}, {0x9470,0xe6ef}, {0x9471,0xe6f0},
+ {0x9472,0xe6f1}, {0x9473,0xe6f2}, {0x9474,0xe6f3}, {0x9475,0xe6f4},
+ {0x9476,0xe6f5}, {0x9477,0xe6f6}, {0x9478,0xe6f7}, {0x9479,0xe6f8},
+ {0x947a,0xe6f9}, {0x947b,0xe6fa}, {0x947c,0xe6fb}, {0x947d,0xe6fc},
+ {0x947e,0xe6fd}, {0x94a1,0xe6fe}, {0x94a2,0xe6ff}, {0x94a3,0xe700},
+ {0x94a4,0xe701}, {0x94a5,0xe702}, {0x94a6,0xe703}, {0x94a7,0xe704},
+ {0x94a8,0xe705}, {0x94a9,0xe706}, {0x94aa,0xe707}, {0x94ab,0xe708},
+ {0x94ac,0xe709}, {0x94ad,0xe70a}, {0x94ae,0xe70b}, {0x94af,0xe70c},
+ {0x94b0,0xe70d}, {0x94b1,0xe70e}, {0x94b2,0xe70f}, {0x94b3,0xe710},
+ {0x94b4,0xe711}, {0x94b5,0xe712}, {0x94b6,0xe713}, {0x94b7,0xe714},
+ {0x94b8,0xe715}, {0x94b9,0xe716}, {0x94ba,0xe717}, {0x94bb,0xe718},
+ {0x94bc,0xe719}, {0x94bd,0xe71a}, {0x94be,0xe71b}, {0x94bf,0xe71c},
+ {0x94c0,0xe71d}, {0x94c1,0xe71e}, {0x94c2,0xe71f}, {0x94c3,0xe720},
+ {0x94c4,0xe721}, {0x94c5,0xe722}, {0x94c6,0xe723}, {0x94c7,0xe724},
+ {0x94c8,0xe725}, {0x94c9,0xe726}, {0x94ca,0xe727}, {0x94cb,0xe728},
+ {0x94cc,0xe729}, {0x94cd,0xe72a}, {0x94ce,0xe72b}, {0x94cf,0xe72c},
+ {0x94d0,0xe72d}, {0x94d1,0xe72e}, {0x94d2,0xe72f}, {0x94d3,0xe730},
+ {0x94d4,0xe731}, {0x94d5,0xe732}, {0x94d6,0xe733}, {0x94d7,0xe734},
+ {0x94d8,0xe735}, {0x94d9,0xe736}, {0x94da,0xe737}, {0x94db,0xe738},
+ {0x94dc,0xe739}, {0x94dd,0xe73a}, {0x94de,0xe73b}, {0x94df,0xe73c},
+ {0x94e0,0xe73d}, {0x94e1,0xe73e}, {0x94e2,0xe73f}, {0x94e3,0xe740},
+ {0x94e4,0xe741}, {0x94e5,0xe742}, {0x94e6,0xe743}, {0x94e7,0xe744},
+ {0x94e8,0xe745}, {0x94e9,0xe746}, {0x94ea,0xe747}, {0x94eb,0xe748},
+ {0x94ec,0xe749}, {0x94ed,0xe74a}, {0x94ee,0xe74b}, {0x94ef,0xe74c},
+ {0x94f0,0xe74d}, {0x94f1,0xe74e}, {0x94f2,0xe74f}, {0x94f3,0xe750},
+ {0x94f4,0xe751}, {0x94f5,0xe752}, {0x94f6,0xe753}, {0x94f7,0xe754},
+ {0x94f8,0xe755}, {0x94f9,0xe756}, {0x94fa,0xe757}, {0x94fb,0xe758},
+ {0x94fc,0xe759}, {0x94fd,0xe75a}, {0x94fe,0xe75b}, {0x9540,0xe75c},
+ {0x9541,0xe75d}, {0x9542,0xe75e}, {0x9543,0xe75f}, {0x9544,0xe760},
+ {0x9545,0xe761}, {0x9546,0xe762}, {0x9547,0xe763}, {0x9548,0xe764},
+ {0x9549,0xe765}, {0x954a,0xe766}, {0x954b,0xe767}, {0x954c,0xe768},
+ {0x954d,0xe769}, {0x954e,0xe76a}, {0x954f,0xe76b}, {0x9550,0xe76c},
+ {0x9551,0xe76d}, {0x9552,0xe76e}, {0x9553,0xe76f}, {0x9554,0xe770},
+ {0x9555,0xe771}, {0x9556,0xe772}, {0x9557,0xe773}, {0x9558,0xe774},
+ {0x9559,0xe775}, {0x955a,0xe776}, {0x955b,0xe777}, {0x955c,0xe778},
+ {0x955d,0xe779}, {0x955e,0xe77a}, {0x955f,0xe77b}, {0x9560,0xe77c},
+ {0x9561,0xe77d}, {0x9562,0xe77e}, {0x9563,0xe77f}, {0x9564,0xe780},
+ {0x9565,0xe781}, {0x9566,0xe782}, {0x9567,0xe783}, {0x9568,0xe784},
+ {0x9569,0xe785}, {0x956a,0xe786}, {0x956b,0xe787}, {0x956c,0xe788},
+ {0x956d,0xe789}, {0x956e,0xe78a}, {0x956f,0xe78b}, {0x9570,0xe78c},
+ {0x9571,0xe78d}, {0x9572,0xe78e}, {0x9573,0xe78f}, {0x9574,0xe790},
+ {0x9575,0xe791}, {0x9576,0xe792}, {0x9577,0xe793}, {0x9578,0xe794},
+ {0x9579,0xe795}, {0x957a,0xe796}, {0x957b,0xe797}, {0x957c,0xe798},
+ {0x957d,0xe799}, {0x957e,0xe79a}, {0x95a1,0xe79b}, {0x95a2,0xe79c},
+ {0x95a3,0xe79d}, {0x95a4,0xe79e}, {0x95a5,0xe79f}, {0x95a6,0xe7a0},
+ {0x95a7,0xe7a1}, {0x95a8,0xe7a2}, {0x95a9,0xe7a3}, {0x95aa,0xe7a4},
+ {0x95ab,0xe7a5}, {0x95ac,0xe7a6}, {0x95ad,0xe7a7}, {0x95ae,0xe7a8},
+ {0x95af,0xe7a9}, {0x95b0,0xe7aa}, {0x95b1,0xe7ab}, {0x95b2,0xe7ac},
+ {0x95b3,0xe7ad}, {0x95b4,0xe7ae}, {0x95b5,0xe7af}, {0x95b6,0xe7b0},
+ {0x95b7,0xe7b1}, {0x95b8,0xe7b2}, {0x95b9,0xe7b3}, {0x95ba,0xe7b4},
+ {0x95bb,0xe7b5}, {0x95bc,0xe7b6}, {0x95bd,0xe7b7}, {0x95be,0xe7b8},
+ {0x95bf,0xe7b9}, {0x95c0,0xe7ba}, {0x95c1,0xe7bb}, {0x95c2,0xe7bc},
+ {0x95c3,0xe7bd}, {0x95c4,0xe7be}, {0x95c5,0xe7bf}, {0x95c6,0xe7c0},
+ {0x95c7,0xe7c1}, {0x95c8,0xe7c2}, {0x95c9,0xe7c3}, {0x95ca,0xe7c4},
+ {0x95cb,0xe7c5}, {0x95cc,0xe7c6}, {0x95cd,0xe7c7}, {0x95ce,0xe7c8},
+ {0x95cf,0xe7c9}, {0x95d0,0xe7ca}, {0x95d1,0xe7cb}, {0x95d2,0xe7cc},
+ {0x95d3,0xe7cd}, {0x95d4,0xe7ce}, {0x95d5,0xe7cf}, {0x95d6,0xe7d0},
+ {0x95d7,0xe7d1}, {0x95d8,0xe7d2}, {0x95d9,0xe7d3}, {0x95da,0xe7d4},
+ {0x95db,0xe7d5}, {0x95dc,0xe7d6}, {0x95dd,0xe7d7}, {0x95de,0xe7d8},
+ {0x95df,0xe7d9}, {0x95e0,0xe7da}, {0x95e1,0xe7db}, {0x95e2,0xe7dc},
+ {0x95e3,0xe7dd}, {0x95e4,0xe7de}, {0x95e5,0xe7df}, {0x95e6,0xe7e0},
+ {0x95e7,0xe7e1}, {0x95e8,0xe7e2}, {0x95e9,0xe7e3}, {0x95ea,0xe7e4},
+ {0x95eb,0xe7e5}, {0x95ec,0xe7e6}, {0x95ed,0xe7e7}, {0x95ee,0xe7e8},
+ {0x95ef,0xe7e9}, {0x95f0,0xe7ea}, {0x95f1,0xe7eb}, {0x95f2,0xe7ec},
+ {0x95f3,0xe7ed}, {0x95f4,0xe7ee}, {0x95f5,0xe7ef}, {0x95f6,0xe7f0},
+ {0x95f7,0xe7f1}, {0x95f8,0xe7f2}, {0x95f9,0xe7f3}, {0x95fa,0xe7f4},
+ {0x95fb,0xe7f5}, {0x95fc,0xe7f6}, {0x95fd,0xe7f7}, {0x95fe,0xe7f8},
+ {0x9640,0xe7f9}, {0x9641,0xe7fa}, {0x9642,0xe7fb}, {0x9643,0xe7fc},
+ {0x9644,0xe7fd}, {0x9645,0xe7fe}, {0x9646,0xe7ff}, {0x9647,0xe800},
+ {0x9648,0xe801}, {0x9649,0xe802}, {0x964a,0xe803}, {0x964b,0xe804},
+ {0x964c,0xe805}, {0x964d,0xe806}, {0x964e,0xe807}, {0x964f,0xe808},
+ {0x9650,0xe809}, {0x9651,0xe80a}, {0x9652,0xe80b}, {0x9653,0xe80c},
+ {0x9654,0xe80d}, {0x9655,0xe80e}, {0x9656,0xe80f}, {0x9657,0xe810},
+ {0x9658,0xe811}, {0x9659,0xe812}, {0x965a,0xe813}, {0x965b,0xe814},
+ {0x965c,0xe815}, {0x965d,0xe816}, {0x965e,0xe817}, {0x965f,0xe818},
+ {0x9660,0xe819}, {0x9661,0xe81a}, {0x9662,0xe81b}, {0x9663,0xe81c},
+ {0x9664,0xe81d}, {0x9665,0xe81e}, {0x9666,0xe81f}, {0x9667,0xe820},
+ {0x9668,0xe821}, {0x9669,0xe822}, {0x966a,0xe823}, {0x966b,0xe824},
+ {0x966c,0xe825}, {0x966d,0xe826}, {0x966e,0xe827}, {0x966f,0xe828},
+ {0x9670,0xe829}, {0x9671,0xe82a}, {0x9672,0xe82b}, {0x9673,0xe82c},
+ {0x9674,0xe82d}, {0x9675,0xe82e}, {0x9676,0xe82f}, {0x9677,0xe830},
+ {0x9678,0xe831}, {0x9679,0xe832}, {0x967a,0xe833}, {0x967b,0xe834},
+ {0x967c,0xe835}, {0x967d,0xe836}, {0x967e,0xe837}, {0x96a1,0xe838},
+ {0x96a2,0xe839}, {0x96a3,0xe83a}, {0x96a4,0xe83b}, {0x96a5,0xe83c},
+ {0x96a6,0xe83d}, {0x96a7,0xe83e}, {0x96a8,0xe83f}, {0x96a9,0xe840},
+ {0x96aa,0xe841}, {0x96ab,0xe842}, {0x96ac,0xe843}, {0x96ad,0xe844},
+ {0x96ae,0xe845}, {0x96af,0xe846}, {0x96b0,0xe847}, {0x96b1,0xe848},
+ {0x96b2,0xe849}, {0x96b3,0xe84a}, {0x96b4,0xe84b}, {0x96b5,0xe84c},
+ {0x96b6,0xe84d}, {0x96b7,0xe84e}, {0x96b8,0xe84f}, {0x96b9,0xe850},
+ {0x96ba,0xe851}, {0x96bb,0xe852}, {0x96bc,0xe853}, {0x96bd,0xe854},
+ {0x96be,0xe855}, {0x96bf,0xe856}, {0x96c0,0xe857}, {0x96c1,0xe858},
+ {0x96c2,0xe859}, {0x96c3,0xe85a}, {0x96c4,0xe85b}, {0x96c5,0xe85c},
+ {0x96c6,0xe85d}, {0x96c7,0xe85e}, {0x96c8,0xe85f}, {0x96c9,0xe860},
+ {0x96ca,0xe861}, {0x96cb,0xe862}, {0x96cc,0xe863}, {0x96cd,0xe864},
+ {0x96ce,0xe865}, {0x96cf,0xe866}, {0x96d0,0xe867}, {0x96d1,0xe868},
+ {0x96d2,0xe869}, {0x96d3,0xe86a}, {0x96d4,0xe86b}, {0x96d5,0xe86c},
+ {0x96d6,0xe86d}, {0x96d7,0xe86e}, {0x96d8,0xe86f}, {0x96d9,0xe870},
+ {0x96da,0xe871}, {0x96db,0xe872}, {0x96dc,0xe873}, {0x96dd,0xe874},
+ {0x96de,0xe875}, {0x96df,0xe876}, {0x96e0,0xe877}, {0x96e1,0xe878},
+ {0x96e2,0xe879}, {0x96e3,0xe87a}, {0x96e4,0xe87b}, {0x96e5,0xe87c},
+ {0x96e6,0xe87d}, {0x96e7,0xe87e}, {0x96e8,0xe87f}, {0x96e9,0xe880},
+ {0x96ea,0xe881}, {0x96eb,0xe882}, {0x96ec,0xe883}, {0x96ed,0xe884},
+ {0x96ee,0xe885}, {0x96ef,0xe886}, {0x96f0,0xe887}, {0x96f1,0xe888},
+ {0x96f2,0xe889}, {0x96f3,0xe88a}, {0x96f4,0xe88b}, {0x96f5,0xe88c},
+ {0x96f6,0xe88d}, {0x96f7,0xe88e}, {0x96f8,0xe88f}, {0x96f9,0xe890},
+ {0x96fa,0xe891}, {0x96fb,0xe892}, {0x96fc,0xe893}, {0x96fd,0xe894},
+ {0x96fe,0xe895}, {0x9740,0xe896}, {0x9741,0xe897}, {0x9742,0xe898},
+ {0x9743,0xe899}, {0x9744,0xe89a}, {0x9745,0xe89b}, {0x9746,0xe89c},
+ {0x9747,0xe89d}, {0x9748,0xe89e}, {0x9749,0xe89f}, {0x974a,0xe8a0},
+ {0x974b,0xe8a1}, {0x974c,0xe8a2}, {0x974d,0xe8a3}, {0x974e,0xe8a4},
+ {0x974f,0xe8a5}, {0x9750,0xe8a6}, {0x9751,0xe8a7}, {0x9752,0xe8a8},
+ {0x9753,0xe8a9}, {0x9754,0xe8aa}, {0x9755,0xe8ab}, {0x9756,0xe8ac},
+ {0x9757,0xe8ad}, {0x9758,0xe8ae}, {0x9759,0xe8af}, {0x975a,0xe8b0},
+ {0x975b,0xe8b1}, {0x975c,0xe8b2}, {0x975d,0xe8b3}, {0x975e,0xe8b4},
+ {0x975f,0xe8b5}, {0x9760,0xe8b6}, {0x9761,0xe8b7}, {0x9762,0xe8b8},
+ {0x9763,0xe8b9}, {0x9764,0xe8ba}, {0x9765,0xe8bb}, {0x9766,0xe8bc},
+ {0x9767,0xe8bd}, {0x9768,0xe8be}, {0x9769,0xe8bf}, {0x976a,0xe8c0},
+ {0x976b,0xe8c1}, {0x976c,0xe8c2}, {0x976d,0xe8c3}, {0x976e,0xe8c4},
+ {0x976f,0xe8c5}, {0x9770,0xe8c6}, {0x9771,0xe8c7}, {0x9772,0xe8c8},
+ {0x9773,0xe8c9}, {0x9774,0xe8ca}, {0x9775,0xe8cb}, {0x9776,0xe8cc},
+ {0x9777,0xe8cd}, {0x9778,0xe8ce}, {0x9779,0xe8cf}, {0x977a,0xe8d0},
+ {0x977b,0xe8d1}, {0x977c,0xe8d2}, {0x977d,0xe8d3}, {0x977e,0xe8d4},
+ {0x97a1,0xe8d5}, {0x97a2,0xe8d6}, {0x97a3,0xe8d7}, {0x97a4,0xe8d8},
+ {0x97a5,0xe8d9}, {0x97a6,0xe8da}, {0x97a7,0xe8db}, {0x97a8,0xe8dc},
+ {0x97a9,0xe8dd}, {0x97aa,0xe8de}, {0x97ab,0xe8df}, {0x97ac,0xe8e0},
+ {0x97ad,0xe8e1}, {0x97ae,0xe8e2}, {0x97af,0xe8e3}, {0x97b0,0xe8e4},
+ {0x97b1,0xe8e5}, {0x97b2,0xe8e6}, {0x97b3,0xe8e7}, {0x97b4,0xe8e8},
+ {0x97b5,0xe8e9}, {0x97b6,0xe8ea}, {0x97b7,0xe8eb}, {0x97b8,0xe8ec},
+ {0x97b9,0xe8ed}, {0x97ba,0xe8ee}, {0x97bb,0xe8ef}, {0x97bc,0xe8f0},
+ {0x97bd,0xe8f1}, {0x97be,0xe8f2}, {0x97bf,0xe8f3}, {0x97c0,0xe8f4},
+ {0x97c1,0xe8f5}, {0x97c2,0xe8f6}, {0x97c3,0xe8f7}, {0x97c4,0xe8f8},
+ {0x97c5,0xe8f9}, {0x97c6,0xe8fa}, {0x97c7,0xe8fb}, {0x97c8,0xe8fc},
+ {0x97c9,0xe8fd}, {0x97ca,0xe8fe}, {0x97cb,0xe8ff}, {0x97cc,0xe900},
+ {0x97cd,0xe901}, {0x97ce,0xe902}, {0x97cf,0xe903}, {0x97d0,0xe904},
+ {0x97d1,0xe905}, {0x97d2,0xe906}, {0x97d3,0xe907}, {0x97d4,0xe908},
+ {0x97d5,0xe909}, {0x97d6,0xe90a}, {0x97d7,0xe90b}, {0x97d8,0xe90c},
+ {0x97d9,0xe90d}, {0x97da,0xe90e}, {0x97db,0xe90f}, {0x97dc,0xe910},
+ {0x97dd,0xe911}, {0x97de,0xe912}, {0x97df,0xe913}, {0x97e0,0xe914},
+ {0x97e1,0xe915}, {0x97e2,0xe916}, {0x97e3,0xe917}, {0x97e4,0xe918},
+ {0x97e5,0xe919}, {0x97e6,0xe91a}, {0x97e7,0xe91b}, {0x97e8,0xe91c},
+ {0x97e9,0xe91d}, {0x97ea,0xe91e}, {0x97eb,0xe91f}, {0x97ec,0xe920},
+ {0x97ed,0xe921}, {0x97ee,0xe922}, {0x97ef,0xe923}, {0x97f0,0xe924},
+ {0x97f1,0xe925}, {0x97f2,0xe926}, {0x97f3,0xe927}, {0x97f4,0xe928},
+ {0x97f5,0xe929}, {0x97f6,0xe92a}, {0x97f7,0xe92b}, {0x97f8,0xe92c},
+ {0x97f9,0xe92d}, {0x97fa,0xe92e}, {0x97fb,0xe92f}, {0x97fc,0xe930},
+ {0x97fd,0xe931}, {0x97fe,0xe932}, {0x9840,0xe933}, {0x9841,0xe934},
+ {0x9842,0xe935}, {0x9843,0xe936}, {0x9844,0xe937}, {0x9845,0xe938},
+ {0x9846,0xe939}, {0x9847,0xe93a}, {0x9848,0xe93b}, {0x9849,0xe93c},
+ {0x984a,0xe93d}, {0x984b,0xe93e}, {0x984c,0xe93f}, {0x984d,0xe940},
+ {0x984e,0xe941}, {0x984f,0xe942}, {0x9850,0xe943}, {0x9851,0xe944},
+ {0x9852,0xe945}, {0x9853,0xe946}, {0x9854,0xe947}, {0x9855,0xe948},
+ {0x9856,0xe949}, {0x9857,0xe94a}, {0x9858,0xe94b}, {0x9859,0xe94c},
+ {0x985a,0xe94d}, {0x985b,0xe94e}, {0x985c,0xe94f}, {0x985d,0xe950},
+ {0x985e,0xe951}, {0x985f,0xe952}, {0x9860,0xe953}, {0x9861,0xe954},
+ {0x9862,0xe955}, {0x9863,0xe956}, {0x9864,0xe957}, {0x9865,0xe958},
+ {0x9866,0xe959}, {0x9867,0xe95a}, {0x9868,0xe95b}, {0x9869,0xe95c},
+ {0x986a,0xe95d}, {0x986b,0xe95e}, {0x986c,0xe95f}, {0x986d,0xe960},
+ {0x986e,0xe961}, {0x986f,0xe962}, {0x9870,0xe963}, {0x9871,0xe964},
+ {0x9872,0xe965}, {0x9873,0xe966}, {0x9874,0xe967}, {0x9875,0xe968},
+ {0x9876,0xe969}, {0x9877,0xe96a}, {0x9878,0xe96b}, {0x9879,0xe96c},
+ {0x987a,0xe96d}, {0x987b,0xe96e}, {0x987c,0xe96f}, {0x987d,0xe970},
+ {0x987e,0xe971}, {0x98a1,0xe972}, {0x98a2,0xe973}, {0x98a3,0xe974},
+ {0x98a4,0xe975}, {0x98a5,0xe976}, {0x98a6,0xe977}, {0x98a7,0xe978},
+ {0x98a8,0xe979}, {0x98a9,0xe97a}, {0x98aa,0xe97b}, {0x98ab,0xe97c},
+ {0x98ac,0xe97d}, {0x98ad,0xe97e}, {0x98ae,0xe97f}, {0x98af,0xe980},
+ {0x98b0,0xe981}, {0x98b1,0xe982}, {0x98b2,0xe983}, {0x98b3,0xe984},
+ {0x98b4,0xe985}, {0x98b5,0xe986}, {0x98b6,0xe987}, {0x98b7,0xe988},
+ {0x98b8,0xe989}, {0x98b9,0xe98a}, {0x98ba,0xe98b}, {0x98bb,0xe98c},
+ {0x98bc,0xe98d}, {0x98bd,0xe98e}, {0x98be,0xe98f}, {0x98bf,0xe990},
+ {0x98c0,0xe991}, {0x98c1,0xe992}, {0x98c2,0xe993}, {0x98c3,0xe994},
+ {0x98c4,0xe995}, {0x98c5,0xe996}, {0x98c6,0xe997}, {0x98c7,0xe998},
+ {0x98c8,0xe999}, {0x98c9,0xe99a}, {0x98ca,0xe99b}, {0x98cb,0xe99c},
+ {0x98cc,0xe99d}, {0x98cd,0xe99e}, {0x98ce,0xe99f}, {0x98cf,0xe9a0},
+ {0x98d0,0xe9a1}, {0x98d1,0xe9a2}, {0x98d2,0xe9a3}, {0x98d3,0xe9a4},
+ {0x98d4,0xe9a5}, {0x98d5,0xe9a6}, {0x98d6,0xe9a7}, {0x98d7,0xe9a8},
+ {0x98d8,0xe9a9}, {0x98d9,0xe9aa}, {0x98da,0xe9ab}, {0x98db,0xe9ac},
+ {0x98dc,0xe9ad}, {0x98dd,0xe9ae}, {0x98de,0xe9af}, {0x98df,0xe9b0},
+ {0x98e0,0xe9b1}, {0x98e1,0xe9b2}, {0x98e2,0xe9b3}, {0x98e3,0xe9b4},
+ {0x98e4,0xe9b5}, {0x98e5,0xe9b6}, {0x98e6,0xe9b7}, {0x98e7,0xe9b8},
+ {0x98e8,0xe9b9}, {0x98e9,0xe9ba}, {0x98ea,0xe9bb}, {0x98eb,0xe9bc},
+ {0x98ec,0xe9bd}, {0x98ed,0xe9be}, {0x98ee,0xe9bf}, {0x98ef,0xe9c0},
+ {0x98f0,0xe9c1}, {0x98f1,0xe9c2}, {0x98f2,0xe9c3}, {0x98f3,0xe9c4},
+ {0x98f4,0xe9c5}, {0x98f5,0xe9c6}, {0x98f6,0xe9c7}, {0x98f7,0xe9c8},
+ {0x98f8,0xe9c9}, {0x98f9,0xe9ca}, {0x98fa,0xe9cb}, {0x98fb,0xe9cc},
+ {0x98fc,0xe9cd}, {0x98fd,0xe9ce}, {0x98fe,0xe9cf}, {0x9940,0xe9d0},
+ {0x9941,0xe9d1}, {0x9942,0xe9d2}, {0x9943,0xe9d3}, {0x9944,0xe9d4},
+ {0x9945,0xe9d5}, {0x9946,0xe9d6}, {0x9947,0xe9d7}, {0x9948,0xe9d8},
+ {0x9949,0xe9d9}, {0x994a,0xe9da}, {0x994b,0xe9db}, {0x994c,0xe9dc},
+ {0x994d,0xe9dd}, {0x994e,0xe9de}, {0x994f,0xe9df}, {0x9950,0xe9e0},
+ {0x9951,0xe9e1}, {0x9952,0xe9e2}, {0x9953,0xe9e3}, {0x9954,0xe9e4},
+ {0x9955,0xe9e5}, {0x9956,0xe9e6}, {0x9957,0xe9e7}, {0x9958,0xe9e8},
+ {0x9959,0xe9e9}, {0x995a,0xe9ea}, {0x995b,0xe9eb}, {0x995c,0xe9ec},
+ {0x995d,0xe9ed}, {0x995e,0xe9ee}, {0x995f,0xe9ef}, {0x9960,0xe9f0},
+ {0x9961,0xe9f1}, {0x9962,0xe9f2}, {0x9963,0xe9f3}, {0x9964,0xe9f4},
+ {0x9965,0xe9f5}, {0x9966,0xe9f6}, {0x9967,0xe9f7}, {0x9968,0xe9f8},
+ {0x9969,0xe9f9}, {0x996a,0xe9fa}, {0x996b,0xe9fb}, {0x996c,0xe9fc},
+ {0x996d,0xe9fd}, {0x996e,0xe9fe}, {0x996f,0xe9ff}, {0x9970,0xea00},
+ {0x9971,0xea01}, {0x9972,0xea02}, {0x9973,0xea03}, {0x9974,0xea04},
+ {0x9975,0xea05}, {0x9976,0xea06}, {0x9977,0xea07}, {0x9978,0xea08},
+ {0x9979,0xea09}, {0x997a,0xea0a}, {0x997b,0xea0b}, {0x997c,0xea0c},
+ {0x997d,0xea0d}, {0x997e,0xea0e}, {0x99a1,0xea0f}, {0x99a2,0xea10},
+ {0x99a3,0xea11}, {0x99a4,0xea12}, {0x99a5,0xea13}, {0x99a6,0xea14},
+ {0x99a7,0xea15}, {0x99a8,0xea16}, {0x99a9,0xea17}, {0x99aa,0xea18},
+ {0x99ab,0xea19}, {0x99ac,0xea1a}, {0x99ad,0xea1b}, {0x99ae,0xea1c},
+ {0x99af,0xea1d}, {0x99b0,0xea1e}, {0x99b1,0xea1f}, {0x99b2,0xea20},
+ {0x99b3,0xea21}, {0x99b4,0xea22}, {0x99b5,0xea23}, {0x99b6,0xea24},
+ {0x99b7,0xea25}, {0x99b8,0xea26}, {0x99b9,0xea27}, {0x99ba,0xea28},
+ {0x99bb,0xea29}, {0x99bc,0xea2a}, {0x99bd,0xea2b}, {0x99be,0xea2c},
+ {0x99bf,0xea2d}, {0x99c0,0xea2e}, {0x99c1,0xea2f}, {0x99c2,0xea30},
+ {0x99c3,0xea31}, {0x99c4,0xea32}, {0x99c5,0xea33}, {0x99c6,0xea34},
+ {0x99c7,0xea35}, {0x99c8,0xea36}, {0x99c9,0xea37}, {0x99ca,0xea38},
+ {0x99cb,0xea39}, {0x99cc,0xea3a}, {0x99cd,0xea3b}, {0x99ce,0xea3c},
+ {0x99cf,0xea3d}, {0x99d0,0xea3e}, {0x99d1,0xea3f}, {0x99d2,0xea40},
+ {0x99d3,0xea41}, {0x99d4,0xea42}, {0x99d5,0xea43}, {0x99d6,0xea44},
+ {0x99d7,0xea45}, {0x99d8,0xea46}, {0x99d9,0xea47}, {0x99da,0xea48},
+ {0x99db,0xea49}, {0x99dc,0xea4a}, {0x99dd,0xea4b}, {0x99de,0xea4c},
+ {0x99df,0xea4d}, {0x99e0,0xea4e}, {0x99e1,0xea4f}, {0x99e2,0xea50},
+ {0x99e3,0xea51}, {0x99e4,0xea52}, {0x99e5,0xea53}, {0x99e6,0xea54},
+ {0x99e7,0xea55}, {0x99e8,0xea56}, {0x99e9,0xea57}, {0x99ea,0xea58},
+ {0x99eb,0xea59}, {0x99ec,0xea5a}, {0x99ed,0xea5b}, {0x99ee,0xea5c},
+ {0x99ef,0xea5d}, {0x99f0,0xea5e}, {0x99f1,0xea5f}, {0x99f2,0xea60},
+ {0x99f3,0xea61}, {0x99f4,0xea62}, {0x99f5,0xea63}, {0x99f6,0xea64},
+ {0x99f7,0xea65}, {0x99f8,0xea66}, {0x99f9,0xea67}, {0x99fa,0xea68},
+ {0x99fb,0xea69}, {0x99fc,0xea6a}, {0x99fd,0xea6b}, {0x99fe,0xea6c},
+ {0x9a40,0xea6d}, {0x9a41,0xea6e}, {0x9a42,0xea6f}, {0x9a43,0xea70},
+ {0x9a44,0xea71}, {0x9a45,0xea72}, {0x9a46,0xea73}, {0x9a47,0xea74},
+ {0x9a48,0xea75}, {0x9a49,0xea76}, {0x9a4a,0xea77}, {0x9a4b,0xea78},
+ {0x9a4c,0xea79}, {0x9a4d,0xea7a}, {0x9a4e,0xea7b}, {0x9a4f,0xea7c},
+ {0x9a50,0xea7d}, {0x9a51,0xea7e}, {0x9a52,0xea7f}, {0x9a53,0xea80},
+ {0x9a54,0xea81}, {0x9a55,0xea82}, {0x9a56,0xea83}, {0x9a57,0xea84},
+ {0x9a58,0xea85}, {0x9a59,0xea86}, {0x9a5a,0xea87}, {0x9a5b,0xea88},
+ {0x9a5c,0xea89}, {0x9a5d,0xea8a}, {0x9a5e,0xea8b}, {0x9a5f,0xea8c},
+ {0x9a60,0xea8d}, {0x9a61,0xea8e}, {0x9a62,0xea8f}, {0x9a63,0xea90},
+ {0x9a64,0xea91}, {0x9a65,0xea92}, {0x9a66,0xea93}, {0x9a67,0xea94},
+ {0x9a68,0xea95}, {0x9a69,0xea96}, {0x9a6a,0xea97}, {0x9a6b,0xea98},
+ {0x9a6c,0xea99}, {0x9a6d,0xea9a}, {0x9a6e,0xea9b}, {0x9a6f,0xea9c},
+ {0x9a70,0xea9d}, {0x9a71,0xea9e}, {0x9a72,0xea9f}, {0x9a73,0xeaa0},
+ {0x9a74,0xeaa1}, {0x9a75,0xeaa2}, {0x9a76,0xeaa3}, {0x9a77,0xeaa4},
+ {0x9a78,0xeaa5}, {0x9a79,0xeaa6}, {0x9a7a,0xeaa7}, {0x9a7b,0xeaa8},
+ {0x9a7c,0xeaa9}, {0x9a7d,0xeaaa}, {0x9a7e,0xeaab}, {0x9aa1,0xeaac},
+ {0x9aa2,0xeaad}, {0x9aa3,0xeaae}, {0x9aa4,0xeaaf}, {0x9aa5,0xeab0},
+ {0x9aa6,0xeab1}, {0x9aa7,0xeab2}, {0x9aa8,0xeab3}, {0x9aa9,0xeab4},
+ {0x9aaa,0xeab5}, {0x9aab,0xeab6}, {0x9aac,0xeab7}, {0x9aad,0xeab8},
+ {0x9aae,0xeab9}, {0x9aaf,0xeaba}, {0x9ab0,0xeabb}, {0x9ab1,0xeabc},
+ {0x9ab2,0xeabd}, {0x9ab3,0xeabe}, {0x9ab4,0xeabf}, {0x9ab5,0xeac0},
+ {0x9ab6,0xeac1}, {0x9ab7,0xeac2}, {0x9ab8,0xeac3}, {0x9ab9,0xeac4},
+ {0x9aba,0xeac5}, {0x9abb,0xeac6}, {0x9abc,0xeac7}, {0x9abd,0xeac8},
+ {0x9abe,0xeac9}, {0x9abf,0xeaca}, {0x9ac0,0xeacb}, {0x9ac1,0xeacc},
+ {0x9ac2,0xeacd}, {0x9ac3,0xeace}, {0x9ac4,0xeacf}, {0x9ac5,0xead0},
+ {0x9ac6,0xead1}, {0x9ac7,0xead2}, {0x9ac8,0xead3}, {0x9ac9,0xead4},
+ {0x9aca,0xead5}, {0x9acb,0xead6}, {0x9acc,0xead7}, {0x9acd,0xead8},
+ {0x9ace,0xead9}, {0x9acf,0xeada}, {0x9ad0,0xeadb}, {0x9ad1,0xeadc},
+ {0x9ad2,0xeadd}, {0x9ad3,0xeade}, {0x9ad4,0xeadf}, {0x9ad5,0xeae0},
+ {0x9ad6,0xeae1}, {0x9ad7,0xeae2}, {0x9ad8,0xeae3}, {0x9ad9,0xeae4},
+ {0x9ada,0xeae5}, {0x9adb,0xeae6}, {0x9adc,0xeae7}, {0x9add,0xeae8},
+ {0x9ade,0xeae9}, {0x9adf,0xeaea}, {0x9ae0,0xeaeb}, {0x9ae1,0xeaec},
+ {0x9ae2,0xeaed}, {0x9ae3,0xeaee}, {0x9ae4,0xeaef}, {0x9ae5,0xeaf0},
+ {0x9ae6,0xeaf1}, {0x9ae7,0xeaf2}, {0x9ae8,0xeaf3}, {0x9ae9,0xeaf4},
+ {0x9aea,0xeaf5}, {0x9aeb,0xeaf6}, {0x9aec,0xeaf7}, {0x9aed,0xeaf8},
+ {0x9aee,0xeaf9}, {0x9aef,0xeafa}, {0x9af0,0xeafb}, {0x9af1,0xeafc},
+ {0x9af2,0xeafd}, {0x9af3,0xeafe}, {0x9af4,0xeaff}, {0x9af5,0xeb00},
+ {0x9af6,0xeb01}, {0x9af7,0xeb02}, {0x9af8,0xeb03}, {0x9af9,0xeb04},
+ {0x9afa,0xeb05}, {0x9afb,0xeb06}, {0x9afc,0xeb07}, {0x9afd,0xeb08},
+ {0x9afe,0xeb09}, {0x9b40,0xeb0a}, {0x9b41,0xeb0b}, {0x9b42,0xeb0c},
+ {0x9b43,0xeb0d}, {0x9b44,0xeb0e}, {0x9b45,0xeb0f}, {0x9b46,0xeb10},
+ {0x9b47,0xeb11}, {0x9b48,0xeb12}, {0x9b49,0xeb13}, {0x9b4a,0xeb14},
+ {0x9b4b,0xeb15}, {0x9b4c,0xeb16}, {0x9b4d,0xeb17}, {0x9b4e,0xeb18},
+ {0x9b4f,0xeb19}, {0x9b50,0xeb1a}, {0x9b51,0xeb1b}, {0x9b52,0xeb1c},
+ {0x9b53,0xeb1d}, {0x9b54,0xeb1e}, {0x9b55,0xeb1f}, {0x9b56,0xeb20},
+ {0x9b57,0xeb21}, {0x9b58,0xeb22}, {0x9b59,0xeb23}, {0x9b5a,0xeb24},
+ {0x9b5b,0xeb25}, {0x9b5c,0xeb26}, {0x9b5d,0xeb27}, {0x9b5e,0xeb28},
+ {0x9b5f,0xeb29}, {0x9b60,0xeb2a}, {0x9b61,0xeb2b}, {0x9b62,0xeb2c},
+ {0x9b63,0xeb2d}, {0x9b64,0xeb2e}, {0x9b65,0xeb2f}, {0x9b66,0xeb30},
+ {0x9b67,0xeb31}, {0x9b68,0xeb32}, {0x9b69,0xeb33}, {0x9b6a,0xeb34},
+ {0x9b6b,0xeb35}, {0x9b6c,0xeb36}, {0x9b6d,0xeb37}, {0x9b6e,0xeb38},
+ {0x9b6f,0xeb39}, {0x9b70,0xeb3a}, {0x9b71,0xeb3b}, {0x9b72,0xeb3c},
+ {0x9b73,0xeb3d}, {0x9b74,0xeb3e}, {0x9b75,0xeb3f}, {0x9b76,0xeb40},
+ {0x9b77,0xeb41}, {0x9b78,0xeb42}, {0x9b79,0xeb43}, {0x9b7a,0xeb44},
+ {0x9b7b,0xeb45}, {0x9b7c,0xeb46}, {0x9b7d,0xeb47}, {0x9b7e,0xeb48},
+ {0x9ba1,0xeb49}, {0x9ba2,0xeb4a}, {0x9ba3,0xeb4b}, {0x9ba4,0xeb4c},
+ {0x9ba5,0xeb4d}, {0x9ba6,0xeb4e}, {0x9ba7,0xeb4f}, {0x9ba8,0xeb50},
+ {0x9ba9,0xeb51}, {0x9baa,0xeb52}, {0x9bab,0xeb53}, {0x9bac,0xeb54},
+ {0x9bad,0xeb55}, {0x9bae,0xeb56}, {0x9baf,0xeb57}, {0x9bb0,0xeb58},
+ {0x9bb1,0xeb59}, {0x9bb2,0xeb5a}, {0x9bb3,0xeb5b}, {0x9bb4,0xeb5c},
+ {0x9bb5,0xeb5d}, {0x9bb6,0xeb5e}, {0x9bb7,0xeb5f}, {0x9bb8,0xeb60},
+ {0x9bb9,0xeb61}, {0x9bba,0xeb62}, {0x9bbb,0xeb63}, {0x9bbc,0xeb64},
+ {0x9bbd,0xeb65}, {0x9bbe,0xeb66}, {0x9bbf,0xeb67}, {0x9bc0,0xeb68},
+ {0x9bc1,0xeb69}, {0x9bc2,0xeb6a}, {0x9bc3,0xeb6b}, {0x9bc4,0xeb6c},
+ {0x9bc5,0xeb6d}, {0x9bc6,0xeb6e}, {0x9bc7,0xeb6f}, {0x9bc8,0xeb70},
+ {0x9bc9,0xeb71}, {0x9bca,0xeb72}, {0x9bcb,0xeb73}, {0x9bcc,0xeb74},
+ {0x9bcd,0xeb75}, {0x9bce,0xeb76}, {0x9bcf,0xeb77}, {0x9bd0,0xeb78},
+ {0x9bd1,0xeb79}, {0x9bd2,0xeb7a}, {0x9bd3,0xeb7b}, {0x9bd4,0xeb7c},
+ {0x9bd5,0xeb7d}, {0x9bd6,0xeb7e}, {0x9bd7,0xeb7f}, {0x9bd8,0xeb80},
+ {0x9bd9,0xeb81}, {0x9bda,0xeb82}, {0x9bdb,0xeb83}, {0x9bdc,0xeb84},
+ {0x9bdd,0xeb85}, {0x9bde,0xeb86}, {0x9bdf,0xeb87}, {0x9be0,0xeb88},
+ {0x9be1,0xeb89}, {0x9be2,0xeb8a}, {0x9be3,0xeb8b}, {0x9be4,0xeb8c},
+ {0x9be5,0xeb8d}, {0x9be6,0xeb8e}, {0x9be7,0xeb8f}, {0x9be8,0xeb90},
+ {0x9be9,0xeb91}, {0x9bea,0xeb92}, {0x9beb,0xeb93}, {0x9bec,0xeb94},
+ {0x9bed,0xeb95}, {0x9bee,0xeb96}, {0x9bef,0xeb97}, {0x9bf0,0xeb98},
+ {0x9bf1,0xeb99}, {0x9bf2,0xeb9a}, {0x9bf3,0xeb9b}, {0x9bf4,0xeb9c},
+ {0x9bf5,0xeb9d}, {0x9bf6,0xeb9e}, {0x9bf7,0xeb9f}, {0x9bf8,0xeba0},
+ {0x9bf9,0xeba1}, {0x9bfa,0xeba2}, {0x9bfb,0xeba3}, {0x9bfc,0xeba4},
+ {0x9bfd,0xeba5}, {0x9bfe,0xeba6}, {0x9c40,0xeba7}, {0x9c41,0xeba8},
+ {0x9c42,0xeba9}, {0x9c43,0xebaa}, {0x9c44,0xebab}, {0x9c45,0xebac},
+ {0x9c46,0xebad}, {0x9c47,0xebae}, {0x9c48,0xebaf}, {0x9c49,0xebb0},
+ {0x9c4a,0xebb1}, {0x9c4b,0xebb2}, {0x9c4c,0xebb3}, {0x9c4d,0xebb4},
+ {0x9c4e,0xebb5}, {0x9c4f,0xebb6}, {0x9c50,0xebb7}, {0x9c51,0xebb8},
+ {0x9c52,0xebb9}, {0x9c53,0xebba}, {0x9c54,0xebbb}, {0x9c55,0xebbc},
+ {0x9c56,0xebbd}, {0x9c57,0xebbe}, {0x9c58,0xebbf}, {0x9c59,0xebc0},
+ {0x9c5a,0xebc1}, {0x9c5b,0xebc2}, {0x9c5c,0xebc3}, {0x9c5d,0xebc4},
+ {0x9c5e,0xebc5}, {0x9c5f,0xebc6}, {0x9c60,0xebc7}, {0x9c61,0xebc8},
+ {0x9c62,0xebc9}, {0x9c63,0xebca}, {0x9c64,0xebcb}, {0x9c65,0xebcc},
+ {0x9c66,0xebcd}, {0x9c67,0xebce}, {0x9c68,0xebcf}, {0x9c69,0xebd0},
+ {0x9c6a,0xebd1}, {0x9c6b,0xebd2}, {0x9c6c,0xebd3}, {0x9c6d,0xebd4},
+ {0x9c6e,0xebd5}, {0x9c6f,0xebd6}, {0x9c70,0xebd7}, {0x9c71,0xebd8},
+ {0x9c72,0xebd9}, {0x9c73,0xebda}, {0x9c74,0xebdb}, {0x9c75,0xebdc},
+ {0x9c76,0xebdd}, {0x9c77,0xebde}, {0x9c78,0xebdf}, {0x9c79,0xebe0},
+ {0x9c7a,0xebe1}, {0x9c7b,0xebe2}, {0x9c7c,0xebe3}, {0x9c7d,0xebe4},
+ {0x9c7e,0xebe5}, {0x9ca1,0xebe6}, {0x9ca2,0xebe7}, {0x9ca3,0xebe8},
+ {0x9ca4,0xebe9}, {0x9ca5,0xebea}, {0x9ca6,0xebeb}, {0x9ca7,0xebec},
+ {0x9ca8,0xebed}, {0x9ca9,0xebee}, {0x9caa,0xebef}, {0x9cab,0xebf0},
+ {0x9cac,0xebf1}, {0x9cad,0xebf2}, {0x9cae,0xebf3}, {0x9caf,0xebf4},
+ {0x9cb0,0xebf5}, {0x9cb1,0xebf6}, {0x9cb2,0xebf7}, {0x9cb3,0xebf8},
+ {0x9cb4,0xebf9}, {0x9cb5,0xebfa}, {0x9cb6,0xebfb}, {0x9cb7,0xebfc},
+ {0x9cb8,0xebfd}, {0x9cb9,0xebfe}, {0x9cba,0xebff}, {0x9cbb,0xec00},
+ {0x9cbc,0xec01}, {0x9cbd,0xec02}, {0x9cbe,0xec03}, {0x9cbf,0xec04},
+ {0x9cc0,0xec05}, {0x9cc1,0xec06}, {0x9cc2,0xec07}, {0x9cc3,0xec08},
+ {0x9cc4,0xec09}, {0x9cc5,0xec0a}, {0x9cc6,0xec0b}, {0x9cc7,0xec0c},
+ {0x9cc8,0xec0d}, {0x9cc9,0xec0e}, {0x9cca,0xec0f}, {0x9ccb,0xec10},
+ {0x9ccc,0xec11}, {0x9ccd,0xec12}, {0x9cce,0xec13}, {0x9ccf,0xec14},
+ {0x9cd0,0xec15}, {0x9cd1,0xec16}, {0x9cd2,0xec17}, {0x9cd3,0xec18},
+ {0x9cd4,0xec19}, {0x9cd5,0xec1a}, {0x9cd6,0xec1b}, {0x9cd7,0xec1c},
+ {0x9cd8,0xec1d}, {0x9cd9,0xec1e}, {0x9cda,0xec1f}, {0x9cdb,0xec20},
+ {0x9cdc,0xec21}, {0x9cdd,0xec22}, {0x9cde,0xec23}, {0x9cdf,0xec24},
+ {0x9ce0,0xec25}, {0x9ce1,0xec26}, {0x9ce2,0xec27}, {0x9ce3,0xec28},
+ {0x9ce4,0xec29}, {0x9ce5,0xec2a}, {0x9ce6,0xec2b}, {0x9ce7,0xec2c},
+ {0x9ce8,0xec2d}, {0x9ce9,0xec2e}, {0x9cea,0xec2f}, {0x9ceb,0xec30},
+ {0x9cec,0xec31}, {0x9ced,0xec32}, {0x9cee,0xec33}, {0x9cef,0xec34},
+ {0x9cf0,0xec35}, {0x9cf1,0xec36}, {0x9cf2,0xec37}, {0x9cf3,0xec38},
+ {0x9cf4,0xec39}, {0x9cf5,0xec3a}, {0x9cf6,0xec3b}, {0x9cf7,0xec3c},
+ {0x9cf8,0xec3d}, {0x9cf9,0xec3e}, {0x9cfa,0xec3f}, {0x9cfb,0xec40},
+ {0x9cfc,0xec41}, {0x9cfd,0xec42}, {0x9cfe,0xec43}, {0x9d40,0xec44},
+ {0x9d41,0xec45}, {0x9d42,0xec46}, {0x9d43,0xec47}, {0x9d44,0xec48},
+ {0x9d45,0xec49}, {0x9d46,0xec4a}, {0x9d47,0xec4b}, {0x9d48,0xec4c},
+ {0x9d49,0xec4d}, {0x9d4a,0xec4e}, {0x9d4b,0xec4f}, {0x9d4c,0xec50},
+ {0x9d4d,0xec51}, {0x9d4e,0xec52}, {0x9d4f,0xec53}, {0x9d50,0xec54},
+ {0x9d51,0xec55}, {0x9d52,0xec56}, {0x9d53,0xec57}, {0x9d54,0xec58},
+ {0x9d55,0xec59}, {0x9d56,0xec5a}, {0x9d57,0xec5b}, {0x9d58,0xec5c},
+ {0x9d59,0xec5d}, {0x9d5a,0xec5e}, {0x9d5b,0xec5f}, {0x9d5c,0xec60},
+ {0x9d5d,0xec61}, {0x9d5e,0xec62}, {0x9d5f,0xec63}, {0x9d60,0xec64},
+ {0x9d61,0xec65}, {0x9d62,0xec66}, {0x9d63,0xec67}, {0x9d64,0xec68},
+ {0x9d65,0xec69}, {0x9d66,0xec6a}, {0x9d67,0xec6b}, {0x9d68,0xec6c},
+ {0x9d69,0xec6d}, {0x9d6a,0xec6e}, {0x9d6b,0xec6f}, {0x9d6c,0xec70},
+ {0x9d6d,0xec71}, {0x9d6e,0xec72}, {0x9d6f,0xec73}, {0x9d70,0xec74},
+ {0x9d71,0xec75}, {0x9d72,0xec76}, {0x9d73,0xec77}, {0x9d74,0xec78},
+ {0x9d75,0xec79}, {0x9d76,0xec7a}, {0x9d77,0xec7b}, {0x9d78,0xec7c},
+ {0x9d79,0xec7d}, {0x9d7a,0xec7e}, {0x9d7b,0xec7f}, {0x9d7c,0xec80},
+ {0x9d7d,0xec81}, {0x9d7e,0xec82}, {0x9da1,0xec83}, {0x9da2,0xec84},
+ {0x9da3,0xec85}, {0x9da4,0xec86}, {0x9da5,0xec87}, {0x9da6,0xec88},
+ {0x9da7,0xec89}, {0x9da8,0xec8a}, {0x9da9,0xec8b}, {0x9daa,0xec8c},
+ {0x9dab,0xec8d}, {0x9dac,0xec8e}, {0x9dad,0xec8f}, {0x9dae,0xec90},
+ {0x9daf,0xec91}, {0x9db0,0xec92}, {0x9db1,0xec93}, {0x9db2,0xec94},
+ {0x9db3,0xec95}, {0x9db4,0xec96}, {0x9db5,0xec97}, {0x9db6,0xec98},
+ {0x9db7,0xec99}, {0x9db8,0xec9a}, {0x9db9,0xec9b}, {0x9dba,0xec9c},
+ {0x9dbb,0xec9d}, {0x9dbc,0xec9e}, {0x9dbd,0xec9f}, {0x9dbe,0xeca0},
+ {0x9dbf,0xeca1}, {0x9dc0,0xeca2}, {0x9dc1,0xeca3}, {0x9dc2,0xeca4},
+ {0x9dc3,0xeca5}, {0x9dc4,0xeca6}, {0x9dc5,0xeca7}, {0x9dc6,0xeca8},
+ {0x9dc7,0xeca9}, {0x9dc8,0xecaa}, {0x9dc9,0xecab}, {0x9dca,0xecac},
+ {0x9dcb,0xecad}, {0x9dcc,0xecae}, {0x9dcd,0xecaf}, {0x9dce,0xecb0},
+ {0x9dcf,0xecb1}, {0x9dd0,0xecb2}, {0x9dd1,0xecb3}, {0x9dd2,0xecb4},
+ {0x9dd3,0xecb5}, {0x9dd4,0xecb6}, {0x9dd5,0xecb7}, {0x9dd6,0xecb8},
+ {0x9dd7,0xecb9}, {0x9dd8,0xecba}, {0x9dd9,0xecbb}, {0x9dda,0xecbc},
+ {0x9ddb,0xecbd}, {0x9ddc,0xecbe}, {0x9ddd,0xecbf}, {0x9dde,0xecc0},
+ {0x9ddf,0xecc1}, {0x9de0,0xecc2}, {0x9de1,0xecc3}, {0x9de2,0xecc4},
+ {0x9de3,0xecc5}, {0x9de4,0xecc6}, {0x9de5,0xecc7}, {0x9de6,0xecc8},
+ {0x9de7,0xecc9}, {0x9de8,0xecca}, {0x9de9,0xeccb}, {0x9dea,0xeccc},
+ {0x9deb,0xeccd}, {0x9dec,0xecce}, {0x9ded,0xeccf}, {0x9dee,0xecd0},
+ {0x9def,0xecd1}, {0x9df0,0xecd2}, {0x9df1,0xecd3}, {0x9df2,0xecd4},
+ {0x9df3,0xecd5}, {0x9df4,0xecd6}, {0x9df5,0xecd7}, {0x9df6,0xecd8},
+ {0x9df7,0xecd9}, {0x9df8,0xecda}, {0x9df9,0xecdb}, {0x9dfa,0xecdc},
+ {0x9dfb,0xecdd}, {0x9dfc,0xecde}, {0x9dfd,0xecdf}, {0x9dfe,0xece0},
+ {0x9e40,0xece1}, {0x9e41,0xece2}, {0x9e42,0xece3}, {0x9e43,0xece4},
+ {0x9e44,0xece5}, {0x9e45,0xece6}, {0x9e46,0xece7}, {0x9e47,0xece8},
+ {0x9e48,0xece9}, {0x9e49,0xecea}, {0x9e4a,0xeceb}, {0x9e4b,0xecec},
+ {0x9e4c,0xeced}, {0x9e4d,0xecee}, {0x9e4e,0xecef}, {0x9e4f,0xecf0},
+ {0x9e50,0xecf1}, {0x9e51,0xecf2}, {0x9e52,0xecf3}, {0x9e53,0xecf4},
+ {0x9e54,0xecf5}, {0x9e55,0xecf6}, {0x9e56,0xecf7}, {0x9e57,0xecf8},
+ {0x9e58,0xecf9}, {0x9e59,0xecfa}, {0x9e5a,0xecfb}, {0x9e5b,0xecfc},
+ {0x9e5c,0xecfd}, {0x9e5d,0xecfe}, {0x9e5e,0xecff}, {0x9e5f,0xed00},
+ {0x9e60,0xed01}, {0x9e61,0xed02}, {0x9e62,0xed03}, {0x9e63,0xed04},
+ {0x9e64,0xed05}, {0x9e65,0xed06}, {0x9e66,0xed07}, {0x9e67,0xed08},
+ {0x9e68,0xed09}, {0x9e69,0xed0a}, {0x9e6a,0xed0b}, {0x9e6b,0xed0c},
+ {0x9e6c,0xed0d}, {0x9e6d,0xed0e}, {0x9e6e,0xed0f}, {0x9e6f,0xed10},
+ {0x9e70,0xed11}, {0x9e71,0xed12}, {0x9e72,0xed13}, {0x9e73,0xed14},
+ {0x9e74,0xed15}, {0x9e75,0xed16}, {0x9e76,0xed17}, {0x9e77,0xed18},
+ {0x9e78,0xed19}, {0x9e79,0xed1a}, {0x9e7a,0xed1b}, {0x9e7b,0xed1c},
+ {0x9e7c,0xed1d}, {0x9e7d,0xed1e}, {0x9e7e,0xed1f}, {0x9ea1,0xed20},
+ {0x9ea2,0xed21}, {0x9ea3,0xed22}, {0x9ea4,0xed23}, {0x9ea5,0xed24},
+ {0x9ea6,0xed25}, {0x9ea7,0xed26}, {0x9ea8,0xed27}, {0x9ea9,0xed28},
+ {0x9eaa,0xed29}, {0x9eab,0xed2a}, {0x9eac,0xed2b}, {0x9ead,0xed2c},
+ {0x9eae,0xed2d}, {0x9eaf,0xed2e}, {0x9eb0,0xed2f}, {0x9eb1,0xed30},
+ {0x9eb2,0xed31}, {0x9eb3,0xed32}, {0x9eb4,0xed33}, {0x9eb5,0xed34},
+ {0x9eb6,0xed35}, {0x9eb7,0xed36}, {0x9eb8,0xed37}, {0x9eb9,0xed38},
+ {0x9eba,0xed39}, {0x9ebb,0xed3a}, {0x9ebc,0xed3b}, {0x9ebd,0xed3c},
+ {0x9ebe,0xed3d}, {0x9ebf,0xed3e}, {0x9ec0,0xed3f}, {0x9ec1,0xed40},
+ {0x9ec2,0xed41}, {0x9ec3,0xed42}, {0x9ec4,0xed43}, {0x9ec5,0xed44},
+ {0x9ec6,0xed45}, {0x9ec7,0xed46}, {0x9ec8,0xed47}, {0x9ec9,0xed48},
+ {0x9eca,0xed49}, {0x9ecb,0xed4a}, {0x9ecc,0xed4b}, {0x9ecd,0xed4c},
+ {0x9ece,0xed4d}, {0x9ecf,0xed4e}, {0x9ed0,0xed4f}, {0x9ed1,0xed50},
+ {0x9ed2,0xed51}, {0x9ed3,0xed52}, {0x9ed4,0xed53}, {0x9ed5,0xed54},
+ {0x9ed6,0xed55}, {0x9ed7,0xed56}, {0x9ed8,0xed57}, {0x9ed9,0xed58},
+ {0x9eda,0xed59}, {0x9edb,0xed5a}, {0x9edc,0xed5b}, {0x9edd,0xed5c},
+ {0x9ede,0xed5d}, {0x9edf,0xed5e}, {0x9ee0,0xed5f}, {0x9ee1,0xed60},
+ {0x9ee2,0xed61}, {0x9ee3,0xed62}, {0x9ee4,0xed63}, {0x9ee5,0xed64},
+ {0x9ee6,0xed65}, {0x9ee7,0xed66}, {0x9ee8,0xed67}, {0x9ee9,0xed68},
+ {0x9eea,0xed69}, {0x9eeb,0xed6a}, {0x9eec,0xed6b}, {0x9eed,0xed6c},
+ {0x9eee,0xed6d}, {0x9eef,0xed6e}, {0x9ef0,0xed6f}, {0x9ef1,0xed70},
+ {0x9ef2,0xed71}, {0x9ef3,0xed72}, {0x9ef4,0xed73}, {0x9ef5,0xed74},
+ {0x9ef6,0xed75}, {0x9ef7,0xed76}, {0x9ef8,0xed77}, {0x9ef9,0xed78},
+ {0x9efa,0xed79}, {0x9efb,0xed7a}, {0x9efc,0xed7b}, {0x9efd,0xed7c},
+ {0x9efe,0xed7d}, {0x9f40,0xed7e}, {0x9f41,0xed7f}, {0x9f42,0xed80},
+ {0x9f43,0xed81}, {0x9f44,0xed82}, {0x9f45,0xed83}, {0x9f46,0xed84},
+ {0x9f47,0xed85}, {0x9f48,0xed86}, {0x9f49,0xed87}, {0x9f4a,0xed88},
+ {0x9f4b,0xed89}, {0x9f4c,0xed8a}, {0x9f4d,0xed8b}, {0x9f4e,0xed8c},
+ {0x9f4f,0xed8d}, {0x9f50,0xed8e}, {0x9f51,0xed8f}, {0x9f52,0xed90},
+ {0x9f53,0xed91}, {0x9f54,0xed92}, {0x9f55,0xed93}, {0x9f56,0xed94},
+ {0x9f57,0xed95}, {0x9f58,0xed96}, {0x9f59,0xed97}, {0x9f5a,0xed98},
+ {0x9f5b,0xed99}, {0x9f5c,0xed9a}, {0x9f5d,0xed9b}, {0x9f5e,0xed9c},
+ {0x9f5f,0xed9d}, {0x9f60,0xed9e}, {0x9f61,0xed9f}, {0x9f62,0xeda0},
+ {0x9f63,0xeda1}, {0x9f64,0xeda2}, {0x9f65,0xeda3}, {0x9f66,0xeda4},
+ {0x9f67,0xeda5}, {0x9f68,0xeda6}, {0x9f69,0xeda7}, {0x9f6a,0xeda8},
+ {0x9f6b,0xeda9}, {0x9f6c,0xedaa}, {0x9f6d,0xedab}, {0x9f6e,0xedac},
+ {0x9f6f,0xedad}, {0x9f70,0xedae}, {0x9f71,0xedaf}, {0x9f72,0xedb0},
+ {0x9f73,0xedb1}, {0x9f74,0xedb2}, {0x9f75,0xedb3}, {0x9f76,0xedb4},
+ {0x9f77,0xedb5}, {0x9f78,0xedb6}, {0x9f79,0xedb7}, {0x9f7a,0xedb8},
+ {0x9f7b,0xedb9}, {0x9f7c,0xedba}, {0x9f7d,0xedbb}, {0x9f7e,0xedbc},
+ {0x9fa1,0xedbd}, {0x9fa2,0xedbe}, {0x9fa3,0xedbf}, {0x9fa4,0xedc0},
+ {0x9fa5,0xedc1}, {0x9fa6,0xedc2}, {0x9fa7,0xedc3}, {0x9fa8,0xedc4},
+ {0x9fa9,0xedc5}, {0x9faa,0xedc6}, {0x9fab,0xedc7}, {0x9fac,0xedc8},
+ {0x9fad,0xedc9}, {0x9fae,0xedca}, {0x9faf,0xedcb}, {0x9fb0,0xedcc},
+ {0x9fb1,0xedcd}, {0x9fb2,0xedce}, {0x9fb3,0xedcf}, {0x9fb4,0xedd0},
+ {0x9fb5,0xedd1}, {0x9fb6,0xedd2}, {0x9fb7,0xedd3}, {0x9fb8,0xedd4},
+ {0x9fb9,0xedd5}, {0x9fba,0xedd6}, {0x9fbb,0xedd7}, {0x9fbc,0xedd8},
+ {0x9fbd,0xedd9}, {0x9fbe,0xedda}, {0x9fbf,0xeddb}, {0x9fc0,0xeddc},
+ {0x9fc1,0xeddd}, {0x9fc2,0xedde}, {0x9fc3,0xeddf}, {0x9fc4,0xede0},
+ {0x9fc5,0xede1}, {0x9fc6,0xede2}, {0x9fc7,0xede3}, {0x9fc8,0xede4},
+ {0x9fc9,0xede5}, {0x9fca,0xede6}, {0x9fcb,0xede7}, {0x9fcc,0xede8},
+ {0x9fcd,0xede9}, {0x9fce,0xedea}, {0x9fcf,0xedeb}, {0x9fd0,0xedec},
+ {0x9fd1,0xeded}, {0x9fd2,0xedee}, {0x9fd3,0xedef}, {0x9fd4,0xedf0},
+ {0x9fd5,0xedf1}, {0x9fd6,0xedf2}, {0x9fd7,0xedf3}, {0x9fd8,0xedf4},
+ {0x9fd9,0xedf5}, {0x9fda,0xedf6}, {0x9fdb,0xedf7}, {0x9fdc,0xedf8},
+ {0x9fdd,0xedf9}, {0x9fde,0xedfa}, {0x9fdf,0xedfb}, {0x9fe0,0xedfc},
+ {0x9fe1,0xedfd}, {0x9fe2,0xedfe}, {0x9fe3,0xedff}, {0x9fe4,0xee00},
+ {0x9fe5,0xee01}, {0x9fe6,0xee02}, {0x9fe7,0xee03}, {0x9fe8,0xee04},
+ {0x9fe9,0xee05}, {0x9fea,0xee06}, {0x9feb,0xee07}, {0x9fec,0xee08},
+ {0x9fed,0xee09}, {0x9fee,0xee0a}, {0x9fef,0xee0b}, {0x9ff0,0xee0c},
+ {0x9ff1,0xee0d}, {0x9ff2,0xee0e}, {0x9ff3,0xee0f}, {0x9ff4,0xee10},
+ {0x9ff5,0xee11}, {0x9ff6,0xee12}, {0x9ff7,0xee13}, {0x9ff8,0xee14},
+ {0x9ff9,0xee15}, {0x9ffa,0xee16}, {0x9ffb,0xee17}, {0x9ffc,0xee18},
+ {0x9ffd,0xee19}, {0x9ffe,0xee1a}, {0xa040,0xee1b}, {0xa041,0xee1c},
+ {0xa042,0xee1d}, {0xa043,0xee1e}, {0xa044,0xee1f}, {0xa045,0xee20},
+ {0xa046,0xee21}, {0xa047,0xee22}, {0xa048,0xee23}, {0xa049,0xee24},
+ {0xa04a,0xee25}, {0xa04b,0xee26}, {0xa04c,0xee27}, {0xa04d,0xee28},
+ {0xa04e,0xee29}, {0xa04f,0xee2a}, {0xa050,0xee2b}, {0xa051,0xee2c},
+ {0xa052,0xee2d}, {0xa053,0xee2e}, {0xa054,0xee2f}, {0xa055,0xee30},
+ {0xa056,0xee31}, {0xa057,0xee32}, {0xa058,0xee33}, {0xa059,0xee34},
+ {0xa05a,0xee35}, {0xa05b,0xee36}, {0xa05c,0xee37}, {0xa05d,0xee38},
+ {0xa05e,0xee39}, {0xa05f,0xee3a}, {0xa060,0xee3b}, {0xa061,0xee3c},
+ {0xa062,0xee3d}, {0xa063,0xee3e}, {0xa064,0xee3f}, {0xa065,0xee40},
+ {0xa066,0xee41}, {0xa067,0xee42}, {0xa068,0xee43}, {0xa069,0xee44},
+ {0xa06a,0xee45}, {0xa06b,0xee46}, {0xa06c,0xee47}, {0xa06d,0xee48},
+ {0xa06e,0xee49}, {0xa06f,0xee4a}, {0xa070,0xee4b}, {0xa071,0xee4c},
+ {0xa072,0xee4d}, {0xa073,0xee4e}, {0xa074,0xee4f}, {0xa075,0xee50},
+ {0xa076,0xee51}, {0xa077,0xee52}, {0xa078,0xee53}, {0xa079,0xee54},
+ {0xa07a,0xee55}, {0xa07b,0xee56}, {0xa07c,0xee57}, {0xa07d,0xee58},
+ {0xa07e,0xee59}, {0xa0a1,0xee5a}, {0xa0a2,0xee5b}, {0xa0a3,0xee5c},
+ {0xa0a4,0xee5d}, {0xa0a5,0xee5e}, {0xa0a6,0xee5f}, {0xa0a7,0xee60},
+ {0xa0a8,0xee61}, {0xa0a9,0xee62}, {0xa0aa,0xee63}, {0xa0ab,0xee64},
+ {0xa0ac,0xee65}, {0xa0ad,0xee66}, {0xa0ae,0xee67}, {0xa0af,0xee68},
+ {0xa0b0,0xee69}, {0xa0b1,0xee6a}, {0xa0b2,0xee6b}, {0xa0b3,0xee6c},
+ {0xa0b4,0xee6d}, {0xa0b5,0xee6e}, {0xa0b6,0xee6f}, {0xa0b7,0xee70},
+ {0xa0b8,0xee71}, {0xa0b9,0xee72}, {0xa0ba,0xee73}, {0xa0bb,0xee74},
+ {0xa0bc,0xee75}, {0xa0bd,0xee76}, {0xa0be,0xee77}, {0xa0bf,0xee78},
+ {0xa0c0,0xee79}, {0xa0c1,0xee7a}, {0xa0c2,0xee7b}, {0xa0c3,0xee7c},
+ {0xa0c4,0xee7d}, {0xa0c5,0xee7e}, {0xa0c6,0xee7f}, {0xa0c7,0xee80},
+ {0xa0c8,0xee81}, {0xa0c9,0xee82}, {0xa0ca,0xee83}, {0xa0cb,0xee84},
+ {0xa0cc,0xee85}, {0xa0cd,0xee86}, {0xa0ce,0xee87}, {0xa0cf,0xee88},
+ {0xa0d0,0xee89}, {0xa0d1,0xee8a}, {0xa0d2,0xee8b}, {0xa0d3,0xee8c},
+ {0xa0d4,0xee8d}, {0xa0d5,0xee8e}, {0xa0d6,0xee8f}, {0xa0d7,0xee90},
+ {0xa0d8,0xee91}, {0xa0d9,0xee92}, {0xa0da,0xee93}, {0xa0db,0xee94},
+ {0xa0dc,0xee95}, {0xa0dd,0xee96}, {0xa0de,0xee97}, {0xa0df,0xee98},
+ {0xa0e0,0xee99}, {0xa0e1,0xee9a}, {0xa0e2,0xee9b}, {0xa0e3,0xee9c},
+ {0xa0e4,0xee9d}, {0xa0e5,0xee9e}, {0xa0e6,0xee9f}, {0xa0e7,0xeea0},
+ {0xa0e8,0xeea1}, {0xa0e9,0xeea2}, {0xa0ea,0xeea3}, {0xa0eb,0xeea4},
+ {0xa0ec,0xeea5}, {0xa0ed,0xeea6}, {0xa0ee,0xeea7}, {0xa0ef,0xeea8},
+ {0xa0f0,0xeea9}, {0xa0f1,0xeeaa}, {0xa0f2,0xeeab}, {0xa0f3,0xeeac},
+ {0xa0f4,0xeead}, {0xa0f5,0xeeae}, {0xa0f6,0xeeaf}, {0xa0f7,0xeeb0},
+ {0xa0f8,0xeeb1}, {0xa0f9,0xeeb2}, {0xa0fa,0xeeb3}, {0xa0fb,0xeeb4},
+ {0xa0fc,0xeeb5}, {0xa0fd,0xeeb6}, {0xa0fe,0xeeb7}
+};
+static const B5Map b5_C6A1_to_uc_map[] = {
+ /* 0xC6A1 - 0xC8FE */
+ {0xc6a1,0xf6b1}, {0xc6a2,0xf6b2}, {0xc6a3,0xf6b3}, {0xc6a4,0xf6b4},
+ {0xc6a5,0xf6b5}, {0xc6a6,0xf6b6}, {0xc6a7,0xf6b7}, {0xc6a8,0xf6b8},
+ {0xc6a9,0xf6b9}, {0xc6aa,0xf6ba}, {0xc6ab,0xf6bb}, {0xc6ac,0xf6bc},
+ {0xc6ad,0xf6bd}, {0xc6ae,0xf6be}, {0xc6af,0xf6bf}, {0xc6b0,0xf6c0},
+ {0xc6b1,0xf6c1}, {0xc6b2,0xf6c2}, {0xc6b3,0xf6c3}, {0xc6b4,0xf6c4},
+ {0xc6b5,0xf6c5}, {0xc6b6,0xf6c6}, {0xc6b7,0xf6c7}, {0xc6b8,0xf6c8},
+ {0xc6b9,0xf6c9}, {0xc6ba,0xf6ca}, {0xc6bb,0xf6cb}, {0xc6bc,0xf6cc},
+ {0xc6bd,0xf6cd}, {0xc6be,0xf6ce}, {0xc6bf,0xf6cf}, {0xc6c0,0xf6d0},
+ {0xc6c1,0xf6d1}, {0xc6c2,0xf6d2}, {0xc6c3,0xf6d3}, {0xc6c4,0xf6d4},
+ {0xc6c5,0xf6d5}, {0xc6c6,0xf6d6}, {0xc6c7,0xf6d7}, {0xc6c8,0xf6d8},
+ {0xc6c9,0xf6d9}, {0xc6ca,0xf6da}, {0xc6cb,0xf6db}, {0xc6cc,0xf6dc},
+ {0xc6cd,0xf6dd}, {0xc6ce,0xf6de}, {0xc6cf,0xf6df}, {0xc6d0,0xf6e0},
+ {0xc6d1,0xf6e1}, {0xc6d2,0xf6e2}, {0xc6d3,0xf6e3}, {0xc6d4,0xf6e4},
+ {0xc6d5,0xf6e5}, {0xc6d6,0xf6e6}, {0xc6d7,0xf6e7}, {0xc6d8,0xf6e8},
+ {0xc6d9,0xf6e9}, {0xc6da,0xf6ea}, {0xc6db,0xf6eb}, {0xc6dc,0xf6ec},
+ {0xc6dd,0xf6ed}, {0xc6de,0xf6ee}, {0xc6df,0xf6ef}, {0xc6e0,0xf6f0},
+ {0xc6e1,0xf6f1}, {0xc6e2,0xf6f2}, {0xc6e3,0xf6f3}, {0xc6e4,0xf6f4},
+ {0xc6e5,0xf6f5}, {0xc6e6,0xf6f6}, {0xc6e7,0xf6f7}, {0xc6e8,0xf6f8},
+ {0xc6e9,0xf6f9}, {0xc6ea,0xf6fa}, {0xc6eb,0xf6fb}, {0xc6ec,0xf6fc},
+ {0xc6ed,0xf6fd}, {0xc6ee,0xf6fe}, {0xc6ef,0xf6ff}, {0xc6f0,0xf700},
+ {0xc6f1,0xf701}, {0xc6f2,0xf702}, {0xc6f3,0xf703}, {0xc6f4,0xf704},
+ {0xc6f5,0xf705}, {0xc6f6,0xf706}, {0xc6f7,0xf707}, {0xc6f8,0xf708},
+ {0xc6f9,0xf709}, {0xc6fa,0xf70a}, {0xc6fb,0xf70b}, {0xc6fc,0xf70c},
+ {0xc6fd,0xf70d}, {0xc6fe,0xf70e}, {0xc740,0xf70f}, {0xc741,0xf710},
+ {0xc742,0xf711}, {0xc743,0xf712}, {0xc744,0xf713}, {0xc745,0xf714},
+ {0xc746,0xf715}, {0xc747,0xf716}, {0xc748,0xf717}, {0xc749,0xf718},
+ {0xc74a,0xf719}, {0xc74b,0xf71a}, {0xc74c,0xf71b}, {0xc74d,0xf71c},
+ {0xc74e,0xf71d}, {0xc74f,0xf71e}, {0xc750,0xf71f}, {0xc751,0xf720},
+ {0xc752,0xf721}, {0xc753,0xf722}, {0xc754,0xf723}, {0xc755,0xf724},
+ {0xc756,0xf725}, {0xc757,0xf726}, {0xc758,0xf727}, {0xc759,0xf728},
+ {0xc75a,0xf729}, {0xc75b,0xf72a}, {0xc75c,0xf72b}, {0xc75d,0xf72c},
+ {0xc75e,0xf72d}, {0xc75f,0xf72e}, {0xc760,0xf72f}, {0xc761,0xf730},
+ {0xc762,0xf731}, {0xc763,0xf732}, {0xc764,0xf733}, {0xc765,0xf734},
+ {0xc766,0xf735}, {0xc767,0xf736}, {0xc768,0xf737}, {0xc769,0xf738},
+ {0xc76a,0xf739}, {0xc76b,0xf73a}, {0xc76c,0xf73b}, {0xc76d,0xf73c},
+ {0xc76e,0xf73d}, {0xc76f,0xf73e}, {0xc770,0xf73f}, {0xc771,0xf740},
+ {0xc772,0xf741}, {0xc773,0xf742}, {0xc774,0xf743}, {0xc775,0xf744},
+ {0xc776,0xf745}, {0xc777,0xf746}, {0xc778,0xf747}, {0xc779,0xf748},
+ {0xc77a,0xf749}, {0xc77b,0xf74a}, {0xc77c,0xf74b}, {0xc77d,0xf74c},
+ {0xc77e,0xf74d}, {0xc7a1,0xf74e}, {0xc7a2,0xf74f}, {0xc7a3,0xf750},
+ {0xc7a4,0xf751}, {0xc7a5,0xf752}, {0xc7a6,0xf753}, {0xc7a7,0xf754},
+ {0xc7a8,0xf755}, {0xc7a9,0xf756}, {0xc7aa,0xf757}, {0xc7ab,0xf758},
+ {0xc7ac,0xf759}, {0xc7ad,0xf75a}, {0xc7ae,0xf75b}, {0xc7af,0xf75c},
+ {0xc7b0,0xf75d}, {0xc7b1,0xf75e}, {0xc7b2,0xf75f}, {0xc7b3,0xf760},
+ {0xc7b4,0xf761}, {0xc7b5,0xf762}, {0xc7b6,0xf763}, {0xc7b7,0xf764},
+ {0xc7b8,0xf765}, {0xc7b9,0xf766}, {0xc7ba,0xf767}, {0xc7bb,0xf768},
+ {0xc7bc,0xf769}, {0xc7bd,0xf76a}, {0xc7be,0xf76b}, {0xc7bf,0xf76c},
+ {0xc7c0,0xf76d}, {0xc7c1,0xf76e}, {0xc7c2,0xf76f}, {0xc7c3,0xf770},
+ {0xc7c4,0xf771}, {0xc7c5,0xf772}, {0xc7c6,0xf773}, {0xc7c7,0xf774},
+ {0xc7c8,0xf775}, {0xc7c9,0xf776}, {0xc7ca,0xf777}, {0xc7cb,0xf778},
+ {0xc7cc,0xf779}, {0xc7cd,0xf77a}, {0xc7ce,0xf77b}, {0xc7cf,0xf77c},
+ {0xc7d0,0xf77d}, {0xc7d1,0xf77e}, {0xc7d2,0xf77f}, {0xc7d3,0xf780},
+ {0xc7d4,0xf781}, {0xc7d5,0xf782}, {0xc7d6,0xf783}, {0xc7d7,0xf784},
+ {0xc7d8,0xf785}, {0xc7d9,0xf786}, {0xc7da,0xf787}, {0xc7db,0xf788},
+ {0xc7dc,0xf789}, {0xc7dd,0xf78a}, {0xc7de,0xf78b}, {0xc7df,0xf78c},
+ {0xc7e0,0xf78d}, {0xc7e1,0xf78e}, {0xc7e2,0xf78f}, {0xc7e3,0xf790},
+ {0xc7e4,0xf791}, {0xc7e5,0xf792}, {0xc7e6,0xf793}, {0xc7e7,0xf794},
+ {0xc7e8,0xf795}, {0xc7e9,0xf796}, {0xc7ea,0xf797}, {0xc7eb,0xf798},
+ {0xc7ec,0xf799}, {0xc7ed,0xf79a}, {0xc7ee,0xf79b}, {0xc7ef,0xf79c},
+ {0xc7f0,0xf79d}, {0xc7f1,0xf79e}, {0xc7f2,0xf79f}, {0xc7f3,0xf7a0},
+ {0xc7f4,0xf7a1}, {0xc7f5,0xf7a2}, {0xc7f6,0xf7a3}, {0xc7f7,0xf7a4},
+ {0xc7f8,0xf7a5}, {0xc7f9,0xf7a6}, {0xc7fa,0xf7a7}, {0xc7fb,0xf7a8},
+ {0xc7fc,0xf7a9}, {0xc7fd,0xf7aa}, {0xc7fe,0xf7ab}, {0xc840,0xf7ac},
+ {0xc841,0xf7ad}, {0xc842,0xf7ae}, {0xc843,0xf7af}, {0xc844,0xf7b0},
+ {0xc845,0xf7b1}, {0xc846,0xf7b2}, {0xc847,0xf7b3}, {0xc848,0xf7b4},
+ {0xc849,0xf7b5}, {0xc84a,0xf7b6}, {0xc84b,0xf7b7}, {0xc84c,0xf7b8},
+ {0xc84d,0xf7b9}, {0xc84e,0xf7ba}, {0xc84f,0xf7bb}, {0xc850,0xf7bc},
+ {0xc851,0xf7bd}, {0xc852,0xf7be}, {0xc853,0xf7bf}, {0xc854,0xf7c0},
+ {0xc855,0xf7c1}, {0xc856,0xf7c2}, {0xc857,0xf7c3}, {0xc858,0xf7c4},
+ {0xc859,0xf7c5}, {0xc85a,0xf7c6}, {0xc85b,0xf7c7}, {0xc85c,0xf7c8},
+ {0xc85d,0xf7c9}, {0xc85e,0xf7ca}, {0xc85f,0xf7cb}, {0xc860,0xf7cc},
+ {0xc861,0xf7cd}, {0xc862,0xf7ce}, {0xc863,0xf7cf}, {0xc864,0xf7d0},
+ {0xc865,0xf7d1}, {0xc866,0xf7d2}, {0xc867,0xf7d3}, {0xc868,0xf7d4},
+ {0xc869,0xf7d5}, {0xc86a,0xf7d6}, {0xc86b,0xf7d7}, {0xc86c,0xf7d8},
+ {0xc86d,0xf7d9}, {0xc86e,0xf7da}, {0xc86f,0xf7db}, {0xc870,0xf7dc},
+ {0xc871,0xf7dd}, {0xc872,0xf7de}, {0xc873,0xf7df}, {0xc874,0xf7e0},
+ {0xc875,0xf7e1}, {0xc876,0xf7e2}, {0xc877,0xf7e3}, {0xc878,0xf7e4},
+ {0xc879,0xf7e5}, {0xc87a,0xf7e6}, {0xc87b,0xf7e7}, {0xc87c,0xf7e8},
+ {0xc87d,0xf7e9}, {0xc87e,0xf7ea}, {0xc8a1,0xf7eb}, {0xc8a2,0xf7ec},
+ {0xc8a3,0xf7ed}, {0xc8a4,0xf7ee}, {0xc8a5,0xf7ef}, {0xc8a6,0xf7f0},
+ {0xc8a7,0xf7f1}, {0xc8a8,0xf7f2}, {0xc8a9,0xf7f3}, {0xc8aa,0xf7f4},
+ {0xc8ab,0xf7f5}, {0xc8ac,0xf7f6}, {0xc8ad,0xf7f7}, {0xc8ae,0xf7f8},
+ {0xc8af,0xf7f9}, {0xc8b0,0xf7fa}, {0xc8b1,0xf7fb}, {0xc8b2,0xf7fc},
+ {0xc8b3,0xf7fd}, {0xc8b4,0xf7fe}, {0xc8b5,0xf7ff}, {0xc8b6,0xf800},
+ {0xc8b7,0xf801}, {0xc8b8,0xf802}, {0xc8b9,0xf803}, {0xc8ba,0xf804},
+ {0xc8bb,0xf805}, {0xc8bc,0xf806}, {0xc8bd,0xf807}, {0xc8be,0xf808},
+ {0xc8bf,0xf809}, {0xc8c0,0xf80a}, {0xc8c1,0xf80b}, {0xc8c2,0xf80c},
+ {0xc8c3,0xf80d}, {0xc8c4,0xf80e}, {0xc8c5,0xf80f}, {0xc8c6,0xf810},
+ {0xc8c7,0xf811}, {0xc8c8,0xf812}, {0xc8c9,0xf813}, {0xc8ca,0xf814},
+ {0xc8cb,0xf815}, {0xc8cc,0xf816}, {0xc8cd,0xf817}, {0xc8ce,0xf818},
+ {0xc8cf,0xf819}, {0xc8d0,0xf81a}, {0xc8d1,0xf81b}, {0xc8d2,0xf81c},
+ {0xc8d3,0xf81d}, {0xc8d4,0xf81e}, {0xc8d5,0xf81f}, {0xc8d6,0xf820},
+ {0xc8d7,0xf821}, {0xc8d8,0xf822}, {0xc8d9,0xf823}, {0xc8da,0xf824},
+ {0xc8db,0xf825}, {0xc8dc,0xf826}, {0xc8dd,0xf827}, {0xc8de,0xf828},
+ {0xc8df,0xf829}, {0xc8e0,0xf82a}, {0xc8e1,0xf82b}, {0xc8e2,0xf82c},
+ {0xc8e3,0xf82d}, {0xc8e4,0xf82e}, {0xc8e5,0xf82f}, {0xc8e6,0xf830},
+ {0xc8e7,0xf831}, {0xc8e8,0xf832}, {0xc8e9,0xf833}, {0xc8ea,0xf834},
+ {0xc8eb,0xf835}, {0xc8ec,0xf836}, {0xc8ed,0xf837}, {0xc8ee,0xf838},
+ {0xc8ef,0xf839}, {0xc8f0,0xf83a}, {0xc8f1,0xf83b}, {0xc8f2,0xf83c},
+ {0xc8f3,0xf83d}, {0xc8f4,0xf83e}, {0xc8f5,0xf83f}, {0xc8f6,0xf840},
+ {0xc8f7,0xf841}, {0xc8f8,0xf842}, {0xc8f9,0xf843}, {0xc8fa,0xf844},
+ {0xc8fb,0xf845}, {0xc8fc,0xf846}, {0xc8fd,0xf847}, {0xc8fe,0xf848}
+};
+//This table is for values 0xFA40 - 0xFEFE also includes 0xf9fe
+static const B5Map b5_FA40_to_uc_map[] = {
+ {0xf9fe,0x2593},
+ /* 0xFA40 - 0xFEFE */
+ {0xfa40,0xe000}, {0xfa41,0xe001}, {0xfa42,0xe002}, {0xfa43,0xe003},
+ {0xfa44,0xe004}, {0xfa45,0xe005}, {0xfa46,0xe006}, {0xfa47,0xe007},
+ {0xfa48,0xe008}, {0xfa49,0xe009}, {0xfa4a,0xe00a}, {0xfa4b,0xe00b},
+ {0xfa4c,0xe00c}, {0xfa4d,0xe00d}, {0xfa4e,0xe00e}, {0xfa4f,0xe00f},
+ {0xfa50,0xe010}, {0xfa51,0xe011}, {0xfa52,0xe012}, {0xfa53,0xe013},
+ {0xfa54,0xe014}, {0xfa55,0xe015}, {0xfa56,0xe016}, {0xfa57,0xe017},
+ {0xfa58,0xe018}, {0xfa59,0xe019}, {0xfa5a,0xe01a}, {0xfa5b,0xe01b},
+ {0xfa5c,0xe01c}, {0xfa5d,0xe01d}, {0xfa5e,0xe01e}, {0xfa5f,0xe01f},
+ {0xfa60,0xe020}, {0xfa61,0xe021}, {0xfa62,0xe022}, {0xfa63,0xe023},
+ {0xfa64,0xe024}, {0xfa65,0xe025}, {0xfa66,0xe026}, {0xfa67,0xe027},
+ {0xfa68,0xe028}, {0xfa69,0xe029}, {0xfa6a,0xe02a}, {0xfa6b,0xe02b},
+ {0xfa6c,0xe02c}, {0xfa6d,0xe02d}, {0xfa6e,0xe02e}, {0xfa6f,0xe02f},
+ {0xfa70,0xe030}, {0xfa71,0xe031}, {0xfa72,0xe032}, {0xfa73,0xe033},
+ {0xfa74,0xe034}, {0xfa75,0xe035}, {0xfa76,0xe036}, {0xfa77,0xe037},
+ {0xfa78,0xe038}, {0xfa79,0xe039}, {0xfa7a,0xe03a}, {0xfa7b,0xe03b},
+ {0xfa7c,0xe03c}, {0xfa7d,0xe03d}, {0xfa7e,0xe03e}, {0xfaa1,0xe03f},
+ {0xfaa2,0xe040}, {0xfaa3,0xe041}, {0xfaa4,0xe042}, {0xfaa5,0xe043},
+ {0xfaa6,0xe044}, {0xfaa7,0xe045}, {0xfaa8,0xe046}, {0xfaa9,0xe047},
+ {0xfaaa,0xe048}, {0xfaab,0xe049}, {0xfaac,0xe04a}, {0xfaad,0xe04b},
+ {0xfaae,0xe04c}, {0xfaaf,0xe04d}, {0xfab0,0xe04e}, {0xfab1,0xe04f},
+ {0xfab2,0xe050}, {0xfab3,0xe051}, {0xfab4,0xe052}, {0xfab5,0xe053},
+ {0xfab6,0xe054}, {0xfab7,0xe055}, {0xfab8,0xe056}, {0xfab9,0xe057},
+ {0xfaba,0xe058}, {0xfabb,0xe059}, {0xfabc,0xe05a}, {0xfabd,0xe05b},
+ {0xfabe,0xe05c}, {0xfabf,0xe05d}, {0xfac0,0xe05e}, {0xfac1,0xe05f},
+ {0xfac2,0xe060}, {0xfac3,0xe061}, {0xfac4,0xe062}, {0xfac5,0xe063},
+ {0xfac6,0xe064}, {0xfac7,0xe065}, {0xfac8,0xe066}, {0xfac9,0xe067},
+ {0xfaca,0xe068}, {0xfacb,0xe069}, {0xfacc,0xe06a}, {0xfacd,0xe06b},
+ {0xface,0xe06c}, {0xfacf,0xe06d}, {0xfad0,0xe06e}, {0xfad1,0xe06f},
+ {0xfad2,0xe070}, {0xfad3,0xe071}, {0xfad4,0xe072}, {0xfad5,0xe073},
+ {0xfad6,0xe074}, {0xfad7,0xe075}, {0xfad8,0xe076}, {0xfad9,0xe077},
+ {0xfada,0xe078}, {0xfadb,0xe079}, {0xfadc,0xe07a}, {0xfadd,0xe07b},
+ {0xfade,0xe07c}, {0xfadf,0xe07d}, {0xfae0,0xe07e}, {0xfae1,0xe07f},
+ {0xfae2,0xe080}, {0xfae3,0xe081}, {0xfae4,0xe082}, {0xfae5,0xe083},
+ {0xfae6,0xe084}, {0xfae7,0xe085}, {0xfae8,0xe086}, {0xfae9,0xe087},
+ {0xfaea,0xe088}, {0xfaeb,0xe089}, {0xfaec,0xe08a}, {0xfaed,0xe08b},
+ {0xfaee,0xe08c}, {0xfaef,0xe08d}, {0xfaf0,0xe08e}, {0xfaf1,0xe08f},
+ {0xfaf2,0xe090}, {0xfaf3,0xe091}, {0xfaf4,0xe092}, {0xfaf5,0xe093},
+ {0xfaf6,0xe094}, {0xfaf7,0xe095}, {0xfaf8,0xe096}, {0xfaf9,0xe097},
+ {0xfafa,0xe098}, {0xfafb,0xe099}, {0xfafc,0xe09a}, {0xfafd,0xe09b},
+ {0xfafe,0xe09c}, {0xfb40,0xe09d}, {0xfb41,0xe09e}, {0xfb42,0xe09f},
+ {0xfb43,0xe0a0}, {0xfb44,0xe0a1}, {0xfb45,0xe0a2}, {0xfb46,0xe0a3},
+ {0xfb47,0xe0a4}, {0xfb48,0xe0a5}, {0xfb49,0xe0a6}, {0xfb4a,0xe0a7},
+ {0xfb4b,0xe0a8}, {0xfb4c,0xe0a9}, {0xfb4d,0xe0aa}, {0xfb4e,0xe0ab},
+ {0xfb4f,0xe0ac}, {0xfb50,0xe0ad}, {0xfb51,0xe0ae}, {0xfb52,0xe0af},
+ {0xfb53,0xe0b0}, {0xfb54,0xe0b1}, {0xfb55,0xe0b2}, {0xfb56,0xe0b3},
+ {0xfb57,0xe0b4}, {0xfb58,0xe0b5}, {0xfb59,0xe0b6}, {0xfb5a,0xe0b7},
+ {0xfb5b,0xe0b8}, {0xfb5c,0xe0b9}, {0xfb5d,0xe0ba}, {0xfb5e,0xe0bb},
+ {0xfb5f,0xe0bc}, {0xfb60,0xe0bd}, {0xfb61,0xe0be}, {0xfb62,0xe0bf},
+ {0xfb63,0xe0c0}, {0xfb64,0xe0c1}, {0xfb65,0xe0c2}, {0xfb66,0xe0c3},
+ {0xfb67,0xe0c4}, {0xfb68,0xe0c5}, {0xfb69,0xe0c6}, {0xfb6a,0xe0c7},
+ {0xfb6b,0xe0c8}, {0xfb6c,0xe0c9}, {0xfb6d,0xe0ca}, {0xfb6e,0xe0cb},
+ {0xfb6f,0xe0cc}, {0xfb70,0xe0cd}, {0xfb71,0xe0ce}, {0xfb72,0xe0cf},
+ {0xfb73,0xe0d0}, {0xfb74,0xe0d1}, {0xfb75,0xe0d2}, {0xfb76,0xe0d3},
+ {0xfb77,0xe0d4}, {0xfb78,0xe0d5}, {0xfb79,0xe0d6}, {0xfb7a,0xe0d7},
+ {0xfb7b,0xe0d8}, {0xfb7c,0xe0d9}, {0xfb7d,0xe0da}, {0xfb7e,0xe0db},
+ {0xfba1,0xe0dc}, {0xfba2,0xe0dd}, {0xfba3,0xe0de}, {0xfba4,0xe0df},
+ {0xfba5,0xe0e0}, {0xfba6,0xe0e1}, {0xfba7,0xe0e2}, {0xfba8,0xe0e3},
+ {0xfba9,0xe0e4}, {0xfbaa,0xe0e5}, {0xfbab,0xe0e6}, {0xfbac,0xe0e7},
+ {0xfbad,0xe0e8}, {0xfbae,0xe0e9}, {0xfbaf,0xe0ea}, {0xfbb0,0xe0eb},
+ {0xfbb1,0xe0ec}, {0xfbb2,0xe0ed}, {0xfbb3,0xe0ee}, {0xfbb4,0xe0ef},
+ {0xfbb5,0xe0f0}, {0xfbb6,0xe0f1}, {0xfbb7,0xe0f2}, {0xfbb8,0xe0f3},
+ {0xfbb9,0xe0f4}, {0xfbba,0xe0f5}, {0xfbbb,0xe0f6}, {0xfbbc,0xe0f7},
+ {0xfbbd,0xe0f8}, {0xfbbe,0xe0f9}, {0xfbbf,0xe0fa}, {0xfbc0,0xe0fb},
+ {0xfbc1,0xe0fc}, {0xfbc2,0xe0fd}, {0xfbc3,0xe0fe}, {0xfbc4,0xe0ff},
+ {0xfbc5,0xe100}, {0xfbc6,0xe101}, {0xfbc7,0xe102}, {0xfbc8,0xe103},
+ {0xfbc9,0xe104}, {0xfbca,0xe105}, {0xfbcb,0xe106}, {0xfbcc,0xe107},
+ {0xfbcd,0xe108}, {0xfbce,0xe109}, {0xfbcf,0xe10a}, {0xfbd0,0xe10b},
+ {0xfbd1,0xe10c}, {0xfbd2,0xe10d}, {0xfbd3,0xe10e}, {0xfbd4,0xe10f},
+ {0xfbd5,0xe110}, {0xfbd6,0xe111}, {0xfbd7,0xe112}, {0xfbd8,0xe113},
+ {0xfbd9,0xe114}, {0xfbda,0xe115}, {0xfbdb,0xe116}, {0xfbdc,0xe117},
+ {0xfbdd,0xe118}, {0xfbde,0xe119}, {0xfbdf,0xe11a}, {0xfbe0,0xe11b},
+ {0xfbe1,0xe11c}, {0xfbe2,0xe11d}, {0xfbe3,0xe11e}, {0xfbe4,0xe11f},
+ {0xfbe5,0xe120}, {0xfbe6,0xe121}, {0xfbe7,0xe122}, {0xfbe8,0xe123},
+ {0xfbe9,0xe124}, {0xfbea,0xe125}, {0xfbeb,0xe126}, {0xfbec,0xe127},
+ {0xfbed,0xe128}, {0xfbee,0xe129}, {0xfbef,0xe12a}, {0xfbf0,0xe12b},
+ {0xfbf1,0xe12c}, {0xfbf2,0xe12d}, {0xfbf3,0xe12e}, {0xfbf4,0xe12f},
+ {0xfbf5,0xe130}, {0xfbf6,0xe131}, {0xfbf7,0xe132}, {0xfbf8,0xe133},
+ {0xfbf9,0xe134}, {0xfbfa,0xe135}, {0xfbfb,0xe136}, {0xfbfc,0xe137},
+ {0xfbfd,0xe138}, {0xfbfe,0xe139}, {0xfc40,0xe13a}, {0xfc41,0xe13b},
+ {0xfc42,0xe13c}, {0xfc43,0xe13d}, {0xfc44,0xe13e}, {0xfc45,0xe13f},
+ {0xfc46,0xe140}, {0xfc47,0xe141}, {0xfc48,0xe142}, {0xfc49,0xe143},
+ {0xfc4a,0xe144}, {0xfc4b,0xe145}, {0xfc4c,0xe146}, {0xfc4d,0xe147},
+ {0xfc4e,0xe148}, {0xfc4f,0xe149}, {0xfc50,0xe14a}, {0xfc51,0xe14b},
+ {0xfc52,0xe14c}, {0xfc53,0xe14d}, {0xfc54,0xe14e}, {0xfc55,0xe14f},
+ {0xfc56,0xe150}, {0xfc57,0xe151}, {0xfc58,0xe152}, {0xfc59,0xe153},
+ {0xfc5a,0xe154}, {0xfc5b,0xe155}, {0xfc5c,0xe156}, {0xfc5d,0xe157},
+ {0xfc5e,0xe158}, {0xfc5f,0xe159}, {0xfc60,0xe15a}, {0xfc61,0xe15b},
+ {0xfc62,0xe15c}, {0xfc63,0xe15d}, {0xfc64,0xe15e}, {0xfc65,0xe15f},
+ {0xfc66,0xe160}, {0xfc67,0xe161}, {0xfc68,0xe162}, {0xfc69,0xe163},
+ {0xfc6a,0xe164}, {0xfc6b,0xe165}, {0xfc6c,0xe166}, {0xfc6d,0xe167},
+ {0xfc6e,0xe168}, {0xfc6f,0xe169}, {0xfc70,0xe16a}, {0xfc71,0xe16b},
+ {0xfc72,0xe16c}, {0xfc73,0xe16d}, {0xfc74,0xe16e}, {0xfc75,0xe16f},
+ {0xfc76,0xe170}, {0xfc77,0xe171}, {0xfc78,0xe172}, {0xfc79,0xe173},
+ {0xfc7a,0xe174}, {0xfc7b,0xe175}, {0xfc7c,0xe176}, {0xfc7d,0xe177},
+ {0xfc7e,0xe178}, {0xfca1,0xe179}, {0xfca2,0xe17a}, {0xfca3,0xe17b},
+ {0xfca4,0xe17c}, {0xfca5,0xe17d}, {0xfca6,0xe17e}, {0xfca7,0xe17f},
+ {0xfca8,0xe180}, {0xfca9,0xe181}, {0xfcaa,0xe182}, {0xfcab,0xe183},
+ {0xfcac,0xe184}, {0xfcad,0xe185}, {0xfcae,0xe186}, {0xfcaf,0xe187},
+ {0xfcb0,0xe188}, {0xfcb1,0xe189}, {0xfcb2,0xe18a}, {0xfcb3,0xe18b},
+ {0xfcb4,0xe18c}, {0xfcb5,0xe18d}, {0xfcb6,0xe18e}, {0xfcb7,0xe18f},
+ {0xfcb8,0xe190}, {0xfcb9,0xe191}, {0xfcba,0xe192}, {0xfcbb,0xe193},
+ {0xfcbc,0xe194}, {0xfcbd,0xe195}, {0xfcbe,0xe196}, {0xfcbf,0xe197},
+ {0xfcc0,0xe198}, {0xfcc1,0xe199}, {0xfcc2,0xe19a}, {0xfcc3,0xe19b},
+ {0xfcc4,0xe19c}, {0xfcc5,0xe19d}, {0xfcc6,0xe19e}, {0xfcc7,0xe19f},
+ {0xfcc8,0xe1a0}, {0xfcc9,0xe1a1}, {0xfcca,0xe1a2}, {0xfccb,0xe1a3},
+ {0xfccc,0xe1a4}, {0xfccd,0xe1a5}, {0xfcce,0xe1a6}, {0xfccf,0xe1a7},
+ {0xfcd0,0xe1a8}, {0xfcd1,0xe1a9}, {0xfcd2,0xe1aa}, {0xfcd3,0xe1ab},
+ {0xfcd4,0xe1ac}, {0xfcd5,0xe1ad}, {0xfcd6,0xe1ae}, {0xfcd7,0xe1af},
+ {0xfcd8,0xe1b0}, {0xfcd9,0xe1b1}, {0xfcda,0xe1b2}, {0xfcdb,0xe1b3},
+ {0xfcdc,0xe1b4}, {0xfcdd,0xe1b5}, {0xfcde,0xe1b6}, {0xfcdf,0xe1b7},
+ {0xfce0,0xe1b8}, {0xfce1,0xe1b9}, {0xfce2,0xe1ba}, {0xfce3,0xe1bb},
+ {0xfce4,0xe1bc}, {0xfce5,0xe1bd}, {0xfce6,0xe1be}, {0xfce7,0xe1bf},
+ {0xfce8,0xe1c0}, {0xfce9,0xe1c1}, {0xfcea,0xe1c2}, {0xfceb,0xe1c3},
+ {0xfcec,0xe1c4}, {0xfced,0xe1c5}, {0xfcee,0xe1c6}, {0xfcef,0xe1c7},
+ {0xfcf0,0xe1c8}, {0xfcf1,0xe1c9}, {0xfcf2,0xe1ca}, {0xfcf3,0xe1cb},
+ {0xfcf4,0xe1cc}, {0xfcf5,0xe1cd}, {0xfcf6,0xe1ce}, {0xfcf7,0xe1cf},
+ {0xfcf8,0xe1d0}, {0xfcf9,0xe1d1}, {0xfcfa,0xe1d2}, {0xfcfb,0xe1d3},
+ {0xfcfc,0xe1d4}, {0xfcfd,0xe1d5}, {0xfcfe,0xe1d6}, {0xfd40,0xe1d7},
+ {0xfd41,0xe1d8}, {0xfd42,0xe1d9}, {0xfd43,0xe1da}, {0xfd44,0xe1db},
+ {0xfd45,0xe1dc}, {0xfd46,0xe1dd}, {0xfd47,0xe1de}, {0xfd48,0xe1df},
+ {0xfd49,0xe1e0}, {0xfd4a,0xe1e1}, {0xfd4b,0xe1e2}, {0xfd4c,0xe1e3},
+ {0xfd4d,0xe1e4}, {0xfd4e,0xe1e5}, {0xfd4f,0xe1e6}, {0xfd50,0xe1e7},
+ {0xfd51,0xe1e8}, {0xfd52,0xe1e9}, {0xfd53,0xe1ea}, {0xfd54,0xe1eb},
+ {0xfd55,0xe1ec}, {0xfd56,0xe1ed}, {0xfd57,0xe1ee}, {0xfd58,0xe1ef},
+ {0xfd59,0xe1f0}, {0xfd5a,0xe1f1}, {0xfd5b,0xe1f2}, {0xfd5c,0xe1f3},
+ {0xfd5d,0xe1f4}, {0xfd5e,0xe1f5}, {0xfd5f,0xe1f6}, {0xfd60,0xe1f7},
+ {0xfd61,0xe1f8}, {0xfd62,0xe1f9}, {0xfd63,0xe1fa}, {0xfd64,0xe1fb},
+ {0xfd65,0xe1fc}, {0xfd66,0xe1fd}, {0xfd67,0xe1fe}, {0xfd68,0xe1ff},
+ {0xfd69,0xe200}, {0xfd6a,0xe201}, {0xfd6b,0xe202}, {0xfd6c,0xe203},
+ {0xfd6d,0xe204}, {0xfd6e,0xe205}, {0xfd6f,0xe206}, {0xfd70,0xe207},
+ {0xfd71,0xe208}, {0xfd72,0xe209}, {0xfd73,0xe20a}, {0xfd74,0xe20b},
+ {0xfd75,0xe20c}, {0xfd76,0xe20d}, {0xfd77,0xe20e}, {0xfd78,0xe20f},
+ {0xfd79,0xe210}, {0xfd7a,0xe211}, {0xfd7b,0xe212}, {0xfd7c,0xe213},
+ {0xfd7d,0xe214}, {0xfd7e,0xe215}, {0xfda1,0xe216}, {0xfda2,0xe217},
+ {0xfda3,0xe218}, {0xfda4,0xe219}, {0xfda5,0xe21a}, {0xfda6,0xe21b},
+ {0xfda7,0xe21c}, {0xfda8,0xe21d}, {0xfda9,0xe21e}, {0xfdaa,0xe21f},
+ {0xfdab,0xe220}, {0xfdac,0xe221}, {0xfdad,0xe222}, {0xfdae,0xe223},
+ {0xfdaf,0xe224}, {0xfdb0,0xe225}, {0xfdb1,0xe226}, {0xfdb2,0xe227},
+ {0xfdb3,0xe228}, {0xfdb4,0xe229}, {0xfdb5,0xe22a}, {0xfdb6,0xe22b},
+ {0xfdb7,0xe22c}, {0xfdb8,0xe22d}, {0xfdb9,0xe22e}, {0xfdba,0xe22f},
+ {0xfdbb,0xe230}, {0xfdbc,0xe231}, {0xfdbd,0xe232}, {0xfdbe,0xe233},
+ {0xfdbf,0xe234}, {0xfdc0,0xe235}, {0xfdc1,0xe236}, {0xfdc2,0xe237},
+ {0xfdc3,0xe238}, {0xfdc4,0xe239}, {0xfdc5,0xe23a}, {0xfdc6,0xe23b},
+ {0xfdc7,0xe23c}, {0xfdc8,0xe23d}, {0xfdc9,0xe23e}, {0xfdca,0xe23f},
+ {0xfdcb,0xe240}, {0xfdcc,0xe241}, {0xfdcd,0xe242}, {0xfdce,0xe243},
+ {0xfdcf,0xe244}, {0xfdd0,0xe245}, {0xfdd1,0xe246}, {0xfdd2,0xe247},
+ {0xfdd3,0xe248}, {0xfdd4,0xe249}, {0xfdd5,0xe24a}, {0xfdd6,0xe24b},
+ {0xfdd7,0xe24c}, {0xfdd8,0xe24d}, {0xfdd9,0xe24e}, {0xfdda,0xe24f},
+ {0xfddb,0xe250}, {0xfddc,0xe251}, {0xfddd,0xe252}, {0xfdde,0xe253},
+ {0xfddf,0xe254}, {0xfde0,0xe255}, {0xfde1,0xe256}, {0xfde2,0xe257},
+ {0xfde3,0xe258}, {0xfde4,0xe259}, {0xfde5,0xe25a}, {0xfde6,0xe25b},
+ {0xfde7,0xe25c}, {0xfde8,0xe25d}, {0xfde9,0xe25e}, {0xfdea,0xe25f},
+ {0xfdeb,0xe260}, {0xfdec,0xe261}, {0xfded,0xe262}, {0xfdee,0xe263},
+ {0xfdef,0xe264}, {0xfdf0,0xe265}, {0xfdf1,0xe266}, {0xfdf2,0xe267},
+ {0xfdf3,0xe268}, {0xfdf4,0xe269}, {0xfdf5,0xe26a}, {0xfdf6,0xe26b},
+ {0xfdf7,0xe26c}, {0xfdf8,0xe26d}, {0xfdf9,0xe26e}, {0xfdfa,0xe26f},
+ {0xfdfb,0xe270}, {0xfdfc,0xe271}, {0xfdfd,0xe272}, {0xfdfe,0xe273},
+ {0xfe40,0xe274}, {0xfe41,0xe275}, {0xfe42,0xe276}, {0xfe43,0xe277},
+ {0xfe44,0xe278}, {0xfe45,0xe279}, {0xfe46,0xe27a}, {0xfe47,0xe27b},
+ {0xfe48,0xe27c}, {0xfe49,0xe27d}, {0xfe4a,0xe27e}, {0xfe4b,0xe27f},
+ {0xfe4c,0xe280}, {0xfe4d,0xe281}, {0xfe4e,0xe282}, {0xfe4f,0xe283},
+ {0xfe50,0xe284}, {0xfe51,0xe285}, {0xfe52,0xe286}, {0xfe53,0xe287},
+ {0xfe54,0xe288}, {0xfe55,0xe289}, {0xfe56,0xe28a}, {0xfe57,0xe28b},
+ {0xfe58,0xe28c}, {0xfe59,0xe28d}, {0xfe5a,0xe28e}, {0xfe5b,0xe28f},
+ {0xfe5c,0xe290}, {0xfe5d,0xe291}, {0xfe5e,0xe292}, {0xfe5f,0xe293},
+ {0xfe60,0xe294}, {0xfe61,0xe295}, {0xfe62,0xe296}, {0xfe63,0xe297},
+ {0xfe64,0xe298}, {0xfe65,0xe299}, {0xfe66,0xe29a}, {0xfe67,0xe29b},
+ {0xfe68,0xe29c}, {0xfe69,0xe29d}, {0xfe6a,0xe29e}, {0xfe6b,0xe29f},
+ {0xfe6c,0xe2a0}, {0xfe6d,0xe2a1}, {0xfe6e,0xe2a2}, {0xfe6f,0xe2a3},
+ {0xfe70,0xe2a4}, {0xfe71,0xe2a5}, {0xfe72,0xe2a6}, {0xfe73,0xe2a7},
+ {0xfe74,0xe2a8}, {0xfe75,0xe2a9}, {0xfe76,0xe2aa}, {0xfe77,0xe2ab},
+ {0xfe78,0xe2ac}, {0xfe79,0xe2ad}, {0xfe7a,0xe2ae}, {0xfe7b,0xe2af},
+ {0xfe7c,0xe2b0}, {0xfe7d,0xe2b1}, {0xfe7e,0xe2b2}, {0xfea1,0xe2b3},
+ {0xfea2,0xe2b4}, {0xfea3,0xe2b5}, {0xfea4,0xe2b6}, {0xfea5,0xe2b7},
+ {0xfea6,0xe2b8}, {0xfea7,0xe2b9}, {0xfea8,0xe2ba}, {0xfea9,0xe2bb},
+ {0xfeaa,0xe2bc}, {0xfeab,0xe2bd}, {0xfeac,0xe2be}, {0xfead,0xe2bf},
+ {0xfeae,0xe2c0}, {0xfeaf,0xe2c1}, {0xfeb0,0xe2c2}, {0xfeb1,0xe2c3},
+ {0xfeb2,0xe2c4}, {0xfeb3,0xe2c5}, {0xfeb4,0xe2c6}, {0xfeb5,0xe2c7},
+ {0xfeb6,0xe2c8}, {0xfeb7,0xe2c9}, {0xfeb8,0xe2ca}, {0xfeb9,0xe2cb},
+ {0xfeba,0xe2cc}, {0xfebb,0xe2cd}, {0xfebc,0xe2ce}, {0xfebd,0xe2cf},
+ {0xfebe,0xe2d0}, {0xfebf,0xe2d1}, {0xfec0,0xe2d2}, {0xfec1,0xe2d3},
+ {0xfec2,0xe2d4}, {0xfec3,0xe2d5}, {0xfec4,0xe2d6}, {0xfec5,0xe2d7},
+ {0xfec6,0xe2d8}, {0xfec7,0xe2d9}, {0xfec8,0xe2da}, {0xfec9,0xe2db},
+ {0xfeca,0xe2dc}, {0xfecb,0xe2dd}, {0xfecc,0xe2de}, {0xfecd,0xe2df},
+ {0xfece,0xe2e0}, {0xfecf,0xe2e1}, {0xfed0,0xe2e2}, {0xfed1,0xe2e3},
+ {0xfed2,0xe2e4}, {0xfed3,0xe2e5}, {0xfed4,0xe2e6}, {0xfed5,0xe2e7},
+ {0xfed6,0xe2e8}, {0xfed7,0xe2e9}, {0xfed8,0xe2ea}, {0xfed9,0xe2eb},
+ {0xfeda,0xe2ec}, {0xfedb,0xe2ed}, {0xfedc,0xe2ee}, {0xfedd,0xe2ef},
+ {0xfede,0xe2f0}, {0xfedf,0xe2f1}, {0xfee0,0xe2f2}, {0xfee1,0xe2f3},
+ {0xfee2,0xe2f4}, {0xfee3,0xe2f5}, {0xfee4,0xe2f6}, {0xfee5,0xe2f7},
+ {0xfee6,0xe2f8}, {0xfee7,0xe2f9}, {0xfee8,0xe2fa}, {0xfee9,0xe2fb},
+ {0xfeea,0xe2fc}, {0xfeeb,0xe2fd}, {0xfeec,0xe2fe}, {0xfeed,0xe2ff},
+ {0xfeee,0xe300}, {0xfeef,0xe301}, {0xfef0,0xe302}, {0xfef1,0xe303},
+ {0xfef2,0xe304}, {0xfef3,0xe305}, {0xfef4,0xe306}, {0xfef5,0xe307},
+ {0xfef6,0xe308}, {0xfef7,0xe309}, {0xfef8,0xe30a}, {0xfef9,0xe30b},
+ {0xfefa,0xe30c}, {0xfefb,0xe30d}, {0xfefc,0xe30e}, {0xfefd,0xe30f},
+ {0xfefe,0xe310}
+};
+
+static const B5Map uc_to_b5_map[] = {
+ {0xa2a4,0x2550}, {0xa2a5,0x255e}, {0xa2a7,0x2561}, {0xa2a6,0x256a},
+ {0xa27e,0x256d}, {0xa2a1,0x256e}, {0xa2a3,0x256f}, {0xa2a2,0x2570}
+};
+
+//All the tables are sorted on both x and y, so can be used for binary search
+static B5Index b5_map_table[5] = {
+ {b5_8140_to_uc_map , sizeof(b5_8140_to_uc_map)/sizeof(B5Map)},
+ {b5_8E40_to_uc_map , sizeof(b5_8E40_to_uc_map)/sizeof(B5Map)},
+ {b5_C6A1_to_uc_map , sizeof(b5_C6A1_to_uc_map)/sizeof(B5Map)},
+ {b5_FA40_to_uc_map , sizeof(b5_FA40_to_uc_map)/sizeof(B5Map)},
+ {uc_to_b5_map , sizeof(uc_to_b5_map)/sizeof(B5Map)}
+};
+
+static int qt_Big5ToUnicode(const uchar *buf, uint *u)
+{
+ //for this conversion only first 4 tables are used.
+ for(int i = 0; i < 4; i++) {
+ int start = 0;
+ int end = b5_map_table[i].tableSize - 1;
+
+ uint b5 = (buf[0] << 8) + buf[1];
+ while (start <= end) {
+ int middle = (end + start + 1)/2;
+ if (b5_map_table[i].table[middle].x == b5) {
+ *u = b5_map_table[i].table[middle].y;
+ return 2;
+ } else if (b5_map_table[i].table[middle].x > b5) {
+ end = middle - 1;
+ } else {
+ start = middle + 1;
+ }
+ }
+ }
+ return qt_Big5hkscsToUnicode(buf, u);
+}
+
+static int qt_UnicodeToBig5(ushort ch, uchar *buf)
+{
+ //all the tables are individually sorted on Y
+ for(int i = 0; i < 5; i++) {
+ int start = 0;
+ int end = b5_map_table[i].tableSize - 1;
+
+ while (start <= end) {
+ int middle = (end + start + 1)/2;
+ if (b5_map_table[i].table[middle].y == ch) {
+ buf[0] = b5_map_table[i].table[middle].x >> 8;
+ buf[1] = b5_map_table[i].table[middle].x & 0xff;
+ return 2;
+ } else if (b5_map_table[i].table[middle].y > ch) {
+ end = middle - 1;
+ } else {
+ start = middle + 1;
+ }
+ }
+ }
+ return qt_UnicodeToBig5hkscs(ch, buf);
+}
+
+QString QBig5Codec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ QChar replacement = QChar::ReplacementCharacter;
+ uchar buf[2] = {0};
+ int nbuf = 0;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ //qDebug("QBig5Codec::toUnicode(const char* chars = \"%s\", int len = %d)", chars, len);
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (IsLatin(ch)) {
+ // ASCII
+ result += QLatin1Char(ch);
+ } else if (IsFirstByte(ch)) {
+ // Big5-ETen
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ break;
+ case 1:
+ if (IsSecondByte(ch)) {
+ // Big5-ETen
+ uint u;
+ buf[1] = ch;
+ if (qt_Big5ToUnicode(buf, &u) == 2)
+ result += QValidChar(u);
+ else {
+ // Error
+ result += replacement;
+ ++invalid;
+ }
+ } else {
+ // Error
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+QByteArray QBig5Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i=0; i<len; i++) {
+ ushort ch = uc[i].unicode();
+ uchar c[2];
+ if (ch < 0x80) {
+ // ASCII
+ *cursor++ = ch;
+ } else if (qt_UnicodeToBig5(ch, c) == 2 && c[0] >= 0xa1 && c[0] <= 0xf9) {
+ *cursor++ = c[0];
+ *cursor++ = c[1];
+ } else {
+ *cursor++ = replacement;
+ ++invalid;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+QList<QByteArray> QBig5Codec::_aliases()
+{
+ QList<QByteArray> aliases;
+ aliases += "Big5-ETen";
+ aliases += "CP950";
+ return aliases;
+}
+
+int QBig5hkscsCodec::_mibEnum()
+{
+ return 2101;
+}
+
+
+QByteArray QBig5hkscsCodec::_name()
+{
+ return "Big5-HKSCS";
+}
+
+
+QString QBig5hkscsCodec::convertToUnicode(const char* chars, int len, ConverterState *state) const
+{
+ uchar buf[2] = {0};
+ int nbuf = 0;
+ QChar replacement = QChar::ReplacementCharacter;
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = QChar::Null;
+ nbuf = state->remainingChars;
+ buf[0] = state->state_data[0];
+ buf[1] = state->state_data[1];
+ }
+ int invalid = 0;
+
+ //qDebug("QBig5hkscsCodec::toUnicode(const char* chars = \"%s\", int len = %d)", chars, len);
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ switch (nbuf) {
+ case 0:
+ if (IsLatin(ch)) {
+ // ASCII
+ result += QLatin1Char(ch);
+ } else if (IsFirstByte(ch)) {
+ // Big5-HKSCS
+ buf[0] = ch;
+ nbuf = 1;
+ } else {
+ // Invalid
+ result += replacement;
+ ++invalid;
+ }
+ break;
+ case 1:
+ if (IsSecondByte(ch)) {
+ // Big5-HKSCS
+ uint u;
+ buf[1] = ch;
+ if (qt_Big5hkscsToUnicode(buf, &u) == 2)
+ result += QValidChar(u);
+ else {
+ // Error
+ result += replacement;
+ ++invalid;
+ }
+ } else {
+ // Error
+ result += replacement;
+ ++invalid;
+ }
+ nbuf = 0;
+ break;
+ }
+ }
+ if (state) {
+ state->remainingChars = nbuf;
+ state->state_data[0] = buf[0];
+ state->state_data[1] = buf[1];
+ state->invalidChars += invalid;
+ }
+ return result;
+}
+
+
+QByteArray QBig5hkscsCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *state) const
+{
+ char replacement = '?';
+ if (state) {
+ if (state->flags & ConvertInvalidToNull)
+ replacement = 0;
+ }
+
+ int invalid = 0;
+
+ int rlen = 2*len + 1;
+ QByteArray rstr;
+ rstr.resize(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i = 0; i < len; i++) {
+ unsigned short ch = uc[i].unicode();
+ uchar c[2];
+ if (ch < 0x80) {
+ // ASCII
+ *cursor++ = ch;
+ } else if (qt_UnicodeToBig5hkscs(ch, c) == 2) {
+ // Big5-HKSCS
+ *cursor++ = c[0];
+ *cursor++ = c[1];
+ } else {
+ // Error
+ *cursor++ = replacement;
+ }
+ }
+ rstr.resize(cursor - (uchar*)rstr.constData());
+
+ if (state) {
+ state->invalidChars += invalid;
+ }
+ return rstr;
+}
+
+
+
+#ifdef Q_WS_X11
+QFontBig5Codec::QFontBig5Codec()
+{
+ //qDebug("QFontBig5Codec::QFontBig5Codec()");
+}
+
+
+QByteArray QFontBig5Codec::_name()
+{
+ //qDebug("QFontBig5Codec::name() = \"big5-0\"");
+ return "big5-0";
+}
+
+
+int QFontBig5Codec::_mibEnum()
+{
+ //qDebug("QFontBig5Codec::mibEnum() = -2026");
+ return -2026;
+}
+
+
+QString QFontBig5Codec::convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontBig5Codec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ //qDebug("QFontBig5Codec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+ uchar c[2];
+
+#if 0
+ if (ch.row() == 0) {
+ if (ch.cell() == ' ')
+ ch = QChar(0x3000);
+ else if (ch.cell() > ' ' && ch.cell() < 127)
+ ch = QChar(ch.cell()-' ', 255);
+ }
+#endif
+ if (qt_UnicodeToBig5hkscs(ch.unicode(), c) == 2 &&
+ c[0] >= 0xa1 && c[0] <= 0xf9) {
+ *rdata++ = c[0];
+ *rdata++ = c[1];
+ } else {
+ *rdata++ = 0;
+ *rdata++ = 0;
+ }
+ }
+ return result;
+}
+
+
+
+QFontBig5hkscsCodec::QFontBig5hkscsCodec()
+{
+ //qDebug("QFontBig5hkscsCodec::QFontBig5hkscsCodec()");
+}
+
+
+QByteArray QFontBig5hkscsCodec::_name()
+{
+ //qDebug("QFontBig5hkscsCodec::name() = \"big5hkscs-0\"");
+ return "big5hkscs-0";
+}
+
+
+int QFontBig5hkscsCodec::_mibEnum()
+{
+ //qDebug("QFontBig5hkscsCodec::mibEnum() = -2101");
+ return -2101;
+}
+
+
+QString QFontBig5hkscsCodec::convertToUnicode(const char* /*chars*/, int /*len*/, ConverterState *) const
+{
+ return QString();
+}
+
+QByteArray QFontBig5hkscsCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *) const
+{
+ //qDebug("QFontBig5hkscsCodec::fromUnicode(const QString& uc, int& lenInOut = %d)", lenInOut);
+ QByteArray result;
+ result.resize(len * 2);
+ uchar *rdata = (uchar *) result.data();
+ const QChar *ucp = uc;
+
+ for (int i = 0; i < len; i++) {
+ QChar ch(*ucp++);
+ uchar c[2];
+
+#if 0
+ if (ch.row() == 0) {
+ if (ch.cell() == ' ')
+ ch = QChar(0x3000);
+ else if (ch.cell() > ' ' && ch.cell() < 127)
+ ch = QChar(ch.cell()-' ', 255);
+ }
+#endif
+ if (qt_UnicodeToBig5hkscs(ch.unicode(), c) == 2) {
+ *rdata++ = c[0];
+ *rdata++ = c[1];
+ } else {
+ //white square
+ *rdata++ = 0;
+ *rdata++ = 0;
+ }
+ }
+ return result;
+}
+
+
+#endif // Q_WS_X11
+
+/* ====================================================================== */
+
+/*
+ * big5hkscs to ucs4 convert routing
+ */
+
+static ushort const big5hkscs_to_ucs[] = {
+ /* Big5-HKSCS 0x8140 .. 0x817E */
+ 0xEEB8, 0xEEB9, 0xEEBA, 0xEEBB, 0xEEBC, 0xEEBD, 0xEEBE, 0xEEBF,
+ 0xEEC0, 0xEEC1, 0xEEC2, 0xEEC3, 0xEEC4, 0xEEC5, 0xEEC6, 0xEEC7,
+ 0xEEC8, 0xEEC9, 0xEECA, 0xEECB, 0xEECC, 0xEECD, 0xEECE, 0xEECF,
+ 0xEED0, 0xEED1, 0xEED2, 0xEED3, 0xEED4, 0xEED5, 0xEED6, 0xEED7,
+ 0xEED8, 0xEED9, 0xEEDA, 0xEEDB, 0xEEDC, 0xEEDD, 0xEEDE, 0xEEDF,
+ 0xEEE0, 0xEEE1, 0xEEE2, 0xEEE3, 0xEEE4, 0xEEE5, 0xEEE6, 0xEEE7,
+ 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB, 0xEEEC, 0xEEED, 0xEEEE, 0xEEEF,
+ 0xEEF0, 0xEEF1, 0xEEF2, 0xEEF3, 0xEEF4, 0xEEF5, 0xEEF6,
+ /* Big5-HKSCS 0x81A1 .. 0x81FE */
+ 0xEEF7, 0xEEF8, 0xEEF9, 0xEEFA, 0xEEFB, 0xEEFC, 0xEEFD,
+ 0xEEFE, 0xEEFF, 0xEF00, 0xEF01, 0xEF02, 0xEF03, 0xEF04, 0xEF05,
+ 0xEF06, 0xEF07, 0xEF08, 0xEF09, 0xEF0A, 0xEF0B, 0xEF0C, 0xEF0D,
+ 0xEF0E, 0xEF0F, 0xEF10, 0xEF11, 0xEF12, 0xEF13, 0xEF14, 0xEF15,
+ 0xEF16, 0xEF17, 0xEF18, 0xEF19, 0xEF1A, 0xEF1B, 0xEF1C, 0xEF1D,
+ 0xEF1E, 0xEF1F, 0xEF20, 0xEF21, 0xEF22, 0xEF23, 0xEF24, 0xEF25,
+ 0xEF26, 0xEF27, 0xEF28, 0xEF29, 0xEF2A, 0xEF2B, 0xEF2C, 0xEF2D,
+ 0xEF2E, 0xEF2F, 0xEF30, 0xEF31, 0xEF32, 0xEF33, 0xEF34, 0xEF35,
+ 0xEF36, 0xEF37, 0xEF38, 0xEF39, 0xEF3A, 0xEF3B, 0xEF3C, 0xEF3D,
+ 0xEF3E, 0xEF3F, 0xEF40, 0xEF41, 0xEF42, 0xEF43, 0xEF44, 0xEF45,
+ 0xEF46, 0xEF47, 0xEF48, 0xEF49, 0xEF4A, 0xEF4B, 0xEF4C, 0xEF4D,
+ 0xEF4E, 0xEF4F, 0xEF50, 0xEF51, 0xEF52, 0xEF53, 0xEF54,
+ /* Big5-HKSCS 0x8240 .. 0x827E */
+ 0xEF55, 0xEF56, 0xEF57, 0xEF58, 0xEF59, 0xEF5A, 0xEF5B, 0xEF5C,
+ 0xEF5D, 0xEF5E, 0xEF5F, 0xEF60, 0xEF61, 0xEF62, 0xEF63, 0xEF64,
+ 0xEF65, 0xEF66, 0xEF67, 0xEF68, 0xEF69, 0xEF6A, 0xEF6B, 0xEF6C,
+ 0xEF6D, 0xEF6E, 0xEF6F, 0xEF70, 0xEF71, 0xEF72, 0xEF73, 0xEF74,
+ 0xEF75, 0xEF76, 0xEF77, 0xEF78, 0xEF79, 0xEF7A, 0xEF7B, 0xEF7C,
+ 0xEF7D, 0xEF7E, 0xEF7F, 0xEF80, 0xEF81, 0xEF82, 0xEF83, 0xEF84,
+ 0xEF85, 0xEF86, 0xEF87, 0xEF88, 0xEF89, 0xEF8A, 0xEF8B, 0xEF8C,
+ 0xEF8D, 0xEF8E, 0xEF8F, 0xEF90, 0xEF91, 0xEF92, 0xEF93,
+ /* Big5-HKSCS 0x82A1 .. 0x82FE */
+ 0xEF94, 0xEF95, 0xEF96, 0xEF97, 0xEF98, 0xEF99, 0xEF9A,
+ 0xEF9B, 0xEF9C, 0xEF9D, 0xEF9E, 0xEF9F, 0xEFA0, 0xEFA1, 0xEFA2,
+ 0xEFA3, 0xEFA4, 0xEFA5, 0xEFA6, 0xEFA7, 0xEFA8, 0xEFA9, 0xEFAA,
+ 0xEFAB, 0xEFAC, 0xEFAD, 0xEFAE, 0xEFAF, 0xEFB0, 0xEFB1, 0xEFB2,
+ 0xEFB3, 0xEFB4, 0xEFB5, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9, 0xEFBA,
+ 0xEFBB, 0xEFBC, 0xEFBD, 0xEFBE, 0xEFBF, 0xEFC0, 0xEFC1, 0xEFC2,
+ 0xEFC3, 0xEFC4, 0xEFC5, 0xEFC6, 0xEFC7, 0xEFC8, 0xEFC9, 0xEFCA,
+ 0xEFCB, 0xEFCC, 0xEFCD, 0xEFCE, 0xEFCF, 0xEFD0, 0xEFD1, 0xEFD2,
+ 0xEFD3, 0xEFD4, 0xEFD5, 0xEFD6, 0xEFD7, 0xEFD8, 0xEFD9, 0xEFDA,
+ 0xEFDB, 0xEFDC, 0xEFDD, 0xEFDE, 0xEFDF, 0xEFE0, 0xEFE1, 0xEFE2,
+ 0xEFE3, 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7, 0xEFE8, 0xEFE9, 0xEFEA,
+ 0xEFEB, 0xEFEC, 0xEFED, 0xEFEE, 0xEFEF, 0xEFF0, 0xEFF1,
+ /* Big5-HKSCS 0x8340 .. 0x837E */
+ 0xEFF2, 0xEFF3, 0xEFF4, 0xEFF5, 0xEFF6, 0xEFF7, 0xEFF8, 0xEFF9,
+ 0xEFFA, 0xEFFB, 0xEFFC, 0xEFFD, 0xEFFE, 0xEFFF, 0xF000, 0xF001,
+ 0xF002, 0xF003, 0xF004, 0xF005, 0xF006, 0xF007, 0xF008, 0xF009,
+ 0xF00A, 0xF00B, 0xF00C, 0xF00D, 0xF00E, 0xF00F, 0xF010, 0xF011,
+ 0xF012, 0xF013, 0xF014, 0xF015, 0xF016, 0xF017, 0xF018, 0xF019,
+ 0xF01A, 0xF01B, 0xF01C, 0xF01D, 0xF01E, 0xF01F, 0xF020, 0xF021,
+ 0xF022, 0xF023, 0xF024, 0xF025, 0xF026, 0xF027, 0xF028, 0xF029,
+ 0xF02A, 0xF02B, 0xF02C, 0xF02D, 0xF02E, 0xF02F, 0xF030,
+ /* Big5-HKSCS 0x83A1 .. 0x83FE */
+ 0xF031, 0xF032, 0xF033, 0xF034, 0xF035, 0xF036, 0xF037,
+ 0xF038, 0xF039, 0xF03A, 0xF03B, 0xF03C, 0xF03D, 0xF03E, 0xF03F,
+ 0xF040, 0xF041, 0xF042, 0xF043, 0xF044, 0xF045, 0xF046, 0xF047,
+ 0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D, 0xF04E, 0xF04F,
+ 0xF050, 0xF051, 0xF052, 0xF053, 0xF054, 0xF055, 0xF056, 0xF057,
+ 0xF058, 0xF059, 0xF05A, 0xF05B, 0xF05C, 0xF05D, 0xF05E, 0xF05F,
+ 0xF060, 0xF061, 0xF062, 0xF063, 0xF064, 0xF065, 0xF066, 0xF067,
+ 0xF068, 0xF069, 0xF06A, 0xF06B, 0xF06C, 0xF06D, 0xF06E, 0xF06F,
+ 0xF070, 0xF071, 0xF072, 0xF073, 0xF074, 0xF075, 0xF076, 0xF077,
+ 0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C, 0xF07D, 0xF07E, 0xF07F,
+ 0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085, 0xF086, 0xF087,
+ 0xF088, 0xF089, 0xF08A, 0xF08B, 0xF08C, 0xF08D, 0xF08E,
+ /* Big5-HKSCS 0x8440 .. 0x847E */
+ 0xF08F, 0xF090, 0xF091, 0xF092, 0xF093, 0xF094, 0xF095, 0xF096,
+ 0xF097, 0xF098, 0xF099, 0xF09A, 0xF09B, 0xF09C, 0xF09D, 0xF09E,
+ 0xF09F, 0xF0A0, 0xF0A1, 0xF0A2, 0xF0A3, 0xF0A4, 0xF0A5, 0xF0A6,
+ 0xF0A7, 0xF0A8, 0xF0A9, 0xF0AA, 0xF0AB, 0xF0AC, 0xF0AD, 0xF0AE,
+ 0xF0AF, 0xF0B0, 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xF0B6,
+ 0xF0B7, 0xF0B8, 0xF0B9, 0xF0BA, 0xF0BB, 0xF0BC, 0xF0BD, 0xF0BE,
+ 0xF0BF, 0xF0C0, 0xF0C1, 0xF0C2, 0xF0C3, 0xF0C4, 0xF0C5, 0xF0C6,
+ 0xF0C7, 0xF0C8, 0xF0C9, 0xF0CA, 0xF0CB, 0xF0CC, 0xF0CD,
+ /* Big5-HKSCS 0x84A1 .. 0x84FE */
+ 0xF0CE, 0xF0CF, 0xF0D0, 0xF0D1, 0xF0D2, 0xF0D3, 0xF0D4,
+ 0xF0D5, 0xF0D6, 0xF0D7, 0xF0D8, 0xF0D9, 0xF0DA, 0xF0DB, 0xF0DC,
+ 0xF0DD, 0xF0DE, 0xF0DF, 0xF0E0, 0xF0E1, 0xF0E2, 0xF0E3, 0xF0E4,
+ 0xF0E5, 0xF0E6, 0xF0E7, 0xF0E8, 0xF0E9, 0xF0EA, 0xF0EB, 0xF0EC,
+ 0xF0ED, 0xF0EE, 0xF0EF, 0xF0F0, 0xF0F1, 0xF0F2, 0xF0F3, 0xF0F4,
+ 0xF0F5, 0xF0F6, 0xF0F7, 0xF0F8, 0xF0F9, 0xF0FA, 0xF0FB, 0xF0FC,
+ 0xF0FD, 0xF0FE, 0xF0FF, 0xF100, 0xF101, 0xF102, 0xF103, 0xF104,
+ 0xF105, 0xF106, 0xF107, 0xF108, 0xF109, 0xF10A, 0xF10B, 0xF10C,
+ 0xF10D, 0xF10E, 0xF10F, 0xF110, 0xF111, 0xF112, 0xF113, 0xF114,
+ 0xF115, 0xF116, 0xF117, 0xF118, 0xF119, 0xF11A, 0xF11B, 0xF11C,
+ 0xF11D, 0xF11E, 0xF11F, 0xF120, 0xF121, 0xF122, 0xF123, 0xF124,
+ 0xF125, 0xF126, 0xF127, 0xF128, 0xF129, 0xF12A, 0xF12B,
+ /* Big5-HKSCS 0x8540 .. 0x857E */
+ 0xF12C, 0xF12D, 0xF12E, 0xF12F, 0xF130, 0xF131, 0xF132, 0xF133,
+ 0xF134, 0xF135, 0xF136, 0xF137, 0xF138, 0xF139, 0xF13A, 0xF13B,
+ 0xF13C, 0xF13D, 0xF13E, 0xF13F, 0xF140, 0xF141, 0xF142, 0xF143,
+ 0xF144, 0xF145, 0xF146, 0xF147, 0xF148, 0xF149, 0xF14A, 0xF14B,
+ 0xF14C, 0xF14D, 0xF14E, 0xF14F, 0xF150, 0xF151, 0xF152, 0xF153,
+ 0xF154, 0xF155, 0xF156, 0xF157, 0xF158, 0xF159, 0xF15A, 0xF15B,
+ 0xF15C, 0xF15D, 0xF15E, 0xF15F, 0xF160, 0xF161, 0xF162, 0xF163,
+ 0xF164, 0xF165, 0xF166, 0xF167, 0xF168, 0xF169, 0xF16A,
+ /* Big5-HKSCS 0x85A1 .. 0x85FE */
+ 0xF16B, 0xF16C, 0xF16D, 0xF16E, 0xF16F, 0xF170, 0xF171,
+ 0xF172, 0xF173, 0xF174, 0xF175, 0xF176, 0xF177, 0xF178, 0xF179,
+ 0xF17A, 0xF17B, 0xF17C, 0xF17D, 0xF17E, 0xF17F, 0xF180, 0xF181,
+ 0xF182, 0xF183, 0xF184, 0xF185, 0xF186, 0xF187, 0xF188, 0xF189,
+ 0xF18A, 0xF18B, 0xF18C, 0xF18D, 0xF18E, 0xF18F, 0xF190, 0xF191,
+ 0xF192, 0xF193, 0xF194, 0xF195, 0xF196, 0xF197, 0xF198, 0xF199,
+ 0xF19A, 0xF19B, 0xF19C, 0xF19D, 0xF19E, 0xF19F, 0xF1A0, 0xF1A1,
+ 0xF1A2, 0xF1A3, 0xF1A4, 0xF1A5, 0xF1A6, 0xF1A7, 0xF1A8, 0xF1A9,
+ 0xF1AA, 0xF1AB, 0xF1AC, 0xF1AD, 0xF1AE, 0xF1AF, 0xF1B0, 0xF1B1,
+ 0xF1B2, 0xF1B3, 0xF1B4, 0xF1B5, 0xF1B6, 0xF1B7, 0xF1B8, 0xF1B9,
+ 0xF1BA, 0xF1BB, 0xF1BC, 0xF1BD, 0xF1BE, 0xF1BF, 0xF1C0, 0xF1C1,
+ 0xF1C2, 0xF1C3, 0xF1C4, 0xF1C5, 0xF1C6, 0xF1C7, 0xF1C8,
+ /* Big5-HKSCS 0x8640 .. 0x867E */
+ 0xF1C9, 0xF1CA, 0xF1CB, 0xF1CC, 0xF1CD, 0xF1CE, 0xF1CF, 0xF1D0,
+ 0xF1D1, 0xF1D2, 0xF1D3, 0xF1D4, 0xF1D5, 0xF1D6, 0xF1D7, 0xF1D8,
+ 0xF1D9, 0xF1DA, 0xF1DB, 0xF1DC, 0xF1DD, 0xF1DE, 0xF1DF, 0xF1E0,
+ 0xF1E1, 0xF1E2, 0xF1E3, 0xF1E4, 0xF1E5, 0xF1E6, 0xF1E7, 0xF1E8,
+ 0xF1E9, 0xF1EA, 0xF1EB, 0xF1EC, 0xF1ED, 0xF1EE, 0xF1EF, 0xF1F0,
+ 0xF1F1, 0xF1F2, 0xF1F3, 0xF1F4, 0xF1F5, 0xF1F6, 0xF1F7, 0xF1F8,
+ 0xF1F9, 0xF1FA, 0xF1FB, 0xF1FC, 0xF1FD, 0xF1FE, 0xF1FF, 0xF200,
+ 0xF201, 0xF202, 0xF203, 0xF204, 0xF205, 0xF206, 0xF207,
+ /* Big5-HKSCS 0x86A1 .. 0x86FE */
+ 0xF208, 0xF209, 0xF20A, 0xF20B, 0xF20C, 0xF20D, 0xF20E,
+ 0xF20F, 0xF210, 0xF211, 0xF212, 0xF213, 0xF214, 0xF215, 0xF216,
+ 0xF217, 0xF218, 0xF219, 0xF21A, 0xF21B, 0xF21C, 0xF21D, 0xF21E,
+ 0xF21F, 0xF220, 0xF221, 0xF222, 0xF223, 0xF224, 0xF225, 0xF226,
+ 0xF227, 0xF228, 0xF229, 0xF22A, 0xF22B, 0xF22C, 0xF22D, 0xF22E,
+ 0xF22F, 0xF230, 0xF231, 0xF232, 0xF233, 0xF234, 0xF235, 0xF236,
+ 0xF237, 0xF238, 0xF239, 0xF23A, 0xF23B, 0xF23C, 0xF23D, 0xF23E,
+ 0xF23F, 0xF240, 0xF241, 0xF242, 0xF243, 0xF244, 0xF245, 0xF246,
+ 0xF247, 0xF248, 0xF249, 0xF24A, 0xF24B, 0xF24C, 0xF24D, 0xF24E,
+ 0xF24F, 0xF250, 0xF251, 0xF252, 0xF253, 0xF254, 0xF255, 0xF256,
+ 0xF257, 0xF258, 0xF259, 0xF25A, 0xF25B, 0xF25C, 0xF25D, 0xF25E,
+ 0xF25F, 0xF260, 0xF261, 0xF262, 0xF263, 0xF264, 0xF265,
+ /* Big5-HKSCS 0x8740 .. 0x877E */
+ 0xF266, 0xF267, 0xF268, 0xF269, 0xF26A, 0xF26B, 0xF26C, 0xF26D,
+ 0xF26E, 0xF26F, 0xF270, 0xF271, 0xF272, 0xF273, 0xF274, 0xF275,
+ 0xF276, 0xF277, 0xF278, 0xF279, 0xF27A, 0xF27B, 0xF27C, 0xF27D,
+ 0xF27E, 0xF27F, 0xF280, 0xF281, 0xF282, 0xF283, 0xF284, 0xF285,
+ 0xF286, 0xF287, 0xF288, 0xF289, 0xF28A, 0xF28B, 0xF28C, 0xF28D,
+ 0xF28E, 0xF28F, 0xF290, 0xF291, 0xF292, 0xF293, 0xF294, 0xF295,
+ 0xF296, 0xF297, 0xF298, 0xF299, 0xF29A, 0xF29B, 0xF29C, 0xF29D,
+ 0xF29E, 0xF29F, 0xF2A0, 0xF2A1, 0xF2A2, 0xF2A3, 0xF2A4,
+ /* Big5-HKSCS 0x87A1 .. 0x87FE */
+ 0xF2A5, 0xF2A6, 0xF2A7, 0xF2A8, 0xF2A9, 0xF2AA, 0xF2AB,
+ 0xF2AC, 0xF2AD, 0xF2AE, 0xF2AF, 0xF2B0, 0xF2B1, 0xF2B2, 0xF2B3,
+ 0xF2B4, 0xF2B5, 0xF2B6, 0xF2B7, 0xF2B8, 0xF2B9, 0xF2BA, 0xF2BB,
+ 0xF2BC, 0xF2BD, 0xF2BE, 0xF2BF, 0xF2C0, 0xF2C1, 0xF2C2, 0xF2C3,
+ 0xF2C4, 0xF2C5, 0xF2C6, 0xF2C7, 0xF2C8, 0xF2C9, 0xF2CA, 0xF2CB,
+ 0xF2CC, 0xF2CD, 0xF2CE, 0xF2CF, 0xF2D0, 0xF2D1, 0xF2D2, 0xF2D3,
+ 0xF2D4, 0xF2D5, 0xF2D6, 0xF2D7, 0xF2D8, 0xF2D9, 0xF2DA, 0xF2DB,
+ 0xF2DC, 0xF2DD, 0xF2DE, 0xF2DF, 0xF2E0, 0xF2E1, 0xF2E2, 0xF2E3,
+ 0xF2E4, 0xF2E5, 0xF2E6, 0xF2E7, 0xF2E8, 0xF2E9, 0xF2EA, 0xF2EB,
+ 0xF2EC, 0xF2ED, 0xF2EE, 0xF2EF, 0xF2F0, 0xF2F1, 0xF2F2, 0xF2F3,
+ 0xF2F4, 0xF2F5, 0xF2F6, 0xF2F7, 0xF2F8, 0xF2F9, 0xF2FA, 0xF2FB,
+ 0xF2FC, 0xF2FD, 0xF2FE, 0xF2FF, 0xF300, 0xF301, 0xF302,
+ /* Big5-HKSCS 0x8840 .. 0x887E */
+ 0xF303, 0xF304, 0xF305, 0xF306, 0xF307, 0xF308, 0xF309, 0xF30A,
+ 0xF30B, 0xF30C, 0xF30D, 0xF30E, 0xF30F, 0xF310, 0xF311, 0xF312,
+ 0xF313, 0xF314, 0xF315, 0xF316, 0xF317, 0xF318, 0x0100, 0x00C1,
+ 0x01CD, 0x00C0, 0x0112, 0x00C9, 0x011A, 0x00C8, 0x014C, 0x00D3,
+ 0x01D1, 0x00D2, 0xF325, 0x1EBE, 0xF327, 0x1EC0, 0x00CA, 0x0101,
+ 0x00E1, 0x01CE, 0x00E0, 0x0251, 0x0113, 0x00E9, 0x011B, 0x00E8,
+ 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2,
+ 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA,
+ /* Big5-HKSCS 0x88A1 .. 0x88FE */
+ 0x01DC, 0x00FC, 0xF344, 0x1EBF, 0xF346, 0x1EC1, 0x00EA,
+ 0x0261, 0xF34A, 0xF34B, 0xF34C, 0xF34D, 0xF34E, 0xF34F, 0xF350,
+ 0xF351, 0xF352, 0xF353, 0xF354, 0xF355, 0xF356, 0xF357, 0xF358,
+ 0xF359, 0xF35A, 0xF35B, 0xF35C, 0xF35D, 0xF35E, 0xF35F, 0xF360,
+ 0xF361, 0xF362, 0xF363, 0xF364, 0xF365, 0xF366, 0xF367, 0xF368,
+ 0xF369, 0xF36A, 0xF36B, 0xF36C, 0xF36D, 0xF36E, 0xF36F, 0xF370,
+ 0xF371, 0xF372, 0xF373, 0xF374, 0xF375, 0xF376, 0xF377, 0xF378,
+ 0xF379, 0xF37A, 0xF37B, 0xF37C, 0xF37D, 0xF37E, 0xF37F, 0xF380,
+ 0xF381, 0xF382, 0xF383, 0xF384, 0xF385, 0xF386, 0xF387, 0xF388,
+ 0xF389, 0xF38A, 0xF38B, 0xF38C, 0xF38D, 0xF38E, 0xF38F, 0xF390,
+ 0xF391, 0xF392, 0xF393, 0xF394, 0xF395, 0xF396, 0xF397, 0xF398,
+ 0xF399, 0xF39A, 0xF39B, 0xF39C, 0xF39D, 0xF39E, 0xF39F,
+ /* Big5-HKSCS 0x8940 .. 0x897E */
+ 0xF3A0, 0xF3A1, 0xF3A2, 0x650A, 0xF3A4, 0xF3A5, 0x4E3D, 0x6EDD,
+ 0x9D4E, 0x91DF, 0xF3AA, 0xF3AB, 0xF3AC, 0x6491, 0x4F1A, 0x4F28,
+ 0x4FA8, 0x5156, 0x5174, 0x519C, 0x51E4, 0x52A1, 0x52A8, 0x533B,
+ 0x534E, 0x53D1, 0x53D8, 0x56E2, 0x58F0, 0x5904, 0x5907, 0x5932,
+ 0x5934, 0x5B66, 0x5B9E, 0x5B9F, 0x5C9A, 0x5E86, 0x603B, 0x6589,
+ 0x67FE, 0x6804, 0x6865, 0x6D4E, 0x70BC, 0x7535, 0x7EA4, 0x7EAC,
+ 0x7EBA, 0x7EC7, 0x7ECF, 0x7EDF, 0x7F06, 0x7F37, 0x827A, 0x82CF,
+ 0x836F, 0x89C6, 0x8BBE, 0x8BE2, 0x8F66, 0x8F67, 0x8F6E,
+ /* Big5-HKSCS 0x89A1 .. 0x89FE */
+ 0x7411, 0x7CFC, 0x7DCD, 0x6946, 0x7AC9, 0x5227, 0xF3E5,
+ 0xF3E6, 0xF3E7, 0xF3E8, 0x918C, 0x78B8, 0x915E, 0x80BC, 0xF3ED,
+ 0x8D0B, 0x80F6, 0xF3F0, 0xF3F1, 0xF3F2, 0x809F, 0x9EC7, 0x4CCD,
+ 0x9DC9, 0x9E0C, 0x4C3E, 0xF3F9, 0xF3FA, 0x9E0A, 0xF3FC, 0x35C1,
+ 0xF3FE, 0x6E9A, 0x823E, 0x7519, 0xF402, 0x4911, 0x9A6C, 0x9A8F,
+ 0x9F99, 0x7987, 0xF408, 0xF409, 0xF40A, 0xF40B, 0x4E24, 0x4E81,
+ 0x4E80, 0x4E87, 0x4EBF, 0x4EEB, 0x4F37, 0x344C, 0x4FBD, 0x3E48,
+ 0x5003, 0x5088, 0x347D, 0x3493, 0x34A5, 0x5186, 0x5905, 0x51DB,
+ 0x51FC, 0x5205, 0x4E89, 0x5279, 0x5290, 0x5327, 0x35C7, 0x53A9,
+ 0x3551, 0x53B0, 0x3553, 0x53C2, 0x5423, 0x356D, 0x3572, 0x3681,
+ 0x5493, 0x54A3, 0x54B4, 0x54B9, 0x54D0, 0x54EF, 0x5518, 0x5523,
+ 0x5528, 0x3598, 0x553F, 0x35A5, 0x35BF, 0x55D7, 0x35C5,
+ /* Big5-HKSCS 0x8A40 .. 0x8A7E */
+ 0xF43D, 0x5525, 0xF43F, 0xF440, 0xF441, 0xF442, 0x5590, 0xF444,
+ 0x39EC, 0xF446, 0x8E46, 0xF448, 0xF449, 0x4053, 0xF44B, 0x777A,
+ 0xF44D, 0x3A34, 0x47D5, 0xF450, 0xF451, 0xF452, 0x64DD, 0xF454,
+ 0xF455, 0xF456, 0xF457, 0x648D, 0x8E7E, 0xF45A, 0xF45B, 0xF45C,
+ 0xF45D, 0xF45E, 0xF45F, 0xF460, 0xF461, 0xF462, 0xF463, 0x47F4,
+ 0xF465, 0xF466, 0x9AB2, 0x3A67, 0xF469, 0x3FED, 0x3506, 0xF46C,
+ 0xF46D, 0xF46E, 0xF46F, 0x9D6E, 0x9815, 0xF472, 0x43D9, 0xF474,
+ 0x64B4, 0x54E3, 0xF477, 0xF478, 0xF479, 0x39FB, 0xF47B,
+ /* Big5-HKSCS 0x8AA1 .. 0x8AFE */
+ 0xF47C, 0xF47D, 0xF47E, 0x64EA, 0xF480, 0xF481, 0x8E68,
+ 0xF483, 0xF484, 0xF485, 0xF486, 0x480B, 0xF488, 0x3FFA, 0x5873,
+ 0xF48B, 0xF48C, 0xF48D, 0xF48E, 0xF48F, 0xF490, 0xF491, 0x5579,
+ 0x40BB, 0x43BA, 0xF495, 0x4AB4, 0xF497, 0xF498, 0x81AA, 0x98F5,
+ 0xF49B, 0x6379, 0x39FE, 0xF49E, 0x8DC0, 0x56A1, 0x647C, 0x3E43,
+ 0xF4A3, 0xF4A4, 0xF4A5, 0xF4A6, 0xF4A7, 0xF4A8, 0xF4A9, 0xF4AA,
+ 0x3992, 0x3A06, 0xF4AD, 0x3578, 0xF4AF, 0xF4B0, 0x5652, 0xF4B2,
+ 0xF4B3, 0xF4B4, 0x34BC, 0x6C3D, 0xF4B7, 0xF4B8, 0xF4B9, 0xF4BA,
+ 0xF4BB, 0xF4BC, 0xF4BD, 0xF4BE, 0xF4BF, 0xF4C0, 0xF4C1, 0x7F93,
+ 0xF4C3, 0xF4C4, 0xF4C5, 0x35FB, 0xF4C7, 0xF4C8, 0xF4C9, 0xF4CA,
+ 0x3F93, 0xF4CC, 0xF4CD, 0xF4CE, 0xF4CF, 0xF4D0, 0xF4D1, 0xF4D2,
+ 0xF4D3, 0xF4D4, 0xF4D5, 0x3FF9, 0xF4D7, 0x6432, 0xF4D9,
+ /* Big5-HKSCS 0x8B40 .. 0x8B7E */
+ 0xF4DA, 0xF4DB, 0xF4DC, 0xF4DD, 0xF4DE, 0xF4DF, 0xF4E0, 0x3A18,
+ 0xF4E2, 0xF4E3, 0xF4E4, 0xF4E5, 0xF4E6, 0xF4E7, 0xF4E8, 0xF4E9,
+ 0x95AA, 0x54CC, 0x82C4, 0x55B9, 0xF4EE, 0xF4EF, 0x9C26, 0x9AB6,
+ 0xF4F2, 0xF4F3, 0x7140, 0x816D, 0x80EC, 0x5C1C, 0xF4F8, 0x8134,
+ 0x3797, 0x535F, 0xF4FC, 0x91B6, 0xF4FE, 0xF4FF, 0xF500, 0xF501,
+ 0x35DD, 0xF503, 0x3609, 0xF505, 0x56AF, 0xF507, 0xF508, 0xF509,
+ 0xF50A, 0xF50B, 0xF50C, 0xF50D, 0xF50E, 0xF50F, 0xF510, 0xF511,
+ 0x5A54, 0xF513, 0xF514, 0xF515, 0xF516, 0x579C, 0xF518,
+ /* Big5-HKSCS 0x8BA1 .. 0x8BFE */
+ 0xF519, 0xF51A, 0xF51B, 0xF51C, 0xF51D, 0x3703, 0xF51F,
+ 0xF520, 0xF521, 0xF522, 0xF523, 0xF524, 0xF525, 0xF526, 0x5899,
+ 0x5268, 0x361A, 0xF52A, 0x7BB2, 0x5B68, 0x4800, 0x4B2C, 0x9F27,
+ 0x49E7, 0x9C1F, 0x9B8D, 0xF533, 0xF534, 0x55FB, 0x35F2, 0x5689,
+ 0x4E28, 0x5902, 0xF53A, 0xF53B, 0x9751, 0xF53D, 0x4E5B, 0x4EBB,
+ 0x353E, 0x5C23, 0x5F51, 0x5FC4, 0x38FA, 0x624C, 0x6535, 0x6B7A,
+ 0x6C35, 0x6C3A, 0x706C, 0x722B, 0x4E2C, 0x72AD, 0xF54E, 0x7F52,
+ 0x793B, 0x7CF9, 0x7F53, 0xF553, 0x34C1, 0xF555, 0xF556, 0x8002,
+ 0x8080, 0xF559, 0xF55A, 0x535D, 0x8864, 0x89C1, 0xF55E, 0x8BA0,
+ 0x8D1D, 0x9485, 0x9578, 0x957F, 0x95E8, 0xF565, 0x97E6, 0x9875,
+ 0x98CE, 0x98DE, 0x9963, 0xF56B, 0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F,
+ 0xF907, 0x4E37, 0xF572, 0x961D, 0x6237, 0x94A2, 0xF576,
+ /* Big5-HKSCS 0x8C40 .. 0x8C7E */
+ 0x503B, 0x6DFE, 0xF579, 0xF57A, 0x3DC9, 0x888F, 0xF57D, 0x7077,
+ 0x5CF5, 0x4B20, 0xF581, 0x3559, 0xF583, 0x6122, 0xF585, 0x8FA7,
+ 0x91F6, 0x7191, 0x6719, 0x73BA, 0xF58B, 0xF58C, 0x3C8B, 0xF58E,
+ 0x4B10, 0x78E4, 0x7402, 0x51AE, 0xF593, 0x4009, 0x6A63, 0xF596,
+ 0x4223, 0x860F, 0xF599, 0x7A2A, 0xF59B, 0xF59C, 0x9755, 0x704D,
+ 0x5324, 0xF5A0, 0x93F4, 0x76D9, 0xF5A3, 0xF5A4, 0x77DD, 0x4EA3,
+ 0x4FF0, 0x50BC, 0x4E2F, 0x4F17, 0xF5AB, 0x5434, 0x7D8B, 0x5892,
+ 0x58D0, 0xF5B0, 0x5E92, 0x5E99, 0x5FC2, 0xF5B4, 0x658B,
+ /* Big5-HKSCS 0x8CA1 .. 0x8CFE */
+ 0xF5B6, 0x6919, 0x6A43, 0xF5B9, 0x6CFF, 0xF5BB, 0x7200,
+ 0xF5BD, 0x738C, 0x3EDB, 0xF5C0, 0x5B15, 0x74B9, 0x8B83, 0xF5C4,
+ 0xF5C5, 0x7A93, 0x7BEC, 0x7CC3, 0x7E6C, 0x82F8, 0x8597, 0xF5CC,
+ 0x8890, 0xF5CE, 0x8EB9, 0xF5D0, 0x8FCF, 0x855F, 0x99E0, 0x9221,
+ 0xF5D5, 0xF5D6, 0xF5D7, 0x4071, 0x42A2, 0x5A1A, 0xF5DB, 0xF5DC,
+ 0xF5DD, 0x9868, 0x676B, 0x4276, 0x573D, 0xF5E2, 0x85D6, 0xF5E4,
+ 0x82BF, 0xF5E6, 0x4C81, 0xF5E8, 0x5D7B, 0xF5EA, 0xF5EB, 0xF5EC,
+ 0xF5ED, 0x5B96, 0xF5EF, 0xF5F0, 0x7E5B, 0xF5F2, 0xF5F3, 0xF5F4,
+ 0xF5F5, 0xF5F6, 0xF5F7, 0xF5F8, 0xF5F9, 0xF5FA, 0xF5FB, 0xF5FC,
+ 0xF5FD, 0xF5FE, 0xF5FF, 0xF600, 0xF601, 0xF602, 0xF603, 0xF604,
+ 0xF605, 0xF606, 0xF607, 0xF608, 0xF609, 0xF60A, 0xF60B, 0xF60C,
+ 0xF60D, 0xF60E, 0xF60F, 0xF610, 0xF611, 0xF612, 0xF613,
+ /* Big5-HKSCS 0x8D40 .. 0x8D7E */
+ 0xF614, 0xF615, 0xF616, 0xF617, 0xF618, 0xF619, 0xF61A, 0xF61B,
+ 0xF61C, 0xF61D, 0xF61E, 0xF61F, 0xF620, 0xF621, 0xF622, 0xF623,
+ 0xF624, 0xF625, 0xF626, 0xF627, 0xF628, 0xF629, 0xF62A, 0xF62B,
+ 0xF62C, 0xF62D, 0xF62E, 0xF62F, 0xF630, 0xF631, 0xF632, 0xF633,
+ 0x5D3E, 0x5D48, 0x5D56, 0x3DFC, 0x380F, 0x5DA4, 0x5DB9, 0x3820,
+ 0x3838, 0x5E42, 0x5EBD, 0x5F25, 0x5F83, 0x3908, 0x3914, 0x393F,
+ 0x394D, 0x60D7, 0x613D, 0x5CE5, 0x3989, 0x61B7, 0x61B9, 0x61CF,
+ 0x39B8, 0x622C, 0x6290, 0x62E5, 0x6318, 0x39F8, 0x56B1,
+ /* Big5-HKSCS 0x8DA1 .. 0x8DFE */
+ 0x3A03, 0x63E2, 0x63FB, 0x6407, 0x645A, 0x3A4B, 0x64C0,
+ 0x5D15, 0x5621, 0x9F9F, 0x3A97, 0x6586, 0x3ABD, 0x65FF, 0x6653,
+ 0x3AF2, 0x6692, 0x3B22, 0x6716, 0x3B42, 0x67A4, 0x6800, 0x3B58,
+ 0x684A, 0x6884, 0x3B72, 0x3B71, 0x3B7B, 0x6909, 0x6943, 0x725C,
+ 0x6964, 0x699F, 0x6985, 0x3BBC, 0x69D6, 0x3BDD, 0x6A65, 0x6A74,
+ 0x6A71, 0x6A82, 0x3BEC, 0x6A99, 0x3BF2, 0x6AAB, 0x6AB5, 0x6AD4,
+ 0x6AF6, 0x6B81, 0x6BC1, 0x6BEA, 0x6C75, 0x6CAA, 0x3CCB, 0x6D02,
+ 0x6D06, 0x6D26, 0x6D81, 0x3CEF, 0x6DA4, 0x6DB1, 0x6E15, 0x6E18,
+ 0x6E29, 0x6E86, 0xF694, 0x6EBB, 0x6EE2, 0x6EDA, 0x9F7F, 0x6EE8,
+ 0x6EE9, 0x6F24, 0x6F34, 0x3D46, 0xF69E, 0x6F81, 0x6FBE, 0x3D6A,
+ 0x3D75, 0x71B7, 0x5C99, 0x3D8A, 0x702C, 0x3D91, 0x7050, 0x7054,
+ 0x706F, 0x707F, 0x7089, 0xF6AD, 0x43C1, 0x35F1, 0xF6B0,
+ /* Big5-HKSCS 0x8E40 .. 0x8E7E */
+ 0xE311, 0x57BE, 0xE313, 0x713E, 0xE315, 0x364E, 0x69A2, 0xE318,
+ 0x5B74, 0x7A49, 0xE31B, 0xE31C, 0x7A65, 0x7A7D, 0xE31F, 0x7ABB,
+ 0x7AB0, 0x7AC2, 0x7AC3, 0x71D1, 0xE325, 0x41CA, 0x7ADA, 0x7ADD,
+ 0x7AEA, 0x41EF, 0x54B2, 0xE32C, 0x7B0B, 0x7B55, 0x7B29, 0xE330,
+ 0xE331, 0x7BA2, 0x7B6F, 0x839C, 0xE335, 0xE336, 0x7BD0, 0x8421,
+ 0x7B92, 0x7BB8, 0xE33B, 0x3DAD, 0xE33D, 0x8492, 0x7BFA, 0x7C06,
+ 0x7C35, 0xE342, 0x7C44, 0x7C83, 0xE345, 0x7CA6, 0x667D, 0xE348,
+ 0x7CC9, 0x7CC7, 0x7CE6, 0x7C74, 0x7CF3, 0x7CF5, 0x7CCE,
+ /* Big5-HKSCS 0x8EA1 .. 0x8EFE */
+ 0x7E67, 0x451D, 0xE352, 0x7D5D, 0xE354, 0x748D, 0x7D89,
+ 0x7DAB, 0x7135, 0x7DB3, 0x7DD2, 0xE35B, 0xE35C, 0x7DE4, 0x3D13,
+ 0x7DF5, 0xE360, 0x7DE5, 0xE362, 0x7E1D, 0xE364, 0xE365, 0x7E6E,
+ 0x7E92, 0x432B, 0x946C, 0x7E27, 0x7F40, 0x7F41, 0x7F47, 0x7936,
+ 0xE36F, 0x99E1, 0x7F97, 0xE372, 0x7FA3, 0xE374, 0xE375, 0x455C,
+ 0xE377, 0x4503, 0xE379, 0x7FFA, 0xE37B, 0x8005, 0x8008, 0x801D,
+ 0x8028, 0x802F, 0xE381, 0xE382, 0x803B, 0x803C, 0x8061, 0xE386,
+ 0x4989, 0xE388, 0xE389, 0xE38A, 0x6725, 0x80A7, 0xE38D, 0x8107,
+ 0x811A, 0x58B0, 0xE391, 0x6C7F, 0xE393, 0xE394, 0x64E7, 0xE396,
+ 0x8218, 0xE398, 0x6A53, 0xE39A, 0xE39B, 0x447A, 0x8229, 0xE39E,
+ 0xE39F, 0xE3A0, 0x4FF9, 0xE3A2, 0x84E2, 0x8362, 0xE3A5, 0xE3A6,
+ 0xE3A7, 0xE3A8, 0xE3A9, 0x82AA, 0x691B, 0xE3AC, 0x41DB,
+ /* Big5-HKSCS 0x8F40 .. 0x8F7E */
+ 0x854B, 0x82D0, 0x831A, 0xE3B1, 0xE3B2, 0x36C1, 0xE3B4, 0xE3B5,
+ 0x827B, 0x82E2, 0x8318, 0xE3B9, 0xE3BA, 0xE3BB, 0xE3BC, 0xE3BD,
+ 0x3DBF, 0x831D, 0x55EC, 0x8385, 0x450B, 0xE3C3, 0x83AC, 0x83C1,
+ 0x83D3, 0x347E, 0xE3C8, 0x6A57, 0x855A, 0x3496, 0xE3CC, 0xE3CD,
+ 0x8458, 0xE3CF, 0x8471, 0x3DD3, 0x44E4, 0x6AA7, 0x844A, 0xE3D5,
+ 0x7958, 0x84A8, 0xE3D8, 0xE3D9, 0xE3DA, 0x84DE, 0x840F, 0x8391,
+ 0x44A0, 0x8493, 0x84E4, 0xE3E1, 0x4240, 0xE3E3, 0x4543, 0x8534,
+ 0x5AF2, 0xE3E7, 0x4527, 0x8573, 0x4516, 0x67BF, 0x8616,
+ /* Big5-HKSCS 0x8FA1 .. 0x8FFE */
+ 0xE3ED, 0xE3EE, 0x85C1, 0xE3F0, 0x8602, 0xE3F2, 0xE3F3,
+ 0xE3F4, 0x456A, 0x8628, 0x3648, 0xE3F8, 0x53F7, 0xE3FA, 0x867E,
+ 0x8771, 0xE3FD, 0x87EE, 0xE3FF, 0x87B1, 0x87DA, 0x880F, 0x5661,
+ 0x866C, 0x6856, 0x460F, 0x8845, 0x8846, 0xE409, 0xE40A, 0xE40B,
+ 0x885E, 0x889C, 0x465B, 0x88B4, 0x88B5, 0x63C1, 0x88C5, 0x7777,
+ 0xE414, 0x8987, 0x898A, 0x89A6, 0x89A9, 0x89A7, 0x89BC, 0xE41B,
+ 0x89E7, 0xE41D, 0xE41E, 0x8A9C, 0x7793, 0x91FE, 0x8A90, 0xE423,
+ 0x7AE9, 0xE425, 0xE426, 0x4713, 0xE428, 0x717C, 0x8B0C, 0x8B1F,
+ 0xE42C, 0xE42D, 0x8B3F, 0x8B4C, 0x8B4D, 0x8AA9, 0xE432, 0x8B90,
+ 0x8B9B, 0x8AAF, 0xE436, 0x4615, 0x884F, 0x8C9B, 0xE43A, 0xE43B,
+ 0xE43C, 0x3725, 0xE43E, 0x8CD6, 0xE440, 0xE441, 0x8D12, 0x8D03,
+ 0xE444, 0x8CDB, 0x705C, 0x8D11, 0xE448, 0x3ED0, 0x8D77,
+ /* Big5-HKSCS 0x9040 .. 0x907E */
+ 0x8DA9, 0xE44C, 0xE44D, 0xE44E, 0x3B7C, 0xE450, 0xE451, 0x7AE7,
+ 0x8EAD, 0x8EB6, 0x8EC3, 0x92D4, 0x8F19, 0x8F2D, 0xE459, 0xE45A,
+ 0x8FA5, 0x9303, 0xE45D, 0xE45E, 0x8FB3, 0x492A, 0xE461, 0xE462,
+ 0xE463, 0x5EF8, 0xE465, 0x8FF9, 0xE467, 0xE468, 0xE469, 0xE46A,
+ 0x3980, 0xE46C, 0x9037, 0xE46E, 0xE46F, 0x9061, 0xE471, 0xE472,
+ 0x90A8, 0xE474, 0x90C4, 0xE476, 0x90AE, 0x90FD, 0x9167, 0x3AF0,
+ 0x91A9, 0x91C4, 0x7CAC, 0xE47E, 0xE47F, 0x920E, 0x6C9F, 0x9241,
+ 0x9262, 0xE484, 0x92B9, 0xE486, 0xE487, 0xE488, 0xE489,
+ /* Big5-HKSCS 0x90A1 .. 0x90FE */
+ 0xE48A, 0x932C, 0x936B, 0xE48D, 0xE48E, 0x708F, 0x5AC3,
+ 0xE491, 0xE492, 0x4965, 0x9244, 0xE495, 0xE496, 0xE497, 0x9373,
+ 0x945B, 0x8EBC, 0x9585, 0x95A6, 0x9426, 0x95A0, 0x6FF6, 0x42B9,
+ 0xE4A1, 0xE4A2, 0xE4A3, 0xE4A4, 0x49DF, 0x6C1C, 0x967B, 0x9696,
+ 0x416C, 0x96A3, 0xE4AB, 0x61DA, 0x96B6, 0x78F5, 0xE4AF, 0x96BD,
+ 0x53CC, 0x49A1, 0xE4B3, 0xE4B4, 0xE4B5, 0xE4B6, 0xE4B7, 0xE4B8,
+ 0xE4B9, 0xE4BA, 0x9731, 0x8642, 0x9736, 0x4A0F, 0x453D, 0x4585,
+ 0xE4C1, 0x7075, 0x5B41, 0x971B, 0x975C, 0xE4C6, 0x9757, 0x5B4A,
+ 0xE4C9, 0x975F, 0x9425, 0x50D0, 0xE4CD, 0xE4CE, 0x9789, 0x979F,
+ 0x97B1, 0x97BE, 0x97C0, 0x97D2, 0x97E0, 0xE4D6, 0x97EE, 0x741C,
+ 0xE4D9, 0x97FF, 0x97F5, 0xE4DC, 0xE4DD, 0x4AD1, 0x9834, 0x9833,
+ 0x984B, 0x9866, 0x3B0E, 0xE4E4, 0x3D51, 0xE4E6, 0xE4E7,
+ /* Big5-HKSCS 0x9140 .. 0x917E */
+ 0xE4E8, 0x98CA, 0x98B7, 0x98C8, 0x98C7, 0x4AFF, 0xE4EE, 0xE4EF,
+ 0x55B0, 0x98E1, 0x98E6, 0x98EC, 0x9378, 0x9939, 0xE4F6, 0x4B72,
+ 0xE4F8, 0xE4F9, 0x99F5, 0x9A0C, 0x9A3B, 0x9A10, 0x9A58, 0xE4FF,
+ 0x36C4, 0xE501, 0xE502, 0x9AE0, 0x9AE2, 0xE505, 0x9AF4, 0x4C0E,
+ 0x9B14, 0x9B2D, 0xE50A, 0x5034, 0x9B34, 0xE50D, 0x38C3, 0xE50F,
+ 0x9B50, 0x9B40, 0xE512, 0x5A45, 0xE514, 0x9B8E, 0xE516, 0x9C02,
+ 0x9BFF, 0x9C0C, 0xE51A, 0x9DD4, 0xE51C, 0xE51D, 0xE51E, 0xE51F,
+ 0xE520, 0xE521, 0x9D7E, 0x9D83, 0xE524, 0x9E0E, 0x6888,
+ /* Big5-HKSCS 0x91A1 .. 0x91FE */
+ 0x9DC4, 0xE528, 0xE529, 0xE52A, 0xE52B, 0xE52C, 0x9D39,
+ 0xE52E, 0xE52F, 0x9E90, 0x9E95, 0x9E9E, 0x9EA2, 0x4D34, 0x9EAA,
+ 0x9EAF, 0xE537, 0x9EC1, 0x3B60, 0x39E5, 0x3D1D, 0x4F32, 0x37BE,
+ 0xE53E, 0x9F02, 0x9F08, 0x4B96, 0x9424, 0xE543, 0x9F17, 0x9F16,
+ 0x9F39, 0x569F, 0x568A, 0x9F45, 0x99B8, 0xE54B, 0x97F2, 0x847F,
+ 0x9F62, 0x9F69, 0x7ADC, 0x9F8E, 0x7216, 0x4BBE, 0xE554, 0xE555,
+ 0x7177, 0xE557, 0xE558, 0xE559, 0x739E, 0xE55B, 0xE55C, 0x799F,
+ 0xE55E, 0xE55F, 0x9369, 0x93F3, 0xE562, 0x92EC, 0x9381, 0x93CB,
+ 0xE566, 0xE567, 0x7217, 0x3EEB, 0x7772, 0x7A43, 0x70D0, 0xE56D,
+ 0xE56E, 0x717E, 0xE570, 0x70A3, 0xE572, 0xE573, 0x3EC7, 0xE575,
+ 0xE576, 0xE577, 0x3722, 0xE579, 0xE57A, 0x36E1, 0xE57C, 0xE57D,
+ 0xE57E, 0x3723, 0xE580, 0x575B, 0xE582, 0xE583, 0xE584,
+ /* Big5-HKSCS 0x9240 .. 0x927E */
+ 0xE585, 0xE586, 0x8503, 0xE588, 0x8503, 0x8455, 0xE58B, 0xE58C,
+ 0xE58D, 0xE58E, 0xE58F, 0xE590, 0x44F4, 0xE592, 0xE593, 0xE594,
+ 0x67F9, 0x3733, 0x3C15, 0x3DE7, 0x586C, 0xE59A, 0x6810, 0x4057,
+ 0xE59D, 0xE59E, 0xE59F, 0xE5A0, 0xE5A1, 0x54CB, 0x569E, 0xE5A4,
+ 0x5692, 0xE5A6, 0xE5A7, 0xE5A8, 0x93C6, 0xE5AA, 0x939C, 0x4EF8,
+ 0x512B, 0x3819, 0xE5AF, 0x4EBC, 0xE5B1, 0xE5B2, 0x4F4B, 0x4F8A,
+ 0xE5B5, 0x5A68, 0xE5B7, 0xE5B8, 0x3999, 0xE5BA, 0xE5BB, 0x3435,
+ 0x4F29, 0xE5BE, 0xE5BF, 0xE5C0, 0x8ADA, 0xE5C2, 0x4E98,
+ /* Big5-HKSCS 0x92A1 .. 0x92FE */
+ 0x50CD, 0x510D, 0x4FA2, 0x4F03, 0xE5C8, 0xE5C9, 0x4F42,
+ 0x502E, 0x506C, 0x5081, 0x4FCC, 0x4FE5, 0x5058, 0x50FC, 0x5159,
+ 0x515B, 0x515D, 0x515E, 0x6E76, 0xE5D7, 0xE5D8, 0xE5D9, 0x6D72,
+ 0xE5DB, 0xE5DC, 0x51A8, 0x51C3, 0xE5DF, 0x44DD, 0xE5E1, 0xE5E2,
+ 0xE5E3, 0x8D7A, 0xE5E5, 0xE5E6, 0x5259, 0x52A4, 0xE5E9, 0x52E1,
+ 0x936E, 0x467A, 0x718C, 0xE5EE, 0xE5EF, 0xE5F0, 0xE5F1, 0x69D1,
+ 0xE5F3, 0x7479, 0x3EDE, 0x7499, 0x7414, 0x7456, 0x7398, 0x4B8E,
+ 0xE5FB, 0xE5FC, 0x53D0, 0x3584, 0x720F, 0xE600, 0x55B4, 0xE602,
+ 0x54CD, 0xE604, 0x571D, 0x925D, 0x96F4, 0x9366, 0x57DD, 0x578D,
+ 0x577F, 0x363E, 0x58CB, 0x5A99, 0xE60F, 0xE610, 0xE611, 0xE612,
+ 0x5A2C, 0x59B8, 0x928F, 0x5A7E, 0x5ACF, 0x5A12, 0xE619, 0xE61A,
+ 0xE61B, 0xE61C, 0x36F5, 0x6D05, 0x7443, 0x5A21, 0xE621,
+ /* Big5-HKSCS 0x9340 .. 0x937E */
+ 0x5A81, 0xE623, 0xE624, 0x93E0, 0x748C, 0xE627, 0x7105, 0x4972,
+ 0x9408, 0xE62B, 0x93BD, 0x37A0, 0x5C1E, 0x5C9E, 0x5E5E, 0x5E48,
+ 0xE632, 0xE633, 0xE634, 0x5ECD, 0x5B4F, 0xE637, 0xE638, 0x3701,
+ 0xE63A, 0x36DD, 0xE63C, 0x36D3, 0x812A, 0xE63F, 0xE640, 0xE641,
+ 0xE642, 0x5F0C, 0x5F0E, 0xE645, 0xE646, 0x5A6B, 0xE648, 0x5B44,
+ 0x8614, 0xE64B, 0x8860, 0x607E, 0xE64E, 0xE64F, 0x5FDB, 0x3EB8,
+ 0xE652, 0xE653, 0xE654, 0xE655, 0x61C0, 0xE657, 0xE658, 0xE659,
+ 0x6199, 0x6198, 0x6075, 0xE65D, 0xE65E, 0xE65F, 0xE660,
+ /* Big5-HKSCS 0x93A1 .. 0x93FE */
+ 0x6471, 0xE662, 0xE663, 0x3A29, 0xE665, 0xE666, 0xE667,
+ 0xE668, 0x6337, 0xE66A, 0x64B6, 0x6331, 0x63D1, 0xE66E, 0xE66F,
+ 0x62A4, 0xE671, 0x643B, 0x656B, 0x6972, 0x3BF4, 0xE676, 0xE677,
+ 0xE678, 0xE679, 0x550D, 0xE67B, 0xE67C, 0xE67D, 0x66CE, 0xE67F,
+ 0xE680, 0x3AE0, 0x4190, 0xE683, 0xE684, 0xE685, 0xE686, 0xE687,
+ 0xE688, 0x78EE, 0xE68A, 0xE68B, 0xE68C, 0x3464, 0xE68E, 0xE68F,
+ 0xE690, 0x668E, 0xE692, 0x666B, 0x4B93, 0x6630, 0xE696, 0xE697,
+ 0x6663, 0xE699, 0xE69A, 0x661E, 0xE69C, 0x38D1, 0xE69E, 0xE69F,
+ 0x3B99, 0xE6A1, 0xE6A2, 0x74D0, 0x3B96, 0x678F, 0xE6A6, 0x68B6,
+ 0x681E, 0x3BC4, 0x6ABE, 0x3863, 0xE6AC, 0xE6AD, 0x6A33, 0x6A52,
+ 0x6AC9, 0x6B05, 0xE6B2, 0x6511, 0x6898, 0x6A4C, 0x3BD7, 0x6A7A,
+ 0x6B57, 0xE6B9, 0xE6BA, 0x93A0, 0x92F2, 0xE6BD, 0xE6BE,
+ /* Big5-HKSCS 0x9440 .. 0x947E */
+ 0x9289, 0xE6C0, 0xE6C1, 0x9467, 0x6DA5, 0x6F0B, 0xE6C5, 0x6D67,
+ 0xE6C7, 0x3D8F, 0x6E04, 0xE6CA, 0x5A3D, 0x6E0A, 0x5847, 0x6D24,
+ 0x7842, 0x713B, 0xE6D1, 0xE6D2, 0x70F1, 0x7250, 0x7287, 0x7294,
+ 0xE6D7, 0xE6D8, 0x5179, 0xE6DA, 0xE6DB, 0x747A, 0xE6DD, 0xE6DE,
+ 0xE6DF, 0xE6E0, 0xE6E1, 0x3F06, 0x3EB1, 0xE6E4, 0xE6E5, 0xE6E6,
+ 0x60A7, 0x3EF3, 0x74CC, 0x743C, 0x9387, 0x7437, 0x449F, 0xE6EE,
+ 0x4551, 0x7583, 0x3F63, 0xE6F2, 0xE6F3, 0x3F58, 0x7555, 0x7673,
+ 0xE6F7, 0x3B19, 0x7468, 0xE6FA, 0xE6FB, 0xE6FC, 0x3AFB,
+ /* Big5-HKSCS 0x94A1 .. 0x94FE */
+ 0x3DCD, 0xE6FF, 0x3EFF, 0xE701, 0xE702, 0x91FA, 0x5732,
+ 0x9342, 0xE706, 0xE707, 0x50DF, 0xE709, 0xE70A, 0x7778, 0xE70C,
+ 0x770E, 0x770F, 0x777B, 0xE710, 0xE711, 0x3A5E, 0xE713, 0x7438,
+ 0x749B, 0x3EBF, 0xE717, 0xE718, 0x40C8, 0xE71A, 0xE71B, 0x9307,
+ 0xE71D, 0x781E, 0x788D, 0x7888, 0x78D2, 0x73D0, 0x7959, 0xE724,
+ 0xE725, 0x410E, 0x799B, 0x8496, 0x79A5, 0x6A2D, 0xE72B, 0x7A3A,
+ 0x79F4, 0x416E, 0xE72F, 0x4132, 0x9235, 0x79F1, 0xE733, 0xE734,
+ 0xE735, 0xE736, 0xE737, 0x3597, 0x556B, 0x3570, 0x36AA, 0xE73C,
+ 0xE73D, 0x7AE2, 0x5A59, 0xE740, 0xE741, 0xE742, 0x5A0D, 0xE744,
+ 0x78F0, 0x5A2A, 0xE747, 0x7AFE, 0x41F9, 0x7C5D, 0x7C6D, 0x4211,
+ 0xE74D, 0xE74E, 0xE74F, 0x7CCD, 0xE751, 0xE752, 0x7C8E, 0x7C7C,
+ 0x7CAE, 0x6AB2, 0x7DDC, 0x7E07, 0x7DD3, 0x7F4E, 0xE75B,
+ /* Big5-HKSCS 0x9540 .. 0x957E */
+ 0xE75C, 0xE75D, 0x7D97, 0xE75F, 0x426A, 0xE761, 0xE762, 0x67D6,
+ 0xE764, 0xE765, 0x57C4, 0xE767, 0xE768, 0xE769, 0x7FDD, 0x7B27,
+ 0xE76C, 0xE76D, 0xE76E, 0x7B0C, 0xE770, 0x99E6, 0x8645, 0x9A63,
+ 0x6A1C, 0xE775, 0x39E2, 0xE777, 0xE778, 0x9A1F, 0xE77A, 0x8480,
+ 0xE77C, 0xE77D, 0x44EA, 0x8137, 0x4402, 0x80C6, 0x8109, 0x8142,
+ 0xE784, 0x98C3, 0xE786, 0x8262, 0x8265, 0xE789, 0x8453, 0xE78B,
+ 0x8610, 0xE78D, 0x5A86, 0x417F, 0xE790, 0x5B2B, 0xE792, 0x5AE4,
+ 0xE794, 0x86A0, 0xE796, 0xE797, 0x882D, 0xE799, 0x5A02,
+ /* Big5-HKSCS 0x95A1 .. 0x95FE */
+ 0x886E, 0x4F45, 0x8887, 0x88BF, 0x88E6, 0x8965, 0x894D,
+ 0xE7A2, 0x8954, 0xE7A4, 0xE7A5, 0xE7A6, 0xE7A7, 0xE7A8, 0xE7A9,
+ 0x3EAD, 0x84A3, 0x46F5, 0x46CF, 0x37F2, 0x8A3D, 0x8A1C, 0xE7B1,
+ 0x5F4D, 0x922B, 0xE7B4, 0x65D4, 0x7129, 0x70C4, 0xE7B8, 0x9D6D,
+ 0x8C9F, 0x8CE9, 0xE7BC, 0x599A, 0x77C3, 0x59F0, 0x436E, 0x36D4,
+ 0x8E2A, 0x8EA7, 0xE7C4, 0x8F30, 0x8F4A, 0x42F4, 0x6C58, 0x6FBB,
+ 0xE7CA, 0x489B, 0x6F79, 0x6E8B, 0xE7CE, 0x9BE9, 0x36B5, 0xE7D1,
+ 0x90BB, 0x9097, 0x5571, 0x4906, 0x91BB, 0x9404, 0xE7D8, 0x4062,
+ 0xE7DA, 0x9427, 0xE7DC, 0xE7DD, 0x84E5, 0x8A2B, 0x9599, 0x95A7,
+ 0x9597, 0x9596, 0xE7E4, 0x7445, 0x3EC2, 0xE7E7, 0xE7E8, 0xE7E9,
+ 0x3EE7, 0xE7EB, 0x968F, 0xE7ED, 0xE7EE, 0xE7EF, 0x3ECC, 0xE7F1,
+ 0xE7F2, 0xE7F3, 0x7412, 0x746B, 0x3EFC, 0x9741, 0xE7F8,
+ /* Big5-HKSCS 0x9640 .. 0x967E */
+ 0x6847, 0x4A1D, 0xE7FB, 0xE7FC, 0x975D, 0x9368, 0xE7FF, 0xE800,
+ 0xE801, 0xE802, 0x92BA, 0x5B11, 0x8B69, 0x493C, 0x73F9, 0xE808,
+ 0x979B, 0x9771, 0x9938, 0xE80C, 0x5DC1, 0xE80E, 0xE80F, 0x981F,
+ 0xE811, 0x92F6, 0xE813, 0x91E5, 0x44C0, 0xE816, 0xE817, 0xE818,
+ 0x98DC, 0xE81A, 0x3F00, 0x922A, 0x4925, 0x8414, 0x993B, 0x994D,
+ 0xE821, 0x3DFD, 0x999B, 0x4B6F, 0x99AA, 0x9A5C, 0xE827, 0xE828,
+ 0x6A8F, 0x9A21, 0x5AFE, 0x9A2F, 0xE82D, 0x4B90, 0xE82F, 0x99BC,
+ 0x4BBD, 0x4B97, 0x937D, 0x5872, 0xE835, 0x5822, 0xE837,
+ /* Big5-HKSCS 0x96A1 .. 0x96FE */
+ 0xE838, 0x7844, 0xE83A, 0xE83B, 0x68C5, 0x3D7D, 0x9458,
+ 0x3927, 0x6150, 0xE841, 0xE842, 0x6107, 0x9C4F, 0x9C53, 0x9C7B,
+ 0x9C35, 0x9C10, 0x9B7F, 0x9BCF, 0xE84B, 0x9B9F, 0xE84D, 0xE84E,
+ 0x9D21, 0x4CAE, 0xE851, 0x9E18, 0x4CB0, 0x9D0C, 0xE855, 0xE856,
+ 0xE857, 0xE858, 0x9DA5, 0x84BD, 0xE85B, 0xE85C, 0xE85D, 0x85FC,
+ 0x4533, 0xE860, 0xE861, 0xE862, 0x8420, 0x85EE, 0xE865, 0xE866,
+ 0xE867, 0x79E2, 0xE869, 0xE86A, 0x492D, 0xE86C, 0x3D62, 0x93DB,
+ 0x92BE, 0x9348, 0xE871, 0x78B9, 0x9277, 0x944D, 0x4FE4, 0x3440,
+ 0x9064, 0xE878, 0x783D, 0x7854, 0x78B6, 0x784B, 0xE87D, 0xE87E,
+ 0xE87F, 0x369A, 0x4F72, 0x6FDA, 0x6FD9, 0x701E, 0x701E, 0x5414,
+ 0xE887, 0x57BB, 0x58F3, 0x578A, 0x9D16, 0x57D7, 0x7134, 0x34AF,
+ 0xE88F, 0x71EB, 0xE891, 0xE892, 0x5B28, 0xE894, 0xE895,
+ /* Big5-HKSCS 0x9740 .. 0x977E */
+ 0x610C, 0x5ACE, 0x5A0B, 0x42BC, 0xE89A, 0x372C, 0x4B7B, 0xE89D,
+ 0x93BB, 0x93B8, 0xE8A0, 0xE8A1, 0x8472, 0xE8A3, 0xE8A4, 0xE8A5,
+ 0xE8A6, 0xE8A7, 0x5994, 0xE8A9, 0xE8AA, 0x7DA8, 0xE8AC, 0xE8AD,
+ 0xE8AE, 0xE8AF, 0xE8B0, 0x92E5, 0x73E2, 0x3EE9, 0x74B4, 0xE8B5,
+ 0xE8B6, 0x3EE1, 0xE8B8, 0x6AD8, 0x73F3, 0x73FB, 0x3ED6, 0xE8BD,
+ 0xE8BE, 0xE8BF, 0xE8C0, 0xE8C1, 0xE8C2, 0xE8C3, 0x7448, 0xE8C5,
+ 0x70A5, 0xE8C7, 0x9284, 0x73E6, 0x935F, 0xE8CB, 0x9331, 0xE8CD,
+ 0xE8CE, 0x9386, 0xE8D0, 0xE8D1, 0x4935, 0xE8D3, 0x716B,
+ /* Big5-HKSCS 0x97A1 .. 0x97FE */
+ 0xE8D5, 0xE8D6, 0x56A4, 0xE8D8, 0xE8D9, 0xE8DA, 0x5502,
+ 0x79C4, 0xE8DD, 0x7DFE, 0xE8DF, 0xE8E0, 0xE8E1, 0x452E, 0x9401,
+ 0x370A, 0xE8E5, 0xE8E6, 0x59B0, 0xE8E8, 0xE8E9, 0xE8EA, 0x5AA1,
+ 0x36E2, 0xE8ED, 0x36B0, 0x925F, 0x5A79, 0xE8F1, 0xE8F2, 0x9374,
+ 0x3CCD, 0xE8F5, 0x4A96, 0x398A, 0x50F4, 0x3D69, 0x3D4C, 0xE8FB,
+ 0x7175, 0x42FB, 0xE8FE, 0x6E0F, 0xE900, 0x44EB, 0x6D57, 0xE903,
+ 0x7067, 0x6CAF, 0x3CD6, 0xE907, 0xE908, 0x6E02, 0x6F0C, 0x3D6F,
+ 0xE90C, 0x7551, 0x36BC, 0x34C8, 0x4680, 0x3EDA, 0x4871, 0x59C4,
+ 0x926E, 0x493E, 0x8F41, 0xE917, 0xE918, 0x5812, 0x57C8, 0x36D6,
+ 0xE91C, 0x70FE, 0xE91E, 0xE91F, 0xE920, 0xE921, 0xE922, 0x68B9,
+ 0x6967, 0xE925, 0xE926, 0xE927, 0xE928, 0xE929, 0xE92A, 0xE92B,
+ 0xE92C, 0x6A1A, 0xE92E, 0xE92F, 0x843E, 0x44DF, 0x44CE,
+ /* Big5-HKSCS 0x9840 .. 0x987E */
+ 0xE933, 0xE934, 0xE935, 0xE936, 0x6F17, 0xE938, 0x833D, 0xE93A,
+ 0x83ED, 0xE93C, 0xE93D, 0xE93E, 0x5989, 0x5A82, 0xE941, 0x5A61,
+ 0x5A71, 0xE944, 0xE945, 0x372D, 0x59EF, 0xE948, 0x36C7, 0x718E,
+ 0x9390, 0x669A, 0xE94D, 0x5A6E, 0x5A2B, 0xE950, 0x6A2B, 0xE952,
+ 0xE953, 0xE954, 0xE955, 0x711D, 0xE957, 0xE958, 0x4FB0, 0xE95A,
+ 0x5CC2, 0xE95C, 0xE95D, 0xE95E, 0x6A0C, 0xE960, 0xE961, 0x70A6,
+ 0x7133, 0xE964, 0x3DA5, 0x6CDF, 0xE967, 0xE968, 0x7E65, 0x59EB,
+ 0x5D2F, 0x3DF3, 0x5F5C, 0xE96E, 0xE96F, 0x7DA4, 0x8426,
+ /* Big5-HKSCS 0x98A1 .. 0x98FE */
+ 0x5485, 0xE973, 0xE974, 0xE975, 0x577E, 0xE977, 0xE978,
+ 0x3FE5, 0xE97A, 0xE97B, 0x7003, 0xE97D, 0x5D70, 0x738F, 0x7CD3,
+ 0xE981, 0xE982, 0x4FC8, 0x7FE7, 0x72CD, 0x7310, 0xE987, 0x7338,
+ 0x7339, 0xE98A, 0x7341, 0x7348, 0x3EA9, 0xE98E, 0x906C, 0x71F5,
+ 0xE991, 0x73E1, 0x81F6, 0x3ECA, 0x770C, 0x3ED1, 0x6CA2, 0x56FD,
+ 0x7419, 0x741E, 0x741F, 0x3EE2, 0x3EF0, 0x3EF4, 0x3EFA, 0x74D3,
+ 0x3F0E, 0x3F53, 0x7542, 0x756D, 0x7572, 0x758D, 0x3F7C, 0x75C8,
+ 0x75DC, 0x3FC0, 0x764D, 0x3FD7, 0x7674, 0x3FDC, 0x767A, 0xE9B0,
+ 0x7188, 0x5623, 0x8980, 0x5869, 0x401D, 0x7743, 0x4039, 0x6761,
+ 0x4045, 0x35DB, 0x7798, 0x406A, 0x406F, 0x5C5E, 0x77BE, 0x77CB,
+ 0x58F2, 0x7818, 0x70B9, 0x781C, 0x40A8, 0x7839, 0x7847, 0x7851,
+ 0x7866, 0x8448, 0xE9CB, 0x7933, 0x6803, 0x7932, 0x4103,
+ /* Big5-HKSCS 0x9940 .. 0x997E */
+ 0x4109, 0x7991, 0x7999, 0x8FBB, 0x7A06, 0x8FBC, 0x4167, 0x7A91,
+ 0x41B2, 0x7ABC, 0x8279, 0x41C4, 0x7ACF, 0x7ADB, 0x41CF, 0x4E21,
+ 0x7B62, 0x7B6C, 0x7B7B, 0x7C12, 0x7C1B, 0x4260, 0x427A, 0x7C7B,
+ 0x7C9C, 0x428C, 0x7CB8, 0x4294, 0x7CED, 0x8F93, 0x70C0, 0xE9EF,
+ 0x7DCF, 0x7DD4, 0x7DD0, 0x7DFD, 0x7FAE, 0x7FB4, 0x729F, 0x4397,
+ 0x8020, 0x8025, 0x7B39, 0x802E, 0x8031, 0x8054, 0x3DCC, 0x57B4,
+ 0x70A0, 0x80B7, 0x80E9, 0x43ED, 0x810C, 0x732A, 0x810E, 0x8112,
+ 0x7560, 0x8114, 0x4401, 0x3B39, 0x8156, 0x8159, 0x815A,
+ /* Big5-HKSCS 0x99A1 .. 0x99FE */
+ 0x4413, 0x583A, 0x817C, 0x8184, 0x4425, 0x8193, 0x442D,
+ 0x81A5, 0x57EF, 0x81C1, 0x81E4, 0x8254, 0x448F, 0x82A6, 0x8276,
+ 0x82CA, 0x82D8, 0x82FF, 0x44B0, 0x8357, 0x9669, 0x698A, 0x8405,
+ 0x70F5, 0x8464, 0x60E3, 0x8488, 0x4504, 0x84BE, 0x84E1, 0x84F8,
+ 0x8510, 0x8538, 0x8552, 0x453B, 0x856F, 0x8570, 0x85E0, 0x4577,
+ 0x8672, 0x8692, 0x86B2, 0x86EF, 0x9645, 0x878B, 0x4606, 0x4617,
+ 0x88AE, 0x88FF, 0x8924, 0x8947, 0x8991, 0xEA43, 0x8A29, 0x8A38,
+ 0x8A94, 0x8AB4, 0x8C51, 0x8CD4, 0x8CF2, 0x8D1C, 0x4798, 0x585F,
+ 0x8DC3, 0x47ED, 0x4EEE, 0x8E3A, 0x55D8, 0x5754, 0x8E71, 0x55F5,
+ 0x8EB0, 0x4837, 0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, 0x8EF2, 0x8FB7,
+ 0x8FC1, 0x8FCA, 0x8FCC, 0x9033, 0x99C4, 0x48AD, 0x98E0, 0x9213,
+ 0x491E, 0x9228, 0x9258, 0x926B, 0x92B1, 0x92AE, 0x92BF,
+ /* Big5-HKSCS 0x9A40 .. 0x9A7E */
+ 0x92E3, 0x92EB, 0x92F3, 0x92F4, 0x92FD, 0x9343, 0x9384, 0x93AD,
+ 0x4945, 0x4951, 0x9EBF, 0x9417, 0x5301, 0x941D, 0x942D, 0x943E,
+ 0x496A, 0x9454, 0x9479, 0x952D, 0x95A2, 0x49A7, 0x95F4, 0x9633,
+ 0x49E5, 0x67A0, 0x4A24, 0x9740, 0x4A35, 0x97B2, 0x97C2, 0x5654,
+ 0x4AE4, 0x60E8, 0x98B9, 0x4B19, 0x98F1, 0x5844, 0x990E, 0x9919,
+ 0x51B4, 0x991C, 0x9937, 0x9942, 0x995D, 0x9962, 0x4B70, 0x99C5,
+ 0x4B9D, 0x9A3C, 0x9B0F, 0x7A83, 0x9B69, 0x9B81, 0x9BDD, 0x9BF1,
+ 0x9BF4, 0x4C6D, 0x9C20, 0x376F, 0xEAA9, 0x9D49, 0x9C3A,
+ /* Big5-HKSCS 0x9AA1 .. 0x9AFE */
+ 0x9EFE, 0x5650, 0x9D93, 0x9DBD, 0x9DC0, 0x9DFC, 0x94F6,
+ 0x8FB6, 0x9E7B, 0x9EAC, 0x9EB1, 0x9EBD, 0x9EC6, 0x94DC, 0x9EE2,
+ 0x9EF1, 0x9EF8, 0x7AC8, 0x9F44, 0xEABF, 0xEAC0, 0xEAC1, 0x691A,
+ 0x94C3, 0x59AC, 0xEAC5, 0x5840, 0x94C1, 0x37B9, 0xEAC9, 0xEACA,
+ 0xEACB, 0xEACC, 0x5757, 0x7173, 0xEACF, 0xEAD0, 0xEAD1, 0x546A,
+ 0xEAD3, 0xEAD4, 0x549E, 0xEAD6, 0xEAD7, 0xEAD8, 0xEAD9, 0xEADA,
+ 0x60E7, 0xEADC, 0x567A, 0xEADE, 0xEADF, 0xEAE0, 0xEAE1, 0xEAE2,
+ 0xEAE3, 0x6955, 0x9C2F, 0x87A5, 0xEAE7, 0xEAE8, 0xEAE9, 0xEAEA,
+ 0xEAEB, 0xEAEC, 0x5C20, 0xEAEE, 0x5E0B, 0xEAF0, 0xEAF1, 0xEAF2,
+ 0x671E, 0xEAF4, 0xEAF5, 0xEAF6, 0x3647, 0xEAF8, 0xEAF9, 0xEAFA,
+ 0xEAFB, 0x5364, 0x84AD, 0xEAFE, 0xEAFF, 0xEB00, 0x8B81, 0xEB02,
+ 0xEB03, 0xEB04, 0xEB05, 0x4E78, 0x70BB, 0xEB08, 0xEB09,
+ /* Big5-HKSCS 0x9B40 .. 0x9B7E */
+ 0xEB0A, 0xEB0B, 0xEB0C, 0xEB0D, 0xEB0E, 0xEB0F, 0x62C3, 0xEB11,
+ 0xEB12, 0x7198, 0x6855, 0xEB15, 0x69E9, 0x36C8, 0xEB18, 0xEB19,
+ 0xEB1A, 0xEB1B, 0xEB1C, 0xEB1D, 0x82FD, 0xEB1F, 0xEB20, 0xEB21,
+ 0x89A5, 0xEB23, 0x8FA0, 0xEB25, 0x97B8, 0xEB27, 0x9847, 0x9ABD,
+ 0xEB2A, 0xEB2B, 0xEB2C, 0xEB2D, 0xEB2E, 0xEB2F, 0xEB30, 0xEB31,
+ 0xEB32, 0xEB33, 0xEB34, 0xEB35, 0xEB36, 0xEB37, 0xEB38, 0xEB39,
+ 0x5FB1, 0x6648, 0x66BF, 0xEB3D, 0xEB3E, 0xEB3F, 0x7201, 0xEB41,
+ 0x77D7, 0xEB43, 0xEB44, 0x7E87, 0xEB46, 0x58B5, 0x670E,
+ /* Big5-HKSCS 0x9BA1 .. 0x9BFE */
+ 0x6918, 0xEB4A, 0xEB4B, 0xEB4C, 0xEB4D, 0xEB4E, 0xEB4F,
+ 0xEB50, 0x48D0, 0x4AB8, 0xEB53, 0xEB54, 0xEB55, 0xEB56, 0xEB57,
+ 0xEB58, 0xEB59, 0xEB5A, 0xEB5B, 0x51D2, 0xEB5D, 0x599F, 0xEB5F,
+ 0x3BBE, 0xEB61, 0xEB62, 0xEB63, 0x5788, 0xEB65, 0x399B, 0xEB67,
+ 0xEB68, 0xEB69, 0x3762, 0xEB6B, 0x8B5E, 0xEB6D, 0x99D6, 0xEB6F,
+ 0xEB70, 0xEB71, 0x7209, 0xEB73, 0xEB74, 0x5965, 0xEB76, 0xEB77,
+ 0xEB78, 0x8EDA, 0xEB7A, 0x528F, 0x573F, 0x7171, 0xEB7E, 0xEB7F,
+ 0xEB80, 0xEB81, 0x55BC, 0xEB83, 0xEB84, 0xEB85, 0x91D4, 0x3473,
+ 0xEB88, 0xEB89, 0xEB8A, 0x4718, 0xEB8C, 0xEB8D, 0xEB8E, 0xEB8F,
+ 0xEB90, 0x5066, 0x34FB, 0xEB93, 0x60DE, 0xEB95, 0x477C, 0xEB97,
+ 0xEB98, 0xEB99, 0xEB9A, 0xEB9B, 0x57A1, 0x7151, 0x6FB6, 0xEB9F,
+ 0xEBA0, 0x9056, 0xEBA2, 0xEBA3, 0x8B62, 0xEBA5, 0xEBA6,
+ /* Big5-HKSCS 0x9C40 .. 0x9C7E */
+ 0x5D5B, 0xEBA8, 0x8F36, 0xEBAA, 0xEBAB, 0x8AEA, 0xEBAD, 0xEBAE,
+ 0xEBAF, 0xEBB0, 0x4BC0, 0xEBB2, 0xEBB3, 0xEBB4, 0x9465, 0xEBB6,
+ 0x6195, 0x5A27, 0xEBB9, 0x4FBB, 0x56B9, 0xEBBC, 0xEBBD, 0x4E6A,
+ 0xEBBF, 0x9656, 0x6D8F, 0xEBC2, 0x3618, 0x8977, 0xEBC5, 0xEBC6,
+ 0xEBC7, 0xEBC8, 0x71DF, 0xEBCA, 0x7B42, 0xEBCC, 0xEBCD, 0xEBCE,
+ 0x9104, 0xEBD0, 0x7A45, 0x9DF0, 0xEBD3, 0x9A26, 0xEBD5, 0x365F,
+ 0xEBD7, 0xEBD8, 0x7983, 0xEBDA, 0xEBDB, 0x5D2C, 0xEBDD, 0x83CF,
+ 0xEBDF, 0x46D0, 0xEBE1, 0x753B, 0x8865, 0xEBE4, 0x58B6,
+ /* Big5-HKSCS 0x9CA1 .. 0x9CFE */
+ 0x371C, 0xEBE7, 0xEBE8, 0xEBE9, 0x3C54, 0xEBEB, 0xEBEC,
+ 0x9281, 0xEBEE, 0xEBEF, 0x9330, 0xEBF1, 0xEBF2, 0x6C39, 0x949F,
+ 0xEBF5, 0xEBF6, 0x8827, 0x88F5, 0xEBF9, 0xEBFA, 0xEBFB, 0x6EB8,
+ 0xEBFD, 0xEBFE, 0x39A4, 0x36B9, 0x5C10, 0x79E3, 0x453F, 0x66B6,
+ 0xEC05, 0xEC06, 0x8943, 0xEC08, 0xEC09, 0x56D6, 0x40DF, 0xEC0C,
+ 0x39A1, 0xEC0E, 0xEC0F, 0xEC10, 0x71AD, 0x8366, 0xEC13, 0xEC14,
+ 0x5A67, 0x4CB7, 0xEC17, 0xEC18, 0xEC19, 0xEC1A, 0xEC1B, 0xEC1C,
+ 0xEC1D, 0x7B43, 0x797E, 0xEC20, 0x6FB5, 0xEC22, 0x6A03, 0xEC24,
+ 0x53A2, 0xEC26, 0x93BF, 0x6836, 0x975D, 0xEC2A, 0xEC2B, 0xEC2C,
+ 0xEC2D, 0xEC2E, 0xEC2F, 0x5D85, 0xEC31, 0xEC32, 0x5715, 0x9823,
+ 0xEC35, 0x5DAB, 0xEC37, 0x65BE, 0x69D5, 0x53D2, 0xEC3B, 0xEC3C,
+ 0x3C11, 0x6736, 0xEC3F, 0xEC40, 0xEC41, 0xEC42, 0xEC43,
+ /* Big5-HKSCS 0x9D40 .. 0x9D7E */
+ 0xEC44, 0xEC45, 0xEC46, 0xEC47, 0xEC48, 0xEC49, 0x35CA, 0xEC4B,
+ 0xEC4C, 0x48FA, 0x63E6, 0xEC4F, 0x7808, 0x9255, 0xEC52, 0x43F2,
+ 0xEC54, 0x43DF, 0xEC56, 0xEC57, 0xEC58, 0x59F8, 0xEC5A, 0x8F0B,
+ 0xEC5C, 0xEC5D, 0x7B51, 0xEC5F, 0xEC60, 0x3DF7, 0xEC62, 0xEC63,
+ 0x8FD0, 0x728F, 0x568B, 0xEC67, 0xEC68, 0xEC69, 0xEC6A, 0xEC6B,
+ 0xEC6C, 0xEC6D, 0xEC6E, 0xEC6F, 0xEC70, 0xEC71, 0xEC72, 0xEC73,
+ 0x7E9F, 0xEC75, 0xEC76, 0x4CA4, 0x9547, 0xEC79, 0x71A2, 0xEC7B,
+ 0x4D91, 0x9012, 0xEC7E, 0x4D9C, 0xEC80, 0x8FBE, 0x55C1,
+ /* Big5-HKSCS 0x9DA1 .. 0x9DFE */
+ 0x8FBA, 0xEC84, 0x8FB9, 0xEC86, 0x4509, 0x7E7F, 0x6F56,
+ 0x6AB1, 0x4EEA, 0x34E4, 0xEC8D, 0xEC8E, 0x373A, 0x8E80, 0xEC91,
+ 0xEC92, 0xEC93, 0xEC94, 0xEC95, 0xEC96, 0x3DEB, 0xEC98, 0xEC99,
+ 0xEC9A, 0xEC9B, 0x4E9A, 0xEC9D, 0xEC9E, 0x56BF, 0xECA0, 0x8E0E,
+ 0x5B6D, 0xECA3, 0xECA4, 0x63DE, 0x62D0, 0xECA7, 0xECA8, 0x6530,
+ 0x562D, 0xECAB, 0x541A, 0xECAD, 0x3DC6, 0xECAF, 0x4C7D, 0x5622,
+ 0x561E, 0x7F49, 0xECB4, 0x5975, 0xECB6, 0x8770, 0x4E1C, 0xECB9,
+ 0xECBA, 0xECBB, 0x8117, 0x9D5E, 0x8D18, 0x763B, 0x9C45, 0x764E,
+ 0x77B9, 0x9345, 0x5432, 0x8148, 0x82F7, 0x5625, 0x8132, 0x8418,
+ 0x80BD, 0x55EA, 0x7962, 0x5643, 0x5416, 0xECCF, 0x35CE, 0x5605,
+ 0x55F1, 0x66F1, 0xECD4, 0x362D, 0x7534, 0x55F0, 0x55BA, 0x5497,
+ 0x5572, 0xECDB, 0xECDC, 0x5ED0, 0xECDE, 0xECDF, 0xECE0,
+ /* Big5-HKSCS 0x9E40 .. 0x9E7E */
+ 0xECE1, 0x9EAB, 0x7D5A, 0x55DE, 0xECE5, 0x629D, 0x976D, 0x5494,
+ 0x8CCD, 0x71F6, 0x9176, 0x63FC, 0x63B9, 0x63FE, 0x5569, 0xECF0,
+ 0x9C72, 0xECF2, 0x519A, 0x34DF, 0xECF5, 0x51A7, 0x544D, 0x551E,
+ 0x5513, 0x7666, 0x8E2D, 0xECFC, 0x75B1, 0x80B6, 0x8804, 0x8786,
+ 0x88C7, 0x81B6, 0x841C, 0xED04, 0x44EC, 0x7304, 0xED07, 0x5B90,
+ 0x830B, 0xED0A, 0x567B, 0xED0C, 0xED0D, 0xED0E, 0xED0F, 0xED10,
+ 0xED11, 0x9170, 0xED13, 0x9208, 0xED15, 0xED16, 0xED17, 0xED18,
+ 0x7266, 0xED1A, 0x474E, 0xED1C, 0xED1D, 0xED1E, 0x40FA,
+ /* Big5-HKSCS 0x9EA1 .. 0x9EFE */
+ 0x9C5D, 0x651F, 0xED22, 0x48F3, 0xED24, 0xED25, 0xED26,
+ 0xED27, 0x6062, 0xED29, 0xED2A, 0xED2B, 0xED2C, 0xED2D, 0x71A3,
+ 0x7E8E, 0x9D50, 0x4E1A, 0x4E04, 0x3577, 0x5B0D, 0x6CB2, 0x5367,
+ 0x36AC, 0x39DC, 0x537D, 0x36A5, 0xED3B, 0x589A, 0xED3D, 0x822D,
+ 0x544B, 0x57AA, 0xED41, 0xED42, 0xED43, 0x3A52, 0xED45, 0x7374,
+ 0xED47, 0x4D09, 0x9BED, 0xED4A, 0xED4B, 0x4C5B, 0xED4D, 0xED4E,
+ 0xED4F, 0x845C, 0xED51, 0xED52, 0xED53, 0xED54, 0x632E, 0x7D25,
+ 0xED57, 0xED58, 0x3A2A, 0x9008, 0x52CC, 0x3E74, 0x367A, 0x45E9,
+ 0xED5F, 0x7640, 0x5AF0, 0xED62, 0x787A, 0x47B6, 0x58A7, 0x40BF,
+ 0x567C, 0x9B8B, 0x5D74, 0x7654, 0xED6B, 0x9E85, 0x4CE1, 0x75F9,
+ 0x37FB, 0x6119, 0xED71, 0xED72, 0xED73, 0x565D, 0xED75, 0x57A7,
+ 0xED77, 0xED78, 0x5234, 0xED7A, 0x35AD, 0x6C4A, 0x9D7C,
+ /* Big5-HKSCS 0x9F40 .. 0x9F7E */
+ 0x7C56, 0x9B39, 0x57DE, 0xED81, 0x5C53, 0x64D3, 0xED84, 0xED85,
+ 0xED86, 0x86AD, 0xED88, 0xED89, 0xED8A, 0xED8B, 0xED8C, 0x51FE,
+ 0xED8E, 0x5D8E, 0x9703, 0xED91, 0x9E81, 0x904C, 0x7B1F, 0x9B02,
+ 0x5CD1, 0x7BA3, 0x6268, 0x6335, 0x9AFF, 0x7BCF, 0x9B2A, 0x7C7E,
+ 0x9B2E, 0x7C42, 0x7C86, 0x9C15, 0x7BFC, 0x9B09, 0x9F17, 0x9C1B,
+ 0xEDA6, 0x9F5A, 0x5573, 0x5BC3, 0x4FFD, 0x9E98, 0x4FF2, 0x5260,
+ 0x3E06, 0x52D1, 0x5767, 0x5056, 0x59B7, 0x5E12, 0x97C8, 0x9DAB,
+ 0x8F5C, 0x5469, 0x97B4, 0x9940, 0x97BA, 0x532C, 0x6130,
+ /* Big5-HKSCS 0x9FA1 .. 0x9FFE */
+ 0x692C, 0x53DA, 0x9C0A, 0x9D02, 0x4C3B, 0x9641, 0x6980,
+ 0x50A6, 0x7546, 0xEDC6, 0x99DA, 0x5273, 0xEDC9, 0x9159, 0x9681,
+ 0x915C, 0xEDCD, 0x9151, 0xEDCF, 0x637F, 0xEDD1, 0x6ACA, 0x5611,
+ 0x918E, 0x757A, 0x6285, 0xEDD7, 0x734F, 0x7C70, 0xEDDA, 0xEDDB,
+ 0xEDDC, 0xEDDD, 0x76D6, 0x9B9D, 0x4E2A, 0xEDE1, 0x83BE, 0x8842,
+ 0xEDE4, 0x5C4A, 0x69C0, 0x50ED, 0x577A, 0x521F, 0x5DF5, 0x4ECE,
+ 0x6C31, 0xEDED, 0x4F39, 0x549C, 0x54DA, 0x529A, 0x8D82, 0x35FE,
+ 0x5F0C, 0x35F3, 0xEDF6, 0x6B52, 0x917C, 0x9FA5, 0x9B97, 0x982E,
+ 0x98B4, 0x9ABA, 0x9EA8, 0x9E84, 0x717A, 0x7B14, 0xEE02, 0x6BFA,
+ 0x8818, 0x7F78, 0xEE06, 0x5620, 0xEE08, 0x8E77, 0x9F53, 0xEE0B,
+ 0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, 0x6282, 0xEE11, 0x8E28, 0x8E75,
+ 0x7AD3, 0xEE15, 0x7A3E, 0x78D8, 0x6CEA, 0x8A67, 0x7607,
+ /* Big5-HKSCS 0xA040 .. 0xA07E */
+ 0xEE1B, 0x9F26, 0x6CCE, 0x87D6, 0x75C3, 0xEE20, 0x7853, 0xEE22,
+ 0x8D0C, 0x72E2, 0x7371, 0x8B2D, 0x7302, 0x74F1, 0x8CEB, 0xEE2A,
+ 0x862F, 0x5FBA, 0x88A0, 0x44B7, 0xEE2F, 0xEE30, 0xEE31, 0xEE32,
+ 0x8A7E, 0xEE34, 0xEE35, 0x60FD, 0x7667, 0x9AD7, 0x9D44, 0x936E,
+ 0x9B8F, 0x87F5, 0xEE3D, 0x880F, 0x8CF7, 0x732C, 0x9721, 0x9BB0,
+ 0x35D6, 0x72B2, 0x4C07, 0x7C51, 0x994A, 0xEE48, 0x6159, 0x4C04,
+ 0x9E96, 0x617D, 0xEE4D, 0x575F, 0x616F, 0x62A6, 0x6239, 0x62CE,
+ 0x3A5C, 0x61E2, 0x53AA, 0xEE56, 0x6364, 0x6802, 0x35D2,
+ /* Big5-HKSCS 0xA0A1 .. 0xA0FE */
+ 0x5D57, 0xEE5B, 0x8FDA, 0xEE5D, 0xEE5E, 0x50D9, 0xEE60,
+ 0x7906, 0x5332, 0x9638, 0xEE64, 0x4065, 0xEE66, 0x77FE, 0xEE68,
+ 0x7CC2, 0xEE6A, 0x7CDA, 0x7A2D, 0x8066, 0x8063, 0x7D4D, 0x7505,
+ 0x74F2, 0x8994, 0x821A, 0x670C, 0x8062, 0xEE76, 0x805B, 0x74F0,
+ 0x8103, 0x7724, 0x8989, 0xEE7C, 0x7553, 0xEE7E, 0x87A9, 0x87CE,
+ 0x81C8, 0x878C, 0x8A49, 0x8CAD, 0x8B43, 0x772B, 0x74F8, 0x84DA,
+ 0x3635, 0x69B2, 0x8DA6, 0xEE8C, 0x89A9, 0x7468, 0x6DB9, 0x87C1,
+ 0xEE91, 0x74E7, 0x3DDB, 0x7176, 0x60A4, 0x619C, 0x3CD1, 0x7162,
+ 0x6077, 0xEE9A, 0x7F71, 0xEE9C, 0x7250, 0x60E9, 0x4B7E, 0x5220,
+ 0x3C18, 0xEEA2, 0xEEA3, 0xEEA4, 0xEEA5, 0xEEA6, 0xEEA7, 0xEEA8,
+ 0xEEA9, 0xEEAA, 0x5CC1, 0xEEAC, 0xEEAD, 0xEEAE, 0xEEAF, 0xEEB0,
+ 0xEEB1, 0x4562, 0x5B1F, 0xEEB4, 0x9F50, 0x9EA6, 0xEEB7,
+ /* Big5-HKSCS 0xA140 .. 0xA17E */
+ 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A,
+ 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52,
+ 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31,
+ 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35,
+ 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39,
+ 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D,
+ 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41,
+ 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A,
+ /* Big5-HKSCS 0xA1A1 .. 0xA1FE */
+ 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C,
+ 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A,
+ 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE,
+ 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC,
+ 0x32A3, 0x2105, 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A,
+ 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B,
+ 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D,
+ 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63,
+ 0xFE64, 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220,
+ 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234,
+ 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192,
+ 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F,
+ /* Big5-HKSCS 0xA240 .. 0xA27E */
+ 0xFF3C, 0x2215, 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1,
+ 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5,
+ 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4,
+ 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7,
+ 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
+ 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A,
+ 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500,
+ 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D,
+ /* Big5-HKSCS 0xA2A1 .. 0xA2FE */
+ 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561,
+ 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10,
+ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,
+ 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166,
+ 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025,
+ 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xFF21,
+ 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29,
+ 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31,
+ 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39,
+ 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F,
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56,
+ /* Big5-HKSCS 0xA340 .. 0xA37E */
+ 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394,
+ 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C,
+ 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5,
+ 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4,
+ 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC,
+ 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5,
+ 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108,
+ 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F,
+ /* Big5-HKSCS 0xA3A1 .. 0xA3FE */
+ 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116,
+ 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E,
+ 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126,
+ 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ /* Big5-HKSCS 0xA440 .. 0xA47E */
+ 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C,
+ 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B,
+ 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A,
+ 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E,
+ 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F,
+ 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8,
+ 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2,
+ 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D,
+ /* Big5-HKSCS 0xA4A1 .. 0xA4FE */
+ 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B,
+ 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1,
+ 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4,
+ 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6,
+ 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339,
+ 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD,
+ 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24,
+ 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3,
+ 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4,
+ 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79,
+ 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236,
+ 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19,
+ /* Big5-HKSCS 0xA540 .. 0xA57E */
+ 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E,
+ 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4,
+ 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9,
+ 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317,
+ 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E,
+ 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8,
+ 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1,
+ 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916,
+ /* Big5-HKSCS 0xA5A1 .. 0xA5FE */
+ 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C,
+ 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01,
+ 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251,
+ 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63,
+ 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF,
+ 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529,
+ 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF,
+ 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB,
+ 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6,
+ 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10,
+ 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD,
+ 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168,
+ /* Big5-HKSCS 0xA640 .. 0xA67E */
+ 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216,
+ 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F,
+ 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D,
+ 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD,
+ 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919,
+ 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979,
+ 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89,
+ 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74,
+ /* Big5-HKSCS 0xA6A1 .. 0xA6FE */
+ 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D,
+ 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC,
+ 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735,
+ 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F,
+ 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070,
+ 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A,
+ 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089,
+ 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B,
+ 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863,
+ 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57,
+ 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D,
+ 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63,
+ /* Big5-HKSCS 0xA740 .. 0xA77E */
+ 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48,
+ 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225,
+ 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC,
+ 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426,
+ 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B,
+ 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436,
+ 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA,
+ 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D,
+ /* Big5-HKSCS 0xA7A1 .. 0xA7FE */
+ 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF,
+ 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996,
+ 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A,
+ 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F,
+ 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F,
+ 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77,
+ 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8,
+ 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276,
+ 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292,
+ 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539,
+ 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750,
+ 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760,
+ /* Big5-HKSCS 0xA840 .. 0xA87E */
+ 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81,
+ 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70,
+ 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E,
+ 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076,
+ 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2,
+ 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3,
+ 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093,
+ 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292,
+ /* Big5-HKSCS 0xA8A1 .. 0xA8FE */
+ 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46,
+ 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B,
+ 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2,
+ 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E,
+ 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B,
+ 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F,
+ 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88,
+ 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154,
+ 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD,
+ 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241,
+ 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377,
+ 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475,
+ /* Big5-HKSCS 0xA940 .. 0xA97E */
+ 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492,
+ 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462,
+ 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A,
+ 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947,
+ 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE,
+ 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF,
+ 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A,
+ 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45,
+ /* Big5-HKSCS 0xA9A1 .. 0xA9FE */
+ 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1,
+ 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78,
+ 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27,
+ 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD,
+ 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A,
+ 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215,
+ 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF,
+ 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB,
+ 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD,
+ 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC,
+ 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C,
+ 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A,
+ /* Big5-HKSCS 0xAA40 .. 0xAA7E */
+ 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C,
+ 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F,
+ 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A,
+ 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3,
+ 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE,
+ 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9,
+ 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1,
+ 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0,
+ /* Big5-HKSCS 0xAAA1 .. 0xAAFE */
+ 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D,
+ 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7,
+ 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D,
+ 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD,
+ 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA,
+ 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2,
+ 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5,
+ 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F,
+ 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0,
+ 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE,
+ 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1,
+ 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644,
+ /* Big5-HKSCS 0xAB40 .. 0xAB7E */
+ 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE,
+ 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD,
+ 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0,
+ 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192,
+ 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B,
+ 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B,
+ 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8,
+ 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1,
+ /* Big5-HKSCS 0xABA1 .. 0xABFE */
+ 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9,
+ 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2,
+ 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950,
+ 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA,
+ 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4,
+ 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9,
+ 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6,
+ 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B,
+ 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E,
+ 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C,
+ 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC,
+ 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7,
+ /* Big5-HKSCS 0xAC40 .. 0xAC7E */
+ 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545,
+ 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F,
+ 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1,
+ 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF,
+ 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE,
+ 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83,
+ 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32,
+ 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17,
+ /* Big5-HKSCS 0xACA1 .. 0xACFE */
+ 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39,
+ 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB,
+ 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4,
+ 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7,
+ 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D,
+ 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2,
+ 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3,
+ 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC,
+ 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949,
+ 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F,
+ 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09,
+ 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004,
+ /* Big5-HKSCS 0xAD40 .. 0xAD7E */
+ 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3,
+ 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD,
+ 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6,
+ 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301,
+ 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306,
+ 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4,
+ 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4,
+ 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5,
+ /* Big5-HKSCS 0xADA1 .. 0xADFE */
+ 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1,
+ 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C,
+ 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,
+ 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D,
+ 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006,
+ 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014,
+ 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE,
+ 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5,
+ 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254,
+ 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8,
+ 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA,
+ 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA,
+ /* Big5-HKSCS 0xAE40 .. 0xAE7E */
+ 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2,
+ 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A,
+ 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20,
+ 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0,
+ 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04,
+ 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8,
+ 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB,
+ 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059,
+ /* Big5-HKSCS 0xAEA1 .. 0xAEFE */
+ 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F,
+ 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096,
+ 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355,
+ 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A,
+ 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1,
+ 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645,
+ 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848,
+ 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817,
+ 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843,
+ 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7,
+ 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95,
+ 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93,
+ /* Big5-HKSCS 0xAF40 .. 0xAF7E */
+ 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A,
+ 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9,
+ 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8,
+ 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE,
+ 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7,
+ 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B,
+ 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728,
+ 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837,
+ /* Big5-HKSCS 0xAFA1 .. 0xAFFE */
+ 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950,
+ 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4,
+ 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88,
+ 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A,
+ 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D,
+ 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006,
+ 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102,
+ 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108,
+ 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210,
+ 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354,
+ 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332,
+ 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343,
+ /* Big5-HKSCS 0xB040 .. 0xB07E */
+ 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3,
+ 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18,
+ 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16,
+ 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77,
+ 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7,
+ 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095,
+ 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD,
+ 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661,
+ /* Big5-HKSCS 0xB0A1 .. 0xB0FE */
+ 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2,
+ 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A,
+ 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065,
+ 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F,
+ 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2,
+ 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340,
+ 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E,
+ 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F,
+ 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541,
+ 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806,
+ 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920,
+ 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40,
+ /* Big5-HKSCS 0xB140 .. 0xB17E */
+ 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5,
+ 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60,
+ 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22,
+ 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2,
+ 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5,
+ 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97,
+ 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3,
+ 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD,
+ /* Big5-HKSCS 0xB1A1 .. 0xB1FE */
+ 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5,
+ 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248,
+ 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367,
+ 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B,
+ 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F,
+ 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551,
+ 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C,
+ 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A,
+ 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881,
+ 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7,
+ 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894,
+ 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA,
+ /* Big5-HKSCS 0xB240 .. 0xB27E */
+ 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2,
+ 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB,
+ 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5,
+ 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA,
+ 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF,
+ 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D,
+ 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405,
+ 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6,
+ /* Big5-HKSCS 0xB2A1 .. 0xB2FE */
+ 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570,
+ 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4,
+ 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A,
+ 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92,
+ 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E,
+ 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E,
+ 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42,
+ 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2,
+ 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129,
+ 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E,
+ 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392,
+ 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C,
+ /* Big5-HKSCS 0xB340 .. 0xB37E */
+ 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4,
+ 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E,
+ 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F,
+ 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B,
+ 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA,
+ 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019,
+ 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015,
+ 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014,
+ /* Big5-HKSCS 0xB3A1 .. 0xB3FE */
+ 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6,
+ 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673,
+ 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA,
+ 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75,
+ 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091,
+ 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274,
+ 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B,
+ 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C,
+ 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F,
+ 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589,
+ 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830,
+ 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960,
+ /* Big5-HKSCS 0xB440 .. 0xB47E */
+ 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71,
+ 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C,
+ 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43,
+ 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9,
+ 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C,
+ 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1,
+ 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3,
+ 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD,
+ /* Big5-HKSCS 0xB4A1 .. 0xB4FE */
+ 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE,
+ 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E,
+ 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670,
+ 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE,
+ 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7,
+ 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2,
+ 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA,
+ 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC,
+ 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21,
+ 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B,
+ 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34,
+ 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB,
+ /* Big5-HKSCS 0xB540 .. 0xB57E */
+ 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F,
+ 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C,
+ 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A,
+ 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F,
+ 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2,
+ 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C,
+ 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C,
+ 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98,
+ /* Big5-HKSCS 0xB5A1 .. 0xB5FE */
+ 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46,
+ 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F,
+ 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72,
+ 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5,
+ 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E,
+ 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C,
+ 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1,
+ 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC,
+ 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407,
+ 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB,
+ 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983,
+ 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41,
+ /* Big5-HKSCS 0xB640 .. 0xB67E */
+ 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56,
+ 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB,
+ 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85,
+ 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB,
+ 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031,
+ 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163,
+ 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D,
+ 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591,
+ /* Big5-HKSCS 0xB6A1 .. 0xB6FE */
+ 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D,
+ 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4,
+ 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808,
+ 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD,
+ 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3,
+ 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F,
+ 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F,
+ 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1,
+ 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5,
+ 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A,
+ 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B,
+ 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC,
+ /* Big5-HKSCS 0xB740 .. 0xB77E */
+ 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9,
+ 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148,
+ 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C,
+ 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137,
+ 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D,
+ 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417,
+ 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688,
+ 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D,
+ /* Big5-HKSCS 0xB7A1 .. 0xB7FE */
+ 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982,
+ 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D,
+ 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD,
+ 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7,
+ 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96,
+ 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159,
+ 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C,
+ 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337,
+ 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E,
+ 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600,
+ 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3,
+ 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763,
+ /* Big5-HKSCS 0xB840 .. 0xB87E */
+ 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE,
+ 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891,
+ 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C,
+ 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77,
+ 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93,
+ 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A,
+ 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084,
+ 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B,
+ /* Big5-HKSCS 0xB8A1 .. 0xB8FE */
+ 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477,
+ 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B,
+ 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E,
+ 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE,
+ 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4,
+ 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2,
+ 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70,
+ 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62,
+ 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A,
+ 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2,
+ 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA,
+ 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A,
+ /* Big5-HKSCS 0xB940 .. 0xB97E */
+ 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C,
+ 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E,
+ 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237,
+ 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264,
+ 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A,
+ 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA,
+ 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810,
+ 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4,
+ /* Big5-HKSCS 0xB9A1 .. 0xB9FE */
+ 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9,
+ 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6,
+ 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9,
+ 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600,
+ 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E,
+ 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716,
+ 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D,
+ 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6,
+ 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7,
+ 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D,
+ 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54,
+ 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147,
+ /* Big5-HKSCS 0xBA40 .. 0xBA7E */
+ 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158,
+ 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F,
+ 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1,
+ 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995,
+ 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB,
+ 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3,
+ 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4,
+ 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22,
+ /* Big5-HKSCS 0xBAA1 .. 0xBAFE */
+ 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23,
+ 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2,
+ 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192,
+ 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A,
+ 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609,
+ 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1,
+ 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D,
+ 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95,
+ 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87,
+ 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD,
+ 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2,
+ 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC,
+ /* Big5-HKSCS 0xBB40 .. 0xBB7E */
+ 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150,
+ 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA,
+ 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4,
+ 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3,
+ 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722,
+ 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902,
+ 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6,
+ 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4,
+ /* Big5-HKSCS 0xBBA1 .. 0xBBFE */
+ 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7,
+ 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99,
+ 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060,
+ 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B,
+ 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278,
+ 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8,
+ 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4,
+ 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785,
+ 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C,
+ 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4,
+ 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB,
+ 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC,
+ /* Big5-HKSCS 0xBC40 .. 0xBC7E */
+ 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E,
+ 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E,
+ 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E,
+ 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB,
+ 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB,
+ 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2,
+ 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7,
+ 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182,
+ /* Big5-HKSCS 0xBCA1 .. 0xBCFE */
+ 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB,
+ 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469,
+ 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5,
+ 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A,
+ 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE,
+ 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E,
+ 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05,
+ 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F,
+ 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B,
+ 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58,
+ 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8,
+ 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483,
+ /* Big5-HKSCS 0xBD40 .. 0xBD7E */
+ 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626,
+ 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C,
+ 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5,
+ 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B,
+ 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7,
+ 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB,
+ 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9,
+ 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF,
+ /* Big5-HKSCS 0xBDA1 .. 0xBDFE */
+ 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A,
+ 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513,
+ 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506,
+ 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759,
+ 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912,
+ 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95,
+ 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6,
+ 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0,
+ 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC,
+ 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D,
+ 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D,
+ 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E,
+ /* Big5-HKSCS 0xBE40 .. 0xBE7E */
+ 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D,
+ 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB,
+ 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2,
+ 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707,
+ 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C,
+ 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF,
+ 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF,
+ 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09,
+ /* Big5-HKSCS 0xBEA1 .. 0xBEFE */
+ 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112,
+ 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291,
+ 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678,
+ 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676,
+ 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78,
+ 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD,
+ 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB,
+ 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF,
+ 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4,
+ 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58,
+ 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F,
+ 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1,
+ /* Big5-HKSCS 0xBF40 .. 0xBF7E */
+ 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6,
+ 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8,
+ 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368,
+ 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D,
+ 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F,
+ 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E,
+ 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4,
+ 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A,
+ /* Big5-HKSCS 0xBFA1 .. 0xBFFE */
+ 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09,
+ 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3,
+ 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559,
+ 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E,
+ 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932,
+ 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB,
+ 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02,
+ 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93,
+ 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B,
+ 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078,
+ 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8,
+ 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A,
+ /* Big5-HKSCS 0xC040 .. 0xC07E */
+ 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7,
+ 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713,
+ 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B,
+ 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B,
+ 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB,
+ 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12,
+ 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121,
+ 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687,
+ /* Big5-HKSCS 0xC0A1 .. 0xC0FE */
+ 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A,
+ 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8,
+ 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB,
+ 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6,
+ 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6,
+ 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E,
+ 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8,
+ 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80,
+ 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF,
+ 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235,
+ 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646,
+ 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC,
+ /* Big5-HKSCS 0xC140 .. 0xC17E */
+ 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901,
+ 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7,
+ 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9,
+ 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B,
+ 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35,
+ 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070,
+ 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF,
+ 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA,
+ /* Big5-HKSCS 0xC1A1 .. 0xC1FE */
+ 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B,
+ 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2,
+ 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936,
+ 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B,
+ 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73,
+ 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B,
+ 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F,
+ 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E,
+ 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B,
+ 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA,
+ 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C,
+ 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01,
+ /* Big5-HKSCS 0xC240 .. 0xC27E */
+ 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B,
+ 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2,
+ 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233,
+ 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7,
+ 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2,
+ 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE,
+ 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8,
+ 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658,
+ /* Big5-HKSCS 0xC2A1 .. 0xC2FE */
+ 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE,
+ 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A,
+ 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A,
+ 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076,
+ 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9,
+ 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0,
+ 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50,
+ 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0,
+ 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0,
+ 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0,
+ 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2,
+ 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6,
+ /* Big5-HKSCS 0xC340 .. 0xC37E */
+ 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA,
+ 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03,
+ 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8,
+ 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133,
+ 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2,
+ 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5,
+ 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D,
+ 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378,
+ /* Big5-HKSCS 0xC3A1 .. 0xC3FE */
+ 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F,
+ 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F,
+ 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69,
+ 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9,
+ 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805,
+ 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41,
+ 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59,
+ 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A,
+ 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE,
+ 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6,
+ 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4,
+ 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E,
+ /* Big5-HKSCS 0xC440 .. 0xC47E */
+ 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D,
+ 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A,
+ 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7,
+ 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6,
+ 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727,
+ 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662,
+ 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C,
+ 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C,
+ /* Big5-HKSCS 0xC4A1 .. 0xC4FE */
+ 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9,
+ 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815,
+ 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F,
+ 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4,
+ 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952,
+ 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D,
+ 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137,
+ 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC,
+ 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA,
+ 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3,
+ 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823,
+ 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74,
+ /* Big5-HKSCS 0xC540 .. 0xC57E */
+ 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF,
+ 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B,
+ 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957,
+ 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D,
+ 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19,
+ 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9,
+ 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61,
+ 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C,
+ /* Big5-HKSCS 0xC5A1 .. 0xC5FE */
+ 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972,
+ 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61,
+ 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1,
+ 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31,
+ 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94,
+ 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10,
+ 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94,
+ 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463,
+ 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57,
+ 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F,
+ 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7,
+ 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92,
+ /* Big5-HKSCS 0xC640 .. 0xC67E */
+ 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744,
+ 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA,
+ 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063,
+ 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470,
+ 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A,
+ 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5,
+ 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F,
+ 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72,
+ /* Big5-HKSCS 0xC6A1 .. 0xC6FE */
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466,
+ 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,
+ 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x2170, 0x2171, 0x2172,
+ 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x4E36,
+ 0x4E3F, 0x4E85, 0x4EA0, 0x5182, 0x5196, 0x51AB, 0x52F9, 0x5338,
+ 0x5369, 0x53B6, 0x590A, 0x5B80, 0x5DDB, 0x2F33, 0x5E7F, 0xF6DF,
+ 0x5F50, 0x5F61, 0x6534, 0xF6E3, 0x7592, 0xF6E5, 0x8FB5, 0xF6E7,
+ 0x00A8, 0x02C6, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xF6EE, 0xF6EF,
+ 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D, 0x273D, 0x3041,
+ 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,
+ 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051,
+ 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
+ /* Big5-HKSCS 0xC740 .. 0xC77E */
+ 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060,
+ 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+ 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070,
+ 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
+ 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080,
+ 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
+ 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090,
+ 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3, 0x30A4,
+ /* Big5-HKSCS 0xC7A1 .. 0xC7FE */
+ 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB,
+ 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3,
+ 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB,
+ 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3,
+ 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB,
+ 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3,
+ 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB,
+ 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3,
+ 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
+ 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
+ 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414,
+ 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,
+ /* Big5-HKSCS 0xC840 .. 0xC87E */
+ 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,
+ 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A,
+ 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,
+ 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,
+ 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441,
+ 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,
+ 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x21E7, 0x21B8,
+ 0x21B9, 0xF7E5, 0xF7E6, 0x4E5A, 0xF7E8, 0x5202, 0xF7EA,
+ /* Big5-HKSCS 0xC8A1 .. 0xC8FE */
+ 0xF7EB, 0x5188, 0xF7ED, 0xF7EE, 0xF7EF, 0xF7F0, 0xF7F1,
+ 0xF7F2, 0xF7F3, 0xF7F4, 0xF7F5, 0xF7F6, 0xF7F7, 0xF7F8, 0xF7F9,
+ 0xF7FA, 0xF7FB, 0xF7FC, 0xF7FD, 0xF7FE, 0xF7FF, 0xF800, 0xF801,
+ 0xF802, 0xF803, 0xF804, 0xF805, 0xF806, 0xF807, 0xF808, 0xF809,
+ 0xF80A, 0xF80B, 0xF80C, 0xF80D, 0xF80E, 0xF80F, 0xF810, 0xF811,
+ 0xF812, 0xF813, 0xF814, 0xF815, 0xF816, 0xFFE2, 0xFFE4, 0xFF07,
+ 0xFF02, 0x3231, 0x2116, 0x2121, 0x309B, 0x309C, 0x2E80, 0x2E84,
+ 0x2E86, 0x2E87, 0x2E88, 0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C,
+ 0x2E9D, 0x2EA5, 0x2EA7, 0x2EAA, 0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC,
+ 0x2EBE, 0x2EC6, 0x2ECA, 0x2ECC, 0x2ECD, 0x2ECF, 0x2ED6, 0x2ED7,
+ 0x2EDE, 0x2EE3, 0xF83C, 0xF83D, 0xF83E, 0x0283, 0x0250, 0x025B,
+ 0x0254, 0x0275, 0x0153, 0x00F8, 0x014B, 0x028A, 0x026A,
+ /* Big5-HKSCS 0xC940 .. 0xC97E */
+ 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47,
+ 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E,
+ 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C,
+ 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3,
+ 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9,
+ 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723,
+ 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73,
+ 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15,
+ /* Big5-HKSCS 0xC9A1 .. 0xC9FE */
+ 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A,
+ 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14,
+ 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22,
+ 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210,
+ 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF,
+ 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B,
+ 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A,
+ 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74,
+ 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266,
+ 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E,
+ 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18,
+ 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B,
+ /* Big5-HKSCS 0xCA40 .. 0xCA7E */
+ 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F,
+ 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D,
+ 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624,
+ 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64,
+ 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33,
+ 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD,
+ 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437,
+ 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418,
+ /* Big5-HKSCS 0xCAA1 .. 0xCAFE */
+ 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE,
+ 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752,
+ 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2,
+ 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A,
+ 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86,
+ 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C,
+ 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1,
+ 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3,
+ 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283,
+ 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A,
+ 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537,
+ 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747,
+ /* Big5-HKSCS 0xCB40 .. 0xCB7E */
+ 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B,
+ 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B,
+ 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95,
+ 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A,
+ 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5,
+ 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594,
+ 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092,
+ 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293,
+ /* Big5-HKSCS 0xCBA1 .. 0xCBFE */
+ 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F,
+ 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F,
+ 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87,
+ 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A,
+ 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E,
+ 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE,
+ 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B,
+ 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482,
+ 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466,
+ 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464,
+ 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770,
+ 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762,
+ /* Big5-HKSCS 0xCC40 .. 0xCC7E */
+ 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE,
+ 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1,
+ 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93,
+ 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF,
+ 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7,
+ 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19,
+ 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D,
+ 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B,
+ /* Big5-HKSCS 0xCCA1 .. 0xCCFE */
+ 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C,
+ 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009,
+ 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA,
+ 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0,
+ 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612,
+ 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611,
+ 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776,
+ 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A,
+ 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779,
+ 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC,
+ 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7,
+ 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2,
+ /* Big5-HKSCS 0xCD40 .. 0xCD7E */
+ 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0,
+ 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1,
+ 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096,
+ 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9,
+ 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1,
+ 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8,
+ 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1,
+ 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA,
+ /* Big5-HKSCS 0xCDA1 .. 0xCDFE */
+ 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB,
+ 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5,
+ 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B,
+ 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8,
+ 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670,
+ 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD,
+ 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0,
+ 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3,
+ 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB,
+ 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC,
+ 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396,
+ 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF,
+ /* Big5-HKSCS 0xCE40 .. 0xCE7E */
+ 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6,
+ 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0,
+ 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B,
+ 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4,
+ 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD,
+ 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB,
+ 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8,
+ 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB,
+ /* Big5-HKSCS 0xCEA1 .. 0xCEFE */
+ 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3,
+ 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9,
+ 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2,
+ 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037,
+ 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049,
+ 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058,
+ 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5,
+ 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6,
+ 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541,
+ 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C,
+ 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639,
+ 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA,
+ /* Big5-HKSCS 0xCF40 .. 0xCF7E */
+ 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB,
+ 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE,
+ 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC,
+ 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9,
+ 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6,
+ 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D,
+ 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04,
+ 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42,
+ /* Big5-HKSCS 0xCFA1 .. 0xCFFE */
+ 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07,
+ 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F,
+ 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241,
+ 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4,
+ 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC,
+ 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB,
+ 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC,
+ 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4,
+ 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA,
+ 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F,
+ 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945,
+ 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80,
+ /* Big5-HKSCS 0xD040 .. 0xD07E */
+ 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F,
+ 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D,
+ 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7,
+ 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9,
+ 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD,
+ 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8,
+ 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1,
+ 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA,
+ /* Big5-HKSCS 0xD0A1 .. 0xD0FE */
+ 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674,
+ 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3,
+ 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1,
+ 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8,
+ 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E,
+ 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5,
+ 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C,
+ 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194,
+ 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A,
+ 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E,
+ 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A,
+ 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1,
+ /* Big5-HKSCS 0xD140 .. 0xD17E */
+ 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B,
+ 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6,
+ 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9,
+ 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15,
+ 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD,
+ 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1,
+ 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA,
+ 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067,
+ /* Big5-HKSCS 0xD1A1 .. 0xD1FE */
+ 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D,
+ 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219,
+ 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336,
+ 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341,
+ 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A,
+ 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6,
+ 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712,
+ 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B,
+ 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F,
+ 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828,
+ 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D,
+ 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4,
+ /* Big5-HKSCS 0xD240 .. 0xD27E */
+ 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64,
+ 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F,
+ 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60,
+ 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68,
+ 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D,
+ 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39,
+ 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5,
+ 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278,
+ /* Big5-HKSCS 0xD2A1 .. 0xD2FE */
+ 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6,
+ 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC,
+ 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD,
+ 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5,
+ 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0,
+ 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710,
+ 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722,
+ 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E,
+ 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B,
+ 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0,
+ 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89,
+ 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10,
+ /* Big5-HKSCS 0xD340 .. 0xD37E */
+ 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09,
+ 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85,
+ 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F,
+ 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D,
+ 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E,
+ 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100,
+ 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351,
+ 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322,
+ /* Big5-HKSCS 0xD3A1 .. 0xD3FE */
+ 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D,
+ 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345,
+ 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653,
+ 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687,
+ 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1,
+ 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843,
+ 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F,
+ 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57,
+ 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6,
+ 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004,
+ 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF,
+ 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150,
+ /* Big5-HKSCS 0xD440 .. 0xD47E */
+ 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC,
+ 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E,
+ 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041,
+ 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B,
+ 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051,
+ 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D,
+ 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A,
+ 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545,
+ /* Big5-HKSCS 0xD4A1 .. 0xD4FE */
+ 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D,
+ 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2,
+ 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8,
+ 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5,
+ 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C,
+ 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58,
+ 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F,
+ 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52,
+ 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C,
+ 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72,
+ 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A,
+ 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F,
+ /* Big5-HKSCS 0xD540 .. 0xD57E */
+ 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1,
+ 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96,
+ 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3,
+ 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB,
+ 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365,
+ 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397,
+ 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375,
+ 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F,
+ /* Big5-HKSCS 0xD5A1 .. 0xD5FE */
+ 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553,
+ 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718,
+ 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB,
+ 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2,
+ 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880,
+ 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4,
+ 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33,
+ 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A,
+ 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2,
+ 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6,
+ 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD,
+ 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9,
+ /* Big5-HKSCS 0xD640 .. 0xD67E */
+ 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB,
+ 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104,
+ 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8,
+ 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F,
+ 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF,
+ 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401,
+ 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B,
+ 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF,
+ /* Big5-HKSCS 0xD6A1 .. 0xD6FE */
+ 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3,
+ 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D,
+ 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A,
+ 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A,
+ 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7,
+ 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30,
+ 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B,
+ 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98,
+ 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45,
+ 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B,
+ 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB,
+ 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F,
+ /* Big5-HKSCS 0xD740 .. 0xD77E */
+ 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119,
+ 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127,
+ 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232,
+ 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4,
+ 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9,
+ 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E,
+ 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387,
+ 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7,
+ /* Big5-HKSCS 0xD7A1 .. 0xD7FE */
+ 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9,
+ 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD,
+ 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A,
+ 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897,
+ 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9,
+ 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C,
+ 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2,
+ 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7,
+ 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021,
+ 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB,
+ 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC,
+ 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA,
+ /* Big5-HKSCS 0xD840 .. 0xD87E */
+ 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C,
+ 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5,
+ 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083,
+ 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087,
+ 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8,
+ 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F,
+ 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6,
+ 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837,
+ /* Big5-HKSCS 0xD8A1 .. 0xD8FE */
+ 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848,
+ 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839,
+ 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F,
+ 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC,
+ 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B,
+ 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D,
+ 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C,
+ 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35,
+ 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31,
+ 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36,
+ 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB,
+ 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114,
+ /* Big5-HKSCS 0xD940 .. 0xD97E */
+ 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC,
+ 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104,
+ 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8,
+ 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5,
+ 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4,
+ 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0,
+ 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568,
+ 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2,
+ /* Big5-HKSCS 0xD9A1 .. 0xD9FE */
+ 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A,
+ 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC,
+ 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6,
+ 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970,
+ 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD,
+ 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD,
+ 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915,
+ 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97,
+ 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC,
+ 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45,
+ 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33,
+ 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E,
+ /* Big5-HKSCS 0xDA40 .. 0xDA7E */
+ 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B,
+ 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64,
+ 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A,
+ 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125,
+ 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A,
+ 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330,
+ 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323,
+ 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416,
+ /* Big5-HKSCS 0xDAA1 .. 0xDAFE */
+ 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D,
+ 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7,
+ 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695,
+ 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A,
+ 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865,
+ 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868,
+ 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A,
+ 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B,
+ 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2,
+ 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56,
+ 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54,
+ 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65,
+ /* Big5-HKSCS 0xDB40 .. 0xDB7E */
+ 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050,
+ 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D,
+ 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204,
+ 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423,
+ 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410,
+ 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5,
+ 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9,
+ 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3,
+ /* Big5-HKSCS 0xDBA1 .. 0xDBFE */
+ 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3,
+ 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB,
+ 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA,
+ 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1,
+ 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0,
+ 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9,
+ 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D,
+ 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52,
+ 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80,
+ 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89,
+ 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5,
+ 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA,
+ /* Big5-HKSCS 0xDC40 .. 0xDC7E */
+ 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6,
+ 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F,
+ 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB,
+ 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F,
+ 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226,
+ 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204,
+ 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216,
+ 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688,
+ /* Big5-HKSCS 0xDCA1 .. 0xDCFE */
+ 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1,
+ 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6,
+ 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE,
+ 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA,
+ 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278,
+ 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA,
+ 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D,
+ 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9,
+ 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849,
+ 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D,
+ 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8,
+ 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6,
+ /* Big5-HKSCS 0xDD40 .. 0xDD7E */
+ 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90,
+ 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A,
+ 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0,
+ 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6,
+ 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A,
+ 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F,
+ 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5,
+ 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424,
+ /* Big5-HKSCS 0xDDA1 .. 0xDDFE */
+ 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437,
+ 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435,
+ 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7,
+ 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686,
+ 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678,
+ 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F,
+ 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948,
+ 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978,
+ 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941,
+ 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951,
+ 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43,
+ 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC,
+ /* Big5-HKSCS 0xDE40 .. 0xDE7E */
+ 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0,
+ 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2,
+ 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6,
+ 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92,
+ 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA,
+ 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160,
+ 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142,
+ 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153,
+ /* Big5-HKSCS 0xDEA1 .. 0xDEFE */
+ 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291,
+ 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A,
+ 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440,
+ 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1,
+ 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF,
+ 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610,
+ 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD,
+ 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767,
+ 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F,
+ 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899,
+ 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11,
+ 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13,
+ /* Big5-HKSCS 0xDF40 .. 0xDF7E */
+ 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64,
+ 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70,
+ 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88,
+ 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B,
+ 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D,
+ 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB,
+ 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B,
+ 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F,
+ /* Big5-HKSCS 0xDFA1 .. 0xDFFE */
+ 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242,
+ 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D,
+ 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D,
+ 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437,
+ 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429,
+ 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439,
+ 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447,
+ 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454,
+ 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6,
+ 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D,
+ 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA,
+ 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4,
+ /* Big5-HKSCS 0xE040 .. 0xE07E */
+ 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F,
+ 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81,
+ 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66,
+ 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C,
+ 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0,
+ 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2,
+ 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00,
+ 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F,
+ /* Big5-HKSCS 0xE0A1 .. 0xE0FE */
+ 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111,
+ 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252,
+ 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E,
+ 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F,
+ 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272,
+ 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E,
+ 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD,
+ 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D,
+ 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5,
+ 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD,
+ 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD,
+ 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0,
+ /* Big5-HKSCS 0xE140 .. 0xE17E */
+ 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627,
+ 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613,
+ 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C,
+ 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A,
+ 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894,
+ 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA,
+ 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC,
+ 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0,
+ /* Big5-HKSCS 0xE1A1 .. 0xE1FE */
+ 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A,
+ 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D,
+ 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7,
+ 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43,
+ 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173,
+ 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A,
+ 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227,
+ 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472,
+ 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E,
+ 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C,
+ 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0,
+ 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9,
+ /* Big5-HKSCS 0xE240 .. 0xE27E */
+ 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999,
+ 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4,
+ 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3,
+ 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2,
+ 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F,
+ 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03,
+ 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19,
+ 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A,
+ /* Big5-HKSCS 0xE2A1 .. 0xE2FE */
+ 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30,
+ 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD,
+ 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E,
+ 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182,
+ 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297,
+ 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473,
+ 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503,
+ 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A,
+ 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780,
+ 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8,
+ 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4,
+ 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993,
+ /* Big5-HKSCS 0xE340 .. 0xE37E */
+ 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F,
+ 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C,
+ 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E,
+ 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF,
+ 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1,
+ 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC,
+ 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9,
+ 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE,
+ /* Big5-HKSCS 0xE3A1 .. 0xE3FE */
+ 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187,
+ 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F,
+ 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4,
+ 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7,
+ 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF,
+ 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4,
+ 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728,
+ 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743,
+ 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D,
+ 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727,
+ 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1,
+ 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB,
+ /* Big5-HKSCS 0xE440 .. 0xE47E */
+ 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9,
+ 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96,
+ 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09,
+ 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06,
+ 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D,
+ 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124,
+ 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4,
+ 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D,
+ /* Big5-HKSCS 0xE4A1 .. 0xE4FE */
+ 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3,
+ 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1,
+ 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9,
+ 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D,
+ 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781,
+ 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900,
+ 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2,
+ 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60,
+ 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103,
+ 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C,
+ 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642,
+ 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658,
+ /* Big5-HKSCS 0xE540 .. 0xE57E */
+ 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A,
+ 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF,
+ 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7,
+ 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05,
+ 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93,
+ 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D,
+ 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2,
+ 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189,
+ /* Big5-HKSCS 0xE5A1 .. 0xE5FE */
+ 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA,
+ 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496,
+ 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C,
+ 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579,
+ 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7,
+ 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15,
+ 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D,
+ 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40,
+ 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04,
+ 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16,
+ 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF,
+ 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92,
+ /* Big5-HKSCS 0xE640 .. 0xE67E */
+ 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96,
+ 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57,
+ 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67,
+ 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77,
+ 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A,
+ 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA,
+ 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E,
+ 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359,
+ /* Big5-HKSCS 0xE6A1 .. 0xE6FE */
+ 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D,
+ 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625,
+ 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B,
+ 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788,
+ 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8,
+ 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2,
+ 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB,
+ 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5,
+ 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7,
+ 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE,
+ 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA,
+ 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F,
+ /* Big5-HKSCS 0xE740 .. 0xE77E */
+ 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253,
+ 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500,
+ 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C,
+ 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2,
+ 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9,
+ 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E,
+ 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9,
+ 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662,
+ /* Big5-HKSCS 0xE7A1 .. 0xE7FE */
+ 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758,
+ 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D,
+ 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A,
+ 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767,
+ 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918,
+ 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4,
+ 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3,
+ 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5,
+ 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F,
+ 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0,
+ 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E,
+ 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27,
+ /* Big5-HKSCS 0xE840 .. 0xE87E */
+ 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C,
+ 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073,
+ 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A,
+ 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182,
+ 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6,
+ 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC,
+ 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD,
+ 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3,
+ /* Big5-HKSCS 0xE8A1 .. 0xE8FE */
+ 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB,
+ 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702,
+ 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D,
+ 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908,
+ 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD,
+ 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB,
+ 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1,
+ 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75,
+ 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF,
+ 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04,
+ 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A,
+ 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E,
+ /* Big5-HKSCS 0xE940 .. 0xE97E */
+ 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C,
+ 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC,
+ 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10,
+ 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1,
+ 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2,
+ 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9,
+ 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8,
+ 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA,
+ /* Big5-HKSCS 0xE9A1 .. 0xE9FE */
+ 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF,
+ 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533,
+ 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB,
+ 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66,
+ 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76,
+ 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A,
+ 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C,
+ 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54,
+ 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03,
+ 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8,
+ 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5,
+ 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8,
+ /* Big5-HKSCS 0xEA40 .. 0xEA7E */
+ 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5,
+ 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4,
+ 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA,
+ 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365,
+ 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495,
+ 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633,
+ 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D,
+ 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799,
+ /* Big5-HKSCS 0xEAA1 .. 0xEAFE */
+ 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3,
+ 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44,
+ 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE,
+ 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9,
+ 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2,
+ 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C,
+ 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22,
+ 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43,
+ 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C,
+ 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC,
+ 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257,
+ 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558,
+ /* Big5-HKSCS 0xEB40 .. 0xEB7E */
+ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547,
+ 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555,
+ 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C,
+ 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792,
+ 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785,
+ 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789,
+ 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922,
+ 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0,
+ /* Big5-HKSCS 0xEBA1 .. 0xEBFE */
+ 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4,
+ 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF,
+ 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0,
+ 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38,
+ 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F,
+ 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34,
+ 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136,
+ 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308,
+ 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323,
+ 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D,
+ 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324,
+ 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C,
+ /* Big5-HKSCS 0xEC40 .. 0xEC7E */
+ 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD,
+ 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9,
+ 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0,
+ 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929,
+ 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA,
+ 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA,
+ 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E,
+ 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95,
+ /* Big5-HKSCS 0xECA1 .. 0xECFE */
+ 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14,
+ 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88,
+ 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12,
+ 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4,
+ 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682,
+ 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25,
+ 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B,
+ 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3,
+ 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE,
+ 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580,
+ 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89,
+ 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E,
+ /* Big5-HKSCS 0xED40 .. 0xED7E */
+ 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A,
+ 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9,
+ 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE,
+ 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2,
+ 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2,
+ 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510,
+ 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647,
+ 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6,
+ /* Big5-HKSCS 0xEDA1 .. 0xEDFE */
+ 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902,
+ 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB,
+ 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE,
+ 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB,
+ 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01,
+ 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8,
+ 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49,
+ 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44,
+ 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C,
+ 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9,
+ 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595,
+ 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E,
+ /* Big5-HKSCS 0xEE40 .. 0xEE7E */
+ 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E,
+ 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582,
+ 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668,
+ 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5,
+ 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF,
+ 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE,
+ 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937,
+ 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E,
+ /* Big5-HKSCS 0xEEA1 .. 0xEEFE */
+ 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F,
+ 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13,
+ 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94,
+ 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47,
+ 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B,
+ 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF,
+ 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349,
+ 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379,
+ 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361,
+ 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0,
+ 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720,
+ 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C,
+ /* Big5-HKSCS 0xEF40 .. 0xEF7E */
+ 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A,
+ 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933,
+ 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1,
+ 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB,
+ 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01,
+ 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1,
+ 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41,
+ 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30,
+ /* Big5-HKSCS 0xEFA1 .. 0xEFFE */
+ 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D,
+ 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA,
+ 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131,
+ 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699,
+ 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8,
+ 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6,
+ 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC,
+ 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD,
+ 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD,
+ 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005,
+ 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7,
+ 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376,
+ /* Big5-HKSCS 0xF040 .. 0xF07E */
+ 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2,
+ 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657,
+ 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C,
+ 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC,
+ 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D,
+ 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56,
+ 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53,
+ 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2,
+ /* Big5-HKSCS 0xF0A1 .. 0xF0FE */
+ 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3,
+ 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB,
+ 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8,
+ 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB,
+ 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3,
+ 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4,
+ 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950,
+ 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35,
+ 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26,
+ 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75,
+ 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C,
+ 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67,
+ /* Big5-HKSCS 0xF140 .. 0xF17E */
+ 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47,
+ 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5,
+ 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B,
+ 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395,
+ 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4,
+ 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3,
+ 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722,
+ 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA,
+ /* Big5-HKSCS 0xF1A1 .. 0xF1FE */
+ 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA,
+ 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F,
+ 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07,
+ 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35,
+ 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1,
+ 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C,
+ 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C,
+ 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C,
+ 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29,
+ 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4,
+ 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD,
+ 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70,
+ /* Big5-HKSCS 0xF240 .. 0xF27E */
+ 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E,
+ 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1,
+ 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD,
+ 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016,
+ 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C,
+ 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6,
+ 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516,
+ 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B,
+ /* Big5-HKSCS 0xF2A1 .. 0xF2FE */
+ 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68,
+ 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76,
+ 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74,
+ 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE,
+ 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1,
+ 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2,
+ 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6,
+ 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7,
+ 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A,
+ 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958,
+ 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48,
+ 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55,
+ /* Big5-HKSCS 0xF340 .. 0xF37E */
+ 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A,
+ 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D,
+ 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51,
+ 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD,
+ 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC,
+ 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3,
+ 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA,
+ 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726,
+ /* Big5-HKSCS 0xF3A1 .. 0xF3FE */
+ 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C,
+ 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948,
+ 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D,
+ 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C,
+ 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA,
+ 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4,
+ 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA,
+ 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78,
+ 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70,
+ 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F,
+ 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40,
+ 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2,
+ /* Big5-HKSCS 0xF440 .. 0xF47E */
+ 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF,
+ 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF,
+ 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9,
+ 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034,
+ 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B,
+ 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA,
+ 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD,
+ 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929,
+ /* Big5-HKSCS 0xF4A1 .. 0xF4FE */
+ 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48,
+ 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80,
+ 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269,
+ 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604,
+ 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817,
+ 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A,
+ 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86,
+ 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A,
+ 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B,
+ 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410,
+ 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E,
+ 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF,
+ /* Big5-HKSCS 0xF540 .. 0xF57E */
+ 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF,
+ 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862,
+ 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C,
+ 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36,
+ 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10,
+ 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8,
+ 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F,
+ 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B,
+ /* Big5-HKSCS 0xF5A1 .. 0xF5FE */
+ 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A,
+ 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6,
+ 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6,
+ 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91,
+ 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48,
+ 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC,
+ 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049,
+ 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A,
+ 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A,
+ 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030,
+ 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619,
+ 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625,
+ /* Big5-HKSCS 0xF640 .. 0xF67E */
+ 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A,
+ 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45,
+ 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E,
+ 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B,
+ 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437,
+ 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A,
+ 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956,
+ 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A,
+ /* Big5-HKSCS 0xF6A1 .. 0xF6FE */
+ 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A,
+ 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29,
+ 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA,
+ 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9,
+ 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD,
+ 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18,
+ 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6,
+ 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2,
+ 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D,
+ 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F,
+ 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4,
+ 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A,
+ /* Big5-HKSCS 0xF740 .. 0xF77E */
+ 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634,
+ 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826,
+ 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84,
+ 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A,
+ 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C,
+ 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449,
+ 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B,
+ 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A,
+ /* Big5-HKSCS 0xF7A1 .. 0xF7FE */
+ 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B,
+ 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33,
+ 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB,
+ 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF,
+ 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6,
+ 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2,
+ 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F,
+ 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB,
+ 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382,
+ 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C,
+ 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830,
+ 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE,
+ /* Big5-HKSCS 0xF840 .. 0xF87E */
+ 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64,
+ 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4,
+ 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52,
+ 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C,
+ 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4,
+ 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC,
+ 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3,
+ 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F,
+ /* Big5-HKSCS 0xF8A1 .. 0xF8FE */
+ 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E,
+ 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D,
+ 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6,
+ 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835,
+ 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE,
+ 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743,
+ 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67,
+ 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03,
+ 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04,
+ 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E,
+ 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA,
+ 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A,
+ /* Big5-HKSCS 0xF940 .. 0xF97E */
+ 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648,
+ 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5,
+ 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749,
+ 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10,
+ 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78,
+ 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2,
+ 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74,
+ 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A,
+ /* Big5-HKSCS 0xF9A1 .. 0xF9FE */
+ 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D,
+ 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874,
+ 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15,
+ 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482,
+ 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B,
+ 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D,
+ 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9,
+ 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557,
+ 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564,
+ 0x2555, 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553,
+ 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C,
+ 0x2551, 0x2550, 0x256D, 0x256E, 0x2570, 0x256F, 0xFFED,
+ /* Big5-HKSCS 0xFA40 .. 0xFA7E */
+ 0xE000, 0x92DB, 0xE002, 0xE003, 0x854C, 0x42B5, 0x73EF, 0x51B5,
+ 0x3649, 0xE009, 0xE00A, 0x9344, 0xE00C, 0x82EE, 0xE00E, 0x783C,
+ 0x6744, 0x62DF, 0xE012, 0xE013, 0xE014, 0xE015, 0xE016, 0x4FAB,
+ 0xE018, 0x5008, 0xE01A, 0xE01B, 0xE01C, 0xE01D, 0xE01E, 0x5029,
+ 0xE020, 0x5FA4, 0xE022, 0xE023, 0x6EDB, 0xE025, 0x507D, 0x5101,
+ 0x347A, 0x510E, 0x986C, 0x3743, 0x8416, 0xE02D, 0xE02E, 0x5160,
+ 0xE030, 0x516A, 0xE032, 0xE033, 0xE034, 0xE035, 0xE036, 0xE037,
+ 0xE038, 0x5B82, 0x877D, 0xE03B, 0xE03C, 0x51B2, 0x51B8,
+ /* Big5-HKSCS 0xFAA1 .. 0xFAFE */
+ 0x9D34, 0x51C9, 0x51CF, 0x51D1, 0x3CDC, 0x51D3, 0xE045,
+ 0x51B3, 0x51E2, 0x5342, 0x51ED, 0x83CD, 0x693E, 0xE04C, 0x5F7B,
+ 0x520B, 0x5226, 0x523C, 0x52B5, 0x5257, 0x5294, 0x52B9, 0x52C5,
+ 0x7C15, 0x8542, 0x52E0, 0x860D, 0xE05A, 0x5305, 0xE05C, 0x5549,
+ 0x6ED9, 0xE05F, 0xE060, 0xE061, 0x5333, 0x5344, 0xE064, 0x6CCB,
+ 0xE066, 0x681B, 0x73D5, 0x604A, 0x3EAA, 0x38CC, 0xE06C, 0x71DD,
+ 0x44A2, 0x536D, 0x5374, 0xE071, 0x537E, 0x537F, 0xE074, 0xE075,
+ 0x77E6, 0x5393, 0xE078, 0x53A0, 0x53AB, 0x53AE, 0x73A7, 0xE07D,
+ 0x3F59, 0x739C, 0x53C1, 0x53C5, 0x6C49, 0x4E49, 0x57FE, 0x53D9,
+ 0x3AAB, 0xE087, 0x53E0, 0xE089, 0xE08A, 0x53F6, 0xE08C, 0x5413,
+ 0x7079, 0x552B, 0x6657, 0x6D5B, 0x546D, 0xE093, 0xE094, 0x555D,
+ 0x548F, 0x54A4, 0x47A6, 0xE099, 0xE09A, 0x3DB4, 0xE09C,
+ /* Big5-HKSCS 0xFB40 .. 0xFB7E */
+ 0xE09D, 0xE09E, 0x5547, 0x4CED, 0x542F, 0x7417, 0x5586, 0x55A9,
+ 0x5605, 0xE0A6, 0xE0A7, 0x4552, 0xE0A9, 0x66B3, 0xE0AB, 0x5637,
+ 0x66CD, 0xE0AE, 0x66A4, 0x66AD, 0x564D, 0x564F, 0x78F1, 0x56F1,
+ 0x9787, 0x53FE, 0x5700, 0x56EF, 0x56ED, 0xE0BA, 0x3623, 0xE0BC,
+ 0x5746, 0xE0BE, 0x6C6E, 0x708B, 0x5742, 0x36B1, 0xE0C3, 0x57E6,
+ 0xE0C5, 0x5803, 0xE0C7, 0xE0C8, 0x5826, 0xE0CA, 0x585C, 0x58AA,
+ 0x3561, 0x58E0, 0x58DC, 0xE0D0, 0x58FB, 0x5BFF, 0x5743, 0xE0D4,
+ 0xE0D5, 0x93D3, 0x35A1, 0x591F, 0x68A6, 0x36C3, 0x6E59,
+ /* Big5-HKSCS 0xFBA1 .. 0xFBFE */
+ 0xE0DC, 0x5A24, 0x5553, 0xE0DF, 0x8505, 0x59C9, 0xE0E2,
+ 0xE0E3, 0xE0E4, 0xE0E5, 0x59D9, 0xE0E7, 0xE0E8, 0xE0E9, 0x6D71,
+ 0xE0EB, 0xE0EC, 0x59F9, 0xE0EE, 0x5AAB, 0x5A63, 0x36E6, 0xE0F2,
+ 0x5A77, 0x3708, 0x5A96, 0x7465, 0x5AD3, 0xE0F8, 0xE0F9, 0x3D85,
+ 0xE0FB, 0x3732, 0xE0FD, 0x5E83, 0x52D0, 0x5B76, 0x6588, 0x5B7C,
+ 0xE103, 0x4004, 0x485D, 0xE106, 0x5BD5, 0x6160, 0xE109, 0xE10A,
+ 0xE10B, 0x5BF3, 0x5B9D, 0x4D10, 0x5C05, 0xE110, 0x5C13, 0x73CE,
+ 0x5C14, 0xE114, 0xE115, 0x5C49, 0x48DD, 0x5C85, 0x5CE9, 0x5CEF,
+ 0x5D8B, 0xE11C, 0xE11D, 0x5D10, 0x5D18, 0x5D46, 0xE121, 0x5CBA,
+ 0x5DD7, 0x82FC, 0x382D, 0xE126, 0xE127, 0xE128, 0x8287, 0x3836,
+ 0x3BC2, 0x5E2E, 0x6A8A, 0x5E75, 0x5E7A, 0xE130, 0xE131, 0x53A6,
+ 0x4EB7, 0x5ED0, 0x53A8, 0xE136, 0x5E09, 0x5EF4, 0xE139,
+ /* Big5-HKSCS 0xFC40 .. 0xFC7E */
+ 0x5EF9, 0x5EFB, 0x38A0, 0x5EFC, 0x683E, 0x941B, 0x5F0D, 0xE141,
+ 0xE142, 0x3ADE, 0x48AE, 0xE145, 0x5F3A, 0xE147, 0xE148, 0x5F58,
+ 0xE14A, 0x5F63, 0x97BD, 0xE14D, 0x5F72, 0x9340, 0xE150, 0x5FA7,
+ 0x5DB6, 0x3D5F, 0xE154, 0xE155, 0xE156, 0xE157, 0x91D6, 0xE159,
+ 0xE15A, 0x6031, 0x6685, 0xE15D, 0x3963, 0x3DC7, 0x3639, 0x5790,
+ 0xE162, 0x7971, 0x3E40, 0x609E, 0x60A4, 0x60B3, 0xE168, 0xE169,
+ 0xE16A, 0x74A4, 0x50E1, 0x5AA0, 0x6164, 0x8424, 0x6142, 0xE171,
+ 0xE172, 0x6181, 0x51F4, 0xE175, 0x6187, 0x5BAA, 0xE178,
+ /* Big5-HKSCS 0xFCA1 .. 0xFCFE */
+ 0xE179, 0x61D3, 0xE17B, 0xE17C, 0x61D0, 0x3932, 0xE17F,
+ 0xE180, 0x6023, 0x615C, 0x651E, 0x638B, 0xE185, 0x62C5, 0xE187,
+ 0x62D5, 0xE189, 0x636C, 0xE18B, 0x3A17, 0x6438, 0x63F8, 0xE18F,
+ 0xE190, 0x6490, 0x6F8A, 0xE193, 0x9814, 0xE195, 0xE196, 0x64E1,
+ 0x64E5, 0x947B, 0x3A66, 0x643A, 0x3A57, 0x654D, 0x6F16, 0xE19F,
+ 0xE1A0, 0x6585, 0x656D, 0x655F, 0xE1A4, 0x65B5, 0xE1A6, 0x4B37,
+ 0x65D1, 0x40D8, 0xE1AA, 0x65E0, 0x65E3, 0x5FDF, 0xE1AE, 0x6618,
+ 0xE1B0, 0xE1B1, 0x6644, 0xE1B3, 0xE1B4, 0x664B, 0xE1B6, 0x6667,
+ 0xE1B8, 0x6673, 0x6674, 0xE1BB, 0xE1BC, 0xE1BD, 0xE1BE, 0xE1BF,
+ 0x77C5, 0xE1C1, 0x99A4, 0x6702, 0xE1C4, 0xE1C5, 0x3B2B, 0x69FA,
+ 0xE1C8, 0x675E, 0x6767, 0x6762, 0xE1CC, 0xE1CD, 0x67D7, 0x44E9,
+ 0x6822, 0x6E50, 0x923C, 0x6801, 0xE1D4, 0xE1D5, 0x685D,
+ /* Big5-HKSCS 0xFD40 .. 0xFD7E */
+ 0xE1D7, 0x69E1, 0x6A0B, 0xE1DA, 0x6973, 0x68C3, 0xE1DD, 0x6901,
+ 0x6900, 0x3D32, 0x3A01, 0xE1E2, 0x3B80, 0x67AC, 0x6961, 0xE1E6,
+ 0x42FC, 0x6936, 0x6998, 0x3BA1, 0xE1EB, 0x8363, 0x5090, 0x69F9,
+ 0xE1EF, 0xE1F0, 0x6A45, 0xE1F2, 0x6A9D, 0x3BF3, 0x67B1, 0x6AC8,
+ 0xE1F7, 0x3C0D, 0x6B1D, 0xE1FA, 0x60DE, 0x6B35, 0x6B74, 0xE1FE,
+ 0x6EB5, 0xE200, 0xE201, 0xE202, 0x3740, 0x5421, 0xE205, 0x6BE1,
+ 0xE207, 0x6BDC, 0x6C37, 0xE20A, 0xE20B, 0xE20C, 0x6C5A, 0x8226,
+ 0x6C79, 0xE210, 0x44C5, 0xE212, 0xE213, 0xE214, 0xE215,
+ /* Big5-HKSCS 0xFDA1 .. 0xFDFE */
+ 0xE216, 0x36E5, 0x3CEB, 0xE219, 0x9B83, 0xE21B, 0xE21C,
+ 0x7F8F, 0x6837, 0xE21F, 0xE220, 0xE221, 0x6D96, 0x6D5C, 0x6E7C,
+ 0x6F04, 0xE226, 0xE227, 0xE228, 0x8533, 0xE22A, 0x51C7, 0x6C9C,
+ 0x6E1D, 0x842E, 0xE22F, 0x6E2F, 0xE231, 0x7453, 0xE233, 0x79CC,
+ 0x6E4F, 0x5A91, 0xE237, 0x6FF8, 0x370D, 0x6F9D, 0xE23B, 0x6EFA,
+ 0xE23D, 0xE23E, 0x4555, 0x93F0, 0x6F44, 0x6F5C, 0x3D4E, 0x6F74,
+ 0xE245, 0x3D3B, 0x6F9F, 0xE248, 0x6FD3, 0xE24A, 0xE24B, 0xE24C,
+ 0xE24D, 0xE24E, 0xE24F, 0x51DF, 0xE251, 0xE252, 0xE253, 0xE254,
+ 0x704B, 0x707E, 0x70A7, 0x7081, 0x70CC, 0x70D5, 0x70D6, 0x70DF,
+ 0x4104, 0x3DE8, 0x71B4, 0x7196, 0xE261, 0x712B, 0x7145, 0x5A88,
+ 0x714A, 0x716E, 0x5C9C, 0xE268, 0x714F, 0x9362, 0xE26B, 0x712C,
+ 0xE26D, 0xE26E, 0xE26F, 0x71BA, 0xE271, 0x70BD, 0x720E,
+ /* Big5-HKSCS 0xFE40 .. 0xFE7E */
+ 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341, 0xE27A, 0x722E,
+ 0x7240, 0xE27D, 0x68BD, 0x7255, 0x7257, 0x3E55, 0xE282, 0x680D,
+ 0x6F3D, 0x7282, 0x732A, 0x732B, 0xE288, 0xE289, 0x48ED, 0xE28B,
+ 0x7328, 0x732E, 0x73CF, 0x73AA, 0xE290, 0xE291, 0x73C9, 0x7449,
+ 0xE294, 0xE295, 0xE296, 0x6623, 0x36C5, 0xE299, 0xE29A, 0xE29B,
+ 0x73F7, 0x7415, 0x6903, 0xE29F, 0x7439, 0xE2A1, 0x3ED7, 0x745C,
+ 0xE2A4, 0x7460, 0xE2A6, 0x7447, 0x73E4, 0x7476, 0x83B9, 0x746C,
+ 0x3730, 0x7474, 0x93F1, 0x6A2C, 0x7482, 0x4953, 0xE2B2,
+ /* Big5-HKSCS 0xFEA1 .. 0xFEFE */
+ 0xE2B3, 0xE2B4, 0xE2B5, 0x5B46, 0xE2B7, 0xE2B8, 0x74C8,
+ 0xE2BA, 0x750E, 0x74E9, 0x751E, 0xE2BE, 0xE2BF, 0x5BD7, 0xE2C1,
+ 0x9385, 0x754D, 0x754A, 0x7567, 0x756E, 0xE2C7, 0x3F04, 0xE2C9,
+ 0x758E, 0x745D, 0x759E, 0x75B4, 0x7602, 0x762C, 0x7651, 0x764F,
+ 0x766F, 0x7676, 0xE2D4, 0x7690, 0x81EF, 0x37F8, 0xE2D8, 0xE2D9,
+ 0x76A1, 0x76A5, 0x76B7, 0x76CC, 0xE2DE, 0x8462, 0xE2E0, 0xE2E1,
+ 0xE2E2, 0x771E, 0x7726, 0x7740, 0x64AF, 0xE2E7, 0x7758, 0xE2E9,
+ 0x77AF, 0xE2EB, 0xE2EC, 0xE2ED, 0x77F4, 0x7809, 0xE2F0, 0xE2F1,
+ 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5, 0x792E, 0xE2F8, 0x78D7,
+ 0x7934, 0x78B1, 0xE2FC, 0x8FB8, 0x8884, 0xE2FF, 0xE300, 0xE301,
+ 0x7986, 0x8900, 0x6902, 0x7980, 0xE306, 0x799D, 0xE308, 0x793C,
+ 0x79A9, 0x6E2A, 0xE30C, 0x3EA8, 0x79C6, 0xE30F, 0x79D4,
+};
+
+
+/* Returns the number of bytes of Bytes consumed. */
+static int qt_Big5hkscsToUnicode(const uchar *s, uint *pwc)
+{
+ uchar c1 = s[0];
+ if ((c1 >= 0x81 && c1 <= 0xfe)) {
+ uchar c2 = s[1];
+ if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) {
+ uint i = 157 * (c1 - 0x81) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40));
+ ushort wc = 0xfffd;
+ if (i < 19782)
+ wc = big5hkscs_to_ucs[i];
+ if (wc != 0xfffd) {
+ *pwc = (uint) wc;
+ return 2;
+ }
+ }
+ return 0;
+ } else if (c1 < 0x80) {
+ *pwc = (uint) c1;
+ return 1;
+ }
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+
+/*
+ * ucs4 to big5hkscs convert routing
+ */
+
+typedef struct {
+ ushort index; /* index into big table */
+ ushort used; /* bitmask of used entries */
+} Summary16;
+
+/* ISO-10646-UCS-4 to big5hkscs convert table */
+static const uchar big5hkscs_to_charset[24908][2] = {
+ {0x21,0x00}, {0xA2,0x46}, {0xA2,0x47}, {0xA2,0x44},
+ {0x7C,0x00}, {0xA1,0xB1}, {0xC6,0xD8}, {0x63,0x00},
+ {0x61,0x00}, {0x2D,0x00}, {0x52,0x00}, {0xA1,0xC2},
+ {0xA2,0x58}, {0xA1,0xD3}, {0x32,0x00}, {0x33,0x00},
+ {0xA1,0xA6}, {0xA3,0x67}, {0xA1,0x50}, {0xA1,0x4D},
+ {0x31,0x00}, {0x6F,0x00}, {0x3F,0x00}, {0x88,0x59},
+ {0x88,0x57}, {0x41,0x00}, {0x41,0x00}, {0x41,0x00},
+ {0x41,0x00}, {0x41,0x00}, {0x43,0x00}, {0x88,0x5D},
+ {0x88,0x5B}, {0x88,0x66}, {0x45,0x00}, {0x49,0x00},
+ {0x49,0x00}, {0x49,0x00}, {0x49,0x00}, {0x44,0x00},
+ {0x4E,0x00}, {0x88,0x61}, {0x88,0x5F}, {0x4F,0x00},
+ {0x4F,0x00}, {0x4F,0x00}, {0xA1,0xD1}, {0x4F,0x00},
+ {0x55,0x00}, {0x55,0x00}, {0x55,0x00}, {0x55,0x00},
+ {0x59,0x00}, {0x54,0x00}, {0x73,0x00}, {0x88,0x6A},
+ {0x88,0x68}, {0x61,0x00}, {0x61,0x00}, {0x61,0x00},
+ {0x61,0x00}, {0x61,0x00}, {0x63,0x00}, {0x88,0x6F},
+ {0x88,0x6D}, {0x88,0xA7}, {0x65,0x00}, {0x88,0x73},
+ {0x88,0x71}, {0x69,0x00}, {0x69,0x00}, {0x65,0x00},
+ {0x6E,0x00}, {0x88,0x77}, {0x88,0x75}, {0x6F,0x00},
+ {0x6F,0x00}, {0x6F,0x00}, {0xA1,0xD2}, {0xC8,0xFB},
+ {0x88,0x7B}, {0x88,0x79}, {0x75,0x00}, {0x88,0xA2},
+ {0x79,0x00}, {0x74,0x00}, {0x79,0x00}, {0x88,0x56},
+ {0x88,0x67}, {0x88,0x5A}, {0x88,0x6C}, {0x88,0x5C},
+ {0x88,0x6E}, {0x88,0x70}, {0xC8,0xFC}, {0x88,0x5E},
+ {0x88,0x74}, {0xC8,0xFA}, {0x88,0x78}, {0x88,0x58},
+ {0x88,0x69}, {0x88,0x72}, {0x88,0x60}, {0x88,0x76},
+ {0x88,0x7A}, {0x88,0x7C}, {0x88,0x7D}, {0x88,0x7E},
+ {0x88,0xA1}, {0xC8,0xF6}, {0x88,0x6B}, {0xC8,0xF8},
+ {0xC8,0xF7}, {0x88,0xA8}, {0xC8,0xFE}, {0xC8,0xF9},
+ {0xC8,0xF5}, {0xC8,0xFD}, {0xC6,0xD9}, {0xA3,0xBE},
+ {0xA3,0xBC}, {0xA3,0xBD}, {0xA3,0xBF}, {0xA1,0xC5},
+ {0xA3,0xBB}, {0xA1,0xC2}, {0xA3,0x44}, {0xA3,0x45},
+ {0xA3,0x46}, {0xA3,0x47}, {0xA3,0x48}, {0xA3,0x49},
+ {0xA3,0x4A}, {0xA3,0x4B}, {0xA3,0x4C}, {0xA3,0x4D},
+ {0xA3,0x4E}, {0xA3,0x4F}, {0xA3,0x50}, {0xA3,0x51},
+ {0xA3,0x52}, {0xA3,0x53}, {0xA3,0x54}, {0xA3,0x55},
+ {0xA3,0x56}, {0xA3,0x57}, {0xA3,0x58}, {0xA3,0x59},
+ {0xA3,0x5A}, {0xA3,0x5B}, {0xA3,0x5C}, {0xA3,0x5D},
+ {0xA3,0x5E}, {0xA3,0x5F}, {0xA3,0x60}, {0xA3,0x61},
+ {0xA3,0x62}, {0xA3,0x63}, {0xA3,0x64}, {0xA3,0x65},
+ {0xA3,0x66}, {0xA3,0x67}, {0xA3,0x68}, {0xA3,0x69},
+ {0xA3,0x6A}, {0xA3,0x6B}, {0xA3,0x6C}, {0xA3,0x6D},
+ {0xA3,0x6E}, {0xA3,0x6F}, {0xA3,0x70}, {0xA3,0x71},
+ {0xA3,0x72}, {0xA3,0x73}, {0xC7,0xF9}, {0xC7,0xF3},
+ {0xC7,0xF4}, {0xC7,0xF5}, {0xC7,0xF6}, {0xC7,0xF7},
+ {0xC7,0xF8}, {0xC7,0xFA}, {0xC7,0xFB}, {0xC7,0xFC},
+ {0xC7,0xFD}, {0xC7,0xFE}, {0xC8,0x40}, {0xC8,0x41},
+ {0xC8,0x42}, {0xC8,0x43}, {0xC8,0x44}, {0xC8,0x45},
+ {0xC8,0x46}, {0xC8,0x47}, {0xC8,0x48}, {0xC8,0x49},
+ {0xC8,0x4A}, {0xC8,0x4B}, {0xC8,0x4C}, {0xC8,0x4D},
+ {0xC8,0x4E}, {0xC8,0x4F}, {0xC8,0x50}, {0xC8,0x51},
+ {0xC8,0x52}, {0xC8,0x53}, {0xC8,0x54}, {0xC8,0x55},
+ {0xC8,0x56}, {0xC8,0x57}, {0xC8,0x58}, {0xC8,0x59},
+ {0xC8,0x5A}, {0xC8,0x5C}, {0xC8,0x5D}, {0xC8,0x5E},
+ {0xC8,0x5F}, {0xC8,0x60}, {0xC8,0x61}, {0xC8,0x62},
+ {0xC8,0x63}, {0xC8,0x64}, {0xC8,0x65}, {0xC8,0x66},
+ {0xC8,0x67}, {0xC8,0x68}, {0xC8,0x69}, {0xC8,0x6A},
+ {0xC8,0x6B}, {0xC8,0x6C}, {0xC8,0x6D}, {0xC8,0x6E},
+ {0xC8,0x6F}, {0xC8,0x70}, {0xC8,0x71}, {0xC8,0x72},
+ {0xC8,0x73}, {0xC8,0x74}, {0xC8,0x75}, {0xC8,0x5B},
+ {0x88,0x63}, {0x88,0xA4}, {0x88,0x65}, {0x88,0xA6},
+ {0xA1,0x56}, {0xA1,0x58}, {0xA2,0x77}, {0xA1,0xFC},
+ {0xA1,0xA5}, {0xA1,0xA6}, {0xA1,0xA7}, {0xA1,0xA8},
+ {0xA1,0x45}, {0xA3,0xBB}, {0xA1,0x4C}, {0xA1,0x4B},
+ {0xA1,0x45}, {0xA1,0xAC}, {0xA1,0xB2}, {0xA1,0xAB},
+ {0xA1,0xB0}, {0xA1,0xC3}, {0xA3,0xE1}, {0xA2,0x4A},
+ {0xA1,0xC1}, {0xA2,0x4B}, {0xC8,0xD2}, {0xC8,0xD3},
+ {0xA2,0xB9}, {0xA2,0xBA}, {0xA2,0xBB}, {0xA2,0xBC},
+ {0xA2,0xBD}, {0xA2,0xBE}, {0xA2,0xBF}, {0xA2,0xC0},
+ {0xA2,0xC1}, {0xA2,0xC2}, {0xC6,0xB5}, {0xC6,0xB6},
+ {0xC6,0xB7}, {0xC6,0xB8}, {0xC6,0xB9}, {0xC6,0xBA},
+ {0xC6,0xBB}, {0xC6,0xBC}, {0xC6,0xBD}, {0xC6,0xBE},
+ {0xA1,0xF6}, {0xA1,0xF4}, {0xA1,0xF7}, {0xA1,0xF5},
+ {0xA1,0xF8}, {0xA1,0xF9}, {0xA1,0xFB}, {0xA1,0xFA},
+ {0xC8,0x77}, {0xC8,0x78}, {0xC8,0x76}, {0xA2,0x41},
+ {0xA2,0x42}, {0xA2,0x58}, {0xA1,0xD4}, {0xA1,0xDB},
+ {0xA1,0xE8}, {0xA1,0xE7}, {0xA1,0xFD}, {0xA1,0xFC},
+ {0xA1,0xE4}, {0xA1,0xE5}, {0xA1,0xEC}, {0xA1,0xED},
+ {0xA1,0xEF}, {0xA1,0xEE}, {0xA1,0xDC}, {0xA1,0xDA},
+ {0xA1,0xDD}, {0xA1,0xDD}, {0xA1,0xD8}, {0xA1,0xD9},
+ {0xA1,0xF2}, {0xA1,0xF3}, {0xA1,0xE6}, {0xA1,0xE9},
+ {0xA1,0x5B}, {0xC6,0xA1}, {0xC6,0xA2}, {0xC6,0xA3},
+ {0xC6,0xA4}, {0xC6,0xA5}, {0xC6,0xA6}, {0xC6,0xA7},
+ {0xC6,0xA8}, {0xC6,0xA9}, {0xC6,0xAA}, {0xC6,0xAB},
+ {0xC6,0xAC}, {0xC6,0xAD}, {0xC6,0xAE}, {0xC6,0xAF},
+ {0xC6,0xB0}, {0xC6,0xB1}, {0xC6,0xB2}, {0xC6,0xB3},
+ {0xC6,0xB4}, {0xA2,0x77}, {0xA2,0x78}, {0xA2,0x7A},
+ {0xA2,0x7B}, {0xA2,0x7C}, {0xA2,0x7D}, {0xA2,0x75},
+ {0xA2,0x74}, {0xA2,0x73}, {0xA2,0x72}, {0xA2,0x71},
+ {0xF9,0xF9}, {0xF9,0xF8}, {0xF9,0xE6}, {0xF9,0xEF},
+ {0xF9,0xDD}, {0xF9,0xE8}, {0xF9,0xF1}, {0xF9,0xDF},
+ {0xF9,0xEC}, {0xF9,0xF5}, {0xF9,0xE3}, {0xF9,0xEE},
+ {0xF9,0xF7}, {0xF9,0xE5}, {0xF9,0xE9}, {0xF9,0xF2},
+ {0xF9,0xE0}, {0xF9,0xEB}, {0xF9,0xF4}, {0xF9,0xE2},
+ {0xF9,0xE7}, {0xF9,0xF0}, {0xF9,0xDE}, {0xF9,0xED},
+ {0xF9,0xF6}, {0xF9,0xE4}, {0xF9,0xEA}, {0xF9,0xF3},
+ {0xF9,0xE1}, {0xF9,0xFA}, {0xF9,0xFB}, {0xF9,0xFD},
+ {0xF9,0xFC}, {0xA2,0xAC}, {0xA2,0xAD}, {0xA2,0xAE},
+ {0xA1,0x5A}, {0xA2,0x62}, {0xA2,0x63}, {0xA2,0x64},
+ {0xA2,0x65}, {0xA2,0x66}, {0xA2,0x67}, {0xA2,0x68},
+ {0xA2,0x69}, {0xA2,0x70}, {0xA2,0x6F}, {0xA2,0x6E},
+ {0xA2,0x6D}, {0xA2,0x6C}, {0xA2,0x6B}, {0xA2,0x6A},
+ {0xF9,0xFE}, {0xA2,0x76}, {0xA2,0x79}, {0xA1,0xBD},
+ {0xA1,0xBC}, {0xA1,0xB6}, {0xA1,0xB5}, {0xA1,0xBF},
+ {0xA1,0xBE}, {0xA1,0xBB}, {0xA1,0xBA}, {0xA1,0xB3},
+ {0xA1,0xB7}, {0xA1,0xB4}, {0xA2,0xA8}, {0xA2,0xA9},
+ {0xA2,0xAB}, {0xA2,0xAA}, {0xA1,0xB9}, {0xA1,0xB8},
+ {0xA1,0xF3}, {0xA1,0xF0}, {0xA1,0xF2}, {0xA1,0xF1},
+ {0xC6,0xE6}, {0xC8,0xD6}, {0xC8,0xD7}, {0xC8,0xD8},
+ {0xC8,0xD9}, {0xC8,0xDA}, {0xC8,0xDB}, {0xC8,0xDC},
+ {0xC8,0xDD}, {0xC8,0xDE}, {0xC8,0xDF}, {0xC8,0xE0},
+ {0xC8,0xE1}, {0xC8,0xE2}, {0xC8,0xE3}, {0xC8,0xE4},
+ {0xC8,0xE5}, {0xC8,0xE6}, {0xC8,0xE7}, {0xC8,0xE8},
+ {0xC8,0xE9}, {0xC8,0xEA}, {0xC8,0xEB}, {0xC8,0xEC},
+ {0xC8,0xED}, {0xC8,0xEE}, {0xC8,0xEF}, {0xC8,0xF0},
+ {0xC8,0xF1}, {0xC6,0xCD}, {0xA1,0x40}, {0xA1,0x42},
+ {0xA1,0x43}, {0xA1,0xB2}, {0xC6,0xE0}, {0xC6,0xE1},
+ {0xC6,0xE2}, {0xA1,0x71}, {0xA1,0x72}, {0xA1,0x6D},
+ {0xA1,0x6E}, {0xA1,0x75}, {0xA1,0x76}, {0xA1,0x79},
+ {0xA1,0x7A}, {0xA1,0x69}, {0xA1,0x6A}, {0xA2,0x45},
+ {0xA1,0x65}, {0xA1,0x66}, {0xA1,0xE3}, {0xA1,0xA9},
+ {0xA1,0xAA}, {0xA2,0xC3}, {0xA2,0xC4}, {0xA2,0xC5},
+ {0xA2,0xC6}, {0xA2,0xC7}, {0xA2,0xC8}, {0xA2,0xC9},
+ {0xA2,0xCA}, {0xA2,0xCB}, {0xA1,0xCA}, {0xC6,0xE7},
+ {0xC6,0xE8}, {0xC6,0xE9}, {0xC6,0xEA}, {0xC6,0xEB},
+ {0xC6,0xEC}, {0xC6,0xED}, {0xC6,0xEE}, {0xC6,0xEF},
+ {0xC6,0xF0}, {0xC6,0xF1}, {0xC6,0xF2}, {0xC6,0xF3},
+ {0xC6,0xF4}, {0xC6,0xF5}, {0xC6,0xF6}, {0xC6,0xF7},
+ {0xC6,0xF8}, {0xC6,0xF9}, {0xC6,0xFA}, {0xC6,0xFB},
+ {0xC6,0xFC}, {0xC6,0xFD}, {0xC6,0xFE}, {0xC7,0x40},
+ {0xC7,0x41}, {0xC7,0x42}, {0xC7,0x43}, {0xC7,0x44},
+ {0xC7,0x45}, {0xC7,0x46}, {0xC7,0x47}, {0xC7,0x48},
+ {0xC7,0x49}, {0xC7,0x4A}, {0xC7,0x4B}, {0xC7,0x4C},
+ {0xC7,0x4D}, {0xC7,0x4E}, {0xC7,0x4F}, {0xC7,0x50},
+ {0xC7,0x51}, {0xC7,0x52}, {0xC7,0x53}, {0xC7,0x54},
+ {0xC7,0x55}, {0xC7,0x56}, {0xC7,0x57}, {0xC7,0x58},
+ {0xC7,0x59}, {0xC7,0x5A}, {0xC7,0x5B}, {0xC7,0x5C},
+ {0xC7,0x5D}, {0xC7,0x5E}, {0xC7,0x5F}, {0xC7,0x60},
+ {0xC7,0x61}, {0xC7,0x62}, {0xC7,0x63}, {0xC7,0x64},
+ {0xC7,0x65}, {0xC7,0x66}, {0xC7,0x67}, {0xC7,0x68},
+ {0xC7,0x69}, {0xC7,0x6A}, {0xC7,0x6B}, {0xC7,0x6C},
+ {0xC7,0x6D}, {0xC7,0x6E}, {0xC7,0x6F}, {0xC7,0x70},
+ {0xC7,0x71}, {0xC7,0x72}, {0xC7,0x73}, {0xC7,0x74},
+ {0xC7,0x75}, {0xC7,0x76}, {0xC7,0x77}, {0xC7,0x78},
+ {0xC7,0x79}, {0xC7,0x7A}, {0xC8,0xD4}, {0xC8,0xD5},
+ {0xC6,0xDC}, {0xC6,0xDD}, {0xC7,0x7B}, {0xC7,0x7C},
+ {0xC7,0x7D}, {0xC7,0x7E}, {0xC7,0xA1}, {0xC7,0xA2},
+ {0xC7,0xA3}, {0xC7,0xA4}, {0xC7,0xA5}, {0xC7,0xA6},
+ {0xC7,0xA7}, {0xC7,0xA8}, {0xC7,0xA9}, {0xC7,0xAA},
+ {0xC7,0xAB}, {0xC7,0xAC}, {0xC7,0xAD}, {0xC7,0xAE},
+ {0xC7,0xAF}, {0xC7,0xB0}, {0xC7,0xB1}, {0xC7,0xB2},
+ {0xC7,0xB3}, {0xC7,0xB4}, {0xC7,0xB5}, {0xC7,0xB6},
+ {0xC7,0xB7}, {0xC7,0xB8}, {0xC7,0xB9}, {0xC7,0xBA},
+ {0xC7,0xBB}, {0xC7,0xBC}, {0xC7,0xBD}, {0xC7,0xBE},
+ {0xC7,0xBF}, {0xC7,0xC0}, {0xC7,0xC1}, {0xC7,0xC2},
+ {0xC7,0xC3}, {0xC7,0xC4}, {0xC7,0xC5}, {0xC7,0xC6},
+ {0xC7,0xC7}, {0xC7,0xC8}, {0xC7,0xC9}, {0xC7,0xCA},
+ {0xC7,0xCB}, {0xC7,0xCC}, {0xC7,0xCD}, {0xC7,0xCE},
+ {0xC7,0xCF}, {0xC7,0xD0}, {0xC7,0xD1}, {0xC7,0xD2},
+ {0xC7,0xD3}, {0xC7,0xD4}, {0xC7,0xD5}, {0xC7,0xD6},
+ {0xC7,0xD7}, {0xC7,0xD8}, {0xC7,0xD9}, {0xC7,0xDA},
+ {0xC7,0xDB}, {0xC7,0xDC}, {0xC7,0xDD}, {0xC7,0xDE},
+ {0xC7,0xDF}, {0xC7,0xE0}, {0xC7,0xE1}, {0xC7,0xE2},
+ {0xC7,0xE3}, {0xC7,0xE4}, {0xC7,0xE5}, {0xC7,0xE6},
+ {0xC7,0xE7}, {0xC7,0xE8}, {0xC7,0xE9}, {0xC7,0xEA},
+ {0xC7,0xEB}, {0xC7,0xEC}, {0xC7,0xED}, {0xC7,0xEE},
+ {0xC7,0xEF}, {0xC7,0xF0}, {0xC7,0xF1}, {0xC7,0xF2},
+ {0xC6,0xE3}, {0xC6,0xDA}, {0xC6,0xDB}, {0xA3,0x74},
+ {0xA3,0x75}, {0xA3,0x76}, {0xA3,0x77}, {0xA3,0x78},
+ {0xA3,0x79}, {0xA3,0x7A}, {0xA3,0x7B}, {0xA3,0x7C},
+ {0xA3,0x7D}, {0xA3,0x7E}, {0xA3,0xA1}, {0xA3,0xA2},
+ {0xA3,0xA3}, {0xA3,0xA4}, {0xA3,0xA5}, {0xA3,0xA6},
+ {0xA3,0xA7}, {0xA3,0xA8}, {0xA3,0xA9}, {0xA3,0xAA},
+ {0xA3,0xAB}, {0xA3,0xAC}, {0xA3,0xAD}, {0xA3,0xAE},
+ {0xA3,0xAF}, {0xA3,0xB0}, {0xA3,0xB1}, {0xA3,0xB2},
+ {0xA3,0xB3}, {0xA3,0xB4}, {0xA3,0xB5}, {0xA3,0xB6},
+ {0xA3,0xB7}, {0xA3,0xB8}, {0xA3,0xB9}, {0xA3,0xBA},
+ {0xA4,0x40}, {0xA4,0x47}, {0xA4,0x54}, {0xA5,0x7C},
+ {0xA4,0x57}, {0xA4,0xA4}, {0xA4,0x55}, {0xA5,0xD2},
+ {0xA4,0x41}, {0xA4,0xFE}, {0xA4,0x42}, {0xA4,0xD1},
+ {0xA6,0x61}, {0xA4,0x48}, {0xA4,0x40}, {0xA4,0x47},
+ {0xA4,0x54}, {0xA5,0x7C}, {0xA4,0xAD}, {0xA4,0xBB},
+ {0xA4,0x43}, {0xA4,0x4B}, {0xA4,0x45}, {0xA4,0x51},
+ {0xA4,0xEB}, {0xA4,0xF5}, {0xA4,0xF4}, {0xA4,0xEC},
+ {0xAA,0xF7}, {0xA4,0x67}, {0xA4,0xE9}, {0xC8,0xD1},
+ {0xA6,0xB3}, {0xAA,0xC0}, {0xA6,0x57}, {0xAF,0x53},
+ {0xB0,0x5D}, {0xAF,0xAC}, {0xB3,0xD2}, {0xA5,0x4E},
+ {0xA9,0x49}, {0xBE,0xC7}, {0xBA,0xCA}, {0xA5,0xF8},
+ {0xB8,0xEA}, {0xA8,0xF3}, {0xB2,0xBD}, {0xA5,0xF0},
+ {0xA6,0xDB}, {0xA6,0xDC}, {0xA4,0x40}, {0xA4,0x47},
+ {0xA4,0x54}, {0xA5,0x7C}, {0xA4,0xAD}, {0xA4,0xBB},
+ {0xA4,0x43}, {0xA4,0x4B}, {0xA4,0x45}, {0xA4,0x51},
+ {0xA4,0xEB}, {0xA4,0xF5}, {0xA4,0xF4}, {0xA4,0xEC},
+ {0xAA,0xF7}, {0xA4,0x67}, {0xA4,0xE9}, {0xAE,0xE8},
+ {0xA6,0xB3}, {0xAA,0xC0}, {0xA6,0x57}, {0xAF,0x53},
+ {0xB0,0x5D}, {0xAF,0xAC}, {0xB3,0xD2}, {0xAF,0xB5},
+ {0xA8,0x6B}, {0xA4,0x6B}, {0xBE,0x41}, {0xC0,0x75},
+ {0xA6,0x4C}, {0xAA,0x60}, {0xB6,0xB5}, {0xA5,0xF0},
+ {0xBC,0x67}, {0xA1,0xC0}, {0xA4,0x57}, {0xA4,0xA4},
+ {0xA4,0x55}, {0xA5,0xAA}, {0xA5,0x6B}, {0xC2,0xE5},
+ {0xA9,0x76}, {0xBE,0xC7}, {0xBA,0xCA}, {0xA5,0xF8},
+ {0xB8,0xEA}, {0xA8,0xF3}, {0xA9,0x5D}, {0xA2,0x55},
+ {0xA2,0x56}, {0xA2,0x50}, {0xA2,0x51}, {0xA2,0x52},
+ {0xA2,0x54}, {0xA2,0x57}, {0xA2,0x53}, {0xA1,0xEB},
+ {0xA1,0xEA}, {0xA2,0x4F}, {0x92,0x77}, {0x96,0xDF},
+ {0x89,0xD5}, {0x93,0xCD}, {0x9B,0xDF}, {0xFA,0x68},
+ {0x89,0xDA}, {0x8F,0x59}, {0x89,0xDB}, {0x8F,0x5D},
+ {0x89,0xDC}, {0x96,0xF7}, {0x8A,0xDA}, {0x8B,0xDC},
+ {0x97,0xDB}, {0x9E,0x53}, {0x9D,0xAA}, {0x9B,0xEA},
+ {0x8A,0x6E}, {0x8B,0xC8}, {0x89,0xE8}, {0x89,0xEA},
+ {0x8C,0x4B}, {0xFB,0x70}, {0x89,0xED}, {0x94,0xDD},
+ {0x89,0xEE}, {0x9E,0xB4}, {0x8A,0xD3}, {0x92,0xDB},
+ {0x94,0xDB}, {0x89,0xF9}, {0xFB,0x7A}, {0x89,0xFB},
+ {0x9E,0xFC}, {0x89,0xFC}, {0x89,0xBF}, {0x89,0xFE},
+ {0x89,0xE6}, {0x9D,0x46}, {0x9D,0xEE}, {0xA0,0x7E},
+ {0xA0,0x68}, {0x98,0xE9}, {0x8B,0x68}, {0x8D,0xFD},
+ {0x8B,0xBE}, {0x9F,0xD9}, {0x8A,0xEB}, {0x9F,0xD7},
+ {0x8B,0x6A}, {0x9C,0x5C}, {0x8B,0xB1}, {0xFB,0x5E},
+ {0x9D,0xF3}, {0xA0,0xD0}, {0xFC,0x66}, {0x92,0xE9},
+ {0x9A,0xEC}, {0x8F,0xAB}, {0xFA,0x48}, {0x8E,0x45},
+ {0x9C,0x6F}, {0x9E,0xDE}, {0x89,0xEF}, {0x96,0xE9},
+ {0x9E,0xBB}, {0x94,0xDE}, {0x9E,0xB8}, {0x97,0xBA},
+ {0xFB,0x65}, {0x95,0xD6}, {0x9C,0xBB}, {0x97,0xDA},
+ {0x8F,0x45}, {0xFB,0x7D}, {0x91,0x58}, {0xFE,0x64},
+ {0x98,0x56}, {0x9B,0x4D}, {0x93,0x5B}, {0x95,0xC7},
+ {0x97,0xE7}, {0x93,0x59}, {0x91,0xF5}, {0x97,0xB8},
+ {0xFD,0xA2}, {0xFB,0xB6}, {0x92,0xFA}, {0x93,0x57},
+ {0x8B,0xA6}, {0xFB,0xB9}, {0x97,0xB0}, {0xFD,0xC4},
+ {0x9C,0xA1}, {0x91,0xF2}, {0x91,0xF9}, {0x8F,0xF1},
+ {0x97,0x45}, {0x98,0x53}, {0xFE,0x78}, {0xFB,0xC1},
+ {0x92,0x51}, {0x9D,0xAD}, {0xFD,0x6C}, {0xFA,0x6B},
+ {0x9B,0xC2}, {0x9A,0x7B}, {0x8B,0x60}, {0x93,0x4B},
+ {0x9A,0xBD}, {0x91,0xB7}, {0x95,0xB4}, {0xFE,0xC5},
+ {0x9E,0xF0}, {0x8D,0x64}, {0x92,0x69}, {0x8D,0x67},
+ {0xFB,0xEA}, {0xFB,0xEF}, {0x8D,0x68}, {0x93,0xEB},
+ {0xFC,0x42}, {0x91,0x66}, {0xFA,0xCD}, {0x93,0xDD},
+ {0x8B,0xCC}, {0x8D,0x6D}, {0x8D,0x6E}, {0x96,0xA8},
+ {0xFC,0xA6}, {0x8D,0x6F}, {0x8D,0x70}, {0xFC,0x64},
+ {0x90,0x60}, {0x8D,0x74}, {0x97,0xC3}, {0x8A,0xD0},
+ {0x92,0x74}, {0x9B,0xBE}, {0x9C,0xC8}, {0x9C,0xBA},
+ {0x8D,0x78}, {0x9E,0xB9}, {0x95,0x5A}, {0x91,0xB4},
+ {0x8A,0x48}, {0x8D,0x7D}, {0x8A,0x7D}, {0x8A,0xC2},
+ {0xFD,0x4A}, {0x8D,0xA1}, {0x8A,0xD1}, {0xFC,0xB4},
+ {0x8B,0x47}, {0x93,0xA4}, {0x9E,0xDA}, {0x8A,0x51},
+ {0x8D,0xA6}, {0x9E,0xC5}, {0xFC,0xC4}, {0xA0,0x78},
+ {0x94,0xB5}, {0xFC,0xC2}, {0x8A,0x6B}, {0x8D,0xAB},
+ {0xFA,0xE8}, {0x8D,0xAD}, {0xFC,0x49}, {0x93,0xC1},
+ {0x90,0x6F}, {0x8D,0xB0}, {0x94,0x7E}, {0x90,0xFA},
+ {0x94,0x79}, {0x8D,0xB2}, {0xFC,0xEE}, {0x99,0x7B},
+ {0x8D,0xB4}, {0x8D,0xB7}, {0x91,0xB3}, {0x8D,0xBB},
+ {0x8D,0xBA}, {0x8D,0xBC}, {0x90,0x44}, {0xFD,0x4C},
+ {0x93,0xE4}, {0x93,0xE0}, {0xFD,0x53}, {0x8D,0xC3},
+ {0x9B,0xB8}, {0xFB,0xF0}, {0x93,0xE9}, {0x93,0xF6},
+ {0x8D,0xC5}, {0x8D,0xCA}, {0x8D,0xCC}, {0xFD,0x5D},
+ {0x93,0xB5}, {0xFD,0x61}, {0x9C,0xF8}, {0x92,0x52},
+ {0xA0,0xE8}, {0x9C,0xA5}, {0x8C,0x56}, {0x8D,0xD6},
+ {0x97,0xC0}, {0xA0,0xDE}, {0x97,0xD2}, {0xFA,0xA5},
+ {0xFD,0xA3}, {0x8D,0xDB}, {0x8E,0xAF}, {0x91,0xB5},
+ {0xFD,0x49}, {0xFD,0xD1}, {0x8D,0xEB}, {0x97,0xC6},
+ {0xFD,0xCE}, {0x90,0xFC}, {0xFC,0x59}, {0x96,0xD6},
+ {0x97,0xC5}, {0x8D,0xEF}, {0x97,0xD7}, {0x8D,0xF0},
+ {0x96,0xA6}, {0xFB,0xBF}, {0x8D,0xF3}, {0x94,0x49},
+ {0x8D,0xF5}, {0x98,0x72}, {0x8E,0x6B}, {0xFA,0xFD},
+ {0x8F,0x50}, {0x9D,0xCC}, {0xFC,0x65}, {0x8C,0x44},
+ {0x99,0x6E}, {0x94,0xA1}, {0x8F,0x63}, {0xA0,0xDA},
+ {0x92,0x53}, {0xFD,0xE9}, {0x9D,0xB5}, {0x98,0x79},
+ {0x9D,0x5D}, {0x8D,0x63}, {0x96,0x69}, {0x9F,0x70},
+ {0xFC,0x6A}, {0x8A,0xC7}, {0x89,0xD7}, {0xFE,0x4D},
+ {0x9E,0xDD}, {0xFE,0xFB}, {0x98,0xBC}, {0xFA,0xCC},
+ {0x95,0xB0}, {0x94,0x64}, {0x93,0x6F}, {0x94,0xB9},
+ {0x95,0xEC}, {0x91,0xEE}, {0x98,0xC3}, {0x95,0xF6},
+ {0x8F,0xFD}, {0x98,0xC5}, {0x97,0x66}, {0xFE,0x6E},
+ {0x97,0xDD}, {0x8C,0xAA}, {0x92,0xD2}, {0x97,0x61},
+ {0x98,0xCB}, {0x95,0xF0}, {0x97,0x5D}, {0x91,0xE3},
+ {0x98,0xCC}, {0x94,0x69}, {0x98,0xCD}, {0x98,0xCE},
+ {0x95,0xFC}, {0x94,0xA3}, {0x96,0x62}, {0xFE,0xB6},
+ {0x94,0x63}, {0x98,0xD0}, {0x98,0xD1}, {0x94,0x75},
+ {0xFA,0xE0}, {0x94,0x72}, {0x98,0xD6}, {0x8A,0xF0},
+ {0x98,0xD9}, {0x98,0xDB}, {0x98,0xDD}, {0x98,0xA8},
+ {0x8A,0x6D}, {0x8A,0xFB}, {0x8A,0xAE}, {0xFB,0xC9},
+ {0x8C,0x5D}, {0x98,0xE4}, {0x98,0xE6}, {0x98,0xE8},
+ {0x8A,0x4D}, {0x92,0x57}, {0x95,0xDF}, {0xA0,0xAC},
+ {0x98,0xEB}, {0x98,0xEC}, {0x8C,0xC3}, {0x98,0xF4},
+ {0x8A,0xB8}, {0x9E,0xE7}, {0x94,0xBC}, {0xFC,0xD1},
+ {0x9C,0xC6}, {0x9E,0x7E}, {0x98,0xFE}, {0xFD,0xE8},
+ {0x99,0x40}, {0x94,0xC9}, {0x94,0xD3}, {0x99,0x46},
+ {0x90,0xC0}, {0x94,0xD1}, {0x95,0x73}, {0x93,0xC2},
+ {0x99,0x48}, {0x99,0x4B}, {0x8E,0x55}, {0x99,0x4E},
+ {0x8E,0xFE}, {0x8E,0x59}, {0x94,0xEC}, {0x94,0xEF},
+ {0x8C,0x60}, {0x8F,0x74}, {0x99,0x55}, {0x95,0x44},
+ {0x8C,0xCB}, {0x99,0x56}, {0x99,0x59}, {0x99,0x5B},
+ {0x8C,0xC4}, {0xFA,0x45}, {0x90,0xB7}, {0x97,0x43},
+ {0x95,0xCD}, {0x97,0xC9}, {0xFD,0x50}, {0x8E,0xB9},
+ {0x95,0xC6}, {0x99,0x67}, {0x8A,0xB9}, {0x8D,0xFC},
+ {0x8A,0x76}, {0x9D,0x51}, {0x99,0x73}, {0x9D,0x4F},
+ {0x99,0x7A}, {0x95,0x64}, {0x99,0xA1}, {0x99,0xA5},
+ {0x99,0xA7}, {0x8E,0xED}, {0x99,0xAD}, {0x94,0x6E},
+ {0x8F,0x70}, {0xFA,0xD0}, {0x99,0xB3}, {0xA0,0x53},
+ {0x96,0x5C}, {0xFD,0x7A}, {0x97,0xFE}, {0x92,0xBD},
+ {0x97,0xFD}, {0x8F,0x64}, {0xFC,0xF7}, {0x95,0x62},
+ {0x97,0xCD}, {0x9E,0x64}, {0x92,0x4C}, {0x8E,0xC9},
+ {0x99,0xBC}, {0x9D,0xA5}, {0x8F,0x54}, {0x8F,0x7C},
+ {0x8E,0xA2}, {0x8F,0x7A}, {0x97,0xAE}, {0x96,0xC8},
+ {0x99,0xC3}, {0x90,0xD6}, {0x9C,0xBE}, {0x8F,0x76},
+ {0x94,0x70}, {0xFB,0x4B}, {0xFD,0xCA}, {0x8E,0xC7},
+ {0xA0,0xF9}, {0x8F,0xA9}, {0x99,0xC7}, {0x90,0xD7},
+ {0x9E,0xDF}, {0x99,0xCE}, {0x8F,0xBA}, {0x8F,0xEB},
+ {0x99,0xCF}, {0x8F,0xC2}, {0x92,0xC9}, {0x97,0xDC},
+ {0x95,0xB3}, {0x9C,0x79}, {0x95,0xB2}, {0x8F,0xDB},
+ {0x9B,0xE3}, {0x9E,0x7A}, {0x9B,0xEE}, {0x99,0xDE},
+ {0xFA,0xFA}, {0x9E,0xE5}, {0x8A,0x52}, {0x99,0xE1},
+ {0x8A,0x67}, {0x8B,0xB5}, {0x8A,0xAC}, {0x99,0xE9},
+ {0xFB,0xCA}, {0x97,0xDE}, {0x95,0xD1}, {0x99,0xF5},
+ {0xFC,0x4A}, {0x9B,0xA9}, {0xFB,0xDC}, {0xFE,0x56},
+ {0x9E,0xA4}, {0x9D,0x49}, {0x95,0xDB}, {0x89,0xC5},
+ {0x99,0xF8}, {0x96,0x64}, {0x90,0x55}, {0x96,0xD4},
+ {0x97,0x7C}, {0x96,0x4D}, {0x97,0xE1}, {0x9A,0x48},
+ {0x9A,0x49}, {0xFE,0x7D}, {0x90,0xAA}, {0x9A,0x50},
+ {0x93,0x47}, {0x8E,0xD8}, {0x90,0xC9}, {0x9A,0x55},
+ {0x90,0xBC}, {0x9A,0x58}, {0x8B,0xB8}, {0x90,0xD5},
+ {0x96,0x41}, {0x9A,0x5A}, {0x9A,0x5C}, {0x97,0xC2},
+ {0x8A,0xBB}, {0x9B,0xAA}, {0x90,0xF5}, {0x9A,0x60},
+ {0x91,0x45}, {0x8C,0x58}, {0x9A,0x63}, {0x8C,0x49},
+ {0x8B,0xB6}, {0xFC,0xCF}, {0x96,0x6B}, {0x9A,0x6E},
+ {0x91,0x4F}, {0x97,0x46}, {0xA0,0xE6}, {0x92,0xD7},
+ {0x96,0x75}, {0x93,0xD4}, {0x91,0xBB}, {0x96,0x79},
+ {0x9A,0x70}, {0x96,0x78}, {0x91,0xCD}, {0x9C,0x4A},
+ {0xA0,0x6F}, {0xA0,0x6A}, {0x91,0x5F}, {0x9F,0xA5},
+ {0x89,0xBA}, {0x9E,0xCD}, {0x9A,0x79}, {0x9D,0xCE},
+ {0x8C,0xD2}, {0x9D,0x73}, {0x96,0xB9}, {0x96,0xBC},
+ {0x9C,0xD1}, {0x89,0xB7}, {0x9E,0xEE}, {0xFB,0x43},
+ {0x9E,0xC9}, {0xFB,0xD3}, {0x91,0xAE}, {0x9D,0x78},
+ {0x9D,0x7B}, {0xA4,0x40}, {0xA4,0x42}, {0xA4,0x43},
+ {0x9E,0xB3}, {0xC9,0x45}, {0xA4,0x56}, {0xA4,0x54},
+ {0xA4,0x57}, {0xA4,0x55}, {0xC9,0x46}, {0xA4,0xA3},
+ {0xC9,0x4F}, {0xC9,0x4D}, {0xA4,0xA2}, {0xA4,0xA1},
+ {0xA5,0x42}, {0xA5,0x41}, {0xA5,0x40}, {0xA5,0x43},
+ {0xA4,0xFE}, {0x9E,0xB2}, {0x9D,0xD6}, {0xA5,0xE0},
+ {0xA5,0xE1}, {0x99,0x4F}, {0x89,0xCE}, {0xA8,0xC3},
+ {0x8B,0xC0}, {0x9F,0xC4}, {0xA4,0x58}, {0x8B,0xD4},
+ {0xA4,0xA4}, {0xC9,0x50}, {0x8C,0x72}, {0xA4,0xA5},
+ {0xC9,0x63}, {0xA6,0xEA}, {0xCB,0xB1}, {0xC6,0xBF},
+ {0x8B,0xF9}, {0xA4,0x59}, {0xA4,0xA6}, {0xA5,0x44},
+ {0xC9,0x64}, {0x89,0x46}, {0xC6,0xC0}, {0xC9,0x40},
+ {0xA4,0x44}, {0xA4,0x5B}, {0xC9,0x47}, {0xA4,0x5C},
+ {0xFA,0xE5}, {0xA4,0xA7}, {0xA5,0x45}, {0xA5,0x47},
+ {0xA5,0x46}, {0xA5,0xE2}, {0xA5,0xE3}, {0xA8,0xC4},
+ {0xAD,0xBC}, {0xA4,0x41}, {0xC8,0x7B}, {0x8B,0xC6},
+ {0xC9,0x41}, {0xA4,0x45}, {0xA4,0x5E}, {0xA4,0x5D},
+ {0xA5,0xE4}, {0x9C,0x57}, {0xA8,0xC5}, {0x9A,0xFB},
+ {0xB0,0xAE}, {0xD4,0x4B}, {0x89,0xD0}, {0x89,0xCF},
+ {0xB6,0xC3}, {0xDC,0xB1}, {0xDC,0xB2}, {0xC6,0xC1},
+ {0xA4,0x46}, {0x89,0xD1}, {0xA4,0xA9}, {0x89,0xE2},
+ {0xA8,0xC6}, {0xA4,0x47}, {0xC9,0x48}, {0xA4,0x5F},
+ {0xA4,0xAA}, {0xA4,0xAC}, {0xC9,0x51}, {0xA4,0xAD},
+ {0xA4,0xAB}, {0x92,0x7E}, {0xA5,0xE5}, {0x9D,0xBA},
+ {0xA8,0xC7}, {0xA8,0xC8}, {0xAB,0x45}, {0xC6,0xC2},
+ {0xA4,0x60}, {0xA4,0xAE}, {0x8C,0x6F}, {0xA5,0xE6},
+ {0xA5,0xE8}, {0xA5,0xE7}, {0xA6,0xEB}, {0xA8,0xC9},
+ {0xA8,0xCA}, {0xAB,0x46}, {0xAB,0x47}, {0xAD,0xBD},
+ {0xDC,0xB3}, {0xFB,0xF8}, {0xF6,0xD6}, {0xA4,0x48},
+ {0x8B,0xC7}, {0x92,0x6B}, {0x89,0xD2}, {0xA4,0xB0},
+ {0xA4,0xAF}, {0xC9,0x52}, {0xA4,0xB1}, {0xA4,0xB7},
+ {0xA4,0xB2}, {0xA4,0xB3}, {0xC9,0x54}, {0xC9,0x53},
+ {0xA4,0xB5}, {0xA4,0xB6}, {0xA4,0xB4}, {0x9F,0xCF},
+ {0xA5,0x4A}, {0xA5,0x4B}, {0xA5,0x4C}, {0xA5,0x4D},
+ {0xA5,0x49}, {0xA5,0x50}, {0xC9,0x6A}, {0xC9,0x66},
+ {0xC9,0x69}, {0xA5,0x51}, {0xA5,0x61}, {0xC9,0x68},
+ {0xA5,0x4E}, {0xA5,0x4F}, {0xA5,0x48}, {0xC9,0x65},
+ {0xC9,0x67}, {0x9D,0xA9}, {0x89,0xD3}, {0x99,0xE2},
+ {0xA5,0xF5}, {0xC9,0xB0}, {0xA5,0xF2}, {0xA5,0xF6},
+ {0xC9,0xBA}, {0xC9,0xAE}, {0xA5,0xF3}, {0xC9,0xB2},
+ {0x92,0x67}, {0xA5,0xF4}, {0xA5,0xF7}, {0xA5,0xE9},
+ {0xC9,0xB1}, {0xA5,0xF8}, {0xC9,0xB5}, {0x92,0xA4},
+ {0xC9,0xB9}, {0xC9,0xB6}, {0xC9,0xB3}, {0xA5,0xEA},
+ {0xA5,0xEC}, {0xA5,0xF9}, {0xA5,0xEE}, {0xC9,0xAB},
+ {0xA5,0xF1}, {0xA5,0xEF}, {0xA5,0xF0}, {0xC9,0xBB},
+ {0xC9,0xB8}, {0xC9,0xAF}, {0xA5,0xED}, {0x8C,0x73},
+ {0xC9,0xAC}, {0xA5,0xEB}, {0x89,0x4E}, {0xC9,0xB4},
+ {0xC9,0xB7}, {0x89,0x4F}, {0x92,0x78}, {0xC9,0xAD},
+ {0xCA,0x66}, {0xA7,0x42}, {0xA6,0xF4}, {0x91,0xB6},
+ {0xCA,0x67}, {0xA6,0xF1}, {0xA7,0x44}, {0x89,0xD4},
+ {0xA6,0xF9}, {0x9F,0xD2}, {0xA6,0xF8}, {0xCA,0x5B},
+ {0xA6,0xFC}, {0xA6,0xF7}, {0xCA,0x60}, {0xCA,0x68},
+ {0xCA,0x64}, {0x92,0xA7}, {0xA6,0xFA}, {0x95,0xA2},
+ {0xA6,0xFD}, {0xA6,0xEE}, {0xA7,0x47}, {0xCA,0x5D},
+ {0x92,0x6E}, {0xCB,0xBD}, {0xA6,0xEC}, {0xA7,0x43},
+ {0xA6,0xED}, {0xA6,0xF5}, {0xA6,0xF6}, {0xCA,0x62},
+ {0xCA,0x5E}, {0xA6,0xFB}, {0xA6,0xF3}, {0xCA,0x5A},
+ {0xA6,0xEF}, {0xCA,0x65}, {0xA7,0x45}, {0xA7,0x48},
+ {0xA6,0xF2}, {0xA7,0x40}, {0xA7,0x46}, {0xA6,0xF0},
+ {0xCA,0x63}, {0xA7,0x41}, {0xCA,0x69}, {0xCA,0x5C},
+ {0xA6,0xFE}, {0xCA,0x5F}, {0xCA,0x61}, {0xA8,0xD8},
+ {0xCB,0xBF}, {0xCB,0xCB}, {0xA8,0xD0}, {0xCB,0xCC},
+ {0xA8,0xCB}, {0xA8,0xD5}, {0x96,0xEA}, {0xA8,0xCE},
+ {0xCB,0xB9}, {0xA8,0xD6}, {0xCB,0xB8}, {0xCB,0xBC},
+ {0xCB,0xC3}, {0xCB,0xC1}, {0xA8,0xDE}, {0xA8,0xD9},
+ {0xCB,0xB3}, {0xCB,0xB5}, {0xA8,0xDB}, {0xA8,0xCF},
+ {0xCB,0xB6}, {0xCB,0xC2}, {0xCB,0xC9}, {0xA8,0xD4},
+ {0xCB,0xBB}, {0xCB,0xB4}, {0xA8,0xD3}, {0xCB,0xB7},
+ {0xA8,0xD7}, {0xCB,0xBA}, {0x92,0x6F}, {0xA8,0xD2},
+ {0xA8,0xCD}, {0xA8,0xDC}, {0xCB,0xC4}, {0xA8,0xDD},
+ {0xCB,0xC8}, {0xCB,0xC6}, {0xCB,0xCA}, {0xA8,0xDA},
+ {0xCB,0xBE}, {0xCB,0xB2}, {0xCB,0xC0}, {0xA8,0xD1},
+ {0xCB,0xC5}, {0xA8,0xCC}, {0xCB,0xC7}, {0x92,0xA3},
+ {0x89,0x50}, {0xFA,0x57}, {0xAB,0x56}, {0xAB,0x4A},
+ {0x98,0x66}, {0xCD,0xE0}, {0xCD,0xE8}, {0xAB,0x49},
+ {0xAB,0x51}, {0xAB,0x5D}, {0xCD,0xEE}, {0xCD,0xEC},
+ {0xCD,0xE7}, {0x89,0xD6}, {0xAB,0x4B}, {0xCD,0xED},
+ {0xCD,0xE3}, {0xAB,0x59}, {0xAB,0x50}, {0xAB,0x58},
+ {0xCD,0xDE}, {0xCD,0xEA}, {0x98,0xB2}, {0xCD,0xE1},
+ {0xAB,0x54}, {0xCD,0xE2}, {0x92,0xAB}, {0xCD,0xDD},
+ {0xAB,0x5B}, {0xAB,0x4E}, {0xAB,0x57}, {0xAB,0x4D},
+ {0xCD,0xDF}, {0xCD,0xE4}, {0xCD,0xEB}, {0xAB,0x55},
+ {0xAB,0x52}, {0xCD,0xE6}, {0xAB,0x5A}, {0xCD,0xE9},
+ {0xCD,0xE5}, {0xAB,0x4F}, {0xAB,0x5C}, {0xAB,0x53},
+ {0xAB,0x4C}, {0xAB,0x48}, {0x96,0xDE}, {0x92,0xAC},
+ {0xCD,0xEF}, {0xAD,0xD7}, {0xAD,0xC1}, {0x8C,0x70},
+ {0xAD,0xD1}, {0x9F,0x6E}, {0xAD,0xD6}, {0xD0,0xD0},
+ {0xD0,0xCF}, {0xD0,0xD4}, {0xD0,0xD5}, {0xAD,0xC4},
+ {0x8E,0xF2}, {0xAD,0xCD}, {0x9F,0x6C}, {0xAD,0xDA},
+ {0xAD,0xCE}, {0x89,0xD8}, {0xD0,0xC9}, {0xAD,0xC7},
+ {0xD0,0xCA}, {0xFA,0x59}, {0xAD,0xDC}, {0xAD,0xD3},
+ {0xAD,0xBE}, {0xAD,0xBF}, {0xD0,0xDD}, {0xB0,0xBF},
+ {0xAD,0xCC}, {0xAD,0xCB}, {0xD0,0xCB}, {0xAD,0xCF},
+ {0xD4,0x5B}, {0xAD,0xC6}, {0xD0,0xD6}, {0xAD,0xD5},
+ {0xAD,0xD4}, {0xAD,0xCA}, {0xD0,0xCE}, {0xD0,0xD7},
+ {0xD0,0xC8}, {0xAD,0xC9}, {0xD0,0xD8}, {0xAD,0xD2},
+ {0xD0,0xCC}, {0xAD,0xC0}, {0xAD,0xC3}, {0xAD,0xC2},
+ {0xD0,0xD9}, {0xAD,0xD0}, {0xAD,0xC5}, {0xAD,0xD9},
+ {0xAD,0xDB}, {0xD0,0xD3}, {0xAD,0xD8}, {0x92,0xA8},
+ {0xD0,0xDB}, {0xD0,0xCD}, {0xD0,0xDC}, {0xD0,0xD1},
+ {0x91,0x63}, {0xD0,0xDA}, {0xD0,0xD2}, {0x8C,0x40},
+ {0xAD,0xC8}, {0xD4,0x63}, {0xD4,0x57}, {0xB0,0xB3},
+ {0xD4,0x5C}, {0xD4,0x62}, {0xB0,0xB2}, {0xD4,0x55},
+ {0xB0,0xB6}, {0xD4,0x59}, {0xD4,0x52}, {0xB0,0xB4},
+ {0xD4,0x56}, {0xB0,0xB9}, {0xB0,0xBE}, {0xD4,0x67},
+ {0xD4,0x51}, {0xB0,0xBA}, {0x9F,0x73}, {0xD4,0x66},
+ {0x92,0xAD}, {0xB0,0xB5}, {0xD4,0x58}, {0xB0,0xB1},
+ {0xD4,0x53}, {0xD4,0x4F}, {0xD4,0x5D}, {0xD4,0x50},
+ {0xD4,0x4E}, {0xD4,0x5A}, {0xD4,0x60}, {0xD4,0x61},
+ {0xB0,0xB7}, {0x9B,0xE9}, {0xD8,0x5B}, {0xD4,0x5E},
+ {0xD4,0x4D}, {0xD4,0x5F}, {0x92,0xA9}, {0xB0,0xC1},
+ {0xD4,0x64}, {0xB0,0xC0}, {0xD4,0x4C}, {0xD4,0x54},
+ {0xD4,0x65}, {0xB0,0xBC}, {0xB0,0xBB}, {0xB0,0xB8},
+ {0xB0,0xBD}, {0xB0,0xAF}, {0xB0,0xB0}, {0xB3,0xC8},
+ {0x92,0xAA}, {0xD8,0x5E}, {0xD8,0x57}, {0xB3,0xC5},
+ {0xD8,0x5F}, {0x89,0xD9}, {0xD8,0x55}, {0xD8,0x58},
+ {0xB3,0xC4}, {0xD8,0x59}, {0xFD,0x56}, {0xB3,0xC7},
+ {0xD8,0x5D}, {0xD8,0x53}, {0xD8,0x52}, {0xB3,0xC9},
+ {0xB3,0xCA}, {0xB3,0xC6}, {0xB3,0xCB}, {0xD8,0x51},
+ {0xD8,0x5C}, {0xD8,0x5A}, {0xD8,0x54}, {0xB3,0xC3},
+ {0xD8,0x56}, {0x9F,0xA8}, {0xB6,0xCA}, {0xB6,0xC4},
+ {0xDC,0xB7}, {0xB6,0xCD}, {0xDC,0xBD}, {0xDC,0xC0},
+ {0xB6,0xC6}, {0xB6,0xC7}, {0xDC,0xBA}, {0xB6,0xC5},
+ {0xDC,0xC3}, {0xB6,0xCB}, {0xDC,0xC4}, {0xDC,0xBF},
+ {0xB6,0xCC}, {0x8C,0x71}, {0xDC,0xB4}, {0xB6,0xC9},
+ {0xDC,0xB5}, {0xDC,0xBE}, {0xDC,0xBC}, {0xDC,0xB8},
+ {0xB6,0xC8}, {0xDC,0xB6}, {0xB6,0xCE}, {0xDC,0xBB},
+ {0xDC,0xC2}, {0xDC,0xB9}, {0xDC,0xC1}, {0x92,0xA1},
+ {0xB9,0xB6}, {0xB9,0xB3}, {0x90,0xE3}, {0xB9,0xB4},
+ {0xE0,0xF9}, {0xE0,0xF1}, {0xB9,0xB2}, {0xB9,0xAF},
+ {0xE0,0xF2}, {0xA0,0xA6}, {0xB9,0xB1}, {0xE0,0xF5},
+ {0xE0,0xF7}, {0x94,0xAB}, {0xE0,0xFE}, {0xFC,0x72},
+ {0xE0,0xFD}, {0xE0,0xF8}, {0xB9,0xAE}, {0xE0,0xF0},
+ {0xB9,0xAC}, {0xE0,0xF3}, {0xB9,0xB7}, {0xE0,0xF6},
+ {0xE0,0xFA}, {0xB9,0xB0}, {0xB9,0xAD}, {0xE0,0xFC},
+ {0xE0,0xFB}, {0xB9,0xB5}, {0xE0,0xF4}, {0x97,0xC4},
+ {0xBB,0xF8}, {0xE4,0xEC}, {0xE4,0xE9}, {0xBB,0xF9},
+ {0xBB,0xF7}, {0x92,0xAE}, {0xE4,0xF0}, {0xE4,0xED},
+ {0xE4,0xE6}, {0xBB,0xF6}, {0xFA,0x67}, {0xBB,0xFA},
+ {0xE4,0xE7}, {0xBB,0xF5}, {0xBB,0xFD}, {0xE4,0xEA},
+ {0xE4,0xEB}, {0xBB,0xFB}, {0xBB,0xFC}, {0xE4,0xF1},
+ {0xE4,0xEE}, {0xE4,0xEF}, {0x92,0xA2}, {0xFA,0x69},
+ {0xBE,0xAA}, {0xE8,0xF8}, {0xBE,0xA7}, {0xE8,0xF5},
+ {0xBE,0xA9}, {0xBE,0xAB}, {0xE8,0xF6}, {0xBE,0xA8},
+ {0xE8,0xF7}, {0xE8,0xF4}, {0xC0,0x76}, {0xEC,0xBD},
+ {0xC0,0x77}, {0xEC,0xBB}, {0xEC,0xBC}, {0xEC,0xBA},
+ {0xEC,0xB9}, {0xEC,0xBE}, {0xC0,0x75}, {0x92,0x68},
+ {0xEF,0xB8}, {0xEF,0xB9}, {0xE4,0xE8}, {0xEF,0xB7},
+ {0xC0,0x78}, {0xC3,0x5F}, {0xF1,0xEB}, {0xF1,0xEC},
+ {0xC4,0xD7}, {0xC4,0xD8}, {0xF5,0xC1}, {0xF5,0xC0},
+ {0xC5,0x6C}, {0xC5,0x6B}, {0xF7,0xD0}, {0xA4,0x49},
+ {0xA4,0x61}, {0xA4,0xB9}, {0xA4,0xB8}, {0xA5,0x53},
+ {0xA5,0x52}, {0xA5,0xFC}, {0xA5,0xFB}, {0xA5,0xFD},
+ {0xA5,0xFA}, {0xA7,0x4A}, {0xA7,0x49}, {0xA7,0x4B},
+ {0xA8,0xE0}, {0xA8,0xDF}, {0xA8,0xE1}, {0x89,0x51},
+ {0xAB,0x5E}, {0xA2,0x59}, {0xD0,0xDE}, {0xA2,0x5A},
+ {0xB0,0xC2}, {0xA2,0x5C}, {0xA2,0x5B}, {0xD8,0x60},
+ {0xFA,0x6F}, {0xA2,0x5D}, {0xB9,0xB8}, {0xA2,0x5E},
+ {0xA4,0x4A}, {0xA4,0xBA}, {0xA5,0xFE}, {0xA8,0xE2},
+ {0xFA,0x71}, {0xA4,0x4B}, {0xA4,0xBD}, {0xA4,0xBB},
+ {0xA4,0xBC}, {0xA6,0x40}, {0x89,0x52}, {0xA7,0x4C},
+ {0xA8,0xE4}, {0xA8,0xE3}, {0xA8,0xE5}, {0x94,0x5A},
+ {0xAD,0xDD}, {0xBE,0xAC}, {0xC6,0xC3}, {0x89,0xDD},
+ {0xC9,0x4E}, {0xC8,0xA2}, {0xA5,0x54}, {0xA5,0x55},
+ {0xA6,0x41}, {0xCA,0x6A}, {0xAB,0x60}, {0xAB,0x5F},
+ {0xD0,0xE0}, {0xD0,0xDF}, {0xB0,0xC3}, {0xC6,0xC4},
+ {0xA4,0xBE}, {0xC9,0x55}, {0x9E,0x52}, {0x89,0x53},
+ {0xCB,0xCD}, {0xAB,0x61}, {0xAD,0xE0}, {0xAD,0xDE},
+ {0xAD,0xDF}, {0x9E,0x55}, {0x92,0xBA}, {0xBE,0xAD},
+ {0xC6,0xC5}, {0xA5,0x56}, {0x8C,0x5B}, {0xA6,0x42},
+ {0xC9,0xBC}, {0xFA,0x7D}, {0xFA,0xA8}, {0x9A,0x68},
+ {0xFA,0x47}, {0xA7,0x4D}, {0xA7,0x4E}, {0xFA,0x7E},
+ {0xCA,0x6B}, {0xCB,0xCE}, {0xA8,0xE6}, {0xCB,0xCF},
+ {0x92,0xBB}, {0xD0,0xE2}, {0xD0,0xE3}, {0xAD,0xE3},
+ {0xFD,0xB6}, {0xD0,0xE4}, {0xFA,0xA2}, {0xD0,0xE1},
+ {0xAD,0xE4}, {0xAD,0xE2}, {0xAD,0xE1}, {0xD0,0xE5},
+ {0xFA,0xA3}, {0xD4,0x68}, {0xFA,0xA4}, {0x9B,0xB4},
+ {0xFA,0xA6}, {0xD8,0x61}, {0xDC,0xC5}, {0xE1,0x40},
+ {0x89,0xDF}, {0xBB,0xFE}, {0xBE,0xAE}, {0xE8,0xF9},
+ {0xFD,0xDB}, {0xA4,0x4C}, {0xA4,0x5A}, {0xFA,0xA9},
+ {0x89,0x54}, {0xFA,0xAB}, {0xB0,0xC4}, {0xB3,0xCD},
+ {0xB9,0xB9}, {0xFC,0x7A}, {0xC9,0x42}, {0xA4,0xBF},
+ {0xA5,0x59}, {0xA5,0x57}, {0xA5,0x58}, {0x89,0xE0},
+ {0xA8,0xE7}, {0x9F,0x4F}, {0xA4,0x4D}, {0xA4,0x4E},
+ {0xC8,0x7D}, {0xA4,0x62}, {0x89,0xE1}, {0xA4,0xC0},
+ {0xA4,0xC1}, {0xA4,0xC2}, {0xC9,0xBE}, {0xA5,0x5A},
+ {0xFA,0xB0}, {0xC9,0x6B}, {0xA6,0x46}, {0xC9,0xBF},
+ {0xA6,0x44}, {0xA6,0x45}, {0xC9,0xBD}, {0xA6,0x47},
+ {0xA6,0x43}, {0xCA,0x6C}, {0xAA,0xEC}, {0xCA,0x6D},
+ {0x9F,0xCD}, {0xA0,0xE7}, {0xCA,0x6E}, {0xA7,0x50},
+ {0xA7,0x4F}, {0xFA,0xB1}, {0x89,0xA6}, {0xA7,0x53},
+ {0xA7,0x51}, {0xA7,0x52}, {0xA8,0xED}, {0xA8,0xEC},
+ {0xCB,0xD4}, {0xCB,0xD1}, {0xCB,0xD2}, {0x9E,0xFA},
+ {0xCB,0xD0}, {0xA8,0xEE}, {0xA8,0xEA}, {0xA8,0xE9},
+ {0xA8,0xEB}, {0xA8,0xE8}, {0xFA,0xB2}, {0xA8,0xEF},
+ {0xAB,0x63}, {0xCD,0xF0}, {0xCB,0xD3}, {0xAB,0x68},
+ {0xCD,0xF1}, {0xAB,0x64}, {0xAB,0x67}, {0xAB,0x66},
+ {0xAB,0x65}, {0xAB,0x62}, {0xD0,0xE8}, {0xAD,0xE7},
+ {0xD0,0xEB}, {0xAD,0xE5}, {0xFA,0xB4}, {0x92,0xC4},
+ {0xD0,0xE7}, {0xAD,0xE8}, {0xAD,0xE6}, {0xAD,0xE9},
+ {0xD0,0xE9}, {0xD0,0xEA}, {0x9F,0x6F}, {0xD0,0xE6},
+ {0xD0,0xEC}, {0x8B,0xB0}, {0xB3,0xD1}, {0xB0,0xC5},
+ {0xD4,0x69}, {0xD4,0x6B}, {0xD4,0x6A}, {0xD4,0x6C},
+ {0xB0,0xC6}, {0xB3,0xCE}, {0x9F,0xAC}, {0xB3,0xCF},
+ {0xB3,0xD0}, {0xB6,0xD0}, {0xDC,0xC7}, {0x89,0xE3},
+ {0xDC,0xC6}, {0xDC,0xC8}, {0xDC,0xC9}, {0xB6,0xD1},
+ {0xB6,0xCF}, {0xE1,0x41}, {0xE1,0x42}, {0xB9,0xBB},
+ {0xB9,0xBA}, {0xE3,0x5A}, {0xBC,0x40}, {0xBC,0x41},
+ {0xBC,0x42}, {0xBC,0x44}, {0xE4,0xF2}, {0xE4,0xF3},
+ {0xBC,0x43}, {0x9B,0xD3}, {0x89,0xE4}, {0xBE,0xAF},
+ {0xBE,0xB0}, {0xFA,0xB5}, {0xF1,0xED}, {0xF5,0xC3},
+ {0xF5,0xC2}, {0xF7,0xD1}, {0x9F,0xD5}, {0xA4,0x4F},
+ {0xA5,0x5C}, {0xA5,0x5B}, {0x89,0x55}, {0xA6,0x48},
+ {0x92,0xC5}, {0xC9,0xC0}, {0x89,0x56}, {0xA7,0x55},
+ {0xA7,0x56}, {0xA7,0x54}, {0xA7,0x57}, {0xCA,0x6F},
+ {0xCA,0x70}, {0xFA,0xB3}, {0xFA,0xB6}, {0xA8,0xF1},
+ {0xCB,0xD5}, {0xA8,0xF0}, {0xCD,0xF2}, {0xAB,0x6C},
+ {0xCD,0xF3}, {0xAB,0x6B}, {0xFA,0xB7}, {0xAB,0x69},
+ {0xAB,0x6A}, {0x9E,0xDC}, {0xD0,0xED}, {0xFB,0xC4},
+ {0x9F,0x71}, {0xB0,0xC7}, {0xD4,0x6E}, {0xB0,0xCA},
+ {0xD4,0x6D}, {0xB1,0xE5}, {0xB0,0xC9}, {0xB0,0xC8},
+ {0xB3,0xD4}, {0xB3,0xD3}, {0xB3,0xD2}, {0xB6,0xD2},
+ {0xFA,0xBA}, {0x92,0xC7}, {0xB6,0xD5}, {0xB6,0xD6},
+ {0xB6,0xD4}, {0xB6,0xD3}, {0xE1,0x43}, {0xE1,0x44},
+ {0xE4,0xF5}, {0xBC,0x45}, {0xE4,0xF4}, {0xBE,0xB1},
+ {0xEC,0xBF}, {0xC0,0x79}, {0xF1,0xEE}, {0xC4,0x55},
+ {0xC6,0xC6}, {0xA4,0x63}, {0xA4,0xC3}, {0xC9,0x56},
+ {0xA4,0xC4}, {0xA4,0xC5}, {0x9A,0x4C}, {0xA5,0x5D},
+ {0xA5,0x5E}, {0xA6,0x49}, {0xCA,0x71}, {0xCB,0xD6},
+ {0xCB,0xD7}, {0xAB,0x6D}, {0xD0,0xEE}, {0xB0,0xCC},
+ {0xB0,0xCB}, {0xD8,0x63}, {0xD8,0x62}, {0xA4,0x50},
+ {0xA4,0xC6}, {0xA5,0x5F}, {0xB0,0xCD}, {0xC9,0x43},
+ {0xC9,0x6C}, {0xA5,0x60}, {0xC9,0xC2}, {0xA6,0x4B},
+ {0xA6,0x4A}, {0xC9,0xC1}, {0xA7,0x58}, {0x8C,0x68},
+ {0x89,0xE5}, {0xAD,0xEA}, {0x9F,0x7D}, {0xD4,0x6F},
+ {0xB6,0xD7}, {0xE1,0x45}, {0xB9,0xBC}, {0xA0,0xA9},
+ {0xFA,0xC4}, {0xE8,0xFA}, {0xF3,0xFD}, {0xC6,0xC7},
+ {0xA4,0xC7}, {0x89,0x57}, {0xCB,0xD8}, {0xCD,0xF4},
+ {0xB0,0xD0}, {0xB0,0xCE}, {0xB0,0xCF}, {0xA4,0x51},
+ {0xFA,0xAA}, {0xA4,0x64}, {0xA2,0xCD}, {0xA4,0xCA},
+ {0xA4,0xC9}, {0xA4,0xC8}, {0xA5,0x63}, {0xA5,0x62},
+ {0xC9,0x6D}, {0xC9,0xC3}, {0x89,0x58}, {0xA8,0xF5},
+ {0xA8,0xF2}, {0xA8,0xF4}, {0xA8,0xF3}, {0xAB,0x6E},
+ {0xB3,0xD5}, {0xA4,0x52}, {0x8B,0xE3}, {0xA4,0xCB},
+ {0x8B,0x61}, {0xA5,0x65}, {0xA5,0x64}, {0xCA,0x72},
+ {0x9A,0xF1}, {0xA8,0xF6}, {0x9E,0xB7}, {0xC6,0xC8},
+ {0xC9,0x57}, {0xFA,0xD1}, {0xA5,0x67}, {0xA5,0x66},
+ {0xA6,0x4C}, {0xA6,0x4D}, {0xCA,0x73}, {0xA7,0x59},
+ {0xFA,0xD2}, {0xA7,0x5A}, {0xA8,0xF7}, {0xA8,0xF8},
+ {0xA8,0xF9}, {0xAB,0x6F}, {0xCD,0xF5}, {0x9E,0xBA},
+ {0xFA,0xD4}, {0xAD,0xEB}, {0xC9,0x44}, {0xA4,0xCC},
+ {0xC9,0xC4}, {0xCA,0x74}, {0xCA,0x75}, {0xCB,0xD9},
+ {0xFA,0xD9}, {0xCB,0xDA}, {0xCD,0xF7}, {0xCD,0xF6},
+ {0xCD,0xF9}, {0xCD,0xF8}, {0xAB,0x70}, {0xD4,0x70},
+ {0xAD,0xED}, {0xD0,0xEF}, {0xAD,0xEC}, {0xFA,0xDB},
+ {0x9C,0xE0}, {0xD8,0x64}, {0xB3,0xD6}, {0xFB,0xF7},
+ {0xD8,0x65}, {0xFB,0xFA}, {0x89,0xE7}, {0xA0,0x7A},
+ {0xFA,0xDC}, {0xE1,0x46}, {0xB9,0xBD}, {0xFA,0xDD},
+ {0x89,0xE9}, {0xBC,0x46}, {0xF1,0xEF}, {0xC6,0xC9},
+ {0xC9,0x58}, {0xA5,0x68}, {0xFA,0xE2}, {0x89,0xEB},
+ {0xB0,0xD1}, {0xFA,0xE3}, {0xA4,0x53}, {0xA4,0x65},
+ {0xA4,0xCE}, {0xA4,0xCD}, {0x90,0xC8}, {0xA4,0xCF},
+ {0x92,0xDA}, {0x89,0x59}, {0x9C,0xF5}, {0xA8,0xFB},
+ {0xA8,0xFA}, {0xA8,0xFC}, {0x89,0x5A}, {0xFA,0xE7},
+ {0x9F,0xA2}, {0xAB,0x71}, {0xAD,0xEE}, {0xFA,0xEA},
+ {0xE8,0xFB}, {0xC2,0x4F}, {0xA4,0x66}, {0xA5,0x6A},
+ {0xA5,0x79}, {0xA5,0x74}, {0xA5,0x6F}, {0xA5,0x6E},
+ {0xA5,0x75}, {0xA5,0x73}, {0xA5,0x6C}, {0xA5,0x7A},
+ {0xA5,0x6D}, {0xA5,0x69}, {0xA5,0x78}, {0xA5,0x77},
+ {0xA5,0x76}, {0xA5,0x6B}, {0xA5,0x72}, {0xFA,0xED},
+ {0x8F,0xAD}, {0xA5,0x71}, {0xA5,0x7B}, {0xA5,0x70},
+ {0xFB,0x59}, {0xA6,0x53}, {0xA6,0x59}, {0xA6,0x55},
+ {0xA6,0x5B}, {0xC9,0xC5}, {0xA6,0x58}, {0xA6,0x4E},
+ {0xA6,0x51}, {0xA6,0x54}, {0xA6,0x50}, {0xA6,0x57},
+ {0xA6,0x5A}, {0xA6,0x4F}, {0xA6,0x52}, {0xA6,0x56},
+ {0xA6,0x5C}, {0xFA,0xEF}, {0x96,0xEF}, {0x9D,0xEC},
+ {0xCA,0x7E}, {0xCA,0x7B}, {0x9D,0xCA}, {0xA7,0x67},
+ {0xCA,0x7C}, {0xA7,0x5B}, {0xA7,0x5D}, {0xA7,0x75},
+ {0xA7,0x70}, {0xFD,0x6D}, {0x89,0xEC}, {0xCA,0xA5},
+ {0xCA,0x7D}, {0xA7,0x5F}, {0xA7,0x61}, {0xCA,0xA4},
+ {0xA7,0x68}, {0xCA,0x78}, {0xA7,0x74}, {0xA7,0x76},
+ {0xA7,0x5C}, {0xA7,0x6D}, {0xFB,0x44}, {0xCA,0x76},
+ {0xA7,0x73}, {0x9D,0xE2}, {0xA7,0x64}, {0x8C,0x75},
+ {0xA7,0x6E}, {0xA7,0x6F}, {0xCA,0x77}, {0xA7,0x6C},
+ {0xA7,0x6A}, {0xA7,0x6B}, {0xA7,0x71}, {0xCA,0xA1},
+ {0xA7,0x5E}, {0xA7,0x72}, {0xCA,0xA3}, {0xA7,0x66},
+ {0xA7,0x63}, {0xCA,0x7A}, {0xA7,0x62}, {0xCA,0xA6},
+ {0xA7,0x65}, {0xA7,0x69}, {0x9E,0xC0}, {0x9E,0x56},
+ {0xA7,0x60}, {0xCA,0xA2}, {0xCA,0x79}, {0xCB,0xEB},
+ {0xCB,0xEA}, {0xA9,0x4F}, {0xCB,0xED}, {0xCB,0xEF},
+ {0xCB,0xE4}, {0xCB,0xE7}, {0xCB,0xEE}, {0xA9,0x50},
+ {0x9F,0x79}, {0x9A,0xC7}, {0xCB,0xE1}, {0xCB,0xE5},
+ {0xFA,0xF4}, {0xCB,0xE9}, {0xCE,0x49}, {0xA9,0x4B},
+ {0xCE,0x4D}, {0xA8,0xFD}, {0xCB,0xE6}, {0xA8,0xFE},
+ {0xA9,0x4C}, {0xA9,0x45}, {0xA9,0x41}, {0xCB,0xE2},
+ {0xA9,0x44}, {0xA9,0x49}, {0xA9,0x52}, {0xCB,0xE3},
+ {0xCB,0xDC}, {0xA9,0x43}, {0xCB,0xDD}, {0xCB,0xDF},
+ {0xA9,0x46}, {0x98,0xA1}, {0xA9,0x48}, {0xCB,0xDB},
+ {0xCB,0xE0}, {0xA9,0x51}, {0xA9,0x4D}, {0xCB,0xE8},
+ {0xA9,0x53}, {0xFA,0xF8}, {0xA9,0x4A}, {0xCB,0xDE},
+ {0xA9,0x47}, {0x89,0xF0}, {0x9E,0x47}, {0xA9,0x42},
+ {0xA9,0x40}, {0x9D,0xF7}, {0xCB,0xEC}, {0xA9,0x4E},
+ {0x9F,0xD3}, {0x9A,0xCA}, {0xCE,0x48}, {0xCD,0xFB},
+ {0xCE,0x4B}, {0x89,0xF1}, {0xFA,0xF9}, {0xCD,0xFD},
+ {0xAB,0x78}, {0xAB,0xA8}, {0xAB,0x74}, {0xAB,0xA7},
+ {0xAB,0x7D}, {0xAB,0xA4}, {0xAB,0x72}, {0xCD,0xFC},
+ {0xCE,0x43}, {0xAB,0xA3}, {0xCE,0x4F}, {0xAB,0xA5},
+ {0x8E,0x5A}, {0xAB,0x79}, {0x89,0xF2}, {0xCE,0x45},
+ {0xCE,0x42}, {0xAB,0x77}, {0x89,0xF3}, {0xCD,0xFA},
+ {0xAB,0xA6}, {0xCE,0x4A}, {0xAB,0x7C}, {0xCE,0x4C},
+ {0xAB,0xA9}, {0xAB,0x73}, {0xAB,0x7E}, {0xAB,0x7B},
+ {0xCE,0x40}, {0xAB,0xA1}, {0xCE,0x46}, {0xCE,0x47},
+ {0xAB,0x7A}, {0xAB,0xA2}, {0xAB,0x76}, {0x92,0x5D},
+ {0x8B,0x51}, {0x92,0xE0}, {0xAB,0x75}, {0xCD,0xFE},
+ {0x89,0xF4}, {0xCE,0x44}, {0x9F,0xD4}, {0xCE,0x4E},
+ {0xD1,0x44}, {0xAD,0xFB}, {0xD0,0xF1}, {0x8A,0x79},
+ {0xD0,0xF6}, {0xAD,0xF4}, {0xAE,0x40}, {0xD0,0xF4},
+ {0xAD,0xEF}, {0xAD,0xF9}, {0xAD,0xFE}, {0xD0,0xFB},
+ {0xAD,0xFA}, {0xAD,0xFD}, {0x89,0xF5}, {0xD0,0xFE},
+ {0xAD,0xF5}, {0xD0,0xF5}, {0xD1,0x42}, {0xD1,0x43},
+ {0xAD,0xF7}, {0xD1,0x41}, {0xAD,0xF3}, {0xAE,0x43},
+ {0xD0,0xF8}, {0xAD,0xF1}, {0x97,0xA7}, {0xD1,0x46},
+ {0xD0,0xF9}, {0xD0,0xFD}, {0xAD,0xF6}, {0xAE,0x42},
+ {0xD0,0xFA}, {0xAD,0xFC}, {0xD1,0x40}, {0xD1,0x47},
+ {0xD4,0xA1}, {0x93,0xBA}, {0xD1,0x45}, {0xAE,0x44},
+ {0xAD,0xF0}, {0xD0,0xFC}, {0xD0,0xF3}, {0x9E,0x58},
+ {0xAD,0xF8}, {0xD0,0xF2}, {0x89,0xF6}, {0xD0,0xF7},
+ {0x9E,0x57}, {0x89,0xF7}, {0x8A,0x41}, {0xD0,0xF0},
+ {0xAE,0x41}, {0x89,0xF8}, {0xD4,0x77}, {0xFA,0xF1},
+ {0xB0,0xE4}, {0xD4,0xA7}, {0xB0,0xE2}, {0xB0,0xDF},
+ {0xD4,0x7C}, {0xB0,0xDB}, {0xD4,0xA2}, {0xB0,0xE6},
+ {0xD4,0x76}, {0xD4,0x7B}, {0xD4,0x7A}, {0xAD,0xF2},
+ {0xB0,0xE1}, {0xD4,0xA5}, {0xD4,0xA8}, {0xD4,0x73},
+ {0xB3,0xE8}, {0x89,0xFA}, {0xD4,0xA9}, {0xB0,0xE7},
+ {0xB0,0xD9}, {0xB0,0xD6}, {0xD4,0x7E}, {0xB0,0xD3},
+ {0xFB,0x42}, {0xD4,0xA6}, {0xFA,0xBF}, {0xB0,0xDA},
+ {0xD4,0xAA}, {0xD4,0x74}, {0xD4,0xA4}, {0xB0,0xDD},
+ {0xD4,0x75}, {0xD4,0x78}, {0xD4,0x7D}, {0xFB,0xA3},
+ {0xB0,0xDE}, {0xB0,0xDC}, {0xB0,0xE8}, {0xB0,0xE3},
+ {0xFA,0xF7}, {0xB0,0xD7}, {0xB1,0xD2}, {0xB0,0xD8},
+ {0xD4,0x79}, {0xB0,0xE5}, {0xB0,0xE0}, {0xD4,0xA3},
+ {0xB0,0xD5}, {0x9E,0x4E}, {0xB0,0xD4}, {0x94,0xDC},
+ {0x95,0xDA}, {0x9D,0xF8}, {0x9F,0x6A}, {0xD4,0x71},
+ {0xD4,0x72}, {0xD8,0x6A}, {0x8A,0xB7}, {0xB3,0xD7},
+ {0xB3,0xDA}, {0xD8,0x75}, {0xB3,0xEE}, {0xD8,0x78},
+ {0xB3,0xD8}, {0xD8,0x71}, {0xB3,0xDE}, {0xB3,0xE4},
+ {0xB5,0xBD}, {0xFB,0x46}, {0xB3,0xE2}, {0xD8,0x6E},
+ {0xB3,0xEF}, {0xB3,0xDB}, {0xB3,0xE3}, {0xD8,0x76},
+ {0xDC,0xD7}, {0xD8,0x7B}, {0xD8,0x6F}, {0x8A,0x46},
+ {0xD8,0x66}, {0xD8,0x73}, {0xD8,0x6D}, {0xB3,0xE1},
+ {0xD8,0x79}, {0xB3,0xDD}, {0xB3,0xF1}, {0xB3,0xEA},
+ {0xB3,0xDF}, {0xB3,0xDC}, {0xB3,0xE7}, {0xD8,0x7A},
+ {0xD8,0x6C}, {0xD8,0x72}, {0xD8,0x74}, {0xD8,0x68},
+ {0xD8,0x77}, {0xB3,0xD9}, {0xD8,0x67}, {0xFB,0x47},
+ {0xB3,0xE0}, {0xB3,0xF0}, {0xB3,0xEC}, {0xD8,0x69},
+ {0xB3,0xE6}, {0x91,0x48}, {0xB3,0xED}, {0xB3,0xE9},
+ {0xB3,0xE5}, {0x92,0xDE}, {0xD8,0x70}, {0x8B,0x53},
+ {0x9D,0xF6}, {0xB3,0xEB}, {0x9B,0xDA}, {0xDC,0xD5},
+ {0xDC,0xD1}, {0x9D,0x7E}, {0xDC,0xE0}, {0xDC,0xCA},
+ {0xDC,0xD3}, {0xB6,0xE5}, {0xB6,0xE6}, {0xB6,0xDE},
+ {0xDC,0xDC}, {0xB6,0xE8}, {0xDC,0xCF}, {0xDC,0xCE},
+ {0xDC,0xCC}, {0xDC,0xDE}, {0xB6,0xDC}, {0xDC,0xD8},
+ {0xDC,0xCD}, {0xB6,0xDF}, {0xDC,0xD6}, {0xB6,0xDA},
+ {0xDC,0xD2}, {0xDC,0xD9}, {0xDC,0xDB}, {0x89,0xFD},
+ {0x99,0xE4}, {0xDC,0xDF}, {0xB6,0xE3}, {0xDC,0xCB},
+ {0xB6,0xDD}, {0xDC,0xD0}, {0x9E,0x43}, {0xB6,0xD8},
+ {0xB6,0xE4}, {0xDC,0xDA}, {0xB6,0xE0}, {0xB6,0xE1},
+ {0xB6,0xE7}, {0xB6,0xDB}, {0xA2,0x5F}, {0xB6,0xD9},
+ {0xDC,0xD4}, {0x9D,0xE9}, {0x8F,0x52}, {0xB6,0xE2},
+ {0x9D,0xF5}, {0x9D,0xF0}, {0xDC,0xDD}, {0x99,0xE7},
+ {0xB9,0xCD}, {0xB9,0xC8}, {0xE1,0x55}, {0xE1,0x51},
+ {0x8B,0xBD}, {0xE1,0x4B}, {0xB9,0xC2}, {0xB9,0xBE},
+ {0xE1,0x54}, {0xB9,0xBF}, {0xE1,0x4E}, {0xE1,0x50},
+ {0xE1,0x53}, {0x9D,0xEF}, {0xB9,0xC4}, {0xB9,0xCB},
+ {0xB9,0xC5}, {0xE1,0x49}, {0xB9,0xC6}, {0xB9,0xC7},
+ {0xE1,0x4C}, {0xB9,0xCC}, {0x9F,0xB7}, {0xE1,0x4A},
+ {0xE1,0x4F}, {0xB9,0xC3}, {0xE1,0x48}, {0xB9,0xC9},
+ {0xB9,0xC1}, {0xB9,0xC0}, {0xE1,0x4D}, {0xE1,0x52},
+ {0x9D,0xD0}, {0xB9,0xCA}, {0x9F,0xEB}, {0x8D,0xA9},
+ {0x9D,0xCF}, {0x98,0xE1}, {0x9D,0xE5}, {0xE1,0x47},
+ {0xBC,0x4D}, {0xE5,0x47}, {0xE5,0x44}, {0x9D,0xC8},
+ {0xBC,0x47}, {0xBC,0x53}, {0xBC,0x54}, {0xBC,0x4A},
+ {0xE5,0x42}, {0xBC,0x4C}, {0xE4,0xF9}, {0xBC,0x52},
+ {0xFB,0x4F}, {0xE5,0x46}, {0xBC,0x49}, {0xE5,0x48},
+ {0xBC,0x48}, {0xE5,0x43}, {0xE5,0x45}, {0xBC,0x4B},
+ {0xE5,0x41}, {0xE4,0xFA}, {0xE4,0xF7}, {0x9D,0xEB},
+ {0xD8,0x6B}, {0xE4,0xFD}, {0xE4,0xF6}, {0xE4,0xFC},
+ {0xE4,0xFB}, {0xE4,0xF8}, {0xFB,0x54}, {0xBC,0x4F},
+ {0xFB,0x55}, {0x9A,0xA2}, {0x8A,0xD6}, {0xBC,0x4E},
+ {0x9A,0x5F}, {0xBC,0x50}, {0xE4,0xFE}, {0xBE,0xB2},
+ {0xE5,0x40}, {0x9E,0xF5}, {0xE9,0x45}, {0xE8,0xFD},
+ {0x8F,0xB7}, {0xBE,0xBE}, {0xE9,0x42}, {0xBE,0xB6},
+ {0xBE,0xBA}, {0xE9,0x41}, {0xBE,0xB9}, {0xBE,0xB5},
+ {0xBE,0xB8}, {0xBE,0xB3}, {0xBE,0xBD}, {0xE9,0x43},
+ {0xE8,0xFE}, {0xBE,0xBC}, {0xE8,0xFC}, {0xBE,0xBB},
+ {0xE9,0x44}, {0xE9,0x40}, {0xBC,0x51}, {0xBE,0xBF},
+ {0xE9,0x46}, {0xBE,0xB7}, {0xBE,0xB4}, {0x9A,0xD2},
+ {0x9E,0x6A}, {0x9E,0xE8}, {0xEC,0xC6}, {0xEC,0xC8},
+ {0xC0,0x7B}, {0xEC,0xC9}, {0xEC,0xC7}, {0xEC,0xC5},
+ {0xEC,0xC4}, {0xC0,0x7D}, {0xEC,0xC3}, {0xC0,0x7E},
+ {0x8B,0xBF}, {0x91,0xC2}, {0x9D,0x62}, {0xEC,0xC1},
+ {0xEC,0xC2}, {0xC0,0x7A}, {0xC0,0xA1}, {0xC0,0x7C},
+ {0x92,0x60}, {0xEC,0xC0}, {0xC2,0x50}, {0xEF,0xBC},
+ {0xEF,0xBA}, {0xEF,0xBF}, {0xEF,0xBD}, {0xEF,0xBB},
+ {0xEF,0xBE}, {0x92,0x5E}, {0x91,0xC1}, {0x8A,0xC5},
+ {0x97,0xA3}, {0xC3,0x60}, {0xF1,0xF2}, {0xF1,0xF3},
+ {0xC4,0x56}, {0xF1,0xF4}, {0xF1,0xF0}, {0xF1,0xF5},
+ {0xF1,0xF1}, {0xC2,0x51}, {0x8B,0x6C}, {0x8D,0x7E},
+ {0xF3,0xFE}, {0xF4,0x41}, {0xC4,0x59}, {0xF4,0x40},
+ {0xC4,0x58}, {0xC4,0x57}, {0x9C,0x54}, {0xC4,0x5A},
+ {0xF5,0xC5}, {0xF5,0xC6}, {0x9D,0xBD}, {0xC4,0xDA},
+ {0xC4,0xD9}, {0xC4,0xDB}, {0xF5,0xC4}, {0xF6,0xD8},
+ {0xF6,0xD7}, {0xC5,0x6D}, {0xC5,0x6F}, {0xC5,0x6E},
+ {0xF6,0xD9}, {0xC5,0xC8}, {0xF8,0xA6}, {0xC5,0xF1},
+ {0xF8,0xA5}, {0xF8,0xEE}, {0x9C,0xC5}, {0xC9,0x49},
+ {0xA5,0x7D}, {0xA5,0x7C}, {0xA6,0x5F}, {0xA6,0x5E},
+ {0xC9,0xC7}, {0xA6,0x5D}, {0xC9,0xC6}, {0x89,0x5B},
+ {0xA7,0x79}, {0xCA,0xA9}, {0xCA,0xA8}, {0xA7,0x77},
+ {0xA7,0x7A}, {0xFB,0x5C}, {0xCA,0xA7}, {0xFB,0x5B},
+ {0xA7,0x78}, {0xFB,0x57}, {0xCB,0xF0}, {0xCB,0xF1},
+ {0xA9,0x54}, {0x98,0xC7}, {0xAB,0xAA}, {0xFB,0x5A},
+ {0xD1,0x48}, {0xD1,0x49}, {0xAE,0x45}, {0xAE,0x46},
+ {0xD4,0xAC}, {0xB0,0xE9}, {0xB0,0xEB}, {0xD4,0xAB},
+ {0xB0,0xEA}, {0xD8,0x7C}, {0xB3,0xF2}, {0xB6,0xE9},
+ {0xB6,0xEA}, {0xDC,0xE1}, {0x9C,0xEE}, {0xB9,0xCF},
+ {0xB9,0xCE}, {0xE5,0x49}, {0xE9,0x48}, {0xE9,0x47},
+ {0x92,0xE2}, {0xF9,0x6B}, {0xA4,0x67}, {0xC9,0x59},
+ {0xC9,0x6E}, {0xC9,0x6F}, {0xA6,0x62}, {0xA6,0x66},
+ {0xC9,0xC9}, {0xA6,0x64}, {0xA6,0x63}, {0xC9,0xC8},
+ {0xA6,0x65}, {0xA6,0x61}, {0x94,0xA7}, {0xA6,0x60},
+ {0xC9,0xCA}, {0xA7,0xA6}, {0x8C,0xCC}, {0xA7,0xA3},
+ {0x9B,0xD4}, {0xA7,0x7D}, {0xCA,0xAA}, {0xFB,0x64},
+ {0xFB,0x76}, {0xCA,0xAB}, {0xFB,0x60}, {0xA7,0xA1},
+ {0xCA,0xAD}, {0xA7,0x7B}, {0xCA,0xAE}, {0xCA,0xAC},
+ {0xA7,0x7E}, {0xA7,0xA2}, {0xA7,0xA5}, {0xA7,0xA4},
+ {0xA7,0x7C}, {0xCA,0xAF}, {0x99,0xE5}, {0x9A,0xC2},
+ {0x91,0xFB}, {0xA0,0x73}, {0xA9,0x59}, {0xCB,0xFE},
+ {0xA9,0x5B}, {0xA9,0x5A}, {0x9F,0x72}, {0xCC,0x40},
+ {0xA9,0x58}, {0xA9,0x57}, {0xCB,0xF5}, {0xCB,0xF4},
+ {0xCB,0xF2}, {0xCB,0xF7}, {0xCB,0xF6}, {0xCB,0xF3},
+ {0xCB,0xFC}, {0xCB,0xFD}, {0xCB,0xFA}, {0xCB,0xF8},
+ {0xA9,0x56}, {0x9F,0xCC}, {0xCB,0xFB}, {0xA9,0x5C},
+ {0xCC,0x41}, {0x98,0xA5}, {0x92,0xE8}, {0xCB,0xF9},
+ {0xAB,0xAB}, {0xA9,0x55}, {0x9B,0xBC}, {0x96,0xF3},
+ {0xAB,0xAC}, {0xCE,0x54}, {0x92,0xE7}, {0xCE,0x5A},
+ {0xFC,0x67}, {0xAB,0xB2}, {0xCE,0x58}, {0xCE,0x5E},
+ {0xCE,0x55}, {0xCE,0x59}, {0xCE,0x5B}, {0xCE,0x5D},
+ {0xCE,0x57}, {0x8B,0x7D}, {0xCE,0x56}, {0xCE,0x51},
+ {0xCE,0x52}, {0xAB,0xAD}, {0x9B,0xF4}, {0xAB,0xAF},
+ {0xAB,0xAE}, {0xCE,0x53}, {0xCE,0x5C}, {0x9E,0xF7},
+ {0x9E,0xC1}, {0xAB,0xB1}, {0x99,0x6F}, {0xCE,0x50},
+ {0xD1,0x53}, {0xD1,0x52}, {0xD1,0x57}, {0xD1,0x4E},
+ {0x96,0xF1}, {0xD1,0x51}, {0xD1,0x50}, {0x8E,0x41},
+ {0xD1,0x54}, {0xD1,0x58}, {0xAE,0x47}, {0xAE,0x4A},
+ {0x95,0x4A}, {0xD1,0x4F}, {0xD1,0x55}, {0x97,0xE6},
+ {0xAE,0x49}, {0xD1,0x4A}, {0xAB,0xB0}, {0xD4,0xBA},
+ {0xD1,0x56}, {0xD1,0x4D}, {0xAE,0x48}, {0xD1,0x4C},
+ {0x96,0xF5}, {0xD4,0xB1}, {0x92,0xE6}, {0x9F,0x42},
+ {0xB0,0xEC}, {0xB0,0xF0}, {0xD4,0xC1}, {0xD4,0xAF},
+ {0xD4,0xBD}, {0xB0,0xF1}, {0xD4,0xBF}, {0xFB,0x67},
+ {0xD4,0xC5}, {0xD4,0xC9}, {0xD4,0xC0}, {0xD4,0xB4},
+ {0xD4,0xBC}, {0x99,0xA9}, {0xD4,0xCA}, {0xD4,0xC8},
+ {0xD4,0xBE}, {0xD4,0xB9}, {0xD4,0xB2}, {0xD8,0xA6},
+ {0xD4,0xB0}, {0xB0,0xF5}, {0xD4,0xB7}, {0xB0,0xF6},
+ {0xB0,0xF2}, {0xD4,0xAD}, {0xD4,0xC3}, {0xD4,0xB5},
+ {0xFA,0xE6}, {0xD4,0xB3}, {0xD4,0xC6}, {0xB0,0xF3},
+ {0xFB,0x69}, {0xD4,0xCC}, {0xB0,0xED}, {0xB0,0xEF},
+ {0xD4,0xBB}, {0xD4,0xB6}, {0xAE,0x4B}, {0xB0,0xEE},
+ {0xD4,0xB8}, {0xD4,0xC7}, {0xD4,0xCB}, {0xD4,0xC2},
+ {0xD4,0xC4}, {0x97,0xE5}, {0xD4,0xAE}, {0xD8,0xA1},
+ {0xD8,0xAA}, {0xD8,0xA9}, {0xB3,0xFA}, {0xD8,0xA2},
+ {0xB3,0xFB}, {0xB3,0xF9}, {0x96,0x7D}, {0xD8,0xA4},
+ {0xB3,0xF6}, {0xD8,0xA8}, {0xFB,0x6C}, {0xD8,0xA3},
+ {0xD8,0xA5}, {0xD8,0x7D}, {0xB3,0xF4}, {0xD8,0xB2},
+ {0xD8,0xB1}, {0xD8,0xAE}, {0xB3,0xF3}, {0xB3,0xF7},
+ {0xB3,0xF8}, {0xD1,0x4B}, {0xD8,0xAB}, {0xB3,0xF5},
+ {0xB0,0xF4}, {0xD8,0xAD}, {0xD8,0x7E}, {0xD8,0xB0},
+ {0xD8,0xAF}, {0x99,0xA2}, {0xD8,0xB3}, {0xDC,0xEF},
+ {0xD8,0xAC}, {0x9A,0xBB}, {0x9A,0x65}, {0x94,0x4E},
+ {0xD8,0xA7}, {0xDC,0xE7}, {0xB6,0xF4}, {0xB6,0xF7},
+ {0xB6,0xF2}, {0xDC,0xE6}, {0xDC,0xEA}, {0xDC,0xE5},
+ {0xB6,0xEC}, {0xB6,0xF6}, {0xDC,0xE2}, {0xB6,0xF0},
+ {0xDC,0xE9}, {0xB6,0xEE}, {0xB6,0xED}, {0xDC,0xEC},
+ {0xB6,0xEF}, {0xDC,0xEE}, {0xFB,0x6E}, {0xDC,0xEB},
+ {0xB6,0xEB}, {0x99,0xDF}, {0xB6,0xF5}, {0xDC,0xF0},
+ {0xDC,0xE4}, {0xDC,0xED}, {0xDC,0xE3}, {0x98,0xE3},
+ {0xB6,0xF1}, {0x92,0x54}, {0xB6,0xF3}, {0xDC,0xE8},
+ {0xDC,0xF1}, {0x96,0x7B}, {0x8A,0xAF}, {0xE1,0x5D},
+ {0xB9,0xD0}, {0xE1,0x63}, {0xB9,0xD5}, {0xE1,0x5F},
+ {0xE1,0x66}, {0xE1,0x57}, {0xB9,0xD7}, {0xB9,0xD1},
+ {0xE1,0x5C}, {0xBC,0x55}, {0xE1,0x5B}, {0xE1,0x64},
+ {0xB9,0xD2}, {0xB9,0xD6}, {0xE1,0x5A}, {0xE1,0x60},
+ {0xE1,0x65}, {0xE1,0x56}, {0xB9,0xD4}, {0xE1,0x5E},
+ {0xE1,0x62}, {0xE1,0x68}, {0xE1,0x58}, {0xE1,0x61},
+ {0x8C,0x77}, {0xB9,0xD3}, {0xE1,0x67}, {0xE1,0x59},
+ {0x8B,0xAF}, {0x9E,0xBD}, {0xBC,0x59}, {0xE5,0x4B},
+ {0xBC,0x57}, {0xBC,0x56}, {0xE5,0x4D}, {0xE5,0x52},
+ {0xE5,0x4E}, {0xE5,0x51}, {0xBC,0x5C}, {0x9E,0xE6},
+ {0xBE,0xA5}, {0xBC,0x5B}, {0xFB,0x6F}, {0xE5,0x4A},
+ {0xE5,0x50}, {0xBC,0x5A}, {0xE5,0x4F}, {0x8E,0xE1},
+ {0xE5,0x4C}, {0xBC,0x58}, {0x9B,0x7D}, {0x9C,0x7E},
+ {0xE9,0x4D}, {0xF9,0xD9}, {0xE9,0x4F}, {0xE9,0x4A},
+ {0xBE,0xC1}, {0xE9,0x4C}, {0xBE,0xC0}, {0xE9,0x4E},
+ {0xBE,0xC3}, {0xE9,0x50}, {0xBE,0xC2}, {0xE9,0x49},
+ {0xE9,0x4B}, {0x92,0xEA}, {0xC0,0xA5}, {0xEC,0xCC},
+ {0x8C,0x78}, {0xC0,0xA4}, {0xEC,0xCD}, {0xC0,0xA3},
+ {0xEC,0xCB}, {0xC0,0xA2}, {0xEC,0xCA}, {0xC2,0x53},
+ {0xC2,0x52}, {0xF1,0xF6}, {0xF1,0xF8}, {0xFB,0x72},
+ {0xF1,0xF7}, {0xC3,0x61}, {0xC3,0x62}, {0xFB,0x71},
+ {0xC3,0x63}, {0xF4,0x42}, {0xC4,0x5B}, {0xF7,0xD3},
+ {0xF7,0xD2}, {0xC5,0xF2}, {0xA4,0x68}, {0xA4,0xD0},
+ {0xA7,0xA7}, {0x89,0x5C}, {0x98,0xF0}, {0x96,0xF2},
+ {0xCE,0x5F}, {0xB3,0xFC}, {0xB3,0xFD}, {0xFB,0x74},
+ {0xDC,0xF2}, {0xB9,0xD8}, {0xE1,0x69}, {0xE5,0x53},
+ {0x8B,0xC1}, {0xC9,0x5A}, {0x89,0x5D}, {0x89,0xDE},
+ {0xCA,0xB0}, {0x89,0x5E}, {0xC6,0xCA}, {0xCC,0x42},
+ {0xCE,0x60}, {0xD1,0x59}, {0xAE,0x4C}, {0xFE,0x42},
+ {0xF1,0xF9}, {0xC4,0xDC}, {0xA4,0x69}, {0xA5,0x7E},
+ {0xC9,0x70}, {0xA6,0x67}, {0xA6,0x68}, {0xA9,0x5D},
+ {0xFB,0x7B}, {0xB0,0xF7}, {0xB9,0xDA}, {0xB9,0xDB},
+ {0xB9,0xD9}, {0xA4,0x6A}, {0xA4,0xD1}, {0xA4,0xD3},
+ {0xA4,0xD2}, {0xC9,0x5B}, {0xA4,0xD4}, {0xA5,0xA1},
+ {0xC9,0x71}, {0xA5,0xA2}, {0x89,0x5F}, {0x89,0x60},
+ {0xA6,0x69}, {0xA6,0x6A}, {0xC9,0xCB}, {0xA7,0xA8},
+ {0xCA,0xB1}, {0xA9,0x61}, {0xCC,0x43}, {0xA9,0x5F},
+ {0xA9,0x60}, {0xA9,0x5E}, {0xD1,0x5A}, {0xAB,0xB6},
+ {0xAB,0xB5}, {0xAB,0xB7}, {0xAB,0xB4}, {0xCE,0x61},
+ {0xA9,0x62}, {0xAB,0xB3}, {0xAE,0x4D}, {0xAE,0x4E},
+ {0xAE,0x4F}, {0xD4,0xCD}, {0xB3,0xFE}, {0xD8,0xB4},
+ {0xB0,0xF8}, {0x9B,0xCD}, {0xB6,0xF8}, {0xB9,0xDD},
+ {0xB9,0xDC}, {0xE1,0x6A}, {0xBC,0x5D}, {0xBE,0xC4},
+ {0xEF,0xC0}, {0xF6,0xDA}, {0xF7,0xD4}, {0xA4,0x6B},
+ {0xA5,0xA3}, {0x9D,0xD3}, {0xA5,0xA4}, {0xC9,0xD1},
+ {0xA6,0x6C}, {0xA6,0x6F}, {0xC9,0xCF}, {0xC9,0xCD},
+ {0xA6,0x6E}, {0xC9,0xD0}, {0xC9,0xD2}, {0xC9,0xCC},
+ {0xA6,0x71}, {0xA6,0x70}, {0xA6,0x6D}, {0xA6,0x6B},
+ {0xC9,0xCE}, {0x98,0x4C}, {0xA7,0xB3}, {0xA7,0xB0},
+ {0xCA,0xB6}, {0xCA,0xB9}, {0xCA,0xB8}, {0xA7,0xAA},
+ {0xA7,0xB2}, {0x97,0x52}, {0xA7,0xAF}, {0xCA,0xB5},
+ {0xCA,0xB3}, {0xA7,0xAE}, {0x95,0xC3}, {0xA7,0xA9},
+ {0xA7,0xAC}, {0x9B,0xB6}, {0xCA,0xB4}, {0xCA,0xBB},
+ {0xCA,0xB7}, {0xA7,0xAD}, {0xA7,0xB1}, {0xA7,0xB4},
+ {0xCA,0xB2}, {0xCA,0xBA}, {0xA7,0xAB}, {0x9A,0xB9},
+ {0xA9,0x67}, {0xA9,0x6F}, {0x97,0xB3}, {0xCC,0x4F},
+ {0xCC,0x48}, {0xA9,0x70}, {0xCC,0x53}, {0xCC,0x44},
+ {0xCC,0x4B}, {0x9F,0x74}, {0x92,0xF1}, {0xA9,0x66},
+ {0xCC,0x45}, {0xA9,0x64}, {0xCC,0x4C}, {0xCC,0x50},
+ {0xA9,0x63}, {0xCC,0x51}, {0xCC,0x4A}, {0xCC,0x4D},
+ {0x97,0xDF}, {0xA9,0x72}, {0xA9,0x69}, {0xCC,0x54},
+ {0xCC,0x52}, {0xFB,0xA6}, {0xA9,0x6E}, {0xA9,0x6C},
+ {0xCC,0x49}, {0xA9,0x6B}, {0xCC,0x47}, {0xCC,0x46},
+ {0xA9,0x6A}, {0xA9,0x68}, {0xA9,0x71}, {0xA9,0x6D},
+ {0xA9,0x65}, {0xCC,0x4E}, {0xAB,0xB9}, {0xFB,0xAB},
+ {0xAB,0xC0}, {0xCE,0x6F}, {0xAB,0xB8}, {0xCE,0x67},
+ {0xCE,0x63}, {0xCE,0x73}, {0xCE,0x62}, {0xAB,0xBB},
+ {0xCE,0x6C}, {0xAB,0xBE}, {0xAB,0xC1}, {0xAB,0xBC},
+ {0xCE,0x70}, {0xAB,0xBF}, {0x98,0x77}, {0xAE,0x56},
+ {0xCE,0x76}, {0xCE,0x64}, {0x98,0x54}, {0x95,0xC5},
+ {0xCE,0x66}, {0xCE,0x6D}, {0xCE,0x71}, {0xCE,0x75},
+ {0xCE,0x72}, {0xCE,0x6B}, {0xCE,0x6E}, {0x9D,0x55},
+ {0xFB,0xB2}, {0xCE,0x68}, {0xAB,0xC3}, {0xCE,0x6A},
+ {0xCE,0x69}, {0xCE,0x74}, {0xAB,0xBA}, {0xCE,0x65},
+ {0xAB,0xC2}, {0x95,0x7E}, {0xAB,0xBD}, {0xAE,0x5C},
+ {0xD1,0x62}, {0x97,0x42}, {0xAE,0x5B}, {0x94,0xE6},
+ {0xD1,0x60}, {0xAE,0x50}, {0x92,0xF5}, {0xAE,0x55},
+ {0xD1,0x5F}, {0xD1,0x5C}, {0xD1,0x61}, {0xAE,0x51},
+ {0xD1,0x5B}, {0x8C,0xC5}, {0xAE,0x54}, {0xAE,0x52},
+ {0xD1,0x63}, {0xAE,0x53}, {0xAE,0x57}, {0x92,0xFD},
+ {0xAE,0x58}, {0xFB,0xA2}, {0xAE,0x5A}, {0x9C,0x51},
+ {0xAE,0x59}, {0x94,0xE9}, {0x98,0x5C}, {0x92,0xF0},
+ {0xD1,0x5D}, {0xD1,0x5E}, {0xD1,0x64}, {0xD4,0xD4},
+ {0xB0,0xF9}, {0xD8,0xC2}, {0xD4,0xD3}, {0xD4,0xE6},
+ {0xB1,0x40}, {0x94,0x4C}, {0xD4,0xE4}, {0xB0,0xFE},
+ {0xB0,0xFA}, {0xD4,0xED}, {0xD4,0xDD}, {0xD4,0xE0},
+ {0x91,0x6B}, {0xB1,0x43}, {0xD4,0xEA}, {0xD4,0xE2},
+ {0xB0,0xFB}, {0xB1,0x44}, {0xD4,0xE7}, {0xD4,0xE5},
+ {0xD4,0xD6}, {0xD4,0xEB}, {0xD4,0xDF}, {0xD4,0xDA},
+ {0x8B,0x78}, {0xD4,0xD0}, {0xD4,0xEC}, {0xD4,0xDC},
+ {0xD4,0xCF}, {0x94,0xE2}, {0xB1,0x42}, {0xD4,0xE1},
+ {0xD4,0xEE}, {0xD4,0xDE}, {0xD4,0xD2}, {0xD4,0xD7},
+ {0xD4,0xCE}, {0x98,0x4F}, {0xB1,0x41}, {0xFB,0xB5},
+ {0xD4,0xDB}, {0xD4,0xD8}, {0xB0,0xFC}, {0xD4,0xD1},
+ {0x92,0x71}, {0xD4,0xE9}, {0xB0,0xFD}, {0x93,0x65},
+ {0xD4,0xD9}, {0xD4,0xD5}, {0x98,0x5B}, {0xD4,0xE8},
+ {0x98,0x50}, {0xB4,0x40}, {0xD8,0xBB}, {0x97,0xBC},
+ {0xD8,0xB8}, {0xD8,0xC9}, {0xD8,0xBD}, {0xD8,0xCA},
+ {0x92,0xF3}, {0xB4,0x42}, {0x93,0x40}, {0x98,0x4D},
+ {0xD8,0xC6}, {0xD8,0xC3}, {0x95,0x72}, {0xFD,0xEF},
+ {0xD8,0xC4}, {0xD8,0xC7}, {0xD8,0xCB}, {0xD4,0xE3},
+ {0xD8,0xCD}, {0xDD,0x47}, {0xFD,0xC1}, {0xB4,0x43},
+ {0xD8,0xCE}, {0xD8,0xB6}, {0xD8,0xC0}, {0xFB,0xBA},
+ {0xD8,0xC5}, {0x92,0xEB}, {0xB4,0x41}, {0xB4,0x44},
+ {0xD8,0xCC}, {0xD8,0xCF}, {0xD8,0xBA}, {0xD8,0xB7},
+ {0xFC,0x73}, {0x97,0xB7}, {0xD8,0xB9}, {0xD8,0xBE},
+ {0xD8,0xBC}, {0xB4,0x45}, {0xD8,0xC8}, {0xFB,0xB4},
+ {0xD8,0xBF}, {0xD8,0xC1}, {0xD8,0xB5}, {0xDC,0xFA},
+ {0xDC,0xF8}, {0xB7,0x42}, {0xB7,0x40}, {0xDD,0x43},
+ {0xDC,0xF9}, {0xDD,0x44}, {0xDD,0x40}, {0xDC,0xF7},
+ {0xDD,0x46}, {0xDC,0xF6}, {0xDC,0xFD}, {0xB6,0xFE},
+ {0xB6,0xFD}, {0xB6,0xFC}, {0xDC,0xFB}, {0xDD,0x41},
+ {0xB6,0xF9}, {0xB7,0x41}, {0x90,0xA7}, {0xDC,0xF4},
+ {0xDC,0xFE}, {0xDC,0xF3}, {0xDC,0xFC}, {0xB6,0xFA},
+ {0xDD,0x42}, {0xDC,0xF5}, {0xB6,0xFB}, {0xDD,0x45},
+ {0x97,0x41}, {0x92,0xF4}, {0xFB,0xBC}, {0xE1,0x6E},
+ {0xB9,0xE2}, {0xB9,0xE1}, {0xB9,0xE3}, {0xE1,0x7A},
+ {0xE1,0x70}, {0xE1,0x76}, {0xE1,0x6B}, {0xE1,0x79},
+ {0xE1,0x78}, {0xE1,0x7C}, {0xE1,0x75}, {0xB9,0xDE},
+ {0xE1,0x74}, {0xB9,0xE4}, {0x95,0x77}, {0xE1,0x6D},
+ {0xB9,0xDF}, {0xE1,0x7B}, {0xB9,0xE0}, {0xE1,0x6F},
+ {0xE1,0x72}, {0xE1,0x77}, {0xE1,0x71}, {0xE1,0x6C},
+ {0x9E,0xE2}, {0x8F,0x78}, {0xE1,0x73}, {0xE5,0x55},
+ {0xBC,0x61}, {0xE5,0x58}, {0xE5,0x57}, {0xE5,0x5A},
+ {0xE5,0x5C}, {0xF9,0xDC}, {0xBC,0x5F}, {0xE5,0x56},
+ {0x96,0x72}, {0xE5,0x54}, {0xE5,0x5D}, {0xE5,0x5B},
+ {0xE5,0x59}, {0xE5,0x5F}, {0xE5,0x5E}, {0xBC,0x63},
+ {0xBC,0x5E}, {0xBC,0x60}, {0xBC,0x62}, {0x9E,0xB5},
+ {0xE5,0x60}, {0xE9,0x57}, {0x96,0x4B}, {0xE9,0x56},
+ {0xE9,0x55}, {0x8C,0xAC}, {0xE9,0x58}, {0xE9,0x51},
+ {0xE9,0x52}, {0xE9,0x5A}, {0xE9,0x53}, {0xBE,0xC5},
+ {0xE9,0x5C}, {0xA0,0xFA}, {0xE9,0x5B}, {0xE9,0x54},
+ {0xEC,0xD1}, {0xC0,0xA8}, {0xEC,0xCF}, {0xEC,0xD4},
+ {0xEC,0xD3}, {0xE9,0x59}, {0xC0,0xA7}, {0x95,0x75},
+ {0xEC,0xD2}, {0xEC,0xCE}, {0xEC,0xD6}, {0xEC,0xD5},
+ {0xC0,0xA6}, {0xEC,0xD0}, {0xBE,0xC6}, {0xC2,0x54},
+ {0xEF,0xC1}, {0xF1,0xFA}, {0xF1,0xFB}, {0xF1,0xFC},
+ {0xC4,0x5C}, {0x90,0xDA}, {0xC4,0x5D}, {0x93,0x67},
+ {0xF4,0x43}, {0xFE,0xA4}, {0xF5,0xC8}, {0xF5,0xC7},
+ {0x90,0xDF}, {0xF6,0xDB}, {0xF6,0xDC}, {0xF7,0xD5},
+ {0xF8,0xA7}, {0x93,0x54}, {0xA4,0x6C}, {0xA4,0x6D},
+ {0xA4,0x6E}, {0xA4,0xD5}, {0xA5,0xA5}, {0xC9,0xD3},
+ {0xA6,0x72}, {0xA6,0x73}, {0xA7,0xB7}, {0xA7,0xB8},
+ {0xA7,0xB6}, {0xA7,0xB5}, {0xA9,0x73}, {0xCC,0x55},
+ {0xA9,0x75}, {0xA9,0x74}, {0xCC,0x56}, {0x89,0x61},
+ {0x8B,0xB4}, {0xAB,0xC4}, {0xAE,0x5D}, {0xD1,0x65},
+ {0x9D,0xC0}, {0xD4,0xF0}, {0xB1,0x45}, {0xB4,0x47},
+ {0xD4,0xEF}, {0xB4,0x46}, {0x8E,0x48}, {0xB9,0xE5},
+ {0xFB,0xC5}, {0xE1,0x7D}, {0xBE,0xC7}, {0xC0,0xA9},
+ {0xEC,0xD7}, {0xFB,0xC7}, {0xC4,0x5E}, {0xC5,0x70},
+ {0xC6,0xCB}, {0xC9,0x72}, {0xFA,0x79}, {0xA5,0xA6},
+ {0xC9,0x73}, {0xA6,0x76}, {0xA6,0x74}, {0xA6,0x75},
+ {0xA6,0x77}, {0xA7,0xBA}, {0xA7,0xB9}, {0xCA,0xBC},
+ {0xA7,0xBB}, {0x9E,0x67}, {0xCA,0xBD}, {0xCC,0x57},
+ {0xCC,0x58}, {0x8C,0xD9}, {0xA9,0x76}, {0xA9,0x78},
+ {0xA9,0x7A}, {0xA9,0x77}, {0xA9,0x7B}, {0xA9,0x79},
+ {0xFB,0xD2}, {0x89,0x62}, {0x89,0x63}, {0xAB,0xC8},
+ {0xAB,0xC5}, {0xAB,0xC7}, {0xAB,0xC9}, {0xAB,0xC6},
+ {0xD1,0x66}, {0xCE,0x77}, {0xFC,0x7D}, {0xD1,0x68},
+ {0xD1,0x67}, {0xAE,0x63}, {0xAE,0x5F}, {0xAE,0x60},
+ {0xAE,0x62}, {0xAE,0x64}, {0xAE,0x61}, {0xAE,0x66},
+ {0xAE,0x65}, {0xB1,0x4A}, {0xD4,0xF2}, {0xD4,0xF1},
+ {0xB1,0x49}, {0x9F,0x6B}, {0xB1,0x48}, {0xB1,0x47},
+ {0xB1,0x4B}, {0xB1,0x46}, {0xD8,0xD5}, {0xD8,0xD2},
+ {0xB4,0x49}, {0xD8,0xD1}, {0xD8,0xD6}, {0xB4,0x4B},
+ {0xD8,0xD4}, {0xB4,0x48}, {0xB4,0x4A}, {0xD8,0xD3},
+ {0xFB,0xCC}, {0xDD,0x48}, {0xFE,0xAE}, {0xDD,0x49},
+ {0xDD,0x4A}, {0xB9,0xE6}, {0xB9,0xEE}, {0xE1,0x7E},
+ {0xB9,0xE8}, {0xB9,0xEC}, {0xE1,0xA1}, {0xB9,0xED},
+ {0xB9,0xE9}, {0xB9,0xEA}, {0xB9,0xE7}, {0xB9,0xEB},
+ {0xBC,0x66}, {0xD8,0xD0}, {0xBC,0x67}, {0xBC,0x65},
+ {0xBC,0x64}, {0xE9,0x5D}, {0xBE,0xC8}, {0xEC,0xD8},
+ {0xEC,0xD9}, {0xFB,0xD1}, {0xC3,0x64}, {0xC4,0x5F},
+ {0xA4,0x6F}, {0xA6,0x78}, {0xFB,0x75}, {0xAB,0xCA},
+ {0xD1,0x69}, {0xAE,0x67}, {0xFB,0xD4}, {0xB1,0x4E},
+ {0xB1,0x4D}, {0xB1,0x4C}, {0xB4,0x4C}, {0xB4,0x4D},
+ {0xD8,0xD7}, {0xB9,0xEF}, {0xBE,0xC9}, {0xA4,0x70},
+ {0xC9,0x5C}, {0xA4,0xD6}, {0xC9,0x74}, {0xFB,0xD6},
+ {0xFB,0xD8}, {0xC9,0xD4}, {0xA6,0x79}, {0xA9,0x7C},
+ {0x8B,0x5D}, {0x93,0x4C}, {0xDD,0x4B}, {0x9A,0xE2},
+ {0xA4,0x71}, {0x8B,0xC9}, {0xA4,0xD7}, {0xC9,0xD5},
+ {0xCA,0xBE}, {0xCA,0xBF}, {0xA7,0xBC}, {0xD8,0xD8},
+ {0xB4,0x4E}, {0xDD,0x4C}, {0xC0,0xAA}, {0xA4,0x72},
+ {0xA4,0xA8}, {0xA4,0xD8}, {0xC9,0x75}, {0xA5,0xA7},
+ {0xA7,0xC0}, {0xA7,0xBF}, {0xA7,0xBD}, {0xA7,0xBE},
+ {0xCC,0x59}, {0xA9,0x7E}, {0xA9,0xA1}, {0xCC,0x5A},
+ {0xA9,0x7D}, {0xFB,0xDB}, {0x9F,0xC9}, {0xAB,0xCE},
+ {0xCE,0x78}, {0xAB,0xCD}, {0xAB,0xCB}, {0xAB,0xCC},
+ {0xAE,0x6A}, {0xAE,0x68}, {0x9F,0x44}, {0xD1,0x6B},
+ {0xAE,0x69}, {0xD1,0x6A}, {0xAE,0x5E}, {0xD4,0xF3},
+ {0xB1,0x50}, {0xB1,0x51}, {0x98,0xED}, {0xB1,0x4F},
+ {0xB9,0xF0}, {0xE1,0xA2}, {0xBC,0x68}, {0xBC,0x69},
+ {0xE5,0x61}, {0xC0,0xAB}, {0xEF,0xC2}, {0xEF,0xC3},
+ {0xC4,0xDD}, {0xF8,0xA8}, {0xC9,0x4B}, {0xA4,0xD9},
+ {0xA4,0x73}, {0xC9,0x77}, {0xC9,0x76}, {0xA6,0x7A},
+ {0xC9,0xD7}, {0xC9,0xD8}, {0xC9,0xD6}, {0xC9,0xD9},
+ {0xFB,0xDD}, {0xCA,0xC7}, {0xCA,0xC2}, {0xCA,0xC4},
+ {0xCA,0xC6}, {0xCA,0xC3}, {0xA7,0xC4}, {0xCA,0xC0},
+ {0xCA,0xC1}, {0xA7,0xC1}, {0xA7,0xC2}, {0xCA,0xC5},
+ {0xCA,0xC8}, {0xA7,0xC3}, {0xCA,0xC9}, {0x8D,0xF2},
+ {0x89,0x64}, {0xFD,0xF2}, {0xCC,0x68}, {0x93,0x4D},
+ {0xCC,0x62}, {0xCC,0x5D}, {0xA9,0xA3}, {0xCC,0x65},
+ {0xCC,0x63}, {0xCC,0x5C}, {0xCC,0x69}, {0xCC,0x6C},
+ {0xCC,0x67}, {0xCC,0x60}, {0xA9,0xA5}, {0xCC,0x66},
+ {0xA9,0xA6}, {0xCC,0x61}, {0xCC,0x64}, {0xCC,0x5B},
+ {0xCC,0x5F}, {0xCC,0x6B}, {0xA9,0xA7}, {0xA9,0xA8},
+ {0xCC,0x5E}, {0xCC,0x6A}, {0xA9,0xA2}, {0xA9,0xA4},
+ {0xFB,0xE7}, {0xA0,0xF2}, {0x98,0x68}, {0xCE,0xAB},
+ {0xCE,0xA4}, {0xCE,0xAA}, {0xCE,0xA3}, {0xCE,0xA5},
+ {0xCE,0x7D}, {0xCE,0x7B}, {0xCE,0xAC}, {0xCE,0xA9},
+ {0xCE,0x79}, {0x9F,0x58}, {0xAB,0xD0}, {0xCE,0xA7},
+ {0xCE,0xA8}, {0xCE,0xA6}, {0xCE,0x7C}, {0xCE,0x7A},
+ {0xAB,0xCF}, {0xCE,0xA2}, {0xCE,0x7E}, {0xCE,0xA1},
+ {0xCE,0xAD}, {0x8D,0x73}, {0xAE,0x6F}, {0xFB,0xDE},
+ {0xAE,0x6E}, {0xD1,0x6C}, {0xAE,0x6B}, {0xD1,0x6E},
+ {0xFB,0xDF}, {0xAE,0x70}, {0xD1,0x6F}, {0xAE,0x73},
+ {0x8C,0x48}, {0xAE,0x71}, {0xD1,0x70}, {0xCE,0xAE},
+ {0xD1,0x72}, {0xAE,0x6D}, {0xAE,0x6C}, {0xD1,0x6D},
+ {0xD1,0x71}, {0xAE,0x72}, {0xB1,0x53}, {0xB1,0x52},
+ {0xD4,0xF5}, {0xD4,0xF9}, {0xD4,0xFB}, {0xB1,0x54},
+ {0xD4,0xFE}, {0xFB,0xE3}, {0xB1,0x58}, {0xD5,0x41},
+ {0xB1,0x5A}, {0x8D,0xA8}, {0xB1,0x56}, {0xB1,0x5E},
+ {0xFB,0xE4}, {0xB1,0x5B}, {0xD4,0xF7}, {0xB1,0x55},
+ {0xD4,0xF6}, {0xD4,0xF4}, {0xD5,0x43}, {0xD4,0xF8},
+ {0xB1,0x57}, {0xD5,0x42}, {0xB1,0x5C}, {0xD4,0xFD},
+ {0xD4,0xFC}, {0xB1,0x5D}, {0xD4,0xFA}, {0xB1,0x59},
+ {0x9C,0x75}, {0xD5,0x44}, {0x98,0x78}, {0xD5,0x40},
+ {0xD8,0xE7}, {0xD8,0xEE}, {0xD8,0xE3}, {0xB4,0x51},
+ {0xD8,0xDF}, {0xD8,0xEF}, {0xD8,0xD9}, {0xD8,0xEC},
+ {0xD8,0xEA}, {0xD8,0xE4}, {0xD8,0xED}, {0xD8,0xE6},
+ {0x8D,0x60}, {0xD8,0xDE}, {0xD8,0xF0}, {0xD8,0xDC},
+ {0xD8,0xE9}, {0xD8,0xDA}, {0xD8,0xF1}, {0xFB,0xE5},
+ {0xB4,0x52}, {0x8D,0x61}, {0xD8,0xEB}, {0xDD,0x4F},
+ {0xD8,0xDD}, {0xB4,0x4F}, {0xD8,0xE1}, {0xB4,0x50},
+ {0xD8,0xE0}, {0xD8,0xE5}, {0xD8,0xE2}, {0x8D,0x62},
+ {0xA0,0xA1}, {0xD8,0xE8}, {0x9C,0x40}, {0xDD,0x53},
+ {0xDD,0x56}, {0xDD,0x4E}, {0xDD,0x50}, {0xDD,0x55},
+ {0xDD,0x54}, {0xB7,0x43}, {0xD8,0xDB}, {0xDD,0x52},
+ {0xB7,0x44}, {0x98,0xAD}, {0xDD,0x4D}, {0xDD,0x51},
+ {0x9E,0xEA}, {0xE1,0xA9}, {0xE1,0xB0}, {0xE1,0xA7},
+ {0x8C,0xD4}, {0xE1,0xAE}, {0xE1,0xA5}, {0xE1,0xAD},
+ {0xE1,0xB1}, {0xE1,0xA4}, {0xE1,0xA8}, {0xE1,0xA3},
+ {0xB9,0xF1}, {0x9C,0xEB}, {0xE1,0xA6}, {0xB9,0xF2},
+ {0xE1,0xAC}, {0xE1,0xAB}, {0xE1,0xAA}, {0xFB,0xE0},
+ {0xE1,0xAF}, {0x9F,0x51}, {0xE5,0x65}, {0xE5,0x67},
+ {0xBC,0x6B}, {0xE5,0x68}, {0xE5,0x63}, {0xE5,0x62},
+ {0xE5,0x6C}, {0xE5,0x6A}, {0xBC,0x6A}, {0xE5,0x6D},
+ {0xE5,0x64}, {0xE5,0x69}, {0xE5,0x6B}, {0xE5,0x66},
+ {0x8D,0x65}, {0xE9,0x61}, {0xE9,0x66}, {0xE9,0x60},
+ {0xE9,0x65}, {0x9C,0xF1}, {0xE9,0x5E}, {0xE9,0x68},
+ {0xE9,0x64}, {0xE9,0x69}, {0xE9,0x63}, {0xE9,0x5F},
+ {0xE9,0x67}, {0xE9,0x6A}, {0xE9,0x62}, {0xFC,0x58},
+ {0xEC,0xDA}, {0xC0,0xAF}, {0x8D,0x66}, {0xC0,0xAD},
+ {0xC0,0xAC}, {0xC0,0xAE}, {0xEF,0xC4}, {0x96,0x54},
+ {0xF1,0x72}, {0xF1,0xFD}, {0xF4,0x44}, {0xF4,0x45},
+ {0xC4,0x60}, {0xF5,0xC9}, {0xC4,0xDE}, {0xF5,0xCA},
+ {0xF6,0xDE}, {0xC5,0x72}, {0xC5,0x71}, {0xF6,0xDD},
+ {0xC5,0xC9}, {0xFB,0xE8}, {0xF7,0xD6}, {0xC6,0xCC},
+ {0xA4,0x74}, {0xA6,0x7B}, {0xC9,0xDA}, {0xCA,0xCA},
+ {0xA8,0xB5}, {0xB1,0x5F}, {0xA4,0x75}, {0xA5,0xAA},
+ {0xA5,0xA9}, {0xA5,0xA8}, {0xA7,0xC5}, {0xAE,0x74},
+ {0xDD,0x57}, {0xA4,0x76}, {0xA4,0x77}, {0xA4,0x78},
+ {0xA4,0xDA}, {0x9F,0xCE}, {0xAB,0xD1}, {0xCE,0xAF},
+ {0xB4,0x53}, {0xA4,0x79}, {0xC9,0x5D}, {0xA5,0xAB},
+ {0xA5,0xAC}, {0xC9,0x78}, {0xA6,0x7C}, {0xFB,0xFC},
+ {0xCA,0xCB}, {0x9A,0xE4}, {0xA7,0xC6}, {0xCA,0xCC},
+ {0xA9,0xAE}, {0x9F,0x75}, {0xCC,0x6E}, {0xA9,0xAC},
+ {0xA9,0xAB}, {0xCC,0x6D}, {0xA9,0xA9}, {0xCC,0x6F},
+ {0xA9,0xAA}, {0xA9,0xAD}, {0xAB,0xD2}, {0xAB,0xD4},
+ {0xCE,0xB3}, {0xCE,0xB0}, {0xCE,0xB1}, {0xCE,0xB2},
+ {0xCE,0xB4}, {0xAB,0xD3}, {0xD1,0x74}, {0xD1,0x73},
+ {0xAE,0x76}, {0xAE,0x75}, {0xFB,0xF1}, {0xB1,0x62},
+ {0xD5,0x46}, {0xB1,0x61}, {0xB1,0x63}, {0xB1,0x60},
+ {0xB4,0x55}, {0xD5,0x45}, {0xB4,0x56}, {0xD8,0xF3},
+ {0x8D,0x69}, {0xB4,0x57}, {0xD8,0xF2}, {0xB4,0x54},
+ {0x93,0x4F}, {0xDD,0x5A}, {0xDD,0x5C}, {0xB7,0x45},
+ {0xDD,0x5B}, {0xDD,0x59}, {0xDD,0x58}, {0xE1,0xB4},
+ {0xB9,0xF7}, {0xB9,0xF5}, {0xB9,0xF6}, {0xE1,0xB2},
+ {0xE1,0xB3}, {0xB9,0xF3}, {0xE5,0x71}, {0xE5,0x6F},
+ {0x93,0x4E}, {0xBC,0x6D}, {0xE5,0x70}, {0xBC,0x6E},
+ {0xBC,0x6C}, {0xB9,0xF4}, {0xE9,0x6D}, {0xE9,0x6B},
+ {0xE9,0x6C}, {0xE5,0x6E}, {0xEC,0xDC}, {0xC0,0xB0},
+ {0xEC,0xDB}, {0xEF,0xC5}, {0xEF,0xC6}, {0xE9,0x6E},
+ {0xF1,0xFE}, {0xA4,0x7A}, {0xA5,0xAD}, {0xA6,0x7E},
+ {0xC9,0xDB}, {0xA6,0x7D}, {0xA9,0xAF}, {0xB7,0x46},
+ {0xFB,0xF4}, {0xA4,0xDB}, {0xA5,0xAE}, {0xAB,0xD5},
+ {0xB4,0x58}, {0xC6,0xCE}, {0xC9,0x79}, {0xC9,0x7A},
+ {0xFB,0xC3}, {0xC9,0xDC}, {0x89,0x65}, {0xA7,0xC8},
+ {0xCA,0xD0}, {0xCA,0xCE}, {0xA7,0xC9}, {0xCA,0xCD},
+ {0xCA,0xCF}, {0xCA,0xD1}, {0xA7,0xC7}, {0x8C,0x7A},
+ {0xA9,0xB3}, {0xA9,0xB4}, {0xA9,0xB1}, {0x8C,0x7B},
+ {0xA9,0xB0}, {0xCE,0xB8}, {0xA9,0xB2}, {0xAB,0xD6},
+ {0xCE,0xB7}, {0xCE,0xB9}, {0xCE,0xB6}, {0xCE,0xBA},
+ {0xAB,0xD7}, {0xAE,0x79}, {0xD1,0x75}, {0xD1,0x77},
+ {0xAE,0x77}, {0xD1,0x78}, {0xAE,0x78}, {0xD1,0x76},
+ {0xCE,0xB5}, {0xD5,0x47}, {0xD5,0x4A}, {0xD5,0x4B},
+ {0xD5,0x48}, {0xB1,0x67}, {0xB1,0x66}, {0xB1,0x64},
+ {0xB1,0x65}, {0xD5,0x49}, {0x8D,0x6A}, {0xB1,0x68},
+ {0xB4,0x5A}, {0xB4,0x5B}, {0xB4,0x5C}, {0xDD,0x5D},
+ {0xDD,0x5F}, {0xDD,0x61}, {0xB7,0x48}, {0xB7,0x47},
+ {0xB4,0x59}, {0xDD,0x60}, {0xDD,0x5E}, {0x93,0x53},
+ {0xE1,0xB8}, {0x9D,0xFB}, {0xE1,0xB6}, {0xE1,0xBC},
+ {0xB9,0xF8}, {0xE1,0xBD}, {0xE1,0xBA}, {0xB9,0xF9},
+ {0xE1,0xB7}, {0xE1,0xB5}, {0xE1,0xBB}, {0xBC,0x70},
+ {0xE5,0x73}, {0xE1,0xB9}, {0xBC,0x72}, {0xE5,0x74},
+ {0xBC,0x71}, {0xBC,0x74}, {0xE5,0x75}, {0xBC,0x6F},
+ {0xBC,0x73}, {0xE9,0x73}, {0xE9,0x71}, {0xE9,0x70},
+ {0xE9,0x72}, {0xE9,0x6F}, {0xC3,0x66}, {0xF4,0x46},
+ {0xF4,0x47}, {0xF5,0xCB}, {0xF6,0xDF}, {0xC6,0x55},
+ {0xFB,0xFD}, {0xA9,0xB5}, {0xA7,0xCA}, {0x90,0x59},
+ {0xFC,0x40}, {0xAB,0xD8}, {0xFC,0x41}, {0xFC,0x43},
+ {0xA4,0x7B}, {0xA4,0xDC}, {0xA5,0xAF}, {0xC9,0xDD},
+ {0xA7,0xCB}, {0xCA,0xD2}, {0xCE,0xBB}, {0xAB,0xD9},
+ {0xB9,0xFA}, {0xA4,0x7C}, {0x93,0x61}, {0xFC,0x46},
+ {0x93,0x62}, {0xA6,0xA1}, {0xB7,0x49}, {0xA4,0x7D},
+ {0xA4,0xDD}, {0xA4,0xDE}, {0xA5,0xB1}, {0xA5,0xB0},
+ {0xC9,0xDE}, {0xA6,0xA2}, {0xCA,0xD3}, {0xA7,0xCC},
+ {0xCC,0x71}, {0xCC,0x72}, {0xCC,0x73}, {0x8D,0x6B},
+ {0xA9,0xB6}, {0xA9,0xB7}, {0xCC,0x70}, {0xA9,0xB8},
+ {0xAB,0xDA}, {0xCE,0xBC}, {0xD1,0x7A}, {0xAE,0x7A},
+ {0xD1,0x79}, {0xB1,0x69}, {0xD5,0x4C}, {0xB1,0x6A},
+ {0xD5,0x4D}, {0xFC,0x4C}, {0xB4,0x5D}, {0xDD,0x62},
+ {0xE1,0xBF}, {0xE1,0xBE}, {0xB9,0xFB}, {0xBC,0x75},
+ {0xE5,0x76}, {0xBE,0xCA}, {0xE9,0x74}, {0xC0,0xB1},
+ {0x95,0xB8}, {0xC5,0x73}, {0xF7,0xD8}, {0xC6,0xD0},
+ {0x8B,0xCA}, {0xCC,0x74}, {0xCE,0xBD}, {0xB1,0x6B},
+ {0xD8,0xF4}, {0xB7,0x4A}, {0x98,0x7A}, {0xC2,0x55},
+ {0xC6,0xD1}, {0xA7,0xCE}, {0xFC,0x51}, {0xA7,0xCD},
+ {0xAB,0xDB}, {0xD1,0x7B}, {0xB1,0x6D}, {0xB3,0x43},
+ {0xB1,0x6E}, {0xB1,0x6C}, {0xB4,0x5E}, {0xE1,0xC0},
+ {0xB9,0xFC}, {0xBC,0x76}, {0xFC,0x54}, {0xC9,0x4C},
+ {0xC9,0xDF}, {0xCA,0xD5}, {0xA7,0xCF}, {0xCA,0xD4},
+ {0xA7,0xD0}, {0xFA,0xAF}, {0xA9,0xBC}, {0xCC,0x77},
+ {0xCC,0x76}, {0xA9,0xBB}, {0xA9,0xB9}, {0xA9,0xBA},
+ {0xCC,0x75}, {0x8D,0x6C}, {0xAB,0xDD}, {0xCE,0xBE},
+ {0xAB,0xE0}, {0xAB,0xDC}, {0xAB,0xE2}, {0xAB,0xDE},
+ {0xAB,0xDF}, {0xAB,0xE1}, {0xAE,0x7D}, {0xAE,0x7C},
+ {0xAE,0x7B}, {0xD5,0x4F}, {0xB1,0x6F}, {0xB1,0x72},
+ {0xB1,0x70}, {0xD5,0x4E}, {0xB1,0x75}, {0xB1,0x71},
+ {0xD5,0x50}, {0xB1,0x74}, {0xB1,0x73}, {0xFA,0x61},
+ {0xD8,0xF6}, {0xD8,0xF5}, {0xFC,0x57}, {0xB4,0x61},
+ {0xB4,0x5F}, {0xB4,0x60}, {0xD8,0xF7}, {0xB7,0x4B},
+ {0xDD,0x64}, {0xB7,0x4C}, {0xDD,0x63}, {0x9B,0x70},
+ {0xE5,0x77}, {0xBC,0x78}, {0xE1,0xC1}, {0xBC,0x77},
+ {0xB9,0xFD}, {0xA0,0x51}, {0xEC,0xDE}, {0xE9,0x75},
+ {0xC0,0xB2}, {0xEC,0xDD}, {0xF2,0x40}, {0xF4,0x48},
+ {0xF4,0x49}, {0x8C,0x7C}, {0xA4,0xDF}, {0x8B,0xCB},
+ {0xA5,0xB2}, {0xC9,0x7B}, {0xA7,0xD2}, {0xA7,0xD4},
+ {0xC9,0xE2}, {0xCA,0xD8}, {0xCA,0xD7}, {0xCA,0xD6},
+ {0xC9,0xE1}, {0xC9,0xE0}, {0xA6,0xA4}, {0xA7,0xD3},
+ {0xA7,0xD1}, {0xA6,0xA3}, {0x93,0x6E}, {0xA9,0xBD},
+ {0xCC,0x78}, {0xFC,0xD5}, {0xA9,0xBE}, {0xCA,0xDD},
+ {0xCA,0xDF}, {0xCA,0xDE}, {0xCC,0x79}, {0xCA,0xDA},
+ {0xA7,0xD8}, {0xA7,0xD6}, {0xCA,0xD9}, {0xCA,0xDB},
+ {0xCA,0xE1}, {0xA7,0xD5}, {0xCA,0xDC}, {0xCA,0xE5},
+ {0xA9,0xC0}, {0xCA,0xE2}, {0xA7,0xD7}, {0xCA,0xE0},
+ {0xCA,0xE3}, {0xA9,0xBF}, {0xA9,0xC1}, {0xCA,0xE4},
+ {0xCC,0xAF}, {0xCC,0xA2}, {0xCC,0x7E}, {0xCC,0xAE},
+ {0xCC,0xA9}, {0xAB,0xE7}, {0xA9,0xC2}, {0xCC,0xAA},
+ {0xCC,0xAD}, {0xAB,0xE3}, {0xCC,0xAC}, {0xA9,0xC3},
+ {0xA9,0xC8}, {0xA9,0xC6}, {0xCC,0xA3}, {0xCC,0x7C},
+ {0xCC,0xA5}, {0xA9,0xCD}, {0xCC,0xB0}, {0xAB,0xE4},
+ {0xCC,0xA6}, {0xAB,0xE5}, {0xA9,0xC9}, {0xCC,0xA8},
+ {0xFC,0xA9}, {0xCE,0xCD}, {0xAB,0xE6}, {0xCC,0x7B},
+ {0xA9,0xCA}, {0xAB,0xE8}, {0xA9,0xCB}, {0xA9,0xC7},
+ {0xA9,0xCC}, {0xCC,0xA7}, {0xCC,0x7A}, {0xCC,0xAB},
+ {0xA9,0xC4}, {0xFC,0x61}, {0xCC,0x7D}, {0xCC,0xA4},
+ {0xCC,0xA1}, {0xA9,0xC5}, {0xCE,0xBF}, {0xCE,0xC0},
+ {0x89,0x66}, {0xCE,0xCA}, {0xD1,0xA1}, {0xCE,0xCB},
+ {0xAB,0xEE}, {0xCE,0xCE}, {0xCE,0xC4}, {0xAB,0xED},
+ {0xCE,0xC6}, {0xCE,0xC7}, {0xFA,0xCB}, {0xCE,0xC9},
+ {0xAB,0xE9}, {0xAE,0xA3}, {0xF9,0xDA}, {0xCE,0xC5},
+ {0xCE,0xC1}, {0xAE,0xA4}, {0xCE,0xCF}, {0xAE,0x7E},
+ {0xD1,0x7D}, {0xCE,0xC8}, {0xD1,0x7C}, {0xCE,0xC3},
+ {0xCE,0xCC}, {0xAB,0xEC}, {0xAE,0xA1}, {0xAB,0xF2},
+ {0xAE,0xA2}, {0xCE,0xD0}, {0xD1,0x7E}, {0xAB,0xEB},
+ {0xAE,0xA6}, {0xAB,0xF1}, {0xAB,0xF0}, {0xAB,0xEF},
+ {0xAE,0xA5}, {0xCE,0xD1}, {0xAE,0xA7}, {0xAB,0xEA},
+ {0xCE,0xC2}, {0x93,0x7A}, {0xA0,0xE0}, {0x93,0x6B},
+ {0xB1,0x76}, {0xD1,0xA4}, {0xD1,0xA6}, {0xD1,0xA8},
+ {0xAE,0xA8}, {0xAE,0xAE}, {0xD5,0x53}, {0xD1,0xAC},
+ {0xD1,0xA3}, {0xB1,0x78}, {0xD5,0x51}, {0xAE,0xAD},
+ {0xAE,0xAB}, {0xD1,0xAE}, {0xD5,0x52}, {0xD1,0xA5},
+ {0xAE,0xAC}, {0xD1,0xA9}, {0xAE,0xAF}, {0xD1,0xAB},
+ {0xAE,0xAA}, {0xD1,0xAA}, {0xD1,0xAD}, {0xD1,0xA7},
+ {0xFC,0x6B}, {0xAE,0xA9}, {0xB1,0x79}, {0xD1,0xA2},
+ {0xB1,0x77}, {0xA0,0xDC}, {0x94,0x68}, {0xB1,0x7A},
+ {0xD5,0x55}, {0xD5,0x5E}, {0xB4,0x64}, {0xFC,0x6D},
+ {0xB1,0x7C}, {0xB1,0xA3}, {0xB4,0x65}, {0xD5,0x60},
+ {0xB1,0xAA}, {0xD8,0xF9}, {0xD5,0x56}, {0xB1,0xA2},
+ {0xB1,0xA5}, {0xB1,0x7E}, {0xD5,0x54}, {0xD5,0x62},
+ {0xD5,0x65}, {0xD9,0x49}, {0xD5,0x63}, {0xD8,0xFD},
+ {0xB1,0xA1}, {0xB1,0xA8}, {0xB1,0xAC}, {0xD5,0x5D},
+ {0xD8,0xF8}, {0xD5,0x61}, {0xB1,0x7B}, {0xD8,0xFA},
+ {0xD5,0x64}, {0xD8,0xFC}, {0xD5,0x59}, {0xB4,0x62},
+ {0xD5,0x57}, {0xD5,0x58}, {0xB1,0xA7}, {0x8D,0x71},
+ {0xB1,0xA6}, {0xD5,0x5B}, {0xB1,0xAB}, {0xD5,0x5F},
+ {0xB1,0xA4}, {0xD5,0x5C}, {0xFD,0x64}, {0xB1,0xA9},
+ {0xB4,0x66}, {0xB4,0x63}, {0xD8,0xFB}, {0x99,0xBA},
+ {0xD5,0x5A}, {0xB1,0x7D}, {0x9A,0xD0}, {0x9A,0x61},
+ {0xA0,0xE5}, {0xB4,0x6B}, {0xB4,0x6F}, {0xD9,0x40},
+ {0xB7,0x51}, {0xB4,0x6D}, {0xD9,0x44}, {0xB4,0x71},
+ {0xDD,0x65}, {0xD9,0x46}, {0xB7,0x53}, {0xB4,0x69},
+ {0xB4,0x6C}, {0xD9,0x47}, {0xA0,0x5B}, {0xD9,0x48},
+ {0xD9,0x4E}, {0xB4,0x73}, {0xB7,0x54}, {0xD9,0x4A},
+ {0xD9,0x4F}, {0xD9,0x43}, {0xB7,0x5E}, {0x96,0xAC},
+ {0xB7,0x55}, {0xB4,0x72}, {0xD9,0x41}, {0xD9,0x50},
+ {0x97,0x40}, {0xB7,0x5D}, {0xB4,0x70}, {0xB7,0x4E},
+ {0xD9,0x4D}, {0xB4,0x74}, {0xD9,0x45}, {0xD8,0xFE},
+ {0xB4,0x6A}, {0xD9,0x42}, {0xD9,0x4B}, {0x9E,0xF1},
+ {0xB7,0x4D}, {0xB7,0x52}, {0xB4,0x67}, {0xD9,0x4C},
+ {0xB7,0x50}, {0x8C,0x4D}, {0xB4,0x68}, {0xB7,0x5C},
+ {0xE1,0xC3}, {0xDD,0x70}, {0xDD,0x68}, {0xE1,0xC2},
+ {0xDD,0x6C}, {0xDD,0x6E}, {0x9F,0x7E}, {0xDD,0x6B},
+ {0xB7,0x5B}, {0xDD,0x6A}, {0xB7,0x5F}, {0xE1,0xD2},
+ {0x8D,0x72}, {0xB7,0x5A}, {0xBA,0x40}, {0xDD,0x71},
+ {0xE1,0xC4}, {0xFC,0x76}, {0xB7,0x58}, {0xDD,0x69},
+ {0xDD,0x6D}, {0xB9,0xFE}, {0xB7,0x4F}, {0xDD,0x66},
+ {0xDD,0x67}, {0xBA,0x41}, {0xB7,0x57}, {0xB7,0x59},
+ {0xB7,0x56}, {0xDD,0x6F}, {0x96,0xA9}, {0xE1,0xC8},
+ {0xE1,0xC9}, {0xE1,0xCE}, {0xBC,0x7D}, {0xE1,0xD5},
+ {0xBA,0x47}, {0xA0,0x6E}, {0xBA,0x46}, {0xE1,0xD0},
+ {0xFC,0xAA}, {0xBC,0x7C}, {0xE1,0xC5}, {0xBA,0x45},
+ {0xFB,0xCD}, {0xE1,0xD4}, {0xBA,0x43}, {0xBA,0x44},
+ {0xFC,0x74}, {0xE1,0xD1}, {0xE5,0xAA}, {0xBC,0x7A},
+ {0xB4,0x6E}, {0xE1,0xD3}, {0xBC,0xA3}, {0xE1,0xCB},
+ {0xBC,0x7B}, {0xA0,0x74}, {0xBC,0xA2}, {0xE1,0xC6},
+ {0xE1,0xCA}, {0xE1,0xC7}, {0xE1,0xCD}, {0xBA,0x48},
+ {0xBC,0x79}, {0xBA,0x42}, {0xE5,0x7A}, {0xE1,0xCF},
+ {0xBC,0xA1}, {0xA0,0x71}, {0xBC,0xA4}, {0xE1,0xCC},
+ {0xFC,0x79}, {0xBC,0x7E}, {0xE5,0x79}, {0xFC,0x7C},
+ {0xE5,0x7E}, {0xBE,0xCE}, {0xE5,0x78}, {0xE9,0xA3},
+ {0xE5,0xA9}, {0xBC,0xA8}, {0xBC,0xA6}, {0xBE,0xCC},
+ {0xE5,0xA6}, {0xE5,0xA2}, {0xBC,0xAC}, {0x9C,0x50},
+ {0xE9,0x78}, {0x93,0x79}, {0x93,0x78}, {0xBC,0xAA},
+ {0xE5,0xA1}, {0xA0,0xDD}, {0xE9,0x76}, {0xE5,0xA5},
+ {0xE5,0xA8}, {0xE5,0x7D}, {0xBC,0xAB}, {0xBC,0xA5},
+ {0xE9,0x77}, {0xBE,0xCD}, {0xE5,0xA7}, {0xBC,0xA7},
+ {0xBC,0xA9}, {0xE5,0xA4}, {0xBC,0xAD}, {0xE5,0xA3},
+ {0xE5,0x7C}, {0xE5,0x7B}, {0xBE,0xCB}, {0xE5,0xAB},
+ {0xE9,0x7A}, {0xEC,0xE0}, {0xBE,0xD0}, {0x8D,0x75},
+ {0xE9,0xA2}, {0x8D,0x76}, {0xE9,0x7E}, {0xEC,0xE1},
+ {0xBE,0xD1}, {0xE9,0xA1}, {0x93,0x74}, {0xE9,0x7C},
+ {0xC0,0xB4}, {0xEC,0xDF}, {0xE9,0x79}, {0xE9,0x7B},
+ {0xC0,0xB5}, {0xBE,0xD3}, {0xC0,0xB3}, {0xBE,0xD2},
+ {0xC0,0xB7}, {0xE9,0x7D}, {0xBE,0xCF}, {0x8D,0x77},
+ {0xFC,0xA5}, {0xFC,0xA2}, {0xEF,0xCF}, {0xEF,0xC7},
+ {0x90,0xC3}, {0xEC,0xE7}, {0xEF,0xC8}, {0xEC,0xE3},
+ {0xA0,0x79}, {0xC2,0x56}, {0xEC,0xE5}, {0xEC,0xE4},
+ {0xC0,0xB6}, {0xEC,0xE2}, {0xEC,0xE6}, {0xEF,0xD0},
+ {0xEF,0xCC}, {0xEF,0xCE}, {0xEF,0xC9}, {0xEF,0xCA},
+ {0xEF,0xCD}, {0xEF,0xCB}, {0xC3,0x67}, {0xC3,0x6A},
+ {0xC3,0x69}, {0xC3,0x68}, {0xC4,0x61}, {0xF4,0x4A},
+ {0xC4,0x62}, {0xF2,0x41}, {0xC4,0xDF}, {0xF5,0xCC},
+ {0xC4,0xE0}, {0xC5,0x74}, {0xC5,0xCA}, {0xF7,0xD9},
+ {0xF7,0xDA}, {0xF7,0xDB}, {0xF9,0xBA}, {0xA4,0xE0},
+ {0xC9,0x7C}, {0xA5,0xB3}, {0xA6,0xA6}, {0xA6,0xA7},
+ {0xA6,0xA5}, {0xA6,0xA8}, {0xA7,0xDA}, {0xA7,0xD9},
+ {0xCC,0xB1}, {0xA9,0xCF}, {0xA9,0xCE}, {0xD1,0xAF},
+ {0xB1,0xAD}, {0xB1,0xAE}, {0xB4,0x75}, {0xDD,0x72},
+ {0xB7,0x60}, {0xB7,0x61}, {0xDD,0x74}, {0xDD,0x76},
+ {0xDD,0x75}, {0xE1,0xD7}, {0xE1,0xD6}, {0xBA,0x49},
+ {0xE1,0xD8}, {0x8D,0x79}, {0xE5,0xAC}, {0xBC,0xAE},
+ {0xBE,0xD4}, {0xC0,0xB8}, {0xC2,0x57}, {0xC0,0xB9},
+ {0xA4,0xE1}, {0x8B,0xFC}, {0xA0,0x76}, {0xCA,0xE6},
+ {0xCC,0xB2}, {0xA9,0xD1}, {0xA9,0xD0}, {0xA9,0xD2},
+ {0xAB,0xF3}, {0xCE,0xD2}, {0xCE,0xD3}, {0xD1,0xB0},
+ {0xAE,0xB0}, {0xB1,0xAF}, {0xB4,0x76}, {0xD9,0x51},
+ {0xA4,0xE2}, {0x8B,0xCD}, {0xA4,0x7E}, {0xA4,0xE3},
+ {0xC9,0x7D}, {0xA5,0xB7}, {0xA5,0xB6}, {0xA5,0xB4},
+ {0xA5,0xB5}, {0xA6,0xAB}, {0xC9,0xE9}, {0xC9,0xEB},
+ {0xA6,0xAA}, {0xC9,0xE3}, {0xC9,0xE4}, {0xC9,0xEA},
+ {0xC9,0xE6}, {0xC9,0xE8}, {0xA6,0xA9}, {0xC9,0xE5},
+ {0xC9,0xEC}, {0xC9,0xE7}, {0x9F,0x5A}, {0xA7,0xE1},
+ {0xA7,0xEA}, {0xA7,0xE8}, {0xCA,0xF0}, {0xCA,0xED},
+ {0xCA,0xF5}, {0xA7,0xE6}, {0xCA,0xF6}, {0xA7,0xDF},
+ {0xCA,0xF3}, {0xA7,0xE5}, {0xCA,0xEF}, {0xCA,0xEE},
+ {0xA7,0xE3}, {0xCA,0xF4}, {0xA7,0xE4}, {0xA9,0xD3},
+ {0xA7,0xDE}, {0xCA,0xF1}, {0x9F,0xF4}, {0xCA,0xE7},
+ {0xA7,0xDB}, {0x9F,0xBA}, {0xA7,0xEE}, {0xCA,0xEC},
+ {0xCA,0xF2}, {0xA7,0xE0}, {0xA7,0xE2}, {0xCA,0xE8},
+ {0xCA,0xE9}, {0xCA,0xEA}, {0x8D,0x7A}, {0xA7,0xED},
+ {0xA7,0xE7}, {0xA7,0xEC}, {0xCA,0xEB}, {0xA7,0xEB},
+ {0xA7,0xDD}, {0xA7,0xDC}, {0xA7,0xE9}, {0x9E,0x45},
+ {0x93,0xB0}, {0xA0,0x75}, {0xA9,0xE1}, {0xCC,0xBE},
+ {0xCC,0xB7}, {0xA9,0xDC}, {0xA9,0xEF}, {0xCC,0xB3},
+ {0xCC,0xBA}, {0xCC,0xBC}, {0xCC,0xBF}, {0xA9,0xEA},
+ {0xCC,0xBB}, {0xCC,0xB4}, {0xA9,0xE8}, {0xCC,0xB8},
+ {0xCC,0xC0}, {0xA9,0xD9}, {0xCC,0xBD}, {0xA9,0xE3},
+ {0xA9,0xE2}, {0xCC,0xB6}, {0xA9,0xD7}, {0xA9,0xD8},
+ {0x9B,0x46}, {0xA9,0xD6}, {0xFC,0xAE}, {0xA9,0xEE},
+ {0xA9,0xE6}, {0xA9,0xE0}, {0xA9,0xD4}, {0xCC,0xB9},
+ {0xA9,0xDF}, {0xA9,0xD5}, {0xA9,0xE7}, {0xA9,0xF0},
+ {0xCE,0xD4}, {0xA9,0xE4}, {0xCC,0xB5}, {0xA9,0xDA},
+ {0xA9,0xDD}, {0xA9,0xDE}, {0xFC,0xB0}, {0xA9,0xEC},
+ {0xA9,0xED}, {0xA9,0xEB}, {0xA9,0xE5}, {0xA9,0xE9},
+ {0xA9,0xDB}, {0xAB,0xF4}, {0xFA,0x51}, {0x8D,0x7B},
+ {0xCE,0xDA}, {0xAC,0x41}, {0xAB,0xF8}, {0xAB,0xFA},
+ {0xAC,0x40}, {0xCE,0xE6}, {0xAB,0xFD}, {0xD1,0xB1},
+ {0xAE,0xB1}, {0xAC,0x43}, {0xCE,0xD7}, {0xCE,0xDF},
+ {0xAB,0xFE}, {0xCE,0xDE}, {0xCE,0xDB}, {0xCE,0xE3},
+ {0xCE,0xE5}, {0xAB,0xF7}, {0xAB,0xFB}, {0xAC,0x42},
+ {0xAE,0xB3}, {0xCE,0xE0}, {0xAB,0xF9}, {0xAC,0x45},
+ {0xCE,0xD9}, {0xAB,0xFC}, {0xAE,0xB2}, {0xAB,0xF6},
+ {0xCE,0xD6}, {0xCE,0xDD}, {0xCE,0xD5}, {0xCE,0xD8},
+ {0xCE,0xDC}, {0xD1,0xB2}, {0xAC,0x44}, {0xCE,0xE1},
+ {0xCE,0xE2}, {0xCE,0xE4}, {0xAB,0xF5}, {0x8D,0x7C},
+ {0xAE,0xC1}, {0xD1,0xBE}, {0xAE,0xBF}, {0xAE,0xC0},
+ {0xD1,0xB4}, {0xD1,0xC4}, {0x9E,0xD6}, {0xAE,0xB6},
+ {0x93,0xAC}, {0xD5,0x66}, {0xD1,0xC6}, {0xD1,0xC0},
+ {0x9F,0x5B}, {0xD1,0xB7}, {0x93,0xA9}, {0xD1,0xC9},
+ {0xD1,0xBA}, {0xAE,0xBC}, {0xD5,0x7D}, {0xD1,0xBD},
+ {0xAE,0xBE}, {0xAE,0xB5}, {0xD1,0xCB}, {0xD1,0xBF},
+ {0xAE,0xB8}, {0xD1,0xB8}, {0xD1,0xB5}, {0xD1,0xB6},
+ {0xAE,0xB9}, {0xD1,0xC5}, {0xD1,0xCC}, {0xAE,0xBB},
+ {0xD1,0xBC}, {0xD1,0xBB}, {0xAE,0xC3}, {0xAE,0xC2},
+ {0xAE,0xB4}, {0xAE,0xBA}, {0xAE,0xBD}, {0xD1,0xC8},
+ {0xD1,0xC2}, {0xAE,0xB7}, {0xD1,0xB3}, {0xD1,0xCA},
+ {0xD1,0xC1}, {0xD1,0xC3}, {0xD1,0xC7}, {0xA0,0x7C},
+ {0xD5,0x67}, {0xB1,0xB7}, {0xB1,0xCB}, {0xB1,0xCA},
+ {0xB1,0xBF}, {0xFC,0xB2}, {0xD5,0x79}, {0xD5,0x75},
+ {0xD5,0x72}, {0xD5,0xA6}, {0xB1,0xBA}, {0xB1,0xB2},
+ {0xD5,0x77}, {0xB4,0xA8}, {0xB1,0xB6}, {0xD5,0xA1},
+ {0x8A,0xC1}, {0xB1,0xCC}, {0xB1,0xC9}, {0xD5,0x7B},
+ {0xD5,0x6A}, {0x9F,0xB4}, {0xB1,0xC8}, {0xD5,0xA3},
+ {0xD5,0x69}, {0xB1,0xBD}, {0xB1,0xC1}, {0xD5,0xA2},
+ {0xD5,0x73}, {0xB1,0xC2}, {0xB1,0xBC}, {0xD5,0x68},
+ {0xFC,0xAC}, {0xB4,0x78}, {0xD5,0xA5}, {0xD5,0x71},
+ {0xB1,0xC7}, {0xD5,0x74}, {0xD5,0xA4}, {0xB1,0xC6},
+ {0xD9,0x52}, {0xB1,0xB3}, {0xD5,0x6F}, {0xB1,0xB8},
+ {0xB1,0xC3}, {0xB1,0xBE}, {0xD5,0x78}, {0xD5,0x6E},
+ {0xD5,0x6C}, {0xD5,0x7E}, {0xB1,0xB0}, {0xB1,0xC4},
+ {0xB1,0xB4}, {0xB4,0x77}, {0xD5,0x7C}, {0xB1,0xB5},
+ {0xB1,0xB1}, {0xB1,0xC0}, {0xB1,0xBB}, {0xB1,0xB9},
+ {0xD5,0x70}, {0xB1,0xC5}, {0xD5,0x6D}, {0xD5,0x7A},
+ {0xD5,0x76}, {0xD9,0x54}, {0xD9,0x53}, {0x9E,0x4C},
+ {0xD5,0x6B}, {0xD9,0x64}, {0xB4,0x7A}, {0x8F,0xC5},
+ {0xD9,0x6A}, {0xD9,0x59}, {0xD9,0x67}, {0xDD,0x77},
+ {0xB4,0x7D}, {0xD9,0x6B}, {0xD9,0x6E}, {0xB4,0x7C},
+ {0xD9,0x5C}, {0xD9,0x6D}, {0xD9,0x6C}, {0xB4,0x7E},
+ {0xD9,0x55}, {0xB4,0x79}, {0xB4,0xA3}, {0x93,0xAD},
+ {0xB4,0xA1}, {0xD9,0x69}, {0xD9,0x5F}, {0xB4,0xA5},
+ {0xD9,0x70}, {0xD9,0x68}, {0xD9,0x71}, {0xB4,0xAD},
+ {0xB4,0xAB}, {0xD9,0x66}, {0xD9,0x65}, {0x9D,0xC3},
+ {0xD9,0x63}, {0xD9,0x5D}, {0xB4,0xA4}, {0x8D,0xA2},
+ {0xB4,0xA2}, {0xD1,0xB9}, {0xD9,0x56}, {0x9D,0x4A},
+ {0xDD,0xB7}, {0xD9,0x57}, {0xB4,0x7B}, {0xB4,0xAA},
+ {0xDD,0x79}, {0xB4,0xA6}, {0xB4,0xA7}, {0xD9,0x58},
+ {0xD9,0x6F}, {0xDD,0x78}, {0xD9,0x60}, {0xD9,0x5B},
+ {0xB4,0xA9}, {0xD9,0x61}, {0xD9,0x5E}, {0xFC,0xB6},
+ {0xB4,0xAE}, {0x8D,0xA3}, {0x9E,0x4B}, {0x9E,0x4D},
+ {0xB7,0x70}, {0x8D,0xA4}, {0xDD,0x7C}, {0xDD,0xB1},
+ {0xDD,0xB6}, {0xDD,0xAA}, {0xB7,0x6C}, {0xDD,0xBB},
+ {0xB7,0x69}, {0xDD,0x7A}, {0xDD,0x7B}, {0xB7,0x62},
+ {0xB7,0x6B}, {0xDD,0xA4}, {0xB7,0x6E}, {0xB7,0x6F},
+ {0xDD,0xA5}, {0xDD,0xB2}, {0xDD,0xB8}, {0xB7,0x6A},
+ {0xB7,0x64}, {0xDD,0xA3}, {0xDD,0x7D}, {0xDD,0xBA},
+ {0xDD,0xA8}, {0xDD,0xA9}, {0xDD,0x7E}, {0xDD,0xB4},
+ {0xDD,0xAB}, {0xDD,0xB5}, {0xDD,0xAD}, {0xB7,0x65},
+ {0xE1,0xD9}, {0xB7,0x68}, {0xB7,0x66}, {0xDD,0xB9},
+ {0xDD,0xB0}, {0xDD,0xAC}, {0x8A,0xFD}, {0xDD,0xA1},
+ {0xBA,0x53}, {0xDD,0xAF}, {0xB7,0x6D}, {0xDD,0xA7},
+ {0xFC,0xB5}, {0xDD,0xA6}, {0xFC,0xC3}, {0x93,0xB2},
+ {0xB7,0x67}, {0xB7,0x63}, {0xE1,0xEE}, {0xDD,0xB3},
+ {0xDD,0xAE}, {0xDD,0xA2}, {0xE1,0xE9}, {0xE1,0xDA},
+ {0xE1,0xE5}, {0xE1,0xEC}, {0xBA,0x51}, {0xB4,0xAC},
+ {0xE1,0xEA}, {0xBA,0x4C}, {0xBA,0x4B}, {0xE1,0xF1},
+ {0x8D,0xA5}, {0xE1,0xDB}, {0xE1,0xE8}, {0xE1,0xDC},
+ {0xE1,0xE7}, {0xBA,0x4F}, {0xE1,0xEB}, {0xD9,0x62},
+ {0xE1,0xF2}, {0xE1,0xE3}, {0xBA,0x52}, {0xE5,0xBA},
+ {0xBC,0xAF}, {0xE1,0xF0}, {0xE1,0xEF}, {0xBA,0x54},
+ {0xE5,0xAD}, {0xBC,0xB0}, {0xE5,0xAE}, {0x93,0xA1},
+ {0xE1,0xDF}, {0xE1,0xE0}, {0xE1,0xDD}, {0xE1,0xE2},
+ {0xE1,0xDE}, {0xE1,0xF3}, {0xBA,0x4E}, {0xBC,0xB1},
+ {0xBA,0x50}, {0xBA,0x55}, {0x8A,0xC6}, {0xE1,0xE1},
+ {0xE1,0xED}, {0xE1,0xE6}, {0xE5,0xB1}, {0xBA,0x4A},
+ {0xBC,0xB4}, {0xE9,0xAA}, {0xE5,0xB6}, {0xE5,0xB5},
+ {0xE5,0xB7}, {0x8A,0x5B}, {0xE5,0xB4}, {0xBC,0xB5},
+ {0x89,0x4D}, {0xBC,0xBB}, {0xBC,0xB8}, {0xBC,0xB9},
+ {0xE5,0xAF}, {0xE5,0xB2}, {0xE5,0xBC}, {0xBC,0xC1},
+ {0xBC,0xBF}, {0xE5,0xB3}, {0xD9,0x5A}, {0xBC,0xB2},
+ {0xE5,0xB9}, {0xE5,0xB0}, {0xBC,0xC2}, {0xE5,0xB8},
+ {0xBA,0x4D}, {0xBC,0xB7}, {0xE1,0xE4}, {0xBC,0xBA},
+ {0xBC,0xBE}, {0xBC,0xC0}, {0xBC,0xBD}, {0xBC,0xBC},
+ {0xFE,0xD4}, {0xBC,0xB6}, {0xE5,0xBB}, {0xBC,0xB3},
+ {0xBC,0xC3}, {0x8A,0x78}, {0x93,0xAB}, {0xBE,0xD8},
+ {0xBE,0xD9}, {0xE9,0xA9}, {0xBE,0xE2}, {0xBE,0xDF},
+ {0x8D,0xA7}, {0xBE,0xD6}, {0xBE,0xDD}, {0xE9,0xAB},
+ {0xBE,0xDB}, {0xBE,0xD5}, {0xBE,0xDC}, {0xE9,0xA8},
+ {0xC0,0xBB}, {0xBE,0xD7}, {0xBE,0xDE}, {0xC0,0xBA},
+ {0xE9,0xA7}, {0xE9,0xA6}, {0xBE,0xE0}, {0x9F,0x45},
+ {0xBE,0xE1}, {0xE9,0xA5}, {0xE9,0xA4}, {0xC0,0xBC},
+ {0xE9,0xAE}, {0xBE,0xDA}, {0xE9,0xAC}, {0x8A,0x56},
+ {0xC0,0xBD}, {0xFC,0xBF}, {0xC0,0xC2}, {0xEC,0xEA},
+ {0xEC,0xEC}, {0xFC,0xC0}, {0xC0,0xBF}, {0x8E,0xE6},
+ {0xEC,0xED}, {0xEC,0xE9}, {0x8A,0xA4}, {0xEC,0xEB},
+ {0xC0,0xC0}, {0xC0,0xC3}, {0xEC,0xE8}, {0xC0,0xBE},
+ {0xC0,0xC1}, {0xC2,0x59}, {0xE9,0xAD}, {0xC2,0x58},
+ {0xC2,0x5E}, {0xEF,0xD4}, {0xC2,0x5C}, {0xC2,0x5D},
+ {0xEF,0xD7}, {0xEF,0xD3}, {0xC2,0x5A}, {0xEF,0xD1},
+ {0xC3,0x6B}, {0xEF,0xD5}, {0xEF,0xD6}, {0xEF,0xD2},
+ {0xC2,0x5B}, {0xF2,0x42}, {0xF2,0x45}, {0x89,0x43},
+ {0xF2,0x46}, {0xF2,0x44}, {0xF2,0x47}, {0xC3,0x6C},
+ {0xF2,0x43}, {0x93,0xF3}, {0xF4,0x4E}, {0xC4,0x64},
+ {0xF4,0x4D}, {0xF4,0x4C}, {0xF4,0x4B}, {0xC4,0x63},
+ {0xC4,0x65}, {0xF5,0xCD}, {0xC4,0xE2}, {0xC4,0xE1},
+ {0xFC,0xAB}, {0x9E,0xA2}, {0xF6,0xE1}, {0xF6,0xE0},
+ {0xF6,0xE3}, {0xC5,0xCB}, {0xC5,0x75}, {0xF7,0xDD},
+ {0xF6,0xE2}, {0xF7,0xDC}, {0xC5,0xCD}, {0xC5,0xCC},
+ {0xC5,0xF3}, {0xF8,0xA9}, {0xF8,0xEF}, {0xA4,0xE4},
+ {0x9D,0xC7}, {0xD9,0x72}, {0xE9,0xAF}, {0xC6,0xD2},
+ {0x8B,0xCE}, {0xA6,0xAC}, {0xCA,0xF7}, {0xA7,0xF1},
+ {0xA7,0xEF}, {0xA7,0xF0}, {0xCC,0xC1}, {0xA9,0xF1},
+ {0xAC,0x46}, {0xCE,0xE7}, {0xCE,0xE8}, {0xAC,0x47},
+ {0xD1,0xCE}, {0xAE,0xC4}, {0xAE,0xC5}, {0xD1,0xCD},
+ {0xFC,0xC5}, {0xB1,0xD3}, {0xB1,0xCF}, {0xD5,0xA7},
+ {0xB1,0xD6}, {0xB1,0xD5}, {0xB1,0xCE}, {0xB1,0xD1},
+ {0xB1,0xD4}, {0xB1,0xD0}, {0xD9,0x76}, {0xB1,0xCD},
+ {0xB4,0xAF}, {0xFC,0xCB}, {0xB4,0xB1}, {0xB4,0xB2},
+ {0xD9,0x75}, {0xD9,0x78}, {0xB4,0xB0}, {0xD9,0x73},
+ {0xD9,0x77}, {0xD9,0x74}, {0x93,0xB3}, {0xB7,0x71},
+ {0xFC,0xCA}, {0xDD,0xBC}, {0xBA,0x56}, {0xE1,0xF4},
+ {0xBE,0xE3}, {0xBC,0xC4}, {0xE5,0xBD}, {0xBC,0xC5},
+ {0xBC,0xC6}, {0xE5,0xBF}, {0xE5,0xBE}, {0xE5,0xC0},
+ {0xE9,0xB1}, {0xE9,0xB0}, {0xEC,0xEF}, {0xEC,0xEE},
+ {0xC0,0xC4}, {0xC0,0xC5}, {0xF2,0x48}, {0xFC,0xC9},
+ {0x8D,0xAC}, {0xA4,0xE5}, {0xFB,0xC6}, {0x89,0x67},
+ {0x8C,0x7E}, {0xD9,0x79}, {0xB4,0xB4}, {0xB4,0xB3},
+ {0xDD,0xBD}, {0xEF,0xD8}, {0xC4,0xE3}, {0xF7,0xDE},
+ {0xA4,0xE6}, {0xAE,0xC6}, {0xB1,0xD8}, {0xB1,0xD7},
+ {0xD9,0x7A}, {0xD9,0x7B}, {0xB7,0x72}, {0xE1,0xF5},
+ {0xBA,0x57}, {0xE9,0xB2}, {0xA4,0xE7}, {0xA5,0xB8},
+ {0xA9,0xF2}, {0xCC,0xC2}, {0xCE,0xE9}, {0xAC,0x48},
+ {0xB1,0xD9}, {0xD9,0x7C}, {0xB4,0xB5}, {0xB7,0x73},
+ {0xE5,0xC1}, {0xE5,0xC2}, {0xFC,0xCD}, {0xEC,0xF0},
+ {0xC2,0x5F}, {0xF8,0xF0}, {0xA4,0xE8}, {0xCC,0xC3},
+ {0xA9,0xF3}, {0xAC,0x49}, {0x9C,0xF3}, {0xCE,0xEA},
+ {0xAE,0xC7}, {0xD1,0xD2}, {0xD1,0xD0}, {0xD1,0xD1},
+ {0xAE,0xC8}, {0xD1,0xCF}, {0xB1,0xDB}, {0xB1,0xDC},
+ {0xD5,0xA8}, {0xB1,0xDD}, {0xB1,0xDA}, {0xD9,0x7D},
+ {0xFC,0xD0}, {0xD9,0x7E}, {0xDD,0xBE}, {0x95,0xBB},
+ {0xBA,0x59}, {0xBA,0x58}, {0xEC,0xF1}, {0xEF,0xD9},
+ {0xF2,0x4A}, {0xF2,0x49}, {0xF4,0x4F}, {0xFC,0xD3},
+ {0xC9,0x5E}, {0xAC,0x4A}, {0xFC,0xD4}, {0xA4,0xE9},
+ {0xA5,0xB9}, {0xA6,0xAE}, {0xA6,0xAD}, {0xA6,0xAF},
+ {0xA6,0xB0}, {0xC9,0xEE}, {0xC9,0xED}, {0xCA,0xF8},
+ {0xA7,0xF2}, {0xCA,0xFB}, {0xCA,0xFA}, {0xCA,0xF9},
+ {0xCA,0xFC}, {0xA9,0xF4}, {0xCC,0xC9}, {0xCC,0xC5},
+ {0xCC,0xCE}, {0x8D,0xAE}, {0xA9,0xFB}, {0xA9,0xF9},
+ {0xCC,0xCA}, {0xCC,0xC6}, {0xCC,0xCD}, {0xA9,0xF8},
+ {0xAA,0x40}, {0xCC,0xC8}, {0xCC,0xC4}, {0xA9,0xFE},
+ {0xCC,0xCB}, {0xA9,0xF7}, {0xCC,0xCC}, {0xA9,0xFA},
+ {0xA9,0xFC}, {0xCC,0xD0}, {0xCC,0xCF}, {0xCC,0xC7},
+ {0xA9,0xF6}, {0xA9,0xF5}, {0xA9,0xFD}, {0xFC,0xD7},
+ {0xCE,0xEF}, {0xCE,0xF5}, {0x93,0xDB}, {0xAC,0x50},
+ {0xAC,0x4D}, {0xCE,0xEC}, {0xCE,0xF1}, {0xFE,0x63},
+ {0xAC,0x53}, {0xAC,0x4B}, {0xCE,0xF0}, {0xAC,0x4E},
+ {0xAC,0x51}, {0xCE,0xF3}, {0xAC,0x4C}, {0xCE,0xF8},
+ {0xAC,0x4F}, {0x93,0xD5}, {0xAC,0x52}, {0xCE,0xED},
+ {0xCE,0xF2}, {0xCE,0xF6}, {0xCE,0xEE}, {0xCE,0xEB},
+ {0xCE,0xF7}, {0xCE,0xF4}, {0xAE,0xD0}, {0xAE,0xC9},
+ {0xAE,0xCC}, {0xFC,0xDA}, {0xAE,0xCF}, {0xD1,0xD5},
+ {0x9B,0x71}, {0xAE,0xCA}, {0xD1,0xD3}, {0xFC,0xDD},
+ {0xAE,0xCE}, {0xAE,0xCB}, {0xD1,0xD6}, {0xAE,0xCD},
+ {0x8D,0xAF}, {0xFA,0xF2}, {0xD5,0xAC}, {0xB1,0xDF},
+ {0xD5,0xAB}, {0xD5,0xAD}, {0xB1,0xDE}, {0xB1,0xE3},
+ {0xD1,0xD4}, {0xD5,0xAA}, {0xD5,0xAE}, {0x93,0xD8},
+ {0xB1,0xE0}, {0xD5,0xA9}, {0xB1,0xE2}, {0xFC,0xDF},
+ {0xB1,0xE1}, {0xD9,0xA7}, {0x93,0xD3}, {0xD9,0xA2},
+ {0xB4,0xB6}, {0xB4,0xBA}, {0xB4,0xB7}, {0xD9,0xA5},
+ {0xD9,0xA8}, {0xFC,0xE1}, {0xB4,0xB8}, {0xB4,0xB9},
+ {0xB4,0xBE}, {0xDD,0xC7}, {0xD9,0xA6}, {0xB4,0xBC},
+ {0xD9,0xA3}, {0xD9,0xA1}, {0x8E,0x76}, {0xB4,0xBD},
+ {0xD9,0xA4}, {0xB7,0x79}, {0xFC,0x62}, {0xDD,0xBF},
+ {0xB7,0x76}, {0xB7,0x77}, {0xB7,0x75}, {0xDD,0xC4},
+ {0xDD,0xC3}, {0xDD,0xC0}, {0xB7,0x7B}, {0x93,0xD1},
+ {0xDD,0xC2}, {0xB4,0xBB}, {0x8D,0xB1}, {0xDD,0xC6},
+ {0xDD,0xC1}, {0xB7,0x78}, {0xB7,0x74}, {0xB7,0x7A},
+ {0xDD,0xC5}, {0x98,0x59}, {0xBA,0x5C}, {0xE1,0xF8},
+ {0xE1,0xF7}, {0xE1,0xF6}, {0xBA,0x5A}, {0xFB,0x52},
+ {0xBA,0x5B}, {0xE5,0xC5}, {0xE5,0xC8}, {0xBC,0xC8},
+ {0xFB,0x53}, {0xBC,0xC7}, {0xE5,0xC9}, {0xE5,0xC4},
+ {0xBC,0xCA}, {0xE5,0xC6}, {0xFB,0x4D}, {0xBC,0xC9},
+ {0xE5,0xC3}, {0x9C,0xBF}, {0xE5,0xC7}, {0xBE,0xE9},
+ {0xBE,0xE6}, {0xE9,0xBB}, {0xE9,0xBA}, {0xE9,0xB9},
+ {0xE9,0xB4}, {0x9B,0x72}, {0xE9,0xB5}, {0xBE,0xE7},
+ {0xBE,0xE4}, {0xBE,0xE8}, {0xE9,0xB3}, {0xBE,0xE5},
+ {0xE9,0xB6}, {0xE9,0xB7}, {0xE9,0xBC}, {0xFB,0x50},
+ {0x93,0xBE}, {0xE9,0xB8}, {0xEC,0xF2}, {0xC0,0xC7},
+ {0xEF,0xDC}, {0xC0,0xC6}, {0xEF,0xDA}, {0xEF,0xDB},
+ {0xC2,0x60}, {0xC3,0x6E}, {0xF2,0x4B}, {0xC3,0x6D},
+ {0xF4,0x51}, {0xF4,0x52}, {0xC4,0x66}, {0xF4,0x50},
+ {0xC4,0xE4}, {0xF7,0xDF}, {0xC5,0xCE}, {0xF8,0xAA},
+ {0xF8,0xAB}, {0xA4,0xEA}, {0x9D,0xF1}, {0xA6,0xB1},
+ {0xA6,0xB2}, {0xA7,0xF3}, {0xCC,0xD1}, {0xAC,0x54},
+ {0xAE,0xD1}, {0xB1,0xE4}, {0xB0,0xD2}, {0xB4,0xBF},
+ {0xB4,0xC0}, {0xB3,0xCC}, {0xD9,0xA9}, {0xFC,0xEB},
+ {0xB7,0x7C}, {0xE1,0xFA}, {0xE1,0xF9}, {0xA4,0xEB},
+ {0xA6,0xB3}, {0xCC,0xD2}, {0xAA,0x42}, {0xA0,0xBB},
+ {0xAA,0x41}, {0x9B,0x7E}, {0xCE,0xF9}, {0xCE,0xFA},
+ {0xD1,0xD7}, {0xD1,0xD8}, {0xAE,0xD2}, {0xAE,0xD3},
+ {0x8D,0xB3}, {0xAE,0xD4}, {0xD5,0xAF}, {0x8C,0x52},
+ {0xB1,0xE6}, {0xB4,0xC2}, {0x9A,0xE8}, {0xB4,0xC1},
+ {0xDD,0xC8}, {0xDF,0x7A}, {0xE1,0xFB}, {0xE9,0xBD},
+ {0x8E,0xDC}, {0xC2,0x61}, {0xC4,0x67}, {0xA4,0xEC},
+ {0xA5,0xBC}, {0xA5,0xBD}, {0xA5,0xBB}, {0xA5,0xBE},
+ {0xA5,0xBA}, {0xA6,0xB6}, {0xC9,0xF6}, {0xA6,0xB5},
+ {0xA6,0xB7}, {0x9C,0xF9}, {0xC9,0xF1}, {0xC9,0xF0},
+ {0xC9,0xF3}, {0xC9,0xF2}, {0xC9,0xF5}, {0xA6,0xB4},
+ {0xC9,0xEF}, {0xC9,0xF4}, {0xFA,0x50}, {0xCA,0xFD},
+ {0xA7,0xFD}, {0xCA,0xFE}, {0xCB,0x43}, {0xA7,0xFC},
+ {0xCB,0x47}, {0xCB,0x42}, {0xCB,0x45}, {0xA7,0xF5},
+ {0xA7,0xF6}, {0xA7,0xF7}, {0xA7,0xF8}, {0xA8,0x40},
+ {0xCB,0x41}, {0xA7,0xFA}, {0xA8,0x41}, {0xCB,0x40},
+ {0xCB,0x46}, {0xA7,0xF9}, {0xCB,0x44}, {0xA7,0xFB},
+ {0xA7,0xF4}, {0xA7,0xFE}, {0x98,0xE7}, {0xFC,0xF3},
+ {0xFC,0xF2}, {0xAA,0x57}, {0x8C,0xCA}, {0xCC,0xD4},
+ {0xAA,0x43}, {0xAA,0x4D}, {0xAA,0x4E}, {0xAA,0x46},
+ {0xAA,0x58}, {0xAA,0x48}, {0xCC,0xDC}, {0xAA,0x53},
+ {0xCC,0xD7}, {0xAA,0x49}, {0xCC,0xE6}, {0xCC,0xE7},
+ {0xCC,0xDF}, {0xCC,0xD8}, {0xAA,0x56}, {0xCC,0xE4},
+ {0xAA,0x51}, {0xAA,0x4F}, {0xCC,0xE5}, {0xCC,0xE3},
+ {0xCC,0xDB}, {0xCC,0xD3}, {0xCC,0xDA}, {0xAA,0x4A},
+ {0xAA,0x50}, {0xAA,0x44}, {0xCC,0xDE}, {0xCC,0xDD},
+ {0xCC,0xD5}, {0x93,0xE5}, {0xAA,0x52}, {0xCC,0xE1},
+ {0xCC,0xD6}, {0xAA,0x55}, {0xCC,0xE8}, {0xAA,0x45},
+ {0xAA,0x4C}, {0xCC,0xD9}, {0xCC,0xE2}, {0xAA,0x54},
+ {0xAA,0x47}, {0xAA,0x4B}, {0xCC,0xE0}, {0x9A,0x59},
+ {0x8D,0xB5}, {0xFD,0x4D}, {0xCF,0x5B}, {0xAC,0x5C},
+ {0xAC,0x69}, {0xFD,0x5E}, {0xCF,0x56}, {0xCF,0x4C},
+ {0xAC,0x62}, {0xCF,0x4A}, {0xAC,0x5B}, {0xCF,0x45},
+ {0xAC,0x65}, {0xCF,0x52}, {0xCE,0xFE}, {0xCF,0x41},
+ {0x8F,0x7D}, {0xCF,0x44}, {0xCE,0xFB}, {0xCF,0x51},
+ {0xCF,0x61}, {0xAC,0x60}, {0xCF,0x46}, {0xCF,0x58},
+ {0xCE,0xFD}, {0xCF,0x5F}, {0xCF,0x60}, {0xCF,0x63},
+ {0xCF,0x5A}, {0xCF,0x4B}, {0xCF,0x53}, {0xAC,0x66},
+ {0xAC,0x59}, {0xAC,0x61}, {0xAC,0x6D}, {0xAC,0x56},
+ {0xAC,0x58}, {0x95,0x47}, {0xFC,0xF6}, {0xCF,0x43},
+ {0xAC,0x6A}, {0xAC,0x63}, {0xCF,0x5D}, {0xCF,0x40},
+ {0xAC,0x6C}, {0xAC,0x67}, {0xCF,0x49}, {0xAC,0x6B},
+ {0xCF,0x50}, {0xCF,0x48}, {0xAC,0x64}, {0xCF,0x5C},
+ {0xCF,0x54}, {0xAC,0x5E}, {0xCF,0x62}, {0xCF,0x47},
+ {0xAC,0x5A}, {0xCF,0x59}, {0xCF,0x4F}, {0xAC,0x5F},
+ {0xCF,0x55}, {0xAC,0x57}, {0xCE,0xFC}, {0xAC,0x68},
+ {0xAE,0xE3}, {0xAC,0x5D}, {0xCF,0x4E}, {0xCF,0x4D},
+ {0xCF,0x42}, {0x92,0x50}, {0xCF,0x5E}, {0xCF,0x57},
+ {0x89,0x68}, {0xAC,0x55}, {0x8D,0xB6}, {0xFC,0xFB},
+ {0xA0,0x7D}, {0x98,0xFC}, {0x89,0x69}, {0xFE,0x4F},
+ {0x92,0x56}, {0xD1,0xEC}, {0xAE,0xEA}, {0xD1,0xED},
+ {0xD1,0xE1}, {0xAE,0xDF}, {0xAE,0xEB}, {0xD1,0xDA},
+ {0xFA,0xC9}, {0xD1,0xE3}, {0xD1,0xEB}, {0x93,0xE8},
+ {0xD1,0xD9}, {0xD1,0xF4}, {0xAE,0xD5}, {0xFC,0xF8},
+ {0xD1,0xF3}, {0xD1,0xEE}, {0xD1,0xEF}, {0xAE,0xDD},
+ {0xAE,0xE8}, {0xD1,0xE5}, {0xD1,0xE6}, {0xD1,0xF0},
+ {0xD1,0xE7}, {0xD1,0xE2}, {0xD1,0xDC}, {0xD1,0xDD},
+ {0xD1,0xEA}, {0xD1,0xE4}, {0x9C,0xE3}, {0xFD,0xA9},
+ {0xAE,0xD6}, {0xAE,0xDA}, {0xD1,0xF2}, {0xD1,0xDE},
+ {0xAE,0xE6}, {0xAE,0xE2}, {0xFC,0x44}, {0xAE,0xE5},
+ {0xAE,0xEC}, {0xAE,0xDB}, {0xAE,0xE7}, {0xD1,0xE9},
+ {0xAE,0xE9}, {0xAE,0xD8}, {0x96,0x40}, {0xAE,0xD7},
+ {0xD1,0xDB}, {0x8D,0xB8}, {0xD1,0xDF}, {0xAE,0xE0},
+ {0xD1,0xF1}, {0xD1,0xE8}, {0xD1,0xE0}, {0xAE,0xE4},
+ {0xAE,0xE1}, {0xAE,0xD9}, {0xAE,0xDC}, {0x9B,0x4A},
+ {0x8F,0xB9}, {0xFC,0xFE}, {0x89,0x6A}, {0xD5,0xC4},
+ {0xD5,0xB4}, {0xD5,0xB5}, {0xD5,0xB9}, {0xD5,0xC8},
+ {0xD5,0xC5}, {0xD5,0xBE}, {0xD5,0xBD}, {0xB1,0xED},
+ {0xD5,0xC1}, {0xD5,0xD0}, {0xD5,0xB0}, {0xD5,0xD1},
+ {0xD5,0xC3}, {0xD5,0xD5}, {0xD5,0xC9}, {0xB1,0xEC},
+ {0xD5,0xC7}, {0xB1,0xE7}, {0xB1,0xFC}, {0xB1,0xF2},
+ {0x8D,0xB9}, {0xB1,0xF6}, {0xB1,0xF5}, {0xD5,0xB1},
+ {0x91,0x7E}, {0xD5,0xCE}, {0xD5,0xD4}, {0xD5,0xCC},
+ {0xD5,0xD3}, {0xD5,0xC0}, {0xD5,0xB2}, {0xD5,0xD2},
+ {0xD5,0xC2}, {0xB1,0xEA}, {0xB1,0xF7}, {0xD5,0xCB},
+ {0xB1,0xF0}, {0x93,0xF4}, {0xD5,0xCA}, {0xD5,0xB3},
+ {0xB1,0xF8}, {0xB1,0xFA}, {0xD5,0xCD}, {0xB1,0xFB},
+ {0xB1,0xE9}, {0xD5,0xBA}, {0xD5,0xCF}, {0xFB,0x7C},
+ {0xB1,0xEF}, {0xB1,0xF9}, {0xD5,0xBC}, {0xD5,0xC6},
+ {0xD5,0xB7}, {0xD5,0xBB}, {0xB1,0xF4}, {0xD5,0xB6},
+ {0xB1,0xE8}, {0xB1,0xF1}, {0xB1,0xEE}, {0xD5,0xBF},
+ {0xAE,0xDE}, {0xD9,0xC0}, {0xB1,0xEB}, {0x93,0xE7},
+ {0x97,0xEF}, {0xFE,0x4A}, {0xFD,0x45}, {0xB1,0xF3},
+ {0x96,0xA5}, {0xD9,0xC3}, {0xD9,0xD9}, {0xD9,0xCE},
+ {0xB4,0xD6}, {0xFE,0xE0}, {0xB4,0xD1}, {0xD9,0xBD},
+ {0xB4,0xD2}, {0xD9,0xCD}, {0xD9,0xC6}, {0xD9,0xD3},
+ {0xB4,0xCE}, {0xD9,0xAB}, {0xD9,0xD5}, {0xB4,0xC4},
+ {0xD9,0xB3}, {0xB4,0xC7}, {0xB4,0xC6}, {0xB4,0xD7},
+ {0xD9,0xAD}, {0xD9,0xCF}, {0xD9,0xD0}, {0xB4,0xC9},
+ {0xB4,0xC5}, {0xD9,0xBB}, {0xB4,0xD0}, {0xD9,0xB6},
+ {0xD9,0xD1}, {0xB4,0xCC}, {0xD9,0xC9}, {0xD9,0xD6},
+ {0xD9,0xB0}, {0xD9,0xB5}, {0xD9,0xAF}, {0xB4,0xCB},
+ {0xD9,0xC2}, {0xDD,0xDE}, {0xD9,0xB1}, {0xB4,0xCF},
+ {0xD9,0xBA}, {0xD9,0xD2}, {0xB4,0xCA}, {0xD9,0xB7},
+ {0xD9,0xB4}, {0xD9,0xC5}, {0xB4,0xCD}, {0xB4,0xC3},
+ {0xB4,0xD9}, {0xD9,0xC8}, {0xD9,0xC7}, {0xFD,0x48},
+ {0xFD,0x47}, {0xFE,0xF2}, {0xFE,0x6A}, {0xD9,0xAC},
+ {0xB4,0xC8}, {0xD9,0xD4}, {0xD9,0xBC}, {0xD9,0xBE},
+ {0x8D,0xBD}, {0xD9,0xCB}, {0xD9,0xCA}, {0xD9,0xAA},
+ {0xB4,0xD3}, {0xB4,0xD5}, {0xD9,0xB2}, {0xD9,0xB9},
+ {0xD9,0xC1}, {0xB4,0xD4}, {0xD9,0xB8}, {0xD9,0xC4},
+ {0xD9,0xD7}, {0xD9,0xCC}, {0x9B,0xA1}, {0x8C,0xA2},
+ {0x9A,0xB7}, {0x8E,0xFC}, {0xD9,0xD8}, {0xD9,0xAE},
+ {0x9F,0xA1}, {0xDD,0xF2}, {0xB7,0xA6}, {0xDD,0xF0},
+ {0xDD,0xDB}, {0xDD,0xE0}, {0xDD,0xD9}, {0xFD,0x51},
+ {0xDD,0xEC}, {0xDD,0xCB}, {0xDD,0xD2}, {0xDD,0xEA},
+ {0xDD,0xF4}, {0xDD,0xDC}, {0xFA,0xAD}, {0xDD,0xCF},
+ {0xDD,0xE2}, {0xDD,0xE7}, {0xDD,0xD3}, {0x8D,0xBE},
+ {0xDD,0xE4}, {0xDD,0xD0}, {0x89,0xA4}, {0xDD,0xD7},
+ {0xDD,0xD8}, {0xB7,0xA8}, {0xDD,0xEB}, {0xDD,0xE9},
+ {0xDD,0xCC}, {0xDD,0xEE}, {0xDD,0xEF}, {0xDD,0xF1},
+ {0xB7,0xAC}, {0xB7,0xA4}, {0x9A,0xD9}, {0xD5,0xB8},
+ {0xDD,0xD4}, {0xDD,0xE6}, {0xDD,0xD5}, {0xB7,0xA1},
+ {0xB7,0xB1}, {0xDD,0xED}, {0xB7,0xAF}, {0xB7,0xAB},
+ {0xDD,0xCA}, {0xB7,0xA3}, {0xFD,0x4E}, {0xDD,0xCD},
+ {0xB7,0xB0}, {0x8D,0xC0}, {0xDD,0xDD}, {0xDD,0xC9},
+ {0x97,0xF0}, {0xB7,0xA9}, {0xDD,0xE1}, {0xDD,0xD1},
+ {0xB7,0xAA}, {0xDD,0xDA}, {0xB7,0x7E}, {0xB4,0xD8},
+ {0xDD,0xE3}, {0xD9,0xBF}, {0xDD,0xCE}, {0x93,0xB4},
+ {0xFD,0x44}, {0xDD,0xE8}, {0xB7,0xA5}, {0xDD,0xE5},
+ {0xB7,0xA2}, {0xDD,0xDF}, {0xB7,0xAD}, {0xDD,0xD6},
+ {0xDD,0xF3}, {0x9F,0xA7}, {0xB7,0xA7}, {0xDE,0xC6},
+ {0x8D,0xC2}, {0xB7,0xAE}, {0x99,0xB6}, {0xE2,0x4A},
+ {0xE2,0x48}, {0xE2,0x5E}, {0xE2,0x46}, {0xE2,0x58},
+ {0xB7,0x7D}, {0xBA,0x5F}, {0xE2,0x42}, {0xE2,0x5D},
+ {0xFD,0x52}, {0xE2,0x47}, {0xE2,0x55}, {0xBA,0x64},
+ {0xBA,0x5D}, {0xE2,0x5B}, {0x8D,0xC1}, {0xE2,0x40},
+ {0xE2,0x5A}, {0x8E,0x46}, {0xBA,0x6F}, {0xE2,0x51},
+ {0xE2,0x61}, {0xBA,0x6D}, {0xE2,0x49}, {0xBA,0x5E},
+ {0xE2,0x4B}, {0xE2,0x59}, {0xBA,0x67}, {0xE2,0x44},
+ {0xBA,0x6B}, {0xBA,0x61}, {0xE2,0x4D}, {0xE2,0x43},
+ {0xE1,0xFC}, {0xA0,0xD1}, {0xE2,0x57}, {0xBA,0x68},
+ {0xE2,0x60}, {0xE1,0xFD}, {0xBA,0x65}, {0xE2,0x53},
+ {0xBA,0x66}, {0xE2,0x45}, {0xE2,0x50}, {0xE2,0x4C},
+ {0xE2,0x4E}, {0x9F,0xCA}, {0xBA,0x60}, {0xE2,0x5F},
+ {0xBA,0x6E}, {0xE2,0x4F}, {0xE2,0x62}, {0xE1,0xFE},
+ {0xE2,0x54}, {0xBA,0x63}, {0xBA,0x6C}, {0xBA,0x6A},
+ {0xE2,0x41}, {0xE2,0x56}, {0xBA,0x69}, {0x92,0xCF},
+ {0xBA,0x62}, {0xE2,0x52}, {0x9C,0xF4}, {0x8D,0xC4},
+ {0xE2,0x5C}, {0xFD,0x41}, {0xE5,0xD5}, {0xE5,0xD1},
+ {0xE5,0xCD}, {0xE5,0xE1}, {0xE5,0xDE}, {0xBC,0xCD},
+ {0x9B,0x4C}, {0xE5,0xE5}, {0xE5,0xD4}, {0xBC,0xD8},
+ {0xE5,0xDB}, {0xE5,0xD0}, {0xE5,0xDA}, {0xBC,0xD5},
+ {0xE5,0xEE}, {0xE5,0xEB}, {0xE5,0xDD}, {0xE5,0xCE},
+ {0xFD,0x57}, {0xFC,0xEF}, {0xE5,0xE2}, {0xE5,0xE4},
+ {0xBC,0xD1}, {0xE5,0xD8}, {0xE5,0xD3}, {0xE5,0xCA},
+ {0xBC,0xCE}, {0xBC,0xD6}, {0x9C,0xDE}, {0xE5,0xE7},
+ {0xBC,0xD7}, {0xE5,0xCB}, {0xE5,0xED}, {0xE5,0xE0},
+ {0xE5,0xE6}, {0xBC,0xD4}, {0xFD,0x42}, {0x98,0x6C},
+ {0xE5,0xE3}, {0xE5,0xEA}, {0xBC,0xD9}, {0xBC,0xD3},
+ {0xE5,0xDC}, {0xE5,0xCF}, {0xE5,0xEF}, {0xE5,0xCC},
+ {0xE5,0xE8}, {0xBC,0xD0}, {0x97,0xF9}, {0xE5,0xD6},
+ {0x95,0x58}, {0xE5,0xD7}, {0xBC,0xCF}, {0xBC,0xCC},
+ {0xE5,0xD2}, {0xBC,0xD2}, {0xBC,0xCB}, {0xE5,0xE9},
+ {0xE5,0xEC}, {0xE5,0xD9}, {0xE9,0xCA}, {0x98,0x5E},
+ {0xFE,0x7B}, {0x94,0xCD}, {0xE9,0xC2}, {0x93,0xEE},
+ {0xE9,0xBE}, {0xBE,0xF6}, {0xBE,0xEB}, {0xBE,0xF0},
+ {0xBE,0xEC}, {0xE9,0xCC}, {0xE9,0xD7}, {0xBE,0xEA},
+ {0xE9,0xC4}, {0xE9,0xCD}, {0xE5,0xDF}, {0xE9,0xCE},
+ {0x8C,0xA3}, {0xBE,0xF1}, {0xFD,0x5A}, {0xE9,0xDD},
+ {0xBE,0xF5}, {0xBE,0xF8}, {0xE9,0xC0}, {0xBE,0xF4},
+ {0x93,0xF5}, {0xE9,0xDB}, {0xE9,0xDC}, {0xE9,0xD2},
+ {0xE9,0xD1}, {0xE9,0xC9}, {0x93,0xEF}, {0x8E,0xEA},
+ {0xE9,0xD3}, {0xE9,0xDA}, {0xE9,0xD9}, {0x8F,0x5B},
+ {0xBE,0xEF}, {0xBE,0xED}, {0xE9,0xCB}, {0xE9,0xC8},
+ {0xE9,0xC5}, {0xE9,0xD8}, {0xBE,0xF7}, {0xE9,0xD6},
+ {0xBE,0xF3}, {0xBE,0xF2}, {0x8C,0x5E}, {0xE9,0xD0},
+ {0x8D,0xC6}, {0xE9,0xBF}, {0xE9,0xC1}, {0xE9,0xC3},
+ {0xE9,0xD5}, {0xE9,0xCF}, {0xBE,0xEE}, {0xE9,0xC6},
+ {0xE9,0xD4}, {0x8D,0xC8}, {0x8D,0xC7}, {0xE9,0xC7},
+ {0x93,0xF7}, {0xC0,0xCF}, {0xED,0x45}, {0xC0,0xC8},
+ {0xEC,0xF5}, {0x8D,0xC9}, {0xED,0x41}, {0xC0,0xCA},
+ {0xED,0x48}, {0xEC,0xFC}, {0xEC,0xF7}, {0xFB,0xF2},
+ {0xED,0x49}, {0xEC,0xF3}, {0xEC,0xFE}, {0x96,0x70},
+ {0xC0,0xD1}, {0xED,0x44}, {0xED,0x4A}, {0xEC,0xFD},
+ {0xC0,0xC9}, {0xED,0x40}, {0xEC,0xF4}, {0xC0,0xD0},
+ {0x8D,0xCB}, {0xED,0x47}, {0xEC,0xF9}, {0xC0,0xCC},
+ {0xFD,0x5C}, {0xEC,0xFB}, {0xEC,0xF8}, {0xC0,0xD2},
+ {0xEC,0xFA}, {0xC0,0xCB}, {0xC0,0xCE}, {0xED,0x43},
+ {0xEC,0xF6}, {0xED,0x46}, {0x8F,0x65}, {0xED,0x42},
+ {0x8D,0xCD}, {0xC2,0x63}, {0xEF,0xE7}, {0xC2,0x68},
+ {0xC2,0x69}, {0x9D,0xA8}, {0x94,0xF9}, {0xC2,0x62},
+ {0xEF,0xE6}, {0x8D,0xCE}, {0xEF,0xE3}, {0xEF,0xE4},
+ {0xC2,0x66}, {0xEF,0xDE}, {0xEF,0xE2}, {0xC2,0x65},
+ {0xEF,0xDF}, {0x93,0xEA}, {0xC2,0x67}, {0xC2,0x64},
+ {0xEF,0xDD}, {0xEF,0xE1}, {0xEF,0xE5}, {0xFD,0x5F},
+ {0x93,0xF0}, {0x9F,0xB6}, {0xF2,0x51}, {0xF2,0x4E},
+ {0xF2,0x57}, {0xF2,0x56}, {0xF2,0x54}, {0xF2,0x4F},
+ {0xC3,0x72}, {0x8D,0xCF}, {0x97,0x63}, {0xF2,0x50},
+ {0xC3,0x71}, {0xC0,0xCD}, {0xF2,0x53}, {0xC3,0x70},
+ {0xF2,0x58}, {0xF2,0x52}, {0xF2,0x4D}, {0xEF,0xE0},
+ {0xC3,0x6F}, {0xF2,0x4C}, {0xF4,0x56}, {0xF4,0x55},
+ {0xF2,0x55}, {0xC4,0x68}, {0xF4,0x59}, {0xF4,0x5A},
+ {0xF4,0x54}, {0xF4,0x58}, {0xF4,0x53}, {0x8D,0xD0},
+ {0xF5,0xD1}, {0xF4,0x57}, {0xC4,0xE7}, {0xC4,0xE5},
+ {0xF5,0xCF}, {0xF5,0xD2}, {0xF5,0xCE}, {0xF5,0xD0},
+ {0xC4,0xE6}, {0x93,0xF1}, {0xF6,0xE5}, {0xF6,0xE6},
+ {0xC5,0x76}, {0xF6,0xE4}, {0xF7,0xE2}, {0xC5,0xCF},
+ {0xF7,0xE0}, {0xF7,0xE1}, {0xF8,0xAC}, {0xC6,0x56},
+ {0xF8,0xF3}, {0xF8,0xF1}, {0xF8,0xF2}, {0xF8,0xF4},
+ {0xFD,0x62}, {0xF9,0xBB}, {0xA4,0xED}, {0xA6,0xB8},
+ {0xAA,0x59}, {0xCC,0xE9}, {0xCF,0x64}, {0xD1,0xF5},
+ {0xD1,0xF7}, {0xD1,0xF6}, {0xD1,0xF8}, {0xB1,0xFD},
+ {0xD5,0xD7}, {0xD1,0xF9}, {0xFD,0x65}, {0xD5,0xD6},
+ {0xD5,0xD8}, {0xD5,0xD9}, {0xD9,0xDA}, {0xB4,0xDB},
+ {0xD9,0xDB}, {0xD9,0xDD}, {0xB4,0xDC}, {0xB4,0xDA},
+ {0xD9,0xDC}, {0xDD,0xFA}, {0xDD,0xF8}, {0xDD,0xF7},
+ {0xDD,0xF6}, {0xDD,0xF5}, {0xB7,0xB2}, {0xDD,0xF9},
+ {0xBA,0x70}, {0xE2,0x63}, {0xE2,0x65}, {0xBA,0x71},
+ {0xE2,0x64}, {0xBC,0xDB}, {0xBC,0xDA}, {0xE5,0xF0},
+ {0x9F,0xDB}, {0xE9,0xDF}, {0xE9,0xDE}, {0xE9,0xE0},
+ {0x93,0xF8}, {0xBE,0xF9}, {0xED,0x4B}, {0xC0,0xD3},
+ {0xEF,0xE8}, {0xC2,0x6A}, {0xF2,0x59}, {0xC5,0x77},
+ {0xA4,0xEE}, {0xA5,0xBF}, {0xA6,0xB9}, {0xA8,0x42},
+ {0xAA,0x5A}, {0xAA,0x5B}, {0xAC,0x6E}, {0xD1,0xFA},
+ {0x8B,0xF7}, {0xB7,0xB3}, {0xFD,0x66}, {0xE6,0xD1},
+ {0xBE,0xFA}, {0xC2,0x6B}, {0xA4,0xEF}, {0x8B,0xCF},
+ {0xA6,0xBA}, {0xCC,0xEB}, {0xAA,0x5C}, {0xCC,0xEA},
+ {0x8D,0xD1}, {0xCF,0x65}, {0xAC,0x6F}, {0xCF,0x66},
+ {0xAC,0x70}, {0xD1,0xFC}, {0xAE,0xEE}, {0xAE,0xED},
+ {0xD5,0xDE}, {0xD5,0xDC}, {0xD5,0xDD}, {0xD5,0xDB},
+ {0xD5,0xDA}, {0xD9,0xDE}, {0xD9,0xE1}, {0xB4,0xDE},
+ {0xD9,0xDF}, {0xB4,0xDD}, {0xD9,0xE0}, {0xDD,0xFB},
+ {0xE2,0x66}, {0xE2,0x67}, {0xE2,0x68}, {0xE5,0xF3},
+ {0xE5,0xF2}, {0xBC,0xDC}, {0xE5,0xF1}, {0xE5,0xF4},
+ {0xE9,0xE1}, {0xE9,0xE2}, {0xE9,0xE3}, {0xED,0x4C},
+ {0xC0,0xD4}, {0xC2,0x6C}, {0xF2,0x5A}, {0xC4,0xE8},
+ {0xC9,0x5F}, {0xAC,0x71}, {0xCF,0x67}, {0xAE,0xEF},
+ {0xB1,0xFE}, {0xB4,0xDF}, {0xD9,0xE2}, {0xB7,0xB5},
+ {0xB7,0xB4}, {0x8D,0xD2}, {0xE2,0x69}, {0xE2,0x6A},
+ {0xBC,0xDD}, {0xBC,0xDE}, {0xE9,0xE5}, {0xE9,0xE4},
+ {0xEF,0xE9}, {0xF7,0xE3}, {0xA4,0xF0}, {0xC9,0x60},
+ {0xA5,0xC0}, {0xA8,0x43}, {0xCB,0x48}, {0xAC,0x72},
+ {0xB7,0xB6}, {0xA4,0xF1}, {0xCF,0x68}, {0xAC,0x73},
+ {0xCF,0x69}, {0xC0,0xD5}, {0xA4,0xF2}, {0xFD,0x71},
+ {0xCC,0xEC}, {0xCF,0x6A}, {0xFD,0x6F}, {0xD2,0x42},
+ {0xD2,0x41}, {0xD1,0xFE}, {0xD1,0xFD}, {0xD2,0x43},
+ {0xD2,0x40}, {0x8D,0xD3}, {0xB2,0x40}, {0xB2,0x41},
+ {0xB4,0xE0}, {0xD9,0xE3}, {0xD9,0xE4}, {0xD9,0xE5},
+ {0xDE,0x41}, {0xDE,0x42}, {0xDE,0x40}, {0x9F,0xE7},
+ {0xDD,0xFD}, {0xDD,0xFE}, {0xB7,0xB7}, {0xE2,0x6B},
+ {0xE5,0xF7}, {0xE5,0xF6}, {0xE5,0xF5}, {0xE5,0xF8},
+ {0xE9,0xE7}, {0xE9,0xE6}, {0xBE,0xFB}, {0xE9,0xE8},
+ {0xC0,0xD6}, {0xED,0x4D}, {0xEF,0xEA}, {0xF2,0x5B},
+ {0xF6,0xE7}, {0xA4,0xF3}, {0xA5,0xC2}, {0xA5,0xC1},
+ {0xAA,0x5D}, {0xC9,0x61}, {0xC9,0x7E}, {0xA6,0xBB},
+ {0xC9,0xF7}, {0xCB,0x49}, {0xCB,0x4A}, {0xAA,0x5E},
+ {0x90,0xBD}, {0xCC,0xED}, {0xAC,0x74}, {0xCF,0x6B},
+ {0xCF,0x6C}, {0xAE,0xF0}, {0xAE,0xF4}, {0xD2,0x44},
+ {0xAE,0xF3}, {0xAE,0xF1}, {0xAE,0xF2}, {0xD5,0xDF},
+ {0xB2,0x42}, {0xB4,0xE3}, {0xB4,0xE1}, {0xB4,0xE2},
+ {0xD9,0xE6}, {0x9F,0xD0}, {0xBA,0x72}, {0xA4,0xF4},
+ {0x8B,0xD0}, {0xC9,0xA1}, {0xFD,0x72}, {0xA5,0xC3},
+ {0x9C,0xAE}, {0x8B,0xD1}, {0xC9,0xA4}, {0x8A,0xDB},
+ {0xA5,0xC6}, {0xC9,0xA3}, {0xA5,0xC5}, {0xA5,0xC4},
+ {0xA8,0x44}, {0xC9,0xA2}, {0xC9,0xF8}, {0xFA,0xE4},
+ {0xC9,0xFC}, {0xC9,0xFE}, {0xCA,0x40}, {0xA6,0xC5},
+ {0xA6,0xC6}, {0xC9,0xFB}, {0xA6,0xC1}, {0xC9,0xF9},
+ {0xC9,0xFD}, {0xA6,0xC2}, {0xA6,0xBD}, {0x95,0xCE},
+ {0xA6,0xBE}, {0xFD,0x76}, {0xA6,0xC4}, {0xC9,0xFA},
+ {0xA6,0xBC}, {0xA8,0x45}, {0xA6,0xBF}, {0xA6,0xC0},
+ {0xA6,0xC3}, {0xCB,0x5B}, {0xCB,0x59}, {0xCB,0x4C},
+ {0xA8,0x51}, {0xCB,0x53}, {0xA8,0x4C}, {0xCB,0x4D},
+ {0xCB,0x55}, {0xFB,0x62}, {0xCB,0x52}, {0xA8,0x4F},
+ {0xCB,0x51}, {0xA8,0x56}, {0xCB,0x5A}, {0xA8,0x58},
+ {0x8D,0xD4}, {0xA8,0x5A}, {0xCB,0x4B}, {0xFD,0x78},
+ {0xA8,0x4D}, {0xCB,0x5C}, {0xA8,0x54}, {0xA8,0x57},
+ {0x8E,0xE3}, {0xCD,0x45}, {0xA8,0x47}, {0xA8,0x5E},
+ {0xA8,0x55}, {0xCB,0x4E}, {0xA8,0x4A}, {0xA8,0x59},
+ {0xCB,0x56}, {0xA8,0x48}, {0xA8,0x49}, {0xCD,0x43},
+ {0xCB,0x4F}, {0xA8,0x50}, {0xA8,0x5B}, {0xCB,0x5D},
+ {0xCB,0x50}, {0xA8,0x4E}, {0xA8,0x53}, {0xCC,0xEE},
+ {0xA8,0x5C}, {0xCB,0x57}, {0xA8,0x52}, {0xA8,0x5D},
+ {0xA8,0x46}, {0xCB,0x54}, {0xA8,0x4B}, {0xCB,0x58},
+ {0xCD,0x44}, {0x90,0x76}, {0x98,0xC6}, {0x8D,0xD5},
+ {0xAA,0x6A}, {0xAA,0x7A}, {0xCC,0xF5}, {0xAA,0x71},
+ {0x97,0xD1}, {0xCD,0x4B}, {0xAA,0x62}, {0x9E,0xB6},
+ {0xAA,0x65}, {0xCD,0x42}, {0xCC,0xF3}, {0xCC,0xF7},
+ {0xAA,0x6D}, {0xAA,0x6F}, {0xCC,0xFA}, {0xAA,0x76},
+ {0xAA,0x68}, {0xAA,0x66}, {0xAA,0x67}, {0xAA,0x75},
+ {0xCD,0x47}, {0xAA,0x70}, {0xCC,0xF9}, {0xCC,0xFB},
+ {0xAA,0x6E}, {0xAA,0x73}, {0xCC,0xFC}, {0xCD,0x4A},
+ {0xAC,0x75}, {0xAA,0x79}, {0xFA,0xC7}, {0xAA,0x63},
+ {0xCD,0x49}, {0xA0,0x42}, {0xCD,0x4D}, {0xCC,0xF8},
+ {0xCD,0x4F}, {0xCD,0x40}, {0xAA,0x6C}, {0xCC,0xF4},
+ {0xAA,0x6B}, {0xAA,0x7D}, {0xAA,0x72}, {0xCC,0xF2},
+ {0xCF,0x75}, {0xAA,0x78}, {0xAA,0x7C}, {0xCD,0x41},
+ {0xCD,0x46}, {0x98,0x73}, {0xAA,0x7E}, {0xAA,0x77},
+ {0xAA,0x69}, {0xAA,0x5F}, {0xAA,0x64}, {0xCC,0xF6},
+ {0xAA,0x60}, {0xCD,0x4E}, {0x9F,0xFC}, {0xCC,0xF0},
+ {0xCC,0xEF}, {0xCC,0xFD}, {0xCC,0xF1}, {0xAA,0x7B},
+ {0xAE,0xF5}, {0xAA,0x74}, {0xCC,0xFE}, {0xAA,0x61},
+ {0xAC,0xA6}, {0xCD,0x4C}, {0x8C,0xA5}, {0xCF,0x7C},
+ {0xCF,0xA1}, {0x8D,0xD7}, {0xCF,0xA4}, {0xCF,0x77},
+ {0x92,0xFB}, {0x8D,0xD8}, {0xCF,0xA7}, {0xCF,0xAA},
+ {0xCF,0xAC}, {0xCF,0x74}, {0xAC,0x76}, {0xAC,0x7B},
+ {0xD2,0x49}, {0xAC,0xAD}, {0xCF,0xA5}, {0xCF,0xAD},
+ {0xCF,0x7B}, {0xCF,0x73}, {0xD2,0x64}, {0xAC,0x7E},
+ {0xCF,0xA2}, {0xCF,0x78}, {0xCF,0x7A}, {0xAC,0xA5},
+ {0xCF,0x7D}, {0xAC,0x7D}, {0xCF,0x70}, {0xCF,0xA8},
+ {0xCF,0xAB}, {0x94,0x4F}, {0xAC,0x7A}, {0x8D,0xD9},
+ {0xAC,0xA8}, {0xCF,0x6D}, {0xAC,0xAA}, {0xAC,0x78},
+ {0xAC,0xAE}, {0xCF,0xA9}, {0xCF,0x6F}, {0xAC,0xAB},
+ {0xD2,0x5E}, {0xCD,0x48}, {0xAC,0x7C}, {0xAC,0x77},
+ {0xCF,0x76}, {0xCF,0x6E}, {0xAC,0xAC}, {0xAC,0xA4},
+ {0xCF,0xA3}, {0xAC,0xA9}, {0xAC,0xA7}, {0xCF,0x79},
+ {0xAC,0xA1}, {0xCF,0x71}, {0xAC,0xA2}, {0xAC,0xA3},
+ {0xCF,0x72}, {0xCF,0xA6}, {0xAC,0x79}, {0xCF,0x7E},
+ {0x89,0x6B}, {0x97,0xCE}, {0xD2,0x4C}, {0xAE,0xFD},
+ {0xAF,0x43}, {0xFA,0xF3}, {0xFD,0xAE}, {0xD2,0x55},
+ {0xD2,0x5B}, {0xD2,0x57}, {0xD2,0x4A}, {0xD2,0x4D},
+ {0xD2,0x46}, {0xD2,0x47}, {0xAF,0x4A}, {0xAE,0xFA},
+ {0xD2,0x56}, {0xD2,0x5F}, {0xAF,0x45}, {0xAE,0xF6},
+ {0xAF,0x40}, {0xD2,0x4E}, {0xAF,0x42}, {0xD2,0x4F},
+ {0xD2,0x59}, {0xFB,0xAF}, {0x92,0xB7}, {0xAF,0x44},
+ {0xD2,0x68}, {0xD2,0x48}, {0xAE,0xFC}, {0xAE,0xFB},
+ {0xAF,0x48}, {0xD2,0x45}, {0xD2,0x66}, {0xD2,0x5A},
+ {0xD2,0x67}, {0xD2,0x61}, {0xD2,0x53}, {0xD2,0x62},
+ {0x8D,0xDA}, {0xD2,0x5C}, {0xD2,0x65}, {0xD2,0x63},
+ {0xAF,0x49}, {0xD2,0x54}, {0xAE,0xF9}, {0xAE,0xF8},
+ {0xAF,0x41}, {0xAF,0x47}, {0xD2,0x60}, {0xAF,0x46},
+ {0xD2,0x51}, {0xB2,0x43}, {0x9C,0x5A}, {0xD2,0x69},
+ {0xD2,0x50}, {0xD2,0x4B}, {0xAE,0xFE}, {0xAF,0x4B},
+ {0xAE,0xF7}, {0xFD,0xAD}, {0xD2,0x58}, {0xD2,0x5D},
+ {0x8D,0xDC}, {0x94,0x44}, {0xB2,0x65}, {0xD5,0xE1},
+ {0xD5,0xE5}, {0xB2,0x52}, {0xB2,0x50}, {0x8D,0xDD},
+ {0xB2,0x47}, {0xD5,0xE3}, {0xD5,0xE2}, {0xB2,0x5B},
+ {0xD5,0xE8}, {0xB2,0x55}, {0xA0,0xD6}, {0xD5,0xFA},
+ {0xD6,0x47}, {0xB2,0x44}, {0xD5,0xF7}, {0xD5,0xF0},
+ {0xB2,0x67}, {0xD5,0xE0}, {0xD5,0xFC}, {0xB2,0x64},
+ {0xB2,0x58}, {0xB2,0x63}, {0xB2,0x4E}, {0xD5,0xEC},
+ {0xD5,0xFE}, {0xD5,0xF6}, {0xB2,0x4F}, {0xB2,0x49},
+ {0xD6,0x45}, {0xD5,0xFD}, {0xD6,0x40}, {0xB2,0x51},
+ {0xB2,0x59}, {0xD6,0x42}, {0xD5,0xEA}, {0xD5,0xFB},
+ {0xD5,0xEF}, {0xD6,0x44}, {0xB2,0x5E}, {0xB2,0x46},
+ {0xB2,0x5C}, {0xD5,0xF4}, {0xD5,0xF2}, {0xD5,0xF3},
+ {0xB2,0x53}, {0xD5,0xEE}, {0xD5,0xED}, {0xB2,0x48},
+ {0xD5,0xE7}, {0xD6,0x46}, {0xB2,0x4A}, {0xD5,0xF1},
+ {0xB2,0x68}, {0xB2,0x62}, {0xD5,0xE6}, {0xB2,0x5F},
+ {0xB2,0x5D}, {0xB2,0x66}, {0xD5,0xF8}, {0xB2,0x61},
+ {0xD2,0x52}, {0xD5,0xF9}, {0xB2,0x60}, {0xD6,0x41},
+ {0xB2,0x45}, {0xD5,0xF5}, {0xB2,0x57}, {0xD5,0xE9},
+ {0xB2,0x56}, {0xB2,0x54}, {0xB2,0x4C}, {0xB2,0x4B},
+ {0xD9,0xE7}, {0xD6,0x43}, {0x8C,0x41}, {0xD5,0xEB},
+ {0x97,0xD5}, {0xD9,0xFC}, {0x94,0x4A}, {0xB2,0x4D},
+ {0x94,0x4D}, {0x97,0xCB}, {0x8D,0xDE}, {0x8D,0xDF},
+ {0xB5,0x41}, {0xB2,0x5A}, {0xB4,0xEE}, {0xD9,0xF6},
+ {0xB4,0xFC}, {0xD9,0xEA}, {0xB4,0xEB}, {0xB4,0xE7},
+ {0xDA,0x49}, {0xB4,0xED}, {0xB4,0xF1}, {0xB4,0xEC},
+ {0xB4,0xF5}, {0xDA,0x4D}, {0xDA,0x44}, {0x8D,0xE0},
+ {0xFE,0xF9}, {0xD9,0xF1}, {0xB4,0xFA}, {0xB4,0xF4},
+ {0xD9,0xFD}, {0xB4,0xE4}, {0xDA,0x4A}, {0xDA,0x43},
+ {0xB4,0xE8}, {0xD9,0xF7}, {0xB4,0xF7}, {0xDA,0x55},
+ {0xDA,0x56}, {0xB4,0xE5}, {0xDA,0x48}, {0xB4,0xF9},
+ {0xD9,0xFB}, {0xD9,0xED}, {0xD9,0xEE}, {0xB4,0xFD},
+ {0xD9,0xF2}, {0xD9,0xF9}, {0xD9,0xF3}, {0xB4,0xFB},
+ {0xB5,0x44}, {0xD9,0xEF}, {0xD9,0xE8}, {0xD9,0xE9},
+ {0xD9,0xEB}, {0xB4,0xEA}, {0xD9,0xF8}, {0xB4,0xF8},
+ {0xB5,0x42}, {0xFD,0xC0}, {0xFC,0xF9}, {0xD9,0xFA},
+ {0xDA,0x53}, {0xDA,0x4B}, {0xB4,0xE6}, {0xDA,0x51},
+ {0xB4,0xF2}, {0xB4,0xF0}, {0xFB,0x7E}, {0xDA,0x57},
+ {0xB4,0xEF}, {0xDA,0x41}, {0xD9,0xF4}, {0xD9,0xFE},
+ {0xB5,0x47}, {0xDA,0x45}, {0xDA,0x42}, {0xD9,0xF0},
+ {0xB5,0x43}, {0xDA,0x4F}, {0xDA,0x4C}, {0xDA,0x54},
+ {0xB4,0xE9}, {0xDA,0x40}, {0xB5,0x46}, {0xDA,0x47},
+ {0xB4,0xF3}, {0xB4,0xF6}, {0xDA,0x46}, {0xB5,0x45},
+ {0xD9,0xF5}, {0xD5,0xE4}, {0x92,0xB3}, {0xDA,0x50},
+ {0xDA,0x4E}, {0xDA,0x52}, {0xFD,0xAF}, {0x8D,0xE1},
+ {0xD9,0xEC}, {0xB5,0x40}, {0x95,0xD3}, {0xDE,0x61},
+ {0xDE,0x60}, {0xDE,0x46}, {0xB7,0xBD}, {0xDE,0x5F},
+ {0xDE,0x49}, {0xDE,0x4A}, {0xB7,0xC7}, {0xDE,0x68},
+ {0xB7,0xC2}, {0xDE,0x5E}, {0x89,0xC1}, {0xDE,0x43},
+ {0xB7,0xC8}, {0xB7,0xBE}, {0xDE,0x52}, {0xDE,0x48},
+ {0xDE,0x4B}, {0xDE,0x63}, {0xB7,0xB8}, {0xDE,0x6A},
+ {0xDE,0x62}, {0xB7,0xC1}, {0xDE,0x57}, {0xB7,0xCC},
+ {0xB7,0xCB}, {0xB7,0xC5}, {0xDE,0x69}, {0xB7,0xB9},
+ {0xDE,0x55}, {0xDE,0x4C}, {0xDE,0x59}, {0xDE,0x65},
+ {0xB7,0xCD}, {0xFD,0x68}, {0xB7,0xBB}, {0xDE,0x54},
+ {0x9C,0xB7}, {0xDE,0x4D}, {0xB7,0xC4}, {0x8D,0xE3},
+ {0xB7,0xC3}, {0xDE,0x50}, {0xDE,0x5A}, {0xDE,0x64},
+ {0xDE,0x47}, {0xDE,0x51}, {0xB7,0xBC}, {0xDE,0x5B},
+ {0xB7,0xC9}, {0xB7,0xC0}, {0xDE,0x4E}, {0xB7,0xBF},
+ {0xDE,0x45}, {0xDE,0x53}, {0xDE,0x67}, {0xB4,0xFE},
+ {0xBA,0xB0}, {0xDE,0x56}, {0xE2,0x6C}, {0xDE,0x58},
+ {0xDE,0x66}, {0xB7,0xC6}, {0xDE,0x4F}, {0xB7,0xBA},
+ {0xB7,0xCA}, {0xBC,0xF0}, {0xDE,0x44}, {0xDE,0x5D},
+ {0xFA,0xC0}, {0x8D,0xE5}, {0xFA,0x64}, {0xDE,0x5C},
+ {0x89,0x47}, {0x8D,0xE4}, {0x8D,0xE7}, {0x8D,0xE8},
+ {0xE2,0xAA}, {0xBA,0xAD}, {0xE2,0x7D}, {0xE2,0xA4},
+ {0xBA,0xA2}, {0xE2,0x6E}, {0xBA,0xAF}, {0xBA,0x77},
+ {0xE2,0x6D}, {0xE2,0xB0}, {0xBA,0xB1}, {0xE2,0x71},
+ {0xE2,0xA3}, {0xFD,0xC7}, {0xE2,0x73}, {0xE2,0xB3},
+ {0xE2,0xAF}, {0xBA,0x75}, {0xBA,0xA1}, {0xE6,0x53},
+ {0xBA,0xAE}, {0xBA,0x7D}, {0xE2,0x6F}, {0xFD,0xB0},
+ {0xE2,0xAE}, {0xBA,0xA3}, {0xE2,0xAB}, {0xE2,0xB8},
+ {0xE2,0x75}, {0xE2,0x7E}, {0x94,0x45}, {0x97,0xD6},
+ {0xE2,0xB6}, {0xE2,0xAC}, {0xBA,0x7C}, {0xE2,0x7C},
+ {0xBA,0x76}, {0xBA,0x74}, {0xBA,0xA8}, {0xFC,0xC6},
+ {0x98,0x44}, {0xE2,0x7A}, {0xE2,0x77}, {0xE2,0x78},
+ {0xE2,0xB2}, {0xE2,0xB7}, {0xE2,0xB5}, {0xBA,0x7A},
+ {0xE2,0xB9}, {0xBA,0x7E}, {0xBA,0xA7}, {0x8D,0xE9},
+ {0xE2,0x70}, {0xE5,0xFA}, {0xE2,0x79}, {0xBA,0x78},
+ {0xBA,0xAC}, {0xBA,0xA9}, {0xBA,0x7B}, {0xE2,0xA5},
+ {0xE2,0x74}, {0xBA,0xAA}, {0xE2,0xA7}, {0xBA,0xA4},
+ {0xBA,0xA6}, {0xBA,0x73}, {0x8D,0xEA}, {0xE2,0xA9},
+ {0xE2,0xA1}, {0xE2,0x72}, {0xBA,0xA5}, {0xE2,0xB1},
+ {0xE2,0xB4}, {0xE2,0x7B}, {0xE2,0xA8}, {0xFE,0x50},
+ {0xBA,0x79}, {0xBC,0xDF}, {0xE2,0xA6}, {0xE5,0xF9},
+ {0xE2,0xAD}, {0xFD,0xCC}, {0xE2,0x76}, {0xE6,0x44},
+ {0xE6,0x4E}, {0xBC,0xE2}, {0xE6,0x4D}, {0xE6,0x59},
+ {0xBC,0xE4}, {0xE6,0x4B}, {0x9D,0xA7}, {0xE6,0x4F},
+ {0xBC,0xEF}, {0xE6,0x46}, {0xBC,0xE7}, {0xFD,0xCD},
+ {0xE6,0x52}, {0xE9,0xF0}, {0xBC,0xF3}, {0xBC,0xF2},
+ {0xE6,0x54}, {0xE6,0x43}, {0xE6,0x5E}, {0xBC,0xED},
+ {0xBC,0xE3}, {0xE6,0x57}, {0xE6,0x5B}, {0xE6,0x60},
+ {0xE6,0x55}, {0xE6,0x49}, {0xBC,0xE6}, {0xBC,0xE9},
+ {0xBC,0xF1}, {0xBC,0xEC}, {0xE6,0x4C}, {0xE2,0xA2},
+ {0xFD,0xCF}, {0xE6,0x48}, {0xE6,0x5F}, {0xBC,0xE8},
+ {0x95,0xD2}, {0xBC,0xEB}, {0xE6,0x61}, {0xBC,0xE0},
+ {0xE6,0x56}, {0xE5,0xFB}, {0xE6,0x5C}, {0xC0,0xDF},
+ {0x8D,0xED}, {0xE6,0x4A}, {0xBC,0xE1}, {0xE6,0x45},
+ {0xBC,0xE5}, {0xE5,0xFC}, {0xBA,0xAB}, {0xE6,0x41},
+ {0xFC,0xBA}, {0xE6,0x5A}, {0xE6,0x42}, {0xE6,0x40},
+ {0xBC,0xEA}, {0xE6,0x58}, {0xE5,0xFE}, {0xE6,0x51},
+ {0xE6,0x50}, {0xE6,0x5D}, {0xE6,0x47}, {0xBC,0xEE},
+ {0xFD,0xC5}, {0xE9,0xF3}, {0xFD,0xD2}, {0xBF,0x49},
+ {0xBE,0xFE}, {0xEA,0x40}, {0xE9,0xEB}, {0xBF,0x41},
+ {0xE9,0xF7}, {0xBF,0x48}, {0xBF,0x43}, {0xE9,0xF5},
+ {0xED,0x4F}, {0xE9,0xFB}, {0xEA,0x42}, {0xE9,0xFA},
+ {0xE9,0xE9}, {0xE9,0xF8}, {0xEA,0x44}, {0xEA,0x46},
+ {0xBE,0xFD}, {0xEA,0x45}, {0xBF,0x44}, {0xBF,0x4A},
+ {0x9C,0xDC}, {0xBF,0x47}, {0xE9,0xFE}, {0xBF,0x46},
+ {0xE9,0xF9}, {0x95,0xCF}, {0xE9,0xED}, {0xE9,0xF2},
+ {0x8D,0xEE}, {0xE9,0xFD}, {0xBF,0x45}, {0xBF,0x42},
+ {0xBE,0xFC}, {0xBF,0x40}, {0xE9,0xF1}, {0xE5,0xFD},
+ {0xE9,0xEC}, {0xE9,0xEF}, {0xEA,0x41}, {0xE9,0xF4},
+ {0xE9,0xEA}, {0xED,0x4E}, {0xEA,0x43}, {0xE9,0xEE},
+ {0xE9,0xFC}, {0xFD,0xD4}, {0xED,0x51}, {0xC0,0xE3},
+ {0xC0,0xD7}, {0x96,0xEC}, {0x96,0xEB}, {0xC0,0xDB},
+ {0xED,0x53}, {0xED,0x59}, {0xED,0x57}, {0xC0,0xD9},
+ {0xC0,0xDA}, {0xC0,0xE1}, {0xED,0x5A}, {0xED,0x52},
+ {0xC0,0xDC}, {0xED,0x56}, {0xED,0x55}, {0xED,0x5B},
+ {0xC0,0xE2}, {0xC0,0xDD}, {0xC0,0xE0}, {0xED,0x54},
+ {0xC0,0xE4}, {0xC0,0xDE}, {0xC0,0xE5}, {0xC0,0xD8},
+ {0xED,0x58}, {0xED,0x50}, {0x90,0xB6}, {0xEF,0xF7},
+ {0xFD,0xC3}, {0xC2,0x71}, {0xEF,0xF4}, {0xEF,0xF6},
+ {0xC2,0x6F}, {0xEF,0xF2}, {0xEF,0xF3}, {0xEF,0xEE},
+ {0x98,0xAB}, {0xE9,0xF6}, {0xEF,0xEF}, {0xC2,0x70},
+ {0xEF,0xEB}, {0xC2,0x6D}, {0xEF,0xF8}, {0xC2,0x6E},
+ {0xEF,0xEC}, {0xEF,0xED}, {0xEF,0xF1}, {0xC2,0x73},
+ {0xC2,0x72}, {0xEF,0xF0}, {0xC3,0x78}, {0xF2,0x5F},
+ {0xF2,0x65}, {0xC3,0x79}, {0xF2,0x5C}, {0xC3,0x76},
+ {0xC3,0x73}, {0xF2,0x67}, {0xC3,0x77}, {0x96,0xEE},
+ {0xC3,0x74}, {0xF2,0x5E}, {0xF2,0x61}, {0xF2,0x62},
+ {0xF2,0x63}, {0xF2,0x66}, {0xEF,0xF5}, {0xF2,0x5D},
+ {0xC3,0x75}, {0xF2,0x64}, {0xF2,0x68}, {0xF2,0x60},
+ {0x8D,0xF4}, {0xF4,0x5D}, {0xC4,0x6A}, {0xF4,0x60},
+ {0xC4,0x6B}, {0xF4,0x68}, {0xF4,0x5F}, {0xF4,0x5C},
+ {0xF4,0x5E}, {0xF4,0x62}, {0xF4,0x65}, {0xF4,0x64},
+ {0xF4,0x67}, {0xF4,0x5B}, {0xC4,0x69}, {0xF4,0x63},
+ {0xF4,0x66}, {0xF4,0x69}, {0xF4,0x61}, {0xF5,0xD3},
+ {0xF5,0xD4}, {0xF5,0xD8}, {0xF5,0xD9}, {0xF5,0xD6},
+ {0xF5,0xD7}, {0xF5,0xD5}, {0xFD,0xE0}, {0xC4,0xE9},
+ {0x8C,0x67}, {0x8D,0xF6}, {0xC5,0x78}, {0xF6,0xEB},
+ {0x8D,0xF7}, {0xF6,0xE8}, {0xF6,0xE9}, {0xF6,0xEA},
+ {0xC5,0x79}, {0xF7,0xE5}, {0xF7,0xE4}, {0x8F,0xFA},
+ {0xF8,0xAF}, {0xC5,0xF4}, {0xF8,0xAD}, {0xF8,0xB0},
+ {0xF8,0xAE}, {0xF8,0xF5}, {0xC6,0x57}, {0xC6,0x65},
+ {0xF9,0xA3}, {0xF9,0x6C}, {0x97,0xD0}, {0xF9,0xA2},
+ {0xF9,0xD0}, {0xF9,0xD1}, {0xA4,0xF5}, {0x8B,0xD2},
+ {0x8D,0xF8}, {0xA6,0xC7}, {0xCA,0x41}, {0xCB,0x5E},
+ {0x90,0xD9}, {0xA8,0x5F}, {0x8C,0x47}, {0xA8,0x62},
+ {0xFA,0xF0}, {0xCB,0x5F}, {0xA8,0x60}, {0xA8,0x61},
+ {0xFD,0xE1}, {0x8D,0xF9}, {0xFD,0xE3}, {0xCD,0x58},
+ {0xCD,0x5A}, {0xCD,0x55}, {0xCD,0x52}, {0xCD,0x54},
+ {0x8D,0xFA}, {0xAA,0xA4}, {0xFB,0x63}, {0xAA,0xA2},
+ {0x90,0xA6}, {0xCD,0x56}, {0xAA,0xA3}, {0xCD,0x53},
+ {0xCD,0x50}, {0xAA,0xA1}, {0xCD,0x57}, {0xCD,0x51},
+ {0xAA,0xA5}, {0xCD,0x59}, {0xCF,0xAF}, {0x99,0x70},
+ {0xCF,0xB3}, {0x91,0xEB}, {0xAC,0xB7}, {0x97,0x70},
+ {0x98,0x6F}, {0xFD,0xE2}, {0xCF,0xB6}, {0xAC,0xAF},
+ {0xAC,0xB2}, {0xAC,0xB4}, {0xAC,0xB6}, {0xAC,0xB3},
+ {0xCF,0xB2}, {0xCF,0xB1}, {0xAC,0xB1}, {0xCF,0xB4},
+ {0xCF,0xB5}, {0xCF,0xAE}, {0xAC,0xB5}, {0x98,0xF2},
+ {0xAC,0xB0}, {0x9A,0xFC}, {0x89,0x6C}, {0xFD,0xFD},
+ {0xCF,0xB0}, {0x99,0x5E}, {0x95,0xBD}, {0xD2,0x77},
+ {0xD2,0x78}, {0xD2,0x79}, {0xAF,0x50}, {0xAF,0x4C},
+ {0xD2,0x6E}, {0xFD,0xE4}, {0xD2,0x76}, {0xD2,0x7B},
+ {0xAF,0x51}, {0x91,0xE6}, {0xD2,0x6C}, {0xD2,0x72},
+ {0xD2,0x6B}, {0xD2,0x75}, {0xFD,0xE5}, {0xFD,0xE6},
+ {0xD2,0x71}, {0xAF,0x4D}, {0xAF,0x4F}, {0xD2,0x7A},
+ {0xD2,0x6A}, {0xD2,0x6D}, {0xD2,0x73}, {0xFD,0xE7},
+ {0xD2,0x74}, {0xD2,0x7C}, {0xD2,0x70}, {0xAF,0x4E},
+ {0xB2,0x6D}, {0xD6,0x4E}, {0x94,0x54}, {0xD6,0x50},
+ {0xD6,0x4C}, {0x99,0xB8}, {0xD6,0x58}, {0xD6,0x4A},
+ {0xD6,0x57}, {0xB2,0x69}, {0xD6,0x48}, {0xDA,0x5B},
+ {0xD6,0x52}, {0xB2,0x6C}, {0x97,0xE9}, {0xD6,0x53},
+ {0xD6,0x56}, {0xD6,0x5A}, {0xD6,0x4F}, {0x93,0x46},
+ {0xD6,0x54}, {0xB2,0x6A}, {0xB2,0x6B}, {0xD6,0x59},
+ {0xD6,0x4D}, {0xD6,0x49}, {0xD6,0x5B}, {0xD6,0x51},
+ {0xD6,0x55}, {0xD6,0x4B}, {0xB5,0x48}, {0xB5,0x49},
+ {0xDA,0x65}, {0xB5,0x4F}, {0x98,0x63}, {0xDA,0x59},
+ {0xDA,0x62}, {0xDA,0x58}, {0xB5,0x4C}, {0xDA,0x60},
+ {0xDA,0x5E}, {0xDA,0x5F}, {0xB5,0x4A}, {0xDA,0x63},
+ {0x95,0xBC}, {0xFD,0xED}, {0xFD,0xF7}, {0xDA,0x5C},
+ {0xDA,0x5A}, {0xB5,0x4B}, {0xDA,0x5D}, {0xDA,0x61},
+ {0x98,0x70}, {0x96,0xF6}, {0x8E,0xA9}, {0xB5,0x4D},
+ {0xDA,0x64}, {0x94,0x51}, {0x8E,0x43}, {0x8B,0x5A},
+ {0xDE,0x70}, {0xDE,0x77}, {0xDE,0x79}, {0xDE,0xA1},
+ {0xFD,0xEE}, {0xB7,0xDA}, {0xDE,0x6B}, {0xB7,0xD2},
+ {0xFD,0xF0}, {0xDE,0x7A}, {0xB7,0xD7}, {0xDE,0xA2},
+ {0xB7,0xCE}, {0xFD,0xF4}, {0xDE,0x7D}, {0x9B,0xF5},
+ {0xDE,0x6D}, {0xDE,0x7E}, {0xDE,0x6C}, {0xB7,0xDC},
+ {0xDE,0x78}, {0xB7,0xCF}, {0xDE,0xA3}, {0xB7,0xD4},
+ {0xDE,0x71}, {0xB7,0xD9}, {0xDE,0x7C}, {0xDE,0x6F},
+ {0xDE,0x76}, {0xDE,0x72}, {0xDE,0x6E}, {0xB7,0xD1},
+ {0xB7,0xD8}, {0xB7,0xD6}, {0xB7,0xD3}, {0xB7,0xDB},
+ {0xB7,0xD0}, {0xDE,0x75}, {0x97,0x7E}, {0xB7,0xD5},
+ {0xB5,0x4E}, {0xDE,0x7B}, {0x9B,0xD5}, {0xDE,0x73},
+ {0x9A,0xC3}, {0x97,0xC8}, {0xA0,0xDB}, {0x91,0xD0},
+ {0xDE,0x74}, {0x9F,0xE4}, {0xE2,0xC1}, {0x8F,0xDD},
+ {0xBA,0xB4}, {0x91,0xE9}, {0xE2,0xBD}, {0xE2,0xC3},
+ {0xE2,0xBF}, {0xBA,0xB6}, {0xE2,0xBE}, {0xE2,0xC2},
+ {0xE2,0xBA}, {0x98,0xE0}, {0xE2,0xBC}, {0xBA,0xB5},
+ {0x92,0xCA}, {0x98,0x57}, {0xE2,0xC0}, {0xE2,0xBB},
+ {0x8C,0x51}, {0xBA,0xB7}, {0xBA,0xB2}, {0xFD,0xEB},
+ {0xE2,0xC4}, {0x9B,0x49}, {0xBA,0xB3}, {0xE6,0x67},
+ {0xE6,0x64}, {0xE6,0x70}, {0xE6,0x6A}, {0xE6,0x6C},
+ {0xBC,0xF4}, {0xE6,0x66}, {0xE6,0x6E}, {0x9D,0x76},
+ {0x9E,0xAF}, {0xE6,0x6D}, {0xE6,0x6B}, {0xE6,0x71},
+ {0xBC,0xF7}, {0xE6,0x68}, {0xE6,0x6F}, {0xBC,0xF5},
+ {0x9C,0xCC}, {0xE6,0x63}, {0xE6,0x65}, {0xBC,0xF6},
+ {0xE6,0x62}, {0xE6,0x72}, {0xFD,0xEA}, {0xE6,0x69},
+ {0x8D,0xF1}, {0xEA,0x4A}, {0xBF,0x51}, {0xFD,0xFB},
+ {0xEA,0x55}, {0xEA,0x53}, {0xBF,0x4B}, {0xEA,0x49},
+ {0xEA,0x4C}, {0xEA,0x4D}, {0xEA,0x48}, {0xBF,0x55},
+ {0xBF,0x56}, {0xEA,0x47}, {0xEA,0x56}, {0xEA,0x51},
+ {0xBF,0x4F}, {0xBF,0x4C}, {0xEA,0x50}, {0xEA,0x4E},
+ {0xBF,0x52}, {0xEA,0x52}, {0xBF,0x4D}, {0x8E,0x53},
+ {0xBF,0x4E}, {0xEA,0x4F}, {0xBF,0x50}, {0xEA,0x4B},
+ {0xEA,0x54}, {0xBF,0x53}, {0xEA,0x57}, {0xEA,0x58},
+ {0xBF,0x54}, {0xFA,0xCF}, {0xC0,0xE7}, {0xC0,0xEE},
+ {0xED,0x5C}, {0xED,0x62}, {0xED,0x60}, {0xC0,0xEA},
+ {0xC0,0xE9}, {0xC0,0xE6}, {0xED,0x5E}, {0x96,0xF9},
+ {0xC0,0xEC}, {0xC0,0xEB}, {0xC0,0xE8}, {0xED,0x61},
+ {0xED,0x5D}, {0xED,0x5F}, {0xC0,0xED}, {0x98,0xBF},
+ {0x9E,0x49}, {0xC2,0x77}, {0xEF,0xFB}, {0xC2,0x74},
+ {0xC2,0x75}, {0xEF,0xFD}, {0xC2,0x76}, {0xEF,0xFA},
+ {0x8C,0xA7}, {0xEF,0xF9}, {0xF2,0x6C}, {0xEF,0xFC},
+ {0xF2,0x6D}, {0xC3,0x7A}, {0xF2,0x6B}, {0x9B,0xCA},
+ {0xF2,0x6A}, {0xF2,0x69}, {0xC3,0x7B}, {0xFD,0xFE},
+ {0x92,0xDC}, {0xC4,0x6C}, {0xF4,0x6A}, {0xF4,0x6B},
+ {0xFE,0x41}, {0x91,0xCC}, {0x91,0xE2}, {0xF5,0xDC},
+ {0xF5,0xDB}, {0xC4,0xEA}, {0xF5,0xDA}, {0xF6,0xEC},
+ {0xF6,0xED}, {0xF7,0xE6}, {0xF8,0xB1}, {0xFE,0x44},
+ {0xF8,0xF6}, {0xF9,0xBC}, {0xC6,0x79}, {0xF9,0xC6},
+ {0xA4,0xF6}, {0x8B,0xD3}, {0xAA,0xA6}, {0xAA,0xA7},
+ {0xFE,0x47}, {0xAC,0xB8}, {0xC0,0xEF}, {0xA4,0xF7},
+ {0xAA,0xA8}, {0xAF,0x52}, {0xB7,0xDD}, {0xA4,0xF8},
+ {0xB2,0x6E}, {0xBA,0xB8}, {0xC9,0x62}, {0xFE,0x48},
+ {0xCF,0xB7}, {0xD2,0x7D}, {0xE2,0xC5}, {0xC0,0xF0},
+ {0xA4,0xF9}, {0xAA,0xA9}, {0xCF,0xB8}, {0xCF,0xB9},
+ {0xDA,0x66}, {0xB5,0x50}, {0xDE,0xA4}, {0x94,0x55},
+ {0xB7,0xDE}, {0xE2,0xC6}, {0xFE,0x4B}, {0xBC,0xF8},
+ {0xFE,0x4C}, {0xC3,0x7C}, {0xA4,0xFA}, {0xDA,0x67},
+ {0xA4,0xFB}, {0x8D,0xBF}, {0xA6,0xC9}, {0xCA,0x42},
+ {0xA6,0xC8}, {0xA8,0x65}, {0xA8,0x64}, {0xA8,0x63},
+ {0xCB,0x60}, {0x9E,0x78}, {0xAA,0xAA}, {0xAA,0xAB},
+ {0xCD,0x5B}, {0xCF,0xBA}, {0xCF,0xBD}, {0xAC,0xBA},
+ {0xCF,0xBB}, {0xAC,0xB9}, {0xCF,0xBC}, {0xAC,0xBB},
+ {0xD2,0xA2}, {0xD2,0xA1}, {0xD2,0x7E}, {0xAF,0x53},
+ {0xD6,0x5D}, {0xD6,0x5E}, {0xB2,0x6F}, {0xD6,0x5C},
+ {0xD6,0x5F}, {0xB5,0x52}, {0xB2,0x70}, {0xFE,0x51},
+ {0xB5,0x51}, {0xDA,0x6B}, {0xDA,0x6A}, {0x94,0x56},
+ {0xDA,0x68}, {0xDA,0x69}, {0xDA,0x6C}, {0xDE,0xA6},
+ {0xDE,0xA5}, {0xDE,0xA9}, {0x9D,0x61}, {0xDE,0xA8},
+ {0xDE,0xA7}, {0xBA,0xB9}, {0xE2,0xC9}, {0x94,0x57},
+ {0xE2,0xC8}, {0xBA,0xBA}, {0xE2,0xC7}, {0xE6,0x73},
+ {0xE6,0x74}, {0xBC,0xF9}, {0xEA,0x59}, {0xEA,0x5A},
+ {0x99,0x66}, {0xF2,0x72}, {0xC3,0x7D}, {0xF2,0x71},
+ {0xF2,0x70}, {0xF2,0x6E}, {0xF2,0x6F}, {0xC4,0xEB},
+ {0xF4,0x6C}, {0xF6,0xEE}, {0xF8,0xF7}, {0xA4,0xFC},
+ {0x8B,0xD5}, {0xC9,0xA5}, {0xA5,0xC7}, {0xC9,0xA6},
+ {0xA0,0x69}, {0xCA,0x43}, {0xCA,0x44}, {0xCB,0x66},
+ {0xCB,0x62}, {0xCB,0x61}, {0xAA,0xAC}, {0xCB,0x65},
+ {0xA8,0x67}, {0xCB,0x63}, {0xA8,0x66}, {0xCB,0x67},
+ {0xCB,0x64}, {0xCD,0x5F}, {0xCF,0xBE}, {0xCD,0x5D},
+ {0xCD,0x64}, {0x98,0xB4}, {0xAA,0xAD}, {0xAA,0xB0},
+ {0xCD,0x65}, {0xCD,0x61}, {0xCD,0x62}, {0xCD,0x5C},
+ {0xAA,0xAF}, {0xCD,0x5E}, {0xAA,0xAE}, {0xCD,0x63},
+ {0xCD,0x60}, {0xCF,0xC2}, {0xAC,0xBD}, {0xAC,0xBE},
+ {0xA0,0x49}, {0xCF,0xC5}, {0xCF,0xBF}, {0xCF,0xC4},
+ {0xCF,0xC0}, {0xAC,0xBC}, {0xCF,0xC3}, {0xCF,0xC1},
+ {0xD2,0xA8}, {0xD2,0xA5}, {0xD2,0xA7}, {0xAF,0x58},
+ {0xAF,0x57}, {0xAF,0x55}, {0xD2,0xA4}, {0xD2,0xA9},
+ {0xAF,0x54}, {0xAF,0x56}, {0xD2,0xA6}, {0xD6,0x67},
+ {0xD2,0xA3}, {0xD2,0xAA}, {0xA0,0x4C}, {0x9E,0x65},
+ {0xD6,0x62}, {0xD6,0x66}, {0xD6,0x65}, {0xDA,0x6E},
+ {0xDA,0x79}, {0xD6,0x68}, {0x98,0xB5}, {0xD6,0x63},
+ {0xDA,0x6D}, {0xB2,0x74}, {0xB2,0x73}, {0xD6,0x61},
+ {0xD6,0x64}, {0xB2,0x75}, {0xB2,0x72}, {0xB2,0x71},
+ {0xD6,0x60}, {0xD6,0x69}, {0xDA,0x70}, {0xDA,0x77},
+ {0xB5,0x54}, {0xDA,0x76}, {0xDA,0x73}, {0xFE,0x58},
+ {0xB5,0x56}, {0x99,0x75}, {0xFE,0x53}, {0xA0,0x65},
+ {0xDA,0x75}, {0xFE,0x59}, {0xDA,0x6F}, {0xDA,0x71},
+ {0xDA,0x74}, {0xDA,0x72}, {0xB5,0x55}, {0xDA,0x78},
+ {0xB5,0x53}, {0xB7,0xDF}, {0x98,0xB7}, {0x98,0xB8},
+ {0xDE,0xAD}, {0xDE,0xAC}, {0xDE,0xAA}, {0xB7,0xE2},
+ {0xB7,0xE1}, {0xDE,0xAE}, {0x98,0xBA}, {0xDE,0xAB},
+ {0xE2,0xCA}, {0xBA,0xBB}, {0xB7,0xE0}, {0x98,0xBB},
+ {0xDE,0xB0}, {0xDE,0xAF}, {0xE2,0xCD}, {0xE2,0xCB},
+ {0xBC,0xFA}, {0x9F,0xBC}, {0xBA,0xBC}, {0xE2,0xCC},
+ {0xE6,0x76}, {0xBC,0xFB}, {0xE6,0x75}, {0xE6,0x7E},
+ {0xE6,0x7D}, {0xE6,0x7B}, {0xE6,0x7A}, {0xE6,0x77},
+ {0xE6,0x78}, {0xE6,0x79}, {0xE6,0x7C}, {0xE6,0xA1},
+ {0xEA,0x5F}, {0xEA,0x5C}, {0xEA,0x5D}, {0xBF,0x57},
+ {0xEA,0x5B}, {0xEA,0x61}, {0xEA,0x60}, {0xEA,0x5E},
+ {0xED,0x64}, {0xED,0x65}, {0xC0,0xF1}, {0xA0,0x4A},
+ {0xC0,0xF2}, {0xED,0x63}, {0x9E,0xC7}, {0xC2,0x79},
+ {0xEF,0xFE}, {0xC2,0x78}, {0xC3,0x7E}, {0xC3,0xA1},
+ {0xC4,0x6D}, {0xF4,0x6E}, {0xF4,0x6D}, {0xF5,0xDD},
+ {0xF6,0xEF}, {0xC5,0x7A}, {0xF7,0xE8}, {0xF7,0xE7},
+ {0xF7,0xE9}, {0xA5,0xC8}, {0xCF,0xC6}, {0xAF,0x59},
+ {0xB2,0x76}, {0xD6,0x6A}, {0xA5,0xC9}, {0xC9,0xA7},
+ {0xA4,0xFD}, {0x8C,0xA9}, {0xCA,0x45}, {0x98,0xAE},
+ {0xCB,0x6C}, {0xCB,0x6A}, {0xCB,0x6B}, {0xCB,0x68},
+ {0xA8,0x68}, {0xCB,0x69}, {0x92,0xD6}, {0xFA,0xE1},
+ {0xCD,0x6D}, {0x91,0xD4}, {0xAA,0xB3}, {0xCD,0x6B},
+ {0xCD,0x67}, {0xCD,0x6A}, {0xCD,0x66}, {0xAA,0xB5},
+ {0xCD,0x69}, {0xFA,0xDE}, {0xAA,0xB2}, {0xAA,0xB1},
+ {0xFE,0x5B}, {0xAA,0xB4}, {0xCD,0x6C}, {0xCD,0x68},
+ {0xAC,0xC2}, {0xAC,0xC5}, {0xCF,0xCE}, {0xCF,0xCD},
+ {0xCF,0xCC}, {0xAC,0xBF}, {0xCF,0xD5}, {0xCF,0xCB},
+ {0x8C,0x53}, {0xAC,0xC1}, {0xD2,0xAF}, {0xCF,0xD2},
+ {0xCF,0xD0}, {0xAC,0xC4}, {0xCF,0xC8}, {0xCF,0xD3},
+ {0xCF,0xCA}, {0xCF,0xD4}, {0xCF,0xD1}, {0xCF,0xC9},
+ {0xFE,0x5E}, {0xAC,0xC0}, {0xCF,0xD6}, {0xCF,0xC7},
+ {0xAC,0xC3}, {0xFB,0xD7}, {0xFE,0x5A}, {0x94,0xC5},
+ {0xD2,0xB4}, {0xD2,0xAB}, {0xD2,0xB6}, {0xFA,0xCA},
+ {0xD2,0xAE}, {0xD2,0xB9}, {0xD2,0xBA}, {0xD2,0xAC},
+ {0xD2,0xB8}, {0xD2,0xB5}, {0xD2,0xB3}, {0xD2,0xB7},
+ {0xAF,0x5F}, {0xAF,0x5D}, {0x98,0xC1}, {0x97,0x5C},
+ {0xD2,0xB1}, {0xFE,0x74}, {0xD2,0xAD}, {0x97,0x73},
+ {0xD2,0xB0}, {0xD2,0xBB}, {0xD2,0xB2}, {0xAF,0x5E},
+ {0xCF,0xCF}, {0xAF,0x5A}, {0xAF,0x5C}, {0xFA,0x46},
+ {0x97,0x64}, {0xD6,0x78}, {0xD6,0x6D}, {0xD6,0x6B},
+ {0xFE,0x68}, {0xD6,0x6C}, {0x96,0x4E}, {0xD6,0x73},
+ {0x97,0x65}, {0xD6,0x74}, {0xD6,0x70}, {0xB2,0x7B},
+ {0xD6,0x75}, {0xD6,0x72}, {0xD6,0x6F}, {0x8C,0x5A},
+ {0xB2,0x79}, {0xD6,0x6E}, {0xB2,0x77}, {0xB2,0x7A},
+ {0xD6,0x71}, {0xD6,0x79}, {0xAF,0x5B}, {0xB2,0x78},
+ {0xD6,0x77}, {0xD6,0x76}, {0xB2,0x7C}, {0x89,0xA1},
+ {0x95,0xFA}, {0x92,0xD4}, {0xFE,0x69}, {0xDA,0x7E},
+ {0xFB,0x45}, {0x98,0xC8}, {0xDA,0xA1}, {0xB5,0x60},
+ {0x90,0xEF}, {0xDA,0xA7}, {0x98,0xC9}, {0x98,0xCA},
+ {0xDA,0xA9}, {0xDA,0xA2}, {0xB5,0x5A}, {0xDA,0xA6},
+ {0xDA,0xA5}, {0xB5,0x5B}, {0xB5,0x61}, {0xB5,0x62},
+ {0xDA,0xA8}, {0xB5,0x58}, {0xDA,0x7D}, {0xDA,0x7B},
+ {0xDA,0xA3}, {0xDA,0x7A}, {0xB5,0x5F}, {0xDA,0x7C},
+ {0xDA,0xA4}, {0xDA,0xAA}, {0xB5,0x59}, {0xB5,0x5E},
+ {0xB5,0x5C}, {0xB5,0x5D}, {0x94,0x6D}, {0x94,0xB7},
+ {0xFE,0x6C}, {0xB5,0x57}, {0x94,0x6B}, {0xB7,0xE9},
+ {0xDE,0xB7}, {0xB7,0xE8}, {0xDE,0xBB}, {0x92,0xFC},
+ {0xDE,0xB1}, {0x95,0xEB}, {0xDE,0xBC}, {0xFE,0x73},
+ {0x97,0x6E}, {0xFE,0x5F}, {0xDE,0xB2}, {0xDE,0xB3},
+ {0xDE,0xBD}, {0xDE,0xBA}, {0xDE,0xB8}, {0xDE,0xB9},
+ {0xDE,0xB5}, {0xDE,0xB4}, {0xFD,0xBD}, {0xDE,0xBE},
+ {0xB7,0xE5}, {0x92,0xD5}, {0xDE,0xB6}, {0xB7,0xEA},
+ {0xB7,0xE4}, {0xB7,0xEB}, {0xB7,0xEC}, {0xFE,0xB9},
+ {0xB7,0xE7}, {0xB7,0xE6}, {0xFE,0x71}, {0xE2,0xCE},
+ {0xBA,0xBE}, {0xBA,0xBD}, {0xFB,0xBB}, {0xE2,0xD3},
+ {0x94,0x7A}, {0xBC,0xFC}, {0xBA,0xBF}, {0x95,0xFB},
+ {0xFE,0x77}, {0xBA,0xC1}, {0xE2,0xD4}, {0xB7,0xE3},
+ {0xBA,0xC0}, {0xE2,0xD0}, {0xE2,0xD2}, {0xE2,0xCF},
+ {0xFE,0x79}, {0xE2,0xD1}, {0xFE,0x75}, {0xE6,0xAB},
+ {0x94,0x5D}, {0xE6,0xAA}, {0xE6,0xA7}, {0xBD,0x40},
+ {0xEA,0x62}, {0xBD,0x41}, {0xE6,0xA6}, {0xFE,0x7C},
+ {0xBC,0xFE}, {0xE6,0xA8}, {0xE6,0xA5}, {0xE6,0xA2},
+ {0xE6,0xA9}, {0xE6,0xA3}, {0xE6,0xA4}, {0xBC,0xFD},
+ {0x93,0x44}, {0x8E,0xA6}, {0xED,0x69}, {0xEA,0x66},
+ {0xEA,0x65}, {0xEA,0x67}, {0xED,0x66}, {0xBF,0x5A},
+ {0x92,0xD3}, {0xEA,0x63}, {0x94,0xB8}, {0xBF,0x58},
+ {0xBF,0x5C}, {0xBF,0x5B}, {0xEA,0x64}, {0xEA,0x68},
+ {0xBF,0x59}, {0xFC,0x71}, {0xED,0x6D}, {0xC0,0xF5},
+ {0xC2,0x7A}, {0xC0,0xF6}, {0xC0,0xF3}, {0xED,0x6A},
+ {0xED,0x68}, {0xED,0x6B}, {0xED,0x6E}, {0xC0,0xF4},
+ {0xED,0x6C}, {0xED,0x67}, {0x97,0x5E}, {0xF0,0x42},
+ {0xF0,0x45}, {0xF2,0x75}, {0xF0,0x40}, {0x8C,0xAD},
+ {0xF4,0x6F}, {0xF0,0x46}, {0xC3,0xA2}, {0xF0,0x44},
+ {0xC2,0x7B}, {0xF0,0x41}, {0xF0,0x43}, {0xF0,0x47},
+ {0xF2,0x76}, {0xF2,0x74}, {0xFE,0xA7}, {0xC3,0xA3},
+ {0xF2,0x73}, {0x94,0x6A}, {0xC4,0x6E}, {0x93,0xE3},
+ {0x98,0xCF}, {0xC4,0xED}, {0xF6,0xF1}, {0xC4,0xEC},
+ {0xF6,0xF3}, {0xF6,0xF0}, {0xF6,0xF2}, {0xC5,0xD0},
+ {0xF8,0xB2}, {0xA5,0xCA}, {0xCD,0x6E}, {0xD2,0xBC},
+ {0xD2,0xBD}, {0xB2,0x7D}, {0xDE,0xBF}, {0xBF,0x5D},
+ {0xC3,0xA4}, {0xC5,0x7B}, {0xF8,0xB3}, {0xA5,0xCB},
+ {0xA0,0xD9}, {0xCD,0x6F}, {0xA2,0x60}, {0xCF,0xD7},
+ {0xCF,0xD8}, {0xA0,0xBF}, {0xA0,0x4D}, {0xA0,0xB8},
+ {0xD2,0xBE}, {0xD2,0xBF}, {0xB2,0x7E}, {0xB2,0xA1},
+ {0xA0,0xCE}, {0xDA,0xAB}, {0xDE,0xC2}, {0xDE,0xC1},
+ {0xDE,0xC0}, {0xE2,0xD5}, {0xE2,0xD6}, {0xE2,0xD7},
+ {0xBA,0xC2}, {0xA0,0xB7}, {0xE6,0xAD}, {0xE6,0xAC},
+ {0xEA,0x69}, {0xBF,0x5E}, {0xBF,0x5F}, {0xFE,0xA9},
+ {0xED,0x72}, {0xED,0x6F}, {0xED,0x70}, {0xED,0x71},
+ {0xF0,0x49}, {0xF0,0x48}, {0xC2,0x7C}, {0xF2,0x77},
+ {0xF5,0xDE}, {0xA5,0xCC}, {0x89,0xC3}, {0xAC,0xC6},
+ {0xB2,0xA2}, {0xDE,0xC3}, {0xFE,0xAB}, {0xA5,0xCD},
+ {0xD2,0xC0}, {0xB2,0xA3}, {0xB5,0x63}, {0xB5,0x64},
+ {0xA5,0xCE}, {0xA5,0xCF}, {0xCA,0x46}, {0xA8,0x6A},
+ {0xA8,0x69}, {0xAC,0xC7}, {0xCF,0xD9}, {0xDA,0xAC},
+ {0xA5,0xD0}, {0xA5,0xD1}, {0xA5,0xD2}, {0xA5,0xD3},
+ {0x9D,0xF4}, {0x89,0x6D}, {0xA8,0x6B}, {0xA8,0x6C},
+ {0xCB,0x6E}, {0xCB,0x6D}, {0x9C,0x7B}, {0xAA,0xB6},
+ {0xCD,0x72}, {0xCD,0x70}, {0xCD,0x71}, {0x98,0xD2},
+ {0x9F,0xA9}, {0xCF,0xDA}, {0xCF,0xDB}, {0xFE,0xB2},
+ {0xAC,0xCB}, {0xAC,0xC9}, {0xFE,0xB1}, {0xAC,0xCA},
+ {0xAC,0xC8}, {0x97,0xD9}, {0xA0,0xC4}, {0xAF,0x60},
+ {0x94,0x76}, {0xAF,0x64}, {0xAF,0x63}, {0xD2,0xC1},
+ {0xAF,0x62}, {0xAF,0x61}, {0xD2,0xC2}, {0x99,0x78},
+ {0xB2,0xA6}, {0xD6,0x7B}, {0xD6,0x7A}, {0xB2,0xA4},
+ {0xB2,0xA5}, {0xFE,0xB3}, {0xB5,0x66}, {0xB5,0x65},
+ {0xDA,0xAE}, {0x98,0xD3}, {0xFE,0xB4}, {0xDA,0xAD},
+ {0xB2,0xA7}, {0x98,0xD4}, {0xB7,0xED}, {0xDE,0xC5},
+ {0xB7,0xEE}, {0xDE,0xC4}, {0x9F,0xB9}, {0xE2,0xD8},
+ {0xE6,0xAE}, {0xBD,0x42}, {0xEA,0x6A}, {0x94,0x71},
+ {0xED,0x73}, {0xC3,0xA6}, {0xC3,0xA5}, {0xC5,0x7C},
+ {0xA5,0xD4}, {0xCD,0x73}, {0x98,0xD5}, {0xFE,0xB8},
+ {0xB2,0xA8}, {0xE2,0xD9}, {0xBA,0xC3}, {0xC6,0xD4},
+ {0xCB,0x6F}, {0xCB,0x70}, {0xCD,0x74}, {0xAA,0xB8},
+ {0xAA,0xB9}, {0xAA,0xB7}, {0xFE,0xBA}, {0xAC,0xCF},
+ {0xAC,0xD0}, {0xAC,0xCD}, {0xAC,0xCE}, {0xCF,0xDC},
+ {0xCF,0xDD}, {0xAC,0xCC}, {0xD2,0xC3}, {0x9E,0x5C},
+ {0xAF,0x68}, {0xAF,0x69}, {0xFE,0xBB}, {0xB2,0xAB},
+ {0xD2,0xC9}, {0xAF,0x6E}, {0xAF,0x6C}, {0xD2,0xCA},
+ {0xD2,0xC5}, {0xAF,0x6B}, {0xAF,0x6A}, {0xAF,0x65},
+ {0xD2,0xC8}, {0xD2,0xC7}, {0xD2,0xC4}, {0xAF,0x6D},
+ {0xA0,0x44}, {0xD2,0xC6}, {0xAF,0x66}, {0xAF,0x67},
+ {0x98,0xD7}, {0xB2,0xAC}, {0xD6,0xA1}, {0xD6,0xA2},
+ {0xB2,0xAD}, {0xD6,0x7C}, {0xD6,0x7E}, {0xD6,0xA4},
+ {0xD6,0xA3}, {0xD6,0x7D}, {0xB2,0xA9}, {0xB2,0xAA},
+ {0xDA,0xB6}, {0xB5,0x6B}, {0xB5,0x6A}, {0xDA,0xB0},
+ {0xB5,0x68}, {0x98,0xD8}, {0xDA,0xB3}, {0xB5,0x6C},
+ {0xDA,0xB4}, {0xB5,0x6D}, {0xDA,0xB1}, {0xB5,0x67},
+ {0xB5,0x69}, {0xDA,0xB5}, {0xDA,0xB2}, {0xDA,0xAF},
+ {0xDE,0xD2}, {0xDE,0xC7}, {0xB7,0xF0}, {0xB7,0xF3},
+ {0xB7,0xF2}, {0xB7,0xF7}, {0xB7,0xF6}, {0xDE,0xD3},
+ {0xDE,0xD1}, {0xDE,0xCA}, {0xDE,0xCE}, {0xDE,0xCD},
+ {0xB7,0xF4}, {0xDE,0xD0}, {0xDE,0xCC}, {0xDE,0xD4},
+ {0xDE,0xCB}, {0xB7,0xF5}, {0xB7,0xEF}, {0xB7,0xF1},
+ {0xFE,0xBC}, {0xDE,0xC9}, {0x9F,0xFE}, {0xE2,0xDB},
+ {0xBA,0xC7}, {0xE2,0xDF}, {0xBA,0xC6}, {0xE2,0xDC},
+ {0xBA,0xC5}, {0xDE,0xC8}, {0xDE,0xCF}, {0xE2,0xDE},
+ {0xBA,0xC8}, {0xE2,0xE0}, {0xE2,0xDD}, {0xE2,0xDA},
+ {0xE6,0xB1}, {0xE6,0xB5}, {0xE6,0xB7}, {0xE6,0xB3},
+ {0xE6,0xB2}, {0xE6,0xB0}, {0xBD,0x45}, {0xBD,0x43},
+ {0xBD,0x48}, {0xBD,0x49}, {0xE6,0xB4}, {0xBD,0x46},
+ {0xE6,0xAF}, {0xBD,0x47}, {0xBA,0xC4}, {0xE6,0xB6},
+ {0xBD,0x44}, {0xFE,0xBD}, {0xEA,0x6C}, {0xEA,0x6B},
+ {0xEA,0x73}, {0xEA,0x6D}, {0xEA,0x72}, {0xEA,0x6F},
+ {0xBF,0x60}, {0xEA,0x71}, {0xBF,0x61}, {0xBF,0x62},
+ {0x9D,0xDD}, {0xEA,0x70}, {0xEA,0x6E}, {0x9E,0xE1},
+ {0xC0,0xF8}, {0xED,0x74}, {0xC0,0xF7}, {0xED,0x77},
+ {0xED,0x75}, {0xED,0x76}, {0xC0,0xF9}, {0x98,0xDA},
+ {0x9D,0xDF}, {0xFE,0xBF}, {0xF0,0x4D}, {0xFE,0xBE},
+ {0xC2,0xA1}, {0xF0,0x4E}, {0x9E,0xEB}, {0xC2,0x7D},
+ {0xF0,0x4F}, {0xC2,0x7E}, {0xF0,0x4C}, {0xF0,0x50},
+ {0xF0,0x4A}, {0xC3,0xA7}, {0xF2,0x78}, {0xC3,0xA8},
+ {0xC4,0x6F}, {0xF0,0x4B}, {0xC4,0x70}, {0x9E,0x59},
+ {0xA0,0x5C}, {0xC4,0xEE}, {0xF5,0xDF}, {0xC5,0x7E},
+ {0xF6,0xF4}, {0xC5,0x7D}, {0xFE,0xC0}, {0xF7,0xEA},
+ {0xC5,0xF5}, {0xC5,0xF6}, {0x94,0x77}, {0x98,0xDC},
+ {0xF9,0xCC}, {0xFE,0xC1}, {0xAC,0xD1}, {0xCF,0xDE},
+ {0x98,0xDE}, {0xB5,0x6E}, {0xB5,0x6F}, {0xA5,0xD5},
+ {0xA6,0xCA}, {0xCA,0x47}, {0xCB,0x71}, {0xA8,0x6D},
+ {0xAA,0xBA}, {0xAC,0xD2}, {0xAC,0xD3}, {0xAC,0xD4},
+ {0xD6,0xA6}, {0xD2,0xCB}, {0xAF,0x6F}, {0xB2,0xAE},
+ {0xD6,0xA5}, {0xFE,0xC3}, {0xDA,0xB8}, {0xB5,0x71},
+ {0xDA,0xB7}, {0xB5,0x70}, {0xDE,0xD5}, {0xBD,0x4A},
+ {0xE6,0xBB}, {0xE6,0xB8}, {0xE6,0xB9}, {0xE6,0xBA},
+ {0xFE,0xC8}, {0xED,0x78}, {0xFE,0xC9}, {0xF0,0x51},
+ {0xF4,0x71}, {0xF4,0x70}, {0xF6,0xF5}, {0xA5,0xD6},
+ {0xCD,0x75}, {0xAF,0x70}, {0xB5,0x72}, {0xDE,0xD6},
+ {0xFE,0xCA}, {0xE2,0xE1}, {0xBD,0x4B}, {0xEA,0x74},
+ {0xF0,0x52}, {0xF4,0x72}, {0xA5,0xD7}, {0xAA,0xBB},
+ {0xAC,0xD7}, {0xCF,0xDF}, {0xAC,0xD8}, {0xAC,0xD6},
+ {0xAC,0xD5}, {0xD2,0xCC}, {0xAF,0x71}, {0xFE,0xCB},
+ {0xAF,0x72}, {0xAF,0x73}, {0xB2,0xB0}, {0xD6,0xA7},
+ {0xB2,0xAF}, {0x9F,0xC2}, {0x8C,0x6B}, {0xDA,0xB9},
+ {0xB2,0xB1}, {0xB5,0x73}, {0xDE,0xD7}, {0xB7,0xF8},
+ {0xB7,0xF9}, {0xBA,0xC9}, {0xBA,0xCA}, {0xBD,0x4C},
+ {0xBF,0x64}, {0xEA,0x75}, {0xBF,0x63}, {0xED,0x79},
+ {0xC0,0xFA}, {0xF0,0x53}, {0xF4,0x73}, {0xA5,0xD8},
+ {0xA8,0x6E}, {0xCD,0x78}, {0xCD,0x77}, {0xAA,0xBC},
+ {0xCD,0x76}, {0xAA,0xBD}, {0xCD,0x79}, {0xCF,0xE5},
+ {0xAC,0xDB}, {0xAC,0xDA}, {0xCF,0xE7}, {0xCF,0xE6},
+ {0xAC,0xDF}, {0xAC,0xDE}, {0xAC,0xD9}, {0xCF,0xE1},
+ {0xCF,0xE2}, {0xCF,0xE3}, {0xAC,0xE0}, {0xCF,0xE0},
+ {0xAC,0xDC}, {0xCF,0xE4}, {0xAC,0xDD}, {0x98,0xC4},
+ {0x94,0xB0}, {0x94,0xB1}, {0xD2,0xCF}, {0xD2,0xD3},
+ {0xD2,0xD1}, {0xD2,0xD0}, {0xD2,0xD4}, {0xD2,0xD5},
+ {0xD2,0xD6}, {0xD2,0xCE}, {0xD2,0xCD}, {0xFE,0xD1},
+ {0xAF,0x75}, {0xAF,0x76}, {0xD2,0xD7}, {0xD2,0xD2},
+ {0xA0,0xC1}, {0xD6,0xB0}, {0xFE,0xD2}, {0xD2,0xD8},
+ {0xAF,0x77}, {0xAF,0x74}, {0xA0,0xCD}, {0xD6,0xAA},
+ {0xD6,0xA9}, {0xD6,0xAB}, {0xD6,0xAC}, {0xD6,0xAE},
+ {0xD6,0xAD}, {0xD6,0xB2}, {0xB2,0xB5}, {0xB2,0xB2},
+ {0xB2,0xB6}, {0xD6,0xA8}, {0xB2,0xB7}, {0xD6,0xB1},
+ {0xB2,0xB4}, {0xD6,0xAF}, {0xB2,0xB3}, {0xFE,0xD3},
+ {0x98,0xE5}, {0xDA,0xBC}, {0xDA,0xBE}, {0xDA,0xBA},
+ {0xDA,0xBB}, {0xDA,0xBF}, {0xDA,0xC1}, {0xDA,0xC2},
+ {0xDA,0xBD}, {0xDA,0xC0}, {0xB5,0x74}, {0xDE,0xDB},
+ {0xDE,0xE0}, {0xDE,0xD8}, {0xDE,0xDC}, {0xFE,0xD6},
+ {0xDE,0xE1}, {0xDE,0xDD}, {0xB7,0xFA}, {0xB8,0x43},
+ {0xB7,0xFD}, {0xDE,0xD9}, {0xDE,0xDA}, {0xBA,0xCE},
+ {0xB8,0x46}, {0xB7,0xFE}, {0xB8,0x44}, {0xB7,0xFC},
+ {0xDE,0xDF}, {0xB8,0x45}, {0xDE,0xDE}, {0xB8,0x41},
+ {0xB7,0xFB}, {0xB8,0x42}, {0xDE,0xE2}, {0xE2,0xE6},
+ {0xE2,0xE8}, {0x91,0xE4}, {0x8F,0xC7}, {0x94,0xAE},
+ {0xB8,0x40}, {0x8A,0x4F}, {0x94,0xB2}, {0xE2,0xE3},
+ {0xBA,0xCC}, {0xE2,0xE9}, {0xBA,0xCD}, {0xE2,0xE7},
+ {0xE2,0xE2}, {0xE2,0xE5}, {0xE2,0xEA}, {0xBA,0xCB},
+ {0xE2,0xE4}, {0xBD,0x4E}, {0xE6,0xBF}, {0xE6,0xBE},
+ {0xBD,0x51}, {0xBD,0x4F}, {0xE6,0xBC}, {0xBD,0x4D},
+ {0xE6,0xBD}, {0xBD,0x50}, {0x8F,0xD4}, {0xEA,0x7D},
+ {0xEA,0xA1}, {0x98,0xEA}, {0xEA,0x7E}, {0xEA,0x76},
+ {0xEA,0x7A}, {0xEA,0x79}, {0xEA,0x77}, {0xBF,0x66},
+ {0xBF,0x67}, {0xBF,0x65}, {0xEA,0x78}, {0xEA,0x7B},
+ {0xEA,0x7C}, {0xBF,0x68}, {0xC1,0x40}, {0xED,0xA3},
+ {0xC0,0xFC}, {0xED,0x7B}, {0xC0,0xFE}, {0xC1,0x41},
+ {0xFE,0xD8}, {0xC0,0xFD}, {0xED,0xA2}, {0xED,0x7C},
+ {0xC0,0xFB}, {0xED,0xA1}, {0xED,0x7A}, {0xED,0x7E},
+ {0xED,0x7D}, {0x9D,0xE0}, {0xF0,0x55}, {0xC2,0xA4},
+ {0xC2,0xA5}, {0xC2,0xA2}, {0x98,0xEE}, {0xC2,0xA3},
+ {0xF0,0x54}, {0x95,0xC4}, {0xF2,0x7B}, {0xFC,0xE8},
+ {0xC3,0xA9}, {0xF2,0x79}, {0xF2,0x7A}, {0x98,0xEF},
+ {0xF4,0x74}, {0xF4,0x77}, {0xF4,0x75}, {0xF4,0x76},
+ {0xF5,0xE0}, {0xC4,0xEF}, {0xF7,0xEB}, {0xF8,0xB4},
+ {0xC5,0xF7}, {0xF8,0xF8}, {0xF8,0xF9}, {0xC6,0x66},
+ {0xA5,0xD9}, {0xAC,0xE1}, {0x8C,0x6E}, {0xDA,0xC3},
+ {0xDE,0xE3}, {0xA5,0xDA}, {0xA8,0x6F}, {0xAA,0xBE},
+ {0xFA,0xD8}, {0xCF,0xE8}, {0xCF,0xE9}, {0xAF,0x78},
+ {0xDA,0xC4}, {0xB5,0x75}, {0xB8,0x47}, {0xC1,0x42},
+ {0xED,0xA4}, {0xF2,0x7C}, {0xF4,0x78}, {0xA5,0xDB},
+ {0xFE,0xDC}, {0xCD,0xA1}, {0xCD,0x7A}, {0xCD,0x7C},
+ {0xCD,0x7E}, {0xCD,0x7D}, {0xCD,0x7B}, {0xAA,0xBF},
+ {0xA0,0xAE}, {0xAC,0xE2}, {0xCF,0xF2}, {0xCF,0xED},
+ {0xCF,0xEA}, {0x9D,0x4C}, {0xCF,0xF1}, {0xAC,0xE4},
+ {0xAC,0xE5}, {0xCF,0xF0}, {0xCF,0xEF}, {0xCF,0xEE},
+ {0xCF,0xEB}, {0xCF,0xEC}, {0xCF,0xF3}, {0xAC,0xE3},
+ {0x98,0xF1}, {0x98,0xF3}, {0xAF,0x7C}, {0x94,0xC1},
+ {0xAF,0xA4}, {0xAF,0xA3}, {0xD2,0xE1}, {0xD2,0xDB},
+ {0xD2,0xD9}, {0xAF,0xA1}, {0xD6,0xB9}, {0xAF,0x7A},
+ {0xD2,0xDE}, {0xD2,0xE2}, {0xD2,0xE4}, {0xD2,0xE0},
+ {0xD2,0xDA}, {0xAF,0xA2}, {0xD2,0xDF}, {0xD2,0xDD},
+ {0xAF,0x79}, {0xD2,0xE5}, {0xAF,0xA5}, {0xD2,0xE3},
+ {0xAF,0x7D}, {0xD2,0xDC}, {0xAF,0x7E}, {0xAF,0x7B},
+ {0x98,0xF5}, {0xFA,0x4F}, {0x96,0xE2}, {0x94,0x50},
+ {0xB2,0xB9}, {0x96,0xA2}, {0xD6,0xBA}, {0x98,0xF6},
+ {0xD6,0xB3}, {0xD6,0xB5}, {0xD6,0xB7}, {0x96,0xE5},
+ {0xD6,0xB8}, {0xD6,0xB6}, {0xB2,0xBA}, {0xD6,0xBB},
+ {0x98,0xF7}, {0xD6,0xB4}, {0xA0,0x46}, {0x96,0xE3},
+ {0xDA,0xC8}, {0xB5,0x76}, {0xDA,0xD0}, {0xDA,0xC5},
+ {0xDA,0xD1}, {0xDA,0xC6}, {0xDA,0xC7}, {0x98,0xF8},
+ {0xDA,0xCF}, {0xDA,0xCE}, {0xDA,0xCB}, {0xB2,0xB8},
+ {0xB5,0x77}, {0xDA,0xC9}, {0xDA,0xCC}, {0xB5,0x78},
+ {0xDA,0xCD}, {0xDA,0xCA}, {0xDE,0xEE}, {0x9E,0xE4},
+ {0xDE,0xF2}, {0xB8,0x4E}, {0xE2,0xF0}, {0xB8,0x51},
+ {0xDE,0xF0}, {0xF9,0xD6}, {0xDE,0xED}, {0xDE,0xE8},
+ {0xDE,0xEA}, {0xDE,0xEB}, {0xDE,0xE4}, {0x94,0xC3},
+ {0xB8,0x4D}, {0xB8,0x4C}, {0x94,0xC2}, {0xB8,0x48},
+ {0xDE,0xE7}, {0xB8,0x4F}, {0xB8,0x50}, {0xDE,0xE6},
+ {0xDE,0xE9}, {0xDE,0xF1}, {0xB8,0x4A}, {0xB8,0x4B},
+ {0xDE,0xEF}, {0xDE,0xE5}, {0xE2,0xF2}, {0xBA,0xD0},
+ {0xE2,0xF4}, {0xDE,0xEC}, {0xE2,0xF6}, {0xBA,0xD4},
+ {0xE2,0xF7}, {0xE2,0xF3}, {0xBA,0xD1}, {0xE2,0xEF},
+ {0xBA,0xD3}, {0xE2,0xEC}, {0xE2,0xF1}, {0xE2,0xF5},
+ {0xE2,0xEE}, {0xFE,0xE1}, {0xB8,0x49}, {0xFE,0xE9},
+ {0xE2,0xEB}, {0xBA,0xD2}, {0xE2,0xED}, {0x96,0xE4},
+ {0x89,0xAC}, {0x96,0xDB}, {0xBD,0x54}, {0xE6,0xC1},
+ {0xBD,0x58}, {0xBD,0x56}, {0xBA,0xCF}, {0xE6,0xC8},
+ {0xE6,0xC9}, {0xBD,0x53}, {0xFE,0xE2}, {0xE6,0xC7},
+ {0xE6,0xCA}, {0xBD,0x55}, {0xBD,0x52}, {0xE6,0xC3},
+ {0xE6,0xC0}, {0xE6,0xC5}, {0xE6,0xC2}, {0xBD,0x59},
+ {0xE6,0xC4}, {0x94,0xC4}, {0xFE,0xE3}, {0xE6,0xC6},
+ {0xBD,0x57}, {0xFE,0xE7}, {0x9F,0xFB}, {0xBF,0x6A},
+ {0xEA,0xA8}, {0xEA,0xA2}, {0xEA,0xA6}, {0xEA,0xAC},
+ {0xEA,0xAD}, {0xEA,0xA9}, {0xEA,0xAA}, {0xEA,0xA7},
+ {0x8C,0x59}, {0xEA,0xA4}, {0xBF,0x6C}, {0xBF,0x69},
+ {0xEA,0xA3}, {0xEA,0xA5}, {0xBF,0x6B}, {0xEA,0xAB},
+ {0x93,0xC9}, {0xC1,0x46}, {0x94,0xE8}, {0xFB,0x56},
+ {0xED,0xAA}, {0xED,0xA5}, {0xC1,0x45}, {0x90,0xC5},
+ {0xC1,0x43}, {0xED,0xAC}, {0xC1,0x44}, {0xED,0xA8},
+ {0xED,0xA9}, {0xED,0xA6}, {0xED,0xAD}, {0xF0,0x56},
+ {0xC1,0x47}, {0xED,0xA7}, {0xED,0xAE}, {0xED,0xAB},
+ {0xA0,0xA8}, {0xF0,0x5A}, {0xF0,0x57}, {0xC2,0xA6},
+ {0xF0,0x5B}, {0xF0,0x5D}, {0xF0,0x5C}, {0xF0,0x58},
+ {0xF0,0x59}, {0xF2,0xA3}, {0xC3,0xAA}, {0xF2,0x7E},
+ {0xF2,0xA2}, {0xF2,0x7D}, {0xF2,0xA4}, {0xF2,0xA1},
+ {0xF4,0x7A}, {0xF4,0x7D}, {0xF4,0x79}, {0xC4,0x71},
+ {0xF4,0x7B}, {0xF4,0x7C}, {0xF4,0x7E}, {0xC4,0x72},
+ {0xC4,0x74}, {0xC4,0x73}, {0xF5,0xE1}, {0xFE,0xE5},
+ {0xF5,0xE3}, {0xF5,0xE2}, {0x98,0xFD}, {0x98,0xFB},
+ {0xFE,0xE8}, {0xF6,0xF6}, {0x8E,0xBF}, {0xF8,0xB5},
+ {0xF8,0xFA}, {0xA5,0xDC}, {0x8B,0xD8}, {0xFE,0xF7},
+ {0xCB,0x72}, {0xAA,0xC0}, {0xCD,0xA3}, {0xAA,0xC1},
+ {0xAA,0xC2}, {0xCD,0xA2}, {0xCF,0xF8}, {0xCF,0xF7},
+ {0xAC,0xE6}, {0xAC,0xE9}, {0xAC,0xE8}, {0xAC,0xE7},
+ {0xCF,0xF4}, {0xCF,0xF6}, {0xCF,0xF5}, {0xD2,0xE8},
+ {0xAF,0xA7}, {0xD2,0xEC}, {0xD2,0xEB}, {0xD2,0xEA},
+ {0xD2,0xE6}, {0xAF,0xA6}, {0xAF,0xAA}, {0xAF,0xAD},
+ {0x8F,0x68}, {0x94,0xC6}, {0xAF,0xAE}, {0xD2,0xE7},
+ {0xD2,0xE9}, {0xAF,0xAC}, {0xAF,0xAB}, {0xAF,0xA9},
+ {0xAF,0xA8}, {0xD6,0xC2}, {0x9D,0xEA}, {0xD6,0xC0},
+ {0xD6,0xBC}, {0xB2,0xBB}, {0xD6,0xBD}, {0xB2,0xBC},
+ {0xD6,0xBE}, {0xD6,0xBF}, {0xD6,0xC1}, {0xB2,0xBD},
+ {0xDA,0xD5}, {0xFC,0x69}, {0xDA,0xD4}, {0xDA,0xD3},
+ {0xDA,0xD2}, {0xDE,0xF6}, {0xB8,0x52}, {0xDE,0xF3},
+ {0xDE,0xF5}, {0x9C,0xDA}, {0xB8,0x53}, {0xFE,0xF3},
+ {0xB8,0x54}, {0xDE,0xF4}, {0x9C,0x72}, {0xFE,0xF0},
+ {0x89,0xC9}, {0xE3,0x41}, {0xE2,0xF9}, {0xE2,0xFA},
+ {0xBA,0xD7}, {0xBA,0xD5}, {0xBA,0xD6}, {0xE3,0x43},
+ {0x99,0x41}, {0xE3,0x42}, {0xE2,0xFE}, {0xE2,0xFD},
+ {0xE2,0xFC}, {0xE2,0xFB}, {0xE3,0x40}, {0xE2,0xF8},
+ {0x99,0x42}, {0xE6,0xCB}, {0xE6,0xD0}, {0xE6,0xCE},
+ {0xFE,0xF5}, {0x91,0xD7}, {0xE6,0xCD}, {0xE6,0xCC},
+ {0xE6,0xCF}, {0xEA,0xAE}, {0x94,0xCC}, {0xBF,0x6D},
+ {0xC1,0x48}, {0xED,0xB0}, {0xFE,0xF8}, {0xC1,0x49},
+ {0xED,0xAF}, {0xF0,0x5F}, {0xF0,0x5E}, {0xC2,0xA7},
+ {0xF2,0xA5}, {0xC3,0xAB}, {0xF4,0xA1}, {0xC5,0xA1},
+ {0xF6,0xF7}, {0xF8,0xB7}, {0xF8,0xB6}, {0xC9,0xA8},
+ {0xAC,0xEA}, {0xAC,0xEB}, {0xD6,0xC3}, {0xB8,0x56},
+ {0xA5,0xDD}, {0xA8,0x72}, {0xA8,0x71}, {0xA8,0x70},
+ {0x97,0xA8}, {0xCD,0xA4}, {0xFE,0xFC}, {0xAA,0xC4},
+ {0xAA,0xC3}, {0xAC,0xEE}, {0xFD,0xBF}, {0xCF,0xFA},
+ {0xCF,0xFD}, {0xCF,0xFB}, {0xAC,0xEC}, {0xAC,0xED},
+ {0xFE,0xFE}, {0xCF,0xF9}, {0xCF,0xFC}, {0xAF,0xB5},
+ {0xD2,0xF3}, {0xD2,0xF5}, {0xD2,0xF4}, {0xAF,0xB2},
+ {0xD2,0xEF}, {0x96,0xD1}, {0xAF,0xB0}, {0xAF,0xAF},
+ {0xAF,0xB3}, {0xAF,0xB1}, {0xAF,0xB4}, {0xD2,0xF2},
+ {0xD2,0xED}, {0xD2,0xEE}, {0xD2,0xF1}, {0xD2,0xF0},
+ {0x94,0xD5}, {0x94,0xD0}, {0xD6,0xC6}, {0xD6,0xC7},
+ {0xD6,0xC5}, {0xD6,0xC4}, {0xB2,0xBE}, {0xB5,0x7D},
+ {0xDA,0xD6}, {0xDA,0xD8}, {0xDA,0xDA}, {0xB5,0x7C},
+ {0x99,0x44}, {0xB5,0x7A}, {0xDA,0xD7}, {0xB5,0x7B},
+ {0xDA,0xD9}, {0xB5,0x79}, {0xDF,0x41}, {0xDE,0xF7},
+ {0xDE,0xFA}, {0xDE,0xFE}, {0xB8,0x5A}, {0xDE,0xFC},
+ {0xDE,0xFB}, {0xDE,0xF8}, {0xDE,0xF9}, {0xB8,0x58},
+ {0xDF,0x40}, {0xB8,0x57}, {0xB8,0x5C}, {0xB8,0x5B},
+ {0xB8,0x59}, {0xDE,0xFD}, {0xE3,0x49}, {0xE3,0x48},
+ {0x8C,0x63}, {0xE3,0x44}, {0xA0,0xB3}, {0xBA,0xD8},
+ {0xE3,0x47}, {0xE3,0x46}, {0xBA,0xD9}, {0xBD,0x5E},
+ {0xE6,0xD2}, {0x94,0xCF}, {0xBD,0x5F}, {0xBD,0x5B},
+ {0xBD,0x5D}, {0x9F,0xFA}, {0xBD,0x5A}, {0xBD,0x5C},
+ {0x91,0xE5}, {0xEA,0xAF}, {0x9C,0x6A}, {0xBF,0x70},
+ {0xEA,0xB1}, {0xEA,0xB0}, {0x8E,0x49}, {0xE3,0x45},
+ {0xBF,0x72}, {0xBF,0x71}, {0xBF,0x6E}, {0xBF,0x6F},
+ {0xED,0xB5}, {0xED,0xB3}, {0xC1,0x4A}, {0xED,0xB4},
+ {0xED,0xB6}, {0xED,0xB2}, {0xED,0xB1}, {0xF0,0x60},
+ {0xC2,0xAA}, {0xC2,0xA8}, {0xC2,0xA9}, {0x8E,0x4C},
+ {0xF2,0xA6}, {0xF2,0xA7}, {0xC3,0xAD}, {0xC3,0xAC},
+ {0xF4,0xA3}, {0xF4,0xA4}, {0xF4,0xA2}, {0xF6,0xF8},
+ {0xF6,0xF9}, {0xA5,0xDE}, {0xCA,0x48}, {0xA8,0x73},
+ {0xCD,0xA5}, {0xAA,0xC6}, {0xAA,0xC5}, {0xCD,0xA6},
+ {0x8E,0x4D}, {0xD0,0x40}, {0xAC,0xEF}, {0xCF,0xFE},
+ {0xAC,0xF0}, {0x9A,0x73}, {0xAF,0xB6}, {0xD2,0xF8},
+ {0xD2,0xF6}, {0xD2,0xFC}, {0xAF,0xB7}, {0xD2,0xF7},
+ {0xD2,0xFB}, {0xD2,0xF9}, {0xD2,0xFA}, {0xD6,0xC8},
+ {0xD6,0xCA}, {0x99,0x47}, {0xB2,0xBF}, {0x8C,0xB1},
+ {0xD6,0xC9}, {0xB2,0xC0}, {0xB5,0xA2}, {0xB5,0xA1},
+ {0xB5,0x7E}, {0xDA,0xDB}, {0xDF,0x44}, {0xB8,0x5D},
+ {0xB8,0x5E}, {0xDF,0x43}, {0xDF,0x42}, {0xE3,0x4A},
+ {0xBA,0xDB}, {0xBA,0xDA}, {0xE3,0x4B}, {0xE3,0x4C},
+ {0xBD,0x61}, {0xBD,0x60}, {0x8E,0x50}, {0xEA,0xB5},
+ {0xE6,0xD3}, {0xE6,0xD5}, {0xE6,0xD4}, {0xEA,0xB4},
+ {0xEA,0xB2}, {0xEA,0xB6}, {0xEA,0xB3}, {0xBF,0x73},
+ {0x8E,0x4F}, {0x99,0x49}, {0xED,0xB7}, {0xC1,0x4B},
+ {0xED,0xB8}, {0xED,0xB9}, {0x8E,0x51}, {0x8E,0x52},
+ {0xC2,0xAB}, {0xC2,0xAC}, {0xC4,0x75}, {0x9A,0xB2},
+ {0x89,0xA5}, {0xC5,0xD1}, {0xA5,0xDF}, {0x99,0x4C},
+ {0xD0,0x41}, {0x9F,0xF8}, {0xD2,0xFD}, {0xAF,0xB8},
+ {0x8E,0x56}, {0x99,0x4D}, {0x91,0xCA}, {0x8E,0x57},
+ {0xB3,0xBA}, {0xB3,0xB9}, {0x94,0xE1}, {0xB5,0xA4},
+ {0xDA,0xDD}, {0xB5,0xA3}, {0xDA,0xDC}, {0x90,0x47},
+ {0x8F,0xD8}, {0x8E,0x58}, {0xDF,0x45}, {0xBA,0xDC},
+ {0xE3,0x4D}, {0xBA,0xDD}, {0xC4,0x76}, {0xF4,0xA5},
+ {0xA6,0xCB}, {0xAA,0xC7}, {0xCD,0xA7}, {0xAC,0xF2},
+ {0x94,0xEB}, {0xAC,0xF1}, {0xD0,0x42}, {0xD0,0x43},
+ {0xD3,0x40}, {0xD3,0x42}, {0xAF,0xB9}, {0xD3,0x44},
+ {0xD3,0x47}, {0xD3,0x45}, {0x8E,0x5C}, {0x95,0x53},
+ {0xD3,0x46}, {0xD3,0x43}, {0xD2,0xFE}, {0xAF,0xBA},
+ {0xD3,0x48}, {0xD3,0x41}, {0x9F,0xE5}, {0xD6,0xD3},
+ {0xB2,0xC6}, {0xD6,0xDC}, {0xB2,0xC3}, {0xD6,0xD5},
+ {0xB2,0xC7}, {0x9F,0x56}, {0xB2,0xC1}, {0xD6,0xD0},
+ {0xD6,0xDD}, {0xD6,0xD1}, {0xD6,0xCE}, {0xB2,0xC5},
+ {0x95,0x4F}, {0xB2,0xC2}, {0x8E,0x5E}, {0xD6,0xD4},
+ {0xD6,0xD7}, {0xB2,0xC4}, {0xD6,0xD8}, {0xB2,0xC8},
+ {0xD6,0xD9}, {0xD6,0xCF}, {0xD6,0xD6}, {0xD6,0xDA},
+ {0xD6,0xD2}, {0xD6,0xCD}, {0xD6,0xCB}, {0xD6,0xDB},
+ {0x99,0x6A}, {0xDA,0xDF}, {0xDA,0xE4}, {0x9C,0x64},
+ {0x9C,0xD9}, {0xDA,0xE0}, {0xDA,0xE6}, {0xB5,0xA7},
+ {0xD6,0xCC}, {0xDA,0xE1}, {0xB5,0xA5}, {0xDA,0xDE},
+ {0xB5,0xAC}, {0xDA,0xE2}, {0xB5,0xAB}, {0xDA,0xE3},
+ {0xB5,0xAD}, {0xB5,0xA8}, {0xB5,0xAE}, {0xB5,0xA9},
+ {0xB5,0xAA}, {0x8E,0x5D}, {0xB5,0xA6}, {0xDA,0xE5},
+ {0xB8,0x61}, {0xDF,0x50}, {0x99,0x50}, {0xDF,0x53},
+ {0xDF,0x47}, {0xDF,0x4C}, {0xDF,0x46}, {0xB8,0x63},
+ {0xDF,0x4A}, {0x99,0x51}, {0xDF,0x48}, {0xB8,0x62},
+ {0x8E,0x62}, {0xDF,0x4F}, {0xDF,0x4E}, {0xDF,0x4B},
+ {0xDF,0x4D}, {0xDF,0x49}, {0xBA,0xE1}, {0xDF,0x52},
+ {0xB8,0x5F}, {0xDF,0x51}, {0x99,0x52}, {0xE3,0x5D},
+ {0xBA,0xE8}, {0xE3,0x58}, {0xBA,0xE7}, {0xE3,0x4E},
+ {0xE3,0x50}, {0xBA,0xE0}, {0xE3,0x55}, {0xE3,0x54},
+ {0xE3,0x57}, {0xBA,0xE5}, {0xE3,0x52}, {0xE3,0x51},
+ {0x8E,0x68}, {0xBA,0xE4}, {0xBA,0xDF}, {0xE3,0x53},
+ {0xBA,0xE2}, {0xE3,0x59}, {0xE3,0x5B}, {0xE3,0x56},
+ {0xE3,0x4F}, {0xBA,0xE3}, {0xBD,0x69}, {0xBA,0xDE},
+ {0x8E,0x61}, {0x9F,0x59}, {0xE3,0x5C}, {0xE6,0xD9},
+ {0xBD,0x62}, {0xE6,0xDB}, {0xBD,0x63}, {0x8B,0xB3},
+ {0xBD,0x65}, {0xE6,0xDE}, {0xE6,0xD6}, {0xBA,0xE6},
+ {0xE6,0xDC}, {0xE6,0xD8}, {0xB8,0x60}, {0xBD,0x68},
+ {0xBD,0x64}, {0xBD,0x66}, {0xBD,0x67}, {0xBF,0x76},
+ {0xE6,0xDD}, {0xE6,0xD7}, {0xBD,0x6A}, {0xE6,0xDA},
+ {0x9F,0x5D}, {0x8E,0x66}, {0xEA,0xC0}, {0xEA,0xBB},
+ {0xEA,0xC5}, {0xBF,0x74}, {0xEA,0xBD}, {0xBF,0x78},
+ {0xEA,0xC3}, {0xEA,0xBA}, {0xEA,0xB7}, {0xEA,0xC6},
+ {0xC1,0x51}, {0xBF,0x79}, {0xEA,0xC2}, {0xEA,0xB8},
+ {0xBF,0x77}, {0xEA,0xBC}, {0xBF,0x7B}, {0xEA,0xB9},
+ {0xEA,0xBE}, {0xBF,0x7A}, {0xEA,0xC1}, {0xEA,0xC4},
+ {0x8C,0xB2}, {0xED,0xCB}, {0xED,0xCC}, {0xED,0xBC},
+ {0xED,0xC3}, {0xED,0xC1}, {0xC1,0x4F}, {0xED,0xC8},
+ {0xEA,0xBF}, {0x8E,0x6E}, {0xED,0xBF}, {0x9F,0x64},
+ {0xED,0xC9}, {0xC1,0x4E}, {0xED,0xBE}, {0xED,0xBD},
+ {0xED,0xC7}, {0xED,0xC4}, {0xED,0xC6}, {0xED,0xBA},
+ {0xED,0xCA}, {0xC1,0x4C}, {0xED,0xC5}, {0xED,0xCE},
+ {0xED,0xC2}, {0xC1,0x50}, {0xC1,0x4D}, {0xED,0xC0},
+ {0xED,0xBB}, {0xED,0xCD}, {0xBF,0x75}, {0x99,0x53},
+ {0xFA,0xB8}, {0xF0,0x63}, {0x99,0x54}, {0xF0,0x61},
+ {0xF0,0x67}, {0xC2,0xB0}, {0xF0,0x65}, {0xF0,0x64},
+ {0xC2,0xB2}, {0xF0,0x6A}, {0xC2,0xB1}, {0xF0,0x6B},
+ {0xF0,0x68}, {0xC2,0xAE}, {0xF0,0x69}, {0xF0,0x62},
+ {0xC2,0xAF}, {0xC2,0xAD}, {0xF2,0xAB}, {0xF0,0x66},
+ {0xF0,0x6C}, {0xF2,0xA8}, {0x8E,0x70}, {0xC3,0xB2},
+ {0xC3,0xB0}, {0xF2,0xAA}, {0xF2,0xAC}, {0xF2,0xA9},
+ {0xC3,0xB1}, {0xC3,0xAE}, {0xC3,0xAF}, {0xC3,0xB3},
+ {0x9F,0x61}, {0xC4,0x78}, {0x8E,0x72}, {0xF4,0xAA},
+ {0xF4,0xA9}, {0xF4,0xA7}, {0xF4,0xA6}, {0xF4,0xA8},
+ {0xC4,0x77}, {0xC4,0x79}, {0xC4,0xF0}, {0xA0,0x6B},
+ {0xF5,0xE5}, {0xF5,0xE4}, {0x9F,0x40}, {0xF6,0xFA},
+ {0xF6,0xFC}, {0xF6,0xFE}, {0xF6,0xFD}, {0xF6,0xFB},
+ {0x94,0xED}, {0xC5,0xA3}, {0xC5,0xA2}, {0xC5,0xD3},
+ {0xC5,0xD2}, {0xC5,0xD4}, {0xF7,0xED}, {0xF7,0xEC},
+ {0xF8,0xFB}, {0xF8,0xB8}, {0xF8,0xFC}, {0xC6,0x58},
+ {0x94,0xEE}, {0xC6,0x59}, {0xF9,0x6D}, {0x9F,0xBD},
+ {0xC6,0x7E}, {0xA6,0xCC}, {0x8E,0x7B}, {0xCD,0xA8},
+ {0xD0,0x45}, {0xD0,0x46}, {0xD0,0x44}, {0x99,0x57},
+ {0x94,0xF7}, {0xAC,0xF3}, {0x9F,0x5F}, {0xD0,0x47},
+ {0xD0,0x48}, {0xD0,0x49}, {0x8E,0x73}, {0xD3,0x49},
+ {0xD3,0x4F}, {0x9F,0x62}, {0xD3,0x4D}, {0xAF,0xBB},
+ {0xD3,0x4B}, {0xD3,0x4C}, {0xD3,0x4E}, {0x94,0xF6},
+ {0xD3,0x4A}, {0xB2,0xC9}, {0xD6,0xDE}, {0xB2,0xCB},
+ {0xD6,0xE0}, {0xB2,0xCA}, {0xD6,0xDF}, {0x99,0x58},
+ {0xDA,0xE8}, {0xB5,0xAF}, {0xDA,0xEA}, {0xDA,0xE7},
+ {0xD6,0xE1}, {0xB5,0xB0}, {0x8E,0x75}, {0xF9,0xDB},
+ {0xDA,0xE9}, {0x90,0x72}, {0x94,0xF8}, {0xDF,0x56},
+ {0xB8,0x64}, {0xDF,0x54}, {0xB8,0x65}, {0xDF,0x55},
+ {0xB8,0x66}, {0x99,0x5A}, {0xBA,0xE9}, {0xE3,0x61},
+ {0xE3,0x5E}, {0xE3,0x60}, {0xBA,0xEA}, {0xBA,0xEB},
+ {0xE3,0x5F}, {0xA0,0xB0}, {0x8C,0xB3}, {0xE6,0xDF},
+ {0x8E,0x79}, {0xE6,0xE0}, {0x8E,0x78}, {0xBD,0x6B},
+ {0xE6,0xE2}, {0xE6,0xE1}, {0x94,0xF3}, {0xA2,0x61},
+ {0xEA,0xCA}, {0xEA,0xCB}, {0xEA,0xC7}, {0x98,0xAF},
+ {0xEA,0xC8}, {0xBF,0x7C}, {0xBF,0x7D}, {0xEA,0xC9},
+ {0xC1,0x57}, {0xA0,0xB2}, {0xC1,0x53}, {0xC1,0x58},
+ {0xC1,0x54}, {0xC1,0x56}, {0xC1,0x52}, {0xC1,0x55},
+ {0x8E,0x7A}, {0xC2,0xB3}, {0xED,0xCF}, {0xF2,0xAE},
+ {0xF2,0xAD}, {0x99,0x5C}, {0xF4,0xAB}, {0xC4,0x7A},
+ {0xC4,0x7B}, {0xF7,0x41}, {0xF5,0xE6}, {0x8E,0x7C},
+ {0xF7,0x40}, {0x8E,0x7D}, {0xF8,0xFD}, {0xF9,0xA4},
+ {0xA6,0xCD}, {0x8B,0xD9}, {0xA8,0x74}, {0x89,0xA2},
+ {0xCD,0xA9}, {0xAA,0xC8}, {0xAC,0xF6}, {0xD0,0x4C},
+ {0xAC,0xF4}, {0xD0,0x4A}, {0xAC,0xF9}, {0xAC,0xF5},
+ {0xAC,0xFA}, {0xAC,0xF8}, {0xD0,0x4B}, {0xAC,0xF7},
+ {0xAF,0xBF}, {0xAF,0xBE}, {0xD3,0x5A}, {0xAF,0xC7},
+ {0xD3,0x53}, {0xD3,0x59}, {0xAF,0xC3}, {0xD3,0x52},
+ {0xD3,0x58}, {0xD3,0x56}, {0xAF,0xC2}, {0xAF,0xC4},
+ {0xD3,0x55}, {0xAF,0xBD}, {0xD3,0x54}, {0xAF,0xC8},
+ {0xAF,0xC5}, {0xAF,0xC9}, {0xAF,0xC6}, {0xD3,0x51},
+ {0xD3,0x50}, {0xD3,0x57}, {0xAF,0xC0}, {0xAF,0xBC},
+ {0xAF,0xC1}, {0x9E,0xD7}, {0xD6,0xF0}, {0xD6,0xE9},
+ {0xB5,0xB5}, {0xD6,0xE8}, {0xB2,0xCF}, {0xB2,0xD6},
+ {0xB2,0xD3}, {0xB2,0xD9}, {0xB2,0xD8}, {0xB2,0xD4},
+ {0xD6,0xE2}, {0xD6,0xE5}, {0xD6,0xE4}, {0xB2,0xD0},
+ {0xD6,0xE6}, {0xD6,0xEF}, {0xB2,0xD1}, {0xD6,0xE3},
+ {0xD6,0xEC}, {0xD6,0xED}, {0xB2,0xD2}, {0xD6,0xEA},
+ {0xB2,0xD7}, {0xB2,0xCD}, {0xB2,0xD5}, {0xD6,0xE7},
+ {0xB2,0xCC}, {0xD6,0xEB}, {0xD6,0xEE}, {0xA0,0xB6},
+ {0xDA,0xFB}, {0xDA,0xF2}, {0xB5,0xB2}, {0xDA,0xF9},
+ {0xDA,0xF6}, {0xDA,0xEE}, {0xDA,0xF7}, {0xB5,0xB4},
+ {0xDA,0xEF}, {0xDA,0xEB}, {0x9E,0x42}, {0xB8,0x6C},
+ {0xDA,0xF4}, {0x8E,0xA4}, {0xB5,0xB1}, {0xDA,0xFA},
+ {0xB5,0xB8}, {0xB5,0xBA}, {0xDA,0xED}, {0xB5,0xB9},
+ {0xDA,0xF0}, {0xB5,0xB3}, {0xDA,0xF8}, {0xDA,0xF1},
+ {0xDA,0xF5}, {0xDA,0xF3}, {0xB5,0xB6}, {0xDA,0xEC},
+ {0xB5,0xBB}, {0xB2,0xCE}, {0xB5,0xB7}, {0xB5,0xBC},
+ {0xB8,0x68}, {0xDF,0x5D}, {0xDF,0x5F}, {0xDF,0x61},
+ {0xDF,0x65}, {0xDF,0x5B}, {0xDF,0x59}, {0xB8,0x6A},
+ {0xDF,0x60}, {0xDF,0x64}, {0xDF,0x5C}, {0xDF,0x58},
+ {0xDF,0x57}, {0x8E,0xA7}, {0x8C,0x76}, {0xDF,0x62},
+ {0xDF,0x5A}, {0xDF,0x5E}, {0xB8,0x6B}, {0xB8,0x69},
+ {0xDF,0x66}, {0xB8,0x67}, {0xDF,0x63}, {0xE3,0x72},
+ {0x95,0x42}, {0xBA,0xEE}, {0xE3,0x6A}, {0xBD,0x78},
+ {0xE3,0x74}, {0xBA,0xF1}, {0xE3,0x78}, {0xBA,0xF7},
+ {0xE3,0x65}, {0x98,0x7D}, {0xE3,0x75}, {0xE3,0x62},
+ {0x97,0x55}, {0xE3,0x77}, {0xE3,0x66}, {0x8E,0xA8},
+ {0xBA,0xFE}, {0xBA,0xFB}, {0xE3,0x76}, {0xE3,0x70},
+ {0xBA,0xED}, {0xBA,0xF5}, {0xBA,0xF4}, {0x8E,0xAA},
+ {0xBA,0xF3}, {0xBA,0xF9}, {0xE3,0x63}, {0xBA,0xFA},
+ {0xE3,0x71}, {0xBA,0xF6}, {0xBA,0xEC}, {0xE3,0x73},
+ {0xBA,0xEF}, {0xBA,0xF0}, {0xBA,0xF8}, {0xE3,0x68},
+ {0xE3,0x67}, {0xE3,0x64}, {0xE3,0x6C}, {0xE3,0x69},
+ {0xE3,0x6D}, {0xBA,0xFD}, {0xE3,0x79}, {0xBA,0xF2},
+ {0xE3,0x6E}, {0xE3,0x6F}, {0x89,0xA3}, {0xE3,0x6B},
+ {0x99,0x60}, {0x99,0x62}, {0xBA,0xFC}, {0x94,0xFC},
+ {0x99,0x61}, {0xE6,0xE7}, {0xBD,0x70}, {0xBD,0x79},
+ {0xBD,0x75}, {0xE6,0xE4}, {0x94,0xFA}, {0xBD,0x72},
+ {0xBD,0x76}, {0xE6,0xF0}, {0xBD,0x6C}, {0xE6,0xE8},
+ {0xBD,0x74}, {0x8E,0xAE}, {0x8E,0xB2}, {0xE6,0xEB},
+ {0xE6,0xE6}, {0xBD,0x73}, {0xBD,0x77}, {0xE6,0xE5},
+ {0xBD,0x71}, {0xE6,0xEF}, {0xBD,0x6E}, {0xE6,0xEE},
+ {0xE6,0xED}, {0xBD,0x7A}, {0xE5,0x72}, {0xBD,0x6D},
+ {0x8E,0xB0}, {0xE6,0xEC}, {0xE6,0xE3}, {0xBD,0x7B},
+ {0xE6,0xEA}, {0xBD,0x6F}, {0x99,0x63}, {0x97,0xAA},
+ {0xE6,0xE9}, {0x94,0xFB}, {0xBF,0xA2}, {0xBF,0xA7},
+ {0xBF,0x7E}, {0xEA,0xD8}, {0xEA,0xCF}, {0xEA,0xDB},
+ {0xEA,0xD3}, {0xEA,0xD9}, {0xBF,0xA8}, {0xBF,0xA1},
+ {0xEA,0xCC}, {0xEA,0xD2}, {0xEA,0xDC}, {0xEA,0xD5},
+ {0xEA,0xDA}, {0xEA,0xCE}, {0xEA,0xD6}, {0xBF,0xA3},
+ {0xEA,0xD4}, {0xBF,0xA6}, {0xBF,0xA5}, {0xEA,0xD0},
+ {0xEA,0xD1}, {0xEA,0xCD}, {0xEA,0xD7}, {0xBF,0xA4},
+ {0xEA,0xDE}, {0xEA,0xDD}, {0x8E,0xBB}, {0xED,0xDA},
+ {0xED,0xD6}, {0xC1,0x5F}, {0xED,0xD0}, {0xC1,0x59},
+ {0xC1,0x69}, {0xED,0xDC}, {0xC1,0x61}, {0xC1,0x5D},
+ {0xED,0xD3}, {0xC1,0x64}, {0xC1,0x67}, {0xED,0xDE},
+ {0xC1,0x5C}, {0xED,0xD5}, {0xC1,0x65}, {0xED,0xE0},
+ {0xED,0xDD}, {0xED,0xD1}, {0xC1,0x60}, {0xC1,0x5A},
+ {0xC1,0x68}, {0xED,0xD8}, {0xC1,0x63}, {0xED,0xD2},
+ {0xC1,0x5E}, {0xED,0xDF}, {0xC1,0x62}, {0xC1,0x5B},
+ {0xED,0xD9}, {0xC1,0x66}, {0xED,0xD7}, {0xED,0xDB},
+ {0xF0,0x6E}, {0xF0,0x74}, {0xC2,0xB9}, {0xF0,0x77},
+ {0xC2,0xB4}, {0xC2,0xB5}, {0xF0,0x6F}, {0xF0,0x76},
+ {0xF0,0x71}, {0xC2,0xBA}, {0xC2,0xB7}, {0x8C,0xDC},
+ {0xF0,0x6D}, {0xC2,0xB6}, {0xF0,0x73}, {0xF0,0x75},
+ {0xC2,0xB8}, {0xF0,0x72}, {0xF0,0x70}, {0x98,0x76},
+ {0x8E,0xA1}, {0xF2,0xB8}, {0xC3,0xB7}, {0xC3,0xB8},
+ {0xC3,0xB4}, {0x8C,0xB4}, {0xC3,0xB5}, {0x8E,0xB7},
+ {0xF2,0xB4}, {0xF2,0xB2}, {0xF2,0xB6}, {0xC3,0xBA},
+ {0xF2,0xB7}, {0xF2,0xB0}, {0xF2,0xAF}, {0xF2,0xB3},
+ {0xF2,0xB1}, {0xC3,0xB6}, {0xF2,0xB5}, {0xF4,0xAC},
+ {0xC4,0x7E}, {0xC4,0x7D}, {0xF4,0xAD}, {0x9D,0xA6},
+ {0xF4,0xAF}, {0xF4,0xAE}, {0xC4,0xA1}, {0xF5,0xEB},
+ {0xF5,0xE8}, {0xF5,0xE9}, {0xF5,0xE7}, {0xF5,0xEA},
+ {0xC4,0xF2}, {0xF5,0xEC}, {0x9E,0xB0}, {0xC4,0xF1},
+ {0xF7,0x42}, {0x8E,0xB8}, {0xC5,0xD5}, {0xC5,0xD7},
+ {0xF7,0xEE}, {0xC5,0xD6}, {0xF8,0xB9}, {0xF9,0x40},
+ {0xF9,0x42}, {0xF8,0xFE}, {0xF9,0x41}, {0xC6,0x6C},
+ {0x9D,0x70}, {0x89,0x6E}, {0x89,0x6F}, {0x89,0x70},
+ {0x89,0x71}, {0x89,0x72}, {0x89,0x73}, {0x89,0x74},
+ {0xA6,0xCE}, {0x89,0x75}, {0xAC,0xFB}, {0xD2,0x6F},
+ {0xAF,0xCA}, {0xB2,0xDA}, {0xDA,0xFC}, {0xDA,0xFD},
+ {0x8E,0xBC}, {0x8E,0xBD}, {0xEA,0xDF}, {0xC1,0x6A},
+ {0xED,0xE1}, {0x8E,0xBE}, {0xC2,0xBB}, {0x9D,0xD1},
+ {0xF2,0xBA}, {0xF2,0xB9}, {0xC4,0xA2}, {0xF5,0xED},
+ {0x94,0xFD}, {0xF7,0x43}, {0xC5,0xF8}, {0xCA,0x49},
+ {0x8B,0xD7}, {0x8B,0xDA}, {0xAA,0xC9}, {0xA8,0x75},
+ {0xD0,0x4D}, {0xD3,0x60}, {0xD3,0x5B}, {0xD3,0x5F},
+ {0xD3,0x5D}, {0xAF,0xCB}, {0xD3,0x5E}, {0xD3,0x5C},
+ {0xD6,0xF1}, {0xDA,0xFE}, {0xDB,0x40}, {0xDF,0x69},
+ {0xDF,0x6A}, {0xB8,0x6E}, {0xB8,0x6F}, {0xDF,0x68},
+ {0xDF,0x6B}, {0xDF,0x67}, {0xB8,0x6D}, {0xBB,0x40},
+ {0xA0,0xE2}, {0xB8,0x70}, {0xE3,0x7A}, {0xBD,0x7C},
+ {0xE6,0xF1}, {0xBD,0x7D}, {0x9F,0xE9}, {0xBF,0xA9},
+ {0xEA,0xE2}, {0xEA,0xE0}, {0xEA,0xE1}, {0xED,0xE4},
+ {0xED,0xE3}, {0xED,0xE2}, {0xF2,0xBB}, {0xC3,0xB9},
+ {0xF2,0xBC}, {0xF7,0x44}, {0xC5,0xF9}, {0xF8,0xBA},
+ {0xA6,0xCF}, {0xAA,0xCB}, {0xAA,0xCA}, {0xD0,0x4F},
+ {0xAC,0xFC}, {0xFD,0xA8}, {0xD0,0x4E}, {0xD3,0x62},
+ {0x8A,0xE7}, {0xAF,0xCC}, {0xD6,0xF2}, {0xD3,0x61},
+ {0x8E,0xC2}, {0xB2,0xDC}, {0xD6,0xF5}, {0xD6,0xF3},
+ {0xD6,0xF4}, {0xB2,0xDB}, {0xDB,0x42}, {0xDB,0x43},
+ {0xDB,0x41}, {0x8E,0xC4}, {0xB8,0x73}, {0xDF,0x6D},
+ {0xDF,0x6C}, {0xDF,0x6E}, {0xB8,0x72}, {0xB8,0x71},
+ {0xE6,0xF2}, {0xE6,0xF4}, {0x99,0x64}, {0xBD,0x7E},
+ {0xE6,0xF3}, {0xEA,0xE3}, {0xBF,0xAA}, {0xF0,0x79},
+ {0x99,0x65}, {0xF0,0x78}, {0xC3,0xBB}, {0xF2,0xBD},
+ {0xC3,0xBD}, {0xC3,0xBC}, {0xF4,0xB0}, {0xF5,0xEE},
+ {0xC4,0xF3}, {0xA6,0xD0}, {0xD0,0x50}, {0xAC,0xFD},
+ {0xD3,0x65}, {0xAF,0xCE}, {0xD3,0x64}, {0xD3,0x63},
+ {0xAF,0xCD}, {0xD6,0xFB}, {0xD6,0xFD}, {0xD6,0xF6},
+ {0xD6,0xF7}, {0xB2,0xDD}, {0xD6,0xF8}, {0xB2,0xDE},
+ {0xD6,0xFC}, {0xD6,0xF9}, {0xD6,0xFA}, {0xB2,0xDF},
+ {0xB5,0xBE}, {0xB5,0xBF}, {0xDB,0x44}, {0xDF,0x6F},
+ {0xDF,0x70}, {0x95,0x4E}, {0xE3,0x7E}, {0xBB,0x43},
+ {0xBB,0x41}, {0xBB,0x42}, {0xE3,0x7B}, {0xE3,0x7C},
+ {0xE3,0x7D}, {0xE6,0xF9}, {0x98,0xB3}, {0xE6,0xFA},
+ {0xBD,0xA1}, {0xE6,0xF7}, {0xE6,0xF6}, {0xE6,0xF8},
+ {0xE6,0xF5}, {0xBF,0xAD}, {0xEA,0xE4}, {0xBF,0xAB},
+ {0xBF,0xAC}, {0xED,0xE6}, {0xC1,0x6B}, {0xED,0xE5},
+ {0xEF,0xA8}, {0xF0,0x7A}, {0xF0,0x7B}, {0xC2,0xBC},
+ {0x8E,0xCB}, {0xC2,0xBD}, {0xC1,0x6C}, {0xF2,0xBE},
+ {0xF2,0xBF}, {0xF4,0xB1}, {0xC4,0xA3}, {0xA6,0xD1},
+ {0x8B,0xDF}, {0xA6,0xD2}, {0xAC,0xFE}, {0xAA,0xCC},
+ {0xAF,0xCF}, {0xD0,0x51}, {0x8E,0xCE}, {0xB5,0xC0},
+ {0xA6,0xD3}, {0xAD,0x41}, {0xD0,0x52}, {0xD0,0x53},
+ {0xAD,0x40}, {0xAD,0x42}, {0xA6,0xD4}, {0xD0,0x54},
+ {0xAF,0xD1}, {0xD3,0x66}, {0xAF,0xD3}, {0xAF,0xD0},
+ {0xAF,0xD2}, {0xD7,0x41}, {0xB2,0xE0}, {0x8E,0xCF},
+ {0xD7,0x40}, {0xD6,0xFE}, {0x99,0x68}, {0xDF,0x71},
+ {0xE3,0xA1}, {0x99,0x69}, {0xBD,0xA2}, {0xBF,0xAE},
+ {0xEA,0xE6}, {0xEA,0xE5}, {0xED,0xE7}, {0x99,0x6B},
+ {0x8E,0xD1}, {0xF5,0xEF}, {0x99,0x6C}, {0xA6,0xD5},
+ {0xCB,0x73}, {0xCD,0xAA}, {0xAD,0x43}, {0xD0,0x55},
+ {0xD3,0x68}, {0x8E,0xD4}, {0x8E,0xD5}, {0xAF,0xD4},
+ {0xD3,0x67}, {0xAF,0xD5}, {0xD7,0x43}, {0xB2,0xE2},
+ {0xD7,0x42}, {0xD7,0x44}, {0xB2,0xE1}, {0xDB,0x46},
+ {0xDB,0x47}, {0xDB,0x45}, {0xB5,0xC1}, {0x99,0x6D},
+ {0xB8,0x74}, {0xB8,0x75}, {0xBB,0x45}, {0xA0,0xBE},
+ {0xE3,0xA3}, {0xE3,0xA2}, {0xBB,0x44}, {0x8E,0xD6},
+ {0xA0,0xBC}, {0xA0,0xB5}, {0xE6,0xFB}, {0xA0,0xB4},
+ {0xE6,0xFC}, {0xEA,0xE7}, {0xC1,0x70}, {0xC1,0x6F},
+ {0xC1,0x6D}, {0xC1,0x6E}, {0xC1,0x71}, {0xF0,0x7C},
+ {0xC2,0xBF}, {0xC2,0xBE}, {0xF2,0xC0}, {0xF4,0xB2},
+ {0xC5,0xA5}, {0xC5,0xA4}, {0xA6,0xD6}, {0x8B,0xE0},
+ {0xD1,0xFB}, {0xB8,0x77}, {0xB5,0xC2}, {0xB8,0x76},
+ {0xBB,0x46}, {0xA6,0xD7}, {0xC9,0xA9}, {0xA6,0xD8},
+ {0xA6,0xD9}, {0xCD,0xAB}, {0xCB,0x76}, {0xCB,0x77},
+ {0xA8,0x77}, {0xCB,0x74}, {0xA8,0x76}, {0xA8,0x79},
+ {0xCB,0x75}, {0xA8,0x7B}, {0xA8,0x7A}, {0xCB,0x78},
+ {0xA8,0x78}, {0x89,0xB5}, {0xAA,0xD1}, {0xAA,0xCF},
+ {0xCD,0xAD}, {0xAA,0xCE}, {0x8E,0xDD}, {0xAA,0xD3},
+ {0xAA,0xD5}, {0xAA,0xD2}, {0xCD,0xB0}, {0xCD,0xAC},
+ {0xAA,0xD6}, {0xAA,0xD0}, {0xA8,0x7C}, {0xAA,0xD4},
+ {0xCD,0xAF}, {0x9E,0x5D}, {0x99,0x71}, {0xCD,0xAE},
+ {0xAA,0xCD}, {0x89,0xAE}, {0x9D,0xE8}, {0xD0,0x5B},
+ {0xAD,0x47}, {0xAD,0x48}, {0xD0,0x5D}, {0x95,0x65},
+ {0xD0,0x57}, {0xD0,0x5A}, {0xD0,0x63}, {0xD0,0x61},
+ {0xAD,0x49}, {0xD0,0x67}, {0xAD,0x4C}, {0xD0,0x64},
+ {0xD0,0x5C}, {0xD0,0x59}, {0xDB,0x49}, {0xD0,0x62},
+ {0xAD,0x44}, {0xD0,0x65}, {0xD0,0x56}, {0xD0,0x5F},
+ {0xAD,0x46}, {0xAD,0x4B}, {0xD0,0x60}, {0xAD,0x4F},
+ {0xAD,0x4D}, {0xD0,0x58}, {0xAD,0x4A}, {0xD0,0x5E},
+ {0xAD,0x4E}, {0xAD,0x45}, {0xD0,0x66}, {0x99,0x72},
+ {0x8B,0x5C}, {0xAF,0xDA}, {0xAF,0xE3}, {0xAF,0xD8},
+ {0xAF,0xD6}, {0xD3,0x6A}, {0xAF,0xDE}, {0xAF,0xDB},
+ {0xD3,0x6C}, {0x89,0xB1}, {0xAF,0xDD}, {0xD3,0x6B},
+ {0xD3,0x69}, {0xD3,0x6E}, {0xAF,0xE2}, {0xAF,0xE0},
+ {0xDB,0x48}, {0xD3,0x6F}, {0xD3,0x6D}, {0xAF,0xD7},
+ {0xA0,0xC0}, {0xAF,0xD9}, {0xAF,0xDC}, {0x8E,0xDF},
+ {0xAF,0xDF}, {0x95,0x66}, {0xAF,0xE1}, {0x99,0x74},
+ {0x99,0x76}, {0x99,0x77}, {0x99,0x79}, {0xD7,0x4E},
+ {0xB2,0xE4}, {0x9D,0xDA}, {0xD7,0x45}, {0xD7,0x47},
+ {0x8E,0xE0}, {0xD7,0x48}, {0xD7,0x50}, {0xD7,0x4C},
+ {0xD7,0x4A}, {0xD7,0x4D}, {0xD7,0x51}, {0xB2,0xE5},
+ {0xB2,0xE9}, {0xD7,0x46}, {0xD7,0x4F}, {0xB2,0xE7},
+ {0x93,0x5C}, {0xB2,0xE6}, {0xD7,0x4B}, {0xD7,0x49},
+ {0xB2,0xE3}, {0xB2,0xE8}, {0x9D,0xE6}, {0x8B,0x5F},
+ {0x95,0x63}, {0xB5,0xC8}, {0xDB,0x51}, {0xDB,0x4F},
+ {0xB5,0xCA}, {0x95,0x67}, {0xDB,0x4A}, {0xDF,0xA1},
+ {0xB5,0xC9}, {0xDB,0x4E}, {0x9D,0xE3}, {0xDB,0x4B},
+ {0xB5,0xC5}, {0xB5,0xCB}, {0xDB,0x50}, {0xB5,0xC7},
+ {0xDB,0x4D}, {0xBB,0x47}, {0xB5,0xC6}, {0xDB,0x4C},
+ {0xB5,0xCC}, {0xB5,0xC4}, {0xB5,0xC3}, {0x99,0x7C},
+ {0x99,0x7D}, {0x99,0x7E}, {0xDF,0x77}, {0xDF,0x75},
+ {0xDF,0x7B}, {0xDF,0x73}, {0xDF,0xA2}, {0xDF,0x78},
+ {0xDF,0x72}, {0xB8,0x7B}, {0xB8,0xA3}, {0xDF,0x7D},
+ {0xDF,0x76}, {0xB8,0x7E}, {0x8B,0x5B}, {0xB8,0x7C},
+ {0xDF,0x7E}, {0xB8,0x79}, {0xB8,0x78}, {0xDF,0x79},
+ {0xB8,0x7D}, {0xB5,0xCD}, {0xDF,0x7C}, {0xDF,0x74},
+ {0xB8,0x7A}, {0xB8,0xA1}, {0xB8,0xA2}, {0x99,0xA3},
+ {0xBB,0x4C}, {0xBB,0x48}, {0xBB,0x4D}, {0xE3,0xA6},
+ {0x99,0xA4}, {0xE3,0xA5}, {0xE3,0xA7}, {0xBB,0x4A},
+ {0xE3,0xA4}, {0xBB,0x4B}, {0xE3,0xAA}, {0xE3,0xA9},
+ {0xE3,0xA8}, {0xBB,0x49}, {0x99,0xA6}, {0xE7,0x41},
+ {0xE7,0x44}, {0xBD,0xA8}, {0xE7,0x43}, {0xBD,0xA7},
+ {0xBD,0xA3}, {0xBD,0xA4}, {0xBD,0xA5}, {0xE7,0x40},
+ {0xE6,0xFE}, {0xBD,0xA6}, {0xE7,0x42}, {0xE6,0xFD},
+ {0x99,0xA8}, {0xEA,0xE9}, {0xEA,0xF3}, {0xBF,0xB1},
+ {0xBF,0xB0}, {0x8A,0xBE}, {0xEA,0xED}, {0xEA,0xEF},
+ {0xEA,0xEA}, {0xEA,0xEE}, {0xEA,0xE8}, {0xEA,0xF1},
+ {0xBF,0xAF}, {0xEA,0xF0}, {0xEA,0xEC}, {0x9E,0x61},
+ {0xEA,0xF2}, {0xEA,0xEB}, {0xC1,0x74}, {0xED,0xE8},
+ {0xED,0xEE}, {0xC1,0x78}, {0xC1,0x7A}, {0xC1,0x77},
+ {0xC1,0x76}, {0x99,0xAA}, {0xC1,0x75}, {0xC1,0x73},
+ {0xED,0xE9}, {0xED,0xEC}, {0xC1,0x72}, {0xED,0xED},
+ {0xA0,0xC8}, {0xC1,0x79}, {0xED,0xEB}, {0xED,0xEA},
+ {0xC2,0xC0}, {0xC2,0xC1}, {0xF0,0xA1}, {0xF0,0x7D},
+ {0xF0,0x7E}, {0xF2,0xC2}, {0xF2,0xC1}, {0xC3,0xBE},
+ {0xF4,0xB4}, {0xC4,0xA4}, {0xF4,0xB3}, {0xF5,0xF0},
+ {0xF7,0x45}, {0xC5,0xA6}, {0xF9,0x43}, {0xF9,0x44},
+ {0xC5,0xD8}, {0xA6,0xDA}, {0x99,0xAB}, {0xAA,0xD7},
+ {0xDB,0x52}, {0xBB,0x4E}, {0xC1,0x7B}, {0xED,0xEF},
+ {0xA6,0xDB}, {0xAF,0xE5}, {0xAF,0xE4}, {0xDB,0x53},
+ {0xFE,0xC4}, {0xEA,0xF4}, {0xA6,0xDC}, {0xAD,0x50},
+ {0x98,0xC2}, {0xDB,0x54}, {0xDB,0x55}, {0xDB,0x56},
+ {0xBB,0x4F}, {0xBF,0xB2}, {0xA6,0xDD}, {0xAA,0xD8},
+ {0xD0,0x68}, {0xAF,0xE6}, {0xD3,0x70}, {0xB2,0xEA},
+ {0xDB,0x57}, {0xB8,0xA4}, {0xBB,0x50}, {0xBF,0xB3},
+ {0xC1,0x7C}, {0xC2,0xC2}, {0xF4,0xB5}, {0xA6,0xDE},
+ {0xAA,0xD9}, {0xAF,0xE7}, {0xD7,0x52}, {0xB5,0xCE},
+ {0xBB,0x51}, {0xE3,0xAB}, {0xE7,0x45}, {0x8E,0xE8},
+ {0xA0,0xBA}, {0xA6,0xDF}, {0xB5,0xCF}, {0xDF,0xA3},
+ {0xBB,0x52}, {0xA6,0xE0}, {0xCD,0xB1}, {0xD0,0x69},
+ {0xAD,0x51}, {0xD3,0x72}, {0xFD,0x77}, {0xAF,0xEA},
+ {0x8E,0xEE}, {0xAF,0xE8}, {0xAF,0xE9}, {0xAF,0xEB},
+ {0x9E,0xBF}, {0xD3,0x71}, {0xD7,0x57}, {0xD7,0x54},
+ {0xD7,0x56}, {0xB2,0xEB}, {0xB2,0xED}, {0xB2,0xEC},
+ {0xD7,0x53}, {0xB2,0xEE}, {0xD7,0x55}, {0xDB,0x58},
+ {0xDB,0x59}, {0x89,0xC2}, {0xDB,0x5A}, {0xDF,0xA6},
+ {0xDF,0xA7}, {0xDF,0xA5}, {0xDF,0xA8}, {0xB8,0xA5},
+ {0xDF,0xA4}, {0xBB,0x53}, {0xE7,0x4A}, {0xE7,0x46},
+ {0xE7,0x49}, {0xE7,0x4B}, {0xE7,0x48}, {0xE7,0x47},
+ {0x99,0xAC}, {0xEA,0xF5}, {0xEA,0xF6}, {0xEA,0xF7},
+ {0xBF,0xB4}, {0xBF,0xB5}, {0xED,0xF1}, {0xED,0xF0},
+ {0xED,0xF2}, {0xF0,0xA3}, {0xF0,0xA2}, {0xF2,0xC4},
+ {0x95,0x6B}, {0xF2,0xC5}, {0xF2,0xC3}, {0x95,0x6C},
+ {0xC4,0xA5}, {0xF4,0xB6}, {0xF4,0xB7}, {0xF7,0x46},
+ {0xF7,0xEF}, {0xF8,0xBB}, {0xA6,0xE1}, {0xA8,0x7D},
+ {0xC1,0x7D}, {0xA6,0xE2}, {0xD7,0x58}, {0xDB,0x5B},
+ {0x99,0xAF}, {0xC6,0x41}, {0xCA,0x4A}, {0x99,0x4A},
+ {0x89,0x76}, {0x8F,0x48}, {0xCA,0x4B}, {0xCA,0x4D},
+ {0xA6,0xE3}, {0xCA,0x4E}, {0xCA,0x4C}, {0xCB,0xA2},
+ {0xCB,0xA3}, {0xCB,0x7B}, {0xFB,0xEE}, {0xCB,0xA1},
+ {0xA8,0xA1}, {0xA8,0xA2}, {0xCB,0x7C}, {0xCB,0x7A},
+ {0xCB,0x79}, {0xCB,0x7D}, {0xA8,0x7E}, {0xCB,0x7E},
+ {0xD0,0x6A}, {0xCD,0xB6}, {0xAA,0xDC}, {0xCD,0xB5},
+ {0xCD,0xB7}, {0xAA,0xDB}, {0xCD,0xBC}, {0xAA,0xDF},
+ {0xCD,0xB2}, {0xCD,0xC0}, {0xCD,0xC6}, {0xAA,0xE6},
+ {0xCD,0xC3}, {0xAA,0xE3}, {0x99,0xAE}, {0xCD,0xB9},
+ {0xCD,0xBF}, {0xCD,0xC1}, {0x8E,0xFB}, {0xCD,0xB4},
+ {0xAA,0xE2}, {0xAA,0xDD}, {0xCD,0xBA}, {0xAA,0xE4},
+ {0xAA,0xE7}, {0xAA,0xE1}, {0xAA,0xDA}, {0xCD,0xBE},
+ {0xCD,0xB8}, {0xCD,0xC5}, {0xAA,0xE9}, {0xAA,0xE5},
+ {0xAA,0xE0}, {0xCD,0xBD}, {0xAF,0xEC}, {0xCD,0xBB},
+ {0xAA,0xDE}, {0xAA,0xE8}, {0x8C,0xD0}, {0xCD,0xB3},
+ {0xCD,0xC2}, {0xCD,0xC4}, {0x8B,0x52}, {0x99,0xB0},
+ {0x89,0x77}, {0x8F,0x41}, {0xAD,0x62}, {0xAD,0x5C},
+ {0xAD,0x64}, {0xAD,0x61}, {0xD0,0x71}, {0xD0,0x74},
+ {0xAD,0x5D}, {0x99,0xB1}, {0xD0,0x6B}, {0xAD,0x56},
+ {0xAD,0x60}, {0xAD,0x63}, {0xAD,0x65}, {0xD0,0xA2},
+ {0xD0,0x77}, {0x8F,0x49}, {0xAD,0x55}, {0xD0,0xA1},
+ {0xAD,0x59}, {0xAD,0x57}, {0xAD,0x52}, {0xD0,0x6F},
+ {0xD0,0x7E}, {0xD0,0x73}, {0xD0,0x76}, {0xD0,0xA5},
+ {0xFA,0x4D}, {0xAD,0x66}, {0xD0,0x7D}, {0xAD,0x5E},
+ {0xD0,0x78}, {0xD0,0xA4}, {0xD0,0x75}, {0xD0,0x79},
+ {0xD0,0x7C}, {0x9D,0xE4}, {0x8C,0xB5}, {0xD0,0x6D},
+ {0xD0,0xA3}, {0xD0,0x7B}, {0xFB,0xE9}, {0x9B,0x54},
+ {0xD0,0x6C}, {0x99,0xB2}, {0xD0,0x70}, {0xAD,0x5F},
+ {0xAD,0x5A}, {0xAD,0x53}, {0xAD,0x58}, {0xAD,0x54},
+ {0xAD,0x67}, {0xD0,0x6E}, {0xD3,0xA5}, {0xAD,0x5B},
+ {0x9E,0x68}, {0xD0,0x7A}, {0xCE,0x41}, {0xD3,0xA8},
+ {0xAF,0xFA}, {0x8F,0x4A}, {0xD3,0x76}, {0x8F,0x42},
+ {0xD3,0xA3}, {0xD3,0x7D}, {0x8F,0x51}, {0xD3,0xB2},
+ {0xD3,0xAA}, {0xD3,0x7E}, {0xD3,0xA9}, {0xD3,0x78},
+ {0xD3,0x7C}, {0xD3,0xB5}, {0xAF,0xFD}, {0xD3,0xAD},
+ {0xD3,0xA4}, {0xAF,0xED}, {0xD3,0xB3}, {0xD3,0x74},
+ {0xD3,0xAC}, {0xAF,0xFC}, {0xAF,0xF7}, {0xD3,0x73},
+ {0xAF,0xF5}, {0xAF,0xF4}, {0xAF,0xF9}, {0xD3,0xAB},
+ {0xAF,0xF1}, {0xAF,0xF8}, {0xD0,0x72}, {0xDB,0x5C},
+ {0xD3,0xA6}, {0x98,0x46}, {0xD3,0x7A}, {0xAF,0xFB},
+ {0xD3,0x7B}, {0xD3,0xA1}, {0xAF,0xFE}, {0xD3,0x75},
+ {0xD3,0xAF}, {0xD3,0xAE}, {0xD3,0xB6}, {0xAF,0xF3},
+ {0xAF,0xF0}, {0xD3,0xB4}, {0xD3,0xB0}, {0xD3,0xA7},
+ {0xD3,0xA2}, {0xAF,0xF6}, {0xAF,0xF2}, {0xD3,0x77},
+ {0xAF,0xEE}, {0xD3,0xB1}, {0xAF,0xEF}, {0xD3,0x79},
+ {0x99,0xB4}, {0x8E,0xF5}, {0xFD,0x55}, {0x9C,0xCD},
+ {0x89,0x78}, {0xD7,0x5E}, {0xD7,0x60}, {0xD7,0x65},
+ {0xD7,0x79}, {0xB2,0xFC}, {0xB2,0xF2}, {0xD7,0x5D},
+ {0xB2,0xFD}, {0xB2,0xFE}, {0xD7,0x68}, {0xD7,0x6F},
+ {0xD7,0x75}, {0xD7,0x62}, {0xD7,0x69}, {0x8F,0x53},
+ {0xB3,0x40}, {0xD7,0x77}, {0xD7,0x72}, {0xB2,0xFA},
+ {0xB2,0xF8}, {0xD7,0x6E}, {0xD7,0x6A}, {0xD7,0x5C},
+ {0xB2,0xEF}, {0xD7,0x61}, {0xD7,0x59}, {0x8F,0x6F},
+ {0xB2,0xF7}, {0xB2,0xF9}, {0xD7,0x66}, {0xD7,0x63},
+ {0xB2,0xF4}, {0xD7,0x73}, {0xB2,0xF1}, {0xD7,0x64},
+ {0xD7,0x7A}, {0xD7,0x6C}, {0x8E,0x63}, {0xD7,0x6B},
+ {0xB2,0xF0}, {0xB2,0xFB}, {0xB2,0xF3}, {0xD7,0x5A},
+ {0xD7,0x5F}, {0xD7,0x70}, {0xD7,0x76}, {0xB3,0x41},
+ {0xD7,0x5B}, {0xD7,0x67}, {0xD7,0x6D}, {0xB2,0xF6},
+ {0x8F,0x56}, {0xD7,0x78}, {0xD7,0x71}, {0xD7,0x74},
+ {0xFE,0x76}, {0xB2,0xF5}, {0x9F,0xC6}, {0xDB,0x6C},
+ {0xDB,0x60}, {0xB5,0xD7}, {0xDB,0x7D}, {0xDB,0xA7},
+ {0xDB,0xAA}, {0xB5,0xD5}, {0xDB,0x68}, {0xDB,0xA3},
+ {0xDB,0x69}, {0xDB,0x77}, {0xB5,0xE2}, {0xDB,0x73},
+ {0xB5,0xDF}, {0xFA,0xAC}, {0xDB,0x74}, {0xDB,0x5D},
+ {0xDB,0xA4}, {0x8F,0x58}, {0xB5,0xE8}, {0xDB,0xA1},
+ {0xDB,0x75}, {0xDB,0xAC}, {0xDB,0x70}, {0xDF,0xC8},
+ {0xDB,0xAF}, {0xB5,0xE6}, {0xDB,0x6E}, {0xDB,0x7A},
+ {0xB5,0xE9}, {0xB5,0xD4}, {0xDB,0x72}, {0xDB,0xAD},
+ {0xDB,0x6B}, {0xDB,0x64}, {0xDB,0x6F}, {0xDB,0x63},
+ {0xDB,0x61}, {0xB5,0xD0}, {0xDB,0xA5}, {0xDB,0x6A},
+ {0xDB,0xA8}, {0x98,0x48}, {0xDB,0xA9}, {0xB5,0xD8},
+ {0xB5,0xDD}, {0xB5,0xD9}, {0xB5,0xE1}, {0xDB,0x7E},
+ {0xB5,0xDA}, {0xDB,0x76}, {0xDB,0x66}, {0xB5,0xD2},
+ {0xDB,0x5E}, {0xDB,0xA2}, {0xDB,0xAB}, {0xDB,0x65},
+ {0xB5,0xE0}, {0xDB,0xB0}, {0xDB,0x71}, {0xDB,0x6D},
+ {0xB5,0xD1}, {0xB5,0xE5}, {0x99,0xB7}, {0xDB,0x7C},
+ {0xB5,0xE7}, {0xDB,0x78}, {0xB5,0xDC}, {0xB5,0xD6},
+ {0xB5,0xDE}, {0xB5,0xD3}, {0xB5,0xE4}, {0xDB,0x79},
+ {0xDB,0x67}, {0xDB,0x7B}, {0xDB,0x62}, {0xDB,0xA6},
+ {0x96,0x65}, {0xFA,0x6C}, {0x9D,0xE7}, {0xDB,0xAE},
+ {0x9E,0x62}, {0x96,0xCC}, {0x8E,0x67}, {0xDB,0x5F},
+ {0xFC,0x75}, {0x98,0x7E}, {0xDF,0xC7}, {0xDF,0xDD},
+ {0xB8,0x55}, {0xDF,0xCC}, {0xFD,0xB9}, {0xDF,0xCA},
+ {0xDF,0xB5}, {0xB8,0xA9}, {0xDF,0xC5}, {0xDF,0xD9},
+ {0xDF,0xC1}, {0xB8,0xB1}, {0xDF,0xD8}, {0xDF,0xBF},
+ {0xB5,0xE3}, {0xDF,0xCF}, {0xDF,0xC0}, {0xDF,0xD6},
+ {0xB8,0xB0}, {0xB8,0xA8}, {0x97,0xFC}, {0xDF,0xAA},
+ {0xDF,0xB2}, {0xDF,0xCB}, {0xDF,0xC3}, {0xDF,0xDC},
+ {0xDF,0xC6}, {0xB8,0xB6}, {0xDF,0xD7}, {0x98,0xF9},
+ {0xB8,0xAD}, {0x8F,0x66}, {0xDF,0xC9}, {0xDF,0xD1},
+ {0xDF,0xB6}, {0xDF,0xD0}, {0xDF,0xE1}, {0xDF,0xB1},
+ {0xDF,0xD2}, {0x95,0x6E}, {0xDF,0xDF}, {0x92,0x45},
+ {0xDF,0xAB}, {0xB5,0xDB}, {0x8F,0x60}, {0xDF,0xB9},
+ {0xDF,0xB8}, {0xB8,0xAF}, {0x9E,0xD1}, {0xDF,0xBC},
+ {0xDF,0xBE}, {0xDF,0xCD}, {0xDF,0xDE}, {0xB8,0xB2},
+ {0xFE,0xCD}, {0xB8,0xB3}, {0x99,0xB9}, {0xDF,0xB0},
+ {0xB8,0xAB}, {0xDF,0xB4}, {0xDF,0xDA}, {0xB8,0xB4},
+ {0xB8,0xAC}, {0xB8,0xAE}, {0xB8,0xB5}, {0xDF,0xE0},
+ {0xDF,0xD3}, {0xDF,0xCE}, {0x8F,0x62}, {0x97,0x4C},
+ {0xDF,0xBB}, {0xDF,0xBA}, {0xB8,0xAA}, {0xDF,0xAC},
+ {0xB8,0xA7}, {0xDF,0xC4}, {0xDF,0xAD}, {0xDF,0xC2},
+ {0xDF,0xB7}, {0xDF,0xDB}, {0x91,0xC7}, {0x95,0x5F},
+ {0xB8,0xA6}, {0xDF,0xB3}, {0x99,0xBB}, {0xDF,0xAF},
+ {0xDF,0xD5}, {0xDF,0xAE}, {0xBB,0x60}, {0xE3,0xD3},
+ {0x8E,0x6D}, {0x8F,0x71}, {0xE3,0xC2}, {0x94,0xCB},
+ {0xE3,0xAC}, {0xE3,0xCA}, {0xBB,0x58}, {0xE3,0xBB},
+ {0xE3,0xC5}, {0xBB,0x5B}, {0xE3,0xBE}, {0xBB,0x59},
+ {0xE3,0xAF}, {0xE3,0xCD}, {0xE3,0xAE}, {0xE3,0xC1},
+ {0x95,0xB1}, {0xE3,0xAD}, {0xE3,0xBF}, {0xE3,0xC8},
+ {0xE3,0xC6}, {0xE3,0xBA}, {0xE3,0xB5}, {0xE3,0xB3},
+ {0x9A,0xF2}, {0xE3,0xB4}, {0xE3,0xC7}, {0xE3,0xD2},
+ {0xE3,0xBC}, {0xBB,0x5A}, {0xE3,0xB7}, {0xE3,0xCB},
+ {0xBB,0x5D}, {0xE3,0xB6}, {0xE3,0xB0}, {0xE3,0xC0},
+ {0xBB,0x61}, {0x96,0xC3}, {0x99,0xBD}, {0xBB,0x55},
+ {0xBB,0x5E}, {0xE3,0xB8}, {0xE3,0xB2}, {0xBB,0x57},
+ {0xDF,0xD4}, {0xBB,0x56}, {0xE3,0xC3}, {0xBB,0x54},
+ {0xBB,0x63}, {0xBB,0x5C}, {0xE3,0xC4}, {0xE3,0xB9},
+ {0xE3,0xB1}, {0xE3,0xCC}, {0xE3,0xBD}, {0xBB,0x62},
+ {0xE3,0xD0}, {0xBB,0x5F}, {0xE3,0xCF}, {0xE3,0xC9},
+ {0xE3,0xCE}, {0xA0,0xCF}, {0xE3,0xD1}, {0x8F,0x6D},
+ {0x99,0xBE}, {0x8E,0xF4}, {0x8F,0x72}, {0x95,0xE4},
+ {0xE7,0x73}, {0xE7,0x74}, {0xE7,0x67}, {0xE7,0x66},
+ {0xE7,0x62}, {0xBD,0xB4}, {0xBD,0xAC}, {0xE7,0x76},
+ {0xE7,0x75}, {0xDF,0xA9}, {0xE7,0x5F}, {0xE7,0x63},
+ {0xE7,0x5D}, {0xE7,0x70}, {0xE7,0x61}, {0x99,0xBF},
+ {0xE7,0x77}, {0xE7,0x5A}, {0xE7,0x58}, {0xE7,0x64},
+ {0xE7,0x6E}, {0xE7,0x69}, {0xBD,0xB6}, {0xE7,0x4F},
+ {0xE7,0x6D}, {0x92,0x42}, {0xFB,0xA5}, {0xBD,0xB7},
+ {0xDF,0xBD}, {0xE7,0x5B}, {0xE7,0x52}, {0xE7,0x55},
+ {0xE7,0x7B}, {0xE7,0x5C}, {0xE7,0x53}, {0xE7,0x51},
+ {0xE7,0x4E}, {0x99,0xC0}, {0xBD,0xB0}, {0xE7,0x65},
+ {0xBD,0xAF}, {0xBD,0xB3}, {0xE7,0x60}, {0xE7,0x68},
+ {0xBD,0xA9}, {0xE7,0x78}, {0xE7,0x7C}, {0xBD,0xAB},
+ {0xE7,0x57}, {0xE7,0x6B}, {0xE7,0x6F}, {0xE7,0x54},
+ {0xE7,0x79}, {0xBD,0xB2}, {0xBD,0xB1}, {0xE7,0x4C},
+ {0xBD,0xB5}, {0xE7,0x72}, {0xE7,0x56}, {0xE7,0x6A},
+ {0xE7,0x50}, {0xE7,0x5E}, {0xE7,0x59}, {0xBD,0xAD},
+ {0xBD,0xAE}, {0xE7,0x6C}, {0xE7,0x7D}, {0xE7,0x7A},
+ {0xE7,0x71}, {0xFD,0xB4}, {0x8F,0x77}, {0x99,0xC1},
+ {0xE7,0x4D}, {0xBD,0xAA}, {0xEB,0x49}, {0xEB,0x40},
+ {0xEB,0x43}, {0xFA,0xB9}, {0xBF,0xBB}, {0xEB,0x45},
+ {0xEA,0xF9}, {0xEB,0x41}, {0xEB,0x47}, {0xBF,0xB8},
+ {0xBF,0xBC}, {0xBF,0xB6}, {0x8F,0x40}, {0xFA,0x44},
+ {0xEA,0xFB}, {0xEB,0x4C}, {0xEB,0x46}, {0x99,0xC2},
+ {0xEA,0xFC}, {0xEB,0x55}, {0xEB,0x4F}, {0xEA,0xF8},
+ {0xEE,0x46}, {0xEA,0xFE}, {0xBF,0xB7}, {0x8F,0x5C},
+ {0xEB,0x4A}, {0xEB,0x54}, {0xBF,0xBF}, {0x8C,0xBD},
+ {0xEB,0x51}, {0xEA,0xFD}, {0xEB,0x44}, {0xEB,0x48},
+ {0xEB,0x42}, {0xEB,0x56}, {0xEB,0x53}, {0xEB,0x50},
+ {0xBF,0xB9}, {0xBF,0xBA}, {0xBF,0xBE}, {0xEA,0xFA},
+ {0xEB,0x57}, {0xBF,0xBD}, {0xEB,0x4D}, {0x99,0xC4},
+ {0x99,0xC5}, {0xEB,0x4B}, {0x8F,0x7B}, {0xEB,0x4E},
+ {0xEE,0x53}, {0xEE,0x40}, {0xEE,0x45}, {0xEE,0x52},
+ {0xEE,0x44}, {0xED,0xFB}, {0xEE,0x41}, {0xC1,0xA2},
+ {0xED,0xF4}, {0xEE,0x4D}, {0xEE,0x4F}, {0xED,0xF3},
+ {0xC1,0xA1}, {0xEE,0x51}, {0xEE,0x49}, {0xC1,0xA8},
+ {0xEE,0x50}, {0xEE,0x42}, {0xC1,0xAA}, {0xED,0xF9},
+ {0xEB,0x52}, {0xEE,0x4A}, {0xEE,0x47}, {0xED,0xF5},
+ {0xEE,0x55}, {0xC1,0xA4}, {0xC1,0xA5}, {0xED,0xF7},
+ {0xEE,0x48}, {0x8C,0xB6}, {0xEE,0x54}, {0xEE,0x4B},
+ {0xED,0xFD}, {0xC1,0xA7}, {0xC1,0xA3}, {0xEE,0x4C},
+ {0xED,0xFE}, {0xEE,0x56}, {0xED,0xF8}, {0xEE,0x43},
+ {0xEE,0x4E}, {0xED,0xFA}, {0xED,0xFC}, {0xC2,0xCB},
+ {0xED,0xF6}, {0xC1,0xA9}, {0xC2,0xC4}, {0xC1,0x7E},
+ {0xC1,0xA6}, {0xC2,0xC8}, {0xF0,0xB3}, {0xF0,0xA9},
+ {0xF0,0xA4}, {0xF0,0xAA}, {0xF0,0xB4}, {0xF0,0xB8},
+ {0xF0,0xB7}, {0xC2,0xCA}, {0xC2,0xC9}, {0xF0,0xAB},
+ {0xF0,0xB9}, {0xF0,0xAE}, {0xF0,0xA6}, {0x8F,0xA3},
+ {0xF0,0xA8}, {0xF0,0xA7}, {0xF0,0xAD}, {0xF0,0xB2},
+ {0xF0,0xA5}, {0xF0,0xAC}, {0xF0,0xB1}, {0xC2,0xC7},
+ {0xF0,0xAF}, {0xC2,0xC5}, {0xF0,0xB0}, {0xC2,0xC3},
+ {0xC2,0xC6}, {0xF2,0xD5}, {0xF0,0xB5}, {0xC3,0xC2},
+ {0x8C,0xCE}, {0xF2,0xCD}, {0xF2,0xD1}, {0xF2,0xC9},
+ {0xF2,0xCC}, {0xF2,0xD4}, {0xC3,0xC0}, {0xF2,0xD9},
+ {0xF2,0xD2}, {0x99,0xC6}, {0xF2,0xCA}, {0xF2,0xDA},
+ {0xF2,0xD3}, {0xC3,0xC3}, {0xC3,0xC4}, {0xF2,0xD7},
+ {0xF2,0xCB}, {0xC3,0xBF}, {0xC3,0xC1}, {0xF2,0xC6},
+ {0xF2,0xCE}, {0xF2,0xC8}, {0x96,0xCD}, {0xF2,0xD8},
+ {0xF2,0xD6}, {0xF2,0xC7}, {0xF2,0xCF}, {0xF4,0xBE},
+ {0xC3,0xC5}, {0xF2,0xD0}, {0xC4,0xA7}, {0xC4,0xA9},
+ {0xC4,0xA6}, {0x96,0xC7}, {0xF4,0xC3}, {0xF4,0xBB},
+ {0xF4,0xB9}, {0xF4,0xBD}, {0xF4,0xBA}, {0x8F,0xA5},
+ {0xF4,0xBF}, {0xF4,0xC1}, {0xC4,0xAA}, {0xC4,0xAC},
+ {0xF4,0xC0}, {0xC4,0xAD}, {0xC4,0xAB}, {0xF4,0xC2},
+ {0xFA,0xBB}, {0x8C,0x61}, {0x95,0x70}, {0xC4,0xA8},
+ {0x93,0x68}, {0x8F,0x7E}, {0xC4,0xF4}, {0xF5,0xF1},
+ {0xF5,0xF7}, {0xC4,0xF6}, {0xF4,0xBC}, {0xF5,0xF6},
+ {0xF5,0xFD}, {0xF5,0xF4}, {0xF5,0xFB}, {0xF5,0xFA},
+ {0xF4,0xB8}, {0xF5,0xF5}, {0xF0,0xB6}, {0xF5,0xFE},
+ {0xF5,0xF3}, {0xF5,0xF8}, {0x8F,0xAA}, {0xF5,0xFC},
+ {0xF5,0xF2}, {0xF7,0x4A}, {0xC4,0xF5}, {0xF5,0xF9},
+ {0xA0,0x50}, {0xF7,0xF4}, {0xF7,0x4B}, {0xF7,0x49},
+ {0xF7,0x47}, {0xF7,0x48}, {0xF7,0x4C}, {0xC5,0xD9},
+ {0xF7,0xF2}, {0xF7,0xF0}, {0xF7,0xF5}, {0xF7,0xF3},
+ {0xF7,0xF6}, {0xC5,0xDA}, {0xF7,0xF1}, {0x90,0xD3},
+ {0xF8,0xBC}, {0x95,0x56}, {0xF9,0x45}, {0xF9,0x46},
+ {0xF9,0x47}, {0xF9,0xC7}, {0xF9,0xBD}, {0xCA,0x4F},
+ {0xAA,0xEA}, {0xAD,0x68}, {0xD3,0xB8}, {0xD3,0xB7},
+ {0xB0,0x40}, {0xB3,0x42}, {0xD7,0x7C}, {0xD7,0x7B},
+ {0xB5,0xEA}, {0xB8,0xB8}, {0xB8,0xB7}, {0xB8,0xB9},
+ {0xE3,0xD4}, {0xE7,0x7E}, {0xEB,0x58}, {0xEB,0x5A},
+ {0xEB,0x59}, {0xC1,0xAB}, {0xEE,0x57}, {0xF0,0xBA},
+ {0xF9,0xA5}, {0xA6,0xE4}, {0x8F,0xB8}, {0xCD,0xC9},
+ {0xCD,0xCA}, {0xCD,0xC8}, {0xCD,0xC7}, {0xAA,0xEB},
+ {0x99,0xC8}, {0xD0,0xA9}, {0xD0,0xA7}, {0xD0,0xA6},
+ {0xAD,0x69}, {0xAD,0x6B}, {0xAD,0x6A}, {0xD0,0xA8},
+ {0x8F,0xAF}, {0xD3,0xC4}, {0xD3,0xC1}, {0xD3,0xBF},
+ {0xB0,0x41}, {0xD3,0xC2}, {0xB0,0x46}, {0xD3,0xBC},
+ {0xD3,0xCB}, {0xD3,0xCD}, {0xD3,0xBD}, {0x99,0xC9},
+ {0xB0,0x43}, {0xD3,0xCE}, {0xD3,0xC9}, {0xD3,0xBB},
+ {0xD3,0xC0}, {0xD3,0xCA}, {0xD3,0xC6}, {0xD3,0xC3},
+ {0xB0,0x48}, {0xD3,0xCC}, {0xD3,0xBE}, {0x95,0x79},
+ {0xD3,0xC7}, {0xD3,0xB9}, {0xB0,0x47}, {0xB0,0x44},
+ {0xD3,0xC5}, {0xD3,0xC8}, {0xD3,0xBA}, {0xB0,0x45},
+ {0xB0,0x42}, {0x9F,0x49}, {0xB3,0x4C}, {0xD7,0xA5},
+ {0xB3,0x4B}, {0x99,0xCA}, {0xD7,0xA8}, {0xD7,0xAB},
+ {0xB3,0x48}, {0xB3,0x46}, {0xD7,0x7E}, {0xD7,0xA9},
+ {0xD7,0xA7}, {0xD7,0xA4}, {0xD7,0xAC}, {0xD7,0xAD},
+ {0xD7,0xAF}, {0xD7,0xB0}, {0xD7,0x7D}, {0xB3,0x45},
+ {0xD7,0xA2}, {0xD7,0xA1}, {0xD7,0xAE}, {0xB3,0x47},
+ {0xD7,0xA3}, {0xB3,0x49}, {0xB3,0x44}, {0xD7,0xA6},
+ {0xB3,0x4D}, {0xB3,0x4A}, {0xD7,0xAA}, {0xB5,0xF1},
+ {0xDB,0xBF}, {0xDB,0xB4}, {0xB5,0xEE}, {0xDF,0xE7},
+ {0xDB,0xBD}, {0xDB,0xB1}, {0xB5,0xEC}, {0xDB,0xB6},
+ {0xB5,0xEF}, {0xDB,0xBA}, {0xDB,0xB8}, {0xB5,0xF2},
+ {0xB5,0xEB}, {0xDB,0xB2}, {0xDB,0xB5}, {0xB5,0xF0},
+ {0xDB,0xB3}, {0xDB,0xBE}, {0xDB,0xBC}, {0xDB,0xB7},
+ {0xDB,0xB9}, {0xDB,0xBB}, {0xB5,0xED}, {0x99,0xCB},
+ {0xDF,0xE8}, {0xDF,0xEE}, {0xDF,0xE4}, {0xDF,0xEA},
+ {0xB8,0xBA}, {0xDF,0xE6}, {0xB8,0xC0}, {0xB8,0xBF},
+ {0xB8,0xBE}, {0xDF,0xED}, {0xB8,0xC1}, {0xB8,0xC2},
+ {0xDF,0xE3}, {0xDF,0xF0}, {0xB8,0xC3}, {0xB8,0xBD},
+ {0xB8,0xBC}, {0xDF,0xEC}, {0xB8,0xC4}, {0xDF,0xE2},
+ {0xDF,0xE5}, {0xDF,0xEF}, {0xDF,0xEB}, {0xE3,0xF4},
+ {0xE3,0xE9}, {0xB8,0xBB}, {0xBB,0x6A}, {0xE3,0xDD},
+ {0xE3,0xF2}, {0xE3,0xDE}, {0xBB,0x65}, {0xE3,0xDB},
+ {0xE3,0xE4}, {0xE3,0xDC}, {0xBB,0x67}, {0xE3,0xD6},
+ {0xE3,0xF1}, {0xBB,0x68}, {0xE3,0xEE}, {0xE3,0xEF},
+ {0xE3,0xD7}, {0xBB,0x6D}, {0xE3,0xE6}, {0xE3,0xE0},
+ {0xE3,0xE7}, {0xE3,0xDA}, {0xE3,0xF3}, {0xE3,0xEB},
+ {0xE3,0xE5}, {0xE3,0xD5}, {0xBB,0x69}, {0xE3,0xEC},
+ {0xBB,0x6C}, {0xE3,0xF0}, {0xE3,0xEA}, {0xBB,0x66},
+ {0xE3,0xE8}, {0xE3,0xE2}, {0xBB,0x64}, {0xE3,0xD9},
+ {0xE3,0xE1}, {0xE3,0xED}, {0xE3,0xDF}, {0xE3,0xE3},
+ {0xBD,0xC1}, {0xDF,0xE9}, {0xE7,0xB2}, {0xE7,0xBB},
+ {0xE7,0xB1}, {0xE7,0xAD}, {0xE7,0xAA}, {0xBD,0xC2},
+ {0xE7,0xA8}, {0xBB,0x6B}, {0xE7,0xA1}, {0xBD,0xC0},
+ {0xE7,0xA7}, {0xBD,0xBF}, {0xE7,0xAC}, {0xE7,0xA9},
+ {0xE7,0xB9}, {0xE7,0xB4}, {0xE7,0xAE}, {0xE7,0xB3},
+ {0xBD,0xBB}, {0xE7,0xAB}, {0xE7,0xBE}, {0xE7,0xA2},
+ {0xE7,0xA3}, {0xE7,0xBA}, {0xBD,0xBC}, {0xE7,0xBF},
+ {0xBD,0xBE}, {0xE7,0xC0}, {0xE7,0xB0}, {0xE3,0xD8},
+ {0xE7,0xB6}, {0xE7,0xAF}, {0xE7,0xB8}, {0xE7,0xB5},
+ {0x9D,0xD5}, {0x8F,0xB0}, {0xE7,0xA6}, {0xBD,0xB9},
+ {0xE7,0xBD}, {0xBD,0xBA}, {0xE7,0xA4}, {0xBD,0xBD},
+ {0xEB,0x64}, {0xE7,0xB7}, {0xE7,0xBC}, {0xFA,0x7A},
+ {0xEB,0x61}, {0xBD,0xB8}, {0xBF,0xC0}, {0xEB,0x6B},
+ {0xEB,0x67}, {0x9E,0x5F}, {0xEB,0x65}, {0xEB,0x60},
+ {0xEB,0x6F}, {0x99,0xCD}, {0xA0,0xC9}, {0xBF,0xC4},
+ {0xEB,0x5C}, {0xEB,0x68}, {0xEB,0x69}, {0xEB,0x5F},
+ {0xEB,0x5E}, {0xEB,0x6C}, {0xEB,0x62}, {0xEB,0x5D},
+ {0xEB,0x63}, {0xEB,0x6E}, {0xEB,0x5B}, {0xEB,0x6D},
+ {0xEB,0x6A}, {0xBF,0xC2}, {0xBF,0xC1}, {0xBF,0xC3},
+ {0xEB,0x66}, {0xF0,0xCB}, {0x9A,0xDB}, {0xA0,0xC6},
+ {0xEE,0x59}, {0xC1,0xB1}, {0xEE,0x5D}, {0xEE,0x5A},
+ {0xEE,0x61}, {0xEE,0x67}, {0xEE,0x5C}, {0x8F,0xB4},
+ {0xEE,0x70}, {0xC1,0xAE}, {0xEE,0x6A}, {0xEE,0x5F},
+ {0xEE,0x6B}, {0xEE,0x66}, {0xEE,0x6D}, {0xEE,0x5E},
+ {0xC1,0xB3}, {0xC1,0xB2}, {0xEE,0x60}, {0xEE,0x6E},
+ {0xEE,0x58}, {0xEE,0x6C}, {0xC1,0xAC}, {0xA0,0xD7},
+ {0xEE,0x64}, {0xEE,0x63}, {0xEE,0x68}, {0xEE,0x5B},
+ {0xC1,0xB0}, {0xC1,0xB4}, {0xEE,0x62}, {0xEE,0x69},
+ {0xC1,0xB5}, {0xEE,0x65}, {0xA0,0xC7}, {0xC1,0xAD},
+ {0xC1,0xAF}, {0xF0,0xC7}, {0xF0,0xC5}, {0xA0,0x43},
+ {0xF0,0xCC}, {0xF0,0xC9}, {0xF0,0xCD}, {0x8F,0xB5},
+ {0xF0,0xBE}, {0xF0,0xC6}, {0xF0,0xD1}, {0xEE,0x6F},
+ {0xF0,0xC2}, {0xC2,0xCF}, {0xE7,0xA5}, {0xF0,0xBD},
+ {0xF0,0xCA}, {0xF0,0xC4}, {0xF0,0xC1}, {0xF0,0xBC},
+ {0xF0,0xBB}, {0xF0,0xD0}, {0xF0,0xC0}, {0xF0,0xBF},
+ {0xC2,0xCD}, {0xF0,0xC8}, {0x8F,0xB2}, {0xC2,0xCC},
+ {0xC2,0xCE}, {0xF0,0xC3}, {0xF0,0xCF}, {0xA0,0x61},
+ {0xF2,0xDE}, {0xF2,0xDF}, {0xC3,0xC9}, {0xF2,0xDC},
+ {0xC3,0xC6}, {0xF2,0xE4}, {0xC3,0xCA}, {0xF2,0xE6},
+ {0xF2,0xDB}, {0xF0,0xCE}, {0xF2,0xE8}, {0xF2,0xDD},
+ {0x9E,0x5E}, {0xC3,0xC7}, {0xF2,0xE3}, {0xF2,0xE5},
+ {0xF2,0xE0}, {0xF2,0xE7}, {0xF2,0xE2}, {0xF2,0xE1},
+ {0xC3,0xC8}, {0x8F,0xB6}, {0xF4,0xC5}, {0xF4,0xC6},
+ {0xF4,0xC8}, {0xC4,0xAE}, {0xC4,0xAF}, {0xF4,0xC9},
+ {0xF4,0xC7}, {0x9F,0xE8}, {0xF4,0xC4}, {0xF6,0x42},
+ {0xF6,0x45}, {0xF6,0x41}, {0xC4,0xFA}, {0xF6,0x43},
+ {0xC4,0xF9}, {0xC4,0xF8}, {0xC4,0xF7}, {0xF6,0x44},
+ {0xF7,0x51}, {0xF7,0x4F}, {0x9C,0xB2}, {0xF7,0x4E},
+ {0xF6,0x40}, {0xF7,0x50}, {0xF6,0x46}, {0xF7,0x4D},
+ {0x95,0x7C}, {0xF7,0xF9}, {0xF7,0xD7}, {0xF7,0xF7},
+ {0xC5,0xDB}, {0xF7,0xF8}, {0xF7,0xFA}, {0xF8,0xBF},
+ {0xC5,0xFA}, {0xF8,0xBE}, {0xF8,0xBD}, {0xC5,0xFB},
+ {0xC6,0x5A}, {0xF9,0x6E}, {0xF9,0xA7}, {0xF9,0xA6},
+ {0xF9,0xA8}, {0xA6,0xE5}, {0xD0,0xAA}, {0x9F,0xC7},
+ {0xD3,0xCF}, {0xD3,0xD0}, {0x8F,0xBB}, {0x8F,0xBC},
+ {0xDB,0xC0}, {0xF6,0x47}, {0xF8,0xC0}, {0xA6,0xE6},
+ {0xAD,0x6C}, {0xD0,0xAB}, {0x8F,0xEC}, {0xD7,0xB1},
+ {0xB3,0x4E}, {0xDB,0xC2}, {0xDB,0xC1}, {0xB5,0xF3},
+ {0xB8,0xC5}, {0xE7,0xC1}, {0xBD,0xC3}, {0xBD,0xC4},
+ {0x8F,0xC0}, {0x93,0x6A}, {0xBF,0xC5}, {0xC5,0xFC},
+ {0xA6,0xE7}, {0x8B,0xE4}, {0x9C,0x7C}, {0xD0,0xAC},
+ {0xAA,0xED}, {0xD0,0xAE}, {0xD0,0xAD}, {0xAD,0x6D},
+ {0xD3,0xD1}, {0x95,0xA1}, {0xD3,0xD8}, {0xB0,0x49},
+ {0xD3,0xD6}, {0xD3,0xD4}, {0xD3,0xDB}, {0xD3,0xD2},
+ {0xD3,0xD3}, {0xB0,0x4A}, {0xB0,0x4E}, {0xD3,0xDC},
+ {0xB0,0x4D}, {0xD3,0xDA}, {0xD3,0xD7}, {0xD3,0xD5},
+ {0xB0,0x4B}, {0xB0,0x4C}, {0xD3,0xD9}, {0xFE,0xEC},
+ {0x95,0xA3}, {0xB3,0x50}, {0xD7,0xB2}, {0xB3,0x55},
+ {0xD7,0xC2}, {0xB3,0x54}, {0xD7,0xC4}, {0x8C,0x45},
+ {0x8C,0xB8}, {0xD7,0xB8}, {0xB3,0x52}, {0xD7,0xC3},
+ {0xD7,0xB3}, {0xB3,0x53}, {0xD7,0xBF}, {0xD7,0xBB},
+ {0xD7,0xBD}, {0xD7,0xB7}, {0xD7,0xBE}, {0x8F,0xC1},
+ {0xB3,0x4F}, {0xD7,0xBA}, {0xA0,0x52}, {0xD7,0xB9},
+ {0xD7,0xB5}, {0xD7,0xC0}, {0xD7,0xBC}, {0xD7,0xB4},
+ {0xD7,0xB6}, {0xB3,0x51}, {0xD7,0xC1}, {0x99,0xD0},
+ {0xB5,0xF6}, {0xDB,0xCD}, {0x8F,0xC3}, {0x8F,0xC4},
+ {0xDB,0xC9}, {0xDB,0xCB}, {0xDB,0xC6}, {0xDB,0xC5},
+ {0xDB,0xC3}, {0xDB,0xCA}, {0xDB,0xCC}, {0xDB,0xC8},
+ {0x95,0xA4}, {0xDB,0xC7}, {0xB5,0xF4}, {0xB5,0xF5},
+ {0x8F,0xC6}, {0x9E,0x60}, {0xDB,0xCF}, {0xB8,0xCD},
+ {0xDF,0xF2}, {0xDF,0xF8}, {0xDF,0xF3}, {0xDF,0xF4},
+ {0xF9,0xD8}, {0xDF,0xF9}, {0xB8,0xCF}, {0xB8,0xC7},
+ {0xB8,0xCE}, {0xDF,0xF1}, {0xDB,0xC4}, {0xB8,0xCA},
+ {0xB8,0xC8}, {0xDF,0xF7}, {0xDF,0xF6}, {0xB8,0xC9},
+ {0xB8,0xCB}, {0xDF,0xF5}, {0xB8,0xC6}, {0xB8,0xCC},
+ {0x95,0xA5}, {0xE3,0xF6}, {0xBB,0x74}, {0xE4,0x42},
+ {0xE4,0x41}, {0xE3,0xFB}, {0xBB,0x76}, {0xE4,0x40},
+ {0xE3,0xF7}, {0xE3,0xF8}, {0xBB,0x6E}, {0xBB,0x70},
+ {0x9C,0xB3}, {0xE3,0xFD}, {0xE3,0xF5}, {0xBB,0x72},
+ {0xBB,0x71}, {0xE3,0xF9}, {0xE3,0xFE}, {0xE3,0xFC},
+ {0xBB,0x73}, {0xE3,0xFA}, {0x99,0xD1}, {0xFE,0xF1},
+ {0xDB,0xCE}, {0xBB,0x6F}, {0xE7,0xC2}, {0xE7,0xC9},
+ {0xBD,0xC6}, {0xE7,0xCD}, {0xBD,0xCA}, {0xE7,0xC5},
+ {0xE7,0xC3}, {0xE7,0xCC}, {0xBD,0xC5}, {0xE7,0xCB},
+ {0xBD,0xC7}, {0xBD,0xC8}, {0xE7,0xC4}, {0xBD,0xC9},
+ {0xE7,0xCA}, {0xE7,0xC6}, {0xE7,0xC7}, {0xE7,0xC8},
+ {0xBB,0x75}, {0xEB,0x70}, {0xEB,0x7C}, {0xBF,0xCA},
+ {0xEB,0x77}, {0xEB,0x79}, {0x99,0xD2}, {0xBF,0xC8},
+ {0xEB,0x71}, {0xEB,0x75}, {0xEB,0x78}, {0xBF,0xC6},
+ {0xBF,0xC9}, {0xEB,0x7B}, {0xEB,0x73}, {0xEB,0x74},
+ {0xEB,0x7A}, {0xEB,0x72}, {0xEB,0x76}, {0xBF,0xC7},
+ {0xEE,0x72}, {0xEE,0x71}, {0xC1,0xB7}, {0xEE,0x77},
+ {0xC1,0xB9}, {0xC1,0xB6}, {0xEE,0x73}, {0xC1,0xBA},
+ {0xEE,0x74}, {0xEE,0x75}, {0xEE,0x78}, {0x9C,0xC2},
+ {0xC1,0xB8}, {0xF0,0xD6}, {0x99,0xD3}, {0xF0,0xD9},
+ {0xF0,0xD3}, {0xF0,0xD5}, {0x95,0xA7}, {0xF0,0xD4},
+ {0xF0,0xD7}, {0xF0,0xD8}, {0xEE,0x76}, {0xF0,0xD2},
+ {0x95,0xA9}, {0xC3,0xCD}, {0xF2,0xEC}, {0xF2,0xEF},
+ {0xF2,0xF1}, {0xF2,0xEA}, {0xF2,0xEB}, {0xF2,0xEE},
+ {0xF2,0xF0}, {0xC3,0xCE}, {0xC3,0xCC}, {0xC3,0xCB},
+ {0xF2,0xED}, {0xF2,0xE9}, {0xF4,0xCA}, {0xC4,0xB0},
+ {0x95,0xA6}, {0xF4,0xCB}, {0xF6,0x49}, {0xC4,0xFB},
+ {0xF6,0x4B}, {0xC4,0xFC}, {0xF6,0x48}, {0xF6,0x4A},
+ {0xC5,0xA8}, {0xF7,0x52}, {0xC5,0xA7}, {0xF7,0xFD},
+ {0xF7,0xFC}, {0xF7,0xFB}, {0x9C,0x5D}, {0xF9,0x48},
+ {0xF9,0x49}, {0xF9,0x4B}, {0xF9,0x4A}, {0xCA,0x50},
+ {0xA6,0xE8}, {0x98,0xE2}, {0xAD,0x6E}, {0xD7,0xC5},
+ {0xB5,0xF7}, {0xDF,0xFA}, {0xC2,0xD0}, {0x8F,0xC9},
+ {0xF2,0xF2}, {0xA0,0xC2}, {0x8F,0xCA}, {0xA8,0xA3},
+ {0xB3,0x57}, {0x99,0xD4}, {0xB3,0x56}, {0xA0,0xB9},
+ {0xDB,0xD0}, {0xB5,0xF8}, {0xDB,0xD2}, {0xDB,0xD1},
+ {0xDF,0xFB}, {0xB8,0xD0}, {0xE4,0x43}, {0xE4,0x46},
+ {0xE4,0x45}, {0xE4,0x44}, {0xE7,0xCE}, {0xE7,0xD0},
+ {0xE7,0xCF}, {0x9B,0x58}, {0xBF,0xCC}, {0x8F,0xCD},
+ {0xA0,0xD4}, {0xBF,0xCB}, {0xC1,0xBB}, {0xEE,0x79},
+ {0xEE,0x7B}, {0xEE,0x7A}, {0xC2,0xD1}, {0xF2,0xF4},
+ {0xF2,0xF3}, {0xF4,0xCC}, {0xC4,0xB1}, {0x8F,0xCE},
+ {0xC4,0xFD}, {0xF7,0x54}, {0xF7,0x53}, {0xC6,0x5B},
+ {0x8B,0xE5}, {0x89,0x79}, {0xA8,0xA4}, {0xD0,0xAF},
+ {0xAD,0x6F}, {0xD7,0xC8}, {0xD7,0xC6}, {0xD7,0xC7},
+ {0xDB,0xD4}, {0xDB,0xD5}, {0xE0,0x43}, {0xDB,0xD3},
+ {0xDF,0xFC}, {0xE0,0x41}, {0xE0,0x40}, {0xE0,0x42},
+ {0xB8,0xD1}, {0xDF,0xFE}, {0xDF,0xFD}, {0xE0,0x44},
+ {0x8F,0xD0}, {0xE4,0x49}, {0xE4,0x47}, {0xE4,0x48},
+ {0xE7,0xD3}, {0xE7,0xD1}, {0xE7,0xD2}, {0xEB,0x7D},
+ {0xEE,0x7C}, {0xEE,0x7D}, {0xC2,0xD2}, {0xF2,0xF5},
+ {0xF4,0xCD}, {0xC4,0xB2}, {0xF6,0x4C}, {0xF7,0x55},
+ {0xC5,0xA9}, {0xF7,0xFE}, {0xF9,0x4C}, {0xA8,0xA5},
+ {0xAD,0x71}, {0xAD,0x72}, {0xD0,0xB0}, {0xD0,0xB1},
+ {0xAD,0x70}, {0xB0,0x54}, {0xB0,0x52}, {0xB0,0x51},
+ {0xB0,0x58}, {0xB0,0x50}, {0xB0,0x59}, {0xD3,0xDD},
+ {0xB0,0x56}, {0xB0,0x53}, {0xB0,0x57}, {0xB0,0x55},
+ {0xB0,0x4F}, {0xB3,0x5F}, {0x95,0xB6}, {0xB3,0x59},
+ {0xD7,0xCC}, {0xB3,0x5E}, {0xB3,0x60}, {0xB3,0x5A},
+ {0xB3,0x5B}, {0xD7,0xCA}, {0x99,0xD6}, {0xB3,0x58},
+ {0x95,0xE5}, {0xD7,0xCB}, {0xB3,0x5D}, {0xD7,0xC9},
+ {0xB3,0x5C}, {0xB6,0x44}, {0xB6,0x46}, {0x99,0xD7},
+ {0xDB,0xD8}, {0xB6,0x45}, {0xB5,0xF9}, {0xB5,0xFD},
+ {0x95,0xB5}, {0xB8,0xE4}, {0xE0,0x49}, {0xDB,0xDA},
+ {0xB5,0xFE}, {0xDB,0xDD}, {0xDB,0xDE}, {0xB6,0x43},
+ {0xDB,0xE0}, {0xA0,0xCA}, {0xDB,0xE2}, {0xDB,0xE3},
+ {0xDB,0xD7}, {0xDB,0xD6}, {0xDB,0xE4}, {0xB6,0x42},
+ {0xDB,0xE1}, {0xDB,0xDF}, {0xB6,0x40}, {0xB5,0xFB},
+ {0xB6,0x47}, {0xDB,0xDB}, {0xDB,0xDC}, {0xDB,0xD9},
+ {0xB6,0x41}, {0xB5,0xFC}, {0xB5,0xFA}, {0xE0,0x48},
+ {0xB8,0xDF}, {0xB8,0xDA}, {0xB8,0xD5}, {0x9F,0xFD},
+ {0xB8,0xE5}, {0xB8,0xD6}, {0xB8,0xD2}, {0xB8,0xE1},
+ {0xB8,0xDE}, {0xB8,0xE0}, {0xB8,0xD7}, {0xB8,0xDC},
+ {0xB8,0xD3}, {0xB8,0xD4}, {0xE0,0x50}, {0xE0,0x4D},
+ {0xE0,0x45}, {0xE0,0x4A}, {0xB8,0xE2}, {0xE0,0x51},
+ {0xB8,0xE3}, {0xB8,0xD9}, {0xA0,0x58}, {0xE0,0x47},
+ {0xE0,0x4F}, {0xE0,0x4B}, {0xE0,0x4E}, {0xE0,0x4C},
+ {0xB8,0xDD}, {0xE0,0x46}, {0xB8,0xD8}, {0xE4,0x4C},
+ {0xBB,0x78}, {0xBB,0x7B}, {0xE4,0x4E}, {0x8F,0xD6},
+ {0xBB,0xA5}, {0xE4,0x4D}, {0xBB,0x7D}, {0x99,0xD8},
+ {0xBD,0xCF}, {0xE4,0x4F}, {0xBB,0xA4}, {0xE4,0x4B},
+ {0xBB,0xA6}, {0x8F,0xD3}, {0xBB,0x79}, {0xB8,0xDB},
+ {0xBB,0x7C}, {0xBB,0x7A}, {0xBB,0x7E}, {0xBB,0xA2},
+ {0xBB,0x77}, {0xBB,0xA7}, {0xBB,0xA3}, {0x8F,0xE5},
+ {0xBB,0xA1}, {0xE4,0x4A}, {0x8F,0xE9}, {0xBD,0xD6},
+ {0xBD,0xD2}, {0x99,0xD9}, {0xBD,0xD9}, {0xE7,0xD6},
+ {0xBD,0xDA}, {0xE7,0xE2}, {0xE7,0xDB}, {0xBD,0xCB},
+ {0xE7,0xE3}, {0xE7,0xDD}, {0xBD,0xD5}, {0xE7,0xDE},
+ {0xBD,0xD4}, {0xE7,0xE1}, {0xBD,0xCE}, {0xE7,0xDF},
+ {0xE7,0xD5}, {0xBD,0xCD}, {0xEB,0xAA}, {0xBD,0xD3},
+ {0xBD,0xD0}, {0xBD,0xD8}, {0xE7,0xD4}, {0xE7,0xD8},
+ {0xBD,0xCC}, {0xE7,0xD7}, {0xE7,0xD9}, {0xE7,0xDA},
+ {0xBD,0xD7}, {0xE7,0xDC}, {0xE7,0xE0}, {0xE7,0xE4},
+ {0x92,0x7C}, {0xBD,0xDB}, {0xBF,0xD2}, {0xEB,0xA5},
+ {0xEB,0xAB}, {0xEB,0xA8}, {0xEB,0x7E}, {0xEB,0xAC},
+ {0xEB,0xA1}, {0xEB,0xA7}, {0xBF,0xCD}, {0xBF,0xD3},
+ {0xEB,0xAD}, {0x9C,0x45}, {0xBF,0xCF}, {0xBF,0xD9},
+ {0xBF,0xD4}, {0xEB,0xAF}, {0xEB,0xA9}, {0xBF,0xD0},
+ {0xEB,0xA2}, {0xBF,0xDA}, {0xEB,0xA3}, {0xEB,0xA4},
+ {0xBF,0xDB}, {0xBF,0xD8}, {0xBD,0xD1}, {0xBF,0xCE},
+ {0xEB,0xB0}, {0xBF,0xDC}, {0xBF,0xD5}, {0xEB,0xAE},
+ {0xBF,0xD1}, {0xBF,0xD6}, {0xBF,0xD7}, {0xC1,0xC3},
+ {0xEE,0xA4}, {0xEE,0xAD}, {0xEE,0xAA}, {0xEE,0xAC},
+ {0xC1,0xC0}, {0xEE,0xA5}, {0x8F,0xDE}, {0xEE,0xAB},
+ {0xC1,0xBC}, {0xEE,0xA7}, {0xC1,0xC4}, {0xEE,0xA3},
+ {0xEE,0xA8}, {0xEE,0xAF}, {0xEB,0xA6}, {0xEE,0xA9},
+ {0xEE,0xA2}, {0xC1,0xBD}, {0xEE,0xA1}, {0xC1,0xBE},
+ {0xEE,0xB0}, {0xC1,0xBF}, {0xEE,0xAE}, {0xC1,0xC2},
+ {0xEE,0x7E}, {0x8F,0xDF}, {0xC1,0xC1}, {0xEE,0xA6},
+ {0xF0,0xDC}, {0xF0,0xEA}, {0xF0,0xE5}, {0xF0,0xE7},
+ {0xF0,0xDB}, {0xC2,0xD3}, {0xF0,0xDA}, {0xC2,0xD6},
+ {0xC2,0xD5}, {0xA0,0x4B}, {0xF0,0xE9}, {0xF0,0xE1},
+ {0xF0,0xDE}, {0xF0,0xE4}, {0xF0,0xDD}, {0xF0,0xDF},
+ {0xF0,0xE8}, {0xF0,0xE6}, {0xC2,0xD4}, {0xF0,0xED},
+ {0xF0,0xEB}, {0xF0,0xE2}, {0xF0,0xEC}, {0xF0,0xE3},
+ {0x8F,0xE2}, {0xF2,0xF9}, {0xC3,0xCF}, {0xF3,0x41},
+ {0xA0,0xCC}, {0xF6,0x4F}, {0xC3,0xD6}, {0xF0,0xE0},
+ {0xF2,0xF7}, {0xC3,0xD2}, {0xF2,0xF8}, {0xF2,0xFD},
+ {0x8F,0xE3}, {0x8F,0xE4}, {0xC3,0xD4}, {0xC3,0xD5},
+ {0xF2,0xF6}, {0xF3,0x40}, {0xF3,0x42}, {0xF2,0xFA},
+ {0xF2,0xFC}, {0xF2,0xFE}, {0xF2,0xFB}, {0xF3,0x43},
+ {0xC3,0xD1}, {0xC3,0xD7}, {0xC3,0xD3}, {0xC3,0xD0},
+ {0xF4,0xD0}, {0x9B,0xC4}, {0xC4,0xB7}, {0xF4,0xCE},
+ {0x9B,0xFC}, {0xF4,0xD2}, {0xF4,0xD3}, {0xC4,0xB5},
+ {0xF4,0xD4}, {0xF4,0xD1}, {0x96,0x4C}, {0xF4,0xCF},
+ {0xC4,0xB8}, {0xC4,0xB4}, {0xF4,0xD5}, {0xC4,0xB6},
+ {0xC4,0xB3}, {0xC4,0xFE}, {0xC5,0x40}, {0xF6,0x4E},
+ {0xF6,0x4D}, {0xF6,0x50}, {0xF6,0x51}, {0xC5,0x41},
+ {0xF7,0x56}, {0xF7,0x5B}, {0xC5,0xAA}, {0x9A,0xF6},
+ {0xF7,0x58}, {0x8C,0xAE}, {0xF7,0x57}, {0xF7,0x5A},
+ {0xF7,0x59}, {0xF8,0x43}, {0xC5,0xDC}, {0xF8,0x42},
+ {0xF8,0x40}, {0xF8,0x41}, {0x8F,0xE7}, {0xC5,0xFE},
+ {0xC5,0xFD}, {0xF8,0xC1}, {0xF8,0xC2}, {0xC6,0x40},
+ {0xF9,0x4D}, {0xF9,0x4E}, {0xC6,0x67}, {0x8F,0xE8},
+ {0xC6,0x6D}, {0xF9,0xA9}, {0xF9,0xC8}, {0x8B,0xE7},
+ {0x89,0x7A}, {0x89,0x7B}, {0xA8,0xA6}, {0xD7,0xCD},
+ {0xD7,0xCE}, {0xE0,0x52}, {0xE4,0x50}, {0xE7,0xE5},
+ {0xC1,0xC6}, {0xC1,0xC5}, {0xF0,0xEE}, {0xF3,0x44},
+ {0xF8,0x44}, {0xA8,0xA7}, {0xD3,0xDE}, {0xB0,0x5A},
+ {0xB3,0x61}, {0xE0,0x54}, {0xE0,0x53}, {0xBD,0xDC},
+ {0xE7,0xE6}, {0xBD,0xDD}, {0xEE,0xB1}, {0xC2,0xD7},
+ {0x99,0xDA}, {0xC6,0x76}, {0xA8,0xA8}, {0xCD,0xCB},
+ {0xD3,0xDF}, {0xB3,0x62}, {0xD7,0xCF}, {0xD7,0xD0},
+ {0xDB,0xE5}, {0xB6,0x48}, {0xB8,0xE6}, {0xE0,0x56},
+ {0xE0,0x55}, {0xE0,0x57}, {0xE4,0x51}, {0xE4,0x52},
+ {0xBB,0xA8}, {0xBF,0xDD}, {0xBD,0xDE}, {0xBF,0xDE},
+ {0xEE,0xB5}, {0xEE,0xB2}, {0xEE,0xB4}, {0xEE,0xB3},
+ {0xC1,0xC7}, {0xF0,0xEF}, {0xF3,0x46}, {0xF3,0x45},
+ {0xCB,0xA4}, {0xB0,0x5C}, {0xB0,0x5B}, {0xD3,0xE0},
+ {0xD7,0xD1}, {0xDB,0xE7}, {0xDB,0xE6}, {0xB6,0x49},
+ {0xE0,0x59}, {0xE0,0x5A}, {0xE0,0x58}, {0xB8,0xE8},
+ {0xB8,0xE7}, {0xBB,0xAA}, {0xBB,0xA9}, {0xE7,0xE7},
+ {0xEB,0xB3}, {0xEB,0xB1}, {0xEB,0xB2}, {0xBF,0xDF},
+ {0xEE,0xB7}, {0xEE,0xB6}, {0xF0,0xF2}, {0xF0,0xF1},
+ {0xF0,0xF0}, {0xF3,0x47}, {0x8F,0xED}, {0xF9,0xAA},
+ {0xA8,0xA9}, {0xAD,0x73}, {0x95,0xC0}, {0xAD,0x74},
+ {0xB0,0x5D}, {0xB0,0x5E}, {0xD3,0xE2}, {0xD3,0xE1},
+ {0xD7,0xD2}, {0xB3,0x68}, {0xB3,0x66}, {0xB3,0x63},
+ {0xB3,0x67}, {0xB3,0x65}, {0xB3,0x64}, {0xA0,0xCB},
+ {0xB6,0x4A}, {0xDB,0xEA}, {0xB8,0xED}, {0xB6,0x4C},
+ {0xB6,0x51}, {0xDB,0xEC}, {0xB6,0x53}, {0xB6,0x52},
+ {0xB6,0x55}, {0xDB,0xEB}, {0xDB,0xE8}, {0xB6,0x4F},
+ {0xB6,0x4B}, {0xB6,0x4D}, {0xDB,0xE9}, {0xB6,0x54},
+ {0xB6,0x50}, {0xB6,0x4E}, {0xB8,0xEF}, {0xB8,0xEE},
+ {0xB8,0xEC}, {0xB8,0xF0}, {0xB8,0xEA}, {0xB8,0xEB},
+ {0xB8,0xE9}, {0xE0,0x5B}, {0x9E,0x48}, {0xE4,0x54},
+ {0xBB,0xAC}, {0xBB,0xAD}, {0xBB,0xAB}, {0x99,0xDB},
+ {0xE4,0x53}, {0x8F,0xF3}, {0xE4,0x55}, {0xE7,0xEA},
+ {0xE7,0xEC}, {0x8F,0xF9}, {0xBD,0xE7}, {0xE7,0xED},
+ {0xBD,0xE0}, {0xE7,0xE9}, {0xBD,0xDF}, {0xBD,0xE9},
+ {0xBD,0xE5}, {0xBD,0xE6}, {0xBD,0xE2}, {0xE7,0xE8},
+ {0xBD,0xE1}, {0xE7,0xEE}, {0xE7,0xEB}, {0x95,0xC1},
+ {0xBD,0xE8}, {0xA0,0x4E}, {0xBD,0xE3}, {0xBD,0xE4},
+ {0xEB,0xB5}, {0xEB,0xB7}, {0xEB,0xB6}, {0x99,0xDC},
+ {0xEB,0xB8}, {0xBF,0xE0}, {0xEB,0xB4}, {0xA0,0x64},
+ {0xC1,0xCB}, {0xEE,0xB8}, {0xC1,0xC8}, {0xC1,0xCC},
+ {0xC1,0xCA}, {0xC1,0xC9}, {0xF0,0xF3}, {0xF0,0xF6},
+ {0xF0,0xF5}, {0x8F,0xF7}, {0xF0,0xF4}, {0xC2,0xD8},
+ {0xF3,0x48}, {0xF3,0x49}, {0xC3,0xD8}, {0xF3,0x4A},
+ {0xC3,0xD9}, {0x89,0xB0}, {0xA0,0x48}, {0xC4,0xBA},
+ {0xC4,0xB9}, {0xF6,0x52}, {0x8F,0xFB}, {0x8F,0xF6},
+ {0xC5,0x42}, {0xF6,0x53}, {0xF7,0x5C}, {0xC5,0xAB},
+ {0xC5,0xAC}, {0x9D,0xDC}, {0xF8,0x45}, {0xC6,0x42},
+ {0x99,0xDD}, {0x8B,0xE8}, {0xA8,0xAA}, {0xB3,0x6A},
+ {0xB3,0x69}, {0xE0,0x5C}, {0xE0,0x5D}, {0xBB,0xAE},
+ {0xEB,0xB9}, {0xBD,0xEA}, {0xEB,0xBA}, {0xEE,0xB9},
+ {0xA8,0xAB}, {0xD0,0xB2}, {0xAD,0x76}, {0xAD,0x75},
+ {0xD3,0xE3}, {0xB0,0x5F}, {0xD3,0xE4}, {0xD7,0xD5},
+ {0x92,0xC1}, {0xD7,0xD4}, {0xD7,0xD3}, {0xDB,0xEE},
+ {0xB6,0x58}, {0x9F,0xD6}, {0xDB,0xED}, {0xB6,0x57},
+ {0xDB,0xEF}, {0xB6,0x56}, {0xE0,0x5F}, {0xE0,0x62},
+ {0xE0,0x60}, {0xE0,0x61}, {0xE0,0x65}, {0xE0,0x5E},
+ {0xE0,0x66}, {0xE0,0x63}, {0xE0,0x64}, {0xBB,0xB0},
+ {0xE4,0x56}, {0xBB,0xAF}, {0xE7,0xF2}, {0xE7,0xF0},
+ {0xBD,0xEB}, {0xE7,0xEF}, {0xE7,0xF1}, {0xBD,0xEC},
+ {0xEB,0xBB}, {0xA0,0xD2}, {0xEB,0xBC}, {0xC1,0xCD},
+ {0x90,0x40}, {0xF3,0x4C}, {0xF3,0x4E}, {0xF3,0x4B},
+ {0xF3,0x4D}, {0xF4,0xD6}, {0xF6,0x54}, {0xF9,0x6F},
+ {0xA8,0xAC}, {0xAD,0x77}, {0xD3,0xE5}, {0xD3,0xE7},
+ {0xD3,0xE6}, {0xD7,0xD8}, {0xB3,0x6C}, {0xD7,0xD6},
+ {0xB3,0x6B}, {0xD7,0xD9}, {0x8A,0xC4}, {0xD7,0xDA},
+ {0xD7,0xD7}, {0x99,0xE0}, {0xDB,0xFB}, {0xB6,0x60},
+ {0xDB,0xF3}, {0xDB,0xF9}, {0xB6,0x5B}, {0xB6,0x5E},
+ {0xDB,0xF2}, {0xB6,0x59}, {0xDB,0xF6}, {0xE0,0x6C},
+ {0xB6,0x5D}, {0xDB,0xF1}, {0x9F,0xF0}, {0xDB,0xF7},
+ {0xDB,0xF4}, {0xDB,0xFA}, {0xDB,0xF0}, {0xDB,0xF8},
+ {0xB6,0x5C}, {0xB6,0x5F}, {0xDB,0xF5}, {0xB6,0x5A},
+ {0xB8,0xF2}, {0xE0,0x68}, {0xB8,0xF1}, {0xE0,0x6F},
+ {0xE0,0x6E}, {0xB8,0xF8}, {0xB8,0xF9}, {0xE0,0x70},
+ {0xB8,0xF3}, {0xE0,0x6D}, {0xB8,0xF7}, {0xE0,0x72},
+ {0xE0,0x69}, {0xE0,0x6B}, {0xB8,0xF4}, {0xE0,0x67},
+ {0xE0,0x6A}, {0xE0,0x71}, {0xB8,0xF5}, {0xE0,0x73},
+ {0xB8,0xF6}, {0xBB,0xB1}, {0xE4,0x5B}, {0xE4,0x61},
+ {0xE4,0x59}, {0xE4,0x62}, {0x9F,0xF3}, {0xE4,0x58},
+ {0xE4,0x5D}, {0xE4,0x63}, {0xE4,0x60}, {0xE4,0x5F},
+ {0xE4,0x5E}, {0xE4,0x57}, {0xE4,0x5C}, {0xE4,0x5A},
+ {0x9D,0xBF}, {0xBD,0xF1}, {0xBD,0xEE}, {0xE7,0xFB},
+ {0xE8,0x41}, {0xE8,0x43}, {0xE8,0x40}, {0xE7,0xF8},
+ {0xE7,0xFA}, {0xE8,0x45}, {0xE8,0x42}, {0xE7,0xFC},
+ {0xE8,0x46}, {0xE7,0xF9}, {0xE8,0x44}, {0xBD,0xEF},
+ {0xBD,0xF5}, {0xBD,0xF3}, {0xE7,0xF3}, {0xBD,0xF4},
+ {0xBD,0xF0}, {0xE7,0xF4}, {0xE7,0xF6}, {0xE7,0xF5},
+ {0xE7,0xFD}, {0xE7,0xFE}, {0x9F,0xF6}, {0xBD,0xF2},
+ {0x95,0xC8}, {0xBD,0xED}, {0x9E,0x5A}, {0xE7,0xF7},
+ {0xEB,0xC6}, {0xBF,0xE2}, {0xEB,0xBD}, {0xBF,0xE3},
+ {0xBF,0xE6}, {0xEB,0xC2}, {0xEB,0xBF}, {0xBF,0xE5},
+ {0x99,0xE3}, {0xEB,0xC3}, {0xEB,0xC4}, {0xEB,0xBE},
+ {0xEB,0xC7}, {0xEB,0xC0}, {0xEB,0xC5}, {0xBF,0xE4},
+ {0xBF,0xE1}, {0xEB,0xC1}, {0x8A,0x4A}, {0xEE,0xBF},
+ {0xC1,0xD0}, {0xC1,0xCE}, {0xC1,0xD1}, {0xC1,0xCF},
+ {0xEE,0xBE}, {0xEE,0xBB}, {0xEE,0xBA}, {0x9F,0xF1},
+ {0xEE,0xBD}, {0xEE,0xBC}, {0xF1,0x45}, {0xC2,0xDE},
+ {0xF0,0xFB}, {0xF0,0xFA}, {0xC2,0xD9}, {0xF1,0x41},
+ {0xF1,0x40}, {0xF0,0xF7}, {0xF1,0x43}, {0xF0,0xFC},
+ {0xC2,0xDD}, {0xF0,0xF9}, {0xF1,0x42}, {0xF0,0xF8},
+ {0xC2,0xDA}, {0xC2,0xDC}, {0xF0,0xFD}, {0xC2,0xDB},
+ {0xF0,0xFE}, {0x8A,0xA7}, {0xF1,0x44}, {0xF3,0x52},
+ {0xC3,0xDE}, {0xF3,0x4F}, {0xF3,0x53}, {0x99,0xE6},
+ {0xC3,0xDB}, {0xF3,0x51}, {0xC3,0xE0}, {0x9F,0xF7},
+ {0xC3,0xDD}, {0x9F,0xED}, {0xF3,0x50}, {0xC3,0xDF},
+ {0xF3,0x54}, {0xC3,0xDA}, {0x8A,0x5C}, {0x9D,0xAE},
+ {0xC4,0xBC}, {0xC4,0xBE}, {0xF4,0xD9}, {0xC4,0xBD},
+ {0xF4,0xD7}, {0xC3,0xDC}, {0xF4,0xD8}, {0xC4,0xBB},
+ {0xC5,0x43}, {0xC5,0x45}, {0xF6,0x56}, {0xC5,0x44},
+ {0xF6,0x55}, {0xF7,0x61}, {0xC5,0xAD}, {0xF7,0x60},
+ {0xC5,0xAE}, {0xF7,0x5E}, {0xF7,0x5D}, {0xF7,0x62},
+ {0xF7,0x63}, {0xF8,0x46}, {0xF7,0x5F}, {0xF8,0xC6},
+ {0xF8,0xC3}, {0xF8,0xC4}, {0xF8,0xC5}, {0xC6,0x5C},
+ {0xF9,0x51}, {0xF9,0x50}, {0xF9,0x4F}, {0xF9,0x70},
+ {0x95,0xC9}, {0xF9,0xBE}, {0xF9,0xAB}, {0xC6,0x6E},
+ {0xA8,0xAD}, {0xB0,0x60}, {0x90,0x48}, {0x99,0xE8},
+ {0xB8,0xFA}, {0x90,0x49}, {0x8C,0xBA}, {0xBD,0xF6},
+ {0x90,0xB1}, {0xEB,0xC8}, {0xC2,0xDF}, {0xF3,0x55},
+ {0x90,0x4A}, {0xF9,0xAC}, {0xA8,0xAE}, {0xAA,0xEE},
+ {0xAD,0x79}, {0xAD,0x78}, {0x99,0xEA}, {0xB0,0x63},
+ {0xD3,0xE8}, {0xB0,0x61}, {0xD3,0xE9}, {0xB0,0x62},
+ {0xD7,0xDF}, {0xD7,0xDB}, {0x9B,0xD1}, {0xB3,0x6D},
+ {0xD7,0xDE}, {0xD7,0xDD}, {0xD7,0xDC}, {0xB3,0x6E},
+ {0xD7,0xE0}, {0xD7,0xE1}, {0x99,0xEB}, {0x99,0xEC},
+ {0xDC,0x43}, {0xDC,0x41}, {0xDC,0x45}, {0xDC,0x46},
+ {0xDC,0x4C}, {0xDC,0x48}, {0xDC,0x4A}, {0x99,0xED},
+ {0xDC,0x42}, {0xDB,0xFC}, {0xDC,0x49}, {0x99,0xEE},
+ {0xDC,0x4B}, {0xDC,0x44}, {0xDC,0x47}, {0xDB,0xFD},
+ {0xB6,0x62}, {0xDC,0x40}, {0xDB,0xFE}, {0xB6,0x61},
+ {0xB6,0x63}, {0xB8,0xFD}, {0xE0,0x75}, {0xE0,0x77},
+ {0xE0,0x76}, {0xE0,0x7B}, {0xB8,0xFB}, {0xE0,0x78},
+ {0xE0,0x74}, {0xE0,0x79}, {0xE0,0x7A}, {0xB8,0xFC},
+ {0xB8,0xFE}, {0xE0,0x7C}, {0xE4,0x67}, {0xE4,0x66},
+ {0xE4,0x64}, {0xE4,0x65}, {0xBB,0xB3}, {0xBB,0xB5},
+ {0xBB,0xB2}, {0xBB,0xB4}, {0xE8,0x4D}, {0xE8,0x4E},
+ {0xE8,0x49}, {0x90,0x4C}, {0xE8,0x4A}, {0xBD,0xF8},
+ {0xBD,0xFD}, {0xBD,0xF7}, {0xBD,0xFE}, {0xBD,0xF9},
+ {0xE8,0x4B}, {0xE8,0x4C}, {0xE8,0x48}, {0xBE,0x40},
+ {0xBD,0xFB}, {0xBD,0xFA}, {0xBD,0xFC}, {0xE8,0x47},
+ {0x90,0x4D}, {0xEB,0xCA}, {0xBF,0xE8}, {0x95,0xCB},
+ {0xEB,0xCC}, {0xBF,0xEA}, {0xEB,0xCF}, {0xEB,0xCB},
+ {0xEB,0xC9}, {0xEB,0xCE}, {0xBF,0xE9}, {0xEB,0xCD},
+ {0xBF,0xE7}, {0xC1,0xD3}, {0xC1,0xD6}, {0xEE,0xC1},
+ {0x97,0xE2}, {0xC1,0xD4}, {0xEE,0xC0}, {0xC1,0xD2},
+ {0xC1,0xD5}, {0xF1,0x46}, {0xF1,0x47}, {0xF1,0x48},
+ {0xC2,0xE0}, {0x95,0xCC}, {0xF1,0x49}, {0xC2,0xE1},
+ {0xC3,0xE2}, {0xF3,0x58}, {0xF3,0x59}, {0xF3,0x57},
+ {0xF3,0x56}, {0xF3,0x5A}, {0xC3,0xE1}, {0xF4,0xDD},
+ {0xF4,0xDB}, {0xF4,0xDC}, {0xF4,0xDE}, {0xF4,0xDA},
+ {0xF4,0xDF}, {0xF6,0x58}, {0x9F,0x78}, {0xF6,0x59},
+ {0xF6,0x57}, {0xC5,0x46}, {0xF7,0x64}, {0xC5,0xAF},
+ {0xF7,0x65}, {0xF8,0x48}, {0xF8,0x47}, {0x89,0x7C},
+ {0x89,0x7D}, {0x89,0x7E}, {0x99,0x5D}, {0xA8,0xAF},
+ {0xB6,0x64}, {0xB9,0x40}, {0x9B,0x5A}, {0xBB,0xB6},
+ {0x90,0x50}, {0xBF,0xEC}, {0x8C,0x4F}, {0xBF,0xEB},
+ {0xC3,0xE3}, {0xC4,0x7C}, {0xC5,0x47}, {0xA8,0xB0},
+ {0xB0,0x64}, {0xB9,0x41}, {0x90,0x54}, {0xF3,0x5B},
+ {0xC6,0xD6}, {0x9A,0xA8}, {0x99,0xEF}, {0xFE,0xEB},
+ {0x9D,0xA3}, {0x9D,0xA1}, {0x99,0x43}, {0x99,0x45},
+ {0x9D,0x7D}, {0xCB,0xA6}, {0x99,0xF0}, {0xA8,0xB1},
+ {0xA8,0xB4}, {0xA8,0xB3}, {0xA8,0xB2}, {0xCB,0xA5},
+ {0x99,0xF1}, {0xCD,0xCD}, {0x99,0xF2}, {0xCD,0xCF},
+ {0xAA,0xEF}, {0x8C,0xBC}, {0x9D,0x60}, {0xAA,0xF1},
+ {0xCD,0xCC}, {0xCD,0xCE}, {0xAA,0xF0}, {0xCD,0xD1},
+ {0xCD,0xD0}, {0xCD,0xD2}, {0xA0,0xA3}, {0xD0,0xB6},
+ {0xD0,0xB4}, {0xAD,0x7C}, {0xD0,0xB3}, {0xAD,0xA3},
+ {0xAD,0x7E}, {0xAD,0x7B}, {0xAD,0xA4}, {0xAD,0x7D},
+ {0xAD,0xA2}, {0xAD,0xA1}, {0xD0,0xB5}, {0xAD,0x7A},
+ {0xB0,0x6A}, {0xD3,0xEB}, {0xD3,0xF1}, {0xB0,0x67},
+ {0xB0,0x6E}, {0x90,0x5B}, {0xB0,0x69}, {0xD3,0xEE},
+ {0xD3,0xF0}, {0xB0,0x6C}, {0xD3,0xEA}, {0xD3,0xED},
+ {0xB0,0x68}, {0xB0,0x65}, {0xD3,0xEC}, {0xB0,0x6B},
+ {0xD3,0xEF}, {0xB0,0x6D}, {0xB0,0x66}, {0x9E,0xDB},
+ {0xD7,0xE3}, {0xD7,0xE6}, {0xB3,0x70}, {0xB3,0x7A},
+ {0xB3,0x76}, {0xD7,0xE4}, {0x9D,0x79}, {0xB3,0x7E},
+ {0xB3,0x77}, {0xB3,0x7C}, {0xB3,0x72}, {0xB3,0x6F},
+ {0xB3,0x71}, {0xB3,0x7D}, {0xD7,0xE5}, {0xB3,0x75},
+ {0xB3,0x78}, {0xB3,0x74}, {0xB3,0x79}, {0xD7,0xE7},
+ {0xB3,0x7B}, {0xB3,0x73}, {0xD7,0xE2}, {0xDC,0x4D},
+ {0xB6,0x65}, {0xDC,0x4F}, {0xB6,0x67}, {0xB6,0x69},
+ {0x99,0xF3}, {0xDC,0x4E}, {0xB6,0x66}, {0xB6,0x6A},
+ {0x90,0x62}, {0xB6,0x68}, {0xB9,0x47}, {0xE0,0xA3},
+ {0xB9,0x4F}, {0xE0,0x7E}, {0xB9,0x50}, {0xB9,0x45},
+ {0xE0,0xA1}, {0xB9,0x4A}, {0xE0,0xA2}, {0xB9,0x43},
+ {0xB9,0x42}, {0x9F,0x55}, {0xB9,0x4D}, {0xB9,0x4C},
+ {0xB9,0x4B}, {0xB9,0x49}, {0xB9,0x4E}, {0xE0,0x7D},
+ {0xB9,0x44}, {0xB9,0x46}, {0xB9,0x48}, {0x9B,0xF9},
+ {0xBB,0xB8}, {0xBB,0xBB}, {0xBB,0xBF}, {0xBB,0xB9},
+ {0xBB,0xBE}, {0xBB,0xBC}, {0xBB,0xB7}, {0x90,0x65},
+ {0xBB,0xBD}, {0xBB,0xBA}, {0x96,0xE0}, {0xE8,0x52},
+ {0xBE,0x43}, {0xBE,0x41}, {0xE8,0x53}, {0x98,0xBE},
+ {0xBE,0x44}, {0xBE,0x42}, {0xE8,0x51}, {0xE8,0x50},
+ {0xBF,0xF0}, {0xE8,0x4F}, {0xBF,0xEE}, {0xBF,0xED},
+ {0xEB,0xD0}, {0xBE,0x45}, {0xBF,0xEF}, {0xEB,0xD1},
+ {0xBF,0xF2}, {0xEB,0xD2}, {0xBF,0xF1}, {0xC1,0xD8},
+ {0xEE,0xC3}, {0xC1,0xD7}, {0xC1,0xDC}, {0xC1,0xDA},
+ {0xC1,0xDB}, {0xC2,0xE3}, {0xC1,0xD9}, {0xEE,0xC2},
+ {0xEB,0xD3}, {0xC2,0xE2}, {0xC2,0xE4}, {0xC3,0xE4},
+ {0xC3,0xE5}, {0xF4,0xE0}, {0xC5,0xDE}, {0xC5,0xDD},
+ {0xA8,0xB6}, {0xCA,0x55}, {0xB0,0x6F}, {0xCA,0x52},
+ {0xCA,0x53}, {0xCA,0x51}, {0xCA,0x54}, {0xCB,0xAA},
+ {0xCB,0xA7}, {0xCB,0xAC}, {0xCB,0xA8}, {0xA8,0xB7},
+ {0xA8,0xBA}, {0xCB,0xA9}, {0xA8,0xB9}, {0xCB,0xAB},
+ {0x90,0x68}, {0xA8,0xB8}, {0x90,0x6C}, {0xCD,0xD5},
+ {0xCD,0xD7}, {0xAA,0xF4}, {0xCD,0xD3}, {0xCD,0xD6},
+ {0xCD,0xD4}, {0xAA,0xF2}, {0xAA,0xF5}, {0xAA,0xF3},
+ {0x95,0xD8}, {0xD0,0xB8}, {0xD0,0xBC}, {0xD0,0xB9},
+ {0xAD,0xA7}, {0xAD,0xA8}, {0x90,0x6A}, {0xD0,0xBB},
+ {0xD0,0xBD}, {0xD0,0xBF}, {0xAD,0xA5}, {0xD0,0xBE},
+ {0xAD,0xA6}, {0xD7,0xEE}, {0xD0,0xBA}, {0xD3,0xF2},
+ {0xD3,0xFB}, {0xD3,0xF9}, {0xD3,0xF4}, {0xD3,0xF5},
+ {0xD3,0xFA}, {0xD3,0xFC}, {0xB0,0x71}, {0xD3,0xF7},
+ {0xD3,0xF3}, {0xB0,0x70}, {0xB0,0x72}, {0xD3,0xF6},
+ {0xD3,0xFD}, {0xD3,0xF8}, {0xB3,0xA1}, {0xD7,0xF1},
+ {0xD7,0xE9}, {0xD7,0xEF}, {0xD7,0xF0}, {0xB3,0xA2},
+ {0xD7,0xE8}, {0xD7,0xEA}, {0xD0,0xB7}, {0xD7,0xEC},
+ {0xD7,0xED}, {0xD7,0xEB}, {0xB6,0x6C}, {0xDC,0x56},
+ {0xEB,0xD4}, {0xDC,0x57}, {0xDC,0x54}, {0xB3,0xA3},
+ {0xB6,0x6E}, {0xDC,0x53}, {0xDC,0x59}, {0xDC,0x58},
+ {0xB6,0x6B}, {0xDC,0x5C}, {0xDC,0x52}, {0xDC,0x5B},
+ {0xDC,0x50}, {0xDC,0x5A}, {0xDC,0x55}, {0xB6,0x6D},
+ {0xE0,0xAA}, {0xE0,0xA5}, {0xE0,0xAB}, {0xE0,0xA6},
+ {0xE0,0xA4}, {0xE0,0xA7}, {0xB9,0x51}, {0xE0,0xA9},
+ {0xE0,0xA8}, {0xB9,0x52}, {0xBB,0xC1}, {0xBB,0xC0},
+ {0xE4,0x6E}, {0xE4,0x71}, {0xE4,0x69}, {0xE4,0x6D},
+ {0xBB,0xC2}, {0xE4,0x6C}, {0xE4,0x6A}, {0xE4,0x70},
+ {0xE4,0x6B}, {0xE4,0x68}, {0xE4,0x6F}, {0xE8,0x59},
+ {0xBE,0x48}, {0xF1,0x4A}, {0xE8,0x56}, {0xE8,0x57},
+ {0xE8,0x55}, {0xDC,0x51}, {0xBE,0x47}, {0xE8,0x5A},
+ {0xE8,0x54}, {0xBE,0x46}, {0xBE,0x49}, {0xE8,0x58},
+ {0xEB,0xD5}, {0xBF,0xF3}, {0xEB,0xD6}, {0xEB,0xD7},
+ {0xEE,0xC4}, {0xC1,0xDD}, {0xF1,0x4B}, {0xF1,0x4C},
+ {0xF1,0x4D}, {0xF3,0x5D}, {0xF3,0x5C}, {0xF4,0xE2},
+ {0xF4,0xE1}, {0xF6,0x5B}, {0xF6,0x5C}, {0xF6,0x5A},
+ {0xF7,0x66}, {0xC5,0xB0}, {0xA8,0xBB}, {0xAD,0xAA},
+ {0xAD,0xA9}, {0xB0,0x75}, {0xB0,0x74}, {0xD4,0x40},
+ {0xD4,0x41}, {0xD3,0xFE}, {0x9F,0xB2}, {0xB0,0x73},
+ {0xD7,0xF5}, {0xD7,0xF6}, {0xD7,0xF2}, {0xB3,0xA4},
+ {0xD7,0xF3}, {0x9F,0xAE}, {0xD7,0xF4}, {0x9F,0xB0},
+ {0x89,0xAD}, {0xDC,0x5F}, {0xDC,0x61}, {0xDC,0x5D},
+ {0xDC,0x60}, {0xB6,0x6F}, {0xDC,0x5E}, {0xB6,0x70},
+ {0x90,0x6E}, {0xDD,0x73}, {0xB9,0x55}, {0xB9,0x54},
+ {0xB9,0x53}, {0xE0,0xAC}, {0xE0,0xAD}, {0x9E,0x71},
+ {0xE4,0x73}, {0xE4,0x75}, {0xBB,0xC6}, {0xBB,0xC3},
+ {0x9E,0x4A}, {0xBB,0xC5}, {0xBB,0xC4}, {0xE4,0x74},
+ {0xE4,0x72}, {0x9F,0xDC}, {0xE8,0x61}, {0xE8,0x5E},
+ {0xE8,0x5F}, {0xBE,0x4D}, {0xE8,0x60}, {0xE8,0x5B},
+ {0xE8,0x5C}, {0xBE,0x4A}, {0xBE,0x4B}, {0xE8,0x5D},
+ {0xBE,0x4C}, {0x89,0xAB}, {0xEB,0xDB}, {0x9F,0xB8},
+ {0xEB,0xDC}, {0xEB,0xD9}, {0xEB,0xDA}, {0xBF,0xF4},
+ {0xEB,0xD8}, {0xEE,0xC8}, {0xEE,0xC5}, {0xEE,0xC7},
+ {0xC1,0xE0}, {0xEE,0xCB}, {0xC1,0xDF}, {0xEE,0xC9},
+ {0xEE,0xCC}, {0xEE,0xCA}, {0xEE,0xC6}, {0xC1,0xDE},
+ {0xF1,0x4F}, {0xF1,0x50}, {0xF1,0x4E}, {0x90,0x70},
+ {0xF1,0x52}, {0xC2,0xE5}, {0xC2,0xE6}, {0xF3,0x5F},
+ {0xC3,0xE7}, {0xF1,0x51}, {0xF3,0x5E}, {0xC3,0xE6},
+ {0xF4,0xE5}, {0xF4,0xE6}, {0xC4,0xBF}, {0xF4,0xE4},
+ {0x8B,0x63}, {0xF4,0xE3}, {0xF6,0x5D}, {0xC5,0x48},
+ {0x95,0xDC}, {0xF8,0x49}, {0xF8,0xC8}, {0xF8,0xC7},
+ {0xC6,0x43}, {0xC6,0x5D}, {0xF8,0xC9}, {0xF9,0x71},
+ {0x90,0x71}, {0xC6,0x6F}, {0xA8,0xBC}, {0xAA,0xF6},
+ {0xB9,0x56}, {0xC4,0xC0}, {0xA8,0xBD}, {0xAD,0xAB},
+ {0xB3,0xA5}, {0xB6,0x71}, {0xC2,0xE7}, {0xAA,0xF7},
+ {0xD0,0xC1}, {0xD0,0xC0}, {0xD4,0x42}, {0xFC,0x5E},
+ {0xB0,0x78}, {0xB0,0x76}, {0xB0,0x7A}, {0xD4,0x44},
+ {0xB0,0x79}, {0xB0,0x77}, {0x89,0x49}, {0xD4,0x43},
+ {0xB3,0xA8}, {0xD7,0xFC}, {0x96,0x5B}, {0xB3,0xA7},
+ {0xB3,0xA9}, {0xD8,0x42}, {0xB3,0xAB}, {0xD7,0xFE},
+ {0xD8,0x40}, {0xD7,0xF7}, {0xB3,0xAA}, {0xD8,0x43},
+ {0xD7,0xF9}, {0xD7,0xFA}, {0xD7,0xF8}, {0xB3,0xA6},
+ {0x8C,0x50}, {0xD8,0x41}, {0xD7,0xFB}, {0xD7,0xFD},
+ {0x94,0xA6}, {0xDC,0x6D}, {0x8F,0xD5}, {0xDC,0x6C},
+ {0xDC,0x6A}, {0xDC,0x62}, {0xDC,0x71}, {0xDC,0x65},
+ {0xDC,0x6F}, {0xDC,0x76}, {0xDC,0x6E}, {0xB6,0x79},
+ {0x9E,0x73}, {0xB6,0x75}, {0xDC,0x63}, {0xDC,0x69},
+ {0xB6,0x77}, {0x90,0x75}, {0xDC,0x68}, {0xB6,0x78},
+ {0xB6,0x7A}, {0xDC,0x6B}, {0x99,0xF7}, {0xB6,0x72},
+ {0xB6,0x73}, {0xDC,0x77}, {0xDC,0x75}, {0xDC,0x74},
+ {0xDC,0x66}, {0xDC,0x72}, {0xB6,0x76}, {0x8C,0xBF},
+ {0xB6,0x74}, {0xDC,0x73}, {0xDC,0x64}, {0xDC,0x67},
+ {0xDC,0x70}, {0x99,0xF9}, {0x96,0x63}, {0x95,0xB9},
+ {0xE4,0xBA}, {0xE0,0xB7}, {0xE0,0xB0}, {0xE0,0xC3},
+ {0xE0,0xCC}, {0xE0,0xB3}, {0xB9,0x61}, {0x94,0xD4},
+ {0xE0,0xC0}, {0xB9,0x57}, {0xB9,0x59}, {0xB9,0x65},
+ {0xE0,0xB1}, {0xFC,0xFA}, {0xB9,0x5A}, {0xB9,0x5C},
+ {0xB9,0x66}, {0xB9,0x5B}, {0x90,0x77}, {0x90,0xAB},
+ {0xB9,0x64}, {0xE0,0xB9}, {0xE0,0xAE}, {0xB9,0x62},
+ {0xE0,0xB8}, {0xB9,0x5E}, {0xE0,0xCA}, {0xB9,0x63},
+ {0xE0,0xC8}, {0xE0,0xBC}, {0xE0,0xC6}, {0xB9,0x60},
+ {0xE0,0xAF}, {0xE0,0xC9}, {0xE0,0xC4}, {0x9D,0x4D},
+ {0xE0,0xCB}, {0xB9,0x58}, {0x99,0xFA}, {0xB9,0x67},
+ {0xB9,0x5D}, {0x92,0xE3}, {0xE0,0xB5}, {0x97,0xBB},
+ {0xE0,0xBD}, {0xE0,0xC1}, {0x90,0x78}, {0xE0,0xC5},
+ {0xB9,0x5F}, {0xE0,0xB4}, {0xE0,0xB2}, {0xE0,0xBE},
+ {0x99,0xFB}, {0xE0,0xBB}, {0xE0,0xBA}, {0x97,0xE0},
+ {0xE0,0xBF}, {0xE0,0xC2}, {0xE0,0xC7}, {0xE4,0x78},
+ {0x96,0xDC}, {0xBB,0xC7}, {0xE4,0xA4}, {0xE4,0x7A},
+ {0xBB,0xCC}, {0xBB,0xD0}, {0xE4,0xAD}, {0xE4,0xB5},
+ {0xE4,0xA6}, {0xBB,0xC8}, {0x9C,0xA8}, {0xE4,0xAA},
+ {0xE0,0xB6}, {0x97,0x72}, {0xBB,0xC9}, {0xE4,0xB1},
+ {0xE4,0xB6}, {0xE4,0xAE}, {0x94,0x40}, {0xE4,0xB0},
+ {0xE4,0xB9}, {0xE4,0xB2}, {0xE4,0x7E}, {0xE4,0xA9},
+ {0x92,0xF2}, {0xBB,0xD1}, {0xBB,0xCD}, {0xE4,0x7C},
+ {0xE4,0xAB}, {0xBB,0xCB}, {0xE4,0xA5}, {0xBB,0xCA},
+ {0xE4,0xB3}, {0xE4,0xA2}, {0xE4,0x79}, {0xBB,0xCE},
+ {0xE4,0xB8}, {0xE4,0x7B}, {0xE4,0xAF}, {0xE4,0xAC},
+ {0xE4,0xA7}, {0xE4,0x77}, {0xE4,0x76}, {0xE4,0xA1},
+ {0xE4,0xB4}, {0xBB,0xCF}, {0xE4,0xB7}, {0xE4,0x7D},
+ {0xE4,0xA3}, {0xBE,0x52}, {0x99,0xFD}, {0x99,0xFC},
+ {0xBE,0x5A}, {0xBE,0x55}, {0xE8,0xA4}, {0xE8,0xA1},
+ {0xE8,0x67}, {0xBE,0x50}, {0xF9,0xD7}, {0x96,0x4A},
+ {0xBE,0x4F}, {0xBE,0x56}, {0x96,0xD8}, {0x99,0xFE},
+ {0xE8,0x65}, {0xBE,0x54}, {0xE8,0x71}, {0xE8,0x63},
+ {0xE8,0x64}, {0xBE,0x4E}, {0xE8,0xA3}, {0xBE,0x58},
+ {0xE8,0x74}, {0xE8,0x79}, {0xE8,0x73}, {0xEB,0xEE},
+ {0xE8,0x6F}, {0xE8,0x77}, {0xE8,0x75}, {0xE8,0x68},
+ {0xE8,0x62}, {0xE8,0x7D}, {0xBE,0x57}, {0xE8,0x7E},
+ {0x90,0x4B}, {0xE8,0x78}, {0xE8,0x6D}, {0xE8,0x6B},
+ {0xE8,0x66}, {0xFA,0x41}, {0xE8,0x6E}, {0xE8,0x7B},
+ {0xE8,0x6A}, {0xE8,0x7A}, {0xE8,0xA2}, {0x9A,0x40},
+ {0xBE,0x53}, {0x97,0x5B}, {0xE8,0x76}, {0xE8,0x7C},
+ {0xE8,0x72}, {0xE8,0x6C}, {0xBE,0x51}, {0x9A,0x41},
+ {0x91,0xDD}, {0xE4,0xA8}, {0xE8,0x70}, {0xBE,0x59},
+ {0xE8,0x69}, {0x93,0xFC}, {0x9A,0x42}, {0x9A,0x43},
+ {0x96,0x59}, {0xEB,0xF4}, {0xBF,0xF7}, {0xEB,0xF3},
+ {0xEB,0xF0}, {0xEC,0x44}, {0xBF,0xFB}, {0x9A,0x44},
+ {0xEC,0x41}, {0xEB,0xF8}, {0xEC,0x43}, {0xEB,0xE9},
+ {0xEB,0xF6}, {0x90,0x51}, {0xBF,0xFD}, {0xEB,0xE1},
+ {0x94,0xBF}, {0xEB,0xDF}, {0xEC,0x42}, {0xEC,0x40},
+ {0xEB,0xFE}, {0xEB,0xED}, {0xEB,0xEC}, {0xEB,0xE2},
+ {0xC0,0x40}, {0xEB,0xE8}, {0xEB,0xF2}, {0xEB,0xFD},
+ {0xC0,0x43}, {0xEC,0x45}, {0xC1,0xE8}, {0xC0,0x45},
+ {0xBF,0xFE}, {0xEB,0xE6}, {0xEB,0xEF}, {0xEB,0xDE},
+ {0xEB,0xE0}, {0xBF,0xF5}, {0xC0,0x42}, {0xBF,0xFA},
+ {0xEB,0xE7}, {0xEB,0xF7}, {0xEB,0xF1}, {0xC0,0x41},
+ {0xEB,0xDD}, {0xC1,0xE3}, {0xEB,0xF9}, {0xEB,0xFC},
+ {0xBF,0xFC}, {0x90,0xA2}, {0xEB,0xEB}, {0xC0,0x44},
+ {0xBF,0xF9}, {0x9C,0xAB}, {0x97,0x76}, {0xBF,0xF8},
+ {0xEB,0xF5}, {0xEB,0xFB}, {0xBF,0xF6}, {0xEB,0xE4},
+ {0xEB,0xFA}, {0xEB,0xE5}, {0xFC,0x55}, {0xFE,0x45},
+ {0x94,0xA8}, {0x9A,0x45}, {0xFA,0x4B}, {0x9D,0xE1},
+ {0xEB,0xEA}, {0xEE,0xD2}, {0x96,0xD9}, {0xEE,0xD7},
+ {0xC1,0xE5}, {0xC1,0xE7}, {0xEE,0xDD}, {0xC1,0xE1},
+ {0xEE,0xEC}, {0xEE,0xE3}, {0xEE,0xD8}, {0xEE,0xD9},
+ {0xEE,0xE2}, {0xC1,0xEE}, {0xEE,0xE1}, {0xEE,0xD1},
+ {0xEE,0xE0}, {0xEE,0xD4}, {0xEE,0xED}, {0xC1,0xED},
+ {0xC1,0xEB}, {0xEE,0xD5}, {0xEE,0xE8}, {0x97,0x74},
+ {0xEE,0xDA}, {0xEE,0xE7}, {0xFD,0xF5}, {0xEE,0xE9},
+ {0xEE,0xD0}, {0xC1,0xE6}, {0x92,0xE5}, {0xEE,0xEA},
+ {0x96,0x45}, {0x91,0xDA}, {0xEE,0xDE}, {0x90,0xA3},
+ {0xC1,0xEA}, {0xEE,0xDB}, {0xA0,0x5F}, {0xC1,0xEC},
+ {0xEE,0xE4}, {0x90,0xAF}, {0x97,0xBF}, {0xC1,0xE4},
+ {0xEE,0xD6}, {0xEE,0xE5}, {0x91,0x4C}, {0xEE,0xDF},
+ {0xEB,0xE3}, {0xEE,0xE6}, {0xEE,0xD3}, {0x96,0x7A},
+ {0xC1,0xE9}, {0xEE,0xEB}, {0x91,0xDE}, {0xC1,0xE2},
+ {0xEE,0xCE}, {0x9A,0x46}, {0xFE,0xB0}, {0x97,0x79},
+ {0x94,0x6C}, {0xF1,0x60}, {0xF1,0x59}, {0xC2,0xE9},
+ {0xF1,0x54}, {0xF1,0x63}, {0xF1,0x5B}, {0xEE,0xDC},
+ {0x98,0x58}, {0xF1,0x65}, {0xF1,0x55}, {0xC2,0xE8},
+ {0xF1,0x5F}, {0xC2,0xEA}, {0xC2,0xF2}, {0xC2,0xF0},
+ {0xF1,0x61}, {0xC2,0xF1}, {0xF1,0x57}, {0x92,0x66},
+ {0xF1,0x58}, {0xF1,0x5D}, {0xF1,0x62}, {0x93,0xFB},
+ {0xEE,0xCD}, {0xC2,0xEB}, {0xF1,0x6A}, {0xF1,0x67},
+ {0xF1,0x6B}, {0xF1,0x5E}, {0xF1,0x5A}, {0xF1,0x68},
+ {0xF3,0x6A}, {0xF1,0x5C}, {0xC2,0xEE}, {0x9A,0x47},
+ {0xC2,0xED}, {0xEE,0xCF}, {0xC2,0xEF}, {0xF1,0x64},
+ {0xF1,0x66}, {0xC2,0xEC}, {0xF1,0x69}, {0xF1,0x53},
+ {0xF1,0x56}, {0x97,0x49}, {0x97,0x48}, {0x93,0x4A},
+ {0x9C,0xE2}, {0xF3,0x73}, {0xF3,0x63}, {0xC3,0xEB},
+ {0xF3,0x71}, {0x92,0x64}, {0xF3,0x61}, {0xC3,0xEC},
+ {0xF3,0x6C}, {0x91,0xDF}, {0xF3,0x68}, {0xC3,0xF1},
+ {0xF3,0x72}, {0xF3,0x62}, {0xF3,0x65}, {0xC3,0xE9},
+ {0xF3,0x74}, {0xFB,0x79}, {0xF3,0x6D}, {0xF3,0x70},
+ {0xC3,0xEF}, {0xC3,0xF4}, {0xC3,0xF2}, {0xF3,0x69},
+ {0xF3,0x64}, {0x96,0xD7}, {0xC3,0xED}, {0xC3,0xEE},
+ {0xF3,0x60}, {0xC3,0xEA}, {0x93,0x43}, {0xC3,0xE8},
+ {0xC3,0xF0}, {0xF3,0x6F}, {0xC3,0xF3}, {0xF3,0x6B},
+ {0xF3,0x75}, {0xC3,0xF5}, {0xF3,0x67}, {0xF3,0x6E},
+ {0xFD,0xCB}, {0xFE,0x7A}, {0x91,0xDB}, {0x8C,0x6A},
+ {0xF4,0xF3}, {0xF5,0x42}, {0xF4,0xF5}, {0xF4,0xFC},
+ {0xF3,0x66}, {0xF4,0xFA}, {0xF4,0xE9}, {0xF5,0x40},
+ {0xC4,0xC3}, {0xF4,0xED}, {0xF4,0xFE}, {0xF4,0xF4},
+ {0x97,0xAF}, {0xC4,0xC2}, {0x95,0xDD}, {0xF5,0x44},
+ {0xF4,0xF6}, {0x93,0x48}, {0xF4,0xFB}, {0xF4,0xFD},
+ {0xF4,0xE7}, {0xF5,0x41}, {0xF4,0xF2}, {0xF4,0xF7},
+ {0xF4,0xEB}, {0xF4,0xEF}, {0xF5,0x43}, {0xF4,0xF9},
+ {0xF4,0xE8}, {0xF4,0xEC}, {0xF4,0xEE}, {0xF4,0xF8},
+ {0x9A,0x4B}, {0xC4,0xC1}, {0xF4,0xF1}, {0xFC,0x45},
+ {0x9A,0x4D}, {0xF4,0xEA}, {0x91,0xBC}, {0x90,0xE2},
+ {0x90,0xB4}, {0x95,0xE1}, {0xF4,0xF0}, {0xF6,0x61},
+ {0xF6,0x66}, {0xC5,0x4F}, {0xF6,0x68}, {0x9A,0x4E},
+ {0xC5,0x49}, {0xF6,0x64}, {0xF6,0x6A}, {0xC5,0x4E},
+ {0xC5,0x4A}, {0xC5,0x4B}, {0xF6,0x60}, {0xF6,0x67},
+ {0xC5,0x4D}, {0xF6,0x65}, {0xC5,0x4C}, {0xF6,0x5F},
+ {0xF6,0x63}, {0xF6,0x62}, {0x9A,0x4F}, {0xF6,0x5E},
+ {0xF6,0x69}, {0xFE,0x40}, {0xFE,0x43}, {0xC5,0xB1},
+ {0xF7,0x6D}, {0xF7,0x70}, {0xF7,0x6C}, {0xF7,0x6E},
+ {0xF7,0x6F}, {0xF7,0x69}, {0xF7,0x6A}, {0xF7,0x67},
+ {0x96,0xDD}, {0xF7,0x6B}, {0xF7,0x68}, {0xC5,0xB2},
+ {0xC5,0xB3}, {0x9A,0x51}, {0xF8,0x4B}, {0xF8,0x4D},
+ {0x96,0xA7}, {0x90,0xB0}, {0xF8,0x4C}, {0xF8,0x4E},
+ {0xC5,0xE0}, {0xF8,0x4A}, {0xC5,0xDF}, {0xC5,0xE1},
+ {0x9C,0x4E}, {0x94,0x43}, {0xF8,0xCB}, {0xF8,0xCC},
+ {0xC6,0x44}, {0xF8,0xCA}, {0x8E,0xBA}, {0xF9,0x53},
+ {0xF9,0x52}, {0xF9,0x54}, {0xC6,0x5F}, {0xF9,0x55},
+ {0xC6,0x5E}, {0xF9,0x56}, {0xF9,0x72}, {0xF9,0x75},
+ {0xF9,0x74}, {0xC6,0x68}, {0xF9,0x73}, {0x9A,0x52},
+ {0xFC,0xC1}, {0xC6,0x72}, {0xC6,0x70}, {0xC6,0x71},
+ {0xC6,0x77}, {0xF9,0xC0}, {0xF9,0xC1}, {0xF9,0xBF},
+ {0xF9,0xC9}, {0x8B,0xE9}, {0x9C,0xAF}, {0x8B,0xFD},
+ {0x9A,0xBC}, {0x9A,0xB8}, {0x9A,0xAE}, {0x9A,0xA7},
+ {0x9A,0x53}, {0x9D,0x74}, {0xAA,0xF8}, {0x8B,0xEA},
+ {0xD8,0x44}, {0xDC,0x78}, {0xE8,0xA5}, {0xF3,0x76},
+ {0x8B,0xEB}, {0xAA,0xF9}, {0xAD,0xAC}, {0xB0,0x7B},
+ {0x90,0xB2}, {0xD8,0x45}, {0xD8,0x46}, {0xB3,0xAC},
+ {0xB6,0x7D}, {0xDC,0x7A}, {0xDC,0x79}, {0xB6,0xA3},
+ {0xB6,0x7C}, {0xDC,0x7B}, {0xB6,0x7E}, {0xB6,0xA2},
+ {0xB6,0xA1}, {0xB6,0x7B}, {0x95,0xE9}, {0x95,0xE8},
+ {0xB9,0x68}, {0x95,0xE6}, {0xE0,0xD0}, {0xE0,0xCE},
+ {0xE0,0xCF}, {0xE0,0xCD}, {0x90,0xB5}, {0xBB,0xD2},
+ {0x9A,0x54}, {0xBB,0xD5}, {0xBB,0xD7}, {0xBB,0xD6},
+ {0x90,0xB3}, {0x95,0xE7}, {0xBB,0xD3}, {0xBB,0xD4},
+ {0x8B,0x50}, {0xE8,0xA7}, {0xE8,0xA6}, {0xBE,0x5B},
+ {0xE8,0xA8}, {0xE8,0xA9}, {0xBE,0x5C}, {0xEC,0x4D},
+ {0xEC,0x4B}, {0xEE,0xF3}, {0xEC,0x49}, {0xEC,0x4A},
+ {0xC0,0x46}, {0xEC,0x46}, {0xEC,0x4E}, {0xEC,0x48},
+ {0xEC,0x4C}, {0xEE,0xEF}, {0xEE,0xF1}, {0xEE,0xF2},
+ {0xC1,0xF3}, {0xEE,0xEE}, {0xC1,0xF2}, {0xEE,0xF0},
+ {0xC1,0xEF}, {0xC1,0xF0}, {0xC1,0xF1}, {0xEC,0x47},
+ {0xC2,0xF5}, {0xF1,0x6E}, {0xF1,0x6C}, {0xF1,0x6D},
+ {0xC2,0xF3}, {0xC2,0xF6}, {0xC2,0xF4}, {0xF3,0x77},
+ {0xF3,0x78}, {0xC3,0xF6}, {0xF5,0x45}, {0xF5,0x47},
+ {0xF5,0x46}, {0xC4,0xC4}, {0xC5,0x50}, {0xF6,0x6D},
+ {0xF6,0x6C}, {0xF6,0x6B}, {0x8B,0xEC}, {0x9A,0x56},
+ {0xAA,0xFA}, {0x8B,0xFB}, {0xC9,0xAA}, {0xCA,0x58},
+ {0xA6,0xE9}, {0xCA,0x56}, {0xCA,0x59}, {0xCA,0x57},
+ {0xCB,0xAE}, {0xA8,0xC1}, {0xA8,0xC2}, {0xCB,0xB0},
+ {0xA8,0xBF}, {0xCB,0xAF}, {0xCB,0xAD}, {0xA8,0xC0},
+ {0xA8,0xBE}, {0x9A,0x57}, {0xA0,0xAA}, {0xCD,0xD8},
+ {0xCD,0xDB}, {0xAA,0xFD}, {0xCD,0xDA}, {0xCD,0xD9},
+ {0xAA,0xFC}, {0xAA,0xFB}, {0x9F,0xA6}, {0xAB,0x40},
+ {0xCD,0xDC}, {0xAA,0xFE}, {0x99,0xCC}, {0xD0,0xC6},
+ {0xAD,0xAE}, {0xAD,0xAF}, {0xAD,0xB0}, {0xD0,0xC7},
+ {0xD0,0xC3}, {0xAD,0xAD}, {0xD0,0xC4}, {0xD0,0xC5},
+ {0xD0,0xC2}, {0x9C,0x59}, {0xB0,0xA4}, {0xB0,0xA1},
+ {0xD4,0x45}, {0xB0,0xA2}, {0xB0,0xA5}, {0xD4,0x46},
+ {0xB0,0x7E}, {0xB0,0x7C}, {0xB0,0x7D}, {0xB0,0xA3},
+ {0x99,0xB5}, {0xB3,0xAD}, {0xD8,0x49}, {0xB3,0xB5},
+ {0xD8,0x48}, {0xD8,0x4B}, {0xB3,0xB1}, {0xD8,0x4A},
+ {0xB6,0xAB}, {0xB3,0xAF}, {0xB3,0xB2}, {0xB3,0xAE},
+ {0xB3,0xB3}, {0xB3,0xB4}, {0xB3,0xB0}, {0x90,0xBE},
+ {0xD8,0x47}, {0xB6,0xA7}, {0xDC,0x7D}, {0xDC,0xA3},
+ {0x9F,0xAF}, {0xDC,0xA2}, {0xB6,0xAC}, {0xB6,0xA8},
+ {0xB6,0xA9}, {0xDC,0x7C}, {0xDC,0x7E}, {0xDC,0xA1},
+ {0xB6,0xA4}, {0xB6,0xA6}, {0xB6,0xAA}, {0xB6,0xA5},
+ {0x95,0xF2}, {0xE0,0xD3}, {0xE0,0xD1}, {0xE0,0xD2},
+ {0xB9,0x6A}, {0xB9,0x6B}, {0x90,0xBF}, {0xE0,0xD4},
+ {0xB9,0x69}, {0xBB,0xD8}, {0xBB,0xDA}, {0xBB,0xD9},
+ {0xE4,0xBB}, {0xE4,0xBC}, {0xE8,0xAB}, {0x90,0xC1},
+ {0xE8,0xAA}, {0xFE,0xE4}, {0xC0,0x47}, {0xC0,0x48},
+ {0xEC,0x4F}, {0xC0,0x49}, {0xEE,0xF6}, {0xEE,0xF4},
+ {0xEE,0xF5}, {0xC1,0xF4}, {0xF1,0x6F}, {0xC3,0xF7},
+ {0x90,0xC4}, {0xC1,0xF5}, {0xAB,0x41}, {0xB0,0xA6},
+ {0xD4,0x47}, {0x90,0xC7}, {0xD8,0x4C}, {0xB3,0xB6},
+ {0xB6,0xAD}, {0xDC,0xA4}, {0xDC,0xA6}, {0xB6,0xAF},
+ {0xB6,0xAE}, {0xB6,0xB0}, {0xB6,0xB1}, {0xDC,0xA5},
+ {0xB9,0x6E}, {0xB9,0x6F}, {0xB9,0x6D}, {0xBB,0xDB},
+ {0xB9,0x6C}, {0xE0,0xD5}, {0xBB,0xDC}, {0xE8,0xAC},
+ {0xEC,0x50}, {0xC0,0x4A}, {0xC1,0xF6}, {0xF1,0x70},
+ {0xF1,0x74}, {0xC2,0xF9}, {0xF1,0x71}, {0xC2,0xFA},
+ {0xC2,0xF8}, {0xF1,0x75}, {0xC2,0xFB}, {0xF1,0x73},
+ {0xF3,0x79}, {0xC2,0xF7}, {0xC3,0xF8}, {0xF8,0xCD},
+ {0xAB,0x42}, {0xB3,0xB8}, {0xB3,0xB7}, {0xB6,0xB2},
+ {0xDC,0xA8}, {0xDC,0xA7}, {0xB6,0xB3}, {0x92,0xE4},
+ {0xE0,0xD9}, {0xB9,0x73}, {0xB9,0x70}, {0xE0,0xD8},
+ {0xB9,0x72}, {0xE0,0xD6}, {0xB9,0x71}, {0xE0,0xD7},
+ {0xE4,0xBD}, {0xBB,0xDD}, {0xE8,0xAF}, {0x9F,0x52},
+ {0xBE,0x5D}, {0xE8,0xAD}, {0xBE,0x5E}, {0xBE,0x5F},
+ {0xE8,0xAE}, {0xBE,0x60}, {0xEC,0x51}, {0xC0,0x4E},
+ {0xC0,0x4B}, {0xC0,0x50}, {0xEC,0x53}, {0xC0,0x4C},
+ {0xEC,0x52}, {0xC0,0x4F}, {0xC0,0x4D}, {0xEE,0xF9},
+ {0xEE,0xFB}, {0x90,0xDB}, {0xC1,0xF7}, {0xEE,0xFA},
+ {0xC1,0xF8}, {0xEE,0xF8}, {0xEE,0xF7}, {0xA0,0x66},
+ {0xF1,0x77}, {0xF1,0x76}, {0xC2,0xFC}, {0xF1,0x78},
+ {0xF3,0x7E}, {0xC3,0xFA}, {0xF3,0x7D}, {0xF3,0x7A},
+ {0xC3,0xF9}, {0xF3,0x7B}, {0xF3,0x7C}, {0xF5,0x48},
+ {0xF5,0x49}, {0xC4,0xC5}, {0x90,0xD2}, {0xC5,0x53},
+ {0xF6,0x6E}, {0x90,0xD4}, {0xC5,0x51}, {0xC5,0x52},
+ {0xF6,0x6F}, {0xC5,0xB4}, {0xC5,0xB5}, {0xF7,0x71},
+ {0x9A,0x5B}, {0x95,0xFD}, {0xC6,0x45}, {0xF8,0xCF},
+ {0xC6,0x47}, {0xF8,0xCE}, {0xF8,0xD0}, {0xC6,0x46},
+ {0xF9,0x57}, {0xF9,0xAD}, {0x8B,0xC4}, {0xAB,0x43},
+ {0x8C,0x66}, {0xB9,0x74}, {0x90,0xDE}, {0xE4,0xBE},
+ {0xE8,0xB0}, {0xC0,0x51}, {0xC0,0x52}, {0x9C,0xE4},
+ {0xAB,0x44}, {0x90,0xE1}, {0xBE,0x61}, {0xC3,0xFB},
+ {0xAD,0xB1}, {0xC0,0x53}, {0xC5,0xE2}, {0xAD,0xB2},
+ {0xD8,0x4D}, {0xDC,0xA9}, {0x9E,0x46}, {0xDC,0xAB},
+ {0xDC,0xAA}, {0x96,0x51}, {0xE0,0xDD}, {0xE0,0xDA},
+ {0xB9,0x75}, {0xB9,0x76}, {0xE0,0xDB}, {0xE0,0xDC},
+ {0xE4,0xC0}, {0xE4,0xC5}, {0xBB,0xDE}, {0xE4,0xBF},
+ {0xE4,0xC1}, {0xE4,0xC8}, {0xE4,0xC3}, {0xE4,0xC7},
+ {0xE4,0xC4}, {0xE4,0xC2}, {0xE4,0xC6}, {0xBB,0xDF},
+ {0xFB,0x58}, {0xE8,0xB3}, {0x90,0xE6}, {0xE8,0xB1},
+ {0xBE,0x63}, {0xBE,0x62}, {0xE8,0xB2}, {0xBE,0x64},
+ {0xEC,0x56}, {0xEC,0x55}, {0xC0,0x54}, {0xEC,0x54},
+ {0xEE,0xFC}, {0x96,0x50}, {0xEE,0xFE}, {0xEF,0x41},
+ {0xEF,0x40}, {0x90,0xE7}, {0xC1,0xF9}, {0xEE,0xFD},
+ {0xF1,0xA1}, {0xC2,0xFD}, {0xF1,0x7D}, {0xF1,0xA2},
+ {0xC2,0xFE}, {0xF1,0x7B}, {0xF1,0x7E}, {0xF1,0x7C},
+ {0xF1,0x79}, {0xC3,0x40}, {0xF1,0x7A}, {0x90,0xE8},
+ {0x9A,0x5D}, {0xF3,0xA1}, {0x9F,0x7A}, {0xF3,0xA3},
+ {0xF3,0xA2}, {0x9B,0x5C}, {0xF5,0x4A}, {0x9F,0x7C},
+ {0xF5,0x4B}, {0xFC,0x52}, {0x90,0xE9}, {0xF6,0x70},
+ {0x90,0xEA}, {0xC5,0xB7}, {0x9A,0x5E}, {0xC5,0xB6},
+ {0xF8,0x4F}, {0xF8,0x50}, {0xC6,0x48}, {0xF8,0xD1},
+ {0x9F,0x76}, {0xC6,0x69}, {0xAD,0xB3}, {0xB6,0xB4},
+ {0xE4,0xCA}, {0xE4,0xC9}, {0xE8,0xB5}, {0xE8,0xB4},
+ {0x90,0xEB}, {0xC1,0xFA}, {0xEF,0x43}, {0xEF,0x42},
+ {0xF1,0xA5}, {0xF1,0xA3}, {0xF1,0xA6}, {0xF1,0xA4},
+ {0xC3,0xFC}, {0xF3,0xA4}, {0xF3,0xA5}, {0xF3,0xA6},
+ {0x90,0xEC}, {0xF6,0x71}, {0xF7,0x72}, {0xF8,0xD2},
+ {0x8B,0xEE}, {0xAD,0xB4}, {0x90,0xEE}, {0xEC,0x57},
+ {0xEF,0x44}, {0x91,0xC6}, {0xAD,0xB5}, {0x90,0xF2},
+ {0xBB,0xE0}, {0xEC,0x58}, {0xC3,0x41}, {0xF1,0xA7},
+ {0xC3,0xFD}, {0xF5,0x4C}, {0xF5,0x4D}, {0xC5,0x54},
+ {0xF8,0x51}, {0xAD,0xB6}, {0xB3,0xBB}, {0xB3,0xBC},
+ {0xD8,0x4E}, {0xB6,0xB5}, {0xB6,0xB6}, {0xDC,0xAC},
+ {0xB6,0xB7}, {0xB9,0x7A}, {0xB9,0x7C}, {0xE0,0xDF},
+ {0xE0,0xE0}, {0xE0,0xDE}, {0xB9,0x77}, {0xB9,0x78},
+ {0xB9,0x7B}, {0xB9,0x79}, {0xFC,0xBC}, {0x8A,0x74},
+ {0xE4,0xCB}, {0xBB,0xE1}, {0xBB,0xE2}, {0xE8,0xBC},
+ {0xBE,0x67}, {0xE8,0xB7}, {0xE8,0xB6}, {0x96,0x57},
+ {0xE8,0xBB}, {0xBE,0x65}, {0x9C,0xEF}, {0xC0,0x5B},
+ {0xE8,0xB8}, {0xE8,0xBD}, {0xE8,0xBA}, {0xE8,0xB9},
+ {0xBE,0x66}, {0xC0,0x59}, {0x9F,0xDF}, {0xEC,0x5A},
+ {0xC0,0x55}, {0xEC,0x5B}, {0x90,0xF7}, {0x90,0xF6},
+ {0xEC,0x59}, {0xC0,0x58}, {0xC0,0x56}, {0xC0,0x5A},
+ {0xC0,0x57}, {0xEF,0x45}, {0xEF,0x4A}, {0xEF,0x46},
+ {0xEF,0x49}, {0xC1,0xFB}, {0x9B,0x5E}, {0xED,0xD4},
+ {0xEF,0x48}, {0xEF,0x47}, {0x90,0xF8}, {0xC3,0x44},
+ {0xC3,0x42}, {0xC3,0x45}, {0xC3,0x43}, {0xF1,0xA8},
+ {0xF1,0xA9}, {0xF1,0xAA}, {0xC3,0x46}, {0xF3,0xAA},
+ {0xC4,0x40}, {0xF3,0xA8}, {0xC4,0x41}, {0xF3,0xA7},
+ {0xF3,0xA9}, {0xC3,0xFE}, {0xF5,0x51}, {0xF5,0x4E},
+ {0xF5,0x4F}, {0xF5,0x50}, {0xF6,0x72}, {0xC5,0x56},
+ {0x90,0xF9}, {0xC5,0x55}, {0x8C,0xC9}, {0xF7,0x74},
+ {0xF7,0x73}, {0xC5,0xB8}, {0xFA,0x6A}, {0xC5,0xE3},
+ {0xC6,0x49}, {0xC6,0x60}, {0xF9,0x58}, {0xF9,0xAE},
+ {0xF9,0xAF}, {0x8B,0xEF}, {0xAD,0xB7}, {0xDC,0xAD},
+ {0xE0,0xE1}, {0xE4,0xCC}, {0xE4,0xCD}, {0xBB,0xE3},
+ {0xBB,0xE4}, {0xE8,0xBE}, {0xBE,0x68}, {0x9F,0xE0},
+ {0xC1,0xFC}, {0x91,0x42}, {0xF1,0xAB}, {0x9A,0x62},
+ {0xC3,0x47}, {0xF3,0xAD}, {0xC4,0x42}, {0xF3,0xAC},
+ {0xF3,0xAE}, {0xF3,0xAB}, {0xF6,0x75}, {0xF5,0x52},
+ {0xF5,0x53}, {0x95,0x69}, {0xC4,0xC6}, {0xF6,0x74},
+ {0x91,0x44}, {0x91,0x43}, {0xF6,0x73}, {0x91,0x41},
+ {0xF7,0x75}, {0xF9,0xB0}, {0x8B,0xF0}, {0xAD,0xB8},
+ {0x96,0x60}, {0x8B,0xF1}, {0xAD,0xB9}, {0x99,0xF6},
+ {0x91,0x49}, {0xB0,0xA7}, {0xD4,0x48}, {0xD8,0x4F},
+ {0x91,0x4A}, {0xB6,0xB8}, {0xB6,0xBB}, {0xB6,0xB9},
+ {0xDC,0xAE}, {0x91,0x4B}, {0xB6,0xBD}, {0xB6,0xBA},
+ {0x9A,0x64}, {0xB6,0xBC}, {0xB9,0x7E}, {0x8A,0xBF},
+ {0xE0,0xE2}, {0xE0,0xE3}, {0xE8,0xC0}, {0xB9,0x7D},
+ {0xB9,0xA1}, {0xB9,0xA2}, {0xE4,0xCF}, {0xE4,0xCE},
+ {0xBB,0xE5}, {0xBB,0xE6}, {0xE4,0xD0}, {0xE8,0xBF},
+ {0xBB,0xE8}, {0xBE,0x69}, {0xBB,0xE7}, {0x9A,0x66},
+ {0xC0,0x5C}, {0xE8,0xC1}, {0xBE,0x6B}, {0xBE,0x6A},
+ {0xE8,0xC2}, {0xE8,0xC5}, {0xE8,0xC3}, {0xE8,0xC4},
+ {0xBE,0x6C}, {0x9A,0x67}, {0xC0,0x61}, {0xC0,0x5F},
+ {0x9A,0x69}, {0xC0,0x5E}, {0xEC,0x5D}, {0xC0,0x60},
+ {0xEC,0x5C}, {0xEF,0x4B}, {0xEC,0x5E}, {0xC0,0x5D},
+ {0xEC,0x5F}, {0xEF,0x4E}, {0xEF,0x4C}, {0xEF,0x4D},
+ {0xEF,0x52}, {0xC3,0x4B}, {0xEF,0x51}, {0xEF,0x54},
+ {0xEF,0x53}, {0xEF,0x50}, {0xEF,0x4F}, {0xC1,0xFD},
+ {0x9A,0x6A}, {0x96,0x52}, {0x91,0x4D}, {0xF1,0xAE},
+ {0x96,0x66}, {0xF1,0xAD}, {0xC3,0x4A}, {0xC3,0x48},
+ {0xC3,0x49}, {0x9F,0x7B}, {0xF1,0xAC}, {0x9A,0x6B},
+ {0xF3,0xB1}, {0xC4,0x43}, {0xF3,0xB0}, {0xF3,0xAF},
+ {0xC4,0x44}, {0xA0,0x6C}, {0xF5,0x58}, {0xF5,0x57},
+ {0x96,0x67}, {0xF5,0x55}, {0xF5,0x54}, {0xC4,0xC8},
+ {0xC4,0xC7}, {0xF5,0x59}, {0xF7,0x76}, {0xC5,0xB9},
+ {0xF6,0x77}, {0xC5,0x57}, {0xF6,0x76}, {0xF5,0x56},
+ {0xF7,0x77}, {0xC5,0xE4}, {0x9A,0x6C}, {0xC6,0x61},
+ {0xF9,0x59}, {0xF9,0xB1}, {0x9A,0x6D}, {0x8B,0xF2},
+ {0xAD,0xBA}, {0xD8,0x50}, {0xEF,0x55}, {0xAD,0xBB},
+ {0x96,0x6A}, {0xE4,0xD2}, {0xE4,0xD1}, {0xEC,0x60},
+ {0xEF,0x57}, {0xEF,0x56}, {0xFC,0xEA}, {0xC3,0x4C},
+ {0xF3,0xB2}, {0xF3,0xB3}, {0xC4,0xC9}, {0x96,0x6C},
+ {0xF9,0xB2}, {0xB0,0xA8}, {0xB6,0xBF}, {0xB6,0xBE},
+ {0xE0,0xE4}, {0xE0,0xE6}, {0xB9,0xA4}, {0xE0,0xE5},
+ {0xB9,0xA3}, {0xB9,0xA5}, {0xE0,0xE7}, {0x91,0xC4},
+ {0xE4,0xD4}, {0xE4,0xD6}, {0xE4,0xD5}, {0x96,0x77},
+ {0xE4,0xD8}, {0xBB,0xE9}, {0xE4,0xD7}, {0xE4,0xD3},
+ {0x99,0xF4}, {0x9A,0x6F}, {0xE4,0xD9}, {0xE8,0xCC},
+ {0xE8,0xCF}, {0xE8,0xD1}, {0xE8,0xC7}, {0xE8,0xCB},
+ {0xE8,0xC8}, {0xBE,0x6E}, {0xBE,0x71}, {0xBE,0x73},
+ {0xE8,0xC9}, {0xE8,0xCA}, {0xBE,0x72}, {0xE8,0xCD},
+ {0xE8,0xD0}, {0xE8,0xCE}, {0xBE,0x74}, {0x9F,0xAB},
+ {0xBE,0x70}, {0xE8,0xC6}, {0xBE,0x6D}, {0xBE,0x6F},
+ {0x8C,0xBE}, {0x8E,0xC1}, {0xC0,0x63}, {0xEC,0x66},
+ {0xEC,0x64}, {0xEC,0x63}, {0x95,0x55}, {0xEC,0x69},
+ {0xEC,0x68}, {0xEC,0x67}, {0xEC,0x62}, {0xC0,0x62},
+ {0xEC,0x61}, {0xEC,0x65}, {0xC0,0x64}, {0xEF,0x5A},
+ {0x91,0x52}, {0xEF,0x5E}, {0xEF,0x5B}, {0xEF,0x5D},
+ {0xEF,0x5C}, {0xEF,0x59}, {0xEF,0x5F}, {0xEF,0x62},
+ {0xEF,0x60}, {0xEF,0x61}, {0xC2,0x40}, {0xC1,0xFE},
+ {0xEF,0x58}, {0xEF,0x63}, {0xF1,0xB3}, {0xF1,0xB6},
+ {0xF1,0xB8}, {0xF1,0xB7}, {0xF1,0xB1}, {0xF1,0xB5},
+ {0xF1,0xB0}, {0x91,0x53}, {0xF1,0xB2}, {0xC3,0x4D},
+ {0xF1,0xAF}, {0x91,0x55}, {0xF1,0xB4}, {0xF3,0xC0},
+ {0xF3,0xB5}, {0xC4,0x45}, {0xC4,0x46}, {0xF3,0xB4},
+ {0xF3,0xB9}, {0xF3,0xBF}, {0xF3,0xB7}, {0xF3,0xBE},
+ {0x95,0x5D}, {0xF3,0xBB}, {0x96,0x71}, {0xF3,0xBA},
+ {0xF3,0xBD}, {0xF3,0xB8}, {0xF3,0xB6}, {0x9C,0x6D},
+ {0xF3,0xBC}, {0xF5,0x60}, {0xF5,0x5E}, {0xC4,0xCA},
+ {0xF5,0x5D}, {0xF5,0x63}, {0xF5,0x61}, {0x96,0x73},
+ {0xC4,0xCB}, {0xF5,0x5C}, {0xF5,0x5A}, {0xF5,0x5B},
+ {0xC4,0xCD}, {0xF5,0x5F}, {0xC4,0xCC}, {0xF5,0x62},
+ {0xF6,0x78}, {0xF6,0x7E}, {0x91,0x54}, {0x9A,0x71},
+ {0xF6,0x79}, {0xC5,0x5B}, {0xF6,0xA1}, {0xC5,0x5A},
+ {0xF6,0x7D}, {0xF6,0x7C}, {0xC5,0x59}, {0xF6,0x7B},
+ {0xC5,0x58}, {0xF6,0x7A}, {0xF7,0x7D}, {0xF7,0xA1},
+ {0xF7,0x7E}, {0xF7,0x7B}, {0xC5,0xBB}, {0xF7,0x78},
+ {0xF7,0x7C}, {0xF7,0xA3}, {0xF7,0xA2}, {0xF7,0x79},
+ {0xF7,0x7A}, {0xC5,0xBA}, {0xF8,0x52}, {0xC5,0xE7},
+ {0x91,0x56}, {0xF8,0x53}, {0xC5,0xE5}, {0xC5,0xE6},
+ {0x96,0x6D}, {0xF8,0xD3}, {0xC6,0x4A}, {0xF9,0x76},
+ {0xC6,0x6A}, {0x95,0x57}, {0xF9,0xB3}, {0xC6,0x6B},
+ {0xF9,0xB4}, {0xF9,0xB5}, {0xF9,0xC3}, {0xF9,0xC2},
+ {0xC6,0x7A}, {0xF9,0xCD}, {0x89,0xC6}, {0x89,0xC7},
+ {0xB0,0xA9}, {0xE0,0xE9}, {0xE0,0xE8}, {0xBB,0xEA},
+ {0xBB,0xEB}, {0xE4,0xDA}, {0x8A,0x6A}, {0xE8,0xD2},
+ {0xEC,0x6C}, {0x8B,0x57}, {0xBE,0x75}, {0xC0,0x65},
+ {0xEC,0x6A}, {0x9F,0xE1}, {0xEC,0x6D}, {0xC0,0x66},
+ {0x9B,0x5F}, {0xEF,0x64}, {0xEC,0x6B}, {0xF1,0xB9},
+ {0xC3,0x4E}, {0xF3,0xC1}, {0xF5,0x66}, {0xF5,0x64},
+ {0xF5,0x65}, {0xF6,0xA2}, {0xC5,0x5C}, {0xF7,0xA4},
+ {0xC5,0xEA}, {0xC5,0xBC}, {0xC5,0xE8}, {0xC5,0xE9},
+ {0xF8,0xD4}, {0xC6,0x62}, {0xA0,0x5D}, {0xB0,0xAA},
+ {0xF1,0xBA}, {0xD4,0x49}, {0x91,0x5B}, {0xB9,0xA6},
+ {0x91,0x5C}, {0xE4,0xDB}, {0xBB,0xEC}, {0xE4,0xDC},
+ {0xE8,0xD4}, {0xE8,0xD3}, {0xC0,0x68}, {0xBE,0x76},
+ {0xBE,0x77}, {0xE8,0xD7}, {0xE8,0xD6}, {0xE8,0xD5},
+ {0x91,0x5E}, {0xEC,0x6E}, {0xEC,0x71}, {0xEC,0x70},
+ {0xEC,0x6F}, {0xC0,0x67}, {0xEF,0x68}, {0xEF,0x66},
+ {0xEF,0x65}, {0x9F,0x5C}, {0xEF,0x67}, {0x9F,0x57},
+ {0xC3,0x4F}, {0xF1,0xBC}, {0xF1,0xBD}, {0xC3,0x50},
+ {0xF1,0xBB}, {0x9F,0x65}, {0xF3,0xC3}, {0xF3,0xC2},
+ {0xF3,0xC5}, {0xC4,0x47}, {0xF3,0xC4}, {0x9A,0x72},
+ {0xF5,0x67}, {0xF5,0x69}, {0xF5,0x68}, {0x91,0x60},
+ {0xF6,0xA3}, {0xF6,0xA6}, {0xF6,0xA4}, {0xF6,0xA5},
+ {0xF7,0xA5}, {0xC5,0xBD}, {0xF8,0x54}, {0xF8,0x55},
+ {0xF8,0x56}, {0xC6,0x4B}, {0xC6,0x63}, {0xF9,0xB6},
+ {0xB0,0xAB}, {0xBE,0x78}, {0xC0,0x69}, {0xF1,0xBE},
+ {0x9F,0x5E}, {0xF7,0xA6}, {0x91,0x61}, {0xF9,0xC4},
+ {0xD4,0x4A}, {0xC6,0x7B}, {0xB0,0xAC}, {0xEC,0x72},
+ {0x91,0x64}, {0xF1,0xBF}, {0xF3,0xC6}, {0x9F,0x41},
+ {0xF6,0xA7}, {0xF7,0xA7}, {0xB0,0xAD}, {0xE4,0xDD},
+ {0xE4,0xDE}, {0x91,0x69}, {0xBB,0xED}, {0xBB,0xEE},
+ {0xE8,0xD9}, {0xBE,0x7A}, {0xBE,0x79}, {0xE8,0xD8},
+ {0xEF,0x69}, {0xF1,0xC0}, {0xF1,0xC2}, {0xF1,0xC1},
+ {0xC3,0x53}, {0xC3,0x52}, {0xC3,0x51}, {0x91,0x68},
+ {0xC5,0x5E}, {0xF6,0xA8}, {0xC5,0x5D}, {0xF7,0xA9},
+ {0xF7,0xA8}, {0xC6,0x4C}, {0xF8,0xD5}, {0xB3,0xBD},
+ {0xE0,0xEA}, {0xE4,0xE1}, {0xE4,0xDF}, {0xE4,0xE0},
+ {0xE8,0xE2}, {0xE8,0xDD}, {0xE8,0xDA}, {0xE8,0xE1},
+ {0x9A,0x74}, {0xE8,0xE3}, {0xBE,0x7C}, {0xE8,0xE0},
+ {0xE8,0xDC}, {0xE8,0xDB}, {0xE8,0xDF}, {0xE8,0xDE},
+ {0xBE,0x7B}, {0xEC,0x7D}, {0xEC,0x78}, {0xEC,0x76},
+ {0xEC,0xA1}, {0xEC,0x77}, {0x96,0xB2}, {0xEC,0x73},
+ {0x9A,0x75}, {0xEC,0x79}, {0xFD,0xA5}, {0xEC,0x74},
+ {0xEF,0x72}, {0xEC,0x75}, {0xEC,0xA2}, {0x9E,0xE9},
+ {0x8B,0xBA}, {0x91,0x6D}, {0xA0,0x60}, {0xEC,0x7C},
+ {0xC0,0x6A}, {0xEC,0x7B}, {0xEC,0x7A}, {0xEC,0x7E},
+ {0x9F,0xDE}, {0xEF,0x6A}, {0xEF,0x6D}, {0x9F,0xC3},
+ {0xEF,0x6C}, {0x96,0xB5}, {0xEF,0x74}, {0xEF,0x6F},
+ {0xEF,0x73}, {0xEF,0x71}, {0xEF,0x70}, {0xEF,0x6E},
+ {0xEF,0x6B}, {0xC2,0x43}, {0xC2,0x42}, {0xC2,0x44},
+ {0xC2,0x41}, {0xEF,0x75}, {0xA0,0x67}, {0xF1,0xC8},
+ {0xF1,0xCB}, {0xF1,0xC9}, {0xF1,0xCD}, {0xF1,0xCE},
+ {0xF1,0xC6}, {0xC3,0x58}, {0xF1,0xC7}, {0xF1,0xC5},
+ {0xF1,0xCC}, {0xF1,0xC4}, {0xF1,0xC3}, {0xC3,0x57},
+ {0xC3,0x55}, {0xC3,0x54}, {0x96,0xB3}, {0xF1,0xCA},
+ {0xF3,0xCF}, {0xF3,0xD5}, {0xC4,0x4A}, {0xF3,0xD0},
+ {0xF3,0xD3}, {0xF3,0xD7}, {0xC4,0x4B}, {0xF3,0xD2},
+ {0x9A,0x76}, {0xF3,0xCA}, {0xF3,0xC9}, {0xF3,0xD6},
+ {0xF3,0xCD}, {0xF3,0xCB}, {0xF3,0xD4}, {0xF3,0xCC},
+ {0xC4,0x49}, {0xC4,0x48}, {0x95,0xD5}, {0xF3,0xC7},
+ {0xF3,0xC8}, {0xF3,0xD1}, {0x9E,0xCA}, {0xF3,0xCE},
+ {0x9A,0x77}, {0x9A,0x78}, {0xF5,0x6C}, {0xF5,0x6F},
+ {0xC3,0x56}, {0x91,0x70}, {0x91,0x6F}, {0xF5,0x6D},
+ {0xF5,0x73}, {0xF5,0x71}, {0xF5,0x6B}, {0xF5,0x76},
+ {0x9F,0xA3}, {0xF5,0x6A}, {0x91,0x71}, {0xC4,0xCF},
+ {0xF5,0x72}, {0x96,0xB1}, {0xF5,0x6E}, {0xC4,0xCE},
+ {0xF5,0x75}, {0x9F,0x63}, {0xF5,0x74}, {0x9F,0x67},
+ {0xF6,0xAB}, {0xF6,0xAA}, {0x8B,0xB9}, {0x9A,0x7A},
+ {0xF6,0xB1}, {0xF6,0xAD}, {0xF6,0xB0}, {0xC5,0x60},
+ {0x8B,0x56}, {0xF6,0xAE}, {0xF6,0xAF}, {0xF6,0xA9},
+ {0xF6,0xAC}, {0xC5,0x5F}, {0x9A,0xDA}, {0xC5,0xBF},
+ {0xF7,0xB4}, {0xF7,0xAF}, {0xF7,0xB3}, {0x96,0xB0},
+ {0xF7,0xB6}, {0xF7,0xB2}, {0xF7,0xAE}, {0x9A,0x7E},
+ {0xC5,0xC1}, {0xF7,0xB1}, {0xF7,0xB5}, {0xC5,0xC0},
+ {0xF7,0xAC}, {0xF5,0x70}, {0xF7,0xB0}, {0xF7,0xAD},
+ {0x9D,0xDE}, {0xF7,0xAA}, {0xF7,0xAB}, {0xC5,0xBE},
+ {0xF8,0x5A}, {0xF8,0x5C}, {0xF8,0x5F}, {0xF8,0x5B},
+ {0xF8,0x60}, {0x96,0xAD}, {0xF8,0x59}, {0xF8,0x57},
+ {0x96,0xAE}, {0xC5,0xEB}, {0xF8,0x5D}, {0xC5,0xED},
+ {0xC5,0xEC}, {0xF8,0x58}, {0xF8,0x5E}, {0x9E,0xA1},
+ {0xF8,0xDA}, {0xC6,0x4D}, {0xF8,0xDB}, {0xF8,0xD9},
+ {0xF8,0xD6}, {0xF8,0xD8}, {0xF8,0xD7}, {0xF9,0x5A},
+ {0xF9,0x5C}, {0xF9,0x5B}, {0xF9,0x79}, {0x9E,0x50},
+ {0xF9,0x78}, {0xF9,0x77}, {0xF9,0x7A}, {0xC6,0x73},
+ {0xC6,0x74}, {0xF9,0xCA}, {0xF9,0xCE}, {0x96,0xAF},
+ {0x8B,0xF4}, {0xB3,0xBE}, {0xDC,0xAF}, {0xE0,0xED},
+ {0xB9,0xA7}, {0xE0,0xEB}, {0xE0,0xEC}, {0xE4,0xE2},
+ {0xE4,0xE3}, {0xBB,0xF1}, {0xBB,0xEF}, {0xE4,0xE4},
+ {0xBB,0xF0}, {0xE8,0xE8}, {0xE8,0xEB}, {0xE8,0xE5},
+ {0xE8,0xEC}, {0xE8,0xE4}, {0xE8,0xE6}, {0xE8,0xE7},
+ {0xE8,0xEA}, {0x9F,0xA4}, {0xBE,0xA1}, {0xE8,0xEF},
+ {0xE8,0xEE}, {0xBE,0x7D}, {0xE8,0xE9}, {0xE8,0xED},
+ {0xBE,0x7E}, {0x96,0xBD}, {0xEC,0xAC}, {0xC0,0x6F},
+ {0xEC,0xA7}, {0xC0,0x6B}, {0x96,0xF4}, {0xEC,0xA4},
+ {0xEC,0xAA}, {0xEC,0xAD}, {0xC0,0x70}, {0xEC,0xA9},
+ {0xEC,0xA6}, {0xEC,0xAE}, {0xEC,0xA5}, {0x96,0xB8},
+ {0xEC,0xAB}, {0xC0,0x6C}, {0xEC,0xA3}, {0xC0,0x6D},
+ {0xC0,0x6E}, {0xEC,0xA8}, {0xEF,0xA9}, {0xEF,0x7A},
+ {0xEF,0x7B}, {0xEF,0x7E}, {0xEF,0x7C}, {0xEF,0x76},
+ {0xFA,0xA1}, {0xEF,0x79}, {0xEF,0xA5}, {0xEF,0x7D},
+ {0x91,0xA7}, {0xC2,0x45}, {0xEF,0xA7}, {0xEF,0xA4},
+ {0xC2,0x46}, {0xEF,0xA6}, {0xEF,0x77}, {0xEF,0xA2},
+ {0xEF,0xA3}, {0xA0,0x5E}, {0xEF,0xA1}, {0x9A,0x7D},
+ {0xF1,0xD2}, {0xF1,0xD4}, {0xF1,0xD7}, {0x89,0x48},
+ {0xF1,0xD1}, {0x9E,0xB1}, {0xC3,0x59}, {0xF1,0xD9},
+ {0xF1,0xD0}, {0xF1,0xDA}, {0xF1,0xD6}, {0xF1,0xD8},
+ {0xF1,0xDC}, {0xF1,0xD5}, {0xF1,0xDD}, {0xF1,0xD3},
+ {0xF1,0xCF}, {0xC3,0x5A}, {0x9D,0xDB}, {0xF1,0xDB},
+ {0xC3,0x5B}, {0xC4,0x4D}, {0xEF,0x78}, {0xF3,0xF1},
+ {0xF3,0xE8}, {0xC4,0x4F}, {0xF3,0xE4}, {0xC4,0x50},
+ {0x95,0xBF}, {0x8A,0x73}, {0xF3,0xED}, {0xF3,0xE7},
+ {0xF3,0xDD}, {0xC4,0x4E}, {0xF3,0xEA}, {0xF3,0xE5},
+ {0xF3,0xE6}, {0xF3,0xD8}, {0xF3,0xDF}, {0xF3,0xEE},
+ {0xF3,0xEB}, {0x9E,0xFE}, {0xF3,0xE3}, {0x91,0x7A},
+ {0xF3,0xEF}, {0xF3,0xDE}, {0xF3,0xD9}, {0xF3,0xEC},
+ {0x91,0x7B}, {0xF3,0xDB}, {0xF3,0xE9}, {0xF3,0xE0},
+ {0xF3,0xF0}, {0xF3,0xDC}, {0xC4,0x4C}, {0xF3,0xDA},
+ {0xF3,0xE1}, {0xF3,0xE2}, {0xF5,0x7D}, {0xF5,0x7B},
+ {0x9A,0xA3}, {0xF5,0xA2}, {0xF5,0xAE}, {0xF5,0xA5},
+ {0xF5,0x7C}, {0xF5,0x78}, {0xF5,0xA7}, {0xF5,0x7E},
+ {0xF5,0xA3}, {0xF5,0x7A}, {0xF5,0xAA}, {0xF5,0x77},
+ {0xF5,0xA1}, {0xF5,0xA6}, {0xF5,0xA8}, {0xF5,0xAB},
+ {0xF5,0x79}, {0x96,0xC2}, {0xF5,0xAF}, {0xF5,0xB0},
+ {0xF5,0xA9}, {0xF5,0xAD}, {0xF5,0xA4}, {0x9F,0x77},
+ {0xF6,0xC1}, {0xF6,0xC4}, {0xC5,0x61}, {0xF6,0xC3},
+ {0xF6,0xC8}, {0xF6,0xC6}, {0xC5,0x62}, {0xF6,0xBD},
+ {0xF6,0xB3}, {0xF6,0xB2}, {0xC5,0x64}, {0xF6,0xBF},
+ {0xF6,0xC0}, {0xF6,0xBC}, {0xF6,0xB4}, {0x9A,0xA4},
+ {0xF6,0xB9}, {0xF5,0xAC}, {0x9A,0xA5}, {0xF6,0xB5},
+ {0xC5,0x63}, {0xF6,0xBB}, {0x91,0xA1}, {0xF6,0xBA},
+ {0xF6,0xB6}, {0xF6,0xC2}, {0x89,0xB8}, {0xF6,0xB7},
+ {0xF7,0xBB}, {0xF6,0xC5}, {0xF6,0xC7}, {0xF6,0xBE},
+ {0xF6,0xB8}, {0xF7,0xBC}, {0xF7,0xBE}, {0xF7,0xB8},
+ {0xC5,0xC2}, {0x91,0x73}, {0xF7,0xC5}, {0xF7,0xC3},
+ {0xC5,0xC3}, {0xF7,0xC2}, {0xF7,0xC1}, {0xF7,0xBA},
+ {0xF7,0xB7}, {0xF7,0xBD}, {0xF7,0xC6}, {0xF7,0xB9},
+ {0xF7,0xBF}, {0xF8,0x69}, {0xF8,0x6E}, {0xF8,0x64},
+ {0xF8,0x67}, {0xC5,0xEE}, {0xF8,0x6B}, {0xF8,0x72},
+ {0xF7,0xC0}, {0xF8,0x65}, {0xF8,0x6F}, {0xF8,0x73},
+ {0xF8,0x6A}, {0xF8,0x63}, {0xF8,0x6D}, {0xF8,0x6C},
+ {0xF8,0x71}, {0xF8,0x70}, {0xF7,0xC4}, {0xF8,0x68},
+ {0xF8,0x62}, {0xF8,0x66}, {0xC6,0x4E}, {0xC6,0x4F},
+ {0xF8,0x61}, {0x9A,0xA6}, {0xF8,0xE6}, {0xF8,0xDD},
+ {0xF8,0xE5}, {0xF8,0xE2}, {0xF8,0xE3}, {0xF8,0xDC},
+ {0xF8,0xDF}, {0xF8,0xE7}, {0xF8,0xE1}, {0xF8,0xE0},
+ {0xF8,0xDE}, {0xF8,0xE4}, {0x89,0xBD}, {0xF9,0x5D},
+ {0x89,0xB9}, {0xF9,0x5E}, {0x91,0x7D}, {0xF9,0x60},
+ {0xF9,0x5F}, {0xF9,0x62}, {0xF9,0x61}, {0xF9,0x7C},
+ {0xF9,0x7B}, {0xF9,0xB7}, {0xF9,0xB8}, {0x96,0xBB},
+ {0xF9,0xC5}, {0xC6,0x78}, {0xC6,0x7C}, {0x9F,0xF2},
+ {0xF9,0xCF}, {0xC6,0x7D}, {0x8B,0xF5}, {0xB3,0xBF},
+ {0xC4,0xD0}, {0xF6,0xC9}, {0x9A,0xA9}, {0xC6,0x50},
+ {0xC6,0x51}, {0xB3,0xC0}, {0xE0,0xEE}, {0x9F,0x54},
+ {0xB9,0xA8}, {0xE8,0xF0}, {0x9F,0xE3}, {0x9E,0xED},
+ {0xEC,0xB0}, {0xEC,0xB1}, {0xEC,0xAF}, {0xEF,0xAB},
+ {0xEF,0xAA}, {0xC2,0x47}, {0xF1,0xDF}, {0xEF,0xAC},
+ {0xF1,0xDE}, {0x91,0xAA}, {0xF3,0xF3}, {0xC4,0x51},
+ {0xC4,0x53}, {0xF3,0xF2}, {0x91,0xAB}, {0xA0,0x70},
+ {0xC4,0x52}, {0x9F,0x6D}, {0xF5,0xB1}, {0xF5,0xB3},
+ {0xF5,0xB2}, {0xF6,0xCA}, {0xC5,0x65}, {0x91,0xAC},
+ {0xC5,0xEF}, {0xF8,0xE8}, {0xF9,0x63}, {0x91,0xAD},
+ {0xF9,0xD2}, {0xB3,0xC1}, {0xA0,0xFD}, {0xE4,0xE5},
+ {0x9F,0xE2}, {0xBE,0xA2}, {0x91,0xAF}, {0x9E,0x41},
+ {0x9A,0xAA}, {0xEC,0xB3}, {0xEC,0xB2}, {0x91,0xB0},
+ {0xEF,0xAD}, {0x9A,0xAB}, {0xC4,0x54}, {0xC4,0xD1},
+ {0xF7,0xC7}, {0xF9,0xCB}, {0xB3,0xC2}, {0xBB,0xF2},
+ {0x9A,0xAC}, {0xBE,0xA3}, {0x9A,0x4A}, {0xF3,0xF4},
+ {0x91,0xB2}, {0xF8,0x74}, {0xB6,0xC0}, {0x8B,0xF6},
+ {0x9A,0xAD}, {0x89,0xB6}, {0xEF,0xAE}, {0xC6,0x64},
+ {0xB6,0xC1}, {0xBE,0xA4}, {0xC2,0x48}, {0xF8,0x75},
+ {0xB6,0xC2}, {0xE8,0xF1}, {0xC0,0x72}, {0xEC,0xB4},
+ {0xEC,0xB5}, {0xC0,0x71}, {0xEF,0xAF}, {0xC2,0x4C},
+ {0xC2,0x4A}, {0xC2,0x4B}, {0xC2,0x49}, {0xF1,0xE0},
+ {0xC3,0x5C}, {0x9A,0xAF}, {0xF5,0xB5}, {0xF5,0xB4},
+ {0xF5,0xB7}, {0xF5,0xB6}, {0xC4,0xD2}, {0xF6,0xCB},
+ {0xF6,0xCD}, {0xF6,0xCC}, {0xC5,0x66}, {0xF7,0xC8},
+ {0x9A,0xB0}, {0xF8,0x76}, {0xF8,0x77}, {0xC5,0xF0},
+ {0xF9,0x64}, {0xF9,0x7D}, {0xC6,0x75}, {0x9A,0xB1},
+ {0xDC,0xB0}, {0xEC,0xB6}, {0xEF,0xB0}, {0xF3,0xF5},
+ {0xE0,0xEF}, {0x9A,0xA1}, {0xEF,0xB1}, {0xF1,0xE2},
+ {0xF1,0xE1}, {0x91,0xB9}, {0xF8,0x78}, {0xC6,0x52},
+ {0x91,0xBA}, {0xF9,0x65}, {0xF9,0x7E}, {0xB9,0xA9},
+ {0xE8,0xF2}, {0xE8,0xF3}, {0xEC,0xB7}, {0xB9,0xAA},
+ {0xC3,0x5D}, {0xF1,0xE3}, {0x91,0xBE}, {0xF6,0xCF},
+ {0xC5,0x67}, {0xF6,0xD0}, {0xF6,0xCE}, {0xF8,0x79},
+ {0xF8,0xE9}, {0xB9,0xAB}, {0xEF,0xB4}, {0xEF,0xB3},
+ {0xEF,0xB2}, {0xF1,0xE4}, {0xA0,0x41}, {0x8B,0xB7},
+ {0xF1,0xE8}, {0xF1,0xE7}, {0xF1,0xE6}, {0xF1,0xE5},
+ {0xC3,0x5E}, {0xF3,0xF6}, {0xF5,0xB9}, {0xC4,0xD3},
+ {0xF5,0xB8}, {0xF6,0xD1}, {0xF7,0xCB}, {0xF7,0xCA},
+ {0xC5,0xC4}, {0xF7,0xC9}, {0xF8,0x7C}, {0xF8,0x7B},
+ {0xF8,0x7A}, {0x91,0xC0}, {0xBB,0xF3}, {0xEC,0xB8},
+ {0xC2,0x4D}, {0xF3,0xF7}, {0xF3,0xF8}, {0xF7,0xCC},
+ {0xF8,0x7D}, {0x9A,0xB3}, {0x91,0xC3}, {0xF8,0xEA},
+ {0xF9,0x66}, {0xF9,0xB9}, {0xF9,0xD4}, {0xBB,0xF4},
+ {0xC2,0x4E}, {0xF1,0xE9}, {0xF3,0xF9}, {0xF6,0xD2},
+ {0xF8,0x7E}, {0xA0,0xFC}, {0xBE,0xA6}, {0x9F,0xEE},
+ {0xEF,0xB5}, {0xF1,0xEA}, {0xF3,0xFA}, {0xF3,0xFB},
+ {0xF3,0xFC}, {0xF5,0xBE}, {0x9F,0x69}, {0xF5,0xBA},
+ {0xC5,0x68}, {0xF5,0xBD}, {0xF5,0xBC}, {0xC4,0xD4},
+ {0xF5,0xBB}, {0xC4,0xD6}, {0x91,0xC8}, {0xC4,0xD5},
+ {0xF6,0xD4}, {0xF6,0xD3}, {0xC5,0x69}, {0xC5,0x6A},
+ {0x91,0xC9}, {0xC5,0xC6}, {0xF7,0xCD}, {0xC5,0xC5},
+ {0xF8,0xA3}, {0xF8,0xA4}, {0xF8,0xA2}, {0xF8,0xA1},
+ {0xC6,0x54}, {0xF8,0xEB}, {0xF8,0xEC}, {0xF8,0xED},
+ {0xC6,0x53}, {0xF9,0x67}, {0xF9,0x6A}, {0xF9,0x69},
+ {0xF9,0x68}, {0xF9,0xD3}, {0x8D,0xE6}, {0xC0,0x73},
+ {0x91,0xCB}, {0xC3,0x65}, {0xF5,0xBF}, {0xF6,0xD5},
+ {0xC5,0xC7}, {0xF7,0xCE}, {0xF9,0xD5}, {0x89,0xC8},
+ {0xC0,0x74}, {0x8D,0xAA}, {0xEF,0xB6}, {0xF7,0xCF},
+ {0xF9,0xA1}, {0x9F,0xDD}, {0xFA,0x40}, {0xFA,0x41},
+ {0xFA,0x42}, {0xFA,0x43}, {0xFA,0x44}, {0xFA,0x45},
+ {0xFA,0x46}, {0xFA,0x47}, {0xFA,0x48}, {0xFA,0x49},
+ {0xFA,0x4A}, {0xFA,0x4B}, {0xFA,0x4C}, {0xFA,0x4D},
+ {0xFA,0x4E}, {0xFA,0x4F}, {0xFA,0x50}, {0xFA,0x51},
+ {0xFA,0x52}, {0xFA,0x53}, {0xFA,0x54}, {0xFA,0x55},
+ {0xFA,0x56}, {0xFA,0x57}, {0xFA,0x58}, {0xFA,0x59},
+ {0xFA,0x5A}, {0xFA,0x5B}, {0xFA,0x5C}, {0xFA,0x5D},
+ {0xFA,0x5E}, {0xAD,0xC5}, {0xFA,0x60}, {0xFA,0x61},
+ {0xFA,0x62}, {0xFA,0x63}, {0xFA,0x64}, {0xFA,0x65},
+ {0xB0,0xB0}, {0xFA,0x67}, {0xFA,0x68}, {0xFA,0x69},
+ {0xFA,0x6A}, {0xFA,0x6B}, {0xFA,0x6C}, {0xFA,0x6D},
+ {0xFA,0x6E}, {0xFA,0x6F}, {0xFA,0x70}, {0xFA,0x71},
+ {0xFA,0x72}, {0xFA,0x73}, {0xFA,0x74}, {0xFA,0x75},
+ {0xFA,0x76}, {0xFA,0x77}, {0xFA,0x78}, {0xFA,0x79},
+ {0xFA,0x7A}, {0xFA,0x7B}, {0xFA,0x7C}, {0xFA,0x7D},
+ {0xFA,0x7E}, {0xFA,0xA1}, {0xFA,0xA2}, {0xFA,0xA3},
+ {0xFA,0xA4}, {0xFA,0xA5}, {0xFA,0xA6}, {0xFA,0xA7},
+ {0xFA,0xA8}, {0xFA,0xA9}, {0xFA,0xAA}, {0xFA,0xAB},
+ {0xFA,0xAC}, {0xFA,0xAD}, {0xFA,0xAE}, {0xFA,0xAF},
+ {0xFA,0xB0}, {0xFA,0xB1}, {0xFA,0xB2}, {0xFA,0xB3},
+ {0xFA,0xB4}, {0xFA,0xB5}, {0xFA,0xB6}, {0xFA,0xB7},
+ {0xFA,0xB8}, {0xFA,0xB9}, {0xFA,0xBA}, {0xFA,0xBB},
+ {0xFA,0xBC}, {0xA5,0x5D}, {0xFA,0xBE}, {0xFA,0xBF},
+ {0xFA,0xC0}, {0xFA,0xC1}, {0xFA,0xC2}, {0xFA,0xC3},
+ {0xFA,0xC4}, {0xA2,0xCD}, {0xFA,0xC6}, {0xFA,0xC7},
+ {0xFA,0xC8}, {0xFA,0xC9}, {0xFA,0xCA}, {0xFA,0xCB},
+ {0xFA,0xCC}, {0xFA,0xCD}, {0xFA,0xCE}, {0xFA,0xCF},
+ {0xFA,0xD0}, {0xFA,0xD1}, {0xFA,0xD2}, {0xFA,0xD3},
+ {0xFA,0xD4}, {0xAD,0xEB}, {0xFA,0xD6}, {0xFA,0xD7},
+ {0xFA,0xD8}, {0xFA,0xD9}, {0xFA,0xDA}, {0xFA,0xDB},
+ {0xFA,0xDC}, {0xFA,0xDD}, {0xFA,0xDE}, {0xFA,0xDF},
+ {0xFA,0xE0}, {0xFA,0xE1}, {0xFA,0xE2}, {0xFA,0xE3},
+ {0xFA,0xE4}, {0xFA,0xE5}, {0xFA,0xE6}, {0xFA,0xE7},
+ {0xFA,0xE8}, {0xFA,0xE9}, {0xFA,0xEA}, {0xFA,0xEB},
+ {0xFA,0xEC}, {0xFA,0xED}, {0xFA,0xEE}, {0xFA,0xEF},
+ {0xFA,0xF0}, {0xFA,0xF1}, {0xFA,0xF2}, {0xFA,0xF3},
+ {0xFA,0xF4}, {0xFA,0xF5}, {0xFA,0xF6}, {0xFA,0xF7},
+ {0xFA,0xF8}, {0xFA,0xF9}, {0xFA,0xFA}, {0xFA,0xFB},
+ {0xFA,0xFC}, {0xFA,0xFD}, {0xFA,0xFE}, {0xFB,0x40},
+ {0xFB,0x41}, {0xFB,0x42}, {0xFB,0x43}, {0xFB,0x44},
+ {0xFB,0x45}, {0xFB,0x46}, {0xFB,0x47}, {0x9D,0xEF},
+ {0xFB,0x49}, {0xFB,0x4A}, {0xFB,0x4B}, {0xFB,0x4C},
+ {0xFB,0x4D}, {0xFB,0x4E}, {0xFB,0x4F}, {0xFB,0x50},
+ {0xFB,0x51}, {0xFB,0x52}, {0xFB,0x53}, {0xFB,0x54},
+ {0xFB,0x55}, {0xFB,0x56}, {0xFB,0x57}, {0xFB,0x58},
+ {0xFB,0x59}, {0xFB,0x5A}, {0xFB,0x5B}, {0xFB,0x5C},
+ {0xFB,0x5D}, {0xFB,0x5E}, {0xFB,0x5F}, {0xFB,0x60},
+ {0xFB,0x61}, {0xFB,0x62}, {0xFB,0x63}, {0xFB,0x64},
+ {0xFB,0x65}, {0xFB,0x66}, {0xFB,0x67}, {0xFB,0x68},
+ {0xFB,0x69}, {0xFB,0x6A}, {0xFB,0x6B}, {0xFB,0x6C},
+ {0xFB,0x6D}, {0xFB,0x6E}, {0xFB,0x6F}, {0xFB,0x70},
+ {0xFB,0x71}, {0xFB,0x72}, {0xFB,0x73}, {0xFB,0x74},
+ {0xFB,0x75}, {0xFB,0x76}, {0xFB,0x77}, {0xFB,0x78},
+ {0xFB,0x79}, {0xFB,0x7A}, {0xFB,0x7B}, {0xFB,0x7C},
+ {0xFB,0x7D}, {0xFB,0x7E}, {0xFB,0xA1}, {0xFB,0xA2},
+ {0xFB,0xA3}, {0xFB,0xA4}, {0xFB,0xA5}, {0xFB,0xA6},
+ {0xFB,0xA7}, {0xFB,0xA8}, {0xFB,0xA9}, {0xFB,0xAA},
+ {0xFB,0xAB}, {0xFB,0xAC}, {0xFB,0xAD}, {0xFB,0xAE},
+ {0xFB,0xAF}, {0xFB,0xB0}, {0xFB,0xB1}, {0xFB,0xB2},
+ {0xFB,0xB3}, {0xFB,0xB4}, {0xFB,0xB5}, {0xFB,0xB6},
+ {0xFB,0xB7}, {0xB4,0x40}, {0xFB,0xB9}, {0xFB,0xBA},
+ {0xFB,0xBB}, {0xFB,0xBC}, {0xFB,0xBD}, {0xFB,0xBE},
+ {0xFB,0xBF}, {0xFB,0xC0}, {0xFB,0xC1}, {0xFB,0xC2},
+ {0xFB,0xC3}, {0xFB,0xC4}, {0xFB,0xC5}, {0xFB,0xC6},
+ {0xFB,0xC7}, {0xFB,0xC8}, {0xFB,0xC9}, {0xFB,0xCA},
+ {0xFB,0xCB}, {0xFB,0xCC}, {0xFB,0xCD}, {0xFB,0xCE},
+ {0xFB,0xCF}, {0xFB,0xD0}, {0xFB,0xD1}, {0xFB,0xD2},
+ {0xFB,0xD3}, {0xFB,0xD4}, {0xFB,0xD5}, {0xFB,0xD6},
+ {0xFB,0xD7}, {0xFB,0xD8}, {0xFB,0xD9}, {0xFB,0xDA},
+ {0xFB,0xDB}, {0xFB,0xDC}, {0xFB,0xDD}, {0xFB,0xDE},
+ {0xFB,0xDF}, {0xFB,0xE0}, {0xFB,0xE1}, {0xFB,0xE2},
+ {0xFB,0xE3}, {0xFB,0xE4}, {0xFB,0xE5}, {0xFB,0xE6},
+ {0xFB,0xE7}, {0xFB,0xE8}, {0xFB,0xE9}, {0xFB,0xEA},
+ {0xFB,0xEB}, {0xFB,0xEC}, {0xFB,0xED}, {0xFB,0xEE},
+ {0xFB,0xEF}, {0xFB,0xF0}, {0xFB,0xF1}, {0xFB,0xF2},
+ {0xC9,0xDB}, {0xFB,0xF4}, {0xFB,0xF5}, {0xFB,0xF6},
+ {0xFB,0xF7}, {0xFB,0xF8}, {0x9D,0xFB}, {0xFB,0xFA},
+ {0xFB,0xFB}, {0xFB,0xFC}, {0xFB,0xFD}, {0xFB,0xFE},
+ {0xFC,0x40}, {0xFC,0x41}, {0xFC,0x42}, {0xFC,0x43},
+ {0xFC,0x44}, {0xFC,0x45}, {0xFC,0x46}, {0xFC,0x47},
+ {0xFC,0x48}, {0xFC,0x49}, {0xFC,0x4A}, {0xFC,0x4B},
+ {0xFC,0x4C}, {0xFC,0x4D}, {0xFC,0x4E}, {0xD8,0xF4},
+ {0xFC,0x50}, {0xFC,0x51}, {0xFC,0x52}, {0xFC,0x53},
+ {0xFC,0x54}, {0xFC,0x55}, {0xFC,0x56}, {0xFC,0x57},
+ {0xFC,0x58}, {0xFC,0x59}, {0xFC,0x5A}, {0xFC,0x5B},
+ {0xFC,0x5C}, {0xFC,0x5D}, {0xFC,0x5E}, {0xFC,0x5F},
+ {0xFC,0x60}, {0xFC,0x61}, {0xFC,0x62}, {0xFC,0x63},
+ {0xFC,0x64}, {0xFC,0x65}, {0xFC,0x66}, {0xFC,0x67},
+ {0xFC,0x68}, {0xFC,0x69}, {0xFC,0x6A}, {0xFC,0x6B},
+ {0xA0,0xDC}, {0xFC,0x6D}, {0xFC,0x6E}, {0xFC,0x6F},
+ {0xFC,0x70}, {0xFC,0x71}, {0xFC,0x72}, {0xFC,0x73},
+ {0xFC,0x74}, {0xFC,0x75}, {0xFC,0x76}, {0xFC,0x77},
+ {0xFC,0x78}, {0xFC,0x79}, {0xFC,0x7A}, {0xFC,0x7B},
+ {0xFC,0x7C}, {0xFC,0x7D}, {0xFC,0x7E}, {0xFC,0xA1},
+ {0xFC,0xA2}, {0xFC,0xA3}, {0xFC,0xA4}, {0xFC,0xA5},
+ {0xFC,0xA6}, {0xFC,0xA7}, {0xFC,0xA8}, {0xFC,0xA9},
+ {0xFC,0xAA}, {0xFC,0xAB}, {0xFC,0xAC}, {0xFC,0xAD},
+ {0xFC,0xAE}, {0xFC,0xAF}, {0xFC,0xB0}, {0xFC,0xB1},
+ {0xFC,0xB2}, {0xFC,0xB3}, {0xFC,0xB4}, {0xFC,0xB5},
+ {0xFC,0xB6}, {0xFC,0xB7}, {0xFC,0xB8}, {0xBC,0xB5},
+ {0xFC,0xBA}, {0xFC,0xBB}, {0xFC,0xBC}, {0xFC,0xBD},
+ {0xFC,0xBE}, {0xFC,0xBF}, {0xFC,0xC0}, {0xFC,0xC1},
+ {0xFC,0xC2}, {0xFC,0xC3}, {0xFC,0xC4}, {0xFC,0xC5},
+ {0xFC,0xC6}, {0xFC,0xC7}, {0xFC,0xC8}, {0xFC,0xC9},
+ {0xFC,0xCA}, {0xFC,0xCB}, {0xFC,0xCC}, {0xFC,0xCD},
+ {0xFC,0xCE}, {0xFC,0xCF}, {0xFC,0xD0}, {0xFC,0xD1},
+ {0xFC,0xD2}, {0xFC,0xD3}, {0xFC,0xD4}, {0xFC,0xD5},
+ {0xFC,0xD6}, {0xFC,0xD7}, {0xFC,0xD8}, {0xFC,0xD9},
+ {0xFC,0xDA}, {0xFC,0xDB}, {0xFC,0xDC}, {0xFC,0xDD},
+ {0xFC,0xDE}, {0xFC,0xDF}, {0xFC,0xE0}, {0xFC,0xE1},
+ {0xB4,0xB8}, {0xFC,0xE3}, {0xFC,0xE4}, {0xFC,0xE5},
+ {0xFC,0xE6}, {0xFC,0xE7}, {0xFC,0xE8}, {0xFC,0xE9},
+ {0xFC,0xEA}, {0xFC,0xEB}, {0xFC,0xEC}, {0xFC,0xED},
+ {0xFC,0xEE}, {0xFC,0xEF}, {0xFC,0xF0}, {0xA7,0xFB},
+ {0xFC,0xF2}, {0xFC,0xF3}, {0xFC,0xF4}, {0xFC,0xF5},
+ {0xFC,0xF6}, {0xFC,0xF7}, {0xFC,0xF8}, {0xFC,0xF9},
+ {0xFC,0xFA}, {0xFC,0xFB}, {0xFC,0xFC}, {0xFC,0xFD},
+ {0xFC,0xFE}, {0xFD,0x40}, {0xFD,0x41}, {0xFD,0x42},
+ {0xFD,0x43}, {0xFD,0x44}, {0xFD,0x45}, {0xFD,0x46},
+ {0xFD,0x47}, {0xFD,0x48}, {0xFD,0x49}, {0xFD,0x4A},
+ {0xFD,0x4B}, {0xFD,0x4C}, {0xFD,0x4D}, {0xFD,0x4E},
+ {0xFD,0x4F}, {0xFD,0x50}, {0xFD,0x51}, {0xFD,0x52},
+ {0xFD,0x53}, {0xFD,0x54}, {0xFD,0x55}, {0xFD,0x56},
+ {0xFD,0x57}, {0xFD,0x58}, {0xFD,0x59}, {0xFD,0x5A},
+ {0xFD,0x5B}, {0xFD,0x5C}, {0xFD,0x5D}, {0xFD,0x5E},
+ {0xFD,0x5F}, {0xFD,0x60}, {0xFD,0x61}, {0xFD,0x62},
+ {0xFD,0x63}, {0xFD,0x64}, {0xFD,0x65}, {0xFD,0x66},
+ {0xFD,0x67}, {0xFD,0x68}, {0xFD,0x69}, {0xFD,0x6A},
+ {0xFD,0x6B}, {0xFD,0x6C}, {0xFD,0x6D}, {0xFD,0x6E},
+ {0xFD,0x6F}, {0xFD,0x70}, {0xFD,0x71}, {0xFD,0x72},
+ {0xFD,0x73}, {0xFD,0x74}, {0xFD,0x75}, {0xFD,0x76},
+ {0xFD,0x77}, {0xFD,0x78}, {0xFD,0x79}, {0xFD,0x7A},
+ {0xFD,0x7B}, {0xFD,0x7C}, {0xFD,0x7D}, {0xFD,0x7E},
+ {0xFD,0xA1}, {0xFD,0xA2}, {0xFD,0xA3}, {0xFD,0xA4},
+ {0xFD,0xA5}, {0xFD,0xA6}, {0xFD,0xA7}, {0xFD,0xA8},
+ {0xFD,0xA9}, {0xFD,0xAA}, {0xFD,0xAB}, {0xFD,0xAC},
+ {0xFD,0xAD}, {0xFD,0xAE}, {0xFD,0xAF}, {0xFD,0xB0},
+ {0xFD,0xB1}, {0xFD,0xB2}, {0xFD,0xB3}, {0xFD,0xB4},
+ {0xFD,0xB5}, {0xFD,0xB6}, {0xCB,0x58}, {0xB4,0xFC},
+ {0xFD,0xB9}, {0xFD,0xBA}, {0xB4,0xE4}, {0xFD,0xBC},
+ {0xFD,0xBD}, {0xFD,0xBE}, {0xFD,0xBF}, {0xFD,0xC0},
+ {0xFD,0xC1}, {0xFD,0xC2}, {0xFD,0xC3}, {0xFD,0xC4},
+ {0xFD,0xC5}, {0xFD,0xC6}, {0xFD,0xC7}, {0xFD,0xC8},
+ {0xFD,0xC9}, {0xFD,0xCA}, {0xFD,0xCB}, {0xFD,0xCC},
+ {0xFD,0xCD}, {0xFD,0xCE}, {0xFD,0xCF}, {0xFD,0xD0},
+ {0xFD,0xD1}, {0xFD,0xD2}, {0xFD,0xD3}, {0xFD,0xD4},
+ {0xFD,0xD5}, {0xFD,0xD6}, {0xFD,0xD7}, {0xFD,0xD8},
+ {0xFD,0xD9}, {0xFD,0xDA}, {0xFD,0xDB}, {0xFD,0xDC},
+ {0xFD,0xDD}, {0xFD,0xDE}, {0xFD,0xDF}, {0xFD,0xE0},
+ {0xFD,0xE1}, {0xFD,0xE2}, {0xFD,0xE3}, {0xFD,0xE4},
+ {0xFD,0xE5}, {0xFD,0xE6}, {0xFD,0xE7}, {0xFD,0xE8},
+ {0xFD,0xE9}, {0xFD,0xEA}, {0xFD,0xEB}, {0xFD,0xEC},
+ {0xFD,0xED}, {0xFD,0xEE}, {0xFD,0xEF}, {0xFD,0xF0},
+ {0xB5,0x4E}, {0xFD,0xF2}, {0xFD,0xF3}, {0xFD,0xF4},
+ {0xFD,0xF5}, {0xFD,0xF6}, {0xFD,0xF7}, {0xFD,0xF8},
+ {0xFD,0xF9}, {0xFD,0xFA}, {0xFD,0xFB}, {0xFD,0xFC},
+ {0xFD,0xFD}, {0xFD,0xFE}, {0xFE,0x40}, {0xFE,0x41},
+ {0xFE,0x42}, {0xFE,0x43}, {0xFE,0x44}, {0xFE,0x45},
+ {0xFE,0x46}, {0xFE,0x47}, {0xFE,0x48}, {0xFE,0x49},
+ {0xFE,0x4A}, {0xFE,0x4B}, {0xFE,0x4C}, {0xFE,0x4D},
+ {0xFE,0x4E}, {0xFE,0x4F}, {0xFE,0x50}, {0xFE,0x51},
+ {0x99,0x75}, {0xFE,0x53}, {0xFE,0x54}, {0xFE,0x55},
+ {0xFE,0x56}, {0xFE,0x57}, {0xFE,0x58}, {0xFE,0x59},
+ {0xFE,0x5A}, {0xFE,0x5B}, {0xFE,0x5C}, {0xFE,0x5D},
+ {0xFE,0x5E}, {0xFE,0x5F}, {0xFE,0x60}, {0xFE,0x61},
+ {0xFE,0x62}, {0xFE,0x63}, {0xFE,0x64}, {0xFE,0x65},
+ {0xFE,0x66}, {0xFE,0x67}, {0xFE,0x68}, {0xFE,0x69},
+ {0xFE,0x6A}, {0xFE,0x6B}, {0xFE,0x6C}, {0xFE,0x6D},
+ {0xFE,0x6E}, {0xB7,0xEC}, {0xFE,0x70}, {0xFE,0x71},
+ {0xFE,0x72}, {0xFE,0x73}, {0xFE,0x74}, {0xFE,0x75},
+ {0xFE,0x76}, {0xFE,0x77}, {0xFE,0x78}, {0xFE,0x79},
+ {0xFE,0x7A}, {0xFE,0x7B}, {0xFE,0x7C}, {0xFE,0x7D},
+ {0xFE,0x7E}, {0xFE,0xA1}, {0xFE,0xA2}, {0xFE,0xA3},
+ {0xFE,0xA4}, {0xFE,0xA5}, {0xFE,0xA6}, {0xFE,0xA7},
+ {0xFE,0xA8}, {0xFE,0xA9}, {0xA2,0x60}, {0xFE,0xAB},
+ {0xFE,0xAC}, {0xFE,0xAD}, {0xFE,0xAE}, {0xFE,0xAF},
+ {0xFE,0xB0}, {0xFE,0xB1}, {0xFE,0xB2}, {0xFE,0xB3},
+ {0xFE,0xB4}, {0xFE,0xB5}, {0xFE,0xB6}, {0xFE,0xB7},
+ {0xFE,0xB8}, {0xFE,0xB9}, {0xFE,0xBA}, {0xFE,0xBB},
+ {0xFE,0xBC}, {0xFE,0xBD}, {0xFE,0xBE}, {0xFE,0xBF},
+ {0xFE,0xC0}, {0xFE,0xC1}, {0xFE,0xC2}, {0xFE,0xC3},
+ {0xFE,0xC4}, {0xFE,0xC5}, {0xFE,0xC6}, {0xFE,0xC7},
+ {0xFE,0xC8}, {0xFE,0xC9}, {0xFE,0xCA}, {0xFE,0xCB},
+ {0xFE,0xCC}, {0xFE,0xCD}, {0xFE,0xCE}, {0xFE,0xCF},
+ {0xFE,0xD0}, {0xFE,0xD1}, {0xFE,0xD2}, {0xFE,0xD3},
+ {0xFE,0xD4}, {0xFE,0xD5}, {0xFE,0xD6}, {0xFE,0xD7},
+ {0xFE,0xD8}, {0xFE,0xD9}, {0xFE,0xDA}, {0xFE,0xDB},
+ {0xFE,0xDC}, {0xCF,0xF1}, {0xFE,0xDE}, {0xFE,0xDF},
+ {0xFE,0xE0}, {0xFE,0xE1}, {0xFE,0xE2}, {0xFE,0xE3},
+ {0xFE,0xE4}, {0xFE,0xE5}, {0xFE,0xE6}, {0xFE,0xE7},
+ {0xFE,0xE8}, {0xFE,0xE9}, {0xFE,0xEA}, {0xFE,0xEB},
+ {0xFE,0xEC}, {0xFE,0xED}, {0xFE,0xEE}, {0xFE,0xEF},
+ {0xFE,0xF0}, {0xFE,0xF1}, {0xFE,0xF2}, {0xFE,0xF3},
+ {0xFE,0xF4}, {0xFE,0xF5}, {0xFE,0xF6}, {0xFE,0xF7},
+ {0xFE,0xF8}, {0xFE,0xF9}, {0xFE,0xFA}, {0xFE,0xFB},
+ {0xFE,0xFC}, {0xFE,0xFD}, {0xFE,0xFE}, {0x8E,0x40},
+ {0x8E,0x41}, {0x8E,0x42}, {0x8E,0x43}, {0x8E,0x44},
+ {0x8E,0x45}, {0x8E,0x46}, {0x8E,0x47}, {0x8E,0x48},
+ {0x8E,0x49}, {0x8E,0x4A}, {0x8E,0x4B}, {0x8E,0x4C},
+ {0x8E,0x4D}, {0x8E,0x4E}, {0x8E,0x4F}, {0x8E,0x50},
+ {0x8E,0x51}, {0x8E,0x52}, {0x8E,0x53}, {0x8E,0x54},
+ {0x8E,0x55}, {0x8E,0x56}, {0x8E,0x57}, {0x8E,0x58},
+ {0x8E,0x59}, {0x8E,0x5A}, {0x8E,0x5B}, {0x8E,0x5C},
+ {0x8E,0x5D}, {0x8E,0x5E}, {0x8E,0x5F}, {0x8E,0x60},
+ {0x8E,0x61}, {0x8E,0x62}, {0x8E,0x63}, {0x8E,0x64},
+ {0x8E,0x65}, {0x8E,0x66}, {0x8E,0x67}, {0x8E,0x68},
+ {0xBA,0xE6}, {0x8E,0x6A}, {0x8E,0x6B}, {0x8E,0x6C},
+ {0x8E,0x6D}, {0x8E,0x6E}, {0xED,0xCA}, {0x8E,0x70},
+ {0x8E,0x71}, {0x8E,0x72}, {0x8E,0x73}, {0x8E,0x74},
+ {0x8E,0x75}, {0x8E,0x76}, {0x8E,0x77}, {0x8E,0x78},
+ {0x8E,0x79}, {0x8E,0x7A}, {0x8E,0x7B}, {0x8E,0x7C},
+ {0x8E,0x7D}, {0xA2,0x61}, {0x8E,0xA1}, {0x8E,0xA2},
+ {0x8E,0xA3}, {0x8E,0xA4}, {0x8E,0xA5}, {0x8E,0xA6},
+ {0x8E,0xA7}, {0x8E,0xA8}, {0x8E,0xA9}, {0x8E,0xAA},
+ {0xBA,0xFC}, {0x8E,0xAC}, {0x8E,0xAD}, {0x8E,0xAE},
+ {0x8E,0xAF}, {0x8E,0xB0}, {0x8E,0xB1}, {0x8E,0xB2},
+ {0x8E,0xB3}, {0xBF,0xA6}, {0x8E,0xB5}, {0x8E,0xB6},
+ {0x8E,0xB7}, {0x8E,0xB8}, {0x8E,0xB9}, {0x8E,0xBA},
+ {0x8E,0xBB}, {0x8E,0xBC}, {0x8E,0xBD}, {0x8E,0xBE},
+ {0x8E,0xBF}, {0x8E,0xC0}, {0x8E,0xC1}, {0x8E,0xC2},
+ {0x8E,0xC3}, {0x8E,0xC4}, {0x8E,0xC5}, {0x8E,0xC6},
+ {0x8E,0xC7}, {0x8E,0xC8}, {0x8E,0xC9}, {0x8E,0xCA},
+ {0x8E,0xCB}, {0x8E,0xCC}, {0xAA,0xCC}, {0x8E,0xCE},
+ {0x8E,0xCF}, {0xBF,0xAE}, {0x8E,0xD1}, {0x8E,0xD2},
+ {0x8E,0xD3}, {0x8E,0xD4}, {0x8E,0xD5}, {0x8E,0xD6},
+ {0x8E,0xD7}, {0x8E,0xD8}, {0x8E,0xD9}, {0x8E,0xDA},
+ {0x8E,0xDB}, {0x8E,0xDC}, {0x8E,0xDD}, {0x8E,0xDE},
+ {0x8E,0xDF}, {0x8E,0xE0}, {0x8E,0xE1}, {0x8E,0xE2},
+ {0x8E,0xE3}, {0x8E,0xE4}, {0x8E,0xE5}, {0x8E,0xE6},
+ {0x8E,0xE7}, {0x8E,0xE8}, {0x8E,0xE9}, {0x8E,0xEA},
+ {0x8E,0xEB}, {0x8E,0xEC}, {0x8E,0xED}, {0x8E,0xEE},
+ {0x8E,0xEF}, {0x8E,0xF0}, {0x8E,0xF1}, {0x8E,0xF2},
+ {0x8E,0xF3}, {0x8E,0xF4}, {0x8E,0xF5}, {0x8E,0xF6},
+ {0x8E,0xF7}, {0x8E,0xF8}, {0x8E,0xF9}, {0x8E,0xFA},
+ {0x8E,0xFB}, {0x8E,0xFC}, {0x8E,0xFD}, {0x8E,0xFE},
+ {0x8F,0x40}, {0x8F,0x41}, {0x8F,0x42}, {0x8F,0x43},
+ {0x8F,0x44}, {0x8F,0x45}, {0x8F,0x46}, {0x8F,0x47},
+ {0x8F,0x48}, {0x8F,0x49}, {0x8F,0x4A}, {0x8F,0x4B},
+ {0x8F,0x4C}, {0x8F,0x4D}, {0x8F,0x4E}, {0x8F,0x4F},
+ {0x8F,0x50}, {0x8F,0x51}, {0x8F,0x52}, {0x8F,0x53},
+ {0x8F,0x54}, {0x8F,0x55}, {0x8F,0x56}, {0xB5,0xD7},
+ {0x8F,0x58}, {0x8F,0x59}, {0x8F,0x5A}, {0x8F,0x5B},
+ {0x8F,0x5C}, {0x8F,0x5D}, {0x8F,0x5E}, {0x8F,0x5F},
+ {0x8F,0x60}, {0x8F,0x61}, {0x8F,0x62}, {0x8F,0x63},
+ {0x8F,0x64}, {0x8F,0x65}, {0x8F,0x66}, {0x8F,0x67},
+ {0x8F,0x68}, {0xE3,0xC8}, {0x8F,0x6A}, {0x8F,0x6B},
+ {0x8F,0x6C}, {0x8F,0x6D}, {0xDB,0x79}, {0x8F,0x6F},
+ {0x8F,0x70}, {0x8F,0x71}, {0x8F,0x72}, {0x8F,0x73},
+ {0x8F,0x74}, {0x8F,0x75}, {0x8F,0x76}, {0x8F,0x77},
+ {0x8F,0x78}, {0x8F,0x79}, {0x8F,0x7A}, {0x8F,0x7B},
+ {0x8F,0x7C}, {0x8F,0x7D}, {0x8F,0x7E}, {0x8F,0xA1},
+ {0x8F,0xA2}, {0x8F,0xA3}, {0x8F,0xA4}, {0x8F,0xA5},
+ {0x8F,0xA6}, {0x8F,0xA7}, {0x8F,0xA8}, {0x8F,0xA9},
+ {0x8F,0xAA}, {0x8F,0xAB}, {0x8F,0xAC}, {0x8F,0xAD},
+ {0x8F,0xAE}, {0x8F,0xAF}, {0x8F,0xB0}, {0x8F,0xB1},
+ {0x8F,0xB2}, {0x8F,0xB3}, {0x8F,0xB4}, {0x8F,0xB5},
+ {0x8F,0xB6}, {0x8F,0xB7}, {0x8F,0xB8}, {0x8F,0xB9},
+ {0x8F,0xBA}, {0x8F,0xBB}, {0x8F,0xBC}, {0x8F,0xBD},
+ {0x8F,0xBE}, {0x8F,0xBF}, {0x8F,0xC0}, {0x8F,0xC1},
+ {0x8F,0xC2}, {0x8F,0xC3}, {0x8F,0xC4}, {0x8F,0xC5},
+ {0x8F,0xC6}, {0x8F,0xC7}, {0x8F,0xC8}, {0x8F,0xC9},
+ {0x8F,0xCA}, {0xBF,0xCC}, {0xA0,0xD4}, {0x8F,0xCD},
+ {0x8F,0xCE}, {0x8F,0xCF}, {0x8F,0xD0}, {0x8F,0xD1},
+ {0x8F,0xD2}, {0x8F,0xD3}, {0x8F,0xD4}, {0x8F,0xD5},
+ {0x8F,0xD6}, {0x8F,0xD7}, {0x8F,0xD8}, {0x8F,0xD9},
+ {0x8F,0xDA}, {0x8F,0xDB}, {0x8F,0xDC}, {0x8F,0xDD},
+ {0x8F,0xDE}, {0x8F,0xDF}, {0x8F,0xE0}, {0x8F,0xE1},
+ {0x8F,0xE2}, {0x8F,0xE3}, {0x8F,0xE4}, {0x8F,0xE5},
+ {0x8F,0xE6}, {0x8F,0xE7}, {0x8F,0xE8}, {0x8F,0xE9},
+ {0x8F,0xEA}, {0x8F,0xEB}, {0x8F,0xEC}, {0x8F,0xED},
+ {0x8F,0xEE}, {0x8F,0xEF}, {0x8F,0xF0}, {0x8F,0xF1},
+ {0x8F,0xF2}, {0x8F,0xF3}, {0x8F,0xF4}, {0x8F,0xF5},
+ {0x8F,0xF6}, {0x8F,0xF7}, {0x8F,0xF8}, {0x8F,0xF9},
+ {0x8F,0xFA}, {0x8F,0xFB}, {0x8F,0xFC}, {0x8F,0xFD},
+ {0xB0,0x5F}, {0x90,0x40}, {0x90,0x41}, {0x90,0x42},
+ {0x90,0x43}, {0x90,0x44}, {0x90,0x45}, {0x90,0x46},
+ {0x90,0x47}, {0x90,0x48}, {0x90,0x49}, {0x90,0x4A},
+ {0x90,0x4B}, {0x90,0x4C}, {0x90,0x4D}, {0x90,0x4E},
+ {0x90,0x4F}, {0x90,0x50}, {0x90,0x51}, {0x90,0x52},
+ {0x90,0x53}, {0x90,0x54}, {0x90,0x55}, {0x90,0x56},
+ {0x90,0x57}, {0x90,0x58}, {0x90,0x59}, {0x90,0x5A},
+ {0x90,0x5B}, {0x90,0x5C}, {0x90,0x5D}, {0x90,0x5E},
+ {0x90,0x5F}, {0x90,0x60}, {0x90,0x61}, {0x90,0x62},
+ {0x90,0x63}, {0x90,0x64}, {0x90,0x65}, {0x90,0x66},
+ {0x90,0x67}, {0x90,0x68}, {0x90,0x69}, {0x90,0x6A},
+ {0x90,0x6B}, {0x90,0x6C}, {0xB3,0xA3}, {0x90,0x6E},
+ {0x90,0x6F}, {0x90,0x70}, {0x90,0x71}, {0x90,0x72},
+ {0x90,0x73}, {0x90,0x74}, {0x90,0x75}, {0x90,0x76},
+ {0x90,0x77}, {0x90,0x78}, {0x90,0x79}, {0xF9,0xD7},
+ {0x90,0x7B}, {0x90,0x7C}, {0x90,0x7D}, {0x90,0x7E},
+ {0x90,0xA1}, {0x90,0xA2}, {0x90,0xA3}, {0x90,0xA4},
+ {0x90,0xA5}, {0x90,0xA6}, {0x90,0xA7}, {0x90,0xA8},
+ {0x90,0xA9}, {0x90,0xAA}, {0x90,0xAB}, {0x90,0xAC},
+ {0x90,0xAD}, {0x90,0xAE}, {0x90,0xAF}, {0x90,0xB0},
+ {0x90,0xB1}, {0x90,0xB2}, {0x90,0xB3}, {0x90,0xB4},
+ {0x90,0xB5}, {0x90,0xB6}, {0x90,0xB7}, {0x90,0xB8},
+ {0x90,0xB9}, {0x90,0xBA}, {0x90,0xBB}, {0x90,0xBC},
+ {0x90,0xBD}, {0x90,0xBE}, {0x90,0xBF}, {0x90,0xC0},
+ {0x90,0xC1}, {0x90,0xC2}, {0x90,0xC3}, {0x90,0xC4},
+ {0x90,0xC5}, {0x90,0xC6}, {0x90,0xC7}, {0x90,0xC8},
+ {0x90,0xC9}, {0x90,0xCA}, {0x90,0xCB}, {0x90,0xCC},
+ {0x90,0xCD}, {0x90,0xCE}, {0x90,0xCF}, {0x90,0xD0},
+ {0x90,0xD1}, {0x90,0xD2}, {0x90,0xD3}, {0x90,0xD4},
+ {0x90,0xD5}, {0x90,0xD6}, {0x90,0xD7}, {0x90,0xD8},
+ {0x90,0xD9}, {0x90,0xDA}, {0x90,0xDB}, {0xC0,0x52},
+ {0x90,0xDD}, {0x90,0xDE}, {0x90,0xDF}, {0x90,0xE0},
+ {0x90,0xE1}, {0x90,0xE2}, {0x90,0xE3}, {0x90,0xE4},
+ {0x90,0xE5}, {0x90,0xE6}, {0x90,0xE7}, {0x90,0xE8},
+ {0x90,0xE9}, {0x90,0xEA}, {0x90,0xEB}, {0x90,0xEC},
+ {0x90,0xED}, {0x90,0xEE}, {0x90,0xEF}, {0x90,0xF0},
+ {0xC5,0x54}, {0x90,0xF2}, {0x90,0xF3}, {0x90,0xF4},
+ {0x90,0xF5}, {0x90,0xF6}, {0x90,0xF7}, {0x90,0xF8},
+ {0x90,0xF9}, {0x90,0xFA}, {0x90,0xFB}, {0x90,0xFC},
+ {0x90,0xFD}, {0x90,0xFE}, {0x91,0x40}, {0x91,0x41},
+ {0x91,0x42}, {0x91,0x43}, {0x91,0x44}, {0x91,0x45},
+ {0x91,0x46}, {0x91,0x47}, {0x91,0x48}, {0x91,0x49},
+ {0x91,0x4A}, {0x91,0x4B}, {0x91,0x4C}, {0x91,0x4D},
+ {0x91,0x4E}, {0x91,0x4F}, {0x91,0x50}, {0x91,0x51},
+ {0x91,0x52}, {0x91,0x53}, {0x91,0x54}, {0x91,0x55},
+ {0x91,0x56}, {0x91,0x57}, {0x91,0x58}, {0x91,0x59},
+ {0x91,0x5A}, {0x91,0x5B}, {0x91,0x5C}, {0x91,0x5D},
+ {0x91,0x5E}, {0x91,0x5F}, {0x91,0x60}, {0x91,0x61},
+ {0x91,0x62}, {0x91,0x63}, {0x91,0x64}, {0x91,0x65},
+ {0x91,0x66}, {0x91,0x67}, {0x91,0x68}, {0x91,0x69},
+ {0x91,0x6A}, {0x91,0x6B}, {0x91,0x6C}, {0x91,0x6D},
+ {0x91,0x6E}, {0x91,0x6F}, {0x91,0x70}, {0x91,0x71},
+ {0x91,0x72}, {0x91,0x73}, {0x91,0x74}, {0x91,0x75},
+ {0x91,0x76}, {0x91,0x77}, {0x91,0x78}, {0x91,0x79},
+ {0x91,0x7A}, {0x91,0x7B}, {0x91,0x7C}, {0x91,0x7D},
+ {0x91,0x7E}, {0x91,0xA1}, {0x91,0xA2}, {0x91,0xA3},
+ {0x91,0xA4}, {0x91,0xA5}, {0x91,0xA6}, {0x91,0xA7},
+ {0x91,0xA8}, {0x91,0xA9}, {0x91,0xAA}, {0x91,0xAB},
+ {0x91,0xAC}, {0x91,0xAD}, {0x91,0xAE}, {0x91,0xAF},
+ {0x91,0xB0}, {0x91,0xB1}, {0x91,0xB2}, {0x91,0xB3},
+ {0x91,0xB4}, {0x91,0xB5}, {0x91,0xB6}, {0x91,0xB7},
+ {0x91,0xB8}, {0x91,0xB9}, {0x91,0xBA}, {0x91,0xBB},
+ {0x91,0xBC}, {0x91,0xBD}, {0x91,0xBE}, {0xF1,0xE3},
+ {0x91,0xC0}, {0x91,0xC1}, {0x91,0xC2}, {0x91,0xC3},
+ {0x91,0xC4}, {0x91,0xC5}, {0x91,0xC6}, {0x91,0xC7},
+ {0x91,0xC8}, {0x91,0xC9}, {0x91,0xCA}, {0x91,0xCB},
+ {0x91,0xCC}, {0x91,0xCD}, {0x91,0xCE}, {0x91,0xCF},
+ {0x91,0xD0}, {0x91,0xD1}, {0x91,0xD2}, {0x91,0xD3},
+ {0x91,0xD4}, {0x91,0xD5}, {0x91,0xD6}, {0x91,0xD7},
+ {0x91,0xD8}, {0x91,0xD9}, {0x91,0xDA}, {0x91,0xDB},
+ {0x91,0xDC}, {0x91,0xDD}, {0x91,0xDE}, {0x91,0xDF},
+ {0x91,0xE0}, {0x91,0xE1}, {0x91,0xE2}, {0x91,0xE3},
+ {0x91,0xE4}, {0x91,0xE5}, {0x91,0xE6}, {0x91,0xE7},
+ {0x91,0xE8}, {0x91,0xE9}, {0x91,0xEA}, {0x91,0xEB},
+ {0x91,0xEC}, {0x91,0xED}, {0x91,0xEE}, {0x91,0xEF},
+ {0x91,0xF0}, {0x91,0xF1}, {0x91,0xF2}, {0x91,0xF3},
+ {0x91,0xF4}, {0x91,0xF5}, {0x91,0xF6}, {0x91,0xF7},
+ {0x91,0xF8}, {0x91,0xF9}, {0x91,0xFA}, {0x91,0xFB},
+ {0x91,0xFC}, {0x91,0xFD}, {0x91,0xFE}, {0x92,0x40},
+ {0x92,0x41}, {0x92,0x42}, {0x92,0x43}, {0x92,0x42},
+ {0x92,0x45}, {0x92,0x46}, {0x92,0x47}, {0x92,0x48},
+ {0x92,0x49}, {0x92,0x4A}, {0x92,0x4B}, {0x92,0x4C},
+ {0x92,0x4D}, {0x92,0x4E}, {0x92,0x4F}, {0x92,0x50},
+ {0x92,0x51}, {0x92,0x52}, {0x92,0x53}, {0x92,0x54},
+ {0x92,0x55}, {0x92,0x56}, {0x92,0x57}, {0x92,0x58},
+ {0x92,0x59}, {0x92,0x5A}, {0x92,0x5B}, {0x92,0x5C},
+ {0x92,0x5D}, {0x92,0x5E}, {0x92,0x5F}, {0x92,0x60},
+ {0x92,0x61}, {0x92,0x62}, {0x92,0x63}, {0x92,0x64},
+ {0x92,0x65}, {0x92,0x66}, {0x92,0x67}, {0x92,0x68},
+ {0x92,0x69}, {0x92,0x6A}, {0x92,0x6B}, {0x92,0x6C},
+ {0x92,0x6D}, {0x92,0x6E}, {0x92,0x6F}, {0x92,0x70},
+ {0x92,0x71}, {0x92,0x72}, {0x92,0x73}, {0x92,0x74},
+ {0x92,0x75}, {0x92,0x76}, {0x92,0x77}, {0x92,0x78},
+ {0x92,0x79}, {0x92,0x7A}, {0x92,0x7B}, {0x92,0x7C},
+ {0x92,0x7D}, {0x92,0x7E}, {0x92,0xA1}, {0x92,0xA2},
+ {0x92,0xA3}, {0x92,0xA4}, {0x92,0xA5}, {0x92,0xA6},
+ {0x92,0xA7}, {0x92,0xA8}, {0x92,0xA9}, {0x92,0xAA},
+ {0x92,0xAB}, {0x92,0xAC}, {0x92,0xAD}, {0x92,0xAE},
+ {0xA2,0x59}, {0xA2,0x5A}, {0xA2,0x5C}, {0xA2,0x5B},
+ {0x92,0xB3}, {0x92,0xB4}, {0x92,0xB5}, {0x92,0xB6},
+ {0x92,0xB7}, {0x92,0xB8}, {0x92,0xB9}, {0x92,0xBA},
+ {0x92,0xBB}, {0x92,0xBC}, {0x92,0xBD}, {0x92,0xBE},
+ {0x92,0xBF}, {0x92,0xC0}, {0x92,0xC1}, {0x92,0xC2},
+ {0x92,0xC3}, {0x92,0xC4}, {0x92,0xC5}, {0x92,0xC6},
+ {0x92,0xC7}, {0xA0,0x5F}, {0x92,0xC9}, {0x92,0xCA},
+ {0x92,0xCB}, {0x92,0xCC}, {0x92,0xCD}, {0x92,0xCE},
+ {0x92,0xCF}, {0x92,0xD0}, {0xE6,0xAB}, {0x92,0xD2},
+ {0x92,0xD3}, {0x92,0xD4}, {0x92,0xD5}, {0x92,0xD6},
+ {0x92,0xD7}, {0x92,0xD8}, {0x92,0xD9}, {0x92,0xDA},
+ {0x92,0xDB}, {0x92,0xDC}, {0x92,0xDD}, {0x92,0xDE},
+ {0x92,0xDF}, {0x92,0xE0}, {0x92,0xE1}, {0x92,0xE2},
+ {0x92,0xE3}, {0x92,0xE4}, {0x92,0xE5}, {0x92,0xE6},
+ {0x92,0xE7}, {0x92,0xE8}, {0x92,0xE9}, {0x92,0xEA},
+ {0x92,0xEB}, {0x92,0xEC}, {0x92,0xED}, {0x92,0xEE},
+ {0x92,0xEF}, {0x92,0xF0}, {0x92,0xF1}, {0x92,0xF2},
+ {0x92,0xF3}, {0x92,0xF4}, {0x92,0xF5}, {0x92,0xF6},
+ {0x92,0xF7}, {0x92,0xF8}, {0x92,0xF9}, {0x92,0xFA},
+ {0x92,0xFB}, {0x92,0xFC}, {0x92,0xFD}, {0x92,0xFE},
+ {0x93,0x40}, {0x93,0x41}, {0x93,0x42}, {0x93,0x43},
+ {0x93,0x44}, {0x93,0x45}, {0x93,0x46}, {0x93,0x47},
+ {0x93,0x48}, {0x93,0x49}, {0x93,0x4A}, {0x93,0x4B},
+ {0x93,0x4C}, {0x93,0x4D}, {0x93,0x4E}, {0x93,0x4F},
+ {0x93,0x50}, {0x93,0x51}, {0x93,0x52}, {0x93,0x53},
+ {0x93,0x54}, {0x93,0x55}, {0x93,0x56}, {0x93,0x57},
+ {0x93,0x58}, {0x93,0x59}, {0x93,0x5A}, {0x93,0x5B},
+ {0x93,0x5C}, {0x93,0x5D}, {0x93,0x5E}, {0x93,0x5F},
+ {0x93,0x60}, {0x93,0x61}, {0x93,0x62}, {0x93,0x63},
+ {0x93,0x64}, {0x93,0x65}, {0x93,0x66}, {0x93,0x67},
+ {0x93,0x68}, {0x93,0x69}, {0x93,0x6A}, {0x93,0x6B},
+ {0x93,0x6C}, {0x93,0x6D}, {0x93,0x6E}, {0x93,0x6F},
+ {0x93,0x70}, {0x93,0x71}, {0x93,0x72}, {0x93,0x73},
+ {0x93,0x74}, {0x93,0x75}, {0x93,0x76}, {0x93,0x77},
+ {0x93,0x78}, {0x93,0x79}, {0x93,0x7A}, {0x93,0x7B},
+ {0x93,0x7C}, {0x93,0x7D}, {0x93,0x7E}, {0x93,0xA1},
+ {0x93,0xA2}, {0x93,0xA3}, {0x93,0xA4}, {0x93,0xA5},
+ {0x93,0xA6}, {0x93,0xA7}, {0x93,0xA8}, {0x93,0xA9},
+ {0x93,0xAA}, {0x93,0xAB}, {0x93,0xAC}, {0x93,0xAD},
+ {0x93,0xAE}, {0x93,0xAF}, {0x93,0xB0}, {0x93,0xB1},
+ {0x93,0xB2}, {0x93,0xB3}, {0x93,0xB4}, {0x93,0xB5},
+ {0x93,0xB6}, {0x93,0xB7}, {0x93,0xB8}, {0x93,0xB9},
+ {0x93,0xBA}, {0x93,0xBB}, {0x93,0xBC}, {0x93,0xBD},
+ {0x93,0xBE}, {0x93,0xBF}, {0x93,0xC0}, {0x93,0xC1},
+ {0x93,0xC2}, {0x93,0xC3}, {0x93,0xC4}, {0x93,0xC5},
+ {0x93,0xC6}, {0x93,0xC7}, {0x93,0xC8}, {0x93,0xC9},
+ {0x93,0xCA}, {0x93,0xCB}, {0x93,0xCC}, {0x93,0xCD},
+ {0x93,0xCE}, {0x93,0xCF}, {0x93,0xD0}, {0x93,0xD1},
+ {0x93,0xD2}, {0x93,0xD3}, {0x93,0xD4}, {0x93,0xD5},
+ {0x93,0xD6}, {0x93,0xD7}, {0x93,0xD8}, {0x93,0xD9},
+ {0x93,0xDA}, {0x93,0xDB}, {0x93,0xDC}, {0x93,0xDD},
+ {0x93,0xDE}, {0x93,0xDF}, {0x93,0xE0}, {0x93,0xE1},
+ {0x93,0xE2}, {0x93,0xE3}, {0x93,0xE4}, {0x93,0xE5},
+ {0x93,0xE6}, {0x93,0xE7}, {0x93,0xE8}, {0x93,0xE9},
+ {0x93,0xEA}, {0x93,0xEB}, {0x93,0xEC}, {0x93,0xED},
+ {0x93,0xEE}, {0x93,0xEF}, {0x93,0xF0}, {0x93,0xF1},
+ {0x93,0xF2}, {0x93,0xF3}, {0x93,0xF4}, {0x93,0xF5},
+ {0x93,0xF6}, {0x93,0xF7}, {0x93,0xF8}, {0x93,0xF9},
+ {0x93,0xFA}, {0x93,0xFB}, {0x93,0xFC}, {0x93,0xFD},
+ {0x93,0xFE}, {0x94,0x40}, {0x94,0x41}, {0x94,0x42},
+ {0x94,0x43}, {0x94,0x44}, {0x94,0x45}, {0x94,0x46},
+ {0xD2,0x56}, {0x94,0x48}, {0x94,0x49}, {0x94,0x4A},
+ {0x94,0x4B}, {0x94,0x4C}, {0x94,0x4D}, {0x94,0x4E},
+ {0x94,0x4F}, {0x94,0x50}, {0x94,0x51}, {0x94,0x52},
+ {0x94,0x53}, {0x94,0x54}, {0x94,0x55}, {0x94,0x56},
+ {0x94,0x57}, {0x94,0x58}, {0x94,0x59}, {0x94,0x5A},
+ {0x94,0x5B}, {0x94,0x5C}, {0x94,0x5D}, {0x94,0x5E},
+ {0x94,0x5F}, {0x94,0x60}, {0x94,0x61}, {0x94,0x62},
+ {0x94,0x63}, {0x94,0x64}, {0x94,0x65}, {0x94,0x66},
+ {0x94,0x67}, {0x94,0x68}, {0x94,0x69}, {0x94,0x6A},
+ {0x94,0x6B}, {0x94,0x6C}, {0x94,0x6D}, {0x94,0x6E},
+ {0x94,0x6F}, {0x94,0x70}, {0x94,0x71}, {0x94,0x72},
+ {0x94,0x73}, {0x94,0x74}, {0x94,0x75}, {0x94,0x76},
+ {0x94,0x77}, {0x94,0x78}, {0x94,0x79}, {0x94,0x7A},
+ {0x94,0x7B}, {0x94,0x7C}, {0x94,0x7D}, {0x94,0x7E},
+ {0x94,0xA1}, {0x94,0xA2}, {0x94,0xA3}, {0x94,0xA4},
+ {0x94,0xA5}, {0x94,0xA6}, {0x94,0xA7}, {0x94,0xA8},
+ {0x94,0xA9}, {0x94,0xAA}, {0x94,0xAB}, {0x94,0xAC},
+ {0x94,0xAD}, {0x94,0xAE}, {0x94,0xAF}, {0x94,0xB0},
+ {0x94,0xB1}, {0x94,0xB2}, {0x94,0xB3}, {0x94,0xB4},
+ {0x94,0xB5}, {0x94,0xB6}, {0x94,0xB7}, {0x94,0xB8},
+ {0x94,0xB9}, {0x94,0xBA}, {0x94,0xBB}, {0x94,0xBC},
+ {0x94,0xBD}, {0x94,0xBE}, {0x94,0xBF}, {0x94,0xC0},
+ {0x94,0xC1}, {0x94,0xC2}, {0x94,0xC3}, {0x94,0xC4},
+ {0x94,0xC5}, {0x94,0xC6}, {0x94,0xC7}, {0x94,0xC8},
+ {0x94,0xC9}, {0xE6,0xD0}, {0x94,0xCB}, {0x94,0xCC},
+ {0x94,0xCD}, {0x94,0xCE}, {0x94,0xCF}, {0x94,0xD0},
+ {0x94,0xD1}, {0x94,0xD2}, {0x94,0xD3}, {0x94,0xD4},
+ {0x94,0xD5}, {0x94,0xD6}, {0x94,0xD7}, {0x94,0xD8},
+ {0x94,0xD9}, {0x94,0xDA}, {0x94,0xDB}, {0x94,0xDC},
+ {0x94,0xDD}, {0x94,0xDE}, {0x94,0xDF}, {0x94,0xE0},
+ {0x94,0xE1}, {0x94,0xE2}, {0x94,0xE3}, {0x94,0xE4},
+ {0x94,0xE5}, {0x94,0xE6}, {0x94,0xE7}, {0x94,0xE8},
+ {0x94,0xE9}, {0x94,0xEA}, {0x94,0xEB}, {0x94,0xEC},
+ {0x94,0xED}, {0x94,0xEE}, {0x94,0xEF}, {0x94,0xF0},
+ {0x94,0xF1}, {0x94,0xF2}, {0x94,0xF3}, {0x94,0xF4},
+ {0x94,0xF5}, {0x94,0xF6}, {0x94,0xF7}, {0x94,0xF8},
+ {0x94,0xF9}, {0x94,0xFA}, {0x94,0xFB}, {0x94,0xFC},
+ {0x94,0xFD}, {0x94,0xFE}, {0x95,0x40}, {0x95,0x41},
+ {0x95,0x42}, {0x95,0x43}, {0x95,0x44}, {0x95,0x45},
+ {0x95,0x46}, {0x95,0x47}, {0x95,0x48}, {0x95,0x49},
+ {0x95,0x4A}, {0x95,0x4B}, {0x95,0x4C}, {0x95,0x4D},
+ {0x95,0x4E}, {0x95,0x4F}, {0x95,0x50}, {0x95,0x51},
+ {0x95,0x52}, {0x95,0x53}, {0x95,0x54}, {0x95,0x55},
+ {0x95,0x56}, {0x95,0x57}, {0x95,0x58}, {0x95,0x59},
+ {0x95,0x5A}, {0x95,0x5B}, {0x95,0x5C}, {0x95,0x5D},
+ {0x95,0x5E}, {0x95,0x5F}, {0x95,0x60}, {0x95,0x61},
+ {0x95,0x62}, {0x95,0x63}, {0x95,0x64}, {0x95,0x65},
+ {0x95,0x66}, {0x95,0x67}, {0x95,0x68}, {0x95,0x69},
+ {0x95,0x6A}, {0x95,0x6B}, {0x95,0x6C}, {0x95,0x6D},
+ {0x95,0x6E}, {0x95,0x6F}, {0x95,0x70}, {0x95,0x71},
+ {0x95,0x72}, {0x95,0x73}, {0x95,0x74}, {0x95,0x75},
+ {0x95,0x76}, {0x95,0x77}, {0x95,0x78}, {0x95,0x79},
+ {0x95,0x7A}, {0x95,0x7B}, {0x95,0x7C}, {0x95,0x7D},
+ {0x95,0x7E}, {0x95,0xA1}, {0x95,0xA2}, {0x95,0xA3},
+ {0x95,0xA4}, {0x95,0xA5}, {0x95,0xA6}, {0x95,0xA7},
+ {0x95,0xA8}, {0x95,0xA9}, {0x95,0xAA}, {0x95,0xAB},
+ {0x95,0xAC}, {0x95,0xAD}, {0x95,0xAE}, {0x95,0xAF},
+ {0x95,0xB0}, {0x95,0xB1}, {0x95,0xB2}, {0x95,0xB3},
+ {0x95,0xB4}, {0x95,0xB5}, {0x95,0xB6}, {0x95,0xB7},
+ {0x95,0xB8}, {0x95,0xB9}, {0x95,0xBA}, {0x95,0xBB},
+ {0x95,0xBC}, {0x95,0xBD}, {0x95,0xBE}, {0x95,0xBF},
+ {0x95,0xC0}, {0x95,0xC1}, {0x95,0xC2}, {0x95,0xC3},
+ {0x95,0xC4}, {0x95,0xC5}, {0x95,0xC6}, {0x95,0xC7},
+ {0x95,0xC8}, {0x95,0xC9}, {0x95,0xCA}, {0x95,0xCB},
+ {0x95,0xCC}, {0x95,0xCD}, {0x95,0xCE}, {0x95,0xCF},
+ {0x95,0xD0}, {0x95,0xD1}, {0x95,0xD2}, {0x95,0xD3},
+ {0x95,0xD4}, {0x95,0xD5}, {0x95,0xD6}, {0x95,0xD7},
+ {0x95,0xD8}, {0xCA,0x52}, {0x95,0xDA}, {0x95,0xDB},
+ {0x95,0xDC}, {0x95,0xDD}, {0x95,0xDE}, {0x95,0xDF},
+ {0x95,0xE0}, {0x95,0xE1}, {0x95,0xE2}, {0x95,0xE3},
+ {0x95,0xE4}, {0x95,0xE5}, {0x95,0xE6}, {0x95,0xE7},
+ {0x95,0xE8}, {0x95,0xE9}, {0x95,0xEA}, {0x95,0xEB},
+ {0x95,0xEC}, {0x95,0xED}, {0x95,0xEE}, {0x95,0xEF},
+ {0x95,0xF0}, {0x95,0xF1}, {0x95,0xF2}, {0x95,0xF3},
+ {0x95,0xF4}, {0x95,0xF5}, {0x95,0xF6}, {0x95,0xF7},
+ {0x95,0xF8}, {0x95,0xF9}, {0x95,0xFA}, {0x95,0xFB},
+ {0x95,0xFC}, {0x95,0xFD}, {0x95,0xFE}, {0x96,0x40},
+ {0x96,0x41}, {0x96,0x42}, {0x96,0x43}, {0x9C,0xE4},
+ {0x96,0x45}, {0x96,0x46}, {0x96,0x47}, {0x96,0x48},
+ {0x96,0x49}, {0x96,0x4A}, {0x96,0x4B}, {0x96,0x4C},
+ {0x96,0x4D}, {0x96,0x4E}, {0x96,0x4F}, {0x96,0x50},
+ {0x96,0x51}, {0x96,0x52}, {0x96,0x53}, {0x96,0x54},
+ {0x96,0x55}, {0x96,0x56}, {0x96,0x57}, {0x96,0x58},
+ {0x96,0x59}, {0x96,0x5A}, {0x96,0x5B}, {0x96,0x5C},
+ {0x96,0x5D}, {0x96,0x5E}, {0x96,0x5F}, {0x96,0x60},
+ {0x96,0x61}, {0x96,0x62}, {0x96,0x63}, {0x96,0x64},
+ {0x96,0x65}, {0x96,0x66}, {0x96,0x67}, {0x96,0x68},
+ {0x96,0x69}, {0x96,0x6A}, {0x96,0x6B}, {0x96,0x6C},
+ {0x96,0x6D}, {0x96,0x6E}, {0x96,0x6F}, {0x96,0x70},
+ {0x96,0x71}, {0x96,0x72}, {0x96,0x73}, {0x96,0x74},
+ {0x96,0x75}, {0x96,0x76}, {0x96,0x77}, {0x96,0x78},
+ {0x96,0x79}, {0x96,0x7A}, {0x96,0x7B}, {0x96,0x7C},
+ {0x96,0x7D}, {0x96,0x7E}, {0x96,0xA1}, {0x96,0xA2},
+ {0x96,0xA3}, {0x96,0xA4}, {0x96,0xA5}, {0x96,0xA6},
+ {0x96,0xA7}, {0x96,0xA8}, {0x96,0xA9}, {0x96,0xAA},
+ {0x96,0xAB}, {0x96,0xAC}, {0x96,0xAD}, {0x96,0xAE},
+ {0x96,0xAF}, {0x96,0xB0}, {0x96,0xB1}, {0x96,0xB2},
+ {0x96,0xB3}, {0x96,0xB4}, {0x96,0xB5}, {0x96,0xB6},
+ {0x96,0xB7}, {0x96,0xB8}, {0x96,0xB9}, {0x96,0xBA},
+ {0x96,0xBB}, {0x96,0xBC}, {0x96,0xBD}, {0x96,0xBE},
+ {0x96,0xBF}, {0x96,0xC0}, {0x96,0xC1}, {0x96,0xC2},
+ {0x96,0xC3}, {0x96,0xC4}, {0x96,0xC5}, {0x96,0xC6},
+ {0x96,0xC7}, {0x96,0xC8}, {0x96,0xC9}, {0x96,0xCA},
+ {0x96,0xCB}, {0x96,0xCC}, {0x96,0xCD}, {0x96,0xCE},
+ {0x96,0xCF}, {0x96,0xD0}, {0x96,0xD1}, {0x96,0xD2},
+ {0x96,0xD3}, {0x96,0xD4}, {0x96,0xD5}, {0x96,0xD6},
+ {0x96,0xD7}, {0x96,0xD8}, {0x96,0xD9}, {0x96,0xDA},
+ {0x96,0xDB}, {0x96,0xDC}, {0x96,0xDD}, {0x96,0xDE},
+ {0x96,0xDF}, {0x96,0xE0}, {0x96,0xE1}, {0x96,0xE2},
+ {0x96,0xE3}, {0x96,0xE4}, {0x96,0xE5}, {0x96,0xE6},
+ {0x96,0xE7}, {0x96,0xE8}, {0x96,0xE9}, {0x96,0xEA},
+ {0x96,0xEB}, {0x96,0xEC}, {0x96,0xEE}, {0x96,0xEE},
+ {0x96,0xEF}, {0x96,0xF0}, {0x96,0xF1}, {0x96,0xF2},
+ {0x96,0xF3}, {0x96,0xF4}, {0x96,0xF5}, {0x96,0xF6},
+ {0x96,0xF7}, {0x96,0xF8}, {0x96,0xF9}, {0x96,0xFA},
+ {0x96,0xFB}, {0xE9,0x59}, {0x96,0xFD}, {0x96,0xFE},
+ {0x97,0x40}, {0x97,0x41}, {0x97,0x42}, {0x97,0x43},
+ {0x97,0x44}, {0x97,0x45}, {0x97,0x46}, {0x97,0x47},
+ {0x97,0x48}, {0x97,0x49}, {0x97,0x4A}, {0x97,0x4B},
+ {0x97,0x4C}, {0x97,0x4D}, {0x97,0x4E}, {0x97,0x4F},
+ {0x97,0x50}, {0x97,0x51}, {0x97,0x52}, {0x97,0x53},
+ {0x97,0x54}, {0x97,0x55}, {0x97,0x56}, {0x97,0x57},
+ {0x97,0x58}, {0x97,0x59}, {0x97,0x5A}, {0x97,0x5B},
+ {0x97,0x5C}, {0x97,0x5D}, {0x97,0x5E}, {0x97,0x5F},
+ {0x97,0x60}, {0x97,0x61}, {0x97,0x62}, {0x97,0x63},
+ {0x97,0x64}, {0x97,0x65}, {0x97,0x66}, {0x97,0x67},
+ {0x97,0x68}, {0x97,0x69}, {0x97,0x6A}, {0x97,0x6B},
+ {0x97,0x6C}, {0x97,0x6D}, {0x97,0x6E}, {0x97,0x6F},
+ {0x97,0x70}, {0x97,0x71}, {0x97,0x72}, {0x97,0x73},
+ {0x97,0x74}, {0x97,0x75}, {0x97,0x76}, {0x97,0x77},
+ {0x97,0x78}, {0x97,0x79}, {0x97,0x7A}, {0x97,0x7B},
+ {0x97,0x7C}, {0x97,0x7D}, {0x97,0x7E}, {0x97,0xA1},
+ {0x97,0xA2}, {0x97,0xA3}, {0x97,0xA4}, {0x97,0xA5},
+ {0x97,0xA6}, {0x97,0xA7}, {0x97,0xA8}, {0x97,0xA9},
+ {0x97,0xAA}, {0x97,0xAB}, {0x97,0xAC}, {0x97,0xAD},
+ {0x97,0xAE}, {0x97,0xAF}, {0x97,0xB0}, {0x97,0xB1},
+ {0x97,0xB2}, {0x97,0xB3}, {0x97,0xB4}, {0x97,0xB5},
+ {0x97,0xB6}, {0x97,0xB7}, {0x97,0xB8}, {0x97,0xB9},
+ {0x97,0xBA}, {0x97,0xBB}, {0x97,0xBC}, {0x97,0xBD},
+ {0x97,0xBE}, {0x97,0xBF}, {0x97,0xC0}, {0x97,0xC1},
+ {0x97,0xC2}, {0x97,0xC3}, {0x97,0xC4}, {0x97,0xC5},
+ {0x97,0xC6}, {0x97,0xC7}, {0x97,0xC8}, {0x97,0xC9},
+ {0x97,0xCA}, {0x97,0xCB}, {0x97,0xCC}, {0x97,0xCD},
+ {0x97,0xCE}, {0x97,0xCF}, {0x97,0xD0}, {0x97,0xD1},
+ {0x97,0xD2}, {0x97,0xD3}, {0x97,0xD4}, {0x97,0xD5},
+ {0x97,0xD6}, {0x97,0xD7}, {0x97,0xD8}, {0x97,0xD9},
+ {0x97,0xDA}, {0x97,0xDB}, {0x97,0xDC}, {0x97,0xDD},
+ {0x97,0xDE}, {0x97,0xDF}, {0x97,0xE0}, {0x97,0xE1},
+ {0x97,0xE2}, {0x97,0xE3}, {0x97,0xE4}, {0x97,0xE5},
+ {0x97,0xE6}, {0x97,0xE7}, {0x97,0xE8}, {0x97,0xE9},
+ {0x97,0xEA}, {0x97,0xEB}, {0x97,0xEC}, {0x97,0xED},
+ {0x97,0xEE}, {0x97,0xEF}, {0x97,0xF0}, {0x97,0xF1},
+ {0x97,0xF2}, {0x97,0xF3}, {0x97,0xF4}, {0x97,0xF5},
+ {0x97,0xF6}, {0x97,0xF7}, {0x97,0xF8}, {0x97,0xF9},
+ {0x97,0xFA}, {0x97,0xFB}, {0x97,0xFC}, {0x97,0xFD},
+ {0x97,0xFE}, {0x98,0x40}, {0x98,0x41}, {0x98,0x42},
+ {0x98,0x43}, {0x98,0x44}, {0x98,0x45}, {0x98,0x46},
+ {0x98,0x47}, {0x98,0x48}, {0x98,0x49}, {0x98,0x4A},
+ {0x98,0x4B}, {0x98,0x4C}, {0x98,0x4D}, {0x98,0x4E},
+ {0x98,0x4F}, {0x98,0x50}, {0x98,0x51}, {0x98,0x52},
+ {0x98,0x53}, {0x98,0x54}, {0x98,0x55}, {0x98,0x56},
+ {0x98,0x57}, {0x98,0x58}, {0x98,0x59}, {0x98,0x5A},
+ {0x98,0x5B}, {0x98,0x5C}, {0x98,0x5D}, {0x98,0x5E},
+ {0x98,0x5F}, {0x98,0x60}, {0x98,0x61}, {0x98,0x62},
+ {0x98,0x63}, {0x98,0x64}, {0x98,0x65}, {0x98,0x66},
+ {0x98,0x67}, {0x98,0x68}, {0x98,0x69}, {0x98,0x6A},
+ {0x98,0x6B}, {0x98,0x6C}, {0x98,0x6D}, {0x98,0x6E},
+ {0x98,0x6F}, {0x98,0x70}, {0x98,0x71}, {0x98,0x72},
+ {0x98,0x73}, {0x98,0x74}, {0x98,0x75}, {0x98,0x76},
+ {0x98,0x77}, {0x98,0x78}, {0x98,0x79}, {0x98,0x7A},
+ {0x98,0x7B}, {0x98,0x7C}, {0x98,0x7D}, {0x98,0x7E},
+ {0x98,0xA1}, {0x98,0xA2}, {0x98,0xA3}, {0x98,0xA4},
+ {0x98,0xA5}, {0x98,0xA6}, {0x98,0xA7}, {0x98,0xA8},
+ {0x98,0xA9}, {0x98,0xAA}, {0x98,0xAB}, {0x98,0xAC},
+ {0x98,0xAD}, {0x98,0xAE}, {0x98,0xAF}, {0x98,0xB0},
+ {0x98,0xB1}, {0x98,0xB2}, {0x98,0xB3}, {0x98,0xB4},
+ {0x98,0xB5}, {0x98,0xB6}, {0x98,0xB7}, {0x98,0xB8},
+ {0x98,0xB9}, {0x98,0xBA}, {0x98,0xBB}, {0x98,0xBC},
+ {0x98,0xBD}, {0x98,0xBE}, {0x98,0xBF}, {0x98,0xC0},
+ {0x98,0xC1}, {0x98,0xC2}, {0x98,0xC3}, {0x98,0xC4},
+ {0x98,0xC5}, {0x98,0xC6}, {0x98,0xC7}, {0x98,0xC8},
+ {0x98,0xC9}, {0x98,0xCA}, {0x98,0xCB}, {0x98,0xCC},
+ {0x98,0xCD}, {0x98,0xCE}, {0x98,0xCF}, {0x98,0xD0},
+ {0x98,0xD1}, {0x98,0xD2}, {0x98,0xD3}, {0x98,0xD4},
+ {0x98,0xD5}, {0x98,0xD6}, {0x98,0xD7}, {0x98,0xD8},
+ {0x98,0xD9}, {0x98,0xDA}, {0x98,0xDB}, {0x98,0xDC},
+ {0x98,0xDD}, {0x98,0xDE}, {0x98,0xDF}, {0x98,0xE0},
+ {0x98,0xE1}, {0x98,0xE2}, {0x98,0xE3}, {0x98,0xE4},
+ {0x98,0xE5}, {0x98,0xE6}, {0x98,0xE7}, {0x98,0xE8},
+ {0x98,0xE9}, {0x98,0xEA}, {0x98,0xEB}, {0x98,0xEC},
+ {0x98,0xED}, {0x98,0xEE}, {0x98,0xEF}, {0x98,0xF0},
+ {0x98,0xF1}, {0x98,0xF2}, {0x98,0xF3}, {0x98,0xF4},
+ {0x98,0xF5}, {0x98,0xF6}, {0x98,0xF7}, {0x98,0xF8},
+ {0x98,0xF9}, {0x98,0xFA}, {0x98,0xFB}, {0x98,0xFC},
+ {0x98,0xFD}, {0x98,0xFE}, {0x99,0x40}, {0x99,0x41},
+ {0x99,0x42}, {0x99,0x43}, {0x99,0x44}, {0x99,0x45},
+ {0x99,0x46}, {0x99,0x47}, {0x99,0x48}, {0x99,0x49},
+ {0x99,0x4A}, {0x99,0x4B}, {0x99,0x4C}, {0x99,0x4D},
+ {0x99,0x4E}, {0x99,0x4F}, {0x99,0x50}, {0x99,0x51},
+ {0x99,0x52}, {0x99,0x53}, {0x99,0x54}, {0x99,0x55},
+ {0x99,0x56}, {0x99,0x57}, {0x99,0x58}, {0x99,0x59},
+ {0x99,0x5A}, {0x99,0x5B}, {0x99,0x5C}, {0x99,0x5D},
+ {0x99,0x5E}, {0x99,0x5F}, {0x99,0x60}, {0x99,0x61},
+ {0x99,0x62}, {0x99,0x63}, {0x99,0x64}, {0x99,0x65},
+ {0x99,0x66}, {0x99,0x67}, {0x99,0x68}, {0x99,0x69},
+ {0x99,0x6A}, {0x99,0x6B}, {0x99,0x6C}, {0x99,0x6D},
+ {0x99,0x6E}, {0x99,0x6F}, {0x99,0x70}, {0x99,0x71},
+ {0x99,0x72}, {0x99,0x73}, {0x99,0x74}, {0x99,0x75},
+ {0x99,0x76}, {0x99,0x77}, {0x99,0x78}, {0x99,0x79},
+ {0x99,0x7A}, {0x99,0x7B}, {0x99,0x7C}, {0x99,0x7D},
+ {0x99,0x7E}, {0x99,0xA1}, {0x99,0xA2}, {0x99,0xA3},
+ {0x99,0xA4}, {0x99,0xA5}, {0x99,0xA6}, {0x99,0xA7},
+ {0x99,0xA8}, {0x99,0xA9}, {0x99,0xAA}, {0x99,0xAB},
+ {0x99,0xAC}, {0x99,0xAD}, {0x99,0xAE}, {0x99,0xAF},
+ {0x99,0xB0}, {0x99,0xB1}, {0x99,0xB2}, {0x99,0xB3},
+ {0x99,0xB4}, {0x99,0xB5}, {0x99,0xB6}, {0x99,0xB7},
+ {0x99,0xB8}, {0x99,0xB9}, {0x99,0xBA}, {0x99,0xBB},
+ {0x99,0xBC}, {0x99,0xBD}, {0x99,0xBE}, {0x99,0xBF},
+ {0x99,0xC0}, {0x99,0xC1}, {0x99,0xC2}, {0x99,0xC3},
+ {0x99,0xC4}, {0x99,0xC5}, {0x99,0xC6}, {0x99,0xC7},
+ {0x99,0xC8}, {0x99,0xC9}, {0x99,0xCA}, {0x99,0xCB},
+ {0x99,0xCC}, {0x99,0xCD}, {0x99,0xCE}, {0x99,0xCF},
+ {0x99,0xD0}, {0x99,0xD1}, {0x99,0xD2}, {0x99,0xD3},
+ {0x99,0xD4}, {0x99,0xD5}, {0x99,0xD6}, {0x99,0xD7},
+ {0x99,0xD8}, {0x99,0xD9}, {0x99,0xDA}, {0x99,0xDB},
+ {0x99,0xDC}, {0x99,0xDD}, {0x99,0xDE}, {0x99,0xDF},
+ {0x99,0xE0}, {0x99,0xE1}, {0x99,0xE2}, {0x99,0xE3},
+ {0x99,0xE4}, {0x99,0xE5}, {0x99,0xE6}, {0x99,0xE7},
+ {0x99,0xE8}, {0x99,0xE9}, {0x99,0xEA}, {0x99,0xEB},
+ {0x99,0xEC}, {0x99,0xED}, {0x99,0xEE}, {0x99,0xEF},
+ {0x99,0xF0}, {0x99,0xF1}, {0x99,0xF2}, {0x99,0xF3},
+ {0x99,0xF4}, {0x99,0xF5}, {0x99,0xF6}, {0x99,0xF7},
+ {0x99,0xF8}, {0x99,0xF9}, {0x99,0xFA}, {0x99,0xFB},
+ {0x99,0xFC}, {0x99,0xFD}, {0x99,0xFE}, {0x9A,0x40},
+ {0x9A,0x41}, {0x9A,0x42}, {0x9A,0x43}, {0x9A,0x44},
+ {0x9A,0x45}, {0x9A,0x46}, {0x9A,0x47}, {0x9A,0x48},
+ {0x9A,0x49}, {0x9A,0x4A}, {0x9A,0x4B}, {0x9A,0x4C},
+ {0x9A,0x4D}, {0x9A,0x4E}, {0x9A,0x4F}, {0x9A,0x50},
+ {0x9A,0x51}, {0x9A,0x52}, {0x9A,0x53}, {0x9A,0x54},
+ {0x9A,0x55}, {0x9A,0x56}, {0x9A,0x57}, {0x9A,0x58},
+ {0x9A,0x59}, {0x9A,0x5A}, {0x9A,0x5B}, {0x9A,0x5C},
+ {0x9A,0x5D}, {0x9A,0x5E}, {0x9A,0x5F}, {0x9A,0x60},
+ {0x9A,0x61}, {0x9A,0x62}, {0x9A,0x63}, {0x9A,0x64},
+ {0x9A,0x65}, {0x9A,0x66}, {0x9A,0x67}, {0x9A,0x68},
+ {0x9A,0x69}, {0x9A,0x6A}, {0x9A,0x6B}, {0x9A,0x6C},
+ {0x9A,0x6D}, {0x9A,0x6E}, {0x9A,0x6F}, {0x9A,0x70},
+ {0x9A,0x71}, {0x9A,0x72}, {0x9A,0x73}, {0x9A,0x74},
+ {0x9A,0x75}, {0x9A,0x76}, {0x9A,0x77}, {0x9A,0x78},
+ {0x9A,0x79}, {0x9A,0x7A}, {0x9A,0x7B}, {0x9A,0x7C},
+ {0x9A,0x7D}, {0x9A,0x7E}, {0x9A,0xA1}, {0x9A,0xA2},
+ {0x9A,0xA3}, {0x9A,0xA4}, {0x9A,0xA5}, {0x9A,0xA6},
+ {0x9A,0xA7}, {0x9A,0xA8}, {0x9A,0xA9}, {0x9A,0xAA},
+ {0x9A,0xAB}, {0x9A,0xAC}, {0x9A,0xAD}, {0x9A,0xAE},
+ {0x9A,0xAF}, {0x9A,0xB0}, {0x9A,0xB1}, {0x9A,0xB2},
+ {0x9A,0xB3}, {0x9A,0xB4}, {0x9A,0xB5}, {0x9A,0xB6},
+ {0x9A,0xB7}, {0x9A,0xB8}, {0x9A,0xB9}, {0x9A,0xBA},
+ {0x9A,0xBB}, {0x9A,0xBC}, {0x9A,0xBD}, {0x9A,0xBE},
+ {0x9A,0xBF}, {0x9A,0xC0}, {0x9A,0xC1}, {0x9A,0xC2},
+ {0x9A,0xC3}, {0x9A,0xC4}, {0x9A,0xC5}, {0x9A,0xC6},
+ {0x9A,0xC7}, {0x9A,0xC8}, {0x9A,0xC9}, {0x9A,0xCA},
+ {0x9A,0xCB}, {0x9A,0xCC}, {0x9A,0xCD}, {0x9A,0xCE},
+ {0x9A,0xCF}, {0x9A,0xD0}, {0x9A,0xD1}, {0x9A,0xD2},
+ {0x9A,0xD3}, {0x9A,0xD4}, {0x9A,0xD5}, {0x9A,0xD6},
+ {0x9A,0xD7}, {0x9A,0xD8}, {0x9A,0xD9}, {0x9A,0xDA},
+ {0x9A,0xDB}, {0x9A,0xDC}, {0x9A,0xDD}, {0x9A,0xDE},
+ {0x9A,0xDF}, {0x9A,0xE0}, {0x9A,0xE1}, {0x9A,0xE2},
+ {0x9A,0xE3}, {0x9A,0xE4}, {0x9A,0xE5}, {0x9A,0xE6},
+ {0x9A,0xE7}, {0x9A,0xE8}, {0x9A,0xE9}, {0x9A,0xEA},
+ {0x9A,0xEB}, {0x9A,0xEC}, {0x9A,0xED}, {0x9A,0xEE},
+ {0x9A,0xEF}, {0x9A,0xF0}, {0x9A,0xF1}, {0x9A,0xF2},
+ {0x9A,0xF3}, {0x9A,0xF4}, {0x9A,0xF5}, {0x9A,0xF6},
+ {0x9A,0xF7}, {0x9A,0xF8}, {0x9A,0xF9}, {0x9A,0xFA},
+ {0x9A,0xFB}, {0x9A,0xFC}, {0x9A,0xFD}, {0x9A,0xFE},
+ {0x9B,0x40}, {0x9B,0x41}, {0x9B,0x42}, {0x9B,0x43},
+ {0x9B,0x44}, {0x9B,0x45}, {0x9B,0x46}, {0x9B,0x47},
+ {0x9B,0x48}, {0x9B,0x49}, {0x9B,0x4A}, {0x9B,0x4B},
+ {0x9B,0x4C}, {0x9B,0x4D}, {0x9B,0x4E}, {0x9B,0x4F},
+ {0x9B,0x50}, {0x9B,0x51}, {0x9B,0x52}, {0x9B,0x53},
+ {0x9B,0x54}, {0x9B,0x55}, {0x9B,0x56}, {0x9B,0x57},
+ {0x9B,0x58}, {0x9B,0x59}, {0x9B,0x5A}, {0x9B,0x5B},
+ {0x9B,0x5C}, {0x9B,0x5D}, {0x9B,0x5E}, {0x9B,0x5F},
+ {0x9B,0x60}, {0x9B,0x61}, {0x9B,0x62}, {0x9B,0x63},
+ {0x9B,0x64}, {0x9B,0x65}, {0x9B,0x66}, {0x9B,0x67},
+ {0x9B,0x68}, {0x9B,0x69}, {0x9B,0x6A}, {0x9B,0x6B},
+ {0x9B,0x6C}, {0x9B,0x6D}, {0x9B,0x6E}, {0x9B,0x6F},
+ {0x9B,0x70}, {0x9B,0x71}, {0x9B,0x72}, {0x9B,0x73},
+ {0x9B,0x74}, {0x9B,0x75}, {0xEF,0xF9}, {0x9B,0x77},
+ {0xC5,0xF7}, {0x9B,0x79}, {0x9B,0x7A}, {0xF5,0xE8},
+ {0x9B,0x7C}, {0x9B,0x7D}, {0x9B,0x7E}, {0x9B,0xA1},
+ {0x9B,0xA2}, {0x9B,0xA3}, {0x9B,0xA4}, {0x9B,0xA5},
+ {0x9B,0xA6}, {0x9B,0xA7}, {0x9B,0xA8}, {0x9B,0xA9},
+ {0x9B,0xAA}, {0x9B,0xAB}, {0x9B,0xAC}, {0x9B,0xAD},
+ {0x9B,0xAE}, {0x9B,0xAF}, {0x9B,0xB0}, {0x9B,0xB1},
+ {0x9B,0xB2}, {0x9B,0xB3}, {0x9B,0xB4}, {0x9B,0xB5},
+ {0x9B,0xB6}, {0x9B,0xB7}, {0x9B,0xB8}, {0x9B,0xB9},
+ {0x9B,0xBA}, {0x9B,0xBB}, {0x9B,0xBC}, {0x9B,0xBD},
+ {0x9B,0xBE}, {0x9B,0xBF}, {0x9B,0xC0}, {0x9B,0xC1},
+ {0x9B,0xC2}, {0x9B,0xC3}, {0x9B,0xC4}, {0x9B,0xC5},
+ {0xE8,0xCD}, {0x9B,0xC7}, {0x9B,0xC8}, {0x9B,0xC9},
+ {0x9B,0xCA}, {0x9B,0xCB}, {0x9B,0xCC}, {0x9B,0xCD},
+ {0x9B,0xCE}, {0x9B,0xCF}, {0x9B,0xD0}, {0x9B,0xD1},
+ {0x9B,0xD2}, {0x9B,0xD3}, {0x9B,0xD4}, {0x9B,0xD5},
+ {0x9B,0xD6}, {0x9B,0xD7}, {0x9B,0xD8}, {0x9B,0xD9},
+ {0x9B,0xDA}, {0x9B,0xDB}, {0x9B,0xDC}, {0x9B,0xDD},
+ {0xD0,0xC0}, {0x9B,0xDF}, {0x9B,0xE0}, {0x9B,0xE1},
+ {0x9B,0xE2}, {0x9B,0xE3}, {0x9B,0xE4}, {0x9B,0xE5},
+ {0x9B,0xE6}, {0x9B,0xE7}, {0x9B,0xE8}, {0x9B,0xE9},
+ {0x9B,0xEA}, {0x9B,0xEB}, {0xFD,0x64}, {0x9B,0xED},
+ {0x9B,0xEE}, {0x9B,0xEF}, {0x9B,0xF0}, {0x9B,0xF1},
+ {0x9B,0xF2}, {0x9B,0xF3}, {0x9B,0xF4}, {0x9B,0xF5},
+ {0xBF,0x47}, {0x9B,0xF7}, {0x9B,0xF8}, {0x9B,0xF9},
+ {0x9B,0xFA}, {0x9B,0xFB}, {0x9B,0xFC}, {0x9B,0xFD},
+ {0x9B,0xFE}, {0x9C,0x40}, {0x9C,0x41}, {0xEB,0xC9},
+ {0x9C,0x43}, {0x9C,0x44}, {0x9C,0x45}, {0x9C,0x46},
+ {0x9C,0x47}, {0x9C,0x48}, {0x9C,0x49}, {0x9C,0x4A},
+ {0x9C,0x4B}, {0x9C,0x4C}, {0x9C,0x4D}, {0x9C,0x4E},
+ {0x9C,0x4F}, {0x9C,0x50}, {0x9C,0x51}, {0x9C,0x52},
+ {0xCD,0xE7}, {0x9C,0x54}, {0x9C,0x55}, {0x9C,0x56},
+ {0x9C,0x57}, {0x9C,0x58}, {0x9C,0x59}, {0x9C,0x5A},
+ {0x9C,0x5B}, {0x9C,0x5C}, {0x9C,0x5D}, {0x9C,0x5E},
+ {0x9C,0x5F}, {0x9C,0x60}, {0x9C,0x61}, {0xC0,0xE7},
+ {0x9C,0x63}, {0x9C,0x64}, {0x9C,0x65}, {0x9C,0x66},
+ {0x9C,0x67}, {0xDC,0x52}, {0x9C,0x69}, {0x9C,0x6A},
+ {0xF8,0x6D}, {0x9C,0x6C}, {0x9C,0x6D}, {0x9C,0x6E},
+ {0x9C,0x6F}, {0x9C,0x70}, {0x9C,0x71}, {0x9C,0x72},
+ {0x9C,0x73}, {0x9C,0x74}, {0x9C,0x75}, {0x9C,0x76},
+ {0xDB,0x5D}, {0x9C,0x78}, {0x9C,0x79}, {0x9C,0x7A},
+ {0x9C,0x7B}, {0x9C,0x7C}, {0x9C,0x7D}, {0x9C,0x7E},
+ {0x9C,0xA1}, {0x9C,0xA2}, {0x9C,0xA3}, {0x9C,0xA4},
+ {0x9C,0xA5}, {0x9C,0xA6}, {0x9C,0xA7}, {0x9C,0xA8},
+ {0x9C,0xA9}, {0x9C,0xAA}, {0x9C,0xAB}, {0x9C,0xAC},
+ {0x9C,0xAD}, {0x9C,0xAE}, {0x9C,0xAF}, {0x9C,0xB0},
+ {0x9C,0xB1}, {0x9C,0xB2}, {0x9C,0xB3}, {0x9C,0xB4},
+ {0x9C,0xB5}, {0x9C,0xB6}, {0x9C,0xB7}, {0x9C,0xB8},
+ {0x9C,0xB9}, {0x9C,0xBA}, {0x9C,0xBB}, {0xC9,0x5C},
+ {0xAF,0xB0}, {0x9C,0xBE}, {0x9C,0xBF}, {0x9C,0xC0},
+ {0x9C,0xC1}, {0x9C,0xC2}, {0x9C,0xC3}, {0x9C,0xC4},
+ {0x9C,0xC5}, {0x9C,0xC6}, {0x9C,0xC7}, {0x9C,0xC8},
+ {0x9C,0xC9}, {0x9C,0xCA}, {0x9C,0xCB}, {0x9C,0xCC},
+ {0x9C,0xCD}, {0x9C,0xCE}, {0x9C,0xCF}, {0xD4,0xD1},
+ {0x9C,0xD1}, {0x9C,0xD2}, {0x9C,0xD3}, {0x9C,0xD4},
+ {0x9C,0xD5}, {0x9C,0xD6}, {0x9C,0xD7}, {0x9C,0xD8},
+ {0x9C,0xD9}, {0x9C,0xDA}, {0x9C,0xDB}, {0x9C,0xDC},
+ {0x9C,0xDD}, {0x9C,0xDE}, {0x9C,0xDF}, {0x9C,0xE0},
+ {0x9C,0xE1}, {0x9C,0xE2}, {0x9C,0xE3}, {0x9C,0xE4},
+ {0x9C,0xE5}, {0x9C,0xE6}, {0x9C,0xE7}, {0x9C,0xE8},
+ {0x9C,0xE9}, {0x9C,0xEA}, {0x9C,0xEB}, {0x9C,0xEC},
+ {0x9C,0xED}, {0x9C,0xEE}, {0x9C,0xEF}, {0x9C,0xF0},
+ {0x9C,0xF1}, {0x9C,0xF2}, {0x9C,0xF3}, {0x9C,0xF4},
+ {0x9C,0xF5}, {0x9C,0xF6}, {0x9C,0xF7}, {0x9C,0xF8},
+ {0x9C,0xF9}, {0x9C,0xFA}, {0x9C,0xFB}, {0x9C,0xFC},
+ {0x9C,0xFD}, {0x9C,0xFE}, {0x9D,0x40}, {0x9D,0x41},
+ {0x9D,0x42}, {0x9D,0x43}, {0x9D,0x44}, {0x9D,0x45},
+ {0x9D,0x46}, {0x9D,0x47}, {0x9D,0x48}, {0x9D,0x49},
+ {0x9D,0x4A}, {0x9D,0x4B}, {0x9D,0x4C}, {0x9D,0x4D},
+ {0x9D,0x4E}, {0x9D,0x4F}, {0x9D,0x50}, {0x9D,0x51},
+ {0x9D,0x52}, {0x9D,0x53}, {0x9D,0x54}, {0x9D,0x55},
+ {0x9D,0x56}, {0xE0,0x7C}, {0x9D,0x58}, {0x9D,0x59},
+ {0xB5,0xAE}, {0x9D,0x5B}, {0x9D,0x5C}, {0x9D,0x5D},
+ {0x9D,0x5E}, {0x9D,0x5F}, {0x9D,0x60}, {0x9D,0x61},
+ {0x9D,0x62}, {0x9D,0x63}, {0x9D,0x64}, {0x9D,0x65},
+ {0x9D,0x66}, {0x9D,0x67}, {0x9D,0x68}, {0x9D,0x69},
+ {0x9D,0x6A}, {0x9D,0x6B}, {0x9D,0x6C}, {0x9D,0x6D},
+ {0x9D,0x6E}, {0x9D,0x6F}, {0x9D,0x70}, {0x9D,0x71},
+ {0x9D,0x72}, {0x9D,0x73}, {0x9D,0x74}, {0x9D,0x75},
+ {0x9D,0x76}, {0x9D,0x77}, {0x9D,0x78}, {0x9D,0x79},
+ {0x9D,0x7A}, {0x9D,0x7B}, {0x9D,0x7C}, {0x9D,0x7D},
+ {0x9D,0x7E}, {0x9D,0xA1}, {0x9D,0xA2}, {0x9D,0xA3},
+ {0x9D,0xA4}, {0x9D,0xA5}, {0x9D,0xA6}, {0x9D,0xA7},
+ {0x9D,0xA8}, {0x9D,0xA9}, {0x9D,0xAA}, {0x9D,0xAB},
+ {0x9D,0xAC}, {0x9D,0xAD}, {0x9D,0xAE}, {0x9D,0xAF},
+ {0x9D,0xB0}, {0x9D,0xB1}, {0x9D,0xB2}, {0x9D,0xB3},
+ {0x9D,0xB4}, {0x9D,0xB5}, {0x9D,0xB6}, {0x9D,0xB7},
+ {0x9D,0xB8}, {0x9D,0xB9}, {0x9D,0xBA}, {0x9D,0xBB},
+ {0x9D,0xBC}, {0x9D,0xBD}, {0x9D,0xBE}, {0x9D,0xBF},
+ {0x9D,0xC0}, {0x9D,0xC1}, {0x9D,0xC2}, {0x9D,0xC3},
+ {0xA9,0xE4}, {0x9D,0xC5}, {0x9D,0xC6}, {0x9D,0xC7},
+ {0x9D,0xC8}, {0x9D,0xC9}, {0x9D,0xCA}, {0x9D,0xCB},
+ {0x9D,0xCC}, {0x9D,0xCD}, {0x9D,0xCE}, {0x9D,0xCF},
+ {0x9D,0xD0}, {0x9D,0xD1}, {0x9D,0xD2}, {0x9D,0xD3},
+ {0x9D,0xD4}, {0x9D,0xD5}, {0x9D,0xD6}, {0x9D,0xD7},
+ {0x9D,0xD8}, {0x9D,0xD9}, {0x9D,0xDA}, {0x9D,0xDB},
+ {0x9D,0xDC}, {0x9D,0xDD}, {0x9D,0xDE}, {0x9D,0xDF},
+ {0x9D,0xE0}, {0x9D,0xE1}, {0x9D,0xE2}, {0x9D,0xE3},
+ {0x9D,0xE4}, {0x9D,0xE5}, {0x9D,0xE6}, {0x9D,0xE7},
+ {0x9D,0xE8}, {0x9D,0xE9}, {0x9D,0xEA}, {0x9D,0xEB},
+ {0x9D,0xEC}, {0x9D,0xED}, {0x9D,0xEE}, {0x9D,0xEF},
+ {0x9D,0xF0}, {0x9D,0xF1}, {0x9D,0xF2}, {0x9D,0xF3},
+ {0x9D,0xF4}, {0x9D,0xF5}, {0x9D,0xF6}, {0x9D,0xF7},
+ {0x9D,0xF8}, {0x9D,0xF9}, {0x9D,0xFA}, {0x9D,0xFB},
+ {0x9D,0xFC}, {0x9D,0xFD}, {0x9D,0xFE}, {0x9E,0x40},
+ {0x9E,0x41}, {0x9E,0x42}, {0x9E,0x43}, {0x9E,0x44},
+ {0x9E,0x45}, {0x9E,0x46}, {0x9E,0x47}, {0x9E,0x48},
+ {0x9E,0x49}, {0x9E,0x4A}, {0x9E,0x4B}, {0x9E,0x4C},
+ {0x9E,0x4D}, {0x9E,0x4E}, {0x9E,0x4F}, {0x9E,0x50},
+ {0x9E,0x51}, {0x9E,0x52}, {0x9E,0x53}, {0x9E,0x54},
+ {0x9E,0x55}, {0x9E,0x56}, {0x9E,0x57}, {0x9E,0x58},
+ {0x9E,0x59}, {0x9E,0x5A}, {0x9E,0x5B}, {0x9E,0x5C},
+ {0x9E,0x5D}, {0x9E,0x5E}, {0x9E,0x5F}, {0x9E,0x60},
+ {0x9E,0x61}, {0x9E,0x62}, {0x9E,0x63}, {0x9E,0x64},
+ {0x9E,0x65}, {0x9E,0x66}, {0x9E,0x67}, {0x9E,0x68},
+ {0x9E,0x69}, {0x9E,0x6A}, {0x9E,0x6B}, {0x9E,0x6C},
+ {0x9E,0x6D}, {0x9E,0x6E}, {0x9E,0x6F}, {0x9E,0x70},
+ {0x9E,0x71}, {0x9E,0x72}, {0x9E,0x73}, {0x9E,0x74},
+ {0x9E,0x75}, {0x9E,0x76}, {0x9E,0x77}, {0x9E,0x78},
+ {0x9E,0x79}, {0x9E,0x7A}, {0x9E,0x7B}, {0x9E,0x7C},
+ {0x9E,0x7D}, {0x9E,0x7E}, {0x9E,0xA1}, {0x9E,0xA2},
+ {0x9E,0xA3}, {0x9E,0xA4}, {0x9E,0xA5}, {0x9E,0xA6},
+ {0x9E,0xA7}, {0x9E,0xA8}, {0xAB,0xEC}, {0x9E,0xAA},
+ {0x9E,0xAB}, {0x9E,0xAC}, {0x9E,0xAD}, {0x9E,0xAE},
+ {0x9E,0xAF}, {0x9E,0xB0}, {0x9E,0xB1}, {0x9E,0xB2},
+ {0x9E,0xB3}, {0x9E,0xB4}, {0x9E,0xB5}, {0x9E,0xB6},
+ {0x9E,0xB7}, {0x9E,0xB8}, {0x9E,0xB9}, {0x9E,0xBA},
+ {0x9E,0xBB}, {0x9E,0xBC}, {0x9E,0xBD}, {0x9E,0xBE},
+ {0x9E,0xBF}, {0x9E,0xC0}, {0x9E,0xC1}, {0x9E,0xC2},
+ {0x9E,0xC3}, {0x9E,0xC4}, {0x9E,0xC5}, {0x9E,0xC6},
+ {0x9E,0xC7}, {0x9E,0xC8}, {0x9E,0xC9}, {0x9E,0xCA},
+ {0x9E,0xCB}, {0x9E,0xCC}, {0x9E,0xCD}, {0x9E,0xCE},
+ {0x9E,0xCF}, {0x9E,0xD0}, {0x9E,0xD1}, {0x9E,0xD2},
+ {0x9E,0xD3}, {0x9E,0xD4}, {0x9E,0xD5}, {0x9E,0xD6},
+ {0x9E,0xD7}, {0x9E,0xD8}, {0x9E,0xD9}, {0x9E,0xDA},
+ {0x9E,0xDB}, {0x9E,0xDC}, {0x9E,0xDD}, {0x9E,0xDE},
+ {0x9E,0xDF}, {0x9E,0xE0}, {0x9E,0xE1}, {0x9E,0xE2},
+ {0x9E,0xE3}, {0x9E,0xE4}, {0x9E,0xE5}, {0x9E,0xE6},
+ {0x9E,0xE7}, {0x9E,0xE8}, {0x9E,0xE9}, {0x9E,0xEA},
+ {0x9E,0xEB}, {0x9E,0xEC}, {0x9E,0xED}, {0x9E,0xEE},
+ {0xDE,0xCD}, {0x9E,0xF0}, {0x9E,0xF1}, {0x9E,0xF2},
+ {0x9E,0xF3}, {0x9E,0xF4}, {0x9E,0xF5}, {0x9E,0xF6},
+ {0x9E,0xF7}, {0x9E,0xF8}, {0x9E,0xF9}, {0x9E,0xFA},
+ {0x9E,0xFB}, {0x9E,0xFC}, {0xC9,0xFC}, {0x9E,0xFE},
+ {0x9F,0x40}, {0x9F,0x41}, {0x9F,0x42}, {0x9F,0x43},
+ {0x9F,0x44}, {0x9F,0x45}, {0x9F,0x46}, {0x9F,0x47},
+ {0x9F,0x48}, {0x9F,0x49}, {0x9F,0x4A}, {0x9F,0x4B},
+ {0x9F,0x4C}, {0x9F,0x4D}, {0x9F,0x4E}, {0x9F,0x4F},
+ {0x9F,0x50}, {0x9F,0x51}, {0x9F,0x52}, {0x9F,0x53},
+ {0x9F,0x54}, {0x9F,0x55}, {0x9F,0x56}, {0x9F,0x57},
+ {0x9F,0x58}, {0x9F,0x59}, {0x9F,0x5A}, {0x9F,0x5B},
+ {0x9F,0x5C}, {0x9F,0x5D}, {0x9F,0x5E}, {0x9F,0x5F},
+ {0xF9,0xC4}, {0x9F,0x61}, {0x9F,0x62}, {0x9F,0x63},
+ {0x9F,0x64}, {0x9F,0x65}, {0x91,0xBE}, {0x9F,0x67},
+ {0x9F,0x68}, {0x9F,0x69}, {0x9F,0x6A}, {0x9F,0x6B},
+ {0x9F,0x6C}, {0x9F,0x6D}, {0x9F,0x6E}, {0x9F,0x6F},
+ {0x9F,0x70}, {0x9F,0x71}, {0x9F,0x72}, {0x9F,0x73},
+ {0x9F,0x74}, {0x9F,0x75}, {0x9F,0x76}, {0x9F,0x77},
+ {0x9F,0x78}, {0x9F,0x79}, {0x9F,0x7A}, {0x9F,0x7B},
+ {0x9F,0x7C}, {0x9F,0x7D}, {0x9F,0x7E}, {0x9F,0xA1},
+ {0x9F,0xA2}, {0x9F,0xA3}, {0x9F,0xA4}, {0x9F,0xA5},
+ {0x9F,0xA6}, {0x9F,0xA7}, {0x9F,0xA8}, {0x9F,0xA9},
+ {0x9F,0xAA}, {0x9F,0xAB}, {0x9F,0xAC}, {0x9F,0xAD},
+ {0x9F,0xAE}, {0x9F,0xAF}, {0x9F,0xB0}, {0x9F,0xB1},
+ {0x9F,0xB2}, {0x9F,0xB3}, {0x9F,0xB4}, {0x9F,0xB5},
+ {0x9F,0xB6}, {0x9F,0xB7}, {0x9F,0xB8}, {0x9F,0xB9},
+ {0x9F,0xBA}, {0x9F,0xBB}, {0x9F,0xBC}, {0x9F,0xBD},
+ {0x9F,0xBE}, {0x9F,0xBF}, {0x9F,0xC0}, {0x9F,0xC1},
+ {0x9F,0xC2}, {0x9F,0xC3}, {0x9F,0xC4}, {0x9F,0xC5},
+ {0x9F,0xC6}, {0x9F,0xC7}, {0x9F,0xC8}, {0x9F,0xC9},
+ {0x9F,0xCA}, {0xB9,0xB0}, {0x9F,0xCC}, {0x9F,0xCD},
+ {0x9F,0xCE}, {0x9F,0xCF}, {0x9F,0xD0}, {0x9F,0xD1},
+ {0x9F,0xD2}, {0x9F,0xD3}, {0x9F,0xD4}, {0x9F,0xD5},
+ {0x9F,0xD6}, {0x9F,0xD7}, {0x93,0x61}, {0x9F,0xD9},
+ {0x9F,0xDA}, {0x9F,0xDB}, {0x9F,0xDC}, {0x9F,0xDD},
+ {0x9F,0xDE}, {0x9F,0xDF}, {0x9F,0xE0}, {0x9F,0xE1},
+ {0x9F,0xE2}, {0x9F,0xE3}, {0x9F,0xE4}, {0x9F,0xE5},
+ {0x9F,0xE6}, {0x9F,0xE7}, {0x9F,0xE8}, {0x9F,0xE9},
+ {0x9F,0xEA}, {0x9F,0xEB}, {0x9F,0xEC}, {0x9F,0xED},
+ {0x9F,0xEE}, {0x9F,0xEF}, {0x9F,0xF0}, {0x9F,0xF1},
+ {0x9F,0xF2}, {0x9F,0xF3}, {0x9F,0xF4}, {0x9F,0xF5},
+ {0x9F,0xF6}, {0x9F,0xF7}, {0x9F,0xF8}, {0x9F,0xF9},
+ {0x9F,0xFA}, {0x9F,0xFB}, {0x9F,0xFC}, {0x9F,0xFD},
+ {0x9F,0xFE}, {0xA0,0x40}, {0xA0,0x41}, {0xA0,0x42},
+ {0xA0,0x43}, {0xA0,0x44}, {0xA0,0x45}, {0xA0,0x46},
+ {0xA0,0x47}, {0xA0,0x48}, {0xA0,0x49}, {0xA0,0x4A},
+ {0xA0,0x4B}, {0xA0,0x4C}, {0xA0,0x4D}, {0xA0,0x4E},
+ {0xA0,0x4F}, {0xA0,0x50}, {0xA0,0x51}, {0xA0,0x52},
+ {0xA0,0x53}, {0xA0,0x54}, {0xA0,0x55}, {0xA0,0x56},
+ {0xA0,0x57}, {0xA0,0x58}, {0xA0,0x59}, {0xA0,0x5A},
+ {0xA0,0x5B}, {0xA0,0x5C}, {0xA0,0x5D}, {0xA0,0x5E},
+ {0xA0,0x5F}, {0xA0,0x60}, {0xA0,0x61}, {0xA0,0x62},
+ {0x8F,0xB6}, {0xA0,0x64}, {0xA0,0x65}, {0xA0,0x66},
+ {0xA0,0x67}, {0xA0,0x68}, {0xA0,0x69}, {0xA0,0x6A},
+ {0xA0,0x6B}, {0xA0,0x6C}, {0xA0,0x6D}, {0xA0,0x6E},
+ {0xA0,0x6F}, {0xA0,0x70}, {0xA0,0x71}, {0xA0,0x72},
+ {0xA0,0x73}, {0xA0,0x74}, {0xA0,0x75}, {0xA0,0x76},
+ {0xA9,0xF0}, {0xA0,0x78}, {0xA0,0x79}, {0xA0,0x7A},
+ {0xA0,0x7B}, {0xA0,0x7C}, {0xA0,0x7D}, {0xA0,0x7E},
+ {0xA0,0xA1}, {0xA0,0xA2}, {0xA0,0xA3}, {0xA0,0xA4},
+ {0xA0,0xA5}, {0xA0,0xA6}, {0xA0,0xA7}, {0xA0,0xA8},
+ {0xA0,0xA9}, {0xA0,0xAA}, {0xA0,0xAB}, {0xA0,0xAC},
+ {0xA0,0xAD}, {0xA0,0xAE}, {0xA0,0xAF}, {0xA0,0xB0},
+ {0xA0,0xB1}, {0xA0,0xB2}, {0xA0,0xB3}, {0xA0,0xB4},
+ {0xA0,0xB5}, {0xA0,0xB6}, {0xA0,0xB7}, {0xA0,0xB8},
+ {0xA0,0xB9}, {0xA0,0xBA}, {0xA0,0xBB}, {0xA0,0xBC},
+ {0xA0,0xBD}, {0xA0,0xBE}, {0xA0,0xBF}, {0xA0,0xC0},
+ {0xA0,0xC1}, {0xA0,0xC2}, {0xA0,0xC3}, {0xA0,0xC4},
+ {0xA0,0xC5}, {0xA0,0xC6}, {0xA0,0xC7}, {0xA0,0xC8},
+ {0xA0,0xC9}, {0xA0,0xCA}, {0xA0,0xCB}, {0xA0,0xCC},
+ {0xA0,0xCD}, {0xA0,0xCE}, {0xA0,0xCF}, {0xA0,0xD0},
+ {0xA0,0xD1}, {0xA0,0xD2}, {0xA0,0xD3}, {0xA0,0xD4},
+ {0x94,0x7A}, {0xA0,0xD6}, {0xA0,0xD7}, {0xA0,0xD8},
+ {0xA0,0xD9}, {0xA0,0xDA}, {0xA0,0xDB}, {0xA0,0xDC},
+ {0xA0,0xDD}, {0xA0,0xDE}, {0xDE,0x72}, {0xA0,0xE0},
+ {0xA0,0xE1}, {0xA0,0xE2}, {0xA0,0xE3}, {0x94,0x55},
+ {0xA0,0xE5}, {0xA0,0xE6}, {0xA0,0xE7}, {0xA0,0xE8},
+ {0xA0,0xE9}, {0xA0,0xEA}, {0xA0,0xEB}, {0xA0,0xEC},
+ {0xA0,0xED}, {0xA0,0xEE}, {0xA0,0xEF}, {0xA0,0xF0},
+ {0xA0,0xF1}, {0xA0,0xF2}, {0xA0,0xF3}, {0xA0,0xF4},
+ {0xA0,0xF5}, {0xA0,0xF6}, {0xA0,0xF7}, {0xA0,0xF8},
+ {0xA0,0xF9}, {0xA0,0xFA}, {0xA0,0xFB}, {0xA0,0xFC},
+ {0xA0,0xFD}, {0xA0,0xFE}, {0x81,0x40}, {0x81,0x41},
+ {0x81,0x42}, {0x81,0x43}, {0x81,0x44}, {0x81,0x45},
+ {0x81,0x46}, {0x81,0x47}, {0x81,0x48}, {0x81,0x49},
+ {0x81,0x4A}, {0x81,0x4B}, {0x81,0x4C}, {0x81,0x4D},
+ {0x81,0x4E}, {0x81,0x4F}, {0x81,0x50}, {0x81,0x51},
+ {0x81,0x52}, {0x81,0x53}, {0x81,0x54}, {0x81,0x55},
+ {0x81,0x56}, {0x81,0x57}, {0x81,0x58}, {0x81,0x59},
+ {0x81,0x5A}, {0x81,0x5B}, {0x81,0x5C}, {0x81,0x5D},
+ {0x81,0x5E}, {0x81,0x5F}, {0x81,0x60}, {0x81,0x61},
+ {0x81,0x62}, {0x81,0x63}, {0x81,0x64}, {0x81,0x65},
+ {0x81,0x66}, {0x81,0x67}, {0x81,0x68}, {0x81,0x69},
+ {0x81,0x6A}, {0x81,0x6B}, {0x81,0x6C}, {0x81,0x6D},
+ {0x81,0x6E}, {0x81,0x6F}, {0x81,0x70}, {0x81,0x71},
+ {0x81,0x72}, {0x81,0x73}, {0x81,0x74}, {0x81,0x75},
+ {0x81,0x76}, {0x81,0x77}, {0x81,0x78}, {0x81,0x79},
+ {0x81,0x7A}, {0x81,0x7B}, {0x81,0x7C}, {0x81,0x7D},
+ {0x81,0x7E}, {0x81,0xA1}, {0x81,0xA2}, {0x81,0xA3},
+ {0x81,0xA4}, {0x81,0xA5}, {0x81,0xA6}, {0x81,0xA7},
+ {0x81,0xA8}, {0x81,0xA9}, {0x81,0xAA}, {0x81,0xAB},
+ {0x81,0xAC}, {0x81,0xAD}, {0x81,0xAE}, {0x81,0xAF},
+ {0x81,0xB0}, {0x81,0xB1}, {0x81,0xB2}, {0x81,0xB3},
+ {0x81,0xB4}, {0x81,0xB5}, {0x81,0xB6}, {0x81,0xB7},
+ {0x81,0xB8}, {0x81,0xB9}, {0x81,0xBA}, {0x81,0xBB},
+ {0x81,0xBC}, {0x81,0xBD}, {0x81,0xBE}, {0x81,0xBF},
+ {0x81,0xC0}, {0x81,0xC1}, {0x81,0xC2}, {0x81,0xC3},
+ {0x81,0xC4}, {0x81,0xC5}, {0x81,0xC6}, {0x81,0xC7},
+ {0x81,0xC8}, {0x81,0xC9}, {0x81,0xCA}, {0x81,0xCB},
+ {0x81,0xCC}, {0x81,0xCD}, {0x81,0xCE}, {0x81,0xCF},
+ {0x81,0xD0}, {0x81,0xD1}, {0x81,0xD2}, {0x81,0xD3},
+ {0x81,0xD4}, {0x81,0xD5}, {0x81,0xD6}, {0x81,0xD7},
+ {0x81,0xD8}, {0x81,0xD9}, {0x81,0xDA}, {0x81,0xDB},
+ {0x81,0xDC}, {0x81,0xDD}, {0x81,0xDE}, {0x81,0xDF},
+ {0x81,0xE0}, {0x81,0xE1}, {0x81,0xE2}, {0x81,0xE3},
+ {0x81,0xE4}, {0x81,0xE5}, {0x81,0xE6}, {0x81,0xE7},
+ {0x81,0xE8}, {0x81,0xE9}, {0x81,0xEA}, {0x81,0xEB},
+ {0x81,0xEC}, {0x81,0xED}, {0x81,0xEE}, {0x81,0xEF},
+ {0x81,0xF0}, {0x81,0xF1}, {0x81,0xF2}, {0x81,0xF3},
+ {0x81,0xF4}, {0x81,0xF5}, {0x81,0xF6}, {0x81,0xF7},
+ {0x81,0xF8}, {0x81,0xF9}, {0x81,0xFA}, {0x81,0xFB},
+ {0x81,0xFC}, {0x81,0xFD}, {0x81,0xFE}, {0x82,0x40},
+ {0x82,0x41}, {0x82,0x42}, {0x82,0x43}, {0x82,0x44},
+ {0x82,0x45}, {0x82,0x46}, {0x82,0x47}, {0x82,0x48},
+ {0x82,0x49}, {0x82,0x4A}, {0x82,0x4B}, {0x82,0x4C},
+ {0x82,0x4D}, {0x82,0x4E}, {0x82,0x4F}, {0x82,0x50},
+ {0x82,0x51}, {0x82,0x52}, {0x82,0x53}, {0x82,0x54},
+ {0x82,0x55}, {0x82,0x56}, {0x82,0x57}, {0x82,0x58},
+ {0x82,0x59}, {0x82,0x5A}, {0x82,0x5B}, {0x82,0x5C},
+ {0x82,0x5D}, {0x82,0x5E}, {0x82,0x5F}, {0x82,0x60},
+ {0x82,0x61}, {0x82,0x62}, {0x82,0x63}, {0x82,0x64},
+ {0x82,0x65}, {0x82,0x66}, {0x82,0x67}, {0x82,0x68},
+ {0x82,0x69}, {0x82,0x6A}, {0x82,0x6B}, {0x82,0x6C},
+ {0x82,0x6D}, {0x82,0x6E}, {0x82,0x6F}, {0x82,0x70},
+ {0x82,0x71}, {0x82,0x72}, {0x82,0x73}, {0x82,0x74},
+ {0x82,0x75}, {0x82,0x76}, {0x82,0x77}, {0x82,0x78},
+ {0x82,0x79}, {0x82,0x7A}, {0x82,0x7B}, {0x82,0x7C},
+ {0x82,0x7D}, {0x82,0x7E}, {0x82,0xA1}, {0x82,0xA2},
+ {0x82,0xA3}, {0x82,0xA4}, {0x82,0xA5}, {0x82,0xA6},
+ {0x82,0xA7}, {0x82,0xA8}, {0x82,0xA9}, {0x82,0xAA},
+ {0x82,0xAB}, {0x82,0xAC}, {0x82,0xAD}, {0x82,0xAE},
+ {0x82,0xAF}, {0x82,0xB0}, {0x82,0xB1}, {0x82,0xB2},
+ {0x82,0xB3}, {0x82,0xB4}, {0x82,0xB5}, {0x82,0xB6},
+ {0x82,0xB7}, {0x82,0xB8}, {0x82,0xB9}, {0x82,0xBA},
+ {0x82,0xBB}, {0x82,0xBC}, {0x82,0xBD}, {0x82,0xBE},
+ {0x82,0xBF}, {0x82,0xC0}, {0x82,0xC1}, {0x82,0xC2},
+ {0x82,0xC3}, {0x82,0xC4}, {0x82,0xC5}, {0x82,0xC6},
+ {0x82,0xC7}, {0x82,0xC8}, {0x82,0xC9}, {0x82,0xCA},
+ {0x82,0xCB}, {0x82,0xCC}, {0x82,0xCD}, {0x82,0xCE},
+ {0x82,0xCF}, {0x82,0xD0}, {0x82,0xD1}, {0x82,0xD2},
+ {0x82,0xD3}, {0x82,0xD4}, {0x82,0xD5}, {0x82,0xD6},
+ {0x82,0xD7}, {0x82,0xD8}, {0x82,0xD9}, {0x82,0xDA},
+ {0x82,0xDB}, {0x82,0xDC}, {0x82,0xDD}, {0x82,0xDE},
+ {0x82,0xDF}, {0x82,0xE0}, {0x82,0xE1}, {0x82,0xE2},
+ {0x82,0xE3}, {0x82,0xE4}, {0x82,0xE5}, {0x82,0xE6},
+ {0x82,0xE7}, {0x82,0xE8}, {0x82,0xE9}, {0x82,0xEA},
+ {0x82,0xEB}, {0x82,0xEC}, {0x82,0xED}, {0x82,0xEE},
+ {0x82,0xEF}, {0x82,0xF0}, {0x82,0xF1}, {0x82,0xF2},
+ {0x82,0xF3}, {0x82,0xF4}, {0x82,0xF5}, {0x82,0xF6},
+ {0x82,0xF7}, {0x82,0xF8}, {0x82,0xF9}, {0x82,0xFA},
+ {0x82,0xFB}, {0x82,0xFC}, {0x82,0xFD}, {0x82,0xFE},
+ {0x83,0x40}, {0x83,0x41}, {0x83,0x42}, {0x83,0x43},
+ {0x83,0x44}, {0x83,0x45}, {0x83,0x46}, {0x83,0x47},
+ {0x83,0x48}, {0x83,0x49}, {0x83,0x4A}, {0x83,0x4B},
+ {0x83,0x4C}, {0x83,0x4D}, {0x83,0x4E}, {0x83,0x4F},
+ {0x83,0x50}, {0x83,0x51}, {0x83,0x52}, {0x83,0x53},
+ {0x83,0x54}, {0x83,0x55}, {0x83,0x56}, {0x83,0x57},
+ {0x83,0x58}, {0x83,0x59}, {0x83,0x5A}, {0x83,0x5B},
+ {0x83,0x5C}, {0x83,0x5D}, {0x83,0x5E}, {0x83,0x5F},
+ {0x83,0x60}, {0x83,0x61}, {0x83,0x62}, {0x83,0x63},
+ {0x83,0x64}, {0x83,0x65}, {0x83,0x66}, {0x83,0x67},
+ {0x83,0x68}, {0x83,0x69}, {0x83,0x6A}, {0x83,0x6B},
+ {0x83,0x6C}, {0x83,0x6D}, {0x83,0x6E}, {0x83,0x6F},
+ {0x83,0x70}, {0x83,0x71}, {0x83,0x72}, {0x83,0x73},
+ {0x83,0x74}, {0x83,0x75}, {0x83,0x76}, {0x83,0x77},
+ {0x83,0x78}, {0x83,0x79}, {0x83,0x7A}, {0x83,0x7B},
+ {0x83,0x7C}, {0x83,0x7D}, {0x83,0x7E}, {0x83,0xA1},
+ {0x83,0xA2}, {0x83,0xA3}, {0x83,0xA4}, {0x83,0xA5},
+ {0x83,0xA6}, {0x83,0xA7}, {0x83,0xA8}, {0x83,0xA9},
+ {0x83,0xAA}, {0x83,0xAB}, {0x83,0xAC}, {0x83,0xAD},
+ {0x83,0xAE}, {0x83,0xAF}, {0x83,0xB0}, {0x83,0xB1},
+ {0x83,0xB2}, {0x83,0xB3}, {0x83,0xB4}, {0x83,0xB5},
+ {0x83,0xB6}, {0x83,0xB7}, {0x83,0xB8}, {0x83,0xB9},
+ {0x83,0xBA}, {0x83,0xBB}, {0x83,0xBC}, {0x83,0xBD},
+ {0x83,0xBE}, {0x83,0xBF}, {0x83,0xC0}, {0x83,0xC1},
+ {0x83,0xC2}, {0x83,0xC3}, {0x83,0xC4}, {0x83,0xC5},
+ {0x83,0xC6}, {0x83,0xC7}, {0x83,0xC8}, {0x83,0xC9},
+ {0x83,0xCA}, {0x83,0xCB}, {0x83,0xCC}, {0x83,0xCD},
+ {0x83,0xCE}, {0x83,0xCF}, {0x83,0xD0}, {0x83,0xD1},
+ {0x83,0xD2}, {0x83,0xD3}, {0x83,0xD4}, {0x83,0xD5},
+ {0x83,0xD6}, {0x83,0xD7}, {0x83,0xD8}, {0x83,0xD9},
+ {0x83,0xDA}, {0x83,0xDB}, {0x83,0xDC}, {0x83,0xDD},
+ {0x83,0xDE}, {0x83,0xDF}, {0x83,0xE0}, {0x83,0xE1},
+ {0x83,0xE2}, {0x83,0xE3}, {0x83,0xE4}, {0x83,0xE5},
+ {0x83,0xE6}, {0x83,0xE7}, {0x83,0xE8}, {0x83,0xE9},
+ {0x83,0xEA}, {0x83,0xEB}, {0x83,0xEC}, {0x83,0xED},
+ {0x83,0xEE}, {0x83,0xEF}, {0x83,0xF0}, {0x83,0xF1},
+ {0x83,0xF2}, {0x83,0xF3}, {0x83,0xF4}, {0x83,0xF5},
+ {0x83,0xF6}, {0x83,0xF7}, {0x83,0xF8}, {0x83,0xF9},
+ {0x83,0xFA}, {0x83,0xFB}, {0x83,0xFC}, {0x83,0xFD},
+ {0x83,0xFE}, {0x84,0x40}, {0x84,0x41}, {0x84,0x42},
+ {0x84,0x43}, {0x84,0x44}, {0x84,0x45}, {0x84,0x46},
+ {0x84,0x47}, {0x84,0x48}, {0x84,0x49}, {0x84,0x4A},
+ {0x84,0x4B}, {0x84,0x4C}, {0x84,0x4D}, {0x84,0x4E},
+ {0x84,0x4F}, {0x84,0x50}, {0x84,0x51}, {0x84,0x52},
+ {0x84,0x53}, {0x84,0x54}, {0x84,0x55}, {0x84,0x56},
+ {0x84,0x57}, {0x84,0x58}, {0x84,0x59}, {0x84,0x5A},
+ {0x84,0x5B}, {0x84,0x5C}, {0x84,0x5D}, {0x84,0x5E},
+ {0x84,0x5F}, {0x84,0x60}, {0x84,0x61}, {0x84,0x62},
+ {0x84,0x63}, {0x84,0x64}, {0x84,0x65}, {0x84,0x66},
+ {0x84,0x67}, {0x84,0x68}, {0x84,0x69}, {0x84,0x6A},
+ {0x84,0x6B}, {0x84,0x6C}, {0x84,0x6D}, {0x84,0x6E},
+ {0x84,0x6F}, {0x84,0x70}, {0x84,0x71}, {0x84,0x72},
+ {0x84,0x73}, {0x84,0x74}, {0x84,0x75}, {0x84,0x76},
+ {0x84,0x77}, {0x84,0x78}, {0x84,0x79}, {0x84,0x7A},
+ {0x84,0x7B}, {0x84,0x7C}, {0x84,0x7D}, {0x84,0x7E},
+ {0x84,0xA1}, {0x84,0xA2}, {0x84,0xA3}, {0x84,0xA4},
+ {0x84,0xA5}, {0x84,0xA6}, {0x84,0xA7}, {0x84,0xA8},
+ {0x84,0xA9}, {0x84,0xAA}, {0x84,0xAB}, {0x84,0xAC},
+ {0x84,0xAD}, {0x84,0xAE}, {0x84,0xAF}, {0x84,0xB0},
+ {0x84,0xB1}, {0x84,0xB2}, {0x84,0xB3}, {0x84,0xB4},
+ {0x84,0xB5}, {0x84,0xB6}, {0x84,0xB7}, {0x84,0xB8},
+ {0x84,0xB9}, {0x84,0xBA}, {0x84,0xBB}, {0x84,0xBC},
+ {0x84,0xBD}, {0x84,0xBE}, {0x84,0xBF}, {0x84,0xC0},
+ {0x84,0xC1}, {0x84,0xC2}, {0x84,0xC3}, {0x84,0xC4},
+ {0x84,0xC5}, {0x84,0xC6}, {0x84,0xC7}, {0x84,0xC8},
+ {0x84,0xC9}, {0x84,0xCA}, {0x84,0xCB}, {0x84,0xCC},
+ {0x84,0xCD}, {0x84,0xCE}, {0x84,0xCF}, {0x84,0xD0},
+ {0x84,0xD1}, {0x84,0xD2}, {0x84,0xD3}, {0x84,0xD4},
+ {0x84,0xD5}, {0x84,0xD6}, {0x84,0xD7}, {0x84,0xD8},
+ {0x84,0xD9}, {0x84,0xDA}, {0x84,0xDB}, {0x84,0xDC},
+ {0x84,0xDD}, {0x84,0xDE}, {0x84,0xDF}, {0x84,0xE0},
+ {0x84,0xE1}, {0x84,0xE2}, {0x84,0xE3}, {0x84,0xE4},
+ {0x84,0xE5}, {0x84,0xE6}, {0x84,0xE7}, {0x84,0xE8},
+ {0x84,0xE9}, {0x84,0xEA}, {0x84,0xEB}, {0x84,0xEC},
+ {0x84,0xED}, {0x84,0xEE}, {0x84,0xEF}, {0x84,0xF0},
+ {0x84,0xF1}, {0x84,0xF2}, {0x84,0xF3}, {0x84,0xF4},
+ {0x84,0xF5}, {0x84,0xF6}, {0x84,0xF7}, {0x84,0xF8},
+ {0x84,0xF9}, {0x84,0xFA}, {0x84,0xFB}, {0x84,0xFC},
+ {0x84,0xFD}, {0x84,0xFE}, {0x85,0x40}, {0x85,0x41},
+ {0x85,0x42}, {0x85,0x43}, {0x85,0x44}, {0x85,0x45},
+ {0x85,0x46}, {0x85,0x47}, {0x85,0x48}, {0x85,0x49},
+ {0x85,0x4A}, {0x85,0x4B}, {0x85,0x4C}, {0x85,0x4D},
+ {0x85,0x4E}, {0x85,0x4F}, {0x85,0x50}, {0x85,0x51},
+ {0x85,0x52}, {0x85,0x53}, {0x85,0x54}, {0x85,0x55},
+ {0x85,0x56}, {0x85,0x57}, {0x85,0x58}, {0x85,0x59},
+ {0x85,0x5A}, {0x85,0x5B}, {0x85,0x5C}, {0x85,0x5D},
+ {0x85,0x5E}, {0x85,0x5F}, {0x85,0x60}, {0x85,0x61},
+ {0x85,0x62}, {0x85,0x63}, {0x85,0x64}, {0x85,0x65},
+ {0x85,0x66}, {0x85,0x67}, {0x85,0x68}, {0x85,0x69},
+ {0x85,0x6A}, {0x85,0x6B}, {0x85,0x6C}, {0x85,0x6D},
+ {0x85,0x6E}, {0x85,0x6F}, {0x85,0x70}, {0x85,0x71},
+ {0x85,0x72}, {0x85,0x73}, {0x85,0x74}, {0x85,0x75},
+ {0x85,0x76}, {0x85,0x77}, {0x85,0x78}, {0x85,0x79},
+ {0x85,0x7A}, {0x85,0x7B}, {0x85,0x7C}, {0x85,0x7D},
+ {0x85,0x7E}, {0x85,0xA1}, {0x85,0xA2}, {0x85,0xA3},
+ {0x85,0xA4}, {0x85,0xA5}, {0x85,0xA6}, {0x85,0xA7},
+ {0x85,0xA8}, {0x85,0xA9}, {0x85,0xAA}, {0x85,0xAB},
+ {0x85,0xAC}, {0x85,0xAD}, {0x85,0xAE}, {0x85,0xAF},
+ {0x85,0xB0}, {0x85,0xB1}, {0x85,0xB2}, {0x85,0xB3},
+ {0x85,0xB4}, {0x85,0xB5}, {0x85,0xB6}, {0x85,0xB7},
+ {0x85,0xB8}, {0x85,0xB9}, {0x85,0xBA}, {0x85,0xBB},
+ {0x85,0xBC}, {0x85,0xBD}, {0x85,0xBE}, {0x85,0xBF},
+ {0x85,0xC0}, {0x85,0xC1}, {0x85,0xC2}, {0x85,0xC3},
+ {0x85,0xC4}, {0x85,0xC5}, {0x85,0xC6}, {0x85,0xC7},
+ {0x85,0xC8}, {0x85,0xC9}, {0x85,0xCA}, {0x85,0xCB},
+ {0x85,0xCC}, {0x85,0xCD}, {0x85,0xCE}, {0x85,0xCF},
+ {0x85,0xD0}, {0x85,0xD1}, {0x85,0xD2}, {0x85,0xD3},
+ {0x85,0xD4}, {0x85,0xD5}, {0x85,0xD6}, {0x85,0xD7},
+ {0x85,0xD8}, {0x85,0xD9}, {0x85,0xDA}, {0x85,0xDB},
+ {0x85,0xDC}, {0x85,0xDD}, {0x85,0xDE}, {0x85,0xDF},
+ {0x85,0xE0}, {0x85,0xE1}, {0x85,0xE2}, {0x85,0xE3},
+ {0x85,0xE4}, {0x85,0xE5}, {0x85,0xE6}, {0x85,0xE7},
+ {0x85,0xE8}, {0x85,0xE9}, {0x85,0xEA}, {0x85,0xEB},
+ {0x85,0xEC}, {0x85,0xED}, {0x85,0xEE}, {0x85,0xEF},
+ {0x85,0xF0}, {0x85,0xF1}, {0x85,0xF2}, {0x85,0xF3},
+ {0x85,0xF4}, {0x85,0xF5}, {0x85,0xF6}, {0x85,0xF7},
+ {0x85,0xF8}, {0x85,0xF9}, {0x85,0xFA}, {0x85,0xFB},
+ {0x85,0xFC}, {0x85,0xFD}, {0x85,0xFE}, {0x86,0x40},
+ {0x86,0x41}, {0x86,0x42}, {0x86,0x43}, {0x86,0x44},
+ {0x86,0x45}, {0x86,0x46}, {0x86,0x47}, {0x86,0x48},
+ {0x86,0x49}, {0x86,0x4A}, {0x86,0x4B}, {0x86,0x4C},
+ {0x86,0x4D}, {0x86,0x4E}, {0x86,0x4F}, {0x86,0x50},
+ {0x86,0x51}, {0x86,0x52}, {0x86,0x53}, {0x86,0x54},
+ {0x86,0x55}, {0x86,0x56}, {0x86,0x57}, {0x86,0x58},
+ {0x86,0x59}, {0x86,0x5A}, {0x86,0x5B}, {0x86,0x5C},
+ {0x86,0x5D}, {0x86,0x5E}, {0x86,0x5F}, {0x86,0x60},
+ {0x86,0x61}, {0x86,0x62}, {0x86,0x63}, {0x86,0x64},
+ {0x86,0x65}, {0x86,0x66}, {0x86,0x67}, {0x86,0x68},
+ {0x86,0x69}, {0x86,0x6A}, {0x86,0x6B}, {0x86,0x6C},
+ {0x86,0x6D}, {0x86,0x6E}, {0x86,0x6F}, {0x86,0x70},
+ {0x86,0x71}, {0x86,0x72}, {0x86,0x73}, {0x86,0x74},
+ {0x86,0x75}, {0x86,0x76}, {0x86,0x77}, {0x86,0x78},
+ {0x86,0x79}, {0x86,0x7A}, {0x86,0x7B}, {0x86,0x7C},
+ {0x86,0x7D}, {0x86,0x7E}, {0x86,0xA1}, {0x86,0xA2},
+ {0x86,0xA3}, {0x86,0xA4}, {0x86,0xA5}, {0x86,0xA6},
+ {0x86,0xA7}, {0x86,0xA8}, {0x86,0xA9}, {0x86,0xAA},
+ {0x86,0xAB}, {0x86,0xAC}, {0x86,0xAD}, {0x86,0xAE},
+ {0x86,0xAF}, {0x86,0xB0}, {0x86,0xB1}, {0x86,0xB2},
+ {0x86,0xB3}, {0x86,0xB4}, {0x86,0xB5}, {0x86,0xB6},
+ {0x86,0xB7}, {0x86,0xB8}, {0x86,0xB9}, {0x86,0xBA},
+ {0x86,0xBB}, {0x86,0xBC}, {0x86,0xBD}, {0x86,0xBE},
+ {0x86,0xBF}, {0x86,0xC0}, {0x86,0xC1}, {0x86,0xC2},
+ {0x86,0xC3}, {0x86,0xC4}, {0x86,0xC5}, {0x86,0xC6},
+ {0x86,0xC7}, {0x86,0xC8}, {0x86,0xC9}, {0x86,0xCA},
+ {0x86,0xCB}, {0x86,0xCC}, {0x86,0xCD}, {0x86,0xCE},
+ {0x86,0xCF}, {0x86,0xD0}, {0x86,0xD1}, {0x86,0xD2},
+ {0x86,0xD3}, {0x86,0xD4}, {0x86,0xD5}, {0x86,0xD6},
+ {0x86,0xD7}, {0x86,0xD8}, {0x86,0xD9}, {0x86,0xDA},
+ {0x86,0xDB}, {0x86,0xDC}, {0x86,0xDD}, {0x86,0xDE},
+ {0x86,0xDF}, {0x86,0xE0}, {0x86,0xE1}, {0x86,0xE2},
+ {0x86,0xE3}, {0x86,0xE4}, {0x86,0xE5}, {0x86,0xE6},
+ {0x86,0xE7}, {0x86,0xE8}, {0x86,0xE9}, {0x86,0xEA},
+ {0x86,0xEB}, {0x86,0xEC}, {0x86,0xED}, {0x86,0xEE},
+ {0x86,0xEF}, {0x86,0xF0}, {0x86,0xF1}, {0x86,0xF2},
+ {0x86,0xF3}, {0x86,0xF4}, {0x86,0xF5}, {0x86,0xF6},
+ {0x86,0xF7}, {0x86,0xF8}, {0x86,0xF9}, {0x86,0xFA},
+ {0x86,0xFB}, {0x86,0xFC}, {0x86,0xFD}, {0x86,0xFE},
+ {0x87,0x40}, {0x87,0x41}, {0x87,0x42}, {0x87,0x43},
+ {0x87,0x44}, {0x87,0x45}, {0x87,0x46}, {0x87,0x47},
+ {0x87,0x48}, {0x87,0x49}, {0x87,0x4A}, {0x87,0x4B},
+ {0x87,0x4C}, {0x87,0x4D}, {0x87,0x4E}, {0x87,0x4F},
+ {0x87,0x50}, {0x87,0x51}, {0x87,0x52}, {0x87,0x53},
+ {0x87,0x54}, {0x87,0x55}, {0x87,0x56}, {0x87,0x57},
+ {0x87,0x58}, {0x87,0x59}, {0x87,0x5A}, {0x87,0x5B},
+ {0x87,0x5C}, {0x87,0x5D}, {0x87,0x5E}, {0x87,0x5F},
+ {0x87,0x60}, {0x87,0x61}, {0x87,0x62}, {0x87,0x63},
+ {0x87,0x64}, {0x87,0x65}, {0x87,0x66}, {0x87,0x67},
+ {0x87,0x68}, {0x87,0x69}, {0x87,0x6A}, {0x87,0x6B},
+ {0x87,0x6C}, {0x87,0x6D}, {0x87,0x6E}, {0x87,0x6F},
+ {0x87,0x70}, {0x87,0x71}, {0x87,0x72}, {0x87,0x73},
+ {0x87,0x74}, {0x87,0x75}, {0x87,0x76}, {0x87,0x77},
+ {0x87,0x78}, {0x87,0x79}, {0x87,0x7A}, {0x87,0x7B},
+ {0x87,0x7C}, {0x87,0x7D}, {0x87,0x7E}, {0x87,0xA1},
+ {0x87,0xA2}, {0x87,0xA3}, {0x87,0xA4}, {0x87,0xA5},
+ {0x87,0xA6}, {0x87,0xA7}, {0x87,0xA8}, {0x87,0xA9},
+ {0x87,0xAA}, {0x87,0xAB}, {0x87,0xAC}, {0x87,0xAD},
+ {0x87,0xAE}, {0x87,0xAF}, {0x87,0xB0}, {0x87,0xB1},
+ {0x87,0xB2}, {0x87,0xB3}, {0x87,0xB4}, {0x87,0xB5},
+ {0x87,0xB6}, {0x87,0xB7}, {0x87,0xB8}, {0x87,0xB9},
+ {0x87,0xBA}, {0x87,0xBB}, {0x87,0xBC}, {0x87,0xBD},
+ {0x87,0xBE}, {0x87,0xBF}, {0x87,0xC0}, {0x87,0xC1},
+ {0x87,0xC2}, {0x87,0xC3}, {0x87,0xC4}, {0x87,0xC5},
+ {0x87,0xC6}, {0x87,0xC7}, {0x87,0xC8}, {0x87,0xC9},
+ {0x87,0xCA}, {0x87,0xCB}, {0x87,0xCC}, {0x87,0xCD},
+ {0x87,0xCE}, {0x87,0xCF}, {0x87,0xD0}, {0x87,0xD1},
+ {0x87,0xD2}, {0x87,0xD3}, {0x87,0xD4}, {0x87,0xD5},
+ {0x87,0xD6}, {0x87,0xD7}, {0x87,0xD8}, {0x87,0xD9},
+ {0x87,0xDA}, {0x87,0xDB}, {0x87,0xDC}, {0x87,0xDD},
+ {0x87,0xDE}, {0x87,0xDF}, {0x87,0xE0}, {0x87,0xE1},
+ {0x87,0xE2}, {0x87,0xE3}, {0x87,0xE4}, {0x87,0xE5},
+ {0x87,0xE6}, {0x87,0xE7}, {0x87,0xE8}, {0x87,0xE9},
+ {0x87,0xEA}, {0x87,0xEB}, {0x87,0xEC}, {0x87,0xED},
+ {0x87,0xEE}, {0x87,0xEF}, {0x87,0xF0}, {0x87,0xF1},
+ {0x87,0xF2}, {0x87,0xF3}, {0x87,0xF4}, {0x87,0xF5},
+ {0x87,0xF6}, {0x87,0xF7}, {0x87,0xF8}, {0x87,0xF9},
+ {0x87,0xFA}, {0x87,0xFB}, {0x87,0xFC}, {0x87,0xFD},
+ {0x87,0xFE}, {0x88,0x40}, {0x88,0x41}, {0x88,0x42},
+ {0x88,0x43}, {0x88,0x44}, {0x88,0x45}, {0x88,0x46},
+ {0x88,0x47}, {0x88,0x48}, {0x88,0x49}, {0x88,0x4A},
+ {0x88,0x4B}, {0x88,0x4C}, {0x88,0x4D}, {0x88,0x4E},
+ {0x88,0x4F}, {0x88,0x50}, {0x88,0x51}, {0x88,0x52},
+ {0x88,0x53}, {0x88,0x54}, {0x88,0x55}, {0x88,0x56},
+ {0x88,0x57}, {0x88,0x58}, {0x88,0x59}, {0x88,0x5A},
+ {0x88,0x5B}, {0x88,0x5C}, {0x88,0x5D}, {0x88,0x5E},
+ {0x88,0x5F}, {0x88,0x60}, {0x88,0x61}, {0x88,0x62},
+ {0x88,0x63}, {0x88,0x64}, {0x88,0x65}, {0x88,0x66},
+ {0x88,0x67}, {0x88,0x68}, {0x88,0x69}, {0x88,0x6A},
+ {0x88,0x6B}, {0x88,0x6C}, {0x88,0x6D}, {0x88,0x6E},
+ {0x88,0x6F}, {0x88,0x70}, {0x88,0x71}, {0x88,0x72},
+ {0x88,0x73}, {0x88,0x74}, {0x88,0x75}, {0x88,0x76},
+ {0x88,0x77}, {0x88,0x78}, {0x88,0x79}, {0x88,0x7A},
+ {0x88,0x7B}, {0x88,0x7C}, {0x88,0x7D}, {0x88,0x7E},
+ {0x88,0xA1}, {0x88,0xA2}, {0x88,0xA3}, {0x88,0xA4},
+ {0x88,0xA5}, {0x88,0xA6}, {0x88,0xA7}, {0x88,0xA8},
+ {0x88,0xA9}, {0x88,0xAA}, {0x88,0xAB}, {0x88,0xAC},
+ {0x88,0xAD}, {0x88,0xAE}, {0x88,0xAF}, {0x88,0xB0},
+ {0x88,0xB1}, {0x88,0xB2}, {0x88,0xB3}, {0x88,0xB4},
+ {0x88,0xB5}, {0x88,0xB6}, {0x88,0xB7}, {0x88,0xB8},
+ {0x88,0xB9}, {0x88,0xBA}, {0x88,0xBB}, {0x88,0xBC},
+ {0x88,0xBD}, {0x88,0xBE}, {0x88,0xBF}, {0x88,0xC0},
+ {0x88,0xC1}, {0x88,0xC2}, {0x88,0xC3}, {0x88,0xC4},
+ {0x88,0xC5}, {0x88,0xC6}, {0x88,0xC7}, {0x88,0xC8},
+ {0x88,0xC9}, {0x88,0xCA}, {0x88,0xCB}, {0x88,0xCC},
+ {0x88,0xCD}, {0x88,0xCE}, {0x88,0xCF}, {0x88,0xD0},
+ {0x88,0xD1}, {0x88,0xD2}, {0x88,0xD3}, {0x88,0xD4},
+ {0x88,0xD5}, {0x88,0xD6}, {0x88,0xD7}, {0x88,0xD8},
+ {0x88,0xD9}, {0x88,0xDA}, {0x88,0xDB}, {0x88,0xDC},
+ {0x88,0xDD}, {0x88,0xDE}, {0x88,0xDF}, {0x88,0xE0},
+ {0x88,0xE1}, {0x88,0xE2}, {0x88,0xE3}, {0x88,0xE4},
+ {0x88,0xE5}, {0x88,0xE6}, {0x88,0xE7}, {0x88,0xE8},
+ {0x88,0xE9}, {0x88,0xEA}, {0x88,0xEB}, {0x88,0xEC},
+ {0x88,0xED}, {0x88,0xEE}, {0x88,0xEF}, {0x88,0xF0},
+ {0x88,0xF1}, {0x88,0xF2}, {0x88,0xF3}, {0x88,0xF4},
+ {0x88,0xF5}, {0x88,0xF6}, {0x88,0xF7}, {0x88,0xF8},
+ {0x88,0xF9}, {0x88,0xFA}, {0x88,0xFB}, {0x88,0xFC},
+ {0x88,0xFD}, {0x88,0xFE}, {0x89,0x40}, {0x89,0x41},
+ {0x89,0x42}, {0x89,0x43}, {0x89,0x44}, {0x89,0x45},
+ {0x89,0x46}, {0x89,0x47}, {0x89,0x48}, {0x89,0x49},
+ {0x89,0x4A}, {0x89,0x4B}, {0x89,0x4C}, {0x89,0x4D},
+ {0x89,0x4E}, {0x89,0x4F}, {0x89,0x50}, {0x89,0x51},
+ {0x89,0x52}, {0x89,0x53}, {0x89,0x54}, {0x89,0x55},
+ {0x89,0x56}, {0x89,0x57}, {0x89,0x58}, {0x89,0x59},
+ {0x89,0x5A}, {0x89,0x5B}, {0x89,0x5C}, {0x89,0x5D},
+ {0x89,0x5E}, {0x89,0x5F}, {0x89,0x60}, {0x89,0x61},
+ {0x89,0x62}, {0x89,0x63}, {0x89,0x64}, {0x89,0x65},
+ {0x89,0x66}, {0x89,0x67}, {0x89,0x68}, {0x89,0x69},
+ {0x89,0x6A}, {0x89,0x6B}, {0x89,0x6C}, {0x89,0x6D},
+ {0x89,0x6E}, {0x89,0x6F}, {0x89,0x70}, {0x89,0x71},
+ {0x89,0x72}, {0x89,0x73}, {0x89,0x74}, {0x89,0x75},
+ {0x89,0x76}, {0x89,0x77}, {0x89,0x78}, {0x89,0x79},
+ {0x89,0x7A}, {0x89,0x7B}, {0x89,0x7C}, {0x89,0x7D},
+ {0x89,0x7E}, {0x89,0xA1}, {0x89,0xA2}, {0x89,0xA3},
+ {0x89,0xA4}, {0x89,0xA5}, {0x89,0xA6}, {0x89,0xA7},
+ {0x89,0xA8}, {0x89,0xA9}, {0x89,0xAA}, {0x89,0xAB},
+ {0x89,0xAC}, {0x89,0xAD}, {0x89,0xAE}, {0x89,0xAF},
+ {0x89,0xB0}, {0x89,0xB1}, {0x89,0xB2}, {0x89,0xB3},
+ {0x89,0xB4}, {0x89,0xB5}, {0x89,0xB6}, {0x89,0xB7},
+ {0x89,0xB8}, {0x89,0xB9}, {0x89,0xBA}, {0x89,0xBB},
+ {0x89,0xBC}, {0x89,0xBD}, {0x89,0xBE}, {0x89,0xBF},
+ {0x89,0xC0}, {0x89,0xC1}, {0x89,0xC2}, {0x89,0xC3},
+ {0x89,0xC4}, {0x89,0xC5}, {0x89,0xC6}, {0x89,0xC7},
+ {0x89,0xC8}, {0x89,0xC9}, {0x89,0xCA}, {0x89,0xCB},
+ {0x89,0xCC}, {0x89,0xCD}, {0x89,0xCE}, {0x89,0xCF},
+ {0x89,0xD0}, {0x89,0xD1}, {0x89,0xD2}, {0x89,0xD3},
+ {0x89,0xD4}, {0x89,0xD5}, {0x89,0xD6}, {0x89,0xD7},
+ {0x89,0xD8}, {0x89,0xD9}, {0x89,0xDA}, {0x89,0xDB},
+ {0x89,0xDC}, {0x89,0xDD}, {0x89,0xDE}, {0x89,0xDF},
+ {0x89,0xE0}, {0x89,0xE1}, {0x89,0xE2}, {0x89,0xE3},
+ {0x89,0xE4}, {0x89,0xE5}, {0x89,0xE6}, {0x89,0xE7},
+ {0x89,0xE8}, {0x89,0xE9}, {0x89,0xEA}, {0x89,0xEB},
+ {0x89,0xEC}, {0x89,0xED}, {0x89,0xEE}, {0x89,0xEF},
+ {0x89,0xF0}, {0x89,0xF1}, {0x89,0xF2}, {0x89,0xF3},
+ {0x89,0xF4}, {0x89,0xF5}, {0x89,0xF6}, {0x89,0xF7},
+ {0x89,0xF8}, {0x89,0xF9}, {0x89,0xFA}, {0x89,0xFB},
+ {0x89,0xFC}, {0x89,0xFD}, {0x89,0xFE}, {0x8A,0x40},
+ {0x8A,0x41}, {0x8A,0x42}, {0x8A,0x43}, {0x8A,0x44},
+ {0x8A,0x45}, {0x8A,0x46}, {0x8A,0x47}, {0x8A,0x48},
+ {0x8A,0x49}, {0x8A,0x4A}, {0x8A,0x4B}, {0x8A,0x4C},
+ {0x8A,0x4D}, {0x8A,0x4E}, {0x8A,0x4F}, {0x8A,0x50},
+ {0x8A,0x51}, {0x8A,0x52}, {0x8A,0x53}, {0x8A,0x54},
+ {0x8A,0x55}, {0x8A,0x56}, {0x8A,0x57}, {0x8A,0x58},
+ {0x8A,0x59}, {0x8A,0x5A}, {0x8A,0x5B}, {0x8A,0x5C},
+ {0x8A,0x5D}, {0x8A,0x5E}, {0x8A,0x5F}, {0x8A,0x60},
+ {0x8A,0x61}, {0x8A,0x62}, {0x8A,0x63}, {0x8A,0x64},
+ {0x8A,0x65}, {0x8A,0x66}, {0x8A,0x67}, {0x8A,0x68},
+ {0x8A,0x69}, {0x8A,0x6A}, {0x8A,0x6B}, {0x8A,0x6C},
+ {0x8A,0x6D}, {0x8A,0x6E}, {0x8A,0x6F}, {0x8A,0x70},
+ {0x8A,0x71}, {0x8A,0x72}, {0x8A,0x73}, {0x8A,0x74},
+ {0x8A,0x75}, {0x8A,0x76}, {0x8A,0x77}, {0x8A,0x78},
+ {0x8A,0x79}, {0x8A,0x7A}, {0x8A,0x7B}, {0x8A,0x7C},
+ {0x8A,0x7D}, {0x8A,0x7E}, {0x8A,0xA1}, {0x8A,0xA2},
+ {0x8A,0xA3}, {0x8A,0xA4}, {0x8A,0xA5}, {0x8A,0xA6},
+ {0x8A,0xA7}, {0x8A,0xA8}, {0x8A,0xA9}, {0x8A,0xAA},
+ {0x8A,0xAB}, {0x8A,0xAC}, {0x8A,0xAD}, {0x8A,0xAE},
+ {0x8A,0xAF}, {0x8A,0xB0}, {0x8A,0xB1}, {0x8A,0xB2},
+ {0x8A,0xB3}, {0x8A,0xB4}, {0x8A,0xB5}, {0x8A,0xB6},
+ {0x8A,0xB7}, {0x8A,0xB8}, {0x8A,0xB9}, {0x8A,0xBA},
+ {0x8A,0xBB}, {0x8A,0xBC}, {0x8A,0xBD}, {0x8A,0xBE},
+ {0x8A,0xBF}, {0x8A,0xC0}, {0x8A,0xC1}, {0x8A,0xC2},
+ {0x8A,0xC3}, {0x8A,0xC4}, {0x8A,0xC5}, {0x8A,0xC6},
+ {0x8A,0xC7}, {0x8A,0xC8}, {0x8A,0xC9}, {0x8A,0xCA},
+ {0x8A,0xCB}, {0x8A,0xCC}, {0x8A,0xCD}, {0x8A,0xCE},
+ {0x8A,0xCF}, {0x8A,0xD0}, {0x8A,0xD1}, {0x8A,0xD2},
+ {0x8A,0xD3}, {0x8A,0xD4}, {0x8A,0xD5}, {0x8A,0xD6},
+ {0x8A,0xD7}, {0x8A,0xD8}, {0x8A,0xD9}, {0x8A,0xDA},
+ {0x8A,0xDB}, {0x8A,0xDC}, {0x8A,0xDD}, {0x8A,0xDE},
+ {0x8A,0xDF}, {0x8A,0xE0}, {0x8A,0xE1}, {0x8A,0xE2},
+ {0x8A,0xE3}, {0x8A,0xE4}, {0x8A,0xE5}, {0x8A,0xE6},
+ {0x8A,0xE7}, {0x8A,0xE8}, {0x8A,0xE9}, {0x8A,0xEA},
+ {0x8A,0xEB}, {0x8A,0xEC}, {0x8A,0xED}, {0x8A,0xEE},
+ {0x8A,0xEF}, {0x8A,0xF0}, {0x8A,0xF1}, {0x8A,0xF2},
+ {0x8A,0xF3}, {0x8A,0xF4}, {0x8A,0xF5}, {0x8A,0xF6},
+ {0x8A,0xF7}, {0x8A,0xF8}, {0x8A,0xF9}, {0x8A,0xFA},
+ {0x8A,0xFB}, {0x8A,0xFC}, {0x8A,0xFD}, {0x8A,0xFE},
+ {0x8B,0x40}, {0x8B,0x41}, {0x8B,0x42}, {0x8B,0x43},
+ {0x8B,0x44}, {0x8B,0x45}, {0x8B,0x46}, {0x8B,0x47},
+ {0x8B,0x48}, {0x8B,0x49}, {0x8B,0x4A}, {0x8B,0x4B},
+ {0x8B,0x4C}, {0x8B,0x4D}, {0x8B,0x4E}, {0x8B,0x4F},
+ {0x8B,0x50}, {0x8B,0x51}, {0x8B,0x52}, {0x8B,0x53},
+ {0x8B,0x54}, {0x8B,0x55}, {0x8B,0x56}, {0x8B,0x57},
+ {0x8B,0x58}, {0x8B,0x59}, {0x8B,0x5A}, {0x8B,0x5B},
+ {0x8B,0x5C}, {0x8B,0x5D}, {0x8B,0x5E}, {0x8B,0x5F},
+ {0x8B,0x60}, {0x8B,0x61}, {0x8B,0x62}, {0x8B,0x63},
+ {0x8B,0x64}, {0x8B,0x65}, {0x8B,0x66}, {0x8B,0x67},
+ {0x8B,0x68}, {0x8B,0x69}, {0x8B,0x6A}, {0x8B,0x6B},
+ {0x8B,0x6C}, {0x8B,0x6D}, {0x8B,0x6E}, {0x8B,0x6F},
+ {0x8B,0x70}, {0x8B,0x71}, {0x8B,0x72}, {0x8B,0x73},
+ {0x8B,0x74}, {0x8B,0x75}, {0x8B,0x76}, {0x8B,0x77},
+ {0x8B,0x78}, {0x8B,0x79}, {0x8B,0x7A}, {0x8B,0x7B},
+ {0x8B,0x7C}, {0x8B,0x7D}, {0x8B,0x7E}, {0x8B,0xA1},
+ {0x8B,0xA2}, {0x8B,0xA3}, {0x8B,0xA4}, {0x8B,0xA5},
+ {0x8B,0xA6}, {0x8B,0xA7}, {0x8B,0xA8}, {0x8B,0xA9},
+ {0x8B,0xAA}, {0x8B,0xAB}, {0x8B,0xAC}, {0x8B,0xAD},
+ {0x8B,0xAE}, {0x8B,0xAF}, {0x8B,0xB0}, {0x8B,0xB1},
+ {0x8B,0xB2}, {0x8B,0xB3}, {0x8B,0xB4}, {0x8B,0xB5},
+ {0x8B,0xB6}, {0x8B,0xB7}, {0x8B,0xB8}, {0x8B,0xB9},
+ {0x8B,0xBA}, {0x8B,0xBB}, {0x8B,0xBC}, {0x8B,0xBD},
+ {0x8B,0xBE}, {0x8B,0xBF}, {0x8B,0xC0}, {0x8B,0xC1},
+ {0x8B,0xC2}, {0x8B,0xC3}, {0x8B,0xC4}, {0x8B,0xC5},
+ {0x8B,0xC6}, {0x8B,0xC7}, {0x8B,0xC8}, {0x8B,0xC9},
+ {0x8B,0xCA}, {0x8B,0xCB}, {0x8B,0xCC}, {0x8B,0xCD},
+ {0x8B,0xCE}, {0x8B,0xCF}, {0x8B,0xD0}, {0x8B,0xD1},
+ {0x8B,0xD2}, {0x8B,0xD3}, {0x8B,0xD4}, {0x8B,0xD5},
+ {0x8B,0xD6}, {0x8B,0xD7}, {0x8B,0xD8}, {0x8B,0xD9},
+ {0x8B,0xDA}, {0x8B,0xDB}, {0x8B,0xDC}, {0x8B,0xDD},
+ {0x8B,0xDE}, {0x8B,0xDF}, {0x8B,0xE0}, {0x8B,0xE1},
+ {0x8B,0xE2}, {0x8B,0xE3}, {0x8B,0xE4}, {0x8B,0xE5},
+ {0x8B,0xE6}, {0x8B,0xE7}, {0x8B,0xE8}, {0x8B,0xE9},
+ {0x8B,0xEA}, {0x8B,0xEB}, {0x8B,0xEC}, {0x8B,0xED},
+ {0x8B,0xEE}, {0x8B,0xEF}, {0x8B,0xF0}, {0x8B,0xF1},
+ {0x8B,0xF2}, {0x8B,0xF3}, {0x8B,0xF4}, {0x8B,0xF5},
+ {0x8B,0xF6}, {0x8B,0xF7}, {0x8B,0xF8}, {0x8B,0xF9},
+ {0x8B,0xFA}, {0x8B,0xFB}, {0x8B,0xFC}, {0x8B,0xFD},
+ {0x8B,0xFE}, {0x8C,0x40}, {0x8C,0x41}, {0x8C,0x42},
+ {0x8C,0x43}, {0x8C,0x44}, {0x8C,0x45}, {0x8C,0x46},
+ {0x8C,0x47}, {0x8C,0x48}, {0x8C,0x49}, {0x8C,0x4A},
+ {0x8C,0x4B}, {0x8C,0x4C}, {0x8C,0x4D}, {0x8C,0x4E},
+ {0x8C,0x4F}, {0x8C,0x50}, {0x8C,0x51}, {0x8C,0x52},
+ {0x8C,0x53}, {0x8C,0x54}, {0x8C,0x55}, {0x8C,0x56},
+ {0x8C,0x57}, {0x8C,0x58}, {0x8C,0x59}, {0x8C,0x5A},
+ {0x8C,0x5B}, {0x8C,0x5C}, {0x8C,0x5D}, {0x8C,0x5E},
+ {0x8C,0x5F}, {0x8C,0x60}, {0x8C,0x61}, {0x8C,0x62},
+ {0x8C,0x63}, {0x8C,0x64}, {0x8C,0x65}, {0x8C,0x66},
+ {0x8C,0x67}, {0x8C,0x68}, {0x8C,0x69}, {0x8C,0x6A},
+ {0x8C,0x6B}, {0x8C,0x6C}, {0x8C,0x6D}, {0x8C,0x6E},
+ {0x8C,0x6F}, {0x8C,0x70}, {0x8C,0x71}, {0x8C,0x72},
+ {0x8C,0x73}, {0x8C,0x74}, {0x8C,0x75}, {0x8C,0x76},
+ {0x8C,0x77}, {0x8C,0x78}, {0x8C,0x79}, {0x8C,0x7A},
+ {0x8C,0x7B}, {0x8C,0x7C}, {0x8C,0x7D}, {0x8C,0x7E},
+ {0x8C,0xA1}, {0x8C,0xA2}, {0x8C,0xA3}, {0x8C,0xA4},
+ {0x8C,0xA5}, {0x8C,0xA6}, {0x8C,0xA7}, {0x8C,0xA8},
+ {0x8C,0xA9}, {0x8C,0xAA}, {0x8C,0xAB}, {0x8C,0xAC},
+ {0x8C,0xAD}, {0x8C,0xAE}, {0x8C,0xAF}, {0x8C,0xB0},
+ {0x8C,0xB1}, {0x8C,0xB2}, {0x8C,0xB3}, {0x8C,0xB4},
+ {0x8C,0xB5}, {0x8C,0xB6}, {0x8C,0xB7}, {0x8C,0xB8},
+ {0x8C,0xB9}, {0x8C,0xBA}, {0x8C,0xBB}, {0x8C,0xBC},
+ {0x8C,0xBD}, {0x8C,0xBE}, {0x8C,0xBF}, {0x8C,0xC0},
+ {0x8C,0xC1}, {0x8C,0xC2}, {0x8C,0xC3}, {0x8C,0xC4},
+ {0x8C,0xC5}, {0x8C,0xC6}, {0x8C,0xC7}, {0x8C,0xC8},
+ {0x8C,0xC9}, {0x8C,0xCA}, {0x8C,0xCB}, {0x8C,0xCC},
+ {0x8C,0xCD}, {0x8C,0xCE}, {0x8C,0xCF}, {0x8C,0xD0},
+ {0x8C,0xD1}, {0x8C,0xD2}, {0x8C,0xD3}, {0x8C,0xD4},
+ {0x8C,0xD5}, {0x8C,0xD6}, {0x8C,0xD7}, {0x8C,0xD8},
+ {0x8C,0xD9}, {0x8C,0xDA}, {0x8C,0xDB}, {0x8C,0xDC},
+ {0x8C,0xDD}, {0x8C,0xDE}, {0x8C,0xDF}, {0x8C,0xE0},
+ {0x8C,0xE1}, {0x8C,0xE2}, {0x8C,0xE3}, {0x8C,0xE4},
+ {0x8C,0xE5}, {0x8C,0xE6}, {0x8C,0xE7}, {0x8C,0xE8},
+ {0x8C,0xE9}, {0x8C,0xEA}, {0x8C,0xEB}, {0x8C,0xEC},
+ {0x8C,0xED}, {0x8C,0xEE}, {0x8C,0xEF}, {0x8C,0xF0},
+ {0x8C,0xF1}, {0x8C,0xF2}, {0x8C,0xF3}, {0x8C,0xF4},
+ {0x8C,0xF5}, {0x8C,0xF6}, {0x8C,0xF7}, {0x8C,0xF8},
+ {0x8C,0xF9}, {0x8C,0xFA}, {0x8C,0xFB}, {0x8C,0xFC},
+ {0x8C,0xFD}, {0x8C,0xFE}, {0x8D,0x40}, {0x8D,0x41},
+ {0x8D,0x42}, {0x8D,0x43}, {0x8D,0x44}, {0x8D,0x45},
+ {0x8D,0x46}, {0x8D,0x47}, {0x8D,0x48}, {0x8D,0x49},
+ {0x8D,0x4A}, {0x8D,0x4B}, {0x8D,0x4C}, {0x8D,0x4D},
+ {0x8D,0x4E}, {0x8D,0x4F}, {0x8D,0x50}, {0x8D,0x51},
+ {0x8D,0x52}, {0x8D,0x53}, {0x8D,0x54}, {0x8D,0x55},
+ {0x8D,0x56}, {0x8D,0x57}, {0x8D,0x58}, {0x8D,0x59},
+ {0x8D,0x5A}, {0x8D,0x5B}, {0x8D,0x5C}, {0x8D,0x5D},
+ {0x8D,0x5E}, {0x8D,0x5F}, {0x8D,0x60}, {0x8D,0x61},
+ {0x8D,0x62}, {0x8D,0x63}, {0x8D,0x64}, {0x8D,0x65},
+ {0x8D,0x66}, {0x8D,0x67}, {0x8D,0x68}, {0x8D,0x69},
+ {0x8D,0x6A}, {0x8D,0x6B}, {0x8D,0x6C}, {0x8D,0x6D},
+ {0x8D,0x6E}, {0x8D,0x6F}, {0x8D,0x70}, {0x8D,0x71},
+ {0x8D,0x72}, {0x8D,0x73}, {0x8D,0x74}, {0x8D,0x75},
+ {0x8D,0x76}, {0x8D,0x77}, {0x8D,0x78}, {0x8D,0x79},
+ {0x8D,0x7A}, {0x8D,0x7B}, {0x8D,0x7C}, {0x8D,0x7D},
+ {0x8D,0x7E}, {0x8D,0xA1}, {0x8D,0xA2}, {0x8D,0xA3},
+ {0x8D,0xA4}, {0x8D,0xA5}, {0x8D,0xA6}, {0x8D,0xA7},
+ {0x8D,0xA8}, {0x8D,0xA9}, {0x8D,0xAA}, {0x8D,0xAB},
+ {0x8D,0xAC}, {0x8D,0xAD}, {0x8D,0xAE}, {0x8D,0xAF},
+ {0x8D,0xB0}, {0x8D,0xB1}, {0x8D,0xB2}, {0x8D,0xB3},
+ {0x8D,0xB4}, {0x8D,0xB5}, {0x8D,0xB6}, {0x8D,0xB7},
+ {0x8D,0xB8}, {0x8D,0xB9}, {0x8D,0xBA}, {0x8D,0xBB},
+ {0x8D,0xBC}, {0x8D,0xBD}, {0x8D,0xBE}, {0x8D,0xBF},
+ {0x8D,0xC0}, {0x8D,0xC1}, {0x8D,0xC2}, {0x8D,0xC3},
+ {0x8D,0xC4}, {0x8D,0xC5}, {0x8D,0xC6}, {0x8D,0xC7},
+ {0x8D,0xC8}, {0x8D,0xC9}, {0x8D,0xCA}, {0x8D,0xCB},
+ {0x8D,0xCC}, {0x8D,0xCD}, {0x8D,0xCE}, {0x8D,0xCF},
+ {0x8D,0xD0}, {0x8D,0xD1}, {0x8D,0xD2}, {0x8D,0xD3},
+ {0x8D,0xD4}, {0x8D,0xD5}, {0x8D,0xD6}, {0x8D,0xD7},
+ {0x8D,0xD8}, {0x8D,0xD9}, {0x8D,0xDA}, {0x8D,0xDB},
+ {0x8D,0xDC}, {0x8D,0xDD}, {0x8D,0xDE}, {0x8D,0xDF},
+ {0x8D,0xE0}, {0x8D,0xE1}, {0x8D,0xE2}, {0x8D,0xE3},
+ {0x8D,0xE4}, {0x8D,0xE5}, {0x8D,0xE6}, {0x8D,0xE7},
+ {0x8D,0xE8}, {0x8D,0xE9}, {0x8D,0xEA}, {0x8D,0xEB},
+ {0x8D,0xEC}, {0x8D,0xED}, {0x8D,0xEE}, {0x8D,0xEF},
+ {0x8D,0xF0}, {0x8D,0xF1}, {0x8D,0xF2}, {0x8D,0xF3},
+ {0x8D,0xF4}, {0x8D,0xF5}, {0x8D,0xF6}, {0x8D,0xF7},
+ {0x8D,0xF8}, {0x8D,0xF9}, {0x8D,0xFA}, {0x8D,0xFB},
+ {0x8D,0xFC}, {0x8D,0xFD}, {0x8D,0xFE}, {0xC6,0xA1},
+ {0xC6,0xA2}, {0xC6,0xA3}, {0xC6,0xA4}, {0xC6,0xA5},
+ {0xC6,0xA6}, {0xC6,0xA7}, {0xC6,0xA8}, {0xC6,0xA9},
+ {0xC6,0xAA}, {0xC6,0xAB}, {0xC6,0xAC}, {0xC6,0xAD},
+ {0xC6,0xAE}, {0xC6,0xAF}, {0xC6,0xB0}, {0xC6,0xB1},
+ {0xC6,0xB2}, {0xC6,0xB3}, {0xC6,0xB4}, {0xC6,0xB5},
+ {0xC6,0xB6}, {0xC6,0xB7}, {0xC6,0xB8}, {0xC6,0xB9},
+ {0xC6,0xBA}, {0xC6,0xBB}, {0xC6,0xBC}, {0xC6,0xBD},
+ {0xC6,0xBE}, {0xC6,0xBF}, {0xC6,0xC0}, {0xC6,0xC1},
+ {0xC6,0xC2}, {0xC6,0xC3}, {0xC6,0xC4}, {0xC6,0xC5},
+ {0xC6,0xC6}, {0xC6,0xC7}, {0xC6,0xC8}, {0xC6,0xC9},
+ {0xC6,0xCA}, {0xC6,0xCB}, {0xC6,0xCC}, {0xC6,0xCD},
+ {0xC6,0xCE}, {0xC6,0xCF}, {0xC6,0xD0}, {0xC6,0xD1},
+ {0xC6,0xD2}, {0xC6,0xD3}, {0xC6,0xD4}, {0xC6,0xD5},
+ {0xC6,0xD6}, {0xC6,0xD7}, {0xC6,0xD8}, {0xC6,0xD9},
+ {0xC6,0xDA}, {0xC6,0xDB}, {0xC6,0xDC}, {0xC6,0xDD},
+ {0xC6,0xDE}, {0xC6,0xDF}, {0xC6,0xE0}, {0xC6,0xE1},
+ {0xC6,0xE2}, {0xC6,0xE3}, {0xC6,0xE4}, {0xC6,0xE5},
+ {0xC6,0xE6}, {0xC6,0xE7}, {0xC6,0xE8}, {0xC6,0xE9},
+ {0xC6,0xEA}, {0xC6,0xEB}, {0xC6,0xEC}, {0xC6,0xED},
+ {0xC6,0xEE}, {0xC6,0xEF}, {0xC6,0xF0}, {0xC6,0xF1},
+ {0xC6,0xF2}, {0xC6,0xF3}, {0xC6,0xF4}, {0xC6,0xF5},
+ {0xC6,0xF6}, {0xC6,0xF7}, {0xC6,0xF8}, {0xC6,0xF9},
+ {0xC6,0xFA}, {0xC6,0xFB}, {0xC6,0xFC}, {0xC6,0xFD},
+ {0xC6,0xFE}, {0xC7,0x40}, {0xC7,0x41}, {0xC7,0x42},
+ {0xC7,0x43}, {0xC7,0x44}, {0xC7,0x45}, {0xC7,0x46},
+ {0xC7,0x47}, {0xC7,0x48}, {0xC7,0x49}, {0xC7,0x4A},
+ {0xC7,0x4B}, {0xC7,0x4C}, {0xC7,0x4D}, {0xC7,0x4E},
+ {0xC7,0x4F}, {0xC7,0x50}, {0xC7,0x51}, {0xC7,0x52},
+ {0xC7,0x53}, {0xC7,0x54}, {0xC7,0x55}, {0xC7,0x56},
+ {0xC7,0x57}, {0xC7,0x58}, {0xC7,0x59}, {0xC7,0x5A},
+ {0xC7,0x5B}, {0xC7,0x5C}, {0xC7,0x5D}, {0xC7,0x5E},
+ {0xC7,0x5F}, {0xC7,0x60}, {0xC7,0x61}, {0xC7,0x62},
+ {0xC7,0x63}, {0xC7,0x64}, {0xC7,0x65}, {0xC7,0x66},
+ {0xC7,0x67}, {0xC7,0x68}, {0xC7,0x69}, {0xC7,0x6A},
+ {0xC7,0x6B}, {0xC7,0x6C}, {0xC7,0x6D}, {0xC7,0x6E},
+ {0xC7,0x6F}, {0xC7,0x70}, {0xC7,0x71}, {0xC7,0x72},
+ {0xC7,0x73}, {0xC7,0x74}, {0xC7,0x75}, {0xC7,0x76},
+ {0xC7,0x77}, {0xC7,0x78}, {0xC7,0x79}, {0xC7,0x7A},
+ {0xC7,0x7B}, {0xC7,0x7C}, {0xC7,0x7D}, {0xC7,0x7E},
+ {0xC7,0xA1}, {0xC7,0xA2}, {0xC7,0xA3}, {0xC7,0xA4},
+ {0xC7,0xA5}, {0xC7,0xA6}, {0xC7,0xA7}, {0xC7,0xA8},
+ {0xC7,0xA9}, {0xC7,0xAA}, {0xC7,0xAB}, {0xC7,0xAC},
+ {0xC7,0xAD}, {0xC7,0xAE}, {0xC7,0xAF}, {0xC7,0xB0},
+ {0xC7,0xB1}, {0xC7,0xB2}, {0xC7,0xB3}, {0xC7,0xB4},
+ {0xC7,0xB5}, {0xC7,0xB6}, {0xC7,0xB7}, {0xC7,0xB8},
+ {0xC7,0xB9}, {0xC7,0xBA}, {0xC7,0xBB}, {0xC7,0xBC},
+ {0xC7,0xBD}, {0xC7,0xBE}, {0xC7,0xBF}, {0xC7,0xC0},
+ {0xC7,0xC1}, {0xC7,0xC2}, {0xC7,0xC3}, {0xC7,0xC4},
+ {0xC7,0xC5}, {0xC7,0xC6}, {0xC7,0xC7}, {0xC7,0xC8},
+ {0xC7,0xC9}, {0xC7,0xCA}, {0xC7,0xCB}, {0xC7,0xCC},
+ {0xC7,0xCD}, {0xC7,0xCE}, {0xC7,0xCF}, {0xC7,0xD0},
+ {0xC7,0xD1}, {0xC7,0xD2}, {0xC7,0xD3}, {0xC7,0xD4},
+ {0xC7,0xD5}, {0xC7,0xD6}, {0xC7,0xD7}, {0xC7,0xD8},
+ {0xC7,0xD9}, {0xC7,0xDA}, {0xC7,0xDB}, {0xC7,0xDC},
+ {0xC7,0xDD}, {0xC7,0xDE}, {0xC7,0xDF}, {0xC7,0xE0},
+ {0xC7,0xE1}, {0xC7,0xE2}, {0xC7,0xE3}, {0xC7,0xE4},
+ {0xC7,0xE5}, {0xC7,0xE6}, {0xC7,0xE7}, {0xC7,0xE8},
+ {0xC7,0xE9}, {0xC7,0xEA}, {0xC7,0xEB}, {0xC7,0xEC},
+ {0xC7,0xED}, {0xC7,0xEE}, {0xC7,0xEF}, {0xC7,0xF0},
+ {0xC7,0xF1}, {0xC7,0xF2}, {0xC7,0xF3}, {0xC7,0xF4},
+ {0xC7,0xF5}, {0xC7,0xF6}, {0xC7,0xF7}, {0xC7,0xF8},
+ {0xC7,0xF9}, {0xC7,0xFA}, {0xC7,0xFB}, {0xC7,0xFC},
+ {0xC7,0xFD}, {0xC7,0xFE}, {0xC8,0x40}, {0xC8,0x41},
+ {0xC8,0x42}, {0xC8,0x43}, {0xC8,0x44}, {0xC8,0x45},
+ {0xC8,0x46}, {0xC8,0x47}, {0xC8,0x48}, {0xC8,0x49},
+ {0xC8,0x4A}, {0xC8,0x4B}, {0xC8,0x4C}, {0xC8,0x4D},
+ {0xC8,0x4E}, {0xC8,0x4F}, {0xC8,0x50}, {0xC8,0x51},
+ {0xC8,0x52}, {0xC8,0x53}, {0xC8,0x54}, {0xC8,0x55},
+ {0xC8,0x56}, {0xC8,0x57}, {0xC8,0x58}, {0xC8,0x59},
+ {0xC8,0x5A}, {0xC8,0x5B}, {0xC8,0x5C}, {0xC8,0x5D},
+ {0xC8,0x5E}, {0xC8,0x5F}, {0xC8,0x60}, {0xC8,0x61},
+ {0xC8,0x62}, {0xC8,0x63}, {0xC8,0x64}, {0xC8,0x65},
+ {0xC8,0x66}, {0xC8,0x67}, {0xC8,0x68}, {0xC8,0x69},
+ {0xC8,0x6A}, {0xC8,0x6B}, {0xC8,0x6C}, {0xC8,0x6D},
+ {0xC8,0x6E}, {0xC8,0x6F}, {0xC8,0x70}, {0xC8,0x71},
+ {0xC8,0x72}, {0xC8,0x73}, {0xC8,0x74}, {0xC8,0x75},
+ {0xC8,0x76}, {0xC8,0x77}, {0xC8,0x78}, {0xC8,0x79},
+ {0xC8,0x7A}, {0xC8,0x7B}, {0xC8,0x7C}, {0xC8,0x7D},
+ {0xC8,0x7E}, {0xC8,0xA1}, {0xC8,0xA2}, {0xC8,0xA3},
+ {0xC8,0xA4}, {0xC8,0xA5}, {0xC8,0xA6}, {0xC8,0xA7},
+ {0xC8,0xA8}, {0xC8,0xA9}, {0xC8,0xAA}, {0xC8,0xAB},
+ {0xC8,0xAC}, {0xC8,0xAD}, {0xC8,0xAE}, {0xC8,0xAF},
+ {0xC8,0xB0}, {0xC8,0xB1}, {0xC8,0xB2}, {0xC8,0xB3},
+ {0xC8,0xB4}, {0xC8,0xB5}, {0xC8,0xB6}, {0xC8,0xB7},
+ {0xC8,0xB8}, {0xC8,0xB9}, {0xC8,0xBA}, {0xC8,0xBB},
+ {0xC8,0xBC}, {0xC8,0xBD}, {0xC8,0xBE}, {0xC8,0xBF},
+ {0xC8,0xC0}, {0xC8,0xC1}, {0xC8,0xC2}, {0xC8,0xC3},
+ {0xC8,0xC4}, {0xC8,0xC5}, {0xC8,0xC6}, {0xC8,0xC7},
+ {0xC8,0xC8}, {0xC8,0xC9}, {0xC8,0xCA}, {0xC8,0xCB},
+ {0xC8,0xCC}, {0xC8,0xCD}, {0xC8,0xCE}, {0xC8,0xCF},
+ {0xC8,0xD0}, {0xC8,0xD1}, {0xC8,0xD2}, {0xC8,0xD3},
+ {0xC8,0xD4}, {0xC8,0xD5}, {0xC8,0xD6}, {0xC8,0xD7},
+ {0xC8,0xD8}, {0xC8,0xD9}, {0xC8,0xDA}, {0xC8,0xDB},
+ {0xC8,0xDC}, {0xC8,0xDD}, {0xC8,0xDE}, {0xC8,0xDF},
+ {0xC8,0xE0}, {0xC8,0xE1}, {0xC8,0xE2}, {0xC8,0xE3},
+ {0xC8,0xE4}, {0xC8,0xE5}, {0xC8,0xE6}, {0xC8,0xE7},
+ {0xC8,0xE8}, {0xC8,0xE9}, {0xC8,0xEA}, {0xC8,0xEB},
+ {0xC8,0xEC}, {0xC8,0xED}, {0xC8,0xEE}, {0xC8,0xEF},
+ {0xC8,0xF0}, {0xC8,0xF1}, {0xC8,0xF2}, {0xC8,0xF3},
+ {0xC8,0xF4}, {0xC8,0xF5}, {0xC8,0xF6}, {0xC8,0xF7},
+ {0xC8,0xF8}, {0xC8,0xF9}, {0xC8,0xFA}, {0xC8,0xFB},
+ {0xC8,0xFC}, {0xC8,0xFD}, {0xC8,0xFE}, {0xFF,0x00},
+ {0xB0,0x5A}, {0xA7,0xF3}, {0xA8,0xAE}, {0xB8,0xEB},
+ {0xB7,0xC6}, {0xA6,0xEA}, {0xA5,0x79}, {0x8B,0xF8},
+ {0xC0,0x74}, {0xAB,0xB4}, {0xAA,0xF7}, {0xB3,0xE2},
+ {0xA9,0x60}, {0xC3,0x69}, {0xC4,0xEE}, {0xC3,0xB9},
+ {0xC5,0xDA}, {0xC1,0xB3}, {0xBB,0x72}, {0xC5,0xDE},
+ {0xBC,0xD6}, {0xAC,0xA5}, {0xAF,0x4F}, {0xAF,0x5F},
+ {0xB8,0xA8}, {0xB9,0x54}, {0xC0,0x64}, {0xB6,0xC3},
+ {0xA7,0x5A}, {0xC4,0xE6}, {0xC4,0xEA}, {0xC4,0xF5},
+ {0xC6,0x7D}, {0xB4,0x50}, {0xC0,0xDD}, {0xC2,0xC5},
+ {0xC4,0xB0}, {0xA9,0xD4}, {0xC3,0xBE}, {0xC4,0xFA},
+ {0xB4,0x59}, {0xAE,0xD4}, {0xAE,0xF6}, {0xAF,0x54},
+ {0xA8,0xD3}, {0xA7,0x4E}, {0xB3,0xD2}, {0xBE,0xDB},
+ {0xC3,0x72}, {0xC4,0x6C}, {0xBF,0x63}, {0xA6,0xD1},
+ {0xC4,0xAA}, {0xB8,0xB8}, {0xB8,0xF4}, {0xC5,0x53},
+ {0xBE,0x7C}, {0xC6,0x4F}, {0xB8,0x4C}, {0xB8,0x53},
+ {0xBA,0xF1}, {0xDB,0x77}, {0xBF,0xFD}, {0xB3,0xC0},
+ {0xBD,0xD7}, {0xC3,0x62}, {0xA7,0xCB}, {0xC5,0xA2},
+ {0xC5,0xA4}, {0xA8,0x63}, {0xBD,0x55}, {0xB8,0xEF},
+ {0xB9,0x70}, {0xC2,0x53}, {0xB9,0xF0}, {0xBC,0xD3},
+ {0xB2,0x5C}, {0xBA,0x7C}, {0xB2,0xD6}, {0xC1,0x5C},
+ {0xAD,0xAE}, {0xB0,0xC7}, {0xA6,0xD8}, {0xBB,0xFE},
+ {0xAD,0xE2}, {0xB8,0x57}, {0xBA,0xF0}, {0xB5,0xD9},
+ {0xB3,0xAE}, {0xC5,0xAA}, {0xCE,0xD4}, {0xBC,0xD6},
+ {0xBF,0xD5}, {0xA4,0xA6}, {0xB9,0xE7}, {0xAB,0xE3},
+ {0xB2,0x76}, {0xB2,0xA7}, {0xA5,0x5F}, {0xED,0xA8},
+ {0xAB,0x4B}, {0xB4,0x5F}, {0xA4,0xA3}, {0xAA,0x63},
+ {0xBC,0xC6}, {0xAF,0xC1}, {0xB0,0xD1}, {0xB6,0xEB},
+ {0xAC,0xD9}, {0xB8,0xAD}, {0xBB,0xA1}, {0xB1,0xFE},
+ {0xA8,0xB0}, {0xA8,0x48}, {0xAC,0x42}, {0xAD,0x59},
+ {0xB1,0xB0}, {0xB2,0xA4}, {0xAB,0x47}, {0xA8,0xE2},
+ {0xB1,0xE7}, {0xC2,0xB3}, {0xA8,0x7D}, {0xBD,0xCC},
+ {0xB6,0x71}, {0xC0,0x79}, {0xA7,0x66}, {0xA4,0x6B},
+ {0xC3,0x66}, {0xAE,0xC8}, {0xC2,0x6F}, {0xC4,0x72},
+ {0xBE,0x5B}, {0xC6,0x7A}, {0xC4,0x52}, {0xBE,0xA4},
+ {0xA4,0x4F}, {0xBE,0xE4}, {0xBE,0xFA}, {0xF7,0x65},
+ {0xA6,0x7E}, {0xBC,0xA6}, {0xC5,0xCA}, {0xBC,0xBF},
+ {0xBA,0xA7}, {0xB7,0xD2}, {0xE6,0xA3}, {0xBD,0x6D},
+ {0xC1,0x70}, {0xBD,0xFB}, {0xBD,0xAC}, {0xB3,0x73},
+ {0xC1,0xE5}, {0xA6,0x43}, {0xA6,0x48}, {0xAB,0x7C},
+ {0xAF,0x50}, {0xB5,0xF5}, {0xBB,0xA1}, {0xB7,0x47},
+ {0xA9,0xC0}, {0xB1,0xC9}, {0xC0,0xD4}, {0xC3,0xAE},
+ {0xC2,0x79}, {0xA5,0x4F}, {0xCB,0xF1}, {0xB9,0xE7},
+ {0xC0,0xAD}, {0xCC,0xB0}, {0xAC,0xC2}, {0xBC,0xFC},
+ {0xB2,0xDC}, {0xB2,0xE2}, {0xB9,0x61}, {0xB9,0x73},
+ {0xC6,0x46}, {0xBB,0xE2}, {0xA8,0xD2}, {0xC2,0xA7},
+ {0xC4,0xBF}, {0xC1,0xF5}, {0xB4,0x63}, {0xA4,0x46},
+ {0xB9,0xB1}, {0xBC,0x64}, {0xA7,0xBF}, {0xAE,0xC6},
+ {0xBC,0xD6}, {0xBF,0x52}, {0xC0,0xF8}, {0xE7,0x64},
+ {0xBF,0xF1}, {0xC0,0x73}, {0xB7,0x77}, {0xA8,0xBF},
+ {0xBC,0x42}, {0xCC,0xD8}, {0xAC,0x68}, {0xAC,0x79},
+ {0xB7,0xC8}, {0xAF,0x5B}, {0xAF,0x64}, {0xB2,0xB8},
+ {0xAF,0xC3}, {0xC3,0xFE}, {0xA4,0xBB}, {0xBC,0xAE},
+ {0xB3,0xB0}, {0xAD,0xDB}, {0xB1,0x5B}, {0xB2,0x5F},
+ {0xBD,0xFC}, {0xAB,0xDF}, {0xB7,0x58}, {0xAE,0xDF},
+ {0xB2,0x76}, {0xB6,0xA9}, {0xA7,0x51}, {0xA6,0x4F},
+ {0xBC,0x69}, {0xA9,0xF6}, {0xA7,0xF5}, {0xB1,0xF9},
+ {0xAA,0x64}, {0xB2,0x7A}, {0xB5,0x67}, {0xBF,0xA9},
+ {0xB8,0xCC}, {0xA8,0xBD}, {0xC2,0xF7}, {0xB0,0xCE},
+ {0xB7,0xC4}, {0xA7,0x5B}, {0xBF,0x4D}, {0xBF,0x5A},
+ {0xC4,0xA9}, {0xC5,0xEC}, {0xC5,0xEF}, {0xAA,0x4C},
+ {0xB2,0x4F}, {0xC1,0x7B}, {0xA5,0xDF}, {0xB2,0xC1},
+ {0xB2,0xC9}, {0xAA,0xAC}, {0xAA,0xA5}, {0xC3,0xD1},
+ {0xA4,0xB0}, {0xAF,0xF9}, {0xA8,0xEB}, {0xA4,0xC1},
+ {0xAB,0xD7}, {0xA9,0xDD}, {0xBF,0x7D}, {0xA6,0x76},
+ {0xAC,0x7D}, {0xBC,0xC9}, {0xBF,0xE7}, {0xA6,0xE6},
+ {0xAD,0xB0}, {0xA8,0xA3}, {0xB9,0xF8}, {0xC9,0x4A},
+ {0xDD,0xFC}, {0xB6,0xEF}, {0xB4,0xB8}, {0xE8,0xF9},
+ {0xBD,0xDE}, {0xAF,0x71}, {0xAF,0xAB}, {0xB2,0xBB},
+ {0xBA,0xD6}, {0xB9,0x74}, {0xBA,0xEB}, {0xA6,0xD0},
+ {0xBD,0xD1}, {0xB6,0x68}, {0xB3,0xA3}, {0xB6,0xBA},
+ {0xB9,0x7D}, {0xC0,0x5D}, {0xC5,0x62}, {0xA1,0x4A},
+ {0xA1,0x57}, {0xA1,0x59}, {0xA1,0x5B}, {0xA1,0x5F},
+ {0xA1,0x60}, {0xA1,0x63}, {0xA1,0x64}, {0xA1,0x67},
+ {0xA1,0x68}, {0xA1,0x6B}, {0xA1,0x6C}, {0xA1,0x6F},
+ {0xA1,0x70}, {0xA1,0x73}, {0xA1,0x74}, {0xA1,0x77},
+ {0xA1,0x78}, {0xA1,0x7B}, {0xA1,0x7C}, {0xA1,0xC6},
+ {0xA1,0xC7}, {0xA1,0xCA}, {0xA1,0xCB}, {0xA1,0xC8},
+ {0xA1,0xC9}, {0xA1,0x5C}, {0xA1,0x4D}, {0xA1,0x4E},
+ {0xA1,0x4F}, {0xA1,0x51}, {0xA1,0x52}, {0xA1,0x53},
+ {0xA1,0x54}, {0xA1,0x7D}, {0xA1,0x7E}, {0xA1,0xA1},
+ {0xA1,0xA2}, {0xA1,0xA3}, {0xA1,0xA4}, {0xA1,0xCC},
+ {0xA1,0xCD}, {0xA1,0xCE}, {0xA1,0xDE}, {0xA1,0xDF},
+ {0xA1,0xE0}, {0xA1,0xE1}, {0xA1,0xE2}, {0xA2,0x42},
+ {0xA2,0x4C}, {0xA2,0x4D}, {0xA2,0x4E}, {0xA1,0x49},
+ {0xC8,0xD0}, {0xA1,0xAD}, {0xA2,0x43}, {0xA2,0x48},
+ {0xA1,0xAE}, {0xC8,0xCF}, {0xA1,0x5D}, {0xA1,0x5E},
+ {0xA1,0xAF}, {0xA1,0xCF}, {0xA1,0x41}, {0xA1,0xD0},
+ {0xA1,0x44}, {0xA1,0xFE}, {0xA2,0xAF}, {0xA2,0xB0},
+ {0xA2,0xB1}, {0xA2,0xB2}, {0xA2,0xB3}, {0xA2,0xB4},
+ {0xA2,0xB5}, {0xA2,0xB6}, {0xA2,0xB7}, {0xA2,0xB8},
+ {0xA1,0x47}, {0xA1,0x46}, {0xA1,0xD5}, {0xA1,0xD7},
+ {0xA1,0xD6}, {0xA1,0x48}, {0xA2,0x49}, {0xA2,0xCF},
+ {0xA2,0xD0}, {0xA2,0xD1}, {0xA2,0xD2}, {0xA2,0xD3},
+ {0xA2,0xD4}, {0xA2,0xD5}, {0xA2,0xD6}, {0xA2,0xD7},
+ {0xA2,0xD8}, {0xA2,0xD9}, {0xA2,0xDA}, {0xA2,0xDB},
+ {0xA2,0xDC}, {0xA2,0xDD}, {0xA2,0xDE}, {0xA2,0xDF},
+ {0xA2,0xE0}, {0xA2,0xE1}, {0xA2,0xE2}, {0xA2,0xE3},
+ {0xA2,0xE4}, {0xA2,0xE5}, {0xA2,0xE6}, {0xA2,0xE7},
+ {0xA2,0xE8}, {0xC6,0xE4}, {0xA2,0x40}, {0xC6,0xE5},
+ {0xA1,0x73}, {0xA1,0xC4}, {0xA1,0xA5}, {0xA2,0xE9},
+ {0xA2,0xEA}, {0xA2,0xEB}, {0xA2,0xEC}, {0xA2,0xED},
+ {0xA2,0xEE}, {0xA2,0xEF}, {0xA2,0xF0}, {0xA2,0xF1},
+ {0xA2,0xF2}, {0xA2,0xF3}, {0xA2,0xF4}, {0xA2,0xF5},
+ {0xA2,0xF6}, {0xA2,0xF7}, {0xA2,0xF8}, {0xA2,0xF9},
+ {0xA2,0xFA}, {0xA2,0xFB}, {0xA2,0xFC}, {0xA2,0xFD},
+ {0xA2,0xFE}, {0xA3,0x40}, {0xA3,0x41}, {0xA3,0x42},
+ {0xA3,0x43}, {0xA1,0x61}, {0xA1,0x55}, {0xA1,0x62},
+ {0xA1,0xE3}, {0xA1,0x4E}, {0xA2,0x46}, {0xA2,0x47},
+ {0xC8,0xCD}, {0xA1,0xC3}, {0xC8,0xCE}, {0xA2,0x44},
+ {0xF9,0xFE}, {0x9C,0x71}, {0x93,0x75}, {0x93,0x76},
+ {0x95,0x48}, {0x8E,0xC6}, {0x8B,0xC5}, {0x8B,0xFA},
+ {0xC8,0x7C}, {0x9A,0xB4}, {0x88,0x4E}, {0x88,0x4B},
+ {0xC8,0x7A}, {0x88,0x48}, {0x88,0x47}, {0xA0,0xF6},
+ {0x88,0x45}, {0x88,0x53}, {0xFC,0xAD}, {0x8A,0xAD},
+ {0x92,0x72}, {0xFC,0x47}, {0x94,0xDF}, {0x9F,0xD1},
+ {0xFB,0xCB}, {0x92,0x7D}, {0x98,0xA4}, {0x94,0xE7},
+ {0x90,0xCB}, {0x92,0x7B}, {0x94,0xD8}, {0xFC,0x5F},
+ {0xFA,0x54}, {0x9A,0xB5}, {0x96,0xDA}, {0x92,0x79},
+ {0xFA,0x74}, {0x92,0x75}, {0x8D,0xFB}, {0x8A,0x49},
+ {0x92,0xDF}, {0x9B,0x7C}, {0xFA,0x63}, {0xFA,0x60},
+ {0x92,0x6D}, {0xFA,0x62}, {0x9A,0xB6}, {0x97,0x6B},
+ {0xFD,0x6A}, {0xFD,0x54}, {0x92,0x73}, {0x97,0xD8},
+ {0x9F,0xBB}, {0x93,0x42}, {0x92,0x76}, {0xFA,0x65},
+ {0x92,0x6C}, {0xFA,0x6E}, {0x9E,0xE0}, {0x92,0xC0},
+ {0x92,0xBF}, {0x92,0xBE}, {0x9A,0xBA}, {0x8A,0xB3},
+ {0x97,0x75}, {0xFA,0x40}, {0xFA,0x76}, {0xFB,0xD0},
+ {0xFA,0x7B}, {0xFE,0x6D}, {0x9B,0xB3}, {0x89,0xCC},
+ {0x9A,0xBE}, {0xFA,0x42}, {0x92,0xBC}, {0x94,0x5C},
+ {0x9B,0xB5}, {0x9A,0xBF}, {0x98,0xA7}, {0x97,0xA4},
+ {0x90,0xFD}, {0xFC,0x7B}, {0x9A,0xC0}, {0x92,0xC3},
+ {0x8A,0xAA}, {0x9B,0xD0}, {0x95,0x50}, {0x92,0xC6},
+ {0x98,0xA6}, {0x95,0x46}, {0xFD,0x63}, {0xFA,0xC2},
+ {0x9E,0xC3}, {0x89,0xB2}, {0x9C,0x66}, {0x90,0x53},
+ {0x97,0xC1}, {0x9A,0xC4}, {0x9A,0xC5}, {0x8E,0xEF},
+ {0xFA,0xE9}, {0x92,0x62}, {0x8A,0xF7}, {0x9A,0xC6},
+ {0x92,0xE1}, {0x9A,0xC9}, {0xFA,0xC6}, {0x97,0xA5},
+ {0x9A,0xCB}, {0xFA,0x72}, {0x8A,0x5E}, {0x94,0xE0},
+ {0x92,0xCC}, {0x8A,0xE5}, {0xFE,0x5C}, {0x9A,0xCC},
+ {0x9D,0xF9}, {0x8A,0x43}, {0x8A,0xA6}, {0x9A,0xCD},
+ {0x9A,0xCE}, {0xFA,0xEE}, {0x9B,0xCC}, {0x9A,0xCF},
+ {0x9A,0xD1}, {0x9D,0xFA}, {0x9D,0x7C}, {0x9A,0xD3},
+ {0x97,0xA6}, {0x99,0x5F}, {0xFB,0xF6}, {0x9F,0xC5},
+ {0x8A,0x59}, {0x8B,0x6B}, {0x9A,0xD4}, {0x9A,0xD5},
+ {0x97,0xA2}, {0x8A,0x44}, {0x9F,0x4A}, {0x90,0xA1},
+ {0xFD,0xA4}, {0x8A,0x64}, {0x8A,0xF2}, {0x8A,0xF8},
+ {0x9D,0xD8}, {0x94,0xD6}, {0xFA,0xFE}, {0xFB,0xA7},
+ {0x9A,0xD6}, {0x9F,0x4D}, {0xFA,0xF6}, {0x8A,0x57},
+ {0x8B,0x43}, {0x8B,0x44}, {0x8A,0xB6}, {0x8A,0xC0},
+ {0x9E,0x54}, {0x9A,0xD7}, {0x9A,0xD8}, {0x9A,0xDC},
+ {0x8A,0xCA}, {0x9E,0xA8}, {0x92,0x63}, {0x9A,0xDD},
+ {0x8B,0x65}, {0x8B,0x6F}, {0x8B,0x7E}, {0x8F,0x43},
+ {0x92,0xD0}, {0x8A,0xF4}, {0x9D,0xBE}, {0x9A,0xE1},
+ {0xFC,0xDE}, {0x9D,0xFD}, {0x8B,0x66}, {0x8B,0x70},
+ {0x8B,0x75}, {0x8A,0xE4}, {0x8B,0xA4}, {0x8A,0xED},
+ {0x8A,0x5D}, {0x8B,0x48}, {0x9D,0xED}, {0x9E,0x40},
+ {0x8A,0xEF}, {0x8A,0xF6}, {0x9E,0x76}, {0x9E,0xE3},
+ {0x9A,0xDE}, {0x8D,0xFE}, {0xFA,0xFC}, {0x9C,0xB1},
+ {0x9E,0x77}, {0x8B,0x64}, {0x8B,0x67}, {0x97,0x4B},
+ {0x96,0x53}, {0x9A,0xE0}, {0x8B,0x4A}, {0x8A,0xF1},
+ {0x8A,0xD7}, {0xA0,0xAB}, {0x8A,0xB5}, {0x8A,0x5F},
+ {0x8A,0xEE}, {0x9A,0xDF}, {0x8A,0xFE}, {0x8A,0x58},
+ {0x8B,0xA3}, {0x8B,0xA7}, {0x9A,0xE3}, {0x92,0x61},
+ {0x9D,0xD7}, {0x9E,0x7D}, {0x9E,0xA7}, {0x9E,0xAB},
+ {0x90,0x42}, {0x8B,0x79}, {0x8B,0x7A}, {0x9A,0xE6},
+ {0x9A,0xE5}, {0x8A,0x7E}, {0x9E,0x44}, {0x9A,0xE7},
+ {0x8A,0x7C}, {0x8B,0x71}, {0x9A,0xE9}, {0x9A,0xEA},
+ {0x9A,0xEB}, {0x8A,0xBD}, {0xFB,0x4E}, {0x9A,0xED},
+ {0x8A,0xF9}, {0x9E,0x63}, {0x8B,0x49}, {0x8A,0xCE},
+ {0x8B,0x6E}, {0x8A,0xE8}, {0x9A,0xEE}, {0x92,0xCE},
+ {0x8A,0x5A}, {0x8B,0x7B}, {0x8B,0x7C}, {0x9A,0xEF},
+ {0x9A,0xF0}, {0x8A,0xFA}, {0x89,0x41}, {0x8B,0x72},
+ {0x8A,0xF3}, {0x8B,0xA8}, {0x9E,0xAE}, {0x9E,0x72},
+ {0xFB,0x73}, {0xFB,0x5F}, {0x90,0xBA}, {0x91,0xFE},
+ {0x9E,0xF6}, {0x97,0xED}, {0x9A,0xF3}, {0xA0,0xEE},
+ {0x96,0x7C}, {0x93,0x45}, {0x98,0x6E}, {0xFA,0x56},
+ {0x9A,0xF5}, {0xFC,0x4B}, {0x9A,0xF4}, {0xFE,0xDE},
+ {0xFC,0xB7}, {0x97,0xF1}, {0x97,0xC7}, {0x9C,0xCB},
+ {0x92,0x40}, {0x9C,0xE8}, {0x91,0xFD}, {0x97,0x4E},
+ {0xFB,0x68}, {0x97,0x6C}, {0x8C,0xC2}, {0x97,0xE8},
+ {0xFB,0x6A}, {0x8B,0x74}, {0x8E,0xE7}, {0xFD,0xC8},
+ {0x92,0x41}, {0x96,0xA1}, {0x8E,0xF3}, {0x9A,0xF7},
+ {0x8F,0xA6}, {0xFA,0xD6}, {0x9C,0xC7}, {0xFA,0xD7},
+ {0x9A,0xF8}, {0xFB,0xA1}, {0x8E,0xC5}, {0xFB,0xA4},
+ {0xFB,0xC2}, {0x9A,0xC1}, {0x91,0xFA}, {0xFE,0xDB},
+ {0x97,0xAB}, {0x91,0x47}, {0xFB,0xB1}, {0x8F,0xEA},
+ {0x94,0xD2}, {0xFE,0x61}, {0xFA,0xCE}, {0x92,0xED},
+ {0x91,0xF3}, {0x93,0xC6}, {0x93,0x5A}, {0xFA,0xFB},
+ {0x92,0xEF}, {0xFA,0xC8}, {0x98,0x47}, {0x93,0x66},
+ {0x98,0x55}, {0x96,0xE6}, {0x9F,0x43}, {0x9F,0xAA},
+ {0x94,0xDA}, {0x92,0xEE}, {0xFC,0xAF}, {0xFB,0xFB},
+ {0x8E,0xF9}, {0x91,0xF6}, {0x93,0x64}, {0x94,0xF5},
+ {0x9C,0xB6}, {0xFB,0xAD}, {0x98,0x4E}, {0x8F,0x44},
+ {0x96,0xFD}, {0x9A,0xF9}, {0x9A,0xFA}, {0x97,0x69},
+ {0x95,0xD4}, {0x98,0x4B}, {0xFB,0xAA}, {0x98,0x7C},
+ {0x91,0xEA}, {0x9D,0xAF}, {0x9D,0xC5}, {0x91,0xF1},
+ {0x8E,0xB1}, {0x97,0xA9}, {0xFB,0xAC}, {0xFC,0xB8},
+ {0x9C,0xB9}, {0xFB,0xB0}, {0xFC,0xD2}, {0x93,0xCB},
+ {0x9A,0xFD}, {0x91,0xF4}, {0x8B,0xAC}, {0xA0,0x55},
+ {0x95,0x74}, {0x95,0xBE}, {0x97,0xAD}, {0x8E,0xE9},
+ {0x92,0xF8}, {0x97,0xBE}, {0x91,0x6C}, {0x94,0xAA},
+ {0xFC,0x63}, {0x9D,0xC6}, {0x97,0xB5}, {0x92,0xB8},
+ {0x91,0xEF}, {0xFE,0xA6}, {0x97,0x60}, {0x93,0x58},
+ {0x95,0x76}, {0x8F,0xAC}, {0x91,0xEC}, {0x97,0xB4},
+ {0x91,0xF7}, {0x97,0x4A}, {0xFB,0x49}, {0x95,0x78},
+ {0x93,0xBC}, {0x91,0xD6}, {0x93,0x55}, {0x93,0x56},
+ {0x98,0x51}, {0x8F,0xF8}, {0xFB,0xC0}, {0x93,0xF2},
+ {0x90,0xD0}, {0x9C,0x44}, {0x92,0x55}, {0x93,0x63},
+ {0x91,0xA5}, {0xA0,0xED}, {0xFD,0x6B}, {0x9A,0xFE},
+ {0x93,0x51}, {0x8C,0x57}, {0xFA,0x78}, {0xFE,0xA8},
+ {0x93,0x50}, {0xFA,0x4C}, {0x92,0xF7}, {0x9B,0x40},
+ {0xFB,0xCE}, {0x9B,0x41}, {0xFE,0xAD}, {0xFB,0xD5},
+ {0x8B,0xC2}, {0x9A,0x7C}, {0x9B,0x42}, {0x9B,0x43},
+ {0x9E,0x79}, {0xFB,0xD9}, {0x9B,0x44}, {0xA0,0xA7},
+ {0x9B,0xF3}, {0x8C,0x79}, {0x93,0x5E}, {0x89,0xCB},
+ {0x9F,0x53}, {0x93,0xD7}, {0xFB,0xE1}, {0xFE,0xD0},
+ {0xFB,0xE2}, {0xFC,0xE3}, {0x90,0x74}, {0xFB,0xE6},
+ {0x9B,0xB7}, {0x9B,0x45}, {0x9B,0x47}, {0x9F,0x50},
+ {0x9B,0x48}, {0xFC,0x5B}, {0x98,0xA9}, {0x9C,0xFD},
+ {0x88,0x4C}, {0x9B,0x4B}, {0xFB,0xEC}, {0x8C,0x69},
+ {0x9B,0xA8}, {0x8A,0xD5}, {0xFA,0x73}, {0xFD,0x59},
+ {0x91,0xA2}, {0xFB,0xED}, {0x9C,0xA9}, {0x8A,0xA8},
+ {0x9B,0xC3}, {0x8A,0xE1}, {0x9B,0x4E}, {0x95,0xD0},
+ {0x90,0x5F}, {0x97,0xEE}, {0xFC,0x4E}, {0x9B,0x4F},
+ {0x9B,0x50}, {0x9E,0xC6}, {0xFC,0x50}, {0xFD,0x73},
+ {0xFD,0xA7}, {0x9D,0xA2}, {0xFA,0x58}, {0xFA,0x5E},
+ {0xA0,0x59}, {0xFA,0x75}, {0xFB,0xBE}, {0x9C,0xA2},
+ {0x93,0x70}, {0x93,0x71}, {0x93,0x77}, {0xFE,0xEF},
+ {0x93,0x6D}, {0xFC,0x5D}, {0x90,0xB8}, {0x8A,0xFC},
+ {0xFB,0x41}, {0x9E,0x6B}, {0x94,0xE3}, {0x8E,0xE2},
+ {0x8C,0x7D}, {0x8E,0xD7}, {0x9C,0x4D}, {0x96,0xA3},
+ {0x9B,0x51}, {0x8A,0xC3}, {0x96,0xAA}, {0xFC,0x68},
+ {0x8B,0x6D}, {0xFD,0x67}, {0x8A,0xE9}, {0xFC,0xA1},
+ {0x93,0x6C}, {0x9B,0x52}, {0xFE,0x70}, {0xFC,0xA8},
+ {0xFC,0xE9}, {0x9C,0xB4}, {0x8A,0xEA}, {0x9B,0x53},
+ {0x9B,0x55}, {0x96,0xAB}, {0xFC,0xA7}, {0x9B,0x56},
+ {0x8A,0xBC}, {0x8A,0xCB}, {0x9B,0x57}, {0x89,0xCD},
+ {0x9B,0x59}, {0x9B,0x5B}, {0x93,0xA5}, {0x9B,0x5D},
+ {0x9E,0x4F}, {0x93,0xA3}, {0x8A,0x7B}, {0x8B,0x42},
+ {0x97,0x50}, {0x8F,0xB3}, {0x8A,0x50}, {0x9B,0x60},
+ {0x8B,0x45}, {0x8B,0x46}, {0x9D,0xFE}, {0x9B,0x62},
+ {0x93,0x7B}, {0x93,0xB1}, {0x8A,0x60}, {0x8A,0xD8},
+ {0x9B,0x63}, {0x8A,0x69}, {0x8A,0x47}, {0x8A,0xCC},
+ {0x93,0x7C}, {0x9B,0x65}, {0x9B,0x66}, {0x8A,0x72},
+ {0x8A,0x7A}, {0x93,0xAF}, {0x8A,0xB0}, {0x9B,0x68},
+ {0x9E,0xA3}, {0xFA,0xEC}, {0x8B,0x77}, {0x9B,0x67},
+ {0x8B,0x59}, {0xFC,0xB1}, {0xFC,0xBB}, {0x9B,0x69},
+ {0x93,0xA8}, {0x8A,0xE0}, {0x9E,0x51}, {0x8F,0x5F},
+ {0x9B,0x6A}, {0x9B,0x6B}, {0x97,0xEC}, {0x9B,0x6C},
+ {0xFE,0x4E}, {0xFD,0xC2}, {0x9B,0x6D}, {0x91,0x67},
+ {0xFC,0xCC}, {0x93,0xB6}, {0x90,0xE4}, {0x90,0xE5},
+ {0x9E,0xF2}, {0x93,0xCA}, {0x8B,0xBC}, {0x8F,0x46},
+ {0x93,0xCF}, {0xFC,0xDB}, {0xFC,0xDC}, {0x93,0xC0},
+ {0xFC,0xE6}, {0x96,0xE7}, {0xFC,0xD8}, {0xFC,0xD9},
+ {0xFD,0xA6}, {0x93,0xCE}, {0x95,0xF1}, {0x9C,0xE9},
+ {0xFC,0xE4}, {0x94,0xAF}, {0xFA,0x77}, {0x93,0xCC},
+ {0x90,0x5A}, {0x8C,0x54}, {0x93,0xBF}, {0xFB,0x51},
+ {0x93,0xB9}, {0xFE,0xD7}, {0x93,0xB7}, {0x93,0xD9},
+ {0x93,0xBB}, {0x93,0xDA}, {0x98,0xA3}, {0x90,0xD1},
+ {0x9B,0x6E}, {0xFA,0x70}, {0x9B,0xEB}, {0x9B,0x6F},
+ {0xFC,0xFC}, {0x8B,0x40}, {0xA0,0x7B}, {0x8C,0xA1},
+ {0x97,0xF7}, {0x93,0xE2}, {0xFC,0xD6}, {0x95,0x59},
+ {0x93,0xA6}, {0xFD,0x40}, {0x93,0x5F}, {0x97,0xF2},
+ {0x9C,0x76}, {0x8E,0xF8}, {0x8F,0x47}, {0x9B,0x74},
+ {0x92,0xB4}, {0x91,0xED}, {0x96,0xD2}, {0xFD,0x46},
+ {0x8F,0x4F}, {0x95,0x49}, {0x9B,0x75}, {0xFA,0x5C},
+ {0x9B,0x79}, {0xFD,0x4B}, {0x96,0xD3}, {0xFD,0x58},
+ {0x94,0x5F}, {0xA0,0xF5}, {0x92,0x43}, {0x97,0xFA},
+ {0x9D,0xD9}, {0x97,0xF4}, {0x92,0x4D}, {0xFD,0x5B},
+ {0x9B,0x7A}, {0x9E,0xD5}, {0xFA,0xAE}, {0x9C,0xC9},
+ {0x92,0x58}, {0x8E,0xC8}, {0x94,0xB4}, {0x93,0xE1},
+ {0x93,0xDF}, {0xFC,0xF0}, {0x93,0xEC}, {0x97,0xF6},
+ {0x96,0xCF}, {0x93,0xDE}, {0x8A,0xCF}, {0x9B,0xA2},
+ {0xFD,0x69}, {0x93,0x52}, {0x98,0xA2}, {0xFD,0x6E},
+ {0x8C,0xA4}, {0xFA,0x7C}, {0x93,0xFA}, {0x90,0x7C},
+ {0x8F,0x67}, {0x9D,0xB7}, {0xA0,0xE9}, {0xFA,0x4E},
+ {0xFD,0xA1}, {0x9E,0x74}, {0x9F,0xBF}, {0x9E,0xCB},
+ {0x9B,0xB9}, {0x9D,0xD4}, {0x97,0xB9}, {0x8E,0xF1},
+ {0x95,0x7B}, {0x9E,0xD2}, {0x97,0x53}, {0x96,0xA4},
+ {0x8F,0xBE}, {0x94,0xD9}, {0x90,0x58}, {0xFD,0x79},
+ {0xFD,0x7B}, {0x8E,0xDA}, {0x8E,0xFA}, {0x9B,0xA5},
+ {0x9E,0xD9}, {0x97,0xD4}, {0x90,0xBB}, {0xFD,0xBC},
+ {0xFD,0xC6}, {0x92,0x48}, {0x92,0xB5}, {0x9D,0xC1},
+ {0x92,0xB9}, {0x92,0xA6}, {0x8F,0x4B}, {0x9B,0xA6},
+ {0x92,0xB6}, {0x8E,0x40}, {0x9E,0xD8}, {0x94,0x5E},
+ {0x98,0x5F}, {0x94,0xCE}, {0x92,0x4A}, {0xFD,0x70},
+ {0x94,0x67}, {0x8D,0xEC}, {0x9B,0xD8}, {0x94,0x48},
+ {0xFA,0xC1}, {0x9C,0xF7}, {0xFD,0xBE}, {0x8F,0xDA},
+ {0xFD,0xD9}, {0xFC,0x7E}, {0x93,0xF9}, {0xFA,0x43},
+ {0xFA,0xEB}, {0xFA,0xC3}, {0x97,0xD3}, {0x95,0xF9},
+ {0x9C,0x48}, {0xFD,0xD8}, {0xA0,0xD8}, {0xFD,0xD7},
+ {0xFB,0x4A}, {0x9B,0xAF}, {0x94,0x4B}, {0xFD,0xC9},
+ {0x8E,0xAC}, {0xFD,0xB2}, {0x92,0x5A}, {0xFC,0xBD},
+ {0x92,0xD9}, {0xFD,0xD5}, {0x92,0xDD}, {0x92,0x59},
+ {0x96,0xBA}, {0x92,0x5B}, {0x9B,0xAB}, {0xFD,0xDA},
+ {0xFD,0xDE}, {0xFD,0xD3}, {0x8C,0x46}, {0xFD,0xD6},
+ {0xFD,0xDC}, {0xFD,0xDD}, {0x90,0xFE}, {0xFE,0xA1},
+ {0x8B,0xAD}, {0x9C,0xD8}, {0x9E,0x6D}, {0xFD,0x7C},
+ {0xFB,0x61}, {0x96,0xF8}, {0x96,0xF0}, {0xFC,0xF4},
+ {0xFE,0x60}, {0x98,0x52}, {0x96,0x4F}, {0x91,0x6E},
+ {0x98,0x6D}, {0x98,0x64}, {0x94,0x53}, {0xFD,0xEC},
+ {0xFB,0x78}, {0x95,0xBA}, {0x98,0x5D}, {0x92,0xF9},
+ {0x98,0x5A}, {0xFD,0xF6}, {0x93,0xD0}, {0x98,0x62},
+ {0x9B,0xAD}, {0x97,0x4F}, {0x9B,0xAE}, {0x94,0x52},
+ {0x9B,0xB0}, {0x91,0xD2}, {0x97,0xEA}, {0xFB,0x6B},
+ {0x91,0xB1}, {0xFD,0xF3}, {0x92,0xCB}, {0x9B,0xB1},
+ {0xFC,0xEC}, {0x98,0x6B}, {0x97,0x51}, {0x98,0x71},
+ {0x95,0xEF}, {0x9E,0xF3}, {0x91,0xE8}, {0x9B,0xBA},
+ {0xFB,0x4C}, {0x92,0x6A}, {0xFD,0xF8}, {0x98,0x61},
+ {0x91,0xE7}, {0x93,0xED}, {0x97,0x44}, {0x91,0xE1},
+ {0xFB,0xF5}, {0x98,0x69}, {0x8A,0x62}, {0x9B,0xBB},
+ {0x8C,0xA8}, {0x9C,0x55}, {0x8E,0x77}, {0x8A,0xB2},
+ {0x9E,0xBC}, {0x93,0xE6}, {0x93,0xA2}, {0x9B,0xBD},
+ {0x94,0xB3}, {0x93,0x7D}, {0x9E,0x66}, {0x94,0x59},
+ {0x9B,0xBF}, {0x94,0x58}, {0x9E,0xA5}, {0x9B,0xC7},
+ {0xFE,0x54}, {0x8E,0x74}, {0x8B,0xD6}, {0x94,0xB6},
+ {0xFD,0x74}, {0x98,0xC0}, {0x94,0xA5}, {0x9B,0xC8},
+ {0x95,0xED}, {0xFD,0x7E}, {0xFB,0xEB}, {0xFD,0x7D},
+ {0x97,0x6F}, {0x94,0x61}, {0x9F,0xC1}, {0x95,0xD7},
+ {0xFA,0x52}, {0x9C,0x58}, {0x9F,0x68}, {0x9B,0xE7},
+ {0xFC,0xCE}, {0x96,0xE8}, {0xFA,0x49}, {0x97,0xA1},
+ {0x95,0x4D}, {0x9E,0xF8}, {0xFE,0x49}, {0x91,0xCE},
+ {0x97,0x71}, {0x8C,0xCF}, {0xFD,0xB1}, {0xFC,0x6E},
+ {0x9C,0xF2}, {0x93,0xB8}, {0x90,0x43}, {0x97,0x59},
+ {0x94,0xD7}, {0xFE,0x66}, {0x94,0x7D}, {0xFC,0x6F},
+ {0x92,0x46}, {0xFA,0x6D}, {0x8E,0xF7}, {0xFB,0xB7},
+ {0x94,0x7C}, {0x92,0xCD}, {0x97,0xB2}, {0xFE,0x65},
+ {0x96,0x7E}, {0x97,0x58}, {0x9B,0x77}, {0x91,0xCF},
+ {0x94,0xA4}, {0x9C,0xAD}, {0x8B,0xAB}, {0x96,0xD5},
+ {0xFC,0xB3}, {0x93,0xAE}, {0x97,0x6D}, {0x94,0x46},
+ {0x95,0xF7}, {0x9C,0x46}, {0x95,0x5B}, {0x91,0xD1},
+ {0x94,0xF4}, {0xFE,0x67}, {0x92,0xA5}, {0xFE,0xDF},
+ {0x8C,0xAB}, {0x9B,0xC9}, {0xFC,0xED}, {0xFD,0xFA},
+ {0xFC,0xC8}, {0xFE,0x62}, {0x91,0xFC}, {0xFE,0x6B},
+ {0xFD,0xF9}, {0xFC,0xC7}, {0x91,0x4E}, {0x9C,0xB8},
+ {0x97,0x67}, {0x95,0xEE}, {0x9B,0xB2}, {0x94,0x60},
+ {0x94,0xA2}, {0x98,0x75}, {0x97,0xAC}, {0x91,0xD3},
+ {0x98,0x7B}, {0x8E,0xEB}, {0x97,0x6A}, {0x96,0x5E},
+ {0x97,0xEB}, {0x9F,0xF9}, {0x95,0xF8}, {0xFE,0xA2},
+ {0x8F,0xE6}, {0xFE,0x7E}, {0x9D,0xA4}, {0x97,0x68},
+ {0x8E,0xEC}, {0x94,0xBD}, {0x94,0x5B}, {0x9C,0xF6},
+ {0xFA,0xA7}, {0x9B,0xD9}, {0xFA,0x5D}, {0x96,0x56},
+ {0x97,0x62}, {0x94,0xBA}, {0xA0,0x4F}, {0x92,0xD8},
+ {0x9B,0xCB}, {0x94,0xBB}, {0x9D,0x5F}, {0x90,0xCF},
+ {0x94,0x65}, {0x9F,0x4C}, {0x90,0xD8}, {0x9E,0xBE},
+ {0xFB,0x6D}, {0x95,0xCA}, {0x9D,0xC2}, {0x97,0xF8},
+ {0x8F,0xFC}, {0x94,0x73}, {0x94,0x74}, {0xFE,0xB7},
+ {0x8A,0x4B}, {0x8A,0x55}, {0x8B,0x69}, {0x8A,0xDC},
+ {0x8B,0x76}, {0x9B,0xCE}, {0x8A,0x68}, {0xA0,0xF8},
+ {0x98,0xDF}, {0xFE,0xB5}, {0x9B,0xCF}, {0x96,0xFB},
+ {0x9B,0xFB}, {0x9E,0xCE}, {0x8E,0xE5}, {0x9E,0x7B},
+ {0x9B,0xD2}, {0x8A,0xA5}, {0xFE,0xCE}, {0x8A,0x45},
+ {0x9D,0xFC}, {0xFE,0xCF}, {0x8B,0xA5}, {0x8C,0x4A},
+ {0x8A,0xEC}, {0xFC,0xE0}, {0x94,0xAD}, {0xFE,0xD5},
+ {0x94,0xAC}, {0xFC,0x5A}, {0x9B,0xD6}, {0x8A,0x6F},
+ {0x8B,0xA9}, {0x8E,0x5F}, {0x9D,0xCB}, {0xFC,0xE7},
+ {0x9B,0xD7}, {0x93,0xC8}, {0x91,0xF0}, {0x8F,0xE0},
+ {0x9B,0xDB}, {0x90,0xED}, {0x9B,0xDC}, {0xA0,0xEC},
+ {0x98,0xFA}, {0x9B,0xE0}, {0x93,0xC7}, {0x92,0x49},
+ {0x96,0xE1}, {0x9B,0xE2}, {0x9B,0xE4}, {0x8F,0xE1},
+ {0x9B,0xE5}, {0x94,0xC0}, {0x93,0xC3}, {0x93,0xC5},
+ {0x90,0x79}, {0x97,0x7B}, {0x90,0x7E}, {0xFE,0xE6},
+ {0xFE,0x46}, {0x9D,0xB8}, {0x92,0x70}, {0x95,0xA8},
+ {0x8C,0xB0}, {0x94,0xC8}, {0x98,0xB9}, {0x91,0x40},
+ {0xFC,0xBE}, {0x91,0x57}, {0x8B,0xB2}, {0xFA,0xDF},
+ {0x9B,0xE6}, {0x96,0x43}, {0x8E,0x44}, {0x9C,0x4F},
+ {0xFE,0xF4}, {0x9B,0xE8}, {0x93,0xDC}, {0x96,0x6F},
+ {0x8E,0x4A}, {0x9B,0xED}, {0x92,0xF6}, {0x9D,0xB9},
+ {0x8E,0x4E}, {0xFB,0xCF}, {0x9E,0xC2}, {0x94,0xE5},
+ {0x9B,0xF0}, {0x94,0xE4}, {0x95,0x51}, {0x8B,0xBB},
+ {0x9B,0xF1}, {0x94,0xF0}, {0x8E,0x64}, {0x94,0xEA},
+ {0x8F,0x61}, {0x9B,0x64}, {0x8E,0x5B}, {0x9B,0xF2},
+ {0x9F,0xBE}, {0x9D,0xC9}, {0x8E,0x6C}, {0x8F,0x73},
+ {0x8C,0xAF}, {0x8F,0x75}, {0x8E,0x71}, {0x8E,0x60},
+ {0x8E,0x6A}, {0x8C,0x4C}, {0x95,0x52}, {0x95,0x54},
+ {0x8A,0xD4}, {0x9D,0xBB}, {0x95,0x43}, {0x92,0xFE},
+ {0x94,0xF2}, {0x94,0xF1}, {0xA0,0xEA}, {0x9D,0xD2},
+ {0xA0,0xB1}, {0x91,0xF8}, {0x94,0x62}, {0x9B,0xA4},
+ {0x8E,0xAD}, {0x9E,0xAD}, {0x96,0xD0}, {0xFE,0xEE},
+ {0x8A,0xB4}, {0x97,0x57}, {0x8A,0x77}, {0x9B,0xF7},
+ {0x8E,0xB5}, {0xA0,0x6D}, {0x8E,0xB6}, {0x97,0x56},
+ {0x95,0x40}, {0xA0,0xF3}, {0x94,0xBE}, {0x9B,0xFA},
+ {0xFD,0xDF}, {0x9D,0xBC}, {0x94,0xFE}, {0x8B,0xDB},
+ {0xA0,0xFE}, {0x8E,0xC0}, {0x9F,0x47}, {0x8B,0xDE},
+ {0xA0,0xFB}, {0x8E,0xC3}, {0x96,0x49}, {0xFE,0xC2},
+ {0x95,0x4C}, {0x9B,0xFD}, {0x90,0xCC}, {0x9C,0x60},
+ {0x95,0x4B}, {0x9B,0xFE}, {0x9C,0x70}, {0x9C,0x43},
+ {0x9C,0x47}, {0x8E,0xCC}, {0x8E,0x54}, {0x8E,0xE4},
+ {0x9C,0x49}, {0x8B,0x5E}, {0x95,0x5E}, {0x95,0x5C},
+ {0x9C,0x4B}, {0x8B,0xE1}, {0x8E,0xD9}, {0x9D,0xB4},
+ {0x92,0x5F}, {0x9C,0x4C}, {0x8A,0xA1}, {0x8E,0xDB},
+ {0x9C,0x56}, {0x8A,0xA2}, {0x97,0x54}, {0x9C,0x5E},
+ {0x9E,0xD4}, {0x95,0x68}, {0xA0,0xC3}, {0x8A,0xE6},
+ {0xA0,0xF7}, {0x9C,0x61}, {0x9C,0x5F}, {0xFC,0x4D},
+ {0x9E,0x5B}, {0x9E,0x69}, {0x9C,0x63}, {0xFE,0xC7},
+ {0xFE,0xC6}, {0x9C,0x67}, {0x9C,0x69}, {0x8B,0xE2},
+ {0x91,0x65}, {0x9C,0xE7}, {0x8A,0x54}, {0x9C,0x6C},
+ {0x9C,0x6E}, {0xFE,0x5D}, {0x9C,0x73}, {0x95,0x6A},
+ {0x95,0x6D}, {0x8E,0xF0}, {0x8F,0x4D}, {0x8E,0xF6},
+ {0xFA,0xBC}, {0x8C,0xD5}, {0xFB,0xDA}, {0x8B,0x4C},
+ {0xFD,0x75}, {0x9B,0xDD}, {0xFA,0xF5}, {0x9C,0x74},
+ {0x95,0x45}, {0x96,0xC6}, {0x8F,0x6A}, {0x8F,0x4E},
+ {0x9C,0x78}, {0xFA,0x55}, {0x97,0xE4}, {0x9C,0x41},
+ {0x92,0x5C}, {0x96,0xFA}, {0xFB,0x66}, {0x8E,0x65},
+ {0x98,0x49}, {0xFB,0xA8}, {0x98,0x42}, {0x9C,0x7A},
+ {0x97,0xFB}, {0x90,0xCA}, {0x9C,0x5B}, {0x97,0x4D},
+ {0x8E,0xD3}, {0x95,0x61}, {0x9F,0x4B}, {0x9F,0xB5},
+ {0x93,0xD2}, {0xFD,0xAA}, {0x98,0x40}, {0x91,0x46},
+ {0x98,0x67}, {0xFA,0x5A}, {0xFB,0xA9}, {0x98,0x41},
+ {0x8C,0xD3}, {0xFC,0xFD}, {0xFD,0xAB}, {0x91,0xBD},
+ {0x8F,0x4C}, {0x96,0xC9}, {0x8F,0x55}, {0xFB,0xAE},
+ {0x95,0x6F}, {0x9C,0x7D}, {0xA0,0xF0}, {0x94,0x6F},
+ {0xFD,0xAC}, {0x96,0xCB}, {0x96,0xCE}, {0xA0,0x56},
+ {0x9C,0xE1}, {0x96,0xC4}, {0x8F,0x5E}, {0x8F,0x6C},
+ {0x8E,0xA3}, {0xFB,0xB3}, {0xFC,0x53}, {0xFD,0xB3},
+ {0x8F,0x6B}, {0x96,0xCA}, {0x8F,0x79}, {0x9E,0x6F},
+ {0xA0,0xC5}, {0xFC,0x78}, {0x8E,0x42}, {0x8F,0x5A},
+ {0x90,0xC2}, {0x8E,0xA5}, {0x90,0x61}, {0x92,0x4F},
+ {0x93,0x73}, {0xFD,0xB5}, {0xFE,0xCC}, {0xFB,0xBD},
+ {0x8C,0xD6}, {0x98,0x43}, {0x96,0xC5}, {0x89,0xBC},
+ {0x9C,0xA3}, {0x92,0x4B}, {0x98,0x4A}, {0x8F,0xA4},
+ {0xA0,0xF1}, {0x9E,0xFB}, {0x9C,0xD2}, {0x8F,0xA7},
+ {0xFC,0x5C}, {0x98,0x45}, {0x90,0x46}, {0x8C,0xD1},
+ {0xFE,0xFA}, {0x95,0x60}, {0x9F,0x48}, {0x92,0x47},
+ {0x90,0xFB}, {0x9C,0xA4}, {0x95,0x71}, {0x9C,0xA6},
+ {0x9C,0xA7}, {0x9C,0xAA}, {0x9E,0xD3}, {0x9E,0x70},
+ {0x9C,0xAC}, {0x8F,0xAE}, {0x95,0x7D}, {0x9C,0xB0},
+ {0x97,0xB6}, {0xA0,0xBD}, {0x8A,0xDF}, {0x9E,0xAA},
+ {0x8F,0xBD}, {0x8F,0xBF}, {0x93,0x69}, {0x9B,0xA7},
+ {0xC8,0xA4}, {0xFE,0xEA}, {0x9B,0xE1}, {0x8B,0x41},
+ {0x9D,0xB6}, {0xA0,0xEB}, {0x9B,0xA3}, {0x8B,0xA1},
+ {0x8F,0xC8}, {0x89,0x4C}, {0x98,0x60}, {0x94,0xC7},
+ {0x8B,0x58}, {0x95,0xAB}, {0x95,0xAA}, {0x9C,0xC3},
+ {0x9C,0xC4}, {0x93,0xD6}, {0x9D,0xAC}, {0x8B,0xE6},
+ {0x8A,0x71}, {0x8F,0xD1}, {0x99,0xD5}, {0x90,0xF4},
+ {0x8A,0xA3}, {0x9C,0xCE}, {0x9C,0xD4}, {0x9C,0xD5},
+ {0xFB,0xC8}, {0x9D,0xB3}, {0xFC,0x70}, {0x8F,0xD7},
+ {0x9B,0x73}, {0xFA,0x5B}, {0x8F,0xD2}, {0x90,0x64},
+ {0x98,0xB6}, {0x96,0x68}, {0x9C,0xD6}, {0x98,0xBD},
+ {0x8F,0xDC}, {0xFE,0xF6}, {0x8F,0xD9}, {0x95,0x41},
+ {0x97,0xF3}, {0x9B,0xF8}, {0x9E,0x6C}, {0x8F,0xF2},
+ {0x8F,0xEE}, {0x9C,0xD7}, {0x9E,0x6E}, {0x8A,0x40},
+ {0x8F,0xEF}, {0x8F,0xF4}, {0x8F,0xF5}, {0x95,0xC2},
+ {0x98,0x6A}, {0x97,0xCF}, {0x9E,0x7C}, {0x90,0x41},
+ {0x9C,0xDB}, {0x94,0x41}, {0x9C,0xE6}, {0x9D,0xB0},
+ {0x9C,0xEA}, {0x9C,0xED}, {0x9C,0xFA}, {0x8B,0x62},
+ {0x8A,0x4E}, {0x9C,0xCA}, {0x8A,0x66}, {0x9C,0xFB},
+ {0x9C,0xFC}, {0x9C,0xFE}, {0x8A,0x53}, {0x9C,0xE5},
+ {0x9D,0x40}, {0x9D,0x41}, {0x90,0x45}, {0x8B,0x73},
+ {0x97,0xCA}, {0x9D,0x42}, {0x8A,0x61}, {0x8B,0xAE},
+ {0x8A,0xD2}, {0x8B,0xA2}, {0x9D,0xF2}, {0x9D,0x43},
+ {0x9C,0xDF}, {0x9D,0x44}, {0x8E,0xCA}, {0x90,0x4E},
+ {0x8E,0xB3}, {0x9F,0xF5}, {0x9D,0x45}, {0x90,0x4F},
+ {0x9D,0x47}, {0x89,0xCA}, {0x9C,0xB5}, {0xFB,0xFE},
+ {0x90,0x5E}, {0x90,0x63}, {0x90,0x57}, {0x90,0x66},
+ {0x9B,0xC0}, {0xFC,0xE5}, {0x91,0x62}, {0x90,0x67},
+ {0x8F,0xA1}, {0x8F,0xA2}, {0x9D,0x48}, {0xFA,0xD3},
+ {0x90,0x5D}, {0x90,0xB9}, {0x90,0x6B}, {0x8C,0x5C},
+ {0x90,0x69}, {0xFE,0x57}, {0xFE,0x55}, {0x90,0x73},
+ {0x9B,0xEF}, {0x9C,0xF0}, {0x9D,0x4B}, {0xFE,0xD9},
+ {0xFE,0xDA}, {0x91,0xE0}, {0x91,0xD8}, {0x96,0x46},
+ {0x93,0x60}, {0xFA,0x53}, {0x9C,0xD3}, {0x9D,0x4E},
+ {0xFB,0x40}, {0x8D,0xE2}, {0x94,0x42}, {0x90,0x56},
+ {0x98,0x65}, {0x8C,0x6C}, {0xFA,0x4A}, {0x9D,0x50},
+ {0x9D,0x52}, {0x95,0xAF}, {0x97,0x5A}, {0x93,0x49},
+ {0x97,0x47}, {0xA0,0xF4}, {0x97,0x78}, {0x8F,0xCF},
+ {0xFC,0x60}, {0x8C,0x4E}, {0xFC,0x56}, {0x91,0xDC},
+ {0x96,0x61}, {0x92,0xEC}, {0x93,0x5D}, {0x8E,0xDE},
+ {0x96,0xFE}, {0xFD,0x4F}, {0x95,0xDE}, {0x98,0xB0},
+ {0xA0,0x40}, {0x97,0xBD}, {0x97,0x7D}, {0x97,0xF5},
+ {0x9B,0xAC}, {0xFA,0xDA}, {0x92,0xC2}, {0x97,0xB1},
+ {0x90,0x7B}, {0x93,0xFE}, {0x94,0x7B}, {0x97,0x77},
+ {0xFA,0xBE}, {0xFD,0x43}, {0x90,0xC6}, {0x90,0xA4},
+ {0x90,0xA8}, {0x94,0xA9}, {0x90,0xA9}, {0x8C,0x65},
+ {0x95,0xE0}, {0x90,0x7D}, {0x92,0x65}, {0xFD,0xBA},
+ {0x93,0xC4}, {0xFE,0xED}, {0x9D,0xAB}, {0xA0,0xE3},
+ {0x96,0x48}, {0x9D,0x53}, {0x8A,0xA9}, {0x9B,0xC5},
+ {0x96,0x5D}, {0x97,0x5F}, {0x96,0x5F}, {0x96,0x6E},
+ {0xFB,0x5D}, {0x9D,0xB1}, {0xFE,0xA3}, {0x9D,0xB2},
+ {0x95,0xAE}, {0xFC,0xA3}, {0xA0,0xA2}, {0x96,0x55},
+ {0x9D,0x54}, {0x93,0x41}, {0x95,0xAD}, {0x91,0xD5},
+ {0x97,0x7A}, {0xFD,0xFC}, {0x8E,0x47}, {0x93,0xFD},
+ {0x90,0xA5}, {0x90,0xAC}, {0x95,0xAC}, {0x90,0xAE},
+ {0xFE,0xA5}, {0x9D,0x56}, {0x97,0xE3}, {0x95,0xE2},
+ {0x94,0x66}, {0x96,0x47}, {0x91,0xB8}, {0x9C,0xEC},
+ {0x90,0xAD}, {0x95,0xE3}, {0x8B,0x4F}, {0x8A,0xE3},
+ {0x8B,0x4D}, {0x95,0xEA}, {0x8B,0x4E}, {0x8C,0xC1},
+ {0x8B,0xED}, {0x91,0xD9}, {0xA0,0xA4}, {0x95,0xF5},
+ {0x95,0xF4}, {0x9F,0xB3}, {0xFE,0xAF}, {0xFE,0x72},
+ {0x92,0x7A}, {0xFE,0xAC}, {0x95,0xF3}, {0x9D,0x58},
+ {0x93,0x72}, {0x91,0xC5}, {0x96,0x42}, {0x90,0xCD},
+ {0x95,0xFE}, {0x91,0x59}, {0x9C,0x65}, {0x97,0xCC},
+ {0x90,0xCE}, {0x9D,0x59}, {0xFC,0xF5}, {0xFE,0xFD},
+ {0x9D,0x5B}, {0x9D,0x5C}, {0x93,0x7E}, {0x98,0xAC},
+ {0x9D,0x5E}, {0xFD,0xD0}, {0xFD,0x60}, {0x9C,0xCF},
+ {0x90,0xDD}, {0x90,0xE0}, {0x90,0xF3}, {0x98,0xB1},
+ {0x90,0xF0}, {0x93,0xBD}, {0x95,0xB7}, {0x9F,0x46},
+ {0x8E,0x4B}, {0x96,0x58}, {0x8A,0x4C}, {0x9D,0x63},
+ {0x9E,0xCF}, {0x9D,0x65}, {0x9D,0x66}, {0x96,0x5A},
+ {0x9D,0x64}, {0x8A,0x6C}, {0x8A,0xD9}, {0x9D,0x67},
+ {0x8A,0x70}, {0x8B,0xF3}, {0x91,0x50}, {0x9C,0xC1},
+ {0x9D,0x68}, {0x93,0xA7}, {0x96,0x74}, {0xA0,0xEF},
+ {0x91,0x51}, {0x96,0xC1}, {0x8C,0x64}, {0x96,0x76},
+ {0x9D,0x69}, {0xFC,0xA4}, {0x9D,0x6A}, {0x92,0x4E},
+ {0x9D,0x6B}, {0x9B,0xC1}, {0x9D,0x6C}, {0x8A,0x65},
+ {0x91,0x5D}, {0x9D,0x6D}, {0x91,0x5A}, {0x8C,0x42},
+ {0x9C,0xC0}, {0x91,0x6A}, {0x9D,0x6E}, {0x9E,0xA6},
+ {0x9D,0xCD}, {0x9D,0x6F}, {0x89,0xBB}, {0x9E,0xF9},
+ {0x96,0xB4}, {0x91,0x72}, {0x9E,0xC8}, {0x8B,0x55},
+ {0x9D,0x71}, {0x9D,0x72}, {0x9E,0xCC}, {0x91,0x74},
+ {0x9E,0xD0}, {0x90,0x5C}, {0x8E,0xD2}, {0x91,0xA8},
+ {0x91,0x77}, {0x96,0xBF}, {0x96,0xC0}, {0x8F,0xB1},
+ {0x96,0xB7}, {0x8C,0x55}, {0x91,0x78}, {0x89,0xBE},
+ {0x91,0x7C}, {0xFB,0x77}, {0x91,0x75}, {0x91,0xA3},
+ {0x91,0x76}, {0x96,0xBE}, {0x91,0x79}, {0x96,0xB6},
+ {0x91,0xA4}, {0x91,0xA6}, {0x9D,0x75}, {0x90,0x52},
+ {0xA0,0x45}, {0x91,0xA9}, {0x98,0xAA}, {0x8C,0x5F},
+ {0x8B,0xAA}, {0x9C,0xDD}, {0x9D,0x77}, {0x89,0x40},
+ {0x9E,0xEC}, {0x93,0xAA}, {0x94,0x78}, {0x9D,0x7A},
+ {0x8A,0xC9}, {0x8B,0x4B}, {0x9F,0xEC}, {0x8A,0xE2},
+ {0x9E,0x75}, {0x98,0x74}, {0x9A,0xC8}, {0xA0,0x47},
+ {0x8B,0xC3}, {0xFC,0x48}, {0xFC,0x77}, {0x9C,0x52},
+ {0x8E,0xFD}, {0x8F,0xA8}, {0x95,0x7A}, {0x8F,0xF0},
+};
+
+/* Index of the convert table */
+static const Summary16 big5hkscs_uni2index_page00[70] = {
+ /* 0x0000 */
+ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 },
+ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 },
+ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xE7EE }, { 12, 0x87BF },
+ { 23, 0xFFFF }, { 39, 0xFFFF }, { 55, 0xFFFF }, { 71, 0xFFFF },
+ /* 0x0100 */
+ { 87, 0x0003 }, { 89, 0x0C0C }, { 93, 0x0800 }, { 94, 0x0000 },
+ { 94, 0x3800 }, { 97, 0x0008 }, { 98, 0x0800 }, { 99, 0x0000 },
+ { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 },
+ { 99, 0x6000 }, { 101, 0x1557 }, { 109, 0x0000 }, { 109, 0x0000 },
+ /* 0x0200 */
+ { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 },
+ { 109, 0x0000 }, { 109, 0x0813 }, { 113, 0x0402 }, { 115, 0x0020 },
+ { 116, 0x0408 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 },
+ { 118, 0x2EC0 }, { 124, 0x0200 }, { 125, 0x0000 }, { 125, 0x0000 },
+ /* 0x0300 */
+ { 125, 0x0020 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 },
+ { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 }, { 126, 0x0000 },
+ { 126, 0x0000 }, { 126, 0xFFFE }, { 141, 0x03FB }, { 150, 0xFFFE },
+ { 165, 0x03FB }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 },
+ /* 0x0400 */
+ { 174, 0x0002 }, { 175, 0xFFFF }, { 191, 0xFFFF }, { 207, 0xFFFF },
+ { 223, 0xFFFF }, { 239, 0x0002 },
+};
+static const Summary16 big5hkscs_uni2index_page1e[13] = {
+ /* 0x1E00 */
+ { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 },
+ { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 },
+ { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0x0000 }, { 240, 0xC000 },
+ { 242, 0x0003 },
+};
+static const Summary16 big5hkscs_uni2index_page20[116] = {
+ /* 0x2000 */
+ { 244, 0x0000 }, { 244, 0x3378 }, { 252, 0x00F4 }, { 257, 0x482C },
+ { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x0000 },
+ { 262, 0x0000 }, { 262, 0x0000 }, { 262, 0x1000 }, { 263, 0x0000 },
+ { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 },
+ /* 0x2100 */
+ { 263, 0x0228 }, { 266, 0x0040 }, { 267, 0x0002 }, { 268, 0x0000 },
+ { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x03FF }, { 278, 0x03FF },
+ { 288, 0x0000 }, { 288, 0x03CF }, { 296, 0x0000 }, { 296, 0x0300 },
+ { 298, 0x0000 }, { 298, 0x0000 }, { 298, 0x0080 }, { 299, 0x0000 },
+ /* 0x2200 */
+ { 299, 0x0000 }, { 299, 0xC560 }, { 305, 0x4E29 }, { 312, 0x0030 },
+ { 314, 0x0000 }, { 314, 0x0004 }, { 315, 0x00CB }, { 320, 0x0000 },
+ { 320, 0x0000 }, { 320, 0x0220 }, { 322, 0x0020 }, { 323, 0x8000 },
+ { 324, 0x0000 }, { 324, 0x0000 }, { 324, 0x0000 }, { 324, 0x0000 },
+ /* 0x2300 */
+ { 324, 0x0080 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 },
+ { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 },
+ { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 },
+ { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 },
+ /* 0x2400 */
+ { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0000 },
+ { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x03FF }, { 335, 0x3FF0 },
+ { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 },
+ { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 },
+ /* 0x2500 */
+ { 345, 0x1005 }, { 348, 0x1111 }, { 352, 0x1010 }, { 354, 0x1010 },
+ { 356, 0x0000 }, { 356, 0xFFFF }, { 372, 0xFFFF }, { 388, 0x001F },
+ { 393, 0xFFFE }, { 408, 0x0038 }, { 411, 0x0003 }, { 413, 0x300C },
+ { 417, 0xC8C0 }, { 422, 0x0000 }, { 422, 0x003C }, { 426, 0x0000 },
+ /* 0x2600 */
+ { 426, 0x0260 }, { 429, 0x0000 }, { 429, 0x0000 }, { 429, 0x0000 },
+ { 429, 0x0007 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 },
+ { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 },
+ { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 },
+ /* 0x2700 */
+ { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x0000 }, { 432, 0x2000 },
+};
+static const Summary16 big5hkscs_uni2index_page2e[1819] = {
+ /* 0x2E00 */
+ { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 },
+ { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x0000 },
+ { 433, 0x35D1 }, { 441, 0x3020 }, { 444, 0x54A0 }, { 449, 0x5040 },
+ { 452, 0xB440 }, { 457, 0x40C0 }, { 460, 0x0008 }, { 461, 0x0000 },
+ /* 0x2F00 */
+ { 461, 0x0000 }, { 461, 0x0000 }, { 461, 0x0000 }, { 461, 0x0008 },
+ { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 },
+ { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 },
+ { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 },
+ /* 0x3000 */
+ { 462, 0xFFEF }, { 477, 0x7037 }, { 485, 0x03FE }, { 494, 0x0001 },
+ { 495, 0xFFFE }, { 510, 0xFFFF }, { 526, 0xFFFF }, { 542, 0xFFFF },
+ { 558, 0xFFFF }, { 574, 0x780F }, { 582, 0xFFFE }, { 597, 0xFFFF },
+ { 613, 0xFFFF }, { 629, 0xFFFF }, { 645, 0xFFFF }, { 661, 0x707F },
+ /* 0x3100 */
+ { 671, 0xFFE0 }, { 682, 0xFFFF }, { 698, 0x03FF }, { 708, 0x0000 },
+ { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 },
+ { 708, 0x0000 }, { 708, 0xFFFC }, { 722, 0x0000 }, { 722, 0x0000 },
+ { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 },
+ /* 0x3200 */
+ { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0xFFFF }, { 738, 0xFFFF },
+ { 754, 0x000F }, { 758, 0x0000 }, { 758, 0x0000 }, { 758, 0x0000 },
+ { 758, 0xFFFF }, { 774, 0xFFFF }, { 790, 0xFFFF }, { 806, 0x0001 },
+ { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 },
+ /* 0x3300 */
+ { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 },
+ { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 }, { 807, 0x0000 },
+ { 807, 0xC000 }, { 809, 0x7000 }, { 812, 0x0002 }, { 813, 0x0000 },
+ { 813, 0x4010 }, { 815, 0x0026 }, { 818, 0x0000 }, { 818, 0x0000 },
+ /* 0x3400 */
+ { 818, 0x0000 }, { 818, 0x0000 }, { 818, 0x0000 }, { 818, 0x0020 },
+ { 819, 0x1001 }, { 821, 0x0000 }, { 821, 0x0010 }, { 822, 0x6408 },
+ { 826, 0x0000 }, { 826, 0x0048 }, { 828, 0x8020 }, { 830, 0x1000 },
+ { 831, 0x0102 }, { 833, 0x8000 }, { 834, 0x0010 }, { 835, 0x0800 },
+ /* 0x3500 */
+ { 836, 0x0040 }, { 837, 0x0000 }, { 837, 0x0000 }, { 837, 0x4000 },
+ { 838, 0x0000 }, { 838, 0x020A }, { 841, 0x2002 }, { 843, 0x0185 },
+ { 847, 0x0010 }, { 848, 0x0180 }, { 850, 0x2022 }, { 853, 0x8000 },
+ { 854, 0x44A2 }, { 859, 0x2844 }, { 863, 0x0000 }, { 863, 0x480E },
+ /* 0x3600 */
+ { 868, 0x0200 }, { 869, 0x0500 }, { 871, 0x2008 }, { 873, 0x4220 },
+ { 876, 0x4380 }, { 880, 0x8000 }, { 881, 0x0000 }, { 881, 0x0400 },
+ { 882, 0x0002 }, { 883, 0x0400 }, { 884, 0x1420 }, { 887, 0x1223 },
+ { 892, 0x01BA }, { 898, 0x2058 }, { 902, 0x0066 }, { 906, 0x0020 },
+ /* 0x3700 */
+ { 907, 0x250A }, { 912, 0x1000 }, { 913, 0x302C }, { 918, 0x040D },
+ { 922, 0x0009 }, { 924, 0x0000 }, { 924, 0x8004 }, { 926, 0x0000 },
+ { 926, 0x0000 }, { 926, 0x0080 }, { 927, 0x0001 }, { 928, 0x4200 },
+ { 930, 0x0000 }, { 930, 0x0000 }, { 930, 0x0000 }, { 930, 0x0904 },
+ /* 0x3800 */
+ { 933, 0x8000 }, { 934, 0x0200 }, { 935, 0x2001 }, { 937, 0x0140 },
+ { 939, 0x0000 }, { 939, 0x0000 }, { 939, 0x0008 }, { 940, 0x0000 },
+ { 940, 0x0000 }, { 940, 0x0000 }, { 940, 0x0001 }, { 941, 0x0000 },
+ { 941, 0x1008 }, { 943, 0x0002 }, { 944, 0x0000 }, { 944, 0x0400 },
+ /* 0x3900 */
+ { 945, 0x0100 }, { 946, 0x0010 }, { 947, 0x0080 }, { 948, 0x8004 },
+ { 950, 0x2000 }, { 951, 0x0000 }, { 951, 0x0008 }, { 952, 0x0000 },
+ { 952, 0x0601 }, { 955, 0x0A04 }, { 958, 0x0012 }, { 960, 0x0100 },
+ { 961, 0x0000 }, { 961, 0x1000 }, { 962, 0x1024 }, { 965, 0x4900 },
+ /* 0x3A00 */
+ { 968, 0x004A }, { 971, 0x0180 }, { 973, 0x0600 }, { 975, 0x0010 },
+ { 976, 0x0800 }, { 977, 0x5084 }, { 981, 0x00C0 }, { 983, 0x0000 },
+ { 983, 0x0000 }, { 983, 0x0080 }, { 984, 0x0800 }, { 985, 0x2000 },
+ { 986, 0x0000 }, { 986, 0x4000 }, { 987, 0x0001 }, { 988, 0x0805 },
+ /* 0x3B00 */
+ { 991, 0x4000 }, { 992, 0x0200 }, { 993, 0x0804 }, { 995, 0x0200 },
+ { 996, 0x0004 }, { 997, 0x0100 }, { 998, 0x0001 }, { 999, 0x1806 },
+ { 1003, 0x0001 }, { 1004, 0x0240 }, { 1006, 0x0002 }, { 1007, 0x5000 },
+ { 1009, 0x0014 }, { 1011, 0x2080 }, { 1013, 0x1000 }, { 1014, 0x001C },
+ /* 0x3C00 */
+ { 1017, 0x2000 }, { 1018, 0x0122 }, { 1021, 0x0000 }, { 1021, 0x0000 },
+ { 1021, 0x0000 }, { 1021, 0x0010 }, { 1022, 0x0000 }, { 1022, 0x0000 },
+ { 1022, 0x0800 }, { 1023, 0x0000 }, { 1023, 0x0000 }, { 1023, 0x0000 },
+ { 1023, 0x2800 }, { 1025, 0x1042 }, { 1028, 0x8800 }, { 1030, 0x0000 },
+ /* 0x3D00 */
+ { 1030, 0x0000 }, { 1030, 0x2008 }, { 1032, 0x0000 }, { 1032, 0x0804 },
+ { 1034, 0x5040 }, { 1037, 0x8002 }, { 1039, 0x8604 }, { 1043, 0x2020 },
+ { 1045, 0x8420 }, { 1048, 0x0002 }, { 1049, 0x2020 }, { 1051, 0x8010 },
+ { 1053, 0x32C0 }, { 1058, 0x0808 }, { 1060, 0x0980 }, { 1063, 0x3088 },
+ /* 0x3E00 */
+ { 1067, 0x0040 }, { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0000 },
+ { 1068, 0x0109 }, { 1071, 0x0020 }, { 1072, 0x0000 }, { 1072, 0x0010 },
+ { 1073, 0x0000 }, { 1073, 0x0000 }, { 1073, 0x2700 }, { 1077, 0x8102 },
+ { 1080, 0x1484 }, { 1084, 0x4CC3 }, { 1091, 0x0A86 }, { 1096, 0x9419 },
+ /* 0x3F00 */
+ { 1102, 0x4051 }, { 1106, 0x0000 }, { 1106, 0x0000 }, { 1106, 0x0000 },
+ { 1106, 0x0000 }, { 1106, 0x0308 }, { 1109, 0x0008 }, { 1110, 0x1000 },
+ { 1111, 0x0000 }, { 1111, 0x0008 }, { 1112, 0x0000 }, { 1112, 0x0000 },
+ { 1112, 0x0001 }, { 1113, 0x1080 }, { 1115, 0x2020 }, { 1117, 0x0600 },
+ /* 0x4000 */
+ { 1119, 0x0210 }, { 1121, 0x2000 }, { 1122, 0x0000 }, { 1122, 0x0200 },
+ { 1123, 0x0020 }, { 1124, 0x0088 }, { 1126, 0x8424 }, { 1130, 0x0002 },
+ { 1131, 0x0000 }, { 1131, 0x0000 }, { 1131, 0x0100 }, { 1132, 0x8800 },
+ { 1134, 0x0100 }, { 1135, 0x8100 }, { 1137, 0x0000 }, { 1137, 0x0400 },
+ /* 0x4100 */
+ { 1138, 0x4218 }, { 1142, 0x0000 }, { 1142, 0x0000 }, { 1142, 0x0004 },
+ { 1143, 0x0000 }, { 1143, 0x0000 }, { 1143, 0x5080 }, { 1146, 0x8000 },
+ { 1147, 0x0000 }, { 1147, 0x0001 }, { 1148, 0x0000 }, { 1148, 0x0004 },
+ { 1149, 0x8410 }, { 1152, 0x0800 }, { 1153, 0x8000 }, { 1154, 0x0200 },
+ /* 0x4200 */
+ { 1155, 0x0000 }, { 1155, 0x0002 }, { 1156, 0x0008 }, { 1157, 0x0000 },
+ { 1157, 0x0001 }, { 1158, 0x0000 }, { 1158, 0x0401 }, { 1160, 0x0440 },
+ { 1162, 0x1000 }, { 1163, 0x0010 }, { 1164, 0x0004 }, { 1165, 0x1220 },
+ { 1168, 0x0000 }, { 1168, 0x0000 }, { 1168, 0x0000 }, { 1168, 0x1810 },
+ /* 0x4300 */
+ { 1171, 0x0000 }, { 1171, 0x0000 }, { 1171, 0x0800 }, { 1172, 0x0000 },
+ { 1172, 0x0000 }, { 1172, 0x0000 }, { 1172, 0x4000 }, { 1173, 0x0000 },
+ { 1173, 0x0000 }, { 1173, 0x0080 }, { 1174, 0x0000 }, { 1174, 0x0400 },
+ { 1175, 0x0002 }, { 1176, 0x8200 }, { 1178, 0x2000 }, { 1179, 0x0004 },
+ /* 0x4400 */
+ { 1180, 0x0006 }, { 1182, 0x0008 }, { 1183, 0x2020 }, { 1185, 0x0000 },
+ { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x0400 },
+ { 1186, 0x8000 }, { 1187, 0x8000 }, { 1188, 0x0005 }, { 1190, 0x0081 },
+ { 1192, 0x4021 }, { 1195, 0xA000 }, { 1197, 0x1E10 }, { 1202, 0x0010 },
+ /* 0x4500 */
+ { 1203, 0x0A18 }, { 1207, 0x2040 }, { 1209, 0x4080 }, { 1211, 0xA808 },
+ { 1215, 0x0008 }, { 1216, 0x1026 }, { 1220, 0x0404 }, { 1222, 0x0080 },
+ { 1223, 0x0020 }, { 1224, 0x0000 }, { 1224, 0x0000 }, { 1224, 0x0000 },
+ { 1224, 0x0000 }, { 1224, 0x0000 }, { 1224, 0x0200 }, { 1225, 0x0000 },
+ /* 0x4600 */
+ { 1225, 0x8040 }, { 1227, 0x00A0 }, { 1229, 0x0000 }, { 1229, 0x0000 },
+ { 1229, 0x0000 }, { 1229, 0x0800 }, { 1230, 0x0000 }, { 1230, 0x0400 },
+ { 1231, 0x0001 }, { 1232, 0x0000 }, { 1232, 0x0000 }, { 1232, 0x0000 },
+ { 1232, 0x8000 }, { 1233, 0x0001 }, { 1234, 0x0000 }, { 1234, 0x0020 },
+ /* 0x4700 */
+ { 1235, 0x0000 }, { 1235, 0x0108 }, { 1237, 0x0000 }, { 1237, 0x0000 },
+ { 1237, 0x4000 }, { 1238, 0x0000 }, { 1238, 0x0000 }, { 1238, 0x1000 },
+ { 1239, 0x0000 }, { 1239, 0x0100 }, { 1240, 0x0040 }, { 1241, 0x0040 },
+ { 1242, 0x0000 }, { 1242, 0x0020 }, { 1243, 0x2000 }, { 1244, 0x0010 },
+ /* 0x4800 */
+ { 1245, 0x0801 }, { 1247, 0x0000 }, { 1247, 0x0000 }, { 1247, 0x0080 },
+ { 1248, 0x0000 }, { 1248, 0x2000 }, { 1249, 0x0000 }, { 1249, 0x0002 },
+ { 1250, 0x0000 }, { 1250, 0x0800 }, { 1251, 0x6000 }, { 1253, 0x0000 },
+ { 1253, 0x0000 }, { 1253, 0x2001 }, { 1255, 0x2000 }, { 1256, 0x0408 },
+ /* 0x4900 */
+ { 1258, 0x0040 }, { 1259, 0x4002 }, { 1261, 0x2420 }, { 1264, 0x5020 },
+ { 1267, 0x0020 }, { 1268, 0x000A }, { 1270, 0x0420 }, { 1272, 0x0004 },
+ { 1273, 0x0200 }, { 1274, 0x0000 }, { 1274, 0x0082 }, { 1276, 0x0000 },
+ { 1276, 0x0000 }, { 1276, 0x8000 }, { 1277, 0x00A0 }, { 1279, 0x0000 },
+ /* 0x4A00 */
+ { 1279, 0x8000 }, { 1280, 0x2000 }, { 1281, 0x0010 }, { 1282, 0x0020 },
+ { 1283, 0x0000 }, { 1283, 0x0000 }, { 1283, 0x0000 }, { 1283, 0x0000 },
+ { 1283, 0x0000 }, { 1283, 0x0040 }, { 1284, 0x0000 }, { 1284, 0x0110 },
+ { 1286, 0x0000 }, { 1286, 0x0002 }, { 1287, 0x0010 }, { 1288, 0x8000 },
+ /* 0x4B00 */
+ { 1289, 0x0000 }, { 1289, 0x0201 }, { 1291, 0x1001 }, { 1293, 0x0080 },
+ { 1294, 0x0000 }, { 1294, 0x0000 }, { 1294, 0x8000 }, { 1295, 0x4805 },
+ { 1299, 0x4000 }, { 1300, 0x20C9 }, { 1305, 0x0000 }, { 1305, 0x6000 },
+ { 1307, 0x0001 }, { 1308, 0x0000 }, { 1308, 0x0000 }, { 1308, 0x0000 },
+ /* 0x4C00 */
+ { 1308, 0x4090 }, { 1311, 0x0000 }, { 1311, 0x0000 }, { 1311, 0x4800 },
+ { 1313, 0x0000 }, { 1313, 0x0800 }, { 1314, 0x2000 }, { 1315, 0x2000 },
+ { 1316, 0x0002 }, { 1317, 0x0000 }, { 1317, 0x4010 }, { 1319, 0x0081 },
+ { 1321, 0x2000 }, { 1322, 0x0000 }, { 1322, 0x2002 }, { 1324, 0x0000 },
+ /* 0x4D00 */
+ { 1324, 0x0200 }, { 1325, 0x0001 }, { 1326, 0x0000 }, { 1326, 0x0010 },
+ { 1327, 0x0000 }, { 1327, 0x0000 }, { 1327, 0x0000 }, { 1327, 0x0000 },
+ { 1327, 0x0000 }, { 1327, 0x1002 }, { 1329, 0x0000 }, { 1329, 0x0000 },
+ { 1329, 0x0000 }, { 1329, 0x0000 }, { 1329, 0x0000 }, { 1329, 0x0000 },
+ /* 0x4E00 */
+ { 1329, 0xFF9B }, { 1342, 0xD773 }, { 1353, 0xFD52 }, { 1363, 0xBBCF },
+ { 1375, 0xEBAC }, { 1385, 0xFF4C }, { 1396, 0x0600 }, { 1398, 0xC108 },
+ { 1402, 0x7BFF }, { 1416, 0xCF3E }, { 1427, 0x797F }, { 1439, 0x9EC8 },
+ { 1447, 0x6FDF }, { 1460, 0xF7F0 }, { 1471, 0x4F3A }, { 1480, 0xA9FF },
+ /* 0x4F00 */
+ { 1492, 0xEF3F }, { 1505, 0x27BF }, { 1516, 0xB304 }, { 1522, 0xFFDD },
+ { 1536, 0xFBEE }, { 1549, 0xFFFF }, { 1565, 0xDE9F }, { 1577, 0xFFFD },
+ { 1592, 0xAFFF }, { 1606, 0x7DF7 }, { 1619, 0xC904 }, { 1624, 0xAEED },
+ { 1635, 0xFFBF }, { 1650, 0xFFDB }, { 1664, 0xD033 }, { 1671, 0x67FF },
+ /* 0x5000 */
+ { 1684, 0xFBE9 }, { 1696, 0xDFFE }, { 1710, 0xFFEF }, { 1725, 0x18BB },
+ { 1733, 0xFFEB }, { 1747, 0xFDEA }, { 1759, 0xFF7F }, { 1774, 0x24FD },
+ { 1783, 0x79AF }, { 1794, 0x7F77 }, { 1807, 0xF04C }, { 1814, 0xFDFF },
+ { 1829, 0xEFF6 }, { 1842, 0xAEFB }, { 1854, 0xF7FB }, { 1868, 0xFB7B },
+ /* 0x5100 */
+ { 1881, 0x7FFF }, { 1896, 0x95BF }, { 1907, 0x6E77 }, { 1918, 0xBFBF },
+ { 1932, 0x3BFB }, { 1944, 0xFEF4 }, { 1956, 0x7FAF }, { 1969, 0x13F2 },
+ { 1977, 0xA7C5 }, { 1986, 0x55FE }, { 1997, 0x5DB5 }, { 2007, 0x73FF },
+ { 2020, 0xFFF8 }, { 2033, 0xF99F }, { 2045, 0x2017 }, { 2050, 0x777B },
+ /* 0x5200 */
+ { 2062, 0x5FEF }, { 2075, 0xF0CF }, { 2085, 0x47F3 }, { 2095, 0x1DFF },
+ { 2107, 0x7EDA }, { 2118, 0xFEF4 }, { 2130, 0xFF07 }, { 2141, 0xBFBC },
+ { 2153, 0xBF9F }, { 2166, 0x8FDB }, { 2177, 0x7F5B }, { 2189, 0x5A20 },
+ { 2194, 0x32AF }, { 2203, 0xEBEF }, { 2216, 0x8A5F }, { 2225, 0xDFBB },
+ /* 0x5300 */
+ { 2238, 0xEF62 }, { 2248, 0xB6E7 }, { 2259, 0xB49F }, { 2269, 0xFB9F },
+ { 2282, 0x77BF }, { 2295, 0xF49E }, { 2305, 0xF2DB }, { 2316, 0xFBBF },
+ { 2330, 0xC414 }, { 2335, 0xF7DC }, { 2347, 0x7FF5 }, { 2360, 0x0A55 },
+ { 2366, 0x3F2E }, { 2376, 0x8FD7 }, { 2387, 0xFF7F }, { 2402, 0x59EF },
+ /* 0x5400 */
+ { 2413, 0xFFDA }, { 2426, 0xFF5F }, { 2440, 0xFFFB }, { 2455, 0x7BFF },
+ { 2469, 0xEDEF }, { 2482, 0x0010 }, { 2483, 0xBFFF }, { 2498, 0xFDFF },
+ { 2513, 0xF9F7 }, { 2526, 0x55FF }, { 2538, 0xFFFF }, { 2554, 0xFFDF },
+ { 2569, 0xFBFF }, { 2584, 0x4441 }, { 2588, 0xEFFF }, { 2603, 0xBD8E },
+ /* 0x5500 */
+ { 2613, 0xFFFE }, { 2628, 0x459F }, { 2637, 0xFDE8 }, { 2648, 0xDBFF },
+ { 2662, 0xEFFB }, { 2676, 0xF0EF }, { 2687, 0x0E7E }, { 2696, 0xFAEE },
+ { 2708, 0xFFDF }, { 2723, 0xB73F }, { 2735, 0x7FFE }, { 2749, 0x9E3F },
+ { 2760, 0xFFFF }, { 2776, 0xFFFF }, { 2792, 0x97FE }, { 2804, 0xFEE7 },
+ /* 0x5600 */
+ { 2817, 0xF377 }, { 2829, 0xF8FF }, { 2842, 0xF6AF }, { 2854, 0xEFFD },
+ { 2868, 0xF76F }, { 2881, 0x679D }, { 2891, 0xFF7F }, { 2906, 0xDFDF },
+ { 2920, 0xFEFF }, { 2935, 0xF7AD }, { 2947, 0xFDF2 }, { 2959, 0xF2FE },
+ { 2971, 0x3F6F }, { 2983, 0xECDA }, { 2993, 0xECB7 }, { 3004, 0xA683 },
+ /* 0x5700 */
+ { 3011, 0x3F9F }, { 3023, 0xFD7C }, { 3035, 0xF70D }, { 3045, 0xE81D },
+ { 3053, 0xFEEF }, { 3067, 0x8897 }, { 3074, 0xAFD6 }, { 3085, 0xFCFF },
+ { 3099, 0xBD0D }, { 3108, 0xFFB9 }, { 3121, 0x44BF }, { 3130, 0xFF70 },
+ { 3141, 0xD9DE }, { 3152, 0xF0B5 }, { 3161, 0xF2FF }, { 3174, 0x7FFF },
+ /* 0x5800 */
+ { 3189, 0x7FFF }, { 3204, 0x7A15 }, { 3212, 0xF7FF }, { 3227, 0xAFFF },
+ { 3241, 0xFF91 }, { 3252, 0xFFBE }, { 3266, 0xBB3C }, { 3276, 0xFE7E },
+ { 3289, 0xCFEF }, { 3302, 0xF71F }, { 3314, 0xDFEB }, { 3327, 0xFC6B },
+ { 3338, 0xCBE6 }, { 3348, 0xFF7F }, { 3363, 0x9B9D }, { 3373, 0xFE1D },
+ /* 0x5900 */
+ { 3384, 0xF4FC }, { 3395, 0x96F6 }, { 3405, 0xFEB5 }, { 3417, 0x5196 },
+ { 3424, 0xC7B1 }, { 3433, 0x15BB }, { 3442, 0x6EA7 }, { 3452, 0xFBFF },
+ { 3467, 0xE63F }, { 3478, 0xE7DD }, { 3490, 0xD1FF }, { 3502, 0x7FFF },
+ { 3517, 0xFFFB }, { 3532, 0x7F5F }, { 3545, 0xFF7B }, { 3559, 0xFFFF },
+ /* 0x5A00 */
+ { 3575, 0xBE0F }, { 3585, 0xDFEE }, { 3598, 0x7EBB }, { 3610, 0x73E8 },
+ { 3619, 0x37FF }, { 3632, 0xFFFF }, { 3648, 0x7FFF }, { 3663, 0xFF83 },
+ { 3674, 0xDD5E }, { 3685, 0xFEFF }, { 3700, 0xDAE7 }, { 3711, 0xFFFF },
+ { 3727, 0xFFDF }, { 3742, 0xFFE8 }, { 3754, 0x7F7F }, { 3768, 0xEFFD },
+ /* 0x5B00 */
+ { 3782, 0xBBAE }, { 3793, 0xEEFB }, { 3806, 0xFDFB }, { 3820, 0xF115 },
+ { 3828, 0xFDFB }, { 3842, 0xBDFB }, { 3855, 0x7B7C }, { 3866, 0xBDFF },
+ { 3880, 0xDBBF }, { 3893, 0xFFED }, { 3907, 0x75FC }, { 3918, 0x8379 },
+ { 3926, 0x7CFF }, { 3939, 0xC3FF }, { 3951, 0xDFFF }, { 3966, 0x856F },
+ /* 0x5C00 */
+ { 3975, 0xFFBA }, { 3988, 0xD47F }, { 3999, 0x153D }, { 4007, 0xDF8B },
+ { 4018, 0xFFF3 }, { 4032, 0x737B }, { 4043, 0xF7BD }, { 4056, 0x5E1A },
+ { 4064, 0xBF60 }, { 4073, 0xF63F }, { 4085, 0xFFFF }, { 4101, 0x05EB },
+ { 4109, 0xDFC6 }, { 4120, 0xCFDF }, { 4133, 0xF720 }, { 4141, 0xABF3 },
+ /* 0x5D00 */
+ { 4152, 0xF8C3 }, { 4161, 0xEFF7 }, { 4175, 0xD3FD }, { 4187, 0xF7FF },
+ { 4202, 0x5FEF }, { 4215, 0x4AE7 }, { 4224, 0x9BAC }, { 4233, 0xFE97 },
+ { 4245, 0x6FF7 }, { 4258, 0xF6BC }, { 4269, 0xFF97 }, { 4282, 0x37F7 },
+ { 4294, 0xAACF }, { 4304, 0xE9F6 }, { 4315, 0x49E7 }, { 4324, 0xE2BF },
+ /* 0x5E00 */
+ { 4335, 0x5E5C }, { 4344, 0xAFF6 }, { 4356, 0x6B3F }, { 4367, 0x61D8 },
+ { 4374, 0xFD3F }, { 4387, 0xFBB8 }, { 4398, 0xFFCF }, { 4412, 0xFF7D },
+ { 4426, 0xBFDD }, { 4439, 0x1EE4 }, { 4447, 0x7DFD }, { 4460, 0x63FF },
+ { 4472, 0x7FF6 }, { 4485, 0xFFFF }, { 4501, 0xD3EF }, { 4513, 0xDFDE },
+ /* 0x5F00 */
+ { 4526, 0xFDB6 }, { 4538, 0xADBC }, { 4548, 0x63FC }, { 4558, 0x15EB },
+ { 4567, 0xFF59 }, { 4579, 0x33D3 }, { 4588, 0xBEBE }, { 4600, 0xFBDF },
+ { 4614, 0x1FEF }, { 4626, 0xDBC7 }, { 4637, 0xFFF3 }, { 4651, 0xFEE6 },
+ { 4663, 0xB23F }, { 4673, 0xEBF7 }, { 4686, 0xED3B }, { 4697, 0xADBA },
+ /* 0x6000 */
+ { 4707, 0xFE01 }, { 4715, 0x7EFF }, { 4729, 0xFFFF }, { 4745, 0x0ABE },
+ { 4753, 0x36FF }, { 4765, 0xEF3D }, { 4777, 0xFFFC }, { 4791, 0xC0A5 },
+ { 4797, 0x77FB }, { 4810, 0xFCF5 }, { 4822, 0x019D }, { 4828, 0xFFFF },
+ { 4844, 0xFFFB }, { 4859, 0xFFBA }, { 4872, 0x03DF }, { 4881, 0xFFFF },
+ /* 0x6100 */
+ { 4897, 0xFFFB }, { 4912, 0xBF7D }, { 4925, 0xDB8C }, { 4934, 0xE8D5 },
+ { 4943, 0xFFF7 }, { 4958, 0xFF7D }, { 4972, 0xDDFF }, { 4986, 0x76FF },
+ { 4999, 0x7E8F }, { 5010, 0xBF7F }, { 5024, 0xFF96 }, { 5036, 0xD7FF },
+ { 5050, 0xBFEF }, { 5064, 0xC549 }, { 5071, 0x6FFD }, { 5084, 0xFFE7 },
+ /* 0x6200 */
+ { 5098, 0x779B }, { 5109, 0x8E77 }, { 5119, 0x7EBF }, { 5132, 0xE6DD },
+ { 5143, 0x7FCF }, { 5156, 0x5F1F }, { 5167, 0xE17F }, { 5178, 0xFEDF },
+ { 5192, 0xD7FF }, { 5206, 0x21FF }, { 5216, 0xFF50 }, { 5226, 0xFB7B },
+ { 5239, 0xFFFC }, { 5253, 0x9FFF }, { 5267, 0xF820 }, { 5273, 0xFFFF },
+ /* 0x6300 */
+ { 5289, 0xFB8F }, { 5301, 0x017B }, { 5308, 0xFF00 }, { 5316, 0x7FFE },
+ { 5330, 0xFFFF }, { 5346, 0x07F3 }, { 5355, 0xFBB0 }, { 5365, 0xBFE7 },
+ { 5378, 0xFFBF }, { 5393, 0xFBD7 }, { 5406, 0xFFBF }, { 5421, 0x6203 },
+ { 5426, 0xFFFF }, { 5442, 0xFFEF }, { 5457, 0xEFFF }, { 5472, 0x5B7F },
+ /* 0x6400 */
+ { 5484, 0xFEC0 }, { 5493, 0xDDFD }, { 5506, 0xFDFF }, { 5521, 0xEFFD },
+ { 5535, 0x680B }, { 5541, 0xFF1F }, { 5554, 0xFBE3 }, { 5566, 0xBFFF },
+ { 5581, 0xBFA4 }, { 5591, 0xF7EF }, { 5605, 0xFA7D }, { 5617, 0xF85F },
+ { 5628, 0xEEBF }, { 5641, 0x2FDD }, { 5652, 0xBFFF }, { 5667, 0xFD9F },
+ /* 0x6500 */
+ { 5680, 0xF6DB }, { 5692, 0xFBFB }, { 5706, 0xFE7F }, { 5720, 0xEBFD },
+ { 5733, 0xA76A }, { 5742, 0xF3FA }, { 5754, 0xBDFC }, { 5766, 0x9FFC },
+ { 5778, 0x1BFF }, { 5790, 0xFAF7 }, { 5803, 0xDDB7 }, { 5815, 0xFBED },
+ { 5828, 0xF87E }, { 5839, 0xECDF }, { 5851, 0xF36F }, { 5863, 0xBC3F },
+ /* 0x6600 */
+ { 5874, 0xFFFD }, { 5889, 0xF13F }, { 5900, 0xE9FF }, { 5913, 0x067F },
+ { 5922, 0x9FBE }, { 5934, 0xFE8E }, { 5945, 0xDDFE }, { 5958, 0x7FDF },
+ { 5972, 0x7FF1 }, { 5984, 0xA7F7 }, { 5996, 0xEF17 }, { 6007, 0xEFFF },
+ { 6022, 0xFFD1 }, { 6034, 0x7F44 }, { 6043, 0x7B59 }, { 6053, 0xD3DF },
+ /* 0x6700 */
+ { 6065, 0xFF3F }, { 6079, 0xEBFD }, { 6092, 0x7DEF }, { 6105, 0xFF7A },
+ { 6118, 0xFBF0 }, { 6129, 0xF6EB }, { 6141, 0xBC87 }, { 6150, 0xFFFF },
+ { 6166, 0xFAFA }, { 6178, 0xB7BF }, { 6191, 0xD011 }, { 6196, 0x8FFF },
+ { 6209, 0xFF7F }, { 6224, 0xFFDF }, { 6239, 0xFEFC }, { 6252, 0xD7FF },
+ /* 0x6800 */
+ { 6266, 0x201F }, { 6272, 0xFDDD }, { 6285, 0xEF67 }, { 6297, 0x7FFE },
+ { 6311, 0xFFFF }, { 6327, 0x207B }, { 6334, 0xE820 }, { 6339, 0xFBF6 },
+ { 6352, 0x9FFF }, { 6366, 0xB9DF }, { 6378, 0xFFDF }, { 6393, 0x227F },
+ { 6402, 0x7FF8 }, { 6414, 0xF5FF }, { 6428, 0xDFDB }, { 6441, 0x3FFF },
+ /* 0x6900 */
+ { 6455, 0xFFFF }, { 6471, 0x0FBF }, { 6482, 0x9420 }, { 6486, 0xFBFD },
+ { 6500, 0xDF7F }, { 6514, 0xFFFE }, { 6529, 0xFFFF }, { 6545, 0x0FFF },
+ { 6557, 0x646D }, { 6565, 0xDFFB }, { 6579, 0xFFFF }, { 6595, 0xFAFF },
+ { 6609, 0xFE5F }, { 6622, 0x027B }, { 6629, 0x7BF6 }, { 6641, 0xFFDE },
+ /* 0x6A00 */
+ { 6655, 0xBFFF }, { 6670, 0xFFFA }, { 6684, 0x39EB }, { 6694, 0xFF3C },
+ { 6706, 0xFBFB }, { 6720, 0xEFFF }, { 6735, 0xAFFF }, { 6749, 0xC452 },
+ { 6755, 0xF6BF }, { 6768, 0xFEFF }, { 6783, 0xF9FF }, { 6797, 0x6FFE },
+ { 6810, 0xBFEC }, { 6822, 0xFF1B }, { 6834, 0xDDA3 }, { 6844, 0x1F4B },
+ /* 0x6B00 */
+ { 6853, 0x8F3D }, { 6863, 0x67CF }, { 6874, 0xB12B }, { 6882, 0xFFFE },
+ { 6897, 0x7FEE }, { 6910, 0xDAF7 }, { 6922, 0xA4FF }, { 6933, 0xCFD4 },
+ { 6943, 0xF75F }, { 6956, 0xCBF2 }, { 6966, 0xECFD }, { 6978, 0xB4ED },
+ { 6988, 0xBFFB }, { 7002, 0x5DDD }, { 7013, 0x9DDF }, { 7025, 0xFF8D },
+ /* 0x6C00 */
+ { 7037, 0xBB7F }, { 7050, 0xBF7B }, { 7063, 0xDDFB }, { 7076, 0xEFFB },
+ { 7090, 0xFE4F }, { 7102, 0xFFB5 }, { 7115, 0xEFE3 }, { 7127, 0xEF7F },
+ { 7141, 0xFFFF }, { 7157, 0xBF7D }, { 7170, 0xFC04 }, { 7177, 0xFFDF },
+ { 7192, 0xFEFF }, { 7207, 0xFEFF }, { 7222, 0xFFAF }, { 7236, 0x822F },
+ /* 0x6D00 */
+ { 7243, 0xFFFF }, { 7259, 0xEFC7 }, { 7271, 0xFFF5 }, { 7285, 0xFFFF },
+ { 7301, 0x4007 }, { 7305, 0xDF80 }, { 7313, 0xF7FF }, { 7328, 0xFFF7 },
+ { 7343, 0xFFFF }, { 7359, 0x01FF }, { 7368, 0xDC30 }, { 7375, 0xFFBE },
+ { 7389, 0xBFF5 }, { 7402, 0xFFFF }, { 7418, 0xFF7F }, { 7433, 0x7EFF },
+ /* 0x6E00 */
+ { 7447, 0x843D }, { 7454, 0xBF20 }, { 7462, 0xFFFF }, { 7478, 0xFF7F },
+ { 7493, 0xEEFB }, { 7506, 0xFF7F }, { 7521, 0xCBFF }, { 7534, 0x13DE },
+ { 7543, 0xEB40 }, { 7550, 0xFFDD }, { 7564, 0xCCFF }, { 7576, 0xFFFF },
+ { 7592, 0xFFFF }, { 7608, 0x3F7F }, { 7621, 0xFB04 }, { 7629, 0xFFF6 },
+ /* 0x6F00 */
+ { 7643, 0xFFFF }, { 7659, 0xD7FC }, { 7671, 0xFEFF }, { 7686, 0xFFFF },
+ { 7702, 0xC01B }, { 7708, 0xFDFF }, { 7723, 0xFEDF }, { 7737, 0xFFDD },
+ { 7751, 0x7FF7 }, { 7765, 0xE0FD }, { 7775, 0xFFFF }, { 7791, 0xFF7F },
+ { 7806, 0xFFDF }, { 7821, 0xFF38 }, { 7832, 0xFBDF }, { 7846, 0xDDD7 },
+ /* 0x7000 */
+ { 7858, 0xFEFB }, { 7872, 0xFFF2 }, { 7885, 0x9FDF }, { 7898, 0xDFBF },
+ { 7912, 0x3F7F }, { 7925, 0xFDF7 }, { 7939, 0x9FFF }, { 7953, 0xF7F3 },
+ { 7966, 0xCE7E }, { 7977, 0x877E }, { 7987, 0xFAFB }, { 8000, 0x7FBB },
+ { 8013, 0xFDF1 }, { 8025, 0xF7FF }, { 8040, 0x8017 }, { 8045, 0xFFFB },
+ /* 0x7100 */
+ { 8060, 0x7E75 }, { 8071, 0xFE89 }, { 8081, 0xDB6F }, { 8093, 0x4C7F },
+ { 8103, 0xFEFF }, { 8118, 0xF75F }, { 8131, 0x5FFF }, { 8145, 0x7DEF },
+ { 8158, 0xD7F7 }, { 8171, 0xFFD7 }, { 8185, 0xB7BF }, { 8198, 0xF7BF },
+ { 8212, 0xCFFF }, { 8226, 0xBF77 }, { 8239, 0x79F7 }, { 8251, 0xFB77 },
+ /* 0x7200 */
+ { 8264, 0xF6EF }, { 8277, 0xEEF9 }, { 8289, 0x7FDC }, { 8301, 0xEF61 },
+ { 8311, 0x9FD7 }, { 8323, 0xFFED }, { 8337, 0xD6CF }, { 8348, 0xFBDD },
+ { 8361, 0xFBF7 }, { 8375, 0xEDFF }, { 8389, 0xF7FE }, { 8403, 0xA435 },
+ { 8410, 0x7E7F }, { 8423, 0x97D7 }, { 8434, 0x0F5F }, { 8444, 0xFFD8 },
+ /* 0x7300 */
+ { 8456, 0x9D97 }, { 8466, 0x7BCF }, { 8478, 0x7FEC }, { 8490, 0xDFFF },
+ { 8505, 0xF73F }, { 8518, 0xEF87 }, { 8529, 0xDFE7 }, { 8542, 0xFDFF },
+ { 8557, 0xDFFF }, { 8572, 0xF1FC }, { 8583, 0x3FF7 }, { 8596, 0xDFFC },
+ { 8609, 0xFFED }, { 8623, 0x7FFD }, { 8637, 0xEFFF }, { 8652, 0xFFF8 },
+ /* 0x7400 */
+ { 8665, 0x3FFF }, { 8679, 0xFEF6 }, { 8692, 0xFF7F }, { 8707, 0x97FF },
+ { 8720, 0xEFFF }, { 8735, 0xFEFF }, { 8750, 0xFFBD }, { 8764, 0xF67F },
+ { 8777, 0x3FEF }, { 8790, 0xDFB5 }, { 8802, 0xAFFB }, { 8815, 0xEFF7 },
+ { 8829, 0x9D2F }, { 8839, 0xFFF9 }, { 8853, 0x53FF }, { 8865, 0xE9F7 },
+ /* 0x7500 */
+ { 8877, 0xF9BD }, { 8889, 0xF7FF }, { 8904, 0xFF66 }, { 8916, 0xEFBF },
+ { 8930, 0xFDC5 }, { 8941, 0xBE3A }, { 8951, 0xFCFD }, { 8964, 0xE7C5 },
+ { 8974, 0xFCD9 }, { 8985, 0x6737 }, { 8995, 0x0CBC }, { 9002, 0xFF7F },
+ { 9017, 0xFDBF }, { 9031, 0xFFB7 }, { 9045, 0xA0DF }, { 9054, 0xFFFF },
+ /* 0x7600 */
+ { 9070, 0xBF8F }, { 9082, 0xFE7B }, { 9095, 0xB3FF }, { 9108, 0x3D3F },
+ { 9119, 0xF3CD }, { 9130, 0x97DF }, { 9142, 0xF6F7 }, { 9155, 0xFF7F },
+ { 9170, 0xCFD6 }, { 9181, 0x7E6D }, { 9192, 0xEC72 }, { 9201, 0xEDB1 },
+ { 9211, 0x777C }, { 9222, 0xFE5C }, { 9233, 0xF6FA }, { 9245, 0x5FBF },
+ /* 0x7700 */
+ { 9258, 0xDFBA }, { 9270, 0xEE2F }, { 9281, 0xABFD }, { 9293, 0x7FFE },
+ { 9307, 0xFCF9 }, { 9319, 0xDF74 }, { 9330, 0xFFEF }, { 9345, 0xFF84 },
+ { 9355, 0xFBBF }, { 9369, 0xFFAA }, { 9381, 0xBDAF }, { 9393, 0xFEFF },
+ { 9408, 0xFEBC }, { 9420, 0x7FB9 }, { 9432, 0xF3ED }, { 9444, 0x7F9F },
+ /* 0x7800 */
+ { 9457, 0xF36C }, { 9467, 0xF11F }, { 9477, 0xFFEF }, { 9492, 0x33BF },
+ { 9503, 0x7FBC }, { 9515, 0x701F }, { 9523, 0xFF75 }, { 9536, 0xDE03 },
+ { 9544, 0xF3FB }, { 9557, 0xC7FA }, { 9568, 0xBFBF }, { 9582, 0x5F5F },
+ { 9594, 0xFFBA }, { 9607, 0xEDBF }, { 9620, 0xF7BF }, { 9634, 0xFEBF },
+ /* 0x7900 */
+ { 9648, 0x5276 }, { 9656, 0x7A9F }, { 9667, 0xFFFA }, { 9681, 0xFF7E },
+ { 9695, 0x9FF7 }, { 9708, 0xFFFF }, { 9724, 0x2FBF }, { 9736, 0xF61F },
+ { 9747, 0xEDCF }, { 9759, 0xBFFF }, { 9774, 0x7FF7 }, { 9788, 0xEFDF },
+ { 9802, 0xFB73 }, { 9814, 0xF176 }, { 9824, 0x7EDD }, { 9836, 0x0DD2 },
+ /* 0x7A00 */
+ { 9843, 0x3D7D }, { 9854, 0xDFBF }, { 9868, 0xED45 }, { 9877, 0xFE83 },
+ { 9887, 0x7FF9 }, { 9900, 0x9DD0 }, { 9908, 0x7BA7 }, { 9919, 0xEF73 },
+ { 9931, 0x9FFB }, { 9944, 0xC3FF }, { 9956, 0xDF0D }, { 9966, 0xDDFF },
+ { 9980, 0x8FBF }, { 9992, 0xBF0A }, { 10001, 0xEEFD }, { 10014, 0xEEC0 },
+ /* 0x7B00 */
+ { 10022, 0xDF73 }, { 10034, 0xEF1F }, { 10046, 0xFFFD }, { 10061, 0x0B3F },
+ { 10070, 0xFFFD }, { 10085, 0x0177 }, { 10092, 0xF2FF }, { 10105, 0x09FF },
+ { 10115, 0xFDB4 }, { 10126, 0x3BF7 }, { 10138, 0xB01F }, { 10146, 0x43B6 },
+ { 10154, 0xDED3 }, { 10165, 0xFF31 }, { 10176, 0x1FFF }, { 10189, 0xFF9F },
+ /* 0x7C00 */
+ { 10203, 0xFEEF }, { 10217, 0xFA27 }, { 10227, 0x3FEF }, { 10240, 0xFBA9 },
+ { 10251, 0x37BD }, { 10262, 0xBEDB }, { 10274, 0xFEF9 }, { 10287, 0xFF3D },
+ { 10300, 0x777B }, { 10312, 0xD1F6 }, { 10322, 0xD1EE }, { 10332, 0xFF3E },
+ { 10345, 0x7FAC }, { 10356, 0xF6FF }, { 10370, 0xF5C5 }, { 10380, 0x7BFF },
+ /* 0x7D00 */
+ { 10394, 0xFFFF }, { 10410, 0xFFFF }, { 10426, 0xDB27 }, { 10436, 0xFF6F },
+ { 10450, 0xE4FF }, { 10462, 0xFD7F }, { 10476, 0xEFCE }, { 10488, 0xBE0F },
+ { 10498, 0xFB7B }, { 10511, 0xF0DE }, { 10521, 0xFFDF }, { 10536, 0xFFBF },
+ { 10551, 0xFEF7 }, { 10565, 0xFF9D }, { 10578, 0xD7FB }, { 10591, 0x6EFF },
+ /* 0x7E00 */
+ { 10604, 0xFF88 }, { 10614, 0xFCFF }, { 10628, 0xEEBF }, { 10641, 0xFFFF },
+ { 10657, 0x13FF }, { 10668, 0xDFFF }, { 10683, 0xFFAF }, { 10697, 0xFFFD },
+ { 10712, 0xFDC7 }, { 10724, 0x9FFE }, { 10737, 0x1010 }, { 10739, 0x0400 },
+ { 10740, 0x8080 }, { 10742, 0x8000 }, { 10743, 0x0000 }, { 10743, 0x0000 },
+ /* 0x7F00 */
+ { 10743, 0x0040 }, { 10744, 0x0000 }, { 10744, 0x0000 }, { 10744, 0xE7C0 },
+ { 10752, 0xFFBB }, { 10766, 0xF93F }, { 10778, 0x7FEB }, { 10791, 0xFFEF },
+ { 10806, 0xFFE8 }, { 10818, 0x7CFE }, { 10830, 0xF3FF }, { 10844, 0xFFFF },
+ { 10860, 0xFEAF }, { 10873, 0xF8B7 }, { 10884, 0xFFEF }, { 10899, 0xFFBF },
+ /* 0x8000 */
+ { 10914, 0xF9FF }, { 10928, 0xFBF7 }, { 10942, 0xD773 }, { 10953, 0xFAFB },
+ { 10966, 0x85C8 }, { 10972, 0x7D57 }, { 10983, 0x90DE }, { 10991, 0xE3EF },
+ { 11003, 0x9EF5 }, { 11014, 0xBF6D }, { 11026, 0xEEAE }, { 11037, 0x35F6 },
+ { 11047, 0xF7FC }, { 11060, 0x7FF3 }, { 11073, 0xB27B }, { 11083, 0x7F7F },
+ /* 0x8100 */
+ { 11097, 0x57EF }, { 11109, 0xEFF4 }, { 11121, 0xBEBE }, { 11133, 0x6695 },
+ { 11141, 0xFDDC }, { 11153, 0x5E7F }, { 11165, 0xEAF7 }, { 11177, 0x97DF },
+ { 11189, 0xBFDD }, { 11202, 0xFFA8 }, { 11213, 0x5FED }, { 11225, 0xFEFF },
+ { 11240, 0xB7FF }, { 11254, 0xEFA7 }, { 11266, 0xF7FF }, { 11281, 0xDFDC },
+ /* 0x8200 */
+ { 11293, 0x3FB7 }, { 11305, 0xFD77 }, { 11318, 0xBF67 }, { 11330, 0xF7FC },
+ { 11343, 0xCAB5 }, { 11352, 0xDFFF }, { 11367, 0xFB7E }, { 11380, 0xFFF6 },
+ { 11394, 0xECB9 }, { 11404, 0xEF1F }, { 11416, 0xFFFF }, { 11432, 0xFFFB },
+ { 11447, 0x841D }, { 11453, 0xDBFF }, { 11467, 0xFDFF }, { 11482, 0xFFFF },
+ /* 0x8300 */
+ { 11498, 0x3BFF }, { 11511, 0x7FC0 }, { 11520, 0xBFF5 }, { 11533, 0xBFFE },
+ { 11547, 0xFFBF }, { 11562, 0x00DF }, { 11569, 0x804C }, { 11573, 0xFDF8 },
+ { 11585, 0xFFEA }, { 11598, 0x7FFF }, { 11613, 0xDFFD }, { 11627, 0xE201 },
+ { 11632, 0xFFFF }, { 11648, 0xFBFA }, { 11661, 0xFFBF }, { 11676, 0xFF7F },
+ /* 0x8400 */
+ { 11691, 0xFEFA }, { 11704, 0x195F }, { 11713, 0xFA5B }, { 11724, 0xFFFF },
+ { 11740, 0x7FFD }, { 11754, 0xFFFF }, { 11770, 0xFBFF }, { 11785, 0xE7FF },
+ { 11799, 0xE145 }, { 11806, 0xFFDF }, { 11821, 0xFF9F }, { 11835, 0xFF57 },
+ { 11848, 0xFEF7 }, { 11862, 0x4CDF }, { 11872, 0xDFB6 }, { 11884, 0xFFDF },
+ /* 0x8500 */
+ { 11899, 0xFFED }, { 11913, 0xF7FF }, { 11928, 0xFFFB }, { 11943, 0x691B },
+ { 11951, 0x7FFF }, { 11966, 0xEFFE }, { 11980, 0xFFFF }, { 11996, 0x5FEB },
+ { 12008, 0xFFFF }, { 12024, 0xFFF3 }, { 12038, 0x87DF }, { 12049, 0xE7FB },
+ { 12062, 0xEBFF }, { 12076, 0xF7E7 }, { 12089, 0xFF7F }, { 12104, 0xFFC7 },
+ /* 0x8600 */
+ { 12117, 0xBEF7 }, { 12130, 0xDFD3 }, { 12142, 0xF7FF }, { 12157, 0xDF7E },
+ { 12170, 0x79ED }, { 12181, 0xDA7D }, { 12192, 0xFFBE }, { 12206, 0x5E9F },
+ { 12217, 0x7CE0 }, { 12225, 0x77FF }, { 12239, 0xA7BF }, { 12251, 0xFFFF },
+ { 12267, 0x1BFF }, { 12279, 0xFFDB }, { 12293, 0xBF5C }, { 12304, 0x4FE0 },
+ /* 0x8700 */
+ { 12312, 0x7FFF }, { 12327, 0x5F0E }, { 12336, 0x77FF }, { 12350, 0xDDBF },
+ { 12363, 0xF04F }, { 12372, 0xFFFF }, { 12388, 0xFFFF }, { 12404, 0x2FFB },
+ { 12416, 0xBBFE }, { 12429, 0xFDDF }, { 12443, 0xFE3C }, { 12454, 0xFFFF },
+ { 12470, 0x5F7F }, { 12483, 0xFFDE }, { 12497, 0xFDFF }, { 12512, 0xDEFC },
+ /* 0x8800 */
+ { 12524, 0xBF7F }, { 12538, 0xBBFB }, { 12551, 0xFFFF }, { 12567, 0xFBEF },
+ { 12581, 0xFD7F }, { 12595, 0x6EEC }, { 12605, 0xEFBF }, { 12619, 0xF2F7 },
+ { 12631, 0xFB9F }, { 12644, 0xDFEF }, { 12658, 0x5D97 }, { 12668, 0xF7F6 },
+ { 12681, 0xFEA7 }, { 12693, 0xFFF5 }, { 12707, 0xD9C2 }, { 12715, 0xFFFF },
+ /* 0x8900 */
+ { 12731, 0x5EE7 }, { 12742, 0xC7FF }, { 12755, 0xFEFE }, { 12769, 0x79EF },
+ { 12781, 0xBADE }, { 12792, 0xFFDF }, { 12807, 0xFE7F }, { 12821, 0xDEDE },
+ { 12833, 0x8FEF }, { 12845, 0xF9FA }, { 12857, 0xF6FE }, { 12870, 0xF6C4 },
+ { 12879, 0x0043 }, { 12882, 0xBE7C }, { 12893, 0x3BFF }, { 12906, 0xDDDF },
+ /* 0x8A00 */
+ { 12919, 0xD59D }, { 12929, 0xF9EF }, { 12942, 0x3EAC }, { 12951, 0xFF53 },
+ { 12963, 0xF773 }, { 12975, 0x4BF7 }, { 12986, 0x7BCF }, { 12998, 0xDEFF },
+ { 13012, 0xB8FE }, { 13023, 0x577F }, { 13035, 0x8FFB }, { 13047, 0xFF55 },
+ { 13059, 0xABFD }, { 13071, 0xFFFE }, { 13086, 0xEDD7 }, { 13098, 0xDDFF },
+ /* 0x8B00 */
+ { 13112, 0xFDF7 }, { 13126, 0xFFFF }, { 13142, 0xFDFD }, { 13156, 0xFEEB },
+ { 13169, 0xFFEF }, { 13184, 0xF7FF }, { 13199, 0xBFED }, { 13212, 0xEF91 },
+ { 13222, 0x5D7F }, { 13234, 0xDF7D }, { 13247, 0x0001 }, { 13248, 0x4000 },
+ { 13249, 0x0000 }, { 13249, 0x0000 }, { 13249, 0x0004 }, { 13250, 0x0000 },
+ /* 0x8C00 */
+ { 13250, 0x0000 }, { 13250, 0x0000 }, { 13250, 0x0000 }, { 13250, 0xFA80 },
+ { 13257, 0xFFEE }, { 13271, 0xB4F3 }, { 13281, 0xBF76 }, { 13293, 0x2FEF },
+ { 13305, 0xB677 }, { 13316, 0xFFBF }, { 13331, 0xBFBF }, { 13345, 0xFFFD },
+ { 13360, 0xB5BF }, { 13372, 0xFEFE }, { 13386, 0x7FFF }, { 13401, 0x7FBF },
+ /* 0x8D00 */
+ { 13415, 0xBFFD }, { 13429, 0x3BFF }, { 13442, 0x0000 }, { 13442, 0x0000 },
+ { 13442, 0x0000 }, { 13442, 0x0000 }, { 13442, 0xFBD0 }, { 13452, 0x2FDD },
+ { 13463, 0xF637 }, { 13474, 0x9A7F }, { 13485, 0xFFEB }, { 13499, 0xD6FC },
+ { 13510, 0xF9EF }, { 13523, 0xBFFB }, { 13537, 0xDFDF }, { 13551, 0xF41F },
+ /* 0x8E00 */
+ { 13561, 0xE6FF }, { 13574, 0xFFFF }, { 13590, 0x6FFF }, { 13604, 0xF77B },
+ { 13617, 0xFFF7 }, { 13632, 0xFEF9 }, { 13645, 0xB7FF }, { 13659, 0x5DFE },
+ { 13671, 0x7FF7 }, { 13685, 0xE5FF }, { 13698, 0x3FFB }, { 13711, 0x3645 },
+ { 13718, 0xFE0D }, { 13728, 0xFD9E }, { 13740, 0xFBF7 }, { 13754, 0xDFF6 },
+ /* 0x8F00 */
+ { 13767, 0x6FEF }, { 13780, 0xFFFF }, { 13796, 0xF679 }, { 13807, 0xCBFD },
+ { 13819, 0xEFFF }, { 13834, 0xFFFF }, { 13850, 0x40DF }, { 13858, 0x0000 },
+ { 13858, 0x0000 }, { 13858, 0x9808 }, { 13862, 0xE1E9 }, { 13871, 0xDFFF },
+ { 13886, 0xFE76 }, { 13898, 0x04FF }, { 13907, 0x6D7F }, { 13919, 0xFFF1 },
+ /* 0x9000 */
+ { 13932, 0xB97F }, { 13944, 0xFEF7 }, { 13958, 0xE01F }, { 13966, 0xF1FE },
+ { 13978, 0xFE96 }, { 13989, 0x7B7F }, { 14002, 0xFB9F }, { 14015, 0xFFFD },
+ { 14030, 0xADFF }, { 14043, 0xCBB3 }, { 14053, 0xC5EF }, { 14064, 0xE97F },
+ { 14076, 0x4DBA }, { 14085, 0xBFF0 }, { 14096, 0xBF3F }, { 14109, 0xFE3F },
+ /* 0x9100 */
+ { 14122, 0xEBFF }, { 14136, 0xFFD7 }, { 14150, 0xFFDF }, { 14165, 0xCF7F },
+ { 14178, 0xFFFB }, { 14193, 0xD7EF }, { 14206, 0xD7BF }, { 14219, 0x17FD },
+ { 14230, 0xFEFF }, { 14245, 0xFE0F }, { 14256, 0xFFAF }, { 14270, 0x7EFF },
+ { 14284, 0xFAFF }, { 14298, 0xB7FB }, { 14311, 0x7FFC }, { 14324, 0xE7FA },
+ /* 0x9200 */
+ { 14336, 0xF7FF }, { 14351, 0x56FF }, { 14363, 0x6DFA }, { 14374, 0xF7FF },
+ { 14389, 0xFF73 }, { 14402, 0xEDFF }, { 14416, 0xF8FF }, { 14429, 0xFFC5 },
+ { 14441, 0xFFFF }, { 14457, 0x3FFA }, { 14469, 0x5FFF }, { 14483, 0xDEFE },
+ { 14496, 0xFFFF }, { 14512, 0xEBBF }, { 14525, 0xDFFB }, { 14539, 0xFFDF },
+ /* 0x9300 */
+ { 14554, 0xFBDF }, { 14568, 0xEF7D }, { 14581, 0xFFFF }, { 14597, 0x137B },
+ { 14606, 0xFFFF }, { 14622, 0xDFF7 }, { 14636, 0x7FFF }, { 14651, 0x7FFB },
+ { 14665, 0xF7FF }, { 14680, 0xFFF7 }, { 14695, 0xF7FF }, { 14710, 0xA9BF },
+ { 14721, 0xFDDD }, { 14734, 0xFFFF }, { 14750, 0x51DF }, { 14760, 0xFFFB },
+ /* 0x9400 */
+ { 14775, 0xFFDB }, { 14789, 0x2BFF }, { 14801, 0x7FF1 }, { 14813, 0xFFEF },
+ { 14828, 0xBFFD }, { 14842, 0x69B7 }, { 14852, 0xFFBD }, { 14866, 0xFBFF },
+ { 14881, 0x002F }, { 14886, 0x8000 }, { 14887, 0x0004 }, { 14888, 0x0000 },
+ { 14888, 0x000A }, { 14890, 0x1000 }, { 14891, 0x0000 }, { 14891, 0x0040 },
+ /* 0x9500 */
+ { 14892, 0x0000 }, { 14892, 0x0000 }, { 14892, 0x2000 }, { 14893, 0x0000 },
+ { 14893, 0x0080 }, { 14894, 0x0000 }, { 14894, 0x0000 }, { 14894, 0xBD80 },
+ { 14901, 0xFB6D }, { 14913, 0xDBDF }, { 14926, 0x7FFF }, { 14941, 0xFEE3 },
+ { 14953, 0x3FE9 }, { 14964, 0xDC7F }, { 14976, 0x013F }, { 14983, 0x0010 },
+ /* 0x9600 */
+ { 14984, 0x0000 }, { 14984, 0x7000 }, { 14987, 0xF51F }, { 14998, 0xBF0F },
+ { 15009, 0xFC3F }, { 15021, 0xF95B }, { 15032, 0xBE1E }, { 15042, 0x79FF },
+ { 15055, 0xEFFB }, { 15069, 0x5BFE }, { 15081, 0x57BE }, { 15092, 0xBB5B },
+ { 15103, 0x7FFF }, { 15118, 0xFFFC }, { 15132, 0x872E }, { 15140, 0xAFF7 },
+ /* 0x9700 */
+ { 15153, 0xEBFD }, { 15166, 0xFB4F }, { 15178, 0xDFFF }, { 15193, 0xE767 },
+ { 15204, 0x0BDF }, { 15214, 0xFDE6 }, { 15226, 0x7747 }, { 15236, 0xFDDF },
+ { 15250, 0xEFBF }, { 15264, 0xFF90 }, { 15274, 0x7D7F }, { 15287, 0xEFDE },
+ { 15300, 0xFBFF }, { 15315, 0xF3FD }, { 15328, 0x606B }, { 15335, 0xEF6F },
+ /* 0x9800 */
+ { 15348, 0xF5FF }, { 15362, 0xF9FF }, { 15376, 0xEBDB }, { 15388, 0x0BBD },
+ { 15397, 0xFFFA }, { 15411, 0xFB8F }, { 15423, 0x9FFD }, { 15436, 0x003F },
+ { 15442, 0x0000 }, { 15442, 0x0000 }, { 15442, 0xF300 }, { 15448, 0xFFDE },
+ { 15462, 0x5FDF }, { 15475, 0xD800 }, { 15479, 0xBEEF }, { 15492, 0x7676 },
+ /* 0x9900 */
+ { 15502, 0x57AD }, { 15512, 0xDFFF }, { 15527, 0xFFB2 }, { 15539, 0xFFAF },
+ { 15553, 0x7FAF }, { 15566, 0xFBFF }, { 15581, 0x000E }, { 15584, 0x0000 },
+ { 15584, 0x0000 }, { 15584, 0x7BC0 }, { 15592, 0xFDFA }, { 15605, 0x3F3F },
+ { 15617, 0xFABE }, { 15629, 0xBFFF }, { 15644, 0x76FF }, { 15657, 0xFFF3 },
+ /* 0x9A00 */
+ { 15671, 0xFEFE }, { 15685, 0xFE73 }, { 15697, 0xFEFF }, { 15712, 0xFFF7 },
+ { 15727, 0xF77F }, { 15741, 0xDFFD }, { 15755, 0x1FFD }, { 15767, 0x0000 },
+ { 15767, 0x8000 }, { 15768, 0x0000 }, { 15768, 0xA900 }, { 15772, 0xFFDF },
+ { 15787, 0xA4C7 }, { 15795, 0x91FF }, { 15806, 0xF8CF }, { 15817, 0xFEDE },
+ /* 0x9B00 */
+ { 15830, 0xFF7E }, { 15844, 0xC7F7 }, { 15856, 0xEFBD }, { 15869, 0xDEBE },
+ { 15881, 0xFD7F }, { 15895, 0x8F77 }, { 15906, 0x93D3 }, { 15915, 0xFCF3 },
+ { 15927, 0xE9EF }, { 15939, 0xECAF }, { 15950, 0xED77 }, { 15962, 0xA361 },
+ { 15969, 0x87DB }, { 15979, 0x7EF8 }, { 15990, 0x3FF7 }, { 16003, 0xA193 },
+ /* 0x9C00 */
+ { 16010, 0x7FE4 }, { 16021, 0xB8BD }, { 16031, 0xBB7B }, { 16043, 0xFEFE },
+ { 16057, 0xFF73 }, { 16070, 0xE3FD }, { 16082, 0x61CD }, { 16090, 0x1FBE },
+ { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x0000 },
+ { 16101, 0x0000 }, { 16101, 0x0000 }, { 16101, 0x26E0 }, { 16107, 0xBEFE },
+ /* 0x9D00 */
+ { 16120, 0x13FD }, { 16130, 0xEBF5 }, { 16142, 0xE36F }, { 16153, 0xEBDB },
+ { 16165, 0xDE3F }, { 16177, 0xFFDF }, { 16192, 0xFF83 }, { 16203, 0xFBBF },
+ { 16217, 0x1FFF }, { 16230, 0xFFDD }, { 16244, 0xBFFF }, { 16259, 0xFFFE },
+ { 16274, 0xFFBF }, { 16289, 0xFFFF }, { 16305, 0xFB7E }, { 16318, 0xFFFD },
+ /* 0x9E00 */
+ { 16333, 0xFEFF }, { 16348, 0xFFBF }, { 16363, 0x0000 }, { 16363, 0x0000 },
+ { 16363, 0x0000 }, { 16363, 0x0000 }, { 16363, 0x0000 }, { 16363, 0xBE20 },
+ { 16370, 0x7FFF }, { 16385, 0xFFFF }, { 16401, 0xFFF7 }, { 16416, 0xF8F3 },
+ { 16427, 0xF1DF }, { 16439, 0xFD7B }, { 16452, 0xE9F5 }, { 16463, 0xFFFF },
+ /* 0x9F00 */
+ { 16479, 0xC7C7 }, { 16489, 0x5FED }, { 16501, 0xFFFD }, { 16516, 0x6BFF },
+ { 16529, 0xFFFF }, { 16545, 0xFFFD }, { 16560, 0xDEFF }, { 16574, 0xCFF7 },
+ { 16587, 0x6000 }, { 16589, 0x9337 }, { 16598, 0x0035 },
+};
+static const Summary16 big5hkscs_uni2index_pagee0[419] = {
+ /* 0xE000 */
+ { 16602, 0xFFFF }, { 16618, 0xFFFF }, { 16634, 0xFFFF }, { 16650, 0xFFFF },
+ { 16666, 0xFFFF }, { 16682, 0xFFFF }, { 16698, 0xFFFF }, { 16714, 0xFFFF },
+ { 16730, 0xFFFF }, { 16746, 0xFFFF }, { 16762, 0xFFFF }, { 16778, 0xFFFF },
+ { 16794, 0xFFFF }, { 16810, 0xFFFF }, { 16826, 0xFFFF }, { 16842, 0xFFFF },
+ /* 0xE100 */
+ { 16858, 0xFFFF }, { 16874, 0xFFFF }, { 16890, 0xFFFF }, { 16906, 0xFFFF },
+ { 16922, 0xFFFF }, { 16938, 0xFFFF }, { 16954, 0xFFFF }, { 16970, 0xFFFF },
+ { 16986, 0xFFFF }, { 17002, 0xFFFF }, { 17018, 0xFFFF }, { 17034, 0xFFFF },
+ { 17050, 0xFFFF }, { 17066, 0xFFFF }, { 17082, 0xFFFF }, { 17098, 0xFFFF },
+ /* 0xE200 */
+ { 17114, 0xFFFF }, { 17130, 0xFFFF }, { 17146, 0xFFFF }, { 17162, 0xFFFF },
+ { 17178, 0xFFFF }, { 17194, 0xFFFF }, { 17210, 0xFFFF }, { 17226, 0xFFFF },
+ { 17242, 0xFFFF }, { 17258, 0xFFFF }, { 17274, 0xFFFF }, { 17290, 0xFFFF },
+ { 17306, 0xFFFF }, { 17322, 0xFFFF }, { 17338, 0xFFFF }, { 17354, 0xFFFF },
+ /* 0xE300 */
+ { 17370, 0xFFFF }, { 17386, 0xFFFF }, { 17402, 0xFFFF }, { 17418, 0xFFFF },
+ { 17434, 0xFFFF }, { 17450, 0xFFFF }, { 17466, 0xFFFF }, { 17482, 0xFFFF },
+ { 17498, 0xFFFF }, { 17514, 0xFFFF }, { 17530, 0xFFFF }, { 17546, 0xFFFF },
+ { 17562, 0xFFFF }, { 17578, 0xFFFF }, { 17594, 0xFFFF }, { 17610, 0xFFFF },
+ /* 0xE400 */
+ { 17626, 0xFFFF }, { 17642, 0xFFFF }, { 17658, 0xFFFF }, { 17674, 0xFFFF },
+ { 17690, 0xFFFF }, { 17706, 0xFFFF }, { 17722, 0xFFFF }, { 17738, 0xFFFF },
+ { 17754, 0xFFFF }, { 17770, 0xFFFF }, { 17786, 0xFFFF }, { 17802, 0xFFFF },
+ { 17818, 0xFFFF }, { 17834, 0xFFFF }, { 17850, 0xFFFF }, { 17866, 0xFFFF },
+ /* 0xE500 */
+ { 17882, 0xFFFF }, { 17898, 0xFFFF }, { 17914, 0xFFFF }, { 17930, 0xFFFF },
+ { 17946, 0xFFFF }, { 17962, 0xFFFF }, { 17978, 0xFFFF }, { 17994, 0xFFFF },
+ { 18010, 0xFFFF }, { 18026, 0xFFFF }, { 18042, 0xFFFF }, { 18058, 0xFFFF },
+ { 18074, 0xFFFF }, { 18090, 0xFFFF }, { 18106, 0xFFFF }, { 18122, 0xFFFF },
+ /* 0xE600 */
+ { 18138, 0xFFFF }, { 18154, 0xFFFF }, { 18170, 0xFFFF }, { 18186, 0xFFFF },
+ { 18202, 0xFFFF }, { 18218, 0xFFFF }, { 18234, 0xFFFF }, { 18250, 0xFFFF },
+ { 18266, 0xFFFF }, { 18282, 0xFFFF }, { 18298, 0xFFFF }, { 18314, 0xFFFF },
+ { 18330, 0xFFFF }, { 18346, 0xFFFF }, { 18362, 0xFFFF }, { 18378, 0xFFFF },
+ /* 0xE700 */
+ { 18394, 0xFFFF }, { 18410, 0xFFFF }, { 18426, 0xFFFF }, { 18442, 0xFFFF },
+ { 18458, 0xFFFF }, { 18474, 0xFFFF }, { 18490, 0xFFFF }, { 18506, 0xFFFF },
+ { 18522, 0xFFFF }, { 18538, 0xFFFF }, { 18554, 0xFFFF }, { 18570, 0xFFFF },
+ { 18586, 0xFFFF }, { 18602, 0xFFFF }, { 18618, 0xFFFF }, { 18634, 0xFFFF },
+ /* 0xE800 */
+ { 18650, 0xFFFF }, { 18666, 0xFFFF }, { 18682, 0xFFFF }, { 18698, 0xFFFF },
+ { 18714, 0xFFFF }, { 18730, 0xFFFF }, { 18746, 0xFFFF }, { 18762, 0xFFFF },
+ { 18778, 0xFFFF }, { 18794, 0xFFFF }, { 18810, 0xFFFF }, { 18826, 0xFFFF },
+ { 18842, 0xFFFF }, { 18858, 0xFFFF }, { 18874, 0xFFFF }, { 18890, 0xFFFF },
+ /* 0xE900 */
+ { 18906, 0xFFFF }, { 18922, 0xFFFF }, { 18938, 0xFFFF }, { 18954, 0xFFFF },
+ { 18970, 0xFFFF }, { 18986, 0xFFFF }, { 19002, 0xFFFF }, { 19018, 0xFFFF },
+ { 19034, 0xFFFF }, { 19050, 0xFFFF }, { 19066, 0xFFFF }, { 19082, 0xFFFF },
+ { 19098, 0xFFFF }, { 19114, 0xFFFF }, { 19130, 0xFFFF }, { 19146, 0xFFFF },
+ /* 0xEA00 */
+ { 19162, 0xFFFF }, { 19178, 0xFFFF }, { 19194, 0xFFFF }, { 19210, 0xFFFF },
+ { 19226, 0xFFFF }, { 19242, 0xFFFF }, { 19258, 0xFFFF }, { 19274, 0xFFFF },
+ { 19290, 0xFFFF }, { 19306, 0xFFFF }, { 19322, 0xFFFF }, { 19338, 0xFFFF },
+ { 19354, 0xFFFF }, { 19370, 0xFFFF }, { 19386, 0xFFFF }, { 19402, 0xFFFF },
+ /* 0xEB00 */
+ { 19418, 0xFFFF }, { 19434, 0xFFFF }, { 19450, 0xFFFF }, { 19466, 0xFFFF },
+ { 19482, 0xFFFF }, { 19498, 0xFFFF }, { 19514, 0xFFFF }, { 19530, 0xFFFF },
+ { 19546, 0xFFFF }, { 19562, 0xFFFF }, { 19578, 0xFFFF }, { 19594, 0xFFFF },
+ { 19610, 0xFFFF }, { 19626, 0xFFFF }, { 19642, 0xFFFF }, { 19658, 0xFFFF },
+ /* 0xEC00 */
+ { 19674, 0xFFFF }, { 19690, 0xFFFF }, { 19706, 0xFFFF }, { 19722, 0xFFFF },
+ { 19738, 0xFFFF }, { 19754, 0xFFFF }, { 19770, 0xFFFF }, { 19786, 0xFFFF },
+ { 19802, 0xFFFF }, { 19818, 0xFFFF }, { 19834, 0xFFFF }, { 19850, 0xFFFF },
+ { 19866, 0xFFFF }, { 19882, 0xFFFF }, { 19898, 0xFFFF }, { 19914, 0xFFFF },
+ /* 0xED00 */
+ { 19930, 0xFFFF }, { 19946, 0xFFFF }, { 19962, 0xFFFF }, { 19978, 0xFFFF },
+ { 19994, 0xFFFF }, { 20010, 0xFFFF }, { 20026, 0xFFFF }, { 20042, 0xFFFF },
+ { 20058, 0xFFFF }, { 20074, 0xFFFF }, { 20090, 0xFFFF }, { 20106, 0xFFFF },
+ { 20122, 0xFFFF }, { 20138, 0xFFFF }, { 20154, 0xFFFF }, { 20170, 0xFFFF },
+ /* 0xEE00 */
+ { 20186, 0xFFFF }, { 20202, 0xFFFF }, { 20218, 0xFFFF }, { 20234, 0xFFFF },
+ { 20250, 0xFFFF }, { 20266, 0xFFFF }, { 20282, 0xFFFF }, { 20298, 0xFFFF },
+ { 20314, 0xFFFF }, { 20330, 0xFFFF }, { 20346, 0xFFFF }, { 20362, 0xFFFF },
+ { 20378, 0xFFFF }, { 20394, 0xFFFF }, { 20410, 0xFFFF }, { 20426, 0xFFFF },
+ /* 0xEF00 */
+ { 20442, 0xFFFF }, { 20458, 0xFFFF }, { 20474, 0xFFFF }, { 20490, 0xFFFF },
+ { 20506, 0xFFFF }, { 20522, 0xFFFF }, { 20538, 0xFFFF }, { 20554, 0xFFFF },
+ { 20570, 0xFFFF }, { 20586, 0xFFFF }, { 20602, 0xFFFF }, { 20618, 0xFFFF },
+ { 20634, 0xFFFF }, { 20650, 0xFFFF }, { 20666, 0xFFFF }, { 20682, 0xFFFF },
+ /* 0xF000 */
+ { 20698, 0xFFFF }, { 20714, 0xFFFF }, { 20730, 0xFFFF }, { 20746, 0xFFFF },
+ { 20762, 0xFFFF }, { 20778, 0xFFFF }, { 20794, 0xFFFF }, { 20810, 0xFFFF },
+ { 20826, 0xFFFF }, { 20842, 0xFFFF }, { 20858, 0xFFFF }, { 20874, 0xFFFF },
+ { 20890, 0xFFFF }, { 20906, 0xFFFF }, { 20922, 0xFFFF }, { 20938, 0xFFFF },
+ /* 0xF100 */
+ { 20954, 0xFFFF }, { 20970, 0xFFFF }, { 20986, 0xFFFF }, { 21002, 0xFFFF },
+ { 21018, 0xFFFF }, { 21034, 0xFFFF }, { 21050, 0xFFFF }, { 21066, 0xFFFF },
+ { 21082, 0xFFFF }, { 21098, 0xFFFF }, { 21114, 0xFFFF }, { 21130, 0xFFFF },
+ { 21146, 0xFFFF }, { 21162, 0xFFFF }, { 21178, 0xFFFF }, { 21194, 0xFFFF },
+ /* 0xF200 */
+ { 21210, 0xFFFF }, { 21226, 0xFFFF }, { 21242, 0xFFFF }, { 21258, 0xFFFF },
+ { 21274, 0xFFFF }, { 21290, 0xFFFF }, { 21306, 0xFFFF }, { 21322, 0xFFFF },
+ { 21338, 0xFFFF }, { 21354, 0xFFFF }, { 21370, 0xFFFF }, { 21386, 0xFFFF },
+ { 21402, 0xFFFF }, { 21418, 0xFFFF }, { 21434, 0xFFFF }, { 21450, 0xFFFF },
+ /* 0xF300 */
+ { 21466, 0xFFFF }, { 21482, 0xFFFF }, { 21498, 0xFFFF }, { 21514, 0xFFFF },
+ { 21530, 0xFFFF }, { 21546, 0xFFFF }, { 21562, 0xFFFF }, { 21578, 0xFFFF },
+ { 21594, 0xFFFF }, { 21610, 0xFFFF }, { 21626, 0xFFFF }, { 21642, 0xFFFF },
+ { 21658, 0xFFFF }, { 21674, 0xFFFF }, { 21690, 0xFFFF }, { 21706, 0xFFFF },
+ /* 0xF400 */
+ { 21722, 0xFFFF }, { 21738, 0xFFFF }, { 21754, 0xFFFF }, { 21770, 0xFFFF },
+ { 21786, 0xFFFF }, { 21802, 0xFFFF }, { 21818, 0xFFFF }, { 21834, 0xFFFF },
+ { 21850, 0xFFFF }, { 21866, 0xFFFF }, { 21882, 0xFFFF }, { 21898, 0xFFFF },
+ { 21914, 0xFFFF }, { 21930, 0xFFFF }, { 21946, 0xFFFF }, { 21962, 0xFFFF },
+ /* 0xF500 */
+ { 21978, 0xFFFF }, { 21994, 0xFFFF }, { 22010, 0xFFFF }, { 22026, 0xFFFF },
+ { 22042, 0xFFFF }, { 22058, 0xFFFF }, { 22074, 0xFFFF }, { 22090, 0xFFFF },
+ { 22106, 0xFFFF }, { 22122, 0xFFFF }, { 22138, 0xFFFF }, { 22154, 0xFFFF },
+ { 22170, 0xFFFF }, { 22186, 0xFFFF }, { 22202, 0xFFFF }, { 22218, 0xFFFF },
+ /* 0xF600 */
+ { 22234, 0xFFFF }, { 22250, 0xFFFF }, { 22266, 0xFFFF }, { 22282, 0xFFFF },
+ { 22298, 0xFFFF }, { 22314, 0xFFFF }, { 22330, 0xFFFF }, { 22346, 0xFFFF },
+ { 22362, 0xFFFF }, { 22378, 0xFFFF }, { 22394, 0xFFFF }, { 22410, 0xFFFF },
+ { 22426, 0xFFFF }, { 22442, 0xFFFF }, { 22458, 0xFFFF }, { 22474, 0xFFFF },
+ /* 0xF700 */
+ { 22490, 0xFFFF }, { 22506, 0xFFFF }, { 22522, 0xFFFF }, { 22538, 0xFFFF },
+ { 22554, 0xFFFF }, { 22570, 0xFFFF }, { 22586, 0xFFFF }, { 22602, 0xFFFF },
+ { 22618, 0xFFFF }, { 22634, 0xFFFF }, { 22650, 0xFFFF }, { 22666, 0xFFFF },
+ { 22682, 0xFFFF }, { 22698, 0xFFFF }, { 22714, 0xFFFF }, { 22730, 0xFFFF },
+ /* 0xF800 */
+ { 22746, 0xFFFF }, { 22762, 0xFFFF }, { 22778, 0xFFFF }, { 22794, 0xFFFF },
+ { 22810, 0x01FF }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 },
+ { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 },
+ { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0000 }, { 22819, 0x0100 },
+ /* 0xF900 */
+ { 22820, 0xFFFF }, { 22836, 0xFFFF }, { 22852, 0xEFFF }, { 22867, 0xFFFF },
+ { 22883, 0xFFFF }, { 22899, 0xFFFF }, { 22915, 0xFFFF }, { 22931, 0xFDFF },
+ { 22946, 0xFFFF }, { 22962, 0xFFDF }, { 22977, 0xFFFF }, { 22993, 0xFFFF },
+ { 23009, 0xFFFF }, { 23025, 0xFFFF }, { 23041, 0xFF7F }, { 23056, 0xFFFD },
+ /* 0xFA00 */
+ { 23071, 0x3FFF }, { 23085, 0x7EE5 }, { 23096, 0x3C64 },
+};
+static const Summary16 big5hkscs_uni2index_pagefe[31] = {
+ /* 0xFE00 */
+ { 23103, 0x0000 }, { 23103, 0x0000 }, { 23103, 0x0000 }, { 23103, 0xFFFB },
+ { 23118, 0xFE1F }, { 23130, 0xFEF7 }, { 23144, 0x0F7F }, { 23155, 0x0000 },
+ { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 },
+ { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 }, { 23155, 0x0000 },
+ /* 0xFF00 */
+ { 23155, 0xFFFE }, { 23170, 0xFFFF }, { 23186, 0xFFFF }, { 23202, 0xFFFF },
+ { 23218, 0xFFFF }, { 23234, 0x7FFF }, { 23249, 0x0010 }, { 23250, 0x0000 },
+ { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x0000 },
+ { 23250, 0x0000 }, { 23250, 0x0000 }, { 23250, 0x203F },
+};
+static const Summary16 big5hkscs_uni2index_page200[2335] = {
+ /* 0x20000 */
+ { 23257, 0x0000 }, { 23257, 0x0000 }, { 23257, 0x0002 }, { 23258, 0x4000 },
+ { 23259, 0x4040 }, { 23261, 0x0000 }, { 23261, 0x0100 }, { 23262, 0x0000 },
+ { 23262, 0x04C0 }, { 23265, 0x0010 }, { 23266, 0x0000 }, { 23266, 0x0000 },
+ { 23266, 0x3C00 }, { 23270, 0x0002 }, { 23271, 0x4000 }, { 23272, 0x0000 },
+ /* 0x20100 */
+ { 23272, 0x5000 }, { 23274, 0x0100 }, { 23275, 0x0000 }, { 23275, 0x0000 },
+ { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0000 },
+ { 23275, 0x0000 }, { 23275, 0x0000 }, { 23275, 0x0A00 }, { 23277, 0x0000 },
+ { 23277, 0x0002 }, { 23278, 0x0010 }, { 23279, 0x0000 }, { 23279, 0x0004 },
+ /* 0x20200 */
+ { 23280, 0x1010 }, { 23282, 0x0010 }, { 23283, 0x0000 }, { 23283, 0x0000 },
+ { 23283, 0x0000 }, { 23283, 0x0800 }, { 23284, 0x0000 }, { 23284, 0x0030 },
+ { 23286, 0x0000 }, { 23286, 0x4200 }, { 23288, 0x0001 }, { 23289, 0x8080 },
+ { 23291, 0x0001 }, { 23292, 0x0000 }, { 23292, 0x0020 }, { 23293, 0x0000 },
+ /* 0x20300 */
+ { 23293, 0x0400 }, { 23294, 0x0000 }, { 23294, 0x0020 }, { 23295, 0x0000 },
+ { 23295, 0x00E2 }, { 23299, 0x0000 }, { 23299, 0x0000 }, { 23299, 0xC000 },
+ { 23301, 0x0001 }, { 23302, 0x0000 }, { 23302, 0x0081 }, { 23304, 0x0020 },
+ { 23305, 0x0A00 }, { 23307, 0x0000 }, { 23307, 0x0000 }, { 23307, 0x1020 },
+ /* 0x20400 */
+ { 23309, 0x0000 }, { 23309, 0x8018 }, { 23312, 0x0000 }, { 23312, 0x0000 },
+ { 23312, 0x0000 }, { 23312, 0x0000 }, { 23312, 0x0020 }, { 23313, 0x0000 },
+ { 23313, 0x4080 }, { 23315, 0x0006 }, { 23317, 0x0008 }, { 23318, 0x0000 },
+ { 23318, 0x0000 }, { 23318, 0x0080 }, { 23319, 0x0000 }, { 23319, 0x5000 },
+ /* 0x20500 */
+ { 23321, 0x0000 }, { 23321, 0x0000 }, { 23321, 0x0000 }, { 23321, 0x0000 },
+ { 23321, 0x0080 }, { 23322, 0x0000 }, { 23322, 0x0000 }, { 23322, 0x0000 },
+ { 23322, 0x4000 }, { 23323, 0x0000 }, { 23323, 0x0020 }, { 23324, 0x0008 },
+ { 23325, 0x0408 }, { 23327, 0x8021 }, { 23330, 0x0801 }, { 23332, 0x0000 },
+ /* 0x20600 */
+ { 23332, 0x0000 }, { 23332, 0x0622 }, { 23336, 0x0000 }, { 23336, 0x0001 },
+ { 23337, 0x0000 }, { 23337, 0x0040 }, { 23338, 0x0000 }, { 23338, 0x0040 },
+ { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 },
+ { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 }, { 23339, 0x0000 },
+ /* 0x20700 */
+ { 23339, 0x4000 }, { 23340, 0x0000 }, { 23340, 0x0000 }, { 23340, 0x0002 },
+ { 23341, 0x0000 }, { 23341, 0x0000 }, { 23341, 0x0000 }, { 23341, 0x0200 },
+ { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 },
+ { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x0000 },
+ /* 0x20800 */
+ { 23342, 0x0000 }, { 23342, 0x0000 }, { 23342, 0x1000 }, { 23343, 0x0000 },
+ { 23343, 0x0000 }, { 23343, 0x0000 }, { 23343, 0x0000 }, { 23343, 0x0008 },
+ { 23344, 0x0000 }, { 23344, 0x0000 }, { 23344, 0x0000 }, { 23344, 0x0000 },
+ { 23344, 0x0000 }, { 23344, 0x0020 }, { 23345, 0x0000 }, { 23345, 0x0000 },
+ /* 0x20900 */
+ { 23345, 0x0000 }, { 23345, 0x0040 }, { 23346, 0x0008 }, { 23347, 0x0000 },
+ { 23347, 0x0000 }, { 23347, 0x0010 }, { 23348, 0x0000 }, { 23348, 0x0200 },
+ { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0000 },
+ { 23349, 0x0000 }, { 23349, 0x0000 }, { 23349, 0x0080 }, { 23350, 0x0000 },
+ /* 0x20A00 */
+ { 23350, 0x0000 }, { 23350, 0x0002 }, { 23351, 0x0000 }, { 23351, 0x0000 },
+ { 23351, 0x0000 }, { 23351, 0x0001 }, { 23352, 0x0000 }, { 23352, 0x0000 },
+ { 23352, 0x0000 }, { 23352, 0x0000 }, { 23352, 0x0000 }, { 23352, 0x0010 },
+ { 23353, 0x2004 }, { 23355, 0x0000 }, { 23355, 0x0000 }, { 23355, 0x0000 },
+ /* 0x20B00 */
+ { 23355, 0x2000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 },
+ { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 }, { 23356, 0x0000 },
+ { 23356, 0x8000 }, { 23357, 0x0000 }, { 23357, 0x0300 }, { 23359, 0x8000 },
+ { 23360, 0x0840 }, { 23362, 0x0000 }, { 23362, 0x0804 }, { 23364, 0x8800 },
+ /* 0x20C00 */
+ { 23366, 0x2800 }, { 23368, 0x0000 }, { 23368, 0x0001 }, { 23369, 0x0C10 },
+ { 23372, 0x000E }, { 23375, 0x0008 }, { 23376, 0x0020 }, { 23377, 0x1180 },
+ { 23380, 0x2000 }, { 23381, 0x1040 }, { 23383, 0x0000 }, { 23383, 0x0120 },
+ { 23385, 0x8000 }, { 23386, 0x2078 }, { 23391, 0x2000 }, { 23392, 0x8000 },
+ /* 0x20D00 */
+ { 23393, 0x0000 }, { 23393, 0x0020 }, { 23394, 0x0100 }, { 23395, 0x0006 },
+ { 23397, 0x73C0 }, { 23404, 0x0000 }, { 23404, 0x8000 }, { 23405, 0xD012 },
+ { 23410, 0x0000 }, { 23410, 0x1040 }, { 23412, 0x0080 }, { 23413, 0x0004 },
+ { 23414, 0x0100 }, { 23415, 0x0000 }, { 23415, 0x0000 }, { 23415, 0x0000 },
+ /* 0x20E00 */
+ { 23415, 0xE610 }, { 23421, 0x2043 }, { 23425, 0x0000 }, { 23425, 0x0000 },
+ { 23425, 0x1000 }, { 23426, 0x0000 }, { 23426, 0x2000 }, { 23427, 0x0FE8 },
+ { 23435, 0x1000 }, { 23436, 0x2140 }, { 23439, 0x1C04 }, { 23443, 0x0040 },
+ { 23444, 0x0000 }, { 23444, 0x2180 }, { 23447, 0x0000 }, { 23447, 0x0F00 },
+ /* 0x20F00 */
+ { 23451, 0x0000 }, { 23451, 0x2000 }, { 23452, 0x6040 }, { 23455, 0x0803 },
+ { 23458, 0x1000 }, { 23459, 0x0000 }, { 23459, 0x0010 }, { 23460, 0x0000 },
+ { 23460, 0x2000 }, { 23461, 0x0001 }, { 23462, 0x2000 }, { 23463, 0x1070 },
+ { 23467, 0x0000 }, { 23467, 0x8000 }, { 23468, 0x3C00 }, { 23472, 0x0000 },
+ /* 0x21000 */
+ { 23472, 0x0000 }, { 23472, 0x6010 }, { 23475, 0x0000 }, { 23475, 0x0000 },
+ { 23475, 0x8000 }, { 23476, 0x1000 }, { 23477, 0x8000 }, { 23478, 0x09E0 },
+ { 23483, 0x0100 }, { 23484, 0x2040 }, { 23486, 0x0000 }, { 23486, 0x8010 },
+ { 23488, 0x8383 }, { 23494, 0x0008 }, { 23495, 0x0010 }, { 23496, 0x0070 },
+ /* 0x21100 */
+ { 23499, 0x0000 }, { 23499, 0x0000 }, { 23499, 0x8000 }, { 23500, 0x2800 },
+ { 23502, 0x8120 }, { 23505, 0x0000 }, { 23505, 0x0000 }, { 23505, 0x0000 },
+ { 23505, 0x0081 }, { 23507, 0x0000 }, { 23507, 0x0000 }, { 23507, 0x0000 },
+ { 23507, 0x0000 }, { 23507, 0x0200 }, { 23508, 0x0000 }, { 23508, 0x0000 },
+ /* 0x21200 */
+ { 23508, 0x0000 }, { 23508, 0x0000 }, { 23508, 0x0000 }, { 23508, 0x1000 },
+ { 23509, 0x8000 }, { 23510, 0x0000 }, { 23510, 0x0000 }, { 23510, 0x1000 },
+ { 23511, 0x0000 }, { 23511, 0x0000 }, { 23511, 0x0300 }, { 23513, 0x0001 },
+ { 23514, 0x0000 }, { 23514, 0x0000 }, { 23514, 0x0008 }, { 23515, 0x4000 },
+ /* 0x21300 */
+ { 23516, 0x003C }, { 23520, 0x0000 }, { 23520, 0x0000 }, { 23520, 0x0440 },
+ { 23522, 0x0000 }, { 23522, 0x0000 }, { 23522, 0x0000 }, { 23522, 0x0060 },
+ { 23524, 0x4000 }, { 23525, 0x1100 }, { 23527, 0x0000 }, { 23527, 0x0000 },
+ { 23527, 0x0060 }, { 23529, 0x0000 }, { 23529, 0x2000 }, { 23530, 0x4000 },
+ /* 0x21400 */
+ { 23531, 0x0000 }, { 23531, 0x0048 }, { 23533, 0x0010 }, { 23534, 0x8000 },
+ { 23535, 0x0000 }, { 23535, 0x0034 }, { 23538, 0x0000 }, { 23538, 0x0000 },
+ { 23538, 0x0400 }, { 23539, 0x0080 }, { 23540, 0x0000 }, { 23540, 0x0040 },
+ { 23541, 0x0000 }, { 23541, 0x0000 }, { 23541, 0x0100 }, { 23542, 0x2000 },
+ /* 0x21500 */
+ { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 },
+ { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0000 }, { 23543, 0x0080 },
+ { 23544, 0x0004 }, { 23545, 0x0040 }, { 23546, 0x0000 }, { 23546, 0x0000 },
+ { 23546, 0x0000 }, { 23546, 0x0000 }, { 23546, 0x0000 }, { 23546, 0x0000 },
+ /* 0x21600 */
+ { 23546, 0x0400 }, { 23547, 0x0208 }, { 23549, 0x0000 }, { 23549, 0x4000 },
+ { 23550, 0x0000 }, { 23550, 0x0000 }, { 23550, 0x0002 }, { 23551, 0x0000 },
+ { 23551, 0x0000 }, { 23551, 0x0004 }, { 23552, 0x0000 }, { 23552, 0x0500 },
+ { 23554, 0x0007 }, { 23557, 0x8028 }, { 23560, 0x01C0 }, { 23563, 0x5C00 },
+ /* 0x21700 */
+ { 23567, 0x2000 }, { 23568, 0x0001 }, { 23569, 0x0040 }, { 23570, 0x1C00 },
+ { 23573, 0x0000 }, { 23573, 0x0080 }, { 23574, 0xF000 }, { 23578, 0x001B },
+ { 23582, 0x0000 }, { 23582, 0x0000 }, { 23582, 0x0800 }, { 23583, 0x003F },
+ { 23589, 0x0088 }, { 23591, 0x9E00 }, { 23596, 0x8000 }, { 23597, 0x1F60 },
+ /* 0x21800 */
+ { 23604, 0x0000 }, { 23604, 0x0000 }, { 23604, 0x2701 }, { 23609, 0x0E00 },
+ { 23612, 0x0021 }, { 23614, 0x4004 }, { 23616, 0x001E }, { 23620, 0x0880 },
+ { 23622, 0x0038 }, { 23625, 0xC000 }, { 23627, 0x0007 }, { 23630, 0xC000 },
+ { 23632, 0x0000 }, { 23632, 0x03C2 }, { 23637, 0x0000 }, { 23637, 0x0400 },
+ /* 0x21900 */
+ { 23638, 0x0038 }, { 23641, 0x1027 }, { 23646, 0x0084 }, { 23648, 0x0800 },
+ { 23649, 0x0010 }, { 23650, 0x0100 }, { 23651, 0x0400 }, { 23652, 0x1000 },
+ { 23653, 0x0109 }, { 23656, 0x0040 }, { 23657, 0x0000 }, { 23657, 0x0000 },
+ { 23657, 0x0000 }, { 23657, 0x0800 }, { 23658, 0x0000 }, { 23658, 0x0008 },
+ /* 0x21A00 */
+ { 23659, 0x0000 }, { 23659, 0x0000 }, { 23659, 0x2000 }, { 23660, 0x0010 },
+ { 23661, 0x0820 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 },
+ { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 },
+ { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 },
+ /* 0x21B00 */
+ { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 }, { 23663, 0x0000 },
+ { 23663, 0x0010 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 },
+ { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 }, { 23664, 0x0000 },
+ { 23664, 0x0006 }, { 23666, 0x0000 }, { 23666, 0x0000 }, { 23666, 0x0000 },
+ /* 0x21C00 */
+ { 23666, 0x0000 }, { 23666, 0x0000 }, { 23666, 0x0400 }, { 23667, 0x0000 },
+ { 23667, 0x0000 }, { 23667, 0x0000 }, { 23667, 0x0000 }, { 23667, 0x0001 },
+ { 23668, 0x0000 }, { 23668, 0x0000 }, { 23668, 0x1024 }, { 23671, 0x0000 },
+ { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 },
+ /* 0x21D00 */
+ { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 }, { 23671, 0x0000 },
+ { 23671, 0x0040 }, { 23672, 0x0000 }, { 23672, 0x0000 }, { 23672, 0x0000 },
+ { 23672, 0x0000 }, { 23672, 0x0001 }, { 23673, 0x0000 }, { 23673, 0x0440 },
+ { 23675, 0x0400 }, { 23676, 0x0002 }, { 23677, 0x0800 }, { 23678, 0x0200 },
+ /* 0x21E00 */
+ { 23679, 0x0000 }, { 23679, 0x1000 }, { 23680, 0x0000 }, { 23680, 0x2080 },
+ { 23682, 0x0000 }, { 23682, 0x0000 }, { 23682, 0x0000 }, { 23682, 0x0000 },
+ { 23682, 0x0200 }, { 23683, 0x0000 }, { 23683, 0x0110 }, { 23685, 0x0000 },
+ { 23685, 0x0100 }, { 23686, 0x0020 }, { 23687, 0x0000 }, { 23687, 0x0000 },
+ /* 0x21F00 */
+ { 23687, 0x8000 }, { 23688, 0x0020 }, { 23689, 0x0000 }, { 23689, 0x0000 },
+ { 23689, 0x0000 }, { 23689, 0x0000 }, { 23689, 0x0400 }, { 23690, 0x0000 },
+ { 23690, 0x0000 }, { 23690, 0x4000 }, { 23691, 0x0002 }, { 23692, 0x0000 },
+ { 23692, 0x0000 }, { 23692, 0x0000 }, { 23692, 0x0100 }, { 23693, 0x0000 },
+ /* 0x22000 */
+ { 23693, 0x0000 }, { 23693, 0x0000 }, { 23693, 0x0000 }, { 23693, 0x0000 },
+ { 23693, 0x0220 }, { 23695, 0x0000 }, { 23695, 0x0000 }, { 23695, 0x4000 },
+ { 23696, 0x0000 }, { 23696, 0x0400 }, { 23697, 0x0000 }, { 23697, 0x0000 },
+ { 23697, 0x0080 }, { 23698, 0x0000 }, { 23698, 0x0000 }, { 23698, 0x1000 },
+ /* 0x22100 */
+ { 23699, 0x0000 }, { 23699, 0x0000 }, { 23699, 0x0400 }, { 23700, 0x0000 },
+ { 23700, 0x0000 }, { 23700, 0x0800 }, { 23701, 0x0000 }, { 23701, 0x0408 },
+ { 23703, 0x0000 }, { 23703, 0x0000 }, { 23703, 0x0002 }, { 23704, 0x0000 },
+ { 23704, 0x0008 }, { 23705, 0x0000 }, { 23705, 0x0000 }, { 23705, 0x0000 },
+ /* 0x22200 */
+ { 23705, 0x0100 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x0000 },
+ { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x0000 }, { 23706, 0x1000 },
+ { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 },
+ { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0000 },
+ /* 0x22300 */
+ { 23707, 0x0000 }, { 23707, 0x0000 }, { 23707, 0x0022 }, { 23709, 0x0000 },
+ { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 },
+ { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x0000 }, { 23709, 0x2000 },
+ { 23710, 0x0000 }, { 23710, 0x0081 }, { 23712, 0x0000 }, { 23712, 0x0400 },
+ /* 0x22400 */
+ { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0000 },
+ { 23713, 0x0000 }, { 23713, 0x0000 }, { 23713, 0x0020 }, { 23714, 0x0002 },
+ { 23715, 0x0800 }, { 23716, 0x0002 }, { 23717, 0x0000 }, { 23717, 0x0001 },
+ { 23718, 0x0000 }, { 23718, 0x0000 }, { 23718, 0x2000 }, { 23719, 0x0000 },
+ /* 0x22500 */
+ { 23719, 0x0000 }, { 23719, 0x0808 }, { 23721, 0x0000 }, { 23721, 0x0001 },
+ { 23722, 0x0000 }, { 23722, 0x0010 }, { 23723, 0x0000 }, { 23723, 0x0000 },
+ { 23723, 0x2000 }, { 23724, 0x0000 }, { 23724, 0x8000 }, { 23725, 0x4000 },
+ { 23726, 0x0000 }, { 23726, 0x0000 }, { 23726, 0x0000 }, { 23726, 0x0000 },
+ /* 0x22600 */
+ { 23726, 0x0000 }, { 23726, 0x1800 }, { 23728, 0x0800 }, { 23729, 0x0000 },
+ { 23729, 0x0000 }, { 23729, 0x0000 }, { 23729, 0x0100 }, { 23730, 0x0400 },
+ { 23731, 0x0000 }, { 23731, 0x0140 }, { 23733, 0x0000 }, { 23733, 0x0000 },
+ { 23733, 0x0000 }, { 23733, 0x0000 }, { 23733, 0x0000 }, { 23733, 0x0070 },
+ /* 0x22700 */
+ { 23736, 0x0000 }, { 23736, 0x8814 }, { 23740, 0x0400 }, { 23741, 0x0000 },
+ { 23741, 0x0000 }, { 23741, 0x0000 }, { 23741, 0x0000 }, { 23741, 0x0020 },
+ { 23742, 0x0002 }, { 23743, 0x0000 }, { 23743, 0x0000 }, { 23743, 0x0030 },
+ { 23745, 0x2000 }, { 23746, 0x0000 }, { 23746, 0x0000 }, { 23746, 0x0000 },
+ /* 0x22800 */
+ { 23746, 0x0008 }, { 23747, 0x0000 }, { 23747, 0x0000 }, { 23747, 0x0000 },
+ { 23747, 0x0000 }, { 23747, 0x8000 }, { 23748, 0x0001 }, { 23749, 0x0002 },
+ { 23750, 0x0000 }, { 23750, 0x0000 }, { 23750, 0x2000 }, { 23751, 0x0000 },
+ { 23751, 0x0002 }, { 23752, 0x0000 }, { 23752, 0x0000 }, { 23752, 0x0080 },
+ /* 0x22900 */
+ { 23753, 0x0000 }, { 23753, 0x0000 }, { 23753, 0x0040 }, { 23754, 0x0200 },
+ { 23755, 0x8000 }, { 23756, 0x0000 }, { 23756, 0x0880 }, { 23758, 0x0000 },
+ { 23758, 0x0001 }, { 23759, 0x0008 }, { 23760, 0x0000 }, { 23760, 0x0000 },
+ { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 },
+ /* 0x22A00 */
+ { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0000 },
+ { 23760, 0x0000 }, { 23760, 0x0000 }, { 23760, 0x0040 }, { 23761, 0x0000 },
+ { 23761, 0x0000 }, { 23761, 0x0000 }, { 23761, 0x0000 }, { 23761, 0x0000 },
+ { 23761, 0x8000 }, { 23762, 0x0020 }, { 23763, 0x0140 }, { 23765, 0x0000 },
+ /* 0x22B00 */
+ { 23765, 0x4000 }, { 23766, 0x0000 }, { 23766, 0x0004 }, { 23767, 0x8000 },
+ { 23768, 0x0008 }, { 23769, 0x0000 }, { 23769, 0x0400 }, { 23770, 0x0000 },
+ { 23770, 0x0000 }, { 23770, 0x0000 }, { 23770, 0x0000 }, { 23770, 0x0000 },
+ { 23770, 0x4400 }, { 23772, 0x0000 }, { 23772, 0x0000 }, { 23772, 0x0000 },
+ /* 0x22C00 */
+ { 23772, 0x0000 }, { 23772, 0x0000 }, { 23772, 0x00C0 }, { 23774, 0x0100 },
+ { 23775, 0x1000 }, { 23776, 0x0022 }, { 23778, 0x0004 }, { 23779, 0x0000 },
+ { 23779, 0x0100 }, { 23780, 0x0800 }, { 23781, 0x0202 }, { 23783, 0x0084 },
+ { 23785, 0x0244 }, { 23788, 0x0000 }, { 23788, 0x0000 }, { 23788, 0x0000 },
+ /* 0x22D00 */
+ { 23788, 0x0180 }, { 23790, 0x0004 }, { 23791, 0x0000 }, { 23791, 0x0000 },
+ { 23791, 0x1010 }, { 23793, 0x0000 }, { 23793, 0x0080 }, { 23794, 0x0000 },
+ { 23794, 0x2000 }, { 23795, 0x0020 }, { 23796, 0x0019 }, { 23799, 0x0080 },
+ { 23800, 0x0000 }, { 23800, 0x0000 }, { 23800, 0x4000 }, { 23801, 0x0000 },
+ /* 0x22E00 */
+ { 23801, 0x2000 }, { 23802, 0x0000 }, { 23802, 0x0000 }, { 23802, 0x0040 },
+ { 23803, 0x0004 }, { 23804, 0x0000 }, { 23804, 0x0000 }, { 23804, 0x0100 },
+ { 23805, 0x0800 }, { 23806, 0x0000 }, { 23806, 0x0000 }, { 23806, 0x0008 },
+ { 23807, 0x0000 }, { 23807, 0x0000 }, { 23807, 0x8000 }, { 23808, 0x0000 },
+ /* 0x22F00 */
+ { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 },
+ { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0000 }, { 23808, 0x0010 },
+ { 23809, 0x0000 }, { 23809, 0x0000 }, { 23809, 0x0000 }, { 23809, 0x0000 },
+ { 23809, 0x1000 }, { 23810, 0x0000 }, { 23810, 0x0008 }, { 23811, 0x0000 },
+ /* 0x23000 */
+ { 23811, 0x0000 }, { 23811, 0x0000 }, { 23811, 0x0000 }, { 23811, 0x0008 },
+ { 23812, 0x0810 }, { 23814, 0x0000 }, { 23814, 0x0040 }, { 23815, 0x6000 },
+ { 23817, 0x4000 }, { 23818, 0x0000 }, { 23818, 0x0000 }, { 23818, 0x1080 },
+ { 23820, 0x0000 }, { 23820, 0x0400 }, { 23821, 0x0000 }, { 23821, 0x0000 },
+ /* 0x23100 */
+ { 23821, 0x0008 }, { 23822, 0x0000 }, { 23822, 0x0000 }, { 23822, 0x2000 },
+ { 23823, 0x0000 }, { 23823, 0x0000 }, { 23823, 0x0000 }, { 23823, 0x2000 },
+ { 23824, 0x0004 }, { 23825, 0x0000 }, { 23825, 0x0030 }, { 23827, 0x0008 },
+ { 23828, 0x0300 }, { 23830, 0x0000 }, { 23830, 0x0000 }, { 23830, 0x0380 },
+ /* 0x23200 */
+ { 23833, 0x8000 }, { 23834, 0x0000 }, { 23834, 0x8020 }, { 23836, 0x001E },
+ { 23840, 0x0000 }, { 23840, 0x0000 }, { 23840, 0x0004 }, { 23841, 0x0000 },
+ { 23841, 0x0602 }, { 23844, 0x0000 }, { 23844, 0x3800 }, { 23847, 0x0000 },
+ { 23847, 0x0000 }, { 23847, 0x0004 }, { 23848, 0x0003 }, { 23850, 0x0000 },
+ /* 0x23300 */
+ { 23850, 0x0401 }, { 23852, 0x8000 }, { 23853, 0x0000 }, { 23853, 0x0000 },
+ { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 },
+ { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0000 }, { 23853, 0x0010 },
+ { 23854, 0x1000 }, { 23855, 0x4000 }, { 23856, 0x0040 }, { 23857, 0x4630 },
+ /* 0x23400 */
+ { 23862, 0x0001 }, { 23863, 0x0000 }, { 23863, 0x0000 }, { 23863, 0x8000 },
+ { 23864, 0x0000 }, { 23864, 0x0001 }, { 23865, 0x8000 }, { 23866, 0x0004 },
+ { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0000 },
+ { 23867, 0x0000 }, { 23867, 0x0000 }, { 23867, 0x0020 }, { 23868, 0x0000 },
+ /* 0x23500 */
+ { 23868, 0x0000 }, { 23868, 0x0200 }, { 23869, 0x0000 }, { 23869, 0x0001 },
+ { 23870, 0x0000 }, { 23870, 0x0400 }, { 23871, 0x0080 }, { 23872, 0x0000 },
+ { 23872, 0x0000 }, { 23872, 0x1220 }, { 23875, 0x0000 }, { 23875, 0x0000 },
+ { 23875, 0xE000 }, { 23878, 0x0000 }, { 23878, 0x0000 }, { 23878, 0x0008 },
+ /* 0x23600 */
+ { 23879, 0x0001 }, { 23880, 0x0400 }, { 23881, 0x0000 }, { 23881, 0x1000 },
+ { 23882, 0x0001 }, { 23883, 0x8200 }, { 23885, 0x0000 }, { 23885, 0x0080 },
+ { 23886, 0x0000 }, { 23886, 0x0000 }, { 23886, 0x2040 }, { 23888, 0x0400 },
+ { 23889, 0x0000 }, { 23889, 0x8000 }, { 23890, 0x4000 }, { 23891, 0x0000 },
+ /* 0x23700 */
+ { 23891, 0x0008 }, { 23892, 0x0040 }, { 23893, 0xA001 }, { 23896, 0x8000 },
+ { 23897, 0x0000 }, { 23897, 0x0000 }, { 23897, 0x0040 }, { 23898, 0x0000 },
+ { 23898, 0x0002 }, { 23899, 0x0000 }, { 23899, 0x0004 }, { 23900, 0x1000 },
+ { 23901, 0x0004 }, { 23902, 0x00E0 }, { 23905, 0x0000 }, { 23905, 0x0000 },
+ /* 0x23800 */
+ { 23905, 0x0000 }, { 23905, 0x0000 }, { 23905, 0x0000 }, { 23905, 0x0400 },
+ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 },
+ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 },
+ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 },
+ /* 0x23900 */
+ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 },
+ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 },
+ { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 }, { 23906, 0x0000 },
+ { 23906, 0x0004 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 },
+ /* 0x23A00 */
+ { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 },
+ { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0000 },
+ { 23907, 0x0000 }, { 23907, 0x0000 }, { 23907, 0x0080 }, { 23908, 0x0000 },
+ { 23908, 0x0000 }, { 23908, 0x0800 }, { 23909, 0x4000 }, { 23910, 0x0400 },
+ /* 0x23B00 */
+ { 23911, 0x0000 }, { 23911, 0x0000 }, { 23911, 0x0000 }, { 23911, 0x0000 },
+ { 23911, 0x0000 }, { 23911, 0x0400 }, { 23912, 0x0000 }, { 23912, 0x0000 },
+ { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 },
+ { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 },
+ /* 0x23C00 */
+ { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0000 },
+ { 23912, 0x0000 }, { 23912, 0x0000 }, { 23912, 0x0008 }, { 23913, 0x0000 },
+ { 23913, 0x0000 }, { 23913, 0x0E00 }, { 23916, 0x0000 }, { 23916, 0x00A0 },
+ { 23918, 0x0380 }, { 23921, 0x0000 }, { 23921, 0x0000 }, { 23921, 0xF000 },
+ /* 0x23D00 */
+ { 23925, 0x0000 }, { 23925, 0x0000 }, { 23925, 0x0000 }, { 23925, 0x0000 },
+ { 23925, 0x0001 }, { 23926, 0x0800 }, { 23927, 0x0000 }, { 23927, 0x4000 },
+ { 23928, 0x8000 }, { 23929, 0x0000 }, { 23929, 0x0000 }, { 23929, 0x3FC0 },
+ { 23937, 0x0000 }, { 23937, 0x0000 }, { 23937, 0x0008 }, { 23938, 0x0100 },
+ /* 0x23E00 */
+ { 23939, 0x0000 }, { 23939, 0x0002 }, { 23940, 0xF000 }, { 23944, 0x0203 },
+ { 23947, 0x0000 }, { 23947, 0x0000 }, { 23947, 0x0000 }, { 23947, 0x0000 },
+ { 23947, 0x0F00 }, { 23951, 0x0000 }, { 23951, 0x0000 }, { 23951, 0x8200 },
+ { 23953, 0x0000 }, { 23953, 0x0080 }, { 23954, 0x0000 }, { 23954, 0x1F80 },
+ /* 0x23F00 */
+ { 23960, 0x0000 }, { 23960, 0x0000 }, { 23960, 0x0000 }, { 23960, 0x0020 },
+ { 23961, 0x0402 }, { 23963, 0x0000 }, { 23963, 0x0000 }, { 23963, 0x8000 },
+ { 23964, 0x8007 }, { 23968, 0x0000 }, { 23968, 0x0000 }, { 23968, 0x0090 },
+ { 23970, 0x0021 }, { 23972, 0x0000 }, { 23972, 0xF800 }, { 23977, 0x0001 },
+ /* 0x24000 */
+ { 23978, 0x0000 }, { 23978, 0x0002 }, { 23979, 0x0000 }, { 23979, 0x3E00 },
+ { 23984, 0x0000 }, { 23984, 0x0080 }, { 23985, 0x0000 }, { 23985, 0x0000 },
+ { 23985, 0x3820 }, { 23989, 0x0002 }, { 23990, 0x0000 }, { 23990, 0x0000 },
+ { 23990, 0x0200 }, { 23991, 0x0000 }, { 23991, 0x0002 }, { 23992, 0x0000 },
+ /* 0x24100 */
+ { 23992, 0x8010 }, { 23994, 0x0200 }, { 23995, 0x0000 }, { 23995, 0x8000 },
+ { 23996, 0x4011 }, { 23999, 0x90E0 }, { 24004, 0x0000 }, { 24004, 0x0480 },
+ { 24006, 0x0000 }, { 24006, 0x0000 }, { 24006, 0x1038 }, { 24010, 0x0020 },
+ { 24011, 0x2000 }, { 24012, 0x0000 }, { 24012, 0x0004 }, { 24013, 0x1000 },
+ /* 0x24200 */
+ { 24014, 0x0000 }, { 24014, 0x0800 }, { 24015, 0x0000 }, { 24015, 0x0000 },
+ { 24015, 0x0800 }, { 24016, 0x0240 }, { 24018, 0x0000 }, { 24018, 0x01C0 },
+ { 24021, 0x0010 }, { 24022, 0x0028 }, { 24024, 0x0020 }, { 24025, 0x0000 },
+ { 24025, 0x0602 }, { 24028, 0x0000 }, { 24028, 0x4000 }, { 24029, 0x0400 },
+ /* 0x24300 */
+ { 24030, 0x2000 }, { 24031, 0x0400 }, { 24032, 0x0000 }, { 24032, 0x0010 },
+ { 24033, 0x0100 }, { 24034, 0x0000 }, { 24034, 0x003C }, { 24038, 0x0000 },
+ { 24038, 0x1000 }, { 24039, 0x1040 }, { 24041, 0x0000 }, { 24041, 0x2000 },
+ { 24042, 0x0002 }, { 24043, 0x0000 }, { 24043, 0x0600 }, { 24045, 0x0104 },
+ /* 0x24400 */
+ { 24047, 0x0010 }, { 24048, 0x0000 }, { 24048, 0x0000 }, { 24048, 0x0060 },
+ { 24050, 0x0000 }, { 24050, 0x0C00 }, { 24052, 0x0000 }, { 24052, 0x0008 },
+ { 24053, 0x0180 }, { 24055, 0x0000 }, { 24055, 0x0000 }, { 24055, 0x1200 },
+ { 24057, 0x4000 }, { 24058, 0x0048 }, { 24060, 0x0000 }, { 24060, 0x0000 },
+ /* 0x24500 */
+ { 24060, 0x0020 }, { 24061, 0x0000 }, { 24061, 0x0002 }, { 24062, 0x0000 },
+ { 24062, 0x0000 }, { 24062, 0x0000 }, { 24062, 0x0000 }, { 24062, 0x0100 },
+ { 24063, 0x0000 }, { 24063, 0x0000 }, { 24063, 0x0000 }, { 24063, 0x0000 },
+ { 24063, 0x0100 }, { 24064, 0x0000 }, { 24064, 0x0000 }, { 24064, 0x0000 },
+ /* 0x24600 */
+ { 24064, 0x0000 }, { 24064, 0x0100 }, { 24065, 0x0400 }, { 24066, 0x0000 },
+ { 24066, 0x0000 }, { 24066, 0x0000 }, { 24066, 0x0020 }, { 24067, 0x0010 },
+ { 24068, 0x0000 }, { 24068, 0x0080 }, { 24069, 0x0000 }, { 24069, 0x0000 },
+ { 24069, 0x0000 }, { 24069, 0x0010 }, { 24070, 0x0000 }, { 24070, 0x0000 },
+ /* 0x24700 */
+ { 24070, 0x0040 }, { 24071, 0x0000 }, { 24071, 0x8020 }, { 24073, 0x0000 },
+ { 24073, 0x0000 }, { 24073, 0x0000 }, { 24073, 0x0000 }, { 24073, 0x0000 },
+ { 24073, 0x8000 }, { 24074, 0x0000 }, { 24074, 0x0000 }, { 24074, 0x0000 },
+ { 24074, 0x0000 }, { 24074, 0x0000 }, { 24074, 0x0001 }, { 24075, 0x0000 },
+ /* 0x24800 */
+ { 24075, 0x0000 }, { 24075, 0x0004 }, { 24076, 0x0008 }, { 24077, 0x0000 },
+ { 24077, 0x0000 }, { 24077, 0x0000 }, { 24077, 0x0000 }, { 24077, 0x0000 },
+ { 24077, 0x0004 }, { 24078, 0x0000 }, { 24078, 0x0000 }, { 24078, 0x0000 },
+ { 24078, 0x0000 }, { 24078, 0x0000 }, { 24078, 0x0200 }, { 24079, 0x880F },
+ /* 0x24900 */
+ { 24085, 0x1003 }, { 24088, 0x02C0 }, { 24091, 0x8000 }, { 24092, 0xC018 },
+ { 24096, 0x000F }, { 24100, 0x0000 }, { 24100, 0x000C }, { 24102, 0x8870 },
+ { 24107, 0xFF04 }, { 24116, 0x0010 }, { 24117, 0x3A90 }, { 24123, 0x0F80 },
+ { 24128, 0x0020 }, { 24129, 0xC401 }, { 24133, 0x3028 }, { 24137, 0x0BC0 },
+ /* 0x24A00 */
+ { 24142, 0x4000 }, { 24143, 0x002C }, { 24146, 0x07FE }, { 24156, 0x4000 },
+ { 24157, 0xC424 }, { 24162, 0x2003 }, { 24165, 0x00E0 }, { 24168, 0x0782 },
+ { 24173, 0x1000 }, { 24174, 0x0078 }, { 24178, 0x00F0 }, { 24182, 0x1C0E },
+ { 24188, 0x0481 }, { 24191, 0x8002 }, { 24193, 0x0204 }, { 24195, 0x0000 },
+ /* 0x24B00 */
+ { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x0000 },
+ { 24195, 0x0000 }, { 24195, 0x0000 }, { 24195, 0x4000 }, { 24196, 0x0000 },
+ { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 },
+ { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0000 }, { 24196, 0x0020 },
+ /* 0x24C00 */
+ { 24197, 0x0200 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 },
+ { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 }, { 24198, 0x0000 },
+ { 24198, 0x0000 }, { 24198, 0xC000 }, { 24200, 0x0000 }, { 24200, 0x0000 },
+ { 24200, 0x0200 }, { 24201, 0x0200 }, { 24202, 0x0000 }, { 24202, 0x0000 },
+ /* 0x24D00 */
+ { 24202, 0x0040 }, { 24203, 0x0008 }, { 24204, 0x0000 }, { 24204, 0x0000 },
+ { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 },
+ { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0000 }, { 24204, 0x0100 },
+ { 24205, 0x0000 }, { 24205, 0x0000 }, { 24205, 0x0C00 }, { 24207, 0x0000 },
+ /* 0x24E00 */
+ { 24207, 0x0000 }, { 24207, 0x0000 }, { 24207, 0x0000 }, { 24207, 0x0800 },
+ { 24208, 0x0000 }, { 24208, 0x0001 }, { 24209, 0x0000 }, { 24209, 0x0000 },
+ { 24209, 0x0000 }, { 24209, 0x0000 }, { 24209, 0x00A0 }, { 24211, 0x0000 },
+ { 24211, 0x0000 }, { 24211, 0x0000 }, { 24211, 0x0000 }, { 24211, 0x0000 },
+ /* 0x24F00 */
+ { 24211, 0x4000 }, { 24212, 0x0000 }, { 24212, 0x0000 }, { 24212, 0x0000 },
+ { 24212, 0x0000 }, { 24212, 0x1000 }, { 24213, 0x0000 }, { 24213, 0x0000 },
+ { 24213, 0x0044 }, { 24215, 0x0480 }, { 24217, 0x0200 }, { 24218, 0x0100 },
+ { 24219, 0x0004 }, { 24220, 0x0000 }, { 24220, 0x0000 }, { 24220, 0x0000 },
+ /* 0x25000 */
+ { 24220, 0x0000 }, { 24220, 0x0000 }, { 24220, 0x1000 }, { 24221, 0x0000 },
+ { 24221, 0x0000 }, { 24221, 0x0004 }, { 24222, 0x0000 }, { 24222, 0x0000 },
+ { 24222, 0x0000 }, { 24222, 0x2000 }, { 24223, 0x0000 }, { 24223, 0x0000 },
+ { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0000 },
+ /* 0x25100 */
+ { 24223, 0x0000 }, { 24223, 0x0000 }, { 24223, 0x0800 }, { 24224, 0x0000 },
+ { 24224, 0x0100 }, { 24225, 0x0000 }, { 24225, 0x0000 }, { 24225, 0x6000 },
+ { 24227, 0x0000 }, { 24227, 0x0000 }, { 24227, 0x0000 }, { 24227, 0x0000 },
+ { 24227, 0x2000 }, { 24228, 0x0000 }, { 24228, 0x00C8 }, { 24231, 0x0000 },
+ /* 0x25200 */
+ { 24231, 0x0000 }, { 24231, 0x0000 }, { 24231, 0x0003 }, { 24233, 0x0000 },
+ { 24233, 0x0000 }, { 24233, 0x0001 }, { 24234, 0x0000 }, { 24234, 0x0000 },
+ { 24234, 0x0000 }, { 24234, 0x0200 }, { 24235, 0x0000 }, { 24235, 0x0000 },
+ { 24235, 0x0080 }, { 24236, 0x0100 }, { 24237, 0x0000 }, { 24237, 0x0000 },
+ /* 0x25300 */
+ { 24237, 0x4000 }, { 24238, 0x000A }, { 24240, 0x0000 }, { 24240, 0x0000 },
+ { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 },
+ { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 },
+ { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 }, { 24240, 0x0000 },
+ /* 0x25400 */
+ { 24240, 0x0000 }, { 24240, 0x0200 }, { 24241, 0x8020 }, { 24243, 0x0001 },
+ { 24244, 0x0040 }, { 24245, 0x0000 }, { 24245, 0x5000 }, { 24247, 0x0000 },
+ { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 },
+ { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 },
+ /* 0x25500 */
+ { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x0000 }, { 24247, 0x8022 },
+ { 24250, 0x0000 }, { 24250, 0x7800 }, { 24254, 0x0064 }, { 24257, 0x0000 },
+ { 24257, 0x8012 }, { 24260, 0x0000 }, { 24260, 0x0000 }, { 24260, 0x0200 },
+ { 24261, 0x0000 }, { 24261, 0x0820 }, { 24263, 0x0001 }, { 24264, 0x0000 },
+ /* 0x25600 */
+ { 24264, 0x0020 }, { 24265, 0x0000 }, { 24265, 0x0000 }, { 24265, 0x0020 },
+ { 24266, 0x0000 }, { 24266, 0x0002 }, { 24267, 0x0000 }, { 24267, 0x0000 },
+ { 24267, 0x0008 }, { 24268, 0x0020 }, { 24269, 0x0000 }, { 24269, 0x0000 },
+ { 24269, 0x0000 }, { 24269, 0x0000 }, { 24269, 0x0008 }, { 24270, 0x0040 },
+ /* 0x25700 */
+ { 24271, 0x0040 }, { 24272, 0x2000 }, { 24273, 0x0020 }, { 24274, 0x2000 },
+ { 24275, 0x0000 }, { 24275, 0x0000 }, { 24275, 0x0000 }, { 24275, 0x0004 },
+ { 24276, 0x0000 }, { 24276, 0x0000 }, { 24276, 0x0000 }, { 24276, 0x0000 },
+ { 24276, 0x0080 }, { 24277, 0x8000 }, { 24278, 0x0003 }, { 24280, 0x0000 },
+ /* 0x25800 */
+ { 24280, 0x0000 }, { 24280, 0x0000 }, { 24280, 0x0000 }, { 24280, 0x0000 },
+ { 24280, 0x0000 }, { 24280, 0x2080 }, { 24282, 0x0000 }, { 24282, 0x0004 },
+ { 24283, 0x0000 }, { 24283, 0x0000 }, { 24283, 0x0000 }, { 24283, 0x0000 },
+ { 24283, 0x0100 }, { 24284, 0x0000 }, { 24284, 0x0002 }, { 24285, 0x0000 },
+ /* 0x25900 */
+ { 24285, 0x0008 }, { 24286, 0x0000 }, { 24286, 0x0000 }, { 24286, 0x0000 },
+ { 24286, 0x0040 }, { 24287, 0x0040 }, { 24288, 0x0000 }, { 24288, 0x0000 },
+ { 24288, 0x0000 }, { 24288, 0x0000 }, { 24288, 0x1000 }, { 24289, 0x0000 },
+ { 24289, 0x1000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 },
+ /* 0x25A00 */
+ { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 },
+ { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 }, { 24290, 0x0000 },
+ { 24290, 0x0000 }, { 24290, 0x1020 }, { 24292, 0xC000 }, { 24294, 0x0000 },
+ { 24294, 0x0000 }, { 24294, 0x0000 }, { 24294, 0x0200 }, { 24295, 0x0000 },
+ /* 0x25B00 */
+ { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 },
+ { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0000 }, { 24295, 0x0010 },
+ { 24296, 0x0200 }, { 24297, 0x0000 }, { 24297, 0x0000 }, { 24297, 0x0018 },
+ { 24299, 0x0040 }, { 24300, 0x0000 }, { 24300, 0x0110 }, { 24302, 0x0000 },
+ /* 0x25C00 */
+ { 24302, 0x0042 }, { 24304, 0x0000 }, { 24304, 0x0002 }, { 24305, 0x0000 },
+ { 24305, 0x0400 }, { 24306, 0x0000 }, { 24306, 0x0020 }, { 24307, 0x0000 },
+ { 24307, 0x0000 }, { 24307, 0x0002 }, { 24308, 0x0010 }, { 24309, 0x0000 },
+ { 24309, 0x0003 }, { 24311, 0x0000 }, { 24311, 0x0000 }, { 24311, 0x4000 },
+ /* 0x25D00 */
+ { 24312, 0x0000 }, { 24312, 0x0000 }, { 24312, 0x0001 }, { 24313, 0x0001 },
+ { 24314, 0x0008 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 },
+ { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 },
+ { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 },
+ /* 0x25E00 */
+ { 24315, 0x4000 }, { 24316, 0x0000 }, { 24316, 0x0000 }, { 24316, 0x0000 },
+ { 24316, 0x0200 }, { 24317, 0x0000 }, { 24317, 0x0000 }, { 24317, 0x0000 },
+ { 24317, 0x000E }, { 24320, 0x0000 }, { 24320, 0x0040 }, { 24321, 0x1000 },
+ { 24322, 0x0000 }, { 24322, 0x0180 }, { 24324, 0x0000 }, { 24324, 0x0000 },
+ /* 0x25F00 */
+ { 24324, 0x0000 }, { 24324, 0x0400 }, { 24325, 0x0000 }, { 24325, 0x0000 },
+ { 24325, 0x0800 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 },
+ { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0000 },
+ { 24326, 0x0000 }, { 24326, 0x0000 }, { 24326, 0x0006 }, { 24328, 0x0000 },
+ /* 0x26000 */
+ { 24328, 0x0000 }, { 24328, 0x0000 }, { 24328, 0x0200 }, { 24329, 0x0000 },
+ { 24329, 0x0100 }, { 24330, 0x0000 }, { 24330, 0x0010 }, { 24331, 0x0000 },
+ { 24331, 0x0008 }, { 24332, 0x0080 }, { 24333, 0x0030 }, { 24335, 0x0000 },
+ { 24335, 0x0000 }, { 24335, 0x0000 }, { 24335, 0x0000 }, { 24335, 0x0000 },
+ /* 0x26100 */
+ { 24335, 0x0004 }, { 24336, 0x0000 }, { 24336, 0x0002 }, { 24337, 0x0000 },
+ { 24337, 0x0000 }, { 24337, 0x1E00 }, { 24341, 0x0000 }, { 24341, 0x0000 },
+ { 24341, 0x0000 }, { 24341, 0x0000 }, { 24341, 0x6000 }, { 24343, 0x0004 },
+ { 24344, 0x0000 }, { 24344, 0x2000 }, { 24345, 0x0000 }, { 24345, 0x0000 },
+ /* 0x26200 */
+ { 24345, 0x0000 }, { 24345, 0x0000 }, { 24345, 0x0000 }, { 24345, 0x0000 },
+ { 24345, 0x0000 }, { 24345, 0x0100 }, { 24346, 0x0C02 }, { 24349, 0x0000 },
+ { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0000 }, { 24349, 0x0000 },
+ { 24349, 0x0000 }, { 24349, 0x0001 }, { 24350, 0x0000 }, { 24350, 0x0000 },
+ /* 0x26300 */
+ { 24350, 0x0000 }, { 24350, 0x0000 }, { 24350, 0x0000 }, { 24350, 0x0020 },
+ { 24351, 0x1800 }, { 24353, 0x0002 }, { 24354, 0x0000 }, { 24354, 0x0000 },
+ { 24354, 0x0000 }, { 24354, 0x0000 }, { 24354, 0x0000 }, { 24354, 0x4000 },
+ { 24355, 0x0000 }, { 24355, 0x0000 }, { 24355, 0x0000 }, { 24355, 0x0120 },
+ /* 0x26400 */
+ { 24357, 0x0004 }, { 24358, 0x0007 }, { 24361, 0x0000 }, { 24361, 0x0000 },
+ { 24361, 0x0400 }, { 24362, 0x0000 }, { 24362, 0x0200 }, { 24363, 0x0000 },
+ { 24363, 0x2310 }, { 24367, 0x0100 }, { 24368, 0x0000 }, { 24368, 0x0000 },
+ { 24368, 0x0000 }, { 24368, 0x0000 }, { 24368, 0x0000 }, { 24368, 0x0000 },
+ /* 0x26500 */
+ { 24368, 0x0000 }, { 24368, 0x0004 }, { 24369, 0x0000 }, { 24369, 0x0000 },
+ { 24369, 0x0000 }, { 24369, 0x0000 }, { 24369, 0x0000 }, { 24369, 0x0004 },
+ { 24370, 0x0000 }, { 24370, 0x0000 }, { 24370, 0x2001 }, { 24372, 0x8000 },
+ { 24373, 0x0000 }, { 24373, 0x0000 }, { 24373, 0x0000 }, { 24373, 0x0000 },
+ /* 0x26600 */
+ { 24373, 0x0000 }, { 24373, 0x0004 }, { 24374, 0x0040 }, { 24375, 0x0000 },
+ { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x0000 },
+ { 24375, 0x0000 }, { 24375, 0x0000 }, { 24375, 0x8000 }, { 24376, 0x0022 },
+ { 24378, 0x0000 }, { 24378, 0x0400 }, { 24379, 0x0100 }, { 24380, 0x1000 },
+ /* 0x26700 */
+ { 24381, 0x0000 }, { 24381, 0x0040 }, { 24382, 0x0000 }, { 24382, 0x0000 },
+ { 24382, 0x0002 }, { 24383, 0x0000 }, { 24383, 0x0000 }, { 24383, 0x0000 },
+ { 24383, 0x0000 }, { 24383, 0x0200 }, { 24384, 0x0000 }, { 24384, 0x0018 },
+ { 24386, 0x1000 }, { 24387, 0x0000 }, { 24387, 0x0000 }, { 24387, 0x0000 },
+ /* 0x26800 */
+ { 24387, 0x0000 }, { 24387, 0x1000 }, { 24388, 0x0000 }, { 24388, 0x0000 },
+ { 24388, 0x0040 }, { 24389, 0x4000 }, { 24390, 0x4000 }, { 24391, 0x0000 },
+ { 24391, 0x0500 }, { 24393, 0x0008 }, { 24394, 0x0000 }, { 24394, 0x0000 },
+ { 24394, 0x0080 }, { 24395, 0x0000 }, { 24395, 0x0000 }, { 24395, 0x0000 },
+ /* 0x26900 */
+ { 24395, 0x4000 }, { 24396, 0x0002 }, { 24397, 0x0040 }, { 24398, 0x0200 },
+ { 24399, 0x0000 }, { 24399, 0x0002 }, { 24400, 0x0000 }, { 24400, 0x0000 },
+ { 24400, 0x0000 }, { 24400, 0x0000 }, { 24400, 0x0100 }, { 24401, 0x0020 },
+ { 24402, 0x0000 }, { 24402, 0x0000 }, { 24402, 0x0000 }, { 24402, 0x0404 },
+ /* 0x26A00 */
+ { 24404, 0x0000 }, { 24404, 0x0000 }, { 24404, 0x6000 }, { 24406, 0x0010 },
+ { 24407, 0x0004 }, { 24408, 0x0006 }, { 24410, 0x0000 }, { 24410, 0x0000 },
+ { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 },
+ { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 }, { 24410, 0x0000 },
+ /* 0x26B00 */
+ { 24410, 0x0420 }, { 24412, 0x0028 }, { 24414, 0x0100 }, { 24415, 0x0000 },
+ { 24415, 0x0000 }, { 24415, 0x080F }, { 24420, 0x0000 }, { 24420, 0x0020 },
+ { 24421, 0x0004 }, { 24422, 0x20C0 }, { 24425, 0x0000 }, { 24425, 0x0008 },
+ { 24426, 0x0001 }, { 24427, 0x0000 }, { 24427, 0x0000 }, { 24427, 0x0080 },
+ /* 0x26C00 */
+ { 24428, 0x0000 }, { 24428, 0x0000 }, { 24428, 0x0002 }, { 24429, 0x0000 },
+ { 24429, 0x0001 }, { 24430, 0x0000 }, { 24430, 0x0000 }, { 24430, 0xC000 },
+ { 24432, 0x0007 }, { 24435, 0x0000 }, { 24435, 0x0010 }, { 24436, 0x2180 },
+ { 24439, 0x0009 }, { 24441, 0x0002 }, { 24442, 0x0000 }, { 24442, 0x0000 },
+ /* 0x26D00 */
+ { 24442, 0x0000 }, { 24442, 0x0000 }, { 24442, 0x07FC }, { 24451, 0x0000 },
+ { 24451, 0x0000 }, { 24451, 0x0002 }, { 24452, 0x0000 }, { 24452, 0x0010 },
+ { 24453, 0x0000 }, { 24453, 0x0000 }, { 24453, 0x40FF }, { 24462, 0x0000 },
+ { 24462, 0x0000 }, { 24462, 0x1000 }, { 24463, 0x0C00 }, { 24465, 0x0001 },
+ /* 0x26E00 */
+ { 24466, 0x00A1 }, { 24469, 0x0004 }, { 24470, 0x0000 }, { 24470, 0x0000 },
+ { 24470, 0x003C }, { 24474, 0x0000 }, { 24474, 0x4000 }, { 24475, 0x0084 },
+ { 24477, 0x0010 }, { 24478, 0x0200 }, { 24479, 0x0000 }, { 24479, 0x0000 },
+ { 24479, 0x0000 }, { 24479, 0x00FF }, { 24487, 0x0000 }, { 24487, 0x0000 },
+ /* 0x26F00 */
+ { 24487, 0x0000 }, { 24487, 0x0000 }, { 24487, 0x0040 }, { 24488, 0x0000 },
+ { 24488, 0x0000 }, { 24488, 0x0000 }, { 24488, 0x0000 }, { 24488, 0x0018 },
+ { 24490, 0x0000 }, { 24490, 0x8000 }, { 24491, 0x0002 }, { 24492, 0x4000 },
+ { 24493, 0x0000 }, { 24493, 0xC000 }, { 24495, 0x0000 }, { 24495, 0x0000 },
+ /* 0x27000 */
+ { 24495, 0x4000 }, { 24496, 0x0000 }, { 24496, 0x0000 }, { 24496, 0x0000 },
+ { 24496, 0x0800 }, { 24497, 0x000C }, { 24499, 0x0000 }, { 24499, 0x0000 },
+ { 24499, 0x0100 }, { 24500, 0x0000 }, { 24500, 0xE000 }, { 24503, 0x0000 },
+ { 24503, 0x2000 }, { 24504, 0x0000 }, { 24504, 0x0000 }, { 24504, 0x0100 },
+ /* 0x27100 */
+ { 24505, 0x3200 }, { 24508, 0x0000 }, { 24508, 0x00C0 }, { 24510, 0x0000 },
+ { 24510, 0x0000 }, { 24510, 0x0000 }, { 24510, 0x0030 }, { 24512, 0x0020 },
+ { 24513, 0x0000 }, { 24513, 0x0000 }, { 24513, 0x0000 }, { 24513, 0x0000 },
+ { 24513, 0x2000 }, { 24514, 0x0000 }, { 24514, 0x0000 }, { 24514, 0x0000 },
+ /* 0x27200 */
+ { 24514, 0x0000 }, { 24514, 0x0800 }, { 24515, 0x0000 }, { 24515, 0x0000 },
+ { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0000 }, { 24515, 0x0000 },
+ { 24515, 0x0821 }, { 24518, 0x0000 }, { 24518, 0x0000 }, { 24518, 0x0044 },
+ { 24520, 0x0000 }, { 24520, 0x0000 }, { 24520, 0x0040 }, { 24521, 0x0000 },
+ /* 0x27300 */
+ { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 },
+ { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 }, { 24521, 0x0000 },
+ { 24521, 0x0000 }, { 24521, 0x0400 }, { 24522, 0x0000 }, { 24522, 0x0000 },
+ { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0000 },
+ /* 0x27400 */
+ { 24522, 0x0000 }, { 24522, 0x0000 }, { 24522, 0x0004 }, { 24523, 0x0000 },
+ { 24523, 0x0000 }, { 24523, 0x0001 }, { 24524, 0x0000 }, { 24524, 0x0000 },
+ { 24524, 0x0050 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 },
+ { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 },
+ /* 0x27500 */
+ { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 },
+ { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0000 }, { 24526, 0x0010 },
+ { 24527, 0x0000 }, { 24527, 0x0000 }, { 24527, 0x0008 }, { 24528, 0x0000 },
+ { 24528, 0x0000 }, { 24528, 0x0000 }, { 24528, 0x0011 }, { 24530, 0x6000 },
+ /* 0x27600 */
+ { 24532, 0x1080 }, { 24534, 0x0000 }, { 24534, 0x0000 }, { 24534, 0x0204 },
+ { 24536, 0x0000 }, { 24536, 0x00E0 }, { 24539, 0x0000 }, { 24539, 0x0000 },
+ { 24539, 0x0000 }, { 24539, 0x0010 }, { 24540, 0x0000 }, { 24540, 0x0000 },
+ { 24540, 0x0000 }, { 24540, 0x0000 }, { 24540, 0x0000 }, { 24540, 0x0000 },
+ /* 0x27700 */
+ { 24540, 0x8000 }, { 24541, 0x0000 }, { 24541, 0x0000 }, { 24541, 0x0060 },
+ { 24543, 0x0002 }, { 24544, 0x4000 }, { 24545, 0x0000 }, { 24545, 0x0000 },
+ { 24545, 0x0030 }, { 24547, 0x0000 }, { 24547, 0x0000 }, { 24547, 0x0000 },
+ { 24547, 0x1000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 },
+ /* 0x27800 */
+ { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 }, { 24548, 0x0000 },
+ { 24548, 0x0000 }, { 24548, 0x0100 }, { 24549, 0x0000 }, { 24549, 0x0001 },
+ { 24550, 0x0000 }, { 24550, 0x2000 }, { 24551, 0x0000 }, { 24551, 0x0004 },
+ { 24552, 0x0100 }, { 24553, 0x0000 }, { 24553, 0x0000 }, { 24553, 0x0000 },
+ /* 0x27900 */
+ { 24553, 0x0000 }, { 24553, 0x0000 }, { 24553, 0x0010 }, { 24554, 0x0000 },
+ { 24554, 0x0000 }, { 24554, 0x0000 }, { 24554, 0x0080 }, { 24555, 0x0400 },
+ { 24556, 0x0000 }, { 24556, 0x0000 }, { 24556, 0x0001 }, { 24557, 0x0000 },
+ { 24557, 0x0000 }, { 24557, 0x2000 }, { 24558, 0x0000 }, { 24558, 0x2000 },
+ /* 0x27A00 */
+ { 24559, 0x4400 }, { 24561, 0x0000 }, { 24561, 0x0000 }, { 24561, 0x4000 },
+ { 24562, 0x0000 }, { 24562, 0x0208 }, { 24564, 0x0000 }, { 24564, 0x0200 },
+ { 24565, 0x0010 }, { 24566, 0x0000 }, { 24566, 0x0000 }, { 24566, 0x6000 },
+ { 24568, 0x0000 }, { 24568, 0x0000 }, { 24568, 0x0000 }, { 24568, 0x0010 },
+ /* 0x27B00 */
+ { 24569, 0x0840 }, { 24571, 0x0100 }, { 24572, 0x0000 }, { 24572, 0x0700 },
+ { 24575, 0x0100 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 },
+ { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 },
+ { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0000 }, { 24576, 0x0010 },
+ /* 0x27C00 */
+ { 24577, 0x0000 }, { 24577, 0x0004 }, { 24578, 0x0000 }, { 24578, 0x0000 },
+ { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 },
+ { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 },
+ { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x0000 },
+ /* 0x27D00 */
+ { 24578, 0x0000 }, { 24578, 0x0000 }, { 24578, 0x8000 }, { 24579, 0x0000 },
+ { 24579, 0x0000 }, { 24579, 0x0018 }, { 24581, 0x0040 }, { 24582, 0x0008 },
+ { 24583, 0x8010 }, { 24585, 0x0100 }, { 24586, 0x0000 }, { 24586, 0x2000 },
+ { 24587, 0x0000 }, { 24587, 0x1000 }, { 24588, 0x0000 }, { 24588, 0x0000 },
+ /* 0x27E00 */
+ { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0x0000 },
+ { 24588, 0xA000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 },
+ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 },
+ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 },
+ /* 0x27F00 */
+ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 },
+ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 },
+ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 },
+ { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0000 }, { 24590, 0x0200 },
+ /* 0x28000 */
+ { 24591, 0x0204 }, { 24593, 0x4000 }, { 24594, 0x0018 }, { 24596, 0x0000 },
+ { 24596, 0x0100 }, { 24597, 0x0000 }, { 24597, 0x0000 }, { 24597, 0x0000 },
+ { 24597, 0x0008 }, { 24598, 0x0001 }, { 24599, 0x0000 }, { 24599, 0x6000 },
+ { 24601, 0x0000 }, { 24601, 0x0000 }, { 24601, 0x0300 }, { 24603, 0x0010 },
+ /* 0x28100 */
+ { 24604, 0x0000 }, { 24604, 0x0000 }, { 24604, 0x4000 }, { 24605, 0x0000 },
+ { 24605, 0x8000 }, { 24606, 0x2000 }, { 24607, 0x8000 }, { 24608, 0x0000 },
+ { 24608, 0x0200 }, { 24609, 0x0000 }, { 24609, 0x8000 }, { 24610, 0x1000 },
+ { 24611, 0x0000 }, { 24611, 0x0000 }, { 24611, 0x0000 }, { 24611, 0x0000 },
+ /* 0x28200 */
+ { 24611, 0x0080 }, { 24612, 0x0500 }, { 24614, 0x0000 }, { 24614, 0x0000 },
+ { 24614, 0x0000 }, { 24614, 0x0040 }, { 24615, 0x0000 }, { 24615, 0x1000 },
+ { 24616, 0x0000 }, { 24616, 0x0800 }, { 24617, 0x0000 }, { 24617, 0x0000 },
+ { 24617, 0x2000 }, { 24618, 0x0000 }, { 24618, 0x0004 }, { 24619, 0x0000 },
+ /* 0x28300 */
+ { 24619, 0x0040 }, { 24620, 0x0100 }, { 24621, 0x8000 }, { 24622, 0x0400 },
+ { 24623, 0x0000 }, { 24623, 0x0000 }, { 24623, 0x2020 }, { 24625, 0x2000 },
+ { 24626, 0x0400 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 },
+ { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 }, { 24627, 0x0000 },
+ /* 0x28400 */
+ { 24627, 0x0000 }, { 24627, 0x0004 }, { 24628, 0x0000 }, { 24628, 0x0000 },
+ { 24628, 0x0000 }, { 24628, 0x0000 }, { 24628, 0x1100 }, { 24630, 0x0008 },
+ { 24631, 0x0004 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 },
+ { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 }, { 24632, 0x0000 },
+ /* 0x28500 */
+ { 24632, 0x0002 }, { 24633, 0x0000 }, { 24633, 0x0000 }, { 24633, 0x3000 },
+ { 24635, 0x0000 }, { 24635, 0x0000 }, { 24635, 0x1000 }, { 24636, 0x0000 },
+ { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0000 },
+ { 24636, 0x0000 }, { 24636, 0x0000 }, { 24636, 0x0100 }, { 24637, 0x0010 },
+ /* 0x28600 */
+ { 24638, 0x0801 }, { 24640, 0x0000 }, { 24640, 0x0020 }, { 24641, 0x0800 },
+ { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0000 },
+ { 24642, 0x0000 }, { 24642, 0x0000 }, { 24642, 0x0C00 }, { 24644, 0x1000 },
+ { 24645, 0x0000 }, { 24645, 0x0100 }, { 24646, 0x0040 }, { 24647, 0x0000 },
+ /* 0x28700 */
+ { 24647, 0x8000 }, { 24648, 0x0008 }, { 24649, 0x0000 }, { 24649, 0x0000 },
+ { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 },
+ { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 },
+ { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 }, { 24649, 0x0000 },
+ /* 0x28800 */
+ { 24649, 0x0010 }, { 24650, 0x0000 }, { 24650, 0x0800 }, { 24651, 0x0000 },
+ { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 },
+ { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 },
+ { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 },
+ /* 0x28900 */
+ { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0000 }, { 24651, 0x0008 },
+ { 24652, 0x0300 }, { 24654, 0x0040 }, { 24655, 0x1110 }, { 24658, 0x4000 },
+ { 24659, 0x0200 }, { 24660, 0x0000 }, { 24660, 0x0D00 }, { 24663, 0x1100 },
+ { 24665, 0x0001 }, { 24666, 0x5000 }, { 24668, 0x019A }, { 24673, 0x1E00 },
+ /* 0x28A00 */
+ { 24677, 0x8000 }, { 24678, 0x0040 }, { 24679, 0x0220 }, { 24681, 0x0044 },
+ { 24683, 0x0FF0 }, { 24691, 0x0600 }, { 24693, 0x0000 }, { 24693, 0x0000 },
+ { 24693, 0x000E }, { 24696, 0x1C00 }, { 24699, 0x0000 }, { 24699, 0x0000 },
+ { 24699, 0x5841 }, { 24704, 0xC000 }, { 24706, 0x042F }, { 24712, 0x1000 },
+ /* 0x28B00 */
+ { 24713, 0x1000 }, { 24714, 0x0008 }, { 24715, 0xB806 }, { 24721, 0x0000 },
+ { 24721, 0x5040 }, { 24724, 0x0001 }, { 24725, 0x1078 }, { 24730, 0x0000 },
+ { 24730, 0x8000 }, { 24731, 0x3200 }, { 24734, 0x0000 }, { 24734, 0x0000 },
+ { 24734, 0x0024 }, { 24736, 0x0690 }, { 24740, 0x1F80 }, { 24746, 0x8020 },
+ /* 0x28C00 */
+ { 24748, 0x0208 }, { 24750, 0x3000 }, { 24752, 0x0848 }, { 24755, 0x0A01 },
+ { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 },
+ { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 }, { 24758, 0x0000 },
+ { 24758, 0x2400 }, { 24760, 0x0004 }, { 24761, 0x0000 }, { 24761, 0x0000 },
+ /* 0x28D00 */
+ { 24761, 0x0000 }, { 24761, 0x0000 }, { 24761, 0x0000 }, { 24761, 0x0010 },
+ { 24762, 0x0000 }, { 24762, 0x0000 }, { 24762, 0x0000 }, { 24762, 0x0000 },
+ { 24762, 0x0000 }, { 24762, 0x0200 }, { 24763, 0x0000 }, { 24763, 0x0200 },
+ { 24764, 0x0000 }, { 24764, 0x0000 }, { 24764, 0x0000 }, { 24764, 0x0000 },
+ /* 0x28E00 */
+ { 24764, 0x8000 }, { 24765, 0x0000 }, { 24765, 0x0000 }, { 24765, 0x0240 },
+ { 24767, 0x0000 }, { 24767, 0x0000 }, { 24767, 0x0060 }, { 24769, 0x0000 },
+ { 24769, 0x0000 }, { 24769, 0x0080 }, { 24770, 0x1000 }, { 24771, 0x000C },
+ { 24773, 0x0000 }, { 24773, 0x0200 }, { 24774, 0x0080 }, { 24775, 0x0000 },
+ /* 0x28F00 */
+ { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 },
+ { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 },
+ { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 }, { 24775, 0x0000 },
+ { 24775, 0x0020 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 },
+ /* 0x29000 */
+ { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 },
+ { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 }, { 24776, 0x0000 },
+ { 24776, 0x0900 }, { 24778, 0x0008 }, { 24779, 0x8000 }, { 24780, 0x0003 },
+ { 24782, 0x0001 }, { 24783, 0x0000 }, { 24783, 0x3030 }, { 24787, 0x0000 },
+ /* 0x29100 */
+ { 24787, 0x2000 }, { 24788, 0x0001 }, { 24789, 0x0000 }, { 24789, 0x1000 },
+ { 24790, 0x2000 }, { 24791, 0x4800 }, { 24793, 0x0000 }, { 24793, 0x0001 },
+ { 24794, 0x0000 }, { 24794, 0x1000 }, { 24795, 0x0100 }, { 24796, 0x0000 },
+ { 24796, 0x0000 }, { 24796, 0x0020 }, { 24797, 0x0800 },
+};
+static const Summary16 big5hkscs_uni2index_page294[32] = {
+ /* 0x29400 */
+ { 24798, 0x0000 }, { 24798, 0x2000 }, { 24799, 0x0001 }, { 24800, 0x8008 },
+ { 24802, 0x0100 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 },
+ { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 }, { 24803, 0x0000 },
+ { 24803, 0x0000 }, { 24803, 0x0601 }, { 24806, 0x00A0 }, { 24808, 0x0000 },
+ /* 0x29500 */
+ { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 },
+ { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 }, { 24808, 0x0000 },
+ { 24808, 0x0000 }, { 24808, 0x4000 }, { 24809, 0x0000 }, { 24809, 0x0101 },
+ { 24811, 0x0000 }, { 24811, 0x0080 }, { 24812, 0x0200 }, { 24813, 0x0010 },
+};
+static const Summary16 big5hkscs_uni2index_page297[251] = {
+ /* 0x29700 */
+ { 24814, 0x0000 }, { 24814, 0x0000 }, { 24814, 0x0001 }, { 24815, 0x0004 },
+ { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 },
+ { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 }, { 24816, 0x0000 },
+ { 24816, 0x0000 }, { 24816, 0x0010 }, { 24817, 0x0000 }, { 24817, 0x0000 },
+ /* 0x29800 */
+ { 24817, 0x0000 }, { 24817, 0x0001 }, { 24818, 0x0000 }, { 24818, 0x0000 },
+ { 24818, 0x0000 }, { 24818, 0x0080 }, { 24819, 0x0000 }, { 24819, 0x0000 },
+ { 24819, 0x0000 }, { 24819, 0x0000 }, { 24819, 0x0010 }, { 24820, 0x0000 },
+ { 24820, 0x0000 }, { 24820, 0x0002 }, { 24821, 0x0400 }, { 24822, 0x0002 },
+ /* 0x29900 */
+ { 24823, 0x0028 }, { 24825, 0x0000 }, { 24825, 0x8000 }, { 24826, 0x0000 },
+ { 24826, 0x0380 }, { 24829, 0x2000 }, { 24830, 0x0400 }, { 24831, 0x0000 },
+ { 24831, 0x0000 }, { 24831, 0x2000 }, { 24832, 0x0000 }, { 24832, 0x0000 },
+ { 24832, 0x0208 }, { 24834, 0x0000 }, { 24834, 0x0000 }, { 24834, 0x0000 },
+ /* 0x29A00 */
+ { 24834, 0x0000 }, { 24834, 0x0000 }, { 24834, 0x0100 }, { 24835, 0x0000 },
+ { 24835, 0x2000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 },
+ { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 },
+ { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 }, { 24836, 0x0000 },
+ /* 0x29B00 */
+ { 24836, 0x4020 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 },
+ { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 },
+ { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 }, { 24838, 0x0000 },
+ { 24838, 0x0000 }, { 24838, 0x0020 }, { 24839, 0x0000 }, { 24839, 0x0000 },
+ /* 0x29C00 */
+ { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 },
+ { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0000 }, { 24839, 0x0008 },
+ { 24840, 0x0000 }, { 24840, 0x0000 }, { 24840, 0x2000 }, { 24841, 0x0000 },
+ { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 },
+ /* 0x29D00 */
+ { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x0000 }, { 24841, 0x4000 },
+ { 24842, 0x0000 }, { 24842, 0x0400 }, { 24843, 0x0000 }, { 24843, 0x1000 },
+ { 24844, 0x0000 }, { 24844, 0x0900 }, { 24846, 0x0000 }, { 24846, 0x0000 },
+ { 24846, 0x0000 }, { 24846, 0x0000 }, { 24846, 0x0000 }, { 24846, 0x0040 },
+ /* 0x29E00 */
+ { 24847, 0x0040 }, { 24848, 0x0000 }, { 24848, 0x2000 }, { 24849, 0x0000 },
+ { 24849, 0x0000 }, { 24849, 0x0000 }, { 24849, 0x0100 }, { 24850, 0x0000 },
+ { 24850, 0x0000 }, { 24850, 0x0000 }, { 24850, 0x1000 }, { 24851, 0x0000 },
+ { 24851, 0x0008 }, { 24852, 0x0000 }, { 24852, 0x0000 }, { 24852, 0x0100 },
+ /* 0x29F00 */
+ { 24853, 0x0000 }, { 24853, 0x0000 }, { 24853, 0x0008 }, { 24854, 0x0001 },
+ { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 },
+ { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0000 }, { 24855, 0x0080 },
+ { 24856, 0x0000 }, { 24856, 0x4000 }, { 24857, 0x0000 }, { 24857, 0x0000 },
+ /* 0x2A000 */
+ { 24857, 0x0000 }, { 24857, 0x0010 }, { 24858, 0x0000 }, { 24858, 0x0000 },
+ { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0000 }, { 24858, 0x0000 },
+ { 24858, 0x0080 }, { 24859, 0x0000 }, { 24859, 0x0000 }, { 24859, 0x0200 },
+ { 24860, 0x0000 }, { 24860, 0x0000 }, { 24860, 0x2002 }, { 24862, 0x4108 },
+ /* 0x2A100 */
+ { 24865, 0x0080 }, { 24866, 0x0000 }, { 24866, 0x0008 }, { 24867, 0x0018 },
+ { 24869, 0x0000 }, { 24869, 0x0001 }, { 24870, 0x0000 }, { 24870, 0x0000 },
+ { 24870, 0x0000 }, { 24870, 0x000C }, { 24872, 0x0800 }, { 24873, 0x0010 },
+ { 24874, 0x0000 }, { 24874, 0x8000 }, { 24875, 0x0000 }, { 24875, 0x0020 },
+ /* 0x2A200 */
+ { 24876, 0x0000 }, { 24876, 0x0000 }, { 24876, 0x0001 }, { 24877, 0x0008 },
+ { 24878, 0x0000 }, { 24878, 0x0000 }, { 24878, 0x0000 }, { 24878, 0x0000 },
+ { 24878, 0x0000 }, { 24878, 0x8008 }, { 24880, 0x0000 }, { 24880, 0x2454 },
+ { 24885, 0x0000 }, { 24885, 0x8000 }, { 24886, 0x0000 }, { 24886, 0x8000 },
+ /* 0x2A300 */
+ { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 },
+ { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0000 },
+ { 24887, 0x0000 }, { 24887, 0x0000 }, { 24887, 0x0200 }, { 24888, 0x0000 },
+ { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 },
+ /* 0x2A400 */
+ { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0000 }, { 24888, 0x0010 },
+ { 24889, 0x0000 }, { 24889, 0x0800 }, { 24890, 0x0000 }, { 24890, 0x0000 },
+ { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 },
+ { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 },
+ /* 0x2A500 */
+ { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 },
+ { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 },
+ { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 }, { 24890, 0x0000 },
+ { 24890, 0x0840 }, { 24892, 0x0000 }, { 24892, 0x0000 }, { 24892, 0x0000 },
+ /* 0x2A600 */
+ { 24892, 0x0002 }, { 24893, 0x0000 }, { 24893, 0x0000 }, { 24893, 0x0004 },
+ { 24894, 0x0400 }, { 24895, 0x0800 }, { 24896, 0x0000 }, { 24896, 0x0000 },
+ { 24896, 0x0000 }, { 24896, 0x0000 }, { 24896, 0x0200 },
+};
+static const Summary16 big5hkscs_uni2index_page2f8[30] = {
+ /* 0x2F800 */
+ { 24897, 0x0000 }, { 24897, 0x0000 }, { 24897, 0x0020 }, { 24898, 0x0800 },
+ { 24899, 0x0001 }, { 24900, 0x0000 }, { 24900, 0x0000 }, { 24900, 0x0100 },
+ { 24901, 0x0000 }, { 24901, 0x0010 }, { 24902, 0x0040 }, { 24903, 0x0000 },
+ { 24903, 0x2000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 },
+ /* 0x2F900 */
+ { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 },
+ { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 }, { 24904, 0x0000 },
+ { 24904, 0x0000 }, { 24904, 0x0010 }, { 24905, 0x0000 }, { 24905, 0x1004 },
+ { 24907, 0x0000 }, { 24907, 0x0010 },
+};
+
+int qt_UnicodeToBig5hkscs (uint wc, uchar *r)
+{
+ const Summary16 *summary = NULL;
+ if (wc < 0x80) {
+ r[0] = (uchar) wc;
+ return 1;
+ }
+ if (wc < 0x0460)
+ summary = &big5hkscs_uni2index_page00[(wc>>4)];
+ else if (wc >= 0x1e00 && wc < 0x1ed0)
+ summary = &big5hkscs_uni2index_page1e[(wc>>4)-0x1e0];
+ else if (wc >= 0x2000 && wc < 0x2740)
+ summary = &big5hkscs_uni2index_page20[(wc>>4)-0x200];
+ else if (wc >= 0x2e00 && wc < 0x9fb0)
+ summary = &big5hkscs_uni2index_page2e[(wc>>4)-0x2e0];
+ else if (wc >= 0xe000 && wc < 0xfa30)
+ summary = &big5hkscs_uni2index_pagee0[(wc>>4)-0xe00];
+ else if (wc >= 0xfe00 && wc < 0xfff0)
+ summary = &big5hkscs_uni2index_pagefe[(wc>>4)-0xfe0];
+ else if (wc >= 0x20000 && wc < 0x291f0)
+ summary = &big5hkscs_uni2index_page200[(wc>>4)-0x2000];
+ else if (wc >= 0x29400 && wc < 0x29600)
+ summary = &big5hkscs_uni2index_page294[(wc>>4)-0x2940];
+ else if (wc >= 0x29700 && wc < 0x2a6b0)
+ summary = &big5hkscs_uni2index_page297[(wc>>4)-0x2970];
+ else if (wc >= 0x2f800 && wc < 0x2f9e0)
+ summary = &big5hkscs_uni2index_page2f8[(wc>>4)-0x2f80];
+ if (summary) {
+ ushort used = summary->used;
+ uint i = wc & 0x0f;
+ if (used & ((ushort) 1 << i)) {
+ const uchar *c;
+ /* Keep in `used' only the bits 0..i-1. */
+ used &= ((ushort) 1 << i) - 1;
+ /* Add `summary->index' and the number of bits set in `used'. */
+ used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+ used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+ used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+ used = (used & 0x00ff) + (used >> 8);
+ c = big5hkscs_to_charset[summary->index + used];
+ if (c [1] != 0) {
+ r[0] = c[0];
+ r[1] = c[1];
+ return 2;
+ } else { // (c [1] == 0)
+ r[0] = c[0];
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+
+/* ====================================================================== */
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
diff --git a/src/plugins/codecs/tw/qbig5codec.h b/src/plugins/codecs/tw/qbig5codec.h
new file mode 100644
index 0000000000..9ab8aa6681
--- /dev/null
+++ b/src/plugins/codecs/tw/qbig5codec.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Most of the code here was originally written by Ming-Che Chuang and
+// is included in Qt with the author's permission, and the grateful
+// thanks of the Qt team.
+
+#ifndef QBIG5CODEC_H
+#define QBIG5CODEC_H
+
+#include <QtCore/qtextcodec.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_TEXTCODEC
+
+class QBig5Codec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases();
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+class QBig5hkscsCodec : public QTextCodec {
+public:
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+#ifdef Q_WS_X11
+class Q_CORE_EXPORT QFontBig5Codec : public QTextCodec
+{
+public:
+ QFontBig5Codec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+
+class Q_CORE_EXPORT QFontBig5hkscsCodec : public QTextCodec
+{
+public:
+ QFontBig5hkscsCodec();
+
+ static QByteArray _name();
+ static QList<QByteArray> _aliases() { return QList<QByteArray>(); }
+ static int _mibEnum();
+
+ QByteArray name() const { return _name(); }
+ QList<QByteArray> aliases() const { return _aliases(); }
+ int mibEnum() const { return _mibEnum(); }
+
+ QString convertToUnicode(const char *, int, ConverterState *) const;
+ QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const;
+};
+#endif // Q_WS_X11
+
+#endif // QT_NO_TEXTCODEC
+
+QT_END_NAMESPACE
+
+#endif // QBIG5CODEC_H
diff --git a/src/plugins/codecs/tw/tw.pro b/src/plugins/codecs/tw/tw.pro
new file mode 100644
index 0000000000..2ebb94f013
--- /dev/null
+++ b/src/plugins/codecs/tw/tw.pro
@@ -0,0 +1,16 @@
+TARGET = qtwcodecs
+include(../../qpluginbase.pri)
+
+CONFIG += warn_on
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/codecs
+QT = core
+
+HEADERS = qbig5codec.h
+
+SOURCES = qbig5codec.cpp \
+ main.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/codecs
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001B2E4
diff --git a/src/plugins/decorations/decorations.pro b/src/plugins/decorations/decorations.pro
new file mode 100644
index 0000000000..3d6912e77c
--- /dev/null
+++ b/src/plugins/decorations/decorations.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+contains(decoration-plugins, default) :SUBDIRS += default
+contains(decoration-plugins, styled) :SUBDIRS += styled
+contains(decoration-plugins, windows) :SUBDIRS += windows
diff --git a/src/plugins/decorations/default/default.pro b/src/plugins/decorations/default/default.pro
new file mode 100644
index 0000000000..fb41d7fcda
--- /dev/null
+++ b/src/plugins/decorations/default/default.pro
@@ -0,0 +1,10 @@
+TARGET = qdecorationdefault
+include(../../qpluginbase.pri)
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qdecorationdefault_qws.h
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qdecorationdefault_qws.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/decorations
+target.path += $$[QT_INSTALL_PLUGINS]/decorations
+INSTALLS += target
diff --git a/src/plugins/decorations/default/main.cpp b/src/plugins/decorations/default/main.cpp
new file mode 100644
index 0000000000..fda6004eaa
--- /dev/null
+++ b/src/plugins/decorations/default/main.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qdecorationplugin_qws.h>
+#include <qdecorationdefault_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class DecorationDefault : public QDecorationPlugin
+{
+public:
+ DecorationDefault();
+
+ QStringList keys() const;
+ QDecoration *create(const QString&);
+};
+
+DecorationDefault::DecorationDefault()
+ : QDecorationPlugin()
+{
+}
+
+QStringList DecorationDefault::keys() const
+{
+ return (QStringList() << QLatin1String("Default"));
+}
+
+QDecoration* DecorationDefault::create(const QString& s)
+{
+ if (s.toLower() == QLatin1String("default"))
+ return new QDecorationDefault();
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(qdecorationdefault, DecorationDefault)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/decorations/styled/main.cpp b/src/plugins/decorations/styled/main.cpp
new file mode 100644
index 0000000000..da00adc971
--- /dev/null
+++ b/src/plugins/decorations/styled/main.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qdecorationplugin_qws.h>
+#include <qdecorationstyled_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class DecorationStyled : public QDecorationPlugin
+{
+public:
+ DecorationStyled();
+
+ QStringList keys() const;
+ QDecoration *create(const QString&);
+};
+
+DecorationStyled::DecorationStyled() : QDecorationPlugin()
+{
+}
+
+QStringList DecorationStyled::keys() const
+{
+ return (QStringList() << QLatin1String("Styled"));
+}
+
+QDecoration* DecorationStyled::create(const QString& s)
+{
+ if (s.toLower() != QLatin1String("styled"))
+ return 0;
+
+ qDebug("creatign styled decoration");
+
+ return new QDecorationStyled;
+}
+
+Q_EXPORT_PLUGIN2(qdecorationstyled, DecorationStyled)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/decorations/styled/styled.pro b/src/plugins/decorations/styled/styled.pro
new file mode 100644
index 0000000000..5879992e89
--- /dev/null
+++ b/src/plugins/decorations/styled/styled.pro
@@ -0,0 +1,13 @@
+TARGET = qdecorationstyled
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/decorations
+target.path += $$[QT_INSTALL_PLUGINS]/decorations
+INSTALLS += target
+
+DEFINES += QT_QWS_DECORATION_STYLED
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qdecorationstyled_qws.h
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qdecorationstyled_qws.cpp
+
diff --git a/src/plugins/decorations/windows/main.cpp b/src/plugins/decorations/windows/main.cpp
new file mode 100644
index 0000000000..0c7fd4b125
--- /dev/null
+++ b/src/plugins/decorations/windows/main.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qdecorationplugin_qws.h>
+#include <qdecorationwindows_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class DecorationWindows : public QDecorationPlugin
+{
+public:
+ DecorationWindows();
+
+ QStringList keys() const;
+ QDecoration *create(const QString&);
+};
+
+DecorationWindows::DecorationWindows()
+ : QDecorationPlugin()
+{
+}
+
+QStringList DecorationWindows::keys() const
+{
+ return (QStringList() << QLatin1String("Windows"));
+}
+
+QDecoration* DecorationWindows::create(const QString& s)
+{
+ if (s.toLower() == QLatin1String("windows"))
+ return new QDecorationWindows();
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(qdecorationwindows, DecorationWindows)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/decorations/windows/windows.pro b/src/plugins/decorations/windows/windows.pro
new file mode 100644
index 0000000000..3cac77de31
--- /dev/null
+++ b/src/plugins/decorations/windows/windows.pro
@@ -0,0 +1,10 @@
+TARGET = qdecorationwindows
+include(../../qpluginbase.pri)
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qdecorationwindows_qws.h
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qdecorationwindows_qws.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/decorations
+target.path += $$[QT_INSTALL_PLUGINS]/decorations
+INSTALLS += target
diff --git a/src/plugins/generic/linuxinput/linuxinput.pro b/src/plugins/generic/linuxinput/linuxinput.pro
new file mode 100644
index 0000000000..ad9f6a9754
--- /dev/null
+++ b/src/plugins/generic/linuxinput/linuxinput.pro
@@ -0,0 +1,18 @@
+TARGET = qlinuxinputplugin
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/generic
+target.path = $$[QT_INSTALL_PLUGINS]/generic
+INSTALLS += target
+
+DEFINES += QT_QWS_KBD_LINUXINPUT
+
+HEADERS = qlinuxinput.h
+
+SOURCES = main.cpp \
+ qlinuxinput.cpp
+
+HEADERS += $$QT_SOURCE_TREE/src/gui/embedded/qkbd_qws.h \
+ $$QT_SOURCE_TREE/src/gui/embedded/qkbd_qws_p.h
+
+SOURCES += $$QT_SOURCE_TREE/src/gui/embedded/qkbd_qws.cpp
diff --git a/src/plugins/generic/linuxinput/main.cpp b/src/plugins/generic/linuxinput/main.cpp
new file mode 100644
index 0000000000..dc052547f5
--- /dev/null
+++ b/src/plugins/generic/linuxinput/main.cpp
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qgenericplugin_qpa.h>
+#include "qlinuxinput.h"
+
+QT_BEGIN_NAMESPACE
+
+class QLinuxInputPlugin : public QGenericPlugin
+{
+public:
+ QLinuxInputPlugin();
+
+ QStringList keys() const;
+ QObject* create(const QString &key, const QString &specification);
+};
+
+QLinuxInputPlugin::QLinuxInputPlugin()
+ : QGenericPlugin()
+{
+}
+
+QStringList QLinuxInputPlugin::keys() const
+{
+ return (QStringList()
+ << QLatin1String("LinuxInputMouse")
+ << QLatin1String("LinuxInputKeyboard"));
+}
+
+QObject* QLinuxInputPlugin::create(const QString &key,
+ const QString &specification)
+{
+ if (!key.compare(QLatin1String("LinuxInputMouse"), Qt::CaseInsensitive))
+ return new QLinuxInputMouseHandler(key, specification);
+ if (!key.compare(QLatin1String("LinuxInputKeyboard"), Qt::CaseInsensitive))
+ return new QLinuxInputKeyboardHandler(key, specification);
+ return 0;
+ }
+
+Q_EXPORT_PLUGIN2(qlinuxinputplugin, QLinuxInputPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/linuxinput/qlinuxinput.cpp b/src/plugins/generic/linuxinput/qlinuxinput.cpp
new file mode 100644
index 0000000000..c5bfd33468
--- /dev/null
+++ b/src/plugins/generic/linuxinput/qlinuxinput.cpp
@@ -0,0 +1,557 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qlinuxinput.h"
+
+
+#include <QSocketNotifier>
+#include <QStringList>
+#include <QPoint>
+#include <QWindowSystemInterface>
+
+#include <qkbd_qws.h>
+
+
+#include <qplatformdefs.h>
+#include <private/qcore_unix_p.h> // overrides QT_OPEN
+
+#include <errno.h>
+#include <termios.h>
+
+#include <linux/kd.h>
+#include <linux/input.h>
+
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+
+//#define QT_QPA_EXPERIMENTAL_TOUCHEVENT
+
+#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
+class QLinuxInputMouseHandlerData
+{
+public:
+ QLinuxInputMouseHandlerData() :seenMT(false), state(QEvent::TouchBegin), currentIdx(0) {}
+
+ void ensureCurrentPoint() {
+ if (currentIdx >= touchPoints.size()) {
+ Q_ASSERT(currentIdx == touchPoints.size());
+ QWindowSystemInterface::TouchPoint tp;
+ tp.id = currentIdx;
+ tp.isPrimary = (currentIdx == 0);
+ tp.pressure = 1;
+ tp.area = QRectF(0,0,1,1);
+ tp.state = Qt::TouchPointReleased; // init in neutral state
+ touchPoints.append(tp);
+ }
+ }
+ void setCurrentPoint(int i) {
+ currentIdx = i;
+ if (currentIdx < touchPoints.size()) {
+ currentX = int(touchPoints[currentIdx].area.left());
+ currentY = int(touchPoints[currentIdx].area.top());
+ } else {
+ currentY = currentX = -999;
+ }
+ }
+ void advanceCurrentPoint() {
+ setCurrentPoint(currentIdx + 1);
+ }
+ int currentPoint() { return currentIdx; }
+ void setCurrentX(int value) {
+ ensureCurrentPoint();
+ touchPoints[currentIdx].area.moveLeft(value);
+ }
+ bool currentMoved() {
+ return currentX != touchPoints[currentIdx].area.left() || currentY != touchPoints[currentIdx].area.top();
+ }
+ void updateCurrentPos() {
+ ensureCurrentPoint();
+ touchPoints[currentIdx].area.moveTopLeft(QPointF(currentX, currentY));
+ }
+ void setCurrentState(Qt::TouchPointState state) {
+ ensureCurrentPoint();
+ touchPoints[currentIdx].state = state;
+ }
+ Qt::TouchPointState currentState() const {
+ if (currentIdx < touchPoints.size())
+ return touchPoints[currentIdx].state;
+ return Qt::TouchPointReleased;
+ }
+ QList<QWindowSystemInterface::TouchPoint> touchPoints;
+ int currentX;
+ int currentY;
+ bool seenMT;
+ QEvent::Type state;
+private:
+ int currentIdx;
+};
+#endif
+
+
+QLinuxInputMouseHandler::QLinuxInputMouseHandler(const QString &key,
+ const QString &specification)
+ : m_notify(0), m_x(0), m_y(0), m_prevx(0), m_prevy(0), m_xoffset(0), m_yoffset(0), m_buttons(0), d(0)
+{
+ qDebug() << "QLinuxInputMouseHandler" << key << specification;
+
+
+ setObjectName(QLatin1String("LinuxInputSubsystem Mouse Handler"));
+
+ QString dev = QLatin1String("/dev/input/event0");
+ m_compression = true;
+ m_smooth = false;
+ int jitterLimit = 0;
+
+ QStringList args = specification.split(QLatin1Char(':'));
+ foreach (const QString &arg, args) {
+ if (arg == "nocompress")
+ m_compression = false;
+ else if (arg.startsWith("dejitter="))
+ jitterLimit = arg.mid(9).toInt();
+ else if (arg.startsWith("xoffset="))
+ m_xoffset = arg.mid(8).toInt();
+ else if (arg.startsWith("yoffset="))
+ m_yoffset = arg.mid(8).toInt();
+ else if (arg.startsWith(QLatin1String("/dev/")))
+ dev = arg;
+ }
+ m_jitterLimitSquared = jitterLimit*jitterLimit;
+
+ m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
+ if (m_fd >= 0) {
+ m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
+ connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
+ } else {
+ qWarning("Cannot open mouse input device '%s': %s", qPrintable(dev), strerror(errno));
+ return;
+ }
+#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
+ d = new QLinuxInputMouseHandlerData;
+#endif
+}
+
+
+QLinuxInputMouseHandler::~QLinuxInputMouseHandler()
+{
+ if (m_fd >= 0)
+ QT_CLOSE(m_fd);
+#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
+ delete d;
+#endif
+}
+
+void QLinuxInputMouseHandler::sendMouseEvent(int x, int y, Qt::MouseButtons buttons)
+{
+ QPoint pos(x+m_xoffset, y+m_yoffset);
+ QWindowSystemInterface::handleMouseEvent(0, pos, pos, m_buttons);
+ m_prevx = x;
+ m_prevy = y;
+}
+
+void QLinuxInputMouseHandler::readMouseData()
+{
+ struct ::input_event buffer[32];
+ int n = 0;
+ bool posChanged = false;
+ bool pendingMouseEvent = false;
+ int eventCompressCount = 0;
+ forever {
+ n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
+
+ if (n == 0) {
+ qWarning("Got EOF from the input device.");
+ return;
+ } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
+ qWarning("Could not read from input device: %s", strerror(errno));
+ return;
+ } else if (n % sizeof(buffer[0]) == 0) {
+ break;
+ }
+ }
+
+ n /= sizeof(buffer[0]);
+
+ for (int i = 0; i < n; ++i) {
+ struct ::input_event *data = &buffer[i];
+ //qDebug() << ">>" << hex << data->type << data->code << dec << data->value;
+ bool unknown = false;
+ if (data->type == EV_ABS) {
+ if (data->code == ABS_X && m_x != data->value) {
+ m_x = data->value;
+ posChanged = true;
+ } else if (data->code == ABS_Y && m_y != data->value) {
+ m_y = data->value;
+ posChanged = true;
+ } else if (data->code == ABS_PRESSURE) {
+ //ignore for now...
+ } else if (data->code == ABS_TOOL_WIDTH) {
+ //ignore for now...
+ } else if (data->code == ABS_HAT0X) {
+ //ignore for now...
+ } else if (data->code == ABS_HAT0Y) {
+ //ignore for now...
+#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
+ } else if (data->code == ABS_MT_POSITION_X) {
+ d->currentX = data->value;
+ d->seenMT = true;
+ } else if (data->code == ABS_MT_POSITION_Y) {
+ d->currentY = data->value;
+ d->seenMT = true;
+ } else if (data->code == ABS_MT_TOUCH_MAJOR) {
+ if (data->value == 0)
+ d->setCurrentState(Qt::TouchPointReleased);
+ //otherwise, ignore for now...
+ } else if (data->code == ABS_MT_TOUCH_MINOR) {
+ //ignore for now...
+#endif
+ } else {
+ unknown = true;
+ }
+ } else if (data->type == EV_REL) {
+ if (data->code == REL_X) {
+ m_x += data->value;
+ posChanged = true;
+ } else if (data->code == REL_Y) {
+ m_y += data->value;
+ posChanged = true;
+ } else if (data->code == ABS_WHEEL) { // vertical scroll
+ // data->value: 1 == up, -1 == down
+ int delta = 120 * data->value;
+ QWindowSystemInterface::handleWheelEvent(0, QPoint(m_x, m_y),
+ QPoint(m_x, m_y),
+ delta, Qt::Vertical);
+ } else if (data->code == ABS_THROTTLE) { // horizontal scroll
+ // data->value: 1 == right, -1 == left
+ int delta = 120 * -data->value;
+ QWindowSystemInterface::handleWheelEvent(0, QPoint(m_x, m_y),
+ QPoint(m_x, m_y),
+ delta, Qt::Horizontal);
+ } else {
+ unknown = true;
+ }
+ } else if (data->type == EV_KEY && data->code == BTN_TOUCH) {
+ m_buttons = data->value ? Qt::LeftButton : Qt::NoButton;
+
+ sendMouseEvent(m_x, m_y, m_buttons);
+ pendingMouseEvent = false;
+ } else if (data->type == EV_KEY && data->code >= BTN_LEFT && data->code <= BTN_MIDDLE) {
+ Qt::MouseButton button = Qt::NoButton;
+ switch (data->code) {
+ case BTN_LEFT: button = Qt::LeftButton; break;
+ case BTN_MIDDLE: button = Qt::MidButton; break;
+ case BTN_RIGHT: button = Qt::RightButton; break;
+ }
+ if (data->value)
+ m_buttons |= button;
+ else
+ m_buttons &= ~button;
+ sendMouseEvent(m_x, m_y, m_buttons);
+ pendingMouseEvent = false;
+ } else if (data->type == EV_SYN && data->code == SYN_REPORT) {
+ if (posChanged) {
+ posChanged = false;
+ if (m_compression) {
+ pendingMouseEvent = true;
+ eventCompressCount++;
+ } else {
+ sendMouseEvent(m_x, m_y, m_buttons);
+ }
+ }
+#ifdef QT_QPA_EXPERIMENTAL_TOUCHEVENT
+ if (d->state == QEvent::TouchBegin && !d->seenMT) {
+ //no multipoint-touch events to send
+ } else {
+ if (!d->seenMT)
+ d->state = QEvent::TouchEnd;
+
+ for (int i = d->currentPoint(); i < d->touchPoints.size(); ++i) {
+ d->touchPoints[i].pressure = 0;
+ d->touchPoints[i].state = Qt::TouchPointReleased;
+ }
+ //qDebug() << "handleTouchEvent" << d->state << d->touchPoints.size() << d->touchPoints[0].state;
+ QWindowSystemInterface::handleTouchEvent(0, d->state, QTouchEvent::TouchScreen, d->touchPoints);
+ if (d->seenMT) {
+ d->state = QEvent::TouchUpdate;
+ } else {
+ d->state = QEvent::TouchBegin;
+ d->touchPoints.clear();
+ }
+ d->setCurrentPoint(0);
+ d->seenMT = false;
+ }
+ } else if (data->type == EV_SYN && data->code == SYN_MT_REPORT) {
+ //store data for this touch point
+
+ if (!d->seenMT) {
+ d->setCurrentState(Qt::TouchPointReleased);
+ } else if (d->currentState() == Qt::TouchPointReleased) {
+ d->updateCurrentPos();
+ d->setCurrentState(Qt::TouchPointPressed);
+ } else if (d->currentMoved()) {
+ d->updateCurrentPos();
+ d->setCurrentState(Qt::TouchPointMoved);
+ } else {
+ d->setCurrentState(Qt::TouchPointStationary);
+ }
+ //qDebug() << "end of point" << d->currentPoint() << d->currentX << d->currentY << d->currentState();
+
+ //advance to next tp:
+ d->advanceCurrentPoint();
+#endif
+ } else if (data->type == EV_MSC && data->code == MSC_SCAN) {
+ // kernel encountered an unmapped key - just ignore it
+ continue;
+ } else {
+ unknown = true;
+ }
+#ifdef QLINUXINPUT_EXTRA_DEBUG
+ if (unknown) {
+ qWarning("unknown mouse event type=%x, code=%x, value=%x", data->type, data->code, data->value);
+ }
+#endif
+ }
+ if (m_compression && pendingMouseEvent) {
+ int distanceSquared = (m_x - m_prevx)*(m_x - m_prevx) + (m_y - m_prevy)*(m_y - m_prevy);
+ if (distanceSquared > m_jitterLimitSquared)
+ sendMouseEvent(m_x, m_y, m_buttons);
+ }
+}
+
+
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//Keyboard handler
+
+
+
+
+class QWSLinuxInputKeyboardHandler : public QWSKeyboardHandler
+{
+public:
+ QWSLinuxInputKeyboardHandler(const QString&);
+ ~QWSLinuxInputKeyboardHandler();
+
+ virtual bool filterInputEvent(quint16 &input_code, qint32 &input_value);
+
+//private:
+// QWSLinuxInputKbPrivate *d;
+};
+
+
+QWSLinuxInputKeyboardHandler::QWSLinuxInputKeyboardHandler(const QString &device)
+ : QWSKeyboardHandler(device)
+{
+}
+
+QWSLinuxInputKeyboardHandler::~QWSLinuxInputKeyboardHandler()
+{
+}
+
+bool QWSLinuxInputKeyboardHandler::filterInputEvent(quint16 &, qint32 &)
+{
+ return false;
+}
+
+
+QLinuxInputKeyboardHandler::QLinuxInputKeyboardHandler(const QString &key, const QString &specification)
+ : m_handler(0), m_fd(-1), m_tty_fd(-1), m_orig_kbmode(K_XLATE)
+{
+ setObjectName(QLatin1String("LinuxInputSubsystem Keyboard Handler"));
+
+ QString dev = QLatin1String("/dev/input/event1");
+ int repeat_delay = -1;
+ int repeat_rate = -1;
+
+ bool ttymode = false;
+
+ QStringList args = specification.split(QLatin1Char(':'));
+ foreach (const QString &arg, args) {
+ if (arg.startsWith(QLatin1String("repeat-delay=")))
+ repeat_delay = arg.mid(13).toInt();
+ else if (arg.startsWith(QLatin1String("repeat-rate=")))
+ repeat_rate = arg.mid(12).toInt();
+ else if (arg.startsWith(QLatin1String("ttymode")))
+ ttymode = true;
+ else if (arg.startsWith(QLatin1String("/dev/")))
+ dev = arg;
+ }
+
+ m_handler = new QWSLinuxInputKeyboardHandler(dev); //This is a hack to avoid copying all the QWS code
+
+ m_fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDWR, 0);
+ if (m_fd >= 0) {
+ if (repeat_delay > 0 && repeat_rate > 0) {
+ int kbdrep[2] = { repeat_delay, repeat_rate };
+ ::ioctl(m_fd, EVIOCSREP, kbdrep);
+ }
+
+ QSocketNotifier *notifier;
+ notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
+ connect(notifier, SIGNAL(activated(int)), this, SLOT(readKeycode()));
+
+ if (ttymode) {
+ // play nice in case we are started from a shell (e.g. for debugging)
+ m_tty_fd = isatty(0) ? 0 : -1;
+
+ if (m_tty_fd >= 0) {
+ // save tty config for restore.
+ tcgetattr(m_tty_fd, &m_tty_attr);
+
+ struct ::termios termdata;
+ tcgetattr(m_tty_fd, &termdata);
+
+ // record the original mode so we can restore it again in the destructor.
+ ::ioctl(m_tty_fd, KDGKBMODE, &m_orig_kbmode);
+
+ // setting this translation mode is even needed in INPUT mode to prevent
+ // the shell from also interpreting codes, if the process has a tty
+ // attached: e.g. Ctrl+C wouldn't copy, but kill the application.
+ ::ioctl(m_tty_fd, KDSKBMODE, K_MEDIUMRAW);
+
+ // set the tty layer to pass-through
+ termdata.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
+ termdata.c_oflag = 0;
+ termdata.c_cflag = CREAD | CS8;
+ termdata.c_lflag = 0;
+ termdata.c_cc[VTIME]=0;
+ termdata.c_cc[VMIN]=1;
+ cfsetispeed(&termdata, 9600);
+ cfsetospeed(&termdata, 9600);
+ tcsetattr(m_tty_fd, TCSANOW, &termdata);
+ }
+ }
+ } else {
+ qWarning("Cannot open keyboard input device '%s': %s", qPrintable(dev), strerror(errno));
+ return;
+ }
+}
+
+QLinuxInputKeyboardHandler::~QLinuxInputKeyboardHandler()
+{
+ if (m_tty_fd >= 0) {
+ ::ioctl(m_tty_fd, KDSKBMODE, m_orig_kbmode);
+ tcsetattr(m_tty_fd, TCSANOW, &m_tty_attr);
+ }
+ if (m_fd >= 0)
+ QT_CLOSE(m_fd);
+ delete m_handler;
+}
+
+void QLinuxInputKeyboardHandler::switchLed(int led, bool state)
+{
+ struct ::input_event led_ie;
+ ::gettimeofday(&led_ie.time, 0);
+ led_ie.type = EV_LED;
+ led_ie.code = led;
+ led_ie.value = state;
+
+ QT_WRITE(m_fd, &led_ie, sizeof(led_ie));
+}
+
+
+
+void QLinuxInputKeyboardHandler::readKeycode()
+{
+ struct ::input_event buffer[32];
+ int n = 0;
+
+ forever {
+ n = QT_READ(m_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
+
+ if (n == 0) {
+ qWarning("Got EOF from the input device.");
+ return;
+ } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
+ qWarning("Could not read from input device: %s", strerror(errno));
+ return;
+ } else if (n % sizeof(buffer[0]) == 0) {
+ break;
+ }
+ }
+
+ n /= sizeof(buffer[0]);
+
+ for (int i = 0; i < n; ++i) {
+ if (buffer[i].type != EV_KEY)
+ continue;
+
+ quint16 code = buffer[i].code;
+ qint32 value = buffer[i].value;
+
+ if (m_handler->filterInputEvent(code, value))
+ continue;
+
+ QWSKeyboardHandler::KeycodeAction ka;
+ ka = m_handler->processKeycode(code, value != 0, value == 2);
+
+ switch (ka) {
+ case QWSKeyboardHandler::CapsLockOn:
+ case QWSKeyboardHandler::CapsLockOff:
+ switchLed(LED_CAPSL, ka == QWSKeyboardHandler::CapsLockOn);
+ break;
+
+ case QWSKeyboardHandler::NumLockOn:
+ case QWSKeyboardHandler::NumLockOff:
+ switchLed(LED_NUML, ka == QWSKeyboardHandler::NumLockOn);
+ break;
+
+ case QWSKeyboardHandler::ScrollLockOn:
+ case QWSKeyboardHandler::ScrollLockOff:
+ switchLed(LED_SCROLLL, ka == QWSKeyboardHandler::ScrollLockOn);
+ break;
+
+ default:
+ // ignore console switching and reboot
+ break;
+ }
+ }
+}
+
+
+
+
+
+QT_END_NAMESPACE
+
diff --git a/src/plugins/generic/linuxinput/qlinuxinput.h b/src/plugins/generic/linuxinput/qlinuxinput.h
new file mode 100644
index 0000000000..c94c0f4fd1
--- /dev/null
+++ b/src/plugins/generic/linuxinput/qlinuxinput.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QLINUXINPUT_H
+#define QLINUXINPUT_H
+
+#include <qobject.h>
+#include <Qt>
+#include <termios.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QSocketNotifier;
+
+class QLinuxInputMouseHandlerData;
+
+class QLinuxInputMouseHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QLinuxInputMouseHandler(const QString &key, const QString &specification);
+ ~QLinuxInputMouseHandler();
+
+private slots:
+ void readMouseData();
+
+private:
+ void sendMouseEvent(int x, int y, Qt::MouseButtons buttons);
+ QSocketNotifier * m_notify;
+ int m_fd;
+ int m_x, m_y;
+ int m_prevx, m_prevy;
+ int m_xoffset, m_yoffset;
+ int m_smoothx, m_smoothy;
+ Qt::MouseButtons m_buttons;
+ bool m_compression;
+ bool m_smooth;
+ int m_jitterLimitSquared;
+ QLinuxInputMouseHandlerData *d;
+};
+
+
+class QWSLinuxInputKeyboardHandler;
+
+class QLinuxInputKeyboardHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QLinuxInputKeyboardHandler(const QString &key, const QString &specification);
+ ~QLinuxInputKeyboardHandler();
+
+
+private:
+ void switchLed(int, bool);
+
+private slots:
+ void readKeycode();
+
+private:
+ QWSLinuxInputKeyboardHandler *m_handler;
+ int m_fd;
+ int m_tty_fd;
+ struct termios m_tty_attr;
+ int m_orig_kbmode;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QLINUXINPUT_H
diff --git a/src/plugins/generic/tslib/main.cpp b/src/plugins/generic/tslib/main.cpp
new file mode 100644
index 0000000000..3c2d21c6c8
--- /dev/null
+++ b/src/plugins/generic/tslib/main.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qgenericplugin_qpa.h>
+#include "qtslib.h"
+
+QT_BEGIN_NAMESPACE
+
+class QTsLibPlugin : public QGenericPlugin
+{
+public:
+ QTsLibPlugin();
+
+ QStringList keys() const;
+ QObject* create(const QString &key, const QString &specification);
+};
+
+QTsLibPlugin::QTsLibPlugin()
+ : QGenericPlugin()
+{
+}
+
+QStringList QTsLibPlugin::keys() const
+{
+ return (QStringList()
+ << QLatin1String("Tslib")
+ << QLatin1String("TslibRaw"));
+}
+
+QObject* QTsLibPlugin::create(const QString &key,
+ const QString &specification)
+{
+ if (!key.compare(QLatin1String("Tslib"), Qt::CaseInsensitive) || !key.compare(QLatin1String("TslibRaw"), Qt::CaseInsensitive))
+ return new QTsLibMouseHandler(key, specification);
+ return 0;
+ }
+
+Q_EXPORT_PLUGIN2(qtslibplugin, QTsLibPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/tslib/qtslib.cpp b/src/plugins/generic/tslib/qtslib.cpp
new file mode 100644
index 0000000000..0143db411d
--- /dev/null
+++ b/src/plugins/generic/tslib/qtslib.cpp
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qtslib.h"
+
+
+#include <QSocketNotifier>
+#include <QStringList>
+#include <QPoint>
+#include <QWindowSystemInterface>
+
+#include <Qt>
+
+#include <errno.h>
+#include <tslib.h>
+
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+QTsLibMouseHandler::QTsLibMouseHandler(const QString &key,
+ const QString &specification)
+ : m_notify(0), m_x(0), m_y(0), m_pressed(0), m_rawMode(false)
+{
+ qDebug() << "QTsLibMouseHandler" << key << specification;
+ setObjectName(QLatin1String("TSLib Mouse Handler"));
+
+ QByteArray device = "/dev/input/event1";
+ if (specification.startsWith("/dev/"))
+ device = specification.toLocal8Bit();
+
+ m_dev = ts_open(device.constData(), 1);
+
+ if (ts_config(m_dev)) {
+ perror("Error configuring\n");
+ }
+
+
+ m_rawMode = !key.compare(QLatin1String("TslibRaw"), Qt::CaseInsensitive);
+
+ int fd = ts_fd(m_dev);
+ if (fd >= 0) {
+ m_notify = new QSocketNotifier(fd, QSocketNotifier::Read, this);
+ connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
+ } else {
+ qWarning("Cannot open mouse input device '%s': %s", device.constData(), strerror(errno));
+ return;
+ }
+}
+
+
+QTsLibMouseHandler::~QTsLibMouseHandler()
+{
+ if (m_dev)
+ ts_close(m_dev);
+}
+
+
+static bool get_sample(struct tsdev *dev, struct ts_sample *sample, bool rawMode)
+{
+ if (rawMode) {
+ return (ts_read_raw(dev, sample, 1) == 1);
+ } else {
+ int ret = ts_read(dev, sample, 1);
+ return ( ret == 1);
+ }
+}
+
+
+void QTsLibMouseHandler::readMouseData()
+{
+ ts_sample sample;
+ while (get_sample(m_dev, &sample, m_rawMode)) {
+
+ bool pressed = sample.pressure;
+ int x = sample.x;
+ int y = sample.y;
+
+
+ if (!m_rawMode) {
+ //filtering: ignore movements of 2 pixels or less
+ int dx = x - m_x;
+ int dy = y - m_y;
+ if (dx*dx <= 4 && dy*dy <= 4 && pressed == m_pressed)
+ continue;
+ } else {
+ // work around missing coordinates on mouse release in raw mode
+ if (sample.pressure == 0 && sample.x == 0 && sample.y == 0) {
+ x = m_x;
+ y = m_y;
+ }
+ }
+ QPoint pos(x, y);
+
+ //printf("handleMouseEvent %d %d %d %ld\n", m_x, m_y, pressed, sample.tv.tv_usec);
+
+ QWindowSystemInterface::handleMouseEvent(0, pos, pos, pressed ? Qt::LeftButton : Qt::NoButton);
+
+ m_x = x;
+ m_y = y;
+ m_pressed = pressed;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/generic/tslib/qtslib.h b/src/plugins/generic/tslib/qtslib.h
new file mode 100644
index 0000000000..43091857bd
--- /dev/null
+++ b/src/plugins/generic/tslib/qtslib.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTSLIB_H
+#define QTSLIB_H
+
+#include <qobject.h>
+//#include <Qt>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QSocketNotifier;
+struct tsdev;
+
+class QTsLibMouseHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QTsLibMouseHandler(const QString &key, const QString &specification);
+ ~QTsLibMouseHandler();
+
+private slots:
+ void readMouseData();
+
+private:
+ QSocketNotifier * m_notify;
+ tsdev *m_dev;
+ int m_x, m_y;
+ bool m_pressed;
+ bool m_rawMode;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QTSLIB_H
diff --git a/src/plugins/generic/tslib/tslib.pro b/src/plugins/generic/tslib/tslib.pro
new file mode 100644
index 0000000000..74c7fd2b96
--- /dev/null
+++ b/src/plugins/generic/tslib/tslib.pro
@@ -0,0 +1,13 @@
+TARGET = qlinuxinputplugin
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/generic
+target.path = $$[QT_INSTALL_PLUGINS]/generic
+INSTALLS += target
+
+HEADERS = qtslib.h
+
+SOURCES = main.cpp \
+ qtslib.cpp
+
+LIBS += -lts
diff --git a/src/plugins/gfxdrivers/ahi/ahi.pro b/src/plugins/gfxdrivers/ahi/ahi.pro
new file mode 100644
index 0000000000..6fc8a5cc8d
--- /dev/null
+++ b/src/plugins/gfxdrivers/ahi/ahi.pro
@@ -0,0 +1,14 @@
+TARGET = qahiscreen
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
+
+HEADERS = qscreenahi_qws.h
+
+SOURCES = qscreenahi_qws.cpp \
+ qscreenahiplugin.cpp
+
+LIBS += -lahi
diff --git a/src/plugins/gfxdrivers/ahi/qscreenahi_qws.cpp b/src/plugins/gfxdrivers/ahi/qscreenahi_qws.cpp
new file mode 100644
index 0000000000..aa28b0eeec
--- /dev/null
+++ b/src/plugins/gfxdrivers/ahi/qscreenahi_qws.cpp
@@ -0,0 +1,598 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qscreenahi_qws.h"
+
+#ifndef QT_NO_QWS_AHI
+
+#include <QtGui/qcolor.h>
+#include <QtGui/qapplication.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qvarlengtharray.h>
+#include <private/qwssignalhandler_p.h>
+
+#include <ahi.h>
+
+//#define QAHISCREEN_DEBUG
+
+static int depthForPixelFormat(const AhiPixelFormat_t format)
+{
+ switch (format) {
+ case AhiPix1bpp:
+ return 1;
+ case AhiPix2bpp:
+ return 2;
+ case AhiPix4bpp:
+ return 4;
+ case AhiPix8bpp_332RGB:
+ case AhiPix8bpp:
+ return 8;
+ case AhiPix16bpp_444RGB:
+ return 12;
+ case AhiPix16bpp_555RGB:
+ return 15;
+ case AhiPix16bpp_565RGB:
+ return 16;
+ case AhiPix32bpp_8888ARGB:
+ case AhiPix32bpp_8888BGRA:
+ return 32;
+ default:
+ return 0;
+ }
+}
+
+static AhiPixelFormat_t pixelFormatForImageFormat(const QImage::Format format)
+{
+ switch (format) {
+ case QImage::Format_Mono:
+ case QImage::Format_MonoLSB:
+ return AhiPix1bpp;
+ case QImage::Format_Indexed8:
+ return AhiPix8bpp;
+ case QImage::Format_RGB32:
+ case QImage::Format_ARGB32:
+ case QImage::Format_ARGB32_Premultiplied:
+ return AhiPix32bpp_8888ARGB;
+ case QImage::Format_RGB16:
+ return AhiPix16bpp_565RGB;
+ case QImage::Format_RGB555:
+ return AhiPix16bpp_555RGB;
+ case QImage::Format_ARGB4444_Premultiplied:
+ case QImage::Format_RGB444:
+ return AhiPix16bpp_444RGB;
+ default:
+ return AhiPixelFormatMax;
+ }
+}
+
+class QAhiScreenCursor : public QScreenCursor
+{
+public:
+ QAhiScreenCursor(QScreen *screen, AhiDevCtx_t context);
+
+ void set(const QImage &image, int hotx, int hoty);
+ void move(int x, int y);
+ void show();
+ void hide();
+
+private:
+ QScreen *screen;
+ AhiDevCtx_t context;
+};
+
+QAhiScreenCursor::QAhiScreenCursor(QScreen *s, AhiDevCtx_t c)
+ : QScreenCursor(), screen(s), context(c)
+{
+ hwaccel = true;
+ supportsAlpha = true;
+
+ if (enable)
+ show();
+ else
+ hide();
+}
+
+void QAhiScreenCursor::set(const QImage &image, int hotx, int hoty)
+{
+ if (image.isNull()) {
+ QScreenCursor::set(image, hotx, hoty);
+ return;
+ }
+
+ if (image.format() != QImage::Format_MonoLSB) {
+ set(image.convertToFormat(QImage::Format_MonoLSB), hotx, hoty);
+ return;
+ }
+
+ AhiPixelFormat_t pixFmt = pixelFormatForImageFormat(image.format());
+
+ if (pixFmt >= AhiPixelFormatMax) { // generic fallback
+ QImage::Format toFormat = screen->pixelFormat();
+ if (toFormat == QImage::Format_Invalid)
+ toFormat = QImage::Format_ARGB32;
+ set(image.convertToFormat(toFormat), hotx, hoty);
+ return;
+ }
+
+ AhiPoint_t hotSpot = { hotx, hoty };
+ AhiSize_t bitmapSize = { image.width(), image.height() };
+ AhiBitmap_t bitmap = { bitmapSize, (void*)(image.bits()),
+ image.bytesPerLine(), pixFmt };
+
+ AhiSts_t status;
+ status = AhiDispCursorSet(context, AhiCursor1, &bitmap, &hotSpot,
+ image.serialNumber(), 0);
+ if (status != AhiStsOk)
+ qWarning("QAhiScreenCursor::set(): AhiDispCursorSet failed: %x",
+ status);
+
+ QScreenCursor::set(image, hotx, hoty);
+}
+
+void QAhiScreenCursor::move(int x, int y)
+{
+ AhiPoint_t pos = { x, y };
+ AhiSts_t status = AhiDispCursorPos(context, AhiCursor1, &pos, 0);
+ if (status != AhiStsOk)
+ qWarning("QAhiScreenCursor::move(): error setting mouse position: %x",
+ status);
+ QScreenCursor::move(x, y);
+}
+
+void QAhiScreenCursor::show()
+{
+ AhiSts_t status;
+ status = AhiDispCursorState(context, AhiCursor1, AhiCursorStateOn, 0);
+ if (status != AhiStsOk)
+ qWarning("QAhiScreenCursor::show(): error setting state: %x", status);
+ QScreenCursor::show();
+}
+
+void QAhiScreenCursor::hide()
+{
+ AhiDispCursorState(context, AhiCursor1, AhiCursorStateOff, 0);
+ QScreenCursor::hide();
+}
+
+class QAhiScreenPrivate : public QObject
+{
+public:
+ QAhiScreenPrivate();
+ ~QAhiScreenPrivate();
+
+ bool setMode(AhiDispMode_t mode);
+
+ AhiDevCtx_t context;
+ AhiSurf_t surface;
+ QAhiScreenCursor *cursor;
+};
+
+QT_BEGIN_NAMESPACE
+
+QAhiScreenPrivate::QAhiScreenPrivate()
+ : context(0), surface(0), cursor(0)
+{
+#ifndef QT_NO_QWS_SIGNALHANDLER
+ QWSSignalHandler::instance()->addObject(this);
+#endif
+}
+
+QAhiScreenPrivate::~QAhiScreenPrivate()
+{
+ delete cursor;
+
+ if (surface) {
+ AhiSurfFree(context, surface);
+ surface = 0;
+ }
+ if (context) {
+ AhiDevClose(context);
+ context = 0;
+ }
+ AhiTerm();
+}
+
+bool QAhiScreenPrivate::setMode(AhiDispMode_t mode)
+{
+ AhiSts_t status;
+
+ status = AhiDispModeSet(context, &mode, 0);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreenPrivate::setMode(): AhiDispModeSet failed: %x",
+ status);
+ return false;
+ }
+
+ if (surface) {
+ AhiSurfFree(context, surface);
+ surface = 0;
+ }
+ status = AhiSurfAlloc(context, &surface, &mode.size, mode.pixFmt,
+ AHIFLAG_SURFFIXED);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreenPrivate::setMode(): AhisurfAlloc failed: %x",
+ status);
+ return false;
+ }
+
+ status = AhiDispSurfSet(context, surface, 0);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreenPrivate::setMode(): AhiDispSurfSet failed: %x",
+ status);
+ return false;
+ }
+
+ return true;
+}
+
+QAhiScreen::QAhiScreen(int displayId)
+ : QScreen(displayId), d_ptr(new QAhiScreenPrivate)
+{
+}
+
+QAhiScreen::~QAhiScreen()
+{
+ delete d_ptr;
+}
+
+bool QAhiScreen::configure()
+{
+ AhiSurfInfo_t surfaceInfo;
+ AhiSts_t status;
+
+ status = AhiSurfInfo(d_ptr->context, d_ptr->surface, &surfaceInfo);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::configure(): AhiSurfInfo failed: %x", status);
+ return false;
+ }
+
+ QScreen::data = 0;
+ QScreen::w = QScreen::dw = surfaceInfo.size.cx;
+ QScreen::h = QScreen::dh = surfaceInfo.size.cy;
+ QScreen::lstep = surfaceInfo.stride;
+ QScreen::size = surfaceInfo.sizeInBytes;
+
+ switch (surfaceInfo.pixFmt) {
+ case AhiPix1bpp:
+ setPixelFormat(QImage::Format_Mono);
+ QScreen::d = 1;
+ break;
+ case AhiPix4bpp:
+ QScreen::d = 4;
+ break;
+ case AhiPix8bpp_332RGB:
+ case AhiPix8bpp:
+ QScreen::d = 8;
+ break;
+ case AhiPix16bpp_444RGB:
+ setPixelFormat(QImage::Format_RGB444);
+ QScreen::d = 12;
+ break;
+ case AhiPix16bpp_555RGB:
+ setPixelFormat(QImage::Format_RGB555);
+ QScreen::d = 15;
+ break;
+ case AhiPix16bpp_565RGB:
+ setPixelFormat(QImage::Format_RGB16);
+ QScreen::d = 16;
+ break;
+ case AhiPix2bpp:
+ QScreen::d = 2;
+ break;
+ case AhiPix32bpp_8888ARGB:
+ setPixelFormat(QImage::Format_ARGB32);
+ // fallthrough
+ case AhiPix32bpp_8888BGRA:
+ QScreen::d = 32;
+ break;
+ default:
+ qCritical("QAhiScreen::configure(): Unknown pixel format: %x",
+ surfaceInfo.pixFmt);
+ return false;
+ }
+
+ const int dpi = 72;
+ QScreen::physWidth = qRound(QScreen::dw * 25.4 / dpi);
+ QScreen::physHeight = qRound(QScreen::dh * 25.4 / dpi);
+
+ return true;
+}
+
+bool QAhiScreen::connect(const QString &displaySpec)
+{
+ Q_UNUSED(displaySpec);
+
+ AhiSts_t status;
+
+ status = AhiInit(0);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::connect(): AhiInit failed: %x", status);
+ return false;
+ }
+
+ AhiDev_t device;
+ AhiDevInfo_t info;
+
+ status = AhiDevEnum(&device, &info, 0);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::connect(): AhiDevEnum failed: %x", status);
+ return false;
+ }
+#ifdef QAHISCREEN_DEBUG
+ {
+ int displayNo = 0;
+ AhiDevInfo_t dispInfo = info;
+ qDebug("AHI supported devices:");
+ do {
+ qDebug(" %2i: %s, sw version: %s (rev %u)\n"
+ " chip: 0x%x (rev %u), mem: %i (%i/%i), bus: 0x%x",
+ displayNo, dispInfo.name,
+ dispInfo.swVersion, uint(dispInfo.swRevision),
+ uint(dispInfo.chipId), uint(dispInfo.revisionId),
+ uint(dispInfo.totalMemory),
+ uint(dispInfo.internalMemSize),
+ uint(dispInfo.externalMemSize),
+ uint(dispInfo.cpuBusInterfaceMode));
+ status = AhiDevEnum(&device, &info, ++displayNo);
+ } while (status == AhiStsOk);
+ }
+#endif
+
+ status = AhiDevOpen(&d_ptr->context, device, "qscreenahi",
+ AHIFLAG_USERLEVEL);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::connect(): AhiDevOpen failed: %x", status);
+ return false;
+ }
+
+ AhiDispMode_t mode;
+
+ status = AhiDispModeEnum(d_ptr->context, &mode, 0);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::connect(): AhiDispModeEnum failed: %x", status);
+ return false;
+ }
+
+#ifdef QAHISCREEN_DEBUG
+ {
+ int modeNo = 0;
+ AhiDispMode_t modeInfo = mode;
+ qDebug("AHI supported modes:");
+ do {
+ qDebug(" %2i: %ux%u, fmt: %i, %u Hz, rot: %i, mirror: %i",
+ modeNo, uint(modeInfo.size.cx), uint(modeInfo.size.cy),
+ modeInfo.pixFmt, uint(modeInfo.frequency),
+ modeInfo.rotation, modeInfo.mirror);
+ status = AhiDispModeEnum(d_ptr->context, &modeInfo, ++modeNo);
+ } while (status == AhiStsOk);
+ }
+#endif
+
+ if (QApplication::type() == QApplication::GuiServer) {
+ if (!d_ptr->setMode(mode))
+ return false;
+ } else {
+ status = AhiDispSurfGet(d_ptr->context, &d_ptr->surface);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::connect(): AhiDispSurfGet failed: %x",
+ status);
+ return false;
+ }
+
+ status = AhiDispModeGet(d_ptr->context, &mode);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::context(): AhiDispModeGet failed: %x",
+ status);
+ return false;
+ }
+ }
+
+ return configure();
+}
+
+void QAhiScreen::disconnect()
+{
+ AhiSurfFree(d_ptr->context, d_ptr->surface);
+ d_ptr->surface = 0;
+ AhiDevClose(d_ptr->context);
+ d_ptr->context = 0;
+ AhiTerm();
+}
+
+bool QAhiScreen::initDevice()
+{
+ QScreenCursor::initSoftwareCursor();
+
+ AhiSts_t status = AhiDispState(d_ptr->context, AhiDispStateOn, 0);
+ if (status != AhiStsOk) {
+ qCritical("QAhiScreen::connect(): AhiDispState failed: %x", status);
+ return false;
+ }
+
+ return true;
+}
+
+void QAhiScreen::shutdownDevice()
+{
+ AhiDispState(d_ptr->context, AhiDispStateOff, 0);
+}
+
+void QAhiScreen::setMode(int width, int height, int depth)
+{
+ int modeNo = 0;
+ AhiDispMode_t mode;
+ AhiSts_t status = AhiStsOk;
+
+ while (status == AhiStsOk) {
+ status = AhiDispModeEnum(d_ptr->context, &mode, modeNo);
+ if (mode.size.cx == uint(width) &&
+ mode.size.cy == uint(height) &&
+ depthForPixelFormat(mode.pixFmt) == depth)
+ {
+ d_ptr->setMode(mode);
+ configure();
+ return;
+ }
+ }
+}
+
+void QAhiScreen::blit(const QImage &image, const QPoint &topLeft,
+ const QRegion &reg)
+{
+ AhiPixelFormat_t pixFmt = pixelFormatForImageFormat(image.format());
+
+ if (pixFmt >= AhiPixelFormatMax) { // generic fallback
+ QImage::Format toFormat = pixelFormat();
+ if (toFormat == QImage::Format_Invalid)
+ toFormat = QImage::Format_ARGB32;
+ blit(image.convertToFormat(toFormat), topLeft, reg);
+ return;
+ }
+
+ AhiSts_t status;
+
+ status = AhiDrawSurfDstSet(d_ptr->context, d_ptr->surface, 0);
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::blit(): AhiDrawSurfDstSet failed: %x", status);
+ return;
+ }
+
+ const QVector<QRect> rects = (reg & region()).rects();
+ const int numRects = rects.size();
+ QVarLengthArray<AhiPoint_t, 8> src(numRects);
+ QVarLengthArray<AhiRect_t, 8> dest(numRects);
+
+ for (int i = 0; i < numRects; ++i) {
+ const QRect rect = rects.at(i);
+
+ src[i].x = rect.x() - topLeft.x();
+ src[i].y = rect.y() - topLeft.y();
+ dest[i].left = rect.left();
+ dest[i].top = rect.top();
+ dest[i].right = rect.x() + rect.width();
+ dest[i].bottom = rect.y() + rect.height();
+ }
+
+ AhiSize_t bitmapSize = { image.width(), image.height() };
+ AhiBitmap_t bitmap = { bitmapSize, (void*)(image.bits()),
+ image.bytesPerLine(), pixFmt };
+
+ status = AhiDrawRopSet(d_ptr->context, AHIMAKEROP3(AHIROPSRCCOPY));
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::blit(): AhiDrawRopSet failed: %x", status);
+ return;
+ }
+
+ for (int i = 0; i < numRects; ++i) {
+ status = AhiDrawBitmapBlt(d_ptr->context, &dest[i], &src[i],
+ &bitmap, 0, 0);
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::blit(): AhiDrawBitmapBlt failed: %x",
+ status);
+ break;
+ }
+ }
+}
+
+void QAhiScreen::solidFill(const QColor &color, const QRegion &reg)
+{
+ AhiSts_t status = AhiStsOk;
+
+ switch (pixelFormat()) {
+ case QImage::Format_ARGB32_Premultiplied:
+ case QImage::Format_ARGB32:
+ case QImage::Format_RGB32:
+ status = AhiDrawBrushFgColorSet(d_ptr->context, color.rgba());
+ break;
+ case QImage::Format_RGB16:
+ status = AhiDrawBrushFgColorSet(d_ptr->context, qt_convRgbTo16(color.rgb()));
+ break;
+ default:
+ qFatal("QAhiScreen::solidFill(): Not implemented for pixel format %d",
+ int(pixelFormat()));
+ break;
+ }
+
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::solidFill(): AhiDrawBrushFgColorSet failed: %x",
+ status);
+ return;
+ }
+
+ status = AhiDrawBrushSet(d_ptr->context, 0, 0, 0, AHIFLAG_BRUSHSOLID);
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::solidFill(): AhiDrawBrushSet failed: %x",
+ status);
+ return;
+ }
+
+ status = AhiDrawRopSet(d_ptr->context, AHIMAKEROP3(AHIROPPATCOPY));
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::solidFill(): AhiDrawRopSet failed: %x", status);
+ return;
+ }
+
+ status = AhiDrawSurfDstSet(d_ptr->context, d_ptr->surface, 0);
+ if (status != AhiStsOk) {
+ qWarning("QAhiScreen::solidFill(): AhiDrawSurfDst failed: %x", status);
+ return;
+ }
+
+ const QVector<QRect> rects = (reg & region()).rects();
+ QVarLengthArray<AhiRect_t> ahiRects(rects.size());
+
+ for (int i = 0; i < rects.size(); ++i) {
+ const QRect rect = rects.at(i);
+ ahiRects[i].left = rect.left();
+ ahiRects[i].top = rect.top();
+ ahiRects[i].right = rect.x() + rect.width();
+ ahiRects[i].bottom = rect.y() + rect.height();
+ }
+
+ status = AhiDrawBitBltMulti(d_ptr->context, ahiRects.data(),
+ 0, ahiRects.size());
+ if (status != AhiStsOk)
+ qWarning("QAhiScreen::solidFill(): AhiDrawBitBlt failed: %x", status);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_AHI
diff --git a/src/plugins/gfxdrivers/ahi/qscreenahi_qws.h b/src/plugins/gfxdrivers/ahi/qscreenahi_qws.h
new file mode 100644
index 0000000000..ec947f4dc6
--- /dev/null
+++ b/src/plugins/gfxdrivers/ahi/qscreenahi_qws.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAHISCREEN_H
+#define QAHISCREEN_H
+
+#include <QtGui/qscreenlinuxfb_qws.h>
+
+#ifndef QT_NO_QWS_AHI
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QAhiScreenPrivate;
+
+class QAhiScreen : public QScreen
+{
+public:
+ QAhiScreen(int displayId);
+ ~QAhiScreen();
+
+ bool connect(const QString &displaySpec);
+ void disconnect();
+ bool initDevice();
+ void shutdownDevice();
+ void setMode(int width, int height, int depth);
+
+ void blit(const QImage &image, const QPoint &topLeft,
+ const QRegion &region);
+ void solidFill(const QColor &color, const QRegion &region);
+
+private:
+ bool configure();
+
+ QAhiScreenPrivate *d_ptr;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_AHI
+#endif // QAHISCREEN_H
diff --git a/src/plugins/gfxdrivers/ahi/qscreenahiplugin.cpp b/src/plugins/gfxdrivers/ahi/qscreenahiplugin.cpp
new file mode 100644
index 0000000000..7fdb7789b8
--- /dev/null
+++ b/src/plugins/gfxdrivers/ahi/qscreenahiplugin.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qscreenahi_qws.h"
+
+#include <QScreenDriverPlugin>
+#include <QStringList>
+
+class QAhiScreenPlugin : public QScreenDriverPlugin
+{
+public:
+ QAhiScreenPlugin();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+QAhiScreenPlugin::QAhiScreenPlugin()
+ : QScreenDriverPlugin()
+{
+}
+
+QStringList QAhiScreenPlugin::keys() const
+{
+ return (QStringList() << "ahi");
+}
+
+QScreen* QAhiScreenPlugin::create(const QString& driver, int displayId)
+{
+ if (driver.toLower() != "ahi")
+ return 0;
+
+ return new QAhiScreen(displayId);
+}
+
+Q_EXPORT_PLUGIN2(qahiscreen, QAhiScreenPlugin)
diff --git a/src/plugins/gfxdrivers/directfb/directfb.pro b/src/plugins/gfxdrivers/directfb/directfb.pro
new file mode 100644
index 0000000000..d397050bdc
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/directfb.pro
@@ -0,0 +1,15 @@
+TARGET = qdirectfbscreen
+include(../../qpluginbase.pri)
+include($$QT_SOURCE_TREE/src/gui/embedded/directfb.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
+
+SOURCES += qdirectfbscreenplugin.cpp
+
+QMAKE_CXXFLAGS += $$QT_CFLAGS_DIRECTFB
+LIBS += $$QT_LIBS_DIRECTFB
+DEFINES += $$QT_DEFINES_DIRECTFB
+contains(gfx-plugins, directfb):DEFINES += QT_QWS_DIRECTFB
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.cpp
new file mode 100644
index 0000000000..5c6842edca
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.cpp
@@ -0,0 +1,436 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbkeyboard.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+#include "qdirectfbscreen.h"
+#include <qobject.h>
+#include <qsocketnotifier.h>
+#include <qhash.h>
+
+#include <directfb.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+QT_BEGIN_NAMESPACE
+
+class KeyMap : public QHash<DFBInputDeviceKeySymbol, Qt::Key>
+{
+public:
+ KeyMap();
+};
+
+Q_GLOBAL_STATIC(KeyMap, keymap);
+
+class QDirectFBKeyboardHandlerPrivate : public QObject
+{
+ Q_OBJECT
+public:
+ QDirectFBKeyboardHandlerPrivate(QDirectFBKeyboardHandler *handler);
+ ~QDirectFBKeyboardHandlerPrivate();
+
+ void suspend();
+ void resume();
+
+private:
+ QDirectFBKeyboardHandler *handler;
+ IDirectFBEventBuffer *eventBuffer;
+ QSocketNotifier *keyboardNotifier;
+ DFBEvent event;
+ int bytesRead;
+ int lastUnicode, lastKeycode;
+ Qt::KeyboardModifiers lastModifiers;
+private Q_SLOTS:
+ void readKeyboardData();
+};
+
+QDirectFBKeyboardHandlerPrivate::QDirectFBKeyboardHandlerPrivate(QDirectFBKeyboardHandler *h)
+ : handler(h), eventBuffer(0), keyboardNotifier(0), bytesRead(0),
+ lastUnicode(0), lastKeycode(0), lastModifiers(0)
+{
+ Q_ASSERT(qt_screen);
+
+ IDirectFB *fb = QDirectFBScreen::instance()->dfb();
+ if (!fb) {
+ qCritical("QDirectFBKeyboardHandler: DirectFB not initialized");
+ return;
+ }
+
+ DFBResult result;
+ result = fb->CreateInputEventBuffer(fb, DICAPS_KEYS, DFB_TRUE,
+ &eventBuffer);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBKeyboardHandler: "
+ "Unable to create input event buffer", result);
+ return;
+ }
+
+ int fd;
+ result = eventBuffer->CreateFileDescriptor(eventBuffer, &fd);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBKeyboardHandler: "
+ "Unable to create file descriptor", result);
+ return;
+ }
+
+ int flags = ::fcntl(fd, F_GETFL, 0);
+ ::fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+
+ memset(&event, 0, sizeof(event));
+
+ keyboardNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
+ connect(keyboardNotifier, SIGNAL(activated(int)),
+ this, SLOT(readKeyboardData()));
+ resume();
+}
+
+void QDirectFBKeyboardHandlerPrivate::suspend()
+{
+ keyboardNotifier->setEnabled(false);
+}
+
+void QDirectFBKeyboardHandlerPrivate::resume()
+{
+ eventBuffer->Reset(eventBuffer);
+ keyboardNotifier->setEnabled(true);
+}
+
+QDirectFBKeyboardHandlerPrivate::~QDirectFBKeyboardHandlerPrivate()
+{
+ if (eventBuffer)
+ eventBuffer->Release(eventBuffer);
+}
+
+void QDirectFBKeyboardHandlerPrivate::readKeyboardData()
+{
+ if(!qt_screen)
+ return;
+
+ for (;;) {
+ // GetEvent returns DFB_UNSUPPORTED after CreateFileDescriptor().
+ // This seems stupid and I really hope it's a bug which will be fixed.
+
+ // DFBResult ret = eventBuffer->GetEvent(eventBuffer, &event);
+
+ char *buf = reinterpret_cast<char*>(&event);
+ int ret = ::read(keyboardNotifier->socket(),
+ buf + bytesRead, sizeof(DFBEvent) - bytesRead);
+ if (ret == -1) {
+ if (errno != EAGAIN)
+ qWarning("QDirectFBKeyboardHandlerPrivate::readKeyboardData(): %s",
+ strerror(errno));
+ return;
+ }
+
+ Q_ASSERT(ret >= 0);
+ bytesRead += ret;
+ if (bytesRead < int(sizeof(DFBEvent)))
+ break;
+ bytesRead = 0;
+
+ Q_ASSERT(event.clazz == DFEC_INPUT);
+
+ const DFBInputEvent input = event.input;
+
+ Qt::KeyboardModifiers modifiers = Qt::NoModifier;
+
+ // Not implemented:
+ // if (input.modifiers & DIMM_SUPER)
+ // if (input.modifiers & DIMM_HYPER)
+
+ if (!(input.flags & DIEF_KEYSYMBOL) ||
+ !(input.flags & DIEF_KEYID) ||
+ !(input.type & (DIET_KEYPRESS|DIET_KEYRELEASE)))
+ {
+ static bool first = true;
+ if (first) {
+ qWarning("QDirectFBKeyboardHandler - Getting unexpected non-keyboard related events");
+ first = false;
+ }
+ break;
+ }
+
+ if (input.flags & DIEF_MODIFIERS) {
+ if (input.modifiers & DIMM_SHIFT)
+ modifiers |= Qt::ShiftModifier;
+ if (input.modifiers & DIMM_CONTROL)
+ modifiers |= Qt::ControlModifier;
+ if (input.modifiers & DIMM_ALT)
+ modifiers |= Qt::AltModifier;
+ if (input.modifiers & DIMM_ALTGR)
+ modifiers |= Qt::AltModifier;
+ if (input.modifiers & DIMM_META)
+ modifiers |= Qt::MetaModifier;
+ }
+
+
+ const bool press = input.type & DIET_KEYPRESS;
+ DFBInputDeviceKeySymbol symbol = input.key_symbol;
+ int unicode = -1;
+ int keycode = 0;
+
+ keycode = keymap()->value(symbol);
+ if (DFB_KEY_TYPE(symbol) == DIKT_UNICODE)
+ unicode = symbol;
+
+ if (unicode != -1 || keycode != 0) {
+ bool autoRepeat = false;
+ if (press) {
+ if (unicode == lastUnicode && keycode == lastKeycode && modifiers == lastModifiers) {
+ autoRepeat = true;
+ } else {
+ lastUnicode = unicode;
+ lastKeycode = keycode;
+ lastModifiers = modifiers;
+ }
+ } else {
+ lastUnicode = lastKeycode = -1;
+ lastModifiers = 0;
+ }
+ if (autoRepeat) {
+ handler->processKeyEvent(unicode, keycode,
+ modifiers, false, autoRepeat);
+
+ }
+
+ handler->processKeyEvent(unicode, keycode,
+ modifiers, press, autoRepeat);
+ }
+ }
+}
+
+QDirectFBKeyboardHandler::QDirectFBKeyboardHandler(const QString &device)
+ : QWSKeyboardHandler()
+{
+ Q_UNUSED(device);
+ d = new QDirectFBKeyboardHandlerPrivate(this);
+}
+
+QDirectFBKeyboardHandler::~QDirectFBKeyboardHandler()
+{
+ delete d;
+}
+
+KeyMap::KeyMap()
+{
+ insert(DIKS_BACKSPACE , Qt::Key_Backspace);
+ insert(DIKS_TAB , Qt::Key_Tab);
+ insert(DIKS_RETURN , Qt::Key_Return);
+ insert(DIKS_ESCAPE , Qt::Key_Escape);
+ insert(DIKS_DELETE , Qt::Key_Delete);
+
+ insert(DIKS_CURSOR_LEFT , Qt::Key_Left);
+ insert(DIKS_CURSOR_RIGHT , Qt::Key_Right);
+ insert(DIKS_CURSOR_UP , Qt::Key_Up);
+ insert(DIKS_CURSOR_DOWN , Qt::Key_Down);
+ insert(DIKS_INSERT , Qt::Key_Insert);
+ insert(DIKS_HOME , Qt::Key_Home);
+ insert(DIKS_END , Qt::Key_End);
+ insert(DIKS_PAGE_UP , Qt::Key_PageUp);
+ insert(DIKS_PAGE_DOWN , Qt::Key_PageDown);
+ insert(DIKS_PRINT , Qt::Key_Print);
+ insert(DIKS_PAUSE , Qt::Key_Pause);
+ insert(DIKS_SELECT , Qt::Key_Select);
+ insert(DIKS_GOTO , Qt::Key_OpenUrl);
+ insert(DIKS_CLEAR , Qt::Key_Clear);
+ insert(DIKS_MENU , Qt::Key_Menu);
+ insert(DIKS_HELP , Qt::Key_Help);
+
+ insert(DIKS_INTERNET , Qt::Key_HomePage);
+ insert(DIKS_MAIL , Qt::Key_LaunchMail);
+ insert(DIKS_FAVORITES , Qt::Key_Favorites);
+
+ insert(DIKS_BACK , Qt::Key_Back);
+ insert(DIKS_FORWARD , Qt::Key_Forward);
+ insert(DIKS_VOLUME_UP , Qt::Key_VolumeUp);
+ insert(DIKS_VOLUME_DOWN , Qt::Key_VolumeDown);
+ insert(DIKS_MUTE , Qt::Key_VolumeMute);
+ insert(DIKS_PLAYPAUSE , Qt::Key_Pause);
+ insert(DIKS_PLAY , Qt::Key_MediaPlay);
+ insert(DIKS_STOP , Qt::Key_MediaStop);
+ insert(DIKS_RECORD , Qt::Key_MediaRecord);
+ insert(DIKS_PREVIOUS , Qt::Key_MediaPrevious);
+ insert(DIKS_NEXT , Qt::Key_MediaNext);
+
+ insert(DIKS_F1 , Qt::Key_F1);
+ insert(DIKS_F2 , Qt::Key_F2);
+ insert(DIKS_F3 , Qt::Key_F3);
+ insert(DIKS_F4 , Qt::Key_F4);
+ insert(DIKS_F5 , Qt::Key_F5);
+ insert(DIKS_F6 , Qt::Key_F6);
+ insert(DIKS_F7 , Qt::Key_F7);
+ insert(DIKS_F8 , Qt::Key_F8);
+ insert(DIKS_F9 , Qt::Key_F9);
+ insert(DIKS_F10 , Qt::Key_F10);
+ insert(DIKS_F11 , Qt::Key_F11);
+ insert(DIKS_F12 , Qt::Key_F12);
+
+ insert(DIKS_SHIFT , Qt::Key_Shift);
+ insert(DIKS_CONTROL , Qt::Key_Control);
+ insert(DIKS_ALT , Qt::Key_Alt);
+ insert(DIKS_ALTGR , Qt::Key_AltGr);
+
+ insert(DIKS_META , Qt::Key_Meta);
+ insert(DIKS_SUPER , Qt::Key_Super_L); // ???
+ insert(DIKS_HYPER , Qt::Key_Hyper_L); // ???
+
+ insert(DIKS_CAPS_LOCK , Qt::Key_CapsLock);
+ insert(DIKS_NUM_LOCK , Qt::Key_NumLock);
+ insert(DIKS_SCROLL_LOCK , Qt::Key_ScrollLock);
+
+ insert(DIKS_DEAD_ABOVEDOT , Qt::Key_Dead_Abovedot);
+ insert(DIKS_DEAD_ABOVERING , Qt::Key_Dead_Abovering);
+ insert(DIKS_DEAD_ACUTE , Qt::Key_Dead_Acute);
+ insert(DIKS_DEAD_BREVE , Qt::Key_Dead_Breve);
+ insert(DIKS_DEAD_CARON , Qt::Key_Dead_Caron);
+ insert(DIKS_DEAD_CEDILLA , Qt::Key_Dead_Cedilla);
+ insert(DIKS_DEAD_CIRCUMFLEX , Qt::Key_Dead_Circumflex);
+ insert(DIKS_DEAD_DIAERESIS , Qt::Key_Dead_Diaeresis);
+ insert(DIKS_DEAD_DOUBLEACUTE , Qt::Key_Dead_Doubleacute);
+ insert(DIKS_DEAD_GRAVE , Qt::Key_Dead_Grave);
+ insert(DIKS_DEAD_IOTA , Qt::Key_Dead_Iota);
+ insert(DIKS_DEAD_MACRON , Qt::Key_Dead_Macron);
+ insert(DIKS_DEAD_OGONEK , Qt::Key_Dead_Ogonek);
+ insert(DIKS_DEAD_SEMIVOICED_SOUND , Qt::Key_Dead_Semivoiced_Sound);
+ insert(DIKS_DEAD_TILDE , Qt::Key_Dead_Tilde);
+ insert(DIKS_DEAD_VOICED_SOUND , Qt::Key_Dead_Voiced_Sound);
+ insert(DIKS_SPACE , Qt::Key_Space);
+ insert(DIKS_EXCLAMATION_MARK , Qt::Key_Exclam);
+ insert(DIKS_QUOTATION , Qt::Key_QuoteDbl);
+ insert(DIKS_NUMBER_SIGN , Qt::Key_NumberSign);
+ insert(DIKS_DOLLAR_SIGN , Qt::Key_Dollar);
+ insert(DIKS_PERCENT_SIGN , Qt::Key_Percent);
+ insert(DIKS_AMPERSAND , Qt::Key_Ampersand);
+ insert(DIKS_APOSTROPHE , Qt::Key_Apostrophe);
+ insert(DIKS_PARENTHESIS_LEFT , Qt::Key_ParenLeft);
+ insert(DIKS_PARENTHESIS_RIGHT , Qt::Key_ParenRight);
+ insert(DIKS_ASTERISK , Qt::Key_Asterisk);
+ insert(DIKS_PLUS_SIGN , Qt::Key_Plus);
+ insert(DIKS_COMMA , Qt::Key_Comma);
+ insert(DIKS_MINUS_SIGN , Qt::Key_Minus);
+ insert(DIKS_PERIOD , Qt::Key_Period);
+ insert(DIKS_SLASH , Qt::Key_Slash);
+ insert(DIKS_0 , Qt::Key_0);
+ insert(DIKS_1 , Qt::Key_1);
+ insert(DIKS_2 , Qt::Key_2);
+ insert(DIKS_3 , Qt::Key_3);
+ insert(DIKS_4 , Qt::Key_4);
+ insert(DIKS_5 , Qt::Key_5);
+ insert(DIKS_6 , Qt::Key_6);
+ insert(DIKS_7 , Qt::Key_7);
+ insert(DIKS_8 , Qt::Key_8);
+ insert(DIKS_9 , Qt::Key_9);
+ insert(DIKS_COLON , Qt::Key_Colon);
+ insert(DIKS_SEMICOLON , Qt::Key_Semicolon);
+ insert(DIKS_LESS_THAN_SIGN , Qt::Key_Less);
+ insert(DIKS_EQUALS_SIGN , Qt::Key_Equal);
+ insert(DIKS_GREATER_THAN_SIGN , Qt::Key_Greater);
+ insert(DIKS_QUESTION_MARK , Qt::Key_Question);
+ insert(DIKS_AT , Qt::Key_At);
+ insert(DIKS_CAPITAL_A , Qt::Key_A);
+ insert(DIKS_CAPITAL_B , Qt::Key_B);
+ insert(DIKS_CAPITAL_C , Qt::Key_C);
+ insert(DIKS_CAPITAL_D , Qt::Key_D);
+ insert(DIKS_CAPITAL_E , Qt::Key_E);
+ insert(DIKS_CAPITAL_F , Qt::Key_F);
+ insert(DIKS_CAPITAL_G , Qt::Key_G);
+ insert(DIKS_CAPITAL_H , Qt::Key_H);
+ insert(DIKS_CAPITAL_I , Qt::Key_I);
+ insert(DIKS_CAPITAL_J , Qt::Key_J);
+ insert(DIKS_CAPITAL_K , Qt::Key_K);
+ insert(DIKS_CAPITAL_L , Qt::Key_L);
+ insert(DIKS_CAPITAL_M , Qt::Key_M);
+ insert(DIKS_CAPITAL_N , Qt::Key_N);
+ insert(DIKS_CAPITAL_O , Qt::Key_O);
+ insert(DIKS_CAPITAL_P , Qt::Key_P);
+ insert(DIKS_CAPITAL_Q , Qt::Key_Q);
+ insert(DIKS_CAPITAL_R , Qt::Key_R);
+ insert(DIKS_CAPITAL_S , Qt::Key_S);
+ insert(DIKS_CAPITAL_T , Qt::Key_T);
+ insert(DIKS_CAPITAL_U , Qt::Key_U);
+ insert(DIKS_CAPITAL_V , Qt::Key_V);
+ insert(DIKS_CAPITAL_W , Qt::Key_W);
+ insert(DIKS_CAPITAL_X , Qt::Key_X);
+ insert(DIKS_CAPITAL_Y , Qt::Key_Y);
+ insert(DIKS_CAPITAL_Z , Qt::Key_Z);
+ insert(DIKS_SQUARE_BRACKET_LEFT , Qt::Key_BracketLeft);
+ insert(DIKS_BACKSLASH , Qt::Key_Backslash);
+ insert(DIKS_SQUARE_BRACKET_RIGHT , Qt::Key_BracketRight);
+ insert(DIKS_CIRCUMFLEX_ACCENT , Qt::Key_AsciiCircum);
+ insert(DIKS_UNDERSCORE , Qt::Key_Underscore);
+ insert(DIKS_SMALL_A , Qt::Key_A);
+ insert(DIKS_SMALL_B , Qt::Key_B);
+ insert(DIKS_SMALL_C , Qt::Key_C);
+ insert(DIKS_SMALL_D , Qt::Key_D);
+ insert(DIKS_SMALL_E , Qt::Key_E);
+ insert(DIKS_SMALL_F , Qt::Key_F);
+ insert(DIKS_SMALL_G , Qt::Key_G);
+ insert(DIKS_SMALL_H , Qt::Key_H);
+ insert(DIKS_SMALL_I , Qt::Key_I);
+ insert(DIKS_SMALL_J , Qt::Key_J);
+ insert(DIKS_SMALL_K , Qt::Key_K);
+ insert(DIKS_SMALL_L , Qt::Key_L);
+ insert(DIKS_SMALL_M , Qt::Key_M);
+ insert(DIKS_SMALL_N , Qt::Key_N);
+ insert(DIKS_SMALL_O , Qt::Key_O);
+ insert(DIKS_SMALL_P , Qt::Key_P);
+ insert(DIKS_SMALL_Q , Qt::Key_Q);
+ insert(DIKS_SMALL_R , Qt::Key_R);
+ insert(DIKS_SMALL_S , Qt::Key_S);
+ insert(DIKS_SMALL_T , Qt::Key_T);
+ insert(DIKS_SMALL_U , Qt::Key_U);
+ insert(DIKS_SMALL_V , Qt::Key_V);
+ insert(DIKS_SMALL_W , Qt::Key_W);
+ insert(DIKS_SMALL_X , Qt::Key_X);
+ insert(DIKS_SMALL_Y , Qt::Key_Y);
+ insert(DIKS_SMALL_Z , Qt::Key_Z);
+ insert(DIKS_CURLY_BRACKET_LEFT , Qt::Key_BraceLeft);
+ insert(DIKS_VERTICAL_BAR , Qt::Key_Bar);
+ insert(DIKS_CURLY_BRACKET_RIGHT , Qt::Key_BraceRight);
+ insert(DIKS_TILDE , Qt::Key_AsciiTilde);
+}
+
+QT_END_NAMESPACE
+#include "qdirectfbkeyboard.moc"
+#endif // QT_NO_QWS_DIRECTFB
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.h b/src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.h
new file mode 100644
index 0000000000..49c1c18b22
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbkeyboard.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBKEYBOARD_H
+#define QDIRECTFBKEYBOARD_H
+
+#include <qglobal.h>
+#include <QtGui/qkbd_qws.h>
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QDirectFBKeyboardHandlerPrivate;
+
+class QDirectFBKeyboardHandler : public QWSKeyboardHandler
+{
+public:
+ QDirectFBKeyboardHandler(const QString &device);
+ ~QDirectFBKeyboardHandler();
+
+private:
+ QDirectFBKeyboardHandlerPrivate *d;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_DIRECTFB
+
+QT_END_HEADER
+
+#endif // QDIRECTFBKEYBOARD_H
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp
new file mode 100644
index 0000000000..3999b85afb
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbmouse.cpp
@@ -0,0 +1,294 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbmouse.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+#include "qdirectfbscreen.h"
+#include <qsocketnotifier.h>
+
+#include <directfb.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFBMouseHandlerPrivate : public QObject
+{
+ Q_OBJECT
+public:
+ QDirectFBMouseHandlerPrivate(QDirectFBMouseHandler *h);
+ ~QDirectFBMouseHandlerPrivate();
+
+ void setEnabled(bool on);
+private:
+ QDirectFBMouseHandler *handler;
+ IDirectFBEventBuffer *eventBuffer;
+#ifndef QT_NO_DIRECTFB_LAYER
+ IDirectFBDisplayLayer *layer;
+#endif
+ QSocketNotifier *mouseNotifier;
+
+ QPoint prevPoint;
+ Qt::MouseButtons prevbuttons;
+
+ DFBEvent event;
+ uint bytesRead;
+
+private Q_SLOTS:
+ void readMouseData();
+};
+
+QDirectFBMouseHandlerPrivate::QDirectFBMouseHandlerPrivate(QDirectFBMouseHandler *h)
+ : handler(h), eventBuffer(0)
+{
+ DFBResult result;
+
+ QScreen *screen = QScreen::instance();
+ if (!screen) {
+ qCritical("QDirectFBMouseHandler: no screen instance found");
+ return;
+ }
+
+ IDirectFB *fb = QDirectFBScreen::instance()->dfb();
+ if (!fb) {
+ qCritical("QDirectFBMouseHandler: DirectFB not initialized");
+ return;
+ }
+
+#ifndef QT_NO_DIRECTFB_LAYER
+ layer = QDirectFBScreen::instance()->dfbDisplayLayer();
+ if (!layer) {
+ qCritical("QDirectFBMouseHandler: Unable to get primary display layer");
+ return;
+ }
+#endif
+
+ DFBInputDeviceCapabilities caps;
+ caps = DICAPS_BUTTONS | DICAPS_AXES;
+ result = fb->CreateInputEventBuffer(fb, caps, DFB_TRUE, &eventBuffer);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBMouseHandler: "
+ "Unable to create input event buffer", result);
+ return;
+ }
+
+ int fd;
+ result = eventBuffer->CreateFileDescriptor(eventBuffer, &fd);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBMouseHandler: "
+ "Unable to create file descriptor", result);
+ return;
+ }
+
+ int flags = fcntl(fd, F_GETFL, 0);
+ fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+
+ // DirectFB seems to assume that the mouse always starts centered
+ prevPoint = QPoint(screen->deviceWidth() / 2, screen->deviceHeight() / 2);
+ prevbuttons = Qt::NoButton;
+ memset(&event, 0, sizeof(event));
+ bytesRead = 0;
+
+ mouseNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
+ connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
+ setEnabled(true);
+}
+
+QDirectFBMouseHandlerPrivate::~QDirectFBMouseHandlerPrivate()
+{
+ if (eventBuffer)
+ eventBuffer->Release(eventBuffer);
+}
+
+void QDirectFBMouseHandlerPrivate::setEnabled(bool on)
+{
+ if (mouseNotifier->isEnabled() != on) {
+#ifndef QT_NO_DIRECTFB_LAYER
+ DFBResult result;
+ result = layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::QDirectFBScreenCursor: "
+ "Unable to set cooperative level", result);
+ }
+ result = layer->EnableCursor(layer, on ? 1 : 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::QDirectFBScreenCursor: "
+ "Unable to enable cursor", result);
+ }
+
+ result = layer->SetCooperativeLevel(layer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cooperative level", result);
+ }
+
+ layer->SetCooperativeLevel(layer, DLSCL_SHARED);
+#endif
+ mouseNotifier->setEnabled(on);
+ }
+}
+
+void QDirectFBMouseHandlerPrivate::readMouseData()
+{
+ if (!QScreen::instance())
+ return;
+
+ for (;;) {
+ // GetEvent returns DFB_UNSUPPORTED after CreateFileDescriptor().
+ // This seems stupid and I really hope it's a bug which will be fixed.
+
+ // DFBResult ret = eventBuffer->GetEvent(eventBuffer, &event);
+
+ char *buf = reinterpret_cast<char*>(&event);
+ int ret = ::read(mouseNotifier->socket(),
+ buf + bytesRead, sizeof(DFBEvent) - bytesRead);
+ if (ret == -1) {
+ if (errno == EINTR)
+ continue;
+ if (errno == EAGAIN)
+ return;
+ qWarning("QDirectFBMouseHandlerPrivate::readMouseData(): %s",
+ strerror(errno));
+ return;
+ }
+
+ Q_ASSERT(ret >= 0);
+ bytesRead += ret;
+ if (bytesRead < sizeof(DFBEvent))
+ break;
+ bytesRead = 0;
+
+ Q_ASSERT(event.clazz == DFEC_INPUT);
+
+ const DFBInputEvent input = event.input;
+ int x = prevPoint.x();
+ int y = prevPoint.y();
+ int wheel = 0;
+
+ if (input.type == DIET_AXISMOTION) {
+#if defined(QT_NO_DIRECTFB_LAYER) || defined(QT_DIRECTFB_WINDOW_AS_CURSOR)
+ if (input.flags & DIEF_AXISABS) {
+ switch (input.axis) {
+ case DIAI_X: x = input.axisabs; break;
+ case DIAI_Y: y = input.axisabs; break;
+ default:
+ qWarning("QDirectFBMouseHandlerPrivate::readMouseData: "
+ "unknown axis (absolute) %d", input.axis);
+ break;
+ }
+ } else if (input.flags & DIEF_AXISREL) {
+ switch (input.axis) {
+ case DIAI_X: x += input.axisrel; break;
+ case DIAI_Y: y += input.axisrel; break;
+ case DIAI_Z: wheel = -120 * input.axisrel; break;
+ default:
+ qWarning("QDirectFBMouseHandlerPrivate::readMouseData: "
+ "unknown axis (releative) %d", input.axis);
+ }
+ }
+#else
+ if (input.axis == DIAI_X || input.axis == DIAI_Y) {
+ DFBResult result = layer->GetCursorPosition(layer, &x, &y);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBMouseHandler::readMouseData",
+ result);
+ }
+ } else if (input.axis == DIAI_Z) {
+ Q_ASSERT(input.flags & DIEF_AXISREL);
+ wheel = input.axisrel;
+ wheel *= -120;
+ }
+#endif
+ }
+
+ Qt::MouseButtons buttons = Qt::NoButton;
+ if (input.flags & DIEF_BUTTONS) {
+ if (input.buttons & DIBM_LEFT)
+ buttons |= Qt::LeftButton;
+ if (input.buttons & DIBM_MIDDLE)
+ buttons |= Qt::MidButton;
+ if (input.buttons & DIBM_RIGHT)
+ buttons |= Qt::RightButton;
+ }
+
+ QPoint p = QPoint(x, y);
+ handler->limitToScreen(p);
+
+ if (p == prevPoint && wheel == 0 && buttons == prevbuttons)
+ continue;
+
+ prevPoint = p;
+ prevbuttons = buttons;
+
+ handler->mouseChanged(p, buttons, wheel);
+ }
+}
+
+QDirectFBMouseHandler::QDirectFBMouseHandler(const QString &driver,
+ const QString &device)
+ : QWSMouseHandler(driver, device)
+{
+ d = new QDirectFBMouseHandlerPrivate(this);
+}
+
+QDirectFBMouseHandler::~QDirectFBMouseHandler()
+{
+ delete d;
+}
+
+void QDirectFBMouseHandler::suspend()
+{
+ d->setEnabled(false);
+}
+
+void QDirectFBMouseHandler::resume()
+{
+ d->setEnabled(true);
+}
+
+QT_END_NAMESPACE
+#include "qdirectfbmouse.moc"
+#endif // QT_NO_QWS_DIRECTFB
+
+
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbmouse.h b/src/plugins/gfxdrivers/directfb/qdirectfbmouse.h
new file mode 100644
index 0000000000..ac0fcadfaa
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbmouse.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBMOUSE_H
+#define QDIRECTFBMOUSE_H
+
+#include <qglobal.h>
+#include <QtGui/qmouse_qws.h>
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QDirectFBMouseHandlerPrivate;
+
+class QDirectFBMouseHandler : public QWSMouseHandler
+{
+public:
+ explicit QDirectFBMouseHandler(const QString &driver = QString(),
+ const QString &device = QString());
+ ~QDirectFBMouseHandler();
+
+ void suspend();
+ void resume();
+protected:
+ QDirectFBMouseHandlerPrivate *d;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+#endif // QT_NO_QWS_DIRECTFB
+#endif // QDIRECTFBMOUSE_H
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
new file mode 100644
index 0000000000..10f1bb3f46
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
@@ -0,0 +1,221 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbscreen.h"
+#include "qdirectfbpaintdevice.h"
+#include "qdirectfbpaintengine.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_NAMESPACE
+
+QDirectFBPaintDevice::QDirectFBPaintDevice(QDirectFBScreen *scr)
+ : QCustomRasterPaintDevice(0), dfbSurface(0), screen(scr),
+ bpl(-1), lockFlgs(DFBSurfaceLockFlags(0)), mem(0), engine(0), imageFormat(QImage::Format_Invalid)
+{
+#ifdef QT_DIRECTFB_SUBSURFACE
+ subSurface = 0;
+ syncPending = false;
+#endif
+}
+
+QDirectFBPaintDevice::~QDirectFBPaintDevice()
+{
+ if (QDirectFBScreen::instance()) {
+ unlockSurface();
+#ifdef QT_DIRECTFB_SUBSURFACE
+ releaseSubSurface();
+#endif
+ if (dfbSurface) {
+ screen->releaseDFBSurface(dfbSurface);
+ }
+ }
+ delete engine;
+}
+
+IDirectFBSurface *QDirectFBPaintDevice::directFBSurface() const
+{
+ return dfbSurface;
+}
+
+bool QDirectFBPaintDevice::lockSurface(DFBSurfaceLockFlags lockFlags)
+{
+ if (lockFlgs && (lockFlags & ~lockFlgs))
+ unlockSurface();
+ if (!mem) {
+ Q_ASSERT(dfbSurface);
+#ifdef QT_DIRECTFB_SUBSURFACE
+ if (!subSurface) {
+ DFBResult result;
+ subSurface = screen->getSubSurface(dfbSurface, QRect(), QDirectFBScreen::TrackSurface, &result);
+ if (result != DFB_OK || !subSurface) {
+ DirectFBError("Couldn't create sub surface", result);
+ return false;
+ }
+ }
+ IDirectFBSurface *surface = subSurface;
+#else
+ IDirectFBSurface *surface = dfbSurface;
+#endif
+ Q_ASSERT(surface);
+ mem = QDirectFBScreen::lockSurface(surface, lockFlags, &bpl);
+ lockFlgs = lockFlags;
+ Q_ASSERT(mem);
+ Q_ASSERT(bpl > 0);
+ const QSize s = size();
+ lockedImage = QImage(mem, s.width(), s.height(), bpl,
+ QDirectFBScreen::getImageFormat(dfbSurface));
+ return true;
+ }
+#ifdef QT_DIRECTFB_SUBSURFACE
+ if (syncPending) {
+ syncPending = false;
+ screen->waitIdle();
+ }
+#endif
+ return false;
+}
+
+void QDirectFBPaintDevice::unlockSurface()
+{
+ if (QDirectFBScreen::instance() && lockFlgs) {
+#ifdef QT_DIRECTFB_SUBSURFACE
+ IDirectFBSurface *surface = subSurface;
+#else
+ IDirectFBSurface *surface = dfbSurface;
+#endif
+ if (surface) {
+ surface->Unlock(surface);
+ lockFlgs = static_cast<DFBSurfaceLockFlags>(0);
+ mem = 0;
+ }
+ }
+}
+
+void *QDirectFBPaintDevice::memory() const
+{
+ return mem;
+}
+
+QImage::Format QDirectFBPaintDevice::format() const
+{
+ return imageFormat;
+}
+
+int QDirectFBPaintDevice::bytesPerLine() const
+{
+ Q_ASSERT(!mem || bpl != -1);
+ return bpl;
+}
+
+QSize QDirectFBPaintDevice::size() const
+{
+ int w, h;
+ dfbSurface->GetSize(dfbSurface, &w, &h);
+ return QSize(w, h);
+}
+
+int QDirectFBPaintDevice::metric(QPaintDevice::PaintDeviceMetric metric) const
+{
+ if (!dfbSurface)
+ return 0;
+
+ switch (metric) {
+ case QPaintDevice::PdmWidth:
+ case QPaintDevice::PdmHeight:
+ return (metric == PdmWidth ? size().width() : size().height());
+ case QPaintDevice::PdmWidthMM:
+ return (size().width() * 1000) / dotsPerMeterX();
+ case QPaintDevice::PdmHeightMM:
+ return (size().height() * 1000) / dotsPerMeterY();
+ case QPaintDevice::PdmPhysicalDpiX:
+ case QPaintDevice::PdmDpiX:
+ return (dotsPerMeterX() * 254) / 10000; // 0.0254 meters-per-inch
+ case QPaintDevice::PdmPhysicalDpiY:
+ case QPaintDevice::PdmDpiY:
+ return (dotsPerMeterY() * 254) / 10000; // 0.0254 meters-per-inch
+ case QPaintDevice::PdmDepth:
+ return QDirectFBScreen::depth(imageFormat);
+ case QPaintDevice::PdmNumColors: {
+ if (!lockedImage.isNull())
+ return lockedImage.colorCount();
+
+ DFBResult result;
+ IDirectFBPalette *palette = 0;
+ unsigned int numColors = 0;
+
+ result = dfbSurface->GetPalette(dfbSurface, &palette);
+ if ((result != DFB_OK) || !palette)
+ return 0;
+
+ result = palette->GetSize(palette, &numColors);
+ palette->Release(palette);
+ if (result != DFB_OK)
+ return 0;
+
+ return numColors;
+ }
+ default:
+ qCritical("QDirectFBPaintDevice::metric(): Unhandled metric!");
+ return 0;
+ }
+}
+
+QPaintEngine *QDirectFBPaintDevice::paintEngine() const
+{
+ return engine;
+}
+
+#ifdef QT_DIRECTFB_SUBSURFACE
+void QDirectFBPaintDevice::releaseSubSurface()
+{
+ Q_ASSERT(QDirectFBScreen::instance());
+ if (subSurface) {
+ unlockSurface();
+ screen->releaseDFBSurface(subSurface);
+ subSurface = 0;
+ }
+}
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_DIRECTFB
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h
new file mode 100644
index 0000000000..71a7a8e104
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBPAINTDEVICE_H
+#define QDIRECTFBPAINTDEVICE_H
+
+#include <private/qpaintengine_raster_p.h>
+#include "qdirectfbscreen.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+// Inherited by both window surface and pixmap
+class QDirectFBPaintEngine;
+class QDirectFBPaintDevice : public QCustomRasterPaintDevice
+{
+public:
+ ~QDirectFBPaintDevice();
+
+ virtual IDirectFBSurface *directFBSurface() const;
+
+ bool lockSurface(DFBSurfaceLockFlags lockFlags);
+ void unlockSurface();
+
+ // Reimplemented from QCustomRasterPaintDevice:
+ void *memory() const;
+ QImage::Format format() const;
+ int bytesPerLine() const;
+ QSize size() const;
+ int metric(QPaintDevice::PaintDeviceMetric metric) const;
+ DFBSurfaceLockFlags lockFlags() const { return lockFlgs; }
+ QPaintEngine *paintEngine() const;
+protected:
+ QDirectFBPaintDevice(QDirectFBScreen *scr);
+ inline int dotsPerMeterX() const
+ {
+ return (screen->deviceWidth() * 1000) / screen->physicalWidth();
+ }
+ inline int dotsPerMeterY() const
+ {
+ return (screen->deviceHeight() * 1000) / screen->physicalHeight();
+ }
+
+ IDirectFBSurface *dfbSurface;
+#ifdef QT_DIRECTFB_SUBSURFACE
+ void releaseSubSurface();
+ IDirectFBSurface *subSurface;
+ friend class QDirectFBPaintEnginePrivate;
+ bool syncPending;
+#endif
+ QImage lockedImage;
+ QDirectFBScreen *screen;
+ int bpl;
+ DFBSurfaceLockFlags lockFlgs;
+ uchar *mem;
+ QDirectFBPaintEngine *engine;
+ QImage::Format imageFormat;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_DIRECTFB
+#endif //QDIRECTFBPAINTDEVICE_H
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
new file mode 100644
index 0000000000..6d6fb02a68
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -0,0 +1,1430 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbpaintengine.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbscreen.h"
+#include "qdirectfbpixmap.h"
+#include <directfb.h>
+#include <qtransform.h>
+#include <qvarlengtharray.h>
+#include <qcache.h>
+#include <qmath.h>
+#include <private/qpixmapdata_p.h>
+#include <private/qpixmap_raster_p.h>
+#include <private/qimagepixmapcleanuphooks_p.h>
+
+
+QT_BEGIN_NAMESPACE
+
+class SurfaceCache;
+class QDirectFBPaintEnginePrivate : public QRasterPaintEnginePrivate
+{
+public:
+ enum TransformationTypeFlags {
+ Matrix_NegativeScale = 0x100,
+ Matrix_RectsUnsupported = (QTransform::TxRotate|QTransform::TxShear|QTransform::TxProject),
+ Matrix_BlitsUnsupported = (Matrix_NegativeScale|Matrix_RectsUnsupported)
+ };
+
+ inline static uint getTransformationType(const QTransform &transform)
+ {
+ int ret = transform.type();
+ if (qMin(transform.m11(), transform.m22()) < 0) {
+ ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
+ }
+ return ret;
+ }
+
+ enum CompositionModeStatus {
+ PorterDuff_None = 0x0,
+ PorterDuff_Supported = 0x1,
+ PorterDuff_PremultiplyColors = 0x2,
+ PorterDuff_AlwaysBlend = 0x4
+ };
+
+ enum ClipType {
+ ClipUnset,
+ NoClip,
+ RectClip,
+ RegionClip,
+ ComplexClip
+ };
+
+ QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p);
+ ~QDirectFBPaintEnginePrivate();
+
+ inline void setTransform(const QTransform &transforma);
+ inline void setPen(const QPen &pen);
+ inline void setCompositionMode(QPainter::CompositionMode mode);
+ inline void setRenderHints(QPainter::RenderHints hints);
+
+ inline void setDFBColor(const QColor &color);
+
+ inline void lock();
+ inline void unlock();
+ static inline void unlock(QDirectFBPaintDevice *device);
+
+ inline bool isSimpleBrush(const QBrush &brush) const;
+
+ void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos, const QTransform &pixmapTransform);
+ void blit(const QRectF &dest, IDirectFBSurface *surface, const QRectF &src);
+
+ inline bool supportsStretchBlit() const;
+
+ inline void updateClip();
+ virtual void systemStateChanged();
+
+ static IDirectFBSurface *getSurface(const QImage &img, bool *release);
+
+#ifdef QT_DIRECTFB_IMAGECACHE
+ static inline int cacheCost(const QImage &img) { return img.width() * img.height() * img.depth() / 8; }
+#endif
+
+ enum BlitFlag {
+ HasAlpha = 0x1,
+ Premultiplied = 0x2
+ };
+ void prepareForBlit(uint blitFlags);
+
+ IDirectFBSurface *surface;
+
+ bool antialiased;
+ bool simplePen;
+
+ uint transformationType; // this is QTransform::type() + Matrix_NegativeScale if qMin(transform.m11(), transform.m22()) < 0
+
+ SurfaceCache *surfaceCache;
+ IDirectFB *fb;
+ quint8 opacity;
+
+ ClipType clipType;
+ QDirectFBPaintDevice *dfbDevice;
+ uint compositionModeStatus;
+ bool isPremultiplied;
+
+ bool inClip;
+ QRect currentClip;
+
+ QDirectFBPaintEngine *q;
+};
+
+class SurfaceCache
+{
+public:
+ SurfaceCache() : surface(0), buffer(0), bufsize(0) {}
+ ~SurfaceCache() { clear(); }
+ IDirectFBSurface *getSurface(const uint *buf, int size);
+ void clear();
+private:
+ IDirectFBSurface *surface;
+ uint *buffer;
+ int bufsize;
+};
+
+
+#ifdef QT_DIRECTFB_IMAGECACHE
+QT_BEGIN_INCLUDE_NAMESPACE
+#include <private/qimage_p.h>
+QT_END_INCLUDE_NAMESPACE
+struct CachedImage
+{
+ IDirectFBSurface *surface;
+ ~CachedImage()
+ {
+ if (surface && QDirectFBScreen::instance()) {
+ QDirectFBScreen::instance()->releaseDFBSurface(surface);
+ }
+ }
+};
+static QCache<qint64, CachedImage> imageCache(4*1024*1024); // 4 MB
+#endif
+
+#define VOID_ARG() static_cast<bool>(false)
+enum PaintOperation {
+ DRAW_RECTS = 0x0001, DRAW_LINES = 0x0002, DRAW_IMAGE = 0x0004,
+ DRAW_PIXMAP = 0x0008, DRAW_TILED_PIXMAP = 0x0010, STROKE_PATH = 0x0020,
+ DRAW_PATH = 0x0040, DRAW_POINTS = 0x0080, DRAW_ELLIPSE = 0x0100,
+ DRAW_POLYGON = 0x0200, DRAW_TEXT = 0x0400, FILL_PATH = 0x0800,
+ FILL_RECT = 0x1000, DRAW_COLORSPANS = 0x2000, DRAW_ROUNDED_RECT = 0x4000,
+ DRAW_STATICTEXT = 0x8000, ALL = 0xffff
+};
+
+enum { RasterWarn = 1, RasterDisable = 2 };
+static inline uint rasterFallbacksMask(PaintOperation op)
+{
+ uint ret = 0;
+#ifdef QT_DIRECTFB_WARN_ON_RASTERFALLBACKS
+ if (op & QT_DIRECTFB_WARN_ON_RASTERFALLBACKS)
+ ret |= RasterWarn;
+#endif
+#ifdef QT_DIRECTFB_DISABLE_RASTERFALLBACKS
+ if (op & QT_DIRECTFB_DISABLE_RASTERFALLBACKS)
+ ret |= RasterDisable;
+#endif
+ static int warningMask = -1;
+ static int disableMask = -1;
+ if (warningMask < 0) {
+ struct {
+ const char *name;
+ PaintOperation operation;
+ } const operations[] = {
+ { "DRAW_RECTS", DRAW_RECTS },
+ { "DRAW_LINES", DRAW_LINES },
+ { "DRAW_IMAGE", DRAW_IMAGE },
+ { "DRAW_PIXMAP", DRAW_PIXMAP },
+ { "DRAW_TILED_PIXMAP", DRAW_TILED_PIXMAP },
+ { "STROKE_PATH", STROKE_PATH },
+ { "DRAW_PATH", DRAW_PATH },
+ { "DRAW_POINTS", DRAW_POINTS },
+ { "DRAW_ELLIPSE", DRAW_ELLIPSE },
+ { "DRAW_POLYGON", DRAW_POLYGON },
+ { "DRAW_TEXT", DRAW_TEXT },
+ { "FILL_PATH", FILL_PATH },
+ { "FILL_RECT", FILL_RECT },
+ { "DRAW_COLORSPANS", DRAW_COLORSPANS },
+ { "DRAW_ROUNDED_RECT", DRAW_ROUNDED_RECT },
+ { "ALL", ALL },
+ { 0, ALL }
+ };
+
+ QStringList warning = QString::fromLatin1(qgetenv("QT_DIRECTFB_WARN_ON_RASTERFALLBACKS")).toUpper().split(QLatin1Char('|'),
+ QString::SkipEmptyParts);
+ QStringList disable = QString::fromLatin1(qgetenv("QT_DIRECTFB_DISABLE_RASTERFALLBACKS")).toUpper().split(QLatin1Char('|'),
+ QString::SkipEmptyParts);
+ warningMask = 0;
+ disableMask = 0;
+ if (!warning.isEmpty() || !disable.isEmpty()) {
+ for (int i=0; operations[i].name; ++i) {
+ const QString name = QString::fromLatin1(operations[i].name);
+ int idx = warning.indexOf(name);
+ if (idx != -1) {
+ warningMask |= operations[i].operation;
+ warning.erase(warning.begin() + idx);
+ }
+ idx = disable.indexOf(name);
+ if (idx != -1) {
+ disableMask |= operations[i].operation;
+ disable.erase(disable.begin() + idx);
+ }
+ }
+ }
+ if (!warning.isEmpty()) {
+ qWarning("QDirectFBPaintEngine QT_DIRECTFB_WARN_ON_RASTERFALLBACKS Unknown operation(s): %s",
+ qPrintable(warning.join(QLatin1String("|"))));
+ }
+ if (!disable.isEmpty()) {
+ qWarning("QDirectFBPaintEngine QT_DIRECTFB_DISABLE_RASTERFALLBACKS Unknown operation(s): %s",
+ qPrintable(disable.join(QLatin1String("|"))));
+ }
+ }
+ if (op & warningMask)
+ ret |= RasterWarn;
+ if (op & disableMask)
+ ret |= RasterDisable;
+ return ret;
+}
+
+template <typename device, typename T1, typename T2, typename T3>
+static void rasterFallbackWarn(const char *msg, const char *func, const device *dev,
+ uint transformationType, bool simplePen,
+ uint clipType, uint compositionModeStatus,
+ const char *nameOne, const T1 &one,
+ const char *nameTwo, const T2 &two,
+ const char *nameThree, const T3 &three);
+
+#define RASTERFALLBACK(op, one, two, three) \
+ { \
+ static const uint rasterFallbacks = rasterFallbacksMask(op); \
+ switch (rasterFallbacks) { \
+ case 0: break; \
+ case RasterWarn: \
+ rasterFallbackWarn("Falling back to raster engine for", \
+ __FUNCTION__, \
+ state()->painter->device(), \
+ d_func()->transformationType, \
+ d_func()->simplePen, \
+ d_func()->clipType, \
+ d_func()->compositionModeStatus, \
+ #one, one, #two, two, #three, three); \
+ break; \
+ case RasterDisable|RasterWarn: \
+ rasterFallbackWarn("Disabled raster engine operation", \
+ __FUNCTION__, \
+ state()->painter->device(), \
+ d_func()->transformationType, \
+ d_func()->simplePen, \
+ d_func()->clipType, \
+ d_func()->compositionModeStatus, \
+ #one, one, #two, two, #three, three); \
+ case RasterDisable: \
+ return; \
+ } \
+ }
+
+template <class T>
+static inline void drawLines(const T *lines, int n, const QTransform &transform, IDirectFBSurface *surface);
+template <class T>
+static inline void fillRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface);
+template <class T>
+static inline void drawRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface);
+
+#define CLIPPED_PAINT(operation) { \
+ d->unlock(); \
+ DFBRegion clipRegion; \
+ switch (d->clipType) { \
+ case QDirectFBPaintEnginePrivate::NoClip: \
+ case QDirectFBPaintEnginePrivate::RectClip: \
+ operation; \
+ break; \
+ case QDirectFBPaintEnginePrivate::RegionClip: { \
+ Q_ASSERT(d->clip()); \
+ const QVector<QRect> cr = d->clip()->clipRegion.rects(); \
+ const int size = cr.size(); \
+ for (int i=0; i<size; ++i) { \
+ d->currentClip = cr.at(i); \
+ clipRegion.x1 = d->currentClip.x(); \
+ clipRegion.y1 = d->currentClip.y(); \
+ clipRegion.x2 = d->currentClip.right(); \
+ clipRegion.y2 = d->currentClip.bottom(); \
+ d->surface->SetClip(d->surface, &clipRegion); \
+ operation; \
+ } \
+ d->updateClip(); \
+ break; } \
+ case QDirectFBPaintEnginePrivate::ComplexClip: \
+ case QDirectFBPaintEnginePrivate::ClipUnset: \
+ qFatal("CLIPPED_PAINT internal error %d", d->clipType); \
+ break; \
+ } \
+ }
+
+
+QDirectFBPaintEngine::QDirectFBPaintEngine(QPaintDevice *device)
+ : QRasterPaintEngine(*(new QDirectFBPaintEnginePrivate(this)), device)
+{
+}
+
+QDirectFBPaintEngine::~QDirectFBPaintEngine()
+{
+}
+
+bool QDirectFBPaintEngine::begin(QPaintDevice *device)
+{
+ Q_D(QDirectFBPaintEngine);
+ if (device->devType() == QInternal::CustomRaster) {
+ d->dfbDevice = static_cast<QDirectFBPaintDevice*>(device);
+ } else if (device->devType() == QInternal::Pixmap) {
+ QPixmapData *data = static_cast<QPixmap*>(device)->pixmapData();
+ Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
+ QDirectFBPixmapData *dfbPixmapData = static_cast<QDirectFBPixmapData*>(data);
+ QDirectFBPaintEnginePrivate::unlock(dfbPixmapData);
+ d->dfbDevice = static_cast<QDirectFBPaintDevice*>(dfbPixmapData);
+ }
+
+ if (d->dfbDevice)
+ d->surface = d->dfbDevice->directFBSurface();
+
+ if (!d->surface) {
+ qFatal("QDirectFBPaintEngine used on an invalid device: 0x%x",
+ device->devType());
+ }
+ d->isPremultiplied = QDirectFBScreen::isPremultiplied(d->dfbDevice->format());
+
+ d->prepare(d->dfbDevice);
+ gccaps = AllFeatures;
+ d->setCompositionMode(state()->composition_mode);
+
+ return QRasterPaintEngine::begin(device);
+}
+
+bool QDirectFBPaintEngine::end()
+{
+ Q_D(QDirectFBPaintEngine);
+ d->unlock();
+ d->dfbDevice = 0;
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ d->surface->ReleaseSource(d->surface);
+#endif
+ d->currentClip = QRect();
+ d->surface->SetClip(d->surface, NULL);
+ d->surface = 0;
+ return QRasterPaintEngine::end();
+}
+
+void QDirectFBPaintEngine::clipEnabledChanged()
+{
+ Q_D(QDirectFBPaintEngine);
+ QRasterPaintEngine::clipEnabledChanged();
+ d->updateClip();
+}
+
+void QDirectFBPaintEngine::penChanged()
+{
+ Q_D(QDirectFBPaintEngine);
+ d->setPen(state()->pen);
+
+ QRasterPaintEngine::penChanged();
+}
+
+void QDirectFBPaintEngine::opacityChanged()
+{
+ Q_D(QDirectFBPaintEngine);
+ d->opacity = quint8(state()->opacity * 255);
+ QRasterPaintEngine::opacityChanged();
+}
+
+void QDirectFBPaintEngine::compositionModeChanged()
+{
+ Q_D(QDirectFBPaintEngine);
+ d->setCompositionMode(state()->compositionMode());
+ QRasterPaintEngine::compositionModeChanged();
+}
+
+void QDirectFBPaintEngine::renderHintsChanged()
+{
+ Q_D(QDirectFBPaintEngine);
+ d->setRenderHints(state()->renderHints);
+ QRasterPaintEngine::renderHintsChanged();
+}
+
+void QDirectFBPaintEngine::transformChanged()
+{
+ Q_D(QDirectFBPaintEngine);
+ d->setTransform(state()->matrix);
+ QRasterPaintEngine::transformChanged();
+}
+
+void QDirectFBPaintEngine::setState(QPainterState *state)
+{
+ Q_D(QDirectFBPaintEngine);
+ QRasterPaintEngine::setState(state);
+ d->setPen(state->pen);
+ d->opacity = quint8(state->opacity * 255);
+ d->setCompositionMode(state->compositionMode());
+ d->setTransform(state->transform());
+ d->setRenderHints(state->renderHints);
+ if (d->surface)
+ d->updateClip();
+}
+
+void QDirectFBPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
+{
+ Q_D(QDirectFBPaintEngine);
+ const bool wasInClip = d->inClip;
+ d->inClip = true;
+ QRasterPaintEngine::clip(path, op);
+ if (!wasInClip) {
+ d->inClip = false;
+ d->updateClip();
+ }
+}
+
+void QDirectFBPaintEngine::clip(const QRegion &region, Qt::ClipOperation op)
+{
+ Q_D(QDirectFBPaintEngine);
+ const bool wasInClip = d->inClip;
+ d->inClip = true;
+ QRasterPaintEngine::clip(region, op);
+ if (!wasInClip) {
+ d->inClip = false;
+ d->updateClip();
+ }
+}
+
+void QDirectFBPaintEngine::clip(const QRect &rect, Qt::ClipOperation op)
+{
+ Q_D(QDirectFBPaintEngine);
+ const bool wasInClip = d->inClip;
+ d->inClip = true;
+ QRasterPaintEngine::clip(rect, op);
+ if (!wasInClip) {
+ d->inClip = false;
+ d->updateClip();
+ }
+}
+
+void QDirectFBPaintEngine::drawRects(const QRect *rects, int rectCount)
+{
+ Q_D(QDirectFBPaintEngine);
+ const QPen &pen = state()->pen;
+ const QBrush &brush = state()->brush;
+ if (brush.style() == Qt::NoBrush && pen.style() == Qt::NoPen)
+ return;
+
+ if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported)
+ || !d->simplePen
+ || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip
+ || !d->isSimpleBrush(brush)
+ || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) {
+ RASTERFALLBACK(DRAW_RECTS, rectCount, VOID_ARG(), VOID_ARG());
+ d->lock();
+ QRasterPaintEngine::drawRects(rects, rectCount);
+ return;
+ }
+
+ if (brush.style() != Qt::NoBrush) {
+ d->setDFBColor(brush.color());
+ CLIPPED_PAINT(QT_PREPEND_NAMESPACE(fillRects<QRect>)(rects, rectCount, state()->matrix, d->surface));
+ }
+
+ if (pen.style() != Qt::NoPen) {
+ d->setDFBColor(pen.color());
+ CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawRects<QRect>)(rects, rectCount, state()->matrix, d->surface));
+ }
+}
+
+void QDirectFBPaintEngine::drawRects(const QRectF *rects, int rectCount)
+{
+ Q_D(QDirectFBPaintEngine);
+ const QPen &pen = state()->pen;
+ const QBrush &brush = state()->brush;
+ if (brush.style() == Qt::NoBrush && pen.style() == Qt::NoPen)
+ return;
+
+ if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported)
+ || !d->simplePen
+ || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip
+ || !d->isSimpleBrush(brush)
+ || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) {
+ RASTERFALLBACK(DRAW_RECTS, rectCount, VOID_ARG(), VOID_ARG());
+ d->lock();
+ QRasterPaintEngine::drawRects(rects, rectCount);
+ return;
+ }
+
+ if (brush.style() != Qt::NoBrush) {
+ d->setDFBColor(brush.color());
+ CLIPPED_PAINT(fillRects<QRectF>(rects, rectCount, state()->matrix, d->surface));
+ }
+
+ if (pen.style() != Qt::NoPen) {
+ d->setDFBColor(pen.color());
+ CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawRects<QRectF>)(rects, rectCount, state()->matrix, d->surface));
+ }
+}
+
+void QDirectFBPaintEngine::drawLines(const QLine *lines, int lineCount)
+{
+ Q_D(QDirectFBPaintEngine);
+
+ const QPen &pen = state()->pen;
+ if (!d->simplePen
+ || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip
+ || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) {
+ RASTERFALLBACK(DRAW_LINES, lineCount, VOID_ARG(), VOID_ARG());
+ d->lock();
+ QRasterPaintEngine::drawLines(lines, lineCount);
+ return;
+ }
+
+ if (pen.style() != Qt::NoPen) {
+ d->setDFBColor(pen.color());
+ CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawLines<QLine>)(lines, lineCount, state()->matrix, d->surface));
+ }
+}
+
+void QDirectFBPaintEngine::drawLines(const QLineF *lines, int lineCount)
+{
+ Q_D(QDirectFBPaintEngine);
+
+ const QPen &pen = state()->pen;
+ if (!d->simplePen
+ || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip
+ || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) {
+ RASTERFALLBACK(DRAW_LINES, lineCount, VOID_ARG(), VOID_ARG());
+ d->lock();
+ QRasterPaintEngine::drawLines(lines, lineCount);
+ return;
+ }
+
+ if (pen.style() != Qt::NoPen) {
+ d->setDFBColor(pen.color());
+ CLIPPED_PAINT(QT_PREPEND_NAMESPACE(drawLines<QLineF>)(lines, lineCount, state()->matrix, d->surface));
+ }
+}
+
+void QDirectFBPaintEngine::drawImage(const QRectF &r, const QImage &image,
+ const QRectF &sr,
+ Qt::ImageConversionFlags flags)
+{
+ Q_D(QDirectFBPaintEngine);
+ Q_UNUSED(flags);
+
+ /* This is hard to read. The way it works is like this:
+
+ - If you do not have support for preallocated surfaces and do not use an
+ image cache we always fall back to raster engine.
+
+ - If it's rotated/sheared/mirrored (negative scale) or we can't
+ clip it we fall back to raster engine.
+
+ - If we don't cache the image, but we do have support for
+ preallocated surfaces we fall back to the raster engine if the
+ image is in a format DirectFB can't handle.
+
+ - If we do cache the image but don't have support for preallocated
+ images and the cost of caching the image (bytes used) is higher
+ than the max image cache size we fall back to raster engine.
+ */
+
+#if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE
+ if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)
+ || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
+ || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip)
+ || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size())
+#ifndef QT_DIRECTFB_IMAGECACHE
+ || (QDirectFBScreen::getSurfacePixelFormat(image.format()) == DSPF_UNKNOWN)
+#elif defined QT_NO_DIRECTFB_PREALLOCATED
+ || (QDirectFBPaintEnginePrivate::cacheCost(image) > imageCache.maxCost())
+#endif
+ )
+#endif
+ {
+ RASTERFALLBACK(DRAW_IMAGE, r, image.size(), sr);
+ d->lock();
+ QRasterPaintEngine::drawImage(r, image, sr, flags);
+ return;
+ }
+#if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE
+ bool release;
+ IDirectFBSurface *imgSurface = d->getSurface(image, &release);
+ uint blitFlags = 0;
+ if (image.hasAlphaChannel())
+ blitFlags |= QDirectFBPaintEnginePrivate::HasAlpha;
+ if (QDirectFBScreen::isPremultiplied(image.format()))
+ blitFlags |= QDirectFBPaintEnginePrivate::Premultiplied;
+ d->prepareForBlit(blitFlags);
+ CLIPPED_PAINT(d->blit(r, imgSurface, sr));
+ if (release) {
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ d->surface->ReleaseSource(d->surface);
+#endif
+ imgSurface->Release(imgSurface);
+ }
+#endif
+}
+
+void QDirectFBPaintEngine::drawImage(const QPointF &p, const QImage &img)
+{
+ drawImage(QRectF(p, img.size()), img, img.rect());
+}
+
+void QDirectFBPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap,
+ const QRectF &sr)
+{
+ Q_D(QDirectFBPaintEngine);
+
+ if (pixmap.pixmapData()->classId() != QPixmapData::DirectFBClass) {
+ RASTERFALLBACK(DRAW_PIXMAP, r, pixmap.size(), sr);
+ d->lock();
+ QRasterPaintEngine::drawPixmap(r, pixmap, sr);
+ } else {
+ QPixmapData *data = pixmap.pixmapData();
+ Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
+ QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data);
+ if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)
+ || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
+ || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip)
+ || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size())) {
+ RASTERFALLBACK(DRAW_PIXMAP, r, pixmap.size(), sr);
+ const QImage *img = dfbData->buffer();
+ d->lock();
+ QRasterPaintEngine::drawImage(r, *img, sr);
+ } else {
+ QDirectFBPaintEnginePrivate::unlock(dfbData);
+ IDirectFBSurface *s = dfbData->directFBSurface();
+ uint blitFlags = 0;
+ if (pixmap.hasAlphaChannel())
+ blitFlags |= QDirectFBPaintEnginePrivate::HasAlpha;
+ if (QDirectFBScreen::isPremultiplied(dfbData->pixelFormat()))
+ blitFlags |= QDirectFBPaintEnginePrivate::Premultiplied;
+
+ d->prepareForBlit(blitFlags);
+ CLIPPED_PAINT(d->blit(r, s, sr));
+ }
+ }
+}
+
+void QDirectFBPaintEngine::drawPixmap(const QPointF &p, const QPixmap &pm)
+{
+ drawPixmap(QRectF(p, pm.size()), pm, pm.rect());
+}
+
+void QDirectFBPaintEngine::drawTiledPixmap(const QRectF &r,
+ const QPixmap &pixmap,
+ const QPointF &offset)
+{
+ Q_D(QDirectFBPaintEngine);
+ if (pixmap.pixmapData()->classId() != QPixmapData::DirectFBClass) {
+ RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset);
+ d->lock();
+ QRasterPaintEngine::drawTiledPixmap(r, pixmap, offset);
+ } else if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)
+ || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
+ || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip)
+ || (!d->supportsStretchBlit() && state()->matrix.isScaling())) {
+ RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset);
+ QPixmapData *pixmapData = pixmap.pixmapData();
+ Q_ASSERT(pixmapData->classId() == QPixmapData::DirectFBClass);
+ QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(pixmapData);
+ const QImage *img = dfbData->buffer();
+ d->lock();
+ QRasterPixmapData *data = new QRasterPixmapData(QPixmapData::PixmapType);
+ data->fromImage(*img, Qt::AutoColor);
+ const QPixmap pix(data);
+ QRasterPaintEngine::drawTiledPixmap(r, pix, offset);
+ } else {
+ QTransform transform(state()->matrix);
+ CLIPPED_PAINT(d->drawTiledPixmap(r, pixmap, offset, transform));
+ }
+}
+
+
+void QDirectFBPaintEngine::stroke(const QVectorPath &path, const QPen &pen)
+{
+ RASTERFALLBACK(STROKE_PATH, path, VOID_ARG(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::stroke(path, pen);
+}
+
+void QDirectFBPaintEngine::drawPath(const QPainterPath &path)
+{
+ RASTERFALLBACK(DRAW_PATH, path, VOID_ARG(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawPath(path);
+}
+
+void QDirectFBPaintEngine::drawPoints(const QPointF *points, int pointCount)
+{
+ RASTERFALLBACK(DRAW_POINTS, pointCount, VOID_ARG(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawPoints(points, pointCount);
+}
+
+void QDirectFBPaintEngine::drawPoints(const QPoint *points, int pointCount)
+{
+ RASTERFALLBACK(DRAW_POINTS, pointCount, VOID_ARG(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawPoints(points, pointCount);
+}
+
+void QDirectFBPaintEngine::drawEllipse(const QRectF &rect)
+{
+ RASTERFALLBACK(DRAW_ELLIPSE, rect, VOID_ARG(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawEllipse(rect);
+}
+
+void QDirectFBPaintEngine::drawPolygon(const QPointF *points, int pointCount,
+ PolygonDrawMode mode)
+{
+ RASTERFALLBACK(DRAW_POLYGON, pointCount, mode, VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawPolygon(points, pointCount, mode);
+}
+
+void QDirectFBPaintEngine::drawPolygon(const QPoint *points, int pointCount,
+ PolygonDrawMode mode)
+{
+ RASTERFALLBACK(DRAW_POLYGON, pointCount, mode, VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawPolygon(points, pointCount, mode);
+}
+
+void QDirectFBPaintEngine::drawTextItem(const QPointF &p,
+ const QTextItem &textItem)
+{
+ RASTERFALLBACK(DRAW_TEXT, p, textItem.text(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawTextItem(p, textItem);
+}
+
+void QDirectFBPaintEngine::fill(const QVectorPath &path, const QBrush &brush)
+{
+ if (brush.style() == Qt::NoBrush)
+ return;
+ RASTERFALLBACK(FILL_PATH, path, brush, VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::fill(path, brush);
+}
+
+void QDirectFBPaintEngine::drawRoundedRect(const QRectF &rect, qreal xrad, qreal yrad, Qt::SizeMode mode)
+{
+ RASTERFALLBACK(DRAW_ROUNDED_RECT, rect, xrad, yrad);
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawRoundedRect(rect, xrad, yrad, mode);
+}
+
+void QDirectFBPaintEngine::drawStaticTextItem(QStaticTextItem *item)
+{
+ RASTERFALLBACK(DRAW_STATICTEXT, item, VOID_ARG(), VOID_ARG());
+ Q_D(QDirectFBPaintEngine);
+ d->lock();
+ QRasterPaintEngine::drawStaticTextItem(item);
+}
+
+void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
+{
+ Q_D(QDirectFBPaintEngine);
+ if (brush.style() == Qt::NoBrush)
+ return;
+ if (d->clipType != QDirectFBPaintEnginePrivate::ComplexClip) {
+ switch (brush.style()) {
+ case Qt::SolidPattern: {
+ const QColor color = brush.color();
+ if (!color.isValid())
+ return;
+
+ if (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported
+ || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) {
+ break;
+ }
+ d->setDFBColor(color);
+ const QRect r = state()->matrix.mapRect(rect).toRect();
+ CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height()));
+ return; }
+
+ case Qt::TexturePattern: {
+ const QPointF &brushOrigin = state()->brushOrigin;
+ const QTransform stateTransform = state()->matrix;
+ QTransform transform(stateTransform);
+ transform.translate(brushOrigin.x(), brushOrigin.y());
+ transform = brush.transform() * transform;
+ if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)
+ || (QDirectFBPaintEnginePrivate::getTransformationType(transform) & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
+ || (!d->supportsStretchBlit() && transform.isScaling())) {
+ break;
+ }
+
+ const QPixmap texture = brush.texture();
+ if (texture.pixmapData()->classId() != QPixmapData::DirectFBClass)
+ break;
+
+ CLIPPED_PAINT(d->drawTiledPixmap(stateTransform.mapRect(rect), texture, rect.topLeft() - brushOrigin, transform));
+ return; }
+ default:
+ break;
+ }
+ }
+ RASTERFALLBACK(FILL_RECT, rect, brush, VOID_ARG());
+ d->lock();
+ QRasterPaintEngine::fillRect(rect, brush);
+}
+
+void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QColor &color)
+{
+ if (!color.isValid())
+ return;
+ Q_D(QDirectFBPaintEngine);
+ if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported)
+ || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip)
+ || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) {
+ RASTERFALLBACK(FILL_RECT, rect, color, VOID_ARG());
+ d->lock();
+ QRasterPaintEngine::fillRect(rect, color);
+ } else {
+ d->setDFBColor(color);
+ const QRect r = state()->matrix.mapRect(rect).toRect();
+ CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height()));
+ }
+}
+
+void QDirectFBPaintEngine::drawBufferSpan(const uint *buffer, int bufsize,
+ int x, int y, int length,
+ uint const_alpha)
+{
+ Q_D(QDirectFBPaintEngine);
+ IDirectFBSurface *src = d->surfaceCache->getSurface(buffer, bufsize);
+ // ### how does this play with setDFBColor
+ src->SetColor(src, 0, 0, 0, const_alpha);
+ const DFBRectangle rect = { 0, 0, length, 1 };
+ d->surface->Blit(d->surface, src, &rect, x, y);
+}
+
+#ifdef QT_DIRECTFB_IMAGECACHE
+static void cachedImageCleanupHook(qint64 key)
+{
+ delete imageCache.take(key);
+}
+void QDirectFBPaintEngine::initImageCache(int size)
+{
+ Q_ASSERT(size >= 0);
+ imageCache.setMaxCost(size);
+ QImagePixmapCleanupHooks::instance()->addImageHook(cachedImageCleanupHook);
+}
+
+#endif // QT_DIRECTFB_IMAGECACHE
+
+// ---- QDirectFBPaintEnginePrivate ----
+
+
+QDirectFBPaintEnginePrivate::QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p)
+ : surface(0), antialiased(false), simplePen(false),
+ transformationType(0), opacity(255),
+ clipType(ClipUnset), dfbDevice(0),
+ compositionModeStatus(0), isPremultiplied(false), inClip(false), q(p)
+{
+ fb = QDirectFBScreen::instance()->dfb();
+ surfaceCache = new SurfaceCache;
+}
+
+QDirectFBPaintEnginePrivate::~QDirectFBPaintEnginePrivate()
+{
+ delete surfaceCache;
+}
+
+bool QDirectFBPaintEnginePrivate::isSimpleBrush(const QBrush &brush) const
+{
+ return (brush.style() == Qt::NoBrush) || (brush.style() == Qt::SolidPattern && !antialiased);
+}
+
+void QDirectFBPaintEnginePrivate::lock()
+{
+ // We will potentially get a new pointer to the buffer after a
+ // lock so we need to call the base implementation of prepare so
+ // it updates its rasterBuffer to point to the new buffer address.
+ Q_ASSERT(dfbDevice);
+ if (dfbDevice->lockSurface(DSLF_READ|DSLF_WRITE)) {
+ prepare(dfbDevice);
+ }
+}
+
+void QDirectFBPaintEnginePrivate::unlock()
+{
+ Q_ASSERT(dfbDevice);
+#ifdef QT_DIRECTFB_SUBSURFACE
+ dfbDevice->syncPending = true;
+#else
+ QDirectFBPaintEnginePrivate::unlock(dfbDevice);
+#endif
+}
+
+void QDirectFBPaintEnginePrivate::unlock(QDirectFBPaintDevice *device)
+{
+#ifdef QT_NO_DIRECTFB_SUBSURFACE
+ Q_ASSERT(device);
+ device->unlockSurface();
+#else
+ Q_UNUSED(device);
+#endif
+}
+
+void QDirectFBPaintEnginePrivate::setTransform(const QTransform &transform)
+{
+ transformationType = getTransformationType(transform);
+ setPen(q->state()->pen);
+}
+
+void QDirectFBPaintEnginePrivate::setPen(const QPen &pen)
+{
+ if (pen.style() == Qt::NoPen) {
+ simplePen = true;
+ } else if (pen.style() == Qt::SolidLine
+ && !antialiased
+ && pen.brush().style() == Qt::SolidPattern
+ && pen.widthF() <= 1.0
+ && (transformationType < QTransform::TxScale || pen.isCosmetic())) {
+ simplePen = true;
+ } else {
+ simplePen = false;
+ }
+}
+
+void QDirectFBPaintEnginePrivate::setCompositionMode(QPainter::CompositionMode mode)
+{
+ if (!surface)
+ return;
+
+ static const bool forceRasterFallBack = qgetenv("QT_DIRECTFB_FORCE_RASTER").toInt() > 0;
+ if (forceRasterFallBack) {
+ compositionModeStatus = PorterDuff_None;
+ return;
+ }
+
+ compositionModeStatus = PorterDuff_Supported|PorterDuff_PremultiplyColors|PorterDuff_AlwaysBlend;
+ switch (mode) {
+ case QPainter::CompositionMode_Clear:
+ surface->SetPorterDuff(surface, DSPD_CLEAR);
+ break;
+ case QPainter::CompositionMode_Source:
+ surface->SetPorterDuff(surface, DSPD_SRC);
+ compositionModeStatus &= ~PorterDuff_AlwaysBlend;
+ if (!isPremultiplied)
+ compositionModeStatus &= ~PorterDuff_PremultiplyColors;
+ break;
+ case QPainter::CompositionMode_SourceOver:
+ compositionModeStatus &= ~PorterDuff_AlwaysBlend;
+ surface->SetPorterDuff(surface, DSPD_SRC_OVER);
+ break;
+ case QPainter::CompositionMode_DestinationOver:
+ surface->SetPorterDuff(surface, DSPD_DST_OVER);
+ break;
+ case QPainter::CompositionMode_SourceIn:
+ surface->SetPorterDuff(surface, DSPD_SRC_IN);
+ if (!isPremultiplied)
+ compositionModeStatus &= ~PorterDuff_PremultiplyColors;
+ break;
+ case QPainter::CompositionMode_DestinationIn:
+ surface->SetPorterDuff(surface, DSPD_DST_IN);
+ break;
+ case QPainter::CompositionMode_SourceOut:
+ surface->SetPorterDuff(surface, DSPD_SRC_OUT);
+ break;
+ case QPainter::CompositionMode_DestinationOut:
+ surface->SetPorterDuff(surface, DSPD_DST_OUT);
+ break;
+ case QPainter::CompositionMode_Destination:
+ surface->SetSrcBlendFunction(surface, DSBF_ZERO);
+ surface->SetDstBlendFunction(surface, DSBF_ONE);
+ break;
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ case QPainter::CompositionMode_SourceAtop:
+ surface->SetPorterDuff(surface, DSPD_SRC_ATOP);
+ break;
+ case QPainter::CompositionMode_DestinationAtop:
+ surface->SetPorterDuff(surface, DSPD_DST_ATOP);
+ break;
+ case QPainter::CompositionMode_Plus:
+ surface->SetPorterDuff(surface, DSPD_ADD);
+ break;
+ case QPainter::CompositionMode_Xor:
+ surface->SetPorterDuff(surface, DSPD_XOR);
+ break;
+#endif
+ default:
+ compositionModeStatus = PorterDuff_None;
+ break;
+ }
+}
+
+void QDirectFBPaintEnginePrivate::setRenderHints(QPainter::RenderHints hints)
+{
+ const bool old = antialiased;
+ antialiased = bool(hints & QPainter::Antialiasing);
+ if (old != antialiased) {
+ setPen(q->state()->pen);
+ }
+}
+
+void QDirectFBPaintEnginePrivate::prepareForBlit(uint flags)
+{
+ DFBSurfaceBlittingFlags blittingFlags = DSBLIT_NOFX;
+ if (flags & Premultiplied)
+ blittingFlags |= DSBLIT_SRC_PREMULTIPLY;
+ if (flags & HasAlpha)
+ blittingFlags |= DSBLIT_BLEND_ALPHACHANNEL;
+ if (opacity != 255) {
+ blittingFlags |= DSBLIT_BLEND_COLORALPHA;
+ surface->SetColor(surface, 0xff, 0xff, 0xff, opacity);
+ }
+
+ surface->SetBlittingFlags(surface, blittingFlags);
+}
+
+static inline uint ALPHA_MUL(uint x, uint a)
+{
+ uint t = x * a;
+ t = ((t + (t >> 8) + 0x80) >> 8) & 0xff;
+ return t;
+}
+
+void QDirectFBPaintEnginePrivate::setDFBColor(const QColor &color)
+{
+ Q_ASSERT(surface);
+ Q_ASSERT(compositionModeStatus & PorterDuff_Supported);
+ const quint8 alpha = (opacity == 255 ?
+ color.alpha() : ALPHA_MUL(color.alpha(), opacity));
+ QColor col;
+ if (compositionModeStatus & PorterDuff_PremultiplyColors) {
+ col = QColor(ALPHA_MUL(color.red(), alpha),
+ ALPHA_MUL(color.green(), alpha),
+ ALPHA_MUL(color.blue(), alpha),
+ alpha);
+ } else {
+ col = QColor(color.red(), color.green(), color.blue(), alpha);
+ }
+ surface->SetColor(surface, col.red(), col.green(), col.blue(), col.alpha());
+ surface->SetDrawingFlags(surface, alpha == 255 && !(compositionModeStatus & PorterDuff_AlwaysBlend) ? DSDRAW_NOFX : DSDRAW_BLEND);
+}
+
+IDirectFBSurface *QDirectFBPaintEnginePrivate::getSurface(const QImage &img, bool *release)
+{
+#ifdef QT_NO_DIRECTFB_IMAGECACHE
+ *release = true;
+ return QDirectFBScreen::instance()->createDFBSurface(img, img.format(), QDirectFBScreen::DontTrackSurface);
+#else
+ const qint64 key = img.cacheKey();
+ *release = false;
+ if (imageCache.contains(key)) {
+ return imageCache[key]->surface;
+ }
+
+ const int cost = cacheCost(img);
+ const bool cache = cost <= imageCache.maxCost();
+ QDirectFBScreen *screen = QDirectFBScreen::instance();
+ const QImage::Format format = (img.format() == screen->alphaPixmapFormat() || QDirectFBPixmapData::hasAlphaChannel(img)
+ ? screen->alphaPixmapFormat() : screen->pixelFormat());
+
+ IDirectFBSurface *surface = screen->createDFBSurface(img, format,
+ cache
+ ? QDirectFBScreen::TrackSurface
+ : QDirectFBScreen::DontTrackSurface);
+ if (cache) {
+ CachedImage *cachedImage = new CachedImage;
+ const_cast<QImage&>(img).data_ptr()->is_cached = true;
+ cachedImage->surface = surface;
+ imageCache.insert(key, cachedImage, cost);
+ } else {
+ *release = true;
+ }
+ return surface;
+#endif
+}
+
+
+void QDirectFBPaintEnginePrivate::blit(const QRectF &dest, IDirectFBSurface *s, const QRectF &src)
+{
+ const QRect sr = src.toRect();
+ const QRect dr = q->state()->matrix.mapRect(dest).toRect();
+ if (dr.isEmpty())
+ return;
+ const DFBRectangle sRect = { sr.x(), sr.y(), sr.width(), sr.height() };
+ DFBResult result;
+
+ if (dr.size() == sr.size()) {
+ result = surface->Blit(surface, s, &sRect, dr.x(), dr.y());
+ } else {
+ Q_ASSERT(supportsStretchBlit());
+ const DFBRectangle dRect = { dr.x(), dr.y(), dr.width(), dr.height() };
+ result = surface->StretchBlit(surface, s, &sRect, &dRect);
+ }
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBPaintEngine::drawPixmap()", result);
+}
+
+static inline qreal fixCoord(qreal rect_pos, qreal pixmapSize, qreal offset)
+{
+ qreal pos = rect_pos - offset;
+ while (pos > rect_pos)
+ pos -= pixmapSize;
+ while (pos + pixmapSize < rect_pos)
+ pos += pixmapSize;
+ return pos;
+}
+
+void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap,
+ const QPointF &off, const QTransform &pixmapTransform)
+{
+ const QTransform &transform = q->state()->matrix;
+ Q_ASSERT(!(getTransformationType(transform) & Matrix_BlitsUnsupported) &&
+ !(getTransformationType(pixmapTransform) & Matrix_BlitsUnsupported));
+ const QRect destinationRect = transform.mapRect(dest).toRect().normalized();
+ QRect newClip = destinationRect;
+ if (!currentClip.isEmpty())
+ newClip &= currentClip;
+
+ if (newClip.isNull())
+ return;
+
+ const DFBRegion clip = {
+ newClip.x(),
+ newClip.y(),
+ newClip.right(),
+ newClip.bottom()
+ };
+ surface->SetClip(surface, &clip);
+
+ QPointF offset = pixmapTransform.inverted().map(off);
+ Q_ASSERT(transform.type() <= QTransform::TxScale);
+ QPixmapData *data = pixmap.pixmapData();
+ Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
+ QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data);
+ IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
+ uint blitFlags = 0;
+ if (dfbData->hasAlphaChannel())
+ blitFlags |= HasAlpha;
+ if (QDirectFBScreen::isPremultiplied(dfbData->pixelFormat()))
+ blitFlags |= Premultiplied;
+ prepareForBlit(blitFlags);
+ QDirectFBPaintEnginePrivate::unlock(dfbData);
+ const QSize pixmapSize = dfbData->size();
+ if (transform.isScaling() || pixmapTransform.isScaling()) {
+ Q_ASSERT(supportsStretchBlit());
+ Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0);
+ offset.rx() *= transform.m11();
+ offset.ry() *= transform.m22();
+
+ const QSizeF mappedSize(pixmapSize.width() * pixmapTransform.m11(), pixmapSize.height() * pixmapTransform.m22());
+ qreal y = fixCoord(destinationRect.y(), mappedSize.height(), offset.y());
+ const qreal startX = fixCoord(destinationRect.x(), mappedSize.width(), offset.x());
+ while (y <= destinationRect.bottom()) {
+ qreal x = startX;
+ while (x <= destinationRect.right()) {
+ const DFBRectangle destination = { qRound(x), qRound(y), mappedSize.width(), mappedSize.height() };
+ surface->StretchBlit(surface, sourceSurface, 0, &destination);
+ x += mappedSize.width();
+ }
+ y += mappedSize.height();
+ }
+ } else {
+ qreal y = fixCoord(destinationRect.y(), pixmapSize.height(), offset.y());
+ const qreal startX = fixCoord(destinationRect.x(), pixmapSize.width(), offset.x());
+ int horizontal = qMax(1, destinationRect.width() / pixmapSize.width()) + 1;
+ if (startX != destinationRect.x())
+ ++horizontal;
+ int vertical = qMax(1, destinationRect.height() / pixmapSize.height()) + 1;
+ if (y != destinationRect.y())
+ ++vertical;
+
+ const int maxCount = (vertical * horizontal);
+ QVarLengthArray<DFBRectangle, 16> sourceRects(maxCount);
+ QVarLengthArray<DFBPoint, 16> points(maxCount);
+
+ int i = 0;
+ while (y <= destinationRect.bottom()) {
+ Q_ASSERT(i < maxCount);
+ qreal x = startX;
+ while (x <= destinationRect.right()) {
+ points[i].x = qRound(x);
+ points[i].y = qRound(y);
+ sourceRects[i].x = 0;
+ sourceRects[i].y = 0;
+ sourceRects[i].w = int(pixmapSize.width());
+ sourceRects[i].h = int(pixmapSize.height());
+ x += pixmapSize.width();
+ ++i;
+ }
+ y += pixmapSize.height();
+ }
+ surface->BatchBlit(surface, sourceSurface, sourceRects.constData(), points.constData(), i);
+ }
+
+ if (currentClip.isEmpty()) {
+ surface->SetClip(surface, 0);
+ } else {
+ const DFBRegion clip = {
+ currentClip.x(),
+ currentClip.y(),
+ currentClip.right(),
+ currentClip.bottom()
+ };
+ surface->SetClip(surface, &clip);
+ }
+}
+
+void QDirectFBPaintEnginePrivate::updateClip()
+{
+ Q_ASSERT(surface);
+ currentClip = QRect();
+ const QClipData *clipData = clip();
+ if (!clipData || !clipData->enabled) {
+ surface->SetClip(surface, NULL);
+ clipType = NoClip;
+ } else if (clipData->hasRectClip) {
+ const DFBRegion r = {
+ clipData->clipRect.x(),
+ clipData->clipRect.y(),
+ clipData->clipRect.right(),
+ clipData->clipRect.bottom()
+ };
+ surface->SetClip(surface, &r);
+ currentClip = clipData->clipRect.normalized();
+ // ### is this guaranteed to always be normalized?
+ clipType = RectClip;
+ } else if (clipData->hasRegionClip) {
+ clipType = RegionClip;
+ } else {
+ clipType = ComplexClip;
+ }
+}
+
+bool QDirectFBPaintEnginePrivate::supportsStretchBlit() const
+{
+#ifdef QT_DIRECTFB_STRETCHBLIT
+ return !(q->state()->renderHints & QPainter::SmoothPixmapTransform);
+#else
+ return false;
+#endif
+}
+
+
+void QDirectFBPaintEnginePrivate::systemStateChanged()
+{
+ QRasterPaintEnginePrivate::systemStateChanged();
+ updateClip();
+}
+
+IDirectFBSurface *SurfaceCache::getSurface(const uint *buf, int size)
+{
+ if (buffer == buf && bufsize == size)
+ return surface;
+
+ clear();
+
+ const DFBSurfaceDescription description = QDirectFBScreen::getSurfaceDescription(buf, size);
+ surface = QDirectFBScreen::instance()->createDFBSurface(description, QDirectFBScreen::TrackSurface, 0);
+ if (!surface)
+ qWarning("QDirectFBPaintEngine: SurfaceCache: Unable to create surface");
+
+ buffer = const_cast<uint*>(buf);
+ bufsize = size;
+
+ return surface;
+}
+
+void SurfaceCache::clear()
+{
+ if (surface && QDirectFBScreen::instance())
+ QDirectFBScreen::instance()->releaseDFBSurface(surface);
+ surface = 0;
+ buffer = 0;
+ bufsize = 0;
+}
+
+
+static inline QRect mapRect(const QTransform &transform, const QRect &rect) { return transform.mapRect(rect); }
+static inline QRect mapRect(const QTransform &transform, const QRectF &rect) { return transform.mapRect(rect).toRect(); }
+static inline QLine map(const QTransform &transform, const QLine &line) { return transform.map(line); }
+static inline QLine map(const QTransform &transform, const QLineF &line) { return transform.map(line).toLine(); }
+template <class T>
+static inline void drawLines(const T *lines, int n, const QTransform &transform, IDirectFBSurface *surface)
+{
+ if (n == 1) {
+ const QLine l = map(transform, lines[0]);
+ surface->DrawLine(surface, l.x1(), l.y1(), l.x2(), l.y2());
+ } else {
+ QVarLengthArray<DFBRegion, 32> lineArray(n);
+ for (int i=0; i<n; ++i) {
+ const QLine l = map(transform, lines[i]);
+ lineArray[i].x1 = l.x1();
+ lineArray[i].y1 = l.y1();
+ lineArray[i].x2 = l.x2();
+ lineArray[i].y2 = l.y2();
+ }
+ surface->DrawLines(surface, lineArray.constData(), n);
+ }
+}
+
+template <class T>
+static inline void fillRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface)
+{
+ if (n == 1) {
+ const QRect r = mapRect(transform, rects[0]);
+ surface->FillRectangle(surface, r.x(), r.y(), r.width(), r.height());
+ } else {
+ QVarLengthArray<DFBRectangle, 32> rectArray(n);
+ for (int i=0; i<n; ++i) {
+ const QRect r = mapRect(transform, rects[i]);
+ rectArray[i].x = r.x();
+ rectArray[i].y = r.y();
+ rectArray[i].w = r.width();
+ rectArray[i].h = r.height();
+ }
+ surface->FillRectangles(surface, rectArray.constData(), n);
+ }
+}
+
+template <class T>
+static inline void drawRects(const T *rects, int n, const QTransform &transform, IDirectFBSurface *surface)
+{
+ for (int i=0; i<n; ++i) {
+ const QRect r = mapRect(transform, rects[i]);
+ surface->DrawRectangle(surface, r.x(), r.y(), r.width(), r.height());
+ }
+}
+
+template <typename T> inline const T *ptr(const T &t) { return &t; }
+template <> inline const bool* ptr<bool>(const bool &) { return 0; }
+template <typename device, typename T1, typename T2, typename T3>
+static void rasterFallbackWarn(const char *msg, const char *func, const device *dev,
+ uint transformationType, bool simplePen,
+ uint clipType, uint compositionModeStatus,
+ const char *nameOne, const T1 &one,
+ const char *nameTwo, const T2 &two,
+ const char *nameThree, const T3 &three)
+{
+ QString out;
+ QDebug dbg(&out);
+ dbg << msg << (QByteArray(func) + "()") << "painting on";
+ if (dev->devType() == QInternal::Widget) {
+ dbg << static_cast<const QWidget*>(dev);
+ } else {
+ dbg << dev << "of type" << dev->devType();
+ }
+
+ dbg << QString::fromLatin1("transformationType 0x%1").arg(transformationType, 3, 16, QLatin1Char('0'))
+ << "simplePen" << simplePen
+ << "clipType" << clipType
+ << "compositionModeStatus" << compositionModeStatus;
+
+ const T1 *t1 = ptr(one);
+ const T2 *t2 = ptr(two);
+ const T3 *t3 = ptr(three);
+
+ if (t1) {
+ dbg << nameOne << *t1;
+ if (t2) {
+ dbg << nameTwo << *t2;
+ if (t3) {
+ dbg << nameThree << *t3;
+ }
+ }
+ }
+ qWarning("%s", qPrintable(out));
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_DIRECTFB
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h
new file mode 100644
index 0000000000..1908f3ad32
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPAINTENGINE_DIRECTFB_P_H
+#define QPAINTENGINE_DIRECTFB_P_H
+
+#include <QtGui/qpaintengine.h>
+#include <private/qpaintengine_raster_p.h>
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QDirectFBPaintEnginePrivate;
+
+class QDirectFBPaintEngine : public QRasterPaintEngine
+{
+ Q_DECLARE_PRIVATE(QDirectFBPaintEngine)
+public:
+ QDirectFBPaintEngine(QPaintDevice *device);
+ virtual ~QDirectFBPaintEngine();
+
+ virtual bool begin(QPaintDevice *device);
+ virtual bool end();
+
+ virtual void drawRects(const QRect *rects, int rectCount);
+ virtual void drawRects(const QRectF *rects, int rectCount);
+
+ virtual void fillRect(const QRectF &r, const QBrush &brush);
+ virtual void fillRect(const QRectF &r, const QColor &color);
+
+ virtual void drawLines(const QLine *line, int lineCount);
+ virtual void drawLines(const QLineF *line, int lineCount);
+
+ virtual void drawImage(const QPointF &p, const QImage &img);
+ virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
+ Qt::ImageConversionFlags falgs = Qt::AutoColor);
+
+ virtual void drawPixmap(const QPointF &p, const QPixmap &pm);
+ virtual void drawPixmap(const QRectF &r, const QPixmap &pixmap, const QRectF &sr);
+ virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr);
+
+ virtual void drawBufferSpan(const uint *buffer, int bufsize,
+ int x, int y, int length, uint const_alpha);
+
+ virtual void stroke(const QVectorPath &path, const QPen &pen);
+ virtual void drawPath(const QPainterPath &path);
+ virtual void drawPoints(const QPointF *points, int pointCount);
+ virtual void drawPoints(const QPoint *points, int pointCount);
+ virtual void drawEllipse(const QRectF &rect);
+ virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
+ virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
+ virtual void drawTextItem(const QPointF &p, const QTextItem &textItem);
+ virtual void fill(const QVectorPath &path, const QBrush &brush);
+ virtual void drawRoundedRect(const QRectF &rect, qreal xrad, qreal yrad, Qt::SizeMode mode);
+
+ virtual void clipEnabledChanged();
+ virtual void penChanged();
+ virtual void opacityChanged();
+ virtual void compositionModeChanged();
+ virtual void renderHintsChanged();
+ virtual void transformChanged();
+
+ virtual void setState(QPainterState *state);
+
+ virtual void clip(const QVectorPath &path, Qt::ClipOperation op);
+ virtual void clip(const QRegion &region, Qt::ClipOperation op);
+ virtual void clip(const QRect &rect, Qt::ClipOperation op);
+
+ virtual void drawStaticTextItem(QStaticTextItem *item);
+
+ static void initImageCache(int size);
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_DIRECTFB
+
+#endif // QPAINTENGINE_DIRECTFB_P_H
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
new file mode 100644
index 0000000000..eaff74a41c
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
@@ -0,0 +1,588 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbpixmap.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+#include "qdirectfbscreen.h"
+#include "qdirectfbpaintengine.h"
+
+#include <QtGui/qbitmap.h>
+#include <QtCore/qfile.h>
+#include <directfb.h>
+
+
+QT_BEGIN_NAMESPACE
+
+static int global_ser_no = 0;
+
+QDirectFBPixmapData::QDirectFBPixmapData(QDirectFBScreen *screen, PixelType pixelType)
+ : QPixmapData(pixelType, DirectFBClass), QDirectFBPaintDevice(screen),
+ alpha(false)
+{
+ setSerialNumber(0);
+}
+
+QDirectFBPixmapData::~QDirectFBPixmapData()
+{
+}
+
+void QDirectFBPixmapData::resize(int width, int height)
+{
+ if (width <= 0 || height <= 0) {
+ invalidate();
+ return;
+ }
+
+ imageFormat = screen->pixelFormat();
+ dfbSurface = screen->createDFBSurface(QSize(width, height),
+ imageFormat,
+ QDirectFBScreen::TrackSurface);
+ d = QDirectFBScreen::depth(imageFormat);
+ alpha = false;
+ if (!dfbSurface) {
+ invalidate();
+ qWarning("QDirectFBPixmapData::resize(): Unable to allocate surface");
+ return;
+ }
+
+ w = width;
+ h = height;
+ is_null = (w <= 0 || h <= 0);
+ setSerialNumber(++global_ser_no);
+}
+
+#ifdef QT_DIRECTFB_OPAQUE_DETECTION
+// mostly duplicated from qimage.cpp (QImageData::checkForAlphaPixels)
+static bool checkForAlphaPixels(const QImage &img)
+{
+ const uchar *bits = img.bits();
+ const int bytes_per_line = img.bytesPerLine();
+ const uchar *end_bits = bits + bytes_per_line;
+ const int width = img.width();
+ const int height = img.height();
+ switch (img.format()) {
+ case QImage::Format_Indexed8:
+ return img.hasAlphaChannel();
+ case QImage::Format_ARGB32:
+ case QImage::Format_ARGB32_Premultiplied:
+ for (int y=0; y<height; ++y) {
+ for (int x=0; x<width; ++x) {
+ if ((((uint *)bits)[x] & 0xff000000) != 0xff000000) {
+ return true;
+ }
+ }
+ bits += bytes_per_line;
+ }
+ break;
+
+ case QImage::Format_ARGB8555_Premultiplied:
+ case QImage::Format_ARGB8565_Premultiplied:
+ for (int y=0; y<height; ++y) {
+ while (bits < end_bits) {
+ if (bits[0] != 0) {
+ return true;
+ }
+ bits += 3;
+ }
+ bits = end_bits;
+ end_bits += bytes_per_line;
+ }
+ break;
+
+ case QImage::Format_ARGB6666_Premultiplied:
+ for (int y=0; y<height; ++y) {
+ while (bits < end_bits) {
+ if ((bits[0] & 0xfc) != 0) {
+ return true;
+ }
+ bits += 3;
+ }
+ bits = end_bits;
+ end_bits += bytes_per_line;
+ }
+ break;
+
+ case QImage::Format_ARGB4444_Premultiplied:
+ for (int y=0; y<height; ++y) {
+ while (bits < end_bits) {
+ if ((bits[0] & 0xf0) != 0) {
+ return true;
+ }
+ bits += 2;
+ }
+ bits = end_bits;
+ end_bits += bytes_per_line;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+#endif // QT_DIRECTFB_OPAQUE_DETECTION
+
+bool QDirectFBPixmapData::hasAlphaChannel(const QImage &img, Qt::ImageConversionFlags flags)
+{
+ if (img.depth() == 1)
+ return true;
+#ifdef QT_DIRECTFB_OPAQUE_DETECTION
+ return ((flags & Qt::NoOpaqueDetection) ? img.hasAlphaChannel() : checkForAlphaPixels(img));
+#else
+ Q_UNUSED(flags);
+ return img.hasAlphaChannel();
+#endif
+}
+
+#ifdef QT_DIRECTFB_IMAGEPROVIDER
+bool QDirectFBPixmapData::fromFile(const QString &filename, const char *format,
+ Qt::ImageConversionFlags flags)
+{
+ if (!QFile::exists(filename))
+ return false;
+ if (flags == Qt::AutoColor) {
+ if (filename.startsWith(QLatin1Char(':'))) { // resource
+ QFile file(filename);
+ if (!file.open(QIODevice::ReadOnly))
+ return false;
+ const QByteArray data = file.readAll();
+ file.close();
+ return fromData(reinterpret_cast<const uchar*>(data.constData()), data.size(), format, flags);
+ } else {
+ DFBDataBufferDescription description;
+ description.flags = DBDESC_FILE;
+ const QByteArray fileNameData = filename.toLocal8Bit();
+ description.file = fileNameData.constData();
+ if (fromDataBufferDescription(description)) {
+ return true;
+ }
+ // fall back to Qt
+ }
+ }
+ return QPixmapData::fromFile(filename, format, flags);
+}
+
+bool QDirectFBPixmapData::fromData(const uchar *buffer, uint len, const char *format,
+ Qt::ImageConversionFlags flags)
+{
+ if (flags == Qt::AutoColor) {
+ DFBDataBufferDescription description;
+ description.flags = DBDESC_MEMORY;
+ description.memory.data = buffer;
+ description.memory.length = len;
+ if (fromDataBufferDescription(description))
+ return true;
+ // fall back to Qt
+ }
+ return QPixmapData::fromData(buffer, len, format, flags);
+}
+
+template <typename T> struct QDirectFBInterfaceCleanupHandler
+{
+ static void cleanup(T *t) { if (t) t->Release(t); }
+};
+
+template <typename T>
+class QDirectFBPointer : public QScopedPointer<T, QDirectFBInterfaceCleanupHandler<T> >
+{
+public:
+ QDirectFBPointer(T *t = 0)
+ : QScopedPointer<T, QDirectFBInterfaceCleanupHandler<T> >(t)
+ {}
+};
+
+bool QDirectFBPixmapData::fromDataBufferDescription(const DFBDataBufferDescription &dataBufferDescription)
+{
+ IDirectFB *dfb = screen->dfb();
+ Q_ASSERT(dfb);
+ DFBResult result = DFB_OK;
+ IDirectFBDataBuffer *dataBufferPtr;
+ if ((result = dfb->CreateDataBuffer(dfb, &dataBufferDescription, &dataBufferPtr)) != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::fromDataBufferDescription()", result);
+ return false;
+ }
+ QDirectFBPointer<IDirectFBDataBuffer> dataBuffer(dataBufferPtr);
+
+ IDirectFBImageProvider *providerPtr;
+ if ((result = dataBuffer->CreateImageProvider(dataBuffer.data(), &providerPtr)) != DFB_OK)
+ return false;
+
+ QDirectFBPointer<IDirectFBImageProvider> provider(providerPtr);
+
+ DFBImageDescription imageDescription;
+ result = provider->GetImageDescription(provider.data(), &imageDescription);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::fromSurfaceDescription(): Can't get image description", result);
+ return false;
+ }
+
+ if (imageDescription.caps & DICAPS_COLORKEY) {
+ return false;
+ }
+
+ DFBSurfaceDescription surfaceDescription;
+ if ((result = provider->GetSurfaceDescription(provider.data(), &surfaceDescription)) != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::fromDataBufferDescription(): Can't get surface description", result);
+ return false;
+ }
+
+ alpha = imageDescription.caps & DICAPS_ALPHACHANNEL;
+ imageFormat = alpha ? screen->alphaPixmapFormat() : screen->pixelFormat();
+
+ dfbSurface = screen->createDFBSurface(QSize(surfaceDescription.width, surfaceDescription.height),
+ imageFormat, QDirectFBScreen::TrackSurface);
+
+ result = provider->RenderTo(provider.data(), dfbSurface, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::fromSurfaceDescription(): Can't render to surface", result);
+ return false;
+ }
+
+ w = surfaceDescription.width;
+ h = surfaceDescription.height;
+ is_null = (w <= 0 || h <= 0);
+ d = QDirectFBScreen::depth(imageFormat);
+ setSerialNumber(++global_ser_no);
+
+#if defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+ screen->setDirectFBImageProvider(providerPtr);
+ provider.take();
+#endif
+
+ return true;
+}
+
+#endif
+
+void QDirectFBPixmapData::fromImage(const QImage &img, Qt::ImageConversionFlags flags)
+{
+ alpha = QDirectFBPixmapData::hasAlphaChannel(img, flags);
+ imageFormat = alpha ? screen->alphaPixmapFormat() : screen->pixelFormat();
+
+ QImage image;
+ if ((flags & ~Qt::NoOpaqueDetection) != Qt::AutoColor) {
+ image = img.convertToFormat(imageFormat, flags);
+ flags = Qt::AutoColor;
+ } else if (img.format() == QImage::Format_RGB32 || img.depth() == 1) {
+ image = img.convertToFormat(imageFormat, flags);
+ } else if (img.format() != imageFormat) {
+ image = img.convertToFormat(imageFormat, flags);
+ } else {
+ image = img;
+ }
+
+ dfbSurface = screen->createDFBSurface(image, image.format(), QDirectFBScreen::NoPreallocated | QDirectFBScreen::TrackSurface);
+ if (!dfbSurface) {
+ qWarning("QDirectFBPixmapData::fromImage()");
+ invalidate();
+ return;
+ }
+
+ w = image.width();
+ h = image.height();
+ is_null = (w <= 0 || h <= 0);
+ d = QDirectFBScreen::depth(imageFormat);
+ setSerialNumber(++global_ser_no);
+#ifdef QT_NO_DIRECTFB_OPAQUE_DETECTION
+ Q_UNUSED(flags);
+#endif
+}
+
+void QDirectFBPixmapData::copy(const QPixmapData *data, const QRect &rect)
+{
+ if (data->classId() != DirectFBClass) {
+ QPixmapData::copy(data, rect);
+ return;
+ }
+
+ const QDirectFBPixmapData *otherData = static_cast<const QDirectFBPixmapData*>(data);
+#ifdef QT_NO_DIRECTFB_SUBSURFACE
+ if (otherData->lockFlags()) {
+ const_cast<QDirectFBPixmapData*>(otherData)->unlockSurface();
+ }
+#endif
+ IDirectFBSurface *src = otherData->directFBSurface();
+ alpha = data->hasAlphaChannel();
+ imageFormat = (alpha
+ ? QDirectFBScreen::instance()->alphaPixmapFormat()
+ : QDirectFBScreen::instance()->pixelFormat());
+
+
+ dfbSurface = screen->createDFBSurface(rect.size(), imageFormat,
+ QDirectFBScreen::TrackSurface);
+ if (!dfbSurface) {
+ qWarning("QDirectFBPixmapData::copy()");
+ invalidate();
+ return;
+ }
+
+ if (alpha) {
+ dfbSurface->Clear(dfbSurface, 0, 0, 0, 0);
+ dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_BLEND_ALPHACHANNEL);
+ } else {
+ dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
+ }
+ const DFBRectangle blitRect = { rect.x(), rect.y(),
+ rect.width(), rect.height() };
+ w = rect.width();
+ h = rect.height();
+ d = otherData->d;
+ is_null = (w <= 0 || h <= 0);
+ unlockSurface();
+ DFBResult result = dfbSurface->Blit(dfbSurface, src, &blitRect, 0, 0);
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ dfbSurface->ReleaseSource(dfbSurface);
+#endif
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::copy()", result);
+ invalidate();
+ return;
+ }
+
+ setSerialNumber(++global_ser_no);
+}
+
+static inline bool isOpaqueFormat(QImage::Format format)
+{
+ switch (format) {
+ case QImage::Format_RGB32:
+ case QImage::Format_RGB16:
+ case QImage::Format_RGB666:
+ case QImage::Format_RGB555:
+ case QImage::Format_RGB888:
+ case QImage::Format_RGB444:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+void QDirectFBPixmapData::fill(const QColor &color)
+{
+ if (!serialNumber())
+ return;
+
+ Q_ASSERT(dfbSurface);
+
+ alpha |= (color.alpha() < 255);
+
+ if (alpha && isOpaqueFormat(imageFormat)) {
+ QSize size;
+ dfbSurface->GetSize(dfbSurface, &size.rwidth(), &size.rheight());
+ screen->releaseDFBSurface(dfbSurface);
+ imageFormat = screen->alphaPixmapFormat();
+ d = QDirectFBScreen::depth(imageFormat);
+ dfbSurface = screen->createDFBSurface(size, screen->alphaPixmapFormat(), QDirectFBScreen::TrackSurface);
+ setSerialNumber(++global_ser_no);
+ if (!dfbSurface) {
+ qWarning("QDirectFBPixmapData::fill()");
+ invalidate();
+ return;
+ }
+ }
+
+ dfbSurface->Clear(dfbSurface, color.red(), color.green(), color.blue(), color.alpha());
+}
+
+QPixmap QDirectFBPixmapData::transformed(const QTransform &transform,
+ Qt::TransformationMode mode) const
+{
+ QDirectFBPixmapData *that = const_cast<QDirectFBPixmapData*>(this);
+#ifdef QT_NO_DIRECTFB_SUBSURFACE
+ if (lockFlags())
+ that->unlockSurface();
+#endif
+
+ if (!dfbSurface || transform.type() != QTransform::TxScale
+ || mode != Qt::FastTransformation)
+ {
+ const QImage *image = that->buffer();
+ Q_ASSERT(image);
+ const QImage transformed = image->transformed(transform, mode);
+ QDirectFBPixmapData *data = new QDirectFBPixmapData(screen, QPixmapData::PixmapType);
+ data->fromImage(transformed, Qt::AutoColor);
+ return QPixmap(data);
+ }
+
+ const QSize size = transform.mapRect(QRect(0, 0, w, h)).size();
+ if (size.isEmpty())
+ return QPixmap();
+
+ QDirectFBPixmapData *data = new QDirectFBPixmapData(screen, QPixmapData::PixmapType);
+ data->setSerialNumber(++global_ser_no);
+ DFBSurfaceBlittingFlags flags = DSBLIT_NOFX;
+ data->alpha = alpha;
+ if (alpha) {
+ flags = DSBLIT_BLEND_ALPHACHANNEL;
+ }
+ data->dfbSurface = screen->createDFBSurface(size,
+ imageFormat,
+ QDirectFBScreen::TrackSurface);
+ if (flags & DSBLIT_BLEND_ALPHACHANNEL) {
+ data->dfbSurface->Clear(data->dfbSurface, 0, 0, 0, 0);
+ }
+ data->dfbSurface->SetBlittingFlags(data->dfbSurface, flags);
+
+ const DFBRectangle destRect = { 0, 0, size.width(), size.height() };
+ data->dfbSurface->StretchBlit(data->dfbSurface, dfbSurface, 0, &destRect);
+ data->w = size.width();
+ data->h = size.height();
+ data->is_null = (data->w <= 0 || data->h <= 0);
+
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ data->dfbSurface->ReleaseSource(data->dfbSurface);
+#endif
+ return QPixmap(data);
+}
+
+QImage QDirectFBPixmapData::toImage() const
+{
+ if (!dfbSurface)
+ return QImage();
+
+#if 0
+ // In later versions of DirectFB one can set a flag to tell
+ // DirectFB not to move the surface to videomemory. When that
+ // happens we can use this (hopefully faster) codepath
+#ifndef QT_NO_DIRECTFB_PREALLOCATED
+ QImage ret(w, h, QDirectFBScreen::getImageFormat(dfbSurface));
+ if (IDirectFBSurface *imgSurface = screen->createDFBSurface(ret, QDirectFBScreen::DontTrackSurface)) {
+ if (hasAlphaChannel()) {
+ imgSurface->SetBlittingFlags(imgSurface, DSBLIT_BLEND_ALPHACHANNEL);
+ imgSurface->Clear(imgSurface, 0, 0, 0, 0);
+ } else {
+ imgSurface->SetBlittingFlags(imgSurface, DSBLIT_NOFX);
+ }
+ imgSurface->Blit(imgSurface, dfbSurface, 0, 0, 0);
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ imgSurface->ReleaseSource(imgSurface);
+#endif
+ imgSurface->Release(imgSurface);
+ return ret;
+ }
+#endif
+#endif
+
+ QDirectFBPixmapData *that = const_cast<QDirectFBPixmapData*>(this);
+ const QImage *img = that->buffer();
+ return img->copy();
+}
+
+/* This is QPixmapData::paintEngine(), not QPaintDevice::paintEngine() */
+
+QPaintEngine *QDirectFBPixmapData::paintEngine() const
+{
+ if (!engine) {
+ // QDirectFBPixmapData is also a QCustomRasterPaintDevice, so pass
+ // that to the paint engine:
+ QDirectFBPixmapData *that = const_cast<QDirectFBPixmapData*>(this);
+ that->engine = new QDirectFBPaintEngine(that);
+ }
+ return engine;
+}
+
+QImage *QDirectFBPixmapData::buffer()
+{
+ if (!lockFlgs) {
+ lockSurface(DSLF_READ|DSLF_WRITE);
+ }
+ Q_ASSERT(lockFlgs);
+ Q_ASSERT(!lockedImage.isNull());
+ return &lockedImage;
+}
+
+
+bool QDirectFBPixmapData::scroll(int dx, int dy, const QRect &rect)
+{
+ if (!dfbSurface) {
+ return false;
+ }
+ unlockSurface();
+ DFBResult result = dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::scroll", result);
+ return false;
+ }
+ result = dfbSurface->SetPorterDuff(dfbSurface, DSPD_NONE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::scroll", result);
+ return false;
+ }
+
+ const DFBRectangle source = { rect.x(), rect.y(), rect.width(), rect.height() };
+ result = dfbSurface->Blit(dfbSurface, dfbSurface, &source, source.x + dx, source.y + dy);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBPixmapData::scroll", result);
+ return false;
+ }
+
+ return true;
+}
+
+void QDirectFBPixmapData::invalidate()
+{
+ if (dfbSurface) {
+ screen->releaseDFBSurface(dfbSurface);
+ dfbSurface = 0;
+ }
+ setSerialNumber(0);
+ alpha = false;
+ d = w = h = 0;
+ is_null = true;
+ imageFormat = QImage::Format_Invalid;
+}
+
+Q_GUI_EXPORT IDirectFBSurface *qt_directfb_surface_for_pixmap(const QPixmap &pixmap)
+{
+ const QPixmapData *data = pixmap.pixmapData();
+ if (!data || data->classId() != QPixmapData::DirectFBClass)
+ return 0;
+ const QDirectFBPixmapData *dfbData = static_cast<const QDirectFBPixmapData*>(data);
+ return dfbData->directFBSurface();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_DIRECTFB
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.h b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.h
new file mode 100644
index 0000000000..f8e3fa1d84
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBPIXMAP_H
+#define QDIRECTFBPIXMAP_H
+
+#include <qglobal.h>
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+#include <QtGui/private/qpixmapdata_p.h>
+#include <QtGui/private/qpaintengine_raster_p.h>
+#include "qdirectfbpaintdevice.h"
+#include <directfb.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QDirectFBPaintEngine;
+
+class QDirectFBPixmapData : public QPixmapData, public QDirectFBPaintDevice
+{
+public:
+ QDirectFBPixmapData(QDirectFBScreen *screen, PixelType pixelType);
+ ~QDirectFBPixmapData();
+
+ // Re-implemented from QPixmapData:
+ virtual void resize(int width, int height);
+ virtual void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
+#ifdef QT_DIRECTFB_IMAGEPROVIDER
+ virtual bool fromFile(const QString &filename, const char *format,
+ Qt::ImageConversionFlags flags);
+ virtual bool fromData(const uchar *buffer, uint len, const char *format,
+ Qt::ImageConversionFlags flags);
+#endif
+ virtual void copy(const QPixmapData *data, const QRect &rect);
+ virtual void fill(const QColor &color);
+ virtual QPixmap transformed(const QTransform &matrix,
+ Qt::TransformationMode mode) const;
+ virtual QImage toImage() const;
+ virtual QPaintEngine *paintEngine() const;
+ virtual QImage *buffer();
+ virtual bool scroll(int dx, int dy, const QRect &rect);
+ // Pure virtual in QPixmapData, so re-implement here and delegate to QDirectFBPaintDevice
+ virtual int metric(QPaintDevice::PaintDeviceMetric m) const { return QDirectFBPaintDevice::metric(m); }
+
+ inline QImage::Format pixelFormat() const { return imageFormat; }
+ inline bool hasAlphaChannel() const { return alpha; }
+ static bool hasAlphaChannel(const QImage &img, Qt::ImageConversionFlags flags = Qt::AutoColor);
+private:
+#ifdef QT_DIRECTFB_IMAGEPROVIDER
+ bool fromDataBufferDescription(const DFBDataBufferDescription &dataBuffer);
+#endif
+ void invalidate();
+ bool alpha;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_DIRECTFB
+
+#endif // QDIRECTFBPIXMAP_H
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
new file mode 100644
index 0000000000..ff15078ee4
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
@@ -0,0 +1,1819 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbscreen.h"
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbpixmap.h"
+#include "qdirectfbmouse.h"
+#include "qdirectfbkeyboard.h"
+#include <QtGui/qwsdisplay_qws.h>
+#include <QtGui/qcolor.h>
+#include <QtGui/qapplication.h>
+#include <QtGui/qwindowsystem_qws.h>
+#include <QtGui/private/qgraphicssystem_qws_p.h>
+#include <QtGui/private/qwssignalhandler_p.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qrect.h>
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFBScreenPrivate : public QObject, public QWSGraphicsSystem
+{
+ Q_OBJECT
+public:
+ QDirectFBScreenPrivate(QDirectFBScreen *qptr);
+ ~QDirectFBScreenPrivate();
+
+ void setFlipFlags(const QStringList &args);
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+public slots:
+#ifdef QT_DIRECTFB_WM
+ void onWindowEvent(QWSWindow *window, QWSServer::WindowEvent event);
+#endif
+public:
+ IDirectFB *dfb;
+ DFBSurfaceFlipFlags flipFlags;
+ QDirectFBScreen::DirectFBFlags directFBFlags;
+ QImage::Format alphaPixmapFormat;
+ IDirectFBScreen *dfbScreen;
+#ifdef QT_NO_DIRECTFB_WM
+ IDirectFBSurface *primarySurface;
+ QColor backgroundColor;
+#endif
+#ifndef QT_NO_DIRECTFB_LAYER
+ IDirectFBDisplayLayer *dfbLayer;
+#endif
+ QSet<IDirectFBSurface*> allocatedSurfaces;
+
+#ifndef QT_NO_DIRECTFB_MOUSE
+ QDirectFBMouseHandler *mouse;
+#endif
+#ifndef QT_NO_DIRECTFB_KEYBOARD
+ QDirectFBKeyboardHandler *keyboard;
+#endif
+#if defined QT_DIRECTFB_IMAGEPROVIDER && defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+ IDirectFBImageProvider *imageProvider;
+#endif
+ IDirectFBSurface *cursorSurface;
+ qint64 cursorImageKey;
+
+ QDirectFBScreen *q;
+ static QDirectFBScreen *instance;
+};
+
+QDirectFBScreen *QDirectFBScreenPrivate::instance = 0;
+
+QDirectFBScreenPrivate::QDirectFBScreenPrivate(QDirectFBScreen *qptr)
+ : QWSGraphicsSystem(qptr), dfb(0), flipFlags(DSFLIP_NONE),
+ directFBFlags(QDirectFBScreen::NoFlags), alphaPixmapFormat(QImage::Format_Invalid),
+ dfbScreen(0)
+#ifdef QT_NO_DIRECTFB_WM
+ , primarySurface(0)
+#endif
+#ifndef QT_NO_DIRECTFB_LAYER
+ , dfbLayer(0)
+#endif
+#ifndef QT_NO_DIRECTFB_MOUSE
+ , mouse(0)
+#endif
+#ifndef QT_NO_DIRECTFB_KEYBOARD
+ , keyboard(0)
+#endif
+#if defined QT_DIRECTFB_IMAGEPROVIDER && defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+ , imageProvider(0)
+#endif
+ , cursorSurface(0)
+ , cursorImageKey(0)
+ , q(qptr)
+{
+#ifndef QT_NO_QWS_SIGNALHANDLER
+ QWSSignalHandler::instance()->addObject(this);
+#endif
+#ifdef QT_DIRECTFB_WM
+ connect(QWSServer::instance(), SIGNAL(windowEvent(QWSWindow*,QWSServer::WindowEvent)),
+ this, SLOT(onWindowEvent(QWSWindow*,QWSServer::WindowEvent)));
+#endif
+}
+
+QDirectFBScreenPrivate::~QDirectFBScreenPrivate()
+{
+#ifndef QT_NO_DIRECTFB_MOUSE
+ delete mouse;
+#endif
+#ifndef QT_NO_DIRECTFB_KEYBOARD
+ delete keyboard;
+#endif
+#if defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+ if (imageProvider)
+ imageProvider->Release(imageProvider);
+#endif
+
+ for (QSet<IDirectFBSurface*>::const_iterator it = allocatedSurfaces.begin(); it != allocatedSurfaces.end(); ++it) {
+ (*it)->Release(*it);
+ }
+
+#ifdef QT_NO_DIRECTFB_WM
+ if (primarySurface)
+ primarySurface->Release(primarySurface);
+#endif
+
+#ifndef QT_NO_DIRECTFB_LAYER
+ if (dfbLayer)
+ dfbLayer->Release(dfbLayer);
+#endif
+
+ if (dfbScreen)
+ dfbScreen->Release(dfbScreen);
+
+ if (dfb)
+ dfb->Release(dfb);
+}
+
+IDirectFBSurface *QDirectFBScreen::createDFBSurface(const QImage &image, QImage::Format format, SurfaceCreationOptions options, DFBResult *resultPtr)
+{
+ if (image.isNull()) // assert?
+ return 0;
+
+ if (QDirectFBScreen::getSurfacePixelFormat(format) == DSPF_UNKNOWN) {
+ format = QDirectFBPixmapData::hasAlphaChannel(image) ? d_ptr->alphaPixmapFormat : pixelFormat();
+ }
+ if (image.format() != format) {
+ return createDFBSurface(image.convertToFormat(format), format, options | NoPreallocated, resultPtr);
+ }
+
+ DFBSurfaceDescription description;
+ memset(&description, 0, sizeof(DFBSurfaceDescription));
+ description.width = image.width();
+ description.height = image.height();
+ description.flags = DSDESC_WIDTH|DSDESC_HEIGHT|DSDESC_PIXELFORMAT;
+ initSurfaceDescriptionPixelFormat(&description, format);
+ bool doMemCopy = true;
+#ifdef QT_DIRECTFB_PREALLOCATED
+ if (!(options & NoPreallocated)) {
+ doMemCopy = false;
+ description.flags |= DSDESC_PREALLOCATED;
+ description.preallocated[0].data = const_cast<uchar*>(image.bits());
+ description.preallocated[0].pitch = image.bytesPerLine();
+ description.preallocated[1].data = 0;
+ description.preallocated[1].pitch = 0;
+ }
+#endif
+ DFBResult result;
+ IDirectFBSurface *surface = createDFBSurface(description, options, &result);
+ if (resultPtr)
+ *resultPtr = result;
+ if (!surface) {
+ DirectFBError("Couldn't create surface createDFBSurface(QImage, QImage::Format, SurfaceCreationOptions)", result);
+ return 0;
+ }
+ if (doMemCopy) {
+ int bplDFB;
+ uchar *mem = QDirectFBScreen::lockSurface(surface, DSLF_WRITE, &bplDFB);
+ if (mem) {
+ const int height = image.height();
+ const int bplQt = image.bytesPerLine();
+ if (bplQt == bplDFB && bplQt == (image.width() * image.depth() / 8)) {
+ memcpy(mem, image.bits(), image.byteCount());
+ } else {
+ for (int i=0; i<height; ++i) {
+ memcpy(mem, image.scanLine(i), bplQt);
+ mem += bplDFB;
+ }
+ }
+ surface->Unlock(surface);
+ }
+ }
+#ifdef QT_DIRECTFB_PALETTE
+ if (image.colorCount() != 0 && surface)
+ QDirectFBScreen::setSurfaceColorTable(surface, image);
+#endif
+ return surface;
+}
+
+IDirectFBSurface *QDirectFBScreen::copyDFBSurface(IDirectFBSurface *src,
+ QImage::Format format,
+ SurfaceCreationOptions options,
+ DFBResult *result)
+{
+ Q_ASSERT(src);
+ QSize size;
+ src->GetSize(src, &size.rwidth(), &size.rheight());
+ IDirectFBSurface *surface = createDFBSurface(size, format, options, result);
+ DFBSurfaceBlittingFlags flags = QDirectFBScreen::hasAlphaChannel(surface)
+ ? DSBLIT_BLEND_ALPHACHANNEL
+ : DSBLIT_NOFX;
+ if (flags & DSBLIT_BLEND_ALPHACHANNEL)
+ surface->Clear(surface, 0, 0, 0, 0);
+
+ surface->SetBlittingFlags(surface, flags);
+ surface->Blit(surface, src, 0, 0, 0);
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ surface->ReleaseSource(surface);
+#endif
+ return surface;
+}
+
+IDirectFBSurface *QDirectFBScreen::createDFBSurface(const QSize &size,
+ QImage::Format format,
+ SurfaceCreationOptions options,
+ DFBResult *result)
+{
+ DFBSurfaceDescription desc;
+ memset(&desc, 0, sizeof(DFBSurfaceDescription));
+ desc.flags |= DSDESC_WIDTH|DSDESC_HEIGHT;
+ if (!QDirectFBScreen::initSurfaceDescriptionPixelFormat(&desc, format))
+ return 0;
+ desc.width = size.width();
+ desc.height = size.height();
+ return createDFBSurface(desc, options, result);
+}
+
+IDirectFBSurface *QDirectFBScreen::createDFBSurface(DFBSurfaceDescription desc, SurfaceCreationOptions options, DFBResult *resultPtr)
+{
+ DFBResult tmp;
+ DFBResult &result = (resultPtr ? *resultPtr : tmp);
+ result = DFB_OK;
+ IDirectFBSurface *newSurface = 0;
+
+ if (!d_ptr->dfb) {
+ qWarning("QDirectFBScreen::createDFBSurface() - not connected");
+ return 0;
+ }
+
+ if (d_ptr->directFBFlags & VideoOnly
+ && !(desc.flags & DSDESC_PREALLOCATED)
+ && (!(desc.flags & DSDESC_CAPS) || !(desc.caps & DSCAPS_SYSTEMONLY))) {
+ // Add the video only capability. This means the surface will be created in video ram
+ if (!(desc.flags & DSDESC_CAPS)) {
+ desc.caps = DSCAPS_VIDEOONLY;
+ desc.flags |= DSDESC_CAPS;
+ } else {
+ desc.caps |= DSCAPS_VIDEOONLY;
+ }
+ result = d_ptr->dfb->CreateSurface(d_ptr->dfb, &desc, &newSurface);
+ if (result != DFB_OK
+#ifdef QT_NO_DEBUG
+ && (desc.flags & DSDESC_CAPS) && (desc.caps & DSCAPS_PRIMARY)
+#endif
+ ) {
+ qWarning("QDirectFBScreen::createDFBSurface() Failed to create surface in video memory!\n"
+ " Flags %0x Caps %0x width %d height %d pixelformat %0x %d preallocated %p %d\n%s",
+ desc.flags, desc.caps, desc.width, desc.height,
+ desc.pixelformat, DFB_PIXELFORMAT_INDEX(desc.pixelformat),
+ desc.preallocated[0].data, desc.preallocated[0].pitch,
+ DirectFBErrorString(result));
+ }
+ desc.caps &= ~DSCAPS_VIDEOONLY;
+ }
+
+ if (d_ptr->directFBFlags & SystemOnly)
+ desc.caps |= DSCAPS_SYSTEMONLY;
+
+ if (!newSurface)
+ result = d_ptr->dfb->CreateSurface(d_ptr->dfb, &desc, &newSurface);
+
+ if (result != DFB_OK) {
+ qWarning("QDirectFBScreen::createDFBSurface() Failed!\n"
+ " Flags %0x Caps %0x width %d height %d pixelformat %0x %d preallocated %p %d\n%s",
+ desc.flags, desc.caps, desc.width, desc.height,
+ desc.pixelformat, DFB_PIXELFORMAT_INDEX(desc.pixelformat),
+ desc.preallocated[0].data, desc.preallocated[0].pitch,
+ DirectFBErrorString(result));
+ return 0;
+ }
+
+ Q_ASSERT(newSurface);
+
+ if (options & TrackSurface) {
+ d_ptr->allocatedSurfaces.insert(newSurface);
+ }
+
+ return newSurface;
+}
+
+#ifdef QT_DIRECTFB_SUBSURFACE
+IDirectFBSurface *QDirectFBScreen::getSubSurface(IDirectFBSurface *surface,
+ const QRect &rect,
+ SurfaceCreationOptions options,
+ DFBResult *resultPtr)
+{
+ Q_ASSERT(!(options & NoPreallocated));
+ Q_ASSERT(surface);
+ DFBResult res;
+ DFBResult &result = (resultPtr ? *resultPtr : res);
+ IDirectFBSurface *subSurface = 0;
+ if (rect.isNull()) {
+ result = surface->GetSubSurface(surface, 0, &subSurface);
+ } else {
+ const DFBRectangle subRect = { rect.x(), rect.y(), rect.width(), rect.height() };
+ result = surface->GetSubSurface(surface, &subRect, &subSurface);
+ }
+ if (result != DFB_OK) {
+ DirectFBError("Can't get sub surface", result);
+ } else if (options & TrackSurface) {
+ d_ptr->allocatedSurfaces.insert(subSurface);
+ }
+ return subSurface;
+}
+#endif
+
+
+void QDirectFBScreen::releaseDFBSurface(IDirectFBSurface *surface)
+{
+ Q_ASSERT(QDirectFBScreen::instance());
+ Q_ASSERT(surface);
+ surface->Release(surface);
+ if (!d_ptr->allocatedSurfaces.remove(surface))
+ qWarning("QDirectFBScreen::releaseDFBSurface() - %p not in list", surface);
+
+ //qDebug("Released surface at %p. New count = %d", surface, d_ptr->allocatedSurfaces.count());
+}
+
+QDirectFBScreen::DirectFBFlags QDirectFBScreen::directFBFlags() const
+{
+ return d_ptr->directFBFlags;
+}
+
+IDirectFB *QDirectFBScreen::dfb()
+{
+ return d_ptr->dfb;
+}
+
+#ifdef QT_NO_DIRECTFB_WM
+IDirectFBSurface *QDirectFBScreen::primarySurface()
+{
+ return d_ptr->primarySurface;
+}
+#endif
+
+#ifndef QT_NO_DIRECTFB_LAYER
+IDirectFBDisplayLayer *QDirectFBScreen::dfbDisplayLayer()
+{
+ return d_ptr->dfbLayer;
+}
+#endif
+
+DFBSurfacePixelFormat QDirectFBScreen::getSurfacePixelFormat(QImage::Format format)
+{
+ switch (format) {
+#ifndef QT_NO_DIRECTFB_PALETTE
+ case QImage::Format_Indexed8:
+ return DSPF_LUT8;
+#endif
+ case QImage::Format_RGB888:
+ return DSPF_RGB24;
+ case QImage::Format_ARGB4444_Premultiplied:
+ return DSPF_ARGB4444;
+#if (Q_DIRECTFB_VERSION >= 0x010100)
+ case QImage::Format_RGB444:
+ return DSPF_RGB444;
+ case QImage::Format_RGB555:
+ return DSPF_RGB555;
+#endif
+ case QImage::Format_RGB16:
+ return DSPF_RGB16;
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ case QImage::Format_ARGB6666_Premultiplied:
+ return DSPF_ARGB6666;
+ case QImage::Format_RGB666:
+ return DSPF_RGB18;
+#endif
+ case QImage::Format_RGB32:
+ return DSPF_RGB32;
+ case QImage::Format_ARGB32_Premultiplied:
+ case QImage::Format_ARGB32:
+ return DSPF_ARGB;
+ default:
+ return DSPF_UNKNOWN;
+ };
+}
+
+QImage::Format QDirectFBScreen::getImageFormat(IDirectFBSurface *surface)
+{
+ DFBSurfacePixelFormat format;
+ surface->GetPixelFormat(surface, &format);
+
+ switch (format) {
+ case DSPF_LUT8:
+ return QImage::Format_Indexed8;
+ case DSPF_RGB24:
+ return QImage::Format_RGB888;
+ case DSPF_ARGB4444:
+ return QImage::Format_ARGB4444_Premultiplied;
+#if (Q_DIRECTFB_VERSION >= 0x010100)
+ case DSPF_RGB444:
+ return QImage::Format_RGB444;
+ case DSPF_RGB555:
+#endif
+ case DSPF_ARGB1555:
+ return QImage::Format_RGB555;
+ case DSPF_RGB16:
+ return QImage::Format_RGB16;
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ case DSPF_ARGB6666:
+ return QImage::Format_ARGB6666_Premultiplied;
+ case DSPF_RGB18:
+ return QImage::Format_RGB666;
+#endif
+ case DSPF_RGB32:
+ return QImage::Format_RGB32;
+ case DSPF_ARGB: {
+ DFBSurfaceCapabilities caps;
+ const DFBResult result = surface->GetCapabilities(surface, &caps);
+ Q_ASSERT(result == DFB_OK);
+ Q_UNUSED(result);
+ return (caps & DSCAPS_PREMULTIPLIED
+ ? QImage::Format_ARGB32_Premultiplied
+ : QImage::Format_ARGB32); }
+ default:
+ break;
+ }
+ return QImage::Format_Invalid;
+}
+
+DFBSurfaceDescription QDirectFBScreen::getSurfaceDescription(const uint *buffer,
+ int length)
+{
+ DFBSurfaceDescription description;
+ memset(&description, 0, sizeof(DFBSurfaceDescription));
+
+ description.flags = DSDESC_CAPS|DSDESC_WIDTH|DSDESC_HEIGHT|DSDESC_PIXELFORMAT|DSDESC_PREALLOCATED;
+ description.caps = DSCAPS_PREMULTIPLIED;
+ description.width = length;
+ description.height = 1;
+ description.pixelformat = DSPF_ARGB;
+ description.preallocated[0].data = (void*)buffer;
+ description.preallocated[0].pitch = length * sizeof(uint);
+ description.preallocated[1].data = 0;
+ description.preallocated[1].pitch = 0;
+ return description;
+}
+
+#ifndef QT_NO_DIRECTFB_PALETTE
+void QDirectFBScreen::setSurfaceColorTable(IDirectFBSurface *surface,
+ const QImage &image)
+{
+ if (!surface)
+ return;
+
+ const int numColors = image.colorCount();
+ if (numColors == 0)
+ return;
+
+ QVarLengthArray<DFBColor, 256> colors(numColors);
+ for (int i = 0; i < numColors; ++i) {
+ QRgb c = image.color(i);
+ colors[i].a = qAlpha(c);
+ colors[i].r = qRed(c);
+ colors[i].g = qGreen(c);
+ colors[i].b = qBlue(c);
+ }
+
+ IDirectFBPalette *palette;
+ DFBResult result;
+ result = surface->GetPalette(surface, &palette);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::setSurfaceColorTable GetPalette",
+ result);
+ return;
+ }
+ result = palette->SetEntries(palette, colors.data(), numColors, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::setSurfaceColorTable SetEntries",
+ result);
+ }
+ palette->Release(palette);
+}
+
+#endif // QT_NO_DIRECTFB_PALETTE
+
+#if defined QT_DIRECTFB_CURSOR
+class Q_GUI_EXPORT QDirectFBScreenCursor : public QScreenCursor
+{
+public:
+ QDirectFBScreenCursor();
+ virtual void set(const QImage &image, int hotx, int hoty);
+ virtual void move(int x, int y);
+ virtual void show();
+ virtual void hide();
+private:
+#ifdef QT_DIRECTFB_WINDOW_AS_CURSOR
+ ~QDirectFBScreenCursor();
+ bool createWindow();
+ IDirectFBWindow *window;
+#endif
+ IDirectFBDisplayLayer *layer;
+};
+
+QDirectFBScreenCursor::QDirectFBScreenCursor()
+{
+ IDirectFB *fb = QDirectFBScreen::instance()->dfb();
+ if (!fb)
+ qFatal("QDirectFBScreenCursor: DirectFB not initialized");
+
+ layer = QDirectFBScreen::instance()->dfbDisplayLayer();
+ Q_ASSERT(layer);
+
+ enable = false;
+ hwaccel = true;
+ supportsAlpha = true;
+#ifdef QT_DIRECTFB_WINDOW_AS_CURSOR
+ window = 0;
+ DFBResult result = layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set cooperative level", result);
+ }
+ result = layer->SetCursorOpacity(layer, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set cursor opacity", result);
+ }
+
+ result = layer->SetCooperativeLevel(layer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set cooperative level", result);
+ }
+#endif
+}
+
+#ifdef QT_DIRECTFB_WINDOW_AS_CURSOR
+QDirectFBScreenCursor::~QDirectFBScreenCursor()
+{
+ if (window) {
+ window->Release(window);
+ window = 0;
+ }
+}
+
+bool QDirectFBScreenCursor::createWindow()
+{
+ Q_ASSERT(!window);
+ Q_ASSERT(!cursor.isNull());
+ DFBWindowDescription description;
+ memset(&description, 0, sizeof(DFBWindowDescription));
+ description.flags = DWDESC_POSX|DWDESC_POSY|DWDESC_WIDTH|DWDESC_HEIGHT|DWDESC_CAPS|DWDESC_PIXELFORMAT|DWDESC_SURFACE_CAPS;
+ description.width = cursor.width();
+ description.height = cursor.height();
+ description.posx = pos.x() - hotspot.x();
+ description.posy = pos.y() - hotspot.y();
+#if (Q_DIRECTFB_VERSION >= 0x010100)
+ description.flags |= DWDESC_OPTIONS;
+ description.options = DWOP_GHOST|DWOP_ALPHACHANNEL;
+#endif
+ description.caps = DWCAPS_NODECORATION|DWCAPS_DOUBLEBUFFER;
+ const QImage::Format format = QDirectFBScreen::instance()->alphaPixmapFormat();
+ description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(format);
+ if (QDirectFBScreen::isPremultiplied(format))
+ description.surface_caps = DSCAPS_PREMULTIPLIED;
+
+ DFBResult result = layer->CreateWindow(layer, &description, &window);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::createWindow: Unable to create window", result);
+ return false;
+ }
+ result = window->SetOpacity(window, 255);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::createWindow: Unable to set opacity ", result);
+ return false;
+ }
+
+ result = window->SetStackingClass(window, DWSC_UPPER);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::createWindow: Unable to set stacking class ", result);
+ return false;
+ }
+
+ result = window->RaiseToTop(window);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::createWindow: Unable to raise window ", result);
+ return false;
+ }
+
+ return true;
+}
+#endif
+
+void QDirectFBScreenCursor::move(int x, int y)
+{
+ pos = QPoint(x, y);
+#ifdef QT_DIRECTFB_WINDOW_AS_CURSOR
+ if (window) {
+ const QPoint p = pos - hotspot;
+ DFBResult result = window->MoveTo(window, p.x(), p.y());
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::move: Unable to move window", result);
+ }
+ }
+#else
+ layer->WarpCursor(layer, x, y);
+#endif
+}
+
+void QDirectFBScreenCursor::hide()
+{
+ if (enable) {
+ enable = false;
+ DFBResult result;
+#ifndef QT_DIRECTFB_WINDOW_AS_CURSOR
+ result = layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set cooperative level", result);
+ }
+ result = layer->SetCursorOpacity(layer, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set cursor opacity", result);
+ }
+ result = layer->SetCooperativeLevel(layer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set cooperative level", result);
+ }
+#else
+ if (window) {
+ result = window->SetOpacity(window, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::hide: "
+ "Unable to set window opacity", result);
+ }
+ }
+#endif
+ }
+}
+
+void QDirectFBScreenCursor::show()
+{
+ if (!enable) {
+ enable = true;
+ DFBResult result;
+ result = layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cooperative level", result);
+ }
+ result = layer->SetCursorOpacity(layer,
+#ifdef QT_DIRECTFB_WINDOW_AS_CURSOR
+ 0
+#else
+ 255
+#endif
+ );
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cursor shape", result);
+ }
+ result = layer->SetCooperativeLevel(layer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cooperative level", result);
+ }
+#ifdef QT_DIRECTFB_WINDOW_AS_CURSOR
+ if (window) {
+ DFBResult result = window->SetOpacity(window, 255);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set window opacity", result);
+ }
+ }
+#endif
+ }
+}
+
+void QDirectFBScreenCursor::set(const QImage &image, int hotx, int hoty)
+{
+ QDirectFBScreen *screen = QDirectFBScreen::instance();
+ if (!screen)
+ return;
+
+ if (image.isNull()) {
+ cursor = QImage();
+ hide();
+ } else {
+ cursor = image.convertToFormat(screen->alphaPixmapFormat());
+ size = cursor.size();
+ hotspot = QPoint(hotx, hoty);
+ DFBResult result = DFB_OK;
+ IDirectFBSurface *surface = screen->createDFBSurface(cursor, screen->alphaPixmapFormat(),
+ QDirectFBScreen::DontTrackSurface, &result);
+ if (!surface) {
+ DirectFBError("QDirectFBScreenCursor::set: Unable to create surface", result);
+ return;
+ }
+#ifndef QT_DIRECTFB_WINDOW_AS_CURSOR
+ result = layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cooperative level", result);
+ }
+ result = layer->SetCursorShape(layer, surface, hotx, hoty);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cursor shape", result);
+ }
+ result = layer->SetCooperativeLevel(layer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::show: "
+ "Unable to set cooperative level", result);
+ }
+#else
+ if (window || createWindow()) {
+ QSize windowSize;
+ result = window->GetSize(window, &windowSize.rwidth(), &windowSize.rheight());
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::set: "
+ "Unable to get window size", result);
+ }
+ result = window->Resize(window, size.width(), size.height());
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::set: Unable to resize window", result);
+ }
+
+ IDirectFBSurface *windowSurface;
+ result = window->GetSurface(window, &windowSurface);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::set: Unable to get window surface", result);
+ } else {
+ result = windowSurface->Clear(windowSurface, 0, 0, 0, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::set: Unable to clear surface", result);
+ }
+
+ result = windowSurface->Blit(windowSurface, surface, 0, 0, 0);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::set: Unable to blit to surface", result);
+ }
+ }
+ result = windowSurface->Flip(windowSurface, 0, DSFLIP_NONE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::set: Unable to flip window", result);
+ }
+
+ windowSurface->Release(windowSurface);
+ }
+#endif
+ surface->Release(surface);
+ show();
+ }
+
+}
+#endif // QT_DIRECTFB_CURSOR
+
+QDirectFBScreen::QDirectFBScreen(int display_id)
+ : QScreen(display_id, DirectFBClass), d_ptr(new QDirectFBScreenPrivate(this))
+{
+ QDirectFBScreenPrivate::instance = this;
+}
+
+QDirectFBScreen::~QDirectFBScreen()
+{
+ if (QDirectFBScreenPrivate::instance == this)
+ QDirectFBScreenPrivate::instance = 0;
+ delete d_ptr;
+}
+
+QDirectFBScreen *QDirectFBScreen::instance()
+{
+ return QDirectFBScreenPrivate::instance;
+}
+
+int QDirectFBScreen::depth(DFBSurfacePixelFormat format)
+{
+ switch (format) {
+ case DSPF_A1:
+ return 1;
+ case DSPF_A8:
+ case DSPF_RGB332:
+ case DSPF_LUT8:
+ case DSPF_ALUT44:
+ return 8;
+ case DSPF_I420:
+ case DSPF_YV12:
+ case DSPF_NV12:
+ case DSPF_NV21:
+#if (Q_DIRECTFB_VERSION >= 0x010100)
+ case DSPF_RGB444:
+#endif
+ return 12;
+#if (Q_DIRECTFB_VERSION >= 0x010100)
+ case DSPF_RGB555:
+ return 15;
+#endif
+ case DSPF_ARGB1555:
+ case DSPF_RGB16:
+ case DSPF_YUY2:
+ case DSPF_UYVY:
+ case DSPF_NV16:
+ case DSPF_ARGB2554:
+ case DSPF_ARGB4444:
+ return 16;
+ case DSPF_RGB24:
+ return 24;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ case DSPF_AiRGB:
+ return 32;
+ case DSPF_UNKNOWN:
+ default:
+ return 0;
+ };
+ return 0;
+}
+
+int QDirectFBScreen::depth(QImage::Format format)
+{
+ int depth = 0;
+ switch(format) {
+ case QImage::Format_Invalid:
+ case QImage::NImageFormats:
+ Q_ASSERT(false);
+ case QImage::Format_Mono:
+ case QImage::Format_MonoLSB:
+ depth = 1;
+ break;
+ case QImage::Format_Indexed8:
+ depth = 8;
+ break;
+ case QImage::Format_RGB32:
+ case QImage::Format_ARGB32:
+ case QImage::Format_ARGB32_Premultiplied:
+ depth = 32;
+ break;
+ case QImage::Format_RGB555:
+ case QImage::Format_RGB16:
+ case QImage::Format_RGB444:
+ case QImage::Format_ARGB4444_Premultiplied:
+ depth = 16;
+ break;
+ case QImage::Format_RGB666:
+ case QImage::Format_ARGB6666_Premultiplied:
+ case QImage::Format_ARGB8565_Premultiplied:
+ case QImage::Format_ARGB8555_Premultiplied:
+ case QImage::Format_RGB888:
+ depth = 24;
+ break;
+ }
+ return depth;
+}
+
+void QDirectFBScreenPrivate::setFlipFlags(const QStringList &args)
+{
+ QRegExp flipRegexp(QLatin1String("^flip=([\\w,]*)$"));
+ int index = args.indexOf(flipRegexp);
+ if (index >= 0) {
+ const QStringList flips = flipRegexp.cap(1).split(QLatin1Char(','),
+ QString::SkipEmptyParts);
+ flipFlags = DSFLIP_NONE;
+ foreach(const QString &flip, flips) {
+ if (flip == QLatin1String("wait"))
+ flipFlags |= DSFLIP_WAIT;
+ else if (flip == QLatin1String("blit"))
+ flipFlags |= DSFLIP_BLIT;
+ else if (flip == QLatin1String("onsync"))
+ flipFlags |= DSFLIP_ONSYNC;
+ else if (flip == QLatin1String("pipeline"))
+ flipFlags |= DSFLIP_PIPELINE;
+ else
+ qWarning("QDirectFBScreen: Unknown flip argument: %s",
+ qPrintable(flip));
+ }
+ } else {
+ flipFlags = DSFLIP_BLIT|DSFLIP_ONSYNC;
+ }
+}
+
+#ifdef QT_DIRECTFB_WM
+void QDirectFBScreenPrivate::onWindowEvent(QWSWindow *window, QWSServer::WindowEvent event)
+{
+ if (event == QWSServer::Raise) {
+ QWSWindowSurface *windowSurface = window->windowSurface();
+ if (windowSurface && windowSurface->key() == QLatin1String("directfb")) {
+ static_cast<QDirectFBWindowSurface*>(windowSurface)->raise();
+ }
+ }
+}
+#endif
+
+QPixmapData *QDirectFBScreenPrivate::createPixmapData(QPixmapData::PixelType type) const
+{
+ if (type == QPixmapData::BitmapType)
+ return QWSGraphicsSystem::createPixmapData(type);
+
+ return new QDirectFBPixmapData(q, type);
+}
+
+#if (Q_DIRECTFB_VERSION >= 0x000923)
+#ifdef QT_NO_DEBUG
+struct FlagDescription;
+static const FlagDescription *accelerationDescriptions = 0;
+static const FlagDescription *blitDescriptions = 0;
+static const FlagDescription *drawDescriptions = 0;
+#else
+struct FlagDescription {
+ const char *name;
+ uint flag;
+};
+
+static const FlagDescription accelerationDescriptions[] = {
+ { "DFXL_NONE", DFXL_NONE },
+ { "DFXL_FILLRECTANGLE", DFXL_FILLRECTANGLE },
+ { "DFXL_DRAWRECTANGLE", DFXL_DRAWRECTANGLE },
+ { "DFXL_DRAWLINE", DFXL_DRAWLINE },
+ { "DFXL_FILLTRIANGLE", DFXL_FILLTRIANGLE },
+ { "DFXL_BLIT", DFXL_BLIT },
+ { "DFXL_STRETCHBLIT", DFXL_STRETCHBLIT },
+ { "DFXL_TEXTRIANGLES", DFXL_TEXTRIANGLES },
+ { "DFXL_DRAWSTRING", DFXL_DRAWSTRING },
+ { 0, 0 }
+};
+
+static const FlagDescription blitDescriptions[] = {
+ { "DSBLIT_NOFX", DSBLIT_NOFX },
+ { "DSBLIT_BLEND_ALPHACHANNEL", DSBLIT_BLEND_ALPHACHANNEL },
+ { "DSBLIT_BLEND_COLORALPHA", DSBLIT_BLEND_COLORALPHA },
+ { "DSBLIT_COLORIZE", DSBLIT_COLORIZE },
+ { "DSBLIT_SRC_COLORKEY", DSBLIT_SRC_COLORKEY },
+ { "DSBLIT_DST_COLORKEY", DSBLIT_DST_COLORKEY },
+ { "DSBLIT_SRC_PREMULTIPLY", DSBLIT_SRC_PREMULTIPLY },
+ { "DSBLIT_DST_PREMULTIPLY", DSBLIT_DST_PREMULTIPLY },
+ { "DSBLIT_DEMULTIPLY", DSBLIT_DEMULTIPLY },
+ { "DSBLIT_DEINTERLACE", DSBLIT_DEINTERLACE },
+#if (Q_DIRECTFB_VERSION >= 0x000923)
+ { "DSBLIT_SRC_PREMULTCOLOR", DSBLIT_SRC_PREMULTCOLOR },
+ { "DSBLIT_XOR", DSBLIT_XOR },
+#endif
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ { "DSBLIT_INDEX_TRANSLATION", DSBLIT_INDEX_TRANSLATION },
+#endif
+ { 0, 0 }
+};
+
+static const FlagDescription drawDescriptions[] = {
+ { "DSDRAW_NOFX", DSDRAW_NOFX },
+ { "DSDRAW_BLEND", DSDRAW_BLEND },
+ { "DSDRAW_DST_COLORKEY", DSDRAW_DST_COLORKEY },
+ { "DSDRAW_SRC_PREMULTIPLY", DSDRAW_SRC_PREMULTIPLY },
+ { "DSDRAW_DST_PREMULTIPLY", DSDRAW_DST_PREMULTIPLY },
+ { "DSDRAW_DEMULTIPLY", DSDRAW_DEMULTIPLY },
+ { "DSDRAW_XOR", DSDRAW_XOR },
+ { 0, 0 }
+};
+#endif
+
+static const QByteArray flagDescriptions(uint mask, const FlagDescription *flags)
+{
+#ifdef QT_NO_DEBUG
+ Q_UNUSED(mask);
+ Q_UNUSED(flags);
+ return QByteArray("");
+#else
+ if (!mask)
+ return flags[0].name;
+
+ QStringList list;
+ for (int i=1; flags[i].name; ++i) {
+ if (mask & flags[i].flag) {
+ list.append(QString::fromLatin1(flags[i].name));
+ }
+ }
+ Q_ASSERT(!list.isEmpty());
+ return (QLatin1Char(' ') + list.join(QLatin1String("|"))).toLatin1();
+#endif
+}
+static void printDirectFBInfo(IDirectFB *fb, IDirectFBSurface *primarySurface)
+{
+ DFBResult result;
+ DFBGraphicsDeviceDescription dev;
+
+ result = fb->GetDeviceDescription(fb, &dev);
+ if (result != DFB_OK) {
+ DirectFBError("Error reading graphics device description", result);
+ return;
+ }
+
+ DFBSurfacePixelFormat pixelFormat;
+ primarySurface->GetPixelFormat(primarySurface, &pixelFormat);
+
+ qDebug("Device: %s (%s), Driver: %s v%i.%i (%s) Pixelformat: %d (%d)\n"
+ "acceleration: 0x%x%s\nblit: 0x%x%s\ndraw: 0x%0x%s\nvideo: %iKB\n",
+ dev.name, dev.vendor, dev.driver.name, dev.driver.major,
+ dev.driver.minor, dev.driver.vendor, DFB_PIXELFORMAT_INDEX(pixelFormat),
+ QDirectFBScreen::getImageFormat(primarySurface), dev.acceleration_mask,
+ flagDescriptions(dev.acceleration_mask, accelerationDescriptions).constData(),
+ dev.blitting_flags, flagDescriptions(dev.blitting_flags, blitDescriptions).constData(),
+ dev.drawing_flags, flagDescriptions(dev.drawing_flags, drawDescriptions).constData(),
+ (dev.video_memory >> 10));
+}
+#endif
+
+static inline bool setIntOption(const QStringList &arguments, const QString &variable, int *value)
+{
+ Q_ASSERT(value);
+ QRegExp rx(QString::fromLatin1("%1=?(\\d+)").arg(variable));
+ rx.setCaseSensitivity(Qt::CaseInsensitive);
+ if (arguments.indexOf(rx) != -1) {
+ *value = rx.cap(1).toInt();
+ return true;
+ }
+ return false;
+}
+
+static inline QColor colorFromName(const QString &name)
+{
+ QRegExp rx(QLatin1String("#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])"));
+ rx.setCaseSensitivity(Qt::CaseInsensitive);
+ if (rx.exactMatch(name)) {
+ Q_ASSERT(rx.captureCount() == 4);
+ int ints[4];
+ int i;
+ for (i=0; i<4; ++i) {
+ bool ok;
+ ints[i] = rx.cap(i + 1).toUInt(&ok, 16);
+ if (!ok || ints[i] > 255)
+ break;
+ }
+ if (i == 4)
+ return QColor(ints[0], ints[1], ints[2], ints[3]);
+ }
+ return QColor(name);
+}
+
+bool QDirectFBScreen::connect(const QString &displaySpec)
+{
+ DFBResult result = DFB_OK;
+
+ { // pass command line arguments to DirectFB
+ const QStringList args = QCoreApplication::arguments();
+ int argc = args.size();
+ char **argv = new char*[argc];
+
+ for (int i = 0; i < argc; ++i)
+ argv[i] = qstrdup(args.at(i).toLocal8Bit().constData());
+
+ result = DirectFBInit(&argc, &argv);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen: error initializing DirectFB",
+ result);
+ }
+ delete[] argv;
+ }
+
+ const QStringList displayArgs = displaySpec.split(QLatin1Char(':'),
+ QString::SkipEmptyParts);
+
+ d_ptr->setFlipFlags(displayArgs);
+
+ result = DirectFBCreate(&d_ptr->dfb);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen: error creating DirectFB interface",
+ result);
+ return false;
+ }
+
+ if (displayArgs.contains(QLatin1String("videoonly"), Qt::CaseInsensitive))
+ d_ptr->directFBFlags |= VideoOnly;
+
+ if (displayArgs.contains(QLatin1String("systemonly"), Qt::CaseInsensitive)) {
+ if (d_ptr->directFBFlags & VideoOnly) {
+ qWarning("QDirectFBScreen: error. videoonly and systemonly are mutually exclusive");
+ } else {
+ d_ptr->directFBFlags |= SystemOnly;
+ }
+ }
+
+ if (displayArgs.contains(QLatin1String("boundingrectflip"), Qt::CaseInsensitive)) {
+ d_ptr->directFBFlags |= BoundingRectFlip;
+ } else if (displayArgs.contains(QLatin1String("nopartialflip"), Qt::CaseInsensitive)) {
+ d_ptr->directFBFlags |= NoPartialFlip;
+ }
+
+#ifdef QT_DIRECTFB_IMAGECACHE
+ int imageCacheSize = 4 * 1024 * 1024; // 4 MB
+ setIntOption(displayArgs, QLatin1String("imagecachesize"), &imageCacheSize);
+ QDirectFBPaintEngine::initImageCache(imageCacheSize);
+#endif
+
+#ifndef QT_NO_DIRECTFB_WM
+ if (displayArgs.contains(QLatin1String("fullscreen")))
+#endif
+ d_ptr->dfb->SetCooperativeLevel(d_ptr->dfb, DFSCL_FULLSCREEN);
+
+ const bool forcePremultiplied = displayArgs.contains(QLatin1String("forcepremultiplied"), Qt::CaseInsensitive);
+
+ DFBSurfaceDescription description;
+ memset(&description, 0, sizeof(DFBSurfaceDescription));
+ IDirectFBSurface *surface;
+
+#ifdef QT_NO_DIRECTFB_WM
+ description.flags = DSDESC_CAPS;
+ if (::setIntOption(displayArgs, QLatin1String("width"), &description.width))
+ description.flags |= DSDESC_WIDTH;
+ if (::setIntOption(displayArgs, QLatin1String("height"), &description.height))
+ description.flags |= DSDESC_HEIGHT;
+
+ description.caps = DSCAPS_PRIMARY|DSCAPS_DOUBLE;
+ struct {
+ const char *name;
+ const DFBSurfaceCapabilities cap;
+ } const capabilities[] = {
+ { "static_alloc", DSCAPS_STATIC_ALLOC },
+ { "triplebuffer", DSCAPS_TRIPLE },
+ { "interlaced", DSCAPS_INTERLACED },
+ { "separated", DSCAPS_SEPARATED },
+// { "depthbuffer", DSCAPS_DEPTH }, // only makes sense with TextureTriangles which are not supported
+ { 0, DSCAPS_NONE }
+ };
+ for (int i=0; capabilities[i].name; ++i) {
+ if (displayArgs.contains(QString::fromLatin1(capabilities[i].name), Qt::CaseInsensitive))
+ description.caps |= capabilities[i].cap;
+ }
+
+ if (forcePremultiplied) {
+ description.caps |= DSCAPS_PREMULTIPLIED;
+ }
+
+ // We don't track the primary surface as it's released in disconnect
+ d_ptr->primarySurface = createDFBSurface(description, DontTrackSurface, &result);
+ if (!d_ptr->primarySurface) {
+ DirectFBError("QDirectFBScreen: error creating primary surface",
+ result);
+ return false;
+ }
+
+ surface = d_ptr->primarySurface;
+#else
+ description.flags = DSDESC_WIDTH|DSDESC_HEIGHT;
+ description.width = description.height = 1;
+ surface = createDFBSurface(description, DontTrackSurface, &result);
+ if (!surface) {
+ DirectFBError("QDirectFBScreen: error creating surface", result);
+ return false;
+ }
+#endif
+ // Work out what format we're going to use for surfaces with an alpha channel
+ QImage::Format pixelFormat = QDirectFBScreen::getImageFormat(surface);
+ d_ptr->alphaPixmapFormat = pixelFormat;
+
+ switch (pixelFormat) {
+ case QImage::Format_RGB666:
+ d_ptr->alphaPixmapFormat = QImage::Format_ARGB6666_Premultiplied;
+ break;
+ case QImage::Format_RGB444:
+ d_ptr->alphaPixmapFormat = QImage::Format_ARGB4444_Premultiplied;
+ break;
+ case QImage::Format_RGB32:
+ pixelFormat = d_ptr->alphaPixmapFormat = QImage::Format_ARGB32_Premultiplied;
+ // ### Format_RGB32 doesn't work so well with Qt. Force ARGB32 for windows/pixmaps
+ break;
+ case QImage::Format_Indexed8:
+ qWarning("QDirectFBScreen::connect(). Qt/DirectFB does not work with the LUT8 pixelformat.");
+ return false;
+ case QImage::NImageFormats:
+ case QImage::Format_Invalid:
+ case QImage::Format_Mono:
+ case QImage::Format_MonoLSB:
+ case QImage::Format_RGB888:
+ case QImage::Format_RGB16:
+ case QImage::Format_RGB555:
+ d_ptr->alphaPixmapFormat = QImage::Format_ARGB32_Premultiplied;
+ break;
+ case QImage::Format_ARGB32:
+ if (forcePremultiplied)
+ d_ptr->alphaPixmapFormat = pixelFormat = QImage::Format_ARGB32_Premultiplied;
+ case QImage::Format_ARGB32_Premultiplied:
+ case QImage::Format_ARGB4444_Premultiplied:
+ case QImage::Format_ARGB8555_Premultiplied:
+ case QImage::Format_ARGB8565_Premultiplied:
+ case QImage::Format_ARGB6666_Premultiplied:
+ // works already
+ break;
+ }
+ setPixelFormat(pixelFormat);
+ QScreen::d = QDirectFBScreen::depth(pixelFormat);
+ data = 0;
+ lstep = 0;
+ size = 0;
+
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect: "
+ "Unable to get screen!", result);
+ return false;
+ }
+ const QString qws_size = QString::fromLatin1(qgetenv("QWS_SIZE"));
+ if (!qws_size.isEmpty()) {
+ QRegExp rx(QLatin1String("(\\d+)x(\\d+)"));
+ if (!rx.exactMatch(qws_size)) {
+ qWarning("QDirectFBScreen::connect: Can't parse QWS_SIZE=\"%s\"", qPrintable(qws_size));
+ } else {
+ int *ints[2] = { &w, &h };
+ for (int i=0; i<2; ++i) {
+ *ints[i] = rx.cap(i + 1).toInt();
+ if (*ints[i] <= 0) {
+ qWarning("QDirectFBScreen::connect: %s is not a positive integer",
+ qPrintable(rx.cap(i + 1)));
+ w = h = 0;
+ break;
+ }
+ }
+ }
+ }
+
+ setIntOption(displayArgs, QLatin1String("width"), &w);
+ setIntOption(displayArgs, QLatin1String("height"), &h);
+
+#ifndef QT_NO_DIRECTFB_LAYER
+ int layerId = DLID_PRIMARY;
+ setIntOption(displayArgs, QLatin1String("layerid"), &layerId);
+
+ result = d_ptr->dfb->GetDisplayLayer(d_ptr->dfb, static_cast<DFBDisplayLayerID>(layerId),
+ &d_ptr->dfbLayer);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect: "
+ "Unable to get display layer!", result);
+ return false;
+ }
+ result = d_ptr->dfbLayer->GetScreen(d_ptr->dfbLayer, &d_ptr->dfbScreen);
+#else
+ result = d_ptr->dfb->GetScreen(d_ptr->dfb, 0, &d_ptr->dfbScreen);
+#endif
+
+ if (w <= 0 || h <= 0) {
+#ifdef QT_NO_DIRECTFB_WM
+ result = d_ptr->primarySurface->GetSize(d_ptr->primarySurface, &w, &h);
+#elif (Q_DIRECTFB_VERSION >= 0x010000)
+ IDirectFBSurface *layerSurface;
+ if (d_ptr->dfbLayer->GetSurface(d_ptr->dfbLayer, &layerSurface) == DFB_OK) {
+ result = layerSurface->GetSize(layerSurface, &w, &h);
+ layerSurface->Release(layerSurface);
+ }
+ if (w <= 0 || h <= 0) {
+ result = d_ptr->dfbScreen->GetSize(d_ptr->dfbScreen, &w, &h);
+ }
+#else
+ qWarning("QDirectFBScreen::connect: DirectFB versions prior to 1.0 do not offer a way\n"
+ "query the size of the primary surface in windowed mode. You have to specify\n"
+ "the size of the display using QWS_SIZE=[0-9]x[0-9] or\n"
+ "QWS_DISPLAY=directfb:width=[0-9]:height=[0-9]");
+ return false;
+#endif
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect: "
+ "Unable to get screen size!", result);
+ return false;
+ }
+ }
+
+
+ dw = w;
+ dh = h;
+
+ Q_ASSERT(dw != 0 && dh != 0);
+
+ physWidth = physHeight = -1;
+ setIntOption(displayArgs, QLatin1String("mmWidth"), &physWidth);
+ setIntOption(displayArgs, QLatin1String("mmHeight"), &physHeight);
+ const int dpi = 72;
+ if (physWidth < 0)
+ physWidth = qRound(dw * 25.4 / dpi);
+ if (physHeight < 0)
+ physHeight = qRound(dh * 25.4 / dpi);
+
+ setGraphicsSystem(d_ptr);
+
+#if (Q_DIRECTFB_VERSION >= 0x000923)
+ if (displayArgs.contains(QLatin1String("debug"), Qt::CaseInsensitive))
+ printDirectFBInfo(d_ptr->dfb, surface);
+#endif
+#ifdef QT_DIRECTFB_WM
+ surface->Release(surface);
+ QColor backgroundColor;
+#else
+ QColor &backgroundColor = d_ptr->backgroundColor;
+#endif
+
+ QRegExp backgroundColorRegExp(QLatin1String("bgcolor=(.+)"));
+ backgroundColorRegExp.setCaseSensitivity(Qt::CaseInsensitive);
+ if (displayArgs.indexOf(backgroundColorRegExp) != -1) {
+ backgroundColor = colorFromName(backgroundColorRegExp.cap(1));
+ }
+#ifdef QT_NO_DIRECTFB_WM
+ if (!backgroundColor.isValid())
+ backgroundColor = Qt::green;
+ d_ptr->primarySurface->Clear(d_ptr->primarySurface, backgroundColor.red(),
+ backgroundColor.green(), backgroundColor.blue(),
+ backgroundColor.alpha());
+ d_ptr->primarySurface->Flip(d_ptr->primarySurface, 0, d_ptr->flipFlags);
+#else
+ if (backgroundColor.isValid()) {
+ DFBResult result = d_ptr->dfbLayer->SetCooperativeLevel(d_ptr->dfbLayer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect "
+ "Unable to set cooperative level", result);
+ }
+ result = d_ptr->dfbLayer->SetBackgroundColor(d_ptr->dfbLayer, backgroundColor.red(), backgroundColor.green(),
+ backgroundColor.blue(), backgroundColor.alpha());
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::connect: "
+ "Unable to set background color", result);
+ }
+
+ result = d_ptr->dfbLayer->SetBackgroundMode(d_ptr->dfbLayer, DLBM_COLOR);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::connect: "
+ "Unable to set background mode", result);
+ }
+
+ result = d_ptr->dfbLayer->SetCooperativeLevel(d_ptr->dfbLayer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect "
+ "Unable to set cooperative level", result);
+ }
+
+ }
+#endif
+
+ return true;
+}
+
+void QDirectFBScreen::disconnect()
+{
+#if defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+ if (d_ptr->imageProvider)
+ d_ptr->imageProvider->Release(d_ptr->imageProvider);
+#endif
+#ifdef QT_NO_DIRECTFB_WM
+ d_ptr->primarySurface->Release(d_ptr->primarySurface);
+ d_ptr->primarySurface = 0;
+#endif
+
+ foreach (IDirectFBSurface *surf, d_ptr->allocatedSurfaces)
+ surf->Release(surf);
+ d_ptr->allocatedSurfaces.clear();
+
+#ifndef QT_NO_DIRECTFB_LAYER
+ d_ptr->dfbLayer->Release(d_ptr->dfbLayer);
+ d_ptr->dfbLayer = 0;
+#endif
+
+ d_ptr->dfbScreen->Release(d_ptr->dfbScreen);
+ d_ptr->dfbScreen = 0;
+
+ d_ptr->dfb->Release(d_ptr->dfb);
+ d_ptr->dfb = 0;
+}
+
+bool QDirectFBScreen::initDevice()
+{
+#ifndef QT_NO_DIRECTFB_MOUSE
+ if (qgetenv("QWS_MOUSE_PROTO").isEmpty()) {
+ QWSServer::instance()->setDefaultMouse("None");
+ d_ptr->mouse = new QDirectFBMouseHandler;
+ }
+#endif
+#ifndef QT_NO_DIRECTFB_KEYBOARD
+ if (qgetenv("QWS_KEYBOARD").isEmpty()) {
+ QWSServer::instance()->setDefaultKeyboard("None");
+ d_ptr->keyboard = new QDirectFBKeyboardHandler(QString());
+ }
+#endif
+
+#ifdef QT_DIRECTFB_CURSOR
+ qt_screencursor = new QDirectFBScreenCursor;
+#elif !defined QT_NO_QWS_CURSOR
+ QScreenCursor::initSoftwareCursor();
+#endif
+ return true;
+}
+
+void QDirectFBScreen::shutdownDevice()
+{
+#ifndef QT_NO_DIRECTFB_MOUSE
+ delete d_ptr->mouse;
+ d_ptr->mouse = 0;
+#endif
+#ifndef QT_NO_DIRECTFB_KEYBOARD
+ delete d_ptr->keyboard;
+ d_ptr->keyboard = 0;
+#endif
+
+#ifndef QT_NO_QWS_CURSOR
+ delete qt_screencursor;
+ qt_screencursor = 0;
+#endif
+}
+
+void QDirectFBScreen::setMode(int width, int height, int depth)
+{
+ d_ptr->dfb->SetVideoMode(d_ptr->dfb, width, height, depth);
+}
+
+void QDirectFBScreen::blank(bool on)
+{
+ d_ptr->dfbScreen->SetPowerMode(d_ptr->dfbScreen,
+ (on ? DSPM_ON : DSPM_SUSPEND));
+}
+
+QWSWindowSurface *QDirectFBScreen::createSurface(QWidget *widget) const
+{
+#ifdef QT_NO_DIRECTFB_WM
+ if (QApplication::type() == QApplication::GuiServer) {
+ return new QDirectFBWindowSurface(d_ptr->flipFlags, const_cast<QDirectFBScreen*>(this), widget);
+ } else {
+ return QScreen::createSurface(widget);
+ }
+#else
+ return new QDirectFBWindowSurface(d_ptr->flipFlags, const_cast<QDirectFBScreen*>(this), widget);
+#endif
+}
+
+QWSWindowSurface *QDirectFBScreen::createSurface(const QString &key) const
+{
+ if (key == QLatin1String("directfb")) {
+ return new QDirectFBWindowSurface(d_ptr->flipFlags, const_cast<QDirectFBScreen*>(this));
+ }
+ return QScreen::createSurface(key);
+}
+
+#if defined QT_NO_DIRECTFB_WM
+struct PaintCommand {
+ PaintCommand() : dfbSurface(0), windowOpacity(255), blittingFlags(DSBLIT_NOFX) {}
+ IDirectFBSurface *dfbSurface;
+ QImage image;
+ QPoint windowPosition;
+ QRegion source;
+ quint8 windowOpacity;
+ DFBSurfaceBlittingFlags blittingFlags;
+};
+
+static inline void initParameters(DFBRectangle &source, const QRect &sourceGlobal, const QPoint &pos)
+{
+ source.x = sourceGlobal.x() - pos.x();
+ source.y = sourceGlobal.y() - pos.y();
+ source.w = sourceGlobal.width();
+ source.h = sourceGlobal.height();
+}
+#endif
+
+void QDirectFBScreen::exposeRegion(QRegion r, int)
+{
+ Q_UNUSED(r);
+#if defined QT_NO_DIRECTFB_WM
+
+ r &= region();
+ if (r.isEmpty()) {
+ return;
+ }
+ r = r.boundingRect();
+
+ IDirectFBSurface *primary = d_ptr->primarySurface;
+ const QList<QWSWindow*> windows = QWSServer::instance()->clientWindows();
+ QVarLengthArray<PaintCommand, 4> commands(windows.size());
+ QRegion region = r;
+ int idx = 0;
+ for (int i=0; i<windows.size(); ++i) {
+ QWSWindowSurface *surface = windows.at(i)->windowSurface();
+ if (!surface)
+ continue;
+
+ const QRect windowGeometry = surface->geometry();
+ const QRegion intersection = region & windowGeometry;
+ if (intersection.isEmpty()) {
+ continue;
+ }
+
+ PaintCommand &cmd = commands[idx];
+
+ if (surface->key() == QLatin1String("directfb")) {
+ const QDirectFBWindowSurface *ws = static_cast<QDirectFBWindowSurface*>(surface);
+ cmd.dfbSurface = ws->directFBSurface();
+
+ if (!cmd.dfbSurface) {
+ continue;
+ }
+ } else {
+ cmd.image = surface->image();
+ if (cmd.image.isNull()) {
+ continue;
+ }
+ }
+ ++idx;
+
+ cmd.windowPosition = windowGeometry.topLeft();
+ cmd.source = intersection;
+ if (windows.at(i)->isOpaque()) {
+ region -= intersection;
+ if (region.isEmpty())
+ break;
+ } else {
+ cmd.windowOpacity = windows.at(i)->opacity();
+ cmd.blittingFlags = cmd.windowOpacity == 255
+ ? DSBLIT_BLEND_ALPHACHANNEL
+ : (DSBLIT_BLEND_ALPHACHANNEL|DSBLIT_BLEND_COLORALPHA);
+ }
+ }
+
+ solidFill(d_ptr->backgroundColor, region);
+
+ while (idx > 0) {
+ const PaintCommand &cmd = commands[--idx];
+ Q_ASSERT(cmd.dfbSurface || !cmd.image.isNull());
+ IDirectFBSurface *surface;
+ if (cmd.dfbSurface) {
+ surface = cmd.dfbSurface;
+ } else {
+ Q_ASSERT(!cmd.image.isNull());
+ DFBResult result;
+ surface = createDFBSurface(cmd.image, cmd.image.format(), DontTrackSurface, &result);
+ Q_ASSERT((result != DFB_OK) == !surface);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::exposeRegion: Can't create surface from image", result);
+ continue;
+ }
+ }
+
+ primary->SetBlittingFlags(primary, cmd.blittingFlags);
+ if (cmd.blittingFlags & DSBLIT_BLEND_COLORALPHA) {
+ primary->SetColor(primary, 0xff, 0xff, 0xff, cmd.windowOpacity);
+ }
+ const QRegion &region = cmd.source;
+ const int rectCount = region.rectCount();
+ DFBRectangle source;
+ if (rectCount == 1) {
+ ::initParameters(source, region.boundingRect(), cmd.windowPosition);
+ primary->Blit(primary, surface, &source, cmd.windowPosition.x() + source.x, cmd.windowPosition.y() + source.y);
+ } else {
+ const QVector<QRect> rects = region.rects();
+ for (int i=0; i<rectCount; ++i) {
+ ::initParameters(source, rects.at(i), cmd.windowPosition);
+ primary->Blit(primary, surface, &source, cmd.windowPosition.x() + source.x, cmd.windowPosition.y() + source.y);
+ }
+ }
+ if (surface != cmd.dfbSurface) {
+ surface->Release(surface);
+ }
+ }
+
+ primary->SetColor(primary, 0xff, 0xff, 0xff, 0xff);
+
+#if defined QT_NO_DIRECTFB_CURSOR and !defined QT_NO_QWS_CURSOR
+ if (QScreenCursor *cursor = QScreenCursor::instance()) {
+ const QRect cursorRectangle = cursor->boundingRect();
+ if (cursor->isVisible() && !cursor->isAccelerated() && r.intersects(cursorRectangle)) {
+ const QImage image = cursor->image();
+ if (image.cacheKey() != d_ptr->cursorImageKey) {
+ if (d_ptr->cursorSurface) {
+ releaseDFBSurface(d_ptr->cursorSurface);
+ }
+ d_ptr->cursorSurface = createDFBSurface(image, image.format(), QDirectFBScreen::TrackSurface);
+ d_ptr->cursorImageKey = image.cacheKey();
+ }
+
+ Q_ASSERT(d_ptr->cursorSurface);
+ primary->SetBlittingFlags(primary, DSBLIT_BLEND_ALPHACHANNEL);
+ primary->Blit(primary, d_ptr->cursorSurface, 0, cursorRectangle.x(), cursorRectangle.y());
+ }
+ }
+#endif
+ flipSurface(primary, d_ptr->flipFlags, r, QPoint());
+ primary->SetBlittingFlags(primary, DSBLIT_NOFX);
+#endif
+}
+
+void QDirectFBScreen::solidFill(const QColor &color, const QRegion &region)
+{
+#ifdef QT_DIRECTFB_WM
+ Q_UNUSED(color);
+ Q_UNUSED(region);
+#else
+ QDirectFBScreen::solidFill(d_ptr->primarySurface, color, region);
+#endif
+}
+
+static inline void clearRect(IDirectFBSurface *surface, const QColor &color, const QRect &rect)
+{
+ Q_ASSERT(surface);
+ const DFBRegion region = { rect.left(), rect.top(), rect.right(), rect.bottom() };
+ // could just reinterpret_cast this to a DFBRegion
+ surface->SetClip(surface, &region);
+ surface->Clear(surface, color.red(), color.green(), color.blue(), color.alpha());
+}
+
+void QDirectFBScreen::solidFill(IDirectFBSurface *surface, const QColor &color, const QRegion &region)
+{
+ if (region.isEmpty())
+ return;
+
+ const int n = region.rectCount();
+ if (n == 1) {
+ clearRect(surface, color, region.boundingRect());
+ } else {
+ const QVector<QRect> rects = region.rects();
+ for (int i=0; i<n; ++i) {
+ clearRect(surface, color, rects.at(i));
+ }
+ }
+ surface->SetClip(surface, 0);
+}
+
+QImage::Format QDirectFBScreen::alphaPixmapFormat() const
+{
+ return d_ptr->alphaPixmapFormat;
+}
+
+bool QDirectFBScreen::initSurfaceDescriptionPixelFormat(DFBSurfaceDescription *description,
+ QImage::Format format)
+{
+ const DFBSurfacePixelFormat pixelformat = QDirectFBScreen::getSurfacePixelFormat(format);
+ if (pixelformat == DSPF_UNKNOWN)
+ return false;
+ description->flags |= DSDESC_PIXELFORMAT;
+ description->pixelformat = pixelformat;
+ if (QDirectFBScreen::isPremultiplied(format)) {
+ if (!(description->flags & DSDESC_CAPS)) {
+ description->caps = DSCAPS_PREMULTIPLIED;
+ description->flags |= DSDESC_CAPS;
+ } else {
+ description->caps |= DSCAPS_PREMULTIPLIED;
+ }
+ }
+ return true;
+}
+
+uchar *QDirectFBScreen::lockSurface(IDirectFBSurface *surface, DFBSurfaceLockFlags flags, int *bpl)
+{
+ void *mem = 0;
+ const DFBResult result = surface->Lock(surface, flags, &mem, bpl);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::lockSurface()", result);
+ }
+
+ return reinterpret_cast<uchar*>(mem);
+}
+
+static inline bool isFullUpdate(IDirectFBSurface *surface, const QRegion &region, const QPoint &offset)
+{
+ if (offset == QPoint(0, 0) && region.rectCount() == 1) {
+ QSize size;
+ surface->GetSize(surface, &size.rwidth(), &size.rheight());
+ if (region.boundingRect().size() == size)
+ return true;
+ }
+ return false;
+}
+
+void QDirectFBScreen::flipSurface(IDirectFBSurface *surface, DFBSurfaceFlipFlags flipFlags,
+ const QRegion &region, const QPoint &offset)
+{
+ if (d_ptr->directFBFlags & NoPartialFlip
+ || (!(flipFlags & DSFLIP_BLIT) && QT_PREPEND_NAMESPACE(isFullUpdate(surface, region, offset)))) {
+ surface->Flip(surface, 0, flipFlags);
+ } else {
+ if (!(d_ptr->directFBFlags & BoundingRectFlip) && region.rectCount() > 1) {
+ const QVector<QRect> rects = region.rects();
+ const DFBSurfaceFlipFlags nonWaitFlags = flipFlags & ~DSFLIP_WAIT;
+ for (int i=0; i<rects.size(); ++i) {
+ const QRect &r = rects.at(i);
+ const DFBRegion dfbReg = { r.x() + offset.x(), r.y() + offset.y(),
+ r.right() + offset.x(),
+ r.bottom() + offset.y() };
+ surface->Flip(surface, &dfbReg, i + 1 < rects.size() ? nonWaitFlags : flipFlags);
+ }
+ } else {
+ const QRect r = region.boundingRect();
+ const DFBRegion dfbReg = { r.x() + offset.x(), r.y() + offset.y(),
+ r.right() + offset.x(),
+ r.bottom() + offset.y() };
+ surface->Flip(surface, &dfbReg, flipFlags);
+ }
+ }
+}
+
+#if defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+void QDirectFBScreen::setDirectFBImageProvider(IDirectFBImageProvider *provider)
+{
+ Q_ASSERT(provider);
+ if (d_ptr->imageProvider)
+ d_ptr->imageProvider->Release(d_ptr->imageProvider);
+ d_ptr->imageProvider = provider;
+}
+#endif
+
+void QDirectFBScreen::waitIdle()
+{
+ d_ptr->dfb->WaitIdle(d_ptr->dfb);
+}
+
+#ifdef QT_DIRECTFB_WM
+IDirectFBWindow *QDirectFBScreen::windowForWidget(const QWidget *widget) const
+{
+ if (widget) {
+ const QWSWindowSurface *surface = static_cast<const QWSWindowSurface*>(widget->windowSurface());
+ if (surface && surface->key() == QLatin1String("directfb")) {
+ return static_cast<const QDirectFBWindowSurface*>(surface)->directFBWindow();
+ }
+ }
+ return 0;
+}
+#endif
+
+IDirectFBSurface * QDirectFBScreen::surfaceForWidget(const QWidget *widget, QRect *rect) const
+{
+ Q_ASSERT(widget);
+ if (!widget->isVisible() || widget->size().isNull())
+ return 0;
+
+ const QWSWindowSurface *surface = static_cast<const QWSWindowSurface*>(widget->windowSurface());
+ if (surface && surface->key() == QLatin1String("directfb")) {
+ return static_cast<const QDirectFBWindowSurface*>(surface)->surfaceForWidget(widget, rect);
+ }
+ return 0;
+}
+
+#ifdef QT_DIRECTFB_SUBSURFACE
+IDirectFBSurface *QDirectFBScreen::subSurfaceForWidget(const QWidget *widget, const QRect &area) const
+{
+ Q_ASSERT(widget);
+ QRect rect;
+ IDirectFBSurface *surface = surfaceForWidget(widget, &rect);
+ IDirectFBSurface *subSurface = 0;
+ if (surface) {
+ if (!area.isNull())
+ rect &= area.translated(widget->mapTo(widget->window(), QPoint(0, 0)));
+ if (!rect.isNull()) {
+ const DFBRectangle subRect = { rect.x(), rect.y(), rect.width(), rect.height() };
+ const DFBResult result = surface->GetSubSurface(surface, &subRect, &subSurface);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::subSurface(): Can't get sub surface", result);
+ }
+ }
+ }
+ return subSurface;
+}
+#endif
+
+Q_GUI_EXPORT IDirectFBSurface *qt_directfb_surface_for_widget(const QWidget *widget, QRect *rect)
+{
+ return QDirectFBScreen::instance() ? QDirectFBScreen::instance()->surfaceForWidget(widget, rect) : 0;
+}
+#ifdef QT_DIRECTFB_SUBSURFACE
+Q_GUI_EXPORT IDirectFBSurface *qt_directfb_subsurface_for_widget(const QWidget *widget, const QRect &area)
+{
+ return QDirectFBScreen::instance() ? QDirectFBScreen::instance()->subSurfaceForWidget(widget, area) : 0;
+}
+#endif
+#ifdef QT_DIRECTFB_WM
+Q_GUI_EXPORT IDirectFBWindow *qt_directfb_window_for_widget(const QWidget *widget)
+{
+ return QDirectFBScreen::instance() ? QDirectFBScreen::instance()->windowForWidget(widget) : 0;
+}
+
+#endif
+
+QT_END_NAMESPACE
+
+#include "qdirectfbscreen.moc"
+#endif // QT_NO_QWS_DIRECTFB
+
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
new file mode 100644
index 0000000000..0e9098df3b
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
@@ -0,0 +1,303 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBSCREEN_H
+#define QDIRECTFBSCREEN_H
+
+#include <qglobal.h>
+#ifndef QT_NO_QWS_DIRECTFB
+#include <QtGui/qscreen_qws.h>
+#include <directfb.h>
+#include <directfb_version.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+#if !defined QT_DIRECTFB_SUBSURFACE && !defined QT_NO_DIRECTFB_SUBSURFACE
+#define QT_NO_DIRECTFB_SUBSURFACE
+#endif
+#if !defined QT_NO_DIRECTFB_LAYER && !defined QT_DIRECTFB_LAYER
+#define QT_DIRECTFB_LAYER
+#endif
+#if !defined QT_NO_DIRECTFB_WM && !defined QT_DIRECTFB_WM
+#define QT_DIRECTFB_WM
+#endif
+#if !defined QT_DIRECTFB_IMAGECACHE && !defined QT_NO_DIRECTFB_IMAGECACHE
+#define QT_NO_DIRECTFB_IMAGECACHE
+#endif
+#if !defined QT_NO_DIRECTFB_IMAGEPROVIDER && !defined QT_DIRECTFB_IMAGEPROVIDER
+#define QT_DIRECTFB_IMAGEPROVIDER
+#endif
+#if !defined QT_NO_DIRECTFB_STRETCHBLIT && !defined QT_DIRECTFB_STRETCHBLIT
+#define QT_DIRECTFB_STRETCHBLIT
+#endif
+#if !defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE && !defined QT_NO_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+#define QT_NO_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+#endif
+#if !defined QT_DIRECTFB_WINDOW_AS_CURSOR && !defined QT_NO_DIRECTFB_WINDOW_AS_CURSOR
+#define QT_NO_DIRECTFB_WINDOW_AS_CURSOR
+#endif
+#if !defined QT_DIRECTFB_PALETTE && !defined QT_NO_DIRECTFB_PALETTE
+#define QT_NO_DIRECTFB_PALETTE
+#endif
+#if !defined QT_NO_DIRECTFB_PREALLOCATED && !defined QT_DIRECTFB_PREALLOCATED
+#define QT_DIRECTFB_PREALLOCATED
+#endif
+#if !defined QT_NO_DIRECTFB_MOUSE && !defined QT_DIRECTFB_MOUSE
+#define QT_DIRECTFB_MOUSE
+#endif
+#if !defined QT_NO_DIRECTFB_KEYBOARD && !defined QT_DIRECTFB_KEYBOARD
+#define QT_DIRECTFB_KEYBOARD
+#endif
+#if !defined QT_NO_DIRECTFB_OPAQUE_DETECTION && !defined QT_DIRECTFB_OPAQUE_DETECTION
+#define QT_DIRECTFB_OPAQUE_DETECTION
+#endif
+#ifndef QT_NO_QWS_CURSOR
+#if defined QT_DIRECTFB_WM && defined QT_DIRECTFB_WINDOW_AS_CURSOR
+#define QT_DIRECTFB_CURSOR
+#elif defined QT_DIRECTFB_LAYER
+#define QT_DIRECTFB_CURSOR
+#endif
+#endif
+#ifndef QT_DIRECTFB_CURSOR
+#define QT_NO_DIRECTFB_CURSOR
+#endif
+#if defined QT_NO_DIRECTFB_LAYER && defined QT_DIRECTFB_WM
+#error QT_NO_DIRECTFB_LAYER requires QT_NO_DIRECTFB_WM
+#endif
+#if defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE && defined QT_NO_DIRECTFB_IMAGEPROVIDER
+#error QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE requires QT_DIRECTFB_IMAGEPROVIDER to be defined
+#endif
+#if defined QT_DIRECTFB_WINDOW_AS_CURSOR && defined QT_NO_DIRECTFB_WM
+#error QT_DIRECTFB_WINDOW_AS_CURSOR requires QT_DIRECTFB_WM to be defined
+#endif
+
+#define Q_DIRECTFB_VERSION ((DIRECTFB_MAJOR_VERSION << 16) | (DIRECTFB_MINOR_VERSION << 8) | DIRECTFB_MICRO_VERSION)
+
+#define DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(F) \
+ static inline F operator~(F f) { return F(~int(f)); } \
+ static inline F operator&(F left, F right) { return F(int(left) & int(right)); } \
+ static inline F operator|(F left, F right) { return F(int(left) | int(right)); } \
+ static inline F &operator|=(F &left, F right) { left = (left | right); return left; } \
+ static inline F &operator&=(F &left, F right) { left = (left & right); return left; }
+
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBInputDeviceCapabilities);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBWindowDescriptionFlags);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBWindowCapabilities);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBWindowOptions);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceDescriptionFlags);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceCapabilities);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceLockFlags);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceBlittingFlags);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceDrawingFlags);
+DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceFlipFlags);
+
+class QDirectFBScreenPrivate;
+class Q_GUI_EXPORT QDirectFBScreen : public QScreen
+{
+public:
+ QDirectFBScreen(int display_id);
+ ~QDirectFBScreen();
+
+ enum DirectFBFlag {
+ NoFlags = 0x00,
+ VideoOnly = 0x01,
+ SystemOnly = 0x02,
+ BoundingRectFlip = 0x04,
+ NoPartialFlip = 0x08
+ };
+
+ Q_DECLARE_FLAGS(DirectFBFlags, DirectFBFlag);
+
+ DirectFBFlags directFBFlags() const;
+
+ bool connect(const QString &displaySpec);
+ void disconnect();
+ bool initDevice();
+ void shutdownDevice();
+
+ void exposeRegion(QRegion r, int changing);
+ void solidFill(const QColor &color, const QRegion &region);
+ static void solidFill(IDirectFBSurface *surface, const QColor &color, const QRegion &region);
+
+ void setMode(int width, int height, int depth);
+ void blank(bool on);
+
+ QWSWindowSurface *createSurface(QWidget *widget) const;
+ QWSWindowSurface *createSurface(const QString &key) const;
+
+ static QDirectFBScreen *instance();
+ void waitIdle();
+ IDirectFBSurface *surfaceForWidget(const QWidget *widget, QRect *rect) const;
+#ifdef QT_DIRECTFB_SUBSURFACE
+ IDirectFBSurface *subSurfaceForWidget(const QWidget *widget, const QRect &area = QRect()) const;
+#endif
+ IDirectFB *dfb();
+#ifdef QT_DIRECTFB_WM
+ IDirectFBWindow *windowForWidget(const QWidget *widget) const;
+#else
+ IDirectFBSurface *primarySurface();
+#endif
+#ifndef QT_NO_DIRECTFB_LAYER
+ IDirectFBDisplayLayer *dfbDisplayLayer();
+#endif
+
+ // Track surface creation/release so we can release all on exit
+ enum SurfaceCreationOption {
+ DontTrackSurface = 0x1,
+ TrackSurface = 0x2,
+ NoPreallocated = 0x4
+ };
+ Q_DECLARE_FLAGS(SurfaceCreationOptions, SurfaceCreationOption);
+ IDirectFBSurface *createDFBSurface(const QImage &image,
+ QImage::Format format,
+ SurfaceCreationOptions options,
+ DFBResult *result = 0);
+ IDirectFBSurface *createDFBSurface(const QSize &size,
+ QImage::Format format,
+ SurfaceCreationOptions options,
+ DFBResult *result = 0);
+ IDirectFBSurface *copyDFBSurface(IDirectFBSurface *src,
+ QImage::Format format,
+ SurfaceCreationOptions options,
+ DFBResult *result = 0);
+ IDirectFBSurface *createDFBSurface(DFBSurfaceDescription desc,
+ SurfaceCreationOptions options,
+ DFBResult *result);
+#ifdef QT_DIRECTFB_SUBSURFACE
+ IDirectFBSurface *getSubSurface(IDirectFBSurface *surface,
+ const QRect &rect,
+ SurfaceCreationOptions options,
+ DFBResult *result);
+#endif
+
+ void flipSurface(IDirectFBSurface *surface, DFBSurfaceFlipFlags flipFlags,
+ const QRegion &region, const QPoint &offset);
+ void releaseDFBSurface(IDirectFBSurface *surface);
+
+ using QScreen::depth;
+ static int depth(DFBSurfacePixelFormat format);
+ static int depth(QImage::Format format);
+
+ static DFBSurfacePixelFormat getSurfacePixelFormat(QImage::Format format);
+ static DFBSurfaceDescription getSurfaceDescription(const uint *buffer,
+ int length);
+ static QImage::Format getImageFormat(IDirectFBSurface *surface);
+ static bool initSurfaceDescriptionPixelFormat(DFBSurfaceDescription *description, QImage::Format format);
+ static inline bool isPremultiplied(QImage::Format format);
+ static inline bool hasAlphaChannel(DFBSurfacePixelFormat format);
+ static inline bool hasAlphaChannel(IDirectFBSurface *surface);
+ QImage::Format alphaPixmapFormat() const;
+
+#ifndef QT_NO_DIRECTFB_PALETTE
+ static void setSurfaceColorTable(IDirectFBSurface *surface,
+ const QImage &image);
+#endif
+
+ static uchar *lockSurface(IDirectFBSurface *surface, DFBSurfaceLockFlags flags, int *bpl = 0);
+#if defined QT_DIRECTFB_IMAGEPROVIDER && defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE
+ void setDirectFBImageProvider(IDirectFBImageProvider *provider);
+#endif
+private:
+ QDirectFBScreenPrivate *d_ptr;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDirectFBScreen::SurfaceCreationOptions);
+Q_DECLARE_OPERATORS_FOR_FLAGS(QDirectFBScreen::DirectFBFlags);
+
+inline bool QDirectFBScreen::isPremultiplied(QImage::Format format)
+{
+ switch (format) {
+ case QImage::Format_ARGB32_Premultiplied:
+ case QImage::Format_ARGB8565_Premultiplied:
+ case QImage::Format_ARGB6666_Premultiplied:
+ case QImage::Format_ARGB8555_Premultiplied:
+ case QImage::Format_ARGB4444_Premultiplied:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+inline bool QDirectFBScreen::hasAlphaChannel(DFBSurfacePixelFormat format)
+{
+ switch (format) {
+ case DSPF_ARGB1555:
+ case DSPF_ARGB:
+ case DSPF_LUT8:
+ case DSPF_AiRGB:
+ case DSPF_A1:
+ case DSPF_ARGB2554:
+ case DSPF_ARGB4444:
+#if (Q_DIRECTFB_VERSION >= 0x000923)
+ case DSPF_AYUV:
+#endif
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ case DSPF_A4:
+ case DSPF_ARGB1666:
+ case DSPF_ARGB6666:
+ case DSPF_LUT2:
+#endif
+ return true;
+ default:
+ return false;
+ }
+}
+
+inline bool QDirectFBScreen::hasAlphaChannel(IDirectFBSurface *surface)
+{
+ Q_ASSERT(surface);
+ DFBSurfacePixelFormat format;
+ surface->GetPixelFormat(surface, &format);
+ return QDirectFBScreen::hasAlphaChannel(format);
+}
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_DIRECTFB
+#endif // QDIRECTFBSCREEN_H
+
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreenplugin.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreenplugin.cpp
new file mode 100644
index 0000000000..742c857e9e
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreenplugin.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbscreen.h"
+
+#include <QtGui/qscreendriverplugin_qws.h>
+#include <QtCore/qstringlist.h>
+#ifndef QT_NO_QWS_DIRECTFB
+
+class DirectFBScreenDriverPlugin : public QScreenDriverPlugin
+{
+public:
+ DirectFBScreenDriverPlugin();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+DirectFBScreenDriverPlugin::DirectFBScreenDriverPlugin()
+ : QScreenDriverPlugin()
+{
+}
+
+QStringList DirectFBScreenDriverPlugin::keys() const
+{
+ return (QStringList() << "directfb");
+}
+
+QScreen* DirectFBScreenDriverPlugin::create(const QString& driver,
+ int displayId)
+{
+ if (driver.toLower() != "directfb")
+ return 0;
+
+ return new QDirectFBScreen(displayId);
+}
+
+Q_EXPORT_PLUGIN2(qdirectfbscreen, DirectFBScreenDriverPlugin)
+
+#endif
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
new file mode 100644
index 0000000000..9a94c30d8c
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
@@ -0,0 +1,506 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbscreen.h"
+#include "qdirectfbpaintengine.h"
+
+#include <private/qwidget_p.h>
+#include <qwidget.h>
+#include <qwindowsystem_qws.h>
+#include <qpaintdevice.h>
+#include <qvarlengtharray.h>
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+QT_BEGIN_NAMESPACE
+
+QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirectFBScreen *scr)
+ : QDirectFBPaintDevice(scr)
+#ifndef QT_NO_DIRECTFB_WM
+ , dfbWindow(0)
+#endif
+ , flipFlags(flip)
+ , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip)
+ , flushPending(false)
+{
+#ifdef QT_NO_DIRECTFB_WM
+ mode = Offscreen;
+#endif
+ setSurfaceFlags(Opaque | Buffered);
+#ifdef QT_DIRECTFB_TIMING
+ frames = 0;
+ timer.start();
+#endif
+}
+
+QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirectFBScreen *scr, QWidget *widget)
+ : QWSWindowSurface(widget), QDirectFBPaintDevice(scr)
+#ifndef QT_NO_DIRECTFB_WM
+ , dfbWindow(0)
+#endif
+ , flipFlags(flip)
+ , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip)
+ , flushPending(false)
+{
+ SurfaceFlags flags = 0;
+ if (!widget || widget->window()->windowOpacity() == 0xff)
+ flags |= Opaque;
+#ifdef QT_NO_DIRECTFB_WM
+ if (widget && widget->testAttribute(Qt::WA_PaintOnScreen)) {
+ flags = RegionReserved;
+ mode = Primary;
+ } else {
+ mode = Offscreen;
+ flags = Buffered;
+ }
+#endif
+ setSurfaceFlags(flags);
+#ifdef QT_DIRECTFB_TIMING
+ frames = 0;
+ timer.start();
+#endif
+}
+
+QDirectFBWindowSurface::~QDirectFBWindowSurface()
+{
+ releaseSurface();
+ // these are not tracked by QDirectFBScreen so we don't want QDirectFBPaintDevice to release it
+}
+
+bool QDirectFBWindowSurface::isValid() const
+{
+ return true;
+}
+
+#ifdef QT_DIRECTFB_WM
+void QDirectFBWindowSurface::raise()
+{
+ if (IDirectFBWindow *window = directFBWindow()) {
+ window->RaiseToTop(window);
+ }
+}
+
+IDirectFBWindow *QDirectFBWindowSurface::directFBWindow() const
+{
+ return dfbWindow;
+}
+
+void QDirectFBWindowSurface::createWindow(const QRect &rect)
+{
+ IDirectFBDisplayLayer *layer = screen->dfbDisplayLayer();
+ if (!layer)
+ qFatal("QDirectFBWindowSurface: Unable to get primary display layer!");
+
+ updateIsOpaque();
+
+ DFBWindowDescription description;
+ memset(&description, 0, sizeof(DFBWindowDescription));
+
+ description.flags = DWDESC_CAPS|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT;
+ description.caps = DWCAPS_NODECORATION;
+ description.surface_caps = DSCAPS_NONE;
+ imageFormat = screen->pixelFormat();
+
+ if (!(surfaceFlags() & Opaque)) {
+ imageFormat = screen->alphaPixmapFormat();
+ description.caps |= DWCAPS_ALPHACHANNEL;
+#if (Q_DIRECTFB_VERSION >= 0x010200)
+ description.flags |= DWDESC_OPTIONS;
+ description.options |= DWOP_ALPHACHANNEL;
+#endif
+ }
+ description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(imageFormat);
+ description.posx = rect.x();
+ description.posy = rect.y();
+ description.width = rect.width();
+ description.height = rect.height();
+
+ if (QDirectFBScreen::isPremultiplied(imageFormat))
+ description.surface_caps = DSCAPS_PREMULTIPLIED;
+
+ if (screen->directFBFlags() & QDirectFBScreen::VideoOnly)
+ description.surface_caps |= DSCAPS_VIDEOONLY;
+
+ DFBResult result = layer->CreateWindow(layer, &description, &dfbWindow);
+
+ if (result != DFB_OK)
+ DirectFBErrorFatal("QDirectFBWindowSurface::createWindow", result);
+
+ if (window()) {
+ if (window()->windowFlags() & Qt::WindowStaysOnTopHint) {
+ dfbWindow->SetStackingClass(dfbWindow, DWSC_UPPER);
+ }
+ DFBWindowID winid;
+ result = dfbWindow->GetID(dfbWindow, &winid);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBWindowSurface::createWindow. Can't get ID", result);
+ } else {
+ window()->setProperty("_q_DirectFBWindowID", winid);
+ }
+ }
+
+ Q_ASSERT(!dfbSurface);
+ dfbWindow->GetSurface(dfbWindow, &dfbSurface);
+}
+
+static DFBResult setWindowGeometry(IDirectFBWindow *dfbWindow, const QRect &old, const QRect &rect)
+{
+ DFBResult result = DFB_OK;
+ const bool isMove = old.isEmpty() || rect.topLeft() != old.topLeft();
+ const bool isResize = rect.size() != old.size();
+
+#if (Q_DIRECTFB_VERSION >= 0x010000)
+ if (isResize && isMove) {
+ result = dfbWindow->SetBounds(dfbWindow, rect.x(), rect.y(),
+ rect.width(), rect.height());
+ } else if (isResize) {
+ result = dfbWindow->Resize(dfbWindow,
+ rect.width(), rect.height());
+ } else if (isMove) {
+ result = dfbWindow->MoveTo(dfbWindow, rect.x(), rect.y());
+ }
+#else
+ if (isResize) {
+ result = dfbWindow->Resize(dfbWindow,
+ rect.width(), rect.height());
+ }
+ if (isMove) {
+ result = dfbWindow->MoveTo(dfbWindow, rect.x(), rect.y());
+ }
+#endif
+ return result;
+}
+#endif // QT_NO_DIRECTFB_WM
+
+void QDirectFBWindowSurface::setGeometry(const QRect &rect)
+{
+ const QRect oldRect = geometry();
+ if (oldRect == rect)
+ return;
+
+ IDirectFBSurface *oldSurface = dfbSurface;
+ const bool sizeChanged = oldRect.size() != rect.size();
+ if (sizeChanged) {
+ delete engine;
+ engine = 0;
+ releaseSurface();
+ Q_ASSERT(!dfbSurface);
+ }
+
+ if (rect.isNull()) {
+#ifndef QT_NO_DIRECTFB_WM
+ if (dfbWindow) {
+ if (window())
+ window()->setProperty("_q_DirectFBWindowID", QVariant());
+
+ dfbWindow->Release(dfbWindow);
+ dfbWindow = 0;
+ }
+#endif
+ Q_ASSERT(!dfbSurface);
+#ifdef QT_DIRECTFB_SUBSURFACE
+ Q_ASSERT(!subSurface);
+#endif
+ } else {
+#ifdef QT_DIRECTFB_WM
+ if (!dfbWindow) {
+ createWindow(rect);
+ } else {
+ setWindowGeometry(dfbWindow, oldRect, rect);
+ Q_ASSERT(!sizeChanged || !dfbSurface);
+ if (sizeChanged)
+ dfbWindow->GetSurface(dfbWindow, &dfbSurface);
+ }
+#else
+ IDirectFBSurface *primarySurface = screen->primarySurface();
+ DFBResult result = DFB_OK;
+ if (mode == Primary) {
+ Q_ASSERT(primarySurface);
+ if (rect == screen->region().boundingRect()) {
+ dfbSurface = primarySurface;
+ } else {
+ const DFBRectangle r = { rect.x(), rect.y(),
+ rect.width(), rect.height() };
+ result = primarySurface->GetSubSurface(primarySurface, &r, &dfbSurface);
+ }
+ } else { // mode == Offscreen
+ if (!dfbSurface) {
+ dfbSurface = screen->createDFBSurface(rect.size(), surfaceFlags() & Opaque ? screen->pixelFormat() : screen->alphaPixmapFormat(),
+ QDirectFBScreen::DontTrackSurface);
+ }
+ }
+ if (result != DFB_OK)
+ DirectFBErrorFatal("QDirectFBWindowSurface::setGeometry()", result);
+#endif
+ }
+ if (oldSurface != dfbSurface) {
+ imageFormat = dfbSurface ? QDirectFBScreen::getImageFormat(dfbSurface) : QImage::Format_Invalid;
+ }
+
+ if (oldRect.size() != rect.size()) {
+ QWSWindowSurface::setGeometry(rect);
+ } else {
+ QWindowSurface::setGeometry(rect);
+ }
+}
+
+QByteArray QDirectFBWindowSurface::permanentState() const
+{
+ QByteArray state(sizeof(SurfaceFlags) + sizeof(DFBWindowID), 0);
+ char *ptr = state.data();
+ SurfaceFlags flags = surfaceFlags();
+ memcpy(ptr, &flags, sizeof(SurfaceFlags));
+ ptr += sizeof(SurfaceFlags);
+ DFBWindowID did = (DFBWindowID)(-1);
+ if (dfbWindow)
+ dfbWindow->GetID(dfbWindow, &did);
+ memcpy(ptr, &did, sizeof(DFBWindowID));
+ return state;
+}
+
+void QDirectFBWindowSurface::setPermanentState(const QByteArray &state)
+{
+ const char *ptr = state.constData();
+ IDirectFBDisplayLayer *layer = screen->dfbDisplayLayer();
+ SurfaceFlags flags;
+ memcpy(&flags, ptr, sizeof(SurfaceFlags));
+
+ setSurfaceFlags(flags);
+ ptr += sizeof(SurfaceFlags);
+ DFBWindowID id;
+ memcpy(&id, ptr, sizeof(DFBWindowID));
+ if (dfbSurface)
+ dfbSurface->Release(dfbSurface);
+ if (id != (DFBWindowID)-1) {
+ IDirectFBWindow *dw;
+ layer->GetWindow(layer, id, &dw);
+ if (dw->GetSurface(dw, &dfbSurface) != DFB_OK)
+ dfbSurface = 0;
+ dw->Release(dw);
+ }
+ else {
+ dfbSurface = 0;
+ }
+}
+
+bool QDirectFBWindowSurface::scroll(const QRegion &region, int dx, int dy)
+{
+ if (!dfbSurface || !(flipFlags & DSFLIP_BLIT) || region.rectCount() != 1)
+ return false;
+ if (flushPending) {
+ dfbSurface->Flip(dfbSurface, 0, DSFLIP_BLIT);
+ } else {
+ flushPending = true;
+ }
+ dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX);
+ const QRect r = region.boundingRect();
+ const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() };
+ dfbSurface->Blit(dfbSurface, dfbSurface, &rect, r.x() + dx, r.y() + dy);
+ return true;
+}
+
+bool QDirectFBWindowSurface::move(const QPoint &moveBy)
+{
+ setGeometry(geometry().translated(moveBy));
+ return true;
+}
+
+void QDirectFBWindowSurface::setOpaque(bool opaque)
+{
+ SurfaceFlags flags = surfaceFlags();
+ if (opaque != (flags & Opaque)) {
+ if (opaque) {
+ flags |= Opaque;
+ } else {
+ flags &= ~Opaque;
+ }
+ setSurfaceFlags(flags);
+ }
+}
+
+
+void QDirectFBWindowSurface::flush(QWidget *widget, const QRegion &region,
+ const QPoint &offset)
+{
+ QWidget *win = window();
+ if (!win)
+ return;
+
+#if !defined(QT_NO_QWS_PROXYSCREEN) && !defined(QT_NO_GRAPHICSVIEW)
+ QWExtra *extra = qt_widget_private(widget)->extraData();
+ if (extra && extra->proxyWidget)
+ return;
+#else
+ Q_UNUSED(widget);
+#endif
+
+ const quint8 windowOpacity = quint8(win->windowOpacity() * 0xff);
+ const QRect windowGeometry = geometry();
+#ifdef QT_DIRECTFB_WM
+ quint8 currentOpacity;
+ Q_ASSERT(dfbWindow);
+ dfbWindow->GetOpacity(dfbWindow, &currentOpacity);
+ if (currentOpacity != windowOpacity) {
+ dfbWindow->SetOpacity(dfbWindow, windowOpacity);
+ }
+
+ screen->flipSurface(dfbSurface, flipFlags, region, offset);
+#else
+ setOpaque(windowOpacity == 0xff);
+ if (mode == Offscreen) {
+ screen->exposeRegion(region.translated(offset + geometry().topLeft()), 0);
+ } else {
+ screen->flipSurface(dfbSurface, flipFlags, region, offset);
+ }
+#endif
+
+#ifdef QT_DIRECTFB_TIMING
+ enum { Secs = 3 };
+ ++frames;
+ if (timer.elapsed() >= Secs * 1000) {
+ qDebug("%d fps", int(double(frames) / double(Secs)));
+ frames = 0;
+ timer.restart();
+ }
+#endif
+ flushPending = false;
+}
+
+void QDirectFBWindowSurface::beginPaint(const QRegion &region)
+{
+ if (!engine) {
+ engine = new QDirectFBPaintEngine(this);
+ }
+
+ if (dfbSurface) {
+ const QWidget *win = window();
+ if (win && win->testAttribute(Qt::WA_NoSystemBackground)) {
+ QDirectFBScreen::solidFill(dfbSurface, Qt::transparent, region);
+ }
+ }
+ flushPending = true;
+}
+
+void QDirectFBWindowSurface::endPaint(const QRegion &)
+{
+#ifdef QT_NO_DIRECTFB_SUBSURFACE
+ unlockSurface();
+#endif
+}
+
+IDirectFBSurface *QDirectFBWindowSurface::directFBSurface() const
+{
+ return dfbSurface;
+}
+
+
+IDirectFBSurface *QDirectFBWindowSurface::surfaceForWidget(const QWidget *widget, QRect *rect) const
+{
+ Q_ASSERT(widget);
+ if (!dfbSurface)
+ return 0;
+ QWidget *win = window();
+ Q_ASSERT(win);
+ if (rect) {
+ if (win == widget) {
+ *rect = widget->rect();
+ } else {
+ *rect = QRect(widget->mapTo(win, QPoint(0, 0)), widget->size());
+ }
+ }
+
+ Q_ASSERT(win == widget || win->isAncestorOf(widget));
+ return dfbSurface;
+}
+
+void QDirectFBWindowSurface::releaseSurface()
+{
+ if (dfbSurface) {
+#ifdef QT_DIRECTFB_SUBSURFACE
+ releaseSubSurface();
+#else
+ unlockSurface();
+#endif
+#ifdef QT_NO_DIRECTFB_WM
+ Q_ASSERT(screen->primarySurface());
+ if (dfbSurface != screen->primarySurface())
+#endif
+
+ dfbSurface->Release(dfbSurface);
+ dfbSurface = 0;
+ }
+}
+
+void QDirectFBWindowSurface::updateIsOpaque()
+{
+ const QWidget *win = window();
+ Q_ASSERT(win);
+ if (win->testAttribute(Qt::WA_OpaquePaintEvent) || win->testAttribute(Qt::WA_PaintOnScreen)) {
+ setOpaque(true);
+ return;
+ }
+
+ if (qFuzzyCompare(static_cast<float>(win->windowOpacity()), 1.0f)) {
+ const QPalette &pal = win->palette();
+
+ if (win->autoFillBackground()) {
+ const QBrush &autoFillBrush = pal.brush(win->backgroundRole());
+ if (autoFillBrush.style() != Qt::NoBrush && autoFillBrush.isOpaque()) {
+ setOpaque(true);
+ return;
+ }
+ }
+
+ if (win->isWindow() && !win->testAttribute(Qt::WA_NoSystemBackground)) {
+ const QBrush &windowBrush = win->palette().brush(QPalette::Window);
+ if (windowBrush.style() != Qt::NoBrush && windowBrush.isOpaque()) {
+ setOpaque(true);
+ return;
+ }
+ }
+ }
+ setOpaque(false);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_DIRECTFB
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
new file mode 100644
index 0000000000..75d462b523
--- /dev/null
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECFBWINDOWSURFACE_H
+#define QDIRECFBWINDOWSURFACE_H
+
+#include "qdirectfbpaintengine.h"
+#include "qdirectfbpaintdevice.h"
+#include "qdirectfbscreen.h"
+
+#ifndef QT_NO_QWS_DIRECTFB
+
+#include <private/qpaintengine_raster_p.h>
+#include <private/qwindowsurface_qws_p.h>
+
+#ifdef QT_DIRECTFB_TIMING
+#include <qdatetime.h>
+#endif
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QDirectFBWindowSurface : public QWSWindowSurface, public QDirectFBPaintDevice
+{
+public:
+ QDirectFBWindowSurface(DFBSurfaceFlipFlags flipFlags, QDirectFBScreen *scr);
+ QDirectFBWindowSurface(DFBSurfaceFlipFlags flipFlags, QDirectFBScreen *scr, QWidget *widget);
+ ~QDirectFBWindowSurface();
+
+#ifdef QT_DIRECTFB_WM
+ void raise();
+#endif
+ bool isValid() const;
+
+ void setGeometry(const QRect &rect);
+
+ QString key() const { return QLatin1String("directfb"); }
+ QByteArray permanentState() const;
+ void setPermanentState(const QByteArray &state);
+
+ bool scroll(const QRegion &area, int dx, int dy);
+
+ bool move(const QPoint &offset);
+
+ QImage image() const { return QImage(); }
+ QPaintDevice *paintDevice() { return this; }
+
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+
+ void beginPaint(const QRegion &);
+ void endPaint(const QRegion &);
+
+ IDirectFBSurface *surfaceForWidget(const QWidget *widget, QRect *rect) const;
+ IDirectFBSurface *directFBSurface() const;
+#ifdef QT_DIRECTFB_WM
+ IDirectFBWindow *directFBWindow() const;
+#endif
+private:
+ void updateIsOpaque();
+ void setOpaque(bool opaque);
+ void releaseSurface();
+
+#ifdef QT_DIRECTFB_WM
+ void createWindow(const QRect &rect);
+ IDirectFBWindow *dfbWindow;
+#else
+ enum Mode {
+ Primary,
+ Offscreen
+ } mode;
+#endif
+
+ DFBSurfaceFlipFlags flipFlags;
+ bool boundingRectFlip;
+ bool flushPending;
+#ifdef QT_DIRECTFB_TIMING
+ int frames;
+ QTime timer;
+#endif
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_DIRECTFB
+
+#endif // QDIRECFBWINDOWSURFACE_H
diff --git a/src/plugins/gfxdrivers/eglnullws/README b/src/plugins/gfxdrivers/eglnullws/README
new file mode 100644
index 0000000000..80b88c7e01
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/README
@@ -0,0 +1,48 @@
+EGL NullWS QScreen Driver
+=========================
+
+If your application draws everything within a single full-screen QGLWidget then
+you may wish to use this QScreen plugin driver. This driver simply returns 0
+(as a EGLNativeWindowType value) when asked by the QtOpenGl module to create a
+native window. Some OpenGL ES implementations (including PowerVR) interpret this
+to mean that a full-screen OpenGL context is desired without any windowing
+support (NullWS).
+
+To tell a Qt/Embedded application to use this driver use the -display command
+line option or the QWS_DISPLAY environment variable. The following driver
+options are supported:
+
+size=WIDTHxHEIGHT Screen size reported by the driver
+format=FORMAT Screen format
+
+Run with '-display eglnullws:help' to get a full list of options (including a
+list of supported format strings).
+
+If you choose a screen format that is not supported by the hardware then the
+QtOpenGl module will write out a list of supported EGL configurations. Use
+one of the supported screen formats from this list.
+
+Using this driver with PowerVR hardware
+---------------------------------------
+
+Using this plugin with PowerVR hardware should give a significant speedup
+compared to running with the Qt powervr driver (with a full-screen QGLWidget).
+This is because sacrificing the window system allows less work to be done in
+order to get graphics on the screen. Using this driver also avoids the memory
+fragmentation issues present in the powervr driver and avoids any direct
+dependencies on the deprecated PVR2D API from Imagination Technologies.
+
+To use this driver ensure you have /etc/powervr.ini with contents similar to
+this:
+
+[default]
+WindowSystem=libpvrPVR2D_FLIPWSEGL.so
+
+This driver will also function with libpvrPVR2D_FRONTWSEGL.so, but that draws
+straight into the framebuffer and will therefore cause flickering (it can be
+useful for performance testing though). The flip plugin uses triple buffering,
+so you will need to set the virtual vertical resolution of your framebuffer to
+be three times the physical vertical resolution of your screen. This can be
+done with 'fbset -vyres'. Failure to do this can cause system crashes. You
+should also ensure that the plugin you choose in powervr.ini is in your library
+path (it may just silently default to the flip plugin if not).
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullws.pro b/src/plugins/gfxdrivers/eglnullws/eglnullws.pro
new file mode 100644
index 0000000000..242ab07ecd
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullws.pro
@@ -0,0 +1,18 @@
+TARGET = qeglnullws
+include(../../qpluginbase.pri)
+
+CONFIG += warn_on
+QT += opengl
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
+
+HEADERS = eglnullwsscreen.h \
+ eglnullwsscreenplugin.h \
+ eglnullwswindowsurface.h
+
+SOURCES = eglnullwsscreen.cpp \
+ eglnullwsscreenplugin.cpp \
+ eglnullwswindowsurface.cpp
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.cpp b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.cpp
new file mode 100644
index 0000000000..d090e857ad
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.cpp
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "eglnullwsscreen.h"
+#include "eglnullwswindowsurface.h"
+#include "eglnullwsscreenplugin.h"
+
+#include <QHash>
+#include <QDebug>
+
+namespace
+{
+ class EGLNullWSScreenSurfaceFunctions : public QGLScreenSurfaceFunctions
+ {
+ public:
+ virtual bool createNativeWindow(QWidget *, EGLNativeWindowType *native)
+ { *native = 0; return true; }
+ };
+}
+
+EGLNullWSScreen::EGLNullWSScreen(int displayId) : QGLScreen(displayId) {}
+
+EGLNullWSScreen::~EGLNullWSScreen() {}
+
+bool EGLNullWSScreen::initDevice()
+{
+ setSurfaceFunctions(new EGLNullWSScreenSurfaceFunctions);
+ return true;
+}
+
+static const QHash<QString, QImage::Format> formatDictionary()
+{
+ QHash<QString, QImage::Format> dictionary;
+ dictionary["rgb32"] = QImage::Format_RGB32;
+ dictionary["argb32"] = QImage::Format_ARGB32;
+ dictionary["rgb16"] = QImage::Format_RGB16;
+ dictionary["rgb666"] = QImage::Format_RGB666;
+ dictionary["rgb555"] = QImage::Format_RGB555;
+ dictionary["rgb888"] = QImage::Format_RGB888;
+ dictionary["rgb444"] = QImage::Format_RGB444;
+ return dictionary;
+}
+
+static int depthForFormat(QImage::Format format)
+{
+ switch (format) {
+ case QImage::Format_RGB32: return 32;
+ case QImage::Format_ARGB32: return 32;
+ case QImage::Format_RGB16: return 16;
+ case QImage::Format_RGB666: return 24;
+ case QImage::Format_RGB555: return 16;
+ case QImage::Format_RGB888: return 24;
+ case QImage::Format_RGB444: return 16;
+ default:
+ Q_ASSERT_X(false, "EGLNullWSScreen", "Unknown format");
+ return -1;
+ }
+}
+
+static void printHelp(const QHash<QString, QImage::Format> &formatDictionary)
+{
+ QByteArray formatsBuf;
+ QTextStream(&formatsBuf) << QStringList(formatDictionary.keys()).join(", ");
+ qWarning(
+ "%s: Valid options are:\n"
+ "size=WIDTHxHEIGHT Screen size reported by this driver\n"
+ "format=FORMAT Screen format, where FORMAT is one of the following:\n"
+ " %s\n",
+ PluginName,
+ formatsBuf.constData());
+}
+
+bool EGLNullWSScreen::connect(const QString &displaySpec)
+{
+ const QStringList args = displaySpec.section(':', 1).split(':', QString::SkipEmptyParts);
+ const QHash<QString, QImage::Format> formatDict = formatDictionary();
+ Q_FOREACH(const QString arg, args) {
+ const QString optionName = arg.section('=', 0, 0);
+ const QString optionArg = arg.section('=', 1);
+ if (optionName == QLatin1String("size")) {
+ w = optionArg.section('x', 0, 0).toInt();
+ h = optionArg.section('x', 1, 1).toInt();
+ } else if (optionName == QLatin1String("format")) {
+ if (formatDict.contains(optionArg))
+ setPixelFormat(formatDict.value(optionArg));
+ else
+ printHelp(formatDict);
+ } else {
+ printHelp(formatDict);
+ }
+ }
+
+ if (w == 0 || h == 0) {
+ w = 640;
+ h = 480;
+ qWarning("%s: Using default screen size %dx%d", PluginName, w, h);
+ }
+ dw = w;
+ dh = h;
+
+ if (pixelFormat() == QImage::Format_Invalid) {
+ qWarning("%s: Using default screen format argb32", PluginName);
+ setPixelFormat(QImage::Format_ARGB32);
+ }
+ d = depthForFormat(pixelFormat());
+
+ static const int Dpi = 120;
+ static const qreal ScalingFactor = static_cast<qreal>(25.4) / Dpi;
+ physWidth = qRound(dw * ScalingFactor);
+ physHeight = qRound(dh * ScalingFactor);
+
+ return true;
+}
+
+void EGLNullWSScreen::disconnect() {}
+
+void EGLNullWSScreen::shutdownDevice() {}
+
+void EGLNullWSScreen::setMode(int /*width*/, int /*height*/, int /*depth*/) {}
+
+void EGLNullWSScreen::blank(bool /*on*/) {}
+
+void EGLNullWSScreen::exposeRegion(QRegion /*r*/, int /*changing*/) {}
+
+QWSWindowSurface* EGLNullWSScreen::createSurface(QWidget *widget) const
+{
+ if (qobject_cast<QGLWidget*>(widget)) {
+ return new EGLNullWSWindowSurface(widget);
+ } else {
+ qWarning("%s: Creating non-GL surface", PluginName);
+ return QScreen::createSurface(widget);
+ }
+}
+
+QWSWindowSurface* EGLNullWSScreen::createSurface(const QString &key) const
+{
+ if (key == QLatin1String("eglnullws")) {
+ return new EGLNullWSWindowSurface;
+ } else {
+ qWarning("%s: Creating non-GL surface", PluginName);
+ return QScreen::createSurface(key);
+ }
+}
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.h b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.h
new file mode 100644
index 0000000000..08ba2fa0cc
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreen.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EGLNULLWSSCREEN
+#define EGLNULLWSSCREEN
+
+#include <QGLScreen>
+
+class EGLNullWSScreen : public QGLScreen
+{
+public:
+ EGLNullWSScreen(int displayId);
+ ~EGLNullWSScreen();
+
+ bool initDevice();
+ bool connect(const QString &displaySpec);
+ void disconnect();
+ void shutdownDevice();
+
+ void setMode(int width, int height, int depth);
+ void blank(bool on);
+
+ void exposeRegion(QRegion r, int changing);
+
+ QWSWindowSurface* createSurface(QWidget *widget) const;
+ QWSWindowSurface* createSurface(const QString &key) const;
+
+ bool hasOpenGL() { return true; }
+};
+
+#endif // EGLNULLWSSCREEN
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.cpp b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.cpp
new file mode 100644
index 0000000000..f7080333f8
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "eglnullwsscreenplugin.h"
+#include "eglnullwsscreen.h"
+
+#include <QScreenDriverPlugin>
+#include <QStringList>
+
+class EGLNullWSScreenPlugin : public QScreenDriverPlugin
+{
+public:
+ virtual QStringList keys() const;
+ virtual QScreen *create(const QString& driver, int displayId);
+};
+
+QStringList EGLNullWSScreenPlugin::keys() const
+{
+ return QStringList() << QLatin1String(PluginName);
+}
+
+QScreen *EGLNullWSScreenPlugin::create(const QString& driver, int displayId)
+{
+ return (driver.toLower() == QLatin1String(PluginName) ?
+ new EGLNullWSScreen(displayId) : 0);
+}
+
+Q_EXPORT_PLUGIN2(qeglnullws, EGLNullWSScreenPlugin)
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.h b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.h
new file mode 100644
index 0000000000..64a362374d
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullwsscreenplugin.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EGLNULLWSSCREENPLUGIN_H
+#define EGLNULLWSSCREENPLUGIN_H
+
+const char *const PluginName = "eglnullws";
+
+#endif // EGLNULLWSSCREENPLUGIN_H
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.cpp b/src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.cpp
new file mode 100644
index 0000000000..8af4d406a5
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "eglnullwswindowsurface.h"
+#include "eglnullwsscreenplugin.h"
+
+#include <QGLWidget>
+
+static const QWSWindowSurface::SurfaceFlags Flags
+ = QWSWindowSurface::RegionReserved | QWSWindowSurface::RegionReserved;
+
+EGLNullWSWindowSurface::EGLNullWSWindowSurface(QWidget *w)
+ :
+ QWSGLWindowSurface(w),
+ widget(w)
+{
+ setSurfaceFlags(Flags);
+}
+
+EGLNullWSWindowSurface::EGLNullWSWindowSurface()
+ : widget(0)
+{
+ setSurfaceFlags(Flags);
+}
+
+EGLNullWSWindowSurface::~EGLNullWSWindowSurface() {}
+
+QString EGLNullWSWindowSurface::key() const
+{
+ return QLatin1String(PluginName);
+}
+
+QPaintDevice *EGLNullWSWindowSurface::paintDevice()
+{
+ return widget;
+}
+
+bool EGLNullWSWindowSurface::isValid() const
+{
+ return qobject_cast<QGLWidget *>(window());
+}
+
+QImage EGLNullWSWindowSurface::image() const
+{
+ return QImage();
+}
diff --git a/src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.h b/src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.h
new file mode 100644
index 0000000000..793d3256d6
--- /dev/null
+++ b/src/plugins/gfxdrivers/eglnullws/eglnullwswindowsurface.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EGLNULLWSWINDOWSURFACE_H
+#define EGLNULLWSWINDOWSURFACE_H
+
+#include <private/qglwindowsurface_qws_p.h>
+
+class EGLNullWSWindowSurface : public QWSGLWindowSurface
+{
+public:
+ EGLNullWSWindowSurface(QWidget *widget);
+ EGLNullWSWindowSurface();
+ virtual ~EGLNullWSWindowSurface();
+
+ virtual QString key() const;
+ virtual QPaintDevice *paintDevice();
+ virtual bool isValid() const;
+ virtual QImage image() const;
+
+private:
+ QWidget *widget;
+};
+
+#endif // EGLNULLWSWINDOWSURFACE_H
diff --git a/src/plugins/gfxdrivers/gfxdrivers.pro b/src/plugins/gfxdrivers/gfxdrivers.pro
new file mode 100644
index 0000000000..1f38942a50
--- /dev/null
+++ b/src/plugins/gfxdrivers/gfxdrivers.pro
@@ -0,0 +1,10 @@
+TEMPLATE = subdirs
+contains(gfx-plugins, ahi) :SUBDIRS += ahi
+contains(gfx-plugins, directfb) :SUBDIRS += directfb
+contains(gfx-plugins, linuxfb) :SUBDIRS += linuxfb
+contains(gfx-plugins, qvfb) :SUBDIRS += qvfb
+contains(gfx-plugins, vnc) :SUBDIRS += vnc
+contains(gfx-plugins, transformed) :SUBDIRS += transformed
+contains(gfx-plugins, svgalib) :SUBDIRS += svgalib
+contains(gfx-plugins, powervr) :SUBDIRS += powervr
+contains(gfx-plugins, eglnullws) :SUBDIRS += eglnullws
diff --git a/src/plugins/gfxdrivers/linuxfb/linuxfb.pro b/src/plugins/gfxdrivers/linuxfb/linuxfb.pro
new file mode 100644
index 0000000000..2a376e4158
--- /dev/null
+++ b/src/plugins/gfxdrivers/linuxfb/linuxfb.pro
@@ -0,0 +1,14 @@
+TARGET = qscreenlinuxfb
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
+
+DEFINES += QT_QWS_LINUXFB
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qscreenlinuxfb_qws.h
+
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qscreenlinuxfb_qws.cpp
diff --git a/src/plugins/gfxdrivers/linuxfb/main.cpp b/src/plugins/gfxdrivers/linuxfb/main.cpp
new file mode 100644
index 0000000000..6ea7b9ca24
--- /dev/null
+++ b/src/plugins/gfxdrivers/linuxfb/main.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qscreendriverplugin_qws.h>
+#include <qscreenlinuxfb_qws.h>
+#include <qstringlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QScreenLinuxFbPlugin : public QScreenDriverPlugin
+{
+public:
+ QScreenLinuxFbPlugin();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+QScreenLinuxFbPlugin::QScreenLinuxFbPlugin()
+ : QScreenDriverPlugin()
+{
+}
+
+QStringList QScreenLinuxFbPlugin::keys() const
+{
+ QStringList list;
+ list << QLatin1String("LinuxFb");
+ return list;
+}
+
+QScreen* QScreenLinuxFbPlugin::create(const QString& driver, int displayId)
+{
+ if (driver.toLower() == QLatin1String("linuxfb"))
+ return new QLinuxFbScreen(displayId);
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(qscreenlinuxfb, QScreenLinuxFbPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/QWSWSEGL.pro b/src/plugins/gfxdrivers/powervr/QWSWSEGL/QWSWSEGL.pro
new file mode 100644
index 0000000000..595cf45301
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/QWSWSEGL.pro
@@ -0,0 +1,26 @@
+TEMPLATE = lib
+TARGET = pvrQWSWSEGL
+CONFIG += dll warn_on
+CONFIG -= qt
+
+HEADERS+=\
+ pvrqwsdrawable.h \
+ pvrqwsdrawable_p.h
+
+SOURCES+=\
+ pvrqwsdrawable.c \
+ pvrqwswsegl.c
+
+INCLUDEPATH += $$QMAKE_INCDIR_EGL
+
+for(p, QMAKE_LIBDIR_EGL) {
+ exists($$p):LIBS += -L$$p
+}
+
+LIBS += -lpvr2d
+
+DESTDIR = $$QMAKE_LIBDIR_QT
+target.path = $$[QT_INSTALL_LIBS]
+INSTALLS += target
+
+include(../powervr.pri) \ No newline at end of file
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c
new file mode 100644
index 0000000000..8dc0120fe1
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.c
@@ -0,0 +1,830 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "pvrqwsdrawable_p.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <linux/fb.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+PvrQwsDisplay pvrQwsDisplay;
+
+static void pvrQwsDestroyDrawableForced(PvrQwsDrawable *drawable);
+
+/* Initialize the /dev/fbN device for a specific screen */
+static int pvrQwsInitFbScreen(int screen)
+{
+ struct fb_var_screeninfo var;
+ struct fb_fix_screeninfo fix;
+ unsigned long start;
+ unsigned long length;
+ int width, height, stride;
+ PVR2DFORMAT format;
+ void *mapped;
+ int fd, bytesPerPixel;
+ char name[64];
+ PVR2DMEMINFO *memInfo;
+ unsigned long pageAddresses[2];
+
+ /* Bail out if already initialized, or the number is incorrect */
+ if (screen < 0 || screen >= PVRQWS_MAX_SCREENS)
+ return 0;
+ if (pvrQwsDisplay.screens[screen].initialized)
+ return 1;
+
+ /* Open the framebuffer and fetch its properties */
+ sprintf(name, "/dev/fb%d", screen);
+ fd = open(name, O_RDWR, 0);
+ if (fd < 0) {
+ perror(name);
+ return 0;
+ }
+ if (ioctl(fd, FBIOGET_VSCREENINFO, &var) < 0) {
+ perror("FBIOGET_VSCREENINFO");
+ close(fd);
+ return 0;
+ }
+ if (ioctl(fd, FBIOGET_FSCREENINFO, &fix) < 0) {
+ perror("FBIOGET_FSCREENINFO");
+ close(fd);
+ return 0;
+ }
+ width = var.xres;
+ height = var.yres;
+ bytesPerPixel = var.bits_per_pixel / 8;
+ stride = fix.line_length;
+ format = PVR2D_1BPP;
+ if (var.bits_per_pixel == 16) {
+ if (var.red.length == 5 && var.green.length == 6 &&
+ var.blue.length == 5 && var.red.offset == 11 &&
+ var.green.offset == 5 && var.blue.offset == 0) {
+ format = PVR2D_RGB565;
+ }
+ if (var.red.length == 4 && var.green.length == 4 &&
+ var.blue.length == 4 && var.transp.length == 4 &&
+ var.red.offset == 8 && var.green.offset == 4 &&
+ var.blue.offset == 0 && var.transp.offset == 12) {
+ format = PVR2D_ARGB4444;
+ }
+ } else if (var.bits_per_pixel == 32) {
+ if (var.red.length == 8 && var.green.length == 8 &&
+ var.blue.length == 8 && var.transp.length == 8 &&
+ var.red.offset == 16 && var.green.offset == 8 &&
+ var.blue.offset == 0 && var.transp.offset == 24) {
+ format = PVR2D_ARGB8888;
+ }
+ }
+ if (format == PVR2D_1BPP) {
+ fprintf(stderr, "%s: could not find a suitable PVR2D pixel format\n", name);
+ close(fd);
+ return 0;
+ }
+ start = fix.smem_start;
+ length = var.xres_virtual * var.yres_virtual * bytesPerPixel;
+
+ if (screen == 0) {
+ /* We use PVR2DGetFrameBuffer to map the first screen.
+ On some chipsets it is more reliable than using PVR2DMemWrap */
+ mapped = 0;
+ memInfo = 0;
+ } else {
+ /* Other screens: map the framebuffer region into memory */
+ mapped = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (!mapped || mapped == (void *)(-1)) {
+ perror("mmap");
+ close(fd);
+ return 0;
+ }
+
+ /* Allocate a PVR2D memory region for the framebuffer */
+ memInfo = 0;
+ if (pvrQwsDisplay.context) {
+ pageAddresses[0] = start & 0xFFFFF000;
+ pageAddresses[1] = 0;
+ if (PVR2DMemWrap
+ (pvrQwsDisplay.context, mapped, PVR2D_WRAPFLAG_CONTIGUOUS,
+ length, pageAddresses, &memInfo) != PVR2D_OK) {
+ munmap(mapped, length);
+ close(fd);
+ return 0;
+ }
+ }
+ }
+
+ /* We don't need the file descriptor any more */
+ close(fd);
+
+ /* The framebuffer is ready, so initialize the PvrQwsScreenInfo */
+ pvrQwsDisplay.screens[screen].screenRect.x = 0;
+ pvrQwsDisplay.screens[screen].screenRect.y = 0;
+ pvrQwsDisplay.screens[screen].screenRect.width = width;
+ pvrQwsDisplay.screens[screen].screenRect.height = height;
+ pvrQwsDisplay.screens[screen].screenStride = stride;
+ pvrQwsDisplay.screens[screen].pixelFormat = format;
+ pvrQwsDisplay.screens[screen].bytesPerPixel = bytesPerPixel;
+ pvrQwsDisplay.screens[screen].screenDrawable = 0;
+ if (mapped) {
+ /* Don't set these fields if mapped is 0, because PVR2DGetFrameBuffer
+ may have already been called and set them */
+ pvrQwsDisplay.screens[screen].frameBuffer = memInfo;
+ pvrQwsDisplay.screens[screen].mapped = mapped;
+ }
+ pvrQwsDisplay.screens[screen].mappedLength = length;
+ pvrQwsDisplay.screens[screen].screenStart = start;
+ pvrQwsDisplay.screens[screen].needsUnmap = (mapped != 0);
+ pvrQwsDisplay.screens[screen].initialized = 1;
+ return 1;
+}
+
+/* Called when a new drawable is added to ensure that we have a
+ PVR2D context and framebuffer PVR2DMEMINFO blocks */
+static int pvrQwsAddDrawable(void)
+{
+ int numDevs, screen;
+ PVR2DDEVICEINFO *devs;
+ unsigned long devId;
+ unsigned long pageAddresses[2];
+ PVR2DMEMINFO *memInfo;
+ PVR2DDISPLAYINFO displayInfo;
+
+ /* Bail out early if this is not the first drawable */
+ if (pvrQwsDisplay.numDrawables > 0) {
+ ++(pvrQwsDisplay.numDrawables);
+ return 1;
+ }
+
+ /* Find the first PVR2D device in the system and open it */
+ numDevs = PVR2DEnumerateDevices(0);
+ if (numDevs <= 0)
+ return 0;
+ devs = (PVR2DDEVICEINFO *)malloc(sizeof(PVR2DDEVICEINFO) * numDevs);
+ if (!devs)
+ return 0;
+ if (PVR2DEnumerateDevices(devs) != PVR2D_OK) {
+ free(devs);
+ return 0;
+ }
+ devId = devs[0].ulDevID;
+ free(devs);
+ if (PVR2DCreateDeviceContext(devId, &pvrQwsDisplay.context, 0) != PVR2D_OK)
+ return 0;
+ pvrQwsDisplay.numFlipBuffers = 0;
+ pvrQwsDisplay.flipChain = 0;
+ if (PVR2DGetDeviceInfo(pvrQwsDisplay.context, &displayInfo) == PVR2D_OK) {
+ if (displayInfo.ulMaxFlipChains > 0 && displayInfo.ulMaxBuffersInChain > 0)
+ pvrQwsDisplay.numFlipBuffers = displayInfo.ulMaxBuffersInChain;
+ if (pvrQwsDisplay.numFlipBuffers > PVRQWS_MAX_FLIP_BUFFERS)
+ pvrQwsDisplay.numFlipBuffers = PVRQWS_MAX_FLIP_BUFFERS;
+ }
+
+ /* Create the PVR2DMEMINFO blocks for the active framebuffers */
+ for (screen = 0; screen < PVRQWS_MAX_SCREENS; ++screen) {
+ if (screen != 0 && pvrQwsDisplay.screens[screen].mapped) {
+ pageAddresses[0]
+ = pvrQwsDisplay.screens[screen].screenStart & 0xFFFFF000;
+ pageAddresses[1] = 0;
+ if (PVR2DMemWrap
+ (pvrQwsDisplay.context,
+ pvrQwsDisplay.screens[screen].mapped,
+ PVR2D_WRAPFLAG_CONTIGUOUS,
+ pvrQwsDisplay.screens[screen].mappedLength,
+ pageAddresses, &memInfo) != PVR2D_OK) {
+ PVR2DDestroyDeviceContext(pvrQwsDisplay.context);
+ pvrQwsDisplay.context = 0;
+ return 0;
+ }
+ pvrQwsDisplay.screens[screen].frameBuffer = memInfo;
+ } else if (screen == 0) {
+ if (PVR2DGetFrameBuffer
+ (pvrQwsDisplay.context,
+ PVR2D_FB_PRIMARY_SURFACE, &memInfo) != PVR2D_OK) {
+ fprintf(stderr, "QWSWSEGL: could not get the primary framebuffer surface\n");
+ PVR2DDestroyDeviceContext(pvrQwsDisplay.context);
+ pvrQwsDisplay.context = 0;
+ return 0;
+ }
+ pvrQwsDisplay.screens[screen].frameBuffer = memInfo;
+ pvrQwsDisplay.screens[screen].mapped = memInfo->pBase;
+ }
+ }
+
+ /* Create a flip chain for the screen if supported by the hardware */
+ pvrQwsDisplay.usePresentBlit = 0;
+ if (pvrQwsDisplay.numFlipBuffers > 0) {
+ long stride = 0;
+ unsigned long flipId = 0;
+ unsigned long numBuffers;
+ if (PVR2DCreateFlipChain(pvrQwsDisplay.context, 0,
+ //PVR2D_CREATE_FLIPCHAIN_SHARED |
+ //PVR2D_CREATE_FLIPCHAIN_QUERY,
+ pvrQwsDisplay.numFlipBuffers,
+ pvrQwsDisplay.screens[0].screenRect.width,
+ pvrQwsDisplay.screens[0].screenRect.height,
+ pvrQwsDisplay.screens[0].pixelFormat,
+ &stride, &flipId, &(pvrQwsDisplay.flipChain))
+ == PVR2D_OK) {
+ pvrQwsDisplay.screens[0].screenStride = stride;
+ PVR2DGetFlipChainBuffers(pvrQwsDisplay.context,
+ pvrQwsDisplay.flipChain,
+ &numBuffers,
+ pvrQwsDisplay.flipBuffers);
+ } else {
+ pvrQwsDisplay.flipChain = 0;
+ pvrQwsDisplay.numFlipBuffers = 0;
+ }
+
+ /* PVR2DPresentBlt is a little more reliable than PVR2DBlt
+ when flip chains are present, even if we cannot create a
+ flip chain at the moment */
+ pvrQwsDisplay.usePresentBlit = 1;
+ }
+
+ /* The context is ready to go */
+ ++(pvrQwsDisplay.numDrawables);
+ return 1;
+}
+
+/* Called when the last drawable is destroyed. The PVR2D context
+ will be destroyed but the raw framebuffer memory will stay mapped */
+static void pvrQwsDestroyContext(void)
+{
+ int screen;
+ for (screen = 0; screen < PVRQWS_MAX_SCREENS; ++screen) {
+ if (pvrQwsDisplay.screens[screen].frameBuffer) {
+ PVR2DMemFree
+ (pvrQwsDisplay.context,
+ pvrQwsDisplay.screens[screen].frameBuffer);
+ pvrQwsDisplay.screens[screen].frameBuffer = 0;
+ }
+ }
+
+ if (pvrQwsDisplay.numFlipBuffers > 0)
+ PVR2DDestroyFlipChain(pvrQwsDisplay.context, pvrQwsDisplay.flipChain);
+ PVR2DDestroyDeviceContext(pvrQwsDisplay.context);
+ pvrQwsDisplay.context = 0;
+ pvrQwsDisplay.flipChain = 0;
+ pvrQwsDisplay.numFlipBuffers = 0;
+ pvrQwsDisplay.usePresentBlit = 0;
+}
+
+int pvrQwsDisplayOpen(void)
+{
+ int screen;
+
+ /* If the display is already open, increase reference count and return */
+ if (pvrQwsDisplay.refCount > 0) {
+ ++(pvrQwsDisplay.refCount);
+ return 1;
+ }
+
+ /* Open the framebuffer and map it directly */
+ if (!pvrQwsInitFbScreen(0)) {
+ --(pvrQwsDisplay.refCount);
+ return 0;
+ }
+
+ /* Clear the other screens. We will create them if they are referenced */
+ for (screen = 1; screen < PVRQWS_MAX_SCREENS; ++screen)
+ memset(&(pvrQwsDisplay.screens[screen]), 0, sizeof(PvrQwsScreenInfo));
+
+ /* The display is open and ready */
+ ++(pvrQwsDisplay.refCount);
+ return 1;
+}
+
+void pvrQwsDisplayClose(void)
+{
+ int screen;
+
+ if (pvrQwsDisplay.refCount == 0)
+ return;
+ if (--(pvrQwsDisplay.refCount) > 0)
+ return;
+
+ /* Prevent pvrQwsDestroyContext from being called for the time being */
+ ++pvrQwsDisplay.numDrawables;
+
+ /* Free the screens */
+ for (screen = 0; screen < PVRQWS_MAX_SCREENS; ++screen) {
+ PvrQwsScreenInfo *info = &(pvrQwsDisplay.screens[screen]);
+ if (info->screenDrawable)
+ pvrQwsDestroyDrawableForced(info->screenDrawable);
+ if (info->frameBuffer)
+ PVR2DMemFree(pvrQwsDisplay.context, info->frameBuffer);
+ if (info->mapped && info->needsUnmap)
+ munmap(info->mapped, info->mappedLength);
+ }
+
+ /* Now it is safe to destroy the PVR2D context */
+ --pvrQwsDisplay.numDrawables;
+ if (pvrQwsDisplay.context)
+ PVR2DDestroyDeviceContext(pvrQwsDisplay.context);
+
+ memset(&pvrQwsDisplay, 0, sizeof(pvrQwsDisplay));
+}
+
+int pvrQwsDisplayIsOpen(void)
+{
+ return (pvrQwsDisplay.refCount > 0);
+}
+
+/* Ensure that a specific screen has been initialized */
+static int pvrQwsEnsureScreen(int screen)
+{
+ if (screen < 0 || screen >= PVRQWS_MAX_SCREENS)
+ return 0;
+ if (!screen)
+ return 1;
+ return pvrQwsInitFbScreen(screen);
+}
+
+PvrQwsDrawable *pvrQwsScreenWindow(int screen)
+{
+ PvrQwsDrawable *drawable;
+
+ if (!pvrQwsEnsureScreen(screen))
+ return 0;
+
+ drawable = pvrQwsDisplay.screens[screen].screenDrawable;
+ if (drawable)
+ return drawable;
+
+ drawable = (PvrQwsDrawable *)calloc(1, sizeof(PvrQwsDrawable));
+ if (!drawable)
+ return 0;
+
+ drawable->type = PvrQwsScreen;
+ drawable->screen = screen;
+ drawable->pixelFormat = pvrQwsDisplay.screens[screen].pixelFormat;
+ drawable->rect = pvrQwsDisplay.screens[screen].screenRect;
+ drawable->visibleRects[0] = drawable->rect;
+ drawable->numVisibleRects = 1;
+ drawable->isFullScreen = 1;
+
+ if (!pvrQwsAddDrawable()) {
+ free(drawable);
+ return 0;
+ }
+
+ pvrQwsDisplay.screens[screen].screenDrawable = drawable;
+
+ return drawable;
+}
+
+PvrQwsDrawable *pvrQwsCreateWindow(int screen, long winId, const PvrQwsRect *rect)
+{
+ PvrQwsDrawable *drawable;
+
+ if (!pvrQwsEnsureScreen(screen))
+ return 0;
+
+ drawable = (PvrQwsDrawable *)calloc(1, sizeof(PvrQwsDrawable));
+ if (!drawable)
+ return 0;
+
+ drawable->type = PvrQwsWindow;
+ drawable->winId = winId;
+ drawable->refCount = 1;
+ drawable->screen = screen;
+ drawable->pixelFormat = pvrQwsDisplay.screens[screen].pixelFormat;
+ drawable->rect = *rect;
+
+ if (!pvrQwsAddDrawable()) {
+ free(drawable);
+ return 0;
+ }
+
+ drawable->nextWinId = pvrQwsDisplay.firstWinId;
+ pvrQwsDisplay.firstWinId = drawable;
+
+ return drawable;
+}
+
+PvrQwsDrawable *pvrQwsFetchWindow(long winId)
+{
+ PvrQwsDrawable *drawable = pvrQwsDisplay.firstWinId;
+ while (drawable != 0 && drawable->winId != winId)
+ drawable = drawable->nextWinId;
+
+ if (drawable)
+ ++(drawable->refCount);
+ return drawable;
+}
+
+int pvrQwsReleaseWindow(PvrQwsDrawable *drawable)
+{
+ if (drawable->type == PvrQwsWindow)
+ return (--(drawable->refCount) <= 0);
+ else
+ return 0;
+}
+
+PvrQwsDrawable *pvrQwsCreatePixmap(int width, int height, int screen)
+{
+ PvrQwsDrawable *drawable;
+
+ if (!pvrQwsEnsureScreen(screen))
+ return 0;
+
+ drawable = (PvrQwsDrawable *)calloc(1, sizeof(PvrQwsDrawable));
+ if (!drawable)
+ return 0;
+
+ drawable->type = PvrQwsPixmap;
+ drawable->screen = screen;
+ drawable->pixelFormat = pvrQwsDisplay.screens[screen].pixelFormat;
+ drawable->rect.x = 0;
+ drawable->rect.y = 0;
+ drawable->rect.width = width;
+ drawable->rect.height = height;
+
+ if (!pvrQwsAddDrawable()) {
+ free(drawable);
+ return 0;
+ }
+
+ return drawable;
+}
+
+static void pvrQwsDestroyDrawableForced(PvrQwsDrawable *drawable)
+{
+ /* Remove the drawable from the display's winId list */
+ PvrQwsDrawable *current = pvrQwsDisplay.firstWinId;
+ PvrQwsDrawable *prev = 0;
+ while (current != 0 && current != drawable) {
+ prev = current;
+ current = current->nextWinId;
+ }
+ if (current != 0) {
+ if (prev)
+ prev->nextWinId = current->nextWinId;
+ else
+ pvrQwsDisplay.firstWinId = current->nextWinId;
+ }
+
+ pvrQwsFreeBuffers(drawable);
+ free(drawable);
+
+ --pvrQwsDisplay.numDrawables;
+ if (pvrQwsDisplay.numDrawables == 0)
+ pvrQwsDestroyContext();
+}
+
+void pvrQwsDestroyDrawable(PvrQwsDrawable *drawable)
+{
+ if (drawable && drawable->type != PvrQwsScreen)
+ pvrQwsDestroyDrawableForced(drawable);
+}
+
+PvrQwsDrawableType pvrQwsGetDrawableType(PvrQwsDrawable *drawable)
+{
+ return drawable->type;
+}
+
+void pvrQwsSetVisibleRegion
+ (PvrQwsDrawable *drawable, const PvrQwsRect *rects, int numRects)
+{
+ int index, indexOut;
+ PvrQwsRect *rect;
+ PvrQwsRect *screenRect;
+
+ /* Visible regions don't make sense for pixmaps */
+ if (drawable->type == PvrQwsPixmap)
+ return;
+
+ /* Restrict the number of rectangles to prevent buffer overflow */
+ if (numRects > PVRQWS_MAX_VISIBLE_RECTS)
+ numRects = PVRQWS_MAX_VISIBLE_RECTS;
+ if (numRects > 0)
+ memcpy(drawable->visibleRects, rects, numRects * sizeof(PvrQwsRect));
+
+ /* Convert the rectangles into screen-relative co-ordinates and
+ then clamp them to the screen boundaries. If any of the
+ clamped rectangles are empty, remove them from the list */
+ screenRect = &(pvrQwsDisplay.screens[drawable->screen].screenRect);
+ indexOut = 0;
+ for (index = 0, rect = drawable->visibleRects; index < numRects; ++index, ++rect) {
+ if (rect->x < 0) {
+ rect->width += rect->x;
+ rect->x = 0;
+ if (rect->width < 0)
+ rect->width = 0;
+ } else if (rect->x >= screenRect->width) {
+ rect->x = screenRect->width;
+ rect->width = 0;
+ }
+ if ((rect->x + rect->width) > screenRect->width) {
+ rect->width = screenRect->width - rect->x;
+ }
+ if (rect->y < 0) {
+ rect->height += rect->y;
+ rect->y = 0;
+ if (rect->height < 0)
+ rect->height = 0;
+ } else if (rect->y >= screenRect->height) {
+ rect->y = screenRect->height;
+ rect->height = 0;
+ }
+ if ((rect->y + rect->height) > screenRect->height) {
+ rect->height = screenRect->height - rect->y;
+ }
+ if (rect->width > 0 && rect->height > 0) {
+ if (index != indexOut)
+ drawable->visibleRects[indexOut] = *rect;
+ ++indexOut;
+ }
+ }
+ drawable->numVisibleRects = indexOut;
+}
+
+void pvrQwsClearVisibleRegion(PvrQwsDrawable *drawable)
+{
+ if (drawable->type != PvrQwsPixmap)
+ drawable->numVisibleRects = 0;
+}
+
+void pvrQwsSetGeometry(PvrQwsDrawable *drawable, const PvrQwsRect *rect)
+{
+ /* We can only change the geometry of window drawables */
+ if (drawable->type != PvrQwsWindow)
+ return;
+
+ /* If the position has changed, then clear the visible region */
+ if (drawable->rect.x != rect->x || drawable->rect.y != rect->y) {
+ drawable->rect.x = rect->x;
+ drawable->rect.y = rect->y;
+ drawable->numVisibleRects = 0;
+ }
+
+ /* If the size has changed, then clear the visible region and
+ invalidate the drawable's buffers. Invalidating the buffers
+ will force EGL to recreate the drawable, which will then
+ allocate new buffers for the new size */
+ if (drawable->rect.width != rect->width ||
+ drawable->rect.height != rect->height) {
+ drawable->rect.width = rect->width;
+ drawable->rect.height = rect->height;
+ drawable->numVisibleRects = 0;
+ pvrQwsInvalidateBuffers(drawable);
+ }
+}
+
+void pvrQwsGetGeometry(PvrQwsDrawable *drawable, PvrQwsRect *rect)
+{
+ *rect = drawable->rect;
+}
+
+void pvrQwsSetRotation(PvrQwsDrawable *drawable, int angle)
+{
+ if (drawable->rotationAngle != angle) {
+ drawable->rotationAngle = angle;
+
+ /* Force the buffers to be recreated if the rotation angle changes */
+ pvrQwsInvalidateBuffers(drawable);
+ }
+}
+
+int pvrQwsGetStride(PvrQwsDrawable *drawable)
+{
+ if (drawable->backBuffersValid)
+ return drawable->strideBytes;
+ else
+ return 0;
+}
+
+PvrQwsPixelFormat pvrQwsGetPixelFormat(PvrQwsDrawable *drawable)
+{
+ return (PvrQwsPixelFormat)(drawable->pixelFormat);
+}
+
+void *pvrQwsGetRenderBuffer(PvrQwsDrawable *drawable)
+{
+ if (drawable->backBuffersValid)
+ return drawable->backBuffers[drawable->currentBackBuffer]->pBase;
+ else
+ return 0;
+}
+
+int pvrQwsAllocBuffers(PvrQwsDrawable *drawable)
+{
+ int index;
+ int numBuffers = PVRQWS_MAX_BACK_BUFFERS;
+ if (drawable->type == PvrQwsPixmap)
+ numBuffers = 1;
+ if (drawable->backBuffers[0]) {
+ if (drawable->backBuffersValid)
+ return 1;
+ if (!drawable->usingFlipBuffers) {
+ for (index = 0; index < numBuffers; ++index)
+ PVR2DMemFree(pvrQwsDisplay.context, drawable->backBuffers[index]);
+ }
+ }
+ drawable->stridePixels = (drawable->rect.width + 31) & ~31;
+ drawable->strideBytes =
+ drawable->stridePixels *
+ pvrQwsDisplay.screens[drawable->screen].bytesPerPixel;
+ drawable->usingFlipBuffers =
+ (pvrQwsDisplay.numFlipBuffers > 0 && drawable->isFullScreen);
+ if (drawable->usingFlipBuffers) {
+ if (numBuffers > (int)(pvrQwsDisplay.numFlipBuffers))
+ numBuffers = pvrQwsDisplay.numFlipBuffers;
+ for (index = 0; index < numBuffers; ++index)
+ drawable->backBuffers[index] = pvrQwsDisplay.flipBuffers[index];
+ } else {
+ for (index = 0; index < numBuffers; ++index) {
+ if (PVR2DMemAlloc(pvrQwsDisplay.context,
+ drawable->strideBytes * drawable->rect.height,
+ 128, 0,
+ &(drawable->backBuffers[index])) != PVR2D_OK) {
+ while (--index >= 0)
+ PVR2DMemFree(pvrQwsDisplay.context, drawable->backBuffers[index]);
+ memset(drawable->backBuffers, 0, sizeof(drawable->backBuffers));
+ drawable->backBuffersValid = 0;
+ return 0;
+ }
+ }
+ }
+ for (index = numBuffers; index < PVRQWS_MAX_BACK_BUFFERS; ++index) {
+ drawable->backBuffers[index] = drawable->backBuffers[0];
+ }
+ drawable->backBuffersValid = 1;
+ drawable->currentBackBuffer = 0;
+ return 1;
+}
+
+void pvrQwsFreeBuffers(PvrQwsDrawable *drawable)
+{
+ int index;
+ int numBuffers = PVRQWS_MAX_BACK_BUFFERS;
+ if (drawable->type == PvrQwsPixmap)
+ numBuffers = 1;
+ if (!drawable->usingFlipBuffers) {
+ for (index = 0; index < numBuffers; ++index) {
+ if (drawable->backBuffers[index])
+ PVR2DMemFree(pvrQwsDisplay.context, drawable->backBuffers[index]);
+ }
+ }
+ memset(drawable->backBuffers, 0, sizeof(drawable->backBuffers));
+ drawable->backBuffersValid = 0;
+ drawable->usingFlipBuffers = 0;
+}
+
+void pvrQwsInvalidateBuffers(PvrQwsDrawable *drawable)
+{
+ drawable->backBuffersValid = 0;
+}
+
+int pvrQwsGetBuffers
+ (PvrQwsDrawable *drawable, PVR2DMEMINFO **source, PVR2DMEMINFO **render)
+{
+ if (!drawable->backBuffersValid)
+ return 0;
+ *render = drawable->backBuffers[drawable->currentBackBuffer];
+ *source = drawable->backBuffers
+ [(drawable->currentBackBuffer + PVRQWS_MAX_BACK_BUFFERS - 1) %
+ PVRQWS_MAX_BACK_BUFFERS];
+ return 1;
+}
+
+int pvrQwsSwapBuffers(PvrQwsDrawable *drawable, int repaintOnly)
+{
+ PVR2DMEMINFO *buffer;
+ PvrQwsRect *rect;
+ int index;
+
+ /* Bail out if the back buffers have been invalidated */
+ if (!drawable->backBuffersValid)
+ return 0;
+
+ /* If there is a swap function, then use that instead */
+ if (drawable->swapFunction) {
+ (*(drawable->swapFunction))(drawable, drawable->userData, repaintOnly);
+ if (!repaintOnly) {
+ drawable->currentBackBuffer
+ = (drawable->currentBackBuffer + 1) % PVRQWS_MAX_BACK_BUFFERS;
+ }
+ return 1;
+ }
+
+ /* Iterate through the visible rectangles and blit them to the screen */
+ if (!repaintOnly) {
+ index = drawable->currentBackBuffer;
+ } else {
+ index = (drawable->currentBackBuffer + PVRQWS_MAX_BACK_BUFFERS - 1)
+ % PVRQWS_MAX_BACK_BUFFERS;
+ }
+ buffer = drawable->backBuffers[index];
+ rect = drawable->visibleRects;
+ if (drawable->usingFlipBuffers) {
+ PVR2DPresentFlip(pvrQwsDisplay.context, pvrQwsDisplay.flipChain, buffer, 0);
+ } else if (pvrQwsDisplay.usePresentBlit && drawable->numVisibleRects > 0) {
+ PVR2DRECT pvrRects[PVRQWS_MAX_VISIBLE_RECTS];
+ for (index = 0; index < drawable->numVisibleRects; ++index, ++rect) {
+ pvrRects[index].left = rect->x;
+ pvrRects[index].top = rect->y;
+ pvrRects[index].right = rect->x + rect->width;
+ pvrRects[index].bottom = rect->y + rect->height;
+ }
+ for (index = 0; index < drawable->numVisibleRects; index += 4) {
+ int numClip = drawable->numVisibleRects - index;
+ if (numClip > 4) /* No more than 4 clip rects at a time */
+ numClip = 4;
+ PVR2DSetPresentBltProperties
+ (pvrQwsDisplay.context,
+ PVR2D_PRESENT_PROPERTY_SRCSTRIDE |
+ PVR2D_PRESENT_PROPERTY_DSTSIZE |
+ PVR2D_PRESENT_PROPERTY_DSTPOS |
+ PVR2D_PRESENT_PROPERTY_CLIPRECTS,
+ drawable->strideBytes,
+ drawable->rect.width, drawable->rect.height,
+ drawable->rect.x, drawable->rect.y,
+ numClip, pvrRects + index, 0);
+ PVR2DPresentBlt(pvrQwsDisplay.context, buffer, 0);
+ }
+ PVR2DQueryBlitsComplete(pvrQwsDisplay.context, buffer, 1);
+ } else {
+ /* TODO: use PVR2DBltClipped for faster transfers of clipped windows */
+ PVR2DBLTINFO blit;
+ for (index = 0; index < drawable->numVisibleRects; ++index, ++rect) {
+ memset(&blit, 0, sizeof(blit));
+
+ blit.CopyCode = PVR2DROPcopy;
+ blit.BlitFlags = PVR2D_BLIT_DISABLE_ALL;
+
+ blit.pSrcMemInfo = buffer;
+ blit.SrcStride = drawable->strideBytes;
+ blit.SrcX = rect->x - drawable->rect.x;
+ blit.SrcY = rect->y - drawable->rect.y;
+ blit.SizeX = rect->width;
+ blit.SizeY = rect->height;
+ blit.SrcFormat = drawable->pixelFormat;
+
+ blit.pDstMemInfo = pvrQwsDisplay.screens[drawable->screen].frameBuffer;
+ blit.DstStride = pvrQwsDisplay.screens[drawable->screen].screenStride;
+ blit.DstX = rect->x;
+ blit.DstY = rect->y;
+ blit.DSizeX = rect->width;
+ blit.DSizeY = rect->height;
+ blit.DstFormat = pvrQwsDisplay.screens[drawable->screen].pixelFormat;
+
+ PVR2DBlt(pvrQwsDisplay.context, &blit);
+ }
+ }
+
+ /* Swap the buffers */
+ if (!repaintOnly) {
+ drawable->currentBackBuffer
+ = (drawable->currentBackBuffer + 1) % PVRQWS_MAX_BACK_BUFFERS;
+ }
+ return 1;
+}
+
+void pvrQwsSetSwapFunction
+ (PvrQwsDrawable *drawable, PvrQwsSwapFunction func, void *userData)
+{
+ drawable->swapFunction = func;
+ drawable->userData = userData;
+}
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h
new file mode 100644
index 0000000000..8c8cc27018
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable.h
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PVRQWSDRAWABLE_H
+#define PVRQWSDRAWABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ int x, y, width, height;
+} PvrQwsRect;
+
+typedef enum
+{
+ PvrQwsScreen,
+ PvrQwsWindow,
+ PvrQwsPixmap
+
+} PvrQwsDrawableType;
+
+typedef enum
+{
+ PvrQws_1BPP = 0,
+ PvrQws_RGB565,
+ PvrQws_ARGB4444,
+ PvrQws_RGB888,
+ PvrQws_ARGB8888,
+ PvrQws_VGAEMU
+
+} PvrQwsPixelFormat;
+
+typedef struct _PvrQwsDrawable PvrQwsDrawable;
+
+typedef void (*PvrQwsSwapFunction)
+ (PvrQwsDrawable *drawable, void *userData, int repaintOnly);
+
+/* Open the display and prepare for window operations. The display
+ can be opened multiple times and each time is reference counted.
+ The display will be finally closed when the same number of
+ calls to pvrQwsDisplayClose() have been encountered */
+int pvrQwsDisplayOpen(void);
+
+/* Close the display */
+void pvrQwsDisplayClose(void);
+
+/* Determine if the display is already open */
+int pvrQwsDisplayIsOpen(void);
+
+/* Create a window that represents a particular framebuffer screen.
+ Initially the visible region will be the whole screen. If the screen
+ window has already been created, then will return the same value */
+PvrQwsDrawable *pvrQwsScreenWindow(int screen);
+
+/* Create a top-level window on a particular framebuffer screen.
+ Initially the window will not have a visible region */
+PvrQwsDrawable *pvrQwsCreateWindow(int screen, long winId, const PvrQwsRect *rect);
+
+/* Fetch an existing window for a window id and increase its refcount */
+PvrQwsDrawable *pvrQwsFetchWindow(long winId);
+
+/* Release the refcount on a window. Returns 1 if refcount is zero */
+int pvrQwsReleaseWindow(PvrQwsDrawable *drawable);
+
+/* Create an off-screen pixmap */
+PvrQwsDrawable *pvrQwsCreatePixmap(int width, int height, int screen);
+
+/* Destroy a previously-created drawable. Will not destroy screens. */
+void pvrQwsDestroyDrawable(PvrQwsDrawable *drawable);
+
+/* Get a drawable's type */
+PvrQwsDrawableType pvrQwsGetDrawableType(PvrQwsDrawable *drawable);
+
+/* Sets the visible region for a window or screen drawable. Pixels within
+ the specified rectangles will be copied to the framebuffer when the window
+ or screen is swapped. The rectangles should be in global co-ordinates */
+void pvrQwsSetVisibleRegion
+ (PvrQwsDrawable *drawable, const PvrQwsRect *rects, int numRects);
+
+/* Clear the visible region for a window or screen drawable,
+ effectively removing it from the screen */
+void pvrQwsClearVisibleRegion(PvrQwsDrawable *drawable);
+
+/* Set the geometry for a drawable. This can only be used on windows */
+void pvrQwsSetGeometry(PvrQwsDrawable *drawable, const PvrQwsRect *rect);
+
+/* Get the current geometry for a drawable */
+void pvrQwsGetGeometry(PvrQwsDrawable *drawable, PvrQwsRect *rect);
+
+/* Set the rotation angle in degrees */
+void pvrQwsSetRotation(PvrQwsDrawable *drawable, int angle);
+
+/* Get the line stride for a drawable. Returns zero if the buffers
+ are not allocated or have been invalidated */
+int pvrQwsGetStride(PvrQwsDrawable *drawable);
+
+/* Get the pixel format for a drawable */
+PvrQwsPixelFormat pvrQwsGetPixelFormat(PvrQwsDrawable *drawable);
+
+/* Get a pointer to the beginning of a drawable's current render buffer.
+ Returns null if the buffers are not allocated or have been invalidated */
+void *pvrQwsGetRenderBuffer(PvrQwsDrawable *drawable);
+
+/* Allocate the buffers associated with a drawable. We allocate one buffer
+ for pixmaps, and several for windows and screens */
+int pvrQwsAllocBuffers(PvrQwsDrawable *drawable);
+
+/* Free the buffers associated with a drawable */
+void pvrQwsFreeBuffers(PvrQwsDrawable *drawable);
+
+/* Invalidate the buffers associated with a drawable. The buffers will
+ still be allocated but the next attempt to swap the buffers will fail */
+void pvrQwsInvalidateBuffers(PvrQwsDrawable *drawable);
+
+/* Swap the back buffers for a window or screen and copy to the framebuffer */
+int pvrQwsSwapBuffers(PvrQwsDrawable *drawable, int repaintOnly);
+
+/* Set the swap function for a drawable. When pvrQwsSwapBuffers()
+ is called on the drawable, the supplied function will be called
+ instead of copying the drawable contents to the screen. This allows
+ higher-level compositors to know when a drawable has changed.
+ The swap function can be set to null to return to normal processing */
+void pvrQwsSetSwapFunction
+ (PvrQwsDrawable *drawable, PvrQwsSwapFunction func, void *userData);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h
new file mode 100644
index 0000000000..3ad0693e02
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwsdrawable_p.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PVRQWSDRAWABLE_P_H
+#define PVRQWSDRAWABLE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// reasons. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <pvr2d.h>
+#include "pvrqwsdrawable.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PVRQWS_MAX_VISIBLE_RECTS 32
+#define PVRQWS_MAX_SCREENS 1
+#define PVRQWS_MAX_BACK_BUFFERS 2
+#define PVRQWS_MAX_FLIP_BUFFERS 2
+
+typedef struct {
+
+ PvrQwsRect screenRect;
+ int screenStride;
+ PVR2DFORMAT pixelFormat;
+ int bytesPerPixel;
+ PVR2DMEMINFO *frameBuffer;
+ PvrQwsDrawable *screenDrawable;
+ void *mapped;
+ int mappedLength;
+ unsigned long screenStart;
+ int needsUnmap;
+ int initialized;
+
+} PvrQwsScreenInfo;
+
+typedef struct {
+
+ int refCount;
+ PvrQwsScreenInfo screens[PVRQWS_MAX_SCREENS];
+ PVR2DCONTEXTHANDLE context;
+ int numDrawables;
+ unsigned long numFlipBuffers;
+ PVR2DFLIPCHAINHANDLE flipChain;
+ PVR2DMEMINFO *flipBuffers[PVRQWS_MAX_FLIP_BUFFERS];
+ int usePresentBlit;
+ PvrQwsDrawable *firstWinId;
+
+} PvrQwsDisplay;
+
+extern PvrQwsDisplay pvrQwsDisplay;
+
+struct _PvrQwsDrawable
+{
+ PvrQwsDrawableType type;
+ long winId;
+ int refCount;
+ PvrQwsRect rect;
+ int screen;
+ PVR2DFORMAT pixelFormat;
+ PvrQwsRect visibleRects[PVRQWS_MAX_VISIBLE_RECTS];
+ int numVisibleRects;
+ PVR2DMEMINFO *backBuffers[PVRQWS_MAX_BACK_BUFFERS];
+ int currentBackBuffer;
+ int backBuffersValid;
+ int usingFlipBuffers;
+ int isFullScreen;
+ int strideBytes;
+ int stridePixels;
+ int rotationAngle;
+ PvrQwsSwapFunction swapFunction;
+ void *userData;
+ PvrQwsDrawable *nextWinId;
+
+};
+
+/* Get the current source and render buffers for a drawable */
+int pvrQwsGetBuffers
+ (PvrQwsDrawable *drawable, PVR2DMEMINFO **source, PVR2DMEMINFO **render);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c
new file mode 100644
index 0000000000..f861838e90
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c
@@ -0,0 +1,402 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <GLES/eglplatform.h>
+#include <wsegl.h>
+#include <pvr2d.h>
+#include <string.h>
+#include <sys/mman.h>
+#include "pvrqwsdrawable_p.h"
+
+#define WSEGL_UNUSED(x) (void)x;
+
+// If the PVR2D version is not specified, then assume MBX-style headers.
+// If the version is defined, then we assume that we have SGX-style headers.
+#if !defined(PVR2D_REV_MAJOR)
+#define WSEGL_CAP_WINDOWS_USE_HW_SYNC WSEGL_CAP_WINDOWS_USE_MBX_SYNC
+#define WSEGL_CAP_PIXMAPS_USE_HW_SYNC WSEGL_CAP_PIXMAPS_USE_MBX_SYNC
+#endif
+
+/* Capability information for the display */
+static WSEGLCaps const wseglDisplayCaps[] = {
+ {WSEGL_CAP_WINDOWS_USE_HW_SYNC, 1},
+ {WSEGL_CAP_PIXMAPS_USE_HW_SYNC, 1},
+ {WSEGL_NO_CAPS, 0}
+};
+
+/* Configuration information for the display */
+static WSEGLConfig wseglDisplayConfigs[] = {
+ {WSEGL_DRAWABLE_WINDOW, WSEGL_PIXELFORMAT_565, WSEGL_FALSE,
+ 0, 0, 0, WSEGL_OPAQUE, 0},
+ {WSEGL_DRAWABLE_PIXMAP, WSEGL_PIXELFORMAT_565, WSEGL_FALSE,
+ 0, 0, 0, WSEGL_OPAQUE, 0},
+ {WSEGL_NO_DRAWABLE, 0, 0, 0, 0, 0, 0, 0}
+};
+
+/* Determine if nativeDisplay is a valid display handle */
+static WSEGLError wseglIsDisplayValid(NativeDisplayType nativeDisplay)
+{
+ /* We only have the default display in this system */
+ if (nativeDisplay == WSEGL_DEFAULT_DISPLAY)
+ return WSEGL_SUCCESS;
+ else
+ return WSEGL_BAD_NATIVE_DISPLAY;
+}
+
+/* Initialize a native display for use with WSEGL */
+static WSEGLError wseglInitializeDisplay
+ (NativeDisplayType nativeDisplay, WSEGLDisplayHandle *display,
+ const WSEGLCaps **caps, WSEGLConfig **configs)
+{
+ WSEGLPixelFormat pixelFormat;
+
+ /* Bail out if the native display is incorrect */
+ if (nativeDisplay != WSEGL_DEFAULT_DISPLAY)
+ return WSEGL_CANNOT_INITIALISE;
+
+ /* Open the PVR/QWS display, which will initialize the framebuffer */
+ if (!pvrQwsDisplayOpen())
+ return WSEGL_CANNOT_INITIALISE;
+
+ /* Convert the PVR2D pixel format into a WSEGL pixel format */
+ switch (pvrQwsDisplay.screens[0].pixelFormat) {
+ case PVR2D_RGB565:
+ pixelFormat = WSEGL_PIXELFORMAT_565;
+ break;
+
+ case PVR2D_ARGB4444:
+ pixelFormat = WSEGL_PIXELFORMAT_4444;
+ break;
+
+ case PVR2D_ARGB8888:
+ pixelFormat = WSEGL_PIXELFORMAT_8888;
+ break;
+
+ default:
+ pvrQwsDisplayClose();
+ return WSEGL_CANNOT_INITIALISE;
+ }
+ wseglDisplayConfigs[0].ePixelFormat = pixelFormat;
+ wseglDisplayConfigs[1].ePixelFormat = pixelFormat;
+
+ /* The display has been initialized */
+ *display = (WSEGLDisplayHandle)&pvrQwsDisplay;
+ *caps = wseglDisplayCaps;
+ *configs = wseglDisplayConfigs;
+ return WSEGL_SUCCESS;
+}
+
+/* Close the WSEGL display */
+static WSEGLError wseglCloseDisplay(WSEGLDisplayHandle display)
+{
+ if (display == (WSEGLDisplayHandle)&pvrQwsDisplay)
+ pvrQwsDisplayClose();
+ return WSEGL_SUCCESS;
+}
+
+static WSEGLRotationAngle wseglRotationValue(int degrees)
+{
+ switch (degrees) {
+ case 90: return WSEGL_ROTATE_90;
+ case 180: return WSEGL_ROTATE_180;
+ case 270: return WSEGL_ROTATE_270;
+ default: return WSEGL_ROTATE_0;
+ }
+}
+
+/* Create the WSEGL drawable version of a native window */
+static WSEGLError wseglCreateWindowDrawable
+ (WSEGLDisplayHandle display, WSEGLConfig *config,
+ WSEGLDrawableHandle *drawable, NativeWindowType nativeWindow,
+ WSEGLRotationAngle *rotationAngle)
+{
+ PvrQwsDrawable *draw;
+
+ WSEGL_UNUSED(display);
+ WSEGL_UNUSED(config);
+
+ /* Check for special handles that indicate framebuffer screens */
+ if (nativeWindow >= (NativeWindowType)0 &&
+ nativeWindow < (NativeWindowType)PVRQWS_MAX_SCREENS) {
+ PvrQwsDrawable *screen = pvrQwsScreenWindow((int)nativeWindow);
+ if (!screen)
+ return WSEGL_OUT_OF_MEMORY;
+ *drawable = (WSEGLDrawableHandle)screen;
+ if (!pvrQwsAllocBuffers(screen))
+ return WSEGL_OUT_OF_MEMORY;
+ *rotationAngle = wseglRotationValue(screen->rotationAngle);
+ return WSEGL_SUCCESS;
+ }
+
+ /* The native window is the winId - fetch the underlying drawable */
+ draw = pvrQwsFetchWindow((long)nativeWindow);
+ if (!draw)
+ return WSEGL_BAD_DRAWABLE;
+
+ /* The drawable is ready to go */
+ *drawable = (WSEGLDrawableHandle)draw;
+ *rotationAngle = wseglRotationValue(draw->rotationAngle);
+ if (!pvrQwsAllocBuffers(draw))
+ return WSEGL_OUT_OF_MEMORY;
+ return WSEGL_SUCCESS;
+}
+
+/* Create the WSEGL drawable version of a native pixmap */
+static WSEGLError wseglCreatePixmapDrawable
+ (WSEGLDisplayHandle display, WSEGLConfig *config,
+ WSEGLDrawableHandle *drawable, NativePixmapType nativePixmap,
+ WSEGLRotationAngle *rotationAngle)
+{
+ WSEGL_UNUSED(display);
+ WSEGL_UNUSED(config);
+ if (!nativePixmap)
+ return WSEGL_BAD_NATIVE_PIXMAP;
+ if (!pvrQwsAllocBuffers((PvrQwsDrawable *)nativePixmap))
+ return WSEGL_OUT_OF_MEMORY;
+ *drawable = (WSEGLDrawableHandle)nativePixmap;
+ *rotationAngle = WSEGL_ROTATE_0;
+ return WSEGL_SUCCESS;
+}
+
+/* Delete a specific drawable */
+static WSEGLError wseglDeleteDrawable(WSEGLDrawableHandle _drawable)
+{
+ PvrQwsDrawable *drawable = (PvrQwsDrawable *)_drawable;
+ if (!drawable || drawable->type == PvrQwsScreen)
+ return WSEGL_SUCCESS;
+ if (pvrQwsDisplay.numFlipBuffers == 0)
+ pvrQwsFreeBuffers(drawable);
+ if (pvrQwsReleaseWindow(drawable))
+ pvrQwsDestroyDrawable(drawable);
+ return WSEGL_SUCCESS;
+}
+
+/* Swap the contents of a drawable to the screen */
+static WSEGLError wseglSwapDrawable
+ (WSEGLDrawableHandle _drawable, unsigned long data)
+{
+ WSEGL_UNUSED(data);
+ PvrQwsDrawable *drawable = (PvrQwsDrawable *)_drawable;
+ if (drawable->type != PvrQwsPixmap && !pvrQwsSwapBuffers(drawable, 0))
+ return WSEGL_BAD_DRAWABLE;
+ else
+ return WSEGL_SUCCESS;
+}
+
+/* Set the swap interval of a window drawable */
+static WSEGLError wseglSwapControlInterval
+ (WSEGLDrawableHandle drawable, unsigned long interval)
+{
+ WSEGL_UNUSED(drawable);
+ if (pvrQwsDisplay.flipChain) {
+ PVR2DSetPresentFlipProperties
+ (pvrQwsDisplay.context, pvrQwsDisplay.flipChain,
+ PVR2D_PRESENT_PROPERTY_INTERVAL, 0, 0, 0, NULL, interval);
+ }
+ return WSEGL_SUCCESS;
+}
+
+/* Flush native rendering requests on a drawable */
+static WSEGLError wseglWaitNative
+ (WSEGLDrawableHandle drawable, unsigned long engine)
+{
+ WSEGL_UNUSED(drawable);
+ if (engine == WSEGL_DEFAULT_NATIVE_ENGINE)
+ return WSEGL_SUCCESS;
+ else
+ return WSEGL_BAD_NATIVE_ENGINE;
+}
+
+/* Copy color data from a drawable to a native pixmap */
+static WSEGLError wseglCopyFromDrawable
+ (WSEGLDrawableHandle _drawable, NativePixmapType nativePixmap)
+{
+ PvrQwsDrawable *drawable = (PvrQwsDrawable *)_drawable;
+ PvrQwsDrawable *pixmap = (PvrQwsDrawable *)nativePixmap;
+ PVR2DBLTINFO blit;
+
+ if (!drawable || !drawable->backBuffersValid)
+ return WSEGL_BAD_NATIVE_WINDOW;
+ if (!pixmap || !pixmap->backBuffersValid)
+ return WSEGL_BAD_NATIVE_PIXMAP;
+
+ memset(&blit, 0, sizeof(blit));
+
+ blit.CopyCode = PVR2DROPcopy;
+ blit.BlitFlags = PVR2D_BLIT_DISABLE_ALL;
+
+ blit.pSrcMemInfo = drawable->backBuffers[drawable->currentBackBuffer];
+ blit.SrcStride = drawable->strideBytes;
+ blit.SrcX = 0;
+ blit.SrcY = 0;
+ blit.SizeX = drawable->rect.width;
+ blit.SizeY = drawable->rect.height;
+ blit.SrcFormat = drawable->pixelFormat;
+
+ blit.pDstMemInfo = pixmap->backBuffers[pixmap->currentBackBuffer];
+ blit.DstStride = pixmap->strideBytes;
+ blit.DstX = 0;
+ blit.DstY = 0;
+ blit.DSizeX = pixmap->rect.width;
+ blit.DSizeY = pixmap->rect.height;
+ blit.DstFormat = pixmap->pixelFormat;
+
+ PVR2DBlt(pvrQwsDisplay.context, &blit);
+ PVR2DQueryBlitsComplete
+ (pvrQwsDisplay.context, pixmap->backBuffers[pixmap->currentBackBuffer], 1);
+
+ return WSEGL_SUCCESS;
+}
+
+/* Copy color data from a PBuffer to a native pixmap */
+static WSEGLError wseglCopyFromPBuffer
+ (void *address, unsigned long width, unsigned long height,
+ unsigned long stride, WSEGLPixelFormat format,
+ NativePixmapType nativePixmap)
+{
+ PvrQwsDrawable *pixmap = (PvrQwsDrawable *)nativePixmap;
+ PVR2DFORMAT pixelFormat;
+
+ if (!pixmap)
+ return WSEGL_BAD_NATIVE_PIXMAP;
+
+ /* We can only copy under certain conditions */
+ switch (format) {
+ case WSEGL_PIXELFORMAT_565:
+ pixelFormat = PVR2D_RGB565; break;
+ case WSEGL_PIXELFORMAT_4444:
+ pixelFormat = PVR2D_ARGB4444; break;
+ case WSEGL_PIXELFORMAT_8888:
+ pixelFormat = PVR2D_ARGB8888; break;
+ default:
+ return WSEGL_BAD_CONFIG;
+ }
+ if (width > (unsigned long)(pixmap->rect.width) ||
+ height > (unsigned long)(pixmap->rect.height) ||
+ pixelFormat != pixmap->pixelFormat) {
+ return WSEGL_BAD_CONFIG;
+ }
+
+ /* We'd like to use PVR2DBlt to do this, but there is no easy way
+ to map the virtual "address" into physical space to be able
+ to use the hardware assist. Use memcpy to do the work instead.
+ Note: PBuffer's are upside down, so we copy from the bottom up */
+ char *srcaddr = (char *)address;
+ char *dstaddr = (char *)(pixmap->backBuffers[pixmap->currentBackBuffer]->pBase);
+ int dststride = pixmap->strideBytes;
+ int srcwidth = ((int)width) * pvrQwsDisplay.screens[0].bytesPerPixel;
+ srcaddr += height * stride;
+ while (height > 0) {
+ srcaddr -= (int)stride;
+ memcpy(dstaddr, srcaddr, srcwidth);
+ dstaddr += dststride;
+ --height;
+ }
+ return WSEGL_SUCCESS;
+}
+
+/* Return the parameters of a drawable that are needed by the EGL layer */
+static WSEGLError wseglGetDrawableParameters
+ (WSEGLDrawableHandle _drawable, WSEGLDrawableParams *sourceParams,
+ WSEGLDrawableParams *renderParams)
+{
+ PvrQwsDrawable *drawable = (PvrQwsDrawable *)_drawable;
+ PVR2DMEMINFO *source, *render;
+ WSEGLPixelFormat pixelFormat;
+
+ if (!pvrQwsGetBuffers(drawable, &source, &render))
+ return WSEGL_BAD_DRAWABLE;
+
+ switch (drawable->pixelFormat) {
+ case PVR2D_RGB565:
+ default:
+ pixelFormat = WSEGL_PIXELFORMAT_565;
+ break;
+
+ case PVR2D_ARGB4444:
+ pixelFormat = WSEGL_PIXELFORMAT_4444;
+ break;
+
+ case PVR2D_ARGB8888:
+ pixelFormat = WSEGL_PIXELFORMAT_8888;
+ break;
+ }
+
+ sourceParams->ui32Width = drawable->rect.width;
+ sourceParams->ui32Height = drawable->rect.height;
+ sourceParams->ui32Stride = drawable->stridePixels;
+ sourceParams->ePixelFormat = pixelFormat;
+ sourceParams->pvLinearAddress = source->pBase;
+ sourceParams->ui32HWAddress = source->ui32DevAddr;
+ sourceParams->hPrivateData = source->hPrivateData;
+
+ renderParams->ui32Width = drawable->rect.width;
+ renderParams->ui32Height = drawable->rect.height;
+ renderParams->ui32Stride = drawable->stridePixels;
+ renderParams->ePixelFormat = pixelFormat;
+ renderParams->pvLinearAddress = render->pBase;
+ renderParams->ui32HWAddress = render->ui32DevAddr;
+ renderParams->hPrivateData = render->hPrivateData;
+
+ return WSEGL_SUCCESS;
+}
+
+static WSEGL_FunctionTable const wseglFunctions = {
+ WSEGL_VERSION,
+ wseglIsDisplayValid,
+ wseglInitializeDisplay,
+ wseglCloseDisplay,
+ wseglCreateWindowDrawable,
+ wseglCreatePixmapDrawable,
+ wseglDeleteDrawable,
+ wseglSwapDrawable,
+ wseglSwapControlInterval,
+ wseglWaitNative,
+ wseglCopyFromDrawable,
+ wseglCopyFromPBuffer,
+ wseglGetDrawableParameters
+};
+
+/* Return the table of WSEGL functions to the EGL implementation */
+const WSEGL_FunctionTable *WSEGL_GetFunctionTablePointer(void)
+{
+ return &wseglFunctions;
+}
diff --git a/src/plugins/gfxdrivers/powervr/README b/src/plugins/gfxdrivers/powervr/README
new file mode 100644
index 0000000000..513e7f5e9e
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/README
@@ -0,0 +1,66 @@
+PowerVR QScreen Driver
+======================
+
+This QScreen plugin driver allows the QtOpenGl module to integrate with PowerVR
+hardware from Imagination Technologies. Using this plugin, applications may use
+QGLWidget & QGLPixelBuffer with OpenGL ES. The integration with PowerVR drivers
+is built as two libraries: The actual QScreen plugin used by Qt (in the
+pvreglscreen directory) and a WSEGL plugin for the PowerVR drivers (in the
+QWSWSEGL directory).
+
+Qt/Embedded needs to be configured with the QT_QWS_CLIENTBLIT and
+QT_NO_QWS_CURSOR defines.
+
+The PowerVR drivers provide the WSEGL plugin API to allow window systems such as
+QWS to integrate correctly. In order to use the integration, the WSEGL plugin
+(libpvrQWSWSEGL.so, usually installed into the Qt library directory) must be in
+the LD library path. The PowerVR driver also needs to be told which WSEGL library
+to use. This is done by creating/modifying /etc/powervr.ini:
+
+[default]
+WindowSystem=libpvrQWSWSEGL.so
+
+Note: It is important that the /etc/powervr.ini file not contain ^M (Ctrl-M) DOS
+end of line markers at the end of its lines. If ^M markers are present, then the
+libpvrQWSWSEGL.so driver will not be loaded and the default null Linux driver
+will be loaded silently instead. Make sure that the end of line markers are
+strictly Unix-style markers.
+
+
+***************************************************************************
+* IMPORTANT: To build the QScreen plugin and the WSEGL library it depends *
+* on, the pvr2d.h, wsegl.h headers for your platform are required. You *
+* can find a copy of these headers in src/3rdparty/powervr for SGX based *
+* platforms like the TI OMAP3xxx. They probably will not work on MBX *
+* because of differences in the layout of certain PVR2D structures. *
+* You can tell Qt where to find the actual headers for your system by *
+* setting QMAKE_INCDIR_POWERVR in the mkspec. *
+***************************************************************************
+
+When you start a Qt/Embedded application, you should modify the QWS_DISPLAY
+environment variable to use the "powervr" driver instead of "LinuxFb". For
+example, if your original QWS_DISPLAY variable was:
+
+ LinuxFb:mmWidth40:mmHeight54:0
+
+then it should be changed to:
+
+ powervr:mmWidth40:mmHeight54:0
+
+To test the OpenGL ES integration, you can use the hellogl_es example and run it
+on the device with:
+
+ hellogl_es -qws
+
+The driver also supports screen rotation if Qt is configured with the
+-qt-gfx-transformed option and the QWS_DISPLAY variable is wrapped in a
+"Transformed" declaration:
+
+ Transformed:powervr:mmWidth40:mmHeight54:Rot90:0
+
+Know Issues:
+ * A QGLWidget may not have window decorations if it is a top-level window.
+ * On some platforms, starting a QWS application after the system has been up
+ for a long time may cause the driver to fail. This is due to fragmentation
+ of main memory prevening older PowerVR drivers from allocating a contiguous
+ region of phyical RAM for the GL surface.
diff --git a/src/plugins/gfxdrivers/powervr/powervr.pri b/src/plugins/gfxdrivers/powervr/powervr.pri
new file mode 100644
index 0000000000..9df8c0ed5b
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/powervr.pri
@@ -0,0 +1,2 @@
+
+INCLUDEPATH += $$QMAKE_INCDIR_POWERVR
diff --git a/src/plugins/gfxdrivers/powervr/powervr.pro b/src/plugins/gfxdrivers/powervr/powervr.pro
new file mode 100644
index 0000000000..f31ad042d8
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/powervr.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+SUBDIRS = QWSWSEGL pvreglscreen
+CONFIG += ordered
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp
new file mode 100644
index 0000000000..c981e0d300
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.cpp
@@ -0,0 +1,351 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "pvreglscreen.h"
+#include "pvreglwindowsurface.h"
+#include "pvrqwsdrawable_p.h"
+#include <QRegExp>
+#include <qwindowsystem_qws.h>
+#ifndef QT_NO_QWS_TRANSFORMED
+#include <qscreentransformed_qws.h>
+#endif
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/kd.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+//![0]
+PvrEglScreen::PvrEglScreen(int displayId)
+ : QGLScreen(displayId)
+{
+ setOptions(NativeWindows);
+ setSupportsBlitInClients(true);
+ setSurfaceFunctions(new PvrEglScreenSurfaceFunctions(this, displayId));
+//![0]
+ fd = -1;
+ ttyfd = -1;
+ doGraphicsMode = true;
+ oldKdMode = KD_TEXT;
+ parent = 0;
+
+ // Make sure that the EGL layer is initialized and the drivers loaded.
+ EGLDisplay dpy = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);
+ if (!eglInitialize(dpy, 0, 0))
+ qWarning("Could not initialize EGL display - are the drivers loaded?");
+
+ // Make sure that screen 0 is initialized.
+ pvrQwsScreenWindow(0);
+}
+
+PvrEglScreen::~PvrEglScreen()
+{
+ if (fd >= 0)
+ ::close(fd);
+}
+
+bool PvrEglScreen::initDevice()
+{
+ openTty();
+ return true;
+}
+
+bool PvrEglScreen::connect(const QString &displaySpec)
+{
+ if (!pvrQwsDisplayOpen())
+ return false;
+
+ // Initialize the QScreen properties.
+ data = (uchar *)(pvrQwsDisplay.screens[0].mapped);
+ w = pvrQwsDisplay.screens[0].screenRect.width;
+ h = pvrQwsDisplay.screens[0].screenRect.height;
+ lstep = pvrQwsDisplay.screens[0].screenStride;
+ dw = w;
+ dh = h;
+ size = h * lstep;
+ mapsize = size;
+ switch (pvrQwsDisplay.screens[0].pixelFormat) {
+ case PVR2D_RGB565:
+ d = 16;
+ setPixelFormat(QImage::Format_RGB16);
+ break;
+ case PVR2D_ARGB4444:
+ d = 16;
+ setPixelFormat(QImage::Format_ARGB4444_Premultiplied);
+ break;
+ case PVR2D_ARGB8888:
+ d = 32;
+ setPixelFormat(QImage::Format_ARGB32_Premultiplied);
+ break;
+ default:
+ pvrQwsDisplayClose();
+ qWarning("PvrEglScreen::connect: unsupported pixel format %d", (int)(pvrQwsDisplay.screens[0].pixelFormat));
+ return false;
+ }
+
+ // Handle display physical size spec.
+ QStringList displayArgs = displaySpec.split(QLatin1Char(':'));
+ QRegExp mmWidthRx(QLatin1String("mmWidth=?(\\d+)"));
+ int dimIdxW = displayArgs.indexOf(mmWidthRx);
+ QRegExp mmHeightRx(QLatin1String("mmHeight=?(\\d+)"));
+ int dimIdxH = displayArgs.indexOf(mmHeightRx);
+ if (dimIdxW >= 0) {
+ mmWidthRx.exactMatch(displayArgs.at(dimIdxW));
+ physWidth = mmWidthRx.cap(1).toInt();
+ if (dimIdxH < 0)
+ physHeight = dh*physWidth/dw;
+ }
+ if (dimIdxH >= 0) {
+ mmHeightRx.exactMatch(displayArgs.at(dimIdxH));
+ physHeight = mmHeightRx.cap(1).toInt();
+ if (dimIdxW < 0)
+ physWidth = dw*physHeight/dh;
+ }
+ if (dimIdxW < 0 && dimIdxH < 0) {
+ const int dpi = 72;
+ physWidth = qRound(dw * 25.4 / dpi);
+ physHeight = qRound(dh * 25.4 / dpi);
+ }
+
+ // Find the name of the tty device to use.
+ QRegExp ttyRegExp(QLatin1String("tty=(.*)"));
+ if (displayArgs.indexOf(ttyRegExp) != -1)
+ ttyDevice = ttyRegExp.cap(1);
+ if (displayArgs.contains(QLatin1String("nographicsmodeswitch")))
+ doGraphicsMode = false;
+
+ // The screen is ready.
+ return true;
+}
+
+void PvrEglScreen::disconnect()
+{
+ pvrQwsDisplayClose();
+}
+
+void PvrEglScreen::shutdownDevice()
+{
+ closeTty();
+}
+
+void PvrEglScreen::blit(const QImage &img, const QPoint &topLeft, const QRegion &region)
+{
+ QGLScreen::blit(img, topLeft, region);
+ sync();
+}
+
+void PvrEglScreen::solidFill(const QColor &color, const QRegion &region)
+{
+ QGLScreen::solidFill(color, region);
+ sync();
+}
+
+bool PvrEglScreen::chooseContext
+ (QGLContext *context, const QGLContext *shareContext)
+{
+ // We use PvrEglScreenSurfaceFunctions instead.
+ Q_UNUSED(context);
+ Q_UNUSED(shareContext);
+ return false;
+}
+
+bool PvrEglScreen::hasOpenGL()
+{
+ return true;
+}
+
+//![1]
+QWSWindowSurface* PvrEglScreen::createSurface(QWidget *widget) const
+{
+ if (qobject_cast<QGLWidget*>(widget))
+ return new PvrEglWindowSurface(widget, (PvrEglScreen *)this, displayId);
+
+ return QScreen::createSurface(widget);
+}
+
+QWSWindowSurface* PvrEglScreen::createSurface(const QString &key) const
+{
+ if (key == QLatin1String("PvrEgl"))
+ return new PvrEglWindowSurface();
+
+ return QScreen::createSurface(key);
+}
+//![1]
+
+#ifndef QT_NO_QWS_TRANSFORMED
+
+static const QScreen *parentScreen
+ (const QScreen *current, const QScreen *lookingFor)
+{
+ if (!current)
+ return 0;
+ switch (current->classId()) {
+ case QScreen::ProxyClass:
+ case QScreen::TransformedClass: {
+ const QScreen *child =
+ static_cast<const QProxyScreen *>(current)->screen();
+ if (child == lookingFor)
+ return current;
+ else
+ return parentScreen(child, lookingFor);
+ }
+ // Not reached.
+
+ case QScreen::MultiClass: {
+ QList<QScreen *> screens = current->subScreens();
+ foreach (QScreen *screen, screens) {
+ if (screen == lookingFor)
+ return current;
+ const QScreen *parent = parentScreen(screen, lookingFor);
+ if (parent)
+ return parent;
+ }
+ }
+ break;
+
+ default: break;
+ }
+ return 0;
+}
+
+int PvrEglScreen::transformation() const
+{
+ // We need to search for our parent screen, which is assumed to be
+ // "Transformed". If it isn't, then there is no transformation.
+ // There is no direct method to get the parent screen so we need
+ // to search every screen until we find ourselves.
+ if (!parent && qt_screen != this)
+ parent = parentScreen(qt_screen, this);
+ if (!parent)
+ return 0;
+ if (parent->classId() != QScreen::TransformedClass)
+ return 0;
+ return 90 * static_cast<const QTransformedScreen *>(parent)
+ ->transformOrientation();
+}
+
+#else
+
+int PvrEglScreen::transformation() const
+{
+ return 0;
+}
+
+#endif
+
+void PvrEglScreen::sync()
+{
+ // Put code here to synchronize 2D and 3D operations if necessary.
+}
+
+void PvrEglScreen::openTty()
+{
+ const char *const devs[] = {"/dev/tty0", "/dev/tty", "/dev/console", 0};
+
+ if (ttyDevice.isEmpty()) {
+ for (const char * const *dev = devs; *dev; ++dev) {
+ ttyfd = ::open(*dev, O_RDWR);
+ if (ttyfd != -1)
+ break;
+ }
+ } else {
+ ttyfd = ::open(ttyDevice.toAscii().constData(), O_RDWR);
+ }
+
+ if (ttyfd == -1)
+ return;
+
+ ::fcntl(ttyfd, F_SETFD, FD_CLOEXEC);
+
+ if (doGraphicsMode) {
+ ioctl(ttyfd, KDGETMODE, &oldKdMode);
+ if (oldKdMode != KD_GRAPHICS) {
+ int ret = ioctl(ttyfd, KDSETMODE, KD_GRAPHICS);
+ if (ret == -1)
+ doGraphicsMode = false;
+ }
+ }
+
+ // No blankin' screen, no blinkin' cursor!, no cursor!
+ const char termctl[] = "\033[9;0]\033[?33l\033[?25l\033[?1c";
+ ::write(ttyfd, termctl, sizeof(termctl));
+}
+
+void PvrEglScreen::closeTty()
+{
+ if (ttyfd == -1)
+ return;
+
+ if (doGraphicsMode)
+ ioctl(ttyfd, KDSETMODE, oldKdMode);
+
+ // Blankin' screen, blinkin' cursor!
+ const char termctl[] = "\033[9;15]\033[?33h\033[?25h\033[?0c";
+ ::write(ttyfd, termctl, sizeof(termctl));
+
+ ::close(ttyfd);
+ ttyfd = -1;
+}
+
+//![2]
+bool PvrEglScreenSurfaceFunctions::createNativeWindow(QWidget *widget, EGLNativeWindowType *native)
+{
+//![2]
+ QWSWindowSurface *surface =
+ static_cast<QWSWindowSurface *>(widget->windowSurface());
+ if (!surface) {
+ // The widget does not have a surface yet, so give it one.
+ surface = new PvrEglWindowSurface(widget, screen, displayId);
+ widget->setWindowSurface(surface);
+ } else if (surface->key() != QLatin1String("PvrEgl")) {
+ // The application has attached a QGLContext to an ordinary QWidget.
+ // Replace the widget's window surface with a new one that can do GL.
+ QRect geometry = widget->frameGeometry();
+ geometry.moveTo(widget->mapToGlobal(QPoint(0, 0)));
+ surface = new PvrEglWindowSurface(widget, screen, displayId);
+ surface->setGeometry(geometry);
+ widget->setWindowSurface(surface);
+ widget->setAttribute(Qt::WA_NoSystemBackground, true);
+ }
+ PvrEglWindowSurface *nsurface = static_cast<PvrEglWindowSurface*>(surface);
+ *native = (EGLNativeWindowType)(nsurface->nativeDrawable());
+ return true;
+}
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h
new file mode 100644
index 0000000000..efb2406771
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PVREGLSCREEN_H
+#define PVREGLSCREEN_H
+
+#include <QScreen>
+#include <QGLScreen>
+#include "pvrqwsdrawable.h"
+
+class PvrEglScreen;
+
+class PvrEglScreenSurfaceFunctions : public QGLScreenSurfaceFunctions
+{
+public:
+ PvrEglScreenSurfaceFunctions(PvrEglScreen *s, int screenNum)
+ : screen(s), displayId(screenNum) {}
+
+ bool createNativeWindow(QWidget *widget, EGLNativeWindowType *native);
+
+private:
+ PvrEglScreen *screen;
+ int displayId;
+};
+
+class PvrEglScreen : public QGLScreen
+{
+public:
+ PvrEglScreen(int displayId);
+ ~PvrEglScreen();
+
+ bool initDevice();
+ bool connect(const QString &displaySpec);
+ void disconnect();
+ void shutdownDevice();
+ void setMode(int, int, int) {}
+
+ void blit(const QImage &img, const QPoint &topLeft, const QRegion &region);
+ void solidFill(const QColor &color, const QRegion &region);
+
+ bool chooseContext(QGLContext *context, const QGLContext *shareContext);
+ bool hasOpenGL();
+
+ QWSWindowSurface* createSurface(QWidget *widget) const;
+ QWSWindowSurface* createSurface(const QString &key) const;
+
+ int transformation() const;
+
+private:
+ void sync();
+ void openTty();
+ void closeTty();
+
+ int fd;
+ int ttyfd, oldKdMode;
+ QString ttyDevice;
+ bool doGraphicsMode;
+ mutable const QScreen *parent;
+};
+
+#endif
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.pro b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.pro
new file mode 100644
index 0000000000..675be85460
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreen.pro
@@ -0,0 +1,27 @@
+TEMPLATE = lib
+TARGET = qgfxpvregl
+CONFIG += qt plugin warn_on
+QT += opengl
+
+LIBS += -lpvrQWSWSEGL
+
+DEFINES += QT_QWS_CLIENTBLIT
+
+INCLUDEPATH += ../QWSWSEGL
+
+
+HEADERS = \
+ pvreglscreen.h \
+ pvreglwindowsurface.h
+
+SOURCES = \
+ pvreglscreenplugin.cpp \
+ pvreglscreen.cpp \
+ pvreglwindowsurface.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+target.path = $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
+
+include(../powervr.pri) \ No newline at end of file
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreenplugin.cpp b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreenplugin.cpp
new file mode 100644
index 0000000000..872285e818
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglscreenplugin.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "pvreglscreen.h"
+
+#include <QScreenDriverPlugin>
+#include <QStringList>
+
+class PvrEglScreenPlugin : public QScreenDriverPlugin
+{
+public:
+ PvrEglScreenPlugin();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+PvrEglScreenPlugin::PvrEglScreenPlugin()
+ : QScreenDriverPlugin()
+{
+}
+
+QStringList PvrEglScreenPlugin::keys() const
+{
+ return (QStringList() << "powervr");
+}
+
+QScreen* PvrEglScreenPlugin::create(const QString& driver, int displayId)
+{
+ if (driver.toLower() != "powervr")
+ return 0;
+
+ return new PvrEglScreen(displayId);
+}
+
+Q_EXPORT_PLUGIN2(qgfxpvregl, PvrEglScreenPlugin)
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
new file mode 100644
index 0000000000..43648159c8
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
@@ -0,0 +1,273 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "pvreglwindowsurface.h"
+#include "pvreglscreen.h"
+#include <QScreen>
+#include <QDebug>
+#include <QWSDisplay>
+
+PvrEglWindowSurface::PvrEglWindowSurface
+ (QWidget *widget, PvrEglScreen *screen, int screenNum)
+ : QWSGLWindowSurface(widget)
+{
+ setSurfaceFlags(QWSWindowSurface::Opaque);
+
+ this->widget = widget;
+ this->screen = screen;
+ this->pdevice = 0;
+
+ QPoint pos = offset(widget);
+ QSize size = widget->size();
+
+ PvrQwsRect pvrRect;
+ pvrRect.x = pos.x();
+ pvrRect.y = pos.y();
+ pvrRect.width = size.width();
+ pvrRect.height = size.height();
+ transformRects(&pvrRect, 1);
+
+ // Try to recover a previous PvrQwsDrawable object for the widget
+ // if there is one. This can happen when a PvrEglWindowSurface
+ // is created for a widget, bound to a EGLSurface, and then destroyed.
+ // When a new PvrEglWindowSurface is created for the widget, it will
+ // pick up the previous PvrQwsDrawable if the EGLSurface has not been
+ // destroyed in the meantime.
+ drawable = pvrQwsFetchWindow((long)widget);
+ if (drawable)
+ pvrQwsSetGeometry(drawable, &pvrRect);
+ else
+ drawable = pvrQwsCreateWindow(screenNum, (long)widget, &pvrRect);
+ pvrQwsSetRotation(drawable, screen->transformation());
+}
+
+PvrEglWindowSurface::PvrEglWindowSurface()
+ : QWSGLWindowSurface()
+{
+ setSurfaceFlags(QWSWindowSurface::Opaque);
+ drawable = 0;
+ widget = 0;
+ screen = 0;
+ pdevice = 0;
+}
+
+PvrEglWindowSurface::~PvrEglWindowSurface()
+{
+ // Release the PvrQwsDrawable. If it is bound to an EGLSurface,
+ // then it will stay around until a new PvrEglWindowSurface is
+ // created for the widget. If it is not bound to an EGLSurface,
+ // it will be destroyed immediately.
+ if (drawable && pvrQwsReleaseWindow(drawable))
+ pvrQwsDestroyDrawable(drawable);
+
+ delete pdevice;
+}
+
+bool PvrEglWindowSurface::isValid() const
+{
+ return (widget != 0);
+}
+
+void PvrEglWindowSurface::setGeometry(const QRect &rect)
+{
+ if (drawable) {
+ // XXX: adjust for the screen offset.
+ PvrQwsRect pvrRect;
+ pvrRect.x = rect.x();
+ pvrRect.y = rect.y();
+ pvrRect.width = rect.width();
+ pvrRect.height = rect.height();
+ transformRects(&pvrRect, 1);
+ pvrQwsSetGeometry(drawable, &pvrRect);
+ pvrQwsSetRotation(drawable, screen->transformation());
+ }
+ QWSGLWindowSurface::setGeometry(rect);
+}
+
+bool PvrEglWindowSurface::move(const QPoint &offset)
+{
+ QRect rect = geometry().translated(offset);
+ if (drawable) {
+ PvrQwsRect pvrRect;
+ pvrRect.x = rect.x();
+ pvrRect.y = rect.y();
+ pvrRect.width = rect.width();
+ pvrRect.height = rect.height();
+ transformRects(&pvrRect, 1);
+ pvrQwsSetGeometry(drawable, &pvrRect);
+ pvrQwsSetRotation(drawable, screen->transformation());
+ }
+ return QWSGLWindowSurface::move(offset);
+}
+
+QByteArray PvrEglWindowSurface::permanentState() const
+{
+ // Nothing interesting to pass to the server just yet.
+ return QByteArray();
+}
+
+void PvrEglWindowSurface::setPermanentState(const QByteArray &state)
+{
+ Q_UNUSED(state);
+}
+
+void PvrEglWindowSurface::flush
+ (QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ // The GL paint engine is responsible for the swapBuffers() call.
+ // If we were to call the base class's implementation of flush()
+ // then it would fetch the image() and manually blit it to the
+ // screeen instead of using the fast PVR2D blit.
+ Q_UNUSED(widget);
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+}
+
+QImage PvrEglWindowSurface::image() const
+{
+ if (drawable) {
+ PvrQwsRect pvrRect;
+ pvrQwsGetGeometry(drawable, &pvrRect);
+ void *data = pvrQwsGetRenderBuffer(drawable);
+ if (data) {
+ return QImage((uchar *)data, pvrRect.width, pvrRect.height,
+ pvrQwsGetStride(drawable), screen->pixelFormat());
+ }
+ }
+ return QImage(16, 16, screen->pixelFormat());
+}
+
+QPaintDevice *PvrEglWindowSurface::paintDevice()
+{
+ return widget;
+}
+
+void PvrEglWindowSurface::setDirectRegion(const QRegion &r, int id)
+{
+ QWSGLWindowSurface::setDirectRegion(r, id);
+
+ if (!drawable)
+ return;
+
+ // Clip the region to the window boundaries in case the child
+ // is partially outside the geometry of the parent.
+ QWidget *window = widget->window();
+ QRegion region = r;
+ if (widget != window) {
+ QRect rect = window->geometry();
+ rect.moveTo(window->mapToGlobal(QPoint(0, 0)));
+ region = region.intersect(rect);
+ }
+
+ if (region.isEmpty()) {
+ pvrQwsClearVisibleRegion(drawable);
+ } else if (region.rectCount() == 1) {
+ QRect rect = region.boundingRect();
+ PvrQwsRect pvrRect;
+ pvrRect.x = rect.x();
+ pvrRect.y = rect.y();
+ pvrRect.width = rect.width();
+ pvrRect.height = rect.height();
+ transformRects(&pvrRect, 1);
+ pvrQwsSetVisibleRegion(drawable, &pvrRect, 1);
+ pvrQwsSetRotation(drawable, screen->transformation());
+ if (!pvrQwsSwapBuffers(drawable, 1))
+ screen->solidFill(QColor(0, 0, 0), region);
+ } else {
+ QVector<QRect> rects = region.rects();
+ PvrQwsRect *pvrRects = new PvrQwsRect [rects.size()];
+ for (int index = 0; index < rects.size(); ++index) {
+ QRect rect = rects[index];
+ pvrRects[index].x = rect.x();
+ pvrRects[index].y = rect.y();
+ pvrRects[index].width = rect.width();
+ pvrRects[index].height = rect.height();
+ }
+ transformRects(pvrRects, rects.size());
+ pvrQwsSetVisibleRegion(drawable, pvrRects, rects.size());
+ pvrQwsSetRotation(drawable, screen->transformation());
+ if (!pvrQwsSwapBuffers(drawable, 1))
+ screen->solidFill(QColor(0, 0, 0), region);
+ delete [] pvrRects;
+ }
+}
+
+void PvrEglWindowSurface::transformRects(PvrQwsRect *rects, int count) const
+{
+ switch (screen->transformation()) {
+ case 0: break;
+
+ case 90:
+ {
+ for (int index = 0; index < count; ++index) {
+ int x = rects[index].y;
+ int y = screen->height() - (rects[index].x + rects[index].width);
+ rects[index].x = x;
+ rects[index].y = y;
+ qSwap(rects[index].width, rects[index].height);
+ }
+ }
+ break;
+
+ case 180:
+ {
+ for (int index = 0; index < count; ++index) {
+ int x = screen->width() - (rects[index].x + rects[index].width);
+ int y = screen->height() - (rects[index].y + rects[index].height);
+ rects[index].x = x;
+ rects[index].y = y;
+ }
+ }
+ break;
+
+ case 270:
+ {
+ for (int index = 0; index < count; ++index) {
+ int x = screen->width() - (rects[index].y + rects[index].height);
+ int y = rects[index].x;
+ rects[index].x = x;
+ rects[index].y = y;
+ qSwap(rects[index].width, rects[index].height);
+ }
+ }
+ break;
+ }
+}
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h
new file mode 100644
index 0000000000..9f5600c136
--- /dev/null
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PVREGLWINDOWSURFACE_H
+#define PVREGLWINDOWSURFACE_H
+
+#include <private/qglwindowsurface_qws_p.h>
+#include "pvrqwsdrawable.h"
+
+class PvrEglScreen;
+
+class PvrEglWindowSurface : public QWSGLWindowSurface
+{
+public:
+ PvrEglWindowSurface(QWidget *widget, PvrEglScreen *screen, int screenNum);
+ PvrEglWindowSurface();
+ ~PvrEglWindowSurface();
+
+ QString key() const { return QLatin1String("PvrEgl"); }
+
+ bool isValid() const;
+
+ void setGeometry(const QRect &rect);
+ bool move(const QPoint &offset);
+
+ QByteArray permanentState() const;
+ void setPermanentState(const QByteArray &state);
+
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+
+ QImage image() const;
+ QPaintDevice *paintDevice();
+
+ void setDirectRegion(const QRegion &region, int id);
+
+ long nativeDrawable() const { return (long)widget; }
+
+private:
+ QWidget *widget;
+ PvrQwsDrawable *drawable;
+ PvrEglScreen *screen;
+ QPaintDevice *pdevice;
+
+ void transformRects(PvrQwsRect *rects, int count) const;
+};
+
+#endif
diff --git a/src/plugins/gfxdrivers/qvfb/main.cpp b/src/plugins/gfxdrivers/qvfb/main.cpp
new file mode 100644
index 0000000000..fb275818b9
--- /dev/null
+++ b/src/plugins/gfxdrivers/qvfb/main.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qscreendriverplugin_qws.h>
+#include <qscreenvfb_qws.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_LIBRARY
+QT_BEGIN_NAMESPACE
+
+class ScreenVfbDriver : public QScreenDriverPlugin
+{
+public:
+ ScreenVfbDriver();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+ScreenVfbDriver::ScreenVfbDriver()
+: QScreenDriverPlugin()
+{
+}
+
+QStringList ScreenVfbDriver::keys() const
+{
+ QStringList list;
+ list << "QVFb";
+ return list;
+}
+
+QScreen* ScreenVfbDriver::create(const QString& driver, int displayId)
+{
+ if (driver.toLower() == "qvfb")
+ return new QVFbScreen(displayId);
+
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(ScreenVfbDriver)
+Q_EXPORT_PLUGIN2(qscreenvfb, ScreenVfbDriver)
+
+QT_END_NAMESPACE
+#endif //QT_NO_LIBRARY
diff --git a/src/plugins/gfxdrivers/qvfb/qvfb.pro b/src/plugins/gfxdrivers/qvfb/qvfb.pro
new file mode 100644
index 0000000000..a0996e77dc
--- /dev/null
+++ b/src/plugins/gfxdrivers/qvfb/qvfb.pro
@@ -0,0 +1,19 @@
+TARGET = qscreenvfb
+include(../../qpluginbase.pri)
+
+DEFINES += QT_QWS_QVFB QT_QWS_MOUSE_QVFB QT_QWS_KBD_QVFB
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+HEADERS = \
+ $$QT_SOURCE_TREE/src/gui/embedded/qscreenvfb_qws.h \
+ $$QT_SOURCE_TREE/src/gui/embedded/qkbdvfb_qws.h \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmousevfb_qws.h
+
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qscreenvfb_qws.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qkbdvfb_qws.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmousevfb_qws.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
diff --git a/src/plugins/gfxdrivers/transformed/main.cpp b/src/plugins/gfxdrivers/transformed/main.cpp
new file mode 100644
index 0000000000..da619bb3e5
--- /dev/null
+++ b/src/plugins/gfxdrivers/transformed/main.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qscreendriverplugin_qws.h>
+#include <qscreentransformed_qws.h>
+#include <qstringlist.h>
+#ifndef QT_NO_LIBRARY
+QT_BEGIN_NAMESPACE
+
+class GfxTransformedDriver : public QScreenDriverPlugin
+{
+public:
+ GfxTransformedDriver();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+GfxTransformedDriver::GfxTransformedDriver()
+: QScreenDriverPlugin()
+{
+}
+
+QStringList GfxTransformedDriver::keys() const
+{
+ QStringList list;
+ list << "Transformed";
+ return list;
+}
+
+QScreen* GfxTransformedDriver::create(const QString& driver, int displayId)
+{
+#ifndef QT_NO_QWS_TRANSFORMED
+ if (driver.toLower() == "transformed")
+ return new QTransformedScreen(displayId);
+#else //QT_NO_QWS_TRANSFORMED
+ printf("QT buildt with QT_NO_QWS_TRANSFORMED. No screen driver returned\n");
+#endif //QT_NO_QWS_TRANSFORMED
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(GfxTransformedDriver)
+Q_EXPORT_PLUGIN2(qgfxtransformed, GfxTransformedDriver)
+
+QT_END_NAMESPACE
+#endif //QT_NO_LIBRARY
diff --git a/src/plugins/gfxdrivers/transformed/transformed.pro b/src/plugins/gfxdrivers/transformed/transformed.pro
new file mode 100644
index 0000000000..173f7e99d4
--- /dev/null
+++ b/src/plugins/gfxdrivers/transformed/transformed.pro
@@ -0,0 +1,13 @@
+TARGET = qgfxtransformed
+include(../../qpluginbase.pri)
+
+DEFINES += QT_QWS_TRANSFORMED
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qscreentransformed_qws.h
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qscreentransformed_qws.cpp
+
+target.path=$$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
diff --git a/src/plugins/gfxdrivers/vnc/main.cpp b/src/plugins/gfxdrivers/vnc/main.cpp
new file mode 100644
index 0000000000..65c6cf25c6
--- /dev/null
+++ b/src/plugins/gfxdrivers/vnc/main.cpp
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qscreendriverplugin_qws.h>
+#include <qscreenvnc_qws.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_LIBRARY
+QT_BEGIN_NAMESPACE
+
+class GfxVncDriver : public QScreenDriverPlugin
+{
+public:
+ GfxVncDriver();
+
+ QStringList keys() const;
+ QScreen *create(const QString&, int displayId);
+};
+
+GfxVncDriver::GfxVncDriver()
+: QScreenDriverPlugin()
+{
+}
+
+QStringList GfxVncDriver::keys() const
+{
+ QStringList list;
+ list << "VNC";
+ return list;
+}
+
+QScreen* GfxVncDriver::create(const QString& driver, int displayId)
+{
+#ifndef QT_NO_QWS_VNC
+ if (driver.toLower() == "vnc")
+ return new QVNCScreen(displayId);
+#else //QT_NO_QWS_VNC
+ printf("QT buildt with QT_NO_QWS_VNC. No screen driver returned\n");
+#endif //QT_NO_QWS_VNC
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(GfxVncDriver)
+Q_EXPORT_PLUGIN2(qgfxvnc, GfxVncDriver)
+
+QT_END_NAMESPACE
+
+#endif //QT_NO_LIBRARY
diff --git a/src/plugins/gfxdrivers/vnc/qscreenvnc_p.h b/src/plugins/gfxdrivers/vnc/qscreenvnc_p.h
new file mode 100644
index 0000000000..9a02072815
--- /dev/null
+++ b/src/plugins/gfxdrivers/vnc/qscreenvnc_p.h
@@ -0,0 +1,524 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCREENVNC_P_H
+#define QSCREENVNC_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QLibrary class. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qscreenvnc_qws.h"
+
+#ifndef QT_NO_QWS_VNC
+
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qsharedmemory.h>
+#include <QtNetwork/qtcpsocket.h>
+#include <QtNetwork/qtcpserver.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVNCServer;
+
+#ifndef QT_NO_QWS_CURSOR
+class QVNCCursor : public QProxyScreenCursor
+{
+public:
+ QVNCCursor(QVNCScreen *s);
+ ~QVNCCursor();
+
+ void hide();
+ void show();
+ void set(const QImage &image, int hotx, int hoty);
+ void move(int x, int y);
+
+private:
+ void setDirty(const QRect &r) const;
+ QVNCScreen *screen;
+};
+
+class QVNCClientCursor : public QProxyScreenCursor
+{
+public:
+ QVNCClientCursor(QVNCServer *s);
+ ~QVNCClientCursor();
+
+ void set(const QImage &image, int hotx, int hoty);
+ void write() const;
+
+private:
+ QVNCServer *server;
+};
+#endif // QT_NO_QWS_CURSOR
+
+#define MAP_TILE_SIZE 16
+#define MAP_WIDTH 1280 / MAP_TILE_SIZE
+#define MAP_HEIGHT 1024 / MAP_TILE_SIZE
+
+class QVNCDirtyMap
+{
+public:
+ QVNCDirtyMap(QScreen *screen);
+ virtual ~QVNCDirtyMap();
+
+ void reset();
+ bool dirty(int x, int y) const;
+ virtual void setDirty(int x, int y, bool force = false) = 0;
+ void setClean(int x, int y);
+
+ int bytesPerPixel;
+
+ int numDirty;
+ int mapWidth;
+ int mapHeight;
+
+protected:
+ uchar *map;
+ QScreen *screen;
+ uchar *buffer;
+ int bufferWidth;
+ int bufferHeight;
+ int bufferStride;
+ int numTiles;
+};
+
+template <class T>
+class QVNCDirtyMapOptimized : public QVNCDirtyMap
+{
+public:
+ QVNCDirtyMapOptimized(QScreen *screen) : QVNCDirtyMap(screen) {}
+ ~QVNCDirtyMapOptimized() {}
+
+ void setDirty(int x, int y, bool force = false);
+};
+
+class QRfbRect
+{
+public:
+ QRfbRect() {}
+ QRfbRect(quint16 _x, quint16 _y, quint16 _w, quint16 _h) {
+ x = _x; y = _y; w = _w; h = _h;
+ }
+
+ void read(QTcpSocket *s);
+ void write(QTcpSocket *s) const;
+
+ quint16 x;
+ quint16 y;
+ quint16 w;
+ quint16 h;
+};
+
+class QRfbPixelFormat
+{
+public:
+ static int size() { return 16; }
+
+ void read(QTcpSocket *s);
+ void write(QTcpSocket *s);
+
+ int bitsPerPixel;
+ int depth;
+ bool bigEndian;
+ bool trueColor;
+ int redBits;
+ int greenBits;
+ int blueBits;
+ int redShift;
+ int greenShift;
+ int blueShift;
+};
+
+class QRfbServerInit
+{
+public:
+ QRfbServerInit() { name = 0; }
+ ~QRfbServerInit() { delete[] name; }
+
+ int size() const { return QRfbPixelFormat::size() + 8 + strlen(name); }
+ void setName(const char *n);
+
+ void read(QTcpSocket *s);
+ void write(QTcpSocket *s);
+
+ quint16 width;
+ quint16 height;
+ QRfbPixelFormat format;
+ char *name;
+};
+
+class QRfbSetEncodings
+{
+public:
+ bool read(QTcpSocket *s);
+
+ quint16 count;
+};
+
+class QRfbFrameBufferUpdateRequest
+{
+public:
+ bool read(QTcpSocket *s);
+
+ char incremental;
+ QRfbRect rect;
+};
+
+class QRfbKeyEvent
+{
+public:
+ bool read(QTcpSocket *s);
+
+ char down;
+ int keycode;
+ int unicode;
+};
+
+class QRfbPointerEvent
+{
+public:
+ bool read(QTcpSocket *s);
+
+ uint buttons;
+ quint16 x;
+ quint16 y;
+};
+
+class QRfbClientCutText
+{
+public:
+ bool read(QTcpSocket *s);
+
+ quint32 length;
+};
+
+class QVNCScreenPrivate : public QObject
+{
+public:
+ QVNCScreenPrivate(QVNCScreen *parent);
+ ~QVNCScreenPrivate();
+
+ void setDirty(const QRect &rect, bool force = false);
+ void configure();
+
+ qreal dpiX;
+ qreal dpiY;
+ bool doOnScreenSurface;
+ QVNCDirtyMap *dirty;
+ int refreshRate;
+ QVNCServer *vncServer;
+
+#if !defined(QT_NO_QWS_MULTIPROCESS) && !defined(QT_NO_SHAREDMEMORY)
+ QSharedMemory shm;
+#endif
+
+ QVNCScreen *q_ptr;
+
+ bool noDisablePainting;
+};
+
+class QRfbEncoder
+{
+public:
+ QRfbEncoder(QVNCServer *s) : server(s) {}
+ virtual ~QRfbEncoder() {}
+
+ virtual void write() = 0;
+
+protected:
+ QVNCServer *server;
+};
+
+class QRfbRawEncoder : public QRfbEncoder
+{
+public:
+ QRfbRawEncoder(QVNCServer *s) : QRfbEncoder(s) {}
+
+ void write();
+
+private:
+ QByteArray buffer;
+};
+
+template <class SRC> class QRfbHextileEncoder;
+
+template <class SRC>
+class QRfbSingleColorHextile
+{
+public:
+ QRfbSingleColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
+ bool read(const uchar *data, int width, int height, int stride);
+ void write(QTcpSocket *socket) const;
+
+private:
+ QRfbHextileEncoder<SRC> *encoder;
+};
+
+template <class SRC>
+class QRfbDualColorHextile
+{
+public:
+ QRfbDualColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
+ bool read(const uchar *data, int width, int height, int stride);
+ void write(QTcpSocket *socket) const;
+
+private:
+ struct Rect {
+ quint8 xy;
+ quint8 wh;
+ } Q_PACKED rects[8 * 16];
+
+ quint8 numRects;
+ QRfbHextileEncoder<SRC> *encoder;
+
+private:
+ inline int lastx() const { return rectx(numRects); }
+ inline int lasty() const { return recty(numRects); }
+ inline int rectx(int r) const { return rects[r].xy >> 4; }
+ inline int recty(int r) const { return rects[r].xy & 0x0f; }
+ inline int width(int r) const { return (rects[r].wh >> 4) + 1; }
+ inline int height(int r) const { return (rects[r].wh & 0x0f) + 1; }
+
+ inline void setX(int r, int x) {
+ rects[r].xy = (x << 4) | (rects[r].xy & 0x0f);
+ }
+ inline void setY(int r, int y) {
+ rects[r].xy = (rects[r].xy & 0xf0) | y;
+ }
+ inline void setWidth(int r, int width) {
+ rects[r].wh = ((width - 1) << 4) | (rects[r].wh & 0x0f);
+ }
+ inline void setHeight(int r, int height) {
+ rects[r].wh = (rects[r].wh & 0xf0) | (height - 1);
+ }
+
+ inline void setWidth(int width) { setWidth(numRects, width); }
+ inline void setHeight(int height) { setHeight(numRects, height); }
+ inline void setX(int x) { setX(numRects, x); }
+ inline void setY(int y) { setY(numRects, y); }
+ void next();
+};
+
+template <class SRC>
+class QRfbMultiColorHextile
+{
+public:
+ QRfbMultiColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
+ bool read(const uchar *data, int width, int height, int stride);
+ void write(QTcpSocket *socket) const;
+
+private:
+ inline quint8* rect(int r) {
+ return rects.data() + r * (bpp + 2);
+ }
+ inline const quint8* rect(int r) const {
+ return rects.constData() + r * (bpp + 2);
+ }
+ inline void setX(int r, int x) {
+ quint8 *ptr = rect(r) + bpp;
+ *ptr = (x << 4) | (*ptr & 0x0f);
+ }
+ inline void setY(int r, int y) {
+ quint8 *ptr = rect(r) + bpp;
+ *ptr = (*ptr & 0xf0) | y;
+ }
+ void setColor(SRC color);
+ inline int rectx(int r) const {
+ const quint8 *ptr = rect(r) + bpp;
+ return *ptr >> 4;
+ }
+ inline int recty(int r) const {
+ const quint8 *ptr = rect(r) + bpp;
+ return *ptr & 0x0f;
+ }
+ inline void setWidth(int r, int width) {
+ quint8 *ptr = rect(r) + bpp + 1;
+ *ptr = ((width - 1) << 4) | (*ptr & 0x0f);
+ }
+ inline void setHeight(int r, int height) {
+ quint8 *ptr = rect(r) + bpp + 1;
+ *ptr = (*ptr & 0xf0) | (height - 1);
+ }
+
+ bool beginRect();
+ void endRect();
+
+ static const int maxRectsSize = 16 * 16;
+ QVarLengthArray<quint8, maxRectsSize> rects;
+
+ quint8 bpp;
+ quint8 numRects;
+ QRfbHextileEncoder<SRC> *encoder;
+};
+
+template <class SRC>
+class QRfbHextileEncoder : public QRfbEncoder
+{
+public:
+ QRfbHextileEncoder(QVNCServer *s);
+ void write();
+
+private:
+ enum SubEncoding {
+ Raw = 1,
+ BackgroundSpecified = 2,
+ ForegroundSpecified = 4,
+ AnySubrects = 8,
+ SubrectsColoured = 16
+ };
+
+ QByteArray buffer;
+ QRfbSingleColorHextile<SRC> singleColorHextile;
+ QRfbDualColorHextile<SRC> dualColorHextile;
+ QRfbMultiColorHextile<SRC> multiColorHextile;
+
+ SRC bg;
+ SRC fg;
+ bool newBg;
+ bool newFg;
+
+ friend class QRfbSingleColorHextile<SRC>;
+ friend class QRfbDualColorHextile<SRC>;
+ friend class QRfbMultiColorHextile<SRC>;
+};
+
+class QVNCServer : public QObject
+{
+ Q_OBJECT
+public:
+ QVNCServer(QVNCScreen *screen);
+ QVNCServer(QVNCScreen *screen, int id);
+ ~QVNCServer();
+
+ void setDirty();
+ void setDirtyCursor() { dirtyCursor = true; setDirty(); }
+ inline bool isConnected() const { return state == Connected; }
+ inline void setRefreshRate(int rate) { refreshRate = rate; }
+
+ enum ClientMsg { SetPixelFormat = 0,
+ FixColourMapEntries = 1,
+ SetEncodings = 2,
+ FramebufferUpdateRequest = 3,
+ KeyEvent = 4,
+ PointerEvent = 5,
+ ClientCutText = 6 };
+
+ enum ServerMsg { FramebufferUpdate = 0,
+ SetColourMapEntries = 1 };
+
+ void convertPixels(char *dst, const char *src, int count) const;
+
+ inline int clientBytesPerPixel() const {
+ return pixelFormat.bitsPerPixel / 8;
+ }
+
+ inline QVNCScreen* screen() const { return qvnc_screen; }
+ inline QVNCDirtyMap* dirtyMap() const { return qvnc_screen->d_ptr->dirty; }
+ inline QTcpSocket* clientSocket() const { return client; }
+ QImage screenImage() const;
+ inline bool doPixelConversion() const { return needConversion; }
+#ifndef QT_NO_QWS_CURSOR
+ inline bool hasClientCursor() const { return qvnc_cursor != 0; }
+#endif
+
+private:
+ void setPixelFormat();
+ void setEncodings();
+ void frameBufferUpdateRequest();
+ void pointerEvent();
+ void keyEvent();
+ void clientCutText();
+ bool pixelConversionNeeded() const;
+
+private slots:
+ void newConnection();
+ void readClient();
+ void checkUpdate();
+ void discardClient();
+
+private:
+ void init(uint port);
+ enum ClientState { Unconnected, Protocol, Init, Connected };
+ QTimer *timer;
+ QTcpServer *serverSocket;
+ QTcpSocket *client;
+ ClientState state;
+ quint8 msgType;
+ bool handleMsg;
+ QRfbPixelFormat pixelFormat;
+ Qt::KeyboardModifiers keymod;
+ int encodingsPending;
+ int cutTextPending;
+ uint supportCopyRect : 1;
+ uint supportRRE : 1;
+ uint supportCoRRE : 1;
+ uint supportHextile : 1;
+ uint supportZRLE : 1;
+ uint supportCursor : 1;
+ uint supportDesktopSize : 1;
+ bool wantUpdate;
+ bool sameEndian;
+ bool needConversion;
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ bool swapBytes;
+#endif
+ bool dirtyCursor;
+ int refreshRate;
+ QVNCScreen *qvnc_screen;
+#ifndef QT_NO_QWS_CURSOR
+ QVNCClientCursor *qvnc_cursor;
+#endif
+
+ QRfbEncoder *encoder;
+};
+
+
+QT_END_NAMESPACE
+#endif // QT_NO_QWS_VNC
+#endif // QSCREENVNC_P_H
diff --git a/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp b/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp
new file mode 100644
index 0000000000..63e06659aa
--- /dev/null
+++ b/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp
@@ -0,0 +1,2338 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qscreenvnc_qws.h"
+
+#ifndef QT_NO_QWS_VNC
+
+#include "qscreenvnc_p.h"
+#include "qwindowsystem_qws.h"
+#include "qwsdisplay_qws.h"
+#include "qscreendriverfactory_qws.h"
+#include <QtCore/qtimer.h>
+#include <QtCore/qregexp.h>
+#include <QtGui/qwidget.h>
+#include <QtGui/qpolygon.h>
+#include <QtGui/qpainter.h>
+#include <qdebug.h>
+#include <private/qwindowsurface_qws_p.h>
+#include <private/qwssignalhandler_p.h>
+#include <private/qwidget_p.h>
+#include <private/qdrawhelper_p.h>
+
+#include <stdlib.h>
+
+QT_BEGIN_NAMESPACE
+
+//#define QT_QWS_VNC_DEBUG
+
+extern QString qws_qtePipeFilename();
+
+#ifndef QT_NO_QWS_CURSOR
+
+QVNCCursor::QVNCCursor(QVNCScreen *s)
+ : screen(s)
+{
+ if (qt_screencursor)
+ setScreenCursor(qt_screencursor);
+ else
+ hwaccel = true;
+}
+
+QVNCCursor::~QVNCCursor()
+{
+ if (screenCursor())
+ qt_screencursor = screenCursor();
+}
+
+void QVNCCursor::setDirty(const QRect &r) const
+{
+ screen->d_ptr->setDirty(r, true);
+}
+
+void QVNCCursor::hide()
+{
+ QProxyScreenCursor::hide();
+ if (enable)
+ setDirty(boundingRect());
+}
+
+void QVNCCursor::show()
+{
+ QProxyScreenCursor::show();
+ if (enable)
+ setDirty(boundingRect());
+}
+
+void QVNCCursor::set(const QImage &image, int hotx, int hoty)
+{
+ QRegion dirty = boundingRect();
+ QProxyScreenCursor::set(image, hotx, hoty);
+ dirty |= boundingRect();
+ if (enable && hwaccel && !screen->d_ptr->vncServer->hasClientCursor()) {
+ const QVector<QRect> rects = dirty.rects();
+ for (int i = 0; i < rects.size(); ++i)
+ setDirty(rects.at(i));
+ }
+}
+
+void QVNCCursor::move(int x, int y)
+{
+ if (enable && hwaccel && !screen->d_ptr->vncServer->hasClientCursor()) {
+ QRegion dirty = boundingRect();
+ QProxyScreenCursor::move(x, y);
+ dirty |= boundingRect();
+ if (enable) {
+ const QVector<QRect> rects = dirty.rects();
+ for (int i = 0; i < rects.size(); ++i)
+ setDirty(rects.at(i));
+ }
+ } else {
+ QProxyScreenCursor::move(x, y);
+ }
+}
+
+QVNCClientCursor::QVNCClientCursor(QVNCServer *s)
+ : server(s)
+{
+ setScreenCursor(qt_screencursor);
+ Q_ASSERT(hwaccel);
+ qt_screencursor = this; // hw: XXX
+
+ set(image(), hotspot.x(), hotspot.y());
+}
+
+QVNCClientCursor::~QVNCClientCursor()
+{
+ qt_screencursor = screenCursor();
+}
+
+void QVNCClientCursor::set(const QImage &image, int hotx, int hoty)
+{
+ QScreenCursor::set(image, hotx, hoty);
+ server->setDirtyCursor();
+}
+
+void QVNCClientCursor::write() const
+{
+ QTcpSocket *socket = server->clientSocket();
+
+ // FramebufferUpdate header
+ {
+ const quint16 tmp[6] = { htons(0),
+ htons(1),
+ htons(hotspot.x()), htons(hotspot.y()),
+ htons(cursor.width()),
+ htons(cursor.height()) };
+ socket->write((char*)tmp, sizeof(tmp));
+
+ const quint32 encoding = htonl(-239);
+ socket->write((char*)(&encoding), sizeof(encoding));
+ }
+
+ if (cursor.isNull())
+ return;
+
+ // write pixels
+ Q_ASSERT(cursor.hasAlphaChannel());
+ const QImage img = cursor.convertToFormat(server->screen()->pixelFormat());
+ const int n = server->clientBytesPerPixel() * img.width();
+ char *buffer = new char[n];
+ for (int i = 0; i < img.height(); ++i) {
+ server->convertPixels(buffer, (const char*)img.scanLine(i), img.width());
+ socket->write(buffer, n);
+ }
+ delete[] buffer;
+
+ // write mask
+ const QImage bitmap = cursor.createAlphaMask().convertToFormat(QImage::Format_Mono);
+ Q_ASSERT(bitmap.depth() == 1);
+ Q_ASSERT(bitmap.size() == img.size());
+ const int width = (bitmap.width() + 7) / 8;
+ for (int i = 0; i < bitmap.height(); ++i)
+ socket->write((const char*)bitmap.scanLine(i), width);
+}
+
+#endif // QT_NO_QWS_CURSOR
+
+QVNCScreenPrivate::QVNCScreenPrivate(QVNCScreen *parent)
+ : dpiX(72), dpiY(72), doOnScreenSurface(false), refreshRate(25),
+ vncServer(0), q_ptr(parent), noDisablePainting(false)
+{
+#ifdef QT_BUILD_INTERNAL
+ noDisablePainting = (qgetenv("QT_VNC_NO_DISABLEPAINTING").toInt() > 0);
+#endif
+#ifndef QT_NO_QWS_SIGNALHANDLER
+ QWSSignalHandler::instance()->addObject(this);
+#endif
+}
+
+QVNCScreenPrivate::~QVNCScreenPrivate()
+{
+#if defined(QT_NO_QWS_MULTIPROCESS) || defined(QT_NO_SHAREDMEMORY)
+ if (q_ptr->screen())
+ return;
+
+ delete[] q_ptr->data;
+ q_ptr->data = 0;
+#else
+ shm.detach();
+#endif
+}
+
+void QVNCScreenPrivate::configure()
+{
+ if (q_ptr->screen())
+ return;
+
+ q_ptr->lstep = q_ptr->dw * ((q_ptr->d + 7) / 8);
+ q_ptr->size = q_ptr->h * q_ptr->lstep;
+ q_ptr->mapsize = q_ptr->size;
+ q_ptr->physWidth = qRound(q_ptr->dw * qreal(25.4) / dpiX);
+ q_ptr->physHeight = qRound(q_ptr->dh * qreal(25.4) / dpiY);
+
+ switch (q_ptr->d) {
+ case 1:
+ q_ptr->setPixelFormat(QImage::Format_Mono); //### LSB???
+ break;
+ case 8:
+ q_ptr->setPixelFormat(QImage::Format_Indexed8);
+ break;
+ case 12:
+ q_ptr->setPixelFormat(QImage::Format_RGB444);
+ break;
+ case 15:
+ q_ptr->setPixelFormat(QImage::Format_RGB555);
+ break;
+ case 16:
+ q_ptr->setPixelFormat(QImage::Format_RGB16);
+ break;
+ case 18:
+ q_ptr->setPixelFormat(QImage::Format_RGB666);
+ break;
+ case 24:
+ q_ptr->setPixelFormat(QImage::Format_RGB888);
+ break;
+ case 32:
+ q_ptr->setPixelFormat(QImage::Format_ARGB32_Premultiplied);
+ break;
+ }
+
+#if !defined(QT_NO_QWS_MULTIPROCESS) && !defined(QT_NO_SHAREDMEMORY)
+ if (q_ptr->size != shm.size()) {
+ shm.detach();
+ const QString key = qws_qtePipeFilename() +
+ QString().sprintf("_vnc_%d_%d",
+ q_ptr->displayId, q_ptr->size);
+ shm.setKey(key);
+ if (QApplication::type() == QApplication::GuiServer) {
+ if (!shm.create(q_ptr->size)) {
+ qWarning() << "QVNCScreen could not create shared memory:"
+ << shm.errorString();
+ if (!shm.attach()) {
+ qWarning() << "QVNCScreen could not attach to shared memory:"
+ << shm.errorString();
+ }
+ }
+ } else if (!shm.attach()) {
+ qWarning() << "QVNCScreen could not attach to shared memory:"
+ << shm.errorString();
+ }
+ q_ptr->data = reinterpret_cast<uchar*>(shm.data());
+ }
+#else
+ if (q_ptr->data)
+ delete[] q_ptr->data;
+ q_ptr->data = new uchar[q_ptr->size];
+#endif
+}
+
+//===========================================================================
+
+static const struct {
+ int keysym;
+ int keycode;
+} keyMap[] = {
+ { 0xff08, Qt::Key_Backspace },
+ { 0xff09, Qt::Key_Tab },
+ { 0xff0d, Qt::Key_Return },
+ { 0xff1b, Qt::Key_Escape },
+ { 0xff63, Qt::Key_Insert },
+ { 0xffff, Qt::Key_Delete },
+ { 0xff50, Qt::Key_Home },
+ { 0xff57, Qt::Key_End },
+ { 0xff55, Qt::Key_PageUp },
+ { 0xff56, Qt::Key_PageDown },
+ { 0xff51, Qt::Key_Left },
+ { 0xff52, Qt::Key_Up },
+ { 0xff53, Qt::Key_Right },
+ { 0xff54, Qt::Key_Down },
+ { 0xffbe, Qt::Key_F1 },
+ { 0xffbf, Qt::Key_F2 },
+ { 0xffc0, Qt::Key_F3 },
+ { 0xffc1, Qt::Key_F4 },
+ { 0xffc2, Qt::Key_F5 },
+ { 0xffc3, Qt::Key_F6 },
+ { 0xffc4, Qt::Key_F7 },
+ { 0xffc5, Qt::Key_F8 },
+ { 0xffc6, Qt::Key_F9 },
+ { 0xffc7, Qt::Key_F10 },
+ { 0xffc8, Qt::Key_F11 },
+ { 0xffc9, Qt::Key_F12 },
+ { 0xffe1, Qt::Key_Shift },
+ { 0xffe2, Qt::Key_Shift },
+ { 0xffe3, Qt::Key_Control },
+ { 0xffe4, Qt::Key_Control },
+ { 0xffe7, Qt::Key_Meta },
+ { 0xffe8, Qt::Key_Meta },
+ { 0xffe9, Qt::Key_Alt },
+ { 0xffea, Qt::Key_Alt },
+
+ { 0xffb0, Qt::Key_0 },
+ { 0xffb1, Qt::Key_1 },
+ { 0xffb2, Qt::Key_2 },
+ { 0xffb3, Qt::Key_3 },
+ { 0xffb4, Qt::Key_4 },
+ { 0xffb5, Qt::Key_5 },
+ { 0xffb6, Qt::Key_6 },
+ { 0xffb7, Qt::Key_7 },
+ { 0xffb8, Qt::Key_8 },
+ { 0xffb9, Qt::Key_9 },
+
+ { 0xff8d, Qt::Key_Return },
+ { 0xffaa, Qt::Key_Asterisk },
+ { 0xffab, Qt::Key_Plus },
+ { 0xffad, Qt::Key_Minus },
+ { 0xffae, Qt::Key_Period },
+ { 0xffaf, Qt::Key_Slash },
+
+ { 0xff95, Qt::Key_Home },
+ { 0xff96, Qt::Key_Left },
+ { 0xff97, Qt::Key_Up },
+ { 0xff98, Qt::Key_Right },
+ { 0xff99, Qt::Key_Down },
+ { 0xff9a, Qt::Key_PageUp },
+ { 0xff9b, Qt::Key_PageDown },
+ { 0xff9c, Qt::Key_End },
+ { 0xff9e, Qt::Key_Insert },
+ { 0xff9f, Qt::Key_Delete },
+
+ { 0, 0 }
+};
+
+void QRfbRect::read(QTcpSocket *s)
+{
+ quint16 buf[4];
+ s->read((char*)buf, 8);
+ x = ntohs(buf[0]);
+ y = ntohs(buf[1]);
+ w = ntohs(buf[2]);
+ h = ntohs(buf[3]);
+}
+
+void QRfbRect::write(QTcpSocket *s) const
+{
+ quint16 buf[4];
+ buf[0] = htons(x);
+ buf[1] = htons(y);
+ buf[2] = htons(w);
+ buf[3] = htons(h);
+ s->write((char*)buf, 8);
+}
+
+void QRfbPixelFormat::read(QTcpSocket *s)
+{
+ char buf[16];
+ s->read(buf, 16);
+ bitsPerPixel = buf[0];
+ depth = buf[1];
+ bigEndian = buf[2];
+ trueColor = buf[3];
+
+ quint16 a = ntohs(*(quint16 *)(buf + 4));
+ redBits = 0;
+ while (a) { a >>= 1; redBits++; }
+
+ a = ntohs(*(quint16 *)(buf + 6));
+ greenBits = 0;
+ while (a) { a >>= 1; greenBits++; }
+
+ a = ntohs(*(quint16 *)(buf + 8));
+ blueBits = 0;
+ while (a) { a >>= 1; blueBits++; }
+
+ redShift = buf[10];
+ greenShift = buf[11];
+ blueShift = buf[12];
+}
+
+void QRfbPixelFormat::write(QTcpSocket *s)
+{
+ char buf[16];
+ buf[0] = bitsPerPixel;
+ buf[1] = depth;
+ buf[2] = bigEndian;
+ buf[3] = trueColor;
+
+ quint16 a = 0;
+ for (int i = 0; i < redBits; i++) a = (a << 1) | 1;
+ *(quint16 *)(buf + 4) = htons(a);
+
+ a = 0;
+ for (int i = 0; i < greenBits; i++) a = (a << 1) | 1;
+ *(quint16 *)(buf + 6) = htons(a);
+
+ a = 0;
+ for (int i = 0; i < blueBits; i++) a = (a << 1) | 1;
+ *(quint16 *)(buf + 8) = htons(a);
+
+ buf[10] = redShift;
+ buf[11] = greenShift;
+ buf[12] = blueShift;
+ s->write(buf, 16);
+}
+
+
+void QRfbServerInit::setName(const char *n)
+{
+ delete[] name;
+ name = new char [strlen(n) + 1];
+ strcpy(name, n);
+}
+
+void QRfbServerInit::read(QTcpSocket *s)
+{
+ s->read((char *)&width, 2);
+ width = ntohs(width);
+ s->read((char *)&height, 2);
+ height = ntohs(height);
+ format.read(s);
+
+ quint32 len;
+ s->read((char *)&len, 4);
+ len = ntohl(len);
+
+ name = new char [len + 1];
+ s->read(name, len);
+ name[len] = '\0';
+}
+
+void QRfbServerInit::write(QTcpSocket *s)
+{
+ quint16 t = htons(width);
+ s->write((char *)&t, 2);
+ t = htons(height);
+ s->write((char *)&t, 2);
+ format.write(s);
+ quint32 len = strlen(name);
+ len = htonl(len);
+ s->write((char *)&len, 4);
+ s->write(name, strlen(name));
+}
+
+bool QRfbSetEncodings::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 3)
+ return false;
+
+ char tmp;
+ s->read(&tmp, 1); // padding
+ s->read((char *)&count, 2);
+ count = ntohs(count);
+
+ return true;
+}
+
+bool QRfbFrameBufferUpdateRequest::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 9)
+ return false;
+
+ s->read(&incremental, 1);
+ rect.read(s);
+
+ return true;
+}
+
+bool QRfbKeyEvent::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 7)
+ return false;
+
+ s->read(&down, 1);
+ quint16 tmp;
+ s->read((char *)&tmp, 2); // padding
+
+ quint32 key;
+ s->read((char *)&key, 4);
+ key = ntohl(key);
+
+ unicode = 0;
+ keycode = 0;
+ int i = 0;
+ while (keyMap[i].keysym && !keycode) {
+ if (keyMap[i].keysym == (int)key)
+ keycode = keyMap[i].keycode;
+ i++;
+ }
+
+ if (keycode >= ' ' && keycode <= '~')
+ unicode = keycode;
+
+ if (!keycode) {
+ if (key <= 0xff) {
+ unicode = key;
+ if (key >= 'a' && key <= 'z')
+ keycode = Qt::Key_A + key - 'a';
+ else if (key >= ' ' && key <= '~')
+ keycode = Qt::Key_Space + key - ' ';
+ }
+ }
+
+ return true;
+}
+
+bool QRfbPointerEvent::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 5)
+ return false;
+
+ char buttonMask;
+ s->read(&buttonMask, 1);
+ buttons = 0;
+ if (buttonMask & 1)
+ buttons |= Qt::LeftButton;
+ if (buttonMask & 2)
+ buttons |= Qt::MidButton;
+ if (buttonMask & 4)
+ buttons |= Qt::RightButton;
+
+ quint16 tmp;
+ s->read((char *)&tmp, 2);
+ x = ntohs(tmp);
+ s->read((char *)&tmp, 2);
+ y = ntohs(tmp);
+
+ return true;
+}
+
+bool QRfbClientCutText::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 7)
+ return false;
+
+ char tmp[3];
+ s->read(tmp, 3); // padding
+ s->read((char *)&length, 4);
+ length = ntohl(length);
+
+ return true;
+}
+
+//===========================================================================
+
+QVNCServer::QVNCServer(QVNCScreen *screen)
+ : qvnc_screen(screen)
+{
+ init(5900);
+}
+
+QVNCServer::QVNCServer(QVNCScreen *screen, int id)
+ : qvnc_screen(screen)
+{
+ init(5900 + id);
+}
+
+void QVNCServer::init(uint port)
+{
+ handleMsg = false;
+ client = 0;
+ encodingsPending = 0;
+ cutTextPending = 0;
+ keymod = 0;
+ state = Unconnected;
+ dirtyCursor = false;
+
+ refreshRate = 25;
+ timer = new QTimer(this);
+ timer->setSingleShot(true);
+ connect(timer, SIGNAL(timeout()), this, SLOT(checkUpdate()));
+
+ serverSocket = new QTcpServer(this);
+ if (!serverSocket->listen(QHostAddress::Any, port))
+ qDebug() << "QVNCServer could not connect:" << serverSocket->errorString();
+ else
+ qDebug("QVNCServer created on port %d", port);
+
+ connect(serverSocket, SIGNAL(newConnection()), this, SLOT(newConnection()));
+
+#ifndef QT_NO_QWS_CURSOR
+ qvnc_cursor = 0;
+#endif
+ encoder = 0;
+}
+
+QVNCServer::~QVNCServer()
+{
+ delete encoder;
+ encoder = 0;
+ delete client;
+ client = 0;
+#ifndef QT_NO_QWS_CURSOR
+ delete qvnc_cursor;
+ qvnc_cursor = 0;
+#endif
+}
+
+void QVNCServer::setDirty()
+{
+ if (state == Connected && !timer->isActive() &&
+ ((dirtyMap()->numDirty > 0) || dirtyCursor)) {
+ timer->start();
+ }
+}
+
+void QVNCServer::newConnection()
+{
+ if (client)
+ delete client;
+
+ client = serverSocket->nextPendingConnection();
+ connect(client,SIGNAL(readyRead()),this,SLOT(readClient()));
+ connect(client,SIGNAL(disconnected()),this,SLOT(discardClient()));
+ handleMsg = false;
+ encodingsPending = 0;
+ cutTextPending = 0;
+ supportHextile = false;
+ wantUpdate = false;
+
+ timer->start(1000 / refreshRate);
+ dirtyMap()->reset();
+
+ // send protocol version
+ const char *proto = "RFB 003.003\n";
+ client->write(proto, 12);
+ state = Protocol;
+
+ if (!qvnc_screen->screen() && !qvnc_screen->d_ptr->noDisablePainting)
+ QWSServer::instance()->enablePainting(true);
+}
+
+void QVNCServer::readClient()
+{
+ switch (state) {
+ case Protocol:
+ if (client->bytesAvailable() >= 12) {
+ char proto[13];
+ client->read(proto, 12);
+ proto[12] = '\0';
+ qDebug("Client protocol version %s", proto);
+ // No authentication
+ quint32 auth = htonl(1);
+ client->write((char *) &auth, sizeof(auth));
+ state = Init;
+ }
+ break;
+
+ case Init:
+ if (client->bytesAvailable() >= 1) {
+ quint8 shared;
+ client->read((char *) &shared, 1);
+
+ // Server Init msg
+ QRfbServerInit sim;
+ QRfbPixelFormat &format = sim.format;
+ switch (qvnc_screen->depth()) {
+ case 32:
+ format.bitsPerPixel = 32;
+ format.depth = 32;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 8;
+ format.greenBits = 8;
+ format.blueBits = 8;
+ format.redShift = 16;
+ format.greenShift = 8;
+ format.blueShift = 0;
+ break;
+
+ case 24:
+ format.bitsPerPixel = 24;
+ format.depth = 24;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 8;
+ format.greenBits = 8;
+ format.blueBits = 8;
+ format.redShift = 16;
+ format.greenShift = 8;
+ format.blueShift = 0;
+ break;
+
+ case 18:
+ format.bitsPerPixel = 24;
+ format.depth = 18;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 6;
+ format.greenBits = 6;
+ format.blueBits = 6;
+ format.redShift = 12;
+ format.greenShift = 6;
+ format.blueShift = 0;
+ break;
+
+ case 16:
+ format.bitsPerPixel = 16;
+ format.depth = 16;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 5;
+ format.greenBits = 6;
+ format.blueBits = 5;
+ format.redShift = 11;
+ format.greenShift = 5;
+ format.blueShift = 0;
+ break;
+
+ case 15:
+ format.bitsPerPixel = 16;
+ format.depth = 15;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 5;
+ format.greenBits = 5;
+ format.blueBits = 5;
+ format.redShift = 10;
+ format.greenShift = 5;
+ format.blueShift = 0;
+ break;
+
+ case 12:
+ format.bitsPerPixel = 16;
+ format.depth = 12;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 4;
+ format.greenBits = 4;
+ format.blueBits = 4;
+ format.redShift = 8;
+ format.greenShift = 4;
+ format.blueShift = 0;
+ break;
+
+ case 8:
+ case 4:
+ format.bitsPerPixel = 8;
+ format.depth = 8;
+ format.bigEndian = 0;
+ format.trueColor = false;
+ format.redBits = 0;
+ format.greenBits = 0;
+ format.blueBits = 0;
+ format.redShift = 0;
+ format.greenShift = 0;
+ format.blueShift = 0;
+ break;
+
+ default:
+ qDebug("QVNC cannot drive depth %d", qvnc_screen->depth());
+ discardClient();
+ return;
+ }
+ sim.width = qvnc_screen->deviceWidth();
+ sim.height = qvnc_screen->deviceHeight();
+ sim.setName("Qt for Embedded Linux VNC Server");
+ sim.write(client);
+ state = Connected;
+ }
+ break;
+
+ case Connected:
+ do {
+ if (!handleMsg) {
+ client->read((char *)&msgType, 1);
+ handleMsg = true;
+ }
+ if (handleMsg) {
+ switch (msgType ) {
+ case SetPixelFormat:
+ setPixelFormat();
+ break;
+ case FixColourMapEntries:
+ qDebug("Not supported: FixColourMapEntries");
+ handleMsg = false;
+ break;
+ case SetEncodings:
+ setEncodings();
+ break;
+ case FramebufferUpdateRequest:
+ frameBufferUpdateRequest();
+ break;
+ case KeyEvent:
+ keyEvent();
+ break;
+ case PointerEvent:
+ pointerEvent();
+ break;
+ case ClientCutText:
+ clientCutText();
+ break;
+ default:
+ qDebug("Unknown message type: %d", (int)msgType);
+ handleMsg = false;
+ }
+ }
+ } while (!handleMsg && client->bytesAvailable());
+ break;
+ default:
+ break;
+ }
+}
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+bool QVNCScreen::swapBytes() const
+{
+ if (depth() != 16)
+ return false;
+
+ if (screen())
+ return screen()->frameBufferLittleEndian();
+ return frameBufferLittleEndian();
+}
+#endif
+
+void QVNCServer::setPixelFormat()
+{
+ if (client->bytesAvailable() >= 19) {
+ char buf[3];
+ client->read(buf, 3); // just padding
+ pixelFormat.read(client);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("Want format: %d %d %d %d %d %d %d %d %d %d",
+ int(pixelFormat.bitsPerPixel),
+ int(pixelFormat.depth),
+ int(pixelFormat.bigEndian),
+ int(pixelFormat.trueColor),
+ int(pixelFormat.redBits),
+ int(pixelFormat.greenBits),
+ int(pixelFormat.blueBits),
+ int(pixelFormat.redShift),
+ int(pixelFormat.greenShift),
+ int(pixelFormat.blueShift));
+#endif
+ if (!pixelFormat.trueColor) {
+ qDebug("Can only handle true color clients");
+ discardClient();
+ }
+ handleMsg = false;
+ sameEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) == !!pixelFormat.bigEndian;
+ needConversion = pixelConversionNeeded();
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ swapBytes = qvnc_screen->swapBytes();
+#endif
+ }
+}
+
+void QVNCServer::setEncodings()
+{
+ QRfbSetEncodings enc;
+
+ if (!encodingsPending && enc.read(client)) {
+ encodingsPending = enc.count;
+ if (!encodingsPending)
+ handleMsg = false;
+ }
+
+ if (encoder) {
+ delete encoder;
+ encoder = 0;
+ }
+
+ enum Encodings {
+ Raw = 0,
+ CopyRect = 1,
+ RRE = 2,
+ CoRRE = 4,
+ Hextile = 5,
+ ZRLE = 16,
+ Cursor = -239,
+ DesktopSize = -223
+ };
+
+ if (encodingsPending && (unsigned)client->bytesAvailable() >=
+ encodingsPending * sizeof(quint32)) {
+ for (int i = 0; i < encodingsPending; ++i) {
+ qint32 enc;
+ client->read((char *)&enc, sizeof(qint32));
+ enc = ntohl(enc);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: %d", enc);
+#endif
+ switch (enc) {
+ case Raw:
+ if (!encoder) {
+ encoder = new QRfbRawEncoder(this);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: using raw");
+#endif
+ }
+ break;
+ case CopyRect:
+ supportCopyRect = true;
+ break;
+ case RRE:
+ supportRRE = true;
+ break;
+ case CoRRE:
+ supportCoRRE = true;
+ break;
+ case Hextile:
+ supportHextile = true;
+ if (encoder)
+ break;
+ switch (qvnc_screen->depth()) {
+#ifdef QT_QWS_DEPTH_8
+ case 8:
+ encoder = new QRfbHextileEncoder<quint8>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_12
+ case 12:
+ encoder = new QRfbHextileEncoder<qrgb444>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_15
+ case 15:
+ encoder = new QRfbHextileEncoder<qrgb555>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_16
+ case 16:
+ encoder = new QRfbHextileEncoder<quint16>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_18
+ case 18:
+ encoder = new QRfbHextileEncoder<qrgb666>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_24
+ case 24:
+ encoder = new QRfbHextileEncoder<qrgb888>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_32
+ case 32:
+ encoder = new QRfbHextileEncoder<quint32>(this);
+ break;
+#endif
+ default:
+ break;
+ }
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: using hextile");
+#endif
+ break;
+ case ZRLE:
+ supportZRLE = true;
+ break;
+ case Cursor:
+ supportCursor = true;
+#ifndef QT_NO_QWS_CURSOR
+ if (!qvnc_screen->screen() || qt_screencursor->isAccelerated()) {
+ delete qvnc_cursor;
+ qvnc_cursor = new QVNCClientCursor(this);
+ }
+#endif
+ break;
+ case DesktopSize:
+ supportDesktopSize = true;
+ break;
+ default:
+ break;
+ }
+ }
+ handleMsg = false;
+ encodingsPending = 0;
+ }
+
+ if (!encoder) {
+ encoder = new QRfbRawEncoder(this);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: fallback using raw");
+#endif
+ }
+}
+
+void QVNCServer::frameBufferUpdateRequest()
+{
+ QRfbFrameBufferUpdateRequest ev;
+
+ if (ev.read(client)) {
+ if (!ev.incremental) {
+ QRect r(ev.rect.x, ev.rect.y, ev.rect.w, ev.rect.h);
+ r.translate(qvnc_screen->offset());
+ qvnc_screen->d_ptr->setDirty(r, true);
+ }
+ wantUpdate = true;
+ checkUpdate();
+ handleMsg = false;
+ }
+}
+
+void QVNCServer::pointerEvent()
+{
+ QRfbPointerEvent ev;
+ if (ev.read(client)) {
+ const QPoint offset = qvnc_screen->offset();
+ QWSServer::sendMouseEvent(offset + QPoint(ev.x, ev.y), ev.buttons);
+ handleMsg = false;
+ }
+}
+
+void QVNCServer::keyEvent()
+{
+ QRfbKeyEvent ev;
+
+ if (ev.read(client)) {
+ if (ev.keycode == Qt::Key_Shift)
+ keymod = ev.down ? keymod | Qt::ShiftModifier :
+ keymod & ~Qt::ShiftModifier;
+ else if (ev.keycode == Qt::Key_Control)
+ keymod = ev.down ? keymod | Qt::ControlModifier :
+ keymod & ~Qt::ControlModifier;
+ else if (ev.keycode == Qt::Key_Alt)
+ keymod = ev.down ? keymod | Qt::AltModifier :
+ keymod & ~Qt::AltModifier;
+ if (ev.unicode || ev.keycode)
+ QWSServer::sendKeyEvent(ev.unicode, ev.keycode, keymod, ev.down, false);
+ handleMsg = false;
+ }
+}
+
+void QVNCServer::clientCutText()
+{
+ QRfbClientCutText ev;
+
+ if (cutTextPending == 0 && ev.read(client)) {
+ cutTextPending = ev.length;
+ if (!cutTextPending)
+ handleMsg = false;
+ }
+
+ if (cutTextPending && client->bytesAvailable() >= cutTextPending) {
+ char *text = new char [cutTextPending+1];
+ client->read(text, cutTextPending);
+ delete [] text;
+ cutTextPending = 0;
+ handleMsg = false;
+ }
+}
+
+// stride in bytes
+template <class SRC>
+bool QRfbSingleColorHextile<SRC>::read(const uchar *data,
+ int width, int height, int stride)
+{
+ const int depth = encoder->server->screen()->depth();
+ if (width % (depth / 8)) // hw: should rather fallback to simple loop
+ return false;
+
+ static int alwaysFalse = qgetenv("QT_VNC_NOCHECKFILL").toInt();
+ if (alwaysFalse)
+ return false;
+
+ switch (depth) {
+ case 4: {
+ const quint8 *data8 = reinterpret_cast<const quint8*>(data);
+ if ((data8[0] & 0xf) != (data8[0] >> 4))
+ return false;
+ width /= 2;
+ } // fallthrough
+ case 8: {
+ const quint8 *data8 = reinterpret_cast<const quint8*>(data);
+ if (data8[0] != data8[1])
+ return false;
+ width /= 2;
+ } // fallthrough
+ case 12:
+ case 15:
+ case 16: {
+ const quint16 *data16 = reinterpret_cast<const quint16*>(data);
+ if (data16[0] != data16[1])
+ return false;
+ width /= 2;
+ } // fallthrough
+ case 18:
+ case 24:
+ case 32: {
+ const quint32 *data32 = reinterpret_cast<const quint32*>(data);
+ const quint32 first = data32[0];
+ const int linestep = (stride / sizeof(quint32)) - width;
+ for (int y = 0; y < height; ++y) {
+ for (int x = 0; x < width; ++x) {
+ if (*(data32++) != first)
+ return false;
+ }
+ data32 += linestep;
+ }
+ break;
+ }
+ default:
+ return false;
+ }
+
+ SRC color = reinterpret_cast<const SRC*>(data)[0];
+ encoder->newBg |= (color != encoder->bg);
+ encoder->bg = color;
+ return true;
+}
+
+template <class SRC>
+void QRfbSingleColorHextile<SRC>::write(QTcpSocket *socket) const
+{
+ if (true || encoder->newBg) {
+ const int bpp = encoder->server->clientBytesPerPixel();
+ const int padding = 3;
+ QVarLengthArray<char> buffer(padding + 1 + bpp);
+ buffer[padding] = 2; // BackgroundSpecified
+ encoder->server->convertPixels(buffer.data() + padding + 1,
+ reinterpret_cast<char*>(&encoder->bg),
+ 1);
+ socket->write(buffer.data() + padding, bpp + 1);
+// encoder->newBg = false;
+ } else {
+ char subenc = 0;
+ socket->write(&subenc, 1);
+ }
+}
+
+template <class SRC>
+bool QRfbDualColorHextile<SRC>::read(const uchar *data,
+ int width, int height, int stride)
+{
+ const SRC *ptr = reinterpret_cast<const SRC*>(data);
+ const int linestep = (stride / sizeof(SRC)) - width;
+
+ SRC c1;
+ SRC c2 = 0;
+ int n1 = 0;
+ int n2 = 0;
+ int x = 0;
+ int y = 0;
+
+ c1 = *ptr;
+
+ // find second color
+ while (y < height) {
+ while (x < width) {
+ if (*ptr == c1) {
+ ++n1;
+ } else {
+ c2 = *ptr;
+ goto found_second_color;
+ }
+ ++ptr;
+ ++x;
+ }
+ x = 0;
+ ptr += linestep;
+ ++y;
+ }
+
+found_second_color:
+ // finish counting
+ while (y < height) {
+ while (x < width) {
+ if (*ptr == c1) {
+ ++n1;
+ } else if (*ptr == c2) {
+ ++n2;
+ } else {
+ return false;
+ }
+ ++ptr;
+ ++x;
+ }
+ x = 0;
+ ptr += linestep;
+ ++y;
+ }
+
+ if (n2 > n1) {
+ const quint32 tmpC = c1;
+ c1 = c2;
+ c2 = tmpC;
+ }
+
+ encoder->newBg |= (c1 != encoder->bg);
+ encoder->newFg |= (c2 != encoder->fg);
+
+ encoder->bg = c1;
+ encoder->fg = c2;
+
+ // create map
+ bool inRect = false;
+ numRects = 0;
+ ptr = reinterpret_cast<const SRC*>(data);
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ if (inRect && *ptr == encoder->bg) {
+ // rect finished
+ setWidth(x - lastx());
+ next();
+ inRect = false;
+ } else if (!inRect && *ptr == encoder->fg) {
+ // rect start
+ setX(x);
+ setY(y);
+ setHeight(1);
+ inRect = true;
+ }
+ ++ptr;
+ }
+ if (inRect) {
+ // finish rect
+ setWidth(width - lastx());
+ next();
+ inRect = false;
+ }
+ ptr += linestep;
+ }
+
+ return true;
+}
+
+template <class SRC>
+void QRfbDualColorHextile<SRC>::write(QTcpSocket *socket) const
+{
+ const int bpp = encoder->server->clientBytesPerPixel();
+ const int padding = 3;
+ QVarLengthArray<char> buffer(padding + 2 * bpp + sizeof(char) + sizeof(numRects));
+ char &subenc = buffer[padding];
+ int n = padding + sizeof(subenc);
+
+ subenc = 0x8; // AnySubrects
+
+ if (encoder->newBg) {
+ subenc |= 0x2; // Background
+ encoder->server->convertPixels(buffer.data() + n, (char*)&encoder->bg, 1);
+ n += bpp;
+// encoder->newBg = false;
+ }
+
+ if (encoder->newFg) {
+ subenc |= 0x4; // Foreground
+ encoder->server->convertPixels(buffer.data() + n, (char*)&encoder->fg, 1);
+ n += bpp;
+// encoder->newFg = false;
+ }
+ buffer[n] = numRects;
+ n += sizeof(numRects);
+
+ socket->write(buffer.data() + padding, n - padding);
+ socket->write((char*)rects, numRects * sizeof(Rect));
+}
+
+template <class SRC>
+void QRfbDualColorHextile<SRC>::next()
+{
+ for (int r = numRects - 1; r >= 0; --r) {
+ if (recty(r) == lasty())
+ continue;
+ if (recty(r) < lasty() - 1) // only search previous scanline
+ break;
+ if (rectx(r) == lastx() && width(r) == width(numRects)) {
+ ++rects[r].wh;
+ return;
+ }
+ }
+ ++numRects;
+}
+
+template <class SRC>
+inline void QRfbMultiColorHextile<SRC>::setColor(SRC color)
+{
+ encoder->server->convertPixels(reinterpret_cast<char*>(rect(numRects)),
+ (const char*)&color, 1);
+}
+
+template <class SRC>
+inline bool QRfbMultiColorHextile<SRC>::beginRect()
+{
+ if ((rects.size() + bpp + 2) > maxRectsSize)
+ return false;
+ rects.resize(rects.size() + bpp + 2);
+ return true;
+}
+
+template <class SRC>
+inline void QRfbMultiColorHextile<SRC>::endRect()
+{
+ setHeight(numRects, 1);
+ ++numRects;
+}
+
+template <class SRC>
+bool QRfbMultiColorHextile<SRC>::read(const uchar *data,
+ int width, int height, int stride)
+{
+ const SRC *ptr = reinterpret_cast<const SRC*>(data);
+ const int linestep = (stride / sizeof(SRC)) - width;
+
+ bpp = encoder->server->clientBytesPerPixel();
+
+ if (encoder->newBg)
+ encoder->bg = ptr[0];
+
+ const SRC bg = encoder->bg;
+ SRC color = bg;
+ bool inRect = false;
+
+ numRects = 0;
+ rects.clear();
+
+ for (int y = 0; y < height; ++y) {
+ for (int x = 0; x < width; ++x) {
+ if (inRect && *ptr != color) { // end rect
+ setWidth(numRects, x - rectx(numRects));
+ endRect();
+ inRect = false;
+ }
+
+ if (!inRect && *ptr != bg) { // begin rect
+ if (!beginRect())
+ return false;
+ inRect = true;
+ color = *ptr;
+ setColor(color);
+ setX(numRects, x);
+ setY(numRects, y);
+ }
+ ++ptr;
+ }
+ if (inRect) { // end rect
+ setWidth(numRects, width - rectx(numRects));
+ endRect();
+ inRect = false;
+ }
+ ptr += linestep;
+ }
+
+ return true;
+}
+
+template <class SRC>
+void QRfbMultiColorHextile<SRC>::write(QTcpSocket *socket) const
+{
+ const int padding = 3;
+ QVarLengthArray<quint8> buffer(bpp + padding + sizeof(quint8) + sizeof(numRects));
+
+ quint8 &subenc = buffer[padding];
+ int n = padding + sizeof(quint8);
+
+ subenc = 8 | 16; // AnySubrects | SubrectsColoured
+
+ if (encoder->newBg) {
+ subenc |= 0x2; // Background
+ encoder->server->convertPixels(reinterpret_cast<char*>(buffer.data() + n),
+ reinterpret_cast<const char*>(&encoder->bg),
+ 1);
+ n += bpp;
+// encoder->newBg = false;
+ }
+
+ buffer[n] = numRects;
+ n += sizeof(numRects);
+
+ socket->write(reinterpret_cast<const char*>(buffer.data() + padding),
+ n - padding);
+ socket->write(reinterpret_cast<const char*>(rects.constData()),
+ rects.size());
+}
+
+bool QVNCServer::pixelConversionNeeded() const
+{
+ if (!sameEndian)
+ return true;
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (qvnc_screen->swapBytes())
+ return true;
+#endif
+
+ const int screendepth = qvnc_screen->depth();
+ if (screendepth != pixelFormat.bitsPerPixel)
+ return true;
+
+ switch (screendepth) {
+ case 32:
+ case 24:
+ return false;
+ case 18:
+ return (pixelFormat.redBits == 6
+ && pixelFormat.greenBits == 6
+ && pixelFormat.blueBits == 6);
+ case 16:
+ return (pixelFormat.redBits == 5
+ && pixelFormat.greenBits == 6
+ && pixelFormat.blueBits == 5);
+ case 15:
+ return (pixelFormat.redBits == 5
+ && pixelFormat.greenBits == 5
+ && pixelFormat.blueBits == 5);
+ case 12:
+ return (pixelFormat.redBits == 4
+ && pixelFormat.greenBits == 4
+ && pixelFormat.blueBits == 4);
+ }
+ return true;
+}
+
+// count: number of pixels
+void QVNCServer::convertPixels(char *dst, const char *src, int count) const
+{
+ const int screendepth = qvnc_screen->depth();
+ const bool isBgr = qvnc_screen->pixelType() == QScreen::BGRPixel;
+
+ // cutoffs
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (!swapBytes)
+#endif
+ if (sameEndian) {
+ if (screendepth == pixelFormat.bitsPerPixel) { // memcpy cutoffs
+
+ switch (screendepth) {
+ case 32:
+ memcpy(dst, src, count * sizeof(quint32));
+ return;
+ case 16:
+ if (pixelFormat.redBits == 5
+ && pixelFormat.greenBits == 6
+ && pixelFormat.blueBits == 5)
+ {
+ memcpy(dst, src, count * sizeof(quint16));
+ return;
+ }
+ }
+ } else if (screendepth == 16 && pixelFormat.bitsPerPixel == 32) {
+#if defined(__i386__) // Currently fails on ARM if dst is not 4 byte aligned
+ const quint32 *src32 = reinterpret_cast<const quint32*>(src);
+ quint32 *dst32 = reinterpret_cast<quint32*>(dst);
+ int count32 = count * sizeof(quint16) / sizeof(quint32);
+ while (count32--) {
+ const quint32 s = *src32++;
+ quint32 result1;
+ quint32 result2;
+
+ // red
+ result1 = ((s & 0xf8000000) | ((s & 0xe0000000) >> 5)) >> 8;
+ result2 = ((s & 0x0000f800) | ((s & 0x0000e000) >> 5)) << 8;
+
+ // green
+ result1 |= ((s & 0x07e00000) | ((s & 0x06000000) >> 6)) >> 11;
+ result2 |= ((s & 0x000007e0) | ((s & 0x00000600) >> 6)) << 5;
+
+ // blue
+ result1 |= ((s & 0x001f0000) | ((s & 0x001c0000) >> 5)) >> 13;
+ result2 |= ((s & 0x0000001f) | ((s & 0x0000001c) >> 5)) << 3;
+
+ *dst32++ = result2;
+ *dst32++ = result1;
+ }
+ if (count & 0x1) {
+ const quint16 *src16 = reinterpret_cast<const quint16*>(src);
+ *dst32 = qt_conv16ToRgb(src16[count - 1]);
+ }
+ return;
+#endif
+ }
+ }
+
+ const int bytesPerPixel = (pixelFormat.bitsPerPixel + 7) / 8;
+
+// nibble = 0;
+
+ for (int i = 0; i < count; ++i) {
+ int r, g, b;
+
+ switch (screendepth) {
+#if 0
+ case 4: {
+ if (!nibble) {
+ r = ((*src) & 0x0f) << 4;
+ } else {
+ r = (*src) & 0xf0;
+ src++;
+ }
+ nibble = !nibble;
+ g = b = r;
+ break;
+ }
+#endif
+ case 8: {
+ QRgb rgb = qvnc_screen->clut()[int(*src)];
+ r = qRed(rgb);
+ g = qGreen(rgb);
+ b = qBlue(rgb);
+ src++;
+ break;
+ }
+#ifdef QT_QWS_DEPTH_12
+ case 12: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb444*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb444);
+ break;
+ }
+#endif
+#ifdef QT_QWS_DEPTH_15
+ case 15: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb555*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb555);
+ break;
+ }
+#endif
+ case 16: {
+ quint16 p = *reinterpret_cast<const quint16*>(src);
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (swapBytes)
+ p = ((p & 0xff) << 8) | ((p & 0xff00) >> 8);
+#endif
+ r = (p >> 11) & 0x1f;
+ g = (p >> 5) & 0x3f;
+ b = p & 0x1f;
+ r <<= 3;
+ g <<= 2;
+ b <<= 3;
+ src += sizeof(quint16);
+ break;
+ }
+#ifdef QT_QWS_DEPTH_18
+ case 18: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb666*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb666);
+ break;
+ }
+#endif
+#ifdef QT_QWS_DEPTH_24
+ case 24: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb888*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb888);
+ break;
+ }
+#endif
+ case 32: {
+ quint32 p = *reinterpret_cast<const quint32*>(src);
+ r = (p >> 16) & 0xff;
+ g = (p >> 8) & 0xff;
+ b = p & 0xff;
+ src += sizeof(quint32);
+ break;
+ }
+ default: {
+ r = g = b = 0;
+ qDebug("QVNCServer: don't support %dbpp display", screendepth);
+ return;
+ }
+ }
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (swapBytes ^ isBgr)
+#else
+ if (isBgr)
+#endif
+ qSwap(r, b);
+
+ r >>= (8 - pixelFormat.redBits);
+ g >>= (8 - pixelFormat.greenBits);
+ b >>= (8 - pixelFormat.blueBits);
+
+ int pixel = (r << pixelFormat.redShift) |
+ (g << pixelFormat.greenShift) |
+ (b << pixelFormat.blueShift);
+
+ if (sameEndian || pixelFormat.bitsPerPixel == 8) {
+ memcpy(dst, &pixel, bytesPerPixel); // XXX: do a simple for-loop instead?
+ dst += bytesPerPixel;
+ continue;
+ }
+
+
+ if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+ switch (pixelFormat.bitsPerPixel) {
+ case 16:
+ pixel = (((pixel & 0x0000ff00) << 8) |
+ ((pixel & 0x000000ff) << 24));
+ break;
+ case 32:
+ pixel = (((pixel & 0xff000000) >> 24) |
+ ((pixel & 0x00ff0000) >> 8) |
+ ((pixel & 0x0000ff00) << 8) |
+ ((pixel & 0x000000ff) << 24));
+ break;
+ default:
+ qDebug("Cannot handle %d bpp client", pixelFormat.bitsPerPixel);
+ }
+ } else { // QSysInfo::ByteOrder == QSysInfo::LittleEndian
+ switch (pixelFormat.bitsPerPixel) {
+ case 16:
+ pixel = (((pixel & 0xff000000) >> 8) |
+ ((pixel & 0x00ff0000) << 8));
+ break;
+ case 32:
+ pixel = (((pixel & 0xff000000) >> 24) |
+ ((pixel & 0x00ff0000) >> 8) |
+ ((pixel & 0x0000ff00) << 8) |
+ ((pixel & 0x000000ff) << 24));
+ break;
+ default:
+ qDebug("Cannot handle %d bpp client",
+ pixelFormat.bitsPerPixel);
+ break;
+ }
+ }
+ memcpy(dst, &pixel, bytesPerPixel); // XXX: simple for-loop instead?
+ dst += bytesPerPixel;
+ }
+}
+
+#ifndef QT_NO_QWS_CURSOR
+static void blendCursor(QImage &image, const QRect &imageRect)
+{
+ const QRect cursorRect = qt_screencursor->boundingRect();
+ const QRect intersection = (cursorRect & imageRect);
+ const QRect destRect = intersection.translated(-imageRect.topLeft());
+ const QRect srcRect = intersection.translated(-cursorRect.topLeft());
+
+ QPainter painter(&image);
+ painter.drawImage(destRect, qt_screencursor->image(), srcRect);
+ painter.end();
+}
+#endif // QT_NO_QWS_CURSOR
+
+QVNCDirtyMap::QVNCDirtyMap(QScreen *s)
+ : bytesPerPixel(0), numDirty(0), screen(s)
+{
+ bytesPerPixel = (screen->depth() + 7) / 8;
+ bufferWidth = screen->deviceWidth();
+ bufferHeight = screen->deviceHeight();
+ bufferStride = bufferWidth * bytesPerPixel;
+ buffer = new uchar[bufferHeight * bufferStride];
+
+ mapWidth = (bufferWidth + MAP_TILE_SIZE - 1) / MAP_TILE_SIZE;
+ mapHeight = (bufferHeight + MAP_TILE_SIZE - 1) / MAP_TILE_SIZE;
+ numTiles = mapWidth * mapHeight;
+ map = new uchar[numTiles];
+}
+
+QVNCDirtyMap::~QVNCDirtyMap()
+{
+ delete[] map;
+ delete[] buffer;
+}
+
+void QVNCDirtyMap::reset()
+{
+ memset(map, 1, numTiles);
+ memset(buffer, 0, bufferHeight * bufferStride);
+ numDirty = numTiles;
+}
+
+inline bool QVNCDirtyMap::dirty(int x, int y) const
+{
+ return map[y * mapWidth + x];
+}
+
+inline void QVNCDirtyMap::setClean(int x, int y)
+{
+ map[y * mapWidth + x] = 0;
+ --numDirty;
+}
+
+template <class T>
+void QVNCDirtyMapOptimized<T>::setDirty(int tileX, int tileY, bool force)
+{
+ static bool alwaysForce = qgetenv("QT_VNC_NO_COMPAREBUFFER").toInt();
+ if (alwaysForce)
+ force = true;
+
+ bool changed = false;
+
+ if (!force) {
+ const int lstep = screen->linestep();
+ const int startX = tileX * MAP_TILE_SIZE;
+ const int startY = tileY * MAP_TILE_SIZE;
+ const uchar *scrn = screen->base()
+ + startY * lstep + startX * bytesPerPixel;
+ uchar *old = buffer + startY * bufferStride + startX * sizeof(T);
+
+ const int tileHeight = (startY + MAP_TILE_SIZE > bufferHeight ?
+ bufferHeight - startY : MAP_TILE_SIZE);
+ const int tileWidth = (startX + MAP_TILE_SIZE > bufferWidth ?
+ bufferWidth - startX : MAP_TILE_SIZE);
+ const bool doInlines = (tileWidth == MAP_TILE_SIZE);
+
+ int y = tileHeight;
+
+ if (doInlines) { // hw: memcmp/memcpy is inlined when using constants
+ while (y) {
+ if (memcmp(old, scrn, sizeof(T) * MAP_TILE_SIZE)) {
+ changed = true;
+ break;
+ }
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+
+ while (y) {
+ memcpy(old, scrn, sizeof(T) * MAP_TILE_SIZE);
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+ } else {
+ while (y) {
+ if (memcmp(old, scrn, sizeof(T) * tileWidth)) {
+ changed = true;
+ break;
+ }
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+
+ while (y) {
+ memcpy(old, scrn, sizeof(T) * tileWidth);
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+ }
+ }
+
+ const int mapIndex = tileY * mapWidth + tileX;
+ if ((force || changed) && !map[mapIndex]) {
+ map[mapIndex] = 1;
+ ++numDirty;
+ }
+}
+
+template <class SRC>
+QRfbHextileEncoder<SRC>::QRfbHextileEncoder(QVNCServer *s)
+ : QRfbEncoder(s),
+ singleColorHextile(this), dualColorHextile(this), multiColorHextile(this)
+{
+}
+
+/*
+ \internal
+ Send dirty rects using hextile encoding.
+*/
+template <class SRC>
+void QRfbHextileEncoder<SRC>::write()
+{
+ QWSDisplay::grab(true);
+
+ QVNCDirtyMap *map = server->dirtyMap();
+ QTcpSocket *socket = server->clientSocket();
+
+ const quint32 encoding = htonl(5); // hextile encoding
+ const int bytesPerPixel = server->clientBytesPerPixel();
+
+ {
+ const char tmp[2] = { 0, 0 }; // msg type, padding
+ socket->write(tmp, sizeof(tmp));
+ }
+ {
+ const quint16 count = htons(map->numDirty);
+ socket->write((char *)&count, sizeof(count));
+ }
+
+ if (map->numDirty <= 0) {
+ QWSDisplay::ungrab();
+ return;
+ }
+
+ newBg = true;
+ newFg = true;
+
+ const QImage screenImage = server->screenImage();
+ QRfbRect rect(0, 0, MAP_TILE_SIZE, MAP_TILE_SIZE);
+
+ for (int y = 0; y < map->mapHeight; ++y) {
+ if (rect.y + MAP_TILE_SIZE > server->screen()->height())
+ rect.h = server->screen()->height() - rect.y;
+ rect.w = MAP_TILE_SIZE;
+ for (int x = 0; x < map->mapWidth; ++x) {
+ if (!map->dirty(x, y))
+ continue;
+ map->setClean(x, y);
+
+ rect.x = x * MAP_TILE_SIZE;
+ if (rect.x + MAP_TILE_SIZE > server->screen()->deviceWidth())
+ rect.w = server->screen()->deviceWidth() - rect.x;
+ rect.write(socket);
+
+ socket->write((char *)&encoding, sizeof(encoding));
+
+ const uchar *screendata = screenImage.scanLine(rect.y)
+ + rect.x * screenImage.depth() / 8;
+ int linestep = screenImage.bytesPerLine();
+
+#ifndef QT_NO_QWS_CURSOR
+ // hardware cursors must be blended with the screen memory
+ const bool doBlendCursor = qt_screencursor
+ && !server->hasClientCursor()
+ && qt_screencursor->isAccelerated();
+ QImage tileImage;
+ if (doBlendCursor) {
+ const QRect tileRect(rect.x, rect.y, rect.w, rect.h);
+ const QRect cursorRect = qt_screencursor->boundingRect()
+ .translated(-server->screen()->offset());
+ if (tileRect.intersects(cursorRect)) {
+ tileImage = screenImage.copy(tileRect);
+ blendCursor(tileImage,
+ tileRect.translated(server->screen()->offset()));
+ screendata = tileImage.bits();
+ linestep = tileImage.bytesPerLine();
+ }
+ }
+#endif // QT_NO_QWS_CURSOR
+
+ if (singleColorHextile.read(screendata, rect.w, rect.h, linestep)) {
+ singleColorHextile.write(socket);
+ } else if (dualColorHextile.read(screendata, rect.w, rect.h, linestep)) {
+ dualColorHextile.write(socket);
+ } else if (multiColorHextile.read(screendata, rect.w, rect.h, linestep)) {
+ multiColorHextile.write(socket);
+ } else if (server->doPixelConversion()) {
+ const int bufferSize = rect.w * rect.h * bytesPerPixel + 1;
+ const int padding = sizeof(quint32) - sizeof(char);
+ buffer.resize(bufferSize + padding);
+
+ buffer[padding] = 1; // Raw subencoding
+
+ // convert pixels
+ char *b = buffer.data() + padding + 1;
+ const int bstep = rect.w * bytesPerPixel;
+ for (int i = 0; i < rect.h; ++i) {
+ server->convertPixels(b, (const char*)screendata, rect.w);
+ screendata += linestep;
+ b += bstep;
+ }
+ socket->write(buffer.constData() + padding, bufferSize);
+ } else {
+ quint8 subenc = 1; // Raw subencoding
+ socket->write((char *)&subenc, 1);
+
+ // send pixels
+ for (int i = 0; i < rect.h; ++i) {
+ socket->write((const char*)screendata,
+ rect.w * bytesPerPixel);
+ screendata += linestep;
+ }
+ }
+ }
+ if (socket->state() == QAbstractSocket::UnconnectedState)
+ break;
+ rect.y += MAP_TILE_SIZE;
+ }
+ socket->flush();
+ Q_ASSERT(map->numDirty == 0);
+
+ QWSDisplay::ungrab();
+}
+
+void QRfbRawEncoder::write()
+{
+ QWSDisplay::grab(false);
+
+ QVNCDirtyMap *map = server->dirtyMap();
+ QTcpSocket *socket = server->clientSocket();
+
+ const int bytesPerPixel = server->clientBytesPerPixel();
+
+ // create a region from the dirty rects and send the region's merged rects.
+ QRegion rgn;
+ if (map) {
+ for (int y = 0; y < map->mapHeight; ++y) {
+ for (int x = 0; x < map->mapWidth; ++x) {
+ if (!map->dirty(x, y))
+ continue;
+ rgn += QRect(x * MAP_TILE_SIZE, y * MAP_TILE_SIZE,
+ MAP_TILE_SIZE, MAP_TILE_SIZE);
+ map->setClean(x, y);
+ }
+ }
+
+ rgn &= QRect(0, 0, server->screen()->deviceWidth(),
+ server->screen()->deviceHeight());
+ }
+ const QVector<QRect> rects = rgn.rects();
+
+ {
+ const char tmp[2] = { 0, 0 }; // msg type, padding
+ socket->write(tmp, sizeof(tmp));
+ }
+
+ {
+ const quint16 count = htons(rects.size());
+ socket->write((char *)&count, sizeof(count));
+ }
+
+ if (rects.size() <= 0) {
+ QWSDisplay::ungrab();
+ return;
+ }
+
+ const QImage screenImage = server->screenImage();
+
+ for (int i = 0; i < rects.size(); ++i) {
+ const QRect tileRect = rects.at(i);
+ const QRfbRect rect(tileRect.x(), tileRect.y(),
+ tileRect.width(), tileRect.height());
+ rect.write(socket);
+
+ const quint32 encoding = htonl(0); // raw encoding
+ socket->write((char *)&encoding, sizeof(encoding));
+
+ int linestep = screenImage.bytesPerLine();
+ const uchar *screendata = screenImage.scanLine(rect.y)
+ + rect.x * screenImage.depth() / 8;
+
+#ifndef QT_NO_QWS_CURSOR
+ // hardware cursors must be blended with the screen memory
+ const bool doBlendCursor = qt_screencursor
+ && !server->hasClientCursor()
+ && qt_screencursor->isAccelerated();
+ QImage tileImage;
+ if (doBlendCursor) {
+ const QRect cursorRect = qt_screencursor->boundingRect()
+ .translated(-server->screen()->offset());
+ if (tileRect.intersects(cursorRect)) {
+ tileImage = screenImage.copy(tileRect);
+ blendCursor(tileImage,
+ tileRect.translated(server->screen()->offset()));
+ screendata = tileImage.bits();
+ linestep = tileImage.bytesPerLine();
+ }
+ }
+#endif // QT_NO_QWS_CURSOR
+
+ if (server->doPixelConversion()) {
+ const int bufferSize = rect.w * rect.h * bytesPerPixel;
+ if (bufferSize > buffer.size())
+ buffer.resize(bufferSize);
+
+ // convert pixels
+ char *b = buffer.data();
+ const int bstep = rect.w * bytesPerPixel;
+ for (int i = 0; i < rect.h; ++i) {
+ server->convertPixels(b, (const char*)screendata, rect.w);
+ screendata += linestep;
+ b += bstep;
+ }
+ socket->write(buffer.constData(), bufferSize);
+ } else {
+ for (int i = 0; i < rect.h; ++i) {
+ socket->write((const char*)screendata, rect.w * bytesPerPixel);
+ screendata += linestep;
+ }
+ }
+ if (socket->state() == QAbstractSocket::UnconnectedState)
+ break;
+ }
+ socket->flush();
+
+ QWSDisplay::ungrab();
+}
+
+inline QImage QVNCServer::screenImage() const
+{
+ return QImage(qvnc_screen->base(), qvnc_screen->deviceWidth(),
+ qvnc_screen->deviceHeight(), qvnc_screen->linestep(),
+ qvnc_screen->pixelFormat());
+}
+
+void QVNCServer::checkUpdate()
+{
+ if (!wantUpdate)
+ return;
+
+ if (dirtyCursor) {
+#ifndef QT_NO_QWS_CURSOR
+ Q_ASSERT(qvnc_cursor);
+ qvnc_cursor->write();
+#endif
+ dirtyCursor = false;
+ wantUpdate = false;
+ return;
+ }
+
+ if (dirtyMap()->numDirty > 0) {
+ if (encoder)
+ encoder->write();
+ wantUpdate = false;
+ }
+}
+
+void QVNCServer::discardClient()
+{
+ timer->stop();
+ state = Unconnected;
+ delete encoder;
+ encoder = 0;
+#ifndef QT_NO_QWS_CURSOR
+ delete qvnc_cursor;
+ qvnc_cursor = 0;
+#endif
+ if (!qvnc_screen->screen() && !qvnc_screen->d_ptr->noDisablePainting && QWSServer::instance())
+ QWSServer::instance()->enablePainting(false);
+}
+
+
+//===========================================================================
+
+/*!
+ \class QVNCScreen
+ \internal
+ \ingroup qws
+
+ \brief The QVNCScreen class implements a screen driver for VNC
+ servers.
+
+ Note that this class is only available in \l{Qt for Embedded Linux}.
+ Custom screen drivers can be added by subclassing the QScreen
+ class, using the QScreenDriverFactory class to dynamically load
+ the driver into the application.
+
+ The VNC protocol allows you to view and interact with the
+ computer's display from anywhere on the network. See the
+ \l{The VNC Protocol and Qt for Embedded Linux}{VNC protocol}
+ documentation for more details.
+
+ The default implementation of QVNCScreen inherits QLinuxFbScreen,
+ but any QScreen subclass, or QScreen itself, can serve as its base
+ class. This is easily achieved by manipulating the \c
+ VNCSCREEN_BASE definition in the header file.
+
+ \sa QScreen, {Running Applications}
+*/
+
+/*!
+ \fn QVNCScreen::QVNCScreen(int displayId)
+
+ Constructs a QVNCScreen object. The \a displayId argument
+ identifies the Qt for Embedded Linux server to connect to.
+*/
+QVNCScreen::QVNCScreen(int display_id)
+ : QProxyScreen(display_id, VNCClass)
+{
+ d_ptr = new QVNCScreenPrivate(this);
+}
+
+/*!
+ Destroys this QVNCScreen object.
+*/
+QVNCScreen::~QVNCScreen()
+{
+ delete d_ptr;
+}
+
+/*!
+ \reimp
+*/
+void QVNCScreen::setDirty(const QRect &rect)
+{
+ d_ptr->setDirty(rect);
+}
+
+void QVNCScreenPrivate::setDirty(const QRect& rect, bool force)
+{
+ if (rect.isEmpty())
+ return;
+
+ if (q_ptr->screen())
+ q_ptr->screen()->setDirty(rect);
+
+ if (!vncServer || !vncServer->isConnected())
+ return;
+
+ const QRect r = rect.translated(-q_ptr->offset());
+ const int x1 = r.x() / MAP_TILE_SIZE;
+ int y = r.y() / MAP_TILE_SIZE;
+ for (; (y <= r.bottom() / MAP_TILE_SIZE) && y < dirty->mapHeight; y++)
+ for (int x = x1; (x <= r.right() / MAP_TILE_SIZE) && x < dirty->mapWidth; x++)
+ dirty->setDirty(x, y, force);
+
+ vncServer->setDirty();
+}
+
+static int getDisplayId(const QString &spec)
+{
+ QRegExp regexp(QLatin1String(":(\\d+)\\b"));
+ if (regexp.lastIndexIn(spec) != -1) {
+ const QString capture = regexp.cap(1);
+ return capture.toInt();
+ }
+ return 0;
+}
+
+/*!
+ \reimp
+*/
+bool QVNCScreen::connect(const QString &displaySpec)
+{
+ QString dspec = displaySpec;
+ if (dspec.startsWith(QLatin1String("vnc:"), Qt::CaseInsensitive))
+ dspec = dspec.mid(QString::fromLatin1("vnc:").size());
+ else if (dspec.compare(QLatin1String("vnc"), Qt::CaseInsensitive) == 0)
+ dspec = QString();
+
+ const QString displayIdSpec = QString::fromLatin1(" :%1").arg(displayId);
+ if (dspec.endsWith(displayIdSpec))
+ dspec = dspec.left(dspec.size() - displayIdSpec.size());
+
+ QStringList args = dspec.split(QLatin1Char(':'),
+ QString::SkipEmptyParts);
+ QRegExp refreshRegexp(QLatin1String("^refreshrate=(\\d+)$"));
+ int index = args.indexOf(refreshRegexp);
+ if (index >= 0) {
+ d_ptr->refreshRate = refreshRegexp.cap(1).toInt();
+ args.removeAt(index);
+ dspec = args.join(QLatin1String(":"));
+ }
+
+ QString driver = dspec;
+ int colon = driver.indexOf(QLatin1Char(':'));
+ if (colon >= 0)
+ driver.truncate(colon);
+
+ if (QScreenDriverFactory::keys().contains(driver, Qt::CaseInsensitive)) {
+ const int id = getDisplayId(dspec);
+ QScreen *s = qt_get_screen(id, dspec.toLatin1().constData());
+ if (s->pixelFormat() == QImage::Format_Indexed8
+ || s->pixelFormat() == QImage::Format_Invalid && s->depth() == 8)
+ qFatal("QVNCScreen: unsupported screen format");
+ setScreen(s);
+ } else { // create virtual screen
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ QScreen::setFrameBufferLittleEndian(false);
+#endif
+
+ d = qgetenv("QWS_DEPTH").toInt();
+ if (!d)
+ d = 16;
+
+ QByteArray str = qgetenv("QWS_SIZE");
+ if(!str.isEmpty()) {
+ sscanf(str.constData(), "%dx%d", &w, &h);
+ dw = w;
+ dh = h;
+ } else {
+ dw = w = 640;
+ dh = h = 480;
+ }
+
+ const QStringList args = displaySpec.split(QLatin1Char(':'),
+ QString::SkipEmptyParts);
+
+ if (args.contains(QLatin1String("paintonscreen"), Qt::CaseInsensitive))
+ d_ptr->doOnScreenSurface = true;
+
+ QRegExp depthRegexp(QLatin1String("^depth=(\\d+)$"));
+ if (args.indexOf(depthRegexp) != -1)
+ d = depthRegexp.cap(1).toInt();
+
+ QRegExp sizeRegexp(QLatin1String("^size=(\\d+)x(\\d+)$"));
+ if (args.indexOf(sizeRegexp) != -1) {
+ dw = w = sizeRegexp.cap(1).toInt();
+ dh = h = sizeRegexp.cap(2).toInt();
+ }
+
+ // Handle display physical size spec.
+ QRegExp mmWidthRegexp(QLatin1String("^mmWidth=?(\\d+)$"));
+ if (args.indexOf(mmWidthRegexp) != -1) {
+ const int mmWidth = mmWidthRegexp.cap(1).toInt();
+ if (mmWidth > 0)
+ d_ptr->dpiX = dw * 25.4 / mmWidth;
+ }
+ QRegExp mmHeightRegexp(QLatin1String("^mmHeight=?(\\d+)$"));
+ if (args.indexOf(mmHeightRegexp) != -1) {
+ const int mmHeight = mmHeightRegexp.cap(1).toInt();
+ if (mmHeight > 0)
+ d_ptr->dpiY = dh * 25.4 / mmHeight;
+ }
+ QRegExp dpiRegexp(QLatin1String("^dpi=(\\d+)(?:,(\\d+))?$"));
+ if (args.indexOf(dpiRegexp) != -1) {
+ const qreal dpiX = dpiRegexp.cap(1).toFloat();
+ const qreal dpiY = dpiRegexp.cap(2).toFloat();
+ if (dpiX > 0)
+ d_ptr->dpiX = dpiX;
+ d_ptr->dpiY = (dpiY > 0 ? dpiY : dpiX);
+ }
+
+ if (args.contains(QLatin1String("noDisablePainting")))
+ d_ptr->noDisablePainting = true;
+
+ QWSServer::setDefaultMouse("None");
+ QWSServer::setDefaultKeyboard("None");
+
+ d_ptr->configure();
+ }
+
+ // XXX
+ qt_screen = this;
+
+ return true;
+}
+
+/*!
+ \reimp
+*/
+void QVNCScreen::disconnect()
+{
+ QProxyScreen::disconnect();
+#if !defined(QT_NO_QWS_MULTIPROCESS) && !defined(QT_NO_SHAREDMEMORY)
+ d_ptr->shm.detach();
+#endif
+}
+
+/*!
+ \reimp
+*/
+bool QVNCScreen::initDevice()
+{
+ if (!QProxyScreen::screen() && d == 4) {
+ screencols = 16;
+ int val = 0;
+ for (int idx = 0; idx < 16; idx++, val += 17) {
+ screenclut[idx] = qRgb(val, val, val);
+ }
+ }
+ d_ptr->vncServer = new QVNCServer(this, displayId);
+ d_ptr->vncServer->setRefreshRate(d_ptr->refreshRate);
+
+ switch (depth()) {
+#ifdef QT_QWS_DEPTH_32
+ case 32:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<quint32>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_24
+ case 24:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<qrgb888>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_18
+ case 18:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<qrgb666>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_16
+ case 16:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<quint16>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_15
+ case 15:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<qrgb555>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_12
+ case 12:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<qrgb444>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_8
+ case 8:
+ d_ptr->dirty = new QVNCDirtyMapOptimized<quint8>(this);
+ break;
+#endif
+ default:
+ qWarning("QVNCScreen::initDevice: No support for screen depth %d",
+ depth());
+ d_ptr->dirty = 0;
+ return false;
+ }
+
+
+ const bool ok = QProxyScreen::initDevice();
+#ifndef QT_NO_QWS_CURSOR
+ qt_screencursor = new QVNCCursor(this);
+#endif
+ if (QProxyScreen::screen())
+ return ok;
+
+ // Disable painting if there is only 1 display and nothing is attached to the VNC server
+ if (!d_ptr->noDisablePainting)
+ QWSServer::instance()->enablePainting(false);
+
+ return true;
+}
+
+/*!
+ \reimp
+*/
+void QVNCScreen::shutdownDevice()
+{
+ QProxyScreen::shutdownDevice();
+ delete d_ptr->vncServer;
+ delete d_ptr->dirty;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QWS_VNC
diff --git a/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.h b/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.h
new file mode 100644
index 0000000000..646109f5ef
--- /dev/null
+++ b/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCREENVNC_QWS_H
+#define QSCREENVNC_QWS_H
+
+#include <QtGui/qscreenproxy_qws.h>
+
+#ifndef QT_NO_QWS_VNC
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Gui)
+
+class QVNCScreenPrivate;
+
+class QVNCScreen : public QProxyScreen
+{
+public:
+ explicit QVNCScreen(int display_id);
+ virtual ~QVNCScreen();
+
+ bool initDevice();
+ bool connect(const QString &displaySpec);
+ void disconnect();
+ void shutdownDevice();
+
+ void setDirty(const QRect&);
+
+private:
+ friend class QVNCCursor;
+ friend class QVNCClientCursor;
+ friend class QVNCServer;
+ friend class QVNCScreenPrivate;
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ bool swapBytes() const;
+#endif
+
+ QVNCScreenPrivate *d_ptr;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_QWS_VNC
+#endif // QSCREENVNC_QWS_H
diff --git a/src/plugins/gfxdrivers/vnc/vnc.pro b/src/plugins/gfxdrivers/vnc/vnc.pro
new file mode 100644
index 0000000000..31da2f404e
--- /dev/null
+++ b/src/plugins/gfxdrivers/vnc/vnc.pro
@@ -0,0 +1,16 @@
+TARGET = qgfxvnc
+include(../../qpluginbase.pri)
+
+DEFINES += QT_QWS_VNC
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/gfxdrivers
+
+HEADERS = \
+ qscreenvnc_qws.h \
+ qscreenvnc_p.h
+
+SOURCES = main.cpp \
+ qscreenvnc_qws.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/gfxdrivers
+INSTALLS += target
diff --git a/src/plugins/graphicssystems/graphicssystems.pro b/src/plugins/graphicssystems/graphicssystems.pro
new file mode 100644
index 0000000000..5c99291047
--- /dev/null
+++ b/src/plugins/graphicssystems/graphicssystems.pro
@@ -0,0 +1,15 @@
+TEMPLATE = subdirs
+SUBDIRS += trace
+!wince*:contains(QT_CONFIG, opengl):SUBDIRS += opengl
+contains(QT_CONFIG, openvg):contains(QT_CONFIG, egl) {
+ SUBDIRS += openvg
+}
+
+contains(QT_CONFIG, shivavg) {
+ # Only works under X11 at present
+ !win32:!embedded:!mac:SUBDIRS += shivavg
+}
+
+!win32:!embedded:!mac:!symbian:CONFIG += x11
+
+x11:contains(QT_CONFIG, opengles2):contains(QT_CONFIG, egl):SUBDIRS += meego
diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
new file mode 100644
index 0000000000..2561c22ff6
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -0,0 +1,266 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// Implements two dithering methods:
+//
+// * convertRGBA32_to_RGB565
+//
+// This is implemented using Ordered Bayer Dithering. The code has been adapted
+// from QX11PixmapData::fromImage. This method was originally implemented using
+// Floyd-Steinberg dithering but was later changed to Ordered Dithering because
+// of the better quality of the results.
+//
+// * convertRGBA32_to_RGBA4444
+//
+// This is implemented using Floyd-Steinberg dithering.
+//
+// The alghorithm used here is not the fastest possible but it's prolly fast enough:
+// uses look-up tables, integer-only arthmetics and works in one pass on two lines
+// at a time. It's a high-quality dithering using 1/8 diffusion precission.
+// Each channel (RGBA) is diffused independently and alpha is dithered too.
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <QVarLengthArray>
+
+// Gets a component (red = 1, green = 2...) from a RGBA data structure.
+// data is unsigned char. stride is the number of bytes per line.
+#define GET_RGBA_COMPONENT(data, x, y, stride, c) (data[(y * stride) + (x << 2) + c])
+
+// Writes a new pixel with r, g, b to data in 565 16bit format. Data is a short.
+#define PUT_565(data, x, y, width, r, g, b) (data[(y * width) + x] = (r << 11) | (g << 5) | b)
+
+// Writes a new pixel with r, g, b, a to data in 4444 RGBA 16bit format. Data is a short.
+#define PUT_4444(data, x, y, width, r, g, b, a) (data[(y * width) + x] = (r << 12) | (g << 8) | (b << 4) | a)
+
+// Writes(ads) a new value to the diffusion accumulator. accumulator is a short.
+// x, y is a position in the accumulation buffer. y can be 0 or 1 -- we operate on two lines at time.
+#define ACCUMULATE(accumulator, x, y, width, v) if (x < width && x >= 0) accumulator[(y * width) + x] += v
+
+// Clamps a value to be in 0..255 range.
+#define CLAMP_256(v) if (v > 255) v = 255; if (v < 0) v = 0;
+
+// Converts incoming RGB32 (QImage::Format_RGB32) to RGB565. Returns the newly allocated data.
+unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int height, int stride)
+{
+ static bool thresholdMapInitialized = false;
+ static int thresholdMap[16][16];
+
+ if (!thresholdMapInitialized) {
+ int i;
+ int j;
+ int n;
+
+ thresholdMap[0][0] = 0;
+ thresholdMap[1][0] = 2;
+ thresholdMap[0][1] = 3;
+ thresholdMap[1][1] = 1;
+
+ for (n=2; n<16; n*=2) {
+ for (i=0; i<n; i++) {
+ for (j=0; j<n; j++) {
+ thresholdMap[i][j] *= 4;
+ thresholdMap[i+n][j] = thresholdMap[i][j] + 2;
+ thresholdMap[i][j+n] = thresholdMap[i][j] + 3;
+ thresholdMap[i+n][j+n] = thresholdMap[i][j] + 1;
+ }
+ }
+ }
+
+ thresholdMapInitialized = true;
+ }
+
+ // Output line stride. Aligned to 4 bytes.
+ int alignedWidth = width;
+ if (alignedWidth % 2 > 0)
+ alignedWidth++;
+
+ // Will store output
+ unsigned short *out = (unsigned short *)malloc (alignedWidth * height * 2);
+
+ int x;
+ int y;
+ int threshold;
+
+ // For each line...
+ for (y = 0; y < height; y++) {
+
+ // For each column....
+ for (x = 0; x < width; x++) {
+
+ int r = GET_RGBA_COMPONENT(in, x, y, stride, 0);
+ int g = GET_RGBA_COMPONENT(in, x, y, stride, 1);
+ int b = GET_RGBA_COMPONENT(in, x, y, stride, 2);
+
+ threshold = thresholdMap[x%16][y%16];
+
+ if (r <= (255-(1<<3)) && ((r<<5) & 255) > threshold) r += (1<<3);
+ if (g <= (255-(1<<2)) && ((g<<6) & 255) > threshold) g += (1<<2);
+ if (b <= (255-(1<<3)) && ((b<<5) & 255) > threshold) b += (1<<3);
+
+ // Write the newly produced pixel
+ PUT_565(out, x, y, alignedWidth, ((b >> 3) & 0x1f), ((g >> 2) & 0x3f), ((r >> 3) & 0x1f));
+ }
+ }
+
+ return out;
+}
+
+// Converts incoming RGBA32 (QImage::Format_ARGB32_Premultiplied) to RGB565. Returns the newly allocated data.
+// This function is similar (yet different) to the _565 variant but it makes sense to duplicate it here for simplicity.
+// The output has each scan line aligned to 4 bytes (as expected by GL by default).
+unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, int height, int stride)
+{
+ // Output line stride. Aligned to 4 bytes.
+ int alignedWidth = width;
+ if (alignedWidth % 2 > 0)
+ alignedWidth++;
+
+ // Will store output
+ unsigned short *out = (unsigned short *) malloc(alignedWidth * 2 * height);
+
+ // Lookup tables for the 8bit => 4bit conversion
+ unsigned char lookup_8bit_to_4bit[256];
+ short lookup_8bit_to_4bit_diff[256];
+
+ // Macros for the conversion using the lookup table.
+ #define CONVERT_8BIT_TO_4BIT(v) (lookup_8bit_to_4bit[v])
+ #define DIFF_8BIT_TO_4BIT(v) (lookup_8bit_to_4bit_diff[v])
+
+ int i;
+ int x, y, c; // Pixel we're processing. c is component number (0, 1, 2, 3 for r, b, b, a)
+ short component[4]; // Stores the new components (r, g, b, a) for pixel produced during conversion
+ short diff; // The difference between the converted value and the original one. To be accumulated.
+ QVarLengthArray <short> accumulatorData(4 * width * 2); // Data for three acumulators for r, g, b. Each accumulator is two lines.
+ short *accumulator[4]; // Helper for accessing the accumulator on a per-channel basis more easily.
+ accumulator[0] = accumulatorData.data();
+ accumulator[1] = accumulatorData.data() + width;
+ accumulator[2] = accumulatorData.data() + (width * 2);
+ accumulator[3] = accumulatorData.data() + (width * 3);
+
+ // Produce the conversion lookup tables.
+ for (i = 0; i < 256; i++) {
+ lookup_8bit_to_4bit[i] = round(i / 16.0);
+ // Before bitshifts: (i * 8) - (... * 16 * 8)
+ lookup_8bit_to_4bit_diff[i] = (i << 3) - (lookup_8bit_to_4bit[i] << 7);
+
+ if (lookup_8bit_to_4bit[i] > 15)
+ lookup_8bit_to_4bit[i] = 15;
+ }
+
+ // Clear the accumulators
+ memset(accumulator[0], 0, width * 4);
+ memset(accumulator[1], 0, width * 4);
+ memset(accumulator[2], 0, width * 4);
+ memset(accumulator[3], 0, width * 4);
+
+ // For each line...
+ for (y = 0; y < height; y++) {
+
+ // For each component (r, g, b, a)...
+ memcpy(accumulator[0], accumulator[0] + width, width * 2);
+ memset(accumulator[0] + width, 0, width * 2);
+
+ memcpy(accumulator[1], accumulator[1] + width, width * 2);
+ memset(accumulator[1] + width, 0, width * 2);
+
+ memcpy(accumulator[2], accumulator[2] + width, width * 2);
+ memset(accumulator[2] + width, 0, width * 2);
+
+ memcpy(accumulator[3], accumulator[3] + width, width * 2);
+ memset(accumulator[3] + width, 0, width * 2);
+
+ // For each column....
+ for (x = 0; x < width; x++) {
+
+ // For each component (r, g, b, a)...
+ for (c = 0; c < 4; c++) {
+
+ // Get the 8bit value from the original image
+ component[c] = GET_RGBA_COMPONENT(in, x, y, stride, c);
+
+ // Add the diffusion for this pixel we stored in the accumulator.
+ // >> 7 because the values in accumulator are stored * 128
+ component[c] += accumulator[c][x] >> 7;
+
+ // Make sure we're not over the boundaries.
+ CLAMP_256(component[c]);
+
+ // Store the difference from converting 8bit => 4bit and the orig pixel.
+ // Convert 8bit => 4bit.
+ diff = DIFF_8BIT_TO_4BIT(component[c]);
+ component[c] = CONVERT_8BIT_TO_4BIT(component[c]);
+
+ // Distribute the difference according to the matrix in the
+ // accumulation bufffer.
+ ACCUMULATE(accumulator[c], x + 1, 0, width, diff * 7);
+ ACCUMULATE(accumulator[c], x - 1, 1, width, diff * 3);
+ ACCUMULATE(accumulator[c], x, 1, width, diff * 5);
+ ACCUMULATE(accumulator[c], x + 1, 1, width, diff * 1);
+ }
+
+ // Write the newly produced pixel
+ PUT_4444(out, x, y, alignedWidth, component[0], component[1], component[2], component[3]);
+ }
+ }
+
+ return out;
+}
+
+unsigned char* convertBGRA32_to_RGBA32(const unsigned char *in, int width, int height, int stride)
+{
+ unsigned char *out = (unsigned char *) malloc(stride * height);
+
+ // For each line...
+ for (int y = 0; y < height; y++) {
+ // For each column
+ for (int x = 0; x < width; x++) {
+ out[(stride * y) + (x * 4) + 0] = in[(stride * y) + (x * 4) + 2];
+ out[(stride * y) + (x * 4) + 1] = in[(stride * y) + (x * 4) + 1];
+ out[(stride * y) + (x * 4) + 2] = in[(stride * y) + (x * 4) + 0];
+ out[(stride * y) + (x * 4) + 3] = in[(stride * y) + (x * 4) + 3];
+ }
+ }
+
+ return out;
+}
diff --git a/src/plugins/graphicssystems/meego/meego.pro b/src/plugins/graphicssystems/meego/meego.pro
new file mode 100644
index 0000000000..0d3cce622f
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/meego.pro
@@ -0,0 +1,13 @@
+TARGET = qmeegographicssystem
+include(../../qpluginbase.pri)
+
+QT += gui opengl
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+
+HEADERS = qmeegographicssystem.h qmeegopixmapdata.h qmeegoextensions.h qmeegorasterpixmapdata.h qmeegolivepixmapdata.h
+SOURCES = qmeegographicssystem.cpp qmeegographicssystem.h qmeegographicssystemplugin.h qmeegographicssystemplugin.cpp qmeegopixmapdata.h qmeegopixmapdata.cpp qmeegoextensions.h qmeegoextensions.cpp qmeegorasterpixmapdata.h qmeegorasterpixmapdata.cpp qmeegolivepixmapdata.cpp qmeegolivepixmapdata.h dithering.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
+
diff --git a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
new file mode 100644
index 0000000000..fb82747062
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
@@ -0,0 +1,213 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmeegoextensions.h"
+#include <private/qeglcontext_p.h>
+#include <private/qpixmapdata_gl_p.h>
+
+bool QMeeGoExtensions::initialized = false;
+bool QMeeGoExtensions::hasImageShared = false;
+bool QMeeGoExtensions::hasSurfaceScaling = false;
+bool QMeeGoExtensions::hasLockSurface = false;
+bool QMeeGoExtensions::hasFenceSync = false;
+
+/* Extension funcs */
+
+typedef EGLBoolean (EGLAPIENTRY *eglQueryImageNOKFunc)(EGLDisplay, EGLImageKHR, EGLint, EGLint*);
+typedef EGLNativeSharedImageTypeNOK (EGLAPIENTRY *eglCreateSharedImageNOKFunc)(EGLDisplay, EGLImageKHR, EGLint*);
+typedef EGLBoolean (EGLAPIENTRY *eglDestroySharedImageNOKFunc)(EGLDisplay, EGLNativeSharedImageTypeNOK);
+typedef EGLBoolean (EGLAPIENTRY *eglSetSurfaceScalingNOKFunc)(EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint);
+typedef EGLBoolean (EGLAPIENTRY *eglLockSurfaceKHRFunc)(EGLDisplay, EGLSurface, const EGLint*);
+typedef EGLBoolean (EGLAPIENTRY *eglUnlockSurfaceKHRFunc)(EGLDisplay, EGLSurface);
+typedef EGLSyncKHR (EGLAPIENTRY *eglCreateSyncKHRFunc)(EGLDisplay, EGLenum, const EGLint*);
+typedef EGLBoolean (EGLAPIENTRY *eglDestroySyncKHRFunc)(EGLDisplay, EGLSyncKHR);
+typedef EGLint (EGLAPIENTRY *eglClientWaitSyncKHRFunc)(EGLDisplay, EGLSyncKHR, EGLint, EGLTimeKHR);
+typedef EGLBoolean (EGLAPIENTRY *eglGetSyncAttribKHRFunc)(EGLDisplay, EGLSyncKHR, EGLint, EGLint*);
+
+static eglQueryImageNOKFunc _eglQueryImageNOK = 0;
+static eglCreateSharedImageNOKFunc _eglCreateSharedImageNOK = 0;
+static eglDestroySharedImageNOKFunc _eglDestroySharedImageNOK = 0;
+static eglSetSurfaceScalingNOKFunc _eglSetSurfaceScalingNOK = 0;
+static eglLockSurfaceKHRFunc _eglLockSurfaceKHR = 0;
+static eglUnlockSurfaceKHRFunc _eglUnlockSurfaceKHR = 0;
+static eglCreateSyncKHRFunc _eglCreateSyncKHR = 0;
+static eglDestroySyncKHRFunc _eglDestroySyncKHR = 0;
+static eglClientWaitSyncKHRFunc _eglClientWaitSyncKHR = 0;
+static eglGetSyncAttribKHRFunc _eglGetSyncAttribKHR = 0;
+
+/* Public */
+
+void QMeeGoExtensions::ensureInitialized()
+{
+ if (!initialized)
+ initialize();
+
+ initialized = true;
+}
+
+EGLNativeSharedImageTypeNOK QMeeGoExtensions::eglCreateSharedImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLint *props)
+{
+ if (!hasImageShared)
+ qFatal("EGL_NOK_image_shared not found but trying to use capability!");
+
+ return _eglCreateSharedImageNOK(dpy, image, props);
+}
+
+bool QMeeGoExtensions::eglQueryImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLint prop, EGLint *v)
+{
+ if (!hasImageShared)
+ qFatal("EGL_NOK_image_shared not found but trying to use capability!");
+
+ return _eglQueryImageNOK(dpy, image, prop, v);
+}
+
+bool QMeeGoExtensions::eglDestroySharedImageNOK(EGLDisplay dpy, EGLNativeSharedImageTypeNOK img)
+{
+ if (!hasImageShared)
+ qFatal("EGL_NOK_image_shared not found but trying to use capability!");
+
+ return _eglDestroySharedImageNOK(dpy, img);
+}
+
+bool QMeeGoExtensions::eglSetSurfaceScalingNOK(EGLDisplay dpy, EGLSurface surface, int x, int y, int width, int height)
+{
+ if (!hasSurfaceScaling)
+ qFatal("EGL_NOK_surface_scaling not found but trying to use capability!");
+
+ return _eglSetSurfaceScalingNOK(dpy, surface, x, y, width, height);
+}
+
+bool QMeeGoExtensions::eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list)
+{
+ if (!hasLockSurface)
+ qFatal("EGL_KHR_lock_surface2 not found but trying to use capability!");
+
+ return _eglLockSurfaceKHR(display, surface, attrib_list);
+}
+
+bool QMeeGoExtensions::eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface)
+{
+ if (!hasLockSurface)
+ qFatal("EGL_KHR_lock_surface2 not found but trying to use capability!");
+
+ return _eglUnlockSurfaceKHR(display, surface);
+}
+
+EGLSyncKHR QMeeGoExtensions::eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+{
+ if (!hasFenceSync)
+ qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+ return _eglCreateSyncKHR(dpy, type, attrib_list);
+}
+
+bool QMeeGoExtensions::eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
+{
+ if (!hasFenceSync)
+ qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+ return _eglDestroySyncKHR(dpy, sync);
+}
+
+EGLint QMeeGoExtensions::eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
+{
+ if (!hasFenceSync)
+ qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+ return _eglClientWaitSyncKHR(dpy, sync, flags, timeout);
+}
+
+EGLBoolean QMeeGoExtensions::eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
+{
+ if (!hasFenceSync)
+ qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+ return _eglGetSyncAttribKHR(dpy, sync, attribute, value);
+}
+
+/* Private */
+
+void QMeeGoExtensions::initialize()
+{
+ QGLContext *ctx = (QGLContext *) QGLContext::currentContext();
+ qt_resolve_eglimage_gl_extensions(ctx);
+
+ if (QEgl::hasExtension("EGL_NOK_image_shared")) {
+ qDebug("MeegoGraphics: found EGL_NOK_image_shared");
+ _eglQueryImageNOK = (eglQueryImageNOKFunc) eglGetProcAddress("eglQueryImageNOK");
+ _eglCreateSharedImageNOK = (eglCreateSharedImageNOKFunc) eglGetProcAddress("eglCreateSharedImageNOK");
+ _eglDestroySharedImageNOK = (eglDestroySharedImageNOKFunc) eglGetProcAddress("eglDestroySharedImageNOK");
+ _eglLockSurfaceKHR = (eglLockSurfaceKHRFunc) eglGetProcAddress("eglLockSurfaceKHR");
+ _eglUnlockSurfaceKHR = (eglUnlockSurfaceKHRFunc) eglGetProcAddress("eglUnlockSurfaceKHR");
+
+ Q_ASSERT(_eglQueryImageNOK && _eglCreateSharedImageNOK && _eglDestroySharedImageNOK);
+ hasImageShared = true;
+ }
+
+ if (QEgl::hasExtension("EGL_NOK_surface_scaling")) {
+ qDebug("MeegoGraphics: found EGL_NOK_surface_scaling");
+ _eglSetSurfaceScalingNOK = (eglSetSurfaceScalingNOKFunc) eglGetProcAddress("eglSetSurfaceScalingNOK");
+
+ Q_ASSERT(_eglSetSurfaceScalingNOK);
+ hasSurfaceScaling = true;
+ }
+
+ if (QEgl::hasExtension("EGL_KHR_lock_surface2")) {
+ qDebug("MeegoGraphics: found EGL_KHR_lock_surface2");
+ _eglLockSurfaceKHR = (eglLockSurfaceKHRFunc) eglGetProcAddress("eglLockSurfaceKHR");
+ _eglUnlockSurfaceKHR = (eglUnlockSurfaceKHRFunc) eglGetProcAddress("eglUnlockSurfaceKHR");
+
+ Q_ASSERT(_eglLockSurfaceKHR && _eglUnlockSurfaceKHR);
+ hasLockSurface = true;
+ }
+
+ if (QEgl::hasExtension("EGL_KHR_fence_sync")) {
+ qDebug("MeegoGraphics: found EGL_KHR_fence_sync");
+ _eglCreateSyncKHR = (eglCreateSyncKHRFunc) eglGetProcAddress("eglCreateSyncKHR");
+ _eglDestroySyncKHR = (eglDestroySyncKHRFunc) eglGetProcAddress("eglDestroySyncKHR");
+ _eglClientWaitSyncKHR = (eglClientWaitSyncKHRFunc) eglGetProcAddress("eglClientWaitSyncKHR");
+ _eglGetSyncAttribKHR = (eglGetSyncAttribKHRFunc) eglGetProcAddress("eglGetSyncAttribKHR");
+
+ Q_ASSERT(_eglCreateSyncKHR && _eglDestroySyncKHR && _eglClientWaitSyncKHR && _eglGetSyncAttribKHR);
+ hasFenceSync = true;
+ }
+}
+
diff --git a/src/plugins/graphicssystems/meego/qmeegoextensions.h b/src/plugins/graphicssystems/meego/qmeegoextensions.h
new file mode 100644
index 0000000000..76d3fec4cf
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegoextensions.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MEXTENSIONS_H
+#define MEXTENSIONS_H
+
+#include <private/qgl_p.h>
+#include <private/qeglcontext_p.h>
+#include <private/qpixmapdata_gl_p.h>
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+/* Extensions decls */
+
+#ifndef EGL_SHARED_IMAGE_NOK
+#define EGL_SHARED_IMAGE_NOK 0x30DA
+typedef void* EGLNativeSharedImageTypeNOK;
+#endif
+
+#ifndef EGL_GL_TEXTURE_2D_KHR
+#define EGL_GL_TEXTURE_2D_KHR 0x30B1
+#endif
+
+#ifndef EGL_FIXED_WIDTH_NOK
+#define EGL_FIXED_WIDTH_NOK 0x30DB
+#define EGL_FIXED_HEIGHT_NOK 0x30DC
+#endif
+
+#ifndef EGL_BITMAP_POINTER_KHR
+#define EGL_BITMAP_POINTER_KHR 0x30C6
+#define EGL_BITMAP_PITCH_KHR 0x30C7
+#endif
+
+#ifndef EGL_MAP_PRESERVE_PIXELS_KHR
+#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4
+#define EGL_LOCK_USAGE_HINT_KHR 0x30C5
+#define EGL_READ_SURFACE_BIT_KHR 0x0001
+#define EGL_WRITE_SURFACE_BIT_KHR 0x0002
+#endif
+
+#ifndef EGL_SYNC_FENCE_KHR
+#define EGL_SYNC_FENCE_KHR 0x30F9
+#define EGL_SYNC_TYPE_KHR 0x30F7
+#define EGL_SYNC_STATUS_KHR 0x30F1
+#define EGL_SYNC_CONDITION_KHR 0x30F8
+#define EGL_SIGNALED_KHR 0x30F2
+#define EGL_UNSIGNALED_KHR 0x30F3
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001
+#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull
+#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5
+#define EGL_CONDITION_SATISFIED_KHR 0x30F6
+#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0)
+typedef void* EGLSyncKHR;
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+#endif
+
+/* Class */
+
+class QMeeGoExtensions
+{
+public:
+ static void ensureInitialized();
+
+ static EGLNativeSharedImageTypeNOK eglCreateSharedImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLint *props);
+ static bool eglQueryImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLint prop, EGLint *v);
+ static bool eglDestroySharedImageNOK(EGLDisplay dpy, EGLNativeSharedImageTypeNOK img);
+ static bool eglSetSurfaceScalingNOK(EGLDisplay dpy, EGLSurface surface, int x, int y, int width, int height);
+ static bool eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
+ static bool eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface);
+ static EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+ static bool eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
+ static EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+ static EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+
+private:
+ static void initialize();
+
+ static bool initialized;
+ static bool hasImageShared;
+ static bool hasSurfaceScaling;
+ static bool hasLockSurface;
+ static bool hasFenceSync;
+};
+
+#endif
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
new file mode 100644
index 0000000000..fdb72de648
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -0,0 +1,534 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <private/qpixmap_raster_p.h>
+#include <private/qwindowsurface_gl_p.h>
+#include <private/qwindowsurface_raster_p.h>
+#include <private/qegl_p.h>
+#include <private/qglextensions_p.h>
+#include <private/qgl_p.h>
+#include <private/qimagepixmapcleanuphooks_p.h>
+#include <private/qapplication_p.h>
+#include <private/qgraphicssystem_runtime_p.h>
+#include <private/qimage_p.h>
+#include <private/qeglproperties_p.h>
+#include <private/qeglcontext_p.h>
+#include <private/qpixmap_x11_p.h>
+
+#include "qmeegopixmapdata.h"
+#include "qmeegolivepixmapdata.h"
+#include "qmeegographicssystem.h"
+#include "qmeegoextensions.h"
+
+#include <QTimer>
+
+bool QMeeGoGraphicsSystem::surfaceWasCreated = false;
+
+QHash <Qt::HANDLE, QPixmap*> QMeeGoGraphicsSystem::liveTexturePixmaps;
+
+QList<QMeeGoSwitchCallback> QMeeGoGraphicsSystem::switchCallbacks;
+
+QMeeGoGraphicsSystem::SwitchPolicy QMeeGoGraphicsSystem::switchPolicy = QMeeGoGraphicsSystem::AutomaticSwitch;
+
+QMeeGoGraphicsSystem::QMeeGoGraphicsSystem()
+{
+ qDebug("Using the meego graphics system");
+}
+
+QMeeGoGraphicsSystem::~QMeeGoGraphicsSystem()
+{
+ qDebug("Meego graphics system destroyed");
+ qt_destroy_gl_share_widget();
+}
+
+class QMeeGoGraphicsSystemSwitchHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QMeeGoGraphicsSystemSwitchHandler();
+
+ void addWidget(QWidget *widget);
+ bool eventFilter(QObject *, QEvent *);
+
+ void handleMapNotify();
+
+private slots:
+ void removeWidget(QObject *object);
+ void switchToRaster();
+ void switchToMeeGo();
+
+private:
+ int visibleWidgets() const;
+
+private:
+ QList<QWidget *> m_widgets;
+};
+
+typedef bool(*QX11FilterFunction)(XEvent *event);
+Q_GUI_EXPORT void qt_installX11EventFilter(QX11FilterFunction func);
+
+static bool x11EventFilter(XEvent *event);
+
+QMeeGoGraphicsSystemSwitchHandler::QMeeGoGraphicsSystemSwitchHandler()
+{
+ qt_installX11EventFilter(x11EventFilter);
+}
+
+void QMeeGoGraphicsSystemSwitchHandler::addWidget(QWidget *widget)
+{
+ if (widget != qt_gl_share_widget() && !m_widgets.contains(widget)) {
+ widget->installEventFilter(this);
+ connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(removeWidget(QObject *)));
+ m_widgets << widget;
+ }
+}
+
+void QMeeGoGraphicsSystemSwitchHandler::handleMapNotify()
+{
+ if (m_widgets.isEmpty() && QMeeGoGraphicsSystem::switchPolicy == QMeeGoGraphicsSystem::AutomaticSwitch)
+ QTimer::singleShot(0, this, SLOT(switchToMeeGo()));
+}
+
+void QMeeGoGraphicsSystemSwitchHandler::removeWidget(QObject *object)
+{
+ m_widgets.removeOne(static_cast<QWidget *>(object));
+ if (m_widgets.isEmpty() && QMeeGoGraphicsSystem::switchPolicy == QMeeGoGraphicsSystem::AutomaticSwitch)
+ QTimer::singleShot(0, this, SLOT(switchToRaster()));
+}
+
+void QMeeGoGraphicsSystemSwitchHandler::switchToRaster()
+{
+ QMeeGoGraphicsSystem::switchToRaster();
+}
+
+void QMeeGoGraphicsSystemSwitchHandler::switchToMeeGo()
+{
+ QMeeGoGraphicsSystem::switchToMeeGo();
+}
+
+int QMeeGoGraphicsSystemSwitchHandler::visibleWidgets() const
+{
+ int count = 0;
+ for (int i = 0; i < m_widgets.size(); ++i)
+ count += m_widgets.at(i)->isVisible() && !(m_widgets.at(i)->windowState() & Qt::WindowMinimized);
+ return count;
+}
+
+bool QMeeGoGraphicsSystemSwitchHandler::eventFilter(QObject *object, QEvent *event)
+{
+ if (event->type() == QEvent::WindowStateChange
+ && QMeeGoGraphicsSystem::switchPolicy == QMeeGoGraphicsSystem::AutomaticSwitch)
+ {
+ QWindowStateChangeEvent *change = static_cast<QWindowStateChangeEvent *>(event);
+ QWidget *widget = static_cast<QWidget *>(object);
+
+ Qt::WindowStates current = widget->windowState();
+ Qt::WindowStates old = change->oldState();
+
+ // did minimized flag change?
+ if ((current ^ old) & Qt::WindowMinimized) {
+ if (current & Qt::WindowMinimized) {
+ if (visibleWidgets() == 0)
+ QMeeGoGraphicsSystem::switchToRaster();
+ } else {
+ if (visibleWidgets() > 0)
+ QMeeGoGraphicsSystem::switchToMeeGo();
+ }
+ }
+ }
+
+ // resume processing of event
+ return false;
+}
+
+Q_GLOBAL_STATIC(QMeeGoGraphicsSystemSwitchHandler, switch_handler)
+
+bool x11EventFilter(XEvent *event)
+{
+ if (event->type == MapNotify)
+ switch_handler()->handleMapNotify();
+ return false;
+}
+
+QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
+{
+ QGLWidget *shareWidget = qt_gl_share_widget();
+
+ if (!shareWidget)
+ return new QRasterWindowSurface(widget);
+
+ QGLShareContextScope ctx(shareWidget->context());
+
+ if (QApplicationPrivate::instance()->graphics_system_name == QLatin1String("runtime"))
+ switch_handler()->addWidget(widget);
+
+ QMeeGoGraphicsSystem::surfaceWasCreated = true;
+ QWindowSurface *surface = new QGLWindowSurface(widget);
+ return surface;
+}
+
+QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData *origin)
+{
+ // If the pixmap is a raster type...
+ // and if the pixmap pointer matches our mapping...
+ // create a shared image instead with the given handle.
+
+ if (!origin->isNull() && origin->classId() == QPixmapData::RasterClass) {
+ QRasterPixmapData *rasterClass = static_cast <QRasterPixmapData *> (origin);
+ void *rawResource = static_cast <void *> (rasterClass->buffer()->data_ptr()->data);
+
+ if (QMeeGoPixmapData::sharedImagesMap.contains(rawResource))
+ return new QMeeGoPixmapData();
+ }
+
+ return new QRasterPixmapData(origin->pixelType());
+}
+
+QPixmapData* QMeeGoGraphicsSystem::wrapPixmapData(QPixmapData *pmd)
+{
+ QString name = QApplicationPrivate::instance()->graphics_system_name;
+ if (name == "runtime") {
+ QRuntimeGraphicsSystem *rsystem = (QRuntimeGraphicsSystem *) QApplicationPrivate::instance()->graphics_system;
+ QRuntimePixmapData *rt = new QRuntimePixmapData(rsystem, pmd->pixelType());;
+ rt->m_data = pmd;
+ rt->readBackInfo();
+ rsystem->m_pixmapDatas << rt;
+ return rt;
+ } else
+ return pmd;
+}
+
+void QMeeGoGraphicsSystem::setSurfaceFixedSize(int /*width*/, int /*height*/)
+{
+ if (QMeeGoGraphicsSystem::surfaceWasCreated) {
+ qWarning("Trying to set surface fixed size but surface already created!");
+ return;
+ }
+
+#ifdef QT_WAS_PATCHED
+ QEglProperties *properties = new QEglProperties();
+ properties->setValue(EGL_FIXED_WIDTH_NOK, width);
+ properties->setValue(EGL_FIXED_HEIGHT_NOK, height);
+ QGLContextPrivate::setExtraWindowSurfaceCreationProps(properties);
+#endif
+}
+
+void QMeeGoGraphicsSystem::setSurfaceScaling(int x, int y, int width, int height)
+{
+ QMeeGoExtensions::ensureInitialized();
+ QMeeGoExtensions::eglSetSurfaceScalingNOK(QEgl::display(), QEglContext::currentContext(QEgl::OpenGL)->currentSurface, x, y, width, height);
+}
+
+void QMeeGoGraphicsSystem::setTranslucent(bool translucent)
+{
+ if (QMeeGoGraphicsSystem::surfaceWasCreated) {
+ qWarning("Trying to set translucency but surface already created!");
+ return;
+ }
+
+ QGLWindowSurface::surfaceFormat.setSampleBuffers(false);
+ QGLWindowSurface::surfaceFormat.setSamples(0);
+ QGLWindowSurface::surfaceFormat.setAlpha(translucent);
+}
+
+QPixmapData *QMeeGoGraphicsSystem::pixmapDataFromEGLSharedImage(Qt::HANDLE handle, const QImage &softImage)
+{
+ if (softImage.format() != QImage::Format_ARGB32_Premultiplied &&
+ softImage.format() != QImage::Format_RGB32) {
+ qFatal("For egl shared images, the soft image has to be ARGB32_Premultiplied or RGB32");
+ return NULL;
+ }
+
+ if (QMeeGoGraphicsSystem::meeGoRunning()) {
+ QMeeGoPixmapData *pmd = new QMeeGoPixmapData;
+ pmd->fromEGLSharedImage(handle, softImage);
+ return QMeeGoGraphicsSystem::wrapPixmapData(pmd);
+ } else {
+ QRasterPixmapData *pmd = new QRasterPixmapData(QPixmapData::PixmapType);
+ pmd->fromImage(softImage, Qt::NoFormatConversion);
+
+ // Make sure that the image was not converted in any way
+ if (pmd->buffer()->data_ptr()->data !=
+ const_cast<QImage &>(softImage).data_ptr()->data)
+ qFatal("Iternal misalignment of raster data detected. Prolly a QImage copy fail.");
+
+ QMeeGoPixmapData::registerSharedImage(handle, softImage);
+ return QMeeGoGraphicsSystem::wrapPixmapData(pmd);
+ }
+}
+
+void QMeeGoGraphicsSystem::updateEGLSharedImagePixmap(QPixmap *pixmap)
+{
+ QMeeGoPixmapData *pmd = (QMeeGoPixmapData *) pixmap->pixmapData();
+
+ // Basic sanity check to make sure this is really a QMeeGoPixmapData...
+ if (pmd->classId() != QPixmapData::OpenGLClass)
+ qFatal("Trying to updated EGLSharedImage pixmap but it's not really a shared image pixmap!");
+
+ pmd->updateFromSoftImage();
+}
+
+QPixmapData *QMeeGoGraphicsSystem::pixmapDataWithGLTexture(int w, int h)
+{
+ QGLPixmapData *pmd = new QGLPixmapData(QPixmapData::PixmapType);
+ pmd->resize(w, h);
+ return QMeeGoGraphicsSystem::wrapPixmapData(pmd);
+}
+
+bool QMeeGoGraphicsSystem::meeGoRunning()
+{
+ return runningGraphicsSystemName() == "meego";
+}
+
+QPixmapData* QMeeGoGraphicsSystem::pixmapDataWithNewLiveTexture(int w, int h, QImage::Format format)
+{
+ return new QMeeGoLivePixmapData(w, h, format);
+}
+
+QPixmapData* QMeeGoGraphicsSystem::pixmapDataFromLiveTextureHandle(Qt::HANDLE handle)
+{
+ return new QMeeGoLivePixmapData(handle);
+}
+
+QImage* QMeeGoGraphicsSystem::lockLiveTexture(QPixmap* pixmap, void* fenceSync)
+{
+ QMeeGoLivePixmapData *pixmapData = static_cast<QMeeGoLivePixmapData*>(pixmap->data_ptr().data());
+ return pixmapData->lock(fenceSync);
+}
+
+bool QMeeGoGraphicsSystem::releaseLiveTexture(QPixmap *pixmap, QImage *image)
+{
+ QMeeGoLivePixmapData *pixmapData = static_cast<QMeeGoLivePixmapData*>(pixmap->data_ptr().data());
+ return pixmapData->release(image);
+}
+
+Qt::HANDLE QMeeGoGraphicsSystem::getLiveTextureHandle(QPixmap *pixmap)
+{
+ QMeeGoLivePixmapData *pixmapData = static_cast<QMeeGoLivePixmapData*>(pixmap->data_ptr().data());
+ return pixmapData->handle();
+}
+
+void* QMeeGoGraphicsSystem::createFenceSync()
+{
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QMeeGoExtensions::ensureInitialized();
+ return QMeeGoExtensions::eglCreateSyncKHR(QEgl::display(), EGL_SYNC_FENCE_KHR, NULL);
+}
+
+void QMeeGoGraphicsSystem::destroyFenceSync(void *fenceSync)
+{
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QMeeGoExtensions::ensureInitialized();
+ QMeeGoExtensions::eglDestroySyncKHR(QEgl::display(), fenceSync);
+}
+
+QString QMeeGoGraphicsSystem::runningGraphicsSystemName()
+{
+ if (!QApplicationPrivate::instance()) {
+ qWarning("Querying graphics system but application not running yet!");
+ return QString();
+ }
+
+ QString name = QApplicationPrivate::instance()->graphics_system_name;
+ if (name == QLatin1String("runtime")) {
+ QRuntimeGraphicsSystem *rsystem = (QRuntimeGraphicsSystem *) QApplicationPrivate::instance()->graphics_system;
+ name = rsystem->graphicsSystemName();
+ }
+
+ return name;
+}
+
+void QMeeGoGraphicsSystem::switchToMeeGo()
+{
+ if (switchPolicy == NoSwitch || meeGoRunning())
+ return;
+
+ if (QApplicationPrivate::instance()->graphics_system_name != QLatin1String("runtime"))
+ qWarning("Can't switch to meego - switching only supported with 'runtime' graphics system.");
+ else {
+ triggerSwitchCallbacks(0, "meego");
+
+ QApplication *app = static_cast<QApplication *>(QCoreApplication::instance());
+ app->setGraphicsSystem(QLatin1String("meego"));
+
+ triggerSwitchCallbacks(1, "meego");
+ }
+}
+
+void QMeeGoGraphicsSystem::switchToRaster()
+{
+ if (switchPolicy == NoSwitch || runningGraphicsSystemName() == QLatin1String("raster"))
+ return;
+
+ if (QApplicationPrivate::instance()->graphics_system_name != QLatin1String("runtime"))
+ qWarning("Can't switch to raster - switching only supported with 'runtime' graphics system.");
+ else {
+ triggerSwitchCallbacks(0, "raster");
+
+ QApplication *app = static_cast<QApplication *>(QCoreApplication::instance());
+ app->setGraphicsSystem(QLatin1String("raster"));
+
+ QMeeGoLivePixmapData::invalidateSurfaces();
+
+ triggerSwitchCallbacks(1, "raster");
+ }
+}
+
+void QMeeGoGraphicsSystem::registerSwitchCallback(QMeeGoSwitchCallback callback)
+{
+ switchCallbacks << callback;
+}
+
+void QMeeGoGraphicsSystem::triggerSwitchCallbacks(int type, const char *name)
+{
+ for (int i = 0; i < switchCallbacks.size(); ++i)
+ switchCallbacks.at(i)(type, name);
+}
+
+/* C API */
+
+int qt_meego_image_to_egl_shared_image(const QImage &image)
+{
+ return QMeeGoPixmapData::imageToEGLSharedImage(image);
+}
+
+QPixmapData* qt_meego_pixmapdata_from_egl_shared_image(Qt::HANDLE handle, const QImage &softImage)
+{
+ return QMeeGoGraphicsSystem::pixmapDataFromEGLSharedImage(handle, softImage);
+}
+
+QPixmapData* qt_meego_pixmapdata_with_gl_texture(int w, int h)
+{
+ return QMeeGoGraphicsSystem::pixmapDataWithGLTexture(w, h);
+}
+
+bool qt_meego_destroy_egl_shared_image(Qt::HANDLE handle)
+{
+ return QMeeGoPixmapData::destroyEGLSharedImage(handle);
+}
+
+void qt_meego_set_surface_fixed_size(int width, int height)
+{
+ QMeeGoGraphicsSystem::setSurfaceFixedSize(width, height);
+}
+
+void qt_meego_set_surface_scaling(int x, int y, int width, int height)
+{
+ QMeeGoGraphicsSystem::setSurfaceScaling(x, y, width, height);
+}
+
+void qt_meego_set_translucent(bool translucent)
+{
+ QMeeGoGraphicsSystem::setTranslucent(translucent);
+}
+
+void qt_meego_update_egl_shared_image_pixmap(QPixmap *pixmap)
+{
+ QMeeGoGraphicsSystem::updateEGLSharedImagePixmap(pixmap);
+}
+
+QPixmapData* qt_meego_pixmapdata_with_new_live_texture(int w, int h, QImage::Format format)
+{
+ return QMeeGoGraphicsSystem::pixmapDataWithNewLiveTexture(w, h, format);
+}
+
+QPixmapData* qt_meego_pixmapdata_from_live_texture_handle(Qt::HANDLE handle)
+{
+ return QMeeGoGraphicsSystem::pixmapDataFromLiveTextureHandle(handle);
+}
+
+QImage* qt_meego_live_texture_lock(QPixmap *pixmap, void *fenceSync)
+{
+ return QMeeGoGraphicsSystem::lockLiveTexture(pixmap, fenceSync);
+}
+
+bool qt_meego_live_texture_release(QPixmap *pixmap, QImage *image)
+{
+ return QMeeGoGraphicsSystem::releaseLiveTexture(pixmap, image);
+}
+
+Qt::HANDLE qt_meego_live_texture_get_handle(QPixmap *pixmap)
+{
+ return QMeeGoGraphicsSystem::getLiveTextureHandle(pixmap);
+}
+
+void* qt_meego_create_fence_sync(void)
+{
+ return QMeeGoGraphicsSystem::createFenceSync();
+}
+
+void qt_meego_destroy_fence_sync(void* fs)
+{
+ return QMeeGoGraphicsSystem::destroyFenceSync(fs);
+}
+
+void qt_meego_invalidate_live_surfaces(void)
+{
+ return QMeeGoLivePixmapData::invalidateSurfaces();
+}
+
+void qt_meego_switch_to_raster(void)
+{
+ QMeeGoGraphicsSystem::switchToRaster();
+}
+
+void qt_meego_switch_to_meego(void)
+{
+ QMeeGoGraphicsSystem::switchToMeeGo();
+}
+
+void qt_meego_register_switch_callback(QMeeGoSwitchCallback callback)
+{
+ QMeeGoGraphicsSystem::registerSwitchCallback(callback);
+}
+
+void qt_meego_set_switch_policy(int policy)
+{
+ QMeeGoGraphicsSystem::switchPolicy = QMeeGoGraphicsSystem::SwitchPolicy(policy);
+}
+
+#include "qmeegographicssystem.moc"
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.h b/src/plugins/graphicssystems/meego/qmeegographicssystem.h
new file mode 100644
index 0000000000..352842546f
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.h
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MGRAPHICSSYSTEM_H
+#define MGRAPHICSSYSTEM_H
+
+#include <private/qgraphicssystem_p.h>
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+extern "C" typedef void (*QMeeGoSwitchCallback)(int type, const char *name);
+
+class QMeeGoGraphicsSystem : public QGraphicsSystem
+{
+public:
+ enum SwitchPolicy { AutomaticSwitch, ManualSwitch, NoSwitch };
+
+ QMeeGoGraphicsSystem();
+ ~QMeeGoGraphicsSystem();
+
+ virtual QWindowSurface *createWindowSurface(QWidget *widget) const;
+ virtual QPixmapData *createPixmapData(QPixmapData::PixelType) const;
+ virtual QPixmapData *createPixmapData(QPixmapData *origin);
+
+ static QPixmapData *wrapPixmapData(QPixmapData *pmd);
+ static void setSurfaceFixedSize(int width, int height);
+ static void setSurfaceScaling(int x, int y, int width, int height);
+ static void setTranslucent(bool translucent);
+
+ static QPixmapData *pixmapDataFromEGLSharedImage(Qt::HANDLE handle, const QImage &softImage);
+ static QPixmapData *pixmapDataFromEGLImage(Qt::HANDLE handle);
+ static QPixmapData *pixmapDataWithGLTexture(int w, int h);
+ static void updateEGLSharedImagePixmap(QPixmap *pixmap);
+
+ static QPixmapData *pixmapDataWithNewLiveTexture(int w, int h, QImage::Format format);
+ static QPixmapData *pixmapDataFromLiveTextureHandle(Qt::HANDLE handle);
+ static QImage *lockLiveTexture(QPixmap* pixmap, void* fenceSync);
+ static bool releaseLiveTexture(QPixmap *pixmap, QImage *image);
+ static Qt::HANDLE getLiveTextureHandle(QPixmap *pixmap);
+
+ static void* createFenceSync();
+ static void destroyFenceSync(void* fenceSync);
+
+ static void switchToRaster();
+ static void switchToMeeGo();
+ static QString runningGraphicsSystemName();
+
+ static void registerSwitchCallback(QMeeGoSwitchCallback callback);
+
+ static SwitchPolicy switchPolicy;
+
+private:
+ static bool meeGoRunning();
+ static EGLSurface getSurfaceForLiveTexturePixmap(QPixmap *pixmap);
+ static void destroySurfaceForLiveTexturePixmap(QPixmapData* pmd);
+ static void triggerSwitchCallbacks(int type, const char *name);
+
+ static bool surfaceWasCreated;
+ static QHash<Qt::HANDLE, QPixmap*> liveTexturePixmaps;
+ static QList<QMeeGoSwitchCallback> switchCallbacks;
+};
+
+/* C api */
+
+extern "C" {
+ Q_DECL_EXPORT int qt_meego_image_to_egl_shared_image(const QImage &image);
+ Q_DECL_EXPORT QPixmapData* qt_meego_pixmapdata_from_egl_shared_image(Qt::HANDLE handle, const QImage &softImage);
+ Q_DECL_EXPORT QPixmapData* qt_meego_pixmapdata_with_gl_texture(int w, int h);
+ Q_DECL_EXPORT void qt_meego_update_egl_shared_image_pixmap(QPixmap *pixmap);
+ Q_DECL_EXPORT bool qt_meego_destroy_egl_shared_image(Qt::HANDLE handle);
+ Q_DECL_EXPORT void qt_meego_set_surface_fixed_size(int width, int height);
+ Q_DECL_EXPORT void qt_meego_set_surface_scaling(int x, int y, int width, int height);
+ Q_DECL_EXPORT void qt_meego_set_translucent(bool translucent);
+ Q_DECL_EXPORT QPixmapData* qt_meego_pixmapdata_with_new_live_texture(int w, int h, QImage::Format format);
+ Q_DECL_EXPORT QPixmapData* qt_meego_pixmapdata_from_live_texture_handle(Qt::HANDLE handle);
+ Q_DECL_EXPORT QImage* qt_meego_live_texture_lock(QPixmap *pixmap, void *fenceSync);
+ Q_DECL_EXPORT bool qt_meego_live_texture_release(QPixmap *pixmap, QImage *image);
+ Q_DECL_EXPORT Qt::HANDLE qt_meego_live_texture_get_handle(QPixmap *pixmap);
+ Q_DECL_EXPORT void* qt_meego_create_fence_sync(void);
+ Q_DECL_EXPORT void qt_meego_destroy_fence_sync(void* fs);
+ Q_DECL_EXPORT void qt_meego_invalidate_live_surfaces(void);
+ Q_DECL_EXPORT void qt_meego_switch_to_raster(void);
+ Q_DECL_EXPORT void qt_meego_switch_to_meego(void);
+ Q_DECL_EXPORT void qt_meego_register_switch_callback(QMeeGoSwitchCallback callback);
+ Q_DECL_EXPORT void qt_meego_set_switch_policy(int policy);
+}
+
+#endif
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystemplugin.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystemplugin.cpp
new file mode 100644
index 0000000000..c7410c2b88
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystemplugin.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include "qmeegographicssystemplugin.h"
+#include "qmeegographicssystem.h"
+
+QStringList QMeeGoGraphicsSystemPlugin::keys() const
+{
+ QStringList list;
+ list << "meego";
+ return list;
+}
+
+QGraphicsSystem *QMeeGoGraphicsSystemPlugin::create(const QString&)
+{
+ return new QMeeGoGraphicsSystem;
+}
+
+Q_EXPORT_PLUGIN2(meego, QMeeGoGraphicsSystemPlugin)
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystemplugin.h b/src/plugins/graphicssystems/meego/qmeegographicssystemplugin.h
new file mode 100644
index 0000000000..1fc884476a
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystemplugin.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MGRAPHICSSYSTEMPLUGIN_H
+#define MGRAPHICSSYSTEMPLUGIN_H
+
+#include <private/qgraphicssystemplugin_p.h>
+
+class QMeeGoGraphicsSystemPlugin : public QGraphicsSystemPlugin
+{
+public:
+ virtual QStringList keys() const;
+ virtual QGraphicsSystem *create(const QString&);
+};
+
+#endif
diff --git a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
new file mode 100644
index 0000000000..b6ba7ec29f
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
@@ -0,0 +1,323 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmeegolivepixmapdata.h"
+#include "qmeegorasterpixmapdata.h"
+#include <private/qimage_p.h>
+#include <private/qwindowsurface_gl_p.h>
+#include <private/qeglcontext_p.h>
+#include <private/qapplication_p.h>
+#include <private/qgraphicssystem_runtime_p.h>
+#include <private/qpixmap_x11_p.h>
+#include <stdio.h>
+
+static QMeeGoLivePixmapDataList all_live_pixmaps;
+
+static EGLint lock_attribs[] = {
+ EGL_MAP_PRESERVE_PIXELS_KHR, EGL_TRUE,
+ EGL_LOCK_USAGE_HINT_KHR, EGL_READ_SURFACE_BIT_KHR | EGL_WRITE_SURFACE_BIT_KHR,
+ EGL_NONE
+};
+
+static EGLint preserved_attribs[] = {
+ EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
+ EGL_NONE
+};
+
+// as copied from qwindowsurface.cpp
+void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset)
+{
+ // make sure we don't detach
+ uchar *mem = const_cast<uchar*>(const_cast<const QImage &>(img).bits());
+
+ int lineskip = img.bytesPerLine();
+ int depth = img.depth() >> 3;
+
+ const QRect imageRect(0, 0, img.width(), img.height());
+ const QRect r = rect & imageRect & imageRect.translated(-offset);
+ const QPoint p = rect.topLeft() + offset;
+
+ if (r.isEmpty())
+ return;
+
+ const uchar *src;
+ uchar *dest;
+
+ if (r.top() < p.y()) {
+ src = mem + r.bottom() * lineskip + r.left() * depth;
+ dest = mem + (p.y() + r.height() - 1) * lineskip + p.x() * depth;
+ lineskip = -lineskip;
+ } else {
+ src = mem + r.top() * lineskip + r.left() * depth;
+ dest = mem + p.y() * lineskip + p.x() * depth;
+ }
+
+ const int w = r.width();
+ int h = r.height();
+ const int bytes = w * depth;
+
+ // overlapping segments?
+ if (offset.y() == 0 && qAbs(offset.x()) < w) {
+ do {
+ ::memmove(dest, src, bytes);
+ dest += lineskip;
+ src += lineskip;
+ } while (--h);
+ } else {
+ do {
+ ::memcpy(dest, src, bytes);
+ dest += lineskip;
+ src += lineskip;
+ } while (--h);
+ }
+}
+
+/* Public */
+
+QMeeGoLivePixmapData::QMeeGoLivePixmapData(int w, int h, QImage::Format format) : QGLPixmapData(QPixmapData::PixmapType)
+{
+ QImage image(w, h, format);
+ QX11PixmapData *pmd = new QX11PixmapData(QPixmapData::PixmapType);
+ pmd->fromImage(image, Qt::NoOpaqueDetection);
+ backingX11Pixmap = new QPixmap(pmd);
+
+ initializeThroughEGLImage();
+
+ pos = all_live_pixmaps.insert(all_live_pixmaps.begin(), this);
+}
+
+QMeeGoLivePixmapData::QMeeGoLivePixmapData(Qt::HANDLE h) : QGLPixmapData(QPixmapData::PixmapType)
+{
+ backingX11Pixmap = new QPixmap(QPixmap::fromX11Pixmap(h));
+ initializeThroughEGLImage();
+
+ pos = all_live_pixmaps.insert(all_live_pixmaps.begin(), this);
+}
+
+QMeeGoLivePixmapData::~QMeeGoLivePixmapData()
+{
+ delete backingX11Pixmap;
+ all_live_pixmaps.erase(pos);
+}
+
+void QMeeGoLivePixmapData::initializeThroughEGLImage()
+{
+ if (texture()->id != 0)
+ return;
+
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QMeeGoExtensions::ensureInitialized();
+
+ EGLImageKHR eglImage = EGL_NO_IMAGE_KHR;
+ GLuint newTextureId = 0;
+
+ eglImage = QEgl::eglCreateImageKHR(QEgl::display(), EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR,
+ (EGLClientBuffer) backingX11Pixmap->handle(), preserved_attribs);
+
+ if (eglImage == EGL_NO_IMAGE_KHR) {
+ qWarning("eglCreateImageKHR failed (live texture)!");
+ return;
+ }
+
+ glGenTextures(1, &newTextureId);
+ glBindTexture(GL_TEXTURE_2D, newTextureId);
+
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (EGLImageKHR) eglImage);
+ if (glGetError() == GL_NO_ERROR) {
+ resize(backingX11Pixmap->width(), backingX11Pixmap->height());
+ texture()->id = newTextureId;
+ texture()->options &= ~QGLContext::InvertedYBindOption;
+ m_hasAlpha = backingX11Pixmap->hasAlphaChannel();
+ } else {
+ qWarning("Failed to create a texture from an egl image (live texture)!");
+ glDeleteTextures(1, &newTextureId);
+ }
+
+ QEgl::eglDestroyImageKHR(QEgl::display(), eglImage);
+}
+
+QPixmapData *QMeeGoLivePixmapData::createCompatiblePixmapData() const
+{
+ qWarning("Create compatible called on live pixmap! Expect fail soon...");
+ return new QMeeGoRasterPixmapData(pixelType());
+}
+
+QImage* QMeeGoLivePixmapData::lock(EGLSyncKHR fenceSync)
+{
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QMeeGoExtensions::ensureInitialized();
+
+ if (fenceSync) {
+ QMeeGoExtensions::eglClientWaitSyncKHR(QEgl::display(),
+ fenceSync,
+ EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
+ EGL_FOREVER_KHR);
+ }
+
+ void *data = 0;
+ int pitch = 0;
+ int surfaceWidth = 0;
+ int surfaceHeight = 0;
+ EGLSurface surface = 0;
+ QImage::Format format;
+ lockedImage = QImage();
+
+ surface = getSurfaceForBackingPixmap();
+ if (! QMeeGoExtensions::eglLockSurfaceKHR(QEgl::display(), surface, lock_attribs)) {
+ qWarning("Failed to lock surface (live texture)!");
+ return &lockedImage;
+ }
+
+ eglQuerySurface(QEgl::display(), surface, EGL_BITMAP_POINTER_KHR, (EGLint*) &data);
+ eglQuerySurface(QEgl::display(), surface, EGL_BITMAP_PITCH_KHR, (EGLint*) &pitch);
+ eglQuerySurface(QEgl::display(), surface, EGL_WIDTH, (EGLint*) &surfaceWidth);
+ eglQuerySurface(QEgl::display(), surface, EGL_HEIGHT, (EGLint*) &surfaceHeight);
+
+ // Ok, here we know we just support those two formats. Real solution would be:
+ // query also the format.
+ if (backingX11Pixmap->depth() > 16)
+ format = QImage::Format_ARGB32_Premultiplied;
+ else
+ format = QImage::Format_RGB16;
+
+ if (data == NULL || pitch == 0) {
+ qWarning("Failed to query the live texture!");
+ return &lockedImage;
+ }
+
+ if (width() != surfaceWidth || height() != surfaceHeight) {
+ qWarning("Live texture dimensions don't match!");
+ QMeeGoExtensions::eglUnlockSurfaceKHR(QEgl::display(), surface);
+ return &lockedImage;
+ }
+
+ lockedImage = QImage((uchar *) data, width(), height(), pitch, format);
+ return &lockedImage;
+}
+
+bool QMeeGoLivePixmapData::release(QImage* /*img*/)
+{
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QMeeGoExtensions::ensureInitialized();
+
+ if (QMeeGoExtensions::eglUnlockSurfaceKHR(QEgl::display(), getSurfaceForBackingPixmap())) {
+ lockedImage = QImage();
+ return true;
+ } else {
+ lockedImage = QImage();
+ return false;
+ }
+}
+
+Qt::HANDLE QMeeGoLivePixmapData::handle()
+{
+ return backingX11Pixmap->handle();
+}
+
+bool QMeeGoLivePixmapData::scroll(int dx, int dy, const QRect &rect)
+{
+ lock(NULL);
+
+ if (!lockedImage.isNull())
+ qt_scrollRectInImage(lockedImage, rect, QPoint(dx, dy));
+
+ release(&lockedImage);
+ return true;
+}
+
+EGLSurface QMeeGoLivePixmapData::getSurfaceForBackingPixmap()
+{
+ initializeThroughEGLImage();
+
+ // This code is a crative remix of the stuff that can be found in the
+ // Qt's TFP implementation in /src/opengl/qgl_x11egl.cpp ::bindiTextureFromNativePixmap
+ QX11PixmapData *pixmapData = static_cast<QX11PixmapData*>(backingX11Pixmap->data_ptr().data());
+ Q_ASSERT(pixmapData->classId() == QPixmapData::X11Class);
+ bool hasAlpha = pixmapData->hasAlphaChannel();
+
+ if (pixmapData->gl_surface &&
+ hasAlpha == (pixmapData->flags & QX11PixmapData::GlSurfaceCreatedWithAlpha))
+ return pixmapData->gl_surface;
+
+ // Check to see if the surface is still valid
+ if (pixmapData->gl_surface &&
+ hasAlpha != ((pixmapData->flags & QX11PixmapData::GlSurfaceCreatedWithAlpha) > 0)) {
+ // Surface is invalid!
+ destroySurfaceForPixmapData(pixmapData);
+ }
+
+ if (pixmapData->gl_surface == 0) {
+ EGLConfig config = QEgl::defaultConfig(QInternal::Pixmap,
+ QEgl::OpenGL,
+ hasAlpha ? QEgl::Translucent : QEgl::NoOptions);
+
+ pixmapData->gl_surface = (void*)QEgl::createSurface(backingX11Pixmap, config);
+
+ if (hasAlpha)
+ pixmapData->flags |= QX11PixmapData::GlSurfaceCreatedWithAlpha;
+ else
+ pixmapData->flags &= ~QX11PixmapData::GlSurfaceCreatedWithAlpha;
+
+ if (pixmapData->gl_surface == (void*)EGL_NO_SURFACE)
+ return NULL;
+ }
+
+ return pixmapData->gl_surface;
+}
+
+void QMeeGoLivePixmapData::destroySurfaceForPixmapData(QPixmapData* pmd)
+{
+ Q_ASSERT(pmd->classId() == QPixmapData::X11Class);
+ QX11PixmapData *pixmapData = static_cast<QX11PixmapData*>(pmd);
+ if (pixmapData->gl_surface) {
+ eglDestroySurface(QEgl::display(), (EGLSurface)pixmapData->gl_surface);
+ pixmapData->gl_surface = 0;
+ }
+}
+
+void QMeeGoLivePixmapData::invalidateSurfaces()
+{
+ foreach (QMeeGoLivePixmapData *data, all_live_pixmaps) {
+ QX11PixmapData *pixmapData = static_cast<QX11PixmapData*>(data->backingX11Pixmap->data_ptr().data());
+ *data->texture() = QGLTexture();
+ pixmapData->gl_surface = 0;
+ }
+}
diff --git a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
new file mode 100644
index 0000000000..616b33cc95
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MLIVEPIXMAPDATA_H
+#define MLIVEPIXMAPDATA_H
+
+#include <QLinkedList>
+#include <private/qpixmapdata_gl_p.h>
+#include "qmeegoextensions.h"
+
+class QMeeGoLivePixmapData;
+typedef QLinkedList<QMeeGoLivePixmapData *> QMeeGoLivePixmapDataList;
+
+class QMeeGoLivePixmapData : public QGLPixmapData
+{
+public:
+ QMeeGoLivePixmapData(int w, int h, QImage::Format format);
+ QMeeGoLivePixmapData(Qt::HANDLE h);
+ ~QMeeGoLivePixmapData();
+
+ QPixmapData *createCompatiblePixmapData() const;
+ bool scroll(int dx, int dy, const QRect &rect);
+
+ void initializeThroughEGLImage();
+
+ QImage* lock(EGLSyncKHR fenceSync);
+ bool release(QImage *img);
+ Qt::HANDLE handle();
+
+ EGLSurface getSurfaceForBackingPixmap();
+ void destroySurfaceForPixmapData(QPixmapData* pmd);
+
+ QPixmap *backingX11Pixmap;
+ QImage lockedImage;
+ QMeeGoLivePixmapDataList::Iterator pos;
+
+ static void invalidateSurfaces();
+};
+
+#endif
diff --git a/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp b/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp
new file mode 100644
index 0000000000..ba3799fc33
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmeegopixmapdata.h"
+#include "qmeegoextensions.h"
+#include "qmeegorasterpixmapdata.h"
+#include <private/qimage_p.h>
+#include <private/qwindowsurface_gl_p.h>
+#include <private/qeglcontext_p.h>
+#include <private/qapplication_p.h>
+#include <private/qgraphicssystem_runtime_p.h>
+
+// from dithering.cpp
+extern unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int height, int stride);
+extern unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, int height, int stride);
+extern unsigned char* convertBGRA32_to_RGBA32(const unsigned char *in, int width, int height, int stride);
+
+static EGLint preserved_image_attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
+
+QHash <void*, QMeeGoImageInfo*> QMeeGoPixmapData::sharedImagesMap;
+
+/* Public */
+
+QMeeGoPixmapData::QMeeGoPixmapData() : QGLPixmapData(QPixmapData::PixmapType)
+{
+}
+
+void QMeeGoPixmapData::fromTexture(GLuint textureId, int w, int h, bool alpha)
+{
+ resize(w, h);
+ texture()->id = textureId;
+ m_hasAlpha = alpha;
+ softImage = QImage();
+}
+
+QImage QMeeGoPixmapData::toImage() const
+{
+ return softImage;
+}
+
+void QMeeGoPixmapData::fromImage(const QImage &image,
+ Qt::ImageConversionFlags flags)
+{
+ void *rawResource = static_cast <void *> (((QImage &) image).data_ptr()->data);
+
+ if (sharedImagesMap.contains(rawResource)) {
+ QMeeGoImageInfo *info = sharedImagesMap.value(rawResource);
+ fromEGLSharedImage(info->handle, image);
+ } else {
+ // This should *never* happen since the graphics system should never
+ // create a QMeeGoPixmapData for an origin that doesn't contain a raster
+ // image we know about. But...
+ qWarning("QMeeGoPixmapData::fromImage called on non-know resource. Falling back...");
+ QGLPixmapData::fromImage(image, flags);
+ }
+}
+
+void QMeeGoPixmapData::fromEGLSharedImage(Qt::HANDLE handle, const QImage &si)
+{
+ if (si.isNull())
+ qFatal("Trying to build pixmap with an empty/null softimage!");
+
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+
+ QMeeGoExtensions::ensureInitialized();
+
+ bool textureIsBound = false;
+ GLuint newTextureId;
+ GLint newWidth, newHeight;
+
+ glGenTextures(1, &newTextureId);
+ glBindTexture(GL_TEXTURE_2D, newTextureId);
+
+ EGLImageKHR image = QEgl::eglCreateImageKHR(QEgl::display(), EGL_NO_CONTEXT, EGL_SHARED_IMAGE_NOK,
+ (EGLClientBuffer)handle, preserved_image_attribs);
+
+ if (image != EGL_NO_IMAGE_KHR) {
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
+ GLint err = glGetError();
+ if (err == GL_NO_ERROR)
+ textureIsBound = true;
+
+ QMeeGoExtensions::eglQueryImageNOK(QEgl::display(), image, EGL_WIDTH, &newWidth);
+ QMeeGoExtensions::eglQueryImageNOK(QEgl::display(), image, EGL_HEIGHT, &newHeight);
+
+ QEgl::eglDestroyImageKHR(QEgl::display(), image);
+ }
+
+ if (textureIsBound) {
+ fromTexture(newTextureId, newWidth, newHeight,
+ (si.hasAlphaChannel() && const_cast<QImage &>(si).data_ptr()->checkForAlphaPixels()));
+ texture()->options &= ~QGLContext::InvertedYBindOption;
+ softImage = si;
+ QMeeGoPixmapData::registerSharedImage(handle, softImage);
+ } else {
+ qWarning("Failed to create a texture from a shared image!");
+ glDeleteTextures(1, &newTextureId);
+ }
+}
+
+Qt::HANDLE QMeeGoPixmapData::imageToEGLSharedImage(const QImage &image)
+{
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+
+ QMeeGoExtensions::ensureInitialized();
+
+ GLuint textureId;
+
+ glGenTextures(1, &textureId);
+ glBindTexture(GL_TEXTURE_2D, textureId);
+ if (image.hasAlphaChannel() && const_cast<QImage &>(image).data_ptr()->checkForAlphaPixels()) {
+ void *converted = convertBGRA32_to_RGBA32(image.bits(), image.width(), image.height(), image.bytesPerLine());
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, converted);
+ free(converted);
+ } else {
+ void *converted = convertRGB32_to_RGB565(image.bits(), image.width(), image.height(), image.bytesPerLine());
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, converted);
+ free(converted);
+ }
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glBindTexture(GL_TEXTURE_2D, textureId);
+ EGLImageKHR eglimage = QEgl::eglCreateImageKHR(QEgl::display(), QEglContext::currentContext(QEgl::OpenGL)->context(),
+ EGL_GL_TEXTURE_2D_KHR,
+ (EGLClientBuffer) textureId,
+ preserved_image_attribs);
+ glDeleteTextures(1, &textureId);
+ if (eglimage) {
+ EGLNativeSharedImageTypeNOK handle = QMeeGoExtensions::eglCreateSharedImageNOK(QEgl::display(), eglimage, NULL);
+ QEgl::eglDestroyImageKHR(QEgl::display(), eglimage);
+ return (Qt::HANDLE) handle;
+ } else {
+ qWarning("Failed to create shared image from pixmap/texture!");
+ return 0;
+ }
+}
+
+void QMeeGoPixmapData::updateFromSoftImage()
+{
+ // FIXME That's broken with recent 16bit textures changes.
+ m_dirty = true;
+ m_source = softImage;
+ ensureCreated();
+
+ if (softImage.width() != w || softImage.height() != h)
+ qWarning("Ooops, looks like softImage changed dimensions since last updated! Corruption ahead?!");
+}
+
+bool QMeeGoPixmapData::destroyEGLSharedImage(Qt::HANDLE h)
+{
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ QMeeGoExtensions::ensureInitialized();
+
+ QMutableHashIterator <void*, QMeeGoImageInfo*> i(sharedImagesMap);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value()->handle == h)
+ i.remove();
+ }
+
+ return QMeeGoExtensions::eglDestroySharedImageNOK(QEgl::display(), (EGLNativeSharedImageTypeNOK) h);
+}
+
+void QMeeGoPixmapData::registerSharedImage(Qt::HANDLE handle, const QImage &si)
+{
+ void *raw = static_cast <void *> (((QImage) si).data_ptr()->data);
+ QMeeGoImageInfo *info;
+
+ if (! sharedImagesMap.contains(raw)) {
+ info = new QMeeGoImageInfo;
+ info->handle = handle;
+ info->rawFormat = si.format();
+ sharedImagesMap.insert(raw, info);
+ } else {
+ info = sharedImagesMap.value(raw);
+ if (info->handle != handle || info->rawFormat != si.format())
+ qWarning("Inconsistency detected: overwriting entry in sharedImagesMap but handle/format different");
+ }
+}
+
+QPixmapData *QMeeGoPixmapData::createCompatiblePixmapData() const
+{
+ return new QMeeGoRasterPixmapData(pixelType());
+}
diff --git a/src/plugins/graphicssystems/meego/qmeegopixmapdata.h b/src/plugins/graphicssystems/meego/qmeegopixmapdata.h
new file mode 100644
index 0000000000..a3d3bbb0b5
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegopixmapdata.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MPIXMAPDATA_H
+#define MPIXMAPDATA_H
+
+#include <private/qpixmapdata_gl_p.h>
+
+struct QMeeGoImageInfo
+{
+ Qt::HANDLE handle;
+ QImage::Format rawFormat;
+};
+
+class QMeeGoPixmapData : public QGLPixmapData
+{
+public:
+ QMeeGoPixmapData();
+ void fromTexture(GLuint textureId, int w, int h, bool alpha);
+ QPixmapData *createCompatiblePixmapData() const;
+
+ virtual void fromEGLSharedImage(Qt::HANDLE handle, const QImage &softImage);
+ virtual void fromImage (const QImage &image, Qt::ImageConversionFlags flags);
+ virtual QImage toImage() const;
+ virtual void updateFromSoftImage();
+
+ QImage softImage;
+
+ static QHash <void*, QMeeGoImageInfo*> sharedImagesMap;
+
+ static Qt::HANDLE imageToEGLSharedImage(const QImage &image);
+ static bool destroyEGLSharedImage(Qt::HANDLE h);
+ static void registerSharedImage(Qt::HANDLE handle, const QImage &si);
+};
+
+#endif
diff --git a/src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.cpp b/src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.cpp
new file mode 100644
index 0000000000..5b8f23e453
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.cpp
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmeegorasterpixmapdata.h"
+
+/* Public */
+
+QMeeGoRasterPixmapData::QMeeGoRasterPixmapData() : QRasterPixmapData(QPixmapData::PixmapType)
+{
+}
+
+QMeeGoRasterPixmapData::QMeeGoRasterPixmapData(QPixmapData::PixelType t) : QRasterPixmapData(t)
+{
+}
+
+void QMeeGoRasterPixmapData::copy(const QPixmapData *data, const QRect &rect)
+{
+ if (data->classId() == QPixmapData::OpenGLClass)
+ fromImage(data->toImage(rect).copy(), Qt::NoOpaqueDetection);
+ else
+ QRasterPixmapData::copy(data, rect);
+}
diff --git a/src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.h b/src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.h
new file mode 100644
index 0000000000..4320659fe9
--- /dev/null
+++ b/src/plugins/graphicssystems/meego/qmeegorasterpixmapdata.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MRASTERPIXMAPDATA_H
+#define MRASTERPIXMAPDATA_H
+
+#include <private/qpixmap_raster_p.h>
+
+class QMeeGoRasterPixmapData : public QRasterPixmapData
+{
+public:
+ QMeeGoRasterPixmapData();
+ QMeeGoRasterPixmapData(QPixmapData::PixelType t);
+ void copy(const QPixmapData *data, const QRect &rect);
+};
+
+#endif
diff --git a/src/plugins/graphicssystems/opengl/main.cpp b/src/plugins/graphicssystems/opengl/main.cpp
new file mode 100644
index 0000000000..4c8f928d66
--- /dev/null
+++ b/src/plugins/graphicssystems/opengl/main.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qgraphicssystemplugin_p.h>
+#include <private/qgraphicssystem_gl_p.h>
+#include <qgl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QGLGraphicsSystemPlugin : public QGraphicsSystemPlugin
+{
+public:
+ QStringList keys() const;
+ QGraphicsSystem *create(const QString&);
+};
+
+QStringList QGLGraphicsSystemPlugin::keys() const
+{
+ QStringList list;
+ list << QLatin1String("OpenGL") << QLatin1String("OpenGL1");
+#if !defined(QT_OPENGL_ES_1)
+ list << QLatin1String("OpenGL2");
+#endif
+#if defined(Q_WS_X11) && !defined(QT_NO_EGL)
+ list << QLatin1String("X11GL");
+#endif
+ return list;
+}
+
+QGraphicsSystem* QGLGraphicsSystemPlugin::create(const QString& system)
+{
+ if (system.toLower() == QLatin1String("opengl1")) {
+ QGL::setPreferredPaintEngine(QPaintEngine::OpenGL);
+ return new QGLGraphicsSystem(false);
+ }
+
+#if !defined(QT_OPENGL_ES_1)
+ if (system.toLower() == QLatin1String("opengl2")) {
+ QGL::setPreferredPaintEngine(QPaintEngine::OpenGL2);
+ return new QGLGraphicsSystem(false);
+ }
+#endif
+
+#if defined(Q_WS_X11) && !defined(QT_NO_EGL)
+ if (system.toLower() == QLatin1String("x11gl"))
+ return new QGLGraphicsSystem(true);
+#endif
+
+ if (system.toLower() == QLatin1String("opengl"))
+ return new QGLGraphicsSystem(false);
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(opengl, QGLGraphicsSystemPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/opengl/opengl.pro b/src/plugins/graphicssystems/opengl/opengl.pro
new file mode 100644
index 0000000000..47e15c5ec5
--- /dev/null
+++ b/src/plugins/graphicssystems/opengl/opengl.pro
@@ -0,0 +1,13 @@
+TARGET = qglgraphicssystem
+include(../../qpluginbase.pri)
+
+QT += opengl
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+
+SOURCES = main.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
+
+symbian: TARGET.UID3 = 0x2002131B
diff --git a/src/plugins/graphicssystems/openvg/main.cpp b/src/plugins/graphicssystems/openvg/main.cpp
new file mode 100644
index 0000000000..6cf368aba8
--- /dev/null
+++ b/src/plugins/graphicssystems/openvg/main.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qgraphicssystemplugin_p.h>
+#include "qgraphicssystem_vg_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QVGGraphicsSystemPlugin : public QGraphicsSystemPlugin
+{
+public:
+ QStringList keys() const;
+ QGraphicsSystem *create(const QString&);
+};
+
+QStringList QVGGraphicsSystemPlugin::keys() const
+{
+ QStringList list;
+ list << "OpenVG";
+ return list;
+}
+
+QGraphicsSystem* QVGGraphicsSystemPlugin::create(const QString& system)
+{
+ if (system.toLower() == "openvg")
+ return new QVGGraphicsSystem;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(openvg, QVGGraphicsSystemPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/openvg/openvg.pro b/src/plugins/graphicssystems/openvg/openvg.pro
new file mode 100644
index 0000000000..781cdc42e3
--- /dev/null
+++ b/src/plugins/graphicssystems/openvg/openvg.pro
@@ -0,0 +1,14 @@
+TARGET = qvggraphicssystem
+include(../../qpluginbase.pri)
+
+QT += openvg
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+
+SOURCES = main.cpp qgraphicssystem_vg.cpp
+HEADERS = qgraphicssystem_vg_p.h
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
+
+symbian: TARGET.UID3 = 0x2001E62C
diff --git a/src/plugins/graphicssystems/openvg/qgraphicssystem_vg.cpp b/src/plugins/graphicssystems/openvg/qgraphicssystem_vg.cpp
new file mode 100644
index 0000000000..4b4f677026
--- /dev/null
+++ b/src/plugins/graphicssystems/openvg/qgraphicssystem_vg.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgraphicssystem_vg_p.h"
+#include <QtOpenVG/private/qpixmapdata_vg_p.h>
+#include <QtOpenVG/private/qwindowsurface_vg_p.h>
+#include <QtOpenVG/private/qvgimagepool_p.h>
+#if defined(Q_OS_SYMBIAN)
+#include <QtGui/private/qwidget_p.h>
+#endif
+#include <QtGui/private/qapplication_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QVGGraphicsSystem::QVGGraphicsSystem()
+{
+ QApplicationPrivate::graphics_system_name = QLatin1String("openvg");
+}
+
+QPixmapData *QVGGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
+{
+#if !defined(QVG_NO_SINGLE_CONTEXT) && !defined(QVG_NO_PIXMAP_DATA)
+ // Pixmaps can use QVGPixmapData; bitmaps must use raster.
+ if (type == QPixmapData::PixmapType)
+ return new QVGPixmapData(type);
+ else
+ return new QRasterPixmapData(type);
+#else
+ return new QRasterPixmapData(type);
+#endif
+}
+
+QWindowSurface *QVGGraphicsSystem::createWindowSurface(QWidget *widget) const
+{
+#if defined(Q_OS_SYMBIAN)
+ if (!QApplicationPrivate::instance()->useTranslucentEGLSurfaces) {
+ QWidgetPrivate *d = qt_widget_private(widget);
+ if (!d->isOpaque && widget->testAttribute(Qt::WA_TranslucentBackground))
+ return d->createDefaultWindowSurface_sys();
+ }
+#endif
+ return new QVGWindowSurface(widget);
+}
+
+void QVGGraphicsSystem::releaseCachedResources()
+{
+ QVGImagePool::instance()->hibernate();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/openvg/qgraphicssystem_vg_p.h b/src/plugins/graphicssystems/openvg/qgraphicssystem_vg_p.h
new file mode 100644
index 0000000000..9c9b3e2b2e
--- /dev/null
+++ b/src/plugins/graphicssystems/openvg/qgraphicssystem_vg_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_VG_P_H
+#define QGRAPHICSSYSTEM_VG_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qgraphicssystem_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVGGraphicsSystem : public QGraphicsSystem
+{
+public:
+ QVGGraphicsSystem();
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QWindowSurface *createWindowSurface(QWidget *widget) const;
+
+ void releaseCachedResources();
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/graphicssystems/shivavg/README b/src/plugins/graphicssystems/shivavg/README
new file mode 100644
index 0000000000..15ee7101e8
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/README
@@ -0,0 +1,8 @@
+
+This graphics system uses ShivaVG (http://sourceforge.net/projects/shivavg)
+to perform OpenVG rendering on X11 systems. The graphics system name for
+the "-graphicssystem" command-line option is "ShivaVG".
+
+ShivaVG support is experimental, mostly to demonstrate how to integrate
+non-EGL OpenVG engines into the system. It will probably not produce
+good output.
diff --git a/src/plugins/graphicssystems/shivavg/main.cpp b/src/plugins/graphicssystems/shivavg/main.cpp
new file mode 100644
index 0000000000..2a95ed6afe
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/main.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qgraphicssystemplugin_p.h>
+#include "shivavggraphicssystem.h"
+
+QT_BEGIN_NAMESPACE
+
+class ShivaVGGraphicsSystemPlugin : public QGraphicsSystemPlugin
+{
+public:
+ QStringList keys() const;
+ QGraphicsSystem *create(const QString&);
+};
+
+QStringList ShivaVGGraphicsSystemPlugin::keys() const
+{
+ QStringList list;
+ list << "ShivaVG";
+ return list;
+}
+
+QGraphicsSystem* ShivaVGGraphicsSystemPlugin::create(const QString& system)
+{
+ if (system.toLower() == "shivavg")
+ return new ShivaVGGraphicsSystem;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(shivavg, ShivaVGGraphicsSystemPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/shivavg/shivavg.pro b/src/plugins/graphicssystems/shivavg/shivavg.pro
new file mode 100644
index 0000000000..b8ea12ac4a
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/shivavg.pro
@@ -0,0 +1,12 @@
+TARGET = qshivavggraphicssystem
+include(../../qpluginbase.pri)
+
+QT += openvg
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+
+SOURCES = main.cpp shivavggraphicssystem.cpp shivavgwindowsurface.cpp
+HEADERS = shivavggraphicssystem.h shivavgwindowsurface.h
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
diff --git a/src/plugins/graphicssystems/shivavg/shivavggraphicssystem.cpp b/src/plugins/graphicssystems/shivavg/shivavggraphicssystem.cpp
new file mode 100644
index 0000000000..ee6a15d894
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/shivavggraphicssystem.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "shivavggraphicssystem.h"
+#include "shivavgwindowsurface.h"
+#include <QtGui/private/qpixmap_raster_p.h>
+
+QT_BEGIN_NAMESPACE
+
+ShivaVGGraphicsSystem::ShivaVGGraphicsSystem()
+{
+}
+
+QPixmapData *ShivaVGGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QWindowSurface *ShivaVGGraphicsSystem::createWindowSurface(QWidget *widget) const
+{
+ return new ShivaVGWindowSurface(widget);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/shivavg/shivavggraphicssystem.h b/src/plugins/graphicssystems/shivavg/shivavggraphicssystem.h
new file mode 100644
index 0000000000..b51bd73abc
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/shivavggraphicssystem.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHIVAVGGRAPHICSSYSTEM_H
+#define SHIVAVGGRAPHICSSYSTEM_H
+
+#include <QtGui/private/qgraphicssystem_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class ShivaVGGraphicsSystem : public QGraphicsSystem
+{
+public:
+ ShivaVGGraphicsSystem();
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QWindowSurface *createWindowSurface(QWidget *widget) const;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp b/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp
new file mode 100644
index 0000000000..8e7a3e169f
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.cpp
@@ -0,0 +1,358 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#define GL_GLEXT_PROTOTYPES
+#include "shivavgwindowsurface.h"
+#include <QtOpenVG/private/qpaintengine_vg_p.h>
+#if defined(Q_WS_X11)
+#include "private/qt_x11_p.h"
+#include "qx11info_x11.h"
+#include <GL/glx.h>
+
+extern QX11Info *qt_x11Info(const QPaintDevice *pd);
+#endif
+
+// Define this to use framebuffer objects.
+//#define QVG_USE_FBO 1
+
+#include <vg/openvg.h>
+
+QT_BEGIN_NAMESPACE
+
+class QShivaContext
+{
+public:
+ QShivaContext();
+ ~QShivaContext();
+
+ bool makeCurrent(ShivaVGWindowSurfacePrivate *surface);
+ void doneCurrent();
+
+ bool initialized;
+ QSize currentSize;
+ ShivaVGWindowSurfacePrivate *currentSurface;
+};
+
+Q_GLOBAL_STATIC(QShivaContext, shivaContext);
+
+class ShivaVGWindowSurfacePrivate
+{
+public:
+ ShivaVGWindowSurfacePrivate()
+ : isCurrent(false)
+ , needsResize(true)
+ , engine(0)
+#if defined(QVG_USE_FBO)
+ , fbo(0)
+ , texture(0)
+#endif
+#if defined(Q_WS_X11)
+ , drawable(0)
+ , context(0)
+#endif
+ {
+ }
+ ~ShivaVGWindowSurfacePrivate();
+
+ void ensureContext(QWidget *widget);
+
+ QSize size;
+ bool isCurrent;
+ bool needsResize;
+ QVGPaintEngine *engine;
+#if defined(QVG_USE_FBO)
+ GLuint fbo;
+ GLuint texture;
+#endif
+#if defined(Q_WS_X11)
+ GLXDrawable drawable;
+ GLXContext context;
+#endif
+};
+
+QShivaContext::QShivaContext()
+ : initialized(false)
+ , currentSurface(0)
+{
+}
+
+QShivaContext::~QShivaContext()
+{
+ if (initialized)
+ vgDestroyContextSH();
+}
+
+bool QShivaContext::makeCurrent(ShivaVGWindowSurfacePrivate *surface)
+{
+ if (currentSurface)
+ currentSurface->isCurrent = false;
+ surface->isCurrent = true;
+ currentSurface = surface;
+ currentSize = surface->size;
+#if defined(Q_WS_X11)
+ glXMakeCurrent(X11->display, surface->drawable, surface->context);
+#endif
+ if (!initialized) {
+ if (!vgCreateContextSH(currentSize.width(), currentSize.height())) {
+ qWarning("vgCreateContextSH(%d, %d): could not create context", currentSize.width(), currentSize.height());
+ return false;
+ }
+ initialized = true;
+ } else {
+ vgResizeSurfaceSH(currentSize.width(), currentSize.height());
+ }
+#if defined(QVG_USE_FBO)
+ if (surface->fbo)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, surface->fbo);
+ else
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+#endif
+ return true;
+}
+
+void QShivaContext::doneCurrent()
+{
+ if (currentSurface) {
+ currentSurface->isCurrent = false;
+ currentSurface = 0;
+ }
+#if defined(Q_WS_X11)
+ glXMakeCurrent(X11->display, 0, 0);
+#endif
+}
+
+ShivaVGWindowSurfacePrivate::~ShivaVGWindowSurfacePrivate()
+{
+#if defined(QVG_USE_FBO)
+ if (fbo) {
+ glDeleteTextures(1, &texture);
+ glDeleteFramebuffersEXT(1, &fbo);
+ }
+#endif
+}
+
+void ShivaVGWindowSurfacePrivate::ensureContext(QWidget *widget)
+{
+#if defined(Q_WS_X11)
+ Window win = widget->winId();
+ if (win != drawable) {
+ if (context)
+ glXDestroyContext(X11->display, context);
+ drawable = win;
+ }
+ if (context == 0) {
+ const QX11Info *xinfo = qt_x11Info(widget);
+ int spec[64];
+ int i = 0;
+ spec[i++] = GLX_DOUBLEBUFFER;
+ spec[i++] = GLX_DEPTH_SIZE;
+ spec[i++] = 1;
+ spec[i++] = GLX_STENCIL_SIZE;
+ spec[i++] = 1;
+ spec[i++] = GLX_RGBA;
+ spec[i++] = GLX_RED_SIZE;
+ spec[i++] = 1;
+ spec[i++] = GLX_GREEN_SIZE;
+ spec[i++] = 1;
+ spec[i++] = GLX_BLUE_SIZE;
+ spec[i++] = 1;
+ spec[i++] = GLX_SAMPLE_BUFFERS_ARB;
+ spec[i++] = 1;
+ spec[i++] = GLX_SAMPLES_ARB;
+ spec[i++] = 4;
+ spec[i] = XNone;
+ XVisualInfo *visual = glXChooseVisual
+ (xinfo->display(), xinfo->screen(), spec);
+ context = glXCreateContext(X11->display, visual, 0, True);
+ if (!context)
+ qWarning("glXCreateContext: could not create GL context for VG rendering");
+ }
+#else
+ Q_UNUSED(widget);
+#endif
+#if defined(QVG_USE_FBO)
+ if (needsResize && fbo) {
+#if defined(Q_WS_X11)
+ glXMakeCurrent(X11->display, drawable, context);
+#endif
+ glDeleteTextures(1, &texture);
+ glDeleteFramebuffersEXT(1, &fbo);
+#if defined(Q_WS_X11)
+ glXMakeCurrent(X11->display, 0, 0);
+#endif
+ fbo = 0;
+ texture = 0;
+ }
+ if (!fbo) {
+#if defined(Q_WS_X11)
+ glXMakeCurrent(X11->display, drawable, context);
+#endif
+ glGenFramebuffersEXT(1, &fbo);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
+
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size.width(), size.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glFramebufferTexture2DEXT
+ (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,
+ texture, 0);
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+#if defined(Q_WS_X11)
+ glXMakeCurrent(X11->display, 0, 0);
+#endif
+ }
+#endif
+ needsResize = false;
+}
+
+ShivaVGWindowSurface::ShivaVGWindowSurface(QWidget *window)
+ : QWindowSurface(window), d_ptr(new ShivaVGWindowSurfacePrivate)
+{
+}
+
+ShivaVGWindowSurface::~ShivaVGWindowSurface()
+{
+ if (d_ptr->isCurrent) {
+ shivaContext()->doneCurrent();
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ }
+#if defined(Q_WS_X11)
+ if (d_ptr->context)
+ glXDestroyContext(X11->display, d_ptr->context);
+#endif
+ delete d_ptr;
+}
+
+QPaintDevice *ShivaVGWindowSurface::paintDevice()
+{
+ d_ptr->ensureContext(window());
+ shivaContext()->makeCurrent(d_ptr);
+ glClearDepth(0.0f);
+ glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ return this;
+}
+
+void ShivaVGWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+ QWidget *parent = widget->internalWinId() ? widget : widget->nativeParentWidget();
+ d_ptr->ensureContext(parent);
+ QShivaContext *context = shivaContext();
+ if (!d_ptr->isCurrent)
+ context->makeCurrent(d_ptr);
+#if defined(QVG_USE_FBO)
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ if (d_ptr->fbo) {
+ static GLfloat const vertices[][2] = {
+ {-1, -1}, {1, -1}, {1, 1}, {-1, 1}
+ };
+ static GLfloat const texCoords[][2] = {
+ {0, 0}, {1, 0}, {1, 1}, {0, 1}
+ };
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glVertexPointer(2, GL_FLOAT, 0, vertices);
+ glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
+ glBindTexture(GL_TEXTURE_2D, d_ptr->texture);
+ glEnable(GL_TEXTURE_2D);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ }
+#endif
+#if defined(Q_WS_X11)
+ glXSwapBuffers(X11->display, d_ptr->drawable);
+#endif
+ context->doneCurrent();
+}
+
+void ShivaVGWindowSurface::setGeometry(const QRect &rect)
+{
+ QWindowSurface::setGeometry(rect);
+ d_ptr->needsResize = true;
+ d_ptr->size = rect.size();
+}
+
+bool ShivaVGWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ return QWindowSurface::scroll(area, dx, dy);
+}
+
+void ShivaVGWindowSurface::beginPaint(const QRegion &region)
+{
+ // Nothing to do here.
+ Q_UNUSED(region);
+}
+
+void ShivaVGWindowSurface::endPaint(const QRegion &region)
+{
+ // Nothing to do here.
+ Q_UNUSED(region);
+}
+
+Q_GLOBAL_STATIC(QVGPaintEngine, sharedPaintEngine);
+
+QPaintEngine *ShivaVGWindowSurface::paintEngine() const
+{
+ if (!d_ptr->engine)
+ d_ptr->engine = sharedPaintEngine();
+ return d_ptr->engine;
+}
+
+int ShivaVGWindowSurface::metric(PaintDeviceMetric met) const
+{
+ return qt_paint_device_metric(window(), met);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.h b/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.h
new file mode 100644
index 0000000000..8b1649ab17
--- /dev/null
+++ b/src/plugins/graphicssystems/shivavg/shivavgwindowsurface.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHIVAVGWINDOWSURFACE_H
+#define SHIVAVGWINDOWSURFACE_H
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class ShivaVGWindowSurfacePrivate;
+
+class ShivaVGWindowSurface : public QWindowSurface, public QPaintDevice
+{
+public:
+ ShivaVGWindowSurface(QWidget *window);
+ virtual ~ShivaVGWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void setGeometry(const QRect &rect);
+ bool scroll(const QRegion &area, int dx, int dy);
+
+ void beginPaint(const QRegion &region);
+ void endPaint(const QRegion &region);
+
+ QPaintEngine *paintEngine() const;
+
+protected:
+ int metric(PaintDeviceMetric metric) const;
+
+private:
+ ShivaVGWindowSurfacePrivate *d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/graphicssystems/trace/main.cpp b/src/plugins/graphicssystems/trace/main.cpp
new file mode 100644
index 0000000000..2a84d0bdce
--- /dev/null
+++ b/src/plugins/graphicssystems/trace/main.cpp
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qgraphicssystemplugin_p.h>
+#include "qgraphicssystem_trace_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QTraceGraphicsSystemPlugin : public QGraphicsSystemPlugin
+{
+public:
+ QStringList keys() const;
+ QGraphicsSystem *create(const QString&);
+};
+
+QStringList QTraceGraphicsSystemPlugin::keys() const
+{
+ return QStringList(QLatin1String("Trace"));
+}
+
+QGraphicsSystem* QTraceGraphicsSystemPlugin::create(const QString& system)
+{
+ if (system.toLower() == QLatin1String("trace"))
+ return new QTraceGraphicsSystem;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(trace, QTraceGraphicsSystemPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp b/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp
new file mode 100644
index 0000000000..62b6992f84
--- /dev/null
+++ b/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp
@@ -0,0 +1,153 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgraphicssystem_trace_p.h"
+#include <private/qpixmap_raster_p.h>
+#include <private/qpaintbuffer_p.h>
+#include <private/qwindowsurface_raster_p.h>
+
+#include <QFile>
+#include <QPainter>
+#include <QtDebug>
+
+QT_BEGIN_NAMESPACE
+
+class QTraceWindowSurface : public QRasterWindowSurface
+{
+public:
+ QTraceWindowSurface(QWidget *widget);
+ ~QTraceWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void beginPaint(const QRegion &rgn);
+ void endPaint(const QRegion &rgn);
+
+ bool scroll(const QRegion &area, int dx, int dy);
+
+private:
+ QPaintBuffer *buffer;
+ QList<QRegion> updates;
+
+ qulonglong winId;
+};
+
+QTraceWindowSurface::QTraceWindowSurface(QWidget *widget)
+ : QRasterWindowSurface(widget)
+ , buffer(0)
+ , winId(0)
+{
+}
+
+QTraceWindowSurface::~QTraceWindowSurface()
+{
+ if (buffer) {
+ QFile outputFile(QString(QLatin1String("qtgraphics-%0.trace")).arg(winId));
+ if (outputFile.open(QIODevice::WriteOnly)) {
+ QDataStream out(&outputFile);
+ out.setFloatingPointPrecision(QDataStream::SinglePrecision);
+
+ out.writeBytes("qttraceV2", 9);
+
+ uint version = 1;
+
+ out << version << *buffer << updates;
+ }
+ delete buffer;
+ }
+}
+
+QPaintDevice *QTraceWindowSurface::paintDevice()
+{
+ if (!buffer) {
+ buffer = new QPaintBuffer;
+#ifdef Q_WS_QPA
+ buffer->setBoundingRect(QRect(QPoint(), size()));
+#else
+ buffer->setBoundingRect(geometry());
+#endif
+ }
+ return buffer;
+}
+
+void QTraceWindowSurface::beginPaint(const QRegion &rgn)
+{
+ // ensure paint buffer is created
+ paintDevice();
+ buffer->beginNewFrame();
+
+ QRasterWindowSurface::beginPaint(rgn);
+}
+
+void QTraceWindowSurface::endPaint(const QRegion &rgn)
+{
+ QPainter p(QRasterWindowSurface::paintDevice());
+ buffer->draw(&p, buffer->numFrames()-1);
+ p.end();
+
+ winId = (qulonglong)window()->winId();
+
+ updates << rgn;
+
+ QRasterWindowSurface::endPaint(rgn);
+}
+
+bool QTraceWindowSurface::scroll(const QRegion &, int, int)
+{
+ // TODO: scrolling should also be streamed and replayed
+ // to test scrolling performance
+ return false;
+}
+
+QTraceGraphicsSystem::QTraceGraphicsSystem()
+{
+}
+
+QPixmapData *QTraceGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QWindowSurface *QTraceGraphicsSystem::createWindowSurface(QWidget *widget) const
+{
+ return new QTraceWindowSurface(widget);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/trace/qgraphicssystem_trace_p.h b/src/plugins/graphicssystems/trace/qgraphicssystem_trace_p.h
new file mode 100644
index 0000000000..e5ab4af147
--- /dev/null
+++ b/src/plugins/graphicssystems/trace/qgraphicssystem_trace_p.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_TRACE_P_H
+#define QGRAPHICSSYSTEM_TRACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qgraphicssystem_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTraceGraphicsSystem : public QGraphicsSystem
+{
+public:
+ QTraceGraphicsSystem();
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QWindowSurface *createWindowSurface(QWidget *widget) const;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/graphicssystems/trace/trace.pro b/src/plugins/graphicssystems/trace/trace.pro
new file mode 100644
index 0000000000..07472e2daf
--- /dev/null
+++ b/src/plugins/graphicssystems/trace/trace.pro
@@ -0,0 +1,13 @@
+TARGET = qtracegraphicssystem
+include(../../qpluginbase.pri)
+
+QT += network
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+symbian:TARGET.UID3 = 0x2002130E
+
+SOURCES = main.cpp qgraphicssystem_trace.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
+INCLUDEPATH += ../../../3rdparty/harfbuzz/src
diff --git a/src/plugins/imageformats/gif/gif.pro b/src/plugins/imageformats/gif/gif.pro
new file mode 100644
index 0000000000..439b43136c
--- /dev/null
+++ b/src/plugins/imageformats/gif/gif.pro
@@ -0,0 +1,11 @@
+TARGET = qgif
+include(../../qpluginbase.pri)
+
+include(../../../gui/image/qgifhandler.pri)
+SOURCES += $$PWD/main.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats
+target.path += $$[QT_INSTALL_PLUGINS]/imageformats
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001E61A
diff --git a/src/plugins/imageformats/gif/main.cpp b/src/plugins/imageformats/gif/main.cpp
new file mode 100644
index 0000000000..ead617a4bf
--- /dev/null
+++ b/src/plugins/imageformats/gif/main.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_GIF
+#undef QT_NO_IMAGEFORMAT_GIF
+#endif
+#include <qgifhandler_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QGifPlugin : public QImageIOPlugin
+{
+public:
+ QGifPlugin();
+ ~QGifPlugin();
+
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QGifPlugin::QGifPlugin()
+{
+}
+
+QGifPlugin::~QGifPlugin()
+{
+}
+
+QStringList QGifPlugin::keys() const
+{
+ return QStringList() << QLatin1String("gif");
+}
+
+QImageIOPlugin::Capabilities QGifPlugin::capabilities(QIODevice *device, const QByteArray &format) const
+{
+ if (format == "gif" || (device && device->isReadable() && QGifHandler::canRead(device)))
+ return Capabilities(CanRead);
+ return 0;
+}
+
+QImageIOHandler *QGifPlugin::create(QIODevice *device, const QByteArray &format) const
+{
+ QImageIOHandler *handler = new QGifHandler;
+ handler->setDevice(device);
+ handler->setFormat(format);
+ return handler;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QGifPlugin)
+Q_EXPORT_PLUGIN2(qgif, QGifPlugin)
+
+#endif // QT_NO_IMAGEFORMATPLUGIN
+
+QT_END_NAMESPACE
diff --git a/src/plugins/imageformats/ico/ico.pro b/src/plugins/imageformats/ico/ico.pro
new file mode 100644
index 0000000000..eadff416e3
--- /dev/null
+++ b/src/plugins/imageformats/ico/ico.pro
@@ -0,0 +1,14 @@
+TARGET = qico
+include(../../qpluginbase.pri)
+
+QTDIR_build:REQUIRES = "!contains(QT_CONFIG, no-ico)"
+
+HEADERS += qicohandler.h
+SOURCES += main.cpp \
+ qicohandler.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats
+target.path += $$[QT_INSTALL_PLUGINS]/imageformats
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001E616
diff --git a/src/plugins/imageformats/ico/main.cpp b/src/plugins/imageformats/ico/main.cpp
new file mode 100644
index 0000000000..dad566d923
--- /dev/null
+++ b/src/plugins/imageformats/ico/main.cpp
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qdebug.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_ICO
+#undef QT_NO_IMAGEFORMAT_ICO
+#endif
+#include "qicohandler.h"
+
+QT_BEGIN_NAMESPACE
+
+class QICOPlugin : public QImageIOPlugin
+{
+public:
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QStringList QICOPlugin::keys() const
+{
+ return QStringList() << QLatin1String("ico");
+}
+
+QImageIOPlugin::Capabilities QICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const
+{
+ if (format == "ico")
+ return Capabilities(CanRead | CanWrite);
+ if (!format.isEmpty())
+ return 0;
+ if (!device->isOpen())
+ return 0;
+
+ Capabilities cap;
+ if (device->isReadable() && QtIcoHandler::canRead(device))
+ cap |= CanRead;
+ if (device->isWritable())
+ cap |= CanWrite;
+ return cap;
+}
+
+QImageIOHandler *QICOPlugin::create(QIODevice *device, const QByteArray &format) const
+{
+ QImageIOHandler *handler = new QtIcoHandler(device);
+
+ handler->setFormat(format);
+ return handler;
+}
+
+Q_EXPORT_PLUGIN2(qico, QICOPlugin)
+
+QT_END_NAMESPACE
+
+#endif /* QT_NO_IMAGEFORMATPLUGIN */
diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp
new file mode 100644
index 0000000000..701207d839
--- /dev/null
+++ b/src/plugins/imageformats/ico/qicohandler.cpp
@@ -0,0 +1,899 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \class QtIcoHandler
+ \since 4.4
+ \brief The QtIcoHandler class provides support for the ICO image format.
+ \internal
+*/
+
+
+
+#include "qicohandler.h"
+#include <QtCore/qendian.h>
+#include <QtGui/QImage>
+#include <QtCore/QFile>
+#include <QtCore/QBuffer>
+#include <qvariant.h>
+
+QT_BEGIN_NAMESPACE
+
+// These next two structs represent how the icon information is stored
+// in an ICO file.
+typedef struct
+{
+ quint8 bWidth; // Width of the image
+ quint8 bHeight; // Height of the image (times 2)
+ quint8 bColorCount; // Number of colors in image (0 if >=8bpp) [ not ture ]
+ quint8 bReserved; // Reserved
+ quint16 wPlanes; // Color Planes
+ quint16 wBitCount; // Bits per pixel
+ quint32 dwBytesInRes; // how many bytes in this resource?
+ quint32 dwImageOffset; // where in the file is this image
+} ICONDIRENTRY, *LPICONDIRENTRY;
+#define ICONDIRENTRY_SIZE 16
+
+typedef struct
+{
+ quint16 idReserved; // Reserved
+ quint16 idType; // resource type (1 for icons)
+ quint16 idCount; // how many images?
+ ICONDIRENTRY idEntries[1]; // the entries for each image
+} ICONDIR, *LPICONDIR;
+#define ICONDIR_SIZE 6 // Exclude the idEntries field
+
+typedef struct { // BMP information header
+ quint32 biSize; // size of this struct
+ quint32 biWidth; // pixmap width
+ quint32 biHeight; // pixmap height (specifies the combined height of the XOR and AND masks)
+ quint16 biPlanes; // should be 1
+ quint16 biBitCount; // number of bits per pixel
+ quint32 biCompression; // compression method
+ quint32 biSizeImage; // size of image
+ quint32 biXPelsPerMeter; // horizontal resolution
+ quint32 biYPelsPerMeter; // vertical resolution
+ quint32 biClrUsed; // number of colors used
+ quint32 biClrImportant; // number of important colors
+} BMP_INFOHDR ,*LPBMP_INFOHDR;
+#define BMP_INFOHDR_SIZE 40
+
+class ICOReader
+{
+public:
+ ICOReader(QIODevice * iodevice);
+ int count();
+ QImage iconAt(int index);
+ static bool canRead(QIODevice *iodev);
+
+ static QList<QImage> read(QIODevice * device);
+
+ static bool write(QIODevice * device, const QList<QImage> & images);
+
+private:
+ bool readHeader();
+ bool readIconEntry(int index, ICONDIRENTRY * iconEntry);
+
+ bool readBMPHeader(quint32 imageOffset, BMP_INFOHDR * header);
+ void findColorInfo(QImage & image);
+ void readColorTable(QImage & image);
+
+ void readBMP(QImage & image);
+ void read1BitBMP(QImage & image);
+ void read4BitBMP(QImage & image);
+ void read8BitBMP(QImage & image);
+ void read16_24_32BMP(QImage & image);
+
+ struct IcoAttrib
+ {
+ int nbits;
+ int ncolors;
+ int h;
+ int w;
+ int depth;
+ } icoAttrib;
+
+ QIODevice * iod;
+ qint64 startpos;
+ bool headerRead;
+ ICONDIR iconDir;
+
+};
+
+// Data readers and writers that takes care of alignment and endian stuff.
+static bool readIconDirEntry(QIODevice *iodev, ICONDIRENTRY *iconDirEntry)
+{
+ if (iodev) {
+ uchar tmp[ICONDIRENTRY_SIZE];
+ if (iodev->read((char*)tmp, ICONDIRENTRY_SIZE) == ICONDIRENTRY_SIZE) {
+ iconDirEntry->bWidth = tmp[0];
+ iconDirEntry->bHeight = tmp[1];
+ iconDirEntry->bColorCount = tmp[2];
+ iconDirEntry->bReserved = tmp[3];
+
+ iconDirEntry->wPlanes = qFromLittleEndian<quint16>(&tmp[4]);
+ iconDirEntry->wBitCount = qFromLittleEndian<quint16>(&tmp[6]);
+ iconDirEntry->dwBytesInRes = qFromLittleEndian<quint32>(&tmp[8]);
+ iconDirEntry->dwImageOffset = qFromLittleEndian<quint32>(&tmp[12]);
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool writeIconDirEntry(QIODevice *iodev, const ICONDIRENTRY &iconEntry)
+{
+ if (iodev) {
+ uchar tmp[ICONDIRENTRY_SIZE];
+ tmp[0] = iconEntry.bWidth;
+ tmp[1] = iconEntry.bHeight;
+ tmp[2] = iconEntry.bColorCount;
+ tmp[3] = iconEntry.bReserved;
+ qToLittleEndian<quint16>(iconEntry.wPlanes, &tmp[4]);
+ qToLittleEndian<quint16>(iconEntry.wBitCount, &tmp[6]);
+ qToLittleEndian<quint32>(iconEntry.dwBytesInRes, &tmp[8]);
+ qToLittleEndian<quint32>(iconEntry.dwImageOffset, &tmp[12]);
+ return (iodev->write((char*)tmp, ICONDIRENTRY_SIZE) == ICONDIRENTRY_SIZE) ? true : false;
+ }
+
+ return false;
+}
+
+static bool readIconDir(QIODevice *iodev, ICONDIR *iconDir)
+{
+ if (iodev) {
+ uchar tmp[ICONDIR_SIZE];
+ if (iodev->read((char*)tmp, ICONDIR_SIZE) == ICONDIR_SIZE) {
+ iconDir->idReserved = qFromLittleEndian<quint16>(&tmp[0]);
+ iconDir->idType = qFromLittleEndian<quint16>(&tmp[2]);
+ iconDir->idCount = qFromLittleEndian<quint16>(&tmp[4]);
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool writeIconDir(QIODevice *iodev, const ICONDIR &iconDir)
+{
+ if (iodev) {
+ uchar tmp[6];
+ qToLittleEndian(iconDir.idReserved, tmp);
+ qToLittleEndian(iconDir.idType, &tmp[2]);
+ qToLittleEndian(iconDir.idCount, &tmp[4]);
+ return (iodev->write((char*)tmp, 6) == 6) ? true : false;
+ }
+ return false;
+}
+
+static bool readBMPInfoHeader(QIODevice *iodev, BMP_INFOHDR *pHeader)
+{
+ if (iodev) {
+ uchar header[BMP_INFOHDR_SIZE];
+ if (iodev->read((char*)header, BMP_INFOHDR_SIZE) == BMP_INFOHDR_SIZE) {
+ pHeader->biSize = qFromLittleEndian<quint32>(&header[0]);
+ pHeader->biWidth = qFromLittleEndian<quint32>(&header[4]);
+ pHeader->biHeight = qFromLittleEndian<quint32>(&header[8]);
+ pHeader->biPlanes = qFromLittleEndian<quint16>(&header[12]);
+ pHeader->biBitCount = qFromLittleEndian<quint16>(&header[14]);
+ pHeader->biCompression = qFromLittleEndian<quint32>(&header[16]);
+ pHeader->biSizeImage = qFromLittleEndian<quint32>(&header[20]);
+ pHeader->biXPelsPerMeter = qFromLittleEndian<quint32>(&header[24]);
+ pHeader->biYPelsPerMeter = qFromLittleEndian<quint32>(&header[28]);
+ pHeader->biClrUsed = qFromLittleEndian<quint32>(&header[32]);
+ pHeader->biClrImportant = qFromLittleEndian<quint32>(&header[36]);
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool writeBMPInfoHeader(QIODevice *iodev, const BMP_INFOHDR &header)
+{
+ if (iodev) {
+ uchar tmp[BMP_INFOHDR_SIZE];
+ qToLittleEndian<quint32>(header.biSize, &tmp[0]);
+ qToLittleEndian<quint32>(header.biWidth, &tmp[4]);
+ qToLittleEndian<quint32>(header.biHeight, &tmp[8]);
+ qToLittleEndian<quint16>(header.biPlanes, &tmp[12]);
+ qToLittleEndian<quint16>(header.biBitCount, &tmp[14]);
+ qToLittleEndian<quint32>(header.biCompression, &tmp[16]);
+ qToLittleEndian<quint32>(header.biSizeImage, &tmp[20]);
+ qToLittleEndian<quint32>(header.biXPelsPerMeter, &tmp[24]);
+ qToLittleEndian<quint32>(header.biYPelsPerMeter, &tmp[28]);
+ qToLittleEndian<quint32>(header.biClrUsed, &tmp[32]);
+ qToLittleEndian<quint32>(header.biClrImportant, &tmp[36]);
+
+ return (iodev->write((char*)tmp, BMP_INFOHDR_SIZE) == BMP_INFOHDR_SIZE) ? true : false;
+ }
+ return false;
+}
+
+
+ICOReader::ICOReader(QIODevice * iodevice)
+: iod(iodevice)
+, startpos(0)
+, headerRead(false)
+{
+}
+
+
+int ICOReader::count()
+{
+ if (readHeader())
+ return iconDir.idCount;
+ return 0;
+}
+
+bool ICOReader::canRead(QIODevice *iodev)
+{
+ bool isProbablyICO = false;
+ if (iodev) {
+ qint64 oldPos = iodev->pos();
+
+ ICONDIR ikonDir;
+ if (readIconDir(iodev, &ikonDir)) {
+ qint64 readBytes = ICONDIR_SIZE;
+ if (readIconDirEntry(iodev, &ikonDir.idEntries[0])) {
+ readBytes += ICONDIRENTRY_SIZE;
+ // ICO format does not have a magic identifier, so we read 6 different values, which will hopefully be enough to identify the file.
+ if ( ikonDir.idReserved == 0
+ && ikonDir.idType == 1
+ && ikonDir.idEntries[0].bReserved == 0
+ && ikonDir.idEntries[0].wPlanes <= 1
+ && ikonDir.idEntries[0].wBitCount <= 32 // Bits per pixel
+ && ikonDir.idEntries[0].dwBytesInRes >= 40 // Must be over 40, since sizeof (infoheader) == 40
+ ) {
+ isProbablyICO = true;
+ }
+
+ if (iodev->isSequential()) {
+ // Our structs might be padded due to alignment, so we need to fetch each member before we ungetChar() !
+ quint32 tmp = ikonDir.idEntries[0].dwImageOffset;
+ iodev->ungetChar((tmp >> 24) & 0xff);
+ iodev->ungetChar((tmp >> 16) & 0xff);
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+
+ tmp = ikonDir.idEntries[0].dwBytesInRes;
+ iodev->ungetChar((tmp >> 24) & 0xff);
+ iodev->ungetChar((tmp >> 16) & 0xff);
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+
+ tmp = ikonDir.idEntries[0].wBitCount;
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+
+ tmp = ikonDir.idEntries[0].wPlanes;
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+
+ iodev->ungetChar(ikonDir.idEntries[0].bReserved);
+ iodev->ungetChar(ikonDir.idEntries[0].bColorCount);
+ iodev->ungetChar(ikonDir.idEntries[0].bHeight);
+ iodev->ungetChar(ikonDir.idEntries[0].bWidth);
+ }
+ }
+
+ if (iodev->isSequential()) {
+ // Our structs might be padded due to alignment, so we need to fetch each member before we ungetChar() !
+ quint32 tmp = ikonDir.idCount;
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+
+ tmp = ikonDir.idType;
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+
+ tmp = ikonDir.idReserved;
+ iodev->ungetChar((tmp >> 8) & 0xff);
+ iodev->ungetChar(tmp & 0xff);
+ }
+ }
+ if (!iodev->isSequential()) iodev->seek(oldPos);
+ }
+
+ return isProbablyICO;
+}
+
+bool ICOReader::readHeader()
+{
+ if (iod && !headerRead) {
+ startpos = iod->pos();
+ if (readIconDir(iod, &iconDir)) {
+ if (iconDir.idReserved == 0 || iconDir.idType == 1)
+ headerRead = true;
+ }
+ }
+
+ return headerRead;
+}
+
+bool ICOReader::readIconEntry(int index, ICONDIRENTRY *iconEntry)
+{
+ if (iod) {
+ if (iod->seek(startpos + ICONDIR_SIZE + (index * ICONDIRENTRY_SIZE))) {
+ return readIconDirEntry(iod, iconEntry);
+ }
+ }
+ return false;
+}
+
+
+
+bool ICOReader::readBMPHeader(quint32 imageOffset, BMP_INFOHDR * header)
+{
+ if (iod) {
+ if (iod->seek(startpos + imageOffset)) {
+ if (readBMPInfoHeader(iod, header)) {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void ICOReader::findColorInfo(QImage & image)
+{
+ if (icoAttrib.ncolors > 0) { // set color table
+ readColorTable(image);
+ } else if (icoAttrib.nbits == 16) { // don't support RGB values for 15/16 bpp
+ image = QImage();
+ }
+}
+
+void ICOReader::readColorTable(QImage & image)
+{
+ if (iod) {
+ image.setColorCount(icoAttrib.ncolors);
+ uchar rgb[4];
+ for (int i=0; i<icoAttrib.ncolors; i++) {
+ if (iod->read((char*)rgb, 4) != 4) {
+ image = QImage();
+ break;
+ }
+ image.setColor(i, qRgb(rgb[2],rgb[1],rgb[0]));
+ }
+ } else {
+ image = QImage();
+ }
+}
+
+void ICOReader::readBMP(QImage & image)
+{
+ if (icoAttrib.nbits == 1) { // 1 bit BMP image
+ read1BitBMP(image);
+ } else if (icoAttrib.nbits == 4) { // 4 bit BMP image
+ read4BitBMP(image);
+ } else if (icoAttrib.nbits == 8) {
+ read8BitBMP(image);
+ } else if (icoAttrib.nbits == 16 || icoAttrib.nbits == 24 || icoAttrib.nbits == 32 ) { // 16,24,32 bit BMP image
+ read16_24_32BMP(image);
+ }
+}
+
+
+/**
+ * NOTE: A 1 bit BMP is only flipped vertically, and not horizontally like all other color depths!
+ * (This is the same with the bitmask)
+ *
+ */
+void ICOReader::read1BitBMP(QImage & image)
+{
+ if (iod) {
+
+ int h = image.height();
+ int bpl = image.bytesPerLine();
+
+ while (--h >= 0) {
+ if (iod->read((char*)image.scanLine(h),bpl) != bpl) {
+ image = QImage();
+ break;
+ }
+ }
+ } else {
+ image = QImage();
+ }
+}
+
+void ICOReader::read4BitBMP(QImage & image)
+{
+ if (iod) {
+
+ int h = icoAttrib.h;
+ int buflen = ((icoAttrib.w+7)/8)*4;
+ uchar *buf = new uchar[buflen];
+ Q_CHECK_PTR(buf);
+
+ while (--h >= 0) {
+ if (iod->read((char*)buf,buflen) != buflen) {
+ image = QImage();
+ break;
+ }
+ register uchar *p = image.scanLine(h);
+ uchar *b = buf;
+ for (int i=0; i<icoAttrib.w/2; i++) { // convert nibbles to bytes
+ *p++ = *b >> 4;
+ *p++ = *b++ & 0x0f;
+ }
+ if (icoAttrib.w & 1) // the last nibble
+ *p = *b >> 4;
+ }
+
+ delete [] buf;
+
+ } else {
+ image = QImage();
+ }
+}
+
+void ICOReader::read8BitBMP(QImage & image)
+{
+ if (iod) {
+
+ int h = icoAttrib.h;
+ int bpl = image.bytesPerLine();
+
+ while (--h >= 0) {
+ if (iod->read((char *)image.scanLine(h), bpl) != bpl) {
+ image = QImage();
+ break;
+ }
+ }
+ } else {
+ image = QImage();
+ }
+}
+
+void ICOReader::read16_24_32BMP(QImage & image)
+{
+ if (iod) {
+ int h = icoAttrib.h;
+ register QRgb *p;
+ QRgb *end;
+ uchar *buf = new uchar[image.bytesPerLine()];
+ int bpl = ((icoAttrib.w*icoAttrib.nbits+31)/32)*4;
+ uchar *b;
+
+ while (--h >= 0) {
+ p = (QRgb *)image.scanLine(h);
+ end = p + icoAttrib.w;
+ if (iod->read((char *)buf, bpl) != bpl) {
+ image = QImage();
+ break;
+ }
+ b = buf;
+ while (p < end) {
+ if (icoAttrib.nbits == 24)
+ *p++ = qRgb(*(b+2), *(b+1), *b);
+ else if (icoAttrib.nbits == 32)
+ *p++ = qRgba(*(b+2), *(b+1), *b, *(b+3));
+ b += icoAttrib.nbits/8;
+ }
+ }
+
+ delete[] buf;
+
+ } else {
+ image = QImage();
+ }
+}
+
+QImage ICOReader::iconAt(int index)
+{
+ QImage img;
+
+ if (count() > index) { // forces header to be read
+
+ ICONDIRENTRY iconEntry;
+ if (readIconEntry(index, &iconEntry)) {
+
+ static const uchar pngMagicData[] = { 137, 80, 78, 71, 13, 10, 26, 10 };
+
+ iod->seek(iconEntry.dwImageOffset);
+
+ const QByteArray pngMagic = QByteArray::fromRawData((char*)pngMagicData, sizeof(pngMagicData));
+ const bool isPngImage = (iod->read(pngMagic.size()) == pngMagic);
+
+ if (isPngImage) {
+ iod->seek(iconEntry.dwImageOffset);
+ return QImage::fromData(iod->read(iconEntry.dwBytesInRes), "png");
+ }
+
+ BMP_INFOHDR header;
+ if (readBMPHeader(iconEntry.dwImageOffset, &header)) {
+ icoAttrib.nbits = header.biBitCount ? header.biBitCount : iconEntry.wBitCount;
+
+ switch (icoAttrib.nbits) {
+ case 32:
+ case 24:
+ case 16:
+ icoAttrib.depth = 32;
+ break;
+ case 8:
+ case 4:
+ icoAttrib.depth = 8;
+ break;
+ default:
+ icoAttrib.depth = 1;
+ }
+ if (icoAttrib.depth == 32) // there's no colormap
+ icoAttrib.ncolors = 0;
+ else // # colors used
+ icoAttrib.ncolors = header.biClrUsed ? header.biClrUsed : 1 << icoAttrib.nbits;
+ if (icoAttrib.ncolors > 256) //color table can't be more than 256
+ return img;
+ icoAttrib.w = iconEntry.bWidth;
+ if (icoAttrib.w == 0)
+ icoAttrib.w = header.biWidth;
+ icoAttrib.h = iconEntry.bHeight;
+ if (icoAttrib.h == 0)
+ icoAttrib.h = header.biHeight/2;
+
+ QImage::Format format = QImage::Format_ARGB32;
+ if (icoAttrib.nbits == 24)
+ format = QImage::Format_RGB32;
+ else if (icoAttrib.ncolors == 2)
+ format = QImage::Format_Mono;
+ else if (icoAttrib.ncolors > 0)
+ format = QImage::Format_Indexed8;
+
+ QImage image(icoAttrib.w, icoAttrib.h, format);
+ if (!image.isNull()) {
+ findColorInfo(image);
+ if (!image.isNull()) {
+ readBMP(image);
+ if (!image.isNull()) {
+ QImage mask(image.width(), image.height(), QImage::Format_Mono);
+ if (!mask.isNull()) {
+ mask.setColorCount(2);
+ mask.setColor(0, qRgba(255,255,255,0xff));
+ mask.setColor(1, qRgba(0 ,0 ,0 ,0xff));
+ read1BitBMP(mask);
+ if (!mask.isNull()) {
+ img = QImage(image.width(), image.height(), QImage::Format_ARGB32 );
+ img = image;
+ img.setAlphaChannel(mask);
+ // (Luckily, it seems that setAlphaChannel() does not ruin the alpha values
+ // of partially transparent pixels in those icons that have that)
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return img;
+}
+
+
+/*!
+ Reads all the icons from the given \a device, and returns them as
+ a list of QImage objects.
+
+ Each image has an alpha channel that represents the mask from the
+ corresponding icon.
+
+ \sa write()
+*/
+QList<QImage> ICOReader::read(QIODevice * device)
+{
+ QList<QImage> images;
+
+ ICOReader reader(device);
+ for (int i = 0; i < reader.count(); i++)
+ images += reader.iconAt(i);
+
+ return images;
+}
+
+
+/*!
+ Writes all the QImages in the \a images list to the given \a
+ device. Returns true if the images are written successfully;
+ otherwise returns false.
+
+ The first image in the list is stored as the first icon in the
+ device, and is therefore used as the default icon by applications.
+ The alpha channel of each image is converted to a mask for each
+ corresponding icon.
+
+ \sa read()
+*/
+bool ICOReader::write(QIODevice * device, const QList<QImage> & images)
+{
+ bool retValue = false;
+
+ if (images.count()) {
+
+ qint64 origOffset = device->pos();
+
+ ICONDIR id;
+ id.idReserved = 0;
+ id.idType = 1;
+ id.idCount = images.count();
+
+ ICONDIRENTRY * entries = new ICONDIRENTRY[id.idCount];
+ BMP_INFOHDR * bmpHeaders = new BMP_INFOHDR[id.idCount];
+ QByteArray * imageData = new QByteArray[id.idCount];
+
+ for (int i=0; i<id.idCount; i++) {
+
+ QImage image = images[i];
+ // Scale down the image if it is larger than 128 pixels in either width or height
+ if (image.width() > 128 || image.height() > 128)
+ {
+ image = image.scaled(128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ }
+ QImage maskImage(image.width(), image.height(), QImage::Format_Mono);
+ image = image.convertToFormat(QImage::Format_ARGB32);
+
+ if (image.hasAlphaChannel()) {
+ maskImage = image.createAlphaMask();
+ } else {
+ maskImage.fill(0xff);
+ }
+ maskImage = maskImage.convertToFormat(QImage::Format_Mono);
+
+ int nbits = 32;
+ int bpl_bmp = ((image.width()*nbits+31)/32)*4;
+
+ entries[i].bColorCount = 0;
+ entries[i].bReserved = 0;
+ entries[i].wBitCount = nbits;
+ entries[i].bHeight = image.height();
+ entries[i].bWidth = image.width();
+ entries[i].dwBytesInRes = BMP_INFOHDR_SIZE + (bpl_bmp * image.height())
+ + (maskImage.bytesPerLine() * maskImage.height());
+ entries[i].wPlanes = 1;
+ if (i == 0)
+ entries[i].dwImageOffset = origOffset + ICONDIR_SIZE
+ + (id.idCount * ICONDIRENTRY_SIZE);
+ else
+ entries[i].dwImageOffset = entries[i-1].dwImageOffset + entries[i-1].dwBytesInRes;
+
+ bmpHeaders[i].biBitCount = entries[i].wBitCount;
+ bmpHeaders[i].biClrImportant = 0;
+ bmpHeaders[i].biClrUsed = entries[i].bColorCount;
+ bmpHeaders[i].biCompression = 0;
+ bmpHeaders[i].biHeight = entries[i].bHeight * 2; // 2 is for the mask
+ bmpHeaders[i].biPlanes = entries[i].wPlanes;
+ bmpHeaders[i].biSize = BMP_INFOHDR_SIZE;
+ bmpHeaders[i].biSizeImage = entries[i].dwBytesInRes - BMP_INFOHDR_SIZE;
+ bmpHeaders[i].biWidth = entries[i].bWidth;
+ bmpHeaders[i].biXPelsPerMeter = 0;
+ bmpHeaders[i].biYPelsPerMeter = 0;
+
+ QBuffer buffer(&imageData[i]);
+ buffer.open(QIODevice::WriteOnly);
+
+ uchar *buf = new uchar[bpl_bmp];
+ uchar *b;
+ memset( buf, 0, bpl_bmp );
+ int y;
+ for (y = image.height() - 1; y >= 0; y--) { // write the image bits
+ // 32 bits
+ QRgb *p = (QRgb *)image.scanLine(y);
+ QRgb *end = p + image.width();
+ b = buf;
+ int x = 0;
+ while (p < end) {
+ *b++ = qBlue(*p);
+ *b++ = qGreen(*p);
+ *b++ = qRed(*p);
+ *b++ = qAlpha(*p);
+ if (qAlpha(*p) > 0) // Even mostly transparent pixels must not be masked away
+ maskImage.setPixel(x, y, Qt::color1); // (i.e. createAlphaMask() takes away too much)
+ p++;
+ x++;
+ }
+ buffer.write((char*)buf, bpl_bmp);
+ }
+ delete[] buf;
+
+ maskImage.invertPixels(); // seems as though it needs this
+ // NOTE! !! The mask is only flipped vertically - not horizontally !!
+ for (y = maskImage.height() - 1; y >= 0; y--)
+ buffer.write((char*)maskImage.scanLine(y), maskImage.bytesPerLine());
+ }
+
+ if (writeIconDir(device, id)) {
+ int i;
+ bool bOK = true;
+ for (i = 0; i < id.idCount && bOK; i++) {
+ bOK = writeIconDirEntry(device, entries[i]);
+ }
+ if (bOK) {
+ for (i = 0; i < id.idCount && bOK; i++) {
+ bOK = writeBMPInfoHeader(device, bmpHeaders[i]);
+ bOK &= (device->write(imageData[i]) == (int) imageData[i].size());
+ }
+ retValue = bOK;
+ }
+ }
+
+ delete [] entries;
+ delete [] bmpHeaders;
+ delete [] imageData;
+
+ }
+ return retValue;
+}
+
+/*!
+ Constructs an instance of QtIcoHandler initialized to use \a device.
+*/
+QtIcoHandler::QtIcoHandler(QIODevice *device)
+{
+ m_currentIconIndex = 0;
+ setDevice(device);
+ m_pICOReader = new ICOReader(device);
+}
+
+/*!
+ Destructor for QtIcoHandler.
+*/
+QtIcoHandler::~QtIcoHandler()
+{
+ delete m_pICOReader;
+}
+
+QVariant QtIcoHandler::option(ImageOption option) const
+{
+ if (option == Size) {
+ QIODevice *device = QImageIOHandler::device();
+ qint64 oldPos = device->pos();
+ ICONDIRENTRY iconEntry;
+ if (device->seek(oldPos + ICONDIR_SIZE + (m_currentIconIndex * ICONDIRENTRY_SIZE))) {
+ if (readIconDirEntry(device, &iconEntry)) {
+ device->seek(oldPos);
+ return QSize(iconEntry.bWidth, iconEntry.bHeight);
+ }
+ }
+ if (!device->isSequential())
+ device->seek(oldPos);
+ }
+ return QVariant();
+}
+
+bool QtIcoHandler::supportsOption(ImageOption option) const
+{
+ return option == Size;
+}
+
+/*!
+ * Verifies if some values (magic bytes) are set as expected in the header of the file.
+ * If the magic bytes were found, it is assumed that the QtIcoHandler can read the file.
+ *
+ */
+bool QtIcoHandler::canRead() const
+{
+ bool bCanRead = false;
+ QIODevice *device = QImageIOHandler::device();
+ if (device) {
+ bCanRead = ICOReader::canRead(device);
+ if (bCanRead)
+ setFormat("ico");
+ } else {
+ qWarning("QtIcoHandler::canRead() called with no device");
+ }
+ return bCanRead;
+}
+
+/*! This static function is used by the plugin code, and is provided for convenience only.
+ \a device must be an opened device with pointing to the start of the header data of the ICO file.
+*/
+bool QtIcoHandler::canRead(QIODevice *device)
+{
+ Q_ASSERT(device);
+ return ICOReader::canRead(device);
+}
+
+/*! \reimp
+
+*/
+bool QtIcoHandler::read(QImage *image)
+{
+ bool bSuccess = false;
+ QImage img = m_pICOReader->iconAt(m_currentIconIndex);
+
+ // Make sure we only write to \a image when we succeed.
+ if (!img.isNull()) {
+ bSuccess = true;
+ *image = img;
+ }
+
+ return bSuccess;
+}
+
+
+/*! \reimp
+
+*/
+bool QtIcoHandler::write(const QImage &image)
+{
+ QIODevice *device = QImageIOHandler::device();
+ QList<QImage> imgs;
+ imgs.append(image);
+ return ICOReader::write(device, imgs);
+}
+
+/*!
+ * Return the common identifier of the format.
+ * For ICO format this will return "ico".
+ */
+QByteArray QtIcoHandler::name() const
+{
+ return "ico";
+}
+
+
+/*! \reimp
+
+*/
+int QtIcoHandler::imageCount() const
+{
+ return m_pICOReader->count();
+}
+
+/*! \reimp
+
+*/
+bool QtIcoHandler::jumpToImage(int imageNumber)
+{
+ if (imageNumber < imageCount()) {
+ m_currentIconIndex = imageNumber;
+ }
+
+ return (imageNumber < imageCount()) ? true : false;
+}
+
+/*! \reimp
+
+*/
+bool QtIcoHandler::jumpToNextImage()
+{
+ return jumpToImage(m_currentIconIndex + 1);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/imageformats/ico/qicohandler.h b/src/plugins/imageformats/ico/qicohandler.h
new file mode 100644
index 0000000000..0662bc57b8
--- /dev/null
+++ b/src/plugins/imageformats/ico/qicohandler.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QTICOHANDLER_H
+#define QTICOHANDLER_H
+
+#include <QtGui/QImageIOHandler>
+
+QT_BEGIN_NAMESPACE
+
+class ICOReader;
+class QtIcoHandler: public QImageIOHandler
+{
+public:
+ QtIcoHandler(QIODevice *device);
+ virtual ~QtIcoHandler();
+
+ bool canRead() const;
+ bool read(QImage *image);
+ bool write(const QImage &image);
+
+ QByteArray name() const;
+
+ int imageCount() const;
+ bool jumpToImage(int imageNumber);
+ bool jumpToNextImage();
+
+ static bool canRead(QIODevice *device);
+
+ bool supportsOption(ImageOption option) const;
+ QVariant option(ImageOption option) const;
+
+private:
+ int m_currentIconIndex;
+ ICOReader *m_pICOReader;
+
+};
+
+QT_END_NAMESPACE
+
+#endif /* QTICOHANDLER_H */
+
diff --git a/src/plugins/imageformats/imageformats.pro b/src/plugins/imageformats/imageformats.pro
new file mode 100644
index 0000000000..5fff2deb7d
--- /dev/null
+++ b/src/plugins/imageformats/imageformats.pro
@@ -0,0 +1,8 @@
+TEMPLATE = subdirs
+
+!contains(QT_CONFIG, no-jpeg):!contains(QT_CONFIG, jpeg):SUBDIRS += jpeg
+!contains(QT_CONFIG, no-gif):!contains(QT_CONFIG, gif):SUBDIRS += gif
+!contains(QT_CONFIG, no-mng):!contains(QT_CONFIG, mng):SUBDIRS += mng
+contains(QT_CONFIG, svg):SUBDIRS += svg
+!contains(QT_CONFIG, no-tiff):!contains(QT_CONFIG, tiff):SUBDIRS += tiff
+!contains(QT_CONFIG, no-ico):SUBDIRS += ico
diff --git a/src/plugins/imageformats/jpeg/jpeg.pro b/src/plugins/imageformats/jpeg/jpeg.pro
new file mode 100644
index 0000000000..fb254b86c6
--- /dev/null
+++ b/src/plugins/imageformats/jpeg/jpeg.pro
@@ -0,0 +1,11 @@
+TARGET = qjpeg
+include(../../qpluginbase.pri)
+
+QTDIR_build:REQUIRES = "!contains(QT_CONFIG, no-jpeg)"
+
+include(../../../gui/image/qjpeghandler.pri)
+SOURCES += main.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats
+target.path += $$[QT_INSTALL_PLUGINS]/imageformats
+INSTALLS += target
diff --git a/src/plugins/imageformats/jpeg/main.cpp b/src/plugins/imageformats/jpeg/main.cpp
new file mode 100644
index 0000000000..ac048c6a9f
--- /dev/null
+++ b/src/plugins/imageformats/jpeg/main.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_JPEG
+#undef QT_NO_IMAGEFORMAT_JPEG
+#endif
+#include <qjpeghandler_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QJpegPlugin : public QImageIOPlugin
+{
+public:
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QStringList QJpegPlugin::keys() const
+{
+ return QStringList() << QLatin1String("jpeg") << QLatin1String("jpg");
+}
+
+QImageIOPlugin::Capabilities QJpegPlugin::capabilities(QIODevice *device, const QByteArray &format) const
+{
+ if (format == "jpeg" || format == "jpg")
+ return Capabilities(CanRead | CanWrite);
+ if (!format.isEmpty())
+ return 0;
+ if (!device->isOpen())
+ return 0;
+
+ Capabilities cap;
+ if (device->isReadable() && QJpegHandler::canRead(device))
+ cap |= CanRead;
+ if (device->isWritable())
+ cap |= CanWrite;
+ return cap;
+}
+
+QImageIOHandler *QJpegPlugin::create(QIODevice *device, const QByteArray &format) const
+{
+ QImageIOHandler *handler = new QJpegHandler;
+ handler->setDevice(device);
+ handler->setFormat(format);
+ return handler;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QJpegPlugin)
+Q_EXPORT_PLUGIN2(qjpeg, QJpegPlugin)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_IMAGEFORMATPLUGIN
diff --git a/src/plugins/imageformats/mng/main.cpp b/src/plugins/imageformats/mng/main.cpp
new file mode 100644
index 0000000000..883b8ed7d3
--- /dev/null
+++ b/src/plugins/imageformats/mng/main.cpp
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qstringlist.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_MNG
+#undef QT_NO_IMAGEFORMAT_MNG
+#endif
+#include <qmnghandler_p.h>
+
+#include <qiodevice.h>
+#include <qbytearray.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMngPlugin : public QImageIOPlugin
+{
+ public:
+ QStringList keys() const;
+ Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
+ QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
+};
+
+QStringList QMngPlugin::keys() const
+{
+ return QStringList() << QLatin1String("mng");
+}
+
+QImageIOPlugin::Capabilities QMngPlugin::capabilities(QIODevice *device, const QByteArray &format) const
+{
+ if (format == "mng")
+ return Capabilities(CanRead);
+ if (!format.isEmpty())
+ return 0;
+ if (!device->isOpen())
+ return 0;
+
+ Capabilities cap;
+ if (device->isReadable() && QMngHandler::canRead(device))
+ cap |= CanRead;
+ return cap;
+}
+
+QImageIOHandler *QMngPlugin::create(QIODevice *device, const QByteArray &format) const
+{
+ QMngHandler *hand = new QMngHandler();
+ hand->setDevice(device);
+ hand->setFormat(format);
+ return hand;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QMngPlugin)
+Q_EXPORT_PLUGIN2(qmng, QMngPlugin)
+
+QT_END_NAMESPACE
+
+#endif // !QT_NO_IMAGEFORMATPLUGIN
diff --git a/src/plugins/imageformats/mng/mng.pro b/src/plugins/imageformats/mng/mng.pro
new file mode 100644
index 0000000000..88085f363c
--- /dev/null
+++ b/src/plugins/imageformats/mng/mng.pro
@@ -0,0 +1,17 @@
+TARGET = qmng
+include(../../qpluginbase.pri)
+
+QTDIR_build:REQUIRES = "!contains(QT_CONFIG, no-mng)"
+
+symbian: {
+ #Disable warnings in 3rdparty code due to unused variables and arguments
+ QMAKE_CXXFLAGS.CW += -W nounused
+ TARGET.UID3=0x2001E619
+}
+
+include(../../../gui/image/qmnghandler.pri)
+SOURCES += main.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats
+target.path += $$[QT_INSTALL_PLUGINS]/imageformats
+INSTALLS += target
diff --git a/src/plugins/imageformats/tiff/main.cpp b/src/plugins/imageformats/tiff/main.cpp
new file mode 100644
index 0000000000..0da25626d0
--- /dev/null
+++ b/src/plugins/imageformats/tiff/main.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qimageiohandler.h>
+#include <qdebug.h>
+
+#ifndef QT_NO_IMAGEFORMATPLUGIN
+
+#ifdef QT_NO_IMAGEFORMAT_TIFF
+#undef QT_NO_IMAGEFORMAT_TIFF
+#endif
+#include <qtiffhandler_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTiffPlugin : public QImageIOPlugin
+{
+public:
+ Capabilities capabilities(QIODevice * device, const QByteArray & format) const;
+ QImageIOHandler * create(QIODevice * device, const QByteArray & format = QByteArray()) const;
+ QStringList keys() const;
+};
+
+QImageIOPlugin::Capabilities QTiffPlugin::capabilities(QIODevice *device, const QByteArray &format) const
+{
+ if (format == "tiff" || format == "tif")
+ return Capabilities(CanRead | CanWrite);
+ if (!format.isEmpty())
+ return 0;
+ if (!device->isOpen())
+ return 0;
+
+ Capabilities cap;
+ if (device->isReadable() && QTiffHandler::canRead(device))
+ cap |= CanRead;
+ if (device->isWritable())
+ cap |= CanWrite;
+ return cap;
+}
+
+QImageIOHandler* QTiffPlugin::create(QIODevice *device, const QByteArray &format) const
+{
+ QImageIOHandler *tiffHandler = new QTiffHandler();
+ tiffHandler->setDevice(device);
+ tiffHandler->setFormat(format);
+ return tiffHandler;
+}
+
+QStringList QTiffPlugin::keys() const
+{
+ return QStringList() << QLatin1String("tiff") << QLatin1String("tif");
+}
+
+Q_EXPORT_STATIC_PLUGIN(QTiffPlugin)
+Q_EXPORT_PLUGIN2(qtiff, QTiffPlugin)
+
+QT_END_NAMESPACE
+
+#endif /* QT_NO_IMAGEFORMATPLUGIN */
diff --git a/src/plugins/imageformats/tiff/tiff.pro b/src/plugins/imageformats/tiff/tiff.pro
new file mode 100644
index 0000000000..e78152611c
--- /dev/null
+++ b/src/plugins/imageformats/tiff/tiff.pro
@@ -0,0 +1,13 @@
+TARGET = qtiff
+include(../../qpluginbase.pri)
+
+QTDIR_build:REQUIRES = "!contains(QT_CONFIG, no-tiff)"
+
+include(../../../gui/image/qtiffhandler.pri)
+SOURCES += main.cpp
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/imageformats
+target.path += $$[QT_INSTALL_PLUGINS]/imageformats
+INSTALLS += target
+
+symbian:TARGET.UID3=0x2001E617
diff --git a/src/plugins/inputmethods/imsw-multi/imsw-multi.pro b/src/plugins/inputmethods/imsw-multi/imsw-multi.pro
new file mode 100644
index 0000000000..f8dcb2cfcb
--- /dev/null
+++ b/src/plugins/inputmethods/imsw-multi/imsw-multi.pro
@@ -0,0 +1,13 @@
+TARGET = qimsw-multi
+include(../../qpluginbase.pri)
+CONFIG += warn_on
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/inputmethods
+
+HEADERS += qmultiinputcontext.h \
+ qmultiinputcontextplugin.h
+SOURCES += qmultiinputcontext.cpp \
+ qmultiinputcontextplugin.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/inputmethods
+INSTALLS += target
diff --git a/src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp b/src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp
new file mode 100644
index 0000000000..c606239f32
--- /dev/null
+++ b/src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp
@@ -0,0 +1,212 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Implementation of QMultiInputContext class
+**
+** Copyright (C) 2004 immodule for Qt Project. All rights reserved.
+**
+** This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
+** licence. You may use this file under your Qt license. Following
+** description is copied from their original file headers. Contact
+** immodule-qt@freedesktop.org if any conditions of this licensing are
+** not clear to you.
+**
+****************************************************************************/
+
+#ifndef QT_NO_IM
+#include "qmultiinputcontext.h"
+#include <qinputcontextfactory.h>
+#include <qstringlist.h>
+#include <qaction.h>
+#include <qsettings.h>
+#include <qmenu.h>
+
+#include <stdlib.h>
+
+QT_BEGIN_NAMESPACE
+
+QMultiInputContext::QMultiInputContext()
+ : QInputContext(), current(-1)
+{
+ keys = QInputContextFactory::keys();
+ for (int i = keys.size()-1; i >= 0; --i)
+ if (keys.at(i).contains(QLatin1String("imsw")))
+ keys.removeAt(i);
+
+ QString def = QLatin1String(getenv("QT4_IM_MODULE"));
+ if (def.isEmpty())
+ def = QLatin1String(getenv("QT_IM_MODULE"));
+ if (def.isEmpty()) {
+ QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
+ settings.beginGroup(QLatin1String("Qt"));
+ def = settings.value(QLatin1String("DefaultInputMethod"), QLatin1String("xim")).toString();
+ }
+ current = keys.indexOf(def);
+ if (current < 0)
+ current = 0;
+
+ menu = new QMenu(tr("Select IM"));
+ separator = new QAction(this);
+ separator->setSeparator(true);
+
+ QActionGroup *group = new QActionGroup(this);
+ for (int i = 0; i < keys.size(); ++i) {
+ slaves.append(0);
+ const QString key = keys.at(i);
+ QAction *a = menu->addAction(QInputContextFactory::displayName(key));
+ a->setData(key);
+ a->setCheckable(true);
+ group->addAction(a);
+ if (i == current) {
+ slaves.replace(current, QInputContextFactory::create(key, this));
+ a->setChecked(true);
+ }
+ }
+ connect(group, SIGNAL(triggered(QAction*)), this, SLOT(changeSlave(QAction*)));
+}
+
+QMultiInputContext::~QMultiInputContext()
+{
+ delete menu;
+}
+
+
+QString QMultiInputContext::identifierName()
+{
+ return (slave()) ? slave()->identifierName() : QLatin1String("");
+}
+
+QString QMultiInputContext::language()
+{
+ return (slave()) ? slave()->language() : QLatin1String("");
+}
+
+
+#if defined(Q_WS_X11)
+bool QMultiInputContext::x11FilterEvent(QWidget *keywidget, XEvent *event)
+{
+ return (slave()) ? slave()->x11FilterEvent(keywidget, event) : false;
+}
+#endif // Q_WS_X11
+
+
+bool QMultiInputContext::filterEvent(const QEvent *event)
+{
+ return (slave()) ? slave()->filterEvent(event) : false;
+}
+
+void QMultiInputContext::reset()
+{
+ if (slave())
+ slave()->reset();
+}
+
+void QMultiInputContext::update()
+{
+ if (slave())
+ slave()->update();
+}
+
+void QMultiInputContext::mouseHandler(int x, QMouseEvent *event)
+{
+ if (slave())
+ slave()->mouseHandler(x, event);
+}
+
+QFont QMultiInputContext::font() const
+{
+ return (slave()) ? slave()->font() : QInputContext::font();
+}
+
+void QMultiInputContext::setFocusWidget(QWidget *w)
+{
+ QInputContext::setFocusWidget(w);
+ if (slave())
+ slave()->setFocusWidget(w);
+}
+
+QWidget *QMultiInputContext::focusWidget() const
+{
+ return QInputContext::focusWidget();
+}
+
+void QMultiInputContext::widgetDestroyed(QWidget *w)
+{
+ if (slave())
+ slave()->widgetDestroyed(w);
+}
+
+bool QMultiInputContext::isComposing() const
+{
+ return (slave()) ? slave()->isComposing() : false;
+}
+
+QList<QAction *> QMultiInputContext::actions()
+{
+ QList<QAction *> a = slave()->actions();
+ a.append(separator);
+ a.append(menu->menuAction());
+ return a;
+}
+
+void QMultiInputContext::changeSlave(QAction *a)
+{
+ for (int i = 0; i < slaves.size(); ++i) {
+ if (keys.at(i) == a->data().toString()) {
+ if (slaves.at(i) == 0)
+ slaves.replace(i, QInputContextFactory::create(keys.at(i), this));
+ QInputContext *qic = slaves.at(current);
+ QWidget *oldWidget = qic->focusWidget();
+ qic->reset();
+ qic->setFocusWidget(0);
+ current = i;
+ qic = slaves.at(current);
+ qic->setFocusWidget(oldWidget);
+ return;
+ }
+ }
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_IM
diff --git a/src/plugins/inputmethods/imsw-multi/qmultiinputcontext.h b/src/plugins/inputmethods/imsw-multi/qmultiinputcontext.h
new file mode 100644
index 0000000000..819174f0ad
--- /dev/null
+++ b/src/plugins/inputmethods/imsw-multi/qmultiinputcontext.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Definition of QMultiInputContext class
+**
+** Copyright (C) 2004 immodule for Qt Project. All rights reserved.
+**
+** This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
+** licence. You may use this file under your Qt license. Following
+** description is copied from their original file headers. Contact
+** immodule-qt@freedesktop.org if any conditions of this licensing are
+** not clear to you.
+**
+****************************************************************************/
+
+#ifndef QMULTIINPUTCONTEXT_H
+#define QMULTIINPUTCONTEXT_H
+
+#ifndef QT_NO_IM
+
+#include <QtGui/qwidget.h>
+#include <QtGui/qinputcontext.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qnamespace.h>
+#include <QtCore/qmap.h>
+#include <QtCore/qpointer.h>
+#include <QtCore/qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMultiInputContext : public QInputContext
+{
+ Q_OBJECT
+public:
+ QMultiInputContext();
+ ~QMultiInputContext();
+
+ QString identifierName();
+ QString language();
+
+#if defined(Q_WS_X11)
+ bool x11FilterEvent( QWidget *keywidget, XEvent *event );
+#endif // Q_WS_X11
+ bool filterEvent( const QEvent *event );
+
+ void reset();
+ void update();
+ void mouseHandler( int x, QMouseEvent *event );
+ QFont font() const;
+ bool isComposing() const;
+
+ QList<QAction *> actions();
+
+ QWidget *focusWidget() const;
+ void setFocusWidget(QWidget *w);
+
+ void widgetDestroyed( QWidget *w );
+
+ QInputContext *slave() { return slaves.at(current); }
+ const QInputContext *slave() const { return slaves.at(current); }
+
+protected Q_SLOTS:
+ void changeSlave(QAction *);
+private:
+ void *unused;
+ int current;
+ QList<QInputContext *> slaves;
+ QMenu *menu;
+ QAction *separator;
+ QStringList keys;
+};
+
+#endif // Q_NO_IM
+
+QT_END_NAMESPACE
+
+#endif // QMULTIINPUTCONTEXT_H
diff --git a/src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp b/src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp
new file mode 100644
index 0000000000..37e7da8b2c
--- /dev/null
+++ b/src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Implementation of QMultiInputContextPlugin class
+**
+** Copyright (C) 2004 immodule for Qt Project. All rights reserved.
+**
+** This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
+** license. You may use this file under your Qt license. Following
+** description is copied from their original file headers. Contact
+** immodule-qt@freedesktop.org if any conditions of this licensing are
+** not clear to you.
+**
+****************************************************************************/
+
+#ifndef QT_NO_IM
+#include "qmultiinputcontext.h"
+#include "qmultiinputcontextplugin.h"
+#include <qinputcontextplugin.h>
+#include <qstringlist.h>
+
+QT_BEGIN_NAMESPACE
+
+QMultiInputContextPlugin::QMultiInputContextPlugin()
+{
+}
+
+QMultiInputContextPlugin::~QMultiInputContextPlugin()
+{
+}
+
+QStringList QMultiInputContextPlugin::keys() const
+{
+ // input method switcher should named with "imsw-" prefix to
+ // prevent to be listed in ordinary input method list.
+ return QStringList( QLatin1String("imsw-multi") );
+}
+
+QInputContext *QMultiInputContextPlugin::create( const QString &key )
+{
+ if (key != QLatin1String("imsw-multi"))
+ return 0;
+ return new QMultiInputContext;
+}
+
+QStringList QMultiInputContextPlugin::languages( const QString & )
+{
+ return QStringList();
+}
+
+QString QMultiInputContextPlugin::displayName( const QString &key )
+{
+ if (key != QLatin1String("imsw-multi"))
+ return QString();
+ return tr( "Multiple input method switcher" );
+}
+
+QString QMultiInputContextPlugin::description( const QString &key )
+{
+ if (key != QLatin1String("imsw-multi"))
+ return QString();
+ return tr( "Multiple input method switcher that uses the context menu of the text widgets" );
+}
+
+
+Q_EXPORT_STATIC_PLUGIN(QMultiInputContextPlugin)
+Q_EXPORT_PLUGIN2(qimsw_multi, QMultiInputContextPlugin)
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.h b/src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.h
new file mode 100644
index 0000000000..9d7b17b6de
--- /dev/null
+++ b/src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Definition of QMultiInputContextPlugin class
+**
+** Copyright (C) 2004 immodule for Qt Project. All rights reserved.
+**
+** This file is written to contribute to Nokia Corporation and/or its subsidiary(-ies) under their own
+** license. You may use this file under your Qt license. Following
+** description is copied from their original file headers. Contact
+** immodule-qt@freedesktop.org if any conditions of this licensing are
+** not clear to you.
+**
+****************************************************************************/
+
+#ifndef QMULTIINPUTCONTEXTPLUGIN_H
+#define QMULTIINPUTCONTEXTPLUGIN_H
+
+#ifndef QT_NO_IM
+
+#include "qmultiinputcontext.h"
+#include <QtGui/qinputcontextplugin.h>
+#include <QtCore/qstringlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMultiInputContextPlugin : public QInputContextPlugin
+{
+ Q_OBJECT
+public:
+ QMultiInputContextPlugin();
+ ~QMultiInputContextPlugin();
+
+ QStringList keys() const;
+ QInputContext *create( const QString &key );
+ QStringList languages( const QString &key );
+ QString displayName( const QString &key );
+ QString description( const QString &key );
+};
+
+#endif // QT_NO_IM
+
+QT_END_NAMESPACE
+
+#endif // QMULTIINPUTCONTEXTPLUGIN_H
diff --git a/src/plugins/inputmethods/inputmethods.pro b/src/plugins/inputmethods/inputmethods.pro
new file mode 100644
index 0000000000..e1ca847519
--- /dev/null
+++ b/src/plugins/inputmethods/inputmethods.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+
+SUBDIRS = imsw-multi
diff --git a/src/plugins/kbddrivers/kbddrivers.pro b/src/plugins/kbddrivers/kbddrivers.pro
new file mode 100644
index 0000000000..dbab47b366
--- /dev/null
+++ b/src/plugins/kbddrivers/kbddrivers.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+contains(kbd-plugins, linuxinput): SUBDIRS += linuxinput
diff --git a/src/plugins/kbddrivers/linuxinput/linuxinput.pro b/src/plugins/kbddrivers/linuxinput/linuxinput.pro
new file mode 100644
index 0000000000..862a22031c
--- /dev/null
+++ b/src/plugins/kbddrivers/linuxinput/linuxinput.pro
@@ -0,0 +1,14 @@
+TARGET = qlinuxinputkbddriver
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/kbddrivers
+target.path = $$[QT_INSTALL_PLUGINS]/kbddrivers
+INSTALLS += target
+
+DEFINES += QT_QWS_KBD_LINUXINPUT
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qkbdlinuxinput_qws.h
+
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qkbdlinuxinput_qws.cpp
+
diff --git a/src/plugins/kbddrivers/linuxinput/main.cpp b/src/plugins/kbddrivers/linuxinput/main.cpp
new file mode 100644
index 0000000000..2158b3fac7
--- /dev/null
+++ b/src/plugins/kbddrivers/linuxinput/main.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qkbddriverplugin_qws.h>
+#include <qkbdlinuxinput_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class QLinuxInputKbdDriver : public QKbdDriverPlugin
+{
+public:
+ QLinuxInputKbdDriver();
+
+ QStringList keys() const;
+ QWSKeyboardHandler* create(const QString &driver, const QString &device);
+};
+
+QLinuxInputKbdDriver::QLinuxInputKbdDriver()
+ : QKbdDriverPlugin()
+{
+}
+
+QStringList QLinuxInputKbdDriver::keys() const
+{
+ return (QStringList() << QLatin1String("LinuxInput"));
+}
+
+QWSKeyboardHandler* QLinuxInputKbdDriver::create(const QString &driver,
+ const QString &device)
+{
+ Q_UNUSED(device);
+ if (driver.compare(QLatin1String("LinuxInput"), Qt::CaseInsensitive))
+ return 0;
+ return new QWSLinuxInputKeyboardHandler(device);
+}
+
+Q_EXPORT_PLUGIN2(qwslinuxinputkbddriver, QLinuxInputKbdDriver)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/mousedrivers/linuxtp/linuxtp.pro b/src/plugins/mousedrivers/linuxtp/linuxtp.pro
new file mode 100644
index 0000000000..ac1c8ff911
--- /dev/null
+++ b/src/plugins/mousedrivers/linuxtp/linuxtp.pro
@@ -0,0 +1,14 @@
+TARGET = qlinuxtpmousedriver
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/mousedrivers
+target.path = $$[QT_INSTALL_PLUGINS]/mousedrivers
+INSTALLS += target
+
+DEFINES += QT_QWS_MOUSE_LINUXTP
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qmouselinuxtp_qws.h
+
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmouselinuxtp_qws.cpp
+
diff --git a/src/plugins/mousedrivers/linuxtp/main.cpp b/src/plugins/mousedrivers/linuxtp/main.cpp
new file mode 100644
index 0000000000..7ac358d4ce
--- /dev/null
+++ b/src/plugins/mousedrivers/linuxtp/main.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qmousedriverplugin_qws.h>
+#include <qmouselinuxtp_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class QLinuxTPMouseDriver : public QMouseDriverPlugin
+{
+public:
+ QLinuxTPMouseDriver();
+
+ QStringList keys() const;
+ QWSMouseHandler* create(const QString &driver, const QString &device);
+};
+
+QLinuxTPMouseDriver::QLinuxTPMouseDriver()
+ : QMouseDriverPlugin()
+{
+}
+
+QStringList QLinuxTPMouseDriver::keys() const
+{
+ return (QStringList() << "LinuxTP");
+}
+
+QWSMouseHandler* QLinuxTPMouseDriver::create(const QString &driver,
+ const QString &device)
+{
+ if (driver.compare(QLatin1String("LinuxTP"), Qt::CaseInsensitive))
+ return 0;
+ return new QWSLinuxTPMouseHandler(driver, device);
+}
+
+Q_EXPORT_PLUGIN2(qwslinuxtpmousehandler, QLinuxTPMouseDriver)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/mousedrivers/mousedrivers.pro b/src/plugins/mousedrivers/mousedrivers.pro
new file mode 100644
index 0000000000..f89682b880
--- /dev/null
+++ b/src/plugins/mousedrivers/mousedrivers.pro
@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+contains(mouse-plugins, linuxtp): SUBDIRS += linuxtp
+contains(mouse-plugins, pc): SUBDIRS += pc
+contains(mouse-plugins, tslib): SUBDIRS += tslib
+contains(mouse-plugins, linuxinput): SUBDIRS += linuxinput
diff --git a/src/plugins/mousedrivers/pc/main.cpp b/src/plugins/mousedrivers/pc/main.cpp
new file mode 100644
index 0000000000..d87ac77e6a
--- /dev/null
+++ b/src/plugins/mousedrivers/pc/main.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qmousedriverplugin_qws.h>
+#include <qmousepc_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class QPcMouseDriver : public QMouseDriverPlugin
+{
+public:
+ QPcMouseDriver();
+
+ QStringList keys() const;
+ QWSMouseHandler* create(const QString &driver, const QString &device);
+};
+
+QPcMouseDriver::QPcMouseDriver()
+ : QMouseDriverPlugin()
+{
+}
+
+QStringList QPcMouseDriver::keys() const
+{
+ return (QStringList()
+ << QLatin1String("Auto")
+ << QLatin1String("IntelliMouse")
+ << QLatin1String("Microsoft")
+ << QLatin1String("MouseSystems")
+ << QLatin1String("MouseMan"));
+}
+
+QWSMouseHandler* QPcMouseDriver::create(const QString &driver,
+ const QString &device)
+{
+ if (!keys().contains(driver, Qt::CaseInsensitive))
+ return 0;
+ return new QWSPcMouseHandler(driver, device);
+}
+
+Q_EXPORT_PLUGIN2(qwspcmousehandler, QPcMouseDriver)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/mousedrivers/pc/pc.pro b/src/plugins/mousedrivers/pc/pc.pro
new file mode 100644
index 0000000000..b93b25b8cf
--- /dev/null
+++ b/src/plugins/mousedrivers/pc/pc.pro
@@ -0,0 +1,14 @@
+TARGET = qpcmousedriver
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/mousedrivers
+target.path = $$[QT_INSTALL_PLUGINS]/mousedrivers
+INSTALLS += target
+
+DEFINES += QT_QWS_MOUSE_PC
+
+HEADERS = $$QT_SOURCE_TREE/src/gui/embedded/qmousepc_qws.h
+
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmousepc_qws.cpp
+
diff --git a/src/plugins/mousedrivers/tslib/main.cpp b/src/plugins/mousedrivers/tslib/main.cpp
new file mode 100644
index 0000000000..d21315422b
--- /dev/null
+++ b/src/plugins/mousedrivers/tslib/main.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qmousedriverplugin_qws.h>
+#include <qmousetslib_qws.h>
+
+QT_BEGIN_NAMESPACE
+
+class TslibMouseDriver : public QMouseDriverPlugin
+{
+public:
+ TslibMouseDriver();
+
+ QStringList keys() const;
+ QWSMouseHandler* create(const QString &driver, const QString &device);
+};
+
+TslibMouseDriver::TslibMouseDriver()
+ : QMouseDriverPlugin()
+{
+}
+
+QStringList TslibMouseDriver::keys() const
+{
+ return (QStringList() << "tslib");
+}
+
+QWSMouseHandler* TslibMouseDriver::create(const QString &driver,
+ const QString &device)
+{
+ if (driver.toLower() != "tslib")
+ return 0;
+ return new QWSTslibMouseHandler(driver, device);
+}
+
+Q_EXPORT_STATIC_PLUGIN(TslibMouseDriver)
+Q_EXPORT_PLUGIN2(qwstslibmousehandler, TslibMouseDriver)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/mousedrivers/tslib/tslib.pro b/src/plugins/mousedrivers/tslib/tslib.pro
new file mode 100644
index 0000000000..7b0748db9f
--- /dev/null
+++ b/src/plugins/mousedrivers/tslib/tslib.pro
@@ -0,0 +1,16 @@
+TARGET = qtslibmousedriver
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/mousedrivers
+
+HEADERS = \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmousedriverplugin_qws.h \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmousetslib_qws.h
+SOURCES = main.cpp \
+ $$QT_SOURCE_TREE/src/gui/embedded/qmousetslib_qws.cpp
+
+LIBS += -lts
+
+target.path += $$[QT_INSTALL_PLUGINS]/mousedrivers
+INSTALLS += target
+
diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro
new file mode 100644
index 0000000000..1633ee45c7
--- /dev/null
+++ b/src/plugins/platforms/cocoa/cocoa.pro
@@ -0,0 +1,29 @@
+TARGET = qcocoa
+include(../../qpluginbase.pri)
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+OBJECTIVE_SOURCES = main.mm \
+ qcocoaintegration.mm \
+ qcocoawindowsurface.mm \
+ qcocoawindow.mm \
+ qnsview.mm \
+ qcocoaeventloopintegration.mm \
+ qcocoaautoreleasepool.mm \
+ qnswindowdelegate.mm
+
+OBJECTIVE_HEADERS = qcocoaintegration.h \
+ qcocoawindowsurface.h \
+ qcocoawindow.h \
+ qnsview.h \
+ qcocoaeventloopintegration.h \
+ qcocoaautoreleasepool.h \
+ qnswindowdelegate.h
+
+#add libz for freetype.
+LIBS += -lz
+LIBS += -framework cocoa
+
+include(../fontdatabases/coretext/coretext.pri)
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
+
diff --git a/src/plugins/platforms/cocoa/main.mm b/src/plugins/platforms/cocoa/main.mm
new file mode 100644
index 0000000000..da7af3ff83
--- /dev/null
+++ b/src/plugins/platforms/cocoa/main.mm
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <Cocoa/Cocoa.h>
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qcocoaintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QCocoaIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QCocoaIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "Cocoa";
+ return list;
+}
+
+QPlatformIntegration * QCocoaIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "cocoa")
+ return new QCocoaIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(Cocoa, QCocoaIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h
new file mode 100644
index 0000000000..6e41e9a38a
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOCOAAUTORELEASEPOOL_H
+#define QCOCOAAUTORELEASEPOOL_H
+
+#include <Cocoa/Cocoa.h>
+
+class QCocoaAutoReleasePool
+{
+public:
+ QCocoaAutoReleasePool();
+ ~QCocoaAutoReleasePool();
+
+private:
+ NSAutoreleasePool *pool;
+};
+
+#endif // QCOCOAAUTORELEASEPOOL_H
diff --git a/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm
new file mode 100644
index 0000000000..35750cda52
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoaautoreleasepool.mm
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcocoaautoreleasepool.h"
+
+QCocoaAutoReleasePool::QCocoaAutoReleasePool()
+{
+ pool = [[NSAutoreleasePool alloc] init];
+}
+
+QCocoaAutoReleasePool::~QCocoaAutoReleasePool()
+{
+ [pool release];
+}
diff --git a/src/plugins/platforms/cocoa/qcocoaeventloopintegration.h b/src/plugins/platforms/cocoa/qcocoaeventloopintegration.h
new file mode 100644
index 0000000000..81e272ec1b
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoaeventloopintegration.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOCAEVENTLOOPINTEGRATION_H
+#define QCOCAEVENTLOOPINTEGRATION_H
+
+#include <Cocoa/Cocoa.h>
+
+#include <QPlatformEventLoopIntegration>
+
+
+class QCocoaEventLoopIntegration : public QPlatformEventLoopIntegration
+{
+public:
+ QCocoaEventLoopIntegration();
+ void startEventLoop();
+ void quitEventLoop();
+ void qtNeedsToProcessEvents();
+
+private:
+ CFRunLoopSourceContext m_sourceContext;
+ CFRunLoopTimerContext m_timerContext;
+ CFRunLoopSourceRef m_source;
+};
+
+#endif // QCOCAEVENTLOOPINTEGRATION_H
+
diff --git a/src/plugins/platforms/cocoa/qcocoaeventloopintegration.mm b/src/plugins/platforms/cocoa/qcocoaeventloopintegration.mm
new file mode 100644
index 0000000000..885916ed74
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoaeventloopintegration.mm
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcocoaeventloopintegration.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include "qcocoaautoreleasepool.h"
+
+#include <QtCore/QElapsedTimer>
+
+#include <QDebug>
+#include <QApplication>
+
+void wakeupCallback ( void * ) {
+ QPlatformEventLoopIntegration::processEvents();
+}
+
+void timerCallback( CFRunLoopTimerRef timer, void *info)
+{
+ QPlatformEventLoopIntegration::processEvents();
+ QCocoaEventLoopIntegration *eventLoopIntegration =
+ static_cast<QCocoaEventLoopIntegration *>(info);
+ qint64 nextTime = eventLoopIntegration->nextTimerEvent();
+ CFAbsoluteTime nexttime = CFAbsoluteTimeGetCurrent();
+ nexttime = nexttime + (double(nextTime)/1000);
+ CFRunLoopTimerSetNextFireDate(timer,nexttime);
+}
+
+QCocoaEventLoopIntegration::QCocoaEventLoopIntegration() :
+ QPlatformEventLoopIntegration()
+{
+ [NSApplication sharedApplication];
+ m_sourceContext.version = 0;
+ m_sourceContext.info = this;
+ m_sourceContext.retain = 0;
+ m_sourceContext.release = 0;
+ m_sourceContext.copyDescription = 0;
+ m_sourceContext.equal = 0;
+ m_sourceContext.hash = 0;
+ m_sourceContext.schedule = 0;
+ m_sourceContext.cancel = 0;
+ m_sourceContext.perform = wakeupCallback;
+
+ m_source = CFRunLoopSourceCreate(0,0,&m_sourceContext);
+ CFRunLoopAddSource(CFRunLoopGetMain(),m_source,kCFRunLoopCommonModes);
+
+ m_timerContext.version = 0;
+ m_timerContext.info = this;
+ m_timerContext.retain = 0;
+ m_timerContext.release = 0;
+ m_timerContext.copyDescription = 0;
+ CFAbsoluteTime fireDate = CFAbsoluteTimeGetCurrent ();
+ CFTimeInterval interval = 30;
+
+ CFRunLoopTimerRef m_timerSource = CFRunLoopTimerCreate(0,fireDate,interval,0,0,timerCallback,&m_timerContext);
+ CFRunLoopAddTimer(CFRunLoopGetMain(),m_timerSource,kCFRunLoopCommonModes);
+}
+
+void QCocoaEventLoopIntegration::startEventLoop()
+{
+ [[NSApplication sharedApplication] run];
+}
+
+void QCocoaEventLoopIntegration::quitEventLoop()
+{
+ [[NSApplication sharedApplication] terminate:nil];
+}
+
+void QCocoaEventLoopIntegration::qtNeedsToProcessEvents()
+{
+ CFRunLoopSourceSignal(m_source);
+}
+
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h
new file mode 100644
index 0000000000..2a04e8c2ed
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMINTEGRATION_COCOA_H
+#define QPLATFORMINTEGRATION_COCOA_H
+
+#include <Cocoa/Cocoa.h>
+
+#include "qcocoaautoreleasepool.h"
+
+#include <QtGui/QPlatformIntegration>
+
+QT_BEGIN_NAMESPACE
+
+class QCocoaScreen : public QPlatformScreen
+{
+public:
+ QCocoaScreen(int screenIndex);
+ ~QCocoaScreen();
+
+ QRect geometry() const { return m_geometry; }
+ int depth() const { return m_depth; }
+ QImage::Format format() const { return m_format; }
+ QSize physicalSize() const { return m_physicalSize; }
+
+public:
+ NSScreen *m_screen;
+ QRect m_geometry;
+ int m_depth;
+ QImage::Format m_format;
+ QSize m_physicalSize;
+};
+
+class QCocoaIntegration : public QPlatformIntegration
+{
+public:
+ QCocoaIntegration();
+ ~QCocoaIntegration();
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+ QPlatformEventLoopIntegration *createEventLoopIntegration() const;
+
+private:
+ QList<QPlatformScreen *> mScreens;
+ QPlatformFontDatabase *mFontDb;
+
+ QCocoaAutoReleasePool *mPool;
+};
+
+QT_END_NAMESPACE
+
+#endif
+
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
new file mode 100644
index 0000000000..7c4319c5e7
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcocoaintegration.h"
+
+#include "qcocoawindow.h"
+#include "qcocoawindowsurface.h"
+#include "qcocoaeventloopintegration.h"
+
+#include "qcoretextfontdatabase.h"
+
+#include <QtGui/QApplication>
+
+#include <private/qpixmap_raster_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QCocoaScreen::QCocoaScreen(int screenIndex)
+ :QPlatformScreen()
+{
+ m_screen = [[NSScreen screens] objectAtIndex:screenIndex];
+ NSRect rect = [m_screen frame];
+ m_geometry = QRect(rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
+
+ m_format = QImage::Format_ARGB32;
+
+ m_depth = NSBitsPerPixelFromDepth([m_screen depth]);
+
+ const int dpi = 72;
+ const qreal inch = 25.4;
+ m_physicalSize = QSize(qRound(m_geometry.width() * inch / dpi), qRound(m_geometry.height() *inch / dpi));
+}
+
+QCocoaScreen::~QCocoaScreen()
+{
+}
+
+QCocoaIntegration::QCocoaIntegration()
+ : mFontDb(new QCoreTextFontDatabase())
+{
+ mPool = new QCocoaAutoReleasePool;
+
+ //Make sure we have a nsapplication :)
+ [NSApplication sharedApplication];
+// [[OurApplication alloc] init];
+
+ NSArray *screens = [NSScreen screens];
+ for (uint i = 0; i < [screens count]; i++) {
+ QCocoaScreen *screen = new QCocoaScreen(i);
+ mScreens.append(screen);
+ }
+}
+
+QCocoaIntegration::~QCocoaIntegration()
+{
+ delete mPool;
+}
+
+bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+
+
+QPixmapData *QCocoaIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QPlatformWindow *QCocoaIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QCocoaWindow(widget);
+}
+
+QWindowSurface *QCocoaIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ return new QCocoaWindowSurface(widget,winId);
+}
+
+QPlatformFontDatabase *QCocoaIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+QPlatformEventLoopIntegration *QCocoaIntegration::createEventLoopIntegration() const
+{
+ return new QCocoaEventLoopIntegration();
+}
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
new file mode 100644
index 0000000000..b71879de41
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCOCOAWINDOW_H
+#define QCOCOAWINDOW_H
+
+#include <Cocoa/Cocoa.h>
+
+#include <QPlatformWindow>
+
+QT_BEGIN_NAMESPACE
+
+class QCocoaWindow : public QPlatformWindow
+{
+public:
+ QCocoaWindow(QWidget *tlw);
+ ~QCocoaWindow();
+
+ void setGeometry(const QRect &rect);
+
+ void setVisible(bool visible);
+
+ WId winId() const;
+
+ NSView *contentView() const;
+ void setContentView(NSView *contentView);
+
+ void windowDidResize();
+
+private:
+ NSWindow *m_nsWindow;
+};
+
+QT_END_NAMESPACE
+
+#endif // QCOCOAWINDOW_H
+
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
new file mode 100644
index 0000000000..aa54fe90ad
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qcocoawindow.h"
+#include "qnswindowdelegate.h"
+#include "qcocoaautoreleasepool.h"
+
+#include <QWidget>
+
+#include <QtGui/QApplication>
+
+#include <QWindowSystemInterface>
+
+#include <QDebug>
+
+QCocoaWindow::QCocoaWindow(QWidget *tlw)
+ : QPlatformWindow(tlw)
+{
+ QCocoaAutoReleasePool pool;
+ const QRect geo = tlw->geometry();
+ NSRect frame = NSMakeRect(geo.x(), geo.y(), geo.width(), geo.height());
+
+ m_nsWindow = [[NSWindow alloc] initWithContentRect:frame
+ styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask
+ backing:NSBackingStoreBuffered
+ defer:YES];
+
+ QNSWindowDelegate *delegate = [[QNSWindowDelegate alloc] initWithQCocoaWindow:this];
+ [m_nsWindow setDelegate:delegate];
+
+ [m_nsWindow makeKeyAndOrderFront:nil];
+ [m_nsWindow setAcceptsMouseMovedEvents:YES];
+}
+
+QCocoaWindow::~QCocoaWindow()
+{
+}
+
+void QCocoaWindow::setGeometry(const QRect &rect)
+{
+ QPlatformWindow::setGeometry(rect);
+
+ NSRect bounds = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height());
+ [[m_nsWindow contentView]setFrameSize:bounds.size];
+}
+
+void QCocoaWindow::setVisible(bool visible)
+{
+ Q_UNUSED(visible);
+}
+
+WId QCocoaWindow::winId() const
+{
+ return WId([m_nsWindow windowNumber]);
+}
+
+NSView *QCocoaWindow::contentView() const
+{
+ return [m_nsWindow contentView];
+}
+
+void QCocoaWindow::setContentView(NSView *contentView)
+{
+ [m_nsWindow setContentView:contentView];
+}
+
+void QCocoaWindow::windowDidResize()
+{
+ //jlind: XXX This isn't ideal. Eventdispatcher does not run when resizing...
+ NSRect rect = [[m_nsWindow contentView]frame];
+ QRect geo(rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
+ QWindowSystemInterface::handleGeometryChange(widget(),geo);
+}
diff --git a/src/plugins/platforms/cocoa/qcocoawindowsurface.h b/src/plugins/platforms/cocoa/qcocoawindowsurface.h
new file mode 100644
index 0000000000..5ae7be197d
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoawindowsurface.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_COCOA_H
+#define QWINDOWSURFACE_COCOA_H
+
+#include <Cocoa/Cocoa.h>
+
+#include "qcocoawindow.h"
+#include "qnsview.h"
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QCocoaWindowSurface : public QWindowSurface
+{
+public:
+ QCocoaWindowSurface(QWidget *window, WId wid);
+ ~QCocoaWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize (const QSize &size);
+
+private:
+
+ QCocoaWindow *m_cocoaWindow;
+ QImage *m_image;
+ QNSView *m_contentView;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/cocoa/qcocoawindowsurface.mm b/src/plugins/platforms/cocoa/qcocoawindowsurface.mm
new file mode 100644
index 0000000000..ecf6879c67
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qcocoawindowsurface.mm
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcocoawindowsurface.h"
+
+#include <QtCore/qdebug.h>
+
+#include <QtGui/QPainter>
+
+QT_BEGIN_NAMESPACE
+
+QRect flipedRect(const QRect &sourceRect,int height)
+{
+ if (!sourceRect.isValid())
+ return QRect();
+ QRect flippedRect = sourceRect;
+ flippedRect.moveTop(height - sourceRect.y());
+ return flippedRect;
+}
+
+QCocoaWindowSurface::QCocoaWindowSurface(QWidget *window, WId wId)
+ : QWindowSurface(window)
+{
+ m_cocoaWindow = static_cast<QCocoaWindow *>(window->platformWindow());
+
+ const QRect geo = window->geometry();
+ NSRect rect = NSMakeRect(geo.x(),geo.y(),geo.width(),geo.height());
+ m_contentView = [[QNSView alloc] initWithWidget:window];
+ m_cocoaWindow->setContentView(m_contentView);
+
+ m_image = new QImage(window->size(),QImage::Format_ARGB32);
+}
+
+QCocoaWindowSurface::~QCocoaWindowSurface()
+{
+ delete m_image;
+}
+
+QPaintDevice *QCocoaWindowSurface::paintDevice()
+{
+ return m_image;
+}
+
+void QCocoaWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(offset);
+
+ QRect geo = region.boundingRect();
+
+ NSRect rect = NSMakeRect(geo.x(), geo.y(), geo.width(), geo.height());
+ [m_contentView displayRect:rect];
+}
+
+void QCocoaWindowSurface::resize(const QSize &size)
+{
+ QWindowSurface::resize(size);
+ delete m_image;
+ m_image = new QImage(size,QImage::Format_ARGB32_Premultiplied);
+ NSSize newSize = NSMakeSize(size.width(),size.height());
+ [m_contentView setImage:m_image];
+
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
new file mode 100644
index 0000000000..fc946e2f29
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNSVIEW_H
+#define QNSVIEW_H
+
+#include <Cocoa/Cocoa.h>
+
+#include <QtGui/QImage>
+
+@interface QNSView : NSView {
+ CGImageRef m_cgImage;
+ QWidget *m_widget;
+ Qt::MouseButtons m_buttons;
+}
+
+- (id)init;
+- (id)initWithWidget:(QWidget *)widget;
+
+- (void)setImage:(QImage *)image;
+- (void)drawRect:(NSRect)dirtyRect;
+
+- (BOOL)isFlipped;
+
+- (void)handleMouseEvent:(NSEvent *)theEvent;
+- (void)mouseDown:(NSEvent *)theEvent;
+- (void)mouseDragged:(NSEvent *)theEvent;
+- (void)mouseUp:(NSEvent *)theEvent;
+- (void)mouseMoved:(NSEvent *)theEvent;
+- (void)mouseEntered:(NSEvent *)theEvent;
+- (void)mouseExited:(NSEvent *)theEvent;
+- (void)rightMouseDown:(NSEvent *)theEvent;
+- (void)rightMouseDragged:(NSEvent *)theEvent;
+- (void)rightMouseUp:(NSEvent *)theEvent;
+- (void)otherMouseDown:(NSEvent *)theEvent;
+- (void)otherMouseDragged:(NSEvent *)theEvent;
+- (void)otherMouseUp:(NSEvent *)theEvent;
+
+@end
+
+#endif //QNSVIEW_H
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
new file mode 100644
index 0000000000..6fda27b352
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -0,0 +1,211 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnsview.h"
+
+#include <QtGui/QWindowSystemInterface>
+
+#include <QtCore/QDebug>
+
+@implementation QNSView
+
+- (id) init
+{
+ self = [super init];
+ if (self) {
+ m_cgImage = 0;
+ m_widget = 0;
+ m_buttons = Qt::NoButton;
+ }
+ return self;
+}
+
+- (id)initWithWidget:(QWidget *)widget {
+ self = [self init];
+ if (self) {
+ m_widget = widget;
+ }
+ return self;
+}
+
+- (void) setImage:(QImage *)image
+{
+ CGImageRelease(m_cgImage);
+
+ const uchar *imageData = image->bits();
+ int bitDepth = image->depth();
+ int colorBufferSize = 8;
+ int bytesPrLine = image->bytesPerLine();
+ int width = image->width();
+ int height = image->height();
+
+ CGColorSpaceRef cgColourSpaceRef = CGColorSpaceCreateDeviceRGB();
+
+ CGDataProviderRef cgDataProviderRef = CGDataProviderCreateWithData(
+ NULL,
+ imageData,
+ image->byteCount(),
+ NULL);
+
+ m_cgImage = CGImageCreate(width,
+ height,
+ colorBufferSize,
+ bitDepth,
+ bytesPrLine,
+ cgColourSpaceRef,
+ kCGImageAlphaNone,
+ cgDataProviderRef,
+ NULL,
+ false,
+ kCGRenderingIntentDefault);
+
+ CGColorSpaceRelease(cgColourSpaceRef);
+
+}
+
+- (void) drawRect:(NSRect)dirtyRect
+{
+ if (!m_cgImage)
+ return;
+
+ CGRect dirtyCGRect = NSRectToCGRect(dirtyRect);
+
+ NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext currentContext];
+ CGContextRef cgContext = (CGContextRef) [nsGraphicsContext graphicsPort];
+
+ CGContextSaveGState( cgContext );
+ int dy = dirtyCGRect.origin.y + CGRectGetMaxY(dirtyCGRect);
+ CGContextTranslateCTM(cgContext, 0, dy);
+ CGContextScaleCTM(cgContext, 1, -1);
+
+ CGImageRef subImage = CGImageCreateWithImageInRect(m_cgImage, dirtyCGRect);
+ CGContextDrawImage(cgContext,dirtyCGRect,subImage);
+
+ CGContextRestoreGState(cgContext);
+
+ CGImageRelease(subImage);
+
+}
+
+- (BOOL) isFlipped
+{
+ return YES;
+}
+
+- (void)handleMouseEvent:(NSEvent *)theEvent;
+{
+ NSPoint point = [self convertPoint: [theEvent locationInWindow] fromView: nil];
+ QPoint qt_localPoint(point.x,point.y);
+
+ NSTimeInterval timestamp = [theEvent timestamp];
+ ulong qt_timestamp = timestamp * 1000;
+
+ QWindowSystemInterface::handleMouseEvent(m_widget,qt_timestamp,qt_localPoint,QPoint(),m_buttons);
+
+}
+ - (void)mouseDown:(NSEvent *)theEvent
+ {
+ m_buttons |= Qt::LeftButton;
+ [self handleMouseEvent:theEvent];
+ }
+ - (void)mouseDragged:(NSEvent *)theEvent
+ {
+ if (!(m_buttons & Qt::LeftButton))
+ qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
+ [self handleMouseEvent:theEvent];
+ }
+ - (void)mouseUp:(NSEvent *)theEvent
+ {
+ m_buttons &= QFlag(~int(Qt::LeftButton));
+ [self handleMouseEvent:theEvent];
+ }
+
+- (void)mouseMoved:(NSEvent *)theEvent
+{
+ qDebug() << "mouseMove";
+ [self handleMouseEvent:theEvent];
+}
+- (void)mouseEntered:(NSEvent *)theEvent
+{
+ Q_UNUSED(theEvent);
+ QWindowSystemInterface::handleEnterEvent(m_widget);
+}
+- (void)mouseExited:(NSEvent *)theEvent
+{
+ Q_UNUSED(theEvent);
+ QWindowSystemInterface::handleLeaveEvent(m_widget);
+}
+- (void)rightMouseDown:(NSEvent *)theEvent
+{
+ m_buttons |= Qt::RightButton;
+ [self handleMouseEvent:theEvent];
+}
+- (void)rightMouseDragged:(NSEvent *)theEvent
+{
+ if (!(m_buttons & Qt::LeftButton))
+ qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
+ [self handleMouseEvent:theEvent];
+}
+- (void)rightMouseUp:(NSEvent *)theEvent
+{
+ m_buttons &= QFlag(~int(Qt::RightButton));
+ [self handleMouseEvent:theEvent];
+}
+- (void)otherMouseDown:(NSEvent *)theEvent
+{
+ m_buttons |= Qt::RightButton;
+ [self handleMouseEvent:theEvent];
+}
+- (void)otherMouseDragged:(NSEvent *)theEvent
+{
+ if (!(m_buttons & Qt::LeftButton))
+ qWarning("Internal Mousebutton tracking invalid(missing Qt::LeftButton");
+ [self handleMouseEvent:theEvent];
+}
+- (void)otherMouseUp:(NSEvent *)theEvent
+{
+ m_buttons &= QFlag(~int(Qt::MiddleButton));
+ [self handleMouseEvent:theEvent];
+}
+
+
+
+@end
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h
new file mode 100644
index 0000000000..f4dcec73dd
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QNSWINDOWDELEGATE_H
+#define QNSWINDOWDELEGATE_H
+
+#include <Cocoa/Cocoa.h>
+
+#include "qcocoawindow.h"
+
+@interface QNSWindowDelegate : NSObject <NSWindowDelegate>
+{
+ QCocoaWindow *m_cocoaWindow;
+}
+
+- (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow;
+
+- (void)windowDidResize:(NSNotification *)notification;
+- (void)windowWillClose:(NSNotification *)notification;
+
+@end
+
+#endif // QNSWINDOWDELEGATE_H
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
new file mode 100644
index 0000000000..58dffb7c09
--- /dev/null
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qnswindowdelegate.h"
+
+#include <QDebug>
+#include <QWindowSystemInterface>
+
+@implementation QNSWindowDelegate
+
+- (id) initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow
+{
+ self = [super init];
+
+ if (self) {
+ m_cocoaWindow = cocoaWindow;
+ }
+ return self;
+}
+
+- (void)windowDidResize:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ if (m_cocoaWindow) {
+ m_cocoaWindow->windowDidResize();
+ }
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ QWindowSystemInterface::handleCloseEvent(m_cocoaWindow->widget());
+}
+
+@end
diff --git a/src/plugins/platforms/directfb/directfb.pro b/src/plugins/platforms/directfb/directfb.pro
new file mode 100644
index 0000000000..65c49e386f
--- /dev/null
+++ b/src/plugins/platforms/directfb/directfb.pro
@@ -0,0 +1,35 @@
+TARGET = qdirectfb
+include(../../qpluginbase.pri)
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+isEmpty(DIRECTFB_LIBS) {
+ DIRECTFB_LIBS = -ldirectfb -lfusion -ldirect -lpthread
+}
+isEmpty(DIRECTFB_INCLUDEPATH) {
+ DIRECTFB_INCLUDEPATH = /usr/include/directfb
+}
+
+INCLUDEPATH += $$DIRECTFB_INCLUDEPATH
+LIBS += $$DIRECTFB_LIBS
+
+SOURCES = main.cpp \
+ qdirectfbintegration.cpp \
+ qdirectfbwindowsurface.cpp \
+ qdirectfbblitter.cpp \
+ qdirectfbconvenience.cpp \
+ qdirectfbinput.cpp \
+ qdirectfbcursor.cpp \
+ qdirectfbwindow.cpp \
+ qdirectfbglcontext.cpp
+HEADERS = qdirectfbintegration.h \
+ qdirectfbwindowsurface.h \
+ qdirectfbblitter.h \
+ qdirectfbconvenience.h \
+ qdirectfbinput.h \
+ qdirectfbcursor.h \
+ qdirectfbwindow.h \
+ qdirectfbglcontext.h
+
+include(../fontdatabases/genericunix/genericunix.pri)
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/directfb/main.cpp b/src/plugins/platforms/directfb/main.cpp
new file mode 100644
index 0000000000..d9caa70608
--- /dev/null
+++ b/src/plugins/platforms/directfb/main.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qdirectfbintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFbIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QDirectFbIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "directfb";
+ return list;
+}
+
+QPlatformIntegration * QDirectFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "directfb")
+ return new QDirectFbIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(directfb, QDirectFbIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
new file mode 100644
index 0000000000..19998ceb2e
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbblitter.h"
+#include "qdirectfbconvenience.h"
+
+#include <QtGui/private/qpixmap_blitter_p.h>
+
+#include <QDebug>
+
+#include <directfb.h>
+
+QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, IDirectFBSurface *surface)
+ : QBlittable(rect, QBlittable::Capabilities(QBlittable::SolidRectCapability
+ |QBlittable::SourcePixmapCapability
+ |QBlittable::SourceOverPixmapCapability
+ |QBlittable::SourceOverScaledPixmapCapability))
+{
+ if (surface) {
+ m_surface = surface;
+ } else {
+ DFBSurfaceDescription surfaceDesc;
+ memset(&surfaceDesc,0,sizeof(DFBSurfaceDescription));
+ surfaceDesc.width = rect.width();
+ surfaceDesc.height = rect.height();
+ surfaceDesc.caps = DSCAPS_PREMULTIPLIED;
+ surfaceDesc.pixelformat = DSPF_ARGB;
+ surfaceDesc.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_CAPS | DSDESC_PIXELFORMAT);
+
+ IDirectFB *dfb = QDirectFbConvenience::dfbInterface();
+ dfb->CreateSurface(dfb,&surfaceDesc, &m_surface);
+ m_surface->Clear(m_surface,0,0,0,0);
+ }
+
+}
+
+QDirectFbBlitter::~QDirectFbBlitter()
+{
+ unlock();
+ m_surface->Release(m_surface);
+}
+
+void QDirectFbBlitter::fillRect(const QRectF &rect, const QColor &color)
+{
+ m_surface->SetColor(m_surface, color.red(), color.green(), color.blue(), color.alpha());
+// When the blitter api supports non opaque blits, also remember to change
+// qpixmap_blitter.cpp::fill
+// DFBSurfaceDrawingFlags drawingFlags = color.alpha() ? DSDRAW_BLEND : DSDRAW_NOFX;
+// m_surface->SetDrawingFlags(m_surface, drawingFlags);
+ m_surface->SetDrawingFlags(m_surface, DSDRAW_NOFX);
+ m_surface->FillRectangle(m_surface, rect.x(), rect.y(),
+ rect.width(), rect.height());
+}
+
+void QDirectFbBlitter::drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &srcRect)
+{
+ QPixmapData *data = pixmap.pixmapData();
+ Q_ASSERT(data->width() && data->height());
+ Q_ASSERT(data->classId() == QPixmapData::BlitterClass);
+ QBlittablePixmapData *blitPm = static_cast<QBlittablePixmapData*>(data);
+ QDirectFbBlitter *dfbBlitter = static_cast<QDirectFbBlitter *>(blitPm->blittable());
+ dfbBlitter->unlock();
+
+ IDirectFBSurface *s = dfbBlitter->m_surface;
+
+ DFBSurfaceBlittingFlags blittingFlags = DSBLIT_NOFX;
+ DFBSurfacePorterDuffRule porterDuff = DSPD_SRC;
+ if (pixmap.hasAlpha()) {
+ blittingFlags = DSBLIT_BLEND_ALPHACHANNEL;
+ porterDuff = DSPD_SRC_OVER;
+ }
+
+ m_surface->SetBlittingFlags(m_surface, DFBSurfaceBlittingFlags(blittingFlags));
+ m_surface->SetPorterDuff(m_surface,porterDuff);
+ m_surface->SetDstBlendFunction(m_surface,DSBF_INVSRCALPHA);
+
+ const DFBRectangle sRect = { srcRect.x(), srcRect.y(), srcRect.width(), srcRect.height() };
+
+ DFBResult result;
+ if (rect.width() == srcRect.width() && rect.height() == srcRect.height())
+ result = m_surface->Blit(m_surface, s, &sRect, rect.x(), rect.y());
+ else {
+ const DFBRectangle dRect = { rect.x(), rect.y(), rect.width(), rect.height() };
+ result = m_surface->StretchBlit(m_surface, s, &sRect, &dRect);
+ }
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawPixmap()", result);
+}
+
+QImage *QDirectFbBlitter::doLock()
+{
+ Q_ASSERT(m_surface);
+ Q_ASSERT(size().isValid());
+
+ void *mem;
+ int bpl;
+ const DFBResult result = m_surface->Lock(m_surface, DFBSurfaceLockFlags(DSLF_WRITE|DSLF_READ), static_cast<void**>(&mem), &bpl);
+ if (result == DFB_OK) {
+ DFBSurfacePixelFormat dfbFormat;
+ DFBSurfaceCapabilities dfbCaps;
+ m_surface->GetPixelFormat(m_surface,&dfbFormat);
+ m_surface->GetCapabilities(m_surface,&dfbCaps);
+ QImage::Format format = QDirectFbConvenience::imageFormatFromSurfaceFormat(dfbFormat, dfbCaps);
+ int w, h;
+ m_surface->GetSize(m_surface,&w,&h);
+ m_image = QImage(static_cast<uchar *>(mem),w,h,bpl,format);
+ } else {
+ DirectFBError("Failed to lock image", result);
+ }
+
+ return &m_image;
+}
+
+void QDirectFbBlitter::doUnlock()
+{
+ m_surface->Unlock(m_surface);
+}
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
new file mode 100644
index 0000000000..bd5dbdac10
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBBLITTER_H
+#define QDIRECTFBBLITTER_H
+
+#include "qdirectfbconvenience.h"
+
+#include <private/qblittable_p.h>
+
+#include <directfb.h>
+
+class QDirectFbBlitter : public QBlittable
+{
+public:
+ QDirectFbBlitter(const QSize &size, IDirectFBSurface *surface = 0);
+ virtual ~QDirectFbBlitter();
+
+ virtual void fillRect(const QRectF &rect, const QColor &color);
+ virtual void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect);
+
+protected:
+ virtual QImage *doLock();
+ virtual void doUnlock();
+
+ IDirectFBSurface *m_surface;
+ QImage m_image;
+
+ friend class QDirectFbConvenience;
+};
+
+class QDirectFbBlitterPixmapData : public QBlittablePixmapData
+{
+public:
+ QBlittable *createBlittable(const QSize &size) const { return new QDirectFbBlitter(size); }
+};
+
+#endif // QDIRECTFBBLITTER_H
diff --git a/src/plugins/platforms/directfb/qdirectfbconvenience.cpp b/src/plugins/platforms/directfb/qdirectfbconvenience.cpp
new file mode 100644
index 0000000000..01cef83adf
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbconvenience.cpp
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbconvenience.h"
+#include "qdirectfbblitter.h"
+
+#include <private/qpixmap_blitter_p.h>
+
+IDirectFB *QDirectFbConvenience::dfbInterface()
+{
+ static IDirectFB *dfb = 0;
+ if (!dfb) {
+ DFBResult result = DirectFBCreate(&dfb);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBConvenience: error creating DirectFB interface",result);
+ return 0;
+ }
+ }
+ return dfb;
+}
+
+IDirectFBDisplayLayer *QDirectFbConvenience::dfbDisplayLayer(int display)
+{
+ IDirectFBDisplayLayer *layer;
+ DFBResult result = QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(),display,&layer);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFbConvenience: "
+ "Unable to get primary display layer!", result);
+ }
+ return layer;
+}
+
+QImage::Format QDirectFbConvenience::imageFormatFromSurfaceFormat(const DFBSurfacePixelFormat format, const DFBSurfaceCapabilities caps)
+{
+ switch (format) {
+ case DSPF_LUT8:
+ return QImage::Format_Indexed8;
+ case DSPF_RGB24:
+ return QImage::Format_RGB888;
+ case DSPF_ARGB4444:
+ return QImage::Format_ARGB4444_Premultiplied;
+ case DSPF_RGB444:
+ return QImage::Format_RGB444;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ return QImage::Format_RGB555;
+ case DSPF_RGB16:
+ return QImage::Format_RGB16;
+ case DSPF_ARGB6666:
+ return QImage::Format_ARGB6666_Premultiplied;
+ case DSPF_RGB18:
+ return QImage::Format_RGB666;
+ case DSPF_RGB32:
+ return QImage::Format_RGB32;
+ case DSPF_ARGB: {
+ if (caps & DSCAPS_PREMULTIPLIED)
+ return QImage::Format_ARGB32_Premultiplied;
+ else return QImage::Format_ARGB32; }
+ default:
+ break;
+ }
+ return QImage::Format_Invalid;
+
+}
+
+int QDirectFbConvenience::colorDepthForSurface(const DFBSurfacePixelFormat format)
+{
+ return ((0x1f << 7) & format) >> 7;
+}
+
+IDirectFBSurface *QDirectFbConvenience::dfbSurfaceForPixmapData(QPixmapData *pixmapData)
+{
+ QBlittablePixmapData *blittablePmData = static_cast<QBlittablePixmapData *>(pixmapData);
+ if (blittablePmData) {
+ QBlittable *blittable = blittablePmData->blittable();
+ QDirectFbBlitter *dfbBlitter = static_cast<QDirectFbBlitter *>(blittable);
+ return dfbBlitter->m_surface;
+ }
+ return 0;
+}
+
+Qt::MouseButton QDirectFbConvenience::mouseButton(DFBInputDeviceButtonIdentifier identifier)
+{
+ switch (identifier){
+ case DIBI_LEFT:
+ return Qt::LeftButton;
+ case DIBI_MIDDLE:
+ return Qt::MidButton;
+ case DIBI_RIGHT:
+ return Qt::RightButton;
+ default:
+ return Qt::NoButton;
+ }
+}
+
+Qt::MouseButtons QDirectFbConvenience::mouseButtons(DFBInputDeviceButtonMask mask)
+{
+ Qt::MouseButtons buttons = Qt::NoButton;
+
+ if (mask & DIBM_LEFT) {
+ buttons |= Qt::LeftButton;
+ }
+ if (mask & DIBM_MIDDLE) {
+ buttons |= Qt::MidButton;
+ }
+ if (mask & DIBM_RIGHT) {
+ buttons |= Qt::RightButton;
+ }
+ return buttons;
+}
+
+Qt::KeyboardModifiers QDirectFbConvenience::keyboardModifiers(DFBInputDeviceModifierMask mask)
+{
+ Qt::KeyboardModifiers modifiers = Qt::NoModifier;
+
+ if (mask & DIMM_SHIFT) {
+ modifiers |= Qt::ShiftModifier;
+ }
+ if (mask & DIMM_ALT) {
+ modifiers |= Qt::AltModifier;
+ }
+ if (mask & DIMM_ALTGR) {
+ modifiers |= Qt::MetaModifier;
+ }
+ if (mask & DIMM_CONTROL) {
+ modifiers |= Qt::ControlModifier;
+ }
+ if (mask & DIMM_META) {
+ modifiers | Qt::MetaModifier;
+ }
+ return modifiers;
+}
+
+QEvent::Type QDirectFbConvenience::eventType(DFBWindowEventType type)
+{
+ switch(type) {
+ case DWET_BUTTONDOWN:
+ return QEvent::MouseButtonPress;
+ case DWET_BUTTONUP:
+ return QEvent::MouseButtonRelease;
+ case DWET_MOTION:
+ return QEvent::MouseMove;
+ case DWET_WHEEL:
+ return QEvent::Wheel;
+ case DWET_KEYDOWN:
+ return QEvent::KeyPress;
+ case DWET_KEYUP:
+ return QEvent::KeyRelease;
+ default:
+ return QEvent::None;
+ }
+}
+QDirectFbKeyMap *QDirectFbConvenience::dfbKeymap = 0;
+QDirectFbKeyMap *QDirectFbConvenience::keyMap()
+{
+ if (!dfbKeymap)
+ dfbKeymap = new QDirectFbKeyMap();
+ return dfbKeymap;
+}
+
+QDirectFbKeyMap::QDirectFbKeyMap()
+{
+ insert(DIKS_BACKSPACE , Qt::Key_Backspace);
+ insert(DIKS_TAB , Qt::Key_Tab);
+ insert(DIKS_RETURN , Qt::Key_Return);
+ insert(DIKS_ESCAPE , Qt::Key_Escape);
+ insert(DIKS_DELETE , Qt::Key_Delete);
+
+ insert(DIKS_CURSOR_LEFT , Qt::Key_Left);
+ insert(DIKS_CURSOR_RIGHT , Qt::Key_Right);
+ insert(DIKS_CURSOR_UP , Qt::Key_Up);
+ insert(DIKS_CURSOR_DOWN , Qt::Key_Down);
+ insert(DIKS_INSERT , Qt::Key_Insert);
+ insert(DIKS_HOME , Qt::Key_Home);
+ insert(DIKS_END , Qt::Key_End);
+ insert(DIKS_PAGE_UP , Qt::Key_PageUp);
+ insert(DIKS_PAGE_DOWN , Qt::Key_PageDown);
+ insert(DIKS_PRINT , Qt::Key_Print);
+ insert(DIKS_PAUSE , Qt::Key_Pause);
+ insert(DIKS_SELECT , Qt::Key_Select);
+ insert(DIKS_GOTO , Qt::Key_OpenUrl);
+ insert(DIKS_CLEAR , Qt::Key_Clear);
+ insert(DIKS_MENU , Qt::Key_Menu);
+ insert(DIKS_HELP , Qt::Key_Help);
+
+ insert(DIKS_INTERNET , Qt::Key_HomePage);
+ insert(DIKS_MAIL , Qt::Key_LaunchMail);
+ insert(DIKS_FAVORITES , Qt::Key_Favorites);
+
+ insert(DIKS_BACK , Qt::Key_Back);
+ insert(DIKS_FORWARD , Qt::Key_Forward);
+ insert(DIKS_VOLUME_UP , Qt::Key_VolumeUp);
+ insert(DIKS_VOLUME_DOWN , Qt::Key_VolumeDown);
+ insert(DIKS_MUTE , Qt::Key_VolumeMute);
+ insert(DIKS_PLAYPAUSE , Qt::Key_Pause);
+ insert(DIKS_PLAY , Qt::Key_MediaPlay);
+ insert(DIKS_STOP , Qt::Key_MediaStop);
+ insert(DIKS_RECORD , Qt::Key_MediaRecord);
+ insert(DIKS_PREVIOUS , Qt::Key_MediaPrevious);
+ insert(DIKS_NEXT , Qt::Key_MediaNext);
+
+ insert(DIKS_F1 , Qt::Key_F1);
+ insert(DIKS_F2 , Qt::Key_F2);
+ insert(DIKS_F3 , Qt::Key_F3);
+ insert(DIKS_F4 , Qt::Key_F4);
+ insert(DIKS_F5 , Qt::Key_F5);
+ insert(DIKS_F6 , Qt::Key_F6);
+ insert(DIKS_F7 , Qt::Key_F7);
+ insert(DIKS_F8 , Qt::Key_F8);
+ insert(DIKS_F9 , Qt::Key_F9);
+ insert(DIKS_F10 , Qt::Key_F10);
+ insert(DIKS_F11 , Qt::Key_F11);
+ insert(DIKS_F12 , Qt::Key_F12);
+
+ insert(DIKS_SHIFT , Qt::Key_Shift);
+ insert(DIKS_CONTROL , Qt::Key_Control);
+ insert(DIKS_ALT , Qt::Key_Alt);
+ insert(DIKS_ALTGR , Qt::Key_AltGr);
+
+ insert(DIKS_META , Qt::Key_Meta);
+ insert(DIKS_SUPER , Qt::Key_Super_L); // ???
+ insert(DIKS_HYPER , Qt::Key_Hyper_L); // ???
+
+ insert(DIKS_CAPS_LOCK , Qt::Key_CapsLock);
+ insert(DIKS_NUM_LOCK , Qt::Key_NumLock);
+ insert(DIKS_SCROLL_LOCK , Qt::Key_ScrollLock);
+
+ insert(DIKS_DEAD_ABOVEDOT , Qt::Key_Dead_Abovedot);
+ insert(DIKS_DEAD_ABOVERING , Qt::Key_Dead_Abovering);
+ insert(DIKS_DEAD_ACUTE , Qt::Key_Dead_Acute);
+ insert(DIKS_DEAD_BREVE , Qt::Key_Dead_Breve);
+ insert(DIKS_DEAD_CARON , Qt::Key_Dead_Caron);
+ insert(DIKS_DEAD_CEDILLA , Qt::Key_Dead_Cedilla);
+ insert(DIKS_DEAD_CIRCUMFLEX , Qt::Key_Dead_Circumflex);
+ insert(DIKS_DEAD_DIAERESIS , Qt::Key_Dead_Diaeresis);
+ insert(DIKS_DEAD_DOUBLEACUTE , Qt::Key_Dead_Doubleacute);
+ insert(DIKS_DEAD_GRAVE , Qt::Key_Dead_Grave);
+ insert(DIKS_DEAD_IOTA , Qt::Key_Dead_Iota);
+ insert(DIKS_DEAD_MACRON , Qt::Key_Dead_Macron);
+ insert(DIKS_DEAD_OGONEK , Qt::Key_Dead_Ogonek);
+ insert(DIKS_DEAD_SEMIVOICED_SOUND , Qt::Key_Dead_Semivoiced_Sound);
+ insert(DIKS_DEAD_TILDE , Qt::Key_Dead_Tilde);
+ insert(DIKS_DEAD_VOICED_SOUND , Qt::Key_Dead_Voiced_Sound);
+ insert(DIKS_SPACE , Qt::Key_Space);
+ insert(DIKS_EXCLAMATION_MARK , Qt::Key_Exclam);
+ insert(DIKS_QUOTATION , Qt::Key_QuoteDbl);
+ insert(DIKS_NUMBER_SIGN , Qt::Key_NumberSign);
+ insert(DIKS_DOLLAR_SIGN , Qt::Key_Dollar);
+ insert(DIKS_PERCENT_SIGN , Qt::Key_Percent);
+ insert(DIKS_AMPERSAND , Qt::Key_Ampersand);
+ insert(DIKS_APOSTROPHE , Qt::Key_Apostrophe);
+ insert(DIKS_PARENTHESIS_LEFT , Qt::Key_ParenLeft);
+ insert(DIKS_PARENTHESIS_RIGHT , Qt::Key_ParenRight);
+ insert(DIKS_ASTERISK , Qt::Key_Asterisk);
+ insert(DIKS_PLUS_SIGN , Qt::Key_Plus);
+ insert(DIKS_COMMA , Qt::Key_Comma);
+ insert(DIKS_MINUS_SIGN , Qt::Key_Minus);
+ insert(DIKS_PERIOD , Qt::Key_Period);
+ insert(DIKS_SLASH , Qt::Key_Slash);
+ insert(DIKS_0 , Qt::Key_0);
+ insert(DIKS_1 , Qt::Key_1);
+ insert(DIKS_2 , Qt::Key_2);
+ insert(DIKS_3 , Qt::Key_3);
+ insert(DIKS_4 , Qt::Key_4);
+ insert(DIKS_5 , Qt::Key_5);
+ insert(DIKS_6 , Qt::Key_6);
+ insert(DIKS_7 , Qt::Key_7);
+ insert(DIKS_8 , Qt::Key_8);
+ insert(DIKS_9 , Qt::Key_9);
+ insert(DIKS_COLON , Qt::Key_Colon);
+ insert(DIKS_SEMICOLON , Qt::Key_Semicolon);
+ insert(DIKS_LESS_THAN_SIGN , Qt::Key_Less);
+ insert(DIKS_EQUALS_SIGN , Qt::Key_Equal);
+ insert(DIKS_GREATER_THAN_SIGN , Qt::Key_Greater);
+ insert(DIKS_QUESTION_MARK , Qt::Key_Question);
+ insert(DIKS_AT , Qt::Key_At);
+ insert(DIKS_CAPITAL_A , Qt::Key_A);
+ insert(DIKS_CAPITAL_B , Qt::Key_B);
+ insert(DIKS_CAPITAL_C , Qt::Key_C);
+ insert(DIKS_CAPITAL_D , Qt::Key_D);
+ insert(DIKS_CAPITAL_E , Qt::Key_E);
+ insert(DIKS_CAPITAL_F , Qt::Key_F);
+ insert(DIKS_CAPITAL_G , Qt::Key_G);
+ insert(DIKS_CAPITAL_H , Qt::Key_H);
+ insert(DIKS_CAPITAL_I , Qt::Key_I);
+ insert(DIKS_CAPITAL_J , Qt::Key_J);
+ insert(DIKS_CAPITAL_K , Qt::Key_K);
+ insert(DIKS_CAPITAL_L , Qt::Key_L);
+ insert(DIKS_CAPITAL_M , Qt::Key_M);
+ insert(DIKS_CAPITAL_N , Qt::Key_N);
+ insert(DIKS_CAPITAL_O , Qt::Key_O);
+ insert(DIKS_CAPITAL_P , Qt::Key_P);
+ insert(DIKS_CAPITAL_Q , Qt::Key_Q);
+ insert(DIKS_CAPITAL_R , Qt::Key_R);
+ insert(DIKS_CAPITAL_S , Qt::Key_S);
+ insert(DIKS_CAPITAL_T , Qt::Key_T);
+ insert(DIKS_CAPITAL_U , Qt::Key_U);
+ insert(DIKS_CAPITAL_V , Qt::Key_V);
+ insert(DIKS_CAPITAL_W , Qt::Key_W);
+ insert(DIKS_CAPITAL_X , Qt::Key_X);
+ insert(DIKS_CAPITAL_Y , Qt::Key_Y);
+ insert(DIKS_CAPITAL_Z , Qt::Key_Z);
+ insert(DIKS_SQUARE_BRACKET_LEFT , Qt::Key_BracketLeft);
+ insert(DIKS_BACKSLASH , Qt::Key_Backslash);
+ insert(DIKS_SQUARE_BRACKET_RIGHT , Qt::Key_BracketRight);
+ insert(DIKS_CIRCUMFLEX_ACCENT , Qt::Key_AsciiCircum);
+ insert(DIKS_UNDERSCORE , Qt::Key_Underscore);
+ insert(DIKS_SMALL_A , Qt::Key_A);
+ insert(DIKS_SMALL_B , Qt::Key_B);
+ insert(DIKS_SMALL_C , Qt::Key_C);
+ insert(DIKS_SMALL_D , Qt::Key_D);
+ insert(DIKS_SMALL_E , Qt::Key_E);
+ insert(DIKS_SMALL_F , Qt::Key_F);
+ insert(DIKS_SMALL_G , Qt::Key_G);
+ insert(DIKS_SMALL_H , Qt::Key_H);
+ insert(DIKS_SMALL_I , Qt::Key_I);
+ insert(DIKS_SMALL_J , Qt::Key_J);
+ insert(DIKS_SMALL_K , Qt::Key_K);
+ insert(DIKS_SMALL_L , Qt::Key_L);
+ insert(DIKS_SMALL_M , Qt::Key_M);
+ insert(DIKS_SMALL_N , Qt::Key_N);
+ insert(DIKS_SMALL_O , Qt::Key_O);
+ insert(DIKS_SMALL_P , Qt::Key_P);
+ insert(DIKS_SMALL_Q , Qt::Key_Q);
+ insert(DIKS_SMALL_R , Qt::Key_R);
+ insert(DIKS_SMALL_S , Qt::Key_S);
+ insert(DIKS_SMALL_T , Qt::Key_T);
+ insert(DIKS_SMALL_U , Qt::Key_U);
+ insert(DIKS_SMALL_V , Qt::Key_V);
+ insert(DIKS_SMALL_W , Qt::Key_W);
+ insert(DIKS_SMALL_X , Qt::Key_X);
+ insert(DIKS_SMALL_Y , Qt::Key_Y);
+ insert(DIKS_SMALL_Z , Qt::Key_Z);
+ insert(DIKS_CURLY_BRACKET_LEFT , Qt::Key_BraceLeft);
+ insert(DIKS_VERTICAL_BAR , Qt::Key_Bar);
+ insert(DIKS_CURLY_BRACKET_RIGHT , Qt::Key_BraceRight);
+ insert(DIKS_TILDE , Qt::Key_AsciiTilde);
+}
diff --git a/src/plugins/platforms/directfb/qdirectfbconvenience.h b/src/plugins/platforms/directfb/qdirectfbconvenience.h
new file mode 100644
index 0000000000..e85c5029e2
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbconvenience.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBCONVENIENCE_H
+#define QDIRECTFBCONVENIENCE_H
+
+#include <QtGui/qimage.h>
+#include <QtCore/QHash>
+#include <QtCore/QEvent>
+#include <QtGui/QPixmap>
+
+#include <directfb.h>
+
+class QDirectFbKeyMap: public QHash<DFBInputDeviceKeySymbol, Qt::Key>
+{
+public:
+ QDirectFbKeyMap();
+};
+
+
+class QDirectFbConvenience
+{
+public:
+ static QImage::Format imageFormatFromSurfaceFormat(const DFBSurfacePixelFormat format, const DFBSurfaceCapabilities caps);
+ static bool pixelFomatHasAlpha(const DFBSurfacePixelFormat format) { return (1 << 16) & format; }
+ static int colorDepthForSurface(const DFBSurfacePixelFormat format);
+
+ //This is set by the graphicssystem constructor
+ static IDirectFB *dfbInterface();
+ static IDirectFBDisplayLayer *dfbDisplayLayer(int display = DLID_PRIMARY);
+
+ static IDirectFBSurface *dfbSurfaceForPixmapData(QPixmapData *);
+
+ static Qt::MouseButton mouseButton(DFBInputDeviceButtonIdentifier identifier);
+ static Qt::MouseButtons mouseButtons(DFBInputDeviceButtonMask mask);
+ static Qt::KeyboardModifiers keyboardModifiers(DFBInputDeviceModifierMask mask);
+ static QEvent::Type eventType(DFBWindowEventType type);
+
+ static QDirectFbKeyMap *keyMap();
+
+private:
+ static QDirectFbKeyMap *dfbKeymap;
+ friend class QDirectFbIntegration;
+};
+
+#endif // QDIRECTFBCONVENIENCE_H
diff --git a/src/plugins/platforms/directfb/qdirectfbcursor.cpp b/src/plugins/platforms/directfb/qdirectfbcursor.cpp
new file mode 100644
index 0000000000..3cd81acbd3
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbcursor.cpp
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbcursor.h"
+#include "qdirectfbconvenience.h"
+
+
+QDirectFBCursor::QDirectFBCursor(QPlatformScreen* screen) :
+ QPlatformCursor(screen), surface(0)
+{
+ QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(),DLID_PRIMARY, &m_layer);
+ image = new QPlatformCursorImage(0, 0, 0, 0, 0, 0);
+}
+
+void QDirectFBCursor::changeCursor(QCursor * cursor, QWidget * widget)
+{
+ Q_UNUSED(widget);
+ int xSpot;
+ int ySpot;
+ QPixmap map;
+
+ if (cursor->shape() != Qt::BitmapCursor) {
+ image->set(cursor->shape());
+ xSpot = image->hotspot().x();
+ ySpot = image->hotspot().y();
+ QImage *i = image->image();
+ map = QPixmap::fromImage(*i);
+ } else {
+ QPoint point = cursor->hotSpot();
+ xSpot = point.x();
+ ySpot = point.y();
+ map = cursor->pixmap();
+ }
+
+ IDirectFBSurface *surface = QDirectFbConvenience::dfbSurfaceForPixmapData(map.pixmapData());
+
+ if (m_layer->SetCooperativeLevel(m_layer, DLSCL_ADMINISTRATIVE) != DFB_OK) {
+ return;
+ }
+ m_layer->SetCursorShape( m_layer, surface, xSpot, ySpot);
+ m_layer->SetCooperativeLevel(m_layer, DLSCL_SHARED);
+}
diff --git a/src/plugins/platforms/directfb/qdirectfbcursor.h b/src/plugins/platforms/directfb/qdirectfbcursor.h
new file mode 100644
index 0000000000..f37bbedde1
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbcursor.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBCURSOR_H
+#define QDIRECTFBCURSOR_H
+
+#include <QPlatformCursor>
+#include <directfb.h>
+class QDirectFbScreen;
+class QDirectFbBlitter;
+
+class QDirectFBCursor : public QPlatformCursor
+{
+public:
+ QDirectFBCursor(QPlatformScreen *screem);
+ void changeCursor(QCursor * cursor, QWidget * widget);
+
+private:
+ IDirectFBDisplayLayer * m_layer;
+ IDirectFBSurface * surface;
+ QPlatformCursorImage * image;
+ QDirectFbBlitter *blitter;
+};
+
+#endif // QDIRECTFBCURSOR_H
diff --git a/src/plugins/platforms/directfb/qdirectfbglcontext.cpp b/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
new file mode 100644
index 0000000000..85effc9446
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbglcontext.h"
+
+#include <directfb/directfbgl.h>
+
+#include <QDebug>
+
+QDirectFbGLContext::QDirectFbGLContext(IDirectFBGL *glContext)
+ : m_dfbGlContext(glContext)
+{
+ DFBResult result;
+ DFBGLAttributes glAttribs;
+ result = m_dfbGlContext->GetAttributes(glContext, &glAttribs);
+ if (result == DFB_OK) {
+ m_windowFormat.setDepthBufferSize(glAttribs.depth_size);
+ m_windowFormat.setStencilBufferSize(glAttribs.stencil_size);
+
+ m_windowFormat.setRedBufferSize(glAttribs.red_size);
+ m_windowFormat.setGreenBufferSize(glAttribs.green_size);
+ m_windowFormat.setBlueBufferSize(glAttribs.blue_size);
+ m_windowFormat.setAlphaBufferSize(glAttribs.alpha_size);
+
+ m_windowFormat.setAccumBufferSize(glAttribs.accum_red_size);
+ m_windowFormat.setAlpha(glAttribs.accum_alpha_size);
+
+ m_windowFormat.setDoubleBuffer(glAttribs.double_buffer);
+ m_windowFormat.setStereo(glAttribs.stereo);
+ }
+}
+
+void QDirectFbGLContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+ m_dfbGlContext->Lock(m_dfbGlContext);
+}
+
+void QDirectFbGLContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+ m_dfbGlContext->Unlock(m_dfbGlContext);
+}
+
+void *QDirectFbGLContext::getProcAddress(const QString &procName)
+{
+ void *proc;
+ DFBResult result = m_dfbGlContext->GetProcAddress(m_dfbGlContext,qPrintable(procName),&proc);
+ if (result == DFB_OK)
+ return proc;
+ return 0;
+}
+
+void QDirectFbGLContext::swapBuffers()
+{
+// m_dfbGlContext->Unlock(m_dfbGlContext); //maybe not in doneCurrent()
+ qDebug() << "Swap buffers";
+}
+
+QPlatformWindowFormat QDirectFbGLContext::platformWindowFormat() const
+{
+ return m_windowFormat;
+}
diff --git a/src/plugins/platforms/directfb/qdirectfbglcontext.h b/src/plugins/platforms/directfb/qdirectfbglcontext.h
new file mode 100644
index 0000000000..f25b1a7def
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbglcontext.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBGLCONTEXT_H
+#define QDIRECTFBGLCONTEXT_H
+
+#include <QPlatformGLContext>
+
+#include "qdirectfbconvenience.h"
+
+class QDirectFbGLContext : public QPlatformGLContext
+{
+public:
+ explicit QDirectFbGLContext(IDirectFBGL *glContext);
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void *getProcAddress(const QString &procName);
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+
+private:
+ IDirectFBGL *m_dfbGlContext;
+
+ QPlatformWindowFormat m_windowFormat;
+
+};
+
+#endif // QDIRECTFBGLCONTEXT_H
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.cpp b/src/plugins/platforms/directfb/qdirectfbinput.cpp
new file mode 100644
index 0000000000..30654bf52e
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbinput.cpp
@@ -0,0 +1,208 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbinput.h"
+#include "qdirectfbconvenience.h"
+
+#include <QThread>
+#include <QDebug>
+#include <QWindowSystemInterface>
+#include <QMouseEvent>
+#include <QEvent>
+#include <QApplication>
+
+#include <directfb.h>
+
+QDirectFbInput::QDirectFbInput(QObject *parent)
+ : QObject(parent), m_shouldStop(false)
+{
+ m_dfbInterface = QDirectFbConvenience::dfbInterface();
+
+ DFBResult ok = m_dfbInterface->CreateEventBuffer(m_dfbInterface,&m_eventBuffer);
+ if (ok != DFB_OK)
+ DirectFBError("Failed to initialise eventbuffer", ok);
+
+ m_dfbInterface->GetDisplayLayer(m_dfbInterface,DLID_PRIMARY, &m_dfbDisplayLayer);
+
+}
+
+void QDirectFbInput::runInputEventLoop()
+{
+ while (true) {
+ m_eventBuffer->WaitForEvent(m_eventBuffer);
+ if (m_shouldStop) {
+ m_waitStop.release();
+ break;
+ }
+ handleEvents();
+ }
+}
+
+void QDirectFbInput::stopInputEventLoop()
+{
+ m_shouldStop = true;
+ m_waitStop.acquire();
+}
+
+void QDirectFbInput::addWindow(DFBWindowID id, QWidget *tlw)
+{
+ m_tlwMap.insert(id,tlw);
+ IDirectFBWindow *window;
+ m_dfbDisplayLayer->GetWindow(m_dfbDisplayLayer,id,&window);
+
+ window->AttachEventBuffer(window,m_eventBuffer);
+}
+
+void QDirectFbInput::removeWindow(WId wId)
+{
+ IDirectFBWindow *window;
+ m_dfbDisplayLayer->GetWindow(m_dfbDisplayLayer,wId, &window);
+
+ window->DetachEventBuffer(window,m_eventBuffer);
+ m_tlwMap.remove(wId);
+}
+
+void QDirectFbInput::handleEvents()
+{
+ DFBResult hasEvent = m_eventBuffer->HasEvent(m_eventBuffer);
+ while(hasEvent == DFB_OK){
+ DFBEvent event;
+ DFBResult ok = m_eventBuffer->GetEvent(m_eventBuffer,&event);
+ if (ok != DFB_OK)
+ DirectFBError("Failed to get event",ok);
+ if (event.clazz == DFEC_WINDOW) {
+ switch (event.window.type) {
+ case DWET_BUTTONDOWN:
+ case DWET_BUTTONUP:
+ case DWET_MOTION:
+ handleMouseEvents(event);
+ break;
+ case DWET_WHEEL:
+ handleWheelEvent(event);
+ break;
+ case DWET_KEYDOWN:
+ case DWET_KEYUP:
+ handleKeyEvents(event);
+ break;
+ case DWET_ENTER:
+ case DWET_LEAVE:
+ handleEnterLeaveEvents(event);
+ default:
+ break;
+ }
+
+ }
+
+ hasEvent = m_eventBuffer->HasEvent(m_eventBuffer);
+ }
+}
+
+void QDirectFbInput::handleMouseEvents(const DFBEvent &event)
+{
+ QPoint p(event.window.x, event.window.y);
+ QPoint globalPos = globalPoint(event);
+ Qt::MouseButtons buttons = QDirectFbConvenience::mouseButtons(event.window.buttons);
+
+ IDirectFBDisplayLayer *layer = QDirectFbConvenience::dfbDisplayLayer();
+ IDirectFBWindow *window;
+ layer->GetWindow(layer,event.window.window_id,&window);
+
+ long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
+
+ if (event.window.type == DWET_BUTTONDOWN) {
+ window->GrabPointer(window);
+ } else if (event.window.type == DWET_BUTTONUP) {
+ window->UngrabPointer(window);
+ }
+ QWidget *tlw = m_tlwMap.value(event.window.window_id);
+ QWindowSystemInterface::handleMouseEvent(tlw, timestamp, p, globalPos, buttons);
+}
+
+void QDirectFbInput::handleWheelEvent(const DFBEvent &event)
+{
+ QPoint p(event.window.cx, event.window.cy);
+ QPoint globalPos = globalPoint(event);
+ long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
+ QWidget *tlw = m_tlwMap.value(event.window.window_id);
+ QWindowSystemInterface::handleWheelEvent(tlw, timestamp, p, globalPos,
+ event.window.step*120,
+ Qt::Vertical);
+}
+
+void QDirectFbInput::handleKeyEvents(const DFBEvent &event)
+{
+ QEvent::Type type = QDirectFbConvenience::eventType(event.window.type);
+ Qt::Key key = QDirectFbConvenience::keyMap()->value(event.window.key_symbol);
+ Qt::KeyboardModifiers modifiers = QDirectFbConvenience::keyboardModifiers(event.window.modifiers);
+
+ long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
+
+ QChar character;
+ if (DFB_KEY_TYPE(event.window.key_symbol) == DIKT_UNICODE)
+ character = QChar(event.window.key_symbol);
+ QWidget *tlw = m_tlwMap.value(event.window.window_id);
+ QWindowSystemInterface::handleKeyEvent(tlw, timestamp, type, key, modifiers, character);
+}
+
+void QDirectFbInput::handleEnterLeaveEvents(const DFBEvent &event)
+{
+ QWidget *tlw = m_tlwMap.value(event.window.window_id);
+ switch (event.window.type) {
+ case DWET_ENTER:
+ QWindowSystemInterface::handleEnterEvent(tlw);
+ break;
+ case DWET_LEAVE:
+ QWindowSystemInterface::handleLeaveEvent(tlw);
+ break;
+ default:
+ break;
+ }
+}
+
+inline QPoint QDirectFbInput::globalPoint(const DFBEvent &event) const
+{
+ IDirectFBWindow *window;
+ m_dfbDisplayLayer->GetWindow(m_dfbDisplayLayer,event.window.window_id,&window);
+ int x,y;
+ window->GetPosition(window,&x,&y);
+ return QPoint(event.window.cx +x, event.window.cy + y);
+}
+
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.h b/src/plugins/platforms/directfb/qdirectfbinput.h
new file mode 100644
index 0000000000..35a345c07b
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbinput.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBINPUT_H
+#define QDIRECTFBINPUT_H
+
+#include <QSemaphore>
+#include <QObject>
+#include <QHash>
+#include <QPoint>
+#include <QEvent>
+
+#include <QtGui/qwindowdefs.h>
+
+#include <directfb.h>
+
+class QDirectFbInput : public QObject
+{
+ Q_OBJECT
+public:
+ QDirectFbInput(QObject *parent);
+ void addWindow(DFBWindowID id, QWidget *tlw);
+ void removeWindow(WId wId);
+
+public slots:
+ void runInputEventLoop();
+ void stopInputEventLoop();
+ void handleEvents();
+
+private:
+ void handleMouseEvents(const DFBEvent &event);
+ void handleWheelEvent(const DFBEvent &event);
+ void handleKeyEvents(const DFBEvent &event);
+ void handleEnterLeaveEvents(const DFBEvent &event);
+ inline QPoint globalPoint(const DFBEvent &event) const;
+
+
+ IDirectFB *m_dfbInterface;
+ IDirectFBDisplayLayer *m_dfbDisplayLayer;
+ IDirectFBEventBuffer *m_eventBuffer;
+
+ bool m_shouldStop;
+ QSemaphore m_waitStop;
+
+ QHash<DFBWindowID,QWidget *>m_tlwMap;
+};
+
+#endif // QDIRECTFBINPUT_H
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
new file mode 100644
index 0000000000..52b7774548
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbintegration.h"
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbblitter.h"
+#include "qdirectfbconvenience.h"
+#include "qdirectfbcursor.h"
+#include "qdirectfbwindow.h"
+
+#include "qgenericunixfontdatabase.h"
+
+#include <private/qwindowsurface_raster_p.h>
+#include <private/qpixmap_raster_p.h>
+
+#include <QtGui/private/qpixmap_blitter_p.h>
+#include <QtGui/private/qpixmapdata_p.h>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QThread>
+
+QT_BEGIN_NAMESPACE
+
+QDirectFbScreen::QDirectFbScreen(int display)
+ :QPlatformScreen()
+{
+ m_layer = QDirectFbConvenience::dfbDisplayLayer(display);
+ m_layer->SetCooperativeLevel(m_layer,DLSCL_SHARED);
+
+ DFBDisplayLayerConfig config;
+ m_layer->GetConfiguration(m_layer, &config);
+
+ m_format = QDirectFbConvenience::imageFormatFromSurfaceFormat(config.pixelformat, config.surface_caps);
+ m_geometry = QRect(0,0,config.width,config.height);
+ const int dpi = 72;
+ const qreal inch = 25.4;
+ m_depth = QDirectFbConvenience::colorDepthForSurface(config.pixelformat);
+ m_physicalSize = QSize(qRound(config.width * inch / dpi), qRound(config.height *inch / dpi));
+
+ cursor = new QDirectFBCursor(this);
+}
+
+QDirectFbScreen::~QDirectFbScreen()
+{
+}
+
+QDirectFbIntegration::QDirectFbIntegration()
+ : mFontDb(new QGenericUnixFontDatabase())
+{
+ const QStringList args = QCoreApplication::arguments();
+ int argc = args.size();
+ char **argv = new char*[argc];
+
+ for (int i = 0; i < argc; ++i)
+ argv[i] = qstrdup(args.at(i).toLocal8Bit().constData());
+
+ DFBResult result = DirectFBInit(&argc, &argv);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen: error initializing DirectFB",
+ result);
+ }
+ delete[] argv;
+
+
+ QDirectFbScreen *primaryScreen = new QDirectFbScreen(0);
+ mScreens.append(primaryScreen);
+
+ mInputRunner = new QThread;
+ mInput = new QDirectFbInput(0);
+ mInput->moveToThread(mInputRunner);
+ QObject::connect(mInputRunner,SIGNAL(started()),mInput,SLOT(runInputEventLoop()));
+ mInputRunner->start();
+}
+
+QDirectFbIntegration::~QDirectFbIntegration()
+{
+ mInput->stopInputEventLoop();
+ delete mInputRunner;
+ delete mInput;
+}
+
+QPixmapData *QDirectFbIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ if (type == QPixmapData::BitmapType)
+ return new QRasterPixmapData(type);
+ else
+ return new QDirectFbBlitterPixmapData;
+}
+
+QPlatformWindow *QDirectFbIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ QDirectFbInput *input = const_cast<QDirectFbInput *>(mInput);//gah
+ return new QDirectFbWindow(widget,input);
+}
+
+QWindowSurface *QDirectFbIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ return new QDirectFbWindowSurface(widget,winId);
+}
+
+QPlatformFontDatabase *QDirectFbIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
new file mode 100644
index 0000000000..bfd4af4230
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMINTEGRATION_DIRECTFB_H
+#define QPLATFORMINTEGRATION_DIRECTFB_H
+
+#include "qdirectfbinput.h"
+
+#include <QtGui/QPlatformIntegration>
+#include <directfb.h>
+#include <directfb_version.h>
+
+QT_BEGIN_NAMESPACE
+
+class QThread;
+class QDirectFBCursor;
+
+class QDirectFbScreen : public QPlatformScreen
+{
+Q_OBJECT
+public:
+ QDirectFbScreen(int display);
+ ~QDirectFbScreen();
+
+ QRect geometry() const { return m_geometry; }
+ int depth() const { return m_depth; }
+ QImage::Format format() const { return m_format; }
+ QSize physicalSize() const { return m_physicalSize; }
+
+public:
+ QRect m_geometry;
+ int m_depth;
+ QImage::Format m_format;
+ QSize m_physicalSize;
+
+ IDirectFBDisplayLayer *m_layer;
+
+private:
+ QDirectFBCursor * cursor;
+
+};
+
+class QDirectFbIntegration : public QPlatformIntegration
+{
+public:
+ QDirectFbIntegration();
+ ~QDirectFbIntegration();
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+private:
+ QList<QPlatformScreen *> mScreens;
+ QDirectFbInput *mInput;
+ QThread *mInputRunner;
+ QPlatformFontDatabase *mFontDb;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.cpp b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
new file mode 100644
index 0000000000..040580b630
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
@@ -0,0 +1,191 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbwindow.h"
+#include "qdirectfbinput.h"
+#include "qdirectfbglcontext.h"
+
+#include <QWidget>
+
+#include "qdirectfbwindowsurface.h"
+
+#include <directfb.h>
+
+QDirectFbWindow::QDirectFbWindow(QWidget *tlw, QDirectFbInput *inputhandler)
+ : QPlatformWindow(tlw), m_inputHandler(inputhandler), m_context(0)
+{
+ IDirectFBDisplayLayer *layer = QDirectFbConvenience::dfbDisplayLayer();
+ DFBDisplayLayerConfig layerConfig;
+ layer->GetConfiguration(layer,&layerConfig);
+
+ DFBWindowDescription description;
+ memset(&description,0,sizeof(DFBWindowDescription));
+ description.flags = DFBWindowDescriptionFlags(DWDESC_WIDTH|DWDESC_HEIGHT|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS
+#if DIRECTFB_MINOR_VERSION >= 1
+ |DWDESC_OPTIONS
+#endif
+ |DWDESC_CAPS);
+ description.width = tlw->rect().width();
+ description.height = tlw->rect().height();
+ description.posx = tlw->rect().x();
+ description.posy = tlw->rect().y();
+
+ if (layerConfig.surface_caps & DSCAPS_PREMULTIPLIED)
+ description.surface_caps = DSCAPS_PREMULTIPLIED;
+ description.pixelformat = layerConfig.pixelformat;
+
+#if DIRECTFB_MINOR_VERSION >= 1
+ description.options = DFBWindowOptions(DWOP_ALPHACHANNEL);
+#endif
+ description.caps = DFBWindowCapabilities(DWCAPS_DOUBLEBUFFER|DWCAPS_ALPHACHANNEL);
+ description.surface_caps = DSCAPS_PREMULTIPLIED;
+
+ DFBResult result = layer->CreateWindow(layer,&description,&m_dfbWindow);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFbGraphicsSystemScreen: failed to create window",result);
+ }
+
+ m_dfbWindow->SetOpacity(m_dfbWindow,0xff);
+
+ setVisible(widget()->isVisible());
+
+ DFBWindowID id;
+ m_dfbWindow->GetID(m_dfbWindow, &id);
+ m_inputHandler->addWindow(id,tlw);
+}
+
+QDirectFbWindow::~QDirectFbWindow()
+{
+ m_inputHandler->removeWindow(winId());
+ m_dfbWindow->Destroy(m_dfbWindow);
+}
+
+void QDirectFbWindow::setGeometry(const QRect &rect)
+{
+ bool isMoveOnly = (rect.topLeft() != geometry().topLeft()) && (rect.size() == geometry().size());
+ QPlatformWindow::setGeometry(rect);
+ if (widget()->isVisible() && !(widget()->testAttribute(Qt::WA_DontShowOnScreen))) {
+ m_dfbWindow->SetBounds(m_dfbWindow, rect.x(),rect.y(),
+ rect.width(), rect.height());
+
+ //Hack. When moving since the WindowSurface of a window becomes invalid when moved
+ if (isMoveOnly) { //if resize then windowsurface is updated.
+ widget()->windowSurface()->resize(rect.size());
+ widget()->update();
+ }
+ }
+}
+
+void QDirectFbWindow::setOpacity(qreal level)
+{
+ const quint8 windowOpacity = quint8(level * 0xff);
+ m_dfbWindow->SetOpacity(m_dfbWindow,windowOpacity);
+}
+
+void QDirectFbWindow::setVisible(bool visible)
+{
+ if (visible) {
+ int x = geometry().x();
+ int y = geometry().y();
+ m_dfbWindow->MoveTo(m_dfbWindow,x,y);
+ } else {
+ IDirectFBDisplayLayer *displayLayer;
+ QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(),DLID_PRIMARY,&displayLayer);
+
+ DFBDisplayLayerConfig config;
+ displayLayer->GetConfiguration(displayLayer,&config);
+ m_dfbWindow->MoveTo(m_dfbWindow,config.width+1,config.height + 1);
+ }
+}
+
+Qt::WindowFlags QDirectFbWindow::setWindowFlags(Qt::WindowFlags flags)
+{
+ switch (flags & Qt::WindowType_Mask) {
+ case Qt::ToolTip: {
+ DFBWindowOptions options;
+ m_dfbWindow->GetOptions(m_dfbWindow,&options);
+ options = DFBWindowOptions(options | DWOP_GHOST);
+ m_dfbWindow->SetOptions(m_dfbWindow,options);
+ break; }
+ default:
+ break;
+ }
+
+ m_dfbWindow->SetStackingClass(m_dfbWindow, flags & Qt::WindowStaysOnTopHint ? DWSC_UPPER : DWSC_MIDDLE);
+ return flags;
+}
+
+void QDirectFbWindow::raise()
+{
+ m_dfbWindow->RaiseToTop(m_dfbWindow);
+}
+
+void QDirectFbWindow::lower()
+{
+ m_dfbWindow->LowerToBottom(m_dfbWindow);
+}
+
+WId QDirectFbWindow::winId() const
+{
+ DFBWindowID id;
+ m_dfbWindow->GetID(m_dfbWindow, &id);
+ return WId(id);
+}
+
+QPlatformGLContext *QDirectFbWindow::glContext() const
+{
+ if (!m_context) {
+ IDirectFBSurface *surface;
+ DFBResult result = m_dfbWindow->GetSurface(m_dfbWindow,&surface);
+ if (result != DFB_OK) {
+ qWarning("could not retrieve surface in QDirectFbWindow::glContext()");
+ return 0;
+ }
+ IDirectFBGL *gl;
+ result = surface->GetGL(surface,&gl);
+ if (result != DFB_OK) {
+ qWarning("could not retrieve IDirectFBGL in QDirectFbWindow::glContext()");
+ return 0;
+ }
+ const_cast<QDirectFbWindow *>(this)->m_context = new QDirectFbGLContext(gl);
+ }
+ return m_context;
+}
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.h b/src/plugins/platforms/directfb/qdirectfbwindow.h
new file mode 100644
index 0000000000..4c6476a2b3
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBWINDOW_H
+#define QDIRECTFBWINDOW_H
+
+#include <QPlatformWindow>
+
+#include "qdirectfbconvenience.h"
+#include "qdirectfbinput.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFbWindow : public QPlatformWindow
+{
+public:
+ QDirectFbWindow(QWidget *tlw, QDirectFbInput *inputhandler);
+ ~QDirectFbWindow();
+
+ void setGeometry(const QRect &rect);
+ void setOpacity(qreal level);
+
+ void setVisible(bool visible);
+
+ Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+ void raise();
+ void lower();
+ WId winId() const;
+
+ QPlatformGLContext *glContext() const;
+
+private:
+ IDirectFBWindow *m_dfbWindow;
+ QDirectFbInput *m_inputHandler;
+
+ QPlatformGLContext *m_context;
+};
+
+QT_END_NAMESPACE
+
+#endif // QDIRECTFBWINDOW_H
diff --git a/src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp b/src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp
new file mode 100644
index 0000000000..81f989da5d
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbintegration.h"
+#include "qdirectfbblitter.h"
+#include "qdirectfbconvenience.h"
+#include <private/qpixmap_blitter_p.h>
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+QDirectFbWindowSurface::QDirectFbWindowSurface(QWidget *window, WId wId)
+ : QWindowSurface(window), m_pixmap(0), m_pmdata(0), m_dfbSurface(0)
+{
+
+ IDirectFBDisplayLayer *layer = QDirectFbConvenience::dfbDisplayLayer();
+
+ DFBWindowID id(wId);
+ IDirectFBWindow *dfbWindow;
+
+ layer->GetWindow(layer,id,&dfbWindow);
+
+ dfbWindow->GetSurface(dfbWindow,&m_dfbSurface);
+//WRONGSIZE
+ QDirectFbBlitter *blitter = new QDirectFbBlitter(window->rect().size(), m_dfbSurface);
+ m_pmdata = new QDirectFbBlitterPixmapData;
+ m_pmdata->setBlittable(blitter);
+ m_pixmap = new QPixmap(m_pmdata);
+}
+
+QDirectFbWindowSurface::~QDirectFbWindowSurface()
+{
+ delete m_pixmap;
+}
+
+QPaintDevice *QDirectFbWindowSurface::paintDevice()
+{
+ return m_pixmap;
+}
+
+void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ m_pmdata->blittable()->unlock();
+
+ QVector<QRect> rects = region.rects();
+ for (int i = 0 ; i < rects.size(); i++) {
+ const QRect rect = rects.at(i);
+ DFBRegion dfbReg = { rect.x() + offset.x(),rect.y() + offset.y(),rect.right() + offset.x(),rect.bottom() + offset.y()};
+ m_dfbSurface->Flip(m_dfbSurface, &dfbReg, DFBSurfaceFlipFlags(DSFLIP_BLIT|DSFLIP_ONSYNC));
+ }
+}
+
+void QDirectFbWindowSurface::resize(const QSize &size)
+{
+ QWindowSurface::resize(size);
+
+ //Have to add 1 ref ass it will be removed by deleting the old blitter in setBlittable
+ m_dfbSurface->AddRef(m_dfbSurface);
+ QDirectFbBlitter *blitter = new QDirectFbBlitter(size,m_dfbSurface);
+ m_pmdata->setBlittable(blitter);
+}
+
+static inline void scrollSurface(IDirectFBSurface *surface, const QRect &r, int dx, int dy)
+{
+ const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() };
+ surface->Blit(surface, surface, &rect, r.x() + dx, r.y() + dy);
+ const DFBRegion region = { rect.x + dx, rect.y + dy, r.right() + dx, r.bottom() + dy };
+ surface->Flip(surface, &region, DFBSurfaceFlipFlags(DSFLIP_BLIT));
+}
+
+bool QDirectFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ m_pmdata->blittable()->unlock();
+
+ if (!m_dfbSurface || area.isEmpty())
+ return false;
+ m_dfbSurface->SetBlittingFlags(m_dfbSurface, DSBLIT_NOFX);
+ if (area.rectCount() == 1) {
+ scrollSurface(m_dfbSurface, area.boundingRect(), dx, dy);
+ } else {
+ const QVector<QRect> rects = area.rects();
+ const int n = rects.size();
+ for (int i=0; i<n; ++i) {
+ scrollSurface(m_dfbSurface, rects.at(i), dx, dy);
+ }
+ }
+ return true;
+}
+
+void QDirectFbWindowSurface::beginPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+void QDirectFbWindowSurface::endPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbwindowsurface.h b/src/plugins/platforms/directfb/qdirectfbwindowsurface.h
new file mode 100644
index 0000000000..a762bf6241
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbwindowsurface.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_DIRECTFB_H
+#define QWINDOWSURFACE_DIRECTFB_H
+
+#include <QtGui/private/qwindowsurface_p.h>
+#include <private/qpixmap_blitter_p.h>
+
+#include <directfb.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFbWindowSurface : public QWindowSurface
+{
+public:
+ QDirectFbWindowSurface(QWidget *window, WId wid);
+ ~QDirectFbWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize (const QSize &size);
+ bool scroll(const QRegion &area, int dx, int dy);
+
+ void beginPaint(const QRegion &region);
+ void endPaint(const QRegion &region);
+
+private:
+ void lockSurfaceToImage();
+
+ QPixmap *m_pixmap;
+ QBlittablePixmapData *m_pmdata;
+
+ IDirectFBSurface *m_dfbSurface;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/eglconvenience/eglconvenience.pri b/src/plugins/platforms/eglconvenience/eglconvenience.pri
new file mode 100644
index 0000000000..322d4e4633
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/eglconvenience.pri
@@ -0,0 +1,7 @@
+INCLUDEPATH += $$PWD
+
+SOURCES += \
+ $$PWD/qeglconvenience.cpp
+
+HEADERS += \
+ $$PWD/qeglconvenience.h
diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp
new file mode 100644
index 0000000000..df7abc1401
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp
@@ -0,0 +1,324 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeglconvenience.h"
+
+QT_BEGIN_NAMESPACE
+
+QVector<EGLint> q_createConfigAttributesFromFormat(const QPlatformWindowFormat &format)
+{
+ int redSize = format.redBufferSize();
+ int greenSize = format.greenBufferSize();
+ int blueSize = format.blueBufferSize();
+ int alphaSize = format.alphaBufferSize();
+ int depthSize = format.depthBufferSize();
+ int stencilSize = format.stencilBufferSize();
+ int sampleCount = format.samples();
+
+ // QPlatformWindowFormat uses a magic value of -1 to indicate "don't care", even when a buffer of that
+ // type has been requested. So we must check QPlatformWindowFormat's booleans too if size is -1:
+ if (format.alpha() && alphaSize <= 0)
+ alphaSize = 1;
+ if (format.depth() && depthSize <= 0)
+ depthSize = 1;
+ if (format.stencil() && stencilSize <= 0)
+ stencilSize = 1;
+ if (format.sampleBuffers() && sampleCount <= 0)
+ sampleCount = 1;
+
+ // We want to make sure 16-bit configs are chosen over 32-bit configs as they will provide
+ // the best performance. The EGL config selection algorithm is a bit stange in this regard:
+ // The selection criteria for EGL_BUFFER_SIZE is "AtLeast", so we can't use it to discard
+ // 32-bit configs completely from the selection. So it then comes to the sorting algorithm.
+ // The red/green/blue sizes have a sort priority of 3, so they are sorted by first. The sort
+ // order is special and described as "by larger _total_ number of color bits.". So EGL will
+ // put 32-bit configs in the list before the 16-bit configs. However, the spec also goes on
+ // to say "If the requested number of bits in attrib_list for a particular component is 0,
+ // then the number of bits for that component is not considered". This part of the spec also
+ // seems to imply that setting the red/green/blue bits to zero means none of the components
+ // are considered and EGL disregards the entire sorting rule. It then looks to the next
+ // highest priority rule, which is EGL_BUFFER_SIZE. Despite the selection criteria being
+ // "AtLeast" for EGL_BUFFER_SIZE, it's sort order is "smaller" meaning 16-bit configs are
+ // put in the list before 32-bit configs. So, to make sure 16-bit is preffered over 32-bit,
+ // we must set the red/green/blue sizes to zero. This has an unfortunate consequence that
+ // if the application sets the red/green/blue size to 5/6/5 on the QPlatformWindowFormat,
+ // they will probably get a 32-bit config, even when there's an RGB565 config available.
+
+ // Now normalize the values so -1 becomes 0
+ redSize = redSize > 0 ? redSize : 0;
+ greenSize = greenSize > 0 ? greenSize : 0;
+ blueSize = blueSize > 0 ? blueSize : 0;
+ alphaSize = alphaSize > 0 ? alphaSize : 0;
+ depthSize = depthSize > 0 ? depthSize : 0;
+ stencilSize = stencilSize > 0 ? stencilSize : 0;
+ sampleCount = sampleCount > 0 ? sampleCount : 0;
+
+ QVector<EGLint> configAttributes;
+
+ configAttributes.append(EGL_RED_SIZE);
+ configAttributes.append(redSize);
+
+ configAttributes.append(EGL_GREEN_SIZE);
+ configAttributes.append(greenSize);
+
+ configAttributes.append(EGL_BLUE_SIZE);
+ configAttributes.append(blueSize);
+
+ configAttributes.append(EGL_ALPHA_SIZE);
+ configAttributes.append(alphaSize);
+
+ configAttributes.append(EGL_DEPTH_SIZE);
+ configAttributes.append(depthSize);
+
+ configAttributes.append(EGL_STENCIL_SIZE);
+ configAttributes.append(stencilSize);
+
+ configAttributes.append(EGL_SAMPLES);
+ configAttributes.append(sampleCount);
+
+ configAttributes.append(EGL_SAMPLE_BUFFERS);
+ configAttributes.append(sampleCount? 1:0);
+
+ return configAttributes;
+}
+
+bool q_reduceConfigAttributes(QVector<EGLint> *configAttributes)
+{
+ int i = -1;
+ // Reduce the complexity of a configuration request to ask for less
+ // because the previous request did not result in success. Returns
+ // true if the complexity was reduced, or false if no further
+ // reductions in complexity are possible.
+
+ i = configAttributes->indexOf(EGL_SWAP_BEHAVIOR);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+ }
+
+#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
+ // For OpenVG, we sometimes try to create a surface using a pre-multiplied format. If we can't
+ // find a config which supports pre-multiplied formats, remove the flag on the surface type:
+
+ i = configAttributes->indexOf(EGL_SURFACE_TYPE);
+ if (i >= 0) {
+ EGLint surfaceType = configAttributes->at(i +1);
+ if (surfaceType & EGL_VG_ALPHA_FORMAT_PRE_BIT) {
+ surfaceType ^= EGL_VG_ALPHA_FORMAT_PRE_BIT;
+ configAttributes->replace(i+1,surfaceType);
+ return true;
+ }
+ }
+#endif
+
+ // EGL chooses configs with the highest color depth over
+ // those with smaller (but faster) lower color depths. One
+ // way around this is to set EGL_BUFFER_SIZE to 16, which
+ // trumps the others. Of course, there may not be a 16-bit
+ // config available, so it's the first restraint we remove.
+ i = configAttributes->indexOf(EGL_BUFFER_SIZE);
+ if (i >= 0) {
+ if (configAttributes->at(i+1) == 16) {
+ configAttributes->remove(i,2);
+ return true;
+ }
+ }
+
+ i = configAttributes->indexOf(EGL_SAMPLE_BUFFERS);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+ i = configAttributes->indexOf(EGL_SAMPLES);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+ }
+ return true;
+ }
+
+ i = configAttributes->indexOf(EGL_ALPHA_SIZE);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+#if defined(EGL_BIND_TO_TEXTURE_RGBA) && defined(EGL_BIND_TO_TEXTURE_RGB)
+ i = configAttributes->indexOf(EGL_BIND_TO_TEXTURE_RGBA);
+ if (i >= 0) {
+ configAttributes->replace(i,EGL_BIND_TO_TEXTURE_RGB);
+ configAttributes->replace(i+1,TRUE);
+
+ }
+#endif
+ return true;
+ }
+
+ i = configAttributes->indexOf(EGL_STENCIL_SIZE);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+ return true;
+ }
+ i = configAttributes->indexOf(EGL_DEPTH_SIZE);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+ return true;
+ }
+#ifdef EGL_BIND_TO_TEXTURE_RGB
+ i = configAttributes->indexOf(EGL_BIND_TO_TEXTURE_RGB);
+ if (i >= 0) {
+ configAttributes->remove(i,2);
+ return true;
+ }
+#endif
+
+ return false;
+}
+
+EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format, bool highestPixelFormat, int surfaceType)
+{
+ EGLConfig cfg = 0;
+ QVector<EGLint> configureAttributes = q_createConfigAttributesFromFormat(format);
+ configureAttributes.append(EGL_SURFACE_TYPE); //we only support eglconfigs for windows for now
+ configureAttributes.append(surfaceType);
+
+ configureAttributes.append(EGL_RENDERABLE_TYPE);
+ if (format.windowApi() == QPlatformWindowFormat::OpenVG) {
+ configureAttributes.append(EGL_OPENVG_BIT);
+ } else {
+ configureAttributes.append(EGL_OPENGL_ES2_BIT);
+ }
+ configureAttributes.append(EGL_NONE);
+
+ do {
+ // Get the number of matching configurations for this set of properties.
+ EGLint matching = 0;
+ if (!eglChooseConfig(display, configureAttributes.constData(), 0, 0, &matching) || !matching)
+ continue;
+
+ // If we want the best pixel format, then return the first
+ // matching configuration.
+ if (highestPixelFormat) {
+ eglChooseConfig(display, configureAttributes.constData(), &cfg, 1, &matching);
+ if (matching < 1)
+ continue;
+ return cfg;
+ }
+
+ // Fetch all of the matching configurations and find the
+ // first that matches the pixel format we wanted.
+ int i = configureAttributes.indexOf(EGL_RED_SIZE);
+ int confAttrRed = configureAttributes.at(i+1);
+ i = configureAttributes.indexOf(EGL_GREEN_SIZE);
+ int confAttrGreen = configureAttributes.at(i+1);
+ i = configureAttributes.indexOf(EGL_BLUE_SIZE);
+ int confAttrBlue = configureAttributes.at(i+1);
+ i = configureAttributes.indexOf(EGL_ALPHA_SIZE);
+ int confAttrAlpha = configureAttributes.at(i+1);
+
+ EGLint size = matching;
+ EGLConfig *configs = new EGLConfig [size];
+ eglChooseConfig(display, configureAttributes.constData(), configs, size, &matching);
+ for (EGLint index = 0; index < size; ++index) {
+ EGLint red, green, blue, alpha;
+ eglGetConfigAttrib(display, configs[index], EGL_RED_SIZE, &red);
+ eglGetConfigAttrib(display, configs[index], EGL_GREEN_SIZE, &green);
+ eglGetConfigAttrib(display, configs[index], EGL_BLUE_SIZE, &blue);
+ eglGetConfigAttrib(display, configs[index], EGL_ALPHA_SIZE, &alpha);
+ if (red == confAttrRed &&
+ green == confAttrGreen &&
+ blue == confAttrBlue &&
+ (confAttrAlpha == 0 ||
+ alpha == confAttrAlpha)) {
+ cfg = configs[index];
+ delete [] configs;
+ return cfg;
+ }
+ }
+ delete [] configs;
+ } while (q_reduceConfigAttributes(&configureAttributes));
+ qWarning("Cant find EGLConfig, returning null config");
+ return 0;
+}
+
+QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, const EGLConfig config)
+{
+ QPlatformWindowFormat format;
+ EGLint redSize = 0;
+ EGLint greenSize = 0;
+ EGLint blueSize = 0;
+ EGLint alphaSize = 0;
+ EGLint depthSize = 0;
+ EGLint stencilSize = 0;
+ EGLint sampleCount = 0;
+ EGLint level = 0;
+
+ eglGetConfigAttrib(display, config, EGL_RED_SIZE, &redSize);
+ eglGetConfigAttrib(display, config, EGL_GREEN_SIZE, &greenSize);
+ eglGetConfigAttrib(display, config, EGL_BLUE_SIZE, &blueSize);
+ eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &alphaSize);
+ eglGetConfigAttrib(display, config, EGL_DEPTH_SIZE, &depthSize);
+ eglGetConfigAttrib(display, config, EGL_STENCIL_SIZE, &stencilSize);
+ eglGetConfigAttrib(display, config, EGL_SAMPLES, &sampleCount);
+ eglGetConfigAttrib(display, config, EGL_LEVEL, &level);
+
+ format.setRedBufferSize(redSize);
+ format.setGreenBufferSize(greenSize);
+ format.setBlueBufferSize(blueSize);
+ format.setAlphaBufferSize(alphaSize);
+ format.setDepthBufferSize(depthSize);
+ format.setStencilBufferSize(stencilSize);
+ format.setSamples(sampleCount);
+ format.setDirectRendering(true); // All EGL contexts are direct-rendered
+ format.setRgba(true); // EGL doesn't support colour index rendering
+ format.setStereo(false); // EGL doesn't support stereo buffers
+ format.setAccumBufferSize(0); // EGL doesn't support accululation buffers
+
+ // Clear the EGL error state because some of the above may
+ // have errored out because the attribute is not applicable
+ // to the surface type. Such errors don't matter.
+ eglGetError();
+
+ return format;
+}
+
+bool q_hasEglExtension(EGLDisplay display, const char* extensionName)
+{
+ QList<QByteArray> extensions =
+ QByteArray(reinterpret_cast<const char *>
+ (eglQueryString(display, EGL_EXTENSIONS))).split(' ');
+ return extensions.contains(extensionName);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.h b/src/plugins/platforms/eglconvenience/qeglconvenience.h
new file mode 100644
index 0000000000..c7d3d61ae5
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qeglconvenience.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEGLCONVENIENCE_H
+#define QEGLCONVENIENCE_H
+
+
+#include <QtGui/QPlatformWindowFormat>
+#include <QtCore/QVector>
+
+#include <EGL/egl.h>
+QT_BEGIN_NAMESPACE
+
+QVector<EGLint> q_createConfigAttributesFromFormat(const QPlatformWindowFormat &format);
+bool q_reduceConfigAttributes(QVector<EGLint> *configAttributes);
+EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format, bool highestPixelFormat = false, int surfaceType = EGL_WINDOW_BIT);
+QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, const EGLConfig config);
+bool q_hasEglExtension(EGLDisplay display,const char* extensionName);
+
+QT_END_NAMESPACE
+
+#endif //QEGLCONVENIENCE_H
diff --git a/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp b/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp
new file mode 100644
index 0000000000..ae5215f320
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeglplatformcontext.h"
+
+
+#include <QtGui/QPlatformWindow>
+
+#include "qeglconvenience.h"
+
+#include <EGL/egl.h>
+
+QEGLPlatformContext::QEGLPlatformContext(EGLDisplay display, EGLConfig config, EGLint contextAttrs[], EGLSurface surface, EGLenum eglApi)
+ : QPlatformGLContext()
+ , m_eglDisplay(display)
+ , m_eglSurface(surface)
+ , m_eglApi(eglApi)
+{
+ if (m_eglSurface == EGL_NO_SURFACE) {
+ qWarning("Createing QEGLPlatformContext with no surface");
+ }
+
+ eglBindAPI(m_eglApi);
+ m_eglContext = eglCreateContext(m_eglDisplay,config, 0,contextAttrs);
+ if (m_eglContext == EGL_NO_CONTEXT) {
+ qWarning("Could not create the egl context\n");
+ eglTerminate(m_eglDisplay);
+ qFatal("EGL error");
+ }
+
+ m_windowFormat = qt_qPlatformWindowFormatFromConfig(display,config);
+}
+
+QEGLPlatformContext::~QEGLPlatformContext()
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglContext::~QEglContext(): %p\n",this);
+#endif
+ if (m_eglSurface != EGL_NO_SURFACE) {
+ doneCurrent();
+ eglDestroySurface(m_eglDisplay, m_eglSurface);
+ m_eglSurface = EGL_NO_SURFACE;
+ }
+
+ if (m_eglContext != EGL_NO_CONTEXT) {
+ eglDestroyContext(m_eglDisplay, m_eglContext);
+ m_eglContext = EGL_NO_CONTEXT;
+ }
+}
+
+void QEGLPlatformContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglContext::makeCurrent: %p\n",this);
+#endif
+ eglBindAPI(m_eglApi);
+ bool ok = eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext);
+ if (!ok)
+ qWarning("QEGLPlatformContext::makeCurrent: eglError: %d, this: %p \n", eglGetError(), this);
+#ifdef QEGL_EXTRA_DEBUG
+ static bool showDebug = true;
+ if (showDebug) {
+ showDebug = false;
+ const char *str = (const char*)glGetString(GL_VENDOR);
+ qWarning("Vendor %s\n", str);
+ str = (const char*)glGetString(GL_RENDERER);
+ qWarning("Renderer %s\n", str);
+ str = (const char*)glGetString(GL_VERSION);
+ qWarning("Version %s\n", str);
+
+ str = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
+ qWarning("Extensions %s\n",str);
+
+ str = (const char*)glGetString(GL_EXTENSIONS);
+ qWarning("Extensions %s\n", str);
+
+ }
+#endif
+}
+void QEGLPlatformContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglContext::doneCurrent:%p\n",this);
+#endif
+ eglBindAPI(m_eglApi);
+ bool ok = eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ if (!ok)
+ qWarning("QEGLPlatformContext::doneCurrent(): eglError: %d, this: %p \n", eglGetError(), this);
+}
+void QEGLPlatformContext::swapBuffers()
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglContext::swapBuffers:%p\n",this);
+#endif
+ eglBindAPI(m_eglApi);
+ bool ok = eglSwapBuffers(m_eglDisplay, m_eglSurface);
+ if (!ok)
+ qWarning("QEGLPlatformContext::swapBuffers(): eglError: %d, this: %p \n", eglGetError(), this);
+}
+void* QEGLPlatformContext::getProcAddress(const QString& procName)
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglContext::getProcAddress%p\n",this);
+#endif
+ eglBindAPI(m_eglApi);
+ return (void *)eglGetProcAddress(qPrintable(procName));
+}
+
+QPlatformWindowFormat QEGLPlatformContext::platformWindowFormat() const
+{
+ return m_windowFormat;
+}
+
+EGLContext QEGLPlatformContext::eglContext() const
+{
+ return m_eglContext;
+}
diff --git a/src/plugins/platforms/eglconvenience/qeglplatformcontext.h b/src/plugins/platforms/eglconvenience/qeglplatformcontext.h
new file mode 100644
index 0000000000..69835d7eb4
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qeglplatformcontext.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENKODEGLINTEGRATION_H
+#define QOPENKODEGLINTEGRATION_H
+
+#include <QtGui/QPlatformGLContext>
+#include <EGL/egl.h>
+
+class QEGLPlatformContext : public QPlatformGLContext
+{
+public:
+ QEGLPlatformContext(EGLDisplay display, EGLConfig config, EGLint contextAttrs[], EGLSurface surface, EGLenum eglApi);
+ ~QEGLPlatformContext();
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString& procName);
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+ EGLContext eglContext() const;
+private:
+ EGLContext m_eglContext;
+ EGLDisplay m_eglDisplay;
+ EGLSurface m_eglSurface;
+ EGLenum m_eglApi;
+
+ QPlatformWindowFormat m_windowFormat;
+};
+
+#endif //QOPENKODEGLINTEGRATION_H
diff --git a/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
new file mode 100644
index 0000000000..45746e99a7
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibeglintegration.h"
+
+static int countBits(unsigned long mask)
+{
+ int count = 0;
+ while (mask != 0) {
+ if (mask & 1)
+ ++count;
+ mask >>= 1;
+ }
+ return count;
+}
+
+VisualID QXlibEglIntegration::getCompatibleVisualId(Display *display, EGLDisplay eglDisplay, EGLConfig config)
+{
+ VisualID visualId = 0;
+ EGLint eglValue = 0;
+
+ EGLint configRedSize = 0;
+ eglGetConfigAttrib(eglDisplay, config, EGL_RED_SIZE, &configRedSize);
+
+ EGLint configGreenSize = 0;
+ eglGetConfigAttrib(eglDisplay, config, EGL_GREEN_SIZE, &configGreenSize);
+
+ EGLint configBlueSize = 0;
+ eglGetConfigAttrib(eglDisplay, config, EGL_BLUE_SIZE, &configBlueSize);
+
+ EGLint configAlphaSize = 0;
+ eglGetConfigAttrib(eglDisplay, config, EGL_ALPHA_SIZE, &configAlphaSize);
+
+ eglGetConfigAttrib(eglDisplay, config, EGL_CONFIG_ID, &eglValue);
+ int configId = eglValue;
+
+ // See if EGL provided a valid VisualID:
+ eglGetConfigAttrib(eglDisplay, config, EGL_NATIVE_VISUAL_ID, &eglValue);
+ visualId = (VisualID)eglValue;
+ if (visualId) {
+ // EGL has suggested a visual id, so get the rest of the visual info for that id:
+ XVisualInfo visualInfoTemplate;
+ memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+ visualInfoTemplate.visualid = visualId;
+
+ XVisualInfo *chosenVisualInfo;
+ int matchingCount = 0;
+ chosenVisualInfo = XGetVisualInfo(display, VisualIDMask, &visualInfoTemplate, &matchingCount);
+ if (chosenVisualInfo) {
+ // Skip size checks if implementation supports non-matching visual
+ // and config (http://bugreports.qt.nokia.com/browse/QTBUG-9444).
+ if (q_hasEglExtension(eglDisplay,"EGL_NV_post_convert_rounding")) {
+ XFree(chosenVisualInfo);
+ return visualId;
+ }
+
+ int visualRedSize = countBits(chosenVisualInfo->red_mask);
+ int visualGreenSize = countBits(chosenVisualInfo->green_mask);
+ int visualBlueSize = countBits(chosenVisualInfo->blue_mask);
+ int visualAlphaSize = -1; // Need XRender to tell us the alpha channel size
+
+ bool visualMatchesConfig = false;
+ if ( visualRedSize == configRedSize &&
+ visualGreenSize == configGreenSize &&
+ visualBlueSize == configBlueSize )
+ {
+ // We need XRender to check the alpha channel size of the visual. If we don't have
+ // the alpha size, we don't check it against the EGL config's alpha size.
+ if (visualAlphaSize >= 0)
+ visualMatchesConfig = visualAlphaSize == configAlphaSize;
+ else
+ visualMatchesConfig = true;
+ }
+
+ if (!visualMatchesConfig) {
+ if (visualAlphaSize >= 0) {
+ qWarning("Warning: EGL suggested using X Visual ID %d (ARGB%d%d%d%d) for EGL config %d (ARGB%d%d%d%d), but this is incompatable",
+ (int)visualId, visualAlphaSize, visualRedSize, visualGreenSize, visualBlueSize,
+ configId, configAlphaSize, configRedSize, configGreenSize, configBlueSize);
+ } else {
+ qWarning("Warning: EGL suggested using X Visual ID %d (RGB%d%d%d) for EGL config %d (RGB%d%d%d), but this is incompatable",
+ (int)visualId, visualRedSize, visualGreenSize, visualBlueSize,
+ configId, configRedSize, configGreenSize, configBlueSize);
+ }
+ visualId = 0;
+ }
+ } else {
+ qWarning("Warning: EGL suggested using X Visual ID %d for EGL config %d, but that isn't a valid ID",
+ (int)visualId, configId);
+ visualId = 0;
+ }
+ XFree(chosenVisualInfo);
+ }
+#ifdef QT_DEBUG_X11_VISUAL_SELECTION
+ else
+ qDebug("EGL did not suggest a VisualID (EGL_NATIVE_VISUAL_ID was zero) for EGLConfig %d", configId);
+#endif
+
+ if (visualId) {
+#ifdef QT_DEBUG_X11_VISUAL_SELECTION
+ if (configAlphaSize > 0)
+ qDebug("Using ARGB Visual ID %d provided by EGL for config %d", (int)visualId, configId);
+ else
+ qDebug("Using Opaque Visual ID %d provided by EGL for config %d", (int)visualId, configId);
+#endif
+ return visualId;
+ }
+
+ // Finally, try to
+ // use XGetVisualInfo and only use the bit depths to match on:
+ if (!visualId) {
+ XVisualInfo visualInfoTemplate;
+ memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+ XVisualInfo *matchingVisuals;
+ int matchingCount = 0;
+
+ visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize + configAlphaSize;
+ matchingVisuals = XGetVisualInfo(display,
+ VisualDepthMask,
+ &visualInfoTemplate,
+ &matchingCount);
+ if (!matchingVisuals) {
+ // Try again without taking the alpha channel into account:
+ visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize;
+ matchingVisuals = XGetVisualInfo(display,
+ VisualDepthMask,
+ &visualInfoTemplate,
+ &matchingCount);
+ }
+
+ if (matchingVisuals) {
+ visualId = matchingVisuals[0].visualid;
+ XFree(matchingVisuals);
+ }
+ }
+
+ if (visualId) {
+#ifdef QT_DEBUG_X11_VISUAL_SELECTION
+ qDebug("Using Visual ID %d provided by XGetVisualInfo for EGL config %d", (int)visualId, configId);
+#endif
+ return visualId;
+ }
+
+ qWarning("Unable to find an X11 visual which matches EGL config %d", configId);
+ return (VisualID)0;
+}
diff --git a/src/plugins/platforms/eglconvenience/qxlibeglintegration.h b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
new file mode 100644
index 0000000000..6c2e266cbc
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITEEGLINTEGRATION_H
+#define QTESTLITEEGLINTEGRATION_H
+
+#include "qeglconvenience.h"
+
+class QXlibEglIntegration
+{
+public:
+ static VisualID getCompatibleVisualId(Display *display, EGLDisplay eglDisplay, EGLConfig config);
+};
+
+#endif // QTESTLITEEGLINTEGRATION_H
diff --git a/src/plugins/platforms/eglconvenience/xlibeglintegration.pri b/src/plugins/platforms/eglconvenience/xlibeglintegration.pri
new file mode 100644
index 0000000000..9404a70373
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/xlibeglintegration.pri
@@ -0,0 +1,7 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+ $$PWD/qxlibeglintegration.h
+
+SOURCES += \
+ $$PWD/qxlibeglintegration.cpp
diff --git a/src/plugins/platforms/eglfs/eglfs.pro b/src/plugins/platforms/eglfs/eglfs.pro
new file mode 100644
index 0000000000..7ad8fd985b
--- /dev/null
+++ b/src/plugins/platforms/eglfs/eglfs.pro
@@ -0,0 +1,31 @@
+TARGET = qeglfs
+TEMPLATE = lib
+CONFIG += plugin
+
+QT += opengl
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+#DEFINES += QEGL_EXTRA_DEBUG
+
+#DEFINES += Q_OPENKODE
+
+SOURCES = main.cpp \
+ qeglfsintegration.cpp \
+ ../eglconvenience/qeglconvenience.cpp \
+ ../eglconvenience/qeglplatformcontext.cpp \
+ qeglfswindow.cpp \
+ qeglfswindowsurface.cpp \
+ qeglfsscreen.cpp
+
+HEADERS = qeglfsintegration.h \
+ ../eglconvenience/qeglconvenience.h \
+ ../eglconvenience/qeglplatformcontext.h \
+ qeglfswindow.h \
+ qeglfswindowsurface.h \
+ qeglfsscreen.h
+
+include(../fontdatabases/genericunix/genericunix.pri)
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/eglfs/main.cpp b/src/plugins/platforms/eglfs/main.cpp
new file mode 100644
index 0000000000..c07e54673c
--- /dev/null
+++ b/src/plugins/platforms/eglfs/main.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qeglfsintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QEglIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QEglIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "EglFS";
+ return list;
+}
+
+QPlatformIntegration* QEglIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "eglfs")
+ return new QEglFSIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(eglintegration, QEglIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
new file mode 100644
index 0000000000..1bc0806e7e
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeglfsintegration.h"
+
+#include "qeglfswindow.h"
+#include "qeglfswindowsurface.h"
+
+#include "qgenericunixfontdatabase.h"
+
+#include <QtGui/QPlatformWindow>
+#include <QtGui/QPlatformWindowFormat>
+#include <QtOpenGL/private/qpixmapdata_gl_p.h>
+
+#include <EGL/egl.h>
+
+QT_BEGIN_NAMESPACE
+
+QEglFSIntegration::QEglFSIntegration()
+ : mFontDb(new QGenericUnixFontDatabase())
+{
+ m_primaryScreen = new QEglFSScreen(EGL_DEFAULT_DISPLAY);
+
+ mScreens.append(m_primaryScreen);
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglIntegration\n");
+#endif
+}
+
+bool QEglFSIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPixmapData *QEglFSIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglIntegration::createPixmapData %d\n", type);
+#endif
+ return new QGLPixmapData(type);
+}
+
+QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglIntegration::createPlatformWindow %p\n",widget);
+#endif
+ return new QEglFSWindow(widget, m_primaryScreen);
+}
+
+
+QWindowSurface *QEglFSIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglIntegration::createWindowSurface %p\n",widget);
+#endif
+ return new QEglFSWindowSurface(m_primaryScreen,widget);
+}
+
+QPlatformFontDatabase *QEglFSIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.h b/src/plugins/platforms/eglfs/qeglfsintegration.h
new file mode 100644
index 0000000000..65b834f371
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfsintegration.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EGLINTEGRATION_H
+#define EGLINTEGRATION_H
+
+#include "qeglfsscreen.h"
+
+#include <QtGui/QPlatformIntegration>
+#include <QtGui/QPlatformScreen>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QEglFSIntegration : public QPlatformIntegration
+{
+public:
+ QEglFSIntegration();
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+private:
+ QPlatformFontDatabase *mFontDb;
+ QList<QPlatformScreen *> mScreens;
+ QEglFSScreen *m_primaryScreen;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif
diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.cpp b/src/plugins/platforms/eglfs/qeglfsscreen.cpp
new file mode 100644
index 0000000000..b6f2805ee0
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfsscreen.cpp
@@ -0,0 +1,244 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeglfsscreen.h"
+
+#include "../eglconvenience/qeglconvenience.h"
+#include "../eglconvenience/qeglplatformcontext.h"
+
+#ifdef Q_OPENKODE
+#include <KD/kd.h>
+#include <KD/NV_initialize.h>
+#endif //Q_OPENKODE
+
+QT_BEGIN_NAMESPACE
+
+// #define QEGL_EXTRA_DEBUG
+
+#ifdef QEGL_EXTRA_DEBUG
+struct AttrInfo { EGLint attr; const char *name; };
+static struct AttrInfo attrs[] = {
+ {EGL_BUFFER_SIZE, "EGL_BUFFER_SIZE"},
+ {EGL_ALPHA_SIZE, "EGL_ALPHA_SIZE"},
+ {EGL_BLUE_SIZE, "EGL_BLUE_SIZE"},
+ {EGL_GREEN_SIZE, "EGL_GREEN_SIZE"},
+ {EGL_RED_SIZE, "EGL_RED_SIZE"},
+ {EGL_DEPTH_SIZE, "EGL_DEPTH_SIZE"},
+ {EGL_STENCIL_SIZE, "EGL_STENCIL_SIZE"},
+ {EGL_CONFIG_CAVEAT, "EGL_CONFIG_CAVEAT"},
+ {EGL_CONFIG_ID, "EGL_CONFIG_ID"},
+ {EGL_LEVEL, "EGL_LEVEL"},
+ {EGL_MAX_PBUFFER_HEIGHT, "EGL_MAX_PBUFFER_HEIGHT"},
+ {EGL_MAX_PBUFFER_PIXELS, "EGL_MAX_PBUFFER_PIXELS"},
+ {EGL_MAX_PBUFFER_WIDTH, "EGL_MAX_PBUFFER_WIDTH"},
+ {EGL_NATIVE_RENDERABLE, "EGL_NATIVE_RENDERABLE"},
+ {EGL_NATIVE_VISUAL_ID, "EGL_NATIVE_VISUAL_ID"},
+ {EGL_NATIVE_VISUAL_TYPE, "EGL_NATIVE_VISUAL_TYPE"},
+ {EGL_SAMPLES, "EGL_SAMPLES"},
+ {EGL_SAMPLE_BUFFERS, "EGL_SAMPLE_BUFFERS"},
+ {EGL_SURFACE_TYPE, "EGL_SURFACE_TYPE"},
+ {EGL_TRANSPARENT_TYPE, "EGL_TRANSPARENT_TYPE"},
+ {EGL_TRANSPARENT_BLUE_VALUE, "EGL_TRANSPARENT_BLUE_VALUE"},
+ {EGL_TRANSPARENT_GREEN_VALUE, "EGL_TRANSPARENT_GREEN_VALUE"},
+ {EGL_TRANSPARENT_RED_VALUE, "EGL_TRANSPARENT_RED_VALUE"},
+ {EGL_BIND_TO_TEXTURE_RGB, "EGL_BIND_TO_TEXTURE_RGB"},
+ {EGL_BIND_TO_TEXTURE_RGBA, "EGL_BIND_TO_TEXTURE_RGBA"},
+ {EGL_MIN_SWAP_INTERVAL, "EGL_MIN_SWAP_INTERVAL"},
+ {EGL_MAX_SWAP_INTERVAL, "EGL_MAX_SWAP_INTERVAL"},
+ {-1, 0}};
+#endif //QEGL_EXTRA_DEBUG
+
+QEglFSScreen::QEglFSScreen(EGLNativeDisplayType display)
+ : m_depth(32)
+ , m_format(QImage::Format_Invalid)
+ , m_platformContext(0)
+ , m_surface(0)
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglScreen %p\n", this);
+#endif
+
+ EGLint major, minor;
+#ifdef QEGL_EXTRA_DEBUG
+ EGLint index;
+#endif
+ if (!eglBindAPI(EGL_OPENGL_ES_API)) {
+ qWarning("Could not bind GL_ES API\n");
+ qFatal("EGL error");
+ }
+
+ m_dpy = eglGetDisplay(display);
+ if (m_dpy == EGL_NO_DISPLAY) {
+ qWarning("Could not open egl display\n");
+ qFatal("EGL error");
+ }
+ qWarning("Opened display %p\n", m_dpy);
+
+ if (!eglInitialize(m_dpy, &major, &minor)) {
+ qWarning("Could not initialize egl display\n");
+ qFatal("EGL error");
+ }
+
+ qWarning("Initialized display %d %d\n", major, minor);
+
+ int swapInterval = 1;
+ QByteArray swapIntervalString = qgetenv("QT_QPA_EGLFS_SWAPINTERVAL");
+ if (!swapIntervalString.isEmpty()) {
+ bool ok;
+ swapInterval = swapIntervalString.toInt(&ok);
+ if (!ok)
+ swapInterval = 1;
+ }
+ eglSwapInterval(m_dpy, swapInterval);
+}
+
+void QEglFSScreen::createAndSetPlatformContext() const {
+ const_cast<QEglFSScreen *>(this)->createAndSetPlatformContext();
+}
+
+void QEglFSScreen::createAndSetPlatformContext()
+{
+ QPlatformWindowFormat platformFormat = QPlatformWindowFormat::defaultFormat();
+
+ platformFormat.setWindowApi(QPlatformWindowFormat::OpenGL);
+
+ QByteArray depthString = qgetenv("QT_QPA_EGLFS_DEPTH");
+ if (depthString.toInt() == 16) {
+ platformFormat.setDepth(16);
+ platformFormat.setRedBufferSize(5);
+ platformFormat.setGreenBufferSize(6);
+ platformFormat.setBlueBufferSize(5);
+ m_depth = 16;
+ m_format = QImage::Format_RGB16;
+ } else {
+ platformFormat.setDepth(32);
+ platformFormat.setRedBufferSize(8);
+ platformFormat.setGreenBufferSize(8);
+ platformFormat.setBlueBufferSize(8);
+ m_depth = 32;
+ m_format = QImage::Format_RGB32;
+ }
+ if (!qgetenv("QT_QPA_EGLFS_MULTISAMPLE").isEmpty()) {
+ platformFormat.setSampleBuffers(true);
+ }
+
+
+ EGLConfig config = q_configFromQPlatformWindowFormat(m_dpy, platformFormat);
+
+ EGLNativeWindowType eglWindow = 0;
+#ifdef Q_OPENKODE
+ if (kdInitializeNV() == KD_ENOTINITIALIZED) {
+ qFatal("Did not manage to initialize openkode");
+ }
+ KDWindow *window = kdCreateWindow(m_dpy,config,0);
+
+ kdRealizeWindow(window,&eglWindow);
+#endif
+
+ m_surface = eglCreateWindowSurface(m_dpy, config, eglWindow, NULL);
+ if (m_surface == EGL_NO_SURFACE) {
+ qWarning("Could not create the egl surface: error = 0x%x\n", eglGetError());
+ eglTerminate(m_dpy);
+ qFatal("EGL error");
+ }
+ // qWarning("Created surface %dx%d\n", w, h);
+
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("Configuration %d matches requirements\n", (int)config);
+
+ for (index = 0; attrs[index].attr != -1; ++index) {
+ EGLint value;
+ if (eglGetConfigAttrib(m_dpy, config, attrs[index].attr, &value)) {
+ qWarning("\t%s: %d\n", attrs[index].name, (int)value);
+ }
+ }
+ qWarning("\n");
+#endif
+
+ EGLint temp;
+ EGLint attribList[32];
+
+ temp = 0;
+
+ attribList[temp++] = EGL_CONTEXT_CLIENT_VERSION;
+ attribList[temp++] = 2; // GLES version 2
+ attribList[temp++] = EGL_NONE;
+
+ QEGLPlatformContext *platformContext = new QEGLPlatformContext(m_dpy,config,attribList,m_surface,EGL_OPENGL_ES_API);
+ m_platformContext = platformContext;
+
+ EGLint w,h; // screen size detection
+ eglQuerySurface(m_dpy, m_surface, EGL_WIDTH, &w);
+ eglQuerySurface(m_dpy, m_surface, EGL_HEIGHT, &h);
+
+ m_geometry = QRect(0,0,w,h);
+
+}
+
+QRect QEglFSScreen::geometry() const
+{
+ if (m_geometry.isNull()) {
+ createAndSetPlatformContext();
+ }
+ return m_geometry;
+}
+
+int QEglFSScreen::depth() const
+{
+ return m_depth;
+}
+
+QImage::Format QEglFSScreen::format() const
+{
+ if (m_format == QImage::Format_Invalid)
+ createAndSetPlatformContext();
+ return m_format;
+}
+QPlatformGLContext *QEglFSScreen::platformContext() const
+{
+ if (!m_platformContext) {
+ QEglFSScreen *that = const_cast<QEglFSScreen *>(this);
+ that->createAndSetPlatformContext();
+ }
+ return m_platformContext;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.h b/src/plugins/platforms/eglfs/qeglfsscreen.h
new file mode 100644
index 0000000000..f300842307
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfsscreen.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEGLSCREEN_H
+#define QEGLSCREEN_H
+
+#include <QPlatformScreen>
+
+#include <QtCore/QTextStream>
+
+#include <EGL/egl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QPlatformGLContext;
+
+class QEglFSScreen : public QPlatformScreen //huh: FullScreenScreen ;) just to follow namespace
+{
+public:
+ QEglFSScreen(EGLNativeDisplayType display);
+ ~QEglFSScreen() {}
+
+ QRect geometry() const;
+ int depth() const;
+ QImage::Format format() const;
+
+ QPlatformGLContext *platformContext() const;
+
+private:
+ void createAndSetPlatformContext() const;
+ void createAndSetPlatformContext();
+
+ QRect m_geometry;
+ int m_depth;
+ QImage::Format m_format;
+ QPlatformGLContext *m_platformContext;
+ EGLDisplay m_dpy;
+ EGLSurface m_surface;
+};
+
+QT_END_NAMESPACE
+#endif // QEGLSCREEN_H
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp
new file mode 100644
index 0000000000..2ef12aa77d
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeglfswindow.h"
+
+#include <QtGui/QWindowSystemInterface>
+
+QT_BEGIN_NAMESPACE
+
+QEglFSWindow::QEglFSWindow(QWidget *w, QEglFSScreen *screen)
+ : QPlatformWindow(w), m_screen(screen)
+{
+ static int serialNo = 0;
+ m_winid = ++serialNo;
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglWindow %p: %p %p 0x%x\n", this, w, screen, uint(m_winid));
+#endif
+}
+
+
+void QEglFSWindow::setGeometry(const QRect &)
+{
+ // We only support full-screen windows
+ QRect rect(m_screen->availableGeometry());
+ QWindowSystemInterface::handleGeometryChange(this->widget(), rect);
+
+ // Since toplevels are fullscreen, propegate the screen size back to the widget
+ widget()->setGeometry(rect);
+
+ QPlatformWindow::setGeometry(rect);
+}
+
+WId QEglFSWindow::winId() const
+{
+ return m_winid;
+}
+
+
+
+QPlatformGLContext *QEglFSWindow::glContext() const
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglWindow::glContext %p\n", m_screen->platformContext());
+#endif
+ Q_ASSERT(m_screen);
+ return m_screen->platformContext();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.h b/src/plugins/platforms/eglfs/qeglfswindow.h
new file mode 100644
index 0000000000..f125eab3c1
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfswindow.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEGLWINDOW_H
+#define QEGLWINDOW_H
+
+#include "qeglfsintegration.h"
+#include "qeglfsscreen.h"
+
+#include <QPlatformWindow>
+#include <QtGui/QWidget>
+
+QT_BEGIN_NAMESPACE
+
+class QEglFSWindow : public QPlatformWindow
+{
+public:
+ QEglFSWindow(QWidget *w, QEglFSScreen *screen);
+
+ void setGeometry(const QRect &);
+ WId winId() const;
+
+ QPlatformGLContext *glContext() const;
+
+private:
+ QEglFSScreen *m_screen;
+ WId m_winid;
+};
+QT_END_NAMESPACE
+#endif // QEGLWINDOW_H
diff --git a/src/plugins/platforms/eglfs/qeglfswindowsurface.cpp b/src/plugins/platforms/eglfs/qeglfswindowsurface.cpp
new file mode 100644
index 0000000000..393e646d7b
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfswindowsurface.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qeglfswindowsurface.h"
+
+#include <QtGui/QPlatformGLContext>
+
+#include <QtOpenGL/private/qgl_p.h>
+#include <QtOpenGL/private/qglpaintdevice_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QEglFSPaintDevice : public QGLPaintDevice
+{
+public:
+ QEglFSPaintDevice(QEglFSScreen *screen, QWidget *widget)
+ :QGLPaintDevice(), m_screen(screen)
+ {
+ #ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglPaintDevice %p, %p, %p",this, screen, widget);
+ #endif
+ }
+
+ QSize size() const { return m_screen->geometry().size(); }
+ QGLContext* context() const { return QGLContext::fromPlatformGLContext(m_screen->platformContext());}
+
+ QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); }
+
+ void beginPaint(){
+ QGLPaintDevice::beginPaint();
+ }
+private:
+ QEglFSScreen *m_screen;
+ QGLContext *m_context;
+};
+
+
+QEglFSWindowSurface::QEglFSWindowSurface( QEglFSScreen *screen, QWidget *window )
+ :QWindowSurface(window)
+{
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglWindowSurface %p, %p", window, screen);
+#endif
+ m_paintDevice = new QEglFSPaintDevice(screen,window);
+}
+
+void QEglFSWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+#ifdef QEGL_EXTRA_DEBUG
+ qWarning("QEglWindowSurface::flush %p",widget);
+#endif
+ widget->platformWindow()->glContext()->swapBuffers();
+}
+
+void QEglFSWindowSurface::resize(const QSize &size)
+{
+ Q_UNUSED(size);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/eglfs/qeglfswindowsurface.h b/src/plugins/platforms/eglfs/qeglfswindowsurface.h
new file mode 100644
index 0000000000..2fa655b01f
--- /dev/null
+++ b/src/plugins/platforms/eglfs/qeglfswindowsurface.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QEGLWINDOWSURFACE_H
+#define QEGLWINDOWSURFACE_H
+
+#include "qeglfsintegration.h"
+#include "qeglfswindow.h"
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QEglFSWindowSurface : public QWindowSurface
+{
+public:
+ QEglFSWindowSurface(QEglFSScreen *screen, QWidget *window);
+ ~QEglFSWindowSurface() {}
+
+ QPaintDevice *paintDevice() { return m_paintDevice; }
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize(const QSize &size);
+private:
+ QPaintDevice *m_paintDevice;
+};
+
+QT_END_NAMESPACE
+
+#endif // QEGLWINDOWSURFACE_H
diff --git a/src/plugins/platforms/externalplugin.pri b/src/plugins/platforms/externalplugin.pri
new file mode 100644
index 0000000000..54da4d957c
--- /dev/null
+++ b/src/plugins/platforms/externalplugin.pri
@@ -0,0 +1,29 @@
+#
+# Lighthouse now has preliminarily support for building and
+# loading platform plugins from outside the Qt source/build
+# tree.
+#
+# 1) Building external plugins:
+# Set QTDIR to the Qt build directory, copy this file to
+# the plugin source repository and include it at the top
+# of the plugin's pro file. Use QT_SOURCE_TREE if you
+# want to pull in source code from Qt:
+#
+# include($$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri)
+#
+# 2) Loading external plugins:
+# Specify the path to the directory containing the
+# plugin on the command line, in addition to the
+# platform name.
+#
+# ./wiggly -platformPluginPath /path/to/myPlugin -platform gullfaksA
+#
+
+!exists($$(QTDIR)/.qmake.cache) {
+ error("Please set QTDIR to the Qt build directory")
+}
+
+QT_SOURCE_TREE = $$fromfile($$(QTDIR)/.qmake.cache,QT_SOURCE_TREE)
+QT_BUILD_TREE = $$fromfile($$(QTDIR)/.qmake.cache,QT_BUILD_TREE)
+
+include($$QT_SOURCE_TREE/src/plugins/qpluginbase.pri)
diff --git a/src/plugins/platforms/fb_base/fb_base.cpp b/src/plugins/platforms/fb_base/fb_base.cpp
new file mode 100644
index 0000000000..e118ce856c
--- /dev/null
+++ b/src/plugins/platforms/fb_base/fb_base.cpp
@@ -0,0 +1,507 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "fb_base.h"
+#include <qpainter.h>
+#include <qdebug.h>
+#include <qbitmap.h>
+#include <QPlatformCursor>
+#include <QWindowSystemInterface>
+
+QPlatformSoftwareCursor::QPlatformSoftwareCursor(QPlatformScreen *scr)
+ : QPlatformCursor(scr), currentRect(QRect()), prevRect(QRect())
+{
+ graphic = new QPlatformCursorImage(0, 0, 0, 0, 0, 0);
+ setCursor(Qt::ArrowCursor);
+}
+
+QRect QPlatformSoftwareCursor::getCurrentRect()
+{
+ QRect rect = graphic->image()->rect().translated(-graphic->hotspot().x(),
+ -graphic->hotspot().y());
+ rect.translate(QCursor::pos());
+ QPoint screenOffset = screen->geometry().topLeft();
+ rect.translate(-screenOffset); // global to local translation
+ return rect;
+}
+
+
+void QPlatformSoftwareCursor::pointerEvent(const QMouseEvent & e)
+{
+ Q_UNUSED(e);
+ QPoint screenOffset = screen->geometry().topLeft();
+ currentRect = getCurrentRect();
+ // global to local translation
+ if (onScreen || screen->geometry().intersects(currentRect.translated(screenOffset))) {
+ setDirty();
+ }
+}
+
+QRect QPlatformSoftwareCursor::drawCursor(QPainter & painter)
+{
+ dirty = false;
+ if (currentRect.isNull())
+ return QRect();
+
+ // We need this because the cursor might be dirty due to moving off screen
+ QPoint screenOffset = screen->geometry().topLeft();
+ // global to local translation
+ if (!currentRect.translated(screenOffset).intersects(screen->geometry()))
+ return QRect();
+
+ prevRect = currentRect;
+ painter.drawImage(prevRect, *graphic->image());
+ onScreen = true;
+ return prevRect;
+}
+
+QRect QPlatformSoftwareCursor::dirtyRect()
+{
+ if (onScreen) {
+ onScreen = false;
+ return prevRect;
+ }
+ return QRect();
+}
+
+void QPlatformSoftwareCursor::setCursor(Qt::CursorShape shape)
+{
+ graphic->set(shape);
+}
+
+void QPlatformSoftwareCursor::setCursor(const QImage &image, int hotx, int hoty)
+{
+ graphic->set(image, hotx, hoty);
+}
+
+void QPlatformSoftwareCursor::setCursor(const uchar *data, const uchar *mask, int width, int height, int hotX, int hotY)
+{
+ graphic->set(data, mask, width, height, hotX, hotY);
+}
+
+void QPlatformSoftwareCursor::changeCursor(QCursor * widgetCursor, QWidget * widget)
+{
+ Q_UNUSED(widget);
+ Qt::CursorShape shape = widgetCursor->shape();
+
+ if (shape == Qt::BitmapCursor) {
+ // application supplied cursor
+ QPoint spot = widgetCursor->hotSpot();
+ setCursor(widgetCursor->pixmap().toImage(), spot.x(), spot.y());
+ } else {
+ // system cursor
+ setCursor(shape);
+ }
+ currentRect = getCurrentRect();
+ QPoint screenOffset = screen->geometry().topLeft(); // global to local translation
+ if (onScreen || screen->geometry().intersects(currentRect.translated(screenOffset)))
+ setDirty();
+}
+
+QFbScreen::QFbScreen() : cursor(0), mGeometry(), mDepth(16), mFormat(QImage::Format_RGB16), mScreenImage(0), compositePainter(0), isUpToDate(false)
+{
+ mScreenImage = new QImage(mGeometry.size(), mFormat);
+ redrawTimer.setSingleShot(true);
+ redrawTimer.setInterval(0);
+ QObject::connect(&redrawTimer, SIGNAL(timeout()), this, SLOT(doRedraw()));
+}
+
+void QFbScreen::setGeometry(QRect rect)
+{
+ delete mScreenImage;
+ mGeometry = rect;
+ mScreenImage = new QImage(mGeometry.size(), mFormat);
+ delete compositePainter;
+ compositePainter = 0;
+ invalidateRectCache();
+}
+
+void QFbScreen::setDepth(int depth)
+{
+ mDepth = depth;
+}
+
+void QFbScreen::setPhysicalSize(QSize size)
+{
+ mPhysicalSize = size;
+}
+
+void QFbScreen::setFormat(QImage::Format format)
+{
+ mFormat = format;
+ delete mScreenImage;
+ mScreenImage = new QImage(mGeometry.size(), mFormat);
+ delete compositePainter;
+ compositePainter = 0;
+}
+
+QFbScreen::~QFbScreen()
+{
+ delete compositePainter;
+ delete mScreenImage;
+}
+
+void QFbScreen::setDirty(const QRect &rect)
+{
+ QRect intersection = rect.intersected(mGeometry);
+ QPoint screenOffset = mGeometry.topLeft();
+ repaintRegion += intersection.translated(-screenOffset); // global to local translation
+ if (!redrawTimer.isActive()) {
+ redrawTimer.start();
+ }
+}
+
+void QFbScreen::generateRects()
+{
+ cachedRects.clear();
+ QPoint screenOffset = mGeometry.topLeft();
+ QRegion remainingScreen(mGeometry.translated(-screenOffset)); // global to local translation
+
+ for (int i = 0; i < windowStack.length(); i++) {
+ if (remainingScreen.isEmpty())
+ break;
+ if (!windowStack[i]->visible())
+ continue;
+ if (windowStack[i]->widget()->isMinimized())
+ continue;
+
+ if (!windowStack[i]->widget()->testAttribute(Qt::WA_TranslucentBackground)) {
+ QRect localGeometry = windowStack.at(i)->geometry().translated(-screenOffset); // global to local translation
+ remainingScreen -= localGeometry;
+ QRegion windowRegion(localGeometry);
+ windowRegion -= remainingScreen;
+ foreach(QRect rect, windowRegion.rects()) {
+ cachedRects += QPair<QRect, int>(rect, i);
+ }
+ }
+ }
+ foreach (QRect rect, remainingScreen.rects())
+ cachedRects += QPair<QRect, int>(rect, -1);
+ isUpToDate = true;
+ return;
+}
+
+
+
+QRegion QFbScreen::doRedraw()
+{
+ QPoint screenOffset = mGeometry.topLeft();
+
+ QRegion touchedRegion;
+ if (cursor && cursor->isDirty() && cursor->isOnScreen()) {
+ QRect lastCursor = cursor->dirtyRect();
+ repaintRegion += lastCursor;
+ }
+ if (repaintRegion.isEmpty() && (!cursor || !cursor->isDirty())) {
+ return touchedRegion;
+ }
+
+ QVector<QRect> rects = repaintRegion.rects();
+
+ if (!isUpToDate)
+ generateRects();
+
+ if (!compositePainter)
+ compositePainter = new QPainter(mScreenImage);
+ for (int rectIndex = 0; rectIndex < repaintRegion.numRects(); rectIndex++) {
+ QRegion rectRegion = rects[rectIndex];
+
+ for(int i = 0; i < cachedRects.length(); i++) {
+ QRect screenSubRect = cachedRects[i].first;
+ int layer = cachedRects[i].second;
+ QRegion intersect = rectRegion.intersected(screenSubRect);
+
+ if (intersect.isEmpty())
+ continue;
+
+ rectRegion -= intersect;
+
+ // we only expect one rectangle, but defensive coding...
+ foreach (QRect rect, intersect.rects()) {
+ bool firstLayer = true;
+ if (layer == -1) {
+ compositePainter->fillRect(rect, Qt::black);
+ firstLayer = false;
+ layer = windowStack.size() - 1;
+ }
+
+ for (int layerIndex = layer; layerIndex != -1; layerIndex--) {
+ if (!windowStack[layerIndex]->visible())
+ continue;
+ if (windowStack[layerIndex]->widget()->isMinimized())
+ continue;
+ QRect windowRect = windowStack[layerIndex]->geometry().translated(-screenOffset);
+ QRect windowIntersect = rect.translated(-windowRect.left(),
+ -windowRect.top());
+ compositePainter->drawImage(rect, windowStack[layerIndex]->surface->image(),
+ windowIntersect);
+ if (firstLayer) {
+ firstLayer = false;
+ }
+ }
+ }
+ }
+ }
+
+ QRect cursorRect;
+ if (cursor && (cursor->isDirty() || repaintRegion.intersects(cursor->lastPainted()))) {
+ cursorRect = cursor->drawCursor(*compositePainter);
+ touchedRegion += cursorRect;
+ }
+ touchedRegion += repaintRegion;
+ repaintRegion = QRegion();
+
+
+
+// qDebug() << "QFbScreen::doRedraw" << windowStack.size() << mScreenImage->size() << touchedRegion;
+
+
+ return touchedRegion;
+}
+
+void QFbScreen::addWindow(QFbWindow *surface)
+{
+ windowStack.prepend(surface);
+ surface->mScreens.append(this);
+ invalidateRectCache();
+ setDirty(surface->geometry());
+}
+
+void QFbScreen::removeWindow(QFbWindow * surface)
+{
+ windowStack.removeOne(surface);
+ surface->mScreens.removeOne(this);
+ invalidateRectCache();
+ setDirty(surface->geometry());
+}
+
+void QFbWindow::raise()
+{
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ while (i != end) {
+ (*i)->raise(this);
+ ++i;
+ }
+}
+
+void QFbScreen::raise(QPlatformWindow * surface)
+{
+ QFbWindow *s = static_cast<QFbWindow *>(surface);
+ int index = windowStack.indexOf(s);
+ if (index <= 0)
+ return;
+ windowStack.move(index, 0);
+ invalidateRectCache();
+ setDirty(s->geometry());
+}
+
+void QFbWindow::lower()
+{
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ while (i != end) {
+ (*i)->lower(this);
+ ++i;
+ }
+}
+
+void QFbScreen::lower(QPlatformWindow * surface)
+{
+ QFbWindow *s = static_cast<QFbWindow *>(surface);
+ int index = windowStack.indexOf(s);
+ if (index == -1 || index == (windowStack.size() - 1))
+ return;
+ windowStack.move(index, windowStack.size() - 1);
+ invalidateRectCache();
+ setDirty(s->geometry());
+}
+
+QWidget * QFbScreen::topLevelAt(const QPoint & p) const
+{
+ for(int i = 0; i < windowStack.size(); i++) {
+ if (windowStack[i]->geometry().contains(p, false) &&
+ windowStack[i]->visible() &&
+ !windowStack[i]->widget()->isMinimized()) {
+ return windowStack[i]->widget();
+ }
+ }
+ return 0;
+}
+
+QFbWindow::QFbWindow(QWidget *window)
+ :QPlatformWindow(window),
+ visibleFlag(false)
+{
+ static QAtomicInt winIdGenerator(1);
+ windowId = winIdGenerator.fetchAndAddRelaxed(1);
+}
+
+
+QFbWindow::~QFbWindow()
+{
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ while (i != end) {
+ (*i)->removeWindow(this);
+ ++i;
+ }
+}
+
+
+QFbWindowSurface::QFbWindowSurface(QFbScreen *screen, QWidget *window)
+ : QWindowSurface(window),
+ mScreen(screen)
+{
+ mImage = QImage(window->size(), mScreen->format());
+
+ platformWindow = static_cast<QFbWindow*>(window->platformWindow());
+ platformWindow->surface = this;
+}
+
+QFbWindowSurface::~QFbWindowSurface()
+{
+}
+
+void QFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(offset);
+
+
+// qDebug() << "QFbWindowSurface::flush" << region;
+
+
+ platformWindow->repaint(region);
+}
+
+
+void QFbWindow::repaint(const QRegion &region)
+{
+ QRect currentGeometry = geometry();
+
+ QRect dirtyClient = region.boundingRect();
+ QRect dirtyRegion(currentGeometry.left() + dirtyClient.left(),
+ currentGeometry.top() + dirtyClient.top(),
+ dirtyClient.width(),
+ dirtyClient.height());
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ QRect oldGeometryLocal = oldGeometry;
+ oldGeometry = currentGeometry;
+ while (i != end) {
+ // If this is a move, redraw the previous location
+ if (oldGeometryLocal != currentGeometry) {
+ (*i)->setDirty(oldGeometryLocal);
+ }
+ (*i)->setDirty(dirtyRegion);
+ ++i;
+ }
+}
+
+void QFbWindowSurface::resize(const QSize &size)
+{
+ // change the widget's QImage if this is a resize
+ if (mImage.size() != size)
+ mImage = QImage(size, mScreen->format());
+ QWindowSurface::resize(size);
+}
+
+void QFbWindow::setGeometry(const QRect &rect)
+{
+// store previous geometry for screen update
+ oldGeometry = geometry();
+
+
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ while (i != end) {
+ (*i)->invalidateRectCache();
+ ++i;
+ }
+//### QWindowSystemInterface::handleGeometryChange(window(), rect);
+
+ QPlatformWindow::setGeometry(rect);
+}
+
+bool QFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ return QWindowSurface::scroll(area, dx, dy);
+}
+
+void QFbWindowSurface::beginPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+void QFbWindowSurface::endPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+void QFbWindow::setVisible(bool visible)
+{
+ visibleFlag = visible;
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ while (i != end) {
+ (*i)->invalidateRectCache();
+ (*i)->setDirty(geometry());
+ ++i;
+ }
+}
+
+Qt::WindowFlags QFbWindow::setWindowFlags(Qt::WindowFlags type)
+{
+ flags = type;
+ QList<QFbScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QFbScreen *>::const_iterator end = mScreens.constEnd();
+ while (i != end) {
+ (*i)->invalidateRectCache();
+ ++i;
+ }
+ return flags;
+}
+
+Qt::WindowFlags QFbWindow::windowFlags() const
+{
+ return flags;
+}
diff --git a/src/plugins/platforms/fb_base/fb_base.h b/src/plugins/platforms/fb_base/fb_base.h
new file mode 100644
index 0000000000..c5ae378723
--- /dev/null
+++ b/src/plugins/platforms/fb_base/fb_base.h
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QLIGHTHOUSEGRAPHICSSCREEN_H
+#define QLIGHTHOUSEGRAPHICSSCREEN_H
+
+#include <qrect.h>
+#include <qimage.h>
+#include <qtimer.h>
+#include <qpainter.h>
+#include <QPlatformCursor>
+#include <QPlatformScreen>
+#include <QPlatformWindow>
+#include <QtGui/private/qwindowsurface_p.h>
+
+class QMouseEvent;
+class QSize;
+class QPainter;
+
+class QFbScreen;
+
+class QPlatformSoftwareCursor : public QPlatformCursor
+{
+public:
+ QPlatformSoftwareCursor(QPlatformScreen * scr);
+
+ // output methods
+ QRect dirtyRect();
+ virtual QRect drawCursor(QPainter & painter);
+
+ // input methods
+ virtual void pointerEvent(const QMouseEvent & event);
+ virtual void changeCursor(QCursor * widgetCursor, QWidget * widget);
+
+ virtual void setDirty() { dirty = true; screen->setDirty(QRect()); }
+ virtual bool isDirty() { return dirty; }
+ virtual bool isOnScreen() { return onScreen; }
+ virtual QRect lastPainted() { return prevRect; }
+
+protected:
+ QPlatformCursorImage * graphic;
+
+private:
+ void setCursor(const uchar *data, const uchar *mask, int width, int height, int hotX, int hotY);
+ void setCursor(Qt::CursorShape shape);
+ void setCursor(const QImage &image, int hotx, int hoty);
+ QRect currentRect; // next place to draw the cursor
+ QRect prevRect; // last place the cursor was drawn
+ QRect getCurrentRect();
+ bool dirty;
+ bool onScreen;
+};
+
+class QFbWindow;
+
+class QFbWindowSurface : public QWindowSurface
+{
+public:
+ QFbWindowSurface(QFbScreen *screen, QWidget *window);
+ ~QFbWindowSurface();
+
+ virtual QPaintDevice *paintDevice() { return &mImage; }
+ virtual void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ virtual bool scroll(const QRegion &area, int dx, int dy);
+
+ virtual void beginPaint(const QRegion &region);
+ virtual void endPaint(const QRegion &region);
+
+
+ const QImage image() { return mImage; }
+ void resize(const QSize &size);
+
+protected:
+ friend class QFbWindow;
+ QFbWindow *platformWindow;
+
+ QFbScreen *mScreen;
+ QImage mImage;
+};
+
+
+class QFbWindow : public QPlatformWindow
+{
+public:
+
+ QFbWindow(QWidget *window);
+ ~QFbWindow();
+
+
+ virtual void setVisible(bool visible);
+ virtual bool visible() { return visibleFlag; }
+
+ virtual void raise();
+ virtual void lower();
+
+ void setGeometry(const QRect &rect);
+
+ virtual Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
+ virtual Qt::WindowFlags windowFlags() const;
+
+ WId winId() const { return windowId; }
+
+ virtual void repaint(const QRegion&);
+
+protected:
+ friend class QFbWindowSurface;
+ friend class QFbScreen;
+ QFbWindowSurface *surface;
+ QList<QFbScreen *> mScreens;
+ QRect oldGeometry;
+ bool visibleFlag;
+ Qt::WindowFlags flags;
+
+ WId windowId;
+};
+
+class QFbScreen : public QPlatformScreen
+{
+ Q_OBJECT
+public:
+ QFbScreen();
+ ~QFbScreen();
+
+ virtual QRect geometry() const { return mGeometry; }
+ virtual int depth() const { return mDepth; }
+ virtual QImage::Format format() const { return mFormat; }
+ virtual QSize physicalSize() const { return mPhysicalSize; }
+
+ virtual void setGeometry(QRect rect);
+ virtual void setDepth(int depth);
+ virtual void setFormat(QImage::Format format);
+ virtual void setPhysicalSize(QSize size);
+
+ virtual void setDirty(const QRect &rect);
+
+ virtual void removeWindow(QFbWindow * surface);
+ virtual void addWindow(QFbWindow * surface);
+ virtual void raise(QPlatformWindow * surface);
+ virtual void lower(QPlatformWindow * surface);
+ virtual QWidget * topLevelAt(const QPoint & p) const;
+
+ QImage * image() const { return mScreenImage; }
+ QPaintDevice * paintDevice() const { return mScreenImage; }
+
+protected:
+ QList<QFbWindow *> windowStack;
+ QRegion repaintRegion;
+ QPlatformSoftwareCursor * cursor;
+ QTimer redrawTimer;
+
+protected slots:
+ virtual QRegion doRedraw();
+
+protected:
+ QRect mGeometry;
+ int mDepth;
+ QImage::Format mFormat;
+ QSize mPhysicalSize;
+ QImage *mScreenImage;
+
+private:
+ QPainter * compositePainter;
+ void generateRects();
+ QList<QPair<QRect, int> > cachedRects;
+
+ void invalidateRectCache() { isUpToDate = false; }
+ friend class QFbWindowSurface;
+ friend class QFbWindow;
+ bool isUpToDate;
+};
+
+#endif // QLIGHTHOUSEGRAPHICSSCREEN_H
diff --git a/src/plugins/platforms/fb_base/fb_base.pri b/src/plugins/platforms/fb_base/fb_base.pri
new file mode 100644
index 0000000000..41bd87fbca
--- /dev/null
+++ b/src/plugins/platforms/fb_base/fb_base.pri
@@ -0,0 +1,2 @@
+SOURCES += ../fb_base/fb_base.cpp
+HEADERS += ../fb_base/fb_base.h
diff --git a/src/plugins/platforms/fb_base/fb_base.pro b/src/plugins/platforms/fb_base/fb_base.pro
new file mode 100644
index 0000000000..e08c0c5571
--- /dev/null
+++ b/src/plugins/platforms/fb_base/fb_base.pro
@@ -0,0 +1,23 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2009-11-05T13:22:31
+#
+#-------------------------------------------------
+
+#QT -= core gui
+TARGET = fb_base
+#include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+
+TEMPLATE = lib
+
+#DEFINES += STATIC_LIBRARY
+CONFIG += staticlib
+
+SOURCES += fb_base.cpp
+
+HEADERS += fb_base.h
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
diff --git a/src/plugins/platforms/fontdatabases/basicunix/basicunix.pri b/src/plugins/platforms/fontdatabases/basicunix/basicunix.pri
new file mode 100644
index 0000000000..da4698df0d
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/basicunix/basicunix.pri
@@ -0,0 +1,86 @@
+DEFINES += QT_NO_FONTCONFIG
+HEADERS += \
+ $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.h \
+ $$QT_SOURCE_TREE/src/gui/text/qfontengine_ft_p.h
+
+SOURCES += \
+ $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.cpp \
+ $$QT_SOURCE_TREE/src/gui/text/qfontengine_ft.cpp
+
+INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src
+
+INCLUDEPATH += $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/basicunix
+
+CONFIG += opentype
+
+contains(QT_CONFIG, freetype) {
+ SOURCES += \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftbase.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftbbox.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftdebug.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftglyph.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftinit.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftmm.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/fttype1.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftsynth.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftbitmap.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/bdf/bdf.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/cache/ftcache.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/cff/cff.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/cid/type1cid.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/gzip/ftgzip.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/pcf/pcf.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/pfr/pfr.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/psaux/psaux.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/pshinter/pshinter.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/psnames/psmodule.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/raster/raster.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/sfnt/sfnt.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/smooth/smooth.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/truetype/truetype.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/type1/type1.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/type42/type42.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/winfonts/winfnt.c \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/lzw/ftlzw.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvalid.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvbase.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvgdef.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvjstf.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvcommn.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvgpos.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvgsub.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/otvalid/otvmod.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/afangles.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/afglobal.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/aflatin.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/afmodule.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/afdummy.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/afhints.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/afloader.c\
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/autofit/autofit.c
+
+ symbian {
+ SOURCES += \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src/base/ftsystem.c
+ } else {
+ SOURCES += \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/builds/unix/ftsystem.c
+ INCLUDEPATH += \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/builds/unix
+ }
+
+ INCLUDEPATH += \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/src \
+ $$QT_SOURCE_TREE/src/3rdparty/freetype/include
+
+ DEFINES += FT2_BUILD_LIBRARY
+ contains(QT_CONFIG, system-zlib) {
+ DEFINES += FT_CONFIG_OPTION_SYSTEM_ZLIB
+ }
+
+ } else:contains(QT_CONFIG, system-freetype) {
+ # pull in the proper freetype2 include directory
+ include($$QT_SOURCE_TREE/config.tests/unix/freetype/freetype.pri)
+ LIBS_PRIVATE += -lfreetype
+ }
+
diff --git a/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.cpp b/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.cpp
new file mode 100644
index 0000000000..895f8af58e
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.cpp
@@ -0,0 +1,328 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbasicunixfontdatabase.h"
+
+#include <QtGui/private/qapplication_p.h>
+#include <QtGui/QPlatformScreen>
+
+#include <QtCore/QFile>
+#include <QtCore/QLibraryInfo>
+#include <QtCore/QDir>
+
+#undef QT_NO_FREETYPE
+#include <QtGui/private/qfontengine_ft_p.h>
+#include <QtGui/private/qfontengine_p.h>
+
+#include <ft2build.h>
+#include FT_TRUETYPE_TABLES_H
+
+#define SimplifiedChineseCsbBit 18
+#define TraditionalChineseCsbBit 20
+#define JapaneseCsbBit 17
+#define KoreanCsbBit 21
+
+static int requiredUnicodeBits[QFontDatabase::WritingSystemsCount][2] = {
+ // Any,
+ { 127, 127 },
+ // Latin,
+ { 0, 127 },
+ // Greek,
+ { 7, 127 },
+ // Cyrillic,
+ { 9, 127 },
+ // Armenian,
+ { 10, 127 },
+ // Hebrew,
+ { 11, 127 },
+ // Arabic,
+ { 13, 127 },
+ // Syriac,
+ { 71, 127 },
+ //Thaana,
+ { 72, 127 },
+ //Devanagari,
+ { 15, 127 },
+ //Bengali,
+ { 16, 127 },
+ //Gurmukhi,
+ { 17, 127 },
+ //Gujarati,
+ { 18, 127 },
+ //Oriya,
+ { 19, 127 },
+ //Tamil,
+ { 20, 127 },
+ //Telugu,
+ { 21, 127 },
+ //Kannada,
+ { 22, 127 },
+ //Malayalam,
+ { 23, 127 },
+ //Sinhala,
+ { 73, 127 },
+ //Thai,
+ { 24, 127 },
+ //Lao,
+ { 25, 127 },
+ //Tibetan,
+ { 70, 127 },
+ //Myanmar,
+ { 74, 127 },
+ // Georgian,
+ { 26, 127 },
+ // Khmer,
+ { 80, 127 },
+ // SimplifiedChinese,
+ { 126, 127 },
+ // TraditionalChinese,
+ { 126, 127 },
+ // Japanese,
+ { 126, 127 },
+ // Korean,
+ { 56, 127 },
+ // Vietnamese,
+ { 0, 127 }, // same as latin1
+ // Other,
+ { 126, 127 },
+ // Ogham,
+ { 78, 127 },
+ // Runic,
+ { 79, 127 },
+ // Nko,
+ { 14, 127 },
+};
+
+static QSupportedWritingSystems determineWritingSystemsFromTrueTypeBits(quint32 unicodeRange[4], quint32 codePageRange[2])
+{
+ QSupportedWritingSystems writingSystems;
+ bool hasScript = false;
+
+ int i;
+ for(i = 0; i < QFontDatabase::WritingSystemsCount; i++) {
+ int bit = requiredUnicodeBits[i][0];
+ int index = bit/32;
+ int flag = 1 << (bit&31);
+ if (bit != 126 && unicodeRange[index] & flag) {
+ bit = requiredUnicodeBits[i][1];
+ index = bit/32;
+
+ flag = 1 << (bit&31);
+ if (bit == 127 || unicodeRange[index] & flag) {
+ writingSystems.setSupported(QFontDatabase::WritingSystem(i));
+ hasScript = true;
+ // qDebug("font %s: index=%d, flag=%8x supports script %d", familyName.latin1(), index, flag, i);
+ }
+ }
+ }
+ if(codePageRange[0] & (1 << SimplifiedChineseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::SimplifiedChinese);
+ hasScript = true;
+ //qDebug("font %s supports Simplified Chinese", familyName.latin1());
+ }
+ if(codePageRange[0] & (1 << TraditionalChineseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::TraditionalChinese);
+ hasScript = true;
+ //qDebug("font %s supports Traditional Chinese", familyName.latin1());
+ }
+ if(codePageRange[0] & (1 << JapaneseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Japanese);
+ hasScript = true;
+ //qDebug("font %s supports Japanese", familyName.latin1());
+ }
+ if(codePageRange[0] & (1 << KoreanCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Korean);
+ hasScript = true;
+ //qDebug("font %s supports Korean", familyName.latin1());
+ }
+ if (!hasScript)
+ writingSystems.setSupported(QFontDatabase::Symbol);
+
+ return writingSystems;
+}
+
+static inline bool scriptRequiresOpenType(int script)
+{
+ return ((script >= QUnicodeTables::Syriac && script <= QUnicodeTables::Sinhala)
+ || script == QUnicodeTables::Khmer || script == QUnicodeTables::Nko);
+}
+
+void QBasicUnixFontDatabase::populateFontDatabase()
+{
+ QPlatformFontDatabase::populateFontDatabase();
+ QString fontpath = fontDir();
+
+ if(!QFile::exists(fontpath)) {
+ qFatal("QFontDatabase: Cannot find font directory %s - is Qt installed correctly?",
+ qPrintable(fontpath));
+ }
+
+ QDir dir(fontpath);
+ dir.setNameFilters(QStringList() << QLatin1String("*.ttf")
+ << QLatin1String("*.ttc") << QLatin1String("*.pfa")
+ << QLatin1String("*.pfb"));
+ dir.refresh();
+ for (int i = 0; i < int(dir.count()); ++i) {
+ const QByteArray file = QFile::encodeName(dir.absoluteFilePath(dir[i]));
+// qDebug() << "looking at" << file;
+ addTTFile(QByteArray(), file);
+ }
+}
+
+QFontEngine *QBasicUnixFontDatabase::fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *usrPtr)
+{
+ QFontEngineFT *engine;
+ FontFile *fontfile = static_cast<FontFile *> (usrPtr);
+ QFontEngine::FaceId fid;
+ fid.filename = fontfile->fileName.toLocal8Bit();
+ fid.index = fontfile->indexValue;
+ engine = new QFontEngineFT(fontDef);
+
+ bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
+ QFontEngineFT::GlyphFormat format = antialias? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono;
+ if (!engine->init(fid,antialias,format)) {
+ delete engine;
+ engine = 0;
+ return engine;
+ }
+ if (engine->invalid()) {
+ delete engine;
+ engine = 0;
+ } else if (scriptRequiresOpenType(script)) {
+ HB_Face hbFace = engine->harfbuzzFace();
+ if (!hbFace || !hbFace->supported_scripts[script]) {
+ delete engine;
+ engine = 0;
+ }
+ }
+
+ return engine;
+}
+
+QStringList QBasicUnixFontDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QUnicodeTables::Script &script) const
+{
+ Q_UNUSED(family);
+ Q_UNUSED(style);
+ Q_UNUSED(script);
+ return QStringList();
+}
+
+QStringList QBasicUnixFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+{
+ return addTTFile(fontData,fileName.toLocal8Bit());
+}
+
+void QBasicUnixFontDatabase::releaseHandle(void *handle)
+{
+ FontFile *file = static_cast<FontFile *>(handle);
+ delete file;
+}
+
+QStringList QBasicUnixFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file)
+{
+ extern FT_Library qt_getFreetype();
+ FT_Library library = qt_getFreetype();
+
+ int index = 0;
+ int numFaces = 0;
+ QStringList families;
+ do {
+ FT_Face face;
+ FT_Error error;
+ if (!fontData.isEmpty()) {
+ error = FT_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face);
+ } else {
+ error = FT_New_Face(library, file.constData(), index, &face);
+ }
+ if (error != FT_Err_Ok) {
+ qDebug() << "FT_New_Face failed with index" << index << ":" << hex << error;
+ break;
+ }
+ numFaces = face->num_faces;
+
+ QFont::Weight weight = QFont::Normal;
+
+ QFont::Style style = QFont::StyleNormal;
+ if (face->style_flags & FT_STYLE_FLAG_ITALIC)
+ style = QFont::StyleItalic;
+
+ if (face->style_flags & FT_STYLE_FLAG_BOLD)
+ weight = QFont::Bold;
+
+ QSupportedWritingSystems writingSystems;
+ // detect symbol fonts
+ for (int i = 0; i < face->num_charmaps; ++i) {
+ FT_CharMap cm = face->charmaps[i];
+ if (cm->encoding == ft_encoding_adobe_custom
+ || cm->encoding == ft_encoding_symbol) {
+ writingSystems.setSupported(QFontDatabase::Symbol);
+ break;
+ }
+ }
+
+ TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2);
+ if (os2) {
+ quint32 unicodeRange[4] = {
+ os2->ulUnicodeRange1, os2->ulUnicodeRange2, os2->ulUnicodeRange3, os2->ulUnicodeRange4
+ };
+ quint32 codePageRange[2] = {
+ os2->ulCodePageRange1, os2->ulCodePageRange2
+ };
+
+ writingSystems = determineWritingSystemsFromTrueTypeBits(unicodeRange, codePageRange);
+ }
+
+ QString family = QString::fromAscii(face->family_name);
+ FontFile *fontFile = new FontFile;
+ fontFile->fileName = file;
+ fontFile->indexValue = index;
+
+ QFont::Stretch stretch = QFont::Unstretched;
+
+ registerFont(family,"",weight,style,stretch,true,true,0,writingSystems,fontFile);
+
+ families.append(family);
+
+ FT_Done_Face(face);
+ ++index;
+ } while (index < numFaces);
+ return families;
+}
diff --git a/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.h b/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.h
new file mode 100644
index 0000000000..f04d453751
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/basicunix/qbasicunixfontdatabase.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBASICUNIXFONTDATABASE_H
+#define QBASICUNIXFONTDATABASE_H
+
+#include <QPlatformFontDatabase>
+#include <QtCore/QByteArray>
+#include <QtCore/QString>
+
+struct FontFile
+{
+ QString fileName;
+ int indexValue;
+};
+
+class QBasicUnixFontDatabase : public QPlatformFontDatabase
+{
+public:
+ void populateFontDatabase();
+ QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
+ QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QUnicodeTables::Script &script) const;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
+ void releaseHandle(void *handle);
+
+ static QStringList addTTFile(const QByteArray &fontData, const QByteArray &file);
+};
+
+#endif // QBASICUNIXFONTDATABASE_H
diff --git a/src/plugins/platforms/fontdatabases/fontconfig/fontconfig.pri b/src/plugins/platforms/fontdatabases/fontconfig/fontconfig.pri
new file mode 100644
index 0000000000..19c74ed089
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/fontconfig/fontconfig.pri
@@ -0,0 +1,12 @@
+include(../basicunix/basicunix.pri)
+
+HEADERS += \
+ $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h
+
+SOURCES += \
+ $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+
+INCLUDEPATH += $$QT_SOURCE_TREE/src/plugins/platforms/fontdatabases/fontconfig
+LIBS_PRIVATE += -lfontconfig
+
+
diff --git a/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp
new file mode 100644
index 0000000000..2a3fd5a8b5
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -0,0 +1,601 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qfontconfigdatabase.h"
+
+#include <QtCore/QList>
+#include <QtGui/private/qfont_p.h>
+
+#include <QtCore/QElapsedTimer>
+
+#include <QtGui/private/qapplication_p.h>
+#include <QtGui/QPlatformScreen>
+
+#include <QtGui/private/qfontengine_ft_p.h>
+#include <QtGui/private/qfontengine_p.h>
+
+
+
+#include <ft2build.h>
+#include FT_TRUETYPE_TABLES_H
+
+#include <fontconfig/fontconfig.h>
+
+#define SimplifiedChineseCsbBit 18
+#define TraditionalChineseCsbBit 20
+#define JapaneseCsbBit 17
+#define KoreanCsbBit 21
+
+static inline bool requiresOpenType(int writingSystem)
+{
+ return ((writingSystem >= QFontDatabase::Syriac && writingSystem <= QFontDatabase::Sinhala)
+ || writingSystem == QFontDatabase::Khmer || writingSystem == QFontDatabase::Nko);
+}
+static inline bool scriptRequiresOpenType(int script)
+{
+ return ((script >= QUnicodeTables::Syriac && script <= QUnicodeTables::Sinhala)
+ || script == QUnicodeTables::Khmer || script == QUnicodeTables::Nko);
+}
+
+static int getFCWeight(int fc_weight)
+{
+ int qtweight = QFont::Black;
+ if (fc_weight <= (FC_WEIGHT_LIGHT + FC_WEIGHT_MEDIUM) / 2)
+ qtweight = QFont::Light;
+ else if (fc_weight <= (FC_WEIGHT_MEDIUM + FC_WEIGHT_DEMIBOLD) / 2)
+ qtweight = QFont::Normal;
+ else if (fc_weight <= (FC_WEIGHT_DEMIBOLD + FC_WEIGHT_BOLD) / 2)
+ qtweight = QFont::DemiBold;
+ else if (fc_weight <= (FC_WEIGHT_BOLD + FC_WEIGHT_BLACK) / 2)
+ qtweight = QFont::Bold;
+
+ return qtweight;
+}
+
+static const char *specialLanguages[] = {
+ "en", // Common
+ "el", // Greek
+ "ru", // Cyrillic
+ "hy", // Armenian
+ "he", // Hebrew
+ "ar", // Arabic
+ "syr", // Syriac
+ "div", // Thaana
+ "hi", // Devanagari
+ "bn", // Bengali
+ "pa", // Gurmukhi
+ "gu", // Gujarati
+ "or", // Oriya
+ "ta", // Tamil
+ "te", // Telugu
+ "kn", // Kannada
+ "ml", // Malayalam
+ "si", // Sinhala
+ "th", // Thai
+ "lo", // Lao
+ "bo", // Tibetan
+ "my", // Myanmar
+ "ka", // Georgian
+ "ko", // Hangul
+ "", // Ogham
+ "", // Runic
+ "km", // Khmer
+ "" // N'Ko
+};
+enum { SpecialLanguageCount = sizeof(specialLanguages) / sizeof(const char *) };
+
+static const ushort specialChars[] = {
+ 0, // English
+ 0, // Greek
+ 0, // Cyrillic
+ 0, // Armenian
+ 0, // Hebrew
+ 0, // Arabic
+ 0, // Syriac
+ 0, // Thaana
+ 0, // Devanagari
+ 0, // Bengali
+ 0, // Gurmukhi
+ 0, // Gujarati
+ 0, // Oriya
+ 0, // Tamil
+ 0xc15, // Telugu
+ 0xc95, // Kannada
+ 0xd15, // Malayalam
+ 0xd9a, // Sinhala
+ 0, // Thai
+ 0, // Lao
+ 0, // Tibetan
+ 0x1000, // Myanmar
+ 0, // Georgian
+ 0, // Hangul
+ 0x1681, // Ogham
+ 0x16a0, // Runic
+ 0, // Khmer
+ 0x7ca // N'Ko
+};
+enum { SpecialCharCount = sizeof(specialChars) / sizeof(ushort) };
+
+// this could become a list of all languages used for each writing
+// system, instead of using the single most common language.
+static const char *languageForWritingSystem[] = {
+ 0, // Any
+ "en", // Latin
+ "el", // Greek
+ "ru", // Cyrillic
+ "hy", // Armenian
+ "he", // Hebrew
+ "ar", // Arabic
+ "syr", // Syriac
+ "div", // Thaana
+ "hi", // Devanagari
+ "bn", // Bengali
+ "pa", // Gurmukhi
+ "gu", // Gujarati
+ "or", // Oriya
+ "ta", // Tamil
+ "te", // Telugu
+ "kn", // Kannada
+ "ml", // Malayalam
+ "si", // Sinhala
+ "th", // Thai
+ "lo", // Lao
+ "bo", // Tibetan
+ "my", // Myanmar
+ "ka", // Georgian
+ "km", // Khmer
+ "zh-cn", // SimplifiedChinese
+ "zh-tw", // TraditionalChinese
+ "ja", // Japanese
+ "ko", // Korean
+ "vi", // Vietnamese
+ 0, // Symbol
+ 0, // Ogham
+ 0, // Runic
+ 0 // N'Ko
+};
+enum { LanguageCount = sizeof(languageForWritingSystem) / sizeof(const char *) };
+
+// Unfortunately FontConfig doesn't know about some languages. We have to test these through the
+// charset. The lists below contain the systems where we need to do this.
+static const ushort sampleCharForWritingSystem[] = {
+ 0, // Any
+ 0, // Latin
+ 0, // Greek
+ 0, // Cyrillic
+ 0, // Armenian
+ 0, // Hebrew
+ 0, // Arabic
+ 0, // Syriac
+ 0, // Thaana
+ 0, // Devanagari
+ 0, // Bengali
+ 0, // Gurmukhi
+ 0, // Gujarati
+ 0, // Oriya
+ 0, // Tamil
+ 0xc15, // Telugu
+ 0xc95, // Kannada
+ 0xd15, // Malayalam
+ 0xd9a, // Sinhala
+ 0, // Thai
+ 0, // Lao
+ 0, // Tibetan
+ 0x1000, // Myanmar
+ 0, // Georgian
+ 0, // Khmer
+ 0, // SimplifiedChinese
+ 0, // TraditionalChinese
+ 0, // Japanese
+ 0, // Korean
+ 0, // Vietnamese
+ 0, // Symbol
+ 0x1681, // Ogham
+ 0x16a0, // Runic
+ 0x7ca // N'Ko
+};
+enum { SampleCharCount = sizeof(sampleCharForWritingSystem) / sizeof(ushort) };
+
+// Newer FontConfig let's us sort out fonts that contain certain glyphs, but no
+// open type tables for is directly. Do this so we don't pick some strange
+// pseudo unicode font
+static const char *openType[] = {
+ 0, // Any
+ 0, // Latin
+ 0, // Greek
+ 0, // Cyrillic
+ 0, // Armenian
+ 0, // Hebrew
+ 0, // Arabic
+ "syrc", // Syriac
+ "thaa", // Thaana
+ "deva", // Devanagari
+ "beng", // Bengali
+ "guru", // Gurmukhi
+ "gurj", // Gujarati
+ "orya", // Oriya
+ "taml", // Tamil
+ "telu", // Telugu
+ "knda", // Kannada
+ "mlym", // Malayalam
+ "sinh", // Sinhala
+ 0, // Thai
+ 0, // Lao
+ "tibt", // Tibetan
+ "mymr", // Myanmar
+ 0, // Georgian
+ "khmr", // Khmer
+ 0, // SimplifiedChinese
+ 0, // TraditionalChinese
+ 0, // Japanese
+ 0, // Korean
+ 0, // Vietnamese
+ 0, // Symbol
+ 0, // Ogham
+ 0, // Runic
+ "nko " // N'Ko
+};
+
+static const char *getFcFamilyForStyleHint(const QFont::StyleHint style)
+{
+ const char *stylehint = 0;
+ switch (style) {
+ case QFont::SansSerif:
+ stylehint = "sans-serif";
+ break;
+ case QFont::Serif:
+ stylehint = "serif";
+ break;
+ case QFont::TypeWriter:
+ stylehint = "monospace";
+ break;
+ default:
+ break;
+ }
+ return stylehint;
+}
+
+void QFontconfigDatabase::populateFontDatabase()
+{
+ FcFontSet *fonts;
+
+ QString familyName;
+ FcChar8 *value = 0;
+ int weight_value;
+ int slant_value;
+ int spacing_value;
+ FcChar8 *file_value;
+ int indexValue;
+ FcChar8 *foundry_value;
+ FcBool scalable;
+ FcBool antialias;
+
+ {
+ FcObjectSet *os = FcObjectSetCreate();
+ FcPattern *pattern = FcPatternCreate();
+ const char *properties [] = {
+ FC_FAMILY, FC_WEIGHT, FC_SLANT,
+ FC_SPACING, FC_FILE, FC_INDEX,
+ FC_LANG, FC_CHARSET, FC_FOUNDRY, FC_SCALABLE, FC_PIXEL_SIZE, FC_WEIGHT,
+ FC_WIDTH,
+#if FC_VERSION >= 20297
+ FC_CAPABILITY,
+#endif
+ (const char *)0
+ };
+ const char **p = properties;
+ while (*p) {
+ FcObjectSetAdd(os, *p);
+ ++p;
+ }
+ fonts = FcFontList(0, pattern, os);
+ FcObjectSetDestroy(os);
+ FcPatternDestroy(pattern);
+ }
+
+ for (int i = 0; i < fonts->nfont; i++) {
+ if (FcPatternGetString(fonts->fonts[i], FC_FAMILY, 0, &value) != FcResultMatch)
+ continue;
+ // capitalize(value);
+ familyName = QString::fromUtf8((const char *)value);
+ slant_value = FC_SLANT_ROMAN;
+ weight_value = FC_WEIGHT_MEDIUM;
+ spacing_value = FC_PROPORTIONAL;
+ file_value = 0;
+ indexValue = 0;
+ scalable = FcTrue;
+
+
+ if (FcPatternGetInteger (fonts->fonts[i], FC_SLANT, 0, &slant_value) != FcResultMatch)
+ slant_value = FC_SLANT_ROMAN;
+ if (FcPatternGetInteger (fonts->fonts[i], FC_WEIGHT, 0, &weight_value) != FcResultMatch)
+ weight_value = FC_WEIGHT_MEDIUM;
+ if (FcPatternGetInteger (fonts->fonts[i], FC_SPACING, 0, &spacing_value) != FcResultMatch)
+ spacing_value = FC_PROPORTIONAL;
+ if (FcPatternGetString (fonts->fonts[i], FC_FILE, 0, &file_value) != FcResultMatch)
+ file_value = 0;
+ if (FcPatternGetInteger (fonts->fonts[i], FC_INDEX, 0, &indexValue) != FcResultMatch)
+ indexValue = 0;
+ if (FcPatternGetBool(fonts->fonts[i], FC_SCALABLE, 0, &scalable) != FcResultMatch)
+ scalable = FcTrue;
+ if (FcPatternGetString(fonts->fonts[i], FC_FOUNDRY, 0, &foundry_value) != FcResultMatch)
+ foundry_value = 0;
+ if(FcPatternGetBool(fonts->fonts[i],FC_ANTIALIAS,0,&antialias) != FcResultMatch)
+ antialias = true;
+
+ QSupportedWritingSystems writingSystems;
+ FcLangSet *langset = 0;
+ FcResult res = FcPatternGetLangSet(fonts->fonts[i], FC_LANG, 0, &langset);
+ if (res == FcResultMatch) {
+ for (int i = 1; i < LanguageCount; ++i) {
+ const FcChar8 *lang = (const FcChar8*) languageForWritingSystem[i];
+ if (lang) {
+ FcLangResult langRes = FcLangSetHasLang(langset, lang);
+ if (langRes != FcLangDifferentLang)
+ writingSystems.setSupported(QFontDatabase::WritingSystem(i));
+ }
+ }
+ } else {
+ // we set Other to supported for symbol fonts. It makes no
+ // sense to merge these with other ones, as they are
+ // special in a way.
+ writingSystems.setSupported(QFontDatabase::Other);
+ }
+
+ FcCharSet *cs = 0;
+ res = FcPatternGetCharSet(fonts->fonts[i], FC_CHARSET, 0, &cs);
+ if (res == FcResultMatch) {
+ // some languages are not supported by FontConfig, we rather check the
+ // charset to detect these
+ for (int i = 1; i < SampleCharCount; ++i) {
+ if (!sampleCharForWritingSystem[i])
+ continue;
+ if (FcCharSetHasChar(cs, sampleCharForWritingSystem[i]))
+ writingSystems.setSupported(QFontDatabase::WritingSystem(i));
+ }
+ }
+
+#if FC_VERSION >= 20297
+ for (int j = 1; j < LanguageCount; ++j) {
+ if (writingSystems.supported(QFontDatabase::WritingSystem(j))
+ && requiresOpenType(j) && openType[j]) {
+ FcChar8 *cap;
+ res = FcPatternGetString (fonts->fonts[i], FC_CAPABILITY, 0, &cap);
+ if (res != FcResultMatch || !strstr((const char *)cap, openType[j]))
+ writingSystems.setSupported(QFontDatabase::WritingSystem(j),false);
+ }
+ }
+#endif
+
+ FontFile *fontFile = new FontFile;
+ fontFile->fileName = QLatin1String((const char *)file_value);
+ fontFile->indexValue = indexValue;
+
+ QFont::Style style = (slant_value == FC_SLANT_ITALIC)
+ ? QFont::StyleItalic
+ : ((slant_value == FC_SLANT_OBLIQUE)
+ ? QFont::StyleOblique
+ : QFont::StyleNormal);
+ QFont::Weight weight = QFont::Weight(getFCWeight(weight_value));
+
+ double pixel_size = 0;
+ if (!scalable) {
+ int width = 100;
+ FcPatternGetInteger (fonts->fonts[i], FC_WIDTH, 0, &width);
+ FcPatternGetDouble (fonts->fonts[i], FC_PIXEL_SIZE, 0, &pixel_size);
+ }
+
+ QFont::Stretch stretch = QFont::Unstretched;
+ QPlatformFontDatabase::registerFont(familyName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,writingSystems,fontFile);
+// qDebug() << familyName << (const char *)foundry_value << weight << style << &writingSystems << scalable << true << pixel_size;
+ }
+
+ FcFontSetDestroy (fonts);
+
+ struct FcDefaultFont {
+ const char *qtname;
+ const char *rawname;
+ bool fixed;
+ };
+ const FcDefaultFont defaults[] = {
+ { "Serif", "serif", false },
+ { "Sans Serif", "sans-serif", false },
+ { "Monospace", "monospace", true },
+ { 0, 0, false }
+ };
+ const FcDefaultFont *f = defaults;
+ // aliases only make sense for 'common', not for any of the specials
+ QSupportedWritingSystems ws;
+ ws.setSupported(QFontDatabase::Latin);
+
+
+ while (f->qtname) {
+ registerFont(f->qtname,QLatin1String(""),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,ws,0);
+ registerFont(f->qtname,QLatin1String(""),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,ws,0);
+ registerFont(f->qtname,QLatin1String(""),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,ws,0);
+ ++f;
+ }
+
+ //Lighthouse has very lazy population of the font db. We want it to be initialized when
+ //QApplication is constructed, so that the population procedure can do something like this to
+ //set the default font
+// const FcDefaultFont *s = defaults;
+// QFont font("Sans Serif");
+// font.setPointSize(9);
+// QApplication::setFont(font);
+}
+
+QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, QUnicodeTables::Script script, void *usrPtr)
+{
+ if (!usrPtr)
+ return 0;
+ QFontDef fontDef = f;
+
+ QFontEngineFT *engine;
+ FontFile *fontfile = static_cast<FontFile *> (usrPtr);
+ QFontEngine::FaceId fid;
+ fid.filename = fontfile->fileName.toLocal8Bit();
+ fid.index = fontfile->indexValue;
+
+ //try and get the pattern
+ FcPattern *pattern = FcPatternCreate();
+
+ bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
+ QFontEngineFT::GlyphFormat format = antialias? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono;
+
+ engine = new QFontEngineFT(fontDef);
+
+ FcValue value;
+ value.type = FcTypeString;
+ QByteArray cs = fontDef.family.toUtf8();
+ value.u.s = (const FcChar8 *)cs.data();
+ FcPatternAdd(pattern,FC_FAMILY,value,true);
+
+
+ value.u.s = (const FcChar8 *)fid.filename.data();
+ FcPatternAdd(pattern,FC_FILE,value,true);
+
+ value.type = FcTypeInteger;
+ value.u.i = fid.index;
+ FcPatternAdd(pattern,FC_INDEX,value,true);
+
+ QFontEngineFT::HintStyle default_hint_style;
+
+ if (FcConfigSubstitute(0,pattern,FcMatchPattern)) {
+
+ //hinting
+ int hint_style = 0;
+ if (FcPatternGetInteger (pattern, FC_HINT_STYLE, 0, &hint_style) == FcResultNoMatch)
+ hint_style = QFontEngineFT::HintFull;
+ switch (hint_style) {
+ case FC_HINT_NONE:
+ default_hint_style = QFontEngineFT::HintNone;
+ break;
+ case FC_HINT_SLIGHT:
+ default_hint_style = QFontEngineFT::HintLight;
+ break;
+ case FC_HINT_MEDIUM:
+ default_hint_style = QFontEngineFT::HintMedium;
+ break;
+ default:
+ default_hint_style = QFontEngineFT::HintFull;
+ break;
+ }
+ }
+
+ engine->setDefaultHintStyle(default_hint_style);
+ if (!engine->init(fid,antialias,format)) {
+ delete engine;
+ engine = 0;
+ return engine;
+ }
+ if (engine->invalid()) {
+ delete engine;
+ engine = 0;
+ } else if (scriptRequiresOpenType(script)) {
+ HB_Face hbFace = engine->harfbuzzFace();
+ if (!hbFace || !hbFace->supported_scripts[script]) {
+ delete engine;
+ engine = 0;
+ }
+ }
+
+ return engine;
+}
+
+QStringList QFontconfigDatabase::fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const
+{
+ QStringList fallbackFamilies;
+ FcPattern *pattern = FcPatternCreate();
+ if (!pattern)
+ return fallbackFamilies;
+
+ FcValue value;
+ value.type = FcTypeString;
+ QByteArray cs = family.toUtf8();
+ value.u.s = (const FcChar8 *)cs.data();
+ FcPatternAdd(pattern,FC_FAMILY,value,true);
+
+ int slant_value = FC_SLANT_ROMAN;
+ if (style == QFont::StyleItalic)
+ slant_value = FC_SLANT_ITALIC;
+ else if (style == QFont::StyleOblique)
+ slant_value = FC_SLANT_OBLIQUE;
+ FcPatternAddInteger(pattern, FC_SLANT, slant_value);
+
+ if (script != QUnicodeTables::Common && *specialLanguages[script] != '\0') {
+ Q_ASSERT(script < QUnicodeTables::ScriptCount);
+ FcLangSet *ls = FcLangSetCreate();
+ FcLangSetAdd(ls, (const FcChar8*)specialLanguages[script]);
+ FcPatternAddLangSet(pattern, FC_LANG, ls);
+ FcLangSetDestroy(ls);
+ }
+
+ const char *stylehint = getFcFamilyForStyleHint(styleHint);
+ if (stylehint) {
+ value.u.s = (const FcChar8 *)stylehint;
+ FcPatternAddWeak(pattern, FC_FAMILY, value, FcTrue);
+ }
+
+ FcConfigSubstitute(0, pattern, FcMatchPattern);
+ FcConfigSubstitute(0, pattern, FcMatchFont);
+
+ FcResult result = FcResultMatch;
+ FcFontSet *fontSet = FcFontSort(0,pattern,FcFalse,0,&result);
+
+ if (fontSet && result == FcResultMatch)
+ {
+ for (int i = 0; i < fontSet->nfont; i++) {
+ FcChar8 *value = 0;
+ if (FcPatternGetString(fontSet->fonts[i], FC_FAMILY, 0, &value) != FcResultMatch)
+ continue;
+ // capitalize(value);
+ QString familyName = QString::fromUtf8((const char *)value);
+ if (!fallbackFamilies.contains(familyName,Qt::CaseInsensitive)) {
+ fallbackFamilies << familyName;
+ }
+
+ }
+ }
+// qDebug() << "fallbackFamilies for:" << family << fallbackFamilies;
+
+ return fallbackFamilies;
+}
diff --git a/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h
new file mode 100644
index 0000000000..ee441f7a1a
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/fontconfig/qfontconfigdatabase.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QFONTCONFIGDATABASE_H
+#define QFONTCONFIGDATABASE_H
+
+#include <QPlatformFontDatabase>
+#include "qbasicunixfontdatabase.h"
+
+class QFontconfigDatabase : public QBasicUnixFontDatabase
+{
+public:
+ void populateFontDatabase();
+ QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
+ QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const;
+};
+
+#endif // QFONTCONFIGDATABASE_H
diff --git a/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri b/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
new file mode 100644
index 0000000000..1153ab36b7
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/genericunix/genericunix.pri
@@ -0,0 +1,10 @@
+contains(QT_CONFIG, fontconfig) {
+ include(../fontconfig/fontconfig.pri)
+ DEFINES += Q_FONTCONFIGDATABASE
+} else {
+ include(../basicunix/basicunix.pri)
+}
+
+INCLUDEPATH += $$PWD
+HEADERS += \
+ $$PWD/qgenericunixfontdatabase.h
diff --git a/src/plugins/platforms/fontdatabases/genericunix/qgenericunixfontdatabase.h b/src/plugins/platforms/fontdatabases/genericunix/qgenericunixfontdatabase.h
new file mode 100644
index 0000000000..bfe014acf2
--- /dev/null
+++ b/src/plugins/platforms/fontdatabases/genericunix/qgenericunixfontdatabase.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGENERICUNIXFONTDATABASE_H
+#define QGENERICUNIXFONTDATABASE_H
+
+#ifdef Q_FONTCONFIGDATABASE
+#include "qfontconfigdatabase.h"
+typedef QFontconfigDatabase QGenericUnixFontDatabase;
+#else
+#include "qbasicunixfontdatabase.h"
+typedef QBasicUnixFontDatabase QGenericUnixFontDatabase;
+#endif //Q_FONTCONFIGDATABASE
+
+#endif // QGENERICUNIXFONTDATABASE_H
diff --git a/src/plugins/platforms/glxconvenience/glxconvenience.pri b/src/plugins/platforms/glxconvenience/glxconvenience.pri
new file mode 100644
index 0000000000..d6c992229e
--- /dev/null
+++ b/src/plugins/platforms/glxconvenience/glxconvenience.pri
@@ -0,0 +1,7 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+ $$PWD/qglxconvenience.h
+
+SOURCES += \
+ $$PWD/qglxconvenience.cpp
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.cpp b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
new file mode 100644
index 0000000000..7cee3e2ea1
--- /dev/null
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.cpp
@@ -0,0 +1,243 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qglxconvenience.h"
+
+#include <QtCore/QVector>
+
+enum {
+ XFocusOut = FocusOut,
+ XFocusIn = FocusIn,
+ XKeyPress = KeyPress,
+ XKeyRelease = KeyRelease,
+ XNone = None,
+ XRevertToParent = RevertToParent,
+ XGrayScale = GrayScale,
+ XCursorShape = CursorShape
+};
+#undef FocusOut
+#undef FocusIn
+#undef KeyPress
+#undef KeyRelease
+#undef None
+#undef RevertToParent
+#undef GrayScale
+#undef CursorShape
+
+#ifdef FontChange
+#undef FontChange
+#endif
+
+QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format, int drawableBit)
+{
+ QVector<int> spec(48);
+ int i = 0;
+
+ spec[i++] = GLX_LEVEL;
+ spec[i++] = 0;
+ spec[i++] = GLX_DRAWABLE_TYPE; spec[i++] = drawableBit;
+
+ if (format.rgba()) {
+ spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_RGBA_BIT;
+ spec[i++] = GLX_RED_SIZE; spec[i++] = (format.redBufferSize() == -1) ? 1 : format.redBufferSize();
+ spec[i++] = GLX_GREEN_SIZE; spec[i++] = (format.greenBufferSize() == -1) ? 1 : format.greenBufferSize();
+ spec[i++] = GLX_BLUE_SIZE; spec[i++] = (format.blueBufferSize() == -1) ? 1 : format.blueBufferSize();
+ if (format.alpha()) {
+ spec[i++] = GLX_ALPHA_SIZE; spec[i++] = (format.alphaBufferSize() == -1) ? 1 : format.alphaBufferSize();
+ }
+
+ spec[i++] = GLX_ACCUM_RED_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+ spec[i++] = GLX_ACCUM_GREEN_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+ spec[i++] = GLX_ACCUM_BLUE_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+
+ if (format.alpha()) {
+ spec[i++] = GLX_ACCUM_ALPHA_SIZE; spec[i++] = (format.accumBufferSize() == -1) ? 1 : format.accumBufferSize();
+ }
+
+ } else {
+ spec[i++] = GLX_RENDER_TYPE; spec[i++] = GLX_COLOR_INDEX_BIT; //I'm really not sure if this works....
+ spec[i++] = GLX_BUFFER_SIZE; spec[i++] = 8;
+ }
+
+ spec[i++] = GLX_DOUBLEBUFFER; spec[i++] = format.doubleBuffer() ? True : False;
+ spec[i++] = GLX_STEREO; spec[i++] = format.stereo() ? True : False;
+
+ if (format.depth()) {
+ spec[i++] = GLX_DEPTH_SIZE; spec[i++] = (format.depthBufferSize() == -1) ? 1 : format.depthBufferSize();
+ }
+
+ if (format.stencil()) {
+ spec[i++] = GLX_STENCIL_SIZE; spec[i++] = (format.stencilBufferSize() == -1) ? 1 : format.stencilBufferSize();
+ }
+ if (format.sampleBuffers()) {
+ spec[i++] = GLX_SAMPLE_BUFFERS_ARB;
+ spec[i++] = 1;
+ spec[i++] = GLX_SAMPLES_ARB;
+ spec[i++] = format.samples() == -1 ? 4 : format.samples();
+ }
+
+ spec[i++] = XNone;
+ return spec;
+}
+
+GLXFBConfig qglx_findConfig(Display *display, int screen , const QPlatformWindowFormat &format, int drawableBit)
+{
+ bool reduced = true;
+ GLXFBConfig chosenConfig = 0;
+ QPlatformWindowFormat reducedFormat = format;
+ while (!chosenConfig && reduced) {
+ QVector<int> spec = qglx_buildSpec(reducedFormat, drawableBit);
+ int confcount = 0;
+ GLXFBConfig *configs;
+ configs = glXChooseFBConfig(display, screen,spec.constData(),&confcount);
+ if (confcount)
+ {
+ for (int i = 0; i < confcount; i++) {
+ chosenConfig = configs[i];
+ // Make sure we try to get an ARGB visual if the format asked for an alpha:
+ if (reducedFormat.alpha()) {
+ int alphaSize;
+ glXGetFBConfigAttrib(display,configs[i],GLX_ALPHA_SIZE,&alphaSize);
+ if (alphaSize > 0)
+ break;
+ } else {
+ break; // Just choose the first in the list if there's no alpha requested
+ }
+ }
+
+ XFree(configs);
+ }
+ reducedFormat = qglx_reducePlatformWindowFormat(reducedFormat,&reduced);
+ }
+
+ if (!chosenConfig)
+ qWarning("Warning: no suitable glx confiuration found");
+
+ return chosenConfig;
+}
+
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format)
+{
+ GLXFBConfig config = qglx_findConfig(display,screen,format);
+ XVisualInfo *visualInfo = glXGetVisualFromFBConfig(display,config);
+ return visualInfo;
+}
+
+QPlatformWindowFormat qglx_platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext ctx)
+{
+ QPlatformWindowFormat format;
+ int redSize = 0;
+ int greenSize = 0;
+ int blueSize = 0;
+ int alphaSize = 0;
+ int depthSize = 0;
+ int stencilSize = 0;
+ int sampleBuffers = 0;
+ int sampleCount = 0;
+ int level = 0;
+ int rgba = 0;
+ int stereo = 0;
+ int accumSizeA = 0;
+ int accumSizeR = 0;
+ int accumSizeG = 0;
+ int accumSizeB = 0;
+
+ XVisualInfo *vi = glXGetVisualFromFBConfig(display,config);
+ glXGetConfig(display,vi,GLX_RGBA,&rgba);
+ XFree(vi);
+ glXGetFBConfigAttrib(display, config, GLX_RED_SIZE, &redSize);
+ glXGetFBConfigAttrib(display, config, GLX_GREEN_SIZE, &greenSize);
+ glXGetFBConfigAttrib(display, config, GLX_BLUE_SIZE, &blueSize);
+ glXGetFBConfigAttrib(display, config, GLX_ALPHA_SIZE, &alphaSize);
+ glXGetFBConfigAttrib(display, config, GLX_DEPTH_SIZE, &depthSize);
+ glXGetFBConfigAttrib(display, config, GLX_STENCIL_SIZE, &stencilSize);
+ glXGetFBConfigAttrib(display, config, GLX_SAMPLES, &sampleBuffers);
+ glXGetFBConfigAttrib(display, config, GLX_LEVEL, &level);
+ glXGetFBConfigAttrib(display, config, GLX_STEREO, &stereo);
+ glXGetFBConfigAttrib(display, config, GLX_ACCUM_ALPHA_SIZE, &accumSizeA);
+ glXGetFBConfigAttrib(display, config, GLX_ACCUM_RED_SIZE, &accumSizeR);
+ glXGetFBConfigAttrib(display, config, GLX_ACCUM_GREEN_SIZE, &accumSizeG);
+ glXGetFBConfigAttrib(display, config, GLX_ACCUM_BLUE_SIZE, &accumSizeB);
+
+ format.setRedBufferSize(redSize);
+ format.setGreenBufferSize(greenSize);
+ format.setBlueBufferSize(blueSize);
+ format.setAlphaBufferSize(alphaSize);
+ format.setDepthBufferSize(depthSize);
+ format.setStencilBufferSize(stencilSize);
+ format.setSampleBuffers(sampleBuffers);
+ if (format.sampleBuffers()) {
+ glXGetFBConfigAttrib(display, config, GLX_SAMPLES_ARB, &sampleCount);
+ format.setSamples(sampleCount);
+ }
+
+ format.setDirectRendering(glXIsDirect(display, ctx));
+ format.setRgba(rgba);
+ format.setStereo(stereo);
+ format.setAccumBufferSize(accumSizeB);
+
+ return format;
+}
+
+QPlatformWindowFormat qglx_reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced)
+{
+ QPlatformWindowFormat retFormat = format;
+ *reduced = true;
+
+ if (retFormat.sampleBuffers()) {
+ retFormat.setSampleBuffers(false);
+ } else if (retFormat.stereo()) {
+ retFormat.setStereo(false);
+ } else if (retFormat.accum()) {
+ retFormat.setAccum(false);
+ }else if (retFormat.stencil()) {
+ retFormat.setStencil(false);
+ }else if (retFormat.alpha()) {
+ retFormat.setAlpha(false);
+ }else if (retFormat.depth()) {
+ retFormat.setDepth(false);
+ }else if (retFormat.doubleBuffer()) {
+ retFormat.setDoubleBuffer(false);
+ }else{
+ *reduced = false;
+ }
+ return retFormat;
+}
diff --git a/src/plugins/platforms/glxconvenience/qglxconvenience.h b/src/plugins/platforms/glxconvenience/qglxconvenience.h
new file mode 100644
index 0000000000..2c59dbb324
--- /dev/null
+++ b/src/plugins/platforms/glxconvenience/qglxconvenience.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGLXCONVENIENCE_H
+#define QGLXCONVENIENCE_H
+
+#include <QPlatformWindowFormat>
+
+#include <X11/Xlib.h>
+#include <GL/glx.h>
+
+XVisualInfo *qglx_findVisualInfo(Display *display, int screen, const QPlatformWindowFormat &format);
+GLXFBConfig qglx_findConfig(Display *display, int screen, const QPlatformWindowFormat &format, int drawableBit = GLX_WINDOW_BIT);
+QPlatformWindowFormat qglx_platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config, GLXContext context);
+QVector<int> qglx_buildSpec(const QPlatformWindowFormat &format, int drawableBit = GLX_WINDOW_BIT);
+QPlatformWindowFormat qglx_reducePlatformWindowFormat(const QPlatformWindowFormat &format, bool *reduced);
+
+#endif // QGLXCONVENIENCE_H
diff --git a/src/plugins/platforms/linuxfb/linuxfb.pro b/src/plugins/platforms/linuxfb/linuxfb.pro
new file mode 100644
index 0000000000..216b899fdb
--- /dev/null
+++ b/src/plugins/platforms/linuxfb/linuxfb.pro
@@ -0,0 +1,13 @@
+TARGET = qlinuxfbgraphicssystem
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+SOURCES = main.cpp qlinuxfbintegration.cpp
+HEADERS = qlinuxfbintegration.h
+
+include(../fb_base/fb_base.pri)
+include(../fontdatabases/genericunix/genericunix.pri)
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/linuxfb/main.cpp b/src/plugins/platforms/linuxfb/main.cpp
new file mode 100644
index 0000000000..fb14ef4d13
--- /dev/null
+++ b/src/plugins/platforms/linuxfb/main.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QPlatformIntegrationPlugin>
+#include "qlinuxfbintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QLinuxFbIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QLinuxFbIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "LinuxFb";
+ return list;
+}
+
+QPlatformIntegration* QLinuxFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "linuxfb")
+ return new QLinuxFbIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(linuxfb, QLinuxFbIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp
new file mode 100644
index 0000000000..a088a31d6d
--- /dev/null
+++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp
@@ -0,0 +1,875 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qlinuxfbintegration.h"
+#include "../fb_base/fb_base.h"
+#include "qgenericunixfontdatabase.h"
+#include <QtGui/private/qpixmap_raster_p.h>
+#include <private/qcore_unix_p.h> // overrides QT_OPEN
+#include <qimage.h>
+#include <qdebug.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/kd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <limits.h>
+#include <signal.h>
+
+#if !defined(Q_OS_DARWIN) && !defined(Q_OS_FREEBSD)
+#include <linux/fb.h>
+
+#ifdef __i386__
+#include <asm/mtrr.h>
+#endif
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QLinuxFbIntegrationPrivate
+{
+public:
+ QLinuxFbIntegrationPrivate();
+ ~QLinuxFbIntegrationPrivate();
+
+ void openTty();
+ void closeTty();
+
+ int fd;
+ int startupw;
+ int startuph;
+ int startupd;
+ bool blank;
+
+ bool doGraphicsMode;
+#ifdef QT_QWS_DEPTH_GENERIC
+ bool doGenericColors;
+#endif
+ int ttyfd;
+ long oldKdMode;
+ QString ttyDevice;
+ QString displaySpec;
+};
+
+QLinuxFbIntegrationPrivate::QLinuxFbIntegrationPrivate()
+ : fd(-1), blank(true), doGraphicsMode(true),
+#ifdef QT_QWS_DEPTH_GENERIC
+ doGenericColors(false),
+#endif
+ ttyfd(-1), oldKdMode(KD_TEXT)
+{
+}
+
+QLinuxFbIntegrationPrivate::~QLinuxFbIntegrationPrivate()
+{
+ closeTty();
+}
+
+void QLinuxFbIntegrationPrivate::openTty()
+{
+ const char *const devs[] = {"/dev/tty0", "/dev/tty", "/dev/console", 0};
+
+ if (ttyDevice.isEmpty()) {
+ for (const char * const *dev = devs; *dev; ++dev) {
+ ttyfd = QT_OPEN(*dev, O_RDWR);
+ if (ttyfd != -1)
+ break;
+ }
+ } else {
+ ttyfd = QT_OPEN(ttyDevice.toAscii().constData(), O_RDWR);
+ }
+
+ if (ttyfd == -1)
+ return;
+
+ if (doGraphicsMode) {
+ ioctl(ttyfd, KDGETMODE, &oldKdMode);
+ if (oldKdMode != KD_GRAPHICS) {
+ int ret = ioctl(ttyfd, KDSETMODE, KD_GRAPHICS);
+ if (ret == -1)
+ doGraphicsMode = false;
+ }
+ }
+
+ // No blankin' screen, no blinkin' cursor!, no cursor!
+ const char termctl[] = "\033[9;0]\033[?33l\033[?25l\033[?1c";
+ QT_WRITE(ttyfd, termctl, sizeof(termctl));
+}
+
+void QLinuxFbIntegrationPrivate::closeTty()
+{
+ if (ttyfd == -1)
+ return;
+
+ if (doGraphicsMode)
+ ioctl(ttyfd, KDSETMODE, oldKdMode);
+
+ // Blankin' screen, blinkin' cursor!
+ const char termctl[] = "\033[9;15]\033[?33h\033[?25h\033[?0c";
+ QT_WRITE(ttyfd, termctl, sizeof(termctl));
+
+ QT_CLOSE(ttyfd);
+ ttyfd = -1;
+}
+
+QLinuxFbIntegration::QLinuxFbIntegration()
+ :fontDb(new QGenericUnixFontDatabase())
+{
+ d_ptr = new QLinuxFbIntegrationPrivate();
+
+ // XXX
+ QString displaySpec = QString::fromLatin1(qgetenv("QWS_DISPLAY"));
+
+ if (!connect(displaySpec))
+ qFatal("QLinuxFbIntegration: could not initialize screen");
+ initDevice();
+
+ // Create a QImage directly on the screen's framebuffer.
+ // This is the blit target for copying windows to the screen.
+ mPrimaryScreen = new QLinuxFbScreen(data, w, h, lstep,
+ screenFormat);
+ mPrimaryScreen->setPhysicalSize(QSize(physWidth, physHeight));
+ mScreens.append(mPrimaryScreen);
+}
+
+QLinuxFbIntegration::~QLinuxFbIntegration()
+{
+ delete mPrimaryScreen;
+ delete d_ptr;
+}
+
+bool QLinuxFbIntegration::connect(const QString &displaySpec)
+{
+ const QStringList args = displaySpec.split(QLatin1Char(':'));
+
+ if (args.contains(QLatin1String("nographicsmodeswitch")))
+ d_ptr->doGraphicsMode = false;
+
+#ifdef QT_QWS_DEPTH_GENERIC
+ if (args.contains(QLatin1String("genericcolors")))
+ d_ptr->doGenericColors = true;
+#endif
+
+ QRegExp ttyRegExp(QLatin1String("tty=(.*)"));
+ if (args.indexOf(ttyRegExp) != -1)
+ d_ptr->ttyDevice = ttyRegExp.cap(1);
+
+#if 0
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+#ifndef QT_QWS_FRAMEBUFFER_LITTLE_ENDIAN
+ if (args.contains(QLatin1String("littleendian")))
+#endif
+ QScreen::setFrameBufferLittleEndian(true);
+#endif
+#endif
+
+ // Check for explicitly specified device
+ const int len = 8; // "/dev/fbx"
+ int m = displaySpec.indexOf(QLatin1String("/dev/fb"));
+
+ QString dev;
+ if (m > 0)
+ dev = displaySpec.mid(m, len);
+ else
+ dev = QLatin1String("/dev/fb0");
+
+ if (access(dev.toLatin1().constData(), R_OK|W_OK) == 0)
+ d_ptr->fd = QT_OPEN(dev.toLatin1().constData(), O_RDWR);
+ if (d_ptr->fd == -1) {
+ if (access(dev.toLatin1().constData(), R_OK) == 0)
+ d_ptr->fd = QT_OPEN(dev.toLatin1().constData(), O_RDONLY);
+ if (d_ptr->fd == 1) {
+ qWarning("Error opening framebuffer device %s", qPrintable(dev));
+ return false;
+ }
+ }
+
+ fb_fix_screeninfo finfo;
+ fb_var_screeninfo vinfo;
+ //#######################
+ // Shut up Valgrind
+ memset(&vinfo, 0, sizeof(vinfo));
+ memset(&finfo, 0, sizeof(finfo));
+ //#######################
+
+ /* Get fixed screen information */
+ if (d_ptr->fd != -1 && ioctl(d_ptr->fd, FBIOGET_FSCREENINFO, &finfo)) {
+ perror("QLinuxFbIntegration::connect");
+ qWarning("Error reading fixed information");
+ return false;
+ }
+
+ if (finfo.type == FB_TYPE_VGA_PLANES) {
+ qWarning("VGA16 video mode not supported");
+ return false;
+ }
+
+ /* Get variable screen information */
+ if (d_ptr->fd != -1 && ioctl(d_ptr->fd, FBIOGET_VSCREENINFO, &vinfo)) {
+ perror("QLinuxFbIntegration::connect");
+ qWarning("Error reading variable information");
+ return false;
+ }
+
+ grayscale = vinfo.grayscale;
+ d = vinfo.bits_per_pixel;
+ if (d == 24) {
+ d = vinfo.red.length + vinfo.green.length + vinfo.blue.length;
+ if (d <= 0)
+ d = 24; // reset if color component lengths are not reported
+ } else if (d == 16) {
+ d = vinfo.red.length + vinfo.green.length + vinfo.blue.length;
+ if (d <= 0)
+ d = 16;
+ }
+ lstep = finfo.line_length;
+
+ int xoff = vinfo.xoffset;
+ int yoff = vinfo.yoffset;
+ const char* qwssize;
+ if((qwssize=::getenv("QWS_SIZE")) && sscanf(qwssize,"%dx%d",&w,&h)==2) {
+ if (d_ptr->fd != -1) {
+ if ((uint)w > vinfo.xres) w = vinfo.xres;
+ if ((uint)h > vinfo.yres) h = vinfo.yres;
+ }
+ dw=w;
+ dh=h;
+ int xxoff, yyoff;
+ if (sscanf(qwssize, "%*dx%*d+%d+%d", &xxoff, &yyoff) == 2) {
+ if (xxoff < 0 || xxoff + w > (int)(vinfo.xres))
+ xxoff = vinfo.xres - w;
+ if (yyoff < 0 || yyoff + h > (int)(vinfo.yres))
+ yyoff = vinfo.yres - h;
+ xoff += xxoff;
+ yoff += yyoff;
+ } else {
+ xoff += (vinfo.xres - w)/2;
+ yoff += (vinfo.yres - h)/2;
+ }
+ } else {
+ dw=w=vinfo.xres;
+ dh=h=vinfo.yres;
+ }
+
+ if (w == 0 || h == 0) {
+ qWarning("QLinuxFbIntegration::connect(): Unable to find screen geometry, "
+ "will use 320x240.");
+ dw = w = 320;
+ dh = h = 240;
+ }
+
+ setPixelFormat(vinfo);
+
+ // Handle display physical size spec.
+ QStringList displayArgs = displaySpec.split(QLatin1Char(':'));
+ QRegExp mmWidthRx(QLatin1String("mmWidth=?(\\d+)"));
+ int dimIdxW = displayArgs.indexOf(mmWidthRx);
+ QRegExp mmHeightRx(QLatin1String("mmHeight=?(\\d+)"));
+ int dimIdxH = displayArgs.indexOf(mmHeightRx);
+ if (dimIdxW >= 0) {
+ mmWidthRx.exactMatch(displayArgs.at(dimIdxW));
+ physWidth = mmWidthRx.cap(1).toInt();
+ if (dimIdxH < 0)
+ physHeight = dh*physWidth/dw;
+ }
+ if (dimIdxH >= 0) {
+ mmHeightRx.exactMatch(displayArgs.at(dimIdxH));
+ physHeight = mmHeightRx.cap(1).toInt();
+ if (dimIdxW < 0)
+ physWidth = dw*physHeight/dh;
+ }
+ if (dimIdxW < 0 && dimIdxH < 0) {
+ if (vinfo.width != 0 && vinfo.height != 0
+ && vinfo.width != UINT_MAX && vinfo.height != UINT_MAX) {
+ physWidth = vinfo.width;
+ physHeight = vinfo.height;
+ } else {
+ const int dpi = 72;
+ physWidth = qRound(dw * 25.4 / dpi);
+ physHeight = qRound(dh * 25.4 / dpi);
+ }
+ }
+
+ dataoffset = yoff * lstep + xoff * d / 8;
+ //qDebug("Using %dx%dx%d screen",w,h,d);
+
+ /* Figure out the size of the screen in bytes */
+ size = h * lstep;
+
+ mapsize = finfo.smem_len;
+
+ data = (unsigned char *)-1;
+ if (d_ptr->fd != -1)
+ data = (unsigned char *)mmap(0, mapsize, PROT_READ | PROT_WRITE,
+ MAP_SHARED, d_ptr->fd, 0);
+
+ if ((long)data == -1) {
+ perror("QLinuxFbIntegration::connect");
+ qWarning("Error: failed to map framebuffer device to memory.");
+ return false;
+ } else {
+ data += dataoffset;
+ }
+
+#if 0
+ canaccel = useOffscreen();
+ if(canaccel)
+ setupOffScreen();
+#endif
+ canaccel = false;
+
+ // Now read in palette
+ if((vinfo.bits_per_pixel==8) || (vinfo.bits_per_pixel==4)) {
+ screencols= (vinfo.bits_per_pixel==8) ? 256 : 16;
+ int loopc;
+ fb_cmap startcmap;
+ startcmap.start=0;
+ startcmap.len=screencols;
+ startcmap.red=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ startcmap.green=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ startcmap.blue=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ startcmap.transp=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ if (d_ptr->fd == -1 || ioctl(d_ptr->fd, FBIOGETCMAP, &startcmap)) {
+ perror("QLinuxFbIntegration::connect");
+ qWarning("Error reading palette from framebuffer, using default palette");
+ createPalette(startcmap, vinfo, finfo);
+ }
+ int bits_used = 0;
+ for(loopc=0;loopc<screencols;loopc++) {
+ screenclut[loopc]=qRgb(startcmap.red[loopc] >> 8,
+ startcmap.green[loopc] >> 8,
+ startcmap.blue[loopc] >> 8);
+ bits_used |= startcmap.red[loopc]
+ | startcmap.green[loopc]
+ | startcmap.blue[loopc];
+ }
+ // WORKAROUND: Some framebuffer drivers only return 8 bit
+ // color values, so we need to not bit shift them..
+ if ((bits_used & 0x00ff) && !(bits_used & 0xff00)) {
+ for(loopc=0;loopc<screencols;loopc++) {
+ screenclut[loopc] = qRgb(startcmap.red[loopc],
+ startcmap.green[loopc],
+ startcmap.blue[loopc]);
+ }
+ qWarning("8 bits cmap returned due to faulty FB driver, colors corrected");
+ }
+ free(startcmap.red);
+ free(startcmap.green);
+ free(startcmap.blue);
+ free(startcmap.transp);
+ } else {
+ screencols=0;
+ }
+
+ return true;
+}
+
+bool QLinuxFbIntegration::initDevice()
+{
+ d_ptr->openTty();
+
+ // Grab current mode so we can reset it
+ fb_var_screeninfo vinfo;
+ fb_fix_screeninfo finfo;
+ //#######################
+ // Shut up Valgrind
+ memset(&vinfo, 0, sizeof(vinfo));
+ memset(&finfo, 0, sizeof(finfo));
+ //#######################
+
+ if (ioctl(d_ptr->fd, FBIOGET_VSCREENINFO, &vinfo)) {
+ perror("QLinuxFbScreen::initDevice");
+ qFatal("Error reading variable information in card init");
+ return false;
+ }
+
+#ifdef DEBUG_VINFO
+ qDebug("Greyscale %d",vinfo.grayscale);
+ qDebug("Nonstd %d",vinfo.nonstd);
+ qDebug("Red %d %d %d",vinfo.red.offset,vinfo.red.length,
+ vinfo.red.msb_right);
+ qDebug("Green %d %d %d",vinfo.green.offset,vinfo.green.length,
+ vinfo.green.msb_right);
+ qDebug("Blue %d %d %d",vinfo.blue.offset,vinfo.blue.length,
+ vinfo.blue.msb_right);
+ qDebug("Transparent %d %d %d",vinfo.transp.offset,vinfo.transp.length,
+ vinfo.transp.msb_right);
+#endif
+
+ d_ptr->startupw=vinfo.xres;
+ d_ptr->startuph=vinfo.yres;
+ d_ptr->startupd=vinfo.bits_per_pixel;
+ grayscale = vinfo.grayscale;
+
+ if (ioctl(d_ptr->fd, FBIOGET_FSCREENINFO, &finfo)) {
+ perror("QLinuxFbScreen::initDevice");
+ qCritical("Error reading fixed information in card init");
+ // It's not an /error/ as such, though definitely a bad sign
+ // so we return true
+ return true;
+ }
+
+#ifdef __i386__
+ // Now init mtrr
+ if(!::getenv("QWS_NOMTRR")) {
+ int mfd=QT_OPEN("/proc/mtrr",O_WRONLY,0);
+ // MTRR entry goes away when file is closed - i.e.
+ // hopefully when QWS is killed
+ if(mfd != -1) {
+ mtrr_sentry sentry;
+ sentry.base=(unsigned long int)finfo.smem_start;
+ //qDebug("Physical framebuffer address %p",(void*)finfo.smem_start);
+ // Size needs to be in 4k chunks, but that's not always
+ // what we get thanks to graphics card registers. Write combining
+ // these is Not Good, so we write combine what we can
+ // (which is not much - 4 megs on an 8 meg card, it seems)
+ unsigned int size=finfo.smem_len;
+ size=size >> 22;
+ size=size << 22;
+ sentry.size=size;
+ sentry.type=MTRR_TYPE_WRCOMB;
+ if(ioctl(mfd,MTRRIOC_ADD_ENTRY,&sentry)==-1) {
+ //printf("Couldn't add mtrr entry for %lx %lx, %s\n",
+ //sentry.base,sentry.size,strerror(errno));
+ }
+ }
+
+ // Should we close mfd here?
+ //QT_CLOSE(mfd);
+ }
+#endif
+ if ((vinfo.bits_per_pixel==8) || (vinfo.bits_per_pixel==4) || (finfo.visual==FB_VISUAL_DIRECTCOLOR))
+ {
+ fb_cmap cmap;
+ createPalette(cmap, vinfo, finfo);
+ if (ioctl(d_ptr->fd, FBIOPUTCMAP, &cmap)) {
+ perror("QLinuxFbScreen::initDevice");
+ qWarning("Error writing palette to framebuffer");
+ }
+ free(cmap.red);
+ free(cmap.green);
+ free(cmap.blue);
+ free(cmap.transp);
+ }
+
+#if 0
+ if (canaccel) {
+ *entryp=0;
+ *lowest = mapsize;
+ insert_entry(*entryp, *lowest, *lowest); // dummy entry to mark start
+ }
+
+ shared->fifocount = 0;
+ shared->buffer_offset = 0xffffffff; // 0 would be a sensible offset (screen)
+ shared->linestep = 0;
+ shared->cliptop = 0xffffffff;
+ shared->clipleft = 0xffffffff;
+ shared->clipright = 0xffffffff;
+ shared->clipbottom = 0xffffffff;
+ shared->rop = 0xffffffff;
+#endif
+
+#ifdef QT_QWS_DEPTH_GENERIC
+ if (pixelFormat() == QImage::Format_Invalid && screencols == 0
+ && d_ptr->doGenericColors)
+ {
+ qt_set_generic_blit(this, vinfo.bits_per_pixel,
+ vinfo.red.length, vinfo.green.length,
+ vinfo.blue.length, vinfo.transp.length,
+ vinfo.red.offset, vinfo.green.offset,
+ vinfo.blue.offset, vinfo.transp.offset);
+ }
+#endif
+
+#if 0
+#ifndef QT_NO_QWS_CURSOR
+ QScreenCursor::initSoftwareCursor();
+#endif
+#endif
+ blank(false);
+
+ return true;
+}
+
+void QLinuxFbIntegration::setPixelFormat(struct fb_var_screeninfo info)
+{
+ const fb_bitfield rgba[4] = { info.red, info.green,
+ info.blue, info.transp };
+
+ QImage::Format format = QImage::Format_Invalid;
+
+ switch (d) {
+ case 32: {
+ const fb_bitfield argb8888[4] = {{16, 8, 0}, {8, 8, 0},
+ {0, 8, 0}, {24, 8, 0}};
+ const fb_bitfield abgr8888[4] = {{0, 8, 0}, {8, 8, 0},
+ {16, 8, 0}, {24, 8, 0}};
+ if (memcmp(rgba, argb8888, 4 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_ARGB32;
+ } else if (memcmp(rgba, argb8888, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB32;
+ } else if (memcmp(rgba, abgr8888, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB32;
+ pixeltype = BGRPixel;
+ }
+ break;
+ }
+ case 24: {
+ const fb_bitfield rgb888[4] = {{16, 8, 0}, {8, 8, 0},
+ {0, 8, 0}, {0, 0, 0}};
+ const fb_bitfield bgr888[4] = {{0, 8, 0}, {8, 8, 0},
+ {16, 8, 0}, {0, 0, 0}};
+ if (memcmp(rgba, rgb888, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB888;
+ } else if (memcmp(rgba, bgr888, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB888;
+ pixeltype = BGRPixel;
+ }
+ break;
+ }
+ case 18: {
+ const fb_bitfield rgb666[4] = {{12, 6, 0}, {6, 6, 0},
+ {0, 6, 0}, {0, 0, 0}};
+ if (memcmp(rgba, rgb666, 3 * sizeof(fb_bitfield)) == 0)
+ format = QImage::Format_RGB666;
+ break;
+ }
+ case 16: {
+ const fb_bitfield rgb565[4] = {{11, 5, 0}, {5, 6, 0},
+ {0, 5, 0}, {0, 0, 0}};
+ const fb_bitfield bgr565[4] = {{0, 5, 0}, {5, 6, 0},
+ {11, 5, 0}, {0, 0, 0}};
+ if (memcmp(rgba, rgb565, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB16;
+ } else if (memcmp(rgba, bgr565, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB16;
+ pixeltype = BGRPixel;
+ }
+ break;
+ }
+ case 15: {
+ const fb_bitfield rgb1555[4] = {{10, 5, 0}, {5, 5, 0},
+ {0, 5, 0}, {15, 1, 0}};
+ const fb_bitfield bgr1555[4] = {{0, 5, 0}, {5, 5, 0},
+ {10, 5, 0}, {15, 1, 0}};
+ if (memcmp(rgba, rgb1555, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB555;
+ } else if (memcmp(rgba, bgr1555, 3 * sizeof(fb_bitfield)) == 0) {
+ format = QImage::Format_RGB555;
+ pixeltype = BGRPixel;
+ }
+ break;
+ }
+ case 12: {
+ const fb_bitfield rgb444[4] = {{8, 4, 0}, {4, 4, 0},
+ {0, 4, 0}, {0, 0, 0}};
+ if (memcmp(rgba, rgb444, 3 * sizeof(fb_bitfield)) == 0)
+ format = QImage::Format_RGB444;
+ break;
+ }
+ case 8:
+ break;
+ case 1:
+ format = QImage::Format_Mono; //###: LSB???
+ break;
+ default:
+ break;
+ }
+
+ screenFormat = format;
+}
+
+void QLinuxFbIntegration::createPalette(fb_cmap &cmap, fb_var_screeninfo &vinfo, fb_fix_screeninfo &finfo)
+{
+ if((vinfo.bits_per_pixel==8) || (vinfo.bits_per_pixel==4)) {
+ screencols= (vinfo.bits_per_pixel==8) ? 256 : 16;
+ cmap.start=0;
+ cmap.len=screencols;
+ cmap.red=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ cmap.green=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ cmap.blue=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+ cmap.transp=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*screencols);
+
+ if (screencols==16) {
+ if (finfo.type == FB_TYPE_PACKED_PIXELS) {
+ // We'll setup a grayscale cmap for 4bpp linear
+ int val = 0;
+ for (int idx = 0; idx < 16; ++idx, val += 17) {
+ cmap.red[idx] = (val<<8)|val;
+ cmap.green[idx] = (val<<8)|val;
+ cmap.blue[idx] = (val<<8)|val;
+ screenclut[idx]=qRgb(val, val, val);
+ }
+ } else {
+ // Default 16 colour palette
+ // Green is now trolltech green so certain images look nicer
+ // black d_gray l_gray white red green blue cyan magenta yellow
+ unsigned char reds[16] = { 0x00, 0x7F, 0xBF, 0xFF, 0xFF, 0xA2, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x82 };
+ unsigned char greens[16] = { 0x00, 0x7F, 0xBF, 0xFF, 0x00, 0xC5, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F };
+ unsigned char blues[16] = { 0x00, 0x7F, 0xBF, 0xFF, 0x00, 0x11, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x00 };
+
+ for (int idx = 0; idx < 16; ++idx) {
+ cmap.red[idx] = ((reds[idx]) << 8)|reds[idx];
+ cmap.green[idx] = ((greens[idx]) << 8)|greens[idx];
+ cmap.blue[idx] = ((blues[idx]) << 8)|blues[idx];
+ cmap.transp[idx] = 0;
+ screenclut[idx]=qRgb(reds[idx], greens[idx], blues[idx]);
+ }
+ }
+ } else {
+ if (grayscale) {
+ // Build grayscale palette
+ int i;
+ for(i=0;i<screencols;++i) {
+ int bval = screencols == 256 ? i : (i << 4);
+ ushort val = (bval << 8) | bval;
+ cmap.red[i] = val;
+ cmap.green[i] = val;
+ cmap.blue[i] = val;
+ cmap.transp[i] = 0;
+ screenclut[i] = qRgb(bval,bval,bval);
+ }
+ } else {
+ // 6x6x6 216 color cube
+ int idx = 0;
+ for(int ir = 0x0; ir <= 0xff; ir+=0x33) {
+ for(int ig = 0x0; ig <= 0xff; ig+=0x33) {
+ for(int ib = 0x0; ib <= 0xff; ib+=0x33) {
+ cmap.red[idx] = (ir << 8)|ir;
+ cmap.green[idx] = (ig << 8)|ig;
+ cmap.blue[idx] = (ib << 8)|ib;
+ cmap.transp[idx] = 0;
+ screenclut[idx]=qRgb(ir, ig, ib);
+ ++idx;
+ }
+ }
+ }
+ // Fill in rest with 0
+ for (int loopc=0; loopc<40; ++loopc) {
+ screenclut[idx]=0;
+ ++idx;
+ }
+ screencols=idx;
+ }
+ }
+ } else if(finfo.visual==FB_VISUAL_DIRECTCOLOR) {
+ cmap.start=0;
+ int rbits=0,gbits=0,bbits=0;
+ switch (vinfo.bits_per_pixel) {
+ case 8:
+ rbits=vinfo.red.length;
+ gbits=vinfo.green.length;
+ bbits=vinfo.blue.length;
+ if(rbits==0 && gbits==0 && bbits==0) {
+ // cyber2000 driver bug hack
+ rbits=3;
+ gbits=3;
+ bbits=2;
+ }
+ break;
+ case 15:
+ rbits=5;
+ gbits=5;
+ bbits=5;
+ break;
+ case 16:
+ rbits=5;
+ gbits=6;
+ bbits=5;
+ break;
+ case 18:
+ case 19:
+ rbits=6;
+ gbits=6;
+ bbits=6;
+ break;
+ case 24: case 32:
+ rbits=gbits=bbits=8;
+ break;
+ }
+ screencols=cmap.len=1<<qMax(rbits,qMax(gbits,bbits));
+ cmap.red=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*256);
+ cmap.green=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*256);
+ cmap.blue=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*256);
+ cmap.transp=(unsigned short int *)
+ malloc(sizeof(unsigned short int)*256);
+ for(unsigned int i = 0x0; i < cmap.len; i++) {
+ cmap.red[i] = i*65535/((1<<rbits)-1);
+ cmap.green[i] = i*65535/((1<<gbits)-1);
+ cmap.blue[i] = i*65535/((1<<bbits)-1);
+ cmap.transp[i] = 0;
+ }
+ }
+}
+
+void QLinuxFbIntegration::blank(bool on)
+{
+ if (d_ptr->blank == on)
+ return;
+
+#if defined(QT_QWS_IPAQ)
+ if (on)
+ system("apm -suspend");
+#else
+ if (d_ptr->fd == -1)
+ return;
+// Some old kernel versions don't have this. These defines should go
+// away eventually
+#if defined(FBIOBLANK)
+#if defined(VESA_POWERDOWN) && defined(VESA_NO_BLANKING)
+ ioctl(d_ptr->fd, FBIOBLANK, on ? VESA_POWERDOWN : VESA_NO_BLANKING);
+#else
+ ioctl(d_ptr->fd, FBIOBLANK, on ? 1 : 0);
+#endif
+#endif
+#endif
+
+ d_ptr->blank = on;
+}
+
+bool QLinuxFbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+
+QPixmapData *QLinuxFbIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QWindowSurface *QLinuxFbIntegration::createWindowSurface(QWidget *widget, WId) const
+{
+ QFbWindowSurface * surface =
+ new QFbWindowSurface(mPrimaryScreen, widget);
+ return surface;
+}
+
+QPlatformWindow *QLinuxFbIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const
+{
+ QFbWindow *w = new QFbWindow(widget);
+ mPrimaryScreen->addWindow(w);
+ return w;
+}
+
+QPlatformFontDatabase *QLinuxFbIntegration::fontDatabase() const
+{
+ return fontDb;
+}
+
+QLinuxFbScreen::QLinuxFbScreen(uchar * d, int w,
+ int h, int lstep, QImage::Format screenFormat) : compositePainter(0)
+{
+ data = d;
+ mGeometry = QRect(0,0,w,h);
+ bytesPerLine = lstep;
+ mFormat = screenFormat;
+ mDepth = 16;
+ mScreenImage = new QImage(mGeometry.width(), mGeometry.height(),
+ mFormat);
+ mFbScreenImage = new QImage(data, mGeometry.width(), mGeometry.height(),
+ bytesPerLine, mFormat);
+ cursor = new QPlatformSoftwareCursor(this);
+}
+
+void QLinuxFbScreen::setGeometry(QRect rect)
+{
+ mGeometry = rect;
+ delete mFbScreenImage;
+ mFbScreenImage = new QImage(data, mGeometry.width(), mGeometry.height(),
+ bytesPerLine, mFormat);
+ delete compositePainter;
+ compositePainter = 0;
+
+ delete mScreenImage;
+ mScreenImage = new QImage(mGeometry.width(), mGeometry.height(),
+ mFormat);
+}
+
+void QLinuxFbScreen::setFormat(QImage::Format format)
+{
+ mFormat = format;
+ delete mFbScreenImage;
+ mFbScreenImage = new QImage(data, mGeometry.width(), mGeometry.height(),
+ bytesPerLine, mFormat);
+ delete compositePainter;
+ compositePainter = 0;
+
+ delete mScreenImage;
+ mScreenImage = new QImage(mGeometry.width(), mGeometry.height(),
+ mFormat);
+}
+
+QRegion QLinuxFbScreen::doRedraw()
+{
+ QRegion touched;
+ touched = QFbScreen::doRedraw();
+
+ if (!compositePainter) {
+ compositePainter = new QPainter(mFbScreenImage);
+ }
+
+ QVector<QRect> rects = touched.rects();
+ for (int i = 0; i < rects.size(); i++)
+ compositePainter->drawImage(rects[i], *mScreenImage, rects[i]);
+ return touched;
+}
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.h b/src/plugins/platforms/linuxfb/qlinuxfbintegration.h
new file mode 100644
index 0000000000..f361843c6f
--- /dev/null
+++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_LINUXFB_H
+#define QGRAPHICSSYSTEM_LINUXFB_H
+
+#include <QPlatformIntegration>
+#include "../fb_base/fb_base.h"
+
+QT_BEGIN_NAMESPACE
+
+class QLinuxFbScreen : public QFbScreen
+{
+ Q_OBJECT
+public:
+ QLinuxFbScreen(uchar * d, int w, int h, int lstep, QImage::Format screenFormat);
+ void setGeometry(QRect rect);
+ void setFormat(QImage::Format format);
+
+public slots:
+ QRegion doRedraw();
+
+private:
+ QImage * mFbScreenImage;
+ uchar * data;
+ int bytesPerLine;
+
+ QPainter *compositePainter;
+};
+
+class QLinuxFbIntegrationPrivate;
+struct fb_cmap;
+struct fb_var_screeninfo;
+struct fb_fix_screeninfo;
+
+class QLinuxFbIntegration : public QPlatformIntegration
+{
+public:
+ QLinuxFbIntegration();
+ ~QLinuxFbIntegration();
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId WinId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId WinId) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+private:
+ QLinuxFbScreen *mPrimaryScreen;
+ QList<QPlatformScreen *> mScreens;
+ QLinuxFbIntegrationPrivate *d_ptr;
+
+ enum PixelType { NormalPixel, BGRPixel };
+
+ QRgb screenclut[256];
+ int screencols;
+
+ uchar * data;
+
+ QImage::Format screenFormat;
+ int w;
+ int lstep;
+ int h;
+ int d;
+ PixelType pixeltype;
+ bool grayscale;
+
+ int dw;
+ int dh;
+
+ int size; // Screen size
+ int mapsize; // Total mapped memory
+
+ int displayId;
+
+ int physWidth;
+ int physHeight;
+
+ bool canaccel;
+ int dataoffset;
+ int cacheStart;
+
+ bool connect(const QString &displaySpec);
+ bool initDevice();
+ void setPixelFormat(struct fb_var_screeninfo);
+ void createPalette(fb_cmap &cmap, fb_var_screeninfo &vinfo, fb_fix_screeninfo &finfo);
+ void blank(bool on);
+ QPlatformFontDatabase *fontDb;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/minimal/main.cpp b/src/plugins/platforms/minimal/main.cpp
new file mode 100644
index 0000000000..b15f1832f3
--- /dev/null
+++ b/src/plugins/platforms/minimal/main.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qminimalintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QMinimalIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QMinimalIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "Minimal";
+ return list;
+}
+
+QPlatformIntegration *QMinimalIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "minimal")
+ return new QMinimalIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(minimal, QMinimalIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/minimal/minimal.pro b/src/plugins/platforms/minimal/minimal.pro
new file mode 100644
index 0000000000..438a88e95f
--- /dev/null
+++ b/src/plugins/platforms/minimal/minimal.pro
@@ -0,0 +1,13 @@
+TARGET = qminimal
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+SOURCES = main.cpp \
+ qminimalintegration.cpp \
+ qminimalwindowsurface.cpp
+HEADERS = qminimalintegration.h \
+ qminimalwindowsurface.h
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/minimal/qminimalintegration.cpp b/src/plugins/platforms/minimal/qminimalintegration.cpp
new file mode 100644
index 0000000000..3a545e4e5c
--- /dev/null
+++ b/src/plugins/platforms/minimal/qminimalintegration.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qminimalintegration.h"
+#include "qminimalwindowsurface.h"
+
+#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtGui/QPlatformWindow>
+
+QMinimalIntegration::QMinimalIntegration()
+{
+ QMinimalScreen *mPrimaryScreen = new QMinimalScreen();
+
+ mPrimaryScreen->mGeometry = QRect(0, 0, 240, 320);
+ mPrimaryScreen->mDepth = 16;
+ mPrimaryScreen->mFormat = QImage::Format_RGB16;
+
+ mScreens.append(mPrimaryScreen);
+}
+
+bool QMinimalIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPixmapData *QMinimalIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QPlatformWindow *QMinimalIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QPlatformWindow(widget);
+}
+
+QWindowSurface *QMinimalIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QMinimalWindowSurface(widget);
+}
diff --git a/src/plugins/platforms/minimal/qminimalintegration.h b/src/plugins/platforms/minimal/qminimalintegration.h
new file mode 100644
index 0000000000..5f93443b8c
--- /dev/null
+++ b/src/plugins/platforms/minimal/qminimalintegration.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMINTEGRATION_MINIMAL_H
+#define QPLATFORMINTEGRATION_MINIMAL_H
+
+#include <QtGui/QPlatformIntegration>
+#include <QtGui/QPlatformScreen>
+
+QT_BEGIN_NAMESPACE
+
+class QMinimalScreen : public QPlatformScreen
+{
+public:
+ QMinimalScreen()
+ : mDepth(16), mFormat(QImage::Format_RGB16) {}
+
+ QRect geometry() const { return mGeometry; }
+ int depth() const { return mDepth; }
+ QImage::Format format() const { return mFormat; }
+
+public:
+ QRect mGeometry;
+ int mDepth;
+ QImage::Format mFormat;
+ QSize mPhysicalSize;
+};
+
+class QMinimalIntegration : public QPlatformIntegration
+{
+public:
+ QMinimalIntegration();
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+private:
+ QList<QPlatformScreen *> mScreens;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/minimal/qminimalwindowsurface.cpp b/src/plugins/platforms/minimal/qminimalwindowsurface.cpp
new file mode 100644
index 0000000000..dd8c9b7045
--- /dev/null
+++ b/src/plugins/platforms/minimal/qminimalwindowsurface.cpp
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qminimalwindowsurface.h"
+#include <QtCore/qdebug.h>
+#include <QtGui/private/qapplication_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QMinimalWindowSurface::QMinimalWindowSurface(QWidget *window)
+ : QWindowSurface(window)
+{
+ //qDebug() << "QMinimalWindowSurface::QMinimalWindowSurface:" << (long)this;
+}
+
+QMinimalWindowSurface::~QMinimalWindowSurface()
+{
+}
+
+QPaintDevice *QMinimalWindowSurface::paintDevice()
+{
+ //qDebug() << "QMinimalWindowSurface::paintDevice";
+ return &mImage;
+}
+
+void QMinimalWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+
+ static int c = 0;
+ QString filename = QString("output%1.png").arg(c++, 4, 10, QLatin1Char('0'));
+ qDebug() << "QMinimalWindowSurface::flush() saving contents to" << filename.toLocal8Bit().constData();
+ mImage.save(filename);
+}
+
+void QMinimalWindowSurface::resize(const QSize &size)
+{
+ //qDebug() << "QMinimalWindowSurface::setGeometry:" << (long)this << rect;
+ QWindowSurface::resize(size);
+ QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format();
+ if (mImage.size() != size)
+ mImage = QImage(size, format);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/minimal/qminimalwindowsurface.h b/src/plugins/platforms/minimal/qminimalwindowsurface.h
new file mode 100644
index 0000000000..bfeeacadc9
--- /dev/null
+++ b/src/plugins/platforms/minimal/qminimalwindowsurface.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_MINIMAL_H
+#define QWINDOWSURFACE_MINIMAL_H
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+#include <QtGui/QPlatformWindow>
+
+QT_BEGIN_NAMESPACE
+
+class QMinimalWindowSurface : public QWindowSurface
+{
+public:
+ QMinimalWindowSurface(QWidget *window);
+ ~QMinimalWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize(const QSize &size);
+
+private:
+ QImage mImage;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/openkode/main.cpp b/src/plugins/platforms/openkode/main.cpp
new file mode 100644
index 0000000000..ead17a4598
--- /dev/null
+++ b/src/plugins/platforms/openkode/main.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qopenkodeintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QOpenKODEPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QOpenKODEPlugin::keys() const
+{
+ QStringList list;
+ list << "OpenKODE";
+ return list;
+}
+
+QPlatformIntegration * QOpenKODEPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "openkode")
+ return new QOpenKODEIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(openkode, QOpenKODEPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/openkode.pro b/src/plugins/platforms/openkode/openkode.pro
new file mode 100644
index 0000000000..c8ae4154c3
--- /dev/null
+++ b/src/plugins/platforms/openkode/openkode.pro
@@ -0,0 +1,42 @@
+TARGET = qopenkodeintegration
+include(../../qpluginbase.pri)
+
+QT += opengl
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+SOURCES = main.cpp \
+ qopenkodeintegration.cpp \
+ qopenkodewindow.cpp \
+ ../eglconvenience/qeglplatformcontext.cpp \
+ ../eglconvenience/qeglconvenience.cpp \
+ qopenkodeeventloopintegration.cpp
+
+HEADERS = qopenkodeintegration.h \
+ qopenkodewindow.h \
+ ../eglconvenience/qeglplatformcontext.h \
+ ../eglconvenience/qeglconvenience.h \
+ qopenkodeeventloopintegration.h \
+ openkodekeytranslator.h
+
+include (../fontdatabases/genericunix/genericunix.pri)
+
+RESOURCES = resources.qrc
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
+
+LIBS += -lKD -lEGL
+!isEmpty(QMAKE_INCDIR_OPENGL_ES2){
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES2
+}
+!isEmpty(QMAKE_LIBDIR_OPENGL_ES2){
+ for(p, QMAKE_LIBDIR_OPENGL_ES2) {
+ exists($$p):LIBS += -L$$p
+ }
+}
+!isEmpty(QMAKE_LIBS_OPENGL_ES2){
+ LIBS += $$QMAKE_LIBS_OPENGL_ES2
+} else {
+ LIBS += -lGLESv2
+}
diff --git a/src/plugins/platforms/openkode/openkodekeytranslator.h b/src/plugins/platforms/openkode/openkodekeytranslator.h
new file mode 100644
index 0000000000..502bf03942
--- /dev/null
+++ b/src/plugins/platforms/openkode/openkodekeytranslator.h
@@ -0,0 +1,244 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef OPENKODEKEYTRANSLATOR_H
+#define OPENKODEKEYTRANSLATOR_H
+
+#ifdef KD_ATX_keyboard
+
+#include <KD/ATX_keyboard.h>
+
+QT_BEGIN_NAMESPACE
+
+Qt::Key keyTranslator( int key )
+{
+ switch (key) {
+// KD_KEY_ACCEPT_ATX:
+// KD_KEY_AGAIN_ATX:
+// KD_KEY_ALLCANDIDATES_ATX
+// KD_KEY_ALPHANUMERIC_ATX
+ case KD_KEY_ALT_ATX:
+ return Qt::Key_Alt;
+ case KD_KEY_ALTGRAPH_ATX:
+ return Qt::Key_AltGr;
+// KD_KEY_APPS_ATX
+// KD_KEY_ATTN_ATX
+// KD_KEY_BROWSERBACK_ATX
+// KD_KEY_BROWSERFAVORITES_ATX
+// KD_KEY_BROWSERFORWARD_ATX
+// KD_KEY_BROWSERHOME_ATX
+// KD_KEY_BROWSERREFRESH_ATX
+// KD_KEY_BROWSERSEARCH_ATX
+// KD_KEY_BROWSERSTOP_ATX
+ case KD_KEY_CAPSLOCK_ATX:
+ return Qt::Key_CapsLock;
+ case KD_KEY_CLEAR_ATX:
+ return Qt::Key_Clear;
+ case KD_KEY_CODEINPUT_ATX:
+ return Qt::Key_Codeinput;
+// KD_KEY_COMPOSE_ATX
+ case KD_KEY_CONTROL_ATX:
+ return Qt::Key_Control;
+// KD_KEY_CRSEL_ATX
+// KD_KEY_CONVERT_ATX
+ case KD_KEY_COPY_ATX:
+ return Qt::Key_Copy;
+ case KD_KEY_CUT_ATX:
+ return Qt::Key_Cut;
+ case KD_KEY_DOWN_ATX:
+ return Qt::Key_Down;
+ case KD_KEY_END_ATX:
+ return Qt::Key_End;
+ case KD_KEY_ENTER_ATX:
+ return Qt::Key_Enter;
+// KD_KEY_ERASEEOF_ATX
+// KD_KEY_EXECUTE_ATX
+// KD_KEY_EXSEL_ATX
+ case KD_KEY_F1_ATX:
+ return Qt::Key_F1;
+ case KD_KEY_F2_ATX:
+ return Qt::Key_F2;
+ case KD_KEY_F3_ATX:
+ return Qt::Key_F3;
+ case KD_KEY_F4_ATX:
+ return Qt::Key_F4;
+ case KD_KEY_F5_ATX:
+ return Qt::Key_F5;
+ case KD_KEY_F6_ATX:
+ return Qt::Key_F6;
+ case KD_KEY_F7_ATX:
+ return Qt::Key_F7;
+ case KD_KEY_F8_ATX:
+ return Qt::Key_F8;
+ case KD_KEY_F9_ATX:
+ return Qt::Key_F9;
+ case KD_KEY_F10_ATX:
+ return Qt::Key_F10;
+ case KD_KEY_F11_ATX:
+ return Qt::Key_F11;
+ case KD_KEY_F12_ATX:
+ return Qt::Key_F12;
+ case KD_KEY_F13_ATX:
+ return Qt::Key_F13;
+ case KD_KEY_F14_ATX:
+ return Qt::Key_F14;
+ case KD_KEY_F15_ATX:
+ return Qt::Key_F15;
+ case KD_KEY_F16_ATX:
+ return Qt::Key_F16;
+ case KD_KEY_F17_ATX:
+ return Qt::Key_F17;
+ case KD_KEY_F18_ATX:
+ return Qt::Key_F18;
+ case KD_KEY_F19_ATX:
+ return Qt::Key_F19;
+ case KD_KEY_F20_ATX:
+ return Qt::Key_F20;
+ case KD_KEY_F21_ATX:
+ return Qt::Key_F21;
+ case KD_KEY_F22_ATX:
+ return Qt::Key_F22;
+ case KD_KEY_F23_ATX:
+ return Qt::Key_F23;
+ case KD_KEY_F24_ATX:
+ return Qt::Key_F24;
+// KD_KEY_FINALMODE_ATX
+// KD_KEY_FIND_ATX
+// KD_KEY_FULLWIDTH_ATX
+// KD_KEY_HALFWIDTH_ATX
+ case KD_KEY_HANGULMODE_ATX:
+ return Qt::Key_Hangul;
+// KD_KEY_HANJAMODE_ATX
+ case KD_KEY_HELP_ATX:
+ return Qt::Key_Help;
+ case KD_KEY_HIRAGANA_ATX:
+ return Qt::Key_Hiragana;
+ case KD_KEY_HOME_ATX:
+ return Qt::Key_Home;
+ case KD_KEY_INSERT_ATX:
+ return Qt::Key_Insert;
+// KD_KEY_JAPANESEHIRAGANA_ATX:
+// KD_KEY_JAPANESEKATAKANA_ATX
+// KD_KEY_JAPANESEROMAJI_ATX
+// KD_KEY_JUNJAMODE_ATX
+ case KD_KEY_KANAMODE_ATX:
+ return Qt::Key_Kana_Lock; //?
+ case KD_KEY_KANJIMODE_ATX:
+ return Qt::Key_Kanji;
+// KD_KEY_KATAKANA_ATX
+// KD_KEY_LAUNCHAPPLICATION1_ATX
+// KD_KEY_LAUNCHAPPLICATION2_ATX
+ case KD_KEY_LAUNCHMAIL_ATX:
+ return Qt::Key_MailForward;
+ case KD_KEY_LEFT_ATX:
+ return Qt::Key_Left;
+ case KD_KEY_META_ATX:
+ return Qt::Key_Meta;
+ case KD_KEY_MEDIANEXTTRACK_ATX:
+ return Qt::Key_MediaNext;
+ case KD_KEY_MEDIAPLAYPAUSE_ATX:
+ return Qt::Key_MediaPause;
+ case KD_KEY_MEDIAPREVIOUSTRACK_ATX:
+ return Qt::Key_MediaPrevious;
+ case KD_KEY_MEDIASTOP_ATX:
+ return Qt::Key_MediaStop;
+ case KD_KEY_MODECHANGE_ATX:
+ return Qt::Key_Mode_switch;
+// KD_KEY_NONCONVERT_ATX
+ case KD_KEY_NUMLOCK_ATX:
+ return Qt::Key_NumLock;
+ case KD_KEY_PAGEDOWN_ATX:
+ return Qt::Key_PageDown;
+ case KD_KEY_PAGEUP_ATX:
+ return Qt::Key_PageUp;
+ case KD_KEY_PASTE_ATX:
+ return Qt::Key_Paste;
+ case KD_KEY_PAUSE_ATX:
+ return Qt::Key_Pause;
+ case KD_KEY_PLAY_ATX:
+ return Qt::Key_Play;
+// KD_KEY_PREVIOUSCANDIDATE_ATX
+ case KD_KEY_PRINTSCREEN_ATX:
+ return Qt::Key_Print;
+// case KD_KEY_PROCESS_ATX
+// case KD_KEY_PROPS_ATX
+ case KD_KEY_RIGHT_ATX:
+ return Qt::Key_Right;
+// KD_KEY_ROMANCHARACTERS_ATX
+ case KD_KEY_SCROLL_ATX:
+ return Qt::Key_ScrollLock;
+ case KD_KEY_SELECT_ATX:
+ return Qt::Key_Select;
+// KD_KEY_SELECTMEDIA_ATX
+ case KD_KEY_SHIFT_ATX:
+ return Qt::Key_Shift;
+ case KD_KEY_STOP_ATX:
+ return Qt::Key_Stop;
+ case KD_KEY_UP_ATX:
+ return Qt::Key_Up;
+// KD_KEY_UNDO_ATX
+ case KD_KEY_VOLUMEDOWN_ATX:
+ return Qt::Key_VolumeDown;
+ case KD_KEY_VOLUMEMUTE_ATX:
+ return Qt::Key_VolumeMute;
+ case KD_KEY_VOLUMEUP_ATX:
+ return Qt::Key_VolumeUp;
+ case KD_KEY_WIN_ATX:
+ return Qt::Key_Meta;
+ case KD_KEY_ZOOM_ATX:
+ return Qt::Key_Zoom;
+ case 0x8:
+ return Qt::Key_Backspace;
+ case 0x1b:
+ return Qt::Key_Escape;
+ case 0x9:
+ return Qt::Key_Tab;
+
+ default:
+ break;
+ }
+
+ return Qt::Key_Escape;
+}
+
+QT_END_NAMESPACE
+#endif //KD_ATX_keyboard
+#endif // OPENKODEKEYTRANSLATOR_H
diff --git a/src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp b/src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp
new file mode 100644
index 0000000000..4ca82db338
--- /dev/null
+++ b/src/plugins/platforms/openkode/qopenkodeeventloopintegration.cpp
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenkodeeventloopintegration.h"
+
+#include <QDebug>
+
+#include <KD/kd.h>
+#include <KD/ATX_keyboard.h>
+
+QT_BEGIN_NAMESPACE
+
+static const int QT_EVENT_WAKEUP_EVENTLOOP = KD_EVENT_USER + 1;
+
+void kdprocessevent( const KDEvent *event)
+{
+ switch (event->type) {
+ case KD_EVENT_INPUT:
+ qDebug() << "KD_EVENT_INPUT";
+ break;
+ case KD_EVENT_INPUT_POINTER:
+ qDebug() << "KD_EVENT_INPUT_POINTER";
+ break;
+ case KD_EVENT_WINDOW_CLOSE:
+ qDebug() << "KD_EVENT_WINDOW_CLOSE";
+ break;
+ case KD_EVENT_WINDOWPROPERTY_CHANGE:
+ qDebug() << "KD_EVENT_WINDOWPROPERTY_CHANGE";
+ qDebug() << event->data.windowproperty.pname;
+ break;
+ case KD_EVENT_WINDOW_FOCUS:
+ qDebug() << "KD_EVENT_WINDOW_FOCUS";
+ break;
+ case KD_EVENT_WINDOW_REDRAW:
+ qDebug() << "KD_EVENT_WINDOW_REDRAW";
+ break;
+ case KD_EVENT_USER:
+ qDebug() << "KD_EVENT_USER";
+ break;
+ case KD_EVENT_INPUT_KEY_ATX:
+ qDebug() << "KD_EVENT_INPUT_KEY_ATX";
+ break;
+ case QT_EVENT_WAKEUP_EVENTLOOP:
+ QPlatformEventLoopIntegration::processEvents();
+ break;
+ default:
+ break;
+ }
+
+ kdDefaultEvent(event);
+
+}
+
+QOpenKODEEventLoopIntegration::QOpenKODEEventLoopIntegration()
+ : m_quit(false)
+{
+ m_kdThread = kdThreadSelf();
+ kdInstallCallback(&kdprocessevent,QT_EVENT_WAKEUP_EVENTLOOP,this);
+}
+
+void QOpenKODEEventLoopIntegration::startEventLoop()
+{
+
+ while(!m_quit) {
+ qint64 msec = nextTimerEvent();
+ const KDEvent *event = kdWaitEvent(msec);
+ if (event) {
+ kdDefaultEvent(event);
+ while ((event = kdWaitEvent(0)) != 0) {
+ kdDefaultEvent(event);
+ }
+ }
+ QPlatformEventLoopIntegration::processEvents();
+ }
+}
+
+void QOpenKODEEventLoopIntegration::quitEventLoop()
+{
+ m_quit = true;
+}
+
+void QOpenKODEEventLoopIntegration::qtNeedsToProcessEvents()
+{
+ KDEvent *event = kdCreateEvent();
+ event->type = QT_EVENT_WAKEUP_EVENTLOOP;
+ event->userptr = this;
+ kdPostThreadEvent(event,m_kdThread);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodeeventloopintegration.h b/src/plugins/platforms/openkode/qopenkodeeventloopintegration.h
new file mode 100644
index 0000000000..cef3465123
--- /dev/null
+++ b/src/plugins/platforms/openkode/qopenkodeeventloopintegration.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENKODEEVENTLOOPINTEGRATION_H
+#define QOPENKODEEVENTLOOPINTEGRATION_H
+
+#include <QtGui/QPlatformEventLoopIntegration>
+
+class KDThread;
+class KDEvent;
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+class QOpenKODEEventLoopIntegration : public QPlatformEventLoopIntegration
+{
+public:
+ QOpenKODEEventLoopIntegration();
+ void startEventLoop();
+ void quitEventLoop();
+ void qtNeedsToProcessEvents();
+
+ void processInputEvent(const KDEvent *event);
+private:
+
+ bool m_quit;
+ KDThread *m_kdThread;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif // QOPENKODEEVENTLOOPINTEGRATION_H
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.cpp b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
new file mode 100644
index 0000000000..703b1a9832
--- /dev/null
+++ b/src/plugins/platforms/openkode/qopenkodeintegration.cpp
@@ -0,0 +1,247 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenkodeintegration.h"
+#include "qopenkodewindow.h"
+#include "qopenkodeeventloopintegration.h"
+
+#include <QtOpenGL/private/qpixmapdata_gl_p.h>
+#include <QtOpenGL/private/qwindowsurface_gl_p.h>
+
+#include <QtGui/private/qpixmap_raster_p.h>
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qthread.h>
+#include <QtCore/qfile.h>
+
+#include "qgenericunixfontdatabase.h"
+
+#include <KD/kd.h>
+#include <KD/NV_display.h>
+#include <KD/NV_initialize.h>
+
+#include <EGL/egl.h>
+
+#include "GLES2/gl2ext.h"
+
+QT_BEGIN_NAMESPACE
+
+QOpenKODEScreen::QOpenKODEScreen(KDDisplayNV *kdDisplay, KDDesktopNV *kdDesktop)
+ : mIsFullScreen(false)
+{
+ qDebug() << "QOpenKODEScreen::QOpenKODEIntegrationScreen()";
+
+ KDboolean enabled = KD_TRUE;
+ kdSetDisplayPropertybvNV(kdDisplay,
+ KD_DISPLAYPROPERTY_ENABLED_NV,
+ &enabled);
+ KDboolean power = KD_DISPLAY_POWER_ON;
+ kdSetDisplayPropertyivNV(kdDisplay,
+ KD_DISPLAYPROPERTY_POWER_NV,
+ &power);
+
+ kdSetDisplayPropertycvNV(kdDisplay,
+ KD_DISPLAYPROPERTY_DESKTOP_NAME_NV,
+ KD_DEFAULT_DESKTOP_NV);
+
+ KDDisplayModeNV mode;
+ if (kdGetDisplayModeNV(kdDisplay, &mode)) {
+ qErrnoWarning(kdGetError(), "Could not get display mode");
+ return;
+ }
+
+ qDebug() << " - display mode " << mode.width << "x" << mode.height << " refresh " << mode.refresh;
+
+ KDint desktopSize[] = { mode.width, mode.height };
+
+ if (kdSetDesktopPropertyivNV(kdDesktop, KD_DESKTOPPROPERTY_SIZE_NV, desktopSize)) {
+ qErrnoWarning(kdGetError(), "Could not set desktop size");
+ return;
+ }
+
+ // Once we've set up the desktop and display we don't need them anymore
+ kdReleaseDisplayNV(kdDisplay);
+ kdReleaseDesktopNV(kdDesktop);
+
+ mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ if (mEglDisplay == EGL_NO_DISPLAY) {
+ qErrnoWarning("EGL failed to obtain display");
+ }
+
+ /* Initialize EGL display */
+ EGLBoolean rvbool = eglInitialize(mEglDisplay, 0, 0);
+ if (!rvbool) {
+ qErrnoWarning("EGL failed to initialize display");
+ }
+
+// cursor = new QOpenKODECursor(this);
+
+ mGeometry = QRect(0, 0, mode.width, mode.height);
+ mDepth = 24;
+ mFormat = QImage::Format_RGB32;
+
+
+}
+
+QOpenKODEIntegration::QOpenKODEIntegration()
+ : mEventLoopIntegration(0)
+ , mFontDb(new QGenericUnixFontDatabase())
+ , mMainGlContext(0)
+{
+ if (kdInitializeNV() == KD_ENOTINITIALIZED) {
+ qFatal("Did not manage to initialize openkode");
+ }
+
+ KDDisplaySystemNV *kdDisplaySystem = kdCreateDisplaySystemSnapshotNV(this);
+ KDint32 displayCount = 0;
+ kdGetDisplaySystemPropertyivNV(kdDisplaySystem, KD_DISPLAYPROPERTY_COUNT_NV, 0, &displayCount);
+
+ for (int i = 0; i < displayCount; i++) {
+ KDchar *displayName = 0;
+ KDsize displayNameLength = 0;
+ kdGetDisplaySystemPropertycvNV(kdDisplaySystem,KD_DISPLAYPROPERTY_NAME_NV,i,0,&displayNameLength);
+ if (!displayNameLength)
+ continue;
+ displayName = new KDchar[displayNameLength];
+ kdGetDisplaySystemPropertycvNV(kdDisplaySystem,KD_DISPLAYPROPERTY_NAME_NV,i,displayName,&displayNameLength);
+
+ KDDisplayNV *display = kdGetDisplayNV(displayName,this);
+ if (!display || display == (void*)-1) {
+ qErrnoWarning(kdGetError(), "Could not obtain KDDisplayNV pointer");
+ return;
+ }
+ if (displayNameLength)
+ delete displayName;
+
+ KDchar *desktopName = 0;
+ KDsize desktopNameLength = 0;
+ bool openkodeImpDoesNotFail = false;
+ if (openkodeImpDoesNotFail) {
+ qDebug() << "printing desktopname";
+ kdGetDisplayPropertycvNV(display,KD_DISPLAYPROPERTY_DESKTOP_NAME_NV,desktopName,&desktopNameLength);
+ if (desktopNameLength) {
+ desktopName = new KDchar[desktopNameLength];
+ kdGetDisplayPropertycvNV(display,KD_DISPLAYPROPERTY_DESKTOP_NAME_NV,desktopName,&desktopNameLength);
+ } else {
+ desktopName = KD_DEFAULT_DESKTOP_NV;
+ }
+ } else {
+ desktopName = KD_DEFAULT_DESKTOP_NV;
+ }
+
+ KDDesktopNV *desktop = kdGetDesktopNV(desktopName,this);
+ if (!desktop || desktop == (void*)-1) {
+ qErrnoWarning(kdGetError(), "Could not obtain KDDesktopNV pointer");
+ kdReleaseDisplayNV(display);
+ return;
+ }
+ if (desktopNameLength)
+ delete desktopName;
+
+ QOpenKODEScreen *screen = new QOpenKODEScreen(display,desktop);
+ mScreens.append(screen);
+ }
+}
+
+QOpenKODEIntegration::~QOpenKODEIntegration()
+{
+ delete mEventLoopIntegration;
+ delete mFontDb;
+}
+
+
+bool QOpenKODEIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ case OpenGL: return true;
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPixmapData *QOpenKODEIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QGLPixmapData(type);
+}
+
+QPlatformWindow *QOpenKODEIntegration::createPlatformWindow(QWidget *tlw, WId ) const
+{
+ return new QOpenKODEWindow(tlw);
+}
+
+QWindowSurface *QOpenKODEIntegration::createWindowSurface(QWidget *widget, WId) const
+{
+ QWindowSurface *returnSurface = 0;
+ switch (widget->platformWindowFormat().windowApi()) {
+
+ case QPlatformWindowFormat::Raster:
+ case QPlatformWindowFormat::OpenGL:
+ returnSurface = new QGLWindowSurface(widget);
+ break;
+
+ case QPlatformWindowFormat::OpenVG:
+// returnSurface = new QVGWindowSurface(widget);
+// break;
+
+ default:
+ returnSurface = new QGLWindowSurface(widget);
+ break;
+ }
+
+ return returnSurface;
+}
+
+QPlatformEventLoopIntegration *QOpenKODEIntegration::createEventLoopIntegration() const
+{
+ if (!mEventLoopIntegration) {
+ QOpenKODEIntegration *that = const_cast<QOpenKODEIntegration *>(this);
+ that->mEventLoopIntegration = new QOpenKODEEventLoopIntegration;
+ }
+ return mEventLoopIntegration;
+}
+
+QPlatformFontDatabase *QOpenKODEIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodeintegration.h b/src/plugins/platforms/openkode/qopenkodeintegration.h
new file mode 100644
index 0000000000..d5aac98c02
--- /dev/null
+++ b/src/plugins/platforms/openkode/qopenkodeintegration.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_OPENKODE_H
+#define QGRAPHICSSYSTEM_OPENKODE_H
+
+#include "qopenkodeeventloopintegration.h"
+
+#include <QtCore/qsemaphore.h>
+
+#include <QtGui/QPlatformIntegration>
+#include <QtGui/QPlatformScreen>
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QPlatformFontDatabase>
+
+#include <GLES2/gl2.h>
+#include <EGL/egl.h>
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+struct KDDesktopNV;
+struct KDDisplayNV;
+class QOpenKODECursor;
+
+class QOpenKODEScreen : public QPlatformScreen
+{
+ Q_OBJECT
+public:
+ QOpenKODEScreen(KDDisplayNV *kdDisplay, KDDesktopNV *kdDesktop);
+ ~QOpenKODEScreen() {}
+
+ QRect geometry() const { return mGeometry; }
+ int depth() const { return mDepth; }
+ QImage::Format format() const { return mFormat; }
+
+ EGLDisplay eglDisplay() { return mEglDisplay; }
+
+ bool isFullScreen() const {return mIsFullScreen;}
+ void setFullScreen(bool fullscreen) { mIsFullScreen = fullscreen; }
+private:
+ QRect mGeometry;
+ int mDepth;
+ QImage::Format mFormat;
+ EGLDisplay mEglDisplay;
+ bool mIsFullScreen;
+};
+
+class QOpenKODEIntegration : public QPlatformIntegration
+{
+public:
+ QOpenKODEIntegration();
+ ~QOpenKODEIntegration();
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QPlatformEventLoopIntegration *createEventLoopIntegration() const;
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+ virtual QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ static GLuint blitterProgram();
+
+ void setMainGLContext(QEGLPlatformContext *ctx) { mMainGlContext = ctx; }
+ void mainGLContext() const { return mMainGlContext; }
+
+private:
+ QList<QPlatformScreen *> mScreens;
+ QOpenKODEEventLoopIntegration *mEventLoopIntegration;
+ QPlatformFontDatabase *mFontDb;
+ QEGLPlatformContext *mMainGlContext;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif
diff --git a/src/plugins/platforms/openkode/qopenkodewindow.cpp b/src/plugins/platforms/openkode/qopenkodewindow.cpp
new file mode 100644
index 0000000000..d34dff8a34
--- /dev/null
+++ b/src/plugins/platforms/openkode/qopenkodewindow.cpp
@@ -0,0 +1,315 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qopenkodewindow.h"
+#include "qopenkodeintegration.h"
+#include "../eglconvenience/qeglplatformcontext.h"
+#include "../eglconvenience/qeglconvenience.h"
+
+#include <KD/kd.h>
+#include <KD/NV_display.h>
+#include <KD/kdplatform.h>
+#ifdef KD_ATX_keyboard
+#include "openkodekeytranslator.h"
+#endif
+
+#include <EGL/egl.h>
+
+#include <QtGui/qwidget.h>
+#include <QtGui/private/qwidget_p.h>
+#include <QtGui/private/qapplication_p.h>
+
+#include <QtCore/qvector.h>
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+void kdProcessMouseEvents( const KDEvent *event )
+{
+ QOpenKODEWindow *window = static_cast<QOpenKODEWindow *>(event->userptr);
+ window->processMouseEvents(event);
+}
+
+#ifdef KD_ATX_keyboard
+void kdProcessKeyEvents( const KDEvent *event )
+{
+ QOpenKODEWindow *window = static_cast<QOpenKODEWindow *>(event->userptr);
+ window->processKeyEvents(event);
+}
+#endif //KD_ATX_keyboard
+
+QOpenKODEWindow::QOpenKODEWindow(QWidget *tlw)
+ : QPlatformWindow(tlw), isFullScreen(false)
+{
+ if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenVG) {
+ m_eglApi = EGL_OPENVG_API;
+ } else {
+ m_eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+ m_eglContextAttrs.append(2);
+
+ m_eglApi = EGL_OPENGL_ES_API;
+ }
+ eglBindAPI(m_eglApi);
+
+ m_eglContextAttrs.append(EGL_NONE);
+ m_eglWindowAttrs.append(EGL_NONE);
+
+ QList<QPlatformScreen *> screens = QApplicationPrivate::platformIntegration()->screens();
+ //XXXX: jl figure out how to pick the correct screen.
+// Q_ASSERT(screens.size() > tlw->d_func()->screenNumber);
+// QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(tlw->d_func()->screenNumber));
+ QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(0));
+ if (!screen) {
+ qErrnoWarning("Could not make QOpenKODEWindow without a screen");
+ }
+
+ QPlatformWindowFormat format = tlw->platformWindowFormat();
+ format.setRedBufferSize(5);
+ format.setGreenBufferSize(6);
+ format.setBlueBufferSize(5);
+
+ m_eglConfig = q_configFromQPlatformWindowFormat(screen->eglDisplay(),format);
+
+ m_kdWindow = kdCreateWindow(screen->eglDisplay(),
+ m_eglConfig,
+ this);
+ kdInstallCallback(kdProcessMouseEvents,KD_EVENT_INPUT_POINTER,this);
+#ifdef KD_ATX_keyboard
+ kdInstallCallback(kdProcessKeyEvents, KD_EVENT_INPUT_KEY_ATX,this);
+#endif //KD_ATX_keyboard
+
+ if (!m_kdWindow) {
+ qErrnoWarning(kdGetError(), "Error creating native window");
+ return;
+ }
+
+ KDboolean exclusive(false);
+ if (kdSetWindowPropertybv(m_kdWindow,KD_WINDOWPROPERTY_DESKTOP_EXCLUSIVE_NV, &exclusive)) {
+ isFullScreen = true;
+ }
+
+ if (isFullScreen) {
+ tlw->setGeometry(screen->geometry());
+ screen->setFullScreen(isFullScreen);
+ }else {
+ const KDint windowSize[2] = { tlw->width(), tlw->height() };
+ if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_SIZE, windowSize)) {
+ qErrnoWarning(kdGetError(), "Could not set native window size");
+ }
+ KDboolean visibillity(false);
+ if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_VISIBILITY, &visibillity)) {
+ qErrnoWarning(kdGetError(), "Could not set visibillity to false");
+ }
+
+ const KDint windowPos[2] = { tlw->x(), tlw->y() };
+ if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_DESKTOP_OFFSET_NV, windowPos)) {
+ qErrnoWarning(kdGetError(), "Could not set native window position");
+ return;
+ }
+ }
+
+
+ QOpenKODEIntegration *integration = static_cast<QOpenKODEIntegration *>(QApplicationPrivate::platformIntegration());
+
+ if (!isFullScreen || (isFullScreen && !integration->mainGLContext())) {
+ if (kdRealizeWindow(m_kdWindow, &m_eglWindow)) {
+ qErrnoWarning(kdGetError(), "Could not realize native window");
+ return;
+ }
+
+ EGLSurface surface = eglCreateWindowSurface(screen->eglDisplay(),m_eglConfig,m_eglWindow,m_eglWindowAttrs.constData());
+ m_platformGlContext = new QEGLPlatformContext(screen->eglDisplay(), m_eglConfig,
+ m_eglContextAttrs.data(), surface, m_eglApi);
+ integration->setMainGLContext(m_platformGLContext);
+ } else {
+ m_platformGlContext = integration->mainGLContext();
+ kdDestroyWindow(m_kdWindow);
+ m_kdWindow = 0;
+ }
+}
+
+
+QOpenKODEWindow::~QOpenKODEWindow()
+{
+ if (m_platformGlContext != static_cast<QOpenKODEIntegration *>(QApplicationPrivate::platformIntegration())) {
+ delete m_platformGlContext;
+ }
+ if (m_kdWindow)
+ kdDestroyWindow(m_kdWindow);
+}
+void QOpenKODEWindow::setGeometry(const QRect &rect)
+{
+ if (isFullScreen) {
+ QList<QPlatformScreen *> screens = QApplicationPrivate::platformIntegration()->screens();
+ QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(0));
+ widget()->setGeometry(screen->geometry());
+ return;
+ }
+ bool needToDeleteContext = false;
+ if (!isFullScreen) {
+ const QRect geo = geometry();
+ if (geo.size() != rect.size()) {
+ const KDint windowSize[2] = { rect.width(), rect.height() };
+ if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_SIZE, windowSize)) {
+ qErrnoWarning(kdGetError(), "Could not set native window size");
+ //return;
+ } else {
+ needToDeleteContext = true;
+ }
+ }
+
+ if (geo.topLeft() != rect.topLeft()) {
+ const KDint windowPos[2] = { rect.x(), rect.y() };
+ if (kdSetWindowPropertyiv(m_kdWindow, KD_WINDOWPROPERTY_DESKTOP_OFFSET_NV, windowPos)) {
+ qErrnoWarning(kdGetError(), "Could not set native window position");
+ //return;
+ } else {
+ needToDeleteContext = true;
+ }
+ }
+ }
+
+ //need to recreate context
+ if (needToDeleteContext) {
+ delete m_platformGlContext;
+
+ QList<QPlatformScreen *> screens = QApplicationPrivate::platformIntegration()->screens();
+ QOpenKODEScreen *screen = qobject_cast<QOpenKODEScreen *>(screens.at(0));
+ EGLSurface surface = eglCreateWindowSurface(screen->eglDisplay(),m_eglConfig,m_eglWindow,m_eglWindowAttrs.constData());
+ m_platformGlContext = new QEGLPlatformContext(screen->eglDisplay(),m_eglConfig,
+ m_eglContextAttrs.data(),surface,m_eglApi);
+ }
+}
+
+void QOpenKODEWindow::setVisible(bool visible)
+{
+ if (!m_kdWindow)
+ return;
+ KDboolean visibillity(visible);
+ if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_VISIBILITY, &visibillity)) {
+ qErrnoWarning(kdGetError(), "Could not set visibillity property");
+ }
+}
+
+WId QOpenKODEWindow::winId() const
+{
+ static int i = 0;
+ return i++;
+}
+
+QPlatformGLContext *QOpenKODEWindow::glContext() const
+{
+ return m_platformGlContext;
+}
+
+void QOpenKODEWindow::raise()
+{
+ if (!m_kdWindow)
+ return;
+ KDboolean focus(true);
+ if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_FOCUS, &focus)) {
+ qErrnoWarning(kdGetError(), "Could not set focus");
+ }
+}
+
+void QOpenKODEWindow::lower()
+{
+ if (!m_kdWindow)
+ return;
+ KDboolean focus(false);
+ if (kdSetWindowPropertybv(m_kdWindow, KD_WINDOWPROPERTY_FOCUS, &focus)) {
+ qErrnoWarning(kdGetError(), "Could not set focus");
+ }
+}
+
+void QOpenKODEWindow::processMouseEvents(const KDEvent *event)
+{
+ int x = event->data.inputpointer.x;
+ int y = event->data.inputpointer.y;
+ Qt::MouseButtons buttons;
+ switch(event->data.inputpointer.select) {
+ case 1:
+ buttons = Qt::LeftButton;
+ break;
+ default:
+ buttons = Qt::NoButton;
+ }
+ QPoint pos(x,y);
+ QWindowSystemInterface::handleMouseEvent(0,event->timestamp,pos,pos,buttons);
+}
+
+void QOpenKODEWindow::processKeyEvents(const KDEvent *event)
+{
+#ifdef KD_ATX_keyboard
+ //KD_KEY_PRESS_ATX 1
+ QEvent::Type keyPressed = QEvent::KeyRelease;
+ if (event->data.keyboardInputKey.flags)
+ keyPressed = QEvent::KeyPress;
+//KD_KEY_LOCATION_LEFT_ATX // dont care for now
+//KD_KEY_LOCATION_RIGHT_ATX
+//KD_KEY_LOCATION_NUMPAD_ATX
+ Qt::KeyboardModifiers mod = Qt::NoModifier;
+ int openkodeMods = event->data.keyboardInputKey.flags;
+ if (openkodeMods & KD_KEY_MODIFIER_SHIFT_ATX)
+ mod |= Qt::ShiftModifier;
+ if (openkodeMods & KD_KEY_MODIFIER_CTRL_ATX)
+ mod |= Qt::ControlModifier;
+ if (openkodeMods & KD_KEY_MODIFIER_ALT_ATX)
+ mod |= Qt::AltModifier;
+ if (openkodeMods & KD_KEY_MODIFIER_META_ATX)
+ mod |= Qt::MetaModifier;
+
+ Qt::Key qtKey;
+ QChar keyText;
+ int key = event->data.keyboardInputKey.keycode;
+ if (key >= 0x20 && key <= 0x0ff){ // 8 bit printable Latin1
+ qtKey = Qt::Key(key);
+ keyText = QChar(event->data.keyboardInputKeyChar.character);
+ if (!(mod & Qt::ShiftModifier))
+ keyText = keyText.toLower();
+ } else {
+ qtKey = keyTranslator(key);
+ }
+ QWindowSystemInterface::handleKeyEvent(0,event->timestamp,keyPressed,qtKey,mod,keyText);
+#endif
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openkode/qopenkodewindow.h b/src/plugins/platforms/openkode/qopenkodewindow.h
new file mode 100644
index 0000000000..83b04b410b
--- /dev/null
+++ b/src/plugins/platforms/openkode/qopenkodewindow.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QOPENKODEWINDOW_H
+#define QOPENKODEWINDOW_H
+
+#include <QtGui/QPlatformWindow>
+#include <QtCore/QVector>
+
+#include <KD/kd.h>
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+class QEGLPlatformContext;
+class QPlatformEventLoopIntegration;
+
+class QOpenKODEWindow : public QPlatformWindow
+{
+public:
+ QOpenKODEWindow(QWidget *tlw);
+ ~QOpenKODEWindow();
+
+ void setGeometry(const QRect &rect);
+ void setVisible(bool visible);
+ WId winId() const;
+
+ QPlatformGLContext *glContext() const;
+
+ void raise();
+ void lower();
+
+ void processKeyEvents( const KDEvent *event );
+ void processMouseEvents( const KDEvent *event );
+
+private:
+ struct KDWindow *m_kdWindow;
+ EGLNativeWindowType m_eglWindow;
+ EGLConfig m_eglConfig;
+ QVector<EGLint> m_eglWindowAttrs;
+ QVector<EGLint> m_eglContextAttrs;
+ EGLenum m_eglApi;
+ QEGLPlatformContext *m_platformGlContext;
+
+ bool isFullScreen;
+};
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif //QOPENKODEWINDOW_H
diff --git a/src/plugins/platforms/openkode/resources.qrc b/src/plugins/platforms/openkode/resources.qrc
new file mode 100644
index 0000000000..dbb34199ff
--- /dev/null
+++ b/src/plugins/platforms/openkode/resources.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>shaders/vert.glslv</file>
+ <file>shaders/frag.glslf</file>
+</qresource>
+</RCC>
diff --git a/src/plugins/platforms/openkode/shaders/frag.glslf b/src/plugins/platforms/openkode/shaders/frag.glslf
new file mode 100644
index 0000000000..ceac785149
--- /dev/null
+++ b/src/plugins/platforms/openkode/shaders/frag.glslf
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+uniform sampler2D tex_samp;
+
+varying vec2 texcoord_var;
+
+void main(void)
+{
+ gl_FragColor = texture2D(tex_samp, texcoord_var);
+}
diff --git a/src/plugins/platforms/openkode/shaders/vert.glslv b/src/plugins/platforms/openkode/shaders/vert.glslv
new file mode 100644
index 0000000000..cc409857bd
--- /dev/null
+++ b/src/plugins/platforms/openkode/shaders/vert.glslv
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+uniform vec2 window; // window size
+
+// Per-vertex attributes]
+attribute vec2 pos_attr;
+attribute vec2 texcoord_attr;
+
+// Output vertex color
+varying vec2 texcoord_var;
+
+void main()
+{
+ gl_Position = vec4( (2.0 * pos_attr / window -1.0) * vec2(1.0, -1.0), 0.0, 1.0);
+ texcoord_var = texcoord_attr;
+}
diff --git a/src/plugins/platforms/openvglite/main.cpp b/src/plugins/platforms/openvglite/main.cpp
new file mode 100644
index 0000000000..97321fa945
--- /dev/null
+++ b/src/plugins/platforms/openvglite/main.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qgraphicssystemplugin_p.h>
+#include "qgraphicssystem_vglite.h"
+
+QT_BEGIN_NAMESPACE
+
+class QVGGraphicsSystemPlugin : public QGraphicsSystemPlugin
+{
+public:
+ QStringList keys() const;
+ QGraphicsSystem *create(const QString&);
+};
+
+QStringList QVGGraphicsSystemPlugin::keys() const
+{
+ QStringList list;
+ list << "OpenVG";
+ return list;
+}
+
+QGraphicsSystem* QVGGraphicsSystemPlugin::create(const QString& system)
+{
+ if (system.toLower() == "openvg")
+ return new QVGLiteGraphicsSystem;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(openvg, QVGGraphicsSystemPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openvglite/openvglite.pro b/src/plugins/platforms/openvglite/openvglite.pro
new file mode 100644
index 0000000000..9d7860abe7
--- /dev/null
+++ b/src/plugins/platforms/openvglite/openvglite.pro
@@ -0,0 +1,12 @@
+TARGET = qvglitegraphicssystem
+include(../../qpluginbase.pri)
+
+QT += openvg
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+
+SOURCES = main.cpp qgraphicssystem_vglite.cpp qwindowsurface_vglite.cpp
+HEADERS = qgraphicssystem_vglite.h qwindowsurface_vglite.h
+
+target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+INSTALLS += target
diff --git a/src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp b/src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp
new file mode 100644
index 0000000000..5f7106e616
--- /dev/null
+++ b/src/plugins/platforms/openvglite/qgraphicssystem_vglite.cpp
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgraphicssystem_vglite.h"
+#include "qwindowsurface_vglite.h"
+#include <QtOpenVG/private/qpixmapdata_vg_p.h>
+#include <QtGui/private/qegl_p.h>
+#include <QtCore/qdebug.h>
+#ifdef OPENVG_USBHP_INIT
+extern "C" {
+#include <linuxusbhp.h>
+};
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QVGLiteGraphicsSystem::QVGLiteGraphicsSystem()
+ : w(0), h(0), d(0), dw(0), dh(0), physWidth(0), physHeight(0),
+ surface(0), context(0), rootWindow(0),
+ screenFormat(QImage::Format_RGB16), preservedSwap(false)
+{
+#ifdef OPENVG_USBHP_INIT
+ initLibrary();
+#endif
+
+ // The graphics system is also the screen definition.
+ mScreens.append(this);
+
+ QString displaySpec = QString::fromLatin1(qgetenv("QWS_DISPLAY"));
+ QStringList displayArgs = displaySpec.split(QLatin1Char(':'));
+
+ // Initialize EGL and create the global EGL context.
+ context = qt_vg_create_context(0);
+ if (!context) {
+ qFatal("QVGLiteGraphicsSystem: could not initialize EGL");
+ return;
+ }
+
+ // Get the root window handle to use. Default to zero.
+ QRegExp winidRx(QLatin1String("winid=?(\\d+)"));
+ int winidIdx = displayArgs.indexOf(winidRx);
+ int handle = 0;
+ if (winidIdx >= 0) {
+ winidRx.exactMatch(displayArgs.at(winidIdx));
+ handle = winidRx.cap(1).toInt();
+ }
+
+ // Create a full-screen window based on the native handle.
+ // If the context is premultiplied, the window should be too.
+ QEglProperties props;
+#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
+ EGLint surfaceType = 0;
+ if (context->configAttrib(EGL_SURFACE_TYPE, &surfaceType) &&
+ (surfaceType & EGL_VG_ALPHA_FORMAT_PRE_BIT) != 0)
+ props.setValue(EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE);
+#endif
+ rootWindow = eglCreateWindowSurface
+ (context->display(), context->config(),
+ (EGLNativeWindowType)handle, props.properties());
+ if (rootWindow == EGL_NO_SURFACE) {
+ delete context;
+ context = 0;
+ qFatal("QVGLiteGraphicsSystem: could not create full-screen window");
+ return;
+ }
+
+ // Try to turn on preserved swap behaviour on the root window.
+ // This will allow us to optimize compositing to focus on just
+ // the screen region that has changed. Otherwise we must
+ // re-composite the entire screen every frame.
+#if !defined(QVG_NO_PRESERVED_SWAP)
+ eglGetError(); // Clear error state first.
+ eglSurfaceAttrib(context->display(), rootWindow,
+ EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
+ preservedSwap = (eglGetError() == EGL_SUCCESS);
+#else
+ preservedSwap = false;
+#endif
+
+ // Fetch the root window properties.
+ eglQuerySurface(context->display(), rootWindow, EGL_WIDTH, &w);
+ eglQuerySurface(context->display(), rootWindow, EGL_HEIGHT, &h);
+ screenFormat = qt_vg_config_to_image_format(context);
+ switch (screenFormat) {
+ case QImage::Format_ARGB32_Premultiplied:
+ case QImage::Format_ARGB32:
+ case QImage::Format_RGB32:
+ default:
+ d = 32;
+ break;
+ case QImage::Format_RGB16:
+ case QImage::Format_ARGB4444_Premultiplied:
+ d = 16;
+ break;
+ }
+ dw = w;
+ dh = h;
+ qDebug("screen size: %dx%dx%d", w, h, d);
+
+ // Handle display physical size spec. From qscreenlinuxfb_qws.cpp.
+ QRegExp mmWidthRx(QLatin1String("mmWidth=?(\\d+)"));
+ int dimIdxW = displayArgs.indexOf(mmWidthRx);
+ QRegExp mmHeightRx(QLatin1String("mmHeight=?(\\d+)"));
+ int dimIdxH = displayArgs.indexOf(mmHeightRx);
+ if (dimIdxW >= 0) {
+ mmWidthRx.exactMatch(displayArgs.at(dimIdxW));
+ physWidth = mmWidthRx.cap(1).toInt();
+ if (dimIdxH < 0)
+ physHeight = dh*physWidth/dw;
+ }
+ if (dimIdxH >= 0) {
+ mmHeightRx.exactMatch(displayArgs.at(dimIdxH));
+ physHeight = mmHeightRx.cap(1).toInt();
+ if (dimIdxW < 0)
+ physWidth = dw*physHeight/dh;
+ }
+ if (dimIdxW < 0 && dimIdxH < 0) {
+ const int dpi = 72;
+ physWidth = qRound(dw * 25.4 / dpi);
+ physHeight = qRound(dh * 25.4 / dpi);
+ }
+}
+
+QVGLiteGraphicsSystem::~QVGLiteGraphicsSystem()
+{
+}
+
+QPixmapData *QVGLiteGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
+{
+#if !defined(QVGLite_NO_SINGLE_CONTEXT) && !defined(QVGLite_NO_PIXMAP_DATA)
+ // Pixmaps can use QVGLitePixmapData; bitmaps must use raster.
+ if (type == QPixmapData::PixmapType)
+ return new QVGPixmapData(type);
+ else
+ return new QRasterPixmapData(type);
+#else
+ return new QRasterPixmapData(type);
+#endif
+}
+
+QWindowSurface *QVGLiteGraphicsSystem::createWindowSurface(QWidget *widget) const
+{
+ if (widget->windowType() == Qt::Desktop)
+ return 0; // Don't create an explicit window surface for the destkop.
+ if (surface) {
+ qWarning() << "QVGLiteGraphicsSystem: only one window surface "
+ "is supported at a time";
+ return 0;
+ }
+ surface = new QVGLiteWindowSurface
+ (const_cast<QVGLiteGraphicsSystem *>(this), widget);
+ return surface;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/openvglite/qgraphicssystem_vglite.h b/src/plugins/platforms/openvglite/qgraphicssystem_vglite.h
new file mode 100644
index 0000000000..9d45bf9dda
--- /dev/null
+++ b/src/plugins/platforms/openvglite/qgraphicssystem_vglite.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_VGLITE_H
+#define QGRAPHICSSYSTEM_VGLITE_H
+
+#include <QtGui/private/qgraphicssystem_p.h>
+#include <QtGui/private/qegl_p.h>
+#include <QtGui/qimage.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVGLiteWindowSurface;
+
+class QVGLiteGraphicsSystem : public QGraphicsSystem,
+ public QGraphicsSystemScreen
+{
+public:
+ QVGLiteGraphicsSystem();
+ ~QVGLiteGraphicsSystem();
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QList<QGraphicsSystemScreen *> screens() const { return mScreens; }
+
+ QRect geometry() const { return QRect(0, 0, w, h); }
+ int depth() const { return d; }
+ QImage::Format format() const { return screenFormat; }
+ QSize physicalSize() const { return QSize(physWidth, physHeight); }
+
+private:
+ friend class QVGLiteWindowSurface;
+
+ int w;
+ int h;
+ int d;
+
+ int dw;
+ int dh;
+
+ int physWidth;
+ int physHeight;
+
+ mutable QVGLiteWindowSurface *surface;
+ QEglContext *context;
+ EGLSurface rootWindow;
+ QImage::Format screenFormat;
+ bool preservedSwap;
+
+ QList<QGraphicsSystemScreen *> mScreens;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp b/src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp
new file mode 100644
index 0000000000..8432ad6af7
--- /dev/null
+++ b/src/plugins/platforms/openvglite/qwindowsurface_vglite.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwindowsurface_vglite.h"
+#include "qgraphicssystem_vglite.h"
+#include <QtOpenVG/qvg.h>
+#include <QtOpenVG/private/qvg_p.h>
+#include <QtOpenVG/private/qpaintengine_vg_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QVGLiteWindowSurface::QVGLiteWindowSurface
+ (QVGLiteGraphicsSystem *gs, QWidget *window)
+ : QWindowSurface(window), graphicsSystem(gs),
+ isPaintingActive(false), engine(0)
+{
+}
+
+QVGLiteWindowSurface::~QVGLiteWindowSurface()
+{
+ graphicsSystem->surface = 0;
+ if (engine)
+ qt_vg_destroy_paint_engine(engine);
+}
+
+QPaintDevice *QVGLiteWindowSurface::paintDevice()
+{
+ qt_vg_make_current(graphicsSystem->context, graphicsSystem->rootWindow);
+ isPaintingActive = true;
+ // TODO: clear the parts of the back buffer that are not
+ // covered by the window surface to black.
+ return this;
+}
+
+void QVGLiteWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+ QEglContext *context = graphicsSystem->context;
+ if (context) {
+ if (!isPaintingActive)
+ qt_vg_make_current(context, graphicsSystem->rootWindow);
+ context->swapBuffers();
+ qt_vg_done_current(context);
+ context->setSurface(EGL_NO_SURFACE);
+ isPaintingActive = false;
+ }
+}
+
+void QVGLiteWindowSurface::setGeometry(const QRect &rect)
+{
+ QWindowSurface::setGeometry(rect);
+}
+
+bool QVGLiteWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ return QWindowSurface::scroll(area, dx, dy);
+}
+
+void QVGLiteWindowSurface::beginPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+void QVGLiteWindowSurface::endPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+QPaintEngine *QVGLiteWindowSurface::paintEngine() const
+{
+ if (!engine)
+ engine = qt_vg_create_paint_engine();
+ return engine;
+}
+
+// We need to get access to QWidget::metric() from QVGLiteWindowSurface::metric,
+// but it is not a friend of QWidget. To get around this, we create a
+// fake QX11PaintEngine class, which is a friend.
+class QX11PaintEngine
+{
+public:
+ static int metric(const QWidget *widget, QPaintDevice::PaintDeviceMetric met)
+ {
+ return widget->metric(met);
+ }
+};
+
+int QVGLiteWindowSurface::metric(PaintDeviceMetric met) const
+{
+ return QX11PaintEngine::metric(window(), met);
+}
diff --git a/src/plugins/platforms/openvglite/qwindowsurface_vglite.h b/src/plugins/platforms/openvglite/qwindowsurface_vglite.h
new file mode 100644
index 0000000000..6d66c42c49
--- /dev/null
+++ b/src/plugins/platforms/openvglite/qwindowsurface_vglite.h
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_VGLITE_H
+#define QWINDOWSURFACE_VGLITE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/private/qwindowsurface_p.h>
+#include <QtGui/private/qegl_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVGLiteGraphicsSystem;
+class QVGPaintEngine;
+
+class Q_OPENVG_EXPORT QVGLiteWindowSurface : public QWindowSurface, public QPaintDevice
+{
+public:
+ QVGLiteWindowSurface(QVGLiteGraphicsSystem *gs, QWidget *window);
+ ~QVGLiteWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void setGeometry(const QRect &rect);
+ bool scroll(const QRegion &area, int dx, int dy);
+
+ void beginPaint(const QRegion &region);
+ void endPaint(const QRegion &region);
+
+ QPaintEngine *paintEngine() const;
+
+protected:
+ int metric(PaintDeviceMetric metric) const;
+
+private:
+ QVGLiteGraphicsSystem *graphicsSystem;
+ bool isPaintingActive;
+ mutable QVGPaintEngine *engine;
+};
+
+QT_END_NAMESPACE
+
+#endif // QWINDOWSURFACE_VGLITE_H
diff --git a/src/plugins/platforms/platforms.pro b/src/plugins/platforms/platforms.pro
new file mode 100644
index 0000000000..57015e7924
--- /dev/null
+++ b/src/plugins/platforms/platforms.pro
@@ -0,0 +1,8 @@
+TEMPLATE = subdirs
+
+SUBDIRS += minimal
+
+contains(QT_CONFIG, wayland) {
+ SUBDIRS += wayland
+}
+
diff --git a/src/plugins/platforms/qvfb/main.cpp b/src/plugins/platforms/qvfb/main.cpp
new file mode 100644
index 0000000000..5c3b72bc7c
--- /dev/null
+++ b/src/plugins/platforms/qvfb/main.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QPlatformIntegrationPlugin>
+#include "qvfbintegration.h"
+#include <qstringlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVFbIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QVFbIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "QVFb";
+ return list;
+}
+
+QPlatformIntegration* QVFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "qvfb")
+ return new QVFbIntegration(paramList);
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(qvfb, QVFbIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qvfb/qvfb.pro b/src/plugins/platforms/qvfb/qvfb.pro
new file mode 100644
index 0000000000..d2b332a6d5
--- /dev/null
+++ b/src/plugins/platforms/qvfb/qvfb.pro
@@ -0,0 +1,13 @@
+TARGET = qvfbintegration
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+
+SOURCES = main.cpp qvfbintegration.cpp qvfbwindowsurface.cpp
+HEADERS = qvfbintegration.h qvfbwindowsurface.h
+
+include(../fontdatabases/genericunix/genericunix.pri)
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/qvfb/qvfbintegration.cpp b/src/plugins/platforms/qvfb/qvfbintegration.cpp
new file mode 100644
index 0000000000..ddde8008d2
--- /dev/null
+++ b/src/plugins/platforms/qvfb/qvfbintegration.cpp
@@ -0,0 +1,448 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <private/qcore_unix_p.h> // overrides QT_OPEN
+
+#include <qvfbhdr.h>
+#include <qsocketnotifier.h>
+
+#include "qvfbintegration.h"
+#include "qvfbwindowsurface.h"
+#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtCore/qdebug.h>
+#include <QMouseEvent>
+
+#include <qsocketnotifier.h>
+#include <QApplication>
+#include <QWindowSystemInterface>
+
+#include "qgenericunixfontdatabase.h"
+
+QT_BEGIN_NAMESPACE
+
+
+class QVFbScreenKeyboardHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QVFbScreenKeyboardHandler(int displayId);
+ ~QVFbScreenKeyboardHandler();
+
+private slots:
+ void readKeyboardData();
+
+private:
+ int kbdFD;
+ int kbdIdx;
+ int kbdBufferLen;
+ unsigned char *kbdBuffer;
+ QSocketNotifier *keyNotifier;
+};
+
+QVFbScreenKeyboardHandler::QVFbScreenKeyboardHandler(int displayId)
+{
+ const QString keyboardDev = QT_VFB_KEYBOARD_PIPE(displayId);
+
+
+ kbdFD = -1;
+ kbdIdx = 0;
+ kbdBufferLen = sizeof(QVFbKeyData) * 5;
+ kbdBuffer = new unsigned char [kbdBufferLen];
+
+ kbdFD = QT_OPEN(keyboardDev.toLatin1().constData(), O_RDWR | O_NDELAY);
+
+ if (kbdFD == -1) {
+ perror("QVFbScreenKeyboardHandler");
+ qWarning("QVFbScreenKeyboardHandler: Unable to open device %s",
+ qPrintable(keyboardDev));
+ return;
+ }
+
+ // Clear pending input
+ char buf[2];
+ while (QT_READ(kbdFD, buf, 1) > 0) { }
+
+ keyNotifier = new QSocketNotifier(kbdFD, QSocketNotifier::Read, this);
+ connect(keyNotifier, SIGNAL(activated(int)),this, SLOT(readKeyboardData()));
+
+}
+
+QVFbScreenKeyboardHandler::~QVFbScreenKeyboardHandler()
+{
+ if (kbdFD >= 0)
+ QT_CLOSE(kbdFD);
+ delete [] kbdBuffer;
+}
+
+
+void QVFbScreenKeyboardHandler::readKeyboardData()
+{
+ int n;
+ do {
+ n = QT_READ(kbdFD, kbdBuffer+kbdIdx, kbdBufferLen - kbdIdx);
+ if (n > 0)
+ kbdIdx += n;
+ } while (n > 0);
+
+ int idx = 0;
+ while (kbdIdx - idx >= (int)sizeof(QVFbKeyData)) {
+ QVFbKeyData *kd = (QVFbKeyData *)(kbdBuffer + idx);
+ if (kd->unicode == 0 && kd->keycode == 0 && kd->modifiers == 0 && kd->press) {
+ // magic exit key
+ qWarning("Instructed to quit by Virtual Keyboard");
+ qApp->quit();
+ }
+
+ //QWSServer::processKeyEvent(kd->unicode ? kd->unicode : 0xffff, kd->keycode, kd->modifiers, kd->press, kd->repeat);
+
+ QEvent::Type type = kd->press ? QEvent::KeyPress : QEvent::KeyRelease;
+
+ QString text;
+ if (kd->unicode && kd->unicode != 0xffff)
+ text += QChar(kd->unicode);
+
+// qDebug() << "readKeyboardData" << type << hex << kd->keycode << kd->modifiers << text;
+
+ QWindowSystemInterface::handleKeyEvent(0, type, kd->keycode, kd->modifiers, text, kd->repeat, int(text.length()));
+ idx += sizeof(QVFbKeyData);
+ }
+
+ int surplus = kbdIdx - idx;
+ for (int i = 0; i < surplus; i++)
+ kbdBuffer[i] = kbdBuffer[idx+i];
+ kbdIdx = surplus;
+}
+
+
+
+
+class QVFbScreenMouseHandler : public QObject
+{
+ Q_OBJECT
+public:
+ QVFbScreenMouseHandler(int displayId);
+ ~QVFbScreenMouseHandler();
+
+private slots:
+ void readMouseData();
+
+private:
+ int mouseFD;
+ int mouseIdx;
+ enum {mouseBufSize = 128};
+ uchar mouseBuf[mouseBufSize];
+ QSocketNotifier *mouseNotifier;
+
+ int oldButtonState;
+};
+
+QVFbScreenMouseHandler::QVFbScreenMouseHandler(int displayId)
+{
+ QString mouseDev = QT_VFB_MOUSE_PIPE(displayId);
+
+ mouseFD = QT_OPEN(mouseDev.toLatin1().constData(), O_RDWR | O_NDELAY);
+
+ if (mouseFD == -1) {
+ perror("QVFbMouseHandler::QVFbMouseHandler");
+ qWarning("QVFbMouseHander: Unable to open device %s",
+ qPrintable(mouseDev));
+ return;
+ }
+
+ // Clear pending input
+ char buf[2];
+ while (QT_READ(mouseFD, buf, 1) > 0) { }
+
+ mouseIdx = 0;
+ oldButtonState = 0;
+ mouseNotifier = new QSocketNotifier(mouseFD, QSocketNotifier::Read, this);
+ connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
+}
+
+
+QVFbScreenMouseHandler::~QVFbScreenMouseHandler()
+{
+ if (mouseFD >= 0)
+ QT_CLOSE(mouseFD);
+}
+
+void QVFbScreenMouseHandler::readMouseData()
+{
+ int n;
+ do {
+ n = QT_READ(mouseFD, mouseBuf+mouseIdx, mouseBufSize-mouseIdx);
+ if (n > 0)
+ mouseIdx += n;
+ } while (n > 0);
+
+ int idx = 0;
+ static const int packetsize = sizeof(QPoint) + 2*sizeof(int);
+ while (mouseIdx-idx >= packetsize) {
+ uchar *mb = mouseBuf+idx;
+ QPoint mousePos = *reinterpret_cast<QPoint *>(mb);
+ mb += sizeof(QPoint);
+ int bstate = *reinterpret_cast<int *>(mb);
+ mb += sizeof(int);
+ //int wheel = *reinterpret_cast<int *>(mb);
+
+ int button = bstate ^ oldButtonState;
+ QEvent::Type type = QEvent::MouseMove;
+
+ if (button) {
+ type = (button & bstate) ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease;
+ }
+ QWindowSystemInterface::handleMouseEvent(0, mousePos, mousePos, Qt::MouseButtons(bstate));
+
+// qDebug() << "readMouseData" << mousePos << button << bstate << oldButtonState << type;
+
+ oldButtonState = bstate;
+
+ idx += packetsize;
+ }
+
+ int surplus = mouseIdx - idx;
+ for (int i = 0; i < surplus; i++)
+ mouseBuf[i] = mouseBuf[idx+i];
+ mouseIdx = surplus;
+
+}
+
+
+class QVFbScreenPrivate
+{
+public:
+ QVFbScreenPrivate(int id)
+ : shmrgn(0), hdr(0), data(0), mouseHandler(0), keyboardHandler(0)
+ {
+ displayId = id;
+ connect(displayId);
+ }
+
+ ~QVFbScreenPrivate() { disconnect(); }
+ void setDirty(const QRect &r);
+
+ bool connect(int displayId);
+ void disconnect();
+
+ QImage *screenImage() { return &img; }
+ QSize screenSize() { return img.size(); }
+
+ int depth() const { return img.depth(); }
+ QImage::Format format() const { return img.format(); }
+
+private:
+ unsigned char *shmrgn;
+ QVFbHeader *hdr;
+ uchar *data;
+ QVFbScreenMouseHandler *mouseHandler;
+ QVFbScreenKeyboardHandler *keyboardHandler;
+ int displayId;
+
+ QImage img;
+};
+
+
+void QVFbScreenPrivate::setDirty(const QRect &r)
+{
+ hdr->dirty = true;
+ hdr->update = hdr->update.united(r);
+}
+
+
+bool QVFbScreenPrivate::connect(int displayId)
+{
+ qDebug() << "QVFbScreenPrivate::connect" << displayId;
+ key_t key = ftok(QT_VFB_MOUSE_PIPE(displayId).toLatin1(), 'b');
+
+ if (key == -1)
+ return false;
+
+
+ int shmId = shmget(key, 0, 0);
+ if (shmId != -1)
+ shmrgn = (unsigned char *)shmat(shmId, 0, 0);
+ else
+ return false;
+
+ if ((long)shmrgn == -1 || shmrgn == 0) {
+ qDebug("No shmrgn %ld", (long)shmrgn);
+ return false;
+ }
+
+ hdr = (QVFbHeader *)shmrgn;
+ data = shmrgn + hdr->dataoffset;
+
+ int w = hdr->width;
+ int h = hdr->height;
+ int d = hdr->depth;
+ int lstep = hdr->linestep;
+
+ QImage::Format format = QImage::Format_Invalid;
+ if (d == 32)
+ format = QImage::Format_ARGB32_Premultiplied;
+ else if (d == 16)
+ format = QImage::Format_RGB16;
+
+
+ if (format == QImage::Format_Invalid) {
+ img = QImage();
+ return false;
+ }
+
+ img = QImage(data, w, h, lstep, format);
+
+ qDebug("connected %dx%d %d bpp", w, h, d);
+
+
+ mouseHandler = new QVFbScreenMouseHandler(displayId);
+ keyboardHandler = new QVFbScreenKeyboardHandler(displayId);
+ return true;
+}
+
+void QVFbScreenPrivate::disconnect()
+{
+ if ((long)shmrgn != -1 && shmrgn) {
+ shmdt((char*)shmrgn);
+ shmrgn = 0;
+ }
+ delete mouseHandler;
+ mouseHandler = 0;
+ delete keyboardHandler;
+ keyboardHandler = 0;
+}
+
+
+QVFbScreen::QVFbScreen(int id)
+{
+ d_ptr = new QVFbScreenPrivate(id);
+}
+
+
+QVFbScreen::~QVFbScreen()
+{
+ delete d_ptr;
+}
+
+void QVFbScreen::setDirty(const QRect &rect)
+{
+ d_ptr->setDirty(rect);
+}
+
+
+
+QRect QVFbScreen::geometry() const {
+ return QRect(QPoint(), d_ptr->screenSize());
+}
+
+
+int QVFbScreen::depth() const
+{
+ return d_ptr->depth();
+}
+
+QImage::Format QVFbScreen::format() const
+{
+ return d_ptr->format();
+}
+
+QSize QVFbScreen::physicalSize() const {
+ return (d_ptr->screenSize()*254)/720;
+}
+
+#if 0
+int QVFbScreen::linestep() const {
+ return d_ptr->screenImage() ? d_ptr->screenImage()->bytesPerLine() : 0;
+}
+
+uchar *QVFbScreen::base() const {
+ return d_ptr->screenImage() ? d_ptr->screenImage()->bits() : 0;
+}
+#endif
+
+QImage *QVFbScreen::screenImage()
+{
+ return d_ptr->screenImage();
+}
+
+QVFbIntegration::QVFbIntegration(const QStringList &paramList)
+ : mFontDb(new QGenericUnixFontDatabase())
+{
+ int displayId = 0;
+ if (paramList.length() > 0)
+ displayId = paramList.at(0).toInt();
+
+ mPrimaryScreen = new QVFbScreen(displayId);
+
+ mScreens.append(mPrimaryScreen);
+}
+
+QPixmapData *QVFbIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QWindowSurface *QVFbIntegration::createWindowSurface(QWidget *widget, WId) const
+{
+ return new QVFbWindowSurface(mPrimaryScreen, widget);
+}
+
+
+QPlatformWindow *QVFbIntegration::createPlatformWindow(QWidget *widget, WId) const
+{
+ return new QVFbWindow(mPrimaryScreen, widget);
+}
+
+QPlatformFontDatabase *QVFbIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+QT_END_NAMESPACE
+
+#include "qvfbintegration.moc"
diff --git a/src/plugins/platforms/qvfb/qvfbintegration.h b/src/plugins/platforms/qvfb/qvfbintegration.h
new file mode 100644
index 0000000000..33e31a5aaa
--- /dev/null
+++ b/src/plugins/platforms/qvfb/qvfbintegration.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_QVFB_H
+#define QGRAPHICSSYSTEM_QVFB_H
+
+#include <QPlatformScreen>
+#include <QPlatformIntegration>
+
+QT_BEGIN_NAMESPACE
+
+
+class QVFbScreenPrivate;
+
+class QVFbScreen : public QPlatformScreen
+{
+public:
+ QVFbScreen(int id);
+ ~QVFbScreen();
+
+ QRect geometry() const;
+ int depth() const;
+ QImage::Format format() const;
+ QSize physicalSize() const;
+
+ QImage *screenImage();
+
+ void setDirty(const QRect &rect);
+
+public:
+
+ QVFbScreenPrivate *d_ptr;
+};
+
+class QVFbIntegrationPrivate;
+
+
+class QVFbIntegration : public QPlatformIntegration
+{
+public:
+ QVFbIntegration(const QStringList &paramList);
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+private:
+ QVFbScreen *mPrimaryScreen;
+ QList<QPlatformScreen *> mScreens;
+ QPlatformFontDatabase *mFontDb;
+};
+
+
+
+QT_END_NAMESPACE
+
+
+#endif
diff --git a/src/plugins/platforms/qvfb/qvfbwindowsurface.cpp b/src/plugins/platforms/qvfb/qvfbwindowsurface.cpp
new file mode 100644
index 0000000000..85918eb1bb
--- /dev/null
+++ b/src/plugins/platforms/qvfb/qvfbwindowsurface.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qvfbwindowsurface.h"
+#include "qvfbintegration.h"
+#include <QtCore/qdebug.h>
+#include <QtGui/qpainter.h>
+#include <private/qapplication_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QVFbWindowSurface::QVFbWindowSurface(//QVFbIntegration *graphicsSystem,
+ QVFbScreen *screen, QWidget *window)
+ : QWindowSurface(window),
+ mScreen(screen)
+{
+}
+
+QVFbWindowSurface::~QVFbWindowSurface()
+{
+}
+
+QPaintDevice *QVFbWindowSurface::paintDevice()
+{
+ return mScreen->screenImage();
+}
+
+void QVFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(offset);
+
+// QRect rect = geometry();
+// QPoint topLeft = rect.topLeft();
+
+ mScreen->setDirty(region.boundingRect());
+}
+
+void QVFbWindowSurface::resize(const QSize&)
+{
+
+// any size you like as long as it's full-screen...
+
+ QRect rect(mScreen->availableGeometry());
+ QWindowSurface::resize(rect.size());
+}
+
+
+QVFbWindow::QVFbWindow(QVFbScreen *screen, QWidget *window)
+ : QPlatformWindow(window),
+ mScreen(screen)
+{
+}
+
+
+void QVFbWindow::setGeometry(const QRect &)
+{
+
+// any size you like as long as it's full-screen...
+
+ QRect rect(mScreen->availableGeometry());
+ QWindowSystemInterface::handleGeometryChange(this->widget(), rect);
+
+ QPlatformWindow::setGeometry(rect);
+}
+
+
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qvfb/qvfbwindowsurface.h b/src/plugins/platforms/qvfb/qvfbwindowsurface.h
new file mode 100644
index 0000000000..9f828d3b0f
--- /dev/null
+++ b/src/plugins/platforms/qvfb/qvfbwindowsurface.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_QVFB_H
+#define QWINDOWSURFACE_QVFB_H
+
+#include <QtGui/private/qwindowsurface_p.h>
+#include <QPlatformWindow>
+
+QT_BEGIN_NAMESPACE
+
+class QVFbIntegration;
+class QVFbScreen;
+
+class QVFbWindowSurface : public QWindowSurface
+{
+public:
+ QVFbWindowSurface(QVFbScreen *screen, QWidget *window);
+ ~QVFbWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize(const QSize &size);
+
+private:
+ QVFbScreen *mScreen;
+};
+
+class QVFbWindow : public QPlatformWindow
+{
+public:
+ QVFbWindow(QVFbScreen *screen, QWidget *window);
+ void setGeometry(const QRect &rect);
+
+private:
+ QVFbScreen *mScreen;
+};
+
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/uikit/README b/src/plugins/platforms/uikit/README
new file mode 100644
index 0000000000..a101a3ac0b
--- /dev/null
+++ b/src/plugins/platforms/uikit/README
@@ -0,0 +1,45 @@
+This is a proof-of-concept implemenation of a UIKit based
+QPA plugin. Note that this is completely unsupported, and it is probable
+that many parts of QtCore and other Qt Modules don't work properly.
+
+1) Build Qt
+
+The example Xcode project in the examples subdirectory requires that you do shadow
+builds of Qt in qt-lighthouse-ios-simulator and qt-lighthouse-ios-device directories
+parallel to the sources. To build for simulator make sure that both the Simulator
+configuration *and* the simulator specific target are active. To build for device
+make sure that both the Device configuration *and* the device specific target are
+active.
+
+The setup is configured to use the iOS 4.2 SDKs, you might want to edit the mkspecs
+to fit your need.
+
+After configuring and building Qt you need to also build src/plugins/platforms/uikit.
+
+Simulator:
+----------
+configure -qpa -xplatform qws/macx-iphonesimulator-g++ -arch i386 -developer-build -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
+
+Device:
+-------
+configure -qpa -xplatform qws/macx-iphonedevice-g++ -arch armv7 -developer-build -release -opengl es1 -no-accessibility -no-qt3support -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
+
+2) XCode setup:
+- there are examples in the examples subdirectory of the platform plugin
+- to create something fresh do something like:
+ - Xcode: Create a "View-based Appplication"
+ - remove the nibs and view controller and app controller files
+ - remove the reference to "Main nib file" from plist file
+ - create a main.mm like in the examples
+ - add the qmlapplicationviewer sources to your project (including the moc_*.h)
+ (best to link, not copy), the code for this is from the Qt Creator
+ mobile Qt Quick application template
+ - Add the Qt .a libraries, uikit platform plugin and libz (v1.2.3) to Frameworks
+ - add "$(SRCROOT)/../../../../qt-lighthouse-ios-device/include" (or -simulator)
+ to the include search paths.
+ - add "$(SRCROOT)/../qmltest" to the include search path if you didn't copy but
+ linked to the qmlapplicationviewer
+ - for device set the architecture to armv7 only
+
+3) Done: Build and Run.
+
diff --git a/src/plugins/platforms/uikit/examples/qmltest/main.mm b/src/plugins/platforms/uikit/examples/qmltest/main.mm
new file mode 100644
index 0000000000..ea4e90cbee
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/main.mm
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#import <UIKit/UIKit.h>
+
+#include "qmlapplicationviewer/qmlapplicationviewer.h"
+
+#include <QtGui/QApplication>
+#include <QtCore/QtPlugin>
+#include <QtDeclarative/QDeclarativeEngine>
+
+Q_IMPORT_PLUGIN(UIKit)
+
+static QString qStringFromNSString(NSString *nsstring)
+{
+ return QString::fromUtf8([nsstring UTF8String]);
+}
+
+static QString documentsDirectory()
+{
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+ NSString *documentsDirectory = [paths objectAtIndex:0];
+ return qStringFromNSString(documentsDirectory);
+}
+
+int main(int argc, char *argv[]) {
+
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ QApplication app(argc, argv);
+ QmlApplicationViewer viewer;
+ viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
+ viewer.engine()->setOfflineStoragePath(documentsDirectory());
+ NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
+ viewer.setMainQmlFile(qStringFromNSString([resourcePath stringByAppendingPathComponent:@"qml/main.qml"]));
+ viewer.showMaximized();
+ int retVal = app.exec();
+ [pool release];
+ return retVal;
+}
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qml/main.qml b/src/plugins/platforms/uikit/examples/qmltest/qml/main.qml
new file mode 100644
index 0000000000..889a6d063f
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qml/main.qml
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 1.0
+
+Rectangle {
+ id: box
+ width: 350; height: 250
+
+ Rectangle {
+ id: redSquare
+ width: 80; height: 80
+ anchors.top: parent.top; anchors.left: parent.left; anchors.margins: 10
+ color: "red"
+
+ Text { text: "Click"; font.pixelSize: 16; anchors.centerIn: parent }
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+
+ onEntered: info.text = 'Entered'
+ onExited: info.text = 'Exited (pressed=' + pressed + ')'
+
+ onPressed: {
+ info.text = 'Pressed (button=' + (mouse.button == Qt.RightButton ? 'right' : 'left')
+ + ' shift=' + (mouse.modifiers & Qt.ShiftModifier ? 'true' : 'false') + ')'
+ var posInBox = redSquare.mapToItem(box, mouse.x, mouse.y)
+ posInfo.text = + mouse.x + ',' + mouse.y + ' in square'
+ + ' (' + posInBox.x + ',' + posInBox.y + ' in window)'
+ }
+
+ onReleased: {
+ info.text = 'Released (isClick=' + mouse.isClick + ' wasHeld=' + mouse.wasHeld + ')'
+ posInfo.text = ''
+ }
+
+ onPressAndHold: info.text = 'Press and hold'
+ onClicked: info.text = 'Clicked (wasHeld=' + mouse.wasHeld + ')'
+ onDoubleClicked: info.text = 'Double clicked'
+ }
+ }
+
+ Rectangle {
+ id: blueSquare
+ width: 80; height: 80
+ x: box.width - width - 10; y: 10 // making this item draggable, so don't use anchors
+ color: "blue"
+
+ Text { text: "Drag"; font.pixelSize: 16; color: "white"; anchors.centerIn: parent }
+
+ MouseArea {
+ anchors.fill: parent
+ drag.target: blueSquare
+ drag.axis: Drag.XandYAxis
+ drag.minimumX: 0
+ drag.maximumX: box.width - parent.width
+ drag.minimumY: 0
+ drag.maximumY: box.height - parent.width
+ }
+ }
+
+ Text {
+ id: info
+ anchors.bottom: posInfo.top; anchors.horizontalCenter: parent.horizontalCenter; anchors.margins: 30
+
+ onTextChanged: console.log(text)
+ }
+
+ Text {
+ id: posInfo
+ anchors.bottom: parent.bottom; anchors.horizontalCenter: parent.horizontalCenter; anchors.margins: 30
+ }
+}
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/moc_qmlapplicationviewer.cpp b/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/moc_qmlapplicationviewer.cpp
new file mode 100644
index 0000000000..a2b40ec44a
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/moc_qmlapplicationviewer.cpp
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+** Meta object code from reading C++ file 'qmlapplicationviewer.h'
+**
+** Created: Fri Feb 18 17:53:42 2011
+** by: The Qt Meta Object Compiler version 62 (Qt 4.7.2)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include "qmlapplicationviewer.h"
+#if !defined(Q_MOC_OUTPUT_REVISION)
+#error "The header file 'qmlapplicationviewer.h' doesn't include <QObject>."
+#elif Q_MOC_OUTPUT_REVISION != 62
+#error "This file was generated using the moc from 4.7.2. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+QT_BEGIN_MOC_NAMESPACE
+static const uint qt_meta_data_QmlApplicationViewer[] = {
+
+ // content:
+ 5, // revision
+ 0, // classname
+ 0, 0, // classinfo
+ 0, 0, // methods
+ 0, 0, // properties
+ 0, 0, // enums/sets
+ 0, 0, // constructors
+ 0, // flags
+ 0, // signalCount
+
+ 0 // eod
+};
+
+static const char qt_meta_stringdata_QmlApplicationViewer[] = {
+ "QmlApplicationViewer\0"
+};
+
+const QMetaObject QmlApplicationViewer::staticMetaObject = {
+ { &QDeclarativeView::staticMetaObject, qt_meta_stringdata_QmlApplicationViewer,
+ qt_meta_data_QmlApplicationViewer, 0 }
+};
+
+#ifdef Q_NO_DATA_RELOCATION
+const QMetaObject &QmlApplicationViewer::getStaticMetaObject() { return staticMetaObject; }
+#endif //Q_NO_DATA_RELOCATION
+
+const QMetaObject *QmlApplicationViewer::metaObject() const
+{
+ return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
+}
+
+void *QmlApplicationViewer::qt_metacast(const char *_clname)
+{
+ if (!_clname) return 0;
+ if (!strcmp(_clname, qt_meta_stringdata_QmlApplicationViewer))
+ return static_cast<void*>(const_cast< QmlApplicationViewer*>(this));
+ return QDeclarativeView::qt_metacast(_clname);
+}
+
+int QmlApplicationViewer::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+ _id = QDeclarativeView::qt_metacall(_c, _id, _a);
+ if (_id < 0)
+ return _id;
+ return _id;
+}
+QT_END_MOC_NAMESPACE
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.cpp b/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.cpp
new file mode 100644
index 0000000000..72f8c52e7b
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.cpp
@@ -0,0 +1,196 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// checksum 0x17fa version 0x3000a
+/*
+ This file was generated by the Qt Quick Application wizard of Qt Creator.
+ QmlApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qmlapplicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtDeclarative/QDeclarativeComponent>
+#include <QtDeclarative/QDeclarativeEngine>
+#include <QtDeclarative/QDeclarativeContext>
+
+#if defined(QMLJSDEBUGGER)
+#include <qt_private/qdeclarativedebughelper_p.h>
+#endif
+
+#if defined(QMLJSDEBUGGER) && !defined(NO_JSDEBUGGER)
+#include <jsdebuggeragent.h>
+#endif
+#if defined(QMLJSDEBUGGER) && !defined(NO_QMLOBSERVER)
+#include <qdeclarativeviewobserver.h>
+#endif
+
+#if defined(QMLJSDEBUGGER)
+
+// Enable debugging before any QDeclarativeEngine is created
+struct QmlJsDebuggingEnabler
+{
+ QmlJsDebuggingEnabler()
+ {
+ QDeclarativeDebugHelper::enableDebugging();
+ }
+};
+
+// Execute code in constructor before first QDeclarativeEngine is instantiated
+static QmlJsDebuggingEnabler enableDebuggingHelper;
+
+#endif // QMLJSDEBUGGER
+
+class QmlApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QmlApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QmlApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#ifdef Q_OS_UNIX
+#ifdef Q_OS_MAC
+ if (!QDir::isAbsolutePath(path))
+ return QCoreApplication::applicationDirPath()
+ + QLatin1String("/../Resources/") + path;
+#else
+ const QString pathInShareDir = QCoreApplication::applicationDirPath()
+ + QLatin1String("/../share/")
+ + QFileInfo(QCoreApplication::applicationFilePath()).fileName()
+ + QLatin1Char('/') + path;
+ if (QFileInfo(pathInShareDir).exists())
+ return pathInShareDir;
+#endif
+#endif
+ return path;
+}
+
+QmlApplicationViewer::QmlApplicationViewer(QWidget *parent) :
+ QDeclarativeView(parent),
+ m_d(new QmlApplicationViewerPrivate)
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QDeclarativeView::SizeRootObjectToView);
+#if defined(QMLJSDEBUGGER) && !defined(NO_JSDEBUGGER)
+ new QmlJSDebugger::JSDebuggerAgent(engine());
+#endif
+#if defined(QMLJSDEBUGGER) && !defined(NO_QMLOBSERVER)
+ new QmlJSDebugger::QDeclarativeViewObserver(this, parent);
+#endif
+}
+
+QmlApplicationViewer::~QmlApplicationViewer()
+{
+ delete m_d;
+}
+
+void QmlApplicationViewer::setMainQmlFile(const QString &file)
+{
+ m_d->mainQmlFile = QmlApplicationViewerPrivate::adjustPath(file);
+ setSource(QUrl::fromLocalFile(m_d->mainQmlFile));
+}
+
+void QmlApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QmlApplicationViewerPrivate::adjustPath(path));
+}
+
+void QmlApplicationViewer::setOrientation(ScreenOrientation orientation)
+{
+//#if defined(Q_OS_SYMBIAN)
+// // If the version of Qt on the device is < 4.7.2, that attribute won't work
+// if (orientation != ScreenOrientationAuto) {
+// const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.'));
+// if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) {
+// qWarning("Screen orientation locking only supported with Qt 4.7.2 and above");
+// return;
+// }
+// }
+//#endif // Q_OS_SYMBIAN
+//
+// Qt::WidgetAttribute attribute;
+// switch (orientation) {
+//#if QT_VERSION < 0x040702
+// // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
+// case ScreenOrientationLockPortrait:
+// attribute = static_cast<Qt::WidgetAttribute>(128);
+// break;
+// case ScreenOrientationLockLandscape:
+// attribute = static_cast<Qt::WidgetAttribute>(129);
+// break;
+// default:
+// case ScreenOrientationAuto:
+// attribute = static_cast<Qt::WidgetAttribute>(130);
+// break;
+//#else // QT_VERSION < 0x040702
+// case ScreenOrientationLockPortrait:
+// attribute = Qt::WA_LockPortraitOrientation;
+// break;
+// case ScreenOrientationLockLandscape:
+// attribute = Qt::WA_LockLandscapeOrientation;
+// break;
+// default:
+// case ScreenOrientationAuto:
+// attribute = Qt::WA_AutoOrientation;
+// break;
+//#endif // QT_VERSION < 0x040702
+// };
+// setAttribute(attribute, true);
+}
+
+void QmlApplicationViewer::showExpanded()
+{
+#ifdef Q_OS_SYMBIAN
+ showFullScreen();
+#elif defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6)
+ showMaximized();
+#else
+ show();
+#endif
+}
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.h b/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.h
new file mode 100644
index 0000000000..01b2af0cf9
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmlapplicationviewer/qmlapplicationviewer.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// checksum 0x5a59 version 0x3000a
+/*
+ This file was generated by the Qt Quick Application wizard of Qt Creator.
+ QmlApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QMLAPPLICATIONVIEWER_H
+#define QMLAPPLICATIONVIEWER_H
+
+#include <QtDeclarative/QDeclarativeView>
+
+class QmlApplicationViewer : public QDeclarativeView
+{
+ Q_OBJECT
+
+public:
+ enum ScreenOrientation {
+ ScreenOrientationLockPortrait,
+ ScreenOrientationLockLandscape,
+ ScreenOrientationAuto
+ };
+
+ explicit QmlApplicationViewer(QWidget *parent = 0);
+ virtual ~QmlApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+ void setOrientation(ScreenOrientation orientation);
+ void showExpanded();
+
+private:
+ class QmlApplicationViewerPrivate *m_d;
+};
+
+#endif // QMLAPPLICATIONVIEWER_H
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmltest-Info.plist b/src/plugins/platforms/uikit/examples/qmltest/qmltest-Info.plist
new file mode 100644
index 0000000000..15665856b0
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmltest-Info.plist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+</dict>
+</plist>
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj b/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
new file mode 100755
index 0000000000..10bb20fcb9
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmltest.xcodeproj/project.pbxproj
@@ -0,0 +1,491 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
+ D316594E1338B29E00760B02 /* libQtXml_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D31659431338B21000760B02 /* libQtXml_debug.a */; };
+ D316594F1338B29E00760B02 /* libQtXmlPatterns_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */; };
+ D35784241345D8C90046D202 /* libQtOpenGL_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784231345D8C90046D202 /* libQtOpenGL_debug.a */; };
+ D35784261345D9940046D202 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784251345D9940046D202 /* OpenGLES.framework */; };
+ D35784281345D9E00046D202 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784271345D9E00046D202 /* QuartzCore.framework */; };
+ D3578436134A09990046D202 /* libQtOpenGL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3578435134A09990046D202 /* libQtOpenGL.a */; };
+ D3578439134A0AAE0046D202 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784251345D9940046D202 /* OpenGLES.framework */; };
+ D357843A134A0AB10046D202 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35784271345D9E00046D202 /* QuartzCore.framework */; };
+ D3CAA7C813264AAD008BB877 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7C713264AAD008BB877 /* main.mm */; };
+ D3CAA7E613264EA6008BB877 /* moc_qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */; };
+ D3CAA7E713264EA6008BB877 /* qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */; };
+ D3CAA7EC13264F52008BB877 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7C713264AAD008BB877 /* main.mm */; };
+ D3CAA7ED13264F52008BB877 /* moc_qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */; };
+ D3CAA7EE13264F52008BB877 /* qmlapplicationviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */; };
+ D3CAA7F013264F52008BB877 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ D3CAA7F113264F52008BB877 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ D3CAA7F213264F52008BB877 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
+ D3CAA7FA13264F8A008BB877 /* libz.1.2.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA7F913264F8A008BB877 /* libz.1.2.3.dylib */; };
+ D3CAA81113264FF0008BB877 /* libz.1.2.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA7F913264F8A008BB877 /* libz.1.2.3.dylib */; };
+ D3CAA81B13265056008BB877 /* libQtCore_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA81613265056008BB877 /* libQtCore_debug.a */; };
+ D3CAA81C13265056008BB877 /* libQtDeclarative_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA81713265056008BB877 /* libQtDeclarative_debug.a */; };
+ D3CAA81D13265056008BB877 /* libQtGui_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA81813265056008BB877 /* libQtGui_debug.a */; };
+ D3CAA81E13265056008BB877 /* libQtScript_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA81913265056008BB877 /* libQtScript_debug.a */; };
+ D3CAA81F13265056008BB877 /* libQtSql_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA81A13265056008BB877 /* libQtSql_debug.a */; };
+ D3CAA8211326507D008BB877 /* libquikit_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA8201326507D008BB877 /* libquikit_debug.a */; };
+ D3CAA82813265220008BB877 /* libQtNetwork_debug.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3CAA82713265220008BB877 /* libQtNetwork_debug.a */; };
+ D3CAA88A132652E5008BB877 /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = D3CAA836132652E5008BB877 /* fonts */; };
+ D3CAA88B132652E5008BB877 /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = D3CAA836132652E5008BB877 /* fonts */; };
+ D3CAA89113265310008BB877 /* qml in Resources */ = {isa = PBXBuildFile; fileRef = D3CAA88E13265310008BB877 /* qml */; };
+ D3CAA89213265310008BB877 /* qml in Resources */ = {isa = PBXBuildFile; fileRef = D3CAA88E13265310008BB877 /* qml */; };
+ D3D817B2132A2CFD00CDE422 /* libQtCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817AA132A2CFD00CDE422 /* libQtCore.a */; };
+ D3D817B3132A2CFD00CDE422 /* libQtDeclarative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817AB132A2CFD00CDE422 /* libQtDeclarative.a */; };
+ D3D817B4132A2CFD00CDE422 /* libQtGui.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817AC132A2CFD00CDE422 /* libQtGui.a */; };
+ D3D817B5132A2CFD00CDE422 /* libQtNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817AD132A2CFD00CDE422 /* libQtNetwork.a */; };
+ D3D817B6132A2CFD00CDE422 /* libQtScript.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817AE132A2CFD00CDE422 /* libQtScript.a */; };
+ D3D817B7132A2CFD00CDE422 /* libQtSql.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817AF132A2CFD00CDE422 /* libQtSql.a */; };
+ D3D817B8132A2CFD00CDE422 /* libQtXml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817B0132A2CFD00CDE422 /* libQtXml.a */; };
+ D3D817B9132A2CFD00CDE422 /* libQtXmlPatterns.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817B1132A2CFD00CDE422 /* libQtXmlPatterns.a */; };
+ D3D817BB132A2D0E00CDE422 /* libquikit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3D817BA132A2D0E00CDE422 /* libquikit.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1D6058910D05DD3D006BFB54 /* qmltest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = qmltest.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 32CA4F630368D1EE00C91783 /* qmltest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qmltest_Prefix.pch; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* qmltest-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "qmltest-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
+ D31659431338B21000760B02 /* libQtXml_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXml_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtXml_debug.a"; sourceTree = SOURCE_ROOT; };
+ D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXmlPatterns_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtXmlPatterns_debug.a"; sourceTree = SOURCE_ROOT; };
+ D35784231345D8C90046D202 /* libQtOpenGL_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtOpenGL_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtOpenGL_debug.a"; sourceTree = "<group>"; };
+ D35784251345D9940046D202 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+ D35784271345D9E00046D202 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ D3578435134A09990046D202 /* libQtOpenGL.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtOpenGL.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtOpenGL.a"; sourceTree = "<group>"; };
+ D3CAA7C713264AAD008BB877 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
+ D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = moc_qmlapplicationviewer.cpp; path = qmlapplicationviewer/moc_qmlapplicationviewer.cpp; sourceTree = "<group>"; };
+ D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qmlapplicationviewer.cpp; path = qmlapplicationviewer/qmlapplicationviewer.cpp; sourceTree = "<group>"; };
+ D3CAA7E513264EA6008BB877 /* qmlapplicationviewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qmlapplicationviewer.h; path = qmlapplicationviewer/qmlapplicationviewer.h; sourceTree = "<group>"; };
+ D3CAA7F613264F52008BB877 /* qmltest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = qmltest.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ D3CAA7F913264F8A008BB877 /* libz.1.2.3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.1.2.3.dylib; path = usr/lib/libz.1.2.3.dylib; sourceTree = SDKROOT; };
+ D3CAA81613265056008BB877 /* libQtCore_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtCore_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtCore_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA81713265056008BB877 /* libQtDeclarative_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtDeclarative_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtDeclarative_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA81813265056008BB877 /* libQtGui_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtGui_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtGui_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA81913265056008BB877 /* libQtScript_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtScript_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtScript_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA81A13265056008BB877 /* libQtSql_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtSql_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtSql_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA8201326507D008BB877 /* libquikit_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libquikit_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/plugins/platforms/libquikit_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA82713265220008BB877 /* libQtNetwork_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtNetwork_debug.a; path = "../../../../../../../qt-lighthouse-ios-simulator/lib/libQtNetwork_debug.a"; sourceTree = SOURCE_ROOT; };
+ D3CAA836132652E5008BB877 /* fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fonts; path = ../../../../../../lib/fonts; sourceTree = SOURCE_ROOT; };
+ D3CAA88E13265310008BB877 /* qml */ = {isa = PBXFileReference; lastKnownFileType = folder; path = qml; sourceTree = SOURCE_ROOT; };
+ D3D817AA132A2CFD00CDE422 /* libQtCore.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtCore.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtCore.a"; sourceTree = SOURCE_ROOT; };
+ D3D817AB132A2CFD00CDE422 /* libQtDeclarative.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtDeclarative.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtDeclarative.a"; sourceTree = SOURCE_ROOT; };
+ D3D817AC132A2CFD00CDE422 /* libQtGui.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtGui.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtGui.a"; sourceTree = SOURCE_ROOT; };
+ D3D817AD132A2CFD00CDE422 /* libQtNetwork.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtNetwork.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtNetwork.a"; sourceTree = SOURCE_ROOT; };
+ D3D817AE132A2CFD00CDE422 /* libQtScript.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtScript.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtScript.a"; sourceTree = SOURCE_ROOT; };
+ D3D817AF132A2CFD00CDE422 /* libQtSql.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtSql.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtSql.a"; sourceTree = SOURCE_ROOT; };
+ D3D817B0132A2CFD00CDE422 /* libQtXml.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXml.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtXml.a"; sourceTree = SOURCE_ROOT; };
+ D3D817B1132A2CFD00CDE422 /* libQtXmlPatterns.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQtXmlPatterns.a; path = "../../../../../../../qt-lighthouse-ios-device/lib/libQtXmlPatterns.a"; sourceTree = SOURCE_ROOT; };
+ D3D817BA132A2D0E00CDE422 /* libquikit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libquikit.a; path = "../../../../../../../qt-lighthouse-ios-device/plugins/platforms/libquikit.a"; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D35784281345D9E00046D202 /* QuartzCore.framework in Frameworks */,
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */,
+ D35784261345D9940046D202 /* OpenGLES.framework in Frameworks */,
+ D3CAA7FA13264F8A008BB877 /* libz.1.2.3.dylib in Frameworks */,
+ D3CAA81B13265056008BB877 /* libQtCore_debug.a in Frameworks */,
+ D3CAA81C13265056008BB877 /* libQtDeclarative_debug.a in Frameworks */,
+ D3CAA81D13265056008BB877 /* libQtGui_debug.a in Frameworks */,
+ D3CAA81E13265056008BB877 /* libQtScript_debug.a in Frameworks */,
+ D3CAA81F13265056008BB877 /* libQtSql_debug.a in Frameworks */,
+ D3CAA8211326507D008BB877 /* libquikit_debug.a in Frameworks */,
+ D3CAA82813265220008BB877 /* libQtNetwork_debug.a in Frameworks */,
+ D316594E1338B29E00760B02 /* libQtXml_debug.a in Frameworks */,
+ D316594F1338B29E00760B02 /* libQtXmlPatterns_debug.a in Frameworks */,
+ D35784241345D8C90046D202 /* libQtOpenGL_debug.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D3CAA7EF13264F52008BB877 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D357843A134A0AB10046D202 /* QuartzCore.framework in Frameworks */,
+ D3578439134A0AAE0046D202 /* OpenGLES.framework in Frameworks */,
+ D3CAA7F013264F52008BB877 /* Foundation.framework in Frameworks */,
+ D3CAA7F113264F52008BB877 /* UIKit.framework in Frameworks */,
+ D3CAA7F213264F52008BB877 /* CoreGraphics.framework in Frameworks */,
+ D3CAA81113264FF0008BB877 /* libz.1.2.3.dylib in Frameworks */,
+ D3D817B2132A2CFD00CDE422 /* libQtCore.a in Frameworks */,
+ D3D817B3132A2CFD00CDE422 /* libQtDeclarative.a in Frameworks */,
+ D3D817B4132A2CFD00CDE422 /* libQtGui.a in Frameworks */,
+ D3D817B5132A2CFD00CDE422 /* libQtNetwork.a in Frameworks */,
+ D3D817B6132A2CFD00CDE422 /* libQtScript.a in Frameworks */,
+ D3D817B7132A2CFD00CDE422 /* libQtSql.a in Frameworks */,
+ D3D817B8132A2CFD00CDE422 /* libQtXml.a in Frameworks */,
+ D3D817B9132A2CFD00CDE422 /* libQtXmlPatterns.a in Frameworks */,
+ D3D817BB132A2D0E00CDE422 /* libquikit.a in Frameworks */,
+ D3578436134A09990046D202 /* libQtOpenGL.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1D6058910D05DD3D006BFB54 /* qmltest.app */,
+ D3CAA7F613264F52008BB877 /* qmltest.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ D3CAA7E213264E8C008BB877 /* QMLApplicationViewer */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* qmltest_Prefix.pch */,
+ D3CAA7C713264AAD008BB877 /* main.mm */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ D3CAA88E13265310008BB877 /* qml */,
+ D3CAA836132652E5008BB877 /* fonts */,
+ 8D1107310486CEB800E47090 /* qmltest-Info.plist */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D3CAA81513265035008BB877 /* Simulator */,
+ D3CAA8141326500A008BB877 /* Device */,
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ 1D30AB110D05D00D00671497 /* Foundation.framework */,
+ 288765A40DF7441C002DB57D /* CoreGraphics.framework */,
+ D35784251345D9940046D202 /* OpenGLES.framework */,
+ D35784271345D9E00046D202 /* QuartzCore.framework */,
+ D3CAA7F913264F8A008BB877 /* libz.1.2.3.dylib */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ D3CAA7E213264E8C008BB877 /* QMLApplicationViewer */ = {
+ isa = PBXGroup;
+ children = (
+ D3CAA7E313264EA6008BB877 /* moc_qmlapplicationviewer.cpp */,
+ D3CAA7E413264EA6008BB877 /* qmlapplicationviewer.cpp */,
+ D3CAA7E513264EA6008BB877 /* qmlapplicationviewer.h */,
+ );
+ name = QMLApplicationViewer;
+ sourceTree = "<group>";
+ };
+ D3CAA8141326500A008BB877 /* Device */ = {
+ isa = PBXGroup;
+ children = (
+ D3D817BA132A2D0E00CDE422 /* libquikit.a */,
+ D3D817AA132A2CFD00CDE422 /* libQtCore.a */,
+ D3D817AB132A2CFD00CDE422 /* libQtDeclarative.a */,
+ D3D817AC132A2CFD00CDE422 /* libQtGui.a */,
+ D3D817AD132A2CFD00CDE422 /* libQtNetwork.a */,
+ D3578435134A09990046D202 /* libQtOpenGL.a */,
+ D3D817AE132A2CFD00CDE422 /* libQtScript.a */,
+ D3D817AF132A2CFD00CDE422 /* libQtSql.a */,
+ D3D817B0132A2CFD00CDE422 /* libQtXml.a */,
+ D3D817B1132A2CFD00CDE422 /* libQtXmlPatterns.a */,
+ );
+ name = Device;
+ sourceTree = "<group>";
+ };
+ D3CAA81513265035008BB877 /* Simulator */ = {
+ isa = PBXGroup;
+ children = (
+ D3CAA8201326507D008BB877 /* libquikit_debug.a */,
+ D3CAA81613265056008BB877 /* libQtCore_debug.a */,
+ D3CAA81713265056008BB877 /* libQtDeclarative_debug.a */,
+ D3CAA81813265056008BB877 /* libQtGui_debug.a */,
+ D3CAA82713265220008BB877 /* libQtNetwork_debug.a */,
+ D35784231345D8C90046D202 /* libQtOpenGL_debug.a */,
+ D3CAA81913265056008BB877 /* libQtScript_debug.a */,
+ D3CAA81A13265056008BB877 /* libQtSql_debug.a */,
+ D31659431338B21000760B02 /* libQtXml_debug.a */,
+ D31659441338B21000760B02 /* libQtXmlPatterns_debug.a */,
+ );
+ name = Simulator;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 1D6058900D05DD3D006BFB54 /* qmltest simulator */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "qmltest simulator" */;
+ buildPhases = (
+ 1D60588D0D05DD3D006BFB54 /* Resources */,
+ 1D60588E0D05DD3D006BFB54 /* Sources */,
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "qmltest simulator";
+ productName = qmltest;
+ productReference = 1D6058910D05DD3D006BFB54 /* qmltest.app */;
+ productType = "com.apple.product-type.application";
+ };
+ D3CAA7E813264F52008BB877 /* qmltest device */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = D3CAA7F313264F52008BB877 /* Build configuration list for PBXNativeTarget "qmltest device" */;
+ buildPhases = (
+ D3CAA7E913264F52008BB877 /* Resources */,
+ D3CAA7EB13264F52008BB877 /* Sources */,
+ D3CAA7EF13264F52008BB877 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "qmltest device";
+ productName = qmltest;
+ productReference = D3CAA7F613264F52008BB877 /* qmltest.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "qmltest" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 1D6058900D05DD3D006BFB54 /* qmltest simulator */,
+ D3CAA7E813264F52008BB877 /* qmltest device */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 1D60588D0D05DD3D006BFB54 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D3CAA88A132652E5008BB877 /* fonts in Resources */,
+ D3CAA89113265310008BB877 /* qml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D3CAA7E913264F52008BB877 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D3CAA88B132652E5008BB877 /* fonts in Resources */,
+ D3CAA89213265310008BB877 /* qml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 1D60588E0D05DD3D006BFB54 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D3CAA7C813264AAD008BB877 /* main.mm in Sources */,
+ D3CAA7E613264EA6008BB877 /* moc_qmlapplicationviewer.cpp in Sources */,
+ D3CAA7E713264EA6008BB877 /* qmlapplicationviewer.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ D3CAA7EB13264F52008BB877 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D3CAA7EC13264F52008BB877 /* main.mm in Sources */,
+ D3CAA7ED13264F52008BB877 /* moc_qmlapplicationviewer.cpp in Sources */,
+ D3CAA7EE13264F52008BB877 /* qmlapplicationviewer.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1D6058940D05DD3E006BFB54 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = qmltest_Prefix.pch;
+ HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-simulator/include\"/**";
+ INFOPLIST_FILE = "qmltest-Info.plist";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-simulator/lib\"",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-simulator/plugins/platforms\"",
+ );
+ PRODUCT_NAME = qmltest;
+ };
+ name = Debug;
+ };
+ 1D6058950D05DD3E006BFB54 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ COPY_PHASE_STRIP = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = qmltest_Prefix.pch;
+ HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-simulator/include\"/**";
+ INFOPLIST_FILE = "qmltest-Info.plist";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-simulator/lib\"",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-simulator/plugins/platforms\"",
+ );
+ PRODUCT_NAME = qmltest;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ PREBINDING = NO;
+ SDKROOT = iphoneos;
+ };
+ name = Release;
+ };
+ D3CAA7F413264F52008BB877 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = qmltest_Prefix.pch;
+ HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-device/include\"/**";
+ INFOPLIST_FILE = "qmltest-Info.plist";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-device/lib\"",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-device/plugins/platforms\"",
+ );
+ PRODUCT_NAME = qmltest;
+ };
+ name = Debug;
+ };
+ D3CAA7F513264F52008BB877 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
+ COPY_PHASE_STRIP = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = qmltest_Prefix.pch;
+ HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-device/include\"/**";
+ INFOPLIST_FILE = "qmltest-Info.plist";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-device/lib\"",
+ "\"$(SRCROOT)/../../../../../../../qt-lighthouse-ios-device/plugins/platforms\"",
+ );
+ PRODUCT_NAME = qmltest;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "qmltest simulator" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1D6058940D05DD3E006BFB54 /* Debug */,
+ 1D6058950D05DD3E006BFB54 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "qmltest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ D3CAA7F313264F52008BB877 /* Build configuration list for PBXNativeTarget "qmltest device" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ D3CAA7F413264F52008BB877 /* Debug */,
+ D3CAA7F513264F52008BB877 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/src/plugins/platforms/uikit/examples/qmltest/qmltest_Prefix.pch b/src/plugins/platforms/uikit/examples/qmltest/qmltest_Prefix.pch
new file mode 100644
index 0000000000..c06715c661
--- /dev/null
+++ b/src/plugins/platforms/uikit/examples/qmltest/qmltest_Prefix.pch
@@ -0,0 +1,8 @@
+//
+// Prefix header for all source files of the 'qmltest' target in the 'qmltest' project
+//
+
+#ifdef __OBJC__
+ #import <Foundation/Foundation.h>
+ #import <UIKit/UIKit.h>
+#endif
diff --git a/src/plugins/platforms/uikit/main.mm b/src/plugins/platforms/uikit/main.mm
new file mode 100644
index 0000000000..1ef69fa897
--- /dev/null
+++ b/src/plugins/platforms/uikit/main.mm
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <UIKit/UIKit.h>
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "quikitintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QUIKitIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "UIKit";
+ return list;
+}
+
+QPlatformIntegration * QUIKitIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "uikit")
+ return new QUIKitIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(UIKit, QUIKitIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikiteventloop.h b/src/plugins/platforms/uikit/quikiteventloop.h
new file mode 100644
index 0000000000..b81e0fd75c
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikiteventloop.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUIKITEVENTLOOP_H
+#define QUIKITEVENTLOOP_H
+
+#include "quikitsoftwareinputhandler.h"
+
+#include <QtCore/QEvent>
+#include <QtGui/QPlatformEventLoopIntegration>
+
+@class EventLoopHelper;
+@class NSTimer;
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitEventLoop : public QPlatformEventLoopIntegration
+{
+public:
+ QUIKitEventLoop();
+ ~QUIKitEventLoop();
+
+ void startEventLoop();
+ void quitEventLoop();
+ void qtNeedsToProcessEvents();
+
+ EventLoopHelper *mHelper;
+ NSTimer *mTimer;
+ QUIKitSoftwareInputHandler *mInputHandler;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/uikit/quikiteventloop.mm b/src/plugins/platforms/uikit/quikiteventloop.mm
new file mode 100644
index 0000000000..8d2603c60d
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikiteventloop.mm
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "quikiteventloop.h"
+#include "quikitwindow.h"
+#include "quikitwindowsurface.h"
+
+#include <UIKit/UIKit.h>
+
+#include <QtGui/QApplication>
+#include <QtGui/QWidget>
+#include <QtDebug>
+
+@interface QUIKitAppDelegate : NSObject <UIApplicationDelegate> {
+}
+@end
+
+@interface EventLoopHelper : NSObject {
+ QUIKitEventLoop *mIntegration;
+}
+
+- (id)initWithEventLoopIntegration:(QUIKitEventLoop *)integration;
+
+- (void)processEvents;
+- (void)processEventsAndSchedule;
+
+@end
+
+@implementation QUIKitAppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ Q_UNUSED(launchOptions)
+ foreach (QWidget *widget, qApp->topLevelWidgets()) {
+ QRect geom = widget->geometry();
+ CGRect bar = application.statusBarFrame;
+ if (geom.y() <= bar.size.height) {
+ geom.setY(bar.size.height);
+ widget->setGeometry(geom);
+ }
+ QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->platformWindow());
+ platformWindow->ensureNativeWindow();
+ }
+ return YES;
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ Q_UNUSED(application)
+ // TODO this isn't called for some reason
+ qDebug() << "quit";
+ qApp->quit();
+}
+
+@end
+
+@implementation EventLoopHelper
+
+- (id)initWithEventLoopIntegration:(QUIKitEventLoop *)integration
+{
+ if ((self = [self init])) {
+ mIntegration = integration;
+ }
+ return self;
+}
+
+- (void)processEvents
+{
+ QPlatformEventLoopIntegration::processEvents();
+}
+
+- (void)processEventsAndSchedule
+{
+ QPlatformEventLoopIntegration::processEvents();
+ qint64 nextTime = mIntegration->nextTimerEvent();
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ NSDate *nextDate = [[NSDate date] dateByAddingTimeInterval:((double)nextTime/1000)];
+ [mIntegration->mTimer setFireDate:nextDate];
+ [pool release];
+}
+
+@end
+
+QT_BEGIN_NAMESPACE
+
+QUIKitEventLoop::QUIKitEventLoop()
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ mInputHandler = new QUIKitSoftwareInputHandler;
+ mHelper = [[EventLoopHelper alloc] initWithEventLoopIntegration:this];
+ mTimer = [[NSTimer timerWithTimeInterval:0.030 target:mHelper selector:@selector(processEventsAndSchedule) userInfo:nil repeats:YES] retain];
+ [pool release];
+}
+
+QUIKitEventLoop::~QUIKitEventLoop()
+{
+ [mTimer release];
+ [mHelper release];
+ delete mInputHandler;
+}
+
+void QUIKitEventLoop::startEventLoop()
+{
+ qApp->installEventFilter(mInputHandler);
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ [[NSRunLoop currentRunLoop] addTimer:[mTimer autorelease] forMode:NSDefaultRunLoopMode];
+ UIApplicationMain(qApp->argc(), qApp->argv(), nil, @"QUIKitAppDelegate");
+ [pool release];
+}
+
+void QUIKitEventLoop::quitEventLoop()
+{
+
+}
+
+void QUIKitEventLoop::qtNeedsToProcessEvents()
+{
+ [mHelper performSelectorOnMainThread:@selector(processEvents) withObject:nil waitUntilDone:NO];
+}
+
+bool QUIKitSoftwareInputHandler::eventFilter(QObject *obj, QEvent *event)
+{
+ if (event->type() == QEvent::RequestSoftwareInputPanel) {
+ QWidget *widget = qobject_cast<QWidget *>(obj);
+ if (widget) {
+ QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->platformWindow());
+ [platformWindow->nativeView() becomeFirstResponder];
+ return true;
+ }
+ } else if (event->type() == QEvent::CloseSoftwareInputPanel) {
+ QWidget *widget = qobject_cast<QWidget *>(obj);
+ if (widget) {
+ QUIKitWindow *platformWindow = static_cast<QUIKitWindow *>(widget->platformWindow());
+ [platformWindow->nativeView() resignFirstResponder];
+ return true;
+ }
+ }
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitintegration.h b/src/plugins/platforms/uikit/quikitintegration.h
new file mode 100644
index 0000000000..a986e92b3f
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitintegration.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMINTEGRATION_UIKIT_H
+#define QPLATFORMINTEGRATION_UIKIT_H
+
+#include <QtGui/QPlatformIntegration>
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitIntegration : public QPlatformIntegration
+{
+public:
+ QUIKitIntegration();
+ ~QUIKitIntegration();
+
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const;
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+ QPlatformEventLoopIntegration *createEventLoopIntegration() const;
+
+private:
+ QList<QPlatformScreen *> mScreens;
+};
+
+QT_END_NAMESPACE
+
+#endif
+
diff --git a/src/plugins/platforms/uikit/quikitintegration.mm b/src/plugins/platforms/uikit/quikitintegration.mm
new file mode 100644
index 0000000000..d4b4192b60
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitintegration.mm
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "quikitintegration.h"
+#include "quikitwindow.h"
+#include "quikitwindowsurface.h"
+#include "quikitscreen.h"
+#include "quikiteventloop.h"
+
+#include <QtGui/QApplication>
+
+#include <private/qpixmap_raster_p.h>
+
+#include <UIKit/UIKit.h>
+
+#include <QtDebug>
+
+QT_BEGIN_NAMESPACE
+
+QUIKitIntegration::QUIKitIntegration()
+{
+ mScreens << new QUIKitScreen(0);
+}
+
+QUIKitIntegration::~QUIKitIntegration()
+{
+}
+
+QPixmapData *QUIKitIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QPlatformWindow *QUIKitIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QUIKitWindow(widget);
+}
+
+QList<QPlatformScreen *> QUIKitIntegration::screens() const
+{
+ return mScreens;
+}
+
+QWindowSurface *QUIKitIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QUIKitWindowSurface(widget);
+}
+
+QPlatformEventLoopIntegration *QUIKitIntegration::createEventLoopIntegration() const
+{
+ return new QUIKitEventLoop();
+}
+
+QPlatformFontDatabase * QUIKitIntegration::fontDatabase() const
+{
+ static bool initialized = false;
+ if (!initialized) {
+ initialized = true;
+ setenv("QT_QPA_FONTDIR",[[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"fonts"] UTF8String],1);
+ }
+ return QPlatformIntegration::fontDatabase();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitscreen.h b/src/plugins/platforms/uikit/quikitscreen.h
new file mode 100644
index 0000000000..15c7d694d8
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitscreen.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUIKITSCREEN_H
+#define QUIKITSCREEN_H
+
+#include <UIKit/UIKit.h>
+
+#include <QtGui/QPlatformScreen>
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitScreen : public QPlatformScreen
+{
+public:
+ QUIKitScreen(int screenIndex);
+ ~QUIKitScreen();
+
+ QRect geometry() const { return m_geometry; }
+ int depth() const { return m_depth; }
+ QImage::Format format() const { return m_format; }
+ QSize physicalSize() const { return m_physicalSize; }
+
+ UIScreen *uiScreen() const;
+
+private:
+ QRect m_geometry;
+ int m_depth;
+ QImage::Format m_format;
+ QSize m_physicalSize;
+ int m_index;
+};
+
+QT_END_NAMESPACE
+
+
+#endif
diff --git a/src/plugins/platforms/uikit/quikitscreen.mm b/src/plugins/platforms/uikit/quikitscreen.mm
new file mode 100644
index 0000000000..21494c9385
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitscreen.mm
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "quikitscreen.h"
+
+#include <QtGui/QApplication>
+
+#include <QtDebug>
+
+QT_BEGIN_NAMESPACE
+
+QUIKitScreen::QUIKitScreen(int screenIndex)
+ : QPlatformScreen(),
+ m_index(screenIndex)
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ UIScreen *screen = [[UIScreen screens] objectAtIndex:screenIndex];
+ CGRect bounds = [screen bounds];
+ m_geometry = QRect(0, 0, bounds.size.width, bounds.size.height);
+
+ m_format = QImage::Format_ARGB32;
+
+ m_depth = 24;
+
+ const qreal inch = 25.4;
+ qreal dpi = 160.;
+ int dragDistance = 14;
+ if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
+ dpi = 132.;
+ dragDistance = 10;
+ }
+ m_physicalSize = QSize(qRound(bounds.size.width * inch / dpi), qRound(bounds.size.height * inch / dpi));
+ qApp->setStartDragDistance(dragDistance);
+ [pool release];
+}
+
+QUIKitScreen::~QUIKitScreen()
+{
+}
+
+UIScreen *QUIKitScreen::uiScreen() const
+{
+ return [[UIScreen screens] objectAtIndex:m_index];
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h b/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
new file mode 100644
index 0000000000..629fd13815
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitsoftwareinputhandler.h
@@ -0,0 +1,61 @@
+
+
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUIKITSOFTWAREINPUTHANDLER_H
+#define QUIKITSOFTWAREINPUTHANDLER_H
+
+#include <QtCore/QObject>
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitSoftwareInputHandler : public QObject
+{
+ Q_OBJECT
+
+public:
+ bool eventFilter(QObject *obj, QEvent *event);
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/uikit/quikitwindow.h b/src/plugins/platforms/uikit/quikitwindow.h
new file mode 100644
index 0000000000..9e73754fc8
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitwindow.h
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUIKITWINDOW_H
+#define QUIKITWINDOW_H
+
+#include <QPlatformWindow>
+
+#import <UIKit/UIKit.h>
+#import <OpenGLES/ES1/gl.h>
+#import <OpenGLES/ES1/glext.h>
+#import <OpenGLES/EAGL.h>
+
+@interface EAGLView : UIView <UIKeyInput>
+{
+ QPlatformWindow *mWindow;
+ EAGLContext *mContext;
+
+ GLint mFramebufferWidth;
+ GLint mFramebufferHeight;
+
+ GLuint mFramebuffer, mColorRenderbuffer, mDepthRenderbuffer;
+
+ // ------- Text Input ----------
+ UITextAutocapitalizationType autocapitalizationType;
+ UITextAutocorrectionType autocorrectionType;
+ BOOL enablesReturnKeyAutomatically;
+ UIKeyboardAppearance keyboardAppearance;
+ UIKeyboardType keyboardType;
+ UIReturnKeyType returnKeyType;
+ BOOL secureTextEntry;
+}
+
+- (void)setContext:(EAGLContext *)newContext;
+- (void)presentFramebuffer;
+- (void)deleteFramebuffer;
+- (void)createFramebuffer;
+- (void)makeCurrent;
+- (void)setWindow:(QPlatformWindow *)window;
+- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons;
+
+
+// ------- Text Input ----------
+
+@property(nonatomic) UITextAutocapitalizationType autocapitalizationType;
+@property(nonatomic) UITextAutocorrectionType autocorrectionType;
+@property(nonatomic) BOOL enablesReturnKeyAutomatically;
+@property(nonatomic) UIKeyboardAppearance keyboardAppearance;
+@property(nonatomic) UIKeyboardType keyboardType;
+@property(nonatomic) UIReturnKeyType returnKeyType;
+@property(nonatomic, getter=isSecureTextEntry) BOOL secureTextEntry;
+
+@end
+
+class EAGLPlatformContext;
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitScreen;
+
+class QUIKitWindow : public QPlatformWindow
+{
+public:
+ explicit QUIKitWindow(QWidget *tlw);
+ ~QUIKitWindow();
+
+ UIWindow *nativeWindow() const { return mWindow; }
+ UIView *nativeView() const { return mView; }
+ void setGeometry(const QRect &rect);
+
+ UIWindow *ensureNativeWindow();
+
+ QPlatformGLContext *glContext() const;
+
+private:
+ QUIKitScreen *mScreen;
+ UIWindow *mWindow;
+ EAGLView *mView;
+ mutable EAGLPlatformContext *mContext;
+};
+
+QT_END_NAMESPACE
+
+#endif // QUIKITWINDOW_H
diff --git a/src/plugins/platforms/uikit/quikitwindow.mm b/src/plugins/platforms/uikit/quikitwindow.mm
new file mode 100644
index 0000000000..52d184636e
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitwindow.mm
@@ -0,0 +1,375 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#import <QuartzCore/CAEAGLLayer.h>
+
+#include "quikitwindow.h"
+
+#include "quikitscreen.h"
+
+#include <QtDebug>
+#include <QtGui/QApplication>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QWindowSystemInterface>
+
+#include <QtDebug>
+
+class EAGLPlatformContext : public QPlatformGLContext
+{
+public:
+ EAGLPlatformContext(EAGLView *view)
+ : mView(view)
+ {
+ mFormat.setWindowApi(QPlatformWindowFormat::OpenGL);
+ mFormat.setDepthBufferSize(24);
+ mFormat.setAccumBufferSize(0);
+ mFormat.setRedBufferSize(8);
+ mFormat.setGreenBufferSize(8);
+ mFormat.setBlueBufferSize(8);
+ mFormat.setAlphaBufferSize(8);
+ mFormat.setStencilBufferSize(8);
+ mFormat.setSampleBuffers(false);
+ mFormat.setSamples(1);
+// mFormat.setSwapInterval(?)
+ mFormat.setDoubleBuffer(true);
+ mFormat.setDepth(true);
+ mFormat.setRgba(true);
+ mFormat.setAlpha(true);
+ mFormat.setAccum(false);
+ mFormat.setStencil(true);
+ mFormat.setStereo(false);
+ mFormat.setDirectRendering(false);
+
+ EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
+ [mView setContext:aContext];
+ }
+
+ ~EAGLPlatformContext() { }
+
+ void makeCurrent()
+ {
+ QPlatformGLContext::makeCurrent();
+ [mView makeCurrent];
+ }
+
+ void doneCurrent()
+ {
+ QPlatformGLContext::doneCurrent();
+ }
+
+ void swapBuffers()
+ {
+ [mView presentFramebuffer];
+ }
+
+ void* getProcAddress(const QString& ) { return 0; }
+
+ QPlatformWindowFormat platformWindowFormat() const
+ {
+ return mFormat;
+ }
+
+private:
+ EAGLView *mView;
+
+ QPlatformWindowFormat mFormat;
+};
+
+@implementation EAGLView
+
++ (Class)layerClass
+{
+ return [CAEAGLLayer class];
+}
+
+- (id)initWithFrame:(CGRect)frame
+{
+ if ((self = [super initWithFrame:frame])) {
+ CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
+ eaglLayer.opaque = TRUE;
+ eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
+ kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
+ nil];
+ autocapitalizationType = UITextAutocapitalizationTypeNone;
+ autocorrectionType = UITextAutocorrectionTypeNo;
+ enablesReturnKeyAutomatically = NO;
+ keyboardAppearance = UIKeyboardAppearanceDefault;
+ keyboardType = UIKeyboardTypeDefault;
+ returnKeyType = UIReturnKeyDone;
+ secureTextEntry = NO;
+ }
+ return self;
+}
+
+- (void)setContext:(EAGLContext *)newContext
+{
+ if (mContext != newContext)
+ {
+ [self deleteFramebuffer];
+ [mContext release];
+ mContext = [newContext retain];
+ [EAGLContext setCurrentContext:nil];
+ }
+}
+
+- (void)presentFramebuffer
+{
+ if (mContext) {
+ [EAGLContext setCurrentContext:mContext];
+ glBindRenderbufferOES(GL_RENDERBUFFER_OES, mColorRenderbuffer);
+ [mContext presentRenderbuffer:GL_RENDERBUFFER_OES];
+ }
+}
+
+- (void)deleteFramebuffer
+{
+ if (mContext)
+ {
+ [EAGLContext setCurrentContext:mContext];
+ if (mFramebuffer) {
+ glDeleteFramebuffersOES(1, &mFramebuffer);
+ mFramebuffer = 0;
+ }
+ if (mColorRenderbuffer) {
+ glDeleteRenderbuffersOES(1, &mColorRenderbuffer);
+ mColorRenderbuffer = 0;
+ }
+ if (mDepthRenderbuffer) {
+ glDeleteRenderbuffersOES(1, &mDepthRenderbuffer);
+ mDepthRenderbuffer = 0;
+ }
+ }
+}
+
+- (void)createFramebuffer
+{
+ if (mContext && !mFramebuffer)
+ {
+ [EAGLContext setCurrentContext:mContext];
+ glGenFramebuffersOES(1, &mFramebuffer);
+ glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFramebuffer);
+
+ glGenRenderbuffersOES(1, &mColorRenderbuffer);
+ glBindRenderbufferOES(GL_RENDERBUFFER_OES, mColorRenderbuffer);
+ [mContext renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer];
+ glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &mFramebufferWidth);
+ glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &mFramebufferHeight);
+ glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, mColorRenderbuffer);
+
+ glGenRenderbuffersOES(1, &mDepthRenderbuffer);
+ glBindRenderbufferOES(GL_RENDERBUFFER_OES, mDepthRenderbuffer);
+ glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, mFramebufferWidth, mFramebufferHeight);
+ glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, mDepthRenderbuffer);
+ glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, mDepthRenderbuffer);
+
+ if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
+ NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
+ }
+}
+
+- (void)makeCurrent
+{
+ if (mContext)
+ {
+ [EAGLContext setCurrentContext:mContext];
+ if (!mFramebuffer)
+ [self createFramebuffer];
+ glBindFramebufferOES(GL_FRAMEBUFFER_OES, mFramebuffer);
+ glViewport(0, 0, mFramebufferWidth, mFramebufferHeight);
+ }
+}
+
+- (void)setWindow:(QPlatformWindow *)window
+{
+ mWindow = window;
+}
+
+- (void)sendMouseEventForTouches:(NSSet *)touches withEvent:(UIEvent *)event fakeButtons:(Qt::MouseButtons)buttons
+{
+ UITouch *touch = [touches anyObject];
+ CGPoint locationInView = [touch locationInView:self];
+ QPoint p(locationInView.x, locationInView.y);
+ // TODO handle global touch point? for status bar?
+ QWindowSystemInterface::handleMouseEvent(mWindow->widget(), (ulong)(event.timestamp*1000),
+ p, p, buttons);
+}
+
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
+}
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::LeftButton];
+}
+
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
+}
+
+- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [self sendMouseEventForTouches:touches withEvent:event fakeButtons:Qt::NoButton];
+}
+
+// ------- Text Input ----------
+
+@synthesize autocapitalizationType;
+@synthesize autocorrectionType;
+@synthesize enablesReturnKeyAutomatically;
+@synthesize keyboardAppearance;
+@synthesize keyboardType;
+@synthesize returnKeyType;
+@synthesize secureTextEntry;
+
+- (BOOL)canBecomeFirstResponder
+{
+ return YES;
+}
+
+- (BOOL)hasText
+{
+ return YES;
+}
+
+- (void)insertText:(NSString *)text
+{
+ QKeyEvent *ev;
+ int key = 0;
+ if ([text isEqualToString:@"\n"])
+ key = (int)Qt::Key_Return;
+ ev = new QKeyEvent(QEvent::KeyPress,
+ key,
+ Qt::NoModifier,
+ QString::fromUtf8([text UTF8String])
+ );
+ qApp->postEvent(qApp->focusWidget(), ev);
+ ev = new QKeyEvent(QEvent::KeyRelease,
+ key,
+ Qt::NoModifier,
+ QString::fromUtf8([text UTF8String])
+ );
+ qApp->postEvent(qApp->focusWidget(), ev);
+}
+
+- (void)deleteBackward
+{
+ QKeyEvent *ev;
+ ev = new QKeyEvent(QEvent::KeyPress,
+ (int)Qt::Key_Backspace,
+ Qt::NoModifier
+ );
+ qApp->postEvent(qApp->focusWidget(), ev);
+ ev = new QKeyEvent(QEvent::KeyRelease,
+ (int)Qt::Key_Backspace,
+ Qt::NoModifier
+ );
+ qApp->postEvent(qApp->focusWidget(), ev);
+}
+
+@end
+
+QT_BEGIN_NAMESPACE
+
+QUIKitWindow::QUIKitWindow(QWidget *tlw) :
+ QPlatformWindow(tlw),
+ mWindow(nil),
+ mContext(0)
+{
+ mScreen = static_cast<QUIKitScreen *>(QPlatformScreen::platformScreenForWidget(tlw));
+ CGRect screenBounds = [mScreen->uiScreen() bounds];
+ QRect geom(screenBounds.origin.x, screenBounds.origin.y, screenBounds.size.width, screenBounds.size.height);
+ setGeometry(geom);
+ // TODO ensure the native window if the application is already running
+}
+
+QUIKitWindow::~QUIKitWindow()
+{
+ delete mContext; mContext = 0;
+ [mView release];
+ [mWindow release];
+}
+
+void QUIKitWindow::setGeometry(const QRect &rect)
+{
+ if (mWindow) {
+ mWindow.frame = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
+ mView.frame = CGRectMake(0, 0, rect.width(), rect.height());
+ [mView deleteFramebuffer];
+ [mWindow setNeedsDisplay];
+ }
+ QPlatformWindow::setGeometry(rect);
+}
+
+UIWindow *QUIKitWindow::ensureNativeWindow()
+{
+ if (!mWindow) {
+ // window
+ QRect geom = geometry();
+ CGRect frame = CGRectMake(geom.x(), geom.y(), geom.width(), geom.height());
+ mWindow = [[UIWindow alloc] initWithFrame:frame];
+ mWindow.screen = mScreen->uiScreen();
+ mWindow.frame = frame; // for some reason setting the screen resets frame.origin
+
+ // view
+ mView = [[EAGLView alloc] initWithFrame:CGRectMake(0, 0, geom.width(), geom.height())];
+ [mView setMultipleTouchEnabled:YES];
+ [mView setWindow:this];
+ [mWindow addSubview:mView];
+ [mWindow setNeedsDisplay];
+ [mWindow makeKeyAndVisible];
+ }
+ return mWindow;
+}
+
+QPlatformGLContext *QUIKitWindow::glContext() const
+{
+ if (!mContext) {
+ mContext = new EAGLPlatformContext(mView);
+ }
+ return mContext;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.h b/src/plugins/platforms/uikit/quikitwindowsurface.h
new file mode 100644
index 0000000000..ca10a710eb
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QUIKITWINDOWSURFACE_H
+#define QUIKITWINDOWSURFACE_H
+
+#include <QtGui/QPlatformIntegration>
+
+QT_BEGIN_NAMESPACE
+
+class QUIKitWindowSurface : public QWindowSurface
+{
+public:
+ QUIKitWindowSurface(QWidget *window);
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ WindowSurfaceFeatures features() const;
+
+private:
+ QPaintDevice *mPaintDevice;
+};
+
+QT_END_NAMESPACE
+
+#endif // QUIKITWINDOWSURFACE_H
diff --git a/src/plugins/platforms/uikit/quikitwindowsurface.mm b/src/plugins/platforms/uikit/quikitwindowsurface.mm
new file mode 100644
index 0000000000..bb7dcd794b
--- /dev/null
+++ b/src/plugins/platforms/uikit/quikitwindowsurface.mm
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "quikitwindowsurface.h"
+#include "quikitwindow.h"
+
+#include <QtOpenGL/private/qgl_p.h>
+#include <QtOpenGL/private/qglpaintdevice_p.h>
+
+#include <QtDebug>
+
+class EAGLPaintDevice : public QGLPaintDevice
+{
+public:
+ EAGLPaintDevice(QPlatformWindow *window)
+ :QGLPaintDevice(), mWindow(window)
+ {
+ }
+
+ int devType() const { return QInternal::OpenGL; }
+ QSize size() const { return mWindow->geometry().size(); }
+ QGLContext* context() const { return QGLContext::fromPlatformGLContext(mWindow->glContext()); }
+
+ QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); }
+
+ void beginPaint(){
+ QGLPaintDevice::beginPaint();
+ }
+private:
+ QPlatformWindow *mWindow;
+};
+
+QT_BEGIN_NAMESPACE
+
+QUIKitWindowSurface::QUIKitWindowSurface(QWidget *window)
+ : QWindowSurface(window), mPaintDevice(new EAGLPaintDevice(window->platformWindow()))
+{
+}
+
+QPaintDevice *QUIKitWindowSurface::paintDevice()
+{
+ return mPaintDevice;
+}
+
+void QUIKitWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+ widget->platformWindow()->glContext()->swapBuffers();
+}
+
+QWindowSurface::WindowSurfaceFeatures QUIKitWindowSurface::features() const
+{
+ return PartialUpdates;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/uikit/uikit.pro b/src/plugins/platforms/uikit/uikit.pro
new file mode 100644
index 0000000000..6f5947f2c0
--- /dev/null
+++ b/src/plugins/platforms/uikit/uikit.pro
@@ -0,0 +1,27 @@
+TARGET = quikit
+include(../../qpluginbase.pri)
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+QT += opengl
+
+OBJECTIVE_SOURCES = main.mm \
+ quikitintegration.mm \
+ quikitwindow.mm \
+ quikitscreen.mm \
+ quikiteventloop.mm \
+ quikitwindowsurface.mm
+
+OBJECTIVE_HEADERS = quikitintegration.h \
+ quikitwindow.h \
+ quikitscreen.h \
+ quikiteventloop.h \
+ quikitwindowsurface.h
+
+HEADERS = quikitsoftwareinputhandler.h
+
+#add libz for freetype.
+LIBS += -lz
+
+#include(../fontdatabases/basicunix/basicunix.pri)
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/vnc/main.cpp b/src/plugins/platforms/vnc/main.cpp
new file mode 100644
index 0000000000..890b8f86ad
--- /dev/null
+++ b/src/plugins/platforms/vnc/main.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qvncintegration.h"
+#include <qstringlist.h>
+#include <QtGui/QPlatformIntegrationPlugin>
+
+QT_BEGIN_NAMESPACE
+
+class QVNCIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList &);
+};
+
+QStringList QVNCIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "VNC";
+ return list;
+}
+
+QPlatformIntegration* QVNCIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "vnc")
+ return new QVNCIntegration(paramList);
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(vnc, QVNCIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/vnc/qvnccursor.cpp b/src/plugins/platforms/vnc/qvnccursor.cpp
new file mode 100644
index 0000000000..dbcdef3ddd
--- /dev/null
+++ b/src/plugins/platforms/vnc/qvnccursor.cpp
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QPainter>
+#include <QTcpSocket>
+#include <arpa/inet.h>
+#include <QBitmap>
+#include <QApplication>
+
+#include <QDebug>
+
+#include "qvnccursor.h"
+#include "qvncserver.h"
+#include "qvncintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+QVNCCursor::QVNCCursor(QVNCServer * srvr, QVNCScreen *scr )
+ :QPlatformSoftwareCursor(scr), useVncCursor(false), server(srvr)
+{
+}
+
+void QVNCCursor::changeCursor(QCursor * widgetCursor, QWidget * widget)
+{
+ QPlatformSoftwareCursor::changeCursor(widgetCursor, widget);
+ if (useVncCursor) {
+ server->setDirtyCursor();
+ } else {
+ setDirty();
+ }
+}
+
+void QVNCCursor::setCursorMode(bool vnc)
+{
+ if (vnc) {
+ setDirty();
+ server->setDirtyCursor();
+ } else {
+ server->setDirtyCursor();
+ }
+ useVncCursor = vnc;
+}
+
+QRect QVNCCursor::drawCursor(QPainter & painter)
+{
+ if (useVncCursor)
+ return QRect();
+
+ return QPlatformSoftwareCursor::drawCursor(painter);
+}
+
+void QVNCCursor::clearClientCursor()
+{
+ QTcpSocket *socket = server->clientSocket();
+ if (!socket) {
+ return;
+ }
+ // FramebufferUpdate header
+ {
+ const quint16 tmp[6] = { htons(0),
+ htons(1),
+ htons(0), htons(0),
+ htons(0),
+ htons(0) };
+ socket->write((char*)tmp, sizeof(tmp));
+
+ const quint32 encoding = htonl(-239);
+ socket->write((char*)(&encoding), sizeof(encoding));
+ }
+}
+
+void QVNCCursor::sendClientCursor()
+{
+ if (useVncCursor == false) {
+ clearClientCursor();
+ return;
+ }
+ QImage *image = graphic->image();
+ if (image->isNull())
+ return;
+ QTcpSocket *socket = server->clientSocket();
+ if (!socket) {
+ return;
+ }
+ // FramebufferUpdate header
+ {
+ const quint16 tmp[6] = { htons(0),
+ htons(1),
+ htons(graphic->hotspot().x()), htons(graphic->hotspot().y()),
+ htons(image->width()),
+ htons(image->height()) };
+ socket->write((char*)tmp, sizeof(tmp));
+
+ const quint32 encoding = htonl(-239);
+ socket->write((char*)(&encoding), sizeof(encoding));
+ }
+
+ // write pixels
+ //Q_ASSERT(cursor->hasAlphaChannel());
+ const QImage img = image->convertToFormat(QImage::Format_RGB32);
+ const int n = server->clientBytesPerPixel() * img.width();
+ char *buffer = new char[n];
+ for (int i = 0; i < img.height(); ++i) {
+ server->convertPixels(buffer, (const char*)img.scanLine(i), img.width());
+ socket->write(buffer, n);
+ }
+ delete[] buffer;
+
+ // write mask
+ const QImage bitmap = image->createAlphaMask().convertToFormat(QImage::Format_Mono);
+ Q_ASSERT(bitmap.depth() == 1);
+ Q_ASSERT(bitmap.size() == img.size());
+ const int width = (bitmap.width() + 7) / 8;
+ for (int i = 0; i < bitmap.height(); ++i)
+ socket->write((const char*)bitmap.scanLine(i), width);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/vnc/qvnccursor.h b/src/plugins/platforms/vnc/qvnccursor.h
new file mode 100644
index 0000000000..8eb26e08bf
--- /dev/null
+++ b/src/plugins/platforms/vnc/qvnccursor.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QVNCCURSOR_H
+#define QVNCCURSOR_H
+
+#include "../fb_base/fb_base.h"
+#include <QList>
+#include <QImage>
+#include <QMouseEvent>
+
+QT_BEGIN_NAMESPACE
+
+class QVNCScreen;
+class QVNCServer;
+
+class QVNCCursor : public QPlatformSoftwareCursor {
+public:
+ QVNCCursor(QVNCServer *, QVNCScreen *);
+
+ // input methods
+ void setCursorMode(bool vnc);
+ void changeCursor(QCursor * widgetCursor, QWidget * widget);
+
+ // output methods
+ QRect drawCursor(QPainter &);
+
+ // VNC client communication
+ void sendClientCursor();
+ void clearClientCursor();
+private:
+ bool useVncCursor; // VNC or local
+
+ QVNCServer * server; // VNC server to get events from
+};
+
+QT_END_NAMESPACE
+
+#endif // QVNCCURSOR_H
diff --git a/src/plugins/platforms/vnc/qvncintegration.cpp b/src/plugins/platforms/vnc/qvncintegration.cpp
new file mode 100644
index 0000000000..b99ff3f2f2
--- /dev/null
+++ b/src/plugins/platforms/vnc/qvncintegration.cpp
@@ -0,0 +1,251 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qvncintegration.h"
+#include "../fb_base/fb_base.h"
+#include <private/qapplication_p.h>
+#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtCore/qdebug.h>
+
+#include <qvncserver.h>
+#include <QtGui/QPainter>
+
+#include <QtCore/QTimer>
+#include "qgenericunixfontdatabase.h"
+
+QVNCScreen::QVNCScreen(QRect screenSize, int screenId)
+ : QFbScreen::QFbScreen()
+{
+ setGeometry(screenSize);
+ setDepth(32);
+ setFormat(QImage::Format_RGB32);
+ setPhysicalSize((geometry().size()*254)/720);
+
+
+ d_ptr = new QVNCScreenPrivate(this, screenId);
+
+ cursor = new QVNCCursor(d_ptr->vncServer, this);
+ d_ptr->vncServer->setCursor(static_cast<QVNCCursor *>(cursor));
+}
+
+QVNCDirtyMap *QVNCScreen::dirtyMap()
+{
+ return d_ptr->dirty;
+}
+
+QRegion QVNCScreen::doRedraw()
+{
+ QRegion touched;
+ touched = QFbScreen::doRedraw();
+
+ QVector<QRect> rects = touched.rects();
+ for (int i = 0; i < rects.size(); i++)
+ d_ptr->setDirty(rects[i]);
+ return touched;
+}
+
+static inline int defaultWidth() { return 800; }
+static inline int defaultHeight() { return 600; }
+static inline int defaultDisplay() { return 0; }
+
+static void usage()
+{
+ qWarning() << "VNC Platform Integration options:";
+ qWarning() << " size=<Width>x<Height> - set the display width and height";
+ qWarning() << " defaults to" << defaultWidth() << "x" << defaultHeight();
+ qWarning() << " display=<ID> - set the VNC display port to ID + 5900";
+ qWarning() << " defaults to" << defaultDisplay();
+ qWarning() << " offset=<X>x<Y> - set the current screens offset";
+ qWarning() << " vnc - start configuration of a new screen";
+ qWarning() << " size and offset are inherited from the previous screen if not set";
+ qWarning() << " display id is incremented from the previous screen if not set";
+ qWarning() << " virtual - manage the set of screens as a virtual desktop";
+}
+
+QVNCIntegration::QVNCIntegration(const QStringList& paramList)
+ : virtualDesktop(false), fontDb(new QGenericUnixFontDatabase())
+{
+ int sizeX = defaultWidth();
+ int sizeY = defaultHeight();
+ int offsetX = 0;
+ int offsetY = 0;
+ int display = defaultDisplay();
+ bool showUsage = false;
+
+ foreach(QString confString, paramList) {
+ if (confString.startsWith(QLatin1String("size="))) {
+ QString val = confString.section(QLatin1Char('='), 1, 1);
+ sizeX = val.section(QLatin1Char('x'), 0, 0).toInt();
+ sizeY = val.section(QLatin1Char('x'), 1, 1).toInt();
+ }
+ else if (confString.startsWith(QLatin1String("display="))) {
+ display = confString.section(QLatin1Char('='), 1, 1).toInt();
+ }
+ else if (confString.startsWith(QLatin1String("offset="))) {
+ QString val = confString.section(QLatin1Char('='), 1, 1);
+ offsetX = val.section(QLatin1Char('x'), 0, 0).toInt();
+ offsetY = val.section(QLatin1Char('x'), 1, 1).toInt();
+ }
+ else if (confString == QLatin1String("vnc")) {
+ QRect screenRect(offsetX, offsetY, sizeX, sizeY);
+ QVNCScreen *screen = new QVNCScreen(screenRect, display);
+ mScreens.append(screen);
+ screen->setObjectName(QString("screen %1").arg(display));
+ screen->setDirty(screenRect);
+ ++display;
+ }
+ else if (confString == QLatin1String("virtual")) {
+ virtualDesktop = true;
+ }
+ else {
+ qWarning() << "Unknown VNC option:" << confString;
+ showUsage = true;
+ }
+ }
+
+ if (showUsage)
+ usage();
+
+ QRect screenRect(offsetX, offsetY, sizeX, sizeY);
+ QVNCScreen *screen = new QVNCScreen(screenRect, display);
+ mScreens.append(screen);
+ mPrimaryScreen = qobject_cast<QVNCScreen *>(mScreens.first());
+ screen->setObjectName(QString("screen %1").arg(display));
+ screen->setDirty(screenRect);
+}
+
+bool QVNCIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+
+QPixmapData *QVNCIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QWindowSurface *QVNCIntegration::createWindowSurface(QWidget *widget, WId) const
+{
+ QFbWindowSurface * surface;
+ surface = new QFbWindowSurface(mPrimaryScreen, widget);
+ return surface;
+}
+
+
+QPlatformWindow *QVNCIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const
+{
+ QFbWindow *w = new QFbWindow(widget);
+ if (virtualDesktop) {
+ QList<QPlatformScreen *>::const_iterator i = mScreens.constBegin();
+ QList<QPlatformScreen *>::const_iterator end = mScreens.constEnd();
+ QFbScreen *screen;
+ while (i != end) {
+ screen = static_cast<QFbScreen *>(*i);
+ screen->addWindow(w);
+ ++i;
+ }
+ }
+ else
+ mPrimaryScreen->addWindow(w);
+ return w;
+}
+
+QPixmap QVNCIntegration::grabWindow(WId window, int x, int y, int width, int height) const
+{
+// qDebug() << "QVNCIntegration::grabWindow" << window << x << y << width << height;
+
+ if (window == 0) { //desktop
+ QImage *desktopImage = mPrimaryScreen->image();
+ if (x==0 && y == 0 && width < 0 && height < 0) {
+ return QPixmap::fromImage(*desktopImage);
+ }
+ if (width < 0)
+ width = desktopImage->width() - x;
+ if (height < 0)
+ height = desktopImage->height() - y;
+ int bytesPerPixel = desktopImage->depth()/8; //We don't support 1, 2, or 4 bpp
+ QImage img(desktopImage->scanLine(y) + bytesPerPixel*x, width, height, desktopImage->bytesPerLine(), desktopImage->format());
+ return QPixmap::fromImage(img);
+ }
+ QWidget *win = QWidget::find(window);
+ if (win) {
+ QRect r = win->geometry();
+ if (width < 0)
+ width = r.width() - x;
+ if (height < 0)
+ height = r.height() - y;
+ QImage *desktopImage = mPrimaryScreen->image();
+ int bytesPerPixel = desktopImage->depth()/8; //We don't support 1, 2, or 4 bpp
+
+ QImage img(desktopImage->scanLine(r.top() + y) + bytesPerPixel*(r.left()+x), width, height, desktopImage->bytesPerLine(), desktopImage->format());
+ return QPixmap::fromImage(img);
+ }
+ return QPixmap();
+}
+
+
+void QVNCIntegration::moveToScreen(QWidget *window, int screen)
+{
+ if (virtualDesktop) { // all windows exist on all screens in virtual desktop mode
+ return;
+ }
+ if (screen < 0 || screen > mScreens.size())
+ return;
+ QVNCScreen * newScreen = qobject_cast<QVNCScreen *>(mScreens.at(screen));
+ for(int i = 0; i < mScreens.size(); i++) {
+ QVNCScreen *oldScreen = qobject_cast<QVNCScreen *>(mScreens.at(i));
+ if (oldScreen->windowStack.contains(static_cast<QFbWindow *>(window->platformWindow()))) {
+ oldScreen->removeWindow(static_cast<QFbWindow *>(window->platformWindow()));
+ break;
+ }
+ }
+ window->platformWindow()->setGeometry(window->geometry()); // this should be unified elsewhere
+ newScreen->addWindow(static_cast<QFbWindow *>(window->platformWindow()));
+}
+
+QPlatformFontDatabase *QVNCIntegration::fontDatabase() const
+{
+ return fontDb;
+}
diff --git a/src/plugins/platforms/vnc/qvncintegration.h b/src/plugins/platforms/vnc/qvncintegration.h
new file mode 100644
index 0000000000..ef16dfade0
--- /dev/null
+++ b/src/plugins/platforms/vnc/qvncintegration.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_VNC_H
+#define QGRAPHICSSYSTEM_VNC_H
+
+#include "qvnccursor.h"
+#include "../fb_base/fb_base.h"
+#include <QPlatformIntegration>
+#include "qgenericunixfontdatabase.h"
+
+QT_BEGIN_NAMESPACE
+
+class QVNCServer;
+class QVNCDirtyMap;
+
+class QVNCScreenPrivate;
+
+class QVNCScreen : public QFbScreen
+{
+ Q_OBJECT
+public:
+ QVNCScreen(QRect screenSize, int screenId);
+
+ int linestep() const { return image() ? image()->bytesPerLine() : 0; }
+ uchar *base() const { return image() ? image()->bits() : 0; }
+ QVNCDirtyMap *dirtyMap();
+
+public:
+ QVNCScreenPrivate *d_ptr;
+
+private:
+ QVNCServer *server;
+ QRegion doRedraw();
+ friend class QVNCIntegration;
+};
+
+class QVNCIntegrationPrivate;
+
+
+class QVNCIntegration : public QPlatformIntegration
+{
+public:
+ QVNCIntegration(const QStringList& paramList);
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ bool isVirtualDesktop() { return virtualDesktop; }
+ void moveToScreen(QWidget *window, int screen);
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+private:
+ QVNCScreen *mPrimaryScreen;
+ QList<QPlatformScreen *> mScreens;
+ bool virtualDesktop;
+ QPlatformFontDatabase *fontDb;
+};
+
+
+
+QT_END_NAMESPACE
+
+#endif //QGRAPHICSSYSTEM_VNC_H
+
diff --git a/src/plugins/platforms/vnc/qvncserver.cpp b/src/plugins/platforms/vnc/qvncserver.cpp
new file mode 100644
index 0000000000..be2de7c007
--- /dev/null
+++ b/src/plugins/platforms/vnc/qvncserver.cpp
@@ -0,0 +1,1935 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qvncserver.h"
+
+#include <QtCore/qtimer.h>
+#include <QtCore/qregexp.h>
+#include <QtGui/qwidget.h>
+#include <QtGui/qpolygon.h>
+#include <QtGui/qpainter.h>
+
+#include <QtGui/qevent.h>
+#include <QWindowSystemInterface>
+
+#include <qplatformdefs.h>
+
+#include <qdebug.h>
+
+#include <stdlib.h>
+
+
+#define QT_QWS_VNC_DEBUG
+#define QT_NO_QWS_CURSOR //###
+
+
+QT_BEGIN_NAMESPACE
+
+
+
+//copied from qscreen_qws.h
+#ifndef QT_QWS_DEPTH16_RGB
+#define QT_QWS_DEPTH16_RGB 565
+#endif
+static const int qt_rbits = (QT_QWS_DEPTH16_RGB/100);
+static const int qt_gbits = (QT_QWS_DEPTH16_RGB/10%10);
+static const int qt_bbits = (QT_QWS_DEPTH16_RGB%10);
+static const int qt_red_shift = qt_bbits+qt_gbits-(8-qt_rbits);
+static const int qt_green_shift = qt_bbits-(8-qt_gbits);
+static const int qt_neg_blue_shift = 8-qt_bbits;
+static const int qt_blue_mask = (1<<qt_bbits)-1;
+static const int qt_green_mask = (1<<(qt_gbits+qt_bbits))-(1<<qt_bbits);
+static const int qt_red_mask = (1<<(qt_rbits+qt_gbits+qt_bbits))-(1<<(qt_gbits+qt_bbits));
+
+static const int qt_red_rounding_shift = qt_red_shift + qt_rbits;
+static const int qt_green_rounding_shift = qt_green_shift + qt_gbits;
+static const int qt_blue_rounding_shift = qt_bbits - qt_neg_blue_shift;
+
+
+inline QRgb qt_conv16ToRgb(ushort c)
+{
+ const int r=(c & qt_red_mask);
+ const int g=(c & qt_green_mask);
+ const int b=(c & qt_blue_mask);
+ const int tr = r >> qt_red_shift | r >> qt_red_rounding_shift;
+ const int tg = g >> qt_green_shift | g >> qt_green_rounding_shift;
+ const int tb = b << qt_neg_blue_shift | b >> qt_blue_rounding_shift;
+
+ return qRgb(tr,tg,tb);
+}
+
+
+
+//===========================================================================
+
+static const struct {
+ int keysym;
+ int keycode;
+} keyMap[] = {
+ { 0xff08, Qt::Key_Backspace },
+ { 0xff09, Qt::Key_Tab },
+ { 0xff0d, Qt::Key_Return },
+ { 0xff1b, Qt::Key_Escape },
+ { 0xff63, Qt::Key_Insert },
+ { 0xffff, Qt::Key_Delete },
+ { 0xff50, Qt::Key_Home },
+ { 0xff57, Qt::Key_End },
+ { 0xff55, Qt::Key_PageUp },
+ { 0xff56, Qt::Key_PageDown },
+ { 0xff51, Qt::Key_Left },
+ { 0xff52, Qt::Key_Up },
+ { 0xff53, Qt::Key_Right },
+ { 0xff54, Qt::Key_Down },
+ { 0xffbe, Qt::Key_F1 },
+ { 0xffbf, Qt::Key_F2 },
+ { 0xffc0, Qt::Key_F3 },
+ { 0xffc1, Qt::Key_F4 },
+ { 0xffc2, Qt::Key_F5 },
+ { 0xffc3, Qt::Key_F6 },
+ { 0xffc4, Qt::Key_F7 },
+ { 0xffc5, Qt::Key_F8 },
+ { 0xffc6, Qt::Key_F9 },
+ { 0xffc7, Qt::Key_F10 },
+ { 0xffc8, Qt::Key_F11 },
+ { 0xffc9, Qt::Key_F12 },
+ { 0xffe1, Qt::Key_Shift },
+ { 0xffe2, Qt::Key_Shift },
+ { 0xffe3, Qt::Key_Control },
+ { 0xffe4, Qt::Key_Control },
+ { 0xffe7, Qt::Key_Meta },
+ { 0xffe8, Qt::Key_Meta },
+ { 0xffe9, Qt::Key_Alt },
+ { 0xffea, Qt::Key_Alt },
+ { 0, 0 }
+};
+
+void QRfbRect::read(QTcpSocket *s)
+{
+ quint16 buf[4];
+ s->read((char*)buf, 8);
+ x = ntohs(buf[0]);
+ y = ntohs(buf[1]);
+ w = ntohs(buf[2]);
+ h = ntohs(buf[3]);
+}
+
+void QRfbRect::write(QTcpSocket *s) const
+{
+ quint16 buf[4];
+ buf[0] = htons(x);
+ buf[1] = htons(y);
+ buf[2] = htons(w);
+ buf[3] = htons(h);
+ s->write((char*)buf, 8);
+}
+
+void QRfbPixelFormat::read(QTcpSocket *s)
+{
+ char buf[16];
+ s->read(buf, 16);
+ bitsPerPixel = buf[0];
+ depth = buf[1];
+ bigEndian = buf[2];
+ trueColor = buf[3];
+
+ quint16 a = ntohs(*(quint16 *)(buf + 4));
+ redBits = 0;
+ while (a) { a >>= 1; redBits++; }
+
+ a = ntohs(*(quint16 *)(buf + 6));
+ greenBits = 0;
+ while (a) { a >>= 1; greenBits++; }
+
+ a = ntohs(*(quint16 *)(buf + 8));
+ blueBits = 0;
+ while (a) { a >>= 1; blueBits++; }
+
+ redShift = buf[10];
+ greenShift = buf[11];
+ blueShift = buf[12];
+}
+
+void QRfbPixelFormat::write(QTcpSocket *s)
+{
+ char buf[16];
+ buf[0] = bitsPerPixel;
+ buf[1] = depth;
+ buf[2] = bigEndian;
+ buf[3] = trueColor;
+
+ quint16 a = 0;
+ for (int i = 0; i < redBits; i++) a = (a << 1) | 1;
+ *(quint16 *)(buf + 4) = htons(a);
+
+ a = 0;
+ for (int i = 0; i < greenBits; i++) a = (a << 1) | 1;
+ *(quint16 *)(buf + 6) = htons(a);
+
+ a = 0;
+ for (int i = 0; i < blueBits; i++) a = (a << 1) | 1;
+ *(quint16 *)(buf + 8) = htons(a);
+
+ buf[10] = redShift;
+ buf[11] = greenShift;
+ buf[12] = blueShift;
+ s->write(buf, 16);
+}
+
+
+void QRfbServerInit::setName(const char *n)
+{
+ delete[] name;
+ name = new char [strlen(n) + 1];
+ strcpy(name, n);
+}
+
+void QRfbServerInit::read(QTcpSocket *s)
+{
+ s->read((char *)&width, 2);
+ width = ntohs(width);
+ s->read((char *)&height, 2);
+ height = ntohs(height);
+ format.read(s);
+
+ quint32 len;
+ s->read((char *)&len, 4);
+ len = ntohl(len);
+
+ name = new char [len + 1];
+ s->read(name, len);
+ name[len] = '\0';
+}
+
+void QRfbServerInit::write(QTcpSocket *s)
+{
+ quint16 t = htons(width);
+ s->write((char *)&t, 2);
+ t = htons(height);
+ s->write((char *)&t, 2);
+ format.write(s);
+ quint32 len = strlen(name);
+ len = htonl(len);
+ s->write((char *)&len, 4);
+ s->write(name, strlen(name));
+}
+
+bool QRfbSetEncodings::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 3)
+ return false;
+
+ char tmp;
+ s->read(&tmp, 1); // padding
+ s->read((char *)&count, 2);
+ count = ntohs(count);
+
+ return true;
+}
+
+bool QRfbFrameBufferUpdateRequest::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 9)
+ return false;
+
+ s->read(&incremental, 1);
+ rect.read(s);
+
+ return true;
+}
+
+bool QRfbKeyEvent::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 7)
+ return false;
+
+ s->read(&down, 1);
+ quint16 tmp;
+ s->read((char *)&tmp, 2); // padding
+
+ quint32 key;
+ s->read((char *)&key, 4);
+ key = ntohl(key);
+
+ unicode = 0;
+ keycode = 0;
+ int i = 0;
+ while (keyMap[i].keysym && !keycode) {
+ if (keyMap[i].keysym == (int)key)
+ keycode = keyMap[i].keycode;
+ i++;
+ }
+ if (!keycode) {
+ if (key <= 0xff) {
+ unicode = key;
+ if (key >= 'a' && key <= 'z')
+ keycode = Qt::Key_A + key - 'a';
+ else if (key >= ' ' && key <= '~')
+ keycode = Qt::Key_Space + key - ' ';
+ }
+ }
+
+ return true;
+}
+
+bool QRfbPointerEvent::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 5)
+ return false;
+
+ char buttonMask;
+ s->read(&buttonMask, 1);
+
+ buttons = Qt::NoButton;
+ wheelDirection = WheelNone;
+ if (buttonMask & 1)
+ buttons |= Qt::LeftButton;
+ if (buttonMask & 2)
+ buttons |= Qt::MidButton;
+ if (buttonMask & 4)
+ buttons |= Qt::RightButton;
+ if (buttonMask & 8)
+ wheelDirection = WheelUp;
+ if (buttonMask & 16)
+ wheelDirection = WheelDown;
+ if (buttonMask & 32)
+ wheelDirection = WheelLeft;
+ if (buttonMask & 64)
+ wheelDirection = WheelRight;
+
+ quint16 tmp;
+ s->read((char *)&tmp, 2);
+ x = ntohs(tmp);
+ s->read((char *)&tmp, 2);
+ y = ntohs(tmp);
+
+ return true;
+}
+
+bool QRfbClientCutText::read(QTcpSocket *s)
+{
+ if (s->bytesAvailable() < 7)
+ return false;
+
+ char tmp[3];
+ s->read(tmp, 3); // padding
+ s->read((char *)&length, 4);
+ length = ntohl(length);
+
+ return true;
+}
+
+//===========================================================================
+
+QVNCServer::QVNCServer(QVNCScreen *screen)
+ : qvnc_screen(screen), cursor(0)
+{
+ init(5900);
+}
+
+QVNCServer::QVNCServer(QVNCScreen *screen, int id)
+ : qvnc_screen(screen), cursor(0)
+{
+ init(5900 + id);
+}
+
+void QVNCServer::init(uint port)
+{
+ qDebug() << "QVNCServer::init" << port;
+
+ handleMsg = false;
+ client = 0;
+ encodingsPending = 0;
+ cutTextPending = 0;
+ keymod = 0;
+ state = Unconnected;
+ dirtyCursor = false;
+
+ refreshRate = 25;
+ timer = new QTimer(this);
+ timer->setSingleShot(true);
+ connect(timer, SIGNAL(timeout()), this, SLOT(checkUpdate()));
+
+ serverSocket = new QTcpServer(this);
+ if (!serverSocket->listen(QHostAddress::Any, port))
+ qDebug() << "QVNCServer could not connect:" << serverSocket->errorString();
+ else
+ qDebug("QVNCServer created on port %d", port);
+
+ connect(serverSocket, SIGNAL(newConnection()), this, SLOT(newConnection()));
+
+#ifndef QT_NO_QWS_CURSOR
+ qvnc_cursor = 0;
+#endif
+ encoder = 0;
+}
+
+QVNCServer::~QVNCServer()
+{
+ delete encoder;
+ encoder = 0;
+ delete client;
+ client = 0;
+#ifndef QT_NO_QWS_CURSOR
+ delete qvnc_cursor;
+ qvnc_cursor = 0;
+#endif
+}
+
+void QVNCServer::setDirty()
+{
+ if (state == Connected && !timer->isActive() &&
+ ((dirtyMap()->numDirty > 0) || dirtyCursor)) {
+ timer->start();
+ }
+}
+
+void QVNCServer::newConnection()
+{
+ if (client)
+ delete client;
+
+ client = serverSocket->nextPendingConnection();
+ connect(client,SIGNAL(readyRead()),this,SLOT(readClient()));
+ connect(client,SIGNAL(disconnected()),this,SLOT(discardClient()));
+ handleMsg = false;
+ encodingsPending = 0;
+ cutTextPending = 0;
+ supportHextile = false;
+ wantUpdate = false;
+
+ timer->start(1000 / refreshRate);
+ dirtyMap()->reset();
+
+ // send protocol version
+ const char *proto = "RFB 003.003\n";
+ client->write(proto, 12);
+ state = Protocol;
+
+// if (!qvnc_screen->screen())
+// QWSServer::instance()->enablePainting(true);
+}
+
+void QVNCServer::readClient()
+{
+ switch (state) {
+ case Protocol:
+ if (client->bytesAvailable() >= 12) {
+ char proto[13];
+ client->read(proto, 12);
+ proto[12] = '\0';
+ qDebug("Client protocol version %s", proto);
+ // No authentication
+ quint32 auth = htonl(1);
+ client->write((char *) &auth, sizeof(auth));
+ state = Init;
+ }
+ break;
+
+ case Init:
+ if (client->bytesAvailable() >= 1) {
+ quint8 shared;
+ client->read((char *) &shared, 1);
+
+ // Server Init msg
+ QRfbServerInit sim;
+ QRfbPixelFormat &format = sim.format;
+ switch (qvnc_screen->depth()) {
+ case 32:
+ format.bitsPerPixel = 32;
+ format.depth = 32;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 8;
+ format.greenBits = 8;
+ format.blueBits = 8;
+ format.redShift = 16;
+ format.greenShift = 8;
+ format.blueShift = 0;
+ break;
+
+ case 24:
+ format.bitsPerPixel = 24;
+ format.depth = 24;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 8;
+ format.greenBits = 8;
+ format.blueBits = 8;
+ format.redShift = 16;
+ format.greenShift = 8;
+ format.blueShift = 0;
+ break;
+
+ case 18:
+ format.bitsPerPixel = 24;
+ format.depth = 18;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 6;
+ format.greenBits = 6;
+ format.blueBits = 6;
+ format.redShift = 12;
+ format.greenShift = 6;
+ format.blueShift = 0;
+ break;
+
+ case 16:
+ format.bitsPerPixel = 16;
+ format.depth = 16;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 5;
+ format.greenBits = 6;
+ format.blueBits = 5;
+ format.redShift = 11;
+ format.greenShift = 5;
+ format.blueShift = 0;
+ break;
+
+ case 15:
+ format.bitsPerPixel = 16;
+ format.depth = 15;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 5;
+ format.greenBits = 5;
+ format.blueBits = 5;
+ format.redShift = 10;
+ format.greenShift = 5;
+ format.blueShift = 0;
+ break;
+
+ case 12:
+ format.bitsPerPixel = 16;
+ format.depth = 12;
+ format.bigEndian = 0;
+ format.trueColor = true;
+ format.redBits = 4;
+ format.greenBits = 4;
+ format.blueBits = 4;
+ format.redShift = 8;
+ format.greenShift = 4;
+ format.blueShift = 0;
+ break;
+
+ case 8:
+ case 4:
+ format.bitsPerPixel = 8;
+ format.depth = 8;
+ format.bigEndian = 0;
+ format.trueColor = false;
+ format.redBits = 0;
+ format.greenBits = 0;
+ format.blueBits = 0;
+ format.redShift = 0;
+ format.greenShift = 0;
+ format.blueShift = 0;
+ break;
+
+ default:
+ qDebug("QVNC cannot drive depth %d", qvnc_screen->depth());
+ discardClient();
+ return;
+ }
+ sim.width = qvnc_screen->geometry().width();
+ sim.height = qvnc_screen->geometry().height();
+ sim.setName("Qt for Embedded Linux VNC Server");
+ sim.write(client);
+ state = Connected;
+ }
+ break;
+
+ case Connected:
+ do {
+ if (!handleMsg) {
+ client->read((char *)&msgType, 1);
+ handleMsg = true;
+ }
+ if (handleMsg) {
+ switch (msgType ) {
+ case SetPixelFormat:
+ setPixelFormat();
+ break;
+ case FixColourMapEntries:
+ qDebug("Not supported: FixColourMapEntries");
+ handleMsg = false;
+ break;
+ case SetEncodings:
+ setEncodings();
+ break;
+ case FramebufferUpdateRequest:
+ frameBufferUpdateRequest();
+ break;
+ case KeyEvent:
+ keyEvent();
+ break;
+ case PointerEvent:
+ pointerEvent();
+ break;
+ case ClientCutText:
+ clientCutText();
+ break;
+ default:
+ qDebug("Unknown message type: %d", (int)msgType);
+ handleMsg = false;
+ }
+ }
+ } while (!handleMsg && client->bytesAvailable());
+ break;
+ default:
+ break;
+ }
+}
+
+#if 0//Q_BYTE_ORDER == Q_BIG_ENDIAN
+bool QVNCScreen::swapBytes() const
+{
+ if (depth() != 16)
+ return false;
+
+ if (screen())
+ return screen()->frameBufferLittleEndian();
+ return frameBufferLittleEndian();
+}
+#endif
+
+void QVNCServer::setPixelFormat()
+{
+ if (client->bytesAvailable() >= 19) {
+ char buf[3];
+ client->read(buf, 3); // just padding
+ pixelFormat.read(client);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("Want format: %d %d %d %d %d %d %d %d %d %d",
+ int(pixelFormat.bitsPerPixel),
+ int(pixelFormat.depth),
+ int(pixelFormat.bigEndian),
+ int(pixelFormat.trueColor),
+ int(pixelFormat.redBits),
+ int(pixelFormat.greenBits),
+ int(pixelFormat.blueBits),
+ int(pixelFormat.redShift),
+ int(pixelFormat.greenShift),
+ int(pixelFormat.blueShift));
+#endif
+ if (!pixelFormat.trueColor) {
+ qDebug("Can only handle true color clients");
+ discardClient();
+ }
+ handleMsg = false;
+ sameEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) == !!pixelFormat.bigEndian;
+ needConversion = pixelConversionNeeded();
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ swapBytes = qvnc_screen->swapBytes();
+#endif
+ }
+}
+
+void QVNCServer::setEncodings()
+{
+ QRfbSetEncodings enc;
+
+ if (!encodingsPending && enc.read(client)) {
+ encodingsPending = enc.count;
+ if (!encodingsPending)
+ handleMsg = false;
+ }
+
+ if (encoder) {
+ delete encoder;
+ encoder = 0;
+ }
+
+ enum Encodings {
+ Raw = 0,
+ CopyRect = 1,
+ RRE = 2,
+ CoRRE = 4,
+ Hextile = 5,
+ ZRLE = 16,
+ Cursor = -239,
+ DesktopSize = -223
+ };
+
+ supportCursor = false;
+
+ if (encodingsPending && (unsigned)client->bytesAvailable() >=
+ encodingsPending * sizeof(quint32)) {
+ for (int i = 0; i < encodingsPending; ++i) {
+ qint32 enc;
+ client->read((char *)&enc, sizeof(qint32));
+ enc = ntohl(enc);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: %d", enc);
+#endif
+ switch (enc) {
+ case Raw:
+ if (!encoder) {
+ encoder = new QRfbRawEncoder(this);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: using raw");
+#endif
+ }
+ break;
+ case CopyRect:
+ supportCopyRect = true;
+ break;
+ case RRE:
+ supportRRE = true;
+ break;
+ case CoRRE:
+ supportCoRRE = true;
+ break;
+ case Hextile:
+ supportHextile = true;
+ if (encoder)
+ break;
+ switch (qvnc_screen->depth()) {
+#ifdef QT_QWS_DEPTH_8
+ case 8:
+ encoder = new QRfbHextileEncoder<quint8>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_12
+ case 12:
+ encoder = new QRfbHextileEncoder<qrgb444>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_15
+ case 15:
+ encoder = new QRfbHextileEncoder<qrgb555>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_16
+ case 16:
+ encoder = new QRfbHextileEncoder<quint16>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_18
+ case 18:
+ encoder = new QRfbHextileEncoder<qrgb666>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_24
+ case 24:
+ encoder = new QRfbHextileEncoder<qrgb888>(this);
+ break;
+#endif
+#ifdef QT_QWS_DEPTH_32
+ case 32:
+ encoder = new QRfbHextileEncoder<quint32>(this);
+ break;
+#endif
+ default:
+ break;
+ }
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: using hextile");
+#endif
+ break;
+ case ZRLE:
+ supportZRLE = true;
+ break;
+ case Cursor:
+ supportCursor = true;
+#ifndef QT_NO_QWS_CURSOR
+ if (!qvnc_screen->screen() || qt_screencursor->isAccelerated()) {
+ delete qvnc_cursor;
+ qvnc_cursor = new QVNCClientCursor(this);
+ }
+#endif
+ break;
+ case DesktopSize:
+ supportDesktopSize = true;
+ break;
+ default:
+ break;
+ }
+ }
+ handleMsg = false;
+ encodingsPending = 0;
+ }
+
+ if (!encoder) {
+ encoder = new QRfbRawEncoder(this);
+#ifdef QT_QWS_VNC_DEBUG
+ qDebug("QVNCServer::setEncodings: fallback using raw");
+#endif
+ }
+
+ if (cursor)
+ cursor->setCursorMode(supportCursor);
+}
+
+void QVNCServer::frameBufferUpdateRequest()
+{
+ QRfbFrameBufferUpdateRequest ev;
+
+ if (ev.read(client)) {
+ if (!ev.incremental) {
+ QRect r(ev.rect.x, ev.rect.y, ev.rect.w, ev.rect.h);
+////### r.translate(qvnc_screen->offset());
+ qvnc_screen->d_ptr->setDirty(r, true);
+ }
+ wantUpdate = true;
+ checkUpdate();
+ handleMsg = false;
+ }
+}
+
+static bool buttonChange(Qt::MouseButtons before, Qt::MouseButtons after, Qt::MouseButton *button, bool *isPress)
+{
+ if (before == after)
+ return false;
+ for (int b = Qt::LeftButton; b <= Qt::MidButton; b<<=1) {
+ if ((before & b) != (after & b)) {
+ *button = static_cast<Qt::MouseButton>(b);
+ *isPress = (after & b);
+ return true;
+ }
+ }
+ return false;
+}
+
+void QVNCServer::pointerEvent()
+{
+ QPoint screenOffset = this->screen()->geometry().topLeft();
+
+ QRfbPointerEvent ev;
+ if (ev.read(client)) {
+ QPoint eventPoint(ev.x, ev.y);
+ eventPoint += screenOffset; // local to global translation
+
+ if (ev.wheelDirection == ev.WheelNone) {
+ QEvent::Type type = QEvent::MouseMove;
+ Qt::MouseButton button = Qt::NoButton;
+ bool isPress;
+ if (buttonChange(buttons, ev.buttons, &button, &isPress))
+ type = isPress ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease;
+ QWindowSystemInterface::handleMouseEvent(0, eventPoint, eventPoint, ev.buttons);
+ } else {
+ // No buttons or motion reported at the same time as wheel events
+ Qt::Orientation orientation;
+ if (ev.wheelDirection == ev.WheelLeft || ev.wheelDirection == ev.WheelRight)
+ orientation = Qt::Horizontal;
+ else
+ orientation = Qt::Vertical;
+ int delta = 120 * ((ev.wheelDirection == ev.WheelLeft || ev.wheelDirection == ev.WheelUp) ? 1 : -1);
+ QWindowSystemInterface::handleWheelEvent(0, eventPoint, eventPoint, delta, orientation);
+ }
+ handleMsg = false;
+ }
+}
+
+void QVNCServer::keyEvent()
+{
+ QRfbKeyEvent ev;
+
+ if (ev.read(client)) {
+ if (ev.keycode == Qt::Key_Shift)
+ keymod = ev.down ? keymod | Qt::ShiftModifier :
+ keymod & ~Qt::ShiftModifier;
+ else if (ev.keycode == Qt::Key_Control)
+ keymod = ev.down ? keymod | Qt::ControlModifier :
+ keymod & ~Qt::ControlModifier;
+ else if (ev.keycode == Qt::Key_Alt)
+ keymod = ev.down ? keymod | Qt::AltModifier :
+ keymod & ~Qt::AltModifier;
+ if (ev.unicode || ev.keycode) {
+// qDebug() << "keyEvent" << hex << ev.unicode << ev.keycode << keymod << ev.down;
+ QEvent::Type type = ev.down ? QEvent::KeyPress : QEvent::KeyRelease;
+ QString str;
+ if (ev.unicode && ev.unicode != 0xffff)
+ str = QString(ev.unicode);
+ QWindowSystemInterface::handleKeyEvent(0, type, ev.keycode, keymod, str);
+ }
+ handleMsg = false;
+ }
+}
+
+void QVNCServer::clientCutText()
+{
+ QRfbClientCutText ev;
+
+ if (cutTextPending == 0 && ev.read(client)) {
+ cutTextPending = ev.length;
+ if (!cutTextPending)
+ handleMsg = false;
+ }
+
+ if (cutTextPending && client->bytesAvailable() >= cutTextPending) {
+ char *text = new char [cutTextPending+1];
+ client->read(text, cutTextPending);
+ delete [] text;
+ cutTextPending = 0;
+ handleMsg = false;
+ }
+}
+
+// stride in bytes
+template <class SRC>
+bool QRfbSingleColorHextile<SRC>::read(const uchar *data,
+ int width, int height, int stride)
+{
+ const int depth = encoder->server->screen()->depth();
+ if (width % (depth / 8)) // hw: should rather fallback to simple loop
+ return false;
+
+ static int alwaysFalse = qgetenv("QT_VNC_NOCHECKFILL").toInt();
+ if (alwaysFalse)
+ return false;
+
+ switch (depth) {
+ case 4: {
+ const quint8 *data8 = reinterpret_cast<const quint8*>(data);
+ if ((data8[0] & 0xf) != (data8[0] >> 4))
+ return false;
+ width /= 2;
+ } // fallthrough
+ case 8: {
+ const quint8 *data8 = reinterpret_cast<const quint8*>(data);
+ if (data8[0] != data8[1])
+ return false;
+ width /= 2;
+ } // fallthrough
+ case 12:
+ case 15:
+ case 16: {
+ const quint16 *data16 = reinterpret_cast<const quint16*>(data);
+ if (data16[0] != data16[1])
+ return false;
+ width /= 2;
+ } // fallthrough
+ case 18:
+ case 24:
+ case 32: {
+ const quint32 *data32 = reinterpret_cast<const quint32*>(data);
+ const quint32 first = data32[0];
+ const int linestep = (stride / sizeof(quint32)) - width;
+ for (int y = 0; y < height; ++y) {
+ for (int x = 0; x < width; ++x) {
+ if (*(data32++) != first)
+ return false;
+ }
+ data32 += linestep;
+ }
+ break;
+ }
+ default:
+ return false;
+ }
+
+ SRC color = reinterpret_cast<const SRC*>(data)[0];
+ encoder->newBg |= (color != encoder->bg);
+ encoder->bg = color;
+ return true;
+}
+
+template <class SRC>
+void QRfbSingleColorHextile<SRC>::write(QTcpSocket *socket) const
+{
+ if (true || encoder->newBg) {
+ const int bpp = encoder->server->clientBytesPerPixel();
+ const int padding = 3;
+ QVarLengthArray<char> buffer(padding + 1 + bpp);
+ buffer[padding] = 2; // BackgroundSpecified
+ encoder->server->convertPixels(buffer.data() + padding + 1,
+ reinterpret_cast<char*>(&encoder->bg),
+ 1);
+ socket->write(buffer.data() + padding, bpp + 1);
+// encoder->newBg = false;
+ } else {
+ char subenc = 0;
+ socket->write(&subenc, 1);
+ }
+}
+
+template <class SRC>
+bool QRfbDualColorHextile<SRC>::read(const uchar *data,
+ int width, int height, int stride)
+{
+ const SRC *ptr = reinterpret_cast<const SRC*>(data);
+ const int linestep = (stride / sizeof(SRC)) - width;
+
+ SRC c1;
+ SRC c2 = 0;
+ int n1 = 0;
+ int n2 = 0;
+ int x = 0;
+ int y = 0;
+
+ c1 = *ptr;
+
+ // find second color
+ while (y < height) {
+ while (x < width) {
+ if (*ptr == c1) {
+ ++n1;
+ } else {
+ c2 = *ptr;
+ goto found_second_color;
+ }
+ ++ptr;
+ ++x;
+ }
+ x = 0;
+ ptr += linestep;
+ ++y;
+ }
+
+found_second_color:
+ // finish counting
+ while (y < height) {
+ while (x < width) {
+ if (*ptr == c1) {
+ ++n1;
+ } else if (*ptr == c2) {
+ ++n2;
+ } else {
+ return false;
+ }
+ ++ptr;
+ ++x;
+ }
+ x = 0;
+ ptr += linestep;
+ ++y;
+ }
+
+ if (n2 > n1) {
+ const quint32 tmpC = c1;
+ c1 = c2;
+ c2 = tmpC;
+ }
+
+ encoder->newBg |= (c1 != encoder->bg);
+ encoder->newFg |= (c2 != encoder->fg);
+
+ encoder->bg = c1;
+ encoder->fg = c2;
+
+ // create map
+ bool inRect = false;
+ numRects = 0;
+ ptr = reinterpret_cast<const SRC*>(data);
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ if (inRect && *ptr == encoder->bg) {
+ // rect finished
+ setWidth(x - lastx());
+ next();
+ inRect = false;
+ } else if (!inRect && *ptr == encoder->fg) {
+ // rect start
+ setX(x);
+ setY(y);
+ setHeight(1);
+ inRect = true;
+ }
+ ++ptr;
+ }
+ if (inRect) {
+ // finish rect
+ setWidth(width - lastx());
+ next();
+ inRect = false;
+ }
+ ptr += linestep;
+ }
+
+ return true;
+}
+
+template <class SRC>
+void QRfbDualColorHextile<SRC>::write(QTcpSocket *socket) const
+{
+ const int bpp = encoder->server->clientBytesPerPixel();
+ const int padding = 3;
+ QVarLengthArray<char> buffer(padding + 2 * bpp + sizeof(char) + sizeof(numRects));
+ char &subenc = buffer[padding];
+ int n = padding + sizeof(subenc);
+
+ subenc = 0x8; // AnySubrects
+
+ if (encoder->newBg) {
+ subenc |= 0x2; // Background
+ encoder->server->convertPixels(buffer.data() + n, (char*)&encoder->bg, 1);
+ n += bpp;
+// encoder->newBg = false;
+ }
+
+ if (encoder->newFg) {
+ subenc |= 0x4; // Foreground
+ encoder->server->convertPixels(buffer.data() + n, (char*)&encoder->fg, 1);
+ n += bpp;
+// encoder->newFg = false;
+ }
+ buffer[n] = numRects;
+ n += sizeof(numRects);
+
+ socket->write(buffer.data() + padding, n - padding);
+ socket->write((char*)rects, numRects * sizeof(Rect));
+}
+
+template <class SRC>
+void QRfbDualColorHextile<SRC>::next()
+{
+ for (int r = numRects - 1; r >= 0; --r) {
+ if (recty(r) == lasty())
+ continue;
+ if (recty(r) < lasty() - 1) // only search previous scanline
+ break;
+ if (rectx(r) == lastx() && width(r) == width(numRects)) {
+ ++rects[r].wh;
+ return;
+ }
+ }
+ ++numRects;
+}
+
+template <class SRC>
+inline void QRfbMultiColorHextile<SRC>::setColor(SRC color)
+{
+ encoder->server->convertPixels(reinterpret_cast<char*>(rect(numRects)),
+ (const char*)&color, 1);
+}
+
+template <class SRC>
+inline bool QRfbMultiColorHextile<SRC>::beginRect()
+{
+ if ((rects.size() + bpp + 2) > maxRectsSize)
+ return false;
+ rects.resize(rects.size() + bpp + 2);
+ return true;
+}
+
+template <class SRC>
+inline void QRfbMultiColorHextile<SRC>::endRect()
+{
+ setHeight(numRects, 1);
+ ++numRects;
+}
+
+template <class SRC>
+bool QRfbMultiColorHextile<SRC>::read(const uchar *data,
+ int width, int height, int stride)
+{
+ const SRC *ptr = reinterpret_cast<const SRC*>(data);
+ const int linestep = (stride / sizeof(SRC)) - width;
+
+ bpp = encoder->server->clientBytesPerPixel();
+
+ if (encoder->newBg)
+ encoder->bg = ptr[0];
+
+ const SRC bg = encoder->bg;
+ SRC color = bg;
+ bool inRect = false;
+
+ numRects = 0;
+ rects.clear();
+
+ for (int y = 0; y < height; ++y) {
+ for (int x = 0; x < width; ++x) {
+ if (inRect && *ptr != color) { // end rect
+ setWidth(numRects, x - rectx(numRects));
+ endRect();
+ inRect = false;
+ }
+
+ if (!inRect && *ptr != bg) { // begin rect
+ if (!beginRect())
+ return false;
+ inRect = true;
+ color = *ptr;
+ setColor(color);
+ setX(numRects, x);
+ setY(numRects, y);
+ }
+ ++ptr;
+ }
+ if (inRect) { // end rect
+ setWidth(numRects, width - rectx(numRects));
+ endRect();
+ inRect = false;
+ }
+ ptr += linestep;
+ }
+
+ return true;
+}
+
+template <class SRC>
+void QRfbMultiColorHextile<SRC>::write(QTcpSocket *socket) const
+{
+ const int padding = 3;
+ QVarLengthArray<quint8> buffer(bpp + padding + sizeof(quint8) + sizeof(numRects));
+
+ quint8 &subenc = buffer[padding];
+ int n = padding + sizeof(quint8);
+
+ subenc = 8 | 16; // AnySubrects | SubrectsColoured
+
+ if (encoder->newBg) {
+ subenc |= 0x2; // Background
+ encoder->server->convertPixels(reinterpret_cast<char*>(buffer.data() + n),
+ reinterpret_cast<const char*>(&encoder->bg),
+ 1);
+ n += bpp;
+// encoder->newBg = false;
+ }
+
+ buffer[n] = numRects;
+ n += sizeof(numRects);
+
+ socket->write(reinterpret_cast<const char*>(buffer.data() + padding),
+ n - padding);
+ socket->write(reinterpret_cast<const char*>(rects.constData()),
+ rects.size());
+}
+
+bool QVNCServer::pixelConversionNeeded() const
+{
+ if (!sameEndian)
+ return true;
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (qvnc_screen->swapBytes())
+ return true;
+#endif
+
+ const int screendepth = qvnc_screen->depth();
+ if (screendepth != pixelFormat.bitsPerPixel)
+ return true;
+
+ switch (screendepth) {
+ case 32:
+ case 24:
+ return false;
+ case 18:
+ return (pixelFormat.redBits == 6
+ && pixelFormat.greenBits == 6
+ && pixelFormat.blueBits == 6);
+ case 16:
+ return (pixelFormat.redBits == 5
+ && pixelFormat.greenBits == 6
+ && pixelFormat.blueBits == 5);
+ case 15:
+ return (pixelFormat.redBits == 5
+ && pixelFormat.greenBits == 5
+ && pixelFormat.blueBits == 5);
+ case 12:
+ return (pixelFormat.redBits == 4
+ && pixelFormat.greenBits == 4
+ && pixelFormat.blueBits == 4);
+ }
+ return true;
+}
+
+// count: number of pixels
+void QVNCServer::convertPixels(char *dst, const char *src, int count) const
+{
+ const int screendepth = qvnc_screen->depth();
+ const bool isBgr = false; //### qvnc_screen->pixelType() == QScreen::BGRPixel;
+
+ // cutoffs
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (!swapBytes)
+#endif
+ if (sameEndian) {
+ if (screendepth == pixelFormat.bitsPerPixel) { // memcpy cutoffs
+
+ switch (screendepth) {
+ case 32:
+ memcpy(dst, src, count * sizeof(quint32));
+ return;
+ case 16:
+ if (pixelFormat.redBits == 5
+ && pixelFormat.greenBits == 6
+ && pixelFormat.blueBits == 5)
+ {
+ memcpy(dst, src, count * sizeof(quint16));
+ return;
+ }
+ }
+ } else if (screendepth == 16 && pixelFormat.bitsPerPixel == 32) {
+#if defined(__i386__) // Currently fails on ARM if dst is not 4 byte aligned
+ const quint32 *src32 = reinterpret_cast<const quint32*>(src);
+ quint32 *dst32 = reinterpret_cast<quint32*>(dst);
+ int count32 = count * sizeof(quint16) / sizeof(quint32);
+ while (count32--) {
+ const quint32 s = *src32++;
+ quint32 result1;
+ quint32 result2;
+
+ // red
+ result1 = ((s & 0xf8000000) | ((s & 0xe0000000) >> 5)) >> 8;
+ result2 = ((s & 0x0000f800) | ((s & 0x0000e000) >> 5)) << 8;
+
+ // green
+ result1 |= ((s & 0x07e00000) | ((s & 0x06000000) >> 6)) >> 11;
+ result2 |= ((s & 0x000007e0) | ((s & 0x00000600) >> 6)) << 5;
+
+ // blue
+ result1 |= ((s & 0x001f0000) | ((s & 0x001c0000) >> 5)) >> 13;
+ result2 |= ((s & 0x0000001f) | ((s & 0x0000001c) >> 5)) << 3;
+
+ *dst32++ = result2;
+ *dst32++ = result1;
+ }
+ if (count & 0x1) {
+ const quint16 *src16 = reinterpret_cast<const quint16*>(src);
+ *dst32 = qt_conv16ToRgb(src16[count - 1]);
+ }
+ return;
+#endif
+ }
+ }
+
+ const int bytesPerPixel = (pixelFormat.bitsPerPixel + 7) / 8;
+
+// nibble = 0;
+
+ for (int i = 0; i < count; ++i) {
+ int r, g, b;
+
+ switch (screendepth) {
+#if 0
+ case 4: {
+ if (!nibble) {
+ r = ((*src) & 0x0f) << 4;
+ } else {
+ r = (*src) & 0xf0;
+ src++;
+ }
+ nibble = !nibble;
+ g = b = r;
+ break;
+ }
+#endif
+#if 0
+ case 8: {
+ QRgb rgb = qvnc_screen->clut()[int(*src)];
+ r = qRed(rgb);
+ g = qGreen(rgb);
+ b = qBlue(rgb);
+ src++;
+ break;
+ }
+#endif
+#ifdef QT_QWS_DEPTH_12
+ case 12: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb444*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb444);
+ break;
+ }
+#endif
+#ifdef QT_QWS_DEPTH_15
+ case 15: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb555*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb555);
+ break;
+ }
+#endif
+ case 16: {
+ quint16 p = *reinterpret_cast<const quint16*>(src);
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (swapBytes)
+ p = ((p & 0xff) << 8) | ((p & 0xff00) >> 8);
+#endif
+ r = (p >> 11) & 0x1f;
+ g = (p >> 5) & 0x3f;
+ b = p & 0x1f;
+ r <<= 3;
+ g <<= 2;
+ b <<= 3;
+ src += sizeof(quint16);
+ break;
+ }
+#ifdef QT_QWS_DEPTH_18
+ case 18: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb666*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb666);
+ break;
+ }
+#endif
+#ifdef QT_QWS_DEPTH_24
+ case 24: {
+ quint32 p = quint32(*reinterpret_cast<const qrgb888*>(src));
+ r = qRed(p);
+ g = qGreen(p);
+ b = qBlue(p);
+ src += sizeof(qrgb888);
+ break;
+ }
+#endif
+ case 32: {
+ quint32 p = *reinterpret_cast<const quint32*>(src);
+ r = (p >> 16) & 0xff;
+ g = (p >> 8) & 0xff;
+ b = p & 0xff;
+ src += sizeof(quint32);
+ break;
+ }
+ default: {
+ r = g = b = 0;
+ qDebug("QVNCServer: don't support %dbpp display", screendepth);
+ return;
+ }
+ }
+
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ if (swapBytes ^ isBgr)
+#else
+ if (isBgr)
+#endif
+ qSwap(r, b);
+
+ r >>= (8 - pixelFormat.redBits);
+ g >>= (8 - pixelFormat.greenBits);
+ b >>= (8 - pixelFormat.blueBits);
+
+ int pixel = (r << pixelFormat.redShift) |
+ (g << pixelFormat.greenShift) |
+ (b << pixelFormat.blueShift);
+
+ if (sameEndian || pixelFormat.bitsPerPixel == 8) {
+ memcpy(dst, &pixel, bytesPerPixel); // XXX: do a simple for-loop instead?
+ dst += bytesPerPixel;
+ continue;
+ }
+
+
+ if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
+ switch (pixelFormat.bitsPerPixel) {
+ case 16:
+ pixel = (((pixel & 0x0000ff00) << 8) |
+ ((pixel & 0x000000ff) << 24));
+ break;
+ case 32:
+ pixel = (((pixel & 0xff000000) >> 24) |
+ ((pixel & 0x00ff0000) >> 8) |
+ ((pixel & 0x0000ff00) << 8) |
+ ((pixel & 0x000000ff) << 24));
+ break;
+ default:
+ qDebug("Cannot handle %d bpp client", pixelFormat.bitsPerPixel);
+ }
+ } else { // QSysInfo::ByteOrder == QSysInfo::LittleEndian
+ switch (pixelFormat.bitsPerPixel) {
+ case 16:
+ pixel = (((pixel & 0xff000000) >> 8) |
+ ((pixel & 0x00ff0000) << 8));
+ break;
+ case 32:
+ pixel = (((pixel & 0xff000000) >> 24) |
+ ((pixel & 0x00ff0000) >> 8) |
+ ((pixel & 0x0000ff00) << 8) |
+ ((pixel & 0x000000ff) << 24));
+ break;
+ default:
+ qDebug("Cannot handle %d bpp client",
+ pixelFormat.bitsPerPixel);
+ break;
+ }
+ }
+ memcpy(dst, &pixel, bytesPerPixel); // XXX: simple for-loop instead?
+ dst += bytesPerPixel;
+ }
+}
+
+#ifndef QT_NO_QWS_CURSOR
+static void blendCursor(QImage &image, const QRect &imageRect)
+{
+ const QRect cursorRect = qt_screencursor->boundingRect();
+ const QRect intersection = (cursorRect & imageRect);
+ const QRect destRect = intersection.translated(-imageRect.topLeft());
+ const QRect srcRect = intersection.translated(-cursorRect.topLeft());
+
+ QPainter painter(&image);
+ painter.drawImage(destRect, qt_screencursor->image(), srcRect);
+ painter.end();
+}
+#endif // QT_NO_QWS_CURSOR
+
+QVNCDirtyMap::QVNCDirtyMap(QVNCScreen *s)
+ : bytesPerPixel(0), numDirty(0), screen(s)
+{
+ bytesPerPixel = (screen->depth() + 7) / 8;
+ QSize screenSize = screen->geometry().size();
+ bufferWidth = screenSize.width();
+ bufferHeight = screenSize.height();
+ bufferStride = bufferWidth * bytesPerPixel;
+ buffer = new uchar[bufferHeight * bufferStride];
+
+ mapWidth = (bufferWidth + MAP_TILE_SIZE - 1) / MAP_TILE_SIZE;
+ mapHeight = (bufferHeight + MAP_TILE_SIZE - 1) / MAP_TILE_SIZE;
+ numTiles = mapWidth * mapHeight;
+ map = new uchar[numTiles];
+}
+
+QVNCDirtyMap::~QVNCDirtyMap()
+{
+ delete[] map;
+ delete[] buffer;
+}
+
+void QVNCDirtyMap::reset()
+{
+ memset(map, 1, numTiles);
+ memset(buffer, 0, bufferHeight * bufferStride);
+ numDirty = numTiles;
+}
+
+inline bool QVNCDirtyMap::dirty(int x, int y) const
+{
+ return map[y * mapWidth + x];
+}
+
+inline void QVNCDirtyMap::setClean(int x, int y)
+{
+ map[y * mapWidth + x] = 0;
+ --numDirty;
+}
+
+template <class T>
+void QVNCDirtyMapOptimized<T>::setDirty(int tileX, int tileY, bool force)
+{
+ static bool alwaysForce = qgetenv("QT_VNC_NO_COMPAREBUFFER").toInt();
+ if (alwaysForce)
+ force = true;
+
+ bool changed = false;
+
+ if (!force) {
+ const int lstep = screen->linestep();
+ const int startX = tileX * MAP_TILE_SIZE;
+ const int startY = tileY * MAP_TILE_SIZE;
+ const uchar *scrn = screen->base()
+ + startY * lstep + startX * bytesPerPixel;
+ uchar *old = buffer + startY * bufferStride + startX * sizeof(T);
+
+ const int tileHeight = (startY + MAP_TILE_SIZE > bufferHeight ?
+ bufferHeight - startY : MAP_TILE_SIZE);
+ const int tileWidth = (startX + MAP_TILE_SIZE > bufferWidth ?
+ bufferWidth - startX : MAP_TILE_SIZE);
+ const bool doInlines = (tileWidth == MAP_TILE_SIZE);
+
+ int y = tileHeight;
+
+ if (doInlines) { // hw: memcmp/memcpy is inlined when using constants
+ while (y) {
+ if (memcmp(old, scrn, sizeof(T) * MAP_TILE_SIZE)) {
+ changed = true;
+ break;
+ }
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+
+ while (y) {
+ memcpy(old, scrn, sizeof(T) * MAP_TILE_SIZE);
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+ } else {
+ while (y) {
+ if (memcmp(old, scrn, sizeof(T) * tileWidth)) {
+ changed = true;
+ break;
+ }
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+
+ while (y) {
+ memcpy(old, scrn, sizeof(T) * tileWidth);
+ scrn += lstep;
+ old += bufferStride;
+ --y;
+ }
+ }
+ }
+
+ const int mapIndex = tileY * mapWidth + tileX;
+ if ((force || changed) && !map[mapIndex]) {
+ map[mapIndex] = 1;
+ ++numDirty;
+ }
+}
+
+template <class SRC>
+QRfbHextileEncoder<SRC>::QRfbHextileEncoder(QVNCServer *s)
+ : QRfbEncoder(s),
+ singleColorHextile(this), dualColorHextile(this), multiColorHextile(this)
+{
+}
+
+/*
+ \internal
+ Send dirty rects using hextile encoding.
+*/
+template <class SRC>
+void QRfbHextileEncoder<SRC>::write()
+{
+// QWSDisplay::grab(true);
+
+ QVNCDirtyMap *map = server->dirtyMap();
+ QTcpSocket *socket = server->clientSocket();
+
+ const quint32 encoding = htonl(5); // hextile encoding
+ const int bytesPerPixel = server->clientBytesPerPixel();
+
+ {
+ const char tmp[2] = { 0, 0 }; // msg type, padding
+ socket->write(tmp, sizeof(tmp));
+ }
+ {
+ const quint16 count = htons(map->numDirty);
+ socket->write((char *)&count, sizeof(count));
+ }
+
+ if (map->numDirty <= 0) {
+// QWSDisplay::ungrab();
+ return;
+ }
+
+ newBg = true;
+ newFg = true;
+
+ const QImage screenImage = server->screenImage();
+ QRfbRect rect(0, 0, MAP_TILE_SIZE, MAP_TILE_SIZE);
+
+ QSize screenSize = server->screen()->geometry().size();
+
+ for (int y = 0; y < map->mapHeight; ++y) {
+ if (rect.y + MAP_TILE_SIZE > screenSize.height())
+ rect.h = screenSize.height() - rect.y;
+ rect.w = MAP_TILE_SIZE;
+ for (int x = 0; x < map->mapWidth; ++x) {
+ if (!map->dirty(x, y))
+ continue;
+ map->setClean(x, y);
+
+ rect.x = x * MAP_TILE_SIZE;
+ if (rect.x + MAP_TILE_SIZE > screenSize.width()) //###deviceWidth ???
+ rect.w = screenSize.width() - rect.x;
+ rect.write(socket);
+
+ socket->write((char *)&encoding, sizeof(encoding));
+
+ const uchar *screendata = screenImage.scanLine(rect.y)
+ + rect.x * screenImage.depth() / 8;
+ int linestep = screenImage.bytesPerLine();
+
+#ifndef QT_NO_QWS_CURSOR
+ // hardware cursors must be blended with the screen memory
+ const bool doBlendCursor = qt_screencursor
+ && !server->hasClientCursor()
+ && qt_screencursor->isAccelerated();
+ QImage tileImage;
+ if (doBlendCursor) {
+ const QRect tileRect(rect.x, rect.y, rect.w, rect.h);
+ const QRect cursorRect = qt_screencursor->boundingRect()
+ .translated(-server->screen()->offset());
+ if (tileRect.intersects(cursorRect)) {
+ tileImage = screenImage.copy(tileRect);
+ blendCursor(tileImage,
+ tileRect.translated(server->screen()->offset()));
+ screendata = tileImage.bits();
+ linestep = tileImage.bytesPerLine();
+ }
+ }
+#endif // QT_NO_QWS_CURSOR
+
+ if (singleColorHextile.read(screendata, rect.w, rect.h, linestep)) {
+ singleColorHextile.write(socket);
+ } else if (dualColorHextile.read(screendata, rect.w, rect.h, linestep)) {
+ dualColorHextile.write(socket);
+ } else if (multiColorHextile.read(screendata, rect.w, rect.h, linestep)) {
+ multiColorHextile.write(socket);
+ } else if (server->doPixelConversion()) {
+ const int bufferSize = rect.w * rect.h * bytesPerPixel + 1;
+ const int padding = sizeof(quint32) - sizeof(char);
+ buffer.resize(bufferSize + padding);
+
+ buffer[padding] = 1; // Raw subencoding
+
+ // convert pixels
+ char *b = buffer.data() + padding + 1;
+ const int bstep = rect.w * bytesPerPixel;
+ for (int i = 0; i < rect.h; ++i) {
+ server->convertPixels(b, (const char*)screendata, rect.w);
+ screendata += linestep;
+ b += bstep;
+ }
+ socket->write(buffer.constData() + padding, bufferSize);
+ } else {
+ quint8 subenc = 1; // Raw subencoding
+ socket->write((char *)&subenc, 1);
+
+ // send pixels
+ for (int i = 0; i < rect.h; ++i) {
+ socket->write((const char*)screendata,
+ rect.w * bytesPerPixel);
+ screendata += linestep;
+ }
+ }
+ }
+ if (socket->state() == QAbstractSocket::UnconnectedState)
+ break;
+ rect.y += MAP_TILE_SIZE;
+ }
+ socket->flush();
+ Q_ASSERT(map->numDirty == 0);
+
+// QWSDisplay::ungrab();
+}
+
+void QRfbRawEncoder::write()
+{
+// QWSDisplay::grab(false);
+
+ QVNCDirtyMap *map = server->dirtyMap();
+ QTcpSocket *socket = server->clientSocket();
+
+ const int bytesPerPixel = server->clientBytesPerPixel();
+ QSize screenSize = server->screen()->geometry().size();
+
+ // create a region from the dirty rects and send the region's merged rects.
+ QRegion rgn;
+ if (map) {
+ for (int y = 0; y < map->mapHeight; ++y) {
+ for (int x = 0; x < map->mapWidth; ++x) {
+ if (!map->dirty(x, y))
+ continue;
+ rgn += QRect(x * MAP_TILE_SIZE, y * MAP_TILE_SIZE,
+ MAP_TILE_SIZE, MAP_TILE_SIZE);
+ map->setClean(x, y);
+ }
+ }
+
+ rgn &= QRect(0, 0, screenSize.width(),
+ screenSize.height());
+ }
+ const QVector<QRect> rects = rgn.rects();
+
+ {
+ const char tmp[2] = { 0, 0 }; // msg type, padding
+ socket->write(tmp, sizeof(tmp));
+ }
+
+ {
+ const quint16 count = htons(rects.size());
+ socket->write((char *)&count, sizeof(count));
+ }
+
+ if (rects.size() <= 0) {
+// QWSDisplay::ungrab();
+ return;
+ }
+
+ const QImage *screenImage = server->screenImage();
+
+ for (int i = 0; i < rects.size(); ++i) {
+ const QRect tileRect = rects.at(i);
+ const QRfbRect rect(tileRect.x(), tileRect.y(),
+ tileRect.width(), tileRect.height());
+ rect.write(socket);
+
+ const quint32 encoding = htonl(0); // raw encoding
+ socket->write((char *)&encoding, sizeof(encoding));
+
+ int linestep = screenImage->bytesPerLine();
+ const uchar *screendata = screenImage->scanLine(rect.y)
+ + rect.x * screenImage->depth() / 8;
+
+#ifndef QT_NO_QWS_CURSOR
+ // hardware cursors must be blended with the screen memory
+ const bool doBlendCursor = qt_screencursor
+ && !server->hasClientCursor()
+ && qt_screencursor->isAccelerated();
+ QImage tileImage;
+ if (doBlendCursor) {
+ const QRect cursorRect = qt_screencursor->boundingRect()
+ .translated(-server->screen()->offset());
+ if (tileRect.intersects(cursorRect)) {
+ tileImage = screenImage->copy(tileRect);
+ blendCursor(tileImage,
+ tileRect.translated(server->screen()->offset()));
+ screendata = tileImage.bits();
+ linestep = tileImage.bytesPerLine();
+ }
+ }
+#endif // QT_NO_QWS_CURSOR
+
+ if (server->doPixelConversion()) {
+ const int bufferSize = rect.w * rect.h * bytesPerPixel;
+ if (bufferSize > buffer.size())
+ buffer.resize(bufferSize);
+
+ // convert pixels
+ char *b = buffer.data();
+ const int bstep = rect.w * bytesPerPixel;
+ for (int i = 0; i < rect.h; ++i) {
+ server->convertPixels(b, (const char*)screendata, rect.w);
+ screendata += linestep;
+ b += bstep;
+ }
+ socket->write(buffer.constData(), bufferSize);
+ } else {
+ for (int i = 0; i < rect.h; ++i) {
+ socket->write((const char*)screendata, rect.w * bytesPerPixel);
+ screendata += linestep;
+ }
+ }
+ if (socket->state() == QAbstractSocket::UnconnectedState)
+ break;
+ }
+ socket->flush();
+
+// QWSDisplay::ungrab();
+}
+
+inline QImage *QVNCServer::screenImage() const
+{
+ return qvnc_screen->image();
+}
+
+void QVNCServer::checkUpdate()
+{
+ if (!wantUpdate)
+ return;
+
+ if (dirtyCursor) {
+#ifndef QT_NO_QWS_CURSOR
+ Q_ASSERT(qvnc_cursor);
+ qvnc_cursor->write();
+#endif
+ cursor->sendClientCursor();
+ dirtyCursor = false;
+ wantUpdate = false;
+ return;
+ }
+
+ if (dirtyMap()->numDirty > 0) {
+ if (encoder)
+ encoder->write();
+ wantUpdate = false;
+ }
+}
+
+void QVNCServer::discardClient()
+{
+ timer->stop();
+ state = Unconnected;
+ delete encoder;
+ encoder = 0;
+#ifndef QT_NO_QWS_CURSOR
+ delete qvnc_cursor;
+ qvnc_cursor = 0;
+#endif
+// if (!qvnc_screen->screen())
+// QWSServer::instance()->enablePainting(false);
+}
+
+
+
+QVNCScreenPrivate::QVNCScreenPrivate(QVNCScreen *parent, int screenId)
+ : dpiX(72), dpiY(72), doOnScreenSurface(false), refreshRate(25),
+ vncServer(0), q_ptr(parent)
+{
+#if 0//ndef QT_NO_QWS_SIGNALHANDLER
+ QWSSignalHandler::instance()->addObject(this);
+#endif
+
+ vncServer = new QVNCServer(q_ptr, screenId);
+ vncServer->setRefreshRate(refreshRate);
+
+
+ Q_ASSERT(q_ptr->depth() == 32);
+
+ dirty = new QVNCDirtyMapOptimized<quint32>(q_ptr);
+}
+
+QVNCScreenPrivate::~QVNCScreenPrivate()
+{
+}
+
+
+void QVNCScreenPrivate::setDirty(const QRect& rect, bool force)
+{
+ if (rect.isEmpty())
+ return;
+
+// if (q_ptr->screen())
+// q_ptr->screen()->setDirty(rect);
+
+ if (!vncServer || !vncServer->isConnected()) {
+// qDebug() << "QVNCScreenPrivate::setDirty() - Not connected";
+ return;
+ }
+ const QRect r = rect; // .translated(-q_ptr->offset());
+ const int x1 = r.x() / MAP_TILE_SIZE;
+ int y = r.y() / MAP_TILE_SIZE;
+ for (; (y <= r.bottom() / MAP_TILE_SIZE) && y < dirty->mapHeight; y++)
+ for (int x = x1; (x <= r.right() / MAP_TILE_SIZE) && x < dirty->mapWidth; x++)
+ dirty->setDirty(x, y, force);
+
+ vncServer->setDirty();
+}
+
+
+
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/vnc/qvncserver.h b/src/plugins/platforms/vnc/qvncserver.h
new file mode 100644
index 0000000000..3b514a5151
--- /dev/null
+++ b/src/plugins/platforms/vnc/qvncserver.h
@@ -0,0 +1,533 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCREENVNC_P_H
+#define QSCREENVNC_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the QLibrary class. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qvncintegration.h"
+#include "qvnccursor.h"
+#define QT_NO_QWS_CURSOR
+
+#ifndef QT_NO_QWS_VNC
+
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qsharedmemory.h>
+#include <QtNetwork/qtcpsocket.h>
+#include <QtNetwork/qtcpserver.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVNCServer;
+
+#ifndef QT_NO_QWS_CURSOR
+class QVNCCursor : public QProxyScreenCursor
+{
+public:
+ QVNCCursor(QVNCScreen *s);
+ ~QVNCCursor();
+
+ void hide();
+ void show();
+ void set(const QImage &image, int hotx, int hoty);
+ void move(int x, int y);
+
+private:
+ void setDirty(const QRect &r) const;
+ QVNCScreen *screen;
+};
+
+class QVNCClientCursor : public QProxyScreenCursor
+{
+public:
+ QVNCClientCursor(QVNCServer *s);
+ ~QVNCClientCursor();
+
+ void set(const QImage &image, int hotx, int hoty);
+ void write() const;
+
+private:
+ QVNCServer *server;
+};
+#endif // QT_NO_QWS_CURSOR
+
+#define MAP_TILE_SIZE 16
+#define MAP_WIDTH 1280 / MAP_TILE_SIZE
+#define MAP_HEIGHT 1024 / MAP_TILE_SIZE
+
+class QVNCDirtyMap
+{
+public:
+ QVNCDirtyMap(QVNCScreen *screen);
+ virtual ~QVNCDirtyMap();
+
+ void reset();
+ bool dirty(int x, int y) const;
+ virtual void setDirty(int x, int y, bool force = false) = 0;
+ void setClean(int x, int y);
+
+ int bytesPerPixel;
+
+ int numDirty;
+ int mapWidth;
+ int mapHeight;
+
+protected:
+ uchar *map;
+ QVNCScreen *screen;
+ uchar *buffer;
+ int bufferWidth;
+ int bufferHeight;
+ int bufferStride;
+ int numTiles;
+};
+
+template <class T>
+class QVNCDirtyMapOptimized : public QVNCDirtyMap
+{
+public:
+ QVNCDirtyMapOptimized(QVNCScreen *screen) : QVNCDirtyMap(screen) {}
+ ~QVNCDirtyMapOptimized() {}
+
+ void setDirty(int x, int y, bool force = false);
+};
+
+class QRfbRect
+{
+public:
+ QRfbRect() {}
+ QRfbRect(quint16 _x, quint16 _y, quint16 _w, quint16 _h) {
+ x = _x; y = _y; w = _w; h = _h;
+ }
+
+ void read(QTcpSocket *s);
+ void write(QTcpSocket *s) const;
+
+ quint16 x;
+ quint16 y;
+ quint16 w;
+ quint16 h;
+};
+
+class QRfbPixelFormat
+{
+public:
+ static int size() { return 16; }
+
+ void read(QTcpSocket *s);
+ void write(QTcpSocket *s);
+
+ int bitsPerPixel;
+ int depth;
+ bool bigEndian;
+ bool trueColor;
+ int redBits;
+ int greenBits;
+ int blueBits;
+ int redShift;
+ int greenShift;
+ int blueShift;
+};
+
+class QRfbServerInit
+{
+public:
+ QRfbServerInit() { name = 0; }
+ ~QRfbServerInit() { delete[] name; }
+
+ int size() const { return QRfbPixelFormat::size() + 8 + strlen(name); }
+ void setName(const char *n);
+
+ void read(QTcpSocket *s);
+ void write(QTcpSocket *s);
+
+ quint16 width;
+ quint16 height;
+ QRfbPixelFormat format;
+ char *name;
+};
+
+class QRfbSetEncodings
+{
+public:
+ bool read(QTcpSocket *s);
+
+ quint16 count;
+};
+
+class QRfbFrameBufferUpdateRequest
+{
+public:
+ bool read(QTcpSocket *s);
+
+ char incremental;
+ QRfbRect rect;
+};
+
+class QRfbKeyEvent
+{
+public:
+ bool read(QTcpSocket *s);
+
+ char down;
+ int keycode;
+ int unicode;
+};
+
+class QRfbPointerEvent
+{
+public:
+ bool read(QTcpSocket *s);
+
+ Qt::MouseButtons buttons;
+ enum { WheelNone,
+ WheelUp,
+ WheelDown,
+ WheelLeft,
+ WheelRight
+ } wheelDirection;
+ quint16 x;
+ quint16 y;
+};
+
+class QRfbClientCutText
+{
+public:
+ bool read(QTcpSocket *s);
+
+ quint32 length;
+};
+
+class QVNCScreenPrivate : public QObject
+{
+public:
+ QVNCScreenPrivate(QVNCScreen *parent, int screenId);
+ ~QVNCScreenPrivate();
+
+ void setDirty(const QRect &rect, bool force = false);
+ void configure();
+
+ qreal dpiX;
+ qreal dpiY;
+ bool doOnScreenSurface;
+ QVNCDirtyMap *dirty;
+ int refreshRate;
+ QVNCServer *vncServer;
+
+#if !defined(QT_NO_QWS_MULTIPROCESS) && !defined(QT_NO_SHAREDMEMORY)
+ QSharedMemory shm;
+#endif
+
+ QVNCScreen *q_ptr;
+};
+
+class QRfbEncoder
+{
+public:
+ QRfbEncoder(QVNCServer *s) : server(s) {}
+ virtual ~QRfbEncoder() {}
+
+ virtual void write() = 0;
+
+protected:
+ QVNCServer *server;
+};
+
+class QRfbRawEncoder : public QRfbEncoder
+{
+public:
+ QRfbRawEncoder(QVNCServer *s) : QRfbEncoder(s) {}
+
+ void write();
+
+private:
+ QByteArray buffer;
+};
+
+template <class SRC> class QRfbHextileEncoder;
+
+template <class SRC>
+class QRfbSingleColorHextile
+{
+public:
+ QRfbSingleColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
+ bool read(const uchar *data, int width, int height, int stride);
+ void write(QTcpSocket *socket) const;
+
+private:
+ QRfbHextileEncoder<SRC> *encoder;
+};
+
+template <class SRC>
+class QRfbDualColorHextile
+{
+public:
+ QRfbDualColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
+ bool read(const uchar *data, int width, int height, int stride);
+ void write(QTcpSocket *socket) const;
+
+private:
+ struct Rect {
+ quint8 xy;
+ quint8 wh;
+ } Q_PACKED rects[8 * 16];
+
+ quint8 numRects;
+ QRfbHextileEncoder<SRC> *encoder;
+
+private:
+ inline int lastx() const { return rectx(numRects); }
+ inline int lasty() const { return recty(numRects); }
+ inline int rectx(int r) const { return rects[r].xy >> 4; }
+ inline int recty(int r) const { return rects[r].xy & 0x0f; }
+ inline int width(int r) const { return (rects[r].wh >> 4) + 1; }
+ inline int height(int r) const { return (rects[r].wh & 0x0f) + 1; }
+
+ inline void setX(int r, int x) {
+ rects[r].xy = (x << 4) | (rects[r].xy & 0x0f);
+ }
+ inline void setY(int r, int y) {
+ rects[r].xy = (rects[r].xy & 0xf0) | y;
+ }
+ inline void setWidth(int r, int width) {
+ rects[r].wh = ((width - 1) << 4) | (rects[r].wh & 0x0f);
+ }
+ inline void setHeight(int r, int height) {
+ rects[r].wh = (rects[r].wh & 0xf0) | (height - 1);
+ }
+
+ inline void setWidth(int width) { setWidth(numRects, width); }
+ inline void setHeight(int height) { setHeight(numRects, height); }
+ inline void setX(int x) { setX(numRects, x); }
+ inline void setY(int y) { setY(numRects, y); }
+ void next();
+};
+
+template <class SRC>
+class QRfbMultiColorHextile
+{
+public:
+ QRfbMultiColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
+ bool read(const uchar *data, int width, int height, int stride);
+ void write(QTcpSocket *socket) const;
+
+private:
+ inline quint8* rect(int r) {
+ return rects.data() + r * (bpp + 2);
+ }
+ inline const quint8* rect(int r) const {
+ return rects.constData() + r * (bpp + 2);
+ }
+ inline void setX(int r, int x) {
+ quint8 *ptr = rect(r) + bpp;
+ *ptr = (x << 4) | (*ptr & 0x0f);
+ }
+ inline void setY(int r, int y) {
+ quint8 *ptr = rect(r) + bpp;
+ *ptr = (*ptr & 0xf0) | y;
+ }
+ void setColor(SRC color);
+ inline int rectx(int r) const {
+ const quint8 *ptr = rect(r) + bpp;
+ return *ptr >> 4;
+ }
+ inline int recty(int r) const {
+ const quint8 *ptr = rect(r) + bpp;
+ return *ptr & 0x0f;
+ }
+ inline void setWidth(int r, int width) {
+ quint8 *ptr = rect(r) + bpp + 1;
+ *ptr = ((width - 1) << 4) | (*ptr & 0x0f);
+ }
+ inline void setHeight(int r, int height) {
+ quint8 *ptr = rect(r) + bpp + 1;
+ *ptr = (*ptr & 0xf0) | (height - 1);
+ }
+
+ bool beginRect();
+ void endRect();
+
+ static const int maxRectsSize = 16 * 16;
+ QVarLengthArray<quint8, maxRectsSize> rects;
+
+ quint8 bpp;
+ quint8 numRects;
+ QRfbHextileEncoder<SRC> *encoder;
+};
+
+template <class SRC>
+class QRfbHextileEncoder : public QRfbEncoder
+{
+public:
+ QRfbHextileEncoder(QVNCServer *s);
+ void write();
+
+private:
+ enum SubEncoding {
+ Raw = 1,
+ BackgroundSpecified = 2,
+ ForegroundSpecified = 4,
+ AnySubrects = 8,
+ SubrectsColoured = 16
+ };
+
+ QByteArray buffer;
+ QRfbSingleColorHextile<SRC> singleColorHextile;
+ QRfbDualColorHextile<SRC> dualColorHextile;
+ QRfbMultiColorHextile<SRC> multiColorHextile;
+
+ SRC bg;
+ SRC fg;
+ bool newBg;
+ bool newFg;
+
+ friend class QRfbSingleColorHextile<SRC>;
+ friend class QRfbDualColorHextile<SRC>;
+ friend class QRfbMultiColorHextile<SRC>;
+};
+
+class QVNCServer : public QObject
+{
+ Q_OBJECT
+public:
+ QVNCServer(QVNCScreen *screen);
+ QVNCServer(QVNCScreen *screen, int id);
+ ~QVNCServer();
+
+ void setDirty();
+ void setDirtyCursor() { dirtyCursor = true; setDirty(); }
+ inline bool isConnected() const { return state == Connected; }
+ inline void setRefreshRate(int rate) { refreshRate = rate; }
+
+ enum ClientMsg { SetPixelFormat = 0,
+ FixColourMapEntries = 1,
+ SetEncodings = 2,
+ FramebufferUpdateRequest = 3,
+ KeyEvent = 4,
+ PointerEvent = 5,
+ ClientCutText = 6 };
+
+ enum ServerMsg { FramebufferUpdate = 0,
+ SetColourMapEntries = 1 };
+
+ void convertPixels(char *dst, const char *src, int count) const;
+
+ inline int clientBytesPerPixel() const {
+ return pixelFormat.bitsPerPixel / 8;
+ }
+
+ inline QVNCScreen* screen() const { return qvnc_screen; }
+ inline QVNCDirtyMap* dirtyMap() const { return qvnc_screen->dirtyMap(); }
+ inline QTcpSocket* clientSocket() const { return client; }
+ QImage *screenImage() const;
+ inline bool doPixelConversion() const { return needConversion; }
+#ifndef QT_NO_QWS_CURSOR
+ inline bool hasClientCursor() const { return qvnc_cursor != 0; }
+#endif
+
+ void setCursor(QVNCCursor * c) { cursor = c; }
+private:
+ void setPixelFormat();
+ void setEncodings();
+ void frameBufferUpdateRequest();
+ void pointerEvent();
+ void keyEvent();
+ void clientCutText();
+ bool pixelConversionNeeded() const;
+
+private slots:
+ void newConnection();
+ void readClient();
+ void checkUpdate();
+ void discardClient();
+
+private:
+ void init(uint port);
+ enum ClientState { Unconnected, Protocol, Init, Connected };
+ QTimer *timer;
+ QTcpServer *serverSocket;
+ QTcpSocket *client;
+ ClientState state;
+ quint8 msgType;
+ bool handleMsg;
+ QRfbPixelFormat pixelFormat;
+ Qt::KeyboardModifiers keymod;
+ Qt::MouseButtons buttons;
+ int encodingsPending;
+ int cutTextPending;
+ uint supportCopyRect : 1;
+ uint supportRRE : 1;
+ uint supportCoRRE : 1;
+ uint supportHextile : 1;
+ uint supportZRLE : 1;
+ uint supportCursor : 1;
+ uint supportDesktopSize : 1;
+ bool wantUpdate;
+ bool sameEndian;
+ bool needConversion;
+#if Q_BYTE_ORDER == Q_BIG_ENDIAN
+ bool swapBytes;
+#endif
+ bool dirtyCursor;
+ int refreshRate;
+ QVNCScreen *qvnc_screen;
+#ifndef QT_NO_QWS_CURSOR
+ QVNCClientCursor *qvnc_cursor;
+#endif
+
+ QRfbEncoder *encoder;
+ QVNCCursor *cursor;
+};
+
+
+QT_END_NAMESPACE
+#endif // QT_NO_QWS_VNC
+#endif // QSCREENVNC_P_H
diff --git a/src/plugins/platforms/vnc/vnc.pro b/src/plugins/platforms/vnc/vnc.pro
new file mode 100644
index 0000000000..07f8d888fd
--- /dev/null
+++ b/src/plugins/platforms/vnc/vnc.pro
@@ -0,0 +1,22 @@
+TARGET = qvncgraphicssystem
+include(../../qpluginbase.pri)
+
+QT += network
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+SOURCES = main.cpp qvncintegration.cpp
+HEADERS = qvncintegration.h
+
+HEADERS += qvncserver.h
+SOURCES += qvncserver.cpp
+
+HEADERS += qvnccursor.h
+SOURCES += qvnccursor.cpp
+
+include(../fb_base/fb_base.pri)
+include(../fontdatabases/genericunix/genericunix.pri)
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+
+INSTALLS += target
diff --git a/src/plugins/platforms/wayland/gl_integration/gl_integration.pri b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
new file mode 100644
index 0000000000..d9b5fa9bff
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/gl_integration.pri
@@ -0,0 +1,57 @@
+contains(QT_CONFIG, opengl) {
+ DEFINES += QT_WAYLAND_GL_SUPPORT
+ QT += opengl
+
+HEADERS += \
+ $$PWD/qwaylandglintegration.h \
+ $$PWD/qwaylandglwindowsurface.h
+
+SOURCES += \
+ $$PWD/qwaylandglintegration.cpp \
+ $$PWD/qwaylandglwindowsurface.cpp
+
+ QT_WAYLAND_GL_CONFIG = $$(QT_WAYLAND_GL_CONFIG)
+ contains(QT_CONFIG, opengles2) {
+ isEqual(QT_WAYLAND_GL_CONFIG, wayland_egl) {
+ QT_WAYLAND_GL_INTEGRATION = $$QT_WAYLAND_GL_CONFIG
+ CONFIG += wayland_egl
+ } else:isEqual(QT_WAYLAND_GL_CONFIG,readback) {
+ QT_WAYLAND_GL_INTEGRATION = readback_egl
+ CONFIG += readback_egl
+ } else {
+ QT_WAYLAND_GL_INTEGRATION = xcomposite_egl
+ CONFIG += xcomposite_egl
+ }
+ } else {
+ isEqual(QT_WAYLAND_GL_CONFIG, readback) {
+ QT_WAYLAND_GL_INTEGRATION = readback_glx
+ CONFIG += readback_glx
+ } else {
+ QT_WAYLAND_GL_INTEGRATION = xcomposite_glx
+ CONFIG += xcomposite_glx
+ }
+ }
+
+ message("Wayland GL Integration: $$QT_WAYLAND_GL_INTEGRATION")
+}
+
+
+wayland_egl {
+ include ($$PWD/wayland_egl/wayland_egl.pri)
+}
+
+readback_egl {
+ include ($$PWD/readback_egl/readback_egl.pri)
+}
+
+readback_glx {
+ include ($$PWD/readback_glx/readback_glx.pri)
+}
+
+xcomposite_glx {
+ include ($$PWD/xcomposite_glx/xcomposite_glx.pri)
+}
+
+xcomposite_egl {
+ include ($$PWD/xcomposite_egl/xcomposite_egl.pri)
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
new file mode 100644
index 0000000000..9c8ef4e986
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandglintegration.h"
+
+QWaylandGLIntegration::QWaylandGLIntegration()
+{
+
+}
+
+QWaylandGLIntegration::~QWaylandGLIntegration()
+{
+
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
new file mode 100644
index 0000000000..ac16039c9d
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglintegration.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDGLINTEGRATION_H
+#define QWAYLANDGLINTEGRATION_H
+
+class QWaylandWindow;
+class QWaylandDisplay;
+class QWidget;
+
+class QWaylandGLIntegration
+{
+public:
+ QWaylandGLIntegration();
+ virtual ~QWaylandGLIntegration();
+
+ virtual void initialize() = 0;
+
+ virtual QWaylandWindow *createEglWindow(QWidget *widget) = 0;
+
+ static QWaylandGLIntegration *createGLIntegration(QWaylandDisplay *waylandDisplay);
+};
+
+#endif // QWAYLANDGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
new file mode 100644
index 0000000000..ebe4c7bf86
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.cpp
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandglwindowsurface.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandwindow.h"
+#include "qwaylandscreen.h"
+
+#include <QtOpenGL/QGLFramebufferObject>
+#include <QtOpenGL/QGLContext>
+
+#include <QtOpenGL/private/qglengineshadermanager_p.h>
+
+QT_BEGIN_NAMESPACE
+
+static void drawTexture(const QRectF &rect, GLuint tex_id, const QSize &texSize, const QRectF &br)
+{
+#if !defined(QT_OPENGL_ES_2)
+ QGLContext *ctx = const_cast<QGLContext *>(QGLContext::currentContext());
+#endif
+ const GLenum target = GL_TEXTURE_2D;
+ QRectF src = br.isEmpty()
+ ? QRectF(QPointF(), texSize)
+ : QRectF(QPointF(br.x(), texSize.height() - br.bottom()), br.size());
+
+ if (target == GL_TEXTURE_2D) {
+ qreal width = texSize.width();
+ qreal height = texSize.height();
+
+ src.setLeft(src.left() / width);
+ src.setRight(src.right() / width);
+ src.setTop(src.top() / height);
+ src.setBottom(src.bottom() / height);
+ }
+
+ const GLfloat tx1 = src.left();
+ const GLfloat tx2 = src.right();
+ const GLfloat ty1 = src.top();
+ const GLfloat ty2 = src.bottom();
+
+ GLfloat texCoordArray[4*2] = {
+ tx1, ty2, tx2, ty2, tx2, ty1, tx1, ty1
+ };
+
+ GLfloat vertexArray[4*2];
+ vertexArray[0] = rect.left(); vertexArray[1] = rect.top();
+ vertexArray[2] = rect.right(); vertexArray[3] = rect.top();
+ vertexArray[4] = rect.right(); vertexArray[5] = rect.bottom();
+ vertexArray[6] = rect.left(); vertexArray[7] = rect.bottom();
+
+ glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexArray);
+ glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, texCoordArray);
+
+ glBindTexture(target, tex_id);
+
+ glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+ glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
+ glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
+
+ glBindTexture(target, 0);
+}
+
+static void blitTexture(QGLContext *ctx, GLuint texture, const QSize &viewport, const QSize &texSize, const QRect &targetRect, const QRect &sourceRect)
+{
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_SCISSOR_TEST);
+ glDisable(GL_BLEND);
+ glViewport(0, 0, viewport.width(), viewport.height());
+
+ QGLShaderProgram *blitProgram =
+ QGLEngineSharedShaders::shadersForContext(ctx)->blitProgram();
+ blitProgram->bind();
+ blitProgram->setUniformValue("imageTexture", 0 /*QT_IMAGE_TEXTURE_UNIT*/);
+
+ // The shader manager's blit program does not multiply the
+ // vertices by the pmv matrix, so we need to do the effect
+ // of the orthographic projection here ourselves.
+ QRectF r;
+ qreal w = viewport.width();
+ qreal h = viewport.height();
+ r.setLeft((targetRect.left() / w) * 2.0f - 1.0f);
+ if (targetRect.right() == (viewport.width() - 1))
+ r.setRight(1.0f);
+ else
+ r.setRight((targetRect.right() / w) * 2.0f - 1.0f);
+ r.setBottom((targetRect.top() / h) * 2.0f - 1.0f);
+ if (targetRect.bottom() == (viewport.height() - 1))
+ r.setTop(1.0f);
+ else
+ r.setTop((targetRect.bottom() / w) * 2.0f - 1.0f);
+
+ drawTexture(r, texture, texSize, sourceRect);
+}
+
+QWaylandGLWindowSurface::QWaylandGLWindowSurface(QWidget *window)
+ : QWindowSurface(window)
+ , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+ , mPaintDevice(0)
+{
+
+}
+
+QWaylandGLWindowSurface::~QWaylandGLWindowSurface()
+{
+ delete mPaintDevice;
+}
+
+QPaintDevice *QWaylandGLWindowSurface::paintDevice()
+{
+ return mPaintDevice;
+}
+
+void QWaylandGLWindowSurface::beginPaint(const QRegion &)
+{
+ window()->platformWindow()->glContext()->makeCurrent();
+ glClearColor(0,0,0,0xff);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void QWaylandGLWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(offset);
+ Q_UNUSED(region);
+ QWaylandWindow *ww = (QWaylandWindow *) widget->platformWindow();
+
+ if (mPaintDevice->isBound())
+ mPaintDevice->release();
+
+ QRect rect(0,0,size().width(),size().height());
+ QGLContext *ctx = QGLContext::fromPlatformGLContext(ww->glContext());
+ blitTexture(ctx,mPaintDevice->texture(),size(),mPaintDevice->size(),rect,rect);
+ ww->glContext()->swapBuffers();
+}
+
+void QWaylandGLWindowSurface::resize(const QSize &size)
+{
+ QWindowSurface::resize(size);
+ window()->platformWindow()->glContext()->makeCurrent();
+ delete mPaintDevice;
+ mPaintDevice = new QGLFramebufferObject(size);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
new file mode 100644
index 0000000000..8d53b42a56
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/qwaylandglwindowsurface.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDDRMSURFACE_H
+#define QWAYLANDDRMSURFACE_H
+
+#include "qwaylanddisplay.h"
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+class QGLFramebufferObject;
+
+class QWaylandGLWindowSurface : public QWindowSurface
+{
+public:
+ QWaylandGLWindowSurface(QWidget *window);
+ ~QWaylandGLWindowSurface();
+
+ void beginPaint(const QRegion &);
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+
+ void resize(const QSize &size);
+
+private:
+ QWaylandDisplay *mDisplay;
+ QGLFramebufferObject *mPaintDevice;
+};
+
+#endif // QWAYLANDDRMSURFACE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp
new file mode 100644
index 0000000000..d63087d934
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.cpp
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackeglcontext.h"
+
+#include "../../../eglconvenience/qeglconvenience.h"
+
+#include <QtOpenGL/QGLContext>
+#include <QtOpenGL/private/qglextensions_p.h>
+
+#include "qwaylandshmsurface.h"
+
+#include <QtCore/QDebug>
+
+static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
+{
+ const int width = img.width();
+ const int height = img.height();
+
+ if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
+ || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
+ {
+ for (int i = 0; i < height; ++i) {
+ uint *p = (uint *) img.scanLine(i);
+ for (int x = 0; x < width; ++x)
+ p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+ }
+ } else {
+ for (int i = 0; i < height; ++i) {
+ uint *p = (uint *) img.scanLine(i);
+ for (int x = 0; x < width; ++x)
+ p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
+ }
+ }
+}
+
+QWaylandReadbackEglContext::QWaylandReadbackEglContext(QWaylandReadbackEglIntegration *eglIntegration, QWaylandReadbackEglWindow *window)
+ : mEglIntegration(eglIntegration)
+ , mWindow(window)
+ , mBuffer(0)
+ , mPixmap(0)
+ , mConfig(q_configFromQPlatformWindowFormat(eglIntegration->eglDisplay(),window->widget()->platformWindowFormat(),true,EGL_PIXMAP_BIT))
+ , mPixmapSurface(EGL_NO_SURFACE)
+{
+ QVector<EGLint> eglContextAttrs;
+ eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+ eglContextAttrs.append(2);
+ eglContextAttrs.append(EGL_NONE);
+
+ mContext = eglCreateContext(eglIntegration->eglDisplay(),mConfig,0,eglContextAttrs.constData());
+
+ geometryChanged();
+}
+
+QWaylandReadbackEglContext::~QWaylandReadbackEglContext()
+{
+ eglDestroyContext(mEglIntegration->eglDisplay(),mContext);
+}
+
+void QWaylandReadbackEglContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+
+ mWindow->waitForFrameSync();
+
+ eglMakeCurrent(mEglIntegration->eglDisplay(),mPixmapSurface,mPixmapSurface,mContext);
+}
+
+void QWaylandReadbackEglContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+ eglMakeCurrent(mEglIntegration->eglDisplay(),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+void QWaylandReadbackEglContext::swapBuffers()
+{
+ eglSwapBuffers(mEglIntegration->eglDisplay(),mPixmapSurface);
+
+ if (QPlatformGLContext::currentContext() != this) {
+ makeCurrent();
+ }
+
+ QSize size = mWindow->geometry().size();
+
+ QImage img(size,QImage::Format_ARGB32);
+ const uchar *constBits = img.bits();
+ void *pixels = const_cast<uchar *>(constBits);
+
+ glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
+
+ img = img.mirrored();
+ qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
+ constBits = img.bits();
+
+ const uchar *constDstBits = mBuffer->image()->bits();
+ uchar *dstBits = const_cast<uchar *>(constDstBits);
+ memcpy(dstBits,constBits,(img.width()*4) * img.height());
+
+
+ mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+}
+
+void * QWaylandReadbackEglContext::getProcAddress(const QString &procName)
+{
+ return (void *) eglGetProcAddress(procName.toLatin1().data());
+}
+
+QPlatformWindowFormat QWaylandReadbackEglContext::platformWindowFormat() const
+{
+ return qt_qPlatformWindowFormatFromConfig(mEglIntegration->eglDisplay(),mConfig);
+}
+
+void QWaylandReadbackEglContext::geometryChanged()
+{
+ QSize size(mWindow->geometry().size());
+ if (size.isEmpty()) {
+ //QGLWidget wants a context for a window without geometry
+ size = QSize(1,1);
+ }
+
+ mWindow->waitForFrameSync();
+
+ delete mBuffer;
+ if (mPixmap)
+ XFreePixmap(mEglIntegration->xDisplay(),mPixmap);
+
+ mBuffer = new QWaylandShmBuffer(mEglIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
+ mWindow->attach(mBuffer);
+ mPixmap = XCreatePixmap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),size.width(),size.height(),mEglIntegration->depth());
+ XSync(mEglIntegration->xDisplay(),False);
+
+ mPixmapSurface = eglCreatePixmapSurface(mEglIntegration->eglDisplay(),mConfig,mPixmap,0);
+ if (mPixmapSurface == EGL_NO_SURFACE) {
+ qDebug() << "Could not make egl surface out of pixmap :(";
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h
new file mode 100644
index 0000000000..ac682759e9
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglcontext.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKEGLGLCONTEXT_H
+#define QWAYLANDREADBACKEGLGLCONTEXT_H
+
+#include <QPlatformGLContext>
+#include <QtGui/QWidget>
+
+#include "qwaylandreadbackeglintegration.h"
+#include "qwaylandreadbackeglwindow.h"
+
+class QWaylandShmBuffer;
+
+class QWaylandReadbackEglContext : public QPlatformGLContext
+{
+public:
+ QWaylandReadbackEglContext(QWaylandReadbackEglIntegration *eglIntegration, QWaylandReadbackEglWindow *window);
+ ~QWaylandReadbackEglContext();
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString& procName);
+
+ virtual QPlatformWindowFormat platformWindowFormat() const;
+
+ void geometryChanged();
+
+private:
+ QWaylandReadbackEglIntegration *mEglIntegration;
+ QWaylandReadbackEglWindow *mWindow;
+ QWaylandShmBuffer *mBuffer;
+
+ Pixmap mPixmap;
+
+ EGLConfig mConfig;
+ EGLContext mContext;
+ EGLSurface mPixmapSurface;
+};
+
+#endif // QWAYLANDREADBACKEGLGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
new file mode 100644
index 0000000000..20f7ffb609
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackeglintegration.h"
+
+#include <QDebug>
+
+#include "qwaylandreadbackeglwindow.h"
+
+QWaylandReadbackEglIntegration::QWaylandReadbackEglIntegration(QWaylandDisplay *display)
+ : QWaylandGLIntegration()
+ , mWaylandDisplay(display)
+{
+ qDebug() << "Using Readback-EGL";
+ char *display_name = getenv("DISPLAY");
+ mDisplay = XOpenDisplay(display_name);
+ mScreen = XDefaultScreen(mDisplay);
+ mRootWindow = XDefaultRootWindow(mDisplay);
+ XSync(mDisplay, False);
+}
+
+QWaylandReadbackEglIntegration::~QWaylandReadbackEglIntegration()
+{
+ XCloseDisplay(mDisplay);
+}
+
+
+QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+ return new QWaylandReadbackEglIntegration(waylandDisplay);
+}
+
+void QWaylandReadbackEglIntegration::initialize()
+{
+ eglBindAPI(EGL_OPENGL_ES_API);
+ mEglDisplay = eglGetDisplay(mDisplay);
+ EGLint major, minor;
+ EGLBoolean initialized = eglInitialize(mEglDisplay,&major,&minor);
+ if (initialized) {
+ qDebug() << "EGL initialized successfully" << major << "," << minor;
+ } else {
+ qDebug() << "EGL could not initialized. All EGL and GL operations will fail";
+ }
+}
+
+QWaylandWindow * QWaylandReadbackEglIntegration::createEglWindow(QWidget *widget)
+{
+ return new QWaylandReadbackEglWindow(widget,this);
+}
+
+EGLDisplay QWaylandReadbackEglIntegration::eglDisplay()
+{
+ return mEglDisplay;
+}
+
+Window QWaylandReadbackEglIntegration::rootWindow() const
+{
+ return mRootWindow;
+}
+
+int QWaylandReadbackEglIntegration::depth() const
+{
+ return XDefaultDepth(mDisplay,mScreen);
+}
+
+Display * QWaylandReadbackEglIntegration::xDisplay() const
+{
+ return mDisplay;
+}
+
+QWaylandDisplay * QWaylandReadbackEglIntegration::waylandDisplay() const
+{
+ return mWaylandDisplay;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h
new file mode 100644
index 0000000000..84fa64fd34
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglintegration.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKEGLINTEGRATION_H
+#define QWAYLANDREADBACKEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+#include <EGL/egl.h>
+
+class QWaylandReadbackEglIntegration : public QWaylandGLIntegration
+{
+public:
+ QWaylandReadbackEglIntegration(QWaylandDisplay *display);
+ ~QWaylandReadbackEglIntegration();
+
+ void initialize();
+ QWaylandWindow *createEglWindow(QWidget *widget);
+
+ QWaylandDisplay *waylandDisplay() const;
+ Display *xDisplay() const;
+ Window rootWindow() const;
+ int depth() const;
+
+ EGLDisplay eglDisplay();
+
+private:
+ QWaylandDisplay *mWaylandDisplay;
+ Display *mDisplay;
+ int mScreen;
+ Window mRootWindow;
+ EGLDisplay mEglDisplay;
+
+};
+
+#endif // QWAYLANDREADBACKEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp
new file mode 100644
index 0000000000..2ae212ba67
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.cpp
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackeglwindow.h"
+
+#include "qwaylandreadbackeglcontext.h"
+
+QWaylandReadbackEglWindow::QWaylandReadbackEglWindow(QWidget *window, QWaylandReadbackEglIntegration *eglIntegration)
+ : QWaylandShmWindow(window)
+ , mEglIntegration(eglIntegration)
+ , mContext(0)
+{
+}
+
+QWaylandWindow::WindowType QWaylandReadbackEglWindow::windowType() const
+{
+ //We'r lying, maybe we should add a type, but for now it will do
+ //since this is primarly used by the windowsurface.
+ return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext *QWaylandReadbackEglWindow::glContext() const
+{
+ if (!mContext) {
+ QWaylandReadbackEglWindow *that = const_cast<QWaylandReadbackEglWindow *>(this);
+ that->mContext = new QWaylandReadbackEglContext(mEglIntegration,that);
+ }
+ return mContext;
+}
+
+void QWaylandReadbackEglWindow::setGeometry(const QRect &rect)
+{
+ QPlatformWindow::setGeometry(rect);
+
+ if (mContext)
+ mContext->geometryChanged();
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h
new file mode 100644
index 0000000000..453ad27cd9
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/qwaylandreadbackeglwindow.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKEGLWINDOW_H
+#define QWAYLANDREADBACKEGLWINDOW_H
+
+#include "qwaylandshmwindow.h"
+#include "qwaylandreadbackeglintegration.h"
+
+class QWaylandReadbackEglContext;
+
+class QWaylandReadbackEglWindow : public QWaylandShmWindow
+{
+public:
+ QWaylandReadbackEglWindow(QWidget *window, QWaylandReadbackEglIntegration *eglIntegration);
+
+ WindowType windowType() const;
+
+ QPlatformGLContext *glContext() const;
+
+ void setGeometry(const QRect &rect);
+
+private:
+ QWaylandReadbackEglIntegration *mEglIntegration;
+ QWaylandReadbackEglContext *mContext;
+};
+
+#endif // QWAYLANDREADBACKEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri b/src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri
new file mode 100644
index 0000000000..0d8e01b6bb
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_egl/readback_egl.pri
@@ -0,0 +1,14 @@
+
+LIBS += -lX11 -lXext -lEGL
+
+HEADERS += \
+ $$PWD/qwaylandreadbackeglintegration.h \
+ $$PWD/qwaylandreadbackeglcontext.h \
+ $$PWD/qwaylandreadbackeglwindow.h \
+ $$PWD/../../../eglconvenience/qeglconvenience.h
+
+SOURCES += \
+ $$PWD/qwaylandreadbackeglintegration.cpp \
+ $$PWD/qwaylandreadbackeglwindow.cpp \
+ $$PWD/qwaylandreadbackeglcontext.cpp \
+ $$PWD/../../../eglconvenience/qeglconvenience.cpp
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp
new file mode 100644
index 0000000000..08c5cf6c51
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.cpp
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackglxcontext.h"
+
+#include "qwaylandshmsurface.h"
+#include "qwaylandreadbackglxwindow.h"
+
+#include <QtCore/QDebug>
+
+static inline void qgl_byteSwapImage(QImage &img, GLenum pixel_type)
+{
+ const int width = img.width();
+ const int height = img.height();
+
+ if (pixel_type == GL_UNSIGNED_INT_8_8_8_8_REV
+ || (pixel_type == GL_UNSIGNED_BYTE && QSysInfo::ByteOrder == QSysInfo::LittleEndian))
+ {
+ for (int i = 0; i < height; ++i) {
+ uint *p = (uint *) img.scanLine(i);
+ for (int x = 0; x < width; ++x)
+ p[x] = ((p[x] << 16) & 0xff0000) | ((p[x] >> 16) & 0xff) | (p[x] & 0xff00ff00);
+ }
+ } else {
+ for (int i = 0; i < height; ++i) {
+ uint *p = (uint *) img.scanLine(i);
+ for (int x = 0; x < width; ++x)
+ p[x] = (p[x] << 8) | ((p[x] >> 24) & 0xff);
+ }
+ }
+}
+
+QWaylandReadbackGlxContext::QWaylandReadbackGlxContext(QWaylandReadbackGlxIntegration *glxIntegration, QWaylandReadbackGlxWindow *window)
+ : QPlatformGLContext()
+ , mGlxIntegration(glxIntegration)
+ , mWindow(window)
+ , mBuffer(0)
+ , mPixmap(0)
+ , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat(),GLX_PIXMAP_BIT))
+ , mGlxPixmap(0)
+{
+ XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
+ mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
+
+ geometryChanged();
+}
+
+void QWaylandReadbackGlxContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+
+ glXMakeCurrent(mGlxIntegration->xDisplay(),mGlxPixmap,mContext);
+}
+
+void QWaylandReadbackGlxContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+}
+
+void QWaylandReadbackGlxContext::swapBuffers()
+{
+ if (QPlatformGLContext::currentContext() != this) {
+ makeCurrent();
+ }
+
+ QSize size = mWindow->geometry().size();
+
+ QImage img(size,QImage::Format_ARGB32);
+ const uchar *constBits = img.bits();
+ void *pixels = const_cast<uchar *>(constBits);
+
+ glReadPixels(0,0, size.width(), size.height(), GL_RGBA,GL_UNSIGNED_BYTE, pixels);
+
+ img = img.mirrored();
+ qgl_byteSwapImage(img,GL_UNSIGNED_INT_8_8_8_8_REV);
+ constBits = img.bits();
+
+ const uchar *constDstBits = mBuffer->image()->bits();
+ uchar *dstBits = const_cast<uchar *>(constDstBits);
+ memcpy(dstBits,constBits,(img.width()*4) * img.height());
+
+
+ mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+ mWindow->waitForFrameSync();
+
+}
+
+void * QWaylandReadbackGlxContext::getProcAddress(const QString &procName)
+{
+ return (void *) glXGetProcAddress(reinterpret_cast<GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QWaylandReadbackGlxContext::platformWindowFormat() const
+{
+ return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
+}
+
+void QWaylandReadbackGlxContext::geometryChanged()
+{
+ QSize size(mWindow->geometry().size());
+ if (size.isEmpty()) {
+ //QGLWidget wants a context for a window without geometry
+ size = QSize(1,1);
+ }
+
+ mWindow->waitForFrameSync();
+
+ delete mBuffer;
+ //XFreePixmap deletes the glxPixmap as well
+ if (mPixmap) {
+ XFreePixmap(mGlxIntegration->xDisplay(),mPixmap);
+ }
+
+ mBuffer = new QWaylandShmBuffer(mGlxIntegration->waylandDisplay(),size,QImage::Format_ARGB32);
+ mWindow->attach(mBuffer);
+ int depth = XDefaultDepth(mGlxIntegration->xDisplay(),mGlxIntegration->screen());
+ mPixmap = XCreatePixmap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),size.width(),size.height(),depth);
+ XSync(mGlxIntegration->xDisplay(),False);
+
+ mGlxPixmap = glXCreatePixmap(mGlxIntegration->xDisplay(),mConfig,mPixmap,0);
+
+ if (!mGlxPixmap) {
+ qDebug() << "Could not make egl surface out of pixmap :(";
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h
new file mode 100644
index 0000000000..5fafcf03bf
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxcontext.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKGLXCONTEXT_H
+#define QWAYLANDREADBACKGLXCONTEXT_H
+
+#include <QPlatformGLContext>
+
+#include "qwaylandreadbackglxintegration.h"
+
+#include "qglxconvenience.h"
+
+class QWaylandReadbackGlxWindow;
+class QWaylandShmBuffer;
+
+class QWaylandReadbackGlxContext : public QPlatformGLContext
+{
+public:
+ QWaylandReadbackGlxContext(QWaylandReadbackGlxIntegration *glxIntegration, QWaylandReadbackGlxWindow *window);
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString& procName);
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+ void geometryChanged();
+
+private:
+ QWaylandReadbackGlxIntegration *mGlxIntegration;
+ QWaylandReadbackGlxWindow *mWindow;
+ QWaylandShmBuffer *mBuffer;
+
+ Pixmap mPixmap;
+ GLXFBConfig mConfig;
+ GLXContext mContext;
+ GLXPixmap mGlxPixmap;
+};
+
+#endif // QWAYLANDREADBACKGLXCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
new file mode 100644
index 0000000000..4651f0c30e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackglxintegration.h"
+
+#include "qwaylandreadbackglxwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandReadbackGlxIntegration::QWaylandReadbackGlxIntegration(QWaylandDisplay * waylandDispaly)
+ : QWaylandGLIntegration()
+ , mWaylandDisplay(waylandDispaly)
+{
+ qDebug() << "Using Readback-GLX";
+ char *display_name = getenv("DISPLAY");
+ mDisplay = XOpenDisplay(display_name);
+ mScreen = XDefaultScreen(mDisplay);
+ mRootWindow = XDefaultRootWindow(mDisplay);
+ XSync(mDisplay, False);
+}
+
+QWaylandReadbackGlxIntegration::~QWaylandReadbackGlxIntegration()
+{
+ XCloseDisplay(mDisplay);
+}
+
+void QWaylandReadbackGlxIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandReadbackGlxIntegration::createEglWindow(QWidget *widget)
+{
+ return new QWaylandReadbackGlxWindow(widget,this);
+}
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+ return new QWaylandReadbackGlxIntegration(waylandDisplay);
+}
+
+Display * QWaylandReadbackGlxIntegration::xDisplay() const
+{
+ return mDisplay;
+}
+
+int QWaylandReadbackGlxIntegration::screen() const
+{
+ return mScreen;
+}
+
+Window QWaylandReadbackGlxIntegration::rootWindow() const
+{
+ return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandReadbackGlxIntegration::waylandDisplay() const
+{
+ return mWaylandDisplay;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h
new file mode 100644
index 0000000000..9056393905
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxintegration.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKGLXINTEGRATION_H
+#define QWAYLANDREADBACKGLXINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+class QWaylandReadbackGlxIntegration : public QWaylandGLIntegration
+{
+public:
+ QWaylandReadbackGlxIntegration(QWaylandDisplay * waylandDispaly);
+ ~QWaylandReadbackGlxIntegration();
+
+ void initialize();
+
+ QWaylandWindow *createEglWindow(QWidget *widget);
+
+ QWaylandDisplay *waylandDisplay() const;
+
+ Display *xDisplay() const;
+ int screen() const;
+ Window rootWindow() const;
+
+private:
+ QWaylandDisplay *mWaylandDisplay;
+
+ Display *mDisplay;
+ int mScreen;
+ Window mRootWindow;
+
+};
+
+#endif // QWAYLANDREADBACKGLXINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp
new file mode 100644
index 0000000000..ca1603c649
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandreadbackglxwindow.h"
+
+QWaylandReadbackGlxWindow::QWaylandReadbackGlxWindow(QWidget *window, QWaylandReadbackGlxIntegration *glxIntegration)
+ : QWaylandShmWindow(window)
+ , mGlxIntegration(glxIntegration)
+ , mContext(0)
+{
+}
+
+QWaylandWindow::WindowType QWaylandReadbackGlxWindow::windowType() const
+{
+ //yeah. this type needs a new name
+ return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandReadbackGlxWindow::glContext() const
+{
+ if (!mContext) {
+ QWaylandReadbackGlxWindow *that = const_cast<QWaylandReadbackGlxWindow *>(this);
+ that->mContext = new QWaylandReadbackGlxContext(mGlxIntegration,that);
+ }
+ return mContext;
+}
+
+void QWaylandReadbackGlxWindow::setGeometry(const QRect &rect)
+{
+ QWaylandShmWindow::setGeometry(rect);
+
+ if (mContext) {
+ mContext->geometryChanged();
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h
new file mode 100644
index 0000000000..4d7bb3ee74
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/qwaylandreadbackglxwindow.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDREADBACKGLXWINDOW_H
+#define QWAYLANDREADBACKGLXWINDOW_H
+
+#include "qwaylandshmwindow.h"
+#include "qwaylandreadbackglxintegration.h"
+#include "qwaylandreadbackglxcontext.h"
+
+class QWaylandReadbackGlxWindow : public QWaylandShmWindow
+{
+public:
+ QWaylandReadbackGlxWindow(QWidget *window, QWaylandReadbackGlxIntegration *glxIntegration);
+ WindowType windowType() const;
+
+ QPlatformGLContext *glContext() const;
+
+ void setGeometry(const QRect &rect);
+
+private:
+ QWaylandReadbackGlxIntegration *mGlxIntegration;
+ QWaylandReadbackGlxContext *mContext;
+
+};
+
+#endif // QWAYLANDREADBACKGLXWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri b/src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri
new file mode 100644
index 0000000000..f8ea005937
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/readback_glx/readback_glx.pri
@@ -0,0 +1,12 @@
+include (../../../glxconvenience/glxconvenience.pri)
+HEADERS += \
+ $$PWD/qwaylandreadbackglxintegration.h \
+ $$PWD/qwaylandreadbackglxwindow.h \
+ $$PWD/qwaylandreadbackglxcontext.h
+
+SOURCES += \
+ $$PWD/qwaylandreadbackglxintegration.cpp \
+ $$PWD/qwaylandreadbackglxwindow.cpp \
+ $$PWD/qwaylandreadbackglxcontext.cpp
+
+LIBS += -lX11
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
new file mode 100644
index 0000000000..5dc2addd10
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglinclude.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDEGLINCLUDE_H
+#define QWAYLANDEGLINCLUDE_H
+
+#include <wayland-client.h>
+
+#include <wayland-egl.h>
+
+#define GL_GLEXT_PROTOTYPES
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#define EGL_EGLEXT_PROTOTYPES
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#endif // QWAYLANDEGLINCLUDE_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
new file mode 100644
index 0000000000..39e7be5ac6
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandeglintegration.h"
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include "qwaylandeglwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandEglIntegration::QWaylandEglIntegration(struct wl_display *waylandDisplay)
+ : mWaylandDisplay(waylandDisplay)
+ , mNativeEglDisplay(wl_egl_display_create(mWaylandDisplay))
+{
+ qDebug() << "Using Wayland-EGL";
+}
+
+
+QWaylandEglIntegration::~QWaylandEglIntegration()
+{
+ eglTerminate(mEglDisplay);
+}
+
+void QWaylandEglIntegration::initialize()
+{
+ EGLint major,minor;
+ mEglDisplay = eglGetDisplay((EGLNativeDisplayType)mNativeEglDisplay);
+ if (mEglDisplay == NULL) {
+ qWarning("EGL not available");
+ } else {
+ if (!eglInitialize(mEglDisplay, &major, &minor)) {
+ qWarning("failed to initialize EGL display");
+ return;
+ }
+ }
+}
+
+QWaylandWindow *QWaylandEglIntegration::createEglWindow(QWidget *window)
+{
+ return new QWaylandEglWindow(window);
+}
+
+EGLDisplay QWaylandEglIntegration::eglDisplay() const
+{
+ return mEglDisplay;
+}
+
+wl_egl_display * QWaylandEglIntegration::nativeDisplay() const
+{
+ return mNativeEglDisplay;
+}
+
+QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+ return new QWaylandEglIntegration(waylandDisplay->wl_display());
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
new file mode 100644
index 0000000000..bf4c3fe45c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDEGLINTEGRATION_H
+#define QWAYLANDEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+
+#include "qwaylandeglinclude.h"
+
+class QWaylandWindow;
+class QWidget;
+
+class QWaylandEglIntegration : public QWaylandGLIntegration
+{
+public:
+ QWaylandEglIntegration(struct wl_display *waylandDisplay);
+ ~QWaylandEglIntegration();
+
+ void initialize();
+
+ QWaylandWindow *createEglWindow(QWidget *window);
+
+ EGLDisplay eglDisplay() const;
+ struct wl_egl_display *nativeDisplay() const;
+private:
+ struct wl_display *mWaylandDisplay;
+
+ EGLDisplay mEglDisplay;
+ struct wl_egl_display *mNativeEglDisplay;
+
+
+};
+
+#endif // QWAYLANDEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
new file mode 100644
index 0000000000..d7cf0a55e1
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandeglwindow.h"
+
+#include "qwaylandscreen.h"
+#include "qwaylandglcontext.h"
+
+QWaylandEglWindow::QWaylandEglWindow(QWidget *window)
+ : QWaylandWindow(window)
+ , mGLContext(0)
+ , mWaylandEglWindow(0)
+{
+ mEglIntegration = static_cast<QWaylandEglIntegration *>(mDisplay->eglIntegration());
+ //super creates a new surface
+ newSurfaceCreated();
+}
+
+QWaylandEglWindow::~QWaylandEglWindow()
+{
+ delete mGLContext;
+}
+
+QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
+{
+ return QWaylandWindow::Egl;
+}
+
+void QWaylandEglWindow::setGeometry(const QRect &rect)
+{
+ QWaylandWindow::setGeometry(rect);
+ if (mWaylandEglWindow) {
+ wl_egl_window_resize(mWaylandEglWindow,rect.width(),rect.height(),0,0);
+ }
+}
+
+void QWaylandEglWindow::setParent(const QPlatformWindow *parent)
+{
+ const QWaylandWindow *wParent = static_cast<const QWaylandWindow *>(parent);
+
+ mParentWindow = wParent;
+}
+
+QPlatformGLContext * QWaylandEglWindow::glContext() const
+{
+ if (!mGLContext) {
+ QWaylandEglWindow *that = const_cast<QWaylandEglWindow *>(this);
+ that->mGLContext = new QWaylandGLContext(mEglIntegration->eglDisplay(),widget()->platformWindowFormat());
+
+ EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
+ EGLSurface surface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mGLContext->eglConfig(),window,NULL);
+ that->mGLContext->setEglSurface(surface);
+ }
+
+ return mGLContext;
+}
+
+void QWaylandEglWindow::newSurfaceCreated()
+{
+ if (mWaylandEglWindow) {
+ wl_egl_window_destroy(mWaylandEglWindow);
+ }
+ wl_visual *visual = QWaylandScreen::waylandScreenFromWidget(widget())->visual();
+ QSize size = geometry().size();
+ if (!size.isValid())
+ size = QSize(0,0);
+
+ mWaylandEglWindow = wl_egl_window_create(mEglIntegration->nativeDisplay(),mSurface,size.width(),size.height(),visual);
+ if (mGLContext) {
+ EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
+ EGLSurface surface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mGLContext->eglConfig(),window,NULL);
+ mGLContext->setEglSurface(surface);
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
new file mode 100644
index 0000000000..549d039bf8
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDEGLWINDOW_H
+#define QWAYLANDEGLWINDOW_H
+
+#include "qwaylandwindow.h"
+#include "qwaylandeglinclude.h"
+#include "qwaylandeglintegration.h"
+
+class QWaylandGLContext;
+
+class QWaylandEglWindow : public QWaylandWindow
+{
+public:
+ QWaylandEglWindow(QWidget *window);
+ ~QWaylandEglWindow();
+ WindowType windowType() const;
+ void setGeometry(const QRect &rect);
+ void setParent(const QPlatformWindow *parent);
+ QPlatformGLContext *glContext() const;
+protected:
+ void newSurfaceCreated();
+private:
+ QWaylandEglIntegration *mEglIntegration;
+ QWaylandGLContext *mGLContext;
+ struct wl_egl_window *mWaylandEglWindow;
+ EGLConfig mConfig;
+
+ const QWaylandWindow *mParentWindow;
+};
+
+#endif // QWAYLANDEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
new file mode 100644
index 0000000000..d293019909
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandglcontext.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandwindow.h"
+
+#include "../../../eglconvenience/qeglconvenience.h"
+
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QPlatformWindowFormat>
+#include <QtCore/QMutex>
+
+QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindowFormat &format)
+ : QPlatformGLContext()
+ , mEglDisplay(eglDisplay)
+ , mSurface(EGL_NO_SURFACE)
+ , mConfig(q_configFromQPlatformWindowFormat(mEglDisplay,format,true))
+ , mFormat(qt_qPlatformWindowFormatFromConfig(mEglDisplay,mConfig))
+{
+ QPlatformGLContext *sharePlatformContext = 0;
+ sharePlatformContext = format.sharedGLContext();
+ mFormat.setSharedContext(sharePlatformContext);
+ EGLContext shareEGLContext = EGL_NO_CONTEXT;
+ if (sharePlatformContext)
+ shareEGLContext = static_cast<const QWaylandGLContext*>(sharePlatformContext)->mContext;
+
+ eglBindAPI(EGL_OPENGL_ES_API);
+
+ QVector<EGLint> eglContextAttrs;
+ eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+ eglContextAttrs.append(2);
+ eglContextAttrs.append(EGL_NONE);
+
+ mContext = eglCreateContext(mEglDisplay, mConfig,
+ shareEGLContext, eglContextAttrs.constData());
+}
+
+QWaylandGLContext::QWaylandGLContext()
+ : QPlatformGLContext()
+ , mEglDisplay(0)
+ , mContext(EGL_NO_CONTEXT)
+ , mSurface(EGL_NO_SURFACE)
+ , mConfig(0)
+{ }
+
+QWaylandGLContext::~QWaylandGLContext()
+{
+ eglDestroyContext(mEglDisplay,mContext);
+}
+
+void QWaylandGLContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+ if (mSurface == EGL_NO_SURFACE) {
+ qWarning("makeCurrent with EGL_NO_SURFACE");
+ }
+ eglMakeCurrent(mEglDisplay, mSurface, mSurface, mContext);
+}
+
+void QWaylandGLContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+ eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+}
+
+void QWaylandGLContext::swapBuffers()
+{
+ eglSwapBuffers(mEglDisplay,mSurface);
+}
+
+void *QWaylandGLContext::getProcAddress(const QString &string)
+{
+ return (void *) eglGetProcAddress(string.toLatin1().data());
+}
+
+void QWaylandGLContext::setEglSurface(EGLSurface surface)
+{
+ doneCurrent();
+ mSurface = surface;
+}
+
+EGLConfig QWaylandGLContext::eglConfig() const
+{
+ return mConfig;
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
new file mode 100644
index 0000000000..76caffabfb
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDGLCONTEXT_H
+#define QWAYLANDGLCONTEXT_H
+
+#include "qwaylanddisplay.h"
+
+#include <QtGui/QPlatformGLContext>
+
+#include "qwaylandeglinclude.h"
+
+class QWaylandWindow;
+class QWaylandGLWindowSurface;
+
+class QWaylandGLContext : public QPlatformGLContext {
+public:
+ QWaylandGLContext(EGLDisplay eglDisplay, const QPlatformWindowFormat &format);
+ ~QWaylandGLContext();
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString&);
+
+ QPlatformWindowFormat platformWindowFormat() const { return mFormat; }
+
+ void setEglSurface(EGLSurface surface);
+ EGLConfig eglConfig() const;
+private:
+ EGLDisplay mEglDisplay;
+
+ EGLContext mContext;
+ EGLSurface mSurface;
+ EGLConfig mConfig;
+ QPlatformWindowFormat mFormat;
+
+ QWaylandGLContext();
+
+};
+
+
+#endif // QWAYLANDGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri b/src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri
new file mode 100644
index 0000000000..bc978645c4
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/wayland_egl/wayland_egl.pri
@@ -0,0 +1,12 @@
+LIBS += -lwayland-egl -lEGL
+INCLUDEPATH += $$PWD
+SOURCES += $$PWD/qwaylandeglintegration.cpp \
+ $$PWD/qwaylandglcontext.cpp \
+ $$PWD/qwaylandeglwindow.cpp \
+ $$PWD/../../../eglconvenience/qeglconvenience.cpp
+
+HEADERS += $$PWD/qwaylandeglintegration.h \
+ $$PWD/qwaylandglcontext.h \
+ $$PWD/qwaylandeglwindow.h \
+ $$PWD/../../../eglconvenience/qeglconvenience.h \
+ gl_integration/wayland_egl/qwaylandeglinclude.h
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
new file mode 100644
index 0000000000..92acf752e4
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositeeglcontext.h"
+
+#include "qwaylandxcompositeeglwindow.h"
+#include "qwaylandxcompositebuffer.h"
+
+#include "wayland-xcomposite-client-protocol.h"
+#include <QtCore/QDebug>
+
+#include "qeglconvenience.h"
+#include "qxlibeglintegration.h"
+
+#include <X11/extensions/Xcomposite.h>
+
+QWaylandXCompositeEGLContext::QWaylandXCompositeEGLContext(QWaylandXCompositeEGLIntegration *glxIntegration, QWaylandXCompositeEGLWindow *window)
+ : QPlatformGLContext()
+ , mEglIntegration(glxIntegration)
+ , mWindow(window)
+ , mBuffer(0)
+ , mXWindow(0)
+ , mConfig(q_configFromQPlatformWindowFormat(glxIntegration->eglDisplay(),window->widget()->platformWindowFormat(),true,EGL_WINDOW_BIT))
+ , mWaitingForSync(false)
+{
+ QVector<EGLint> eglContextAttrs;
+ eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION); eglContextAttrs.append(2);
+ eglContextAttrs.append(EGL_NONE);
+
+ mContext = eglCreateContext(glxIntegration->eglDisplay(),mConfig,EGL_NO_CONTEXT,eglContextAttrs.constData());
+ if (mContext == EGL_NO_CONTEXT) {
+ qFatal("failed to find context");
+ }
+
+ geometryChanged();
+}
+
+void QWaylandXCompositeEGLContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+
+ eglMakeCurrent(mEglIntegration->eglDisplay(),mEglWindowSurface,mEglWindowSurface,mContext);
+}
+
+void QWaylandXCompositeEGLContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+ eglMakeCurrent(mEglIntegration->eglDisplay(),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+void QWaylandXCompositeEGLContext::swapBuffers()
+{
+ QSize size = mWindow->geometry().size();
+
+ eglSwapBuffers(mEglIntegration->eglDisplay(),mEglWindowSurface);
+ mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+ mWindow->waitForFrameSync();
+}
+
+void * QWaylandXCompositeEGLContext::getProcAddress(const QString &procName)
+{
+ return (void *)eglGetProcAddress(qPrintable(procName));
+}
+
+QPlatformWindowFormat QWaylandXCompositeEGLContext::platformWindowFormat() const
+{
+ return qt_qPlatformWindowFormatFromConfig(mEglIntegration->eglDisplay(),mConfig);
+}
+
+void QWaylandXCompositeEGLContext::sync_function(void *data)
+{
+ QWaylandXCompositeEGLContext *that = static_cast<QWaylandXCompositeEGLContext *>(data);
+ that->mWaitingForSync = false;
+}
+
+void QWaylandXCompositeEGLContext::geometryChanged()
+{
+ QSize size(mWindow->geometry().size());
+ if (size.isEmpty()) {
+ //QGLWidget wants a context for a window without geometry
+ size = QSize(1,1);
+ }
+
+ delete mBuffer;
+ //XFreePixmap deletes the glxPixmap as well
+ if (mXWindow) {
+ XDestroyWindow(mEglIntegration->xDisplay(),mXWindow);
+ }
+
+ VisualID visualId = QXlibEglIntegration::getCompatibleVisualId(mEglIntegration->xDisplay(),mEglIntegration->eglDisplay(),mConfig);
+
+ XVisualInfo visualInfoTemplate;
+ memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+ visualInfoTemplate.visualid = visualId;
+
+ int matchingCount = 0;
+ XVisualInfo *visualInfo = XGetVisualInfo(mEglIntegration->xDisplay(), VisualIDMask, &visualInfoTemplate, &matchingCount);
+
+ Colormap cmap = XCreateColormap(mEglIntegration->xDisplay(),mEglIntegration->rootWindow(),visualInfo->visual,AllocNone);
+
+ XSetWindowAttributes a;
+ a.colormap = cmap;
+ mXWindow = XCreateWindow(mEglIntegration->xDisplay(), mEglIntegration->rootWindow(),0, 0, size.width(), size.height(),
+ 0, visualInfo->depth, InputOutput, visualInfo->visual,
+ CWColormap, &a);
+
+ XCompositeRedirectWindow(mEglIntegration->xDisplay(), mXWindow, CompositeRedirectManual);
+ XMapWindow(mEglIntegration->xDisplay(), mXWindow);
+
+ mEglWindowSurface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mConfig,mXWindow,0);
+ if (mEglWindowSurface == EGL_NO_SURFACE) {
+ qFatal("Could not make eglsurface");
+ }
+
+ XSync(mEglIntegration->xDisplay(),False);
+ mBuffer = new QWaylandXCompositeBuffer(mEglIntegration->waylandXComposite(),
+ (uint32_t)mXWindow,
+ size,
+ mEglIntegration->waylandDisplay()->argbVisual());
+ mWindow->attach(mBuffer);
+ wl_display_sync_callback(mEglIntegration->waylandDisplay()->wl_display(),
+ QWaylandXCompositeEGLContext::sync_function,
+ this);
+
+ mWaitingForSync = true;
+ wl_display_sync(mEglIntegration->waylandDisplay()->wl_display(),0);
+ mEglIntegration->waylandDisplay()->flushRequests();
+ while (mWaitingForSync) {
+ mEglIntegration->waylandDisplay()->readEvents();
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
new file mode 100644
index 0000000000..f0693d4d81
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglcontext.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEEGLCONTEXT_H
+#define QWAYLANDXCOMPOSITEEGLCONTEXT_H
+
+#include <QtGui/QPlatformGLContext>
+
+#include <QtCore/QWaitCondition>
+
+#include "qwaylandbuffer.h"
+#include "qwaylandxcompositeeglintegration.h"
+
+class QWaylandXCompositeEGLWindow;
+
+class QWaylandXCompositeEGLContext : public QPlatformGLContext
+{
+public:
+ QWaylandXCompositeEGLContext(QWaylandXCompositeEGLIntegration *glxIntegration, QWaylandXCompositeEGLWindow *window);
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString& procName);
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+ void geometryChanged();
+
+private:
+ QWaylandXCompositeEGLIntegration *mEglIntegration;
+ QWaylandXCompositeEGLWindow *mWindow;
+ QWaylandBuffer *mBuffer;
+
+ Window mXWindow;
+ EGLConfig mConfig;
+ EGLContext mContext;
+ EGLSurface mEglWindowSurface;
+
+ static void sync_function(void *data);
+ bool mWaitingForSync;
+};
+
+#endif // QWAYLANDXCOMPOSITEEGLCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
new file mode 100644
index 0000000000..95b4112cdc
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.cpp
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositeeglintegration.h"
+
+#include "qwaylandxcompositeeglwindow.h"
+
+#include <QtCore/QDebug>
+
+#include "wayland-xcomposite-client-protocol.h"
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+ return new QWaylandXCompositeEGLIntegration(waylandDisplay);
+}
+
+QWaylandXCompositeEGLIntegration::QWaylandXCompositeEGLIntegration(QWaylandDisplay * waylandDispaly)
+ : QWaylandGLIntegration()
+ , mWaylandDisplay(waylandDispaly)
+{
+ qDebug() << "Using XComposite-EGL";
+ wl_display_add_global_listener(mWaylandDisplay->wl_display(), QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal,
+ this);
+}
+
+QWaylandXCompositeEGLIntegration::~QWaylandXCompositeEGLIntegration()
+{
+ XCloseDisplay(mDisplay);
+}
+
+void QWaylandXCompositeEGLIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandXCompositeEGLIntegration::createEglWindow(QWidget *widget)
+{
+ return new QWaylandXCompositeEGLWindow(widget,this);
+}
+
+Display * QWaylandXCompositeEGLIntegration::xDisplay() const
+{
+ return mDisplay;
+}
+
+EGLDisplay QWaylandXCompositeEGLIntegration::eglDisplay() const
+{
+ return mEglDisplay;
+}
+
+int QWaylandXCompositeEGLIntegration::screen() const
+{
+ return mScreen;
+}
+
+Window QWaylandXCompositeEGLIntegration::rootWindow() const
+{
+ return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandXCompositeEGLIntegration::waylandDisplay() const
+{
+ return mWaylandDisplay;
+}
+wl_xcomposite * QWaylandXCompositeEGLIntegration::waylandXComposite() const
+{
+ return mWaylandComposite;
+}
+
+const struct wl_xcomposite_listener QWaylandXCompositeEGLIntegration::xcomposite_listener = {
+ QWaylandXCompositeEGLIntegration::rootInformation
+};
+
+void QWaylandXCompositeEGLIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data)
+{
+ Q_UNUSED(version);
+ if (strcmp(interface, "xcomposite") == 0) {
+ QWaylandXCompositeEGLIntegration *integration = static_cast<QWaylandXCompositeEGLIntegration *>(data);
+ integration->mWaylandComposite = wl_xcomposite_create(display,id);
+ wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
+ }
+
+}
+
+void QWaylandXCompositeEGLIntegration::rootInformation(void *data, wl_xcomposite *xcomposite, const char *display_name, uint32_t root_window)
+{
+ Q_UNUSED(xcomposite);
+ QWaylandXCompositeEGLIntegration *integration = static_cast<QWaylandXCompositeEGLIntegration *>(data);
+
+ integration->mDisplay = XOpenDisplay(display_name);
+ integration->mRootWindow = (Window) root_window;
+ integration->mScreen = XDefaultScreen(integration->mDisplay);
+ integration->mEglDisplay = eglGetDisplay(integration->mDisplay);
+ eglBindAPI(EGL_OPENGL_ES_API);
+ EGLint minor,major;
+ if (!eglInitialize(integration->mEglDisplay,&major,&minor)) {
+ qFatal("Failed to initialize EGL");
+ }
+ eglSwapInterval(integration->eglDisplay(),0);
+ qDebug() << "ROOT INFORMATION" << integration->mDisplay << integration->mRootWindow << integration->mScreen;
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
new file mode 100644
index 0000000000..590ae3754c
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglintegration.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEEGLINTEGRATION_H
+#define QWAYLANDXCOMPOSITEEGLINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+#include "wayland-client.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <QWaitCondition>
+
+#include <X11/Xlib.h>
+#include <EGL/egl.h>
+
+struct wl_xcomposite;
+
+class QWaylandXCompositeEGLIntegration : public QWaylandGLIntegration
+{
+public:
+ QWaylandXCompositeEGLIntegration(QWaylandDisplay * waylandDispaly);
+ ~QWaylandXCompositeEGLIntegration();
+
+ void initialize();
+
+ QWaylandWindow *createEglWindow(QWidget *widget);
+
+ QWaylandDisplay *waylandDisplay() const;
+ struct wl_xcomposite *waylandXComposite() const;
+
+ Display *xDisplay() const;
+ EGLDisplay eglDisplay() const;
+ int screen() const;
+ Window rootWindow() const;
+
+private:
+ QWaylandDisplay *mWaylandDisplay;
+ struct wl_xcomposite *mWaylandComposite;
+
+ Display *mDisplay;
+ EGLDisplay mEglDisplay;
+ int mScreen;
+ Window mRootWindow;
+
+ static void wlDisplayHandleGlobal(struct wl_display *display, uint32_t id,
+ const char *interface, uint32_t version, void *data);
+
+ static const struct wl_xcomposite_listener xcomposite_listener;
+ static void rootInformation(void *data,
+ struct wl_xcomposite *xcomposite,
+ const char *display_name,
+ uint32_t root_window);
+};
+
+#endif // QWAYLANDXCOMPOSITEEGLINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
new file mode 100644
index 0000000000..1c9d36fe92
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositeeglwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandXCompositeEGLWindow::QWaylandXCompositeEGLWindow(QWidget *window, QWaylandXCompositeEGLIntegration *glxIntegration)
+ : QWaylandWindow(window)
+ , mGlxIntegration(glxIntegration)
+ , mContext(0)
+{
+
+}
+
+QWaylandWindow::WindowType QWaylandXCompositeEGLWindow::windowType() const
+{
+ //yeah. this type needs a new name
+ return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandXCompositeEGLWindow::glContext() const
+{
+ if (!mContext) {
+ qDebug() << "creating glcontext;";
+ QWaylandXCompositeEGLWindow *that = const_cast<QWaylandXCompositeEGLWindow *>(this);
+ that->mContext = new QWaylandXCompositeEGLContext(mGlxIntegration,that);
+ }
+ return mContext;
+}
+
+void QWaylandXCompositeEGLWindow::setGeometry(const QRect &rect)
+{
+ QWaylandWindow::setGeometry(rect);
+
+ if (mContext) {
+ mContext->geometryChanged();
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
new file mode 100644
index 0000000000..fc33b32322
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/qwaylandxcompositeeglwindow.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEEGLWINDOW_H
+#define QWAYLANDXCOMPOSITEEGLWINDOW_H
+
+#include "qwaylandwindow.h"
+#include "qwaylandxcompositeeglintegration.h"
+#include "qwaylandxcompositeeglcontext.h"
+
+class QWaylandXCompositeEGLWindow : public QWaylandWindow
+{
+public:
+ QWaylandXCompositeEGLWindow(QWidget *window, QWaylandXCompositeEGLIntegration *glxIntegration);
+ WindowType windowType() const;
+
+ QPlatformGLContext *glContext() const;
+
+ void setGeometry(const QRect &rect);
+
+private:
+ QWaylandXCompositeEGLIntegration *mGlxIntegration;
+ QWaylandXCompositeEGLContext *mContext;
+
+};
+
+#endif // QWAYLANDXCOMPOSITEEGLWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri
new file mode 100644
index 0000000000..c3533f9ce3
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_egl/xcomposite_egl.pri
@@ -0,0 +1,15 @@
+include (../xcomposite_share/xcomposite_share.pri)
+include (../../../eglconvenience/eglconvenience.pri)
+include (../../../eglconvenience/xlibeglintegration.pri)
+
+LIBS += -lXcomposite -lEGL
+
+SOURCES += \
+ $$PWD/qwaylandxcompositeeglcontext.cpp \
+ $$PWD/qwaylandxcompositeeglintegration.cpp \
+ $$PWD/qwaylandxcompositeeglwindow.cpp
+
+HEADERS += \
+ $$PWD/qwaylandxcompositeeglcontext.h \
+ $$PWD/qwaylandxcompositeeglintegration.h \
+ $$PWD/qwaylandxcompositeeglwindow.h
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
new file mode 100644
index 0000000000..caf51170a6
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositeglxcontext.h"
+
+#include "qwaylandxcompositeglxwindow.h"
+#include "qwaylandxcompositebuffer.h"
+
+#include "wayland-xcomposite-client-protocol.h"
+#include <QtCore/QDebug>
+
+#include <X11/extensions/Xcomposite.h>
+
+QWaylandXCompositeGLXContext::QWaylandXCompositeGLXContext(QWaylandXCompositeGLXIntegration *glxIntegration, QWaylandXCompositeGLXWindow *window)
+ : QPlatformGLContext()
+ , mGlxIntegration(glxIntegration)
+ , mWindow(window)
+ , mBuffer(0)
+ , mXWindow(0)
+ , mConfig(qglx_findConfig(glxIntegration->xDisplay(),glxIntegration->screen(),window->widget()->platformWindowFormat()))
+ , mWaitingForSyncCallback(false)
+{
+ XVisualInfo *visualInfo = glXGetVisualFromFBConfig(glxIntegration->xDisplay(),mConfig);
+ mContext = glXCreateContext(glxIntegration->xDisplay(),visualInfo,0,TRUE);
+
+ geometryChanged();
+}
+
+void QWaylandXCompositeGLXContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+ glXMakeCurrent(mGlxIntegration->xDisplay(),mXWindow,mContext);
+}
+
+void QWaylandXCompositeGLXContext::doneCurrent()
+{
+ glXMakeCurrent(mGlxIntegration->xDisplay(),0,0);
+ QPlatformGLContext::doneCurrent();
+}
+
+void QWaylandXCompositeGLXContext::swapBuffers()
+{
+ QSize size = mWindow->geometry().size();
+
+ glXSwapBuffers(mGlxIntegration->xDisplay(),mXWindow);
+ mWindow->damage(QRegion(QRect(QPoint(0,0),size)));
+ mWindow->waitForFrameSync();
+}
+
+void * QWaylandXCompositeGLXContext::getProcAddress(const QString &procName)
+{
+ return (void *) glXGetProcAddress(reinterpret_cast<GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QWaylandXCompositeGLXContext::platformWindowFormat() const
+{
+ return qglx_platformWindowFromGLXFBConfig(mGlxIntegration->xDisplay(),mConfig,mContext);
+}
+
+void QWaylandXCompositeGLXContext::sync_function(void *data)
+{
+ QWaylandXCompositeGLXContext *that = static_cast<QWaylandXCompositeGLXContext *>(data);
+ that->mWaitingForSyncCallback = false;
+}
+
+void QWaylandXCompositeGLXContext::waitForSync()
+{
+ wl_display_sync_callback(mGlxIntegration->waylandDisplay()->wl_display(),
+ QWaylandXCompositeGLXContext::sync_function,
+ this);
+ mWaitingForSyncCallback = true;
+ wl_display_sync(mGlxIntegration->waylandDisplay()->wl_display(),0);
+ mGlxIntegration->waylandDisplay()->flushRequests();
+ while (mWaitingForSyncCallback) {
+ mGlxIntegration->waylandDisplay()->readEvents();
+ }
+}
+
+void QWaylandXCompositeGLXContext::geometryChanged()
+{
+ QSize size(mWindow->geometry().size());
+ if (size.isEmpty()) {
+ //QGLWidget wants a context for a window without geometry
+ size = QSize(1,1);
+ }
+
+ delete mBuffer;
+ //XFreePixmap deletes the glxPixmap as well
+ if (mXWindow) {
+ XDestroyWindow(mGlxIntegration->xDisplay(),mXWindow);
+ }
+
+ XVisualInfo *visualInfo = glXGetVisualFromFBConfig(mGlxIntegration->xDisplay(),mConfig);
+ Colormap cmap = XCreateColormap(mGlxIntegration->xDisplay(),mGlxIntegration->rootWindow(),visualInfo->visual,AllocNone);
+
+ XSetWindowAttributes a;
+ a.colormap = cmap;
+ mXWindow = XCreateWindow(mGlxIntegration->xDisplay(), mGlxIntegration->rootWindow(),0, 0, size.width(), size.height(),
+ 0, visualInfo->depth, InputOutput, visualInfo->visual,
+ CWColormap, &a);
+
+ XCompositeRedirectWindow(mGlxIntegration->xDisplay(), mXWindow, CompositeRedirectManual);
+ XMapWindow(mGlxIntegration->xDisplay(), mXWindow);
+
+ XSync(mGlxIntegration->xDisplay(),False);
+ mBuffer = new QWaylandXCompositeBuffer(mGlxIntegration->waylandXComposite(),
+ (uint32_t)mXWindow,
+ size,
+ mGlxIntegration->waylandDisplay()->argbVisual());
+ mWindow->attach(mBuffer);
+ waitForSync();
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
new file mode 100644
index 0000000000..eb2e5a518e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxcontext.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEGLXCONTEXT_H
+#define QWAYLANDXCOMPOSITEGLXCONTEXT_H
+
+#include <QtGui/QPlatformGLContext>
+
+#include <QtCore/QWaitCondition>
+
+#include "qwaylandbuffer.h"
+#include "qwaylandxcompositeglxintegration.h"
+
+#include "qglxconvenience.h"
+
+class QWaylandXCompositeGLXWindow;
+class QWaylandShmBuffer;
+
+class QWaylandXCompositeGLXContext : public QPlatformGLContext
+{
+public:
+ QWaylandXCompositeGLXContext(QWaylandXCompositeGLXIntegration *glxIntegration, QWaylandXCompositeGLXWindow *window);
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString& procName);
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+ void geometryChanged();
+
+private:
+ QWaylandXCompositeGLXIntegration *mGlxIntegration;
+ QWaylandXCompositeGLXWindow *mWindow;
+ QWaylandBuffer *mBuffer;
+
+ Window mXWindow;
+ GLXFBConfig mConfig;
+ GLXContext mContext;
+
+ static void sync_function(void *data);
+ void waitForSync();
+ bool mWaitingForSyncCallback;
+};
+
+#endif // QWAYLANDXCOMPOSITEGLXCONTEXT_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
new file mode 100644
index 0000000000..43c0135c6e
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositeglxintegration.h"
+
+#include "qwaylandxcompositeglxwindow.h"
+
+#include <QtCore/QDebug>
+
+#include "wayland-xcomposite-client-protocol.h"
+
+QWaylandGLIntegration * QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
+{
+ return new QWaylandXCompositeGLXIntegration(waylandDisplay);
+}
+
+QWaylandXCompositeGLXIntegration::QWaylandXCompositeGLXIntegration(QWaylandDisplay * waylandDispaly)
+ : QWaylandGLIntegration()
+ , mWaylandDisplay(waylandDispaly)
+{
+ qDebug() << "Using XComposite-GLX";
+ wl_display_add_global_listener(waylandDispaly->wl_display(), QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal,
+ this);
+}
+
+QWaylandXCompositeGLXIntegration::~QWaylandXCompositeGLXIntegration()
+{
+ XCloseDisplay(mDisplay);
+}
+
+void QWaylandXCompositeGLXIntegration::initialize()
+{
+}
+
+QWaylandWindow * QWaylandXCompositeGLXIntegration::createEglWindow(QWidget *widget)
+{
+ return new QWaylandXCompositeGLXWindow(widget,this);
+}
+
+Display * QWaylandXCompositeGLXIntegration::xDisplay() const
+{
+ return mDisplay;
+}
+
+int QWaylandXCompositeGLXIntegration::screen() const
+{
+ return mScreen;
+}
+
+Window QWaylandXCompositeGLXIntegration::rootWindow() const
+{
+ return mRootWindow;
+}
+
+QWaylandDisplay * QWaylandXCompositeGLXIntegration::waylandDisplay() const
+{
+ return mWaylandDisplay;
+}
+wl_xcomposite * QWaylandXCompositeGLXIntegration::waylandXComposite() const
+{
+ return mWaylandComposite;
+}
+
+const struct wl_xcomposite_listener QWaylandXCompositeGLXIntegration::xcomposite_listener = {
+ QWaylandXCompositeGLXIntegration::rootInformation
+};
+
+void QWaylandXCompositeGLXIntegration::wlDisplayHandleGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data)
+{
+ Q_UNUSED(version);
+ if (strcmp(interface, "xcomposite") == 0) {
+ QWaylandXCompositeGLXIntegration *integration = static_cast<QWaylandXCompositeGLXIntegration *>(data);
+ integration->mWaylandComposite = wl_xcomposite_create(display,id);
+ wl_xcomposite_add_listener(integration->mWaylandComposite,&xcomposite_listener,integration);
+ }
+
+}
+
+void QWaylandXCompositeGLXIntegration::rootInformation(void *data, wl_xcomposite *xcomposite, const char *display_name, uint32_t root_window)
+{
+ Q_UNUSED(xcomposite);
+ QWaylandXCompositeGLXIntegration *integration = static_cast<QWaylandXCompositeGLXIntegration *>(data);
+
+ integration->mDisplay = XOpenDisplay(display_name);
+ integration->mRootWindow = (Window) root_window;
+ integration->mScreen = XDefaultScreen(integration->mDisplay);
+}
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
new file mode 100644
index 0000000000..24a40167e2
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxintegration.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEGLXINTEGRATION_H
+#define QWAYLANDXCOMPOSITEGLXINTEGRATION_H
+
+#include "gl_integration/qwaylandglintegration.h"
+#include "wayland-client.h"
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+#include <QtGui/QWidget>
+
+#include <X11/Xlib.h>
+
+struct wl_xcomposite;
+
+class QWaylandXCompositeGLXIntegration : public QWaylandGLIntegration
+{
+public:
+ QWaylandXCompositeGLXIntegration(QWaylandDisplay * waylandDispaly);
+ ~QWaylandXCompositeGLXIntegration();
+
+ void initialize();
+
+ QWaylandWindow *createEglWindow(QWidget *widget);
+
+ QWaylandDisplay *waylandDisplay() const;
+ struct wl_xcomposite *waylandXComposite() const;
+
+ Display *xDisplay() const;
+ int screen() const;
+ Window rootWindow() const;
+
+private:
+ QWaylandDisplay *mWaylandDisplay;
+ struct wl_xcomposite *mWaylandComposite;
+
+ Display *mDisplay;
+ int mScreen;
+ Window mRootWindow;
+
+ static void wlDisplayHandleGlobal(struct wl_display *display, uint32_t id,
+ const char *interface, uint32_t version, void *data);
+
+ static const struct wl_xcomposite_listener xcomposite_listener;
+ static void rootInformation(void *data,
+ struct wl_xcomposite *xcomposite,
+ const char *display_name,
+ uint32_t root_window);
+};
+
+#endif // QWAYLANDXCOMPOSITEGLXINTEGRATION_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
new file mode 100644
index 0000000000..db0f254a20
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositeglxwindow.h"
+
+#include <QtCore/QDebug>
+
+QWaylandXCompositeGLXWindow::QWaylandXCompositeGLXWindow(QWidget *window, QWaylandXCompositeGLXIntegration *glxIntegration)
+ : QWaylandWindow(window)
+ , mGlxIntegration(glxIntegration)
+ , mContext(0)
+{
+
+}
+
+QWaylandWindow::WindowType QWaylandXCompositeGLXWindow::windowType() const
+{
+ //yeah. this type needs a new name
+ return QWaylandWindow::Egl;
+}
+
+QPlatformGLContext * QWaylandXCompositeGLXWindow::glContext() const
+{
+ if (!mContext) {
+ qDebug() << "creating glcontext;";
+ QWaylandXCompositeGLXWindow *that = const_cast<QWaylandXCompositeGLXWindow *>(this);
+ that->mContext = new QWaylandXCompositeGLXContext(mGlxIntegration,that);
+ }
+ return mContext;
+}
+
+void QWaylandXCompositeGLXWindow::setGeometry(const QRect &rect)
+{
+ QWaylandWindow::setGeometry(rect);
+
+ if (mContext) {
+ mContext->geometryChanged();
+ }
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
new file mode 100644
index 0000000000..536153dbcf
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/qwaylandxcompositeglxwindow.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEGLXWINDOW_H
+#define QWAYLANDXCOMPOSITEGLXWINDOW_H
+
+#include "qwaylandwindow.h"
+#include "qwaylandxcompositeglxintegration.h"
+#include "qwaylandxcompositeglxcontext.h"
+
+class QWaylandXCompositeGLXWindow : public QWaylandWindow
+{
+public:
+ QWaylandXCompositeGLXWindow(QWidget *window, QWaylandXCompositeGLXIntegration *glxIntegration);
+ WindowType windowType() const;
+
+ QPlatformGLContext *glContext() const;
+
+ void setGeometry(const QRect &rect);
+
+private:
+ QWaylandXCompositeGLXIntegration *mGlxIntegration;
+ QWaylandXCompositeGLXContext *mContext;
+
+};
+
+#endif // QWAYLANDXCOMPOSITEGLXWINDOW_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri
new file mode 100644
index 0000000000..43295e91e7
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_glx/xcomposite_glx.pri
@@ -0,0 +1,13 @@
+include (../xcomposite_share/xcomposite_share.pri)
+include (../../../glxconvenience/glxconvenience.pri)
+
+LIBS += -lXcomposite
+SOURCES += \
+ $$PWD/qwaylandxcompositeglxcontext.cpp \
+ $$PWD/qwaylandxcompositeglxintegration.cpp \
+ $$PWD/qwaylandxcompositeglxwindow.cpp
+
+HEADERS += \
+ $$PWD/qwaylandxcompositeglxcontext.h \
+ $$PWD/qwaylandxcompositeglxintegration.h \
+ $$PWD/qwaylandxcompositeglxwindow.h
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
new file mode 100644
index 0000000000..4b0d3a073f
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandxcompositebuffer.h"
+
+#include "wayland-client.h"
+
+QWaylandXCompositeBuffer::QWaylandXCompositeBuffer(wl_xcomposite *xcomposite, uint32_t window, const QSize &size, wl_visual *visual)
+ :mSize(size)
+{
+ mBuffer = wl_xcomposite_create_buffer(xcomposite,
+ window,
+ size.width(),
+ size.height(),
+ visual);
+}
+
+QSize QWaylandXCompositeBuffer::size() const
+{
+ return mSize;
+}
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
new file mode 100644
index 0000000000..b346651957
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDXCOMPOSITEBUFFER_H
+#define QWAYLANDXCOMPOSITEBUFFER_H
+
+#include "qwaylandbuffer.h"
+
+#include "wayland-xcomposite-client-protocol.h"
+
+class QWaylandXCompositeBuffer : public QWaylandBuffer
+{
+public:
+ QWaylandXCompositeBuffer(struct wl_xcomposite *xcomposite,
+ uint32_t window,
+ const QSize &size,
+ struct wl_visual *visual);
+
+ QSize size() const;
+private:
+ QSize mSize;
+};
+
+#endif // QWAYLANDXCOMPOSITEBUFFER_H
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
new file mode 100644
index 0000000000..72376e1dcb
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-client-protocol.h
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef XCOMPOSITE_CLIENT_PROTOCOL_H
+#define XCOMPOSITE_CLIENT_PROTOCOL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include "wayland-util.h"
+
+struct wl_client;
+
+struct wl_xcomposite;
+
+struct wl_proxy;
+
+extern void
+wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);
+extern struct wl_proxy *
+wl_proxy_create(struct wl_proxy *factory,
+ const struct wl_interface *interface);
+extern struct wl_proxy *
+wl_proxy_create_for_id(struct wl_display *display,
+ const struct wl_interface *interface, uint32_t id);
+extern void
+wl_proxy_destroy(struct wl_proxy *proxy);
+
+extern int
+wl_proxy_add_listener(struct wl_proxy *proxy,
+ void (**implementation)(void), void *data);
+
+extern void
+wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
+
+extern void *
+wl_proxy_get_user_data(struct wl_proxy *proxy);
+
+extern const struct wl_interface wl_xcomposite_interface;
+
+struct wl_xcomposite_listener {
+ void (*root)(void *data,
+ struct wl_xcomposite *xcomposite,
+ const char *display_name,
+ uint32_t root_window);
+};
+
+static inline int
+wl_xcomposite_add_listener(struct wl_xcomposite *xcomposite,
+ const struct wl_xcomposite_listener *listener, void *data)
+{
+ return wl_proxy_add_listener((struct wl_proxy *) xcomposite,
+ (void (**)(void)) listener, data);
+}
+
+#define WL_XCOMPOSITE_CREATE_BUFFER 0
+
+static inline struct wl_xcomposite *
+wl_xcomposite_create(struct wl_display *display, uint32_t id)
+{
+ return (struct wl_xcomposite *)
+ wl_proxy_create_for_id(display, &wl_xcomposite_interface, id);
+}
+
+static inline void
+wl_xcomposite_set_user_data(struct wl_xcomposite *xcomposite, void *user_data)
+{
+ wl_proxy_set_user_data((struct wl_proxy *) xcomposite, user_data);
+}
+
+static inline void *
+wl_xcomposite_get_user_data(struct wl_xcomposite *xcomposite)
+{
+ return wl_proxy_get_user_data((struct wl_proxy *) xcomposite);
+}
+
+static inline void
+wl_xcomposite_destroy(struct wl_xcomposite *xcomposite)
+{
+ wl_proxy_destroy((struct wl_proxy *) xcomposite);
+}
+
+static inline struct wl_buffer *
+wl_xcomposite_create_buffer(struct wl_xcomposite *xcomposite, uint32_t x_window, int width, int height, struct wl_visual *visual)
+{
+ struct wl_proxy *id;
+
+ id = wl_proxy_create((struct wl_proxy *) xcomposite,
+ &wl_buffer_interface);
+ if (!id)
+ return NULL;
+
+ wl_proxy_marshal((struct wl_proxy *) xcomposite,
+ WL_XCOMPOSITE_CREATE_BUFFER, id, x_window, width, height, visual);
+
+ return (struct wl_buffer *) id;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
new file mode 100644
index 0000000000..5c966fda46
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/wayland-xcomposite-protocol.c
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <stdlib.h>
+#include <stdint.h>
+#include "wayland-util.h"
+
+static const struct wl_message xcomposite_requests[] = {
+ { "create_buffer", "nuiio" },
+};
+
+static const struct wl_message xcomposite_events[] = {
+ { "root", "su" },
+};
+
+WL_EXPORT const struct wl_interface wl_xcomposite_interface = {
+ "xcomposite", 1,
+ ARRAY_LENGTH(xcomposite_requests), xcomposite_requests,
+ ARRAY_LENGTH(xcomposite_events), xcomposite_events,
+};
+
diff --git a/src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri
new file mode 100644
index 0000000000..03b3521e86
--- /dev/null
+++ b/src/plugins/platforms/wayland/gl_integration/xcomposite_share/xcomposite_share.pri
@@ -0,0 +1,9 @@
+INCLUDEPATH += $$PWD
+
+HEADERS += \
+ $$PWD/wayland-xcomposite-client-protocol.h \
+ gl_integration/xcomposite_share/qwaylandxcompositebuffer.h
+
+SOURCES += \
+ $$PWD/wayland-xcomposite-protocol.c \
+ gl_integration/xcomposite_share/qwaylandxcompositebuffer.cpp
diff --git a/src/plugins/platforms/wayland/main.cpp b/src/plugins/platforms/wayland/main.cpp
new file mode 100644
index 0000000000..6dc1c2b1ae
--- /dev/null
+++ b/src/plugins/platforms/wayland/main.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qwaylandintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QWaylandIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "Wayland";
+ list << "WaylandGL";
+ return list;
+}
+
+QPlatformIntegration *QWaylandIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "wayland")
+ return new QWaylandIntegration;
+ if (system.toLower() == "waylandgl")
+ return new QWaylandIntegration(true);
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(wayland, QWaylandIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/qwaylandbuffer.h b/src/plugins/platforms/wayland/qwaylandbuffer.h
new file mode 100644
index 0000000000..8779d5fda0
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandbuffer.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDBUFFER_H
+#define QWAYLANDBUFFER_H
+
+#include <QtCore/QSize>
+
+#include <wayland-client-protocol.h>
+
+class QWaylandBuffer {
+public:
+ QWaylandBuffer() { }
+ virtual ~QWaylandBuffer() { }
+ wl_buffer *buffer() {return mBuffer;}
+ virtual QSize size() const = 0;
+
+protected:
+ struct wl_buffer *mBuffer;
+};
+
+#endif // QWAYLANDBUFFER_H
diff --git a/src/plugins/platforms/wayland/qwaylandcursor.cpp b/src/plugins/platforms/wayland/qwaylandcursor.cpp
new file mode 100644
index 0000000000..614686f971
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandcursor.cpp
@@ -0,0 +1,191 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandcursor.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandinputdevice.h"
+#include "qwaylandshmsurface.h"
+#include "qwaylandscreen.h"
+
+#include <QtGui/QImageReader>
+
+#define DATADIR "/usr/share"
+
+static const struct pointer_image {
+ const char *filename;
+ int hotspot_x, hotspot_y;
+} pointer_images[] = {
+ /* FIXME: Half of these are wrong... */
+ /* Qt::ArrowCursor */
+ { DATADIR "/wayland/left_ptr.png", 10, 5 },
+ /* Qt::UpArrowCursor */
+ { DATADIR "/wayland/top_side.png", 18, 8 },
+ /* Qt::CrossCursor */
+ { DATADIR "/wayland/top_side.png", 18, 8 },
+ /* Qt::WaitCursor */
+ { DATADIR "/wayland/top_side.png", 18, 8 },
+ /* Qt::IBeamCursor */
+ { DATADIR "/wayland/xterm.png", 15, 15 },
+ /* Qt::SizeVerCursor */
+ { DATADIR "/wayland/top_side.png", 18, 8 },
+ /* Qt::SizeHorCursor */
+ { DATADIR "/wayland/bottom_left_corner.png", 6, 30 },
+ /* Qt::SizeBDiagCursor */
+ { DATADIR "/wayland/bottom_right_corner.png", 28, 28 },
+ /* Qt::SizeFDiagCursor */
+ { DATADIR "/wayland/bottom_side.png", 16, 20 },
+ /* Qt::SizeAllCursor */
+ { DATADIR "/wayland/left_side.png", 10, 20 },
+ /* Qt::BlankCursor */
+ { DATADIR "/wayland/right_side.png", 30, 19 },
+ /* Qt::SplitVCursor */
+ { DATADIR "/wayland/sb_v_double_arrow.png", 15, 15 },
+ /* Qt::SplitHCursor */
+ { DATADIR "/wayland/sb_h_double_arrow.png", 15, 15 },
+ /* Qt::PointingHandCursor */
+ { DATADIR "/wayland/hand2.png", 14, 8 },
+ /* Qt::ForbiddenCursor */
+ { DATADIR "/wayland/top_right_corner.png", 26, 8 },
+ /* Qt::WhatsThisCursor */
+ { DATADIR "/wayland/top_right_corner.png", 26, 8 },
+ /* Qt::BusyCursor */
+ { DATADIR "/wayland/top_right_corner.png", 26, 8 },
+ /* Qt::OpenHandCursor */
+ { DATADIR "/wayland/hand1.png", 18, 11 },
+ /* Qt::ClosedHandCursor */
+ { DATADIR "/wayland/grabbing.png", 20, 17 },
+ /* Qt::DragCopyCursor */
+ { DATADIR "/wayland/dnd-copy.png", 13, 13 },
+ /* Qt::DragMoveCursor */
+ { DATADIR "/wayland/dnd-move.png", 13, 13 },
+ /* Qt::DragLinkCursor */
+ { DATADIR "/wayland/dnd-link.png", 13, 13 },
+};
+
+QWaylandCursor::QWaylandCursor(QWaylandScreen *screen)
+ : QPlatformCursor(screen)
+ , mBuffer(0)
+ , mDisplay(screen->display())
+{
+}
+
+void QWaylandCursor::changeCursor(QCursor *cursor, QWidget *widget)
+{
+ const struct pointer_image *p;
+
+ if (widget == NULL)
+ return;
+
+ p = NULL;
+
+ switch (cursor->shape()) {
+ case Qt::ArrowCursor:
+ p = &pointer_images[cursor->shape()];
+ break;
+ case Qt::UpArrowCursor:
+ case Qt::CrossCursor:
+ case Qt::WaitCursor:
+ break;
+ case Qt::IBeamCursor:
+ p = &pointer_images[cursor->shape()];
+ break;
+ case Qt::SizeVerCursor: /* 5 */
+ case Qt::SizeHorCursor:
+ case Qt::SizeBDiagCursor:
+ case Qt::SizeFDiagCursor:
+ case Qt::SizeAllCursor:
+ case Qt::BlankCursor: /* 10 */
+ break;
+ case Qt::SplitVCursor:
+ case Qt::SplitHCursor:
+ case Qt::PointingHandCursor:
+ p = &pointer_images[cursor->shape()];
+ break;
+ case Qt::ForbiddenCursor:
+ case Qt::WhatsThisCursor: /* 15 */
+ case Qt::BusyCursor:
+ break;
+ case Qt::OpenHandCursor:
+ case Qt::ClosedHandCursor:
+ case Qt::DragCopyCursor:
+ case Qt::DragMoveCursor: /* 20 */
+ case Qt::DragLinkCursor:
+ p = &pointer_images[cursor->shape()];
+ break;
+
+ default:
+ case Qt::BitmapCursor:
+ break;
+ }
+
+ if (!p) {
+ p = &pointer_images[0];
+ qWarning("unhandled cursor %d", cursor->shape());
+ }
+
+ QImageReader reader(p->filename);
+
+ if (!reader.canRead())
+ return;
+
+ if (mBuffer == NULL || mBuffer->size() != reader.size()) {
+ if (mBuffer)
+ delete mBuffer;
+
+ mBuffer = new QWaylandShmBuffer(mDisplay, reader.size(),
+ QImage::Format_ARGB32);
+ }
+
+ reader.read(mBuffer->image());
+
+ mDisplay->setCursor(mBuffer, p->hotspot_x, p->hotspot_y);
+}
+
+void QWaylandDisplay::setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y)
+{
+ /* Qt doesn't tell us which input device we should set the cursor
+ * for, so set it for all devices. */
+ for (int i = 0; i < mInputDevices.count(); i++) {
+ QWaylandInputDevice *inputDevice = mInputDevices.at(i);
+ inputDevice->attach(buffer, x, y);
+ }
+}
diff --git a/src/plugins/platforms/wayland/qwaylandcursor.h b/src/plugins/platforms/wayland/qwaylandcursor.h
new file mode 100644
index 0000000000..254cb9473a
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandcursor.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDCURSOR_H
+#define QWAYLANDCURSOR_H
+
+#include <QtGui/QPlatformCursor>
+
+class QWaylandShmBuffer;
+class QWaylandDisplay;
+class QWaylandScreen;
+
+class QWaylandCursor : QPlatformCursor {
+public:
+ QWaylandCursor(QWaylandScreen *screen);
+
+ void changeCursor(QCursor *cursor, QWidget *widget);
+ QWaylandShmBuffer *mBuffer;
+ QWaylandDisplay *mDisplay;
+};
+
+#endif // QWAYLANDCURSOR_H
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
new file mode 100644
index 0000000000..1c56561904
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp
@@ -0,0 +1,270 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylanddisplay.h"
+
+#include "qwaylandwindow.h"
+#include "qwaylandscreen.h"
+#include "qwaylandcursor.h"
+#include "qwaylandinputdevice.h"
+
+#ifdef QT_WAYLAND_GL_SUPPORT
+#include "gl_integration/qwaylandglintegration.h"
+#endif
+
+#include <QtCore/QAbstractEventDispatcher>
+#include <QtGui/QApplication>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+
+struct wl_surface *QWaylandDisplay::createSurface(void *handle)
+{
+ struct wl_surface * surface = wl_compositor_create_surface(mCompositor);
+ wl_surface_set_user_data(surface, handle);
+ return surface;
+}
+
+struct wl_buffer *QWaylandDisplay::createShmBuffer(int fd,
+ int width, int height,
+ uint32_t stride,
+ struct wl_visual *visual)
+{
+ return wl_shm_create_buffer(mShm, fd, width, height, stride, visual);
+}
+
+struct wl_visual *QWaylandDisplay::rgbVisual()
+{
+ return wl_display_get_rgb_visual(mDisplay);
+}
+
+struct wl_visual *QWaylandDisplay::argbVisual()
+{
+ return wl_display_get_argb_visual(mDisplay);
+}
+
+struct wl_visual *QWaylandDisplay::argbPremultipliedVisual()
+{
+ return wl_display_get_premultiplied_argb_visual(mDisplay);
+}
+
+#ifdef QT_WAYLAND_GL_SUPPORT
+QWaylandGLIntegration * QWaylandDisplay::eglIntegration()
+{
+ return mEglIntegration;
+}
+#endif
+
+void QWaylandDisplay::shellHandleConfigure(void *data, struct wl_shell *shell,
+ uint32_t time, uint32_t edges,
+ struct wl_surface *surface,
+ int32_t width, int32_t height)
+{
+ Q_UNUSED(data);
+ Q_UNUSED(shell);
+ Q_UNUSED(time);
+ Q_UNUSED(edges);
+ QWaylandWindow *ww = (QWaylandWindow *) wl_surface_get_user_data(surface);
+
+ ww->configure(time, edges, 0, 0, width, height);
+}
+
+const struct wl_shell_listener QWaylandDisplay::shellListener = {
+ QWaylandDisplay::shellHandleConfigure,
+};
+
+QWaylandDisplay::QWaylandDisplay(void)
+{
+ mDisplay = wl_display_connect(NULL);
+ if (mDisplay == NULL) {
+ qErrnoWarning(errno, "Failed to create display");
+ qFatal("No wayland connection available.");
+ }
+
+ wl_display_add_global_listener(mDisplay, QWaylandDisplay::displayHandleGlobal, this);
+
+#ifdef QT_WAYLAND_GL_SUPPORT
+ mEglIntegration = QWaylandGLIntegration::createGLIntegration(this);
+#endif
+
+ qRegisterMetaType<uint32_t>("uint32_t");
+
+#ifdef QT_WAYLAND_GL_SUPPORT
+ mEglIntegration->initialize();
+#endif
+
+ connect(QAbstractEventDispatcher::instance(), SIGNAL(aboutToBlock()), this, SLOT(flushRequests()));
+
+ mFd = wl_display_get_fd(mDisplay, sourceUpdate, this);
+
+ mReadNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read, this);
+ connect(mReadNotifier, SIGNAL(activated(int)), this, SLOT(readEvents()));
+
+ waitForScreens();
+}
+
+QWaylandDisplay::~QWaylandDisplay(void)
+{
+ close(mFd);
+#ifdef QT_WAYLAND_GL_SUPPORT
+ delete mEglIntegration;
+#endif
+ wl_display_destroy(mDisplay);
+}
+
+void QWaylandDisplay::createNewScreen(struct wl_output *output, QRect geometry)
+{
+ QWaylandScreen *waylandScreen = new QWaylandScreen(this,output,geometry);
+ mScreens.append(waylandScreen);
+}
+
+void QWaylandDisplay::syncCallback(wl_display_sync_func_t func, void *data)
+{
+ wl_display_sync_callback(mDisplay, func, data);
+}
+
+void QWaylandDisplay::frameCallback(wl_display_frame_func_t func, struct wl_surface *surface, void *data)
+{
+ wl_display_frame_callback(mDisplay, surface, func, data);
+}
+
+void QWaylandDisplay::flushRequests()
+{
+ if (mSocketMask & WL_DISPLAY_WRITABLE)
+ wl_display_iterate(mDisplay, WL_DISPLAY_WRITABLE);
+}
+
+void QWaylandDisplay::readEvents()
+{
+// verify that there is still data on the socket
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(mFd, &fds);
+ fd_set nds;
+ FD_ZERO(&nds);
+ fd_set rs = fds;
+ fd_set ws = nds;
+ fd_set es = nds;
+ timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 0;
+ int ret = ::select(mFd+1, &rs, &ws, &es, &timeout );
+
+ if (ret <= 0) {
+ //qDebug("QWaylandDisplay::readEvents() No data... blocking avoided");
+ return;
+ }
+
+ wl_display_iterate(mDisplay, WL_DISPLAY_READABLE);
+}
+
+void QWaylandDisplay::blockingReadEvents()
+{
+ wl_display_iterate(mDisplay, WL_DISPLAY_READABLE);
+}
+
+int QWaylandDisplay::sourceUpdate(uint32_t mask, void *data)
+{
+ QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
+ waylandDisplay->mSocketMask = mask;
+
+ return 0;
+}
+
+void QWaylandDisplay::outputHandleGeometry(void *data,
+ struct wl_output *output,
+ int32_t x, int32_t y,
+ int32_t width, int32_t height)
+{
+ //call back function called from another thread;
+ //but its safe to call createScreen from another thread since
+ //QWaylandScreen does a moveToThread
+ QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
+ QRect outputRect = QRect(x, y, width, height);
+ waylandDisplay->createNewScreen(output,outputRect);
+}
+
+const struct wl_output_listener QWaylandDisplay::outputListener = {
+ QWaylandDisplay::outputHandleGeometry
+};
+
+void QWaylandDisplay::waitForScreens()
+{
+ flushRequests();
+ while (mScreens.isEmpty())
+ blockingReadEvents();
+}
+
+void QWaylandDisplay::displayHandleGlobal(struct wl_display *display,
+ uint32_t id,
+ const char *interface,
+ uint32_t version,
+ void *data)
+{
+ Q_UNUSED(display);
+ QWaylandDisplay *that = static_cast<QWaylandDisplay *>(data);
+ that->displayHandleGlobal(id, QByteArray(interface), version);
+}
+
+void QWaylandDisplay::displayHandleGlobal(uint32_t id,
+ const QByteArray &interface,
+ uint32_t version)
+{
+ Q_UNUSED(version);
+
+ if (interface == "output") {
+ struct wl_output *output = wl_output_create(mDisplay, id);
+ wl_output_add_listener(output, &outputListener, this);
+ } else if (interface == "compositor") {
+ mCompositor = wl_compositor_create(mDisplay, id);
+ } else if (interface == "shm") {
+ mShm = wl_shm_create(mDisplay, id);
+ } else if (interface == "shell"){
+ mShell = wl_shell_create(mDisplay, id);
+ wl_shell_add_listener(mShell, &shellListener, this);
+ } else if (interface == "input_device") {
+ QWaylandInputDevice *inputDevice =
+ new QWaylandInputDevice(mDisplay, id);
+ mInputDevices.append(inputDevice);
+ }
+}
diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.h b/src/plugins/platforms/wayland/qwaylanddisplay.h
new file mode 100644
index 0000000000..a2cb1b28ad
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylanddisplay.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDDISPLAY_H
+#define QWAYLANDDISPLAY_H
+
+#include <QtCore/QObject>
+#include <QtCore/QRect>
+
+#include <QtCore/QWaitCondition>
+
+#include <wayland-client.h>
+
+class QWaylandInputDevice;
+class QSocketNotifier;
+class QWaylandBuffer;
+class QPlatformScreen;
+class QWaylandScreen;
+class QWaylandGLIntegration;
+class QWaylandDisplay : public QObject {
+ Q_OBJECT
+
+public:
+ QWaylandDisplay(void);
+ ~QWaylandDisplay(void);
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+ struct wl_surface *createSurface(void *handle);
+ struct wl_buffer *createShmBuffer(int fd, int width, int height,
+ uint32_t stride,
+ struct wl_visual *visual);
+ struct wl_visual *rgbVisual();
+ struct wl_visual *argbVisual();
+ struct wl_visual *argbPremultipliedVisual();
+
+#ifdef QT_WAYLAND_GL_SUPPORT
+ QWaylandGLIntegration *eglIntegration();
+#endif
+ void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y);
+
+ void syncCallback(wl_display_sync_func_t func, void *data);
+ void frameCallback(wl_display_frame_func_t func, struct wl_surface *surface, void *data);
+
+ struct wl_display *wl_display() const { return mDisplay; }
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+
+public slots:
+ void createNewScreen(struct wl_output *output, QRect geometry);
+ void readEvents();
+ void blockingReadEvents();
+ void flushRequests();
+
+private:
+ void waitForScreens();
+ void displayHandleGlobal(uint32_t id,
+ const QByteArray &interface,
+ uint32_t version);
+
+ struct wl_display *mDisplay;
+ struct wl_compositor *mCompositor;
+ struct wl_shm *mShm;
+ struct wl_shell *mShell;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+
+ QSocketNotifier *mReadNotifier;
+ int mFd;
+ bool mScreensInitialized;
+
+ uint32_t mSocketMask;
+
+ static const struct wl_output_listener outputListener;
+ static int sourceUpdate(uint32_t mask, void *data);
+ static void displayHandleGlobal(struct wl_display *display,
+ uint32_t id,
+ const char *interface,
+ uint32_t version, void *data);
+ static void outputHandleGeometry(void *data,
+ struct wl_output *output,
+ int32_t x, int32_t y,
+ int32_t width, int32_t height);
+
+#ifdef QT_WAYLAND_GL_SUPPORT
+ QWaylandGLIntegration *mEglIntegration;
+#endif
+
+ static void shellHandleConfigure(void *data, struct wl_shell *shell,
+ uint32_t time, uint32_t edges,
+ struct wl_surface *surface,
+ int32_t width, int32_t height);
+
+ static const struct wl_shell_listener shellListener;
+};
+
+#endif // QWAYLANDDISPLAY_H
diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.cpp b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp
new file mode 100644
index 0000000000..6c2f341f64
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandinputdevice.cpp
@@ -0,0 +1,337 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandinputdevice.h"
+
+#include "qwaylandintegration.h"
+#include "qwaylandwindow.h"
+#include "qwaylandbuffer.h"
+
+#include <QWindowSystemInterface>
+
+#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtGui/QPlatformWindow>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#ifndef QT_NO_WAYLAND_XKB
+#include <X11/extensions/XKBcommon.h>
+#include <X11/keysym.h>
+#endif
+
+QWaylandInputDevice::QWaylandInputDevice(struct wl_display *display,
+ uint32_t id)
+ : mDisplay(display)
+ , mInputDevice(wl_input_device_create(display, id))
+ , mPointerFocus(NULL)
+ , mKeyboardFocus(NULL)
+ , mButtons(0)
+{
+ wl_input_device_add_listener(mInputDevice,
+ &inputDeviceListener,
+ this);
+ wl_input_device_set_user_data(mInputDevice, this);
+
+#ifndef QT_NO_WAYLAND_XKB
+ struct xkb_rule_names names;
+ names.rules = "evdev";
+ names.model = "pc105";
+ names.layout = "us";
+ names.variant = "";
+ names.options = "";
+
+ mXkb = xkb_compile_keymap_from_rules(&names);
+#endif
+}
+
+void QWaylandInputDevice::handleWindowDestroyed(QWaylandWindow *window)
+{
+ if (window == mPointerFocus)
+ mPointerFocus = 0;
+ if (window == mKeyboardFocus)
+ mKeyboardFocus = 0;
+}
+
+void QWaylandInputDevice::inputHandleMotion(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ int32_t x, int32_t y,
+ int32_t surface_x, int32_t surface_y)
+{
+ Q_UNUSED(input_device);
+ QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data;
+ QWaylandWindow *window = inputDevice->mPointerFocus;
+
+ inputDevice->mSurfacePos = QPoint(surface_x, surface_y);
+ inputDevice->mGlobalPos = QPoint(x, y);
+ inputDevice->mTime = time;
+ QWindowSystemInterface::handleMouseEvent(window->widget(),
+ time,
+ inputDevice->mSurfacePos,
+ inputDevice->mGlobalPos,
+ inputDevice->mButtons);
+}
+
+void QWaylandInputDevice::inputHandleButton(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, uint32_t button, uint32_t state)
+{
+ Q_UNUSED(input_device);
+ QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data;
+ QWaylandWindow *window = inputDevice->mPointerFocus;
+ Qt::MouseButton qt_button;
+
+ switch (button) {
+ case 272:
+ qt_button = Qt::LeftButton;
+ break;
+ case 273:
+ qt_button = Qt::RightButton;
+ break;
+ case 274:
+ qt_button = Qt::MiddleButton;
+ break;
+ default:
+ return;
+ }
+
+ if (state)
+ inputDevice->mButtons |= qt_button;
+ else
+ inputDevice->mButtons &= ~qt_button;
+
+ inputDevice->mTime = time;
+ QWindowSystemInterface::handleMouseEvent(window->widget(),
+ time,
+ inputDevice->mSurfacePos,
+ inputDevice->mGlobalPos,
+ inputDevice->mButtons);
+}
+
+#ifndef QT_NO_WAYLAND_XKB
+static Qt::KeyboardModifiers translateModifiers(int s)
+{
+ const uchar qt_alt_mask = XKB_COMMON_MOD1_MASK;
+ const uchar qt_meta_mask = XKB_COMMON_MOD4_MASK;
+
+ Qt::KeyboardModifiers ret = 0;
+ if (s & XKB_COMMON_SHIFT_MASK)
+ ret |= Qt::ShiftModifier;
+ if (s & XKB_COMMON_CONTROL_MASK)
+ ret |= Qt::ControlModifier;
+ if (s & qt_alt_mask)
+ ret |= Qt::AltModifier;
+ if (s & qt_meta_mask)
+ ret |= Qt::MetaModifier;
+
+ return ret;
+}
+
+static uint32_t translateKey(uint32_t sym, char *string, size_t size)
+{
+ Q_UNUSED(size);
+ string[0] = '\0';
+
+ switch (sym) {
+ case XK_Escape: return Qt::Key_Escape;
+ case XK_Tab: return Qt::Key_Tab;
+ case XK_ISO_Left_Tab: return Qt::Key_Backtab;
+ case XK_BackSpace: return Qt::Key_Backspace;
+ case XK_Return: return Qt::Key_Return;
+ case XK_Insert: return Qt::Key_Insert;
+ case XK_Delete: return Qt::Key_Delete;
+ case XK_Clear: return Qt::Key_Delete;
+ case XK_Pause: return Qt::Key_Pause;
+ case XK_Print: return Qt::Key_Print;
+
+ case XK_Home: return Qt::Key_Home;
+ case XK_End: return Qt::Key_End;
+ case XK_Left: return Qt::Key_Left;
+ case XK_Up: return Qt::Key_Up;
+ case XK_Right: return Qt::Key_Right;
+ case XK_Down: return Qt::Key_Down;
+ case XK_Prior: return Qt::Key_PageUp;
+ case XK_Next: return Qt::Key_PageDown;
+
+ case XK_Shift_L: return Qt::Key_Shift;
+ case XK_Shift_R: return Qt::Key_Shift;
+ case XK_Shift_Lock: return Qt::Key_Shift;
+ case XK_Control_L: return Qt::Key_Control;
+ case XK_Control_R: return Qt::Key_Control;
+ case XK_Meta_L: return Qt::Key_Meta;
+ case XK_Meta_R: return Qt::Key_Meta;
+ case XK_Alt_L: return Qt::Key_Alt;
+ case XK_Alt_R: return Qt::Key_Alt;
+ case XK_Caps_Lock: return Qt::Key_CapsLock;
+ case XK_Num_Lock: return Qt::Key_NumLock;
+ case XK_Scroll_Lock: return Qt::Key_ScrollLock;
+ case XK_Super_L: return Qt::Key_Super_L;
+ case XK_Super_R: return Qt::Key_Super_R;
+ case XK_Menu: return Qt::Key_Menu;
+
+ default:
+ string[0] = sym;
+ string[1] = '\0';
+ return toupper(sym);
+ }
+}
+#endif
+
+void QWaylandInputDevice::inputHandleKey(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, uint32_t key, uint32_t state)
+{
+#ifndef QT_NO_WAYLAND_XKB
+ Q_UNUSED(input_device);
+ QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data;
+ QWaylandWindow *window = inputDevice->mKeyboardFocus;
+ uint32_t code, sym, level;
+ Qt::KeyboardModifiers modifiers;
+ QEvent::Type type;
+ char s[2];
+
+ code = key + inputDevice->mXkb->min_key_code;
+
+ level = 0;
+ if (inputDevice->mModifiers & Qt::ShiftModifier &&
+ XkbKeyGroupWidth(inputDevice->mXkb, code, 0) > 1)
+ level = 1;
+
+ sym = XkbKeySymEntry(inputDevice->mXkb, code, level, 0);
+
+ modifiers = translateModifiers(inputDevice->mXkb->map->modmap[code]);
+
+ if (state) {
+ inputDevice->mModifiers |= modifiers;
+ type = QEvent::KeyPress;
+ } else {
+ inputDevice->mModifiers &= ~modifiers;
+ type = QEvent::KeyRelease;
+ }
+
+ sym = translateKey(sym, s, sizeof s);
+
+ qWarning("keycode %d, sym %d, string %d, modifiers 0x%x",
+ code, sym, s[0], (int) inputDevice->mModifiers);
+
+ if (window) {
+ QWindowSystemInterface::handleKeyEvent(window->widget(),
+ time, type, sym,
+ inputDevice->mModifiers,
+ QString::fromLatin1(s));
+ }
+#endif
+}
+
+void QWaylandInputDevice::inputHandlePointerFocus(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, struct wl_surface *surface,
+ int32_t x, int32_t y, int32_t sx, int32_t sy)
+{
+ Q_UNUSED(input_device);
+ Q_UNUSED(x);
+ Q_UNUSED(y);
+ Q_UNUSED(sx);
+ Q_UNUSED(sy);
+ QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data;
+ QWaylandWindow *window;
+
+ if (inputDevice->mPointerFocus) {
+ window = inputDevice->mPointerFocus;
+ QWindowSystemInterface::handleLeaveEvent(window->widget());
+ inputDevice->mPointerFocus = NULL;
+ }
+
+ if (surface) {
+ window = (QWaylandWindow *) wl_surface_get_user_data(surface);
+ QWindowSystemInterface::handleEnterEvent(window->widget());
+ inputDevice->mPointerFocus = window;
+ }
+
+ inputDevice->mTime = time;
+}
+
+void QWaylandInputDevice::inputHandleKeyboardFocus(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ struct wl_surface *surface,
+ struct wl_array *keys)
+{
+#ifndef QT_NO_WAYLAND_XKB
+ Q_UNUSED(input_device);
+ Q_UNUSED(time);
+ QWaylandInputDevice *inputDevice = (QWaylandInputDevice *) data;
+ QWaylandWindow *window;
+ uint32_t *k, *end;
+ uint32_t code;
+
+ end = (uint32_t *) ((char *) keys->data + keys->size);
+ inputDevice->mModifiers = 0;
+ for (k = (uint32_t *) keys->data; k < end; k++) {
+ code = *k + inputDevice->mXkb->min_key_code;
+ inputDevice->mModifiers |=
+ translateModifiers(inputDevice->mXkb->map->modmap[code]);
+ }
+
+ if (surface) {
+ window = (QWaylandWindow *) wl_surface_get_user_data(surface);
+ inputDevice->mKeyboardFocus = window;
+ QWindowSystemInterface::handleWindowActivated(window->widget());
+ } else {
+ inputDevice->mKeyboardFocus = NULL;
+ QWindowSystemInterface::handleWindowActivated(0);
+ }
+#endif
+}
+
+const struct wl_input_device_listener QWaylandInputDevice::inputDeviceListener = {
+ QWaylandInputDevice::inputHandleMotion,
+ QWaylandInputDevice::inputHandleButton,
+ QWaylandInputDevice::inputHandleKey,
+ QWaylandInputDevice::inputHandlePointerFocus,
+ QWaylandInputDevice::inputHandleKeyboardFocus,
+};
+
+void QWaylandInputDevice::attach(QWaylandBuffer *buffer, int x, int y)
+{
+ wl_input_device_attach(mInputDevice, mTime, buffer->buffer(), x, y);
+}
diff --git a/src/plugins/platforms/wayland/qwaylandinputdevice.h b/src/plugins/platforms/wayland/qwaylandinputdevice.h
new file mode 100644
index 0000000000..3c83252c33
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandinputdevice.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDINPUTDEVICE_H
+#define QWAYLANDINPUTDEVICE_H
+
+#include "qwaylandwindow.h"
+
+#include <QSocketNotifier>
+#include <QObject>
+#include <QtGui/QPlatformIntegration>
+#include <QtGui/QPlatformScreen>
+
+#include <wayland-client.h>
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandWindow;
+
+class QWaylandInputDevice {
+public:
+ QWaylandInputDevice(struct wl_display *display, uint32_t id);
+ void attach(QWaylandBuffer *buffer, int x, int y);
+ void handleWindowDestroyed(QWaylandWindow *window);
+
+private:
+ struct wl_display *mDisplay;
+ struct wl_input_device *mInputDevice;
+ QWaylandWindow *mPointerFocus;
+ QWaylandWindow *mKeyboardFocus;
+ static const struct wl_input_device_listener inputDeviceListener;
+ Qt::MouseButtons mButtons;
+ QPoint mSurfacePos;
+ QPoint mGlobalPos;
+ struct xkb_desc *mXkb;
+ Qt::KeyboardModifiers mModifiers;
+ uint32_t mTime;
+
+ static void inputHandleMotion(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ int32_t x, int32_t y,
+ int32_t sx, int32_t sy);
+ static void inputHandleButton(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, uint32_t button, uint32_t state);
+ static void inputHandleKey(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, uint32_t key, uint32_t state);
+ static void inputHandlePointerFocus(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, struct wl_surface *surface,
+ int32_t x, int32_t y, int32_t sx, int32_t sy);
+ static void inputHandleKeyboardFocus(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ struct wl_surface *surface,
+ struct wl_array *keys);
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp
new file mode 100644
index 0000000000..3f3ee5e571
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandintegration.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandshmsurface.h"
+#include "qwaylandshmwindow.h"
+
+#include "qgenericunixfontdatabase.h"
+
+#include <QtGui/QWindowSystemInterface>
+#include <QtGui/QPlatformCursor>
+#include <QtGui/QPlatformWindowFormat>
+
+#include <QtGui/private/qpixmap_raster_p.h>
+#ifdef QT_WAYLAND_GL_SUPPORT
+#include "gl_integration/qwaylandglintegration.h"
+#include "gl_integration/qwaylandglwindowsurface.h"
+#include <QtOpenGL/private/qpixmapdata_gl_p.h>
+#endif
+
+QWaylandIntegration::QWaylandIntegration(bool useOpenGL)
+ : mFontDb(new QGenericUnixFontDatabase())
+ , mDisplay(new QWaylandDisplay())
+ , mUseOpenGL(useOpenGL)
+{
+}
+
+QList<QPlatformScreen *>
+QWaylandIntegration::screens() const
+{
+ return mDisplay->screens();
+}
+
+bool QWaylandIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ case OpenGL: return hasOpenGL();
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPixmapData *QWaylandIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+#ifdef QT_WAYLAND_GL_SUPPORT
+ if (mUseOpenGL)
+ return new QGLPixmapData(type);
+#endif
+ return new QRasterPixmapData(type);
+}
+
+QPlatformWindow *QWaylandIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+#ifdef QT_WAYLAND_GL_SUPPORT
+ bool useOpenGL = mUseOpenGL || (widget->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL);
+ if (useOpenGL)
+ return mDisplay->eglIntegration()->createEglWindow(widget);
+#endif
+ return new QWaylandShmWindow(widget);
+}
+
+QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ Q_UNUSED(winId);
+#ifdef QT_WAYLAND_GL_SUPPORT
+ bool useOpenGL = mUseOpenGL || (widget->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL);
+ if (useOpenGL)
+ return new QWaylandGLWindowSurface(widget);
+#endif
+ return new QWaylandShmWindowSurface(widget);
+}
+
+QPlatformFontDatabase *QWaylandIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+bool QWaylandIntegration::hasOpenGL() const
+{
+#ifdef QT_WAYLAND_GL_SUPPORT
+ return true;
+#else
+ return false;
+#endif
+}
diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h
new file mode 100644
index 0000000000..fc9b8d6a6e
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandintegration.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMINTEGRATION_WAYLAND_H
+#define QPLATFORMINTEGRATION_WAYLAND_H
+
+#include <QtGui/QPlatformIntegration>
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandBuffer;
+class QWaylandDisplay;
+
+class QWaylandIntegration : public QPlatformIntegration
+{
+public:
+ QWaylandIntegration(bool useOpenGL = false);
+
+ bool hasCapability(QPlatformIntegration::Capability cap) const;
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const;
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+private:
+ bool hasOpenGL() const;
+
+ QPlatformFontDatabase *mFontDb;
+ QWaylandDisplay *mDisplay;
+ bool mUseOpenGL;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/wayland/qwaylandscreen.cpp b/src/plugins/platforms/wayland/qwaylandscreen.cpp
new file mode 100644
index 0000000000..4f50cb61e6
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandscreen.cpp
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandscreen.h"
+
+#include "qwaylanddisplay.h"
+#include "qwaylandcursor.h"
+
+QWaylandScreen::QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output, QRect geometry)
+ : QPlatformScreen()
+ , mWaylandDisplay(waylandDisplay)
+ , mOutput(output)
+ , mGeometry(geometry)
+ , mDepth(32)
+ , mFormat(QImage::Format_ARGB32_Premultiplied)
+ , mWaylandCursor(new QWaylandCursor(this))
+{
+ moveToThread(waylandDisplay->thread());
+}
+
+QWaylandScreen::~QWaylandScreen()
+{
+ delete mWaylandCursor;
+}
+
+QWaylandDisplay * QWaylandScreen::display() const
+{
+ return mWaylandDisplay;
+}
+
+QRect QWaylandScreen::geometry() const
+{
+ return mGeometry;
+}
+
+int QWaylandScreen::depth() const
+{
+ return mDepth;
+}
+
+QImage::Format QWaylandScreen::format() const
+{
+ return mFormat;
+}
+
+QWaylandScreen * QWaylandScreen::waylandScreenFromWidget(QWidget *widget)
+{
+ QPlatformScreen *platformScreen = QPlatformScreen::platformScreenForWidget(widget);
+ return static_cast<QWaylandScreen *>(platformScreen);
+}
+
+wl_visual * QWaylandScreen::visual() const
+{
+ struct wl_visual *visual;
+
+ switch (format()) {
+ case QImage::Format_ARGB32:
+ visual = mWaylandDisplay->argbVisual();
+ break;
+ case QImage::Format_ARGB32_Premultiplied:
+ visual = mWaylandDisplay->argbPremultipliedVisual();
+ break;
+ default:
+ qDebug("unsupported buffer format %d requested\n", format());
+ visual = mWaylandDisplay->argbVisual();
+ break;
+ }
+ return visual;
+}
diff --git a/src/plugins/platforms/wayland/qwaylandscreen.h b/src/plugins/platforms/wayland/qwaylandscreen.h
new file mode 100644
index 0000000000..7784646da9
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandscreen.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDSCREEN_H
+#define QWAYLANDSCREEN_H
+
+#include <QtGui/QPlatformScreen>
+
+class QWaylandDisplay;
+class QWaylandCursor;
+struct wl_visual;
+
+class QWaylandScreen : public QPlatformScreen
+{
+public:
+ QWaylandScreen(QWaylandDisplay *waylandDisplay, struct wl_output *output, QRect geometry);
+ ~QWaylandScreen();
+
+ QWaylandDisplay *display() const;
+
+ QRect geometry() const;
+ int depth() const;
+ QImage::Format format() const;
+
+ wl_visual *visual() const;
+
+ static QWaylandScreen *waylandScreenFromWidget(QWidget *widget);
+
+private:
+ QWaylandDisplay *mWaylandDisplay;
+ struct wl_output *mOutput;
+ QRect mGeometry;
+ int mDepth;
+ QImage::Format mFormat;
+ QSize mPhysicalSize;
+ QWaylandCursor *mWaylandCursor;
+};
+
+#endif // QWAYLANDSCREEN_H
diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
new file mode 100644
index 0000000000..34f4436f25
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qwaylandshmsurface.h"
+
+#include <QtCore/qdebug.h>
+#include <QtGui/private/qapplication_p.h>
+
+#include "qwaylanddisplay.h"
+#include "qwaylandshmwindow.h"
+#include "qwaylandscreen.h"
+
+#include <wayland-client.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/mman.h>
+
+QT_BEGIN_NAMESPACE
+
+QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display,
+ const QSize &size, QImage::Format format)
+{
+ int stride = size.width() * 4;
+ int alloc = stride * size.height();
+ char filename[] = "/tmp/wayland-shm-XXXXXX";
+ int fd = mkstemp(filename);
+ if (fd < 0)
+ qWarning("open %s failed: %s", filename, strerror(errno));
+ if (ftruncate(fd, alloc) < 0) {
+ qWarning("ftruncate failed: %s", strerror(errno));
+ close(fd);
+ return;
+ }
+ uchar *data = (uchar *)
+ mmap(NULL, alloc, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ unlink(filename);
+
+ if (data == (uchar *) MAP_FAILED) {
+ qWarning("mmap /dev/zero failed: %s", strerror(errno));
+ close(fd);
+ return;
+ }
+
+ mImage = QImage(data, size.width(), size.height(), stride, format);
+ mBuffer = display->createShmBuffer(fd, size.width(), size.height(),
+ stride, display->argbVisual());
+ close(fd);
+}
+
+QWaylandShmBuffer::~QWaylandShmBuffer(void)
+{
+ munmap((void *) mImage.constBits(), mImage.byteCount());
+ wl_buffer_destroy(mBuffer);
+}
+
+QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window)
+ : QWindowSurface(window)
+ , mBuffer(0)
+ , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+{
+}
+
+QWaylandShmWindowSurface::~QWaylandShmWindowSurface()
+{
+}
+
+QPaintDevice *QWaylandShmWindowSurface::paintDevice()
+{
+ return mBuffer->image();
+}
+
+void QWaylandShmWindowSurface::beginPaint(const QRegion &)
+{
+ QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
+ Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
+ waylandWindow->waitForFrameSync();
+}
+
+void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(offset);
+ QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
+ Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
+ waylandWindow->damage(region);
+}
+
+void QWaylandShmWindowSurface::resize(const QSize &size)
+{
+ QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
+ Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
+
+ QWindowSurface::resize(size);
+ QImage::Format format = QPlatformScreen::platformScreenForWidget(window())->format();
+
+ if (mBuffer != NULL && mBuffer->size() == size)
+ return;
+
+ if (mBuffer != NULL)
+ delete mBuffer;
+
+ mBuffer = new QWaylandShmBuffer(mDisplay, size, format);
+
+ waylandWindow->attach(mBuffer);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.h b/src/plugins/platforms/wayland/qwaylandshmsurface.h
new file mode 100644
index 0000000000..b29ceaf1b8
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandshmsurface.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_WAYLAND_H
+#define QWINDOWSURFACE_WAYLAND_H
+
+#include "qwaylandbuffer.h"
+#include <QtGui/private/qwindowsurface_p.h>
+
+#include <QtGui/QPlatformWindow>
+
+QT_BEGIN_NAMESPACE
+
+class QWaylandDisplay;
+
+class QWaylandShmBuffer : public QWaylandBuffer {
+public:
+ QWaylandShmBuffer(QWaylandDisplay *display,
+ const QSize &size, QImage::Format format);
+ ~QWaylandShmBuffer();
+ QSize size() const { return mImage.size(); }
+ QImage *image() { return &mImage; }
+private:
+ QImage mImage;
+};
+
+class QWaylandShmWindowSurface : public QWindowSurface
+{
+public:
+ QWaylandShmWindowSurface(QWidget *window);
+ ~QWaylandShmWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize(const QSize &size);
+ void beginPaint(const QRegion &);
+
+private:
+ QWaylandShmBuffer *mBuffer;
+ QWaylandDisplay *mDisplay;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.cpp b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
new file mode 100644
index 0000000000..c083e58305
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandshmwindow.h"
+
+#include "qwaylandbuffer.h"
+
+#include <QtCore/QVector>
+
+#include <QtCore/QDebug>
+
+QWaylandShmWindow::QWaylandShmWindow(QWidget *widget)
+ : QWaylandWindow(widget)
+{
+ newSurfaceCreated();
+}
+
+QWaylandShmWindow::~QWaylandShmWindow()
+{
+
+}
+
+QWaylandWindow::WindowType QWaylandShmWindow::windowType() const
+{
+ return QWaylandWindow::Shm;
+}
+
+QPlatformGLContext * QWaylandShmWindow::glContext() const
+{
+ qWarning("Trying to retrieve a glContext from a Raster window surface!");
+ return 0;
+}
+
diff --git a/src/plugins/platforms/wayland/qwaylandshmwindow.h b/src/plugins/platforms/wayland/qwaylandshmwindow.h
new file mode 100644
index 0000000000..5dc6351c46
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandshmwindow.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDSHMWINDOW_H
+#define QWAYLANDSHMWINDOW_H
+
+#include "qwaylandwindow.h"
+#include <QtGui/QRegion>
+
+class QWaylandShmWindow : public QWaylandWindow
+{
+public:
+ QWaylandShmWindow(QWidget *widget);
+ ~QWaylandShmWindow();
+
+ WindowType windowType() const;
+ QPlatformGLContext *glContext() const;
+};
+
+#endif // QWAYLANDSHMWINDOW_H
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
new file mode 100644
index 0000000000..6f522911d7
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaylandwindow.h"
+
+#include "qwaylandbuffer.h"
+#include "qwaylanddisplay.h"
+#include "qwaylandinputdevice.h"
+#include "qwaylandscreen.h"
+
+#include <QtGui/QWidget>
+#include <QtGui/QWindowSystemInterface>
+
+#include <QDebug>
+
+QWaylandWindow::QWaylandWindow(QWidget *window)
+ : QPlatformWindow(window)
+ , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+ , mBuffer(0)
+ , mWaitingForFrameSync(false)
+{
+ static WId id = 1;
+ mWindowId = id++;
+
+ mSurface = mDisplay->createSurface(this);
+}
+
+QWaylandWindow::~QWaylandWindow()
+{
+ if (mSurface)
+ wl_surface_destroy(mSurface);
+
+ QList<QWaylandInputDevice *> inputDevices = mDisplay->inputDevices();
+ for (int i = 0; i < inputDevices.size(); ++i)
+ inputDevices.at(i)->handleWindowDestroyed(this);
+}
+
+WId QWaylandWindow::winId() const
+{
+ return mWindowId;
+}
+
+void QWaylandWindow::setParent(const QPlatformWindow *parent)
+{
+ Q_UNUSED(parent);
+ qWarning("Sub window is not supported");
+}
+
+void QWaylandWindow::setVisible(bool visible)
+{
+ if (!mSurface && visible) {
+ mSurface = mDisplay->createSurface(this);
+ newSurfaceCreated();
+ }
+
+ if (visible) {
+ wl_surface_map_toplevel(mSurface);
+ } else {
+ wl_surface_destroy(mSurface);
+ mSurface = NULL;
+ }
+}
+
+void QWaylandWindow::configure(uint32_t time, uint32_t edges,
+ int32_t x, int32_t y,
+ int32_t width, int32_t height)
+{
+ Q_UNUSED(time);
+ Q_UNUSED(edges);
+ QRect geometry = QRect(x, y, width, height);
+
+ setGeometry(geometry);
+
+ QWindowSystemInterface::handleGeometryChange(widget(), geometry);
+}
+
+void QWaylandWindow::attach(QWaylandBuffer *buffer)
+{
+ mBuffer = buffer;
+ if (mSurface) {
+ wl_surface_attach(mSurface, buffer->buffer(),0,0);
+ }
+}
+
+
+void QWaylandWindow::damage(const QRegion &region)
+{
+ //We have to do sync stuff before calling damage, or we might
+ //get a frame callback before we get the timestamp
+ mDisplay->frameCallback(QWaylandWindow::frameCallback, mSurface, this);
+ mWaitingForFrameSync = true;
+
+ QVector<QRect> rects = region.rects();
+ for (int i = 0; i < rects.size(); i++) {
+ const QRect rect = rects.at(i);
+ wl_surface_damage(mSurface,
+ rect.x(), rect.y(), rect.width(), rect.height());
+ }
+}
+
+void QWaylandWindow::newSurfaceCreated()
+{
+ if (mBuffer) {
+ wl_surface_attach(mSurface,mBuffer->buffer(),0,0);
+ }
+}
+
+void QWaylandWindow::frameCallback(struct wl_surface *surface, void *data, uint32_t time)
+{
+ Q_UNUSED(time);
+ QWaylandWindow *self = static_cast<QWaylandWindow*>(data);
+ self->mWaitingForFrameSync = false;
+}
+
+void QWaylandWindow::waitForFrameSync()
+{
+ mDisplay->flushRequests();
+ while (mWaitingForFrameSync)
+ mDisplay->blockingReadEvents();
+}
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h
new file mode 100644
index 0000000000..1e605088ad
--- /dev/null
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAYLANDWINDOW_H
+#define QWAYLANDWINDOW_H
+
+#include <QtGui/QPlatformWindow>
+#include <QtCore/QWaitCondition>
+
+#include "qwaylanddisplay.h"
+
+class QWaylandDisplay;
+class QWaylandBuffer;
+struct wl_egl_window;
+
+class QWaylandWindow : public QPlatformWindow
+{
+public:
+ enum WindowType {
+ Shm,
+ Egl
+ };
+
+ QWaylandWindow(QWidget *window);
+ ~QWaylandWindow();
+
+ virtual WindowType windowType() const = 0;
+ WId winId() const;
+ void setVisible(bool visible);
+ void setParent(const QPlatformWindow *parent);
+
+ void configure(uint32_t time, uint32_t edges,
+ int32_t x, int32_t y, int32_t width, int32_t height);
+
+ void attach(QWaylandBuffer *buffer);
+ void damage(const QRegion &region);
+
+ void waitForFrameSync();
+protected:
+ struct wl_surface *mSurface;
+ virtual void newSurfaceCreated();
+ QWaylandDisplay *mDisplay;
+ QWaylandBuffer *mBuffer;
+ WId mWindowId;
+ bool mWaitingForFrameSync;
+ QWaitCondition mFrameSyncWait;
+
+private:
+ static void frameCallback(struct wl_surface *surface, void *data, uint32_t time);
+
+
+};
+
+
+#endif // QWAYLANDWINDOW_H
diff --git a/src/plugins/platforms/wayland/wayland.pro b/src/plugins/platforms/wayland/wayland.pro
new file mode 100644
index 0000000000..59454384c2
--- /dev/null
+++ b/src/plugins/platforms/wayland/wayland.pro
@@ -0,0 +1,39 @@
+TARGET = qwayland
+include(../../qpluginbase.pri)
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+DEFINES += Q_PLATFORM_WAYLAND
+DEFINES += $$QMAKE_DEFINES_WAYLAND
+
+SOURCES = main.cpp \
+ qwaylandintegration.cpp \
+ qwaylandshmsurface.cpp \
+ qwaylandinputdevice.cpp \
+ qwaylandcursor.cpp \
+ qwaylanddisplay.cpp \
+ qwaylandwindow.cpp \
+ qwaylandscreen.cpp \
+ qwaylandshmwindow.cpp
+
+HEADERS = qwaylandintegration.h \
+ qwaylandcursor.h \
+ qwaylanddisplay.h \
+ qwaylandwindow.h \
+ qwaylandscreen.h \
+ qwaylandshmsurface.h \
+ qwaylandbuffer.h \
+ qwaylandshmwindow.h
+
+INCLUDEPATH += $$QMAKE_INCDIR_WAYLAND
+LIBS += $$QMAKE_LIBS_WAYLAND
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_WAYLAND
+
+INCLUDEPATH += $$PWD
+
+include ($$PWD/gl_integration/gl_integration.pri)
+
+include (../fontdatabases/genericunix/genericunix.pri)
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/xcb/README b/src/plugins/platforms/xcb/README
new file mode 100644
index 0000000000..17a86e6d08
--- /dev/null
+++ b/src/plugins/platforms/xcb/README
@@ -0,0 +1,3 @@
+Required packages:
+libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm1 libxcb-icccm1-dev libxcb-sync0 libxcb-sync0-dev
+
diff --git a/src/plugins/platforms/xcb/main.cpp b/src/plugins/platforms/xcb/main.cpp
new file mode 100644
index 0000000000..89bc66e052
--- /dev/null
+++ b/src/plugins/platforms/xcb/main.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qxcbintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QXcbIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QXcbIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "xcb";
+ return list;
+}
+
+QPlatformIntegration* QXcbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "xcb")
+ return new QXcbIntegration;
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(xcb, QXcbIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qdri2context.cpp b/src/plugins/platforms/xcb/qdri2context.cpp
new file mode 100644
index 0000000000..dbbfa67d8f
--- /dev/null
+++ b/src/plugins/platforms/xcb/qdri2context.cpp
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdri2context.h"
+
+#include "qxcbwindow.h"
+#include "qxcbconnection.h"
+
+#include <QtCore/QDebug>
+#include <QtGui/QWidget>
+
+#include <xcb/dri2.h>
+#include <xcb/xfixes.h>
+
+#define MESA_EGL_NO_X11_HEADERS
+#define EGL_EGLEXT_PROTOTYPES
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#define GL_GLEXT_PROTOTYPES
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+class QDri2ContextPrivate
+{
+public:
+ QDri2ContextPrivate(QXcbWindow *window)
+ : qXcbWindow(window)
+ , windowFormat(window->widget()->platformWindowFormat())
+ , image(0)
+ {
+ }
+
+ xcb_window_t xcbWindow() { return qXcbWindow->window(); }
+ xcb_connection_t *xcbConnection() { return qXcbWindow->xcb_connection(); }
+
+ QXcbWindow *qXcbWindow;
+ QPlatformWindowFormat windowFormat;
+
+ EGLContext eglContext;
+
+ EGLImageKHR image;
+
+ GLuint fbo;
+ GLuint rbo;
+ GLuint depth;
+
+ QSize size;
+};
+
+QDri2Context::QDri2Context(QXcbWindow *window)
+ : d_ptr(new QDri2ContextPrivate(window))
+{
+ Q_D(QDri2Context);
+
+ static const EGLint contextAttribs[] = {
+ EGL_CONTEXT_CLIENT_VERSION, 2,
+ EGL_NONE
+ };
+
+ eglBindAPI(EGL_OPENGL_ES_API);
+
+ EGLContext shareContext = EGL_NO_CONTEXT;
+ if (window->widget()->platformWindowFormat().sharedGLContext()) {
+ QDri2Context *context = static_cast<QDri2Context *>(window->widget()->platformWindowFormat().sharedGLContext());
+ shareContext = context->d_func()->eglContext;
+ }
+ d->eglContext = eglCreateContext(EGL_DISPLAY_FROM_XCB(d->qXcbWindow), NULL,
+ shareContext, contextAttribs);
+
+ if (d->eglContext == EGL_NO_CONTEXT) {
+ qDebug() << "No eglContext!" << eglGetError();
+ }
+
+ EGLBoolean makeCurrentSuccess = eglMakeCurrent(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),EGL_NO_SURFACE,EGL_NO_SURFACE,d->eglContext);
+ if (!makeCurrentSuccess) {
+ qDebug() << "eglMakeCurrent failed!" << eglGetError();
+ }
+
+ xcb_dri2_create_drawable (d->xcbConnection(), d->xcbWindow());
+
+ glGenFramebuffers(1,&d->fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER,d->fbo);
+ glActiveTexture(GL_TEXTURE0);
+
+ glGenRenderbuffers(1, &d->rbo);
+ glBindRenderbuffer(GL_RENDERBUFFER, d->rbo);
+
+ glGenRenderbuffers(1,&d->depth);
+ glBindRenderbuffer(GL_RENDERBUFFER, d->depth);
+
+ resize(d->qXcbWindow->widget()->geometry().size());
+
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, d->rbo);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERER,d->depth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERER,d->depth);
+
+ //restore the old current context
+ const QPlatformGLContext *currentContext = QPlatformGLContext::currentContext();
+ if (currentContext)
+ const_cast<QPlatformGLContext*>(currentContext)->makeCurrent();
+}
+
+QDri2Context::~QDri2Context()
+{
+ //cleanup
+}
+
+void QDri2Context::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+ Q_D(QDri2Context);
+
+ eglMakeCurrent(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),EGL_NO_SURFACE,EGL_NO_SURFACE,d->eglContext);
+ glBindFramebuffer(GL_FRAMEBUFFER,d->fbo);
+
+}
+
+void QDri2Context::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+ Q_D(QDri2Context);
+ eglMakeCurrent(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+void QDri2Context::swapBuffers()
+{
+ Q_D(QDri2Context);
+ xcb_rectangle_t rectangle;
+ rectangle.x = 0;
+ rectangle.y = 0;
+ rectangle.width = d->qXcbWindow->widget()->geometry().width();
+ rectangle.height = d->qXcbWindow->widget()->geometry().height();
+
+ xcb_xfixes_region_t xfixesRegion = xcb_generate_id(d->xcbConnection());
+ xcb_xfixes_create_region(d->xcbConnection(), xfixesRegion,
+ 1, &rectangle);
+
+ xcb_dri2_copy_region_cookie_t cookie = xcb_dri2_copy_region_unchecked(d->xcbConnection(),
+ d->qXcbWindow->window(),
+ xfixesRegion,
+ XCB_DRI2_ATTACHMENT_BUFFER_FRONT_LEFT,
+ XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT);
+
+ xcb_dri2_copy_region_reply_t *reply = xcb_dri2_copy_region_reply(d->xcbConnection(),cookie,NULL);
+
+ //cleanup
+ delete reply;
+ xcb_xfixes_destroy_region(d->xcbConnection(), xfixesRegion);
+
+}
+
+void * QDri2Context::getProcAddress(const QString &procName)
+{
+ return (void *)eglGetProcAddress(qPrintable(procName));
+}
+
+void QDri2Context::resize(const QSize &size)
+{
+ Q_D(QDri2Context);
+ d->size= size;
+
+ glBindFramebuffer(GL_FRAMEBUFFER,d->fbo);
+
+ xcb_dri2_dri2_buffer_t *backBfr = backBuffer();
+
+ if (d->image) {
+ qDebug() << "destroing image";
+ eglDestroyImageKHR(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),d->image);
+ }
+
+ EGLint imgAttribs[] = {
+ EGL_WIDTH, d->size.width(),
+ EGL_HEIGHT, d->size.height(),
+ EGL_DRM_BUFFER_STRIDE_MESA, backBfr->pitch /4,
+ EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
+ EGL_NONE
+ };
+
+ d->image = eglCreateImageKHR(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),
+ EGL_NO_CONTEXT,
+ EGL_DRM_BUFFER_MESA,
+ (EGLClientBuffer) backBfr->name,
+ imgAttribs);
+
+ glBindRenderbuffer(GL_RENDERBUFFER, d->rbo);
+ glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER,
+ d->image);
+
+ glBindRenderbuffer(GL_RENDERBUFFER, d->depth);
+ glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8_OES,d->size.width(), d->size.height());
+
+}
+
+QPlatformWindowFormat QDri2Context::platformWindowFormat() const
+{
+ Q_D(const QDri2Context);
+ return d->windowFormat;
+}
+
+xcb_dri2_dri2_buffer_t * QDri2Context::backBuffer()
+{
+ Q_D(QDri2Context);
+
+ unsigned int backBufferAttachment = XCB_DRI2_ATTACHMENT_BUFFER_BACK_LEFT;
+ xcb_dri2_get_buffers_cookie_t cookie = xcb_dri2_get_buffers_unchecked (d->xcbConnection(),
+ d->xcbWindow(),
+ 1, 1, &backBufferAttachment);
+
+ xcb_dri2_get_buffers_reply_t *reply = xcb_dri2_get_buffers_reply (d->xcbConnection(), cookie, NULL);
+ if (!reply) {
+ qDebug() << "failed to get buffers reply";
+ return 0;
+ }
+
+ xcb_dri2_dri2_buffer_t *buffers = xcb_dri2_get_buffers_buffers (reply);
+ if (!buffers) {
+ qDebug() << "failed to get buffers";
+ return 0;
+ }
+
+ Q_ASSERT(reply->count == 1);
+
+ delete reply;
+
+ return buffers;
+}
+
+void * QDri2Context::eglContext() const
+{
+ Q_D(const QDri2Context);
+ return d->eglContext;
+}
diff --git a/src/plugins/platforms/xcb/qdri2context.h b/src/plugins/platforms/xcb/qdri2context.h
new file mode 100644
index 0000000000..42dd6bd590
--- /dev/null
+++ b/src/plugins/platforms/xcb/qdri2context.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDRI2CONTEXT_H
+#define QDRI2CONTEXT_H
+
+#include <QtGui/QPlatformGLContext>
+
+class QXcbWindow;
+class QDri2ContextPrivate;
+
+struct xcb_dri2_dri2_buffer_t;
+
+class QDri2Context : public QPlatformGLContext
+{
+ Q_DECLARE_PRIVATE(QDri2Context);
+public:
+ QDri2Context(QXcbWindow *window);
+ ~QDri2Context();
+
+ void makeCurrent();
+ void doneCurrent();
+ void swapBuffers();
+ void* getProcAddress(const QString& procName);
+
+ void resize(const QSize &size);
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+ void *eglContext() const;
+
+protected:
+ xcb_dri2_dri2_buffer_t *backBuffer();
+ QScopedPointer<QDri2ContextPrivate> d_ptr;
+private:
+ Q_DISABLE_COPY(QDri2Context)
+};
+
+#endif // QDRI2CONTEXT_H
diff --git a/src/plugins/platforms/xcb/qglxintegration.cpp b/src/plugins/platforms/xcb/qglxintegration.cpp
new file mode 100644
index 0000000000..190221c5f4
--- /dev/null
+++ b/src/plugins/platforms/xcb/qglxintegration.cpp
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QLibrary>
+#include <QGLFormat>
+
+#include "qxcbwindow.h"
+#include "qxcbscreen.h"
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <GL/glx.h>
+
+#include "qglxintegration.h"
+#include "qglxconvenience.h"
+
+#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4)
+#include <dlfcn.h>
+#endif
+
+QGLXContext::QGLXContext(Window window, QXcbScreen *screen, const QPlatformWindowFormat &format)
+ : QPlatformGLContext()
+ , m_screen(screen)
+ , m_drawable((Drawable)window)
+ , m_context(0)
+{
+ Q_XCB_NOOP(m_screen->connection());
+ const QPlatformGLContext *sharePlatformContext;
+ sharePlatformContext = format.sharedGLContext();
+ GLXContext shareGlxContext = 0;
+ if (sharePlatformContext)
+ shareGlxContext = static_cast<const QGLXContext*>(sharePlatformContext)->glxContext();
+
+ GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
+ m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, shareGlxContext, TRUE);
+ m_windowFormat = qglx_platformWindowFromGLXFBConfig(DISPLAY_FROM_XCB(screen), config, m_context);
+ Q_XCB_NOOP(m_screen->connection());
+}
+
+QGLXContext::QGLXContext(QXcbScreen *screen, Drawable drawable, GLXContext context)
+ : QPlatformGLContext(), m_screen(screen), m_drawable(drawable), m_context(context)
+{
+
+}
+
+QGLXContext::~QGLXContext()
+{
+ Q_XCB_NOOP(m_screen->connection());
+ if (m_context)
+ glXDestroyContext(DISPLAY_FROM_XCB(m_screen), m_context);
+ Q_XCB_NOOP(m_screen->connection());
+}
+
+void QGLXContext::makeCurrent()
+{
+ Q_XCB_NOOP(m_screen->connection());
+ QPlatformGLContext::makeCurrent();
+ glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), m_drawable, m_context);
+ Q_XCB_NOOP(m_screen->connection());
+}
+
+void QGLXContext::doneCurrent()
+{
+ Q_XCB_NOOP(m_screen->connection());
+ QPlatformGLContext::doneCurrent();
+ glXMakeCurrent(DISPLAY_FROM_XCB(m_screen), 0, 0);
+ Q_XCB_NOOP(m_screen->connection());
+}
+
+void QGLXContext::swapBuffers()
+{
+ Q_XCB_NOOP(m_screen->connection());
+ glXSwapBuffers(DISPLAY_FROM_XCB(m_screen), m_drawable);
+ doneCurrent();
+ Q_XCB_NOOP(m_screen->connection());
+}
+
+void* QGLXContext::getProcAddress(const QString& procName)
+{
+ Q_XCB_NOOP(m_screen->connection());
+ typedef void *(*qt_glXGetProcAddressARB)(const GLubyte *);
+ static qt_glXGetProcAddressARB glXGetProcAddressARB = 0;
+ static bool resolved = false;
+
+ if (resolved && !glXGetProcAddressARB)
+ return 0;
+ if (!glXGetProcAddressARB) {
+ QList<QByteArray> glxExt = QByteArray(glXGetClientString(DISPLAY_FROM_XCB(m_screen), GLX_EXTENSIONS)).split(' ');
+ if (glxExt.contains("GLX_ARB_get_proc_address")) {
+#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4)
+ void *handle = dlopen(NULL, RTLD_LAZY);
+ if (handle) {
+ glXGetProcAddressARB = (qt_glXGetProcAddressARB) dlsym(handle, "glXGetProcAddressARB");
+ dlclose(handle);
+ }
+ if (!glXGetProcAddressARB)
+#endif
+ {
+ extern const QString qt_gl_library_name();
+// QLibrary lib(qt_gl_library_name());
+ QLibrary lib(QLatin1String("GL"));
+ glXGetProcAddressARB = (qt_glXGetProcAddressARB) lib.resolve("glXGetProcAddressARB");
+ }
+ }
+ resolved = true;
+ }
+ if (!glXGetProcAddressARB)
+ return 0;
+ return glXGetProcAddressARB(reinterpret_cast<const GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QGLXContext::platformWindowFormat() const
+{
+ return m_windowFormat;
+}
diff --git a/src/plugins/platforms/xcb/qglxintegration.h b/src/plugins/platforms/xcb/qglxintegration.h
new file mode 100644
index 0000000000..99b72a04b5
--- /dev/null
+++ b/src/plugins/platforms/xcb/qglxintegration.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGLXINTEGRATION_H
+#define QGLXINTEGRATION_H
+
+#include "qxcbwindow.h"
+
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QPlatformWindowFormat>
+
+#include <QtCore/QMutex>
+
+#include <GL/glx.h>
+
+class QGLXContext : public QPlatformGLContext
+{
+public:
+ QGLXContext(Window window, QXcbScreen *xd, const QPlatformWindowFormat &format);
+ ~QGLXContext();
+
+ virtual void makeCurrent();
+ virtual void doneCurrent();
+ virtual void swapBuffers();
+ virtual void* getProcAddress(const QString& procName);
+
+ GLXContext glxContext() const { return m_context; }
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+private:
+ QXcbScreen *m_screen;
+ Drawable m_drawable;
+ GLXContext m_context;
+ QPlatformWindowFormat m_windowFormat;
+
+ QGLXContext (QXcbScreen *screen, Drawable drawable, GLXContext context);
+};
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
new file mode 100644
index 0000000000..7ad12fe8b1
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -0,0 +1,780 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbconnection.h"
+#include "qxcbkeyboard.h"
+#include "qxcbscreen.h"
+#include "qxcbwindow.h"
+
+#include <QtAlgorithms>
+#include <QSocketNotifier>
+#include <QtGui/private/qapplication_p.h>
+#include <QAbstractEventDispatcher>
+
+#include <QtCore/QDebug>
+
+#include <stdio.h>
+#include <errno.h>
+
+#ifdef XCB_USE_XLIB
+#include <X11/Xlib.h>
+#include <X11/Xlib-xcb.h>
+#endif
+
+#ifdef XCB_USE_EGL //dont pull in eglext prototypes
+#include <EGL/egl.h>
+#endif
+
+#ifdef XCB_USE_DRI2
+#include <xcb/dri2.h>
+#include <xcb/xfixes.h>
+extern "C" {
+#include <xf86drm.h>
+}
+#define MESA_EGL_NO_X11_HEADERS
+#define EGL_EGLEXT_PROTOTYPES
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#endif
+
+QXcbConnection::QXcbConnection(const char *displayName)
+ : m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
+#ifdef XCB_USE_DRI2
+ , m_dri2_major(0)
+ , m_dri2_minor(0)
+ , m_dri2_support_probed(false)
+ , m_has_support_for_dri2(false)
+#endif
+{
+ int primaryScreen = 0;
+
+#ifdef XCB_USE_XLIB
+ Display *dpy = XOpenDisplay(m_displayName.constData());
+ primaryScreen = DefaultScreen(dpy);
+ m_connection = XGetXCBConnection(dpy);
+ XSetEventQueueOwner(dpy, XCBOwnsEventQueue);
+ m_xlib_display = dpy;
+#ifdef XCB_USE_EGL
+ EGLDisplay eglDisplay = eglGetDisplay(dpy);
+ m_egl_display = eglDisplay;
+ EGLint major, minor;
+ eglBindAPI(EGL_OPENGL_ES_API);
+ m_has_egl = eglInitialize(eglDisplay,&major,&minor);
+#endif //XCB_USE_EGL
+#else
+ m_connection = xcb_connect(m_displayName.constData(), &primaryScreen);
+
+#endif //XCB_USE_XLIB
+ m_setup = xcb_get_setup(xcb_connection());
+
+ initializeAllAtoms();
+
+ xcb_screen_iterator_t it = xcb_setup_roots_iterator(m_setup);
+
+ int screenNumber = 0;
+ while (it.rem) {
+ m_screens << new QXcbScreen(this, it.data, screenNumber++);
+ xcb_screen_next(&it);
+ }
+
+ m_keyboard = new QXcbKeyboard(this);
+
+#ifdef XCB_USE_DRI2
+ initializeDri2();
+#endif
+
+ QSocketNotifier *notifier = new QSocketNotifier(xcb_get_file_descriptor(xcb_connection()), QSocketNotifier::Read, this);
+ connect(notifier, SIGNAL(activated(int)), this, SLOT(processXcbEvents()));
+
+ QAbstractEventDispatcher *dispatcher = QAbstractEventDispatcher::instance(qApp->thread());
+ connect(dispatcher, SIGNAL(aboutToBlock()), this, SLOT(processXcbEvents()));
+
+ sync();
+}
+
+QXcbConnection::~QXcbConnection()
+{
+ qDeleteAll(m_screens);
+
+#ifdef XCB_USE_XLIB
+ XCloseDisplay((Display *)m_xlib_display);
+#else
+ xcb_disconnect(xcb_connection());
+#endif
+
+ delete m_keyboard;
+}
+
+QXcbWindow *platformWindowFromId(xcb_window_t id)
+{
+ QWidget *widget = QWidget::find(id);
+ if (widget)
+ return static_cast<QXcbWindow *>(widget->platformWindow());
+ return 0;
+}
+
+#define HANDLE_PLATFORM_WINDOW_EVENT(event_t, window, handler) \
+{ \
+ event_t *e = (event_t *)event; \
+ if (QXcbWindow *platformWindow = platformWindowFromId(e->window)) { \
+ QObjectPrivate *d = QObjectPrivate::get(platformWindow->widget()); \
+ if (!d->wasDeleted) \
+ platformWindow->handler(e); \
+ } \
+} \
+break;
+
+#define HANDLE_KEYBOARD_EVENT(event_t, handler) \
+{ \
+ event_t *e = (event_t *)event; \
+ if (QXcbWindow *platformWindow = platformWindowFromId(e->event)) \
+ m_keyboard->handler(platformWindow->widget(), e); \
+} \
+break;
+
+//#define XCB_EVENT_DEBUG
+
+void printXcbEvent(const char *message, xcb_generic_event_t *event)
+{
+#ifdef XCB_EVENT_DEBUG
+#define PRINT_XCB_EVENT(ev) \
+ case ev: \
+ printf("%s: %d - %s - sequence: %d\n", message, int(ev), #ev, event->sequence); \
+ break;
+
+ switch (event->response_type & ~0x80) {
+ PRINT_XCB_EVENT(XCB_KEY_PRESS);
+ PRINT_XCB_EVENT(XCB_KEY_RELEASE);
+ PRINT_XCB_EVENT(XCB_BUTTON_PRESS);
+ PRINT_XCB_EVENT(XCB_BUTTON_RELEASE);
+ PRINT_XCB_EVENT(XCB_MOTION_NOTIFY);
+ PRINT_XCB_EVENT(XCB_ENTER_NOTIFY);
+ PRINT_XCB_EVENT(XCB_LEAVE_NOTIFY);
+ PRINT_XCB_EVENT(XCB_FOCUS_IN);
+ PRINT_XCB_EVENT(XCB_FOCUS_OUT);
+ PRINT_XCB_EVENT(XCB_KEYMAP_NOTIFY);
+ PRINT_XCB_EVENT(XCB_EXPOSE);
+ PRINT_XCB_EVENT(XCB_GRAPHICS_EXPOSURE);
+ PRINT_XCB_EVENT(XCB_VISIBILITY_NOTIFY);
+ PRINT_XCB_EVENT(XCB_CREATE_NOTIFY);
+ PRINT_XCB_EVENT(XCB_DESTROY_NOTIFY);
+ PRINT_XCB_EVENT(XCB_UNMAP_NOTIFY);
+ PRINT_XCB_EVENT(XCB_MAP_NOTIFY);
+ PRINT_XCB_EVENT(XCB_MAP_REQUEST);
+ PRINT_XCB_EVENT(XCB_REPARENT_NOTIFY);
+ PRINT_XCB_EVENT(XCB_CONFIGURE_NOTIFY);
+ PRINT_XCB_EVENT(XCB_CONFIGURE_REQUEST);
+ PRINT_XCB_EVENT(XCB_GRAVITY_NOTIFY);
+ PRINT_XCB_EVENT(XCB_RESIZE_REQUEST);
+ PRINT_XCB_EVENT(XCB_CIRCULATE_NOTIFY);
+ PRINT_XCB_EVENT(XCB_CIRCULATE_REQUEST);
+ PRINT_XCB_EVENT(XCB_PROPERTY_NOTIFY);
+ PRINT_XCB_EVENT(XCB_SELECTION_CLEAR);
+ PRINT_XCB_EVENT(XCB_SELECTION_REQUEST);
+ PRINT_XCB_EVENT(XCB_SELECTION_NOTIFY);
+ PRINT_XCB_EVENT(XCB_COLORMAP_NOTIFY);
+ PRINT_XCB_EVENT(XCB_CLIENT_MESSAGE);
+ PRINT_XCB_EVENT(XCB_MAPPING_NOTIFY);
+ default:
+ printf("%s: unknown event - response_type: %d - sequence: %d\n", message, int(event->response_type & ~0x80), int(event->sequence));
+ }
+#else
+ Q_UNUSED(message);
+ Q_UNUSED(event);
+#endif
+}
+
+const char *xcb_errors[] =
+{
+ "Success",
+ "BadRequest",
+ "BadValue",
+ "BadWindow",
+ "BadPixmap",
+ "BadAtom",
+ "BadCursor",
+ "BadFont",
+ "BadMatch",
+ "BadDrawable",
+ "BadAccess",
+ "BadAlloc",
+ "BadColor",
+ "BadGC",
+ "BadIDChoice",
+ "BadName",
+ "BadLength",
+ "BadImplementation",
+ "Unknown"
+};
+
+const char *xcb_protocol_request_codes[] =
+{
+ "Null",
+ "CreateWindow",
+ "ChangeWindowAttributes",
+ "GetWindowAttributes",
+ "DestroyWindow",
+ "DestroySubwindows",
+ "ChangeSaveSet",
+ "ReparentWindow",
+ "MapWindow",
+ "MapSubwindows",
+ "UnmapWindow",
+ "UnmapSubwindows",
+ "ConfigureWindow",
+ "CirculateWindow",
+ "GetGeometry",
+ "QueryTree",
+ "InternAtom",
+ "GetAtomName",
+ "ChangeProperty",
+ "DeleteProperty",
+ "GetProperty",
+ "ListProperties",
+ "SetSelectionOwner",
+ "GetSelectionOwner",
+ "ConvertSelection",
+ "SendEvent",
+ "GrabPointer",
+ "UngrabPointer",
+ "GrabButton",
+ "UngrabButton",
+ "ChangeActivePointerGrab",
+ "GrabKeyboard",
+ "UngrabKeyboard",
+ "GrabKey",
+ "UngrabKey",
+ "AllowEvents",
+ "GrabServer",
+ "UngrabServer",
+ "QueryPointer",
+ "GetMotionEvents",
+ "TranslateCoords",
+ "WarpPointer",
+ "SetInputFocus",
+ "GetInputFocus",
+ "QueryKeymap",
+ "OpenFont",
+ "CloseFont",
+ "QueryFont",
+ "QueryTextExtents",
+ "ListFonts",
+ "ListFontsWithInfo",
+ "SetFontPath",
+ "GetFontPath",
+ "CreatePixmap",
+ "FreePixmap",
+ "CreateGC",
+ "ChangeGC",
+ "CopyGC",
+ "SetDashes",
+ "SetClipRectangles",
+ "FreeGC",
+ "ClearArea",
+ "CopyArea",
+ "CopyPlane",
+ "PolyPoint",
+ "PolyLine",
+ "PolySegment",
+ "PolyRectangle",
+ "PolyArc",
+ "FillPoly",
+ "PolyFillRectangle",
+ "PolyFillArc",
+ "PutImage",
+ "GetImage",
+ "PolyText8",
+ "PolyText16",
+ "ImageText8",
+ "ImageText16",
+ "CreateColormap",
+ "FreeColormap",
+ "CopyColormapAndFree",
+ "InstallColormap",
+ "UninstallColormap",
+ "ListInstalledColormaps",
+ "AllocColor",
+ "AllocNamedColor",
+ "AllocColorCells",
+ "AllocColorPlanes",
+ "FreeColors",
+ "StoreColors",
+ "StoreNamedColor",
+ "QueryColors",
+ "LookupColor",
+ "CreateCursor",
+ "CreateGlyphCursor",
+ "FreeCursor",
+ "RecolorCursor",
+ "QueryBestSize",
+ "QueryExtension",
+ "ListExtensions",
+ "ChangeKeyboardMapping",
+ "GetKeyboardMapping",
+ "ChangeKeyboardControl",
+ "GetKeyboardControl",
+ "Bell",
+ "ChangePointerControl",
+ "GetPointerControl",
+ "SetScreenSaver",
+ "GetScreenSaver",
+ "ChangeHosts",
+ "ListHosts",
+ "SetAccessControl",
+ "SetCloseDownMode",
+ "KillClient",
+ "RotateProperties",
+ "ForceScreenSaver",
+ "SetPointerMapping",
+ "GetPointerMapping",
+ "SetModifierMapping",
+ "GetModifierMapping",
+ "Unknown"
+};
+
+#ifdef Q_XCB_DEBUG
+void QXcbConnection::log(const char *file, int line, int sequence)
+{
+ CallInfo info;
+ info.sequence = sequence;
+ info.file = file;
+ info.line = line;
+ m_callLog << info;
+}
+#endif
+
+void QXcbConnection::handleXcbError(xcb_generic_error_t *error)
+{
+ uint clamped_error_code = qMin<uint>(error->error_code, (sizeof(xcb_errors) / sizeof(xcb_errors[0])) - 1);
+ uint clamped_major_code = qMin<uint>(error->major_code, (sizeof(xcb_protocol_request_codes) / sizeof(xcb_protocol_request_codes[0])) - 1);
+
+ printf("XCB error: %d (%s), sequence: %d, resource id: %d, major code: %d (%s), minor code: %d\n",
+ int(error->error_code), xcb_errors[clamped_error_code],
+ int(error->sequence), int(error->resource_id),
+ int(error->major_code), xcb_protocol_request_codes[clamped_major_code],
+ int(error->minor_code));
+#ifdef Q_XCB_DEBUG
+ int i = 0;
+ for (; i < m_callLog.size(); ++i) {
+ if (m_callLog.at(i).sequence == error->sequence) {
+ printf("Caused by: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+ break;
+ } else if (m_callLog.at(i).sequence > error->sequence) {
+ printf("Caused some time before: %s:%d\n", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+ if (i > 0)
+ printf("and after: %s:%d\n", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
+ break;
+ }
+ }
+ if (i == m_callLog.size() && !m_callLog.isEmpty())
+ printf("Caused some time after: %s:%d\n", qPrintable(m_callLog.first().file), m_callLog.first().line);
+#endif
+}
+
+void QXcbConnection::processXcbEvents()
+{
+ while (xcb_generic_event_t *event = xcb_poll_for_event(xcb_connection())) {
+ bool handled = true;
+
+ uint response_type = event->response_type & ~0x80;
+
+ if (!response_type) {
+ handleXcbError((xcb_generic_error_t *)event);
+ continue;
+ }
+
+#ifdef Q_XCB_DEBUG
+ {
+ int i = 0;
+ for (; i < m_callLog.size(); ++i)
+ if (m_callLog.at(i).sequence >= event->sequence)
+ break;
+ m_callLog.remove(0, i);
+ }
+#endif
+
+ switch (response_type) {
+ case XCB_EXPOSE:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent);
+ case XCB_BUTTON_PRESS:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_press_event_t, event, handleButtonPressEvent);
+ case XCB_BUTTON_RELEASE:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent);
+ case XCB_MOTION_NOTIFY:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent);
+ case XCB_CONFIGURE_NOTIFY:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent);
+ case XCB_CLIENT_MESSAGE:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_client_message_event_t, window, handleClientMessageEvent);
+ case XCB_ENTER_NOTIFY:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent);
+ case XCB_LEAVE_NOTIFY:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent);
+ case XCB_FOCUS_IN:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_in_event_t, event, handleFocusInEvent);
+ case XCB_FOCUS_OUT:
+ HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_out_event_t, event, handleFocusOutEvent);
+ case XCB_KEY_PRESS:
+ HANDLE_KEYBOARD_EVENT(xcb_key_press_event_t, handleKeyPressEvent);
+ case XCB_KEY_RELEASE:
+ HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent);
+ case XCB_MAPPING_NOTIFY:
+ m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event);
+ break;
+ default:
+ handled = false;
+ break;
+ }
+ if (handled)
+ printXcbEvent("Handled XCB event", event);
+ else
+ printXcbEvent("Unhandled XCB event", event);
+ }
+
+ xcb_flush(xcb_connection());
+}
+
+static const char * xcb_atomnames = {
+ // window-manager <-> client protocols
+ "WM_PROTOCOLS\0"
+ "WM_DELETE_WINDOW\0"
+ "WM_TAKE_FOCUS\0"
+ "_NET_WM_PING\0"
+ "_NET_WM_CONTEXT_HELP\0"
+ "_NET_WM_SYNC_REQUEST\0"
+ "_NET_WM_SYNC_REQUEST_COUNTER\0"
+
+ // ICCCM window state
+ "WM_STATE\0"
+ "WM_CHANGE_STATE\0"
+
+ // Session management
+ "WM_CLIENT_LEADER\0"
+ "WM_WINDOW_ROLE\0"
+ "SM_CLIENT_ID\0"
+
+ // Clipboard
+ "CLIPBOARD\0"
+ "INCR\0"
+ "TARGETS\0"
+ "MULTIPLE\0"
+ "TIMESTAMP\0"
+ "SAVE_TARGETS\0"
+ "CLIP_TEMPORARY\0"
+ "_QT_SELECTION\0"
+ "_QT_CLIPBOARD_SENTINEL\0"
+ "_QT_SELECTION_SENTINEL\0"
+ "CLIPBOARD_MANAGER\0"
+
+ "RESOURCE_MANAGER\0"
+
+ "_XSETROOT_ID\0"
+
+ "_QT_SCROLL_DONE\0"
+ "_QT_INPUT_ENCODING\0"
+
+ "_MOTIF_WM_HINTS\0"
+
+ "DTWM_IS_RUNNING\0"
+ "ENLIGHTENMENT_DESKTOP\0"
+ "_DT_SAVE_MODE\0"
+ "_SGI_DESKS_MANAGER\0"
+
+ // EWMH (aka NETWM)
+ "_NET_SUPPORTED\0"
+ "_NET_VIRTUAL_ROOTS\0"
+ "_NET_WORKAREA\0"
+
+ "_NET_MOVERESIZE_WINDOW\0"
+ "_NET_WM_MOVERESIZE\0"
+
+ "_NET_WM_NAME\0"
+ "_NET_WM_ICON_NAME\0"
+ "_NET_WM_ICON\0"
+
+ "_NET_WM_PID\0"
+
+ "_NET_WM_WINDOW_OPACITY\0"
+
+ "_NET_WM_STATE\0"
+ "_NET_WM_STATE_ABOVE\0"
+ "_NET_WM_STATE_BELOW\0"
+ "_NET_WM_STATE_FULLSCREEN\0"
+ "_NET_WM_STATE_MAXIMIZED_HORZ\0"
+ "_NET_WM_STATE_MAXIMIZED_VERT\0"
+ "_NET_WM_STATE_MODAL\0"
+ "_NET_WM_STATE_STAYS_ON_TOP\0"
+ "_NET_WM_STATE_DEMANDS_ATTENTION\0"
+
+ "_NET_WM_USER_TIME\0"
+ "_NET_WM_USER_TIME_WINDOW\0"
+ "_NET_WM_FULL_PLACEMENT\0"
+
+ "_NET_WM_WINDOW_TYPE\0"
+ "_NET_WM_WINDOW_TYPE_DESKTOP\0"
+ "_NET_WM_WINDOW_TYPE_DOCK\0"
+ "_NET_WM_WINDOW_TYPE_TOOLBAR\0"
+ "_NET_WM_WINDOW_TYPE_MENU\0"
+ "_NET_WM_WINDOW_TYPE_UTILITY\0"
+ "_NET_WM_WINDOW_TYPE_SPLASH\0"
+ "_NET_WM_WINDOW_TYPE_DIALOG\0"
+ "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU\0"
+ "_NET_WM_WINDOW_TYPE_POPUP_MENU\0"
+ "_NET_WM_WINDOW_TYPE_TOOLTIP\0"
+ "_NET_WM_WINDOW_TYPE_NOTIFICATION\0"
+ "_NET_WM_WINDOW_TYPE_COMBO\0"
+ "_NET_WM_WINDOW_TYPE_DND\0"
+ "_NET_WM_WINDOW_TYPE_NORMAL\0"
+ "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE\0"
+
+ "_KDE_NET_WM_FRAME_STRUT\0"
+
+ "_NET_STARTUP_INFO\0"
+ "_NET_STARTUP_INFO_BEGIN\0"
+
+ "_NET_SUPPORTING_WM_CHECK\0"
+
+ "_NET_WM_CM_S0\0"
+
+ "_NET_SYSTEM_TRAY_VISUAL\0"
+
+ "_NET_ACTIVE_WINDOW\0"
+
+ // Property formats
+ "COMPOUND_TEXT\0"
+ "TEXT\0"
+ "UTF8_STRING\0"
+
+ // xdnd
+ "XdndEnter\0"
+ "XdndPosition\0"
+ "XdndStatus\0"
+ "XdndLeave\0"
+ "XdndDrop\0"
+ "XdndFinished\0"
+ "XdndTypeList\0"
+ "XdndActionList\0"
+
+ "XdndSelection\0"
+
+ "XdndAware\0"
+ "XdndProxy\0"
+
+ "XdndActionCopy\0"
+ "XdndActionLink\0"
+ "XdndActionMove\0"
+ "XdndActionPrivate\0"
+
+ // Motif DND
+ "_MOTIF_DRAG_AND_DROP_MESSAGE\0"
+ "_MOTIF_DRAG_INITIATOR_INFO\0"
+ "_MOTIF_DRAG_RECEIVER_INFO\0"
+ "_MOTIF_DRAG_WINDOW\0"
+ "_MOTIF_DRAG_TARGETS\0"
+
+ "XmTRANSFER_SUCCESS\0"
+ "XmTRANSFER_FAILURE\0"
+
+ // Xkb
+ "_XKB_RULES_NAMES\0"
+
+ // XEMBED
+ "_XEMBED\0"
+ "_XEMBED_INFO\0"
+
+ // Wacom old. (before version 0.10)
+ "Wacom Stylus\0"
+ "Wacom Cursor\0"
+ "Wacom Eraser\0"
+
+ // Tablet
+ "STYLUS\0"
+ "ERASER\0"
+};
+
+xcb_atom_t QXcbConnection::atom(QXcbAtom::Atom atom)
+{
+ return m_allAtoms[atom];
+}
+
+void QXcbConnection::initializeAllAtoms() {
+ const char *names[QXcbAtom::NAtoms];
+ const char *ptr = xcb_atomnames;
+
+ int i = 0;
+ while (*ptr) {
+ names[i++] = ptr;
+ while (*ptr)
+ ++ptr;
+ ++ptr;
+ }
+
+ Q_ASSERT(i == QXcbAtom::NPredefinedAtoms);
+
+ QByteArray settings_atom_name("_QT_SETTINGS_TIMESTAMP_");
+ settings_atom_name += m_displayName;
+ names[i++] = settings_atom_name;
+
+ xcb_intern_atom_cookie_t cookies[QXcbAtom::NAtoms];
+
+ Q_ASSERT(i == QXcbAtom::NAtoms);
+ for (i = 0; i < QXcbAtom::NAtoms; ++i)
+ cookies[i] = xcb_intern_atom(xcb_connection(), false, strlen(names[i]), names[i]);
+
+ for (i = 0; i < QXcbAtom::NAtoms; ++i)
+ m_allAtoms[i] = xcb_intern_atom_reply(xcb_connection(), cookies[i], 0)->atom;
+}
+
+void QXcbConnection::sync()
+{
+ // from xcb_aux_sync
+ xcb_get_input_focus_cookie_t cookie = Q_XCB_CALL(xcb_get_input_focus(xcb_connection()));
+ free(xcb_get_input_focus_reply(xcb_connection(), cookie, 0));
+}
+
+#if defined(XCB_USE_EGL)
+bool QXcbConnection::hasEgl() const
+{
+ return m_has_egl;
+}
+#endif // defined(XCB_USE_EGL)
+
+#ifdef XCB_USE_DRI2
+void QXcbConnection::initializeDri2()
+{
+ xcb_dri2_connect_cookie_t connect_cookie = xcb_dri2_connect_unchecked (m_connection,
+ m_screens[0]->root(),
+ XCB_DRI2_DRIVER_TYPE_DRI);
+
+ xcb_dri2_connect_reply_t *connect = xcb_dri2_connect_reply (m_connection,
+ connect_cookie, NULL);
+
+ if (! connect || connect->driver_name_length + connect->device_name_length == 0) {
+ qDebug() << "Failed to connect to dri2";
+ return;
+ }
+
+ m_dri2_device_name = QByteArray(xcb_dri2_connect_device_name (connect),
+ xcb_dri2_connect_device_name_length (connect));
+ delete connect;
+
+ int fd = open(m_dri2_device_name.constData(), O_RDWR);
+ if (fd < 0) {
+ qDebug() << "InitializeDri2: Could'nt open device << dri2DeviceName";
+ m_dri2_device_name = QByteArray();
+ return;
+ }
+
+ drm_magic_t magic;
+ if (drmGetMagic(fd, &magic)) {
+ qDebug() << "Failed to get drmMagic";
+ return;
+ }
+
+ xcb_dri2_authenticate_cookie_t authenticate_cookie = xcb_dri2_authenticate_unchecked(m_connection,
+ m_screens[0]->root(), magic);
+ xcb_dri2_authenticate_reply_t *authenticate = xcb_dri2_authenticate_reply(m_connection,
+ authenticate_cookie, NULL);
+ if (authenticate == NULL || !authenticate->authenticated) {
+ fprintf(stderr, "DRI2: failed to authenticate\n");
+ free(authenticate);
+ return;
+ }
+
+ delete authenticate;
+
+ EGLDisplay display = eglGetDRMDisplayMESA(fd);
+ if (!display) {
+ fprintf(stderr, "failed to create display\n");
+ return;
+ }
+
+ m_egl_display = display;
+ EGLint major,minor;
+ if (!eglInitialize(display, &major, &minor)) {
+ fprintf(stderr, "failed to initialize display\n");
+ return;
+ }
+}
+
+bool QXcbConnection::hasSupportForDri2() const
+{
+ if (!m_dri2_support_probed) {
+ xcb_generic_error_t *error = 0;
+
+ xcb_prefetch_extension_data (m_connection, &xcb_xfixes_id);
+ xcb_prefetch_extension_data (m_connection, &xcb_dri2_id);
+
+ xcb_xfixes_query_version_cookie_t xfixes_query_cookie = xcb_xfixes_query_version(m_connection,
+ XCB_XFIXES_MAJOR_VERSION,
+ XCB_XFIXES_MINOR_VERSION);
+
+ xcb_dri2_query_version_cookie_t dri2_query_cookie = xcb_dri2_query_version (m_connection,
+ XCB_DRI2_MAJOR_VERSION,
+ XCB_DRI2_MINOR_VERSION);
+
+ xcb_xfixes_query_version_reply_t *xfixes_query = xcb_xfixes_query_version_reply (m_connection,
+ xfixes_query_cookie, &error);
+ if (!xfixes_query || error || xfixes_query->major_version < 2) {
+ delete error;
+ delete xfixes_query;
+ return false;
+ }
+ delete xfixes_query;
+
+ xcb_dri2_query_version_reply_t *dri2_query = xcb_dri2_query_version_reply (m_connection,
+ dri2_query_cookie, &error);
+ if (!dri2_query || error) {
+ delete error;
+ delete dri2_query;
+ return false;
+ }
+
+ QXcbConnection *that = const_cast<QXcbConnection *>(this);
+ that->m_dri2_major = dri2_query->major_version;
+ that->m_dri2_minor = dri2_query->minor_version;
+
+ that->m_has_support_for_dri2 = true;
+ that->m_dri2_support_probed = true;
+ }
+ return m_has_support_for_dri2;
+}
+#endif //XCB_USE_DRI2
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
new file mode 100644
index 0000000000..6b5f81047d
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -0,0 +1,331 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBCONNECTION_H
+#define QXCBCONNECTION_H
+
+#include <xcb/xcb.h>
+
+#include <QList>
+#include <QObject>
+#include <QVector>
+
+#define Q_XCB_DEBUG
+
+class QXcbScreen;
+
+namespace QXcbAtom {
+ enum Atom {
+ // window-manager <-> client protocols
+ WM_PROTOCOLS,
+ WM_DELETE_WINDOW,
+ WM_TAKE_FOCUS,
+ _NET_WM_PING,
+ _NET_WM_CONTEXT_HELP,
+ _NET_WM_SYNC_REQUEST,
+ _NET_WM_SYNC_REQUEST_COUNTER,
+
+ // ICCCM window state
+ WM_STATE,
+ WM_CHANGE_STATE,
+
+ // Session management
+ WM_CLIENT_LEADER,
+ WM_WINDOW_ROLE,
+ SM_CLIENT_ID,
+
+ // Clipboard
+ CLIPBOARD,
+ INCR,
+ TARGETS,
+ MULTIPLE,
+ TIMESTAMP,
+ SAVE_TARGETS,
+ CLIP_TEMPORARY,
+ _QT_SELECTION,
+ _QT_CLIPBOARD_SENTINEL,
+ _QT_SELECTION_SENTINEL,
+ CLIPBOARD_MANAGER,
+
+ RESOURCE_MANAGER,
+
+ _XSETROOT_ID,
+
+ _QT_SCROLL_DONE,
+ _QT_INPUT_ENCODING,
+
+ _MOTIF_WM_HINTS,
+
+ DTWM_IS_RUNNING,
+ ENLIGHTENMENT_DESKTOP,
+ _DT_SAVE_MODE,
+ _SGI_DESKS_MANAGER,
+
+ // EWMH (aka NETWM)
+ _NET_SUPPORTED,
+ _NET_VIRTUAL_ROOTS,
+ _NET_WORKAREA,
+
+ _NET_MOVERESIZE_WINDOW,
+ _NET_WM_MOVERESIZE,
+
+ _NET_WM_NAME,
+ _NET_WM_ICON_NAME,
+ _NET_WM_ICON,
+
+ _NET_WM_PID,
+
+ _NET_WM_WINDOW_OPACITY,
+
+ _NET_WM_STATE,
+ _NET_WM_STATE_ABOVE,
+ _NET_WM_STATE_BELOW,
+ _NET_WM_STATE_FULLSCREEN,
+ _NET_WM_STATE_MAXIMIZED_HORZ,
+ _NET_WM_STATE_MAXIMIZED_VERT,
+ _NET_WM_STATE_MODAL,
+ _NET_WM_STATE_STAYS_ON_TOP,
+ _NET_WM_STATE_DEMANDS_ATTENTION,
+
+ _NET_WM_USER_TIME,
+ _NET_WM_USER_TIME_WINDOW,
+ _NET_WM_FULL_PLACEMENT,
+
+ _NET_WM_WINDOW_TYPE,
+ _NET_WM_WINDOW_TYPE_DESKTOP,
+ _NET_WM_WINDOW_TYPE_DOCK,
+ _NET_WM_WINDOW_TYPE_TOOLBAR,
+ _NET_WM_WINDOW_TYPE_MENU,
+ _NET_WM_WINDOW_TYPE_UTILITY,
+ _NET_WM_WINDOW_TYPE_SPLASH,
+ _NET_WM_WINDOW_TYPE_DIALOG,
+ _NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
+ _NET_WM_WINDOW_TYPE_POPUP_MENU,
+ _NET_WM_WINDOW_TYPE_TOOLTIP,
+ _NET_WM_WINDOW_TYPE_NOTIFICATION,
+ _NET_WM_WINDOW_TYPE_COMBO,
+ _NET_WM_WINDOW_TYPE_DND,
+ _NET_WM_WINDOW_TYPE_NORMAL,
+ _KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
+
+ _KDE_NET_WM_FRAME_STRUT,
+
+ _NET_STARTUP_INFO,
+ _NET_STARTUP_INFO_BEGIN,
+
+ _NET_SUPPORTING_WM_CHECK,
+
+ _NET_WM_CM_S0,
+
+ _NET_SYSTEM_TRAY_VISUAL,
+
+ _NET_ACTIVE_WINDOW,
+
+ // Property formats
+ COMPOUND_TEXT,
+ TEXT,
+ UTF8_STRING,
+
+ // Xdnd
+ XdndEnter,
+ XdndPosition,
+ XdndStatus,
+ XdndLeave,
+ XdndDrop,
+ XdndFinished,
+ XdndTypelist,
+ XdndActionList,
+
+ XdndSelection,
+
+ XdndAware,
+ XdndProxy,
+
+ XdndActionCopy,
+ XdndActionLink,
+ XdndActionMove,
+ XdndActionPrivate,
+
+ // Motif DND
+ _MOTIF_DRAG_AND_DROP_MESSAGE,
+ _MOTIF_DRAG_INITIATOR_INFO,
+ _MOTIF_DRAG_RECEIVER_INFO,
+ _MOTIF_DRAG_WINDOW,
+ _MOTIF_DRAG_TARGETS,
+
+ XmTRANSFER_SUCCESS,
+ XmTRANSFER_FAILURE,
+
+ // Xkb
+ _XKB_RULES_NAMES,
+
+ // XEMBED
+ _XEMBED,
+ _XEMBED_INFO,
+
+ XWacomStylus,
+ XWacomCursor,
+ XWacomEraser,
+
+ XTabletStylus,
+ XTabletEraser,
+
+ NPredefinedAtoms,
+
+ _QT_SETTINGS_TIMESTAMP = NPredefinedAtoms,
+ NAtoms
+ };
+}
+
+class QXcbKeyboard;
+
+class QXcbConnection : public QObject
+{
+ Q_OBJECT
+public:
+ QXcbConnection(const char *displayName = 0);
+ ~QXcbConnection();
+
+ QXcbConnection *connection() const { return const_cast<QXcbConnection *>(this); }
+
+ QList<QXcbScreen *> screens() const { return m_screens; }
+ int primaryScreen() const { return m_primaryScreen; }
+
+ xcb_atom_t atom(QXcbAtom::Atom atom);
+
+ const char *displayName() const { return m_displayName.constData(); }
+
+ xcb_connection_t *xcb_connection() const { return m_connection; }
+
+ QXcbKeyboard *keyboard() const { return m_keyboard; }
+
+#ifdef XCB_USE_XLIB
+ void *xlib_display() const { return m_xlib_display; }
+#endif
+
+#ifdef XCB_USE_DRI2
+ bool hasSupportForDri2() const;
+ QByteArray dri2DeviceName() const { return m_dri2_device_name; }
+#endif
+#ifdef XCB_USE_EGL
+ bool hasEgl() const;
+#endif
+#if defined(XCB_USE_EGL) || defined(XCB_USE_DRI2)
+ void *egl_display() const { return m_egl_display; }
+#endif
+
+ void sync();
+ void handleXcbError(xcb_generic_error_t *error);
+
+private slots:
+ void processXcbEvents();
+
+private:
+ void initializeAllAtoms();
+ void sendConnectionEvent(QXcbAtom::Atom atom, uint id = 0);
+#ifdef XCB_USE_DRI2
+ void initializeDri2();
+#endif
+
+ xcb_connection_t *m_connection;
+ const xcb_setup_t *m_setup;
+
+ QList<QXcbScreen *> m_screens;
+ int m_primaryScreen;
+
+ xcb_atom_t m_allAtoms[QXcbAtom::NAtoms];
+
+ QByteArray m_displayName;
+
+ QXcbKeyboard *m_keyboard;
+
+#if defined(XCB_USE_XLIB)
+ void *m_xlib_display;
+#endif
+
+#ifdef XCB_USE_DRI2
+ uint32_t m_dri2_major;
+ uint32_t m_dri2_minor;
+ bool m_dri2_support_probed;
+ bool m_has_support_for_dri2;
+ QByteArray m_dri2_device_name;
+#endif
+#if defined(XCB_USE_EGL) || defined(XCB_USE_DRI2)
+ void *m_egl_display;
+ bool m_has_egl;
+#endif
+#ifdef Q_XCB_DEBUG
+ struct CallInfo {
+ int sequence;
+ QByteArray file;
+ int line;
+ };
+ QVector<CallInfo> m_callLog;
+ void log(const char *file, int line, int sequence);
+ template <typename cookie_t>
+ friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line);
+#endif
+};
+
+#define DISPLAY_FROM_XCB(object) ((Display *)(object->connection()->xlib_display()))
+
+#ifdef Q_XCB_DEBUG
+template <typename cookie_t>
+cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line)
+{
+ connection->log(file, line, cookie.sequence);
+ return cookie;
+}
+#define Q_XCB_CALL(x) q_xcb_call_template(x, connection(), __FILE__, __LINE__)
+#define Q_XCB_CALL2(x, connection) q_xcb_call_template(x, connection, __FILE__, __LINE__)
+#define Q_XCB_NOOP(c) q_xcb_call_template(xcb_no_operation(c->xcb_connection()), c, __FILE__, __LINE__);
+#else
+#define Q_XCB_CALL(x) x
+#define Q_XCB_CALL2(x, connection) x
+#define Q_XCB_NOOP(c)
+#endif
+
+
+#if defined(XCB_USE_DRI2) || defined(XCB_USE_EGL)
+#define EGL_DISPLAY_FROM_XCB(object) ((EGLDisplay)(object->connection()->egl_display()))
+#endif //endifXCB_USE_DRI2
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
new file mode 100644
index 0000000000..9df5f14114
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbintegration.h"
+#include "qxcbconnection.h"
+#include "qxcbscreen.h"
+#include "qxcbwindow.h"
+#include "qxcbwindowsurface.h"
+#include "qxcbnativeinterface.h"
+
+#include <xcb/xcb.h>
+
+#include <private/qpixmap_raster_p.h>
+
+#include "qgenericunixfontdatabase.h"
+
+#include <stdio.h>
+
+#ifdef XCB_USE_EGL
+#include <EGL/egl.h>
+#endif
+
+QXcbIntegration::QXcbIntegration()
+ : m_connection(new QXcbConnection)
+{
+ foreach (QXcbScreen *screen, m_connection->screens())
+ m_screens << screen;
+
+ m_fontDatabase = new QGenericUnixFontDatabase();
+ m_nativeInterface = new QXcbNativeInterface;
+}
+
+QXcbIntegration::~QXcbIntegration()
+{
+ delete m_connection;
+}
+
+bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ case OpenGL: return hasOpenGL();
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPixmapData *QXcbIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+ return new QRasterPixmapData(type);
+}
+
+QPlatformWindow *QXcbIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QXcbWindow(widget);
+}
+
+QWindowSurface *QXcbIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QXcbWindowSurface(widget);
+}
+
+QList<QPlatformScreen *> QXcbIntegration::screens() const
+{
+ return m_screens;
+}
+
+void QXcbIntegration::moveToScreen(QWidget *window, int screen)
+{
+ Q_UNUSED(window);
+ Q_UNUSED(screen);
+}
+
+bool QXcbIntegration::isVirtualDesktop()
+{
+ return false;
+}
+
+QPlatformFontDatabase *QXcbIntegration::fontDatabase() const
+{
+ return m_fontDatabase;
+}
+
+QPixmap QXcbIntegration::grabWindow(WId window, int x, int y, int width, int height) const
+{
+ Q_UNUSED(window);
+ Q_UNUSED(x);
+ Q_UNUSED(y);
+ Q_UNUSED(width);
+ Q_UNUSED(height);
+ return QPixmap();
+}
+
+
+bool QXcbIntegration::hasOpenGL() const
+{
+#if defined(XCB_USE_GLX)
+ return true;
+#elif defined(XCB_USE_EGL)
+ return m_connection->hasEgl();
+#elif defined(XCB_USE_DRI2)
+ if (m_connection->hasSupportForDri2()) {
+ return true;
+ }
+#endif
+ return false;
+}
+
+QPlatformNativeInterface * QXcbIntegration::nativeInterface() const
+{
+ return m_nativeInterface;
+}
diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h
new file mode 100644
index 0000000000..d27fd716ab
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbintegration.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBINTEGRATION_H
+#define QXCBINTEGRATION_H
+
+#include <QtGui/QPlatformIntegration>
+#include <QtGui/QPlatformScreen>
+
+QT_BEGIN_NAMESPACE
+
+class QXcbConnection;
+
+class QXcbIntegration : public QPlatformIntegration
+{
+public:
+ QXcbIntegration();
+ ~QXcbIntegration();
+
+ bool hasCapability(Capability cap) const;
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QList<QPlatformScreen *> screens() const;
+ void moveToScreen(QWidget *window, int screen);
+ bool isVirtualDesktop();
+ QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
+
+ QPlatformFontDatabase *fontDatabase() const;
+
+ QPlatformNativeInterface *nativeInterface()const;
+
+private:
+ bool hasOpenGL() const;
+ QList<QPlatformScreen *> m_screens;
+ QXcbConnection *m_connection;
+
+ QPlatformFontDatabase *m_fontDatabase;
+ QPlatformNativeInterface *m_nativeInterface;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
new file mode 100644
index 0000000000..f501c00e94
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -0,0 +1,973 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbkeyboard.h"
+
+#include <xcb/xcb_keysyms.h>
+
+#include <X11/keysym.h>
+
+#include <QtGui/QWindowSystemInterface>
+#include <QtCore/QTextCodec>
+
+#include <stdio.h>
+
+#ifndef XK_ISO_Left_Tab
+#define XK_ISO_Left_Tab 0xFE20
+#endif
+
+#ifndef XK_dead_hook
+#define XK_dead_hook 0xFE61
+#endif
+
+#ifndef XK_dead_horn
+#define XK_dead_horn 0xFE62
+#endif
+
+#ifndef XK_Codeinput
+#define XK_Codeinput 0xFF37
+#endif
+
+#ifndef XK_Kanji_Bangou
+#define XK_Kanji_Bangou 0xFF37 /* same as codeinput */
+#endif
+
+// Fix old X libraries
+#ifndef XK_KP_Home
+#define XK_KP_Home 0xFF95
+#endif
+#ifndef XK_KP_Left
+#define XK_KP_Left 0xFF96
+#endif
+#ifndef XK_KP_Up
+#define XK_KP_Up 0xFF97
+#endif
+#ifndef XK_KP_Right
+#define XK_KP_Right 0xFF98
+#endif
+#ifndef XK_KP_Down
+#define XK_KP_Down 0xFF99
+#endif
+#ifndef XK_KP_Prior
+#define XK_KP_Prior 0xFF9A
+#endif
+#ifndef XK_KP_Next
+#define XK_KP_Next 0xFF9B
+#endif
+#ifndef XK_KP_End
+#define XK_KP_End 0xFF9C
+#endif
+#ifndef XK_KP_Insert
+#define XK_KP_Insert 0xFF9E
+#endif
+#ifndef XK_KP_Delete
+#define XK_KP_Delete 0xFF9F
+#endif
+
+// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special
+// multimedia keys. They are included here as not every system has them.
+#define XF86XK_MonBrightnessUp 0x1008FF02
+#define XF86XK_MonBrightnessDown 0x1008FF03
+#define XF86XK_KbdLightOnOff 0x1008FF04
+#define XF86XK_KbdBrightnessUp 0x1008FF05
+#define XF86XK_KbdBrightnessDown 0x1008FF06
+#define XF86XK_Standby 0x1008FF10
+#define XF86XK_AudioLowerVolume 0x1008FF11
+#define XF86XK_AudioMute 0x1008FF12
+#define XF86XK_AudioRaiseVolume 0x1008FF13
+#define XF86XK_AudioPlay 0x1008FF14
+#define XF86XK_AudioStop 0x1008FF15
+#define XF86XK_AudioPrev 0x1008FF16
+#define XF86XK_AudioNext 0x1008FF17
+#define XF86XK_HomePage 0x1008FF18
+#define XF86XK_Mail 0x1008FF19
+#define XF86XK_Start 0x1008FF1A
+#define XF86XK_Search 0x1008FF1B
+#define XF86XK_AudioRecord 0x1008FF1C
+#define XF86XK_Calculator 0x1008FF1D
+#define XF86XK_Memo 0x1008FF1E
+#define XF86XK_ToDoList 0x1008FF1F
+#define XF86XK_Calendar 0x1008FF20
+#define XF86XK_PowerDown 0x1008FF21
+#define XF86XK_ContrastAdjust 0x1008FF22
+#define XF86XK_Back 0x1008FF26
+#define XF86XK_Forward 0x1008FF27
+#define XF86XK_Stop 0x1008FF28
+#define XF86XK_Refresh 0x1008FF29
+#define XF86XK_PowerOff 0x1008FF2A
+#define XF86XK_WakeUp 0x1008FF2B
+#define XF86XK_Eject 0x1008FF2C
+#define XF86XK_ScreenSaver 0x1008FF2D
+#define XF86XK_WWW 0x1008FF2E
+#define XF86XK_Sleep 0x1008FF2F
+#define XF86XK_Favorites 0x1008FF30
+#define XF86XK_AudioPause 0x1008FF31
+#define XF86XK_AudioMedia 0x1008FF32
+#define XF86XK_MyComputer 0x1008FF33
+#define XF86XK_LightBulb 0x1008FF35
+#define XF86XK_Shop 0x1008FF36
+#define XF86XK_History 0x1008FF37
+#define XF86XK_OpenURL 0x1008FF38
+#define XF86XK_AddFavorite 0x1008FF39
+#define XF86XK_HotLinks 0x1008FF3A
+#define XF86XK_BrightnessAdjust 0x1008FF3B
+#define XF86XK_Finance 0x1008FF3C
+#define XF86XK_Community 0x1008FF3D
+#define XF86XK_AudioRewind 0x1008FF3E
+#define XF86XK_BackForward 0x1008FF3F
+#define XF86XK_Launch0 0x1008FF40
+#define XF86XK_Launch1 0x1008FF41
+#define XF86XK_Launch2 0x1008FF42
+#define XF86XK_Launch3 0x1008FF43
+#define XF86XK_Launch4 0x1008FF44
+#define XF86XK_Launch5 0x1008FF45
+#define XF86XK_Launch6 0x1008FF46
+#define XF86XK_Launch7 0x1008FF47
+#define XF86XK_Launch8 0x1008FF48
+#define XF86XK_Launch9 0x1008FF49
+#define XF86XK_LaunchA 0x1008FF4A
+#define XF86XK_LaunchB 0x1008FF4B
+#define XF86XK_LaunchC 0x1008FF4C
+#define XF86XK_LaunchD 0x1008FF4D
+#define XF86XK_LaunchE 0x1008FF4E
+#define XF86XK_LaunchF 0x1008FF4F
+#define XF86XK_ApplicationLeft 0x1008FF50
+#define XF86XK_ApplicationRight 0x1008FF51
+#define XF86XK_Book 0x1008FF52
+#define XF86XK_CD 0x1008FF53
+#define XF86XK_Calculater 0x1008FF54
+#define XF86XK_Clear 0x1008FF55
+#define XF86XK_ClearGrab 0x1008FE21
+#define XF86XK_Close 0x1008FF56
+#define XF86XK_Copy 0x1008FF57
+#define XF86XK_Cut 0x1008FF58
+#define XF86XK_Display 0x1008FF59
+#define XF86XK_DOS 0x1008FF5A
+#define XF86XK_Documents 0x1008FF5B
+#define XF86XK_Excel 0x1008FF5C
+#define XF86XK_Explorer 0x1008FF5D
+#define XF86XK_Game 0x1008FF5E
+#define XF86XK_Go 0x1008FF5F
+#define XF86XK_iTouch 0x1008FF60
+#define XF86XK_LogOff 0x1008FF61
+#define XF86XK_Market 0x1008FF62
+#define XF86XK_Meeting 0x1008FF63
+#define XF86XK_MenuKB 0x1008FF65
+#define XF86XK_MenuPB 0x1008FF66
+#define XF86XK_MySites 0x1008FF67
+#define XF86XK_News 0x1008FF69
+#define XF86XK_OfficeHome 0x1008FF6A
+#define XF86XK_Option 0x1008FF6C
+#define XF86XK_Paste 0x1008FF6D
+#define XF86XK_Phone 0x1008FF6E
+#define XF86XK_Reply 0x1008FF72
+#define XF86XK_Reload 0x1008FF73
+#define XF86XK_RotateWindows 0x1008FF74
+#define XF86XK_RotationPB 0x1008FF75
+#define XF86XK_RotationKB 0x1008FF76
+#define XF86XK_Save 0x1008FF77
+#define XF86XK_Send 0x1008FF7B
+#define XF86XK_Spell 0x1008FF7C
+#define XF86XK_SplitScreen 0x1008FF7D
+#define XF86XK_Support 0x1008FF7E
+#define XF86XK_TaskPane 0x1008FF7F
+#define XF86XK_Terminal 0x1008FF80
+#define XF86XK_Tools 0x1008FF81
+#define XF86XK_Travel 0x1008FF82
+#define XF86XK_Video 0x1008FF87
+#define XF86XK_Word 0x1008FF89
+#define XF86XK_Xfer 0x1008FF8A
+#define XF86XK_ZoomIn 0x1008FF8B
+#define XF86XK_ZoomOut 0x1008FF8C
+#define XF86XK_Away 0x1008FF8D
+#define XF86XK_Messenger 0x1008FF8E
+#define XF86XK_WebCam 0x1008FF8F
+#define XF86XK_MailForward 0x1008FF90
+#define XF86XK_Pictures 0x1008FF91
+#define XF86XK_Music 0x1008FF92
+#define XF86XK_Battery 0x1008FF93
+#define XF86XK_Bluetooth 0x1008FF94
+#define XF86XK_WLAN 0x1008FF95
+#define XF86XK_UWB 0x1008FF96
+#define XF86XK_AudioForward 0x1008FF97
+#define XF86XK_AudioRepeat 0x1008FF98
+#define XF86XK_AudioRandomPlay 0x1008FF99
+#define XF86XK_Subtitle 0x1008FF9A
+#define XF86XK_AudioCycleTrack 0x1008FF9B
+#define XF86XK_Time 0x1008FF9F
+#define XF86XK_Select 0x1008FFA0
+#define XF86XK_View 0x1008FFA1
+#define XF86XK_TopMenu 0x1008FFA2
+#define XF86XK_Suspend 0x1008FFA7
+#define XF86XK_Hibernate 0x1008FFA8
+
+
+// end of XF86keysyms.h
+
+// Special keys used by Qtopia, mapped into the X11 private keypad range.
+#define QTOPIAXK_Select 0x11000601
+#define QTOPIAXK_Yes 0x11000602
+#define QTOPIAXK_No 0x11000603
+#define QTOPIAXK_Cancel 0x11000604
+#define QTOPIAXK_Printer 0x11000605
+#define QTOPIAXK_Execute 0x11000606
+#define QTOPIAXK_Sleep 0x11000607
+#define QTOPIAXK_Play 0x11000608
+#define QTOPIAXK_Zoom 0x11000609
+#define QTOPIAXK_Context1 0x1100060A
+#define QTOPIAXK_Context2 0x1100060B
+#define QTOPIAXK_Context3 0x1100060C
+#define QTOPIAXK_Context4 0x1100060D
+#define QTOPIAXK_Call 0x1100060E
+#define QTOPIAXK_Hangup 0x1100060F
+#define QTOPIAXK_Flip 0x11000610
+
+// keyboard mapping table
+static const unsigned int KeyTbl[] = {
+
+ // misc keys
+
+ XK_Escape, Qt::Key_Escape,
+ XK_Tab, Qt::Key_Tab,
+ XK_ISO_Left_Tab, Qt::Key_Backtab,
+ XK_BackSpace, Qt::Key_Backspace,
+ XK_Return, Qt::Key_Return,
+ XK_Insert, Qt::Key_Insert,
+ XK_Delete, Qt::Key_Delete,
+ XK_Clear, Qt::Key_Delete,
+ XK_Pause, Qt::Key_Pause,
+ XK_Print, Qt::Key_Print,
+ 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq
+ 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq
+
+ // cursor movement
+
+ XK_Home, Qt::Key_Home,
+ XK_End, Qt::Key_End,
+ XK_Left, Qt::Key_Left,
+ XK_Up, Qt::Key_Up,
+ XK_Right, Qt::Key_Right,
+ XK_Down, Qt::Key_Down,
+ XK_Prior, Qt::Key_PageUp,
+ XK_Next, Qt::Key_PageDown,
+
+ // modifiers
+
+ XK_Shift_L, Qt::Key_Shift,
+ XK_Shift_R, Qt::Key_Shift,
+ XK_Shift_Lock, Qt::Key_Shift,
+ XK_Control_L, Qt::Key_Control,
+ XK_Control_R, Qt::Key_Control,
+ XK_Meta_L, Qt::Key_Meta,
+ XK_Meta_R, Qt::Key_Meta,
+ XK_Alt_L, Qt::Key_Alt,
+ XK_Alt_R, Qt::Key_Alt,
+ XK_Caps_Lock, Qt::Key_CapsLock,
+ XK_Num_Lock, Qt::Key_NumLock,
+ XK_Scroll_Lock, Qt::Key_ScrollLock,
+ XK_Super_L, Qt::Key_Super_L,
+ XK_Super_R, Qt::Key_Super_R,
+ XK_Menu, Qt::Key_Menu,
+ XK_Hyper_L, Qt::Key_Hyper_L,
+ XK_Hyper_R, Qt::Key_Hyper_R,
+ XK_Help, Qt::Key_Help,
+ 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab
+ 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11)
+ 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12)
+
+ // numeric and function keypad keys
+
+ XK_KP_Space, Qt::Key_Space,
+ XK_KP_Tab, Qt::Key_Tab,
+ XK_KP_Enter, Qt::Key_Enter,
+ //XK_KP_F1, Qt::Key_F1,
+ //XK_KP_F2, Qt::Key_F2,
+ //XK_KP_F3, Qt::Key_F3,
+ //XK_KP_F4, Qt::Key_F4,
+ XK_KP_Home, Qt::Key_Home,
+ XK_KP_Left, Qt::Key_Left,
+ XK_KP_Up, Qt::Key_Up,
+ XK_KP_Right, Qt::Key_Right,
+ XK_KP_Down, Qt::Key_Down,
+ XK_KP_Prior, Qt::Key_PageUp,
+ XK_KP_Next, Qt::Key_PageDown,
+ XK_KP_End, Qt::Key_End,
+ XK_KP_Begin, Qt::Key_Clear,
+ XK_KP_Insert, Qt::Key_Insert,
+ XK_KP_Delete, Qt::Key_Delete,
+ XK_KP_Equal, Qt::Key_Equal,
+ XK_KP_Multiply, Qt::Key_Asterisk,
+ XK_KP_Add, Qt::Key_Plus,
+ XK_KP_Separator, Qt::Key_Comma,
+ XK_KP_Subtract, Qt::Key_Minus,
+ XK_KP_Decimal, Qt::Key_Period,
+ XK_KP_Divide, Qt::Key_Slash,
+
+ // International input method support keys
+
+ // International & multi-key character composition
+ XK_ISO_Level3_Shift, Qt::Key_AltGr,
+ XK_Multi_key, Qt::Key_Multi_key,
+ XK_Codeinput, Qt::Key_Codeinput,
+ XK_SingleCandidate, Qt::Key_SingleCandidate,
+ XK_MultipleCandidate, Qt::Key_MultipleCandidate,
+ XK_PreviousCandidate, Qt::Key_PreviousCandidate,
+
+ // Misc Functions
+ XK_Mode_switch, Qt::Key_Mode_switch,
+ XK_script_switch, Qt::Key_Mode_switch,
+
+ // Japanese keyboard support
+ XK_Kanji, Qt::Key_Kanji,
+ XK_Muhenkan, Qt::Key_Muhenkan,
+ //XK_Henkan_Mode, Qt::Key_Henkan_Mode,
+ XK_Henkan_Mode, Qt::Key_Henkan,
+ XK_Henkan, Qt::Key_Henkan,
+ XK_Romaji, Qt::Key_Romaji,
+ XK_Hiragana, Qt::Key_Hiragana,
+ XK_Katakana, Qt::Key_Katakana,
+ XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana,
+ XK_Zenkaku, Qt::Key_Zenkaku,
+ XK_Hankaku, Qt::Key_Hankaku,
+ XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku,
+ XK_Touroku, Qt::Key_Touroku,
+ XK_Massyo, Qt::Key_Massyo,
+ XK_Kana_Lock, Qt::Key_Kana_Lock,
+ XK_Kana_Shift, Qt::Key_Kana_Shift,
+ XK_Eisu_Shift, Qt::Key_Eisu_Shift,
+ XK_Eisu_toggle, Qt::Key_Eisu_toggle,
+ //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou,
+ //XK_Zen_Koho, Qt::Key_Zen_Koho,
+ //XK_Mae_Koho, Qt::Key_Mae_Koho,
+ XK_Kanji_Bangou, Qt::Key_Codeinput,
+ XK_Zen_Koho, Qt::Key_MultipleCandidate,
+ XK_Mae_Koho, Qt::Key_PreviousCandidate,
+
+#ifdef XK_KOREAN
+ // Korean keyboard support
+ XK_Hangul, Qt::Key_Hangul,
+ XK_Hangul_Start, Qt::Key_Hangul_Start,
+ XK_Hangul_End, Qt::Key_Hangul_End,
+ XK_Hangul_Hanja, Qt::Key_Hangul_Hanja,
+ XK_Hangul_Jamo, Qt::Key_Hangul_Jamo,
+ XK_Hangul_Romaja, Qt::Key_Hangul_Romaja,
+ //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput,
+ XK_Hangul_Codeinput, Qt::Key_Codeinput,
+ XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja,
+ XK_Hangul_Banja, Qt::Key_Hangul_Banja,
+ XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja,
+ XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja,
+ //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
+ //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
+ //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
+ XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate,
+ XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
+ XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
+ XK_Hangul_Special, Qt::Key_Hangul_Special,
+ //XK_Hangul_switch, Qt::Key_Hangul_switch,
+ XK_Hangul_switch, Qt::Key_Mode_switch,
+#endif // XK_KOREAN
+
+ // dead keys
+ XK_dead_grave, Qt::Key_Dead_Grave,
+ XK_dead_acute, Qt::Key_Dead_Acute,
+ XK_dead_circumflex, Qt::Key_Dead_Circumflex,
+ XK_dead_tilde, Qt::Key_Dead_Tilde,
+ XK_dead_macron, Qt::Key_Dead_Macron,
+ XK_dead_breve, Qt::Key_Dead_Breve,
+ XK_dead_abovedot, Qt::Key_Dead_Abovedot,
+ XK_dead_diaeresis, Qt::Key_Dead_Diaeresis,
+ XK_dead_abovering, Qt::Key_Dead_Abovering,
+ XK_dead_doubleacute, Qt::Key_Dead_Doubleacute,
+ XK_dead_caron, Qt::Key_Dead_Caron,
+ XK_dead_cedilla, Qt::Key_Dead_Cedilla,
+ XK_dead_ogonek, Qt::Key_Dead_Ogonek,
+ XK_dead_iota, Qt::Key_Dead_Iota,
+ XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound,
+ XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound,
+ XK_dead_belowdot, Qt::Key_Dead_Belowdot,
+ XK_dead_hook, Qt::Key_Dead_Hook,
+ XK_dead_horn, Qt::Key_Dead_Horn,
+
+ // Special keys from X.org - This include multimedia keys,
+ // wireless/bluetooth/uwb keys, special launcher keys, etc.
+ XF86XK_Back, Qt::Key_Back,
+ XF86XK_Forward, Qt::Key_Forward,
+ XF86XK_Stop, Qt::Key_Stop,
+ XF86XK_Refresh, Qt::Key_Refresh,
+ XF86XK_Favorites, Qt::Key_Favorites,
+ XF86XK_AudioMedia, Qt::Key_LaunchMedia,
+ XF86XK_OpenURL, Qt::Key_OpenUrl,
+ XF86XK_HomePage, Qt::Key_HomePage,
+ XF86XK_Search, Qt::Key_Search,
+ XF86XK_AudioLowerVolume, Qt::Key_VolumeDown,
+ XF86XK_AudioMute, Qt::Key_VolumeMute,
+ XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp,
+ XF86XK_AudioPlay, Qt::Key_MediaPlay,
+ XF86XK_AudioStop, Qt::Key_MediaStop,
+ XF86XK_AudioPrev, Qt::Key_MediaPrevious,
+ XF86XK_AudioNext, Qt::Key_MediaNext,
+ XF86XK_AudioRecord, Qt::Key_MediaRecord,
+ XF86XK_Mail, Qt::Key_LaunchMail,
+ XF86XK_MyComputer, Qt::Key_Launch0, // ### Qt 5: remap properly
+ XF86XK_Calculator, Qt::Key_Launch1,
+ XF86XK_Memo, Qt::Key_Memo,
+ XF86XK_ToDoList, Qt::Key_ToDoList,
+ XF86XK_Calendar, Qt::Key_Calendar,
+ XF86XK_PowerDown, Qt::Key_PowerDown,
+ XF86XK_ContrastAdjust, Qt::Key_ContrastAdjust,
+ XF86XK_Standby, Qt::Key_Standby,
+ XF86XK_MonBrightnessUp, Qt::Key_MonBrightnessUp,
+ XF86XK_MonBrightnessDown, Qt::Key_MonBrightnessDown,
+ XF86XK_KbdLightOnOff, Qt::Key_KeyboardLightOnOff,
+ XF86XK_KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp,
+ XF86XK_KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown,
+ XF86XK_PowerOff, Qt::Key_PowerOff,
+ XF86XK_WakeUp, Qt::Key_WakeUp,
+ XF86XK_Eject, Qt::Key_Eject,
+ XF86XK_ScreenSaver, Qt::Key_ScreenSaver,
+ XF86XK_WWW, Qt::Key_WWW,
+ XF86XK_Sleep, Qt::Key_Sleep,
+ XF86XK_LightBulb, Qt::Key_LightBulb,
+ XF86XK_Shop, Qt::Key_Shop,
+ XF86XK_History, Qt::Key_History,
+ XF86XK_AddFavorite, Qt::Key_AddFavorite,
+ XF86XK_HotLinks, Qt::Key_HotLinks,
+ XF86XK_BrightnessAdjust, Qt::Key_BrightnessAdjust,
+ XF86XK_Finance, Qt::Key_Finance,
+ XF86XK_Community, Qt::Key_Community,
+ XF86XK_AudioRewind, Qt::Key_AudioRewind,
+ XF86XK_BackForward, Qt::Key_BackForward,
+ XF86XK_ApplicationLeft, Qt::Key_ApplicationLeft,
+ XF86XK_ApplicationRight, Qt::Key_ApplicationRight,
+ XF86XK_Book, Qt::Key_Book,
+ XF86XK_CD, Qt::Key_CD,
+ XF86XK_Calculater, Qt::Key_Calculator,
+ XF86XK_Clear, Qt::Key_Clear,
+ XF86XK_ClearGrab, Qt::Key_ClearGrab,
+ XF86XK_Close, Qt::Key_Close,
+ XF86XK_Copy, Qt::Key_Copy,
+ XF86XK_Cut, Qt::Key_Cut,
+ XF86XK_Display, Qt::Key_Display,
+ XF86XK_DOS, Qt::Key_DOS,
+ XF86XK_Documents, Qt::Key_Documents,
+ XF86XK_Excel, Qt::Key_Excel,
+ XF86XK_Explorer, Qt::Key_Explorer,
+ XF86XK_Game, Qt::Key_Game,
+ XF86XK_Go, Qt::Key_Go,
+ XF86XK_iTouch, Qt::Key_iTouch,
+ XF86XK_LogOff, Qt::Key_LogOff,
+ XF86XK_Market, Qt::Key_Market,
+ XF86XK_Meeting, Qt::Key_Meeting,
+ XF86XK_MenuKB, Qt::Key_MenuKB,
+ XF86XK_MenuPB, Qt::Key_MenuPB,
+ XF86XK_MySites, Qt::Key_MySites,
+ XF86XK_News, Qt::Key_News,
+ XF86XK_OfficeHome, Qt::Key_OfficeHome,
+ XF86XK_Option, Qt::Key_Option,
+ XF86XK_Paste, Qt::Key_Paste,
+ XF86XK_Phone, Qt::Key_Phone,
+ XF86XK_Reply, Qt::Key_Reply,
+ XF86XK_Reload, Qt::Key_Reload,
+ XF86XK_RotateWindows, Qt::Key_RotateWindows,
+ XF86XK_RotationPB, Qt::Key_RotationPB,
+ XF86XK_RotationKB, Qt::Key_RotationKB,
+ XF86XK_Save, Qt::Key_Save,
+ XF86XK_Send, Qt::Key_Send,
+ XF86XK_Spell, Qt::Key_Spell,
+ XF86XK_SplitScreen, Qt::Key_SplitScreen,
+ XF86XK_Support, Qt::Key_Support,
+ XF86XK_TaskPane, Qt::Key_TaskPane,
+ XF86XK_Terminal, Qt::Key_Terminal,
+ XF86XK_Tools, Qt::Key_Tools,
+ XF86XK_Travel, Qt::Key_Travel,
+ XF86XK_Video, Qt::Key_Video,
+ XF86XK_Word, Qt::Key_Word,
+ XF86XK_Xfer, Qt::Key_Xfer,
+ XF86XK_ZoomIn, Qt::Key_ZoomIn,
+ XF86XK_ZoomOut, Qt::Key_ZoomOut,
+ XF86XK_Away, Qt::Key_Away,
+ XF86XK_Messenger, Qt::Key_Messenger,
+ XF86XK_WebCam, Qt::Key_WebCam,
+ XF86XK_MailForward, Qt::Key_MailForward,
+ XF86XK_Pictures, Qt::Key_Pictures,
+ XF86XK_Music, Qt::Key_Music,
+ XF86XK_Battery, Qt::Key_Battery,
+ XF86XK_Bluetooth, Qt::Key_Bluetooth,
+ XF86XK_WLAN, Qt::Key_WLAN,
+ XF86XK_UWB, Qt::Key_UWB,
+ XF86XK_AudioForward, Qt::Key_AudioForward,
+ XF86XK_AudioRepeat, Qt::Key_AudioRepeat,
+ XF86XK_AudioRandomPlay, Qt::Key_AudioRandomPlay,
+ XF86XK_Subtitle, Qt::Key_Subtitle,
+ XF86XK_AudioCycleTrack, Qt::Key_AudioCycleTrack,
+ XF86XK_Time, Qt::Key_Time,
+ XF86XK_Select, Qt::Key_Select,
+ XF86XK_View, Qt::Key_View,
+ XF86XK_TopMenu, Qt::Key_TopMenu,
+ XF86XK_Bluetooth, Qt::Key_Bluetooth,
+ XF86XK_Suspend, Qt::Key_Suspend,
+ XF86XK_Hibernate, Qt::Key_Hibernate,
+ XF86XK_Launch0, Qt::Key_Launch2, // ### Qt 5: remap properly
+ XF86XK_Launch1, Qt::Key_Launch3,
+ XF86XK_Launch2, Qt::Key_Launch4,
+ XF86XK_Launch3, Qt::Key_Launch5,
+ XF86XK_Launch4, Qt::Key_Launch6,
+ XF86XK_Launch5, Qt::Key_Launch7,
+ XF86XK_Launch6, Qt::Key_Launch8,
+ XF86XK_Launch7, Qt::Key_Launch9,
+ XF86XK_Launch8, Qt::Key_LaunchA,
+ XF86XK_Launch9, Qt::Key_LaunchB,
+ XF86XK_LaunchA, Qt::Key_LaunchC,
+ XF86XK_LaunchB, Qt::Key_LaunchD,
+ XF86XK_LaunchC, Qt::Key_LaunchE,
+ XF86XK_LaunchD, Qt::Key_LaunchF,
+ XF86XK_LaunchE, Qt::Key_LaunchG,
+ XF86XK_LaunchF, Qt::Key_LaunchH,
+
+ // Qtopia keys
+ QTOPIAXK_Select, Qt::Key_Select,
+ QTOPIAXK_Yes, Qt::Key_Yes,
+ QTOPIAXK_No, Qt::Key_No,
+ QTOPIAXK_Cancel, Qt::Key_Cancel,
+ QTOPIAXK_Printer, Qt::Key_Printer,
+ QTOPIAXK_Execute, Qt::Key_Execute,
+ QTOPIAXK_Sleep, Qt::Key_Sleep,
+ QTOPIAXK_Play, Qt::Key_Play,
+ QTOPIAXK_Zoom, Qt::Key_Zoom,
+ QTOPIAXK_Context1, Qt::Key_Context1,
+ QTOPIAXK_Context2, Qt::Key_Context2,
+ QTOPIAXK_Context3, Qt::Key_Context3,
+ QTOPIAXK_Context4, Qt::Key_Context4,
+ QTOPIAXK_Call, Qt::Key_Call,
+ QTOPIAXK_Hangup, Qt::Key_Hangup,
+ QTOPIAXK_Flip, Qt::Key_Flip,
+
+ 0, 0
+};
+
+static const unsigned short katakanaKeysymsToUnicode[] = {
+ 0x0000, 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1,
+ 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3,
+ 0x30FC, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,
+ 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,
+ 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,
+ 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,
+ 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x309B, 0x309C
+};
+
+static const unsigned short cyrillicKeysymsToUnicode[] = {
+ 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0000, 0x045e, 0x045f,
+ 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0000, 0x040e, 0x040f,
+ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
+ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a
+};
+
+static const unsigned short greekKeysymsToUnicode[] = {
+ 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c,
+ 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015,
+ 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc,
+ 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
+ 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
+ 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+ 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+ 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
+ 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short technicalKeysymsToUnicode[] = {
+ 0x0000, 0x23B7, 0x250C, 0x2500, 0x2320, 0x2321, 0x2502, 0x23A1,
+ 0x23A3, 0x23A4, 0x23A6, 0x239B, 0x239D, 0x239E, 0x23A0, 0x23A8,
+ 0x23AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222B,
+ 0x2234, 0x221D, 0x221E, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000,
+ 0x223C, 0x2243, 0x0000, 0x0000, 0x0000, 0x21D4, 0x21D2, 0x2261,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x0000,
+ 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222A, 0x2227, 0x2228,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193, 0x0000
+};
+
+static const unsigned short specialKeysymsToUnicode[] = {
+ 0x25C6, 0x2592, 0x2409, 0x240C, 0x240D, 0x240A, 0x0000, 0x0000,
+ 0x2424, 0x240B, 0x2518, 0x2510, 0x250C, 0x2514, 0x253C, 0x23BA,
+ 0x23BB, 0x2500, 0x23BC, 0x23BD, 0x251C, 0x2524, 0x2534, 0x252C,
+ 0x2502, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short publishingKeysymsToUnicode[] = {
+ 0x0000, 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009,
+ 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025,
+ 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a,
+ 0x2105, 0x0000, 0x0000, 0x2012, 0x2329, 0x0000, 0x232a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000,
+ 0x0000, 0x2122, 0x2613, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25af,
+ 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x0000, 0x2032, 0x2033,
+ 0x0000, 0x271d, 0x0000, 0x25ac, 0x25c0, 0x25b6, 0x25cf, 0x25ae,
+ 0x25e6, 0x25ab, 0x25ad, 0x25b3, 0x25bd, 0x2606, 0x2022, 0x25aa,
+ 0x25b2, 0x25bc, 0x261c, 0x261e, 0x2663, 0x2666, 0x2665, 0x0000,
+ 0x2720, 0x2020, 0x2021, 0x2713, 0x2717, 0x266f, 0x266d, 0x2642,
+ 0x2640, 0x260e, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e, 0x0000
+};
+
+static const unsigned short aplKeysymsToUnicode[] = {
+ 0x0000, 0x0000, 0x0000, 0x003c, 0x0000, 0x0000, 0x003e, 0x0000,
+ 0x2228, 0x2227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00af, 0x0000, 0x22a5, 0x2229, 0x230a, 0x0000, 0x005f, 0x0000,
+ 0x0000, 0x0000, 0x2218, 0x0000, 0x2395, 0x0000, 0x22a4, 0x25cb,
+ 0x0000, 0x0000, 0x0000, 0x2308, 0x0000, 0x0000, 0x222a, 0x0000,
+ 0x2283, 0x0000, 0x2282, 0x0000, 0x22a2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x22a3, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short koreanKeysymsToUnicode[] = {
+ 0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137,
+ 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f,
+ 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147,
+ 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f,
+ 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157,
+ 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f,
+ 0x3160, 0x3161, 0x3162, 0x3163, 0x11a8, 0x11a9, 0x11aa, 0x11ab,
+ 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3,
+ 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb,
+ 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x316d,
+ 0x3171, 0x3178, 0x317f, 0x3181, 0x3184, 0x3186, 0x318d, 0x318e,
+ 0x11eb, 0x11f0, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9
+};
+
+static QChar keysymToUnicode(unsigned char byte3, unsigned char byte4)
+{
+ switch (byte3) {
+ case 0x04:
+ // katakana
+ if (byte4 > 0xa0 && byte4 < 0xe0)
+ return QChar(katakanaKeysymsToUnicode[byte4 - 0xa0]);
+ else if (byte4 == 0x7e)
+ return QChar(0x203e); // Overline
+ break;
+ case 0x06:
+ // russian, use lookup table
+ if (byte4 > 0xa0)
+ return QChar(cyrillicKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x07:
+ // greek
+ if (byte4 > 0xa0)
+ return QChar(greekKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x08:
+ // technical
+ if (byte4 > 0xa0)
+ return QChar(technicalKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x09:
+ // special
+ if (byte4 >= 0xe0)
+ return QChar(specialKeysymsToUnicode[byte4 - 0xe0]);
+ break;
+ case 0x0a:
+ // publishing
+ if (byte4 > 0xa0)
+ return QChar(publishingKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x0b:
+ // APL
+ if (byte4 > 0xa0)
+ return QChar(aplKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x0e:
+ // Korean
+ if (byte4 > 0xa0)
+ return QChar(koreanKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ default:
+ break;
+ }
+ return QChar(0x0);
+}
+
+Qt::KeyboardModifiers QXcbKeyboard::translateModifiers(int s)
+{
+ Qt::KeyboardModifiers ret = 0;
+ if (s & XCB_MOD_MASK_SHIFT)
+ ret |= Qt::ShiftModifier;
+ if (s & XCB_MOD_MASK_CONTROL)
+ ret |= Qt::ControlModifier;
+ if (s & m_alt_mask)
+ ret |= Qt::AltModifier;
+ if (s & m_meta_mask)
+ ret |= Qt::MetaModifier;
+ return ret;
+}
+
+int QXcbKeyboard::translateKeySym(uint key) const
+{
+ int code = -1;
+ int i = 0; // any other keys
+ while (KeyTbl[i]) {
+ if (key == KeyTbl[i]) {
+ code = (int)KeyTbl[i+1];
+ break;
+ }
+ i += 2;
+ }
+ if (m_meta_mask) {
+ // translate Super/Hyper keys to Meta if we're using them as the MetaModifier
+ if (m_meta_mask == m_super_mask && (code == Qt::Key_Super_L || code == Qt::Key_Super_R)) {
+ code = Qt::Key_Meta;
+ } else if (m_meta_mask == m_hyper_mask && (code == Qt::Key_Hyper_L || code == Qt::Key_Hyper_R)) {
+ code = Qt::Key_Meta;
+ }
+ }
+ return code;
+}
+
+QString QXcbKeyboard::translateKeySym(xcb_keysym_t keysym, uint xmodifiers,
+ int &code, Qt::KeyboardModifiers &modifiers,
+ QByteArray &chars, int &count)
+{
+ // all keysyms smaller than 0xff00 are actally keys that can be mapped to unicode chars
+
+ QTextCodec *mapper = QTextCodec::codecForLocale();
+ QChar converted;
+
+ if (/*count == 0 &&*/ keysym < 0xff00) {
+ unsigned char byte3 = (unsigned char)(keysym >> 8);
+ int mib = -1;
+ switch(byte3) {
+ case 0: // Latin 1
+ case 1: // Latin 2
+ case 2: //latin 3
+ case 3: // latin4
+ mib = byte3 + 4; break;
+ case 5: // arabic
+ mib = 82; break;
+ case 12: // Hebrew
+ mib = 85; break;
+ case 13: // Thai
+ mib = 2259; break;
+ case 4: // kana
+ case 6: // cyrillic
+ case 7: // greek
+ case 8: // technical, no mapping here at the moment
+ case 9: // Special
+ case 10: // Publishing
+ case 11: // APL
+ case 14: // Korean, no mapping
+ mib = -1; // manual conversion
+ mapper= 0;
+#if !defined(QT_NO_XIM)
+ converted = keysymToUnicode(byte3, keysym & 0xff);
+#endif
+ case 0x20:
+ // currency symbols
+ if (keysym >= 0x20a0 && keysym <= 0x20ac) {
+ mib = -1; // manual conversion
+ mapper = 0;
+ converted = (uint)keysym;
+ }
+ break;
+ default:
+ break;
+ }
+ if (mib != -1) {
+ mapper = QTextCodec::codecForMib(mib);
+ if (chars.isEmpty())
+ chars.resize(1);
+ chars[0] = (unsigned char) (keysym & 0xff); // get only the fourth bit for conversion later
+ count = 1;
+ }
+ } else if (keysym >= 0x1000000 && keysym <= 0x100ffff) {
+ converted = (ushort) (keysym - 0x1000000);
+ mapper = 0;
+ }
+ if (count < (int)chars.size()-1)
+ chars[count] = '\0';
+
+ QString text;
+ if (!mapper && converted.unicode() != 0x0) {
+ text = converted;
+ } else if (!chars.isEmpty()) {
+ // convert chars (8bit) to text (unicode).
+ if (mapper)
+ text = mapper->toUnicode(chars.data(), count, 0);
+ if (text.isEmpty()) {
+ // no mapper, or codec couldn't convert to unicode (this
+ // can happen when running in the C locale or with no LANG
+ // set). try converting from latin-1
+ text = QString::fromLatin1(chars);
+ }
+ }
+
+ modifiers = translateModifiers(xmodifiers);
+
+ // Commentary in X11/keysymdef says that X codes match ASCII, so it
+ // is safe to use the locale functions to process X codes in ISO8859-1.
+ //
+ // This is mainly for compatibility - applications should not use the
+ // Qt keycodes between 128 and 255, but should rather use the
+ // QKeyEvent::text().
+ //
+ if (keysym < 128 || (keysym < 256 && (!mapper || mapper->mibEnum()==4))) {
+ // upper-case key, if known
+ code = isprint((int)keysym) ? toupper((int)keysym) : 0;
+ } else if (keysym >= XK_F1 && keysym <= XK_F35) {
+ // function keys
+ code = Qt::Key_F1 + ((int)keysym - XK_F1);
+ } else if (keysym >= XK_KP_Space && keysym <= XK_KP_9) {
+ if (keysym >= XK_KP_0) {
+ // numeric keypad keys
+ code = Qt::Key_0 + ((int)keysym - XK_KP_0);
+ } else {
+ code = translateKeySym(keysym);
+ }
+ modifiers |= Qt::KeypadModifier;
+ } else if (text.length() == 1 && text.unicode()->unicode() > 0x1f && text.unicode()->unicode() != 0x7f && !(keysym >= XK_dead_grave && keysym <= XK_dead_horn)) {
+ code = text.unicode()->toUpper().unicode();
+ } else {
+ // any other keys
+ code = translateKeySym(keysym);
+
+ if (code == Qt::Key_Tab && (modifiers & Qt::ShiftModifier)) {
+ // map shift+tab to shift+backtab, QShortcutMap knows about it
+ // and will handle it.
+ code = Qt::Key_Backtab;
+ text = QString();
+ }
+ }
+
+ return text;
+}
+
+QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection)
+ : QXcbObject(connection)
+ , m_alt_mask(0)
+ , m_super_mask(0)
+ , m_hyper_mask(0)
+ , m_meta_mask(0)
+{
+ m_key_symbols = xcb_key_symbols_alloc(xcb_connection());
+}
+
+QXcbKeyboard::~QXcbKeyboard()
+{
+ xcb_key_symbols_free(m_key_symbols);
+}
+
+// #define XCB_KEYBOARD_DEBUG
+
+void QXcbKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time)
+{
+ int col = state & XCB_MOD_MASK_SHIFT ? 1 : 0;
+
+ const int altGrOffset = 4;
+ if (state & 128)
+ col += altGrOffset;
+
+ Q_XCB_NOOP(connection());
+
+#ifdef XCB_KEYBOARD_DEBUG
+ printf("key code: %d, state: %d, syms: ", code, state);
+ for (int i = 0; i <= 5; ++i) {
+ printf("%d ", xcb_key_symbols_get_keysym(m_key_symbols, code, i));
+ }
+ printf("\n");
+#endif
+
+ Q_XCB_NOOP(connection());
+
+ xcb_keysym_t sym = xcb_key_symbols_get_keysym(m_key_symbols, code, col);
+ if (sym == XCB_NO_SYMBOL)
+ sym = xcb_key_symbols_get_keysym(m_key_symbols, code, col ^ 0x1);
+
+ if (state & XCB_MOD_MASK_LOCK && sym <= 0x7f && isprint(sym)) {
+ if (isupper(sym))
+ sym = tolower(sym);
+ else
+ sym = toupper(sym);
+ }
+
+ Q_XCB_NOOP(connection());
+
+ QByteArray chars;
+
+ Qt::KeyboardModifiers modifiers;
+ int qtcode = 0;
+ int count = 0;
+
+ QString string = translateKeySym(sym, state, qtcode, modifiers, chars, count);
+
+ QWindowSystemInterface::handleExtendedKeyEvent(widget, time, type, qtcode, modifiers, code, 0, state, string.left(count));
+}
+
+void QXcbKeyboard::handleKeyPressEvent(QWidget *widget, const xcb_key_press_event_t *event)
+{
+ handleKeyEvent(widget, QEvent::KeyPress, event->detail, event->state, event->time);
+}
+
+void QXcbKeyboard::handleKeyReleaseEvent(QWidget *widget, const xcb_key_release_event_t *event)
+{
+ handleKeyEvent(widget, QEvent::KeyRelease, event->detail, event->state, event->time);
+}
+
+void QXcbKeyboard::handleMappingNotifyEvent(const xcb_mapping_notify_event_t *event)
+{
+ xcb_refresh_keyboard_mapping(m_key_symbols, const_cast<xcb_mapping_notify_event_t *>(event));
+}
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h
new file mode 100644
index 0000000000..ddade79d51
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBKEYBOARD_H
+#define QXCBKEYBOARD_H
+
+#include "qxcbobject.h"
+
+#include "xcb/xcb_keysyms.h"
+
+#include <QEvent>
+
+class QXcbKeyboard : public QXcbObject
+{
+public:
+ QXcbKeyboard(QXcbConnection *connection);
+ ~QXcbKeyboard();
+
+ void handleKeyPressEvent(QWidget *widget, const xcb_key_press_event_t *event);
+ void handleKeyReleaseEvent(QWidget *widget, const xcb_key_release_event_t *event);
+
+ void handleMappingNotifyEvent(const xcb_mapping_notify_event_t *event);
+
+ Qt::KeyboardModifiers translateModifiers(int s);
+
+private:
+ void handleKeyEvent(QWidget *widget, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time);
+
+ int translateKeySym(uint key) const;
+ QString translateKeySym(xcb_keysym_t keysym, uint xmodifiers,
+ int &code, Qt::KeyboardModifiers &modifiers,
+ QByteArray &chars, int &count);
+
+ uint m_alt_mask;
+ uint m_super_mask;
+ uint m_hyper_mask;
+ uint m_meta_mask;
+ uint m_mode_switch_mask;
+ uint m_num_lock_mask;
+
+ xcb_key_symbols_t *m_key_symbols;
+};
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
new file mode 100644
index 0000000000..b2ca1beb6e
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -0,0 +1,185 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbnativeinterface.h"
+
+#include "qxcbscreen.h"
+
+#include <QtGui/private/qapplication_p.h>
+#include <QtCore/QMap>
+
+#include <QtCore/QDebug>
+
+#if defined(XCB_USE_EGL)
+#include "../eglconvenience/qeglplatformcontext.h"
+#elif defined (XCB_USE_DRI2)
+#include "qdri2context.h"
+#endif
+
+class QXcbResourceMap : public QMap<QByteArray, QXcbNativeInterface::ResourceType>
+{
+public:
+ QXcbResourceMap()
+ :QMap<QByteArray, QXcbNativeInterface::ResourceType>()
+ {
+ insert("display",QXcbNativeInterface::Display);
+ insert("egldisplay",QXcbNativeInterface::EglDisplay);
+ insert("connection",QXcbNativeInterface::Connection);
+ insert("screen",QXcbNativeInterface::Screen);
+ insert("graphicsdevice",QXcbNativeInterface::GraphicsDevice);
+ insert("eglcontext",QXcbNativeInterface::EglContext);
+ }
+};
+
+Q_GLOBAL_STATIC(QXcbResourceMap, qXcbResourceMap)
+
+void *QXcbNativeInterface::nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget)
+{
+ QByteArray lowerCaseResource = resourceString.toLower();
+ ResourceType resource = qXcbResourceMap()->value(lowerCaseResource);
+ void *result = 0;
+ switch(resource) {
+ case Display:
+ result = displayForWidget(widget);
+ break;
+ case EglDisplay:
+ result = eglDisplayForWidget(widget);
+ break;
+ case Connection:
+ result = connectionForWidget(widget);
+ break;
+ case Screen:
+ result = qPlatformScreenForWidget(widget);
+ break;
+ case GraphicsDevice:
+ result = graphicsDeviceForWidget(widget);
+ break;
+ case EglContext:
+ result = eglContextForWidget(widget);
+ break;
+ default:
+ result = 0;
+ }
+ return result;
+}
+
+QXcbScreen *QXcbNativeInterface::qPlatformScreenForWidget(QWidget *widget)
+{
+ QXcbScreen *screen;
+ if (widget) {
+ screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(widget));
+ }else {
+ screen = static_cast<QXcbScreen *>(QApplicationPrivate::platformIntegration()->screens()[0]);
+ }
+ return screen;
+}
+
+void *QXcbNativeInterface::displayForWidget(QWidget *widget)
+{
+#if defined(XCB_USE_XLIB)
+ QXcbScreen *screen = qPlatformScreenForWidget(widget);
+ return screen->connection()->xlib_display();
+#else
+ Q_UNUSED(widget);
+ return 0;
+#endif
+}
+
+void *QXcbNativeInterface::eglDisplayForWidget(QWidget *widget)
+{
+#if defined(XCB_USE_DRI2) || defined(XCB_USE_EGL)
+ QXcbScreen *screen = qPlatformScreenForWidget(widget);
+ return screen->connection()->egl_display();
+#else
+ Q_UNUSED(widget)
+ return 0;
+#endif
+}
+
+void *QXcbNativeInterface::connectionForWidget(QWidget *widget)
+{
+ QXcbScreen *screen = qPlatformScreenForWidget(widget);
+ return screen->xcb_connection();
+}
+
+void *QXcbNativeInterface::screenForWidget(QWidget *widget)
+{
+ QXcbScreen *screen = qPlatformScreenForWidget(widget);
+ return screen->screen();
+}
+
+void *QXcbNativeInterface::graphicsDeviceForWidget(QWidget *widget)
+{
+#if defined(XCB_USE_DRI2)
+ QXcbScreen *screen = qPlatformScreenForWidget(widget);
+ QByteArray deviceName = screen->connection()->dri2DeviceName();
+ return deviceName.data();
+#else
+ Q_UNUSED(widget);
+ return 0;
+#endif
+
+}
+
+void * QXcbNativeInterface::eglContextForWidget(QWidget *widget)
+{
+ Q_ASSERT(widget);
+ if (!widget->platformWindow()) {
+ qDebug() << "QPlatformWindow does not exist for widget" << widget
+ << "cannot return EGLContext";
+ return 0;
+ }
+ QPlatformGLContext *platformContext = widget->platformWindow()->glContext();
+ if (!platformContext) {
+ qDebug() << "QPlatformWindow" << widget->platformWindow() << "does not have a glContext"
+ << "cannot return EGLContext";
+ return 0;
+ }
+#if defined(XCB_USE_EGL)
+ QEGLPlatformContext *eglPlatformContext = static_cast<QEGLPlatformContext *>(platformContext);
+ return eglPlatformContext->eglContext();
+#elif defined (XCB_USE_DRI2)
+ QDri2Context *dri2Context = static_cast<QDri2Context *>(platformContext);
+ return dri2Context->eglContext();
+#else
+ return 0;
+#endif
+}
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h
new file mode 100644
index 0000000000..f60905cc3d
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBNATIVEINTERFACE_H
+#define QXCBNATIVEINTERFACE_H
+
+#include <QtGui/QPlatformNativeInterface>
+
+class QWidget;
+class QXcbScreen;
+
+class QXcbNativeInterface : public QPlatformNativeInterface
+{
+public:
+ enum ResourceType {
+ Display,
+ EglDisplay,
+ Connection,
+ Screen,
+ GraphicsDevice,
+ EglContext
+ };
+
+ void *nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget);
+
+ void *displayForWidget(QWidget *widget);
+ void *eglDisplayForWidget(QWidget *widget);
+ void *connectionForWidget(QWidget *widget);
+ void *screenForWidget(QWidget *widget);
+ void *graphicsDeviceForWidget(QWidget *widget);
+ void *eglContextForWidget(QWidget *widget);
+
+private:
+ static QXcbScreen *qPlatformScreenForWidget(QWidget *widget);
+};
+
+#endif // QXCBNATIVEINTERFACE_H
diff --git a/src/plugins/platforms/xcb/qxcbobject.h b/src/plugins/platforms/xcb/qxcbobject.h
new file mode 100644
index 0000000000..69494b0349
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbobject.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBOBJECT_H
+#define QXCBOBJECT_H
+
+#include "qxcbconnection.h"
+
+class QXcbObject
+{
+public:
+ QXcbObject(QXcbConnection *connection = 0) : m_connection(connection) {}
+
+ void setConnection(QXcbConnection *connection) { m_connection = connection; }
+ QXcbConnection *connection() const { return m_connection; }
+
+ xcb_atom_t atom(QXcbAtom::Atom atom) const { return m_connection->atom(atom); }
+ xcb_connection_t *xcb_connection() const { return m_connection->xcb_connection(); }
+
+private:
+ QXcbConnection *m_connection;
+};
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
new file mode 100644
index 0000000000..1c12ee3059
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbscreen.h"
+
+#include <stdio.h>
+
+QXcbScreen::QXcbScreen(QXcbConnection *connection, xcb_screen_t *screen, int number)
+ : QXcbObject(connection)
+ , m_screen(screen)
+ , m_number(number)
+{
+ printf ("\n");
+ printf ("Information of screen %d:\n", screen->root);
+ printf (" width.........: %d\n", screen->width_in_pixels);
+ printf (" height........: %d\n", screen->height_in_pixels);
+ printf (" depth.........: %d\n", screen->root_depth);
+ printf (" white pixel...: %x\n", screen->white_pixel);
+ printf (" black pixel...: %x\n", screen->black_pixel);
+ printf ("\n");
+
+ const quint32 mask = XCB_CW_EVENT_MASK;
+ const quint32 values[] = {
+ // XCB_CW_EVENT_MASK
+ XCB_EVENT_MASK_ENTER_WINDOW
+ | XCB_EVENT_MASK_LEAVE_WINDOW
+ | XCB_EVENT_MASK_PROPERTY_CHANGE
+ };
+
+ xcb_change_window_attributes(xcb_connection(), screen->root, mask, values);
+
+ xcb_generic_error_t *error;
+
+ xcb_get_property_reply_t *reply =
+ xcb_get_property_reply(xcb_connection(),
+ xcb_get_property(xcb_connection(), false, screen->root,
+ atom(QXcbAtom::_NET_SUPPORTING_WM_CHECK),
+ XCB_ATOM_WINDOW, 0, 1024), &error);
+
+ if (reply && reply->format == 32 && reply->type == XCB_ATOM_WINDOW) {
+ xcb_window_t windowManager = *((xcb_window_t *)xcb_get_property_value(reply));
+
+ if (windowManager != XCB_WINDOW_NONE) {
+ xcb_get_property_reply_t *windowManagerReply =
+ xcb_get_property_reply(xcb_connection(),
+ xcb_get_property(xcb_connection(), false, windowManager,
+ atom(QXcbAtom::_NET_WM_NAME),
+ atom(QXcbAtom::UTF8_STRING), 0, 1024), &error);
+ if (windowManagerReply && windowManagerReply->format == 8 && windowManagerReply->type == atom(QXcbAtom::UTF8_STRING)) {
+ m_windowManagerName = QString::fromUtf8((const char *)xcb_get_property_value(windowManagerReply), xcb_get_property_value_length(windowManagerReply));
+ printf("Running window manager: %s\n", qPrintable(m_windowManagerName));
+ } else if (error) {
+ connection->handleXcbError(error);
+ free(error);
+ }
+
+ free(windowManagerReply);
+ }
+ } else if (error) {
+ connection->handleXcbError(error);
+ free(error);
+ }
+
+ free(reply);
+
+ m_syncRequestSupported = m_windowManagerName != QLatin1String("KWin");
+}
+
+QXcbScreen::~QXcbScreen()
+{
+}
+
+QRect QXcbScreen::geometry() const
+{
+ return QRect(0, 0, m_screen->width_in_pixels, m_screen->height_in_pixels);
+}
+
+int QXcbScreen::depth() const
+{
+ return m_screen->root_depth;
+}
+
+QImage::Format QXcbScreen::format() const
+{
+ return QImage::Format_RGB32;
+}
+
+QSize QXcbScreen::physicalSize() const
+{
+ return QSize(m_screen->width_in_millimeters, m_screen->height_in_millimeters);
+}
+
+int QXcbScreen::screenNumber() const
+{
+ return m_number;
+}
diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h
new file mode 100644
index 0000000000..9547d016b7
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbscreen.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBSCREEN_H
+#define QXCBSCREEN_H
+
+#include <QtGui/QPlatformScreen>
+#include <QtCore/QString>
+
+#include <xcb/xcb.h>
+
+#include "qxcbobject.h"
+
+class QXcbConnection;
+
+class QXcbScreen : public QXcbObject, public QPlatformScreen
+{
+public:
+ QXcbScreen(QXcbConnection *connection, xcb_screen_t *screen, int number);
+ ~QXcbScreen();
+
+ QRect geometry() const;
+ int depth() const;
+ QImage::Format format() const;
+ QSize physicalSize() const;
+
+ int screenNumber() const;
+
+ xcb_screen_t *screen() const { return m_screen; }
+ xcb_window_t root() const { return m_screen->root; }
+
+ QString windowManagerName() const { return m_windowManagerName; }
+ bool syncRequestSupported() const { return m_syncRequestSupported; }
+
+private:
+ xcb_screen_t *m_screen;
+ int m_number;
+ QString m_windowManagerName;
+ bool m_syncRequestSupported;
+};
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
new file mode 100644
index 0000000000..0456638ab9
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -0,0 +1,683 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbwindow.h"
+
+#include <QtDebug>
+
+#include "qxcbconnection.h"
+#include "qxcbscreen.h"
+#ifdef XCB_USE_DRI2
+#include "qdri2context.h"
+#endif
+
+#include <xcb/xcb_icccm.h>
+
+#include <private/qapplication_p.h>
+#include <private/qwindowsurface_p.h>
+
+#include <QtGui/QWindowSystemInterface>
+
+#include <stdio.h>
+
+#ifdef XCB_USE_XLIB
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif
+
+#if defined(XCB_USE_GLX)
+#include "qglxintegration.h"
+#include "qglxconvenience.h"
+#elif defined(XCB_USE_EGL)
+#include "../eglconvenience/qeglplatformcontext.h"
+#include "../eglconvenience/qeglconvenience.h"
+#include "../eglconvenience/qxlibeglintegration.h"
+#endif
+
+// Returns true if we should set WM_TRANSIENT_FOR on \a w
+static inline bool isTransient(const QWidget *w)
+{
+ return ((w->windowType() == Qt::Dialog
+ || w->windowType() == Qt::Sheet
+ || w->windowType() == Qt::Tool
+ || w->windowType() == Qt::SplashScreen
+ || w->windowType() == Qt::ToolTip
+ || w->windowType() == Qt::Drawer
+ || w->windowType() == Qt::Popup)
+ && !w->testAttribute(Qt::WA_X11BypassTransientForHint));
+}
+
+QXcbWindow::QXcbWindow(QWidget *tlw)
+ : QPlatformWindow(tlw)
+ , m_context(0)
+{
+ m_screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(tlw));
+
+ setConnection(m_screen->connection());
+
+ const quint32 mask = XCB_CW_BACK_PIXMAP | XCB_CW_EVENT_MASK;
+ const quint32 values[] = {
+ // XCB_CW_BACK_PIXMAP
+ XCB_NONE,
+ // XCB_CW_EVENT_MASK
+ XCB_EVENT_MASK_EXPOSURE
+ | XCB_EVENT_MASK_STRUCTURE_NOTIFY
+ | XCB_EVENT_MASK_KEY_PRESS
+ | XCB_EVENT_MASK_KEY_RELEASE
+ | XCB_EVENT_MASK_BUTTON_PRESS
+ | XCB_EVENT_MASK_BUTTON_RELEASE
+ | XCB_EVENT_MASK_BUTTON_MOTION
+ | XCB_EVENT_MASK_ENTER_WINDOW
+ | XCB_EVENT_MASK_LEAVE_WINDOW
+ | XCB_EVENT_MASK_PROPERTY_CHANGE
+ | XCB_EVENT_MASK_FOCUS_CHANGE
+ };
+
+#if defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
+ if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
+ && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
+ {
+#if defined(XCB_USE_GLX)
+ XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(m_screen),m_screen->screenNumber(), tlw->platformWindowFormat());
+#elif defined(XCB_USE_EGL)
+ EGLDisplay eglDisplay = connection()->egl_display();
+ EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,tlw->platformWindowFormat(),true);
+ VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this), eglDisplay, eglConfig);
+
+ XVisualInfo visualInfoTemplate;
+ memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+ visualInfoTemplate.visualid = id;
+
+ XVisualInfo *visualInfo;
+ int matchingCount = 0;
+ visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount);
+#endif //XCB_USE_GLX
+ if (visualInfo) {
+ Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), m_screen->root(), visualInfo->visual, AllocNone);
+
+ XSetWindowAttributes a;
+ a.colormap = cmap;
+ m_window = XCreateWindow(DISPLAY_FROM_XCB(this), m_screen->root(), tlw->x(), tlw->y(), tlw->width(), tlw->height(),
+ 0, visualInfo->depth, InputOutput, visualInfo->visual,
+ CWColormap, &a);
+
+ printf("created GL window: %d\n", m_window);
+ } else {
+ qFatal("no window!");
+ }
+ } else
+#endif //defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
+ {
+ m_window = xcb_generate_id(xcb_connection());
+
+ Q_XCB_CALL(xcb_create_window(xcb_connection(),
+ XCB_COPY_FROM_PARENT, // depth -- same as root
+ m_window, // window id
+ m_screen->root(), // parent window id
+ tlw->x(),
+ tlw->y(),
+ tlw->width(),
+ tlw->height(),
+ 0, // border width
+ XCB_WINDOW_CLASS_INPUT_OUTPUT, // window class
+ m_screen->screen()->root_visual, // visual
+ 0, // value mask
+ 0)); // value list
+
+ printf("created regular window: %d\n", m_window);
+ }
+
+ Q_XCB_CALL(xcb_change_window_attributes(xcb_connection(), m_window, mask, values));
+
+ xcb_atom_t properties[4];
+ int propertyCount = 0;
+ properties[propertyCount++] = atom(QXcbAtom::WM_DELETE_WINDOW);
+ properties[propertyCount++] = atom(QXcbAtom::WM_TAKE_FOCUS);
+ properties[propertyCount++] = atom(QXcbAtom::_NET_WM_PING);
+
+ if (m_screen->syncRequestSupported())
+ properties[propertyCount++] = atom(QXcbAtom::_NET_WM_SYNC_REQUEST);
+
+ if (tlw->windowFlags() & Qt::WindowContextHelpButtonHint)
+ properties[propertyCount++] = atom(QXcbAtom::_NET_WM_CONTEXT_HELP);
+
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_window,
+ atom(QXcbAtom::WM_PROTOCOLS),
+ XCB_ATOM_ATOM,
+ 32,
+ propertyCount,
+ properties));
+ m_syncValue.hi = 0;
+ m_syncValue.lo = 0;
+
+ if (m_screen->syncRequestSupported()) {
+ m_syncCounter = xcb_generate_id(xcb_connection());
+ Q_XCB_CALL(xcb_sync_create_counter(xcb_connection(), m_syncCounter, m_syncValue));
+
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_window,
+ atom(QXcbAtom::_NET_WM_SYNC_REQUEST_COUNTER),
+ XCB_ATOM_CARDINAL,
+ 32,
+ 1,
+ &m_syncCounter));
+ }
+
+ if (isTransient(tlw) && tlw->parentWidget()) {
+ // ICCCM 4.1.2.6
+ QWidget *p = tlw->parentWidget()->window();
+ xcb_window_t parentWindow = p->winId();
+ Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+ XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32,
+ 1, &parentWindow));
+
+ }
+
+ // set the PID to let the WM kill the application if unresponsive
+ long pid = getpid();
+ Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+ atom(QXcbAtom::_NET_WM_PID), XCB_ATOM_CARDINAL, 32,
+ 1, &pid));
+}
+
+QXcbWindow::~QXcbWindow()
+{
+ delete m_context;
+ if (m_screen->syncRequestSupported())
+ Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter));
+ Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
+}
+
+void QXcbWindow::setGeometry(const QRect &rect)
+{
+ QPlatformWindow::setGeometry(rect);
+
+ const quint32 mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
+ const quint32 values[] = { rect.x(), rect.y(), rect.width(), rect.height() };
+
+ Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
+}
+
+void QXcbWindow::setVisible(bool visible)
+{
+ xcb_wm_hints_t hints;
+ if (visible) {
+ if (widget()->isMinimized())
+ xcb_wm_hints_set_iconic(&hints);
+ else
+ xcb_wm_hints_set_normal(&hints);
+ xcb_set_wm_hints(xcb_connection(), m_window, &hints);
+ Q_XCB_CALL(xcb_map_window(xcb_connection(), m_window));
+ connection()->sync();
+ } else {
+ Q_XCB_CALL(xcb_unmap_window(xcb_connection(), m_window));
+
+ // send synthetic UnmapNotify event according to icccm 4.1.4
+ xcb_unmap_notify_event_t event;
+ event.response_type = XCB_UNMAP_NOTIFY;
+ event.sequence = 0; // does this matter?
+ event.event = m_screen->root();
+ event.window = m_window;
+ event.from_configure = false;
+ Q_XCB_CALL(xcb_send_event(xcb_connection(), false, m_screen->root(),
+ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&event));
+
+ xcb_flush(xcb_connection());
+ }
+}
+
+struct QtMWMHints {
+ quint32 flags, functions, decorations;
+ qint32 input_mode;
+ quint32 status;
+};
+
+enum {
+ MWM_HINTS_FUNCTIONS = (1L << 0),
+
+ MWM_FUNC_ALL = (1L << 0),
+ MWM_FUNC_RESIZE = (1L << 1),
+ MWM_FUNC_MOVE = (1L << 2),
+ MWM_FUNC_MINIMIZE = (1L << 3),
+ MWM_FUNC_MAXIMIZE = (1L << 4),
+ MWM_FUNC_CLOSE = (1L << 5),
+
+ MWM_HINTS_DECORATIONS = (1L << 1),
+
+ MWM_DECOR_ALL = (1L << 0),
+ MWM_DECOR_BORDER = (1L << 1),
+ MWM_DECOR_RESIZEH = (1L << 2),
+ MWM_DECOR_TITLE = (1L << 3),
+ MWM_DECOR_MENU = (1L << 4),
+ MWM_DECOR_MINIMIZE = (1L << 5),
+ MWM_DECOR_MAXIMIZE = (1L << 6),
+
+ MWM_HINTS_INPUT_MODE = (1L << 2),
+
+ MWM_INPUT_MODELESS = 0L,
+ MWM_INPUT_PRIMARY_APPLICATION_MODAL = 1L,
+ MWM_INPUT_FULL_APPLICATION_MODAL = 3L
+};
+
+Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
+{
+ Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+
+ setNetWmWindowTypes(flags);
+
+ if (type == Qt::ToolTip)
+ flags |= Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint;
+ if (type == Qt::Popup)
+ flags |= Qt::X11BypassWindowManagerHint;
+
+ bool topLevel = (flags & Qt::Window);
+ bool popup = (type == Qt::Popup);
+ bool dialog = (type == Qt::Dialog
+ || type == Qt::Sheet);
+ bool desktop = (type == Qt::Desktop);
+ bool tool = (type == Qt::Tool || type == Qt::SplashScreen
+ || type == Qt::ToolTip || type == Qt::Drawer);
+
+ Q_UNUSED(topLevel);
+ Q_UNUSED(dialog);
+ Q_UNUSED(desktop);
+ Q_UNUSED(tool);
+
+ bool tooltip = (type == Qt::ToolTip);
+
+ QtMWMHints mwmhints;
+ mwmhints.flags = 0L;
+ mwmhints.functions = 0L;
+ mwmhints.decorations = 0;
+ mwmhints.input_mode = 0L;
+ mwmhints.status = 0L;
+
+ if (type != Qt::SplashScreen) {
+ mwmhints.flags |= MWM_HINTS_DECORATIONS;
+
+ bool customize = flags & Qt::CustomizeWindowHint;
+ if (!(flags & Qt::FramelessWindowHint) && !(customize && !(flags & Qt::WindowTitleHint))) {
+ mwmhints.decorations |= MWM_DECOR_BORDER;
+ mwmhints.decorations |= MWM_DECOR_RESIZEH;
+
+ if (flags & Qt::WindowTitleHint)
+ mwmhints.decorations |= MWM_DECOR_TITLE;
+
+ if (flags & Qt::WindowSystemMenuHint)
+ mwmhints.decorations |= MWM_DECOR_MENU;
+
+ if (flags & Qt::WindowMinimizeButtonHint) {
+ mwmhints.decorations |= MWM_DECOR_MINIMIZE;
+ mwmhints.functions |= MWM_FUNC_MINIMIZE;
+ }
+
+ if (flags & Qt::WindowMaximizeButtonHint) {
+ mwmhints.decorations |= MWM_DECOR_MAXIMIZE;
+ mwmhints.functions |= MWM_FUNC_MAXIMIZE;
+ }
+
+ if (flags & Qt::WindowCloseButtonHint)
+ mwmhints.functions |= MWM_FUNC_CLOSE;
+ }
+ } else {
+ // if type == Qt::SplashScreen
+ mwmhints.decorations = MWM_DECOR_ALL;
+ }
+
+ if (mwmhints.functions != 0) {
+ mwmhints.flags |= MWM_HINTS_FUNCTIONS;
+ mwmhints.functions |= MWM_FUNC_MOVE | MWM_FUNC_RESIZE;
+ } else {
+ mwmhints.functions = MWM_FUNC_ALL;
+ }
+
+ if (!(flags & Qt::FramelessWindowHint)
+ && flags & Qt::CustomizeWindowHint
+ && flags & Qt::WindowTitleHint
+ && !(flags &
+ (Qt::WindowMinimizeButtonHint
+ | Qt::WindowMaximizeButtonHint
+ | Qt::WindowCloseButtonHint)))
+ {
+ // a special case - only the titlebar without any button
+ mwmhints.flags = MWM_HINTS_FUNCTIONS;
+ mwmhints.functions = MWM_FUNC_MOVE | MWM_FUNC_RESIZE;
+ mwmhints.decorations = 0;
+ }
+
+ if (mwmhints.flags != 0l) {
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_window,
+ atom(QXcbAtom::_MOTIF_WM_HINTS),
+ atom(QXcbAtom::_MOTIF_WM_HINTS),
+ 32,
+ 5,
+ &mwmhints));
+ } else {
+ Q_XCB_CALL(xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_MOTIF_WM_HINTS)));
+ }
+
+ if (popup || tooltip) {
+ const quint32 mask = XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER;
+ const quint32 values[] = { true, true };
+
+ Q_XCB_CALL(xcb_change_window_attributes(xcb_connection(), m_window, mask, values));
+ }
+
+ return QPlatformWindow::setWindowFlags(flags);
+}
+
+void QXcbWindow::setNetWmWindowTypes(Qt::WindowFlags flags)
+{
+ // in order of decreasing priority
+ QVector<uint> windowTypes;
+
+ Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+
+ switch (type) {
+ case Qt::Dialog:
+ case Qt::Sheet:
+ windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG));
+ break;
+ case Qt::Tool:
+ case Qt::Drawer:
+ windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY));
+ break;
+ case Qt::ToolTip:
+ windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP));
+ break;
+ case Qt::SplashScreen:
+ windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH));
+ break;
+ default:
+ break;
+ }
+
+ if (flags & Qt::FramelessWindowHint)
+ windowTypes.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE));
+
+ windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL));
+
+ Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+ atom(QXcbAtom::_NET_WM_WINDOW_TYPE), XCB_ATOM_ATOM, 32,
+ windowTypes.count(), windowTypes.constData()));
+}
+
+WId QXcbWindow::winId() const
+{
+ return m_window;
+}
+
+void QXcbWindow::setParent(const QPlatformWindow *parent)
+{
+ QPoint topLeft = geometry().topLeft();
+ Q_XCB_CALL(xcb_reparent_window(xcb_connection(), window(), static_cast<const QXcbWindow *>(parent)->window(), topLeft.x(), topLeft.y()));
+}
+
+void QXcbWindow::setWindowTitle(const QString &title)
+{
+ QByteArray ba = title.toUtf8();
+ Q_XCB_CALL(xcb_change_property(xcb_connection(),
+ XCB_PROP_MODE_REPLACE,
+ m_window,
+ atom(QXcbAtom::_NET_WM_NAME),
+ atom(QXcbAtom::UTF8_STRING),
+ 8,
+ ba.length(),
+ ba.constData()));
+}
+
+void QXcbWindow::raise()
+{
+ const quint32 mask = XCB_CONFIG_WINDOW_STACK_MODE;
+ const quint32 values[] = { XCB_STACK_MODE_ABOVE };
+ Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
+}
+
+void QXcbWindow::lower()
+{
+ const quint32 mask = XCB_CONFIG_WINDOW_STACK_MODE;
+ const quint32 values[] = { XCB_STACK_MODE_BELOW };
+ Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
+}
+
+void QXcbWindow::requestActivateWindow()
+{
+ Q_XCB_CALL(xcb_set_input_focus(xcb_connection(), XCB_INPUT_FOCUS_PARENT, m_window, XCB_TIME_CURRENT_TIME));
+ connection()->sync();
+}
+
+QPlatformGLContext *QXcbWindow::glContext() const
+{
+ if (!QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) {
+ printf("no opengl\n");
+ return 0;
+ }
+ if (!m_context) {
+#if defined(XCB_USE_GLX)
+ QXcbWindow *that = const_cast<QXcbWindow *>(this);
+ that->m_context = new QGLXContext(m_window, m_screen, widget()->platformWindowFormat());
+#elif defined(XCB_USE_EGL)
+ EGLDisplay display = connection()->egl_display();
+ EGLConfig config = q_configFromQPlatformWindowFormat(display,widget()->platformWindowFormat(),true);
+ QVector<EGLint> eglContextAttrs;
+ eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+ eglContextAttrs.append(2);
+ eglContextAttrs.append(EGL_NONE);
+
+ EGLSurface eglSurface = eglCreateWindowSurface(display,config,(EGLNativeWindowType)m_window,0);
+ QXcbWindow *that = const_cast<QXcbWindow *>(this);
+ that->m_context = new QEGLPlatformContext(display, config, eglContextAttrs.data(), eglSurface, EGL_OPENGL_ES_API);
+#elif defined(XCB_USE_DRI2)
+ QXcbWindow *that = const_cast<QXcbWindow *>(this);
+ that->m_context = new QDri2Context(that);
+#endif
+ }
+ return m_context;
+}
+
+void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event)
+{
+ QWindowSurface *surface = widget()->windowSurface();
+ if (surface) {
+ QRect rect(event->x, event->y, event->width, event->height);
+
+ surface->flush(widget(), rect, QPoint());
+ }
+}
+
+void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *event)
+{
+ if (event->format == 32 && event->type == atom(QXcbAtom::WM_PROTOCOLS)) {
+ if (event->data.data32[0] == atom(QXcbAtom::WM_DELETE_WINDOW)) {
+ QWindowSystemInterface::handleCloseEvent(widget());
+ } else if (event->data.data32[0] == atom(QXcbAtom::_NET_WM_PING)) {
+ xcb_client_message_event_t reply = *event;
+
+ reply.response_type = XCB_CLIENT_MESSAGE;
+ reply.window = m_screen->root();
+
+ xcb_send_event(xcb_connection(), 0, m_screen->root(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&reply);
+ xcb_flush(xcb_connection());
+ } else if (event->data.data32[0] == atom(QXcbAtom::_NET_WM_SYNC_REQUEST)) {
+ if (!m_hasReceivedSyncRequest) {
+ m_hasReceivedSyncRequest = true;
+ printf("Window manager supports _NET_WM_SYNC_REQUEST, syncing resizes\n");
+ }
+ m_syncValue.lo = event->data.data32[2];
+ m_syncValue.hi = event->data.data32[3];
+ }
+ }
+}
+
+void QXcbWindow::handleConfigureNotifyEvent(const xcb_configure_notify_event_t *event)
+{
+ int xpos = geometry().x();
+ int ypos = geometry().y();
+
+ if ((event->width == geometry().width() && event->height == geometry().height()) || event->x != 0 || event->y != 0) {
+ xpos = event->x;
+ ypos = event->y;
+ }
+
+ QRect rect(xpos, ypos, event->width, event->height);
+
+ if (rect == geometry())
+ return;
+
+ QPlatformWindow::setGeometry(rect);
+ QWindowSystemInterface::handleGeometryChange(widget(), rect);
+
+#if XCB_USE_DRI2
+ if (m_context)
+ static_cast<QDri2Context *>(m_context)->resize(rect.size());
+#endif
+}
+
+static Qt::MouseButtons translateMouseButtons(int s)
+{
+ Qt::MouseButtons ret = 0;
+ if (s & XCB_BUTTON_MASK_1)
+ ret |= Qt::LeftButton;
+ if (s & XCB_BUTTON_MASK_2)
+ ret |= Qt::MidButton;
+ if (s & XCB_BUTTON_MASK_3)
+ ret |= Qt::RightButton;
+ return ret;
+}
+
+static Qt::MouseButton translateMouseButton(xcb_button_t s)
+{
+ switch (s) {
+ case 1:
+ return Qt::LeftButton;
+ case 2:
+ return Qt::MidButton;
+ case 3:
+ return Qt::RightButton;
+ default:
+ return Qt::NoButton;
+ }
+}
+
+void QXcbWindow::handleButtonPressEvent(const xcb_button_press_event_t *event)
+{
+ QPoint local(event->event_x, event->event_y);
+ QPoint global(event->root_x, event->root_y);
+
+ Qt::KeyboardModifiers modifiers = Qt::NoModifier;
+
+ if (event->detail >= 4 && event->detail <= 7) {
+ //logic borrowed from qapplication_x11.cpp
+ int delta = 120 * ((event->detail == 4 || event->detail == 6) ? 1 : -1);
+ bool hor = (((event->detail == 4 || event->detail == 5)
+ && (modifiers & Qt::AltModifier))
+ || (event->detail == 6 || event->detail == 7));
+
+ QWindowSystemInterface::handleWheelEvent(widget(), event->time,
+ local, global, delta, hor ? Qt::Horizontal : Qt::Vertical);
+ return;
+ }
+
+ handleMouseEvent(event->detail, event->state, event->time, local, global);
+}
+
+void QXcbWindow::handleButtonReleaseEvent(const xcb_button_release_event_t *event)
+{
+ QPoint local(event->event_x, event->event_y);
+ QPoint global(event->root_x, event->root_y);
+
+ handleMouseEvent(event->detail, event->state, event->time, local, global);
+}
+
+void QXcbWindow::handleMotionNotifyEvent(const xcb_motion_notify_event_t *event)
+{
+ QPoint local(event->event_x, event->event_y);
+ QPoint global(event->root_x, event->root_y);
+
+ handleMouseEvent(event->detail, event->state, event->time, local, global);
+}
+
+void QXcbWindow::handleMouseEvent(xcb_button_t detail, uint16_t state, xcb_timestamp_t time, const QPoint &local, const QPoint &global)
+{
+ Qt::MouseButtons buttons = translateMouseButtons(state);
+ Qt::MouseButton button = translateMouseButton(detail);
+
+ buttons ^= button; // X event uses state *before*, Qt uses state *after*
+
+ QWindowSystemInterface::handleMouseEvent(widget(), time, local, global, buttons);
+}
+
+void QXcbWindow::handleEnterNotifyEvent(const xcb_enter_notify_event_t *)
+{
+ QWindowSystemInterface::handleEnterEvent(widget());
+}
+
+void QXcbWindow::handleLeaveNotifyEvent(const xcb_leave_notify_event_t *)
+{
+ QWindowSystemInterface::handleLeaveEvent(widget());
+}
+
+void QXcbWindow::handleFocusInEvent(const xcb_focus_in_event_t *)
+{
+ QWindowSystemInterface::handleWindowActivated(widget());
+}
+
+void QXcbWindow::handleFocusOutEvent(const xcb_focus_out_event_t *)
+{
+ QWindowSystemInterface::handleWindowActivated(0);
+}
+
+void QXcbWindow::updateSyncRequestCounter()
+{
+ if (m_screen->syncRequestSupported() && (m_syncValue.lo != 0 || m_syncValue.hi != 0)) {
+ Q_XCB_CALL(xcb_sync_set_counter(xcb_connection(), m_syncCounter, m_syncValue));
+ xcb_flush(xcb_connection());
+ connection()->sync();
+
+ m_syncValue.lo = 0;
+ m_syncValue.hi = 0;
+ }
+}
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
new file mode 100644
index 0000000000..e049837253
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBWINDOW_H
+#define QXCBWINDOW_H
+
+#include <QtGui/QPlatformWindow>
+#include <QtGui/QPlatformWindowFormat>
+
+#include <xcb/xcb.h>
+#include <xcb/sync.h>
+
+#include "qxcbobject.h"
+
+class QXcbScreen;
+
+class QXcbWindow : public QXcbObject, public QPlatformWindow
+{
+public:
+ QXcbWindow(QWidget *tlw);
+ ~QXcbWindow();
+
+ void setGeometry(const QRect &rect);
+
+ void setVisible(bool visible);
+ Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+ WId winId() const;
+ void setParent(const QPlatformWindow *window);
+
+ void setWindowTitle(const QString &title);
+ void raise();
+ void lower();
+
+ void requestActivateWindow();
+
+ QPlatformGLContext *glContext() const;
+
+ xcb_window_t window() const { return m_window; }
+
+ void handleExposeEvent(const xcb_expose_event_t *event);
+ void handleClientMessageEvent(const xcb_client_message_event_t *event);
+ void handleConfigureNotifyEvent(const xcb_configure_notify_event_t *event);
+ void handleButtonPressEvent(const xcb_button_press_event_t *event);
+ void handleButtonReleaseEvent(const xcb_button_release_event_t *event);
+ void handleMotionNotifyEvent(const xcb_motion_notify_event_t *event);
+
+ void handleEnterNotifyEvent(const xcb_enter_notify_event_t *event);
+ void handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event);
+ void handleFocusInEvent(const xcb_focus_in_event_t *event);
+ void handleFocusOutEvent(const xcb_focus_out_event_t *event);
+
+ void handleMouseEvent(xcb_button_t detail, uint16_t state, xcb_timestamp_t time, const QPoint &local, const QPoint &global);
+
+ void updateSyncRequestCounter();
+
+private:
+ void setNetWmWindowTypes(Qt::WindowFlags flags);
+
+ QXcbScreen *m_screen;
+
+ xcb_window_t m_window;
+ QPlatformGLContext *m_context;
+
+ xcb_sync_int64_t m_syncValue;
+ xcb_sync_counter_t m_syncCounter;
+
+ bool m_hasReceivedSyncRequest;
+};
+
+#endif
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.cpp b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
new file mode 100644
index 0000000000..718f09383c
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.cpp
@@ -0,0 +1,258 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxcbwindowsurface.h"
+
+#include "qxcbconnection.h"
+#include "qxcbscreen.h"
+#include "qxcbwindow.h"
+
+#include <xcb/shm.h>
+#include <xcb/xcb_image.h>
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <stdio.h>
+
+#include <qdebug.h>
+
+class QXcbShmImage : public QXcbObject
+{
+public:
+ QXcbShmImage(QXcbScreen *connection, const QSize &size);
+ ~QXcbShmImage() { destroy(); }
+
+ QImage *image() { return &m_qimage; }
+
+ void put(xcb_window_t window, const QPoint &dst, const QRect &source);
+ void preparePaint(const QRegion &region);
+
+private:
+ void destroy();
+
+ xcb_shm_segment_info_t m_shm_info;
+
+ xcb_image_t *m_xcb_image;
+
+ QImage m_qimage;
+
+ xcb_gcontext_t m_gc;
+ xcb_window_t m_gc_window;
+
+ QRegion m_dirty;
+};
+
+QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size)
+ : QXcbObject(screen->connection())
+ , m_gc(0)
+ , m_gc_window(0)
+{
+ Q_XCB_NOOP(connection());
+ m_xcb_image = xcb_image_create_native(xcb_connection(),
+ size.width(),
+ size.height(),
+ XCB_IMAGE_FORMAT_Z_PIXMAP,
+ screen->depth(),
+ 0,
+ ~0,
+ 0);
+
+ m_shm_info.shmid = shmget (IPC_PRIVATE,
+ m_xcb_image->stride * m_xcb_image->height, IPC_CREAT|0777);
+
+ m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat (m_shm_info.shmid, 0, 0);
+ m_shm_info.shmseg = xcb_generate_id(xcb_connection());
+
+ xcb_generic_error_t *error = xcb_request_check(xcb_connection(), xcb_shm_attach_checked(xcb_connection(), m_shm_info.shmseg, m_shm_info.shmid, false));
+ if (error) {
+ qWarning() << "QXcbWindowSurface: Unable to attach to shared memory segment";
+ free(error);
+ }
+
+ if (shmctl(m_shm_info.shmid, IPC_RMID, 0) == -1)
+ qWarning() << "QXcbWindowSurface: Error while marking the shared memory segment to be destroyed";
+
+ m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, screen->format());
+}
+
+void QXcbShmImage::destroy()
+{
+ Q_XCB_CALL(xcb_shm_detach(xcb_connection(), m_shm_info.shmseg));
+ xcb_image_destroy(m_xcb_image);
+ shmdt(m_shm_info.shmaddr);
+ shmctl(m_shm_info.shmid, IPC_RMID, 0);
+ if (m_gc)
+ Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
+}
+
+void QXcbShmImage::put(xcb_window_t window, const QPoint &target, const QRect &source)
+{
+ Q_XCB_NOOP(connection());
+ if (m_gc_window != window) {
+ if (m_gc)
+ Q_XCB_CALL(xcb_free_gc(xcb_connection(), m_gc));
+
+ m_gc = xcb_generate_id(xcb_connection());
+ Q_XCB_CALL(xcb_create_gc(xcb_connection(), m_gc, window, 0, 0));
+
+ m_gc_window = window;
+ }
+
+ Q_XCB_NOOP(connection());
+ xcb_image_shm_put(xcb_connection(),
+ window,
+ m_gc,
+ m_xcb_image,
+ m_shm_info,
+ source.x(),
+ source.y(),
+ target.x(),
+ target.y(),
+ source.width(),
+ source.height(),
+ false);
+ Q_XCB_NOOP(connection());
+
+ m_dirty = m_dirty | source;
+
+ xcb_flush(xcb_connection());
+ Q_XCB_NOOP(connection());
+}
+
+void QXcbShmImage::preparePaint(const QRegion &region)
+{
+ // to prevent X from reading from the image region while we're writing to it
+ if (m_dirty.intersects(region)) {
+ connection()->sync();
+ m_dirty = QRegion();
+ }
+}
+
+QXcbWindowSurface::QXcbWindowSurface(QWidget *widget, bool setDefaultSurface)
+ : QWindowSurface(widget, setDefaultSurface)
+ , m_image(0)
+ , m_syncingResize(false)
+{
+ QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(widget));
+ setConnection(screen->connection());
+}
+
+QXcbWindowSurface::~QXcbWindowSurface()
+{
+ delete m_image;
+}
+
+QPaintDevice *QXcbWindowSurface::paintDevice()
+{
+ return m_image->image();
+}
+
+void QXcbWindowSurface::beginPaint(const QRegion &region)
+{
+ m_image->preparePaint(region);
+}
+
+void QXcbWindowSurface::endPaint(const QRegion &)
+{
+}
+
+void QXcbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ QRect bounds = region.boundingRect();
+
+ if (size().isEmpty() || !geometry().contains(bounds))
+ return;
+
+ Q_XCB_NOOP(connection());
+
+ QXcbWindow *window = static_cast<QXcbWindow *>(widget->window()->platformWindow());
+
+ extern QWidgetData* qt_widget_data(QWidget *);
+ QPoint widgetOffset = qt_qwidget_data(widget)->wrect.topLeft();
+
+ QVector<QRect> rects = region.rects();
+ for (int i = 0; i < rects.size(); ++i)
+ m_image->put(window->window(), rects.at(i).topLeft() - widgetOffset, rects.at(i).translated(offset));
+
+ Q_XCB_NOOP(connection());
+
+ if (m_syncingResize) {
+ xcb_flush(xcb_connection());
+ connection()->sync();
+ m_syncingResize = false;
+ window->updateSyncRequestCounter();
+ }
+}
+
+void QXcbWindowSurface::resize(const QSize &size)
+{
+ if (size == QWindowSurface::size())
+ return;
+
+ Q_XCB_NOOP(connection());
+ QWindowSurface::resize(size);
+
+ QXcbScreen *screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(window()));
+
+ delete m_image;
+ m_image = new QXcbShmImage(screen, size);
+ Q_XCB_NOOP(connection());
+
+ m_syncingResize = true;
+}
+
+extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
+
+bool QXcbWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ if (m_image->image()->isNull())
+ return false;
+
+ m_image->preparePaint(area);
+
+ const QVector<QRect> rects = area.rects();
+ for (int i = 0; i < rects.size(); ++i)
+ qt_scrollRectInImage(*m_image->image(), rects.at(i), QPoint(dx, dy));
+
+ return true;
+}
+
diff --git a/src/plugins/platforms/xcb/qxcbwindowsurface.h b/src/plugins/platforms/xcb/qxcbwindowsurface.h
new file mode 100644
index 0000000000..23d32ef445
--- /dev/null
+++ b/src/plugins/platforms/xcb/qxcbwindowsurface.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBWINDOWSURFACE_H
+#define QXCBWINDOWSURFACE_H
+
+#include <private/qwindowsurface_p.h>
+
+#include <xcb/xcb.h>
+
+#include "qxcbobject.h"
+
+class QXcbShmImage;
+
+class QXcbWindowSurface : public QXcbObject, public QWindowSurface
+{
+public:
+ QXcbWindowSurface(QWidget *widget, bool setDefaultSurface = true);
+ ~QXcbWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ void resize(const QSize &size);
+ bool scroll(const QRegion &area, int dx, int dy);
+
+ void beginPaint(const QRegion &);
+ void endPaint(const QRegion &);
+
+private:
+ QXcbShmImage *m_image;
+ bool m_syncingResize;
+};
+
+#endif
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
new file mode 100644
index 0000000000..101bdcd3c1
--- /dev/null
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -0,0 +1,70 @@
+TARGET = xcb
+
+include(../../qpluginbase.pri)
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+SOURCES = \
+ qxcbconnection.cpp \
+ qxcbintegration.cpp \
+ qxcbkeyboard.cpp \
+ qxcbscreen.cpp \
+ qxcbwindow.cpp \
+ qxcbwindowsurface.cpp \
+ main.cpp \
+ qxcbnativeinterface.cpp
+
+HEADERS = \
+ qxcbconnection.h \
+ qxcbintegration.h \
+ qxcbkeyboard.h \
+ qxcbobject.h \
+ qxcbscreen.h \
+ qxcbwindow.h \
+ qxcbwindowsurface.h \
+ qxcbnativeinterface.h
+
+contains(QT_CONFIG, opengl) {
+ QT += opengl
+
+# DEFINES += XCB_USE_DRI2
+ contains(DEFINES, XCB_USE_DRI2) {
+ LIBS += -lxcb-dri2 -lxcb-xfixes -lEGL
+
+ CONFIG += link_pkgconfig
+ PKGCONFIG += libdrm
+
+ HEADERS += qdri2context.h
+ SOURCES += qdri2context.cpp
+
+ } else {
+ DEFINES += XCB_USE_XLIB
+ LIBS += -lX11 -lX11-xcb
+
+ contains(QT_CONFIG, opengles2) {
+ DEFINES += XCB_USE_EGL
+ HEADERS += \
+ ../eglconvenience/qeglplatformcontext.h \
+ ../eglconvenience/qeglconvenience.h \
+ ../eglconvenience/qxlibeglintegration.h
+
+ SOURCES += \
+ ../eglconvenience/qeglplatformcontext.cpp \
+ ../eglconvenience/qeglconvenience.cpp \
+ ../eglconvenience/qxlibeglintegration.cpp
+
+ LIBS += -lEGL
+ } else {
+ DEFINES += XCB_USE_GLX
+ include (../glxconvenience/glxconvenience.pri)
+ HEADERS += qglxintegration.h
+ SOURCES += qglxintegration.cpp
+ }
+ }
+}
+
+LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync
+
+include (../fontdatabases/genericunix/genericunix.pri)
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/platforms/xlib/main.cpp b/src/plugins/platforms/xlib/main.cpp
new file mode 100644
index 0000000000..f0bf6ff1c9
--- /dev/null
+++ b/src/plugins/platforms/xlib/main.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/QPlatformIntegrationPlugin>
+#include "qxlibintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QXlibIntegrationPlugin : public QPlatformIntegrationPlugin
+{
+public:
+ QStringList keys() const;
+ QPlatformIntegration *create(const QString&, const QStringList&);
+};
+
+QStringList QXlibIntegrationPlugin::keys() const
+{
+ QStringList list;
+ list << "Xlib";
+#ifndef QT_NO_OPENGL
+ list << "XlibGL";
+#endif
+ return list;
+}
+
+QPlatformIntegration* QXlibIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+ if (system.toLower() == "xlib")
+ return new QXlibIntegration;
+#ifndef QT_NO_OPENGL
+ if (system.toLower() == "xlibgl")
+ return new QXlibIntegration(true);
+#endif
+
+ return 0;
+}
+
+Q_EXPORT_PLUGIN2(xlib, QXlibIntegrationPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qglxintegration.cpp b/src/plugins/platforms/xlib/qglxintegration.cpp
new file mode 100644
index 0000000000..7a0f36dc99
--- /dev/null
+++ b/src/plugins/platforms/xlib/qglxintegration.cpp
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QLibrary>
+#include <QGLFormat>
+
+#include "qxlibwindow.h"
+#include "qxlibscreen.h"
+#include "qxlibdisplay.h"
+
+#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <GL/glx.h>
+#include "qglxconvenience.h"
+
+#include "qglxintegration.h"
+
+#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4)
+#include <dlfcn.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+QGLXContext::QGLXContext(Window window, QXlibScreen *screen, const QPlatformWindowFormat &format)
+ : QPlatformGLContext()
+ , m_screen(screen)
+ , m_drawable((Drawable)window)
+ , m_context(0)
+{
+
+ const QPlatformGLContext *sharePlatformContext;
+ sharePlatformContext = format.sharedGLContext();
+ GLXContext shareGlxContext = 0;
+ if (sharePlatformContext)
+ shareGlxContext = static_cast<const QGLXContext*>(sharePlatformContext)->glxContext();
+
+ GLXFBConfig config = qglx_findConfig(screen->display()->nativeDisplay(),screen->xScreenNumber(),format);
+ m_context = glXCreateNewContext(screen->display()->nativeDisplay(),config,GLX_RGBA_TYPE,shareGlxContext,TRUE);
+ m_windowFormat = qglx_platformWindowFromGLXFBConfig(screen->display()->nativeDisplay(),config,m_context);
+
+#ifdef MYX11_DEBUG
+ qDebug() << "QGLXGLContext::create context" << m_context;
+#endif
+}
+
+QGLXContext::QGLXContext(QXlibScreen *screen, Drawable drawable, GLXContext context)
+ : QPlatformGLContext(), m_screen(screen), m_drawable(drawable), m_context(context)
+{
+
+}
+
+QGLXContext::~QGLXContext()
+{
+ if (m_context) {
+ qDebug("Destroying GLX context 0x%p", m_context);
+ glXDestroyContext(m_screen->display()->nativeDisplay(), m_context);
+ }
+}
+
+void QGLXContext::makeCurrent()
+{
+ QPlatformGLContext::makeCurrent();
+#ifdef MYX11_DEBUG
+ qDebug("QGLXGLContext::makeCurrent(window=0x%x, ctx=0x%x)", m_drawable, m_context);
+#endif
+ glXMakeCurrent(m_screen->display()->nativeDisplay(), m_drawable, m_context);
+}
+
+void QGLXContext::doneCurrent()
+{
+ QPlatformGLContext::doneCurrent();
+ glXMakeCurrent(m_screen->display()->nativeDisplay(), 0, 0);
+}
+
+void QGLXContext::swapBuffers()
+{
+ glXSwapBuffers(m_screen->display()->nativeDisplay(), m_drawable);
+}
+
+void* QGLXContext::getProcAddress(const QString& procName)
+{
+ typedef void *(*qt_glXGetProcAddressARB)(const GLubyte *);
+ static qt_glXGetProcAddressARB glXGetProcAddressARB = 0;
+ static bool resolved = false;
+
+ if (resolved && !glXGetProcAddressARB)
+ return 0;
+ if (!glXGetProcAddressARB) {
+ QList<QByteArray> glxExt = QByteArray(glXGetClientString(m_screen->display()->nativeDisplay(), GLX_EXTENSIONS)).split(' ');
+ if (glxExt.contains("GLX_ARB_get_proc_address")) {
+#if defined(Q_OS_LINUX) || defined(Q_OS_BSD4)
+ void *handle = dlopen(NULL, RTLD_LAZY);
+ if (handle) {
+ glXGetProcAddressARB = (qt_glXGetProcAddressARB) dlsym(handle, "glXGetProcAddressARB");
+ dlclose(handle);
+ }
+ if (!glXGetProcAddressARB)
+#endif
+ {
+ extern const QString qt_gl_library_name();
+// QLibrary lib(qt_gl_library_name());
+ QLibrary lib(QLatin1String("GL"));
+ glXGetProcAddressARB = (qt_glXGetProcAddressARB) lib.resolve("glXGetProcAddressARB");
+ }
+ }
+ resolved = true;
+ }
+ if (!glXGetProcAddressARB)
+ return 0;
+ return glXGetProcAddressARB(reinterpret_cast<const GLubyte *>(procName.toLatin1().data()));
+}
+
+QPlatformWindowFormat QGLXContext::platformWindowFormat() const
+{
+ return m_windowFormat;
+}
+
+QT_END_NAMESPACE
+
+#endif //!defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
diff --git a/src/plugins/platforms/xlib/qglxintegration.h b/src/plugins/platforms/xlib/qglxintegration.h
new file mode 100644
index 0000000000..57c716bef0
--- /dev/null
+++ b/src/plugins/platforms/xlib/qglxintegration.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q_GLX_CONTEXT_H
+#define Q_GLX_CONTEXT_H
+
+#include "qxlibwindow.h"
+
+#include <QtGui/QPlatformGLContext>
+#include <QtGui/QPlatformWindowFormat>
+
+#include <QtCore/QMutex>
+
+#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
+#include <GL/glx.h>
+
+QT_BEGIN_NAMESPACE
+
+class QGLXContext : public QPlatformGLContext
+{
+public:
+ QGLXContext(Window window, QXlibScreen *xd, const QPlatformWindowFormat &format);
+ ~QGLXContext();
+
+ virtual void makeCurrent();
+ virtual void doneCurrent();
+ virtual void swapBuffers();
+ virtual void* getProcAddress(const QString& procName);
+
+ GLXContext glxContext() const {return m_context;}
+
+ QPlatformWindowFormat platformWindowFormat() const;
+
+private:
+ QXlibScreen *m_screen;
+ Drawable m_drawable;
+ GLXContext m_context;
+ QPlatformWindowFormat m_windowFormat;
+
+ QGLXContext (QXlibScreen *screen, Drawable drawable, GLXContext context);
+};
+
+QT_END_NAMESPACE
+
+#endif //!defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2)
+
+#endif
diff --git a/src/plugins/platforms/xlib/qxlibclipboard.cpp b/src/plugins/platforms/xlib/qxlibclipboard.cpp
new file mode 100644
index 0000000000..dfaf552121
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibclipboard.cpp
@@ -0,0 +1,677 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibclipboard.h"
+
+#include "qxlibscreen.h"
+#include "qxlibmime.h"
+#include "qxlibdisplay.h"
+
+#include <private/qapplication_p.h>
+
+#include <QtCore/QDebug>
+
+class QXlibClipboardMime : public QXlibMime
+{
+ Q_OBJECT
+public:
+ QXlibClipboardMime(QClipboard::Mode mode, QXlibClipboard *clipboard)
+ : QXlibMime()
+ , m_clipboard(clipboard)
+ {
+ switch (mode) {
+ case QClipboard::Selection:
+ modeAtom = XA_PRIMARY;
+ break;
+
+ case QClipboard::Clipboard:
+ modeAtom = QXlibStatic::atom(QXlibStatic::CLIPBOARD);
+ break;
+
+ default:
+ qWarning("QTestLiteMime: Internal error: Unsupported clipboard mode");
+ break;
+ }
+ }
+
+protected:
+ QStringList formats_sys() const
+ {
+ if (empty())
+ return QStringList();
+
+ if (!formatList.count()) {
+ QXlibClipboardMime *that = const_cast<QXlibClipboardMime *>(this);
+ // get the list of targets from the current clipboard owner - we do this
+ // once so that multiple calls to this function don't require multiple
+ // server round trips...
+ that->format_atoms = m_clipboard->getDataInFormat(modeAtom,QXlibStatic::atom(QXlibStatic::TARGETS));
+
+ if (format_atoms.size() > 0) {
+ Atom *targets = (Atom *) format_atoms.data();
+ int size = format_atoms.size() / sizeof(Atom);
+
+ for (int i = 0; i < size; ++i) {
+ if (targets[i] == 0)
+ continue;
+
+ QStringList formatsForAtom = mimeFormatsForAtom(m_clipboard->screen()->display()->nativeDisplay(),targets[i]);
+ for (int j = 0; j < formatsForAtom.size(); ++j) {
+ if (!formatList.contains(formatsForAtom.at(j)))
+ that->formatList.append(formatsForAtom.at(j));
+ }
+ }
+ }
+ }
+
+ return formatList;
+ }
+
+ bool hasFormat_sys(const QString &format) const
+ {
+ QStringList list = formats();
+ return list.contains(format);
+ }
+
+ QVariant retrieveData_sys(const QString &fmt, QVariant::Type requestedType) const
+ {
+ if (fmt.isEmpty() || empty())
+ return QByteArray();
+
+ (void)formats(); // trigger update of format list
+
+ QList<Atom> atoms;
+ Atom *targets = (Atom *) format_atoms.data();
+ int size = format_atoms.size() / sizeof(Atom);
+ for (int i = 0; i < size; ++i)
+ atoms.append(targets[i]);
+
+ QByteArray encoding;
+ Atom fmtatom = mimeAtomForFormat(m_clipboard->screen()->display()->nativeDisplay(),fmt, requestedType, atoms, &encoding);
+
+ if (fmtatom == 0)
+ return QVariant();
+
+ return mimeConvertToFormat(m_clipboard->screen()->display()->nativeDisplay(),fmtatom, m_clipboard->getDataInFormat(modeAtom,fmtatom), fmt, requestedType, encoding);
+ }
+private:
+ bool empty() const
+ {
+ Window win = XGetSelectionOwner(m_clipboard->screen()->display()->nativeDisplay(), modeAtom);
+
+ return win == XNone;
+ }
+
+
+ Atom modeAtom;
+ QXlibClipboard *m_clipboard;
+ QStringList formatList;
+ QByteArray format_atoms;
+};
+
+const int QXlibClipboard::clipboard_timeout = 5000;
+
+QXlibClipboard::QXlibClipboard(QXlibScreen *screen)
+ : QPlatformClipboard()
+ , m_screen(screen)
+ , m_xClipboard(0)
+ , m_clientClipboard(0)
+ , m_xSelection(0)
+ , m_clientSelection(0)
+ , m_requestor(XNone)
+ , m_owner(XNone)
+{
+}
+
+const QMimeData * QXlibClipboard::mimeData(QClipboard::Mode mode) const
+{
+ if (mode == QClipboard::Clipboard) {
+ if (!m_xClipboard) {
+ QXlibClipboard *that = const_cast<QXlibClipboard *>(this);
+ that->m_xClipboard = new QXlibClipboardMime(mode,that);
+ }
+ Window clipboardOwner = XGetSelectionOwner(screen()->display()->nativeDisplay(),QXlibStatic::atom(QXlibStatic::CLIPBOARD));
+ if (clipboardOwner == owner()) {
+ return m_clientClipboard;
+ } else {
+ return m_xClipboard;
+ }
+ } else if (mode == QClipboard::Selection) {
+ if (!m_xSelection) {
+ QXlibClipboard *that = const_cast<QXlibClipboard *>(this);
+ that->m_xSelection = new QXlibClipboardMime(mode,that);
+ }
+ Window clipboardOwner = XGetSelectionOwner(screen()->display()->nativeDisplay(),XA_PRIMARY);
+ if (clipboardOwner == owner()) {
+ return m_clientSelection;
+ } else {
+ return m_xSelection;
+ }
+ }
+ return 0;
+}
+
+void QXlibClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode)
+{
+ Atom modeAtom;
+ QMimeData **d;
+ switch (mode) {
+ case QClipboard::Selection:
+ modeAtom = XA_PRIMARY;
+ d = &m_clientSelection;
+ break;
+
+ case QClipboard::Clipboard:
+ modeAtom = QXlibStatic::atom(QXlibStatic::CLIPBOARD);
+ d = &m_clientClipboard;
+ break;
+
+ default:
+ qWarning("QClipboard::setMimeData: unsupported mode '%d'", mode);
+ return;
+ }
+
+ Window newOwner;
+
+ if (! data) { // no data, clear clipboard contents
+ newOwner = XNone;
+ } else {
+ newOwner = owner();
+
+ *d = data;
+ }
+
+ XSetSelectionOwner(m_screen->display()->nativeDisplay(), modeAtom, newOwner, CurrentTime);
+
+ if (XGetSelectionOwner(m_screen->display()->nativeDisplay(), modeAtom) != newOwner) {
+ qWarning("QClipboard::setData: Cannot set X11 selection owner");
+ }
+
+}
+
+bool QXlibClipboard::supportsMode(QClipboard::Mode mode) const
+{
+ if (mode == QClipboard::Clipboard || mode == QClipboard::Selection)
+ return true;
+ return false;
+}
+
+
+QXlibScreen * QXlibClipboard::screen() const
+{
+ return m_screen;
+}
+
+Window QXlibClipboard::requestor() const
+{
+ if (!m_requestor) {
+ int x = 0, y = 0, w = 3, h = 3;
+ QXlibClipboard *that = const_cast<QXlibClipboard *>(this);
+ Window window = XCreateSimpleWindow(m_screen->display()->nativeDisplay(), m_screen->rootWindow(),
+ x, y, w, h, 0 /*border_width*/,
+ m_screen->blackPixel(), m_screen->whitePixel());
+ that->setRequestor(window);
+ }
+ return m_requestor;
+}
+
+void QXlibClipboard::setRequestor(Window window)
+{
+ if (m_requestor != XNone) {
+ XDestroyWindow(m_screen->display()->nativeDisplay(),m_requestor);
+ }
+ m_requestor = window;
+}
+
+Window QXlibClipboard::owner() const
+{
+ if (!m_owner) {
+ int x = 0, y = 0, w = 3, h = 3;
+ QXlibClipboard *that = const_cast<QXlibClipboard *>(this);
+ Window window = XCreateSimpleWindow(m_screen->display()->nativeDisplay(), m_screen->rootWindow(),
+ x, y, w, h, 0 /*border_width*/,
+ m_screen->blackPixel(), m_screen->whitePixel());
+ that->setOwner(window);
+ }
+ return m_owner;
+}
+
+void QXlibClipboard::setOwner(Window window)
+{
+ if (m_owner != XNone){
+ XDestroyWindow(m_screen->display()->nativeDisplay(),m_owner);
+ }
+ m_owner = window;
+}
+
+Atom QXlibClipboard::sendTargetsSelection(QMimeData *d, Window window, Atom property)
+{
+ QVector<Atom> types;
+ QStringList formats = QInternalMimeData::formatsHelper(d);
+ for (int i = 0; i < formats.size(); ++i) {
+ QList<Atom> atoms = QXlibMime::mimeAtomsForFormat(screen()->display()->nativeDisplay(),formats.at(i));
+ for (int j = 0; j < atoms.size(); ++j) {
+ if (!types.contains(atoms.at(j)))
+ types.append(atoms.at(j));
+ }
+ }
+ types.append(QXlibStatic::atom(QXlibStatic::TARGETS));
+ types.append(QXlibStatic::atom(QXlibStatic::MULTIPLE));
+ types.append(QXlibStatic::atom(QXlibStatic::TIMESTAMP));
+ types.append(QXlibStatic::atom(QXlibStatic::SAVE_TARGETS));
+
+ XChangeProperty(screen()->display()->nativeDisplay(), window, property, XA_ATOM, 32,
+ PropModeReplace, (uchar *) types.data(), types.size());
+ return property;
+}
+
+Atom QXlibClipboard::sendSelection(QMimeData *d, Atom target, Window window, Atom property)
+{
+ Atom atomFormat = target;
+ int dataFormat = 0;
+ QByteArray data;
+
+ QString fmt = QXlibMime::mimeAtomToString(screen()->display()->nativeDisplay(), target);
+ if (fmt.isEmpty()) { // Not a MIME type we have
+ qDebug() << "QClipboard: send_selection(): converting to type '%s' is not supported" << fmt.data();
+ return XNone;
+ }
+ qDebug() << "QClipboard: send_selection(): converting to type '%s'" << fmt.data();
+
+ if (QXlibMime::mimeDataForAtom(screen()->display()->nativeDisplay(),target, d, &data, &atomFormat, &dataFormat)) {
+
+ // don't allow INCR transfers when using MULTIPLE or to
+ // Motif clients (since Motif doesn't support INCR)
+ static Atom motif_clip_temporary = QXlibStatic::atom(QXlibStatic::CLIP_TEMPORARY);
+ bool allow_incr = property != motif_clip_temporary;
+
+ // X_ChangeProperty protocol request is 24 bytes
+ const int increment = (XMaxRequestSize(screen()->display()->nativeDisplay()) * 4) - 24;
+ if (data.size() > increment && allow_incr) {
+ long bytes = data.size();
+ XChangeProperty(screen()->display()->nativeDisplay(), window, property,
+ QXlibStatic::atom(QXlibStatic::INCR), 32, PropModeReplace, (uchar *) &bytes, 1);
+
+// (void)new QClipboardINCRTransaction(window, property, atomFormat, dataFormat, data, increment);
+ qDebug() << "not implemented INCRT just YET!";
+ return property;
+ }
+
+ // make sure we can perform the XChangeProperty in a single request
+ if (data.size() > increment)
+ return XNone; // ### perhaps use several XChangeProperty calls w/ PropModeAppend?
+ int dataSize = data.size() / (dataFormat / 8);
+ // use a single request to transfer data
+ XChangeProperty(screen()->display()->nativeDisplay(), window, property, atomFormat,
+ dataFormat, PropModeReplace, (uchar *) data.data(),
+ dataSize);
+ }
+ return property;
+}
+
+void QXlibClipboard::handleSelectionRequest(XEvent *xevent)
+{
+ XSelectionRequestEvent *req = &xevent->xselectionrequest;
+
+ if (requestor() && req->requestor == requestor()) {
+ qDebug() << "This should be caught before";
+ return;
+ }
+
+ XEvent event;
+ event.xselection.type = SelectionNotify;
+ event.xselection.display = req->display;
+ event.xselection.requestor = req->requestor;
+ event.xselection.selection = req->selection;
+ event.xselection.target = req->target;
+ event.xselection.property = XNone;
+ event.xselection.time = req->time;
+
+ QMimeData *d;
+ if (req->selection == XA_PRIMARY) {
+ d = m_clientSelection;
+ } else if (req->selection == QXlibStatic::atom(QXlibStatic::CLIPBOARD)) {
+ d = m_clientClipboard;
+ } else {
+ qWarning("QClipboard: Unknown selection '%lx'", req->selection);
+ XSendEvent(screen()->display()->nativeDisplay(), req->requestor, False, NoEventMask, &event);
+ return;
+ }
+
+ if (!d) {
+ qWarning("QClipboard: Cannot transfer data, no data available");
+ XSendEvent(screen()->display()->nativeDisplay(), req->requestor, False, NoEventMask, &event);
+ return;
+ }
+
+ Atom xa_targets = QXlibStatic::atom(QXlibStatic::TARGETS);
+ Atom xa_multiple = QXlibStatic::atom(QXlibStatic::MULTIPLE);
+ Atom xa_timestamp = QXlibStatic::atom(QXlibStatic::TIMESTAMP);
+
+ struct AtomPair { Atom target; Atom property; } *multi = 0;
+ Atom multi_type = XNone;
+ int multi_format = 0;
+ int nmulti = 0;
+ int imulti = -1;
+ bool multi_writeback = false;
+
+ if (req->target == xa_multiple) {
+ QByteArray multi_data;
+ if (req->property == XNone
+ || !clipboardReadProperty(req->requestor, req->property, false, &multi_data,
+ 0, &multi_type, &multi_format)
+ || multi_format != 32) {
+ // MULTIPLE property not formatted correctly
+ XSendEvent(screen()->display()->nativeDisplay(), req->requestor, False, NoEventMask, &event);
+ return;
+ }
+ nmulti = multi_data.size()/sizeof(*multi);
+ multi = new AtomPair[nmulti];
+ memcpy(multi,multi_data.data(),multi_data.size());
+ imulti = 0;
+ }
+
+ for (; imulti < nmulti; ++imulti) {
+ Atom target;
+ Atom property;
+
+ if (multi) {
+ target = multi[imulti].target;
+ property = multi[imulti].property;
+ } else {
+ target = req->target;
+ property = req->property;
+ if (property == XNone) // obsolete client
+ property = target;
+ }
+
+ Atom ret = XNone;
+ if (target == XNone || property == XNone) {
+ ;
+ } else if (target == xa_timestamp) {
+// if (d->timestamp != CurrentTime) {
+// XChangeProperty(screen()->display()->nativeDisplay(), req->requestor, property, XA_INTEGER, 32,
+// PropModeReplace, CurrentTime, 1);
+// ret = property;
+// } else {
+// qWarning("QClipboard: Invalid data timestamp");
+// }
+ } else if (target == xa_targets) {
+ ret = sendTargetsSelection(d, req->requestor, property);
+ } else {
+ ret = sendSelection(d, target, req->requestor, property);
+ }
+
+ if (nmulti > 0) {
+ if (ret == XNone) {
+ multi[imulti].property = XNone;
+ multi_writeback = true;
+ }
+ } else {
+ event.xselection.property = ret;
+ break;
+ }
+ }
+
+ if (nmulti > 0) {
+ if (multi_writeback) {
+ // according to ICCCM 2.6.2 says to put None back
+ // into the original property on the requestor window
+ XChangeProperty(screen()->display()->nativeDisplay(), req->requestor, req->property, multi_type, 32,
+ PropModeReplace, (uchar *) multi, nmulti * 2);
+ }
+
+ delete [] multi;
+ event.xselection.property = req->property;
+ }
+
+ // send selection notify to requestor
+ XSendEvent(screen()->display()->nativeDisplay(), req->requestor, False, NoEventMask, &event);
+}
+
+static inline int maxSelectionIncr(Display *dpy)
+{ return XMaxRequestSize(dpy) > 65536 ? 65536*4 : XMaxRequestSize(dpy)*4 - 100; }
+
+bool QXlibClipboard::clipboardReadProperty(Window win, Atom property, bool deleteProperty, QByteArray *buffer, int *size, Atom *type, int *format) const
+{
+ int maxsize = maxSelectionIncr(screen()->display()->nativeDisplay());
+ ulong bytes_left; // bytes_after
+ ulong length; // nitems
+ uchar *data;
+ Atom dummy_type;
+ int dummy_format;
+ int r;
+
+ if (!type) // allow null args
+ type = &dummy_type;
+ if (!format)
+ format = &dummy_format;
+
+ // Don't read anything, just get the size of the property data
+ r = XGetWindowProperty(screen()->display()->nativeDisplay(), win, property, 0, 0, False,
+ AnyPropertyType, type, format,
+ &length, &bytes_left, &data);
+ if (r != Success || (type && *type == XNone)) {
+ buffer->resize(0);
+ return false;
+ }
+ XFree((char*)data);
+
+ int offset = 0, buffer_offset = 0, format_inc = 1, proplen = bytes_left;
+
+ switch (*format) {
+ case 8:
+ default:
+ format_inc = sizeof(char) / 1;
+ break;
+
+ case 16:
+ format_inc = sizeof(short) / 2;
+ proplen *= sizeof(short) / 2;
+ break;
+
+ case 32:
+ format_inc = sizeof(long) / 4;
+ proplen *= sizeof(long) / 4;
+ break;
+ }
+
+ int newSize = proplen;
+ buffer->resize(newSize);
+
+ bool ok = (buffer->size() == newSize);
+
+ if (ok && newSize) {
+ // could allocate buffer
+
+ while (bytes_left) {
+ // more to read...
+
+ r = XGetWindowProperty(screen()->display()->nativeDisplay(), win, property, offset, maxsize/4,
+ False, AnyPropertyType, type, format,
+ &length, &bytes_left, &data);
+ if (r != Success || (type && *type == XNone))
+ break;
+
+ offset += length / (32 / *format);
+ length *= format_inc * (*format) / 8;
+
+ // Here we check if we get a buffer overflow and tries to
+ // recover -- this shouldn't normally happen, but it doesn't
+ // hurt to be defensive
+ if ((int)(buffer_offset + length) > buffer->size()) {
+ length = buffer->size() - buffer_offset;
+
+ // escape loop
+ bytes_left = 0;
+ }
+
+ memcpy(buffer->data() + buffer_offset, data, length);
+ buffer_offset += length;
+
+ XFree((char*)data);
+ }
+
+ if (*format == 8 && *type == QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT)) {
+ // convert COMPOUND_TEXT to a multibyte string
+ XTextProperty textprop;
+ textprop.encoding = *type;
+ textprop.format = *format;
+ textprop.nitems = buffer_offset;
+ textprop.value = (unsigned char *) buffer->data();
+
+ char **list_ret = 0;
+ int count;
+ if (XmbTextPropertyToTextList(screen()->display()->nativeDisplay(), &textprop, &list_ret,
+ &count) == Success && count && list_ret) {
+ offset = buffer_offset = strlen(list_ret[0]);
+ buffer->resize(offset);
+ memcpy(buffer->data(), list_ret[0], offset);
+ }
+ if (list_ret) XFreeStringList(list_ret);
+ }
+ }
+
+ // correct size, not 0-term.
+ if (size)
+ *size = buffer_offset;
+
+ if (deleteProperty)
+ XDeleteProperty(screen()->display()->nativeDisplay(), win, property);
+
+ screen()->display()->flush();
+
+ return ok;
+}
+
+QByteArray QXlibClipboard::clipboardReadIncrementalProperty(Window win, Atom property, int nbytes, bool nullterm)
+{
+ XEvent event;
+
+ QByteArray buf;
+ QByteArray tmp_buf;
+ bool alloc_error = false;
+ int length;
+ int offset = 0;
+
+ if (nbytes > 0) {
+ // Reserve buffer + zero-terminator (for text data)
+ // We want to complete the INCR transfer even if we cannot
+ // allocate more memory
+ buf.resize(nbytes+1);
+ alloc_error = buf.size() != nbytes+1;
+ }
+
+ for (;;) {
+ screen()->display()->flush();
+ if (!screen()->waitForClipboardEvent(win,PropertyNotify,&event,clipboard_timeout))
+ break;
+ if (event.xproperty.atom != property ||
+ event.xproperty.state != PropertyNewValue)
+ continue;
+ if (clipboardReadProperty(win, property, true, &tmp_buf, &length, 0, 0)) {
+ if (length == 0) { // no more data, we're done
+ if (nullterm) {
+ buf.resize(offset+1);
+ buf[offset] = '\0';
+ } else {
+ buf.resize(offset);
+ }
+ return buf;
+ } else if (!alloc_error) {
+ if (offset+length > (int)buf.size()) {
+ buf.resize(offset+length+65535);
+ if (buf.size() != offset+length+65535) {
+ alloc_error = true;
+ length = buf.size() - offset;
+ }
+ }
+ memcpy(buf.data()+offset, tmp_buf.constData(), length);
+ tmp_buf.resize(0);
+ offset += length;
+ }
+ } else {
+ break;
+ }
+ }
+
+ // timed out ... create a new requestor window, otherwise the requestor
+ // could consider next request to be still part of this timed out request
+ setRequestor(0);
+
+ return QByteArray();
+}
+
+QByteArray QXlibClipboard::getDataInFormat(Atom modeAtom, Atom fmtatom)
+{
+ QByteArray buf;
+
+ Window win = requestor();
+
+ XSelectInput(screen()->display()->nativeDisplay(), win, NoEventMask); // don't listen for any events
+
+ XDeleteProperty(screen()->display()->nativeDisplay(), win, QXlibStatic::atom(QXlibStatic::_QT_SELECTION));
+ XConvertSelection(screen()->display()->nativeDisplay(), modeAtom, fmtatom, QXlibStatic::atom(QXlibStatic::_QT_SELECTION), win, CurrentTime);
+ screen()->display()->sync();
+
+ XEvent xevent;
+ if (!screen()->waitForClipboardEvent(win,SelectionNotify,&xevent,clipboard_timeout) ||
+ xevent.xselection.property == XNone) {
+ return buf;
+ }
+
+ Atom type;
+ XSelectInput(screen()->display()->nativeDisplay(), win, PropertyChangeMask);
+
+ if (clipboardReadProperty(win, QXlibStatic::atom(QXlibStatic::_QT_SELECTION), true, &buf, 0, &type, 0)) {
+ if (type == QXlibStatic::atom(QXlibStatic::INCR)) {
+ int nbytes = buf.size() >= 4 ? *((int*)buf.data()) : 0;
+ buf = clipboardReadIncrementalProperty(win, QXlibStatic::atom(QXlibStatic::_QT_SELECTION), nbytes, false);
+ }
+ }
+
+ XSelectInput(screen()->display()->nativeDisplay(), win, NoEventMask);
+
+
+ return buf;
+}
+
+#include "qxlibclipboard.moc"
diff --git a/src/plugins/platforms/xlib/qxlibclipboard.h b/src/plugins/platforms/xlib/qxlibclipboard.h
new file mode 100644
index 0000000000..15901b0d2a
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibclipboard.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITECLIPBOARD_H
+#define QTESTLITECLIPBOARD_H
+
+#include <QPlatformClipboard>
+#include "qxlibstatic.h"
+
+class QXlibScreen;
+class QXlibClipboard : public QPlatformClipboard
+{
+public:
+ QXlibClipboard(QXlibScreen *screen);
+
+ const QMimeData *mimeData(QClipboard::Mode mode) const;
+ void setMimeData(QMimeData *data, QClipboard::Mode mode);
+
+ bool supportsMode(QClipboard::Mode mode) const;
+
+ QXlibScreen *screen() const;
+
+ Window requestor() const;
+ void setRequestor(Window window);
+
+ Window owner() const;
+
+ void handleSelectionRequest(XEvent *event);
+
+ bool clipboardReadProperty(Window win, Atom property, bool deleteProperty, QByteArray *buffer, int *size, Atom *type, int *format) const;
+ QByteArray clipboardReadIncrementalProperty(Window win, Atom property, int nbytes, bool nullterm);
+
+ QByteArray getDataInFormat(Atom modeAtom, Atom fmtatom);
+
+private:
+ void setOwner(Window window);
+
+ Atom sendTargetsSelection(QMimeData *d, Window window, Atom property);
+ Atom sendSelection(QMimeData *d, Atom target, Window window, Atom property);
+
+ QXlibScreen *m_screen;
+
+ QMimeData *m_xClipboard;
+ QMimeData *m_clientClipboard;
+
+ QMimeData *m_xSelection;
+ QMimeData *m_clientSelection;
+
+ Window m_requestor;
+ Window m_owner;
+
+ static const int clipboard_timeout;
+
+};
+
+#endif // QTESTLITECLIPBOARD_H
diff --git a/src/plugins/platforms/xlib/qxlibcursor.cpp b/src/plugins/platforms/xlib/qxlibcursor.cpp
new file mode 100644
index 0000000000..042cbc9933
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibcursor.cpp
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibcursor.h"
+
+#include "qxlibintegration.h"
+#include "qxlibscreen.h"
+#include "qxlibwindow.h"
+#include "qxlibdisplay.h"
+
+#include <QtGui/QBitmap>
+
+#include <X11/cursorfont.h>
+
+QT_BEGIN_NAMESPACE
+
+QXlibCursor::QXlibCursor(QXlibScreen *screen)
+ : QPlatformCursor(screen)
+{
+}
+
+void QXlibCursor::changeCursor(QCursor *cursor, QWidget *widget)
+{
+ QXlibWindow *w = 0;
+ if (widget) {
+ QWidget *window = widget->window();
+ w = static_cast<QXlibWindow*>(window->platformWindow());
+ } else {
+ // No X11 cursor control when there is no widget under the cursor
+ return;
+ }
+
+ if (!w)
+ return;
+
+ int id = cursor->handle();
+
+ Cursor c;
+ if (!cursorMap.contains(id)) {
+ if (cursor->shape() == Qt::BitmapCursor)
+ c = createCursorBitmap(cursor);
+ else
+ c = createCursorShape(cursor->shape());
+ if (!c) {
+ return;
+ }
+ cursorMap.insert(id, c);
+ } else {
+ c = cursorMap.value(id);
+ }
+
+ w->setCursor(c);
+}
+
+Cursor QXlibCursor::createCursorBitmap(QCursor * cursor)
+{
+ XColor bg, fg;
+ bg.red = 255 << 8;
+ bg.green = 255 << 8;
+ bg.blue = 255 << 8;
+ fg.red = 0;
+ fg.green = 0;
+ fg.blue = 0;
+ QPoint spot = cursor->hotSpot();
+ Window rootwin = testLiteScreen()->rootWindow();
+
+ QImage mapImage = cursor->bitmap()->toImage().convertToFormat(QImage::Format_MonoLSB);
+ QImage maskImage = cursor->mask()->toImage().convertToFormat(QImage::Format_MonoLSB);
+
+ int width = cursor->bitmap()->width();
+ int height = cursor->bitmap()->height();
+ int bytesPerLine = mapImage.bytesPerLine();
+ int destLineSize = width / 8;
+ if (width % 8)
+ destLineSize++;
+
+ const uchar * map = mapImage.bits();
+ const uchar * mask = maskImage.bits();
+
+ char * mapBits = new char[height * destLineSize];
+ char * maskBits = new char[height * destLineSize];
+ for (int i = 0; i < height; i++) {
+ memcpy(mapBits + (destLineSize * i),map + (bytesPerLine * i), destLineSize);
+ memcpy(maskBits + (destLineSize * i),mask + (bytesPerLine * i), destLineSize);
+ }
+
+ Pixmap cp = XCreateBitmapFromData(testLiteScreen()->display()->nativeDisplay(), rootwin, mapBits, width, height);
+ Pixmap mp = XCreateBitmapFromData(testLiteScreen()->display()->nativeDisplay(), rootwin, maskBits, width, height);
+ Cursor c = XCreatePixmapCursor(testLiteScreen()->display()->nativeDisplay(), cp, mp, &fg, &bg, spot.x(), spot.y());
+ XFreePixmap(testLiteScreen()->display()->nativeDisplay(), cp);
+ XFreePixmap(testLiteScreen()->display()->nativeDisplay(), mp);
+ delete[] mapBits;
+ delete[] maskBits;
+
+ return c;
+}
+
+Cursor QXlibCursor::createCursorShape(int cshape)
+{
+ Cursor cursor = 0;
+
+ if (cshape < 0 || cshape > Qt::LastCursor)
+ return 0;
+
+ switch (cshape) {
+ case Qt::ArrowCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_left_ptr);
+ break;
+ case Qt::UpArrowCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_center_ptr);
+ break;
+ case Qt::CrossCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_crosshair);
+ break;
+ case Qt::WaitCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_watch);
+ break;
+ case Qt::IBeamCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_xterm);
+ break;
+ case Qt::SizeAllCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_fleur);
+ break;
+ case Qt::PointingHandCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_hand2);
+ break;
+ case Qt::SizeBDiagCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_top_right_corner);
+ break;
+ case Qt::SizeFDiagCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_bottom_right_corner);
+ break;
+ case Qt::SizeVerCursor:
+ case Qt::SplitVCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_sb_v_double_arrow);
+ break;
+ case Qt::SizeHorCursor:
+ case Qt::SplitHCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_sb_h_double_arrow);
+ break;
+ case Qt::WhatsThisCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_question_arrow);
+ break;
+ case Qt::ForbiddenCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_circle);
+ break;
+ case Qt::BusyCursor:
+ cursor = XCreateFontCursor(testLiteScreen()->display()->nativeDisplay(), XC_watch);
+ break;
+
+ default: //default cursor for all the rest
+ break;
+ }
+ return cursor;
+}
+
+QXlibScreen * QXlibCursor::testLiteScreen() const
+{
+ return static_cast<QXlibScreen *>(screen);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibcursor.h b/src/plugins/platforms/xlib/qxlibcursor.h
new file mode 100644
index 0000000000..62b13eb36b
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibcursor.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITECURSOR_H
+#define QTESTLITECURSOR_H
+
+#include <QtGui/QPlatformCursor>
+
+#include "qxlibintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QXlibCursor : QPlatformCursor
+{
+public:
+ QXlibCursor(QXlibScreen *screen);
+
+ void changeCursor(QCursor * cursor, QWidget * widget);
+private:
+
+ Cursor createCursorBitmap(QCursor * cursor);
+ Cursor createCursorShape(int cshape);
+
+ QXlibScreen *testLiteScreen() const;
+ QMap<int, Cursor> cursorMap;
+};
+
+QT_END_NAMESPACE
+
+#endif // QTESTLITECURSOR_H
diff --git a/src/plugins/platforms/xlib/qxlibdisplay.cpp b/src/plugins/platforms/xlib/qxlibdisplay.cpp
new file mode 100644
index 0000000000..d8aa2309fb
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibdisplay.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibdisplay.h"
+
+QXlibDisplay::QXlibDisplay(Display *display)
+ : mDisplay(display)
+{
+ if (!mDisplay) {
+ qFatal("Cannot connect to X server");
+ }
+ mDisplayName = QString::fromLocal8Bit(DisplayString(mDisplay));
+}
+
+QXlibDisplay::~QXlibDisplay()
+{
+ XCloseDisplay(mDisplay);
+}
+
+QString QXlibDisplay::displayName() const
+{
+ { return mDisplayName; }
+}
+
+
+
+Display * QXlibDisplay::nativeDisplay() const
+{
+ return mDisplay;
+}
+
+void QXlibDisplay::sync() const
+{
+ XSync(mDisplay, False);
+}
+
+void QXlibDisplay::flush() const
+{
+ XFlush(mDisplay);
+}
diff --git a/src/plugins/platforms/xlib/qxlibdisplay.h b/src/plugins/platforms/xlib/qxlibdisplay.h
new file mode 100644
index 0000000000..557ab522a1
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibdisplay.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXLIBDISPLAY_H
+#define QXLIBDISPLAY_H
+
+#include "qxlibintegration.h"
+
+class QXlibDisplay
+{
+public:
+ QXlibDisplay(Display *display);
+ ~QXlibDisplay();
+ QString displayName() const;
+
+ Display *nativeDisplay() const;
+
+ void sync() const;
+ void flush() const;
+private:
+ Display *mDisplay;
+ QString mDisplayName;
+};
+
+#endif // QXLIBDISPLAY_H
diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp
new file mode 100644
index 0000000000..78f907abd2
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibintegration.cpp
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibintegration.h"
+#include "qxlibwindowsurface.h"
+#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtCore/qdebug.h>
+
+#include "qxlibwindow.h"
+#include "qgenericunixfontdatabase.h"
+#include "qxlibscreen.h"
+#include "qxlibclipboard.h"
+#include "qxlibdisplay.h"
+#include "qxlibnativeinterface.h"
+
+#if !defined(QT_NO_OPENGL)
+#if !defined(QT_OPENGL_ES_2)
+#include <GL/glx.h>
+#else
+#include <EGL/egl.h>
+#endif //!defined(QT_OPENGL_ES_2)
+#include <private/qwindowsurface_gl_p.h>
+#include <private/qpixmapdata_gl_p.h>
+#endif //QT_NO_OPENGL
+
+QT_BEGIN_NAMESPACE
+
+QXlibIntegration::QXlibIntegration(bool useOpenGL)
+ : mUseOpenGL(useOpenGL)
+ , mFontDb(new QGenericUnixFontDatabase())
+ , mClipboard(0)
+ , mNativeInterface(new QXlibNativeInterface)
+{
+ mPrimaryScreen = new QXlibScreen();
+ mScreens.append(mPrimaryScreen);
+}
+
+bool QXlibIntegration::hasCapability(QPlatformIntegration::Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ case OpenGL: return hasOpenGL();
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
+}
+
+QPixmapData *QXlibIntegration::createPixmapData(QPixmapData::PixelType type) const
+{
+#ifndef QT_NO_OPENGL
+ if (mUseOpenGL)
+ return new QGLPixmapData(type);
+#endif
+ return new QRasterPixmapData(type);
+}
+
+QWindowSurface *QXlibIntegration::createWindowSurface(QWidget *widget, WId) const
+{
+#ifndef QT_NO_OPENGL
+ if (mUseOpenGL)
+ return new QGLWindowSurface(widget);
+#endif
+ return new QXlibWindowSurface(widget);
+}
+
+
+QPlatformWindow *QXlibIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const
+{
+ return new QXlibWindow(widget);
+}
+
+
+
+QPixmap QXlibIntegration::grabWindow(WId window, int x, int y, int width, int height) const
+{
+ QImage image;
+ QWidget *widget = QWidget::find(window);
+ if (widget) {
+ QXlibScreen *screen = QXlibScreen::testLiteScreenForWidget(widget);
+ image = screen->grabWindow(window,x,y,width,height);
+ } else {
+ for (int i = 0; i < mScreens.size(); i++) {
+ QXlibScreen *screen = static_cast<QXlibScreen *>(mScreens[i]);
+ if (screen->rootWindow() == window) {
+ image = screen->grabWindow(window,x,y,width,height);
+ }
+ }
+ }
+ return QPixmap::fromImage(image);
+}
+
+QPlatformFontDatabase *QXlibIntegration::fontDatabase() const
+{
+ return mFontDb;
+}
+
+QPlatformClipboard * QXlibIntegration::clipboard() const
+{
+ //Use lazy init since clipboard needs QTestliteScreen
+ if (!mClipboard) {
+ QXlibIntegration *that = const_cast<QXlibIntegration *>(this);
+ that->mClipboard = new QXlibClipboard(mPrimaryScreen);
+ }
+ return mClipboard;
+}
+
+QPlatformNativeInterface * QXlibIntegration::nativeInterface() const
+{
+ return mNativeInterface;
+}
+
+bool QXlibIntegration::hasOpenGL() const
+{
+#if !defined(QT_NO_OPENGL)
+#if !defined(QT_OPENGL_ES_2)
+ QXlibScreen *screen = static_cast<const QXlibScreen *>(mScreens.at(0));
+ return glXQueryExtension(screen->display()->nativeDisplay(), 0, 0) != 0;
+#else
+ static bool eglHasbeenInitialized = false;
+ static bool wasEglInitialized = false;
+ if (!eglHasbeenInitialized) {
+ eglHasbeenInitialized = true;
+ QXlibScreen *screen = static_cast<QXlibScreen *>(mScreens.at(0));
+ EGLint major, minor;
+ eglBindAPI(EGL_OPENGL_ES_API);
+ EGLDisplay disp = eglGetDisplay(screen->display()->nativeDisplay());
+ wasEglInitialized = eglInitialize(disp,&major,&minor);
+ screen->setEglDisplay(disp);
+ }
+ return wasEglInitialized;
+#endif
+#endif
+ return false;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibintegration.h b/src/plugins/platforms/xlib/qxlibintegration.h
new file mode 100644
index 0000000000..1a2515a08d
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibintegration.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGRAPHICSSYSTEM_TESTLITE_H
+#define QGRAPHICSSYSTEM_TESTLITE_H
+
+//make sure textstream is included before any X11 headers
+#include <QtCore/QTextStream>
+
+#include <QtGui/QPlatformIntegration>
+#include <QtGui/QPlatformScreen>
+#include <QtGui/QPlatformNativeInterface>
+
+#include "qxlibstatic.h"
+
+QT_BEGIN_NAMESPACE
+
+class QXlibScreen;
+
+class QXlibIntegration : public QPlatformIntegration
+{
+public:
+ QXlibIntegration(bool useOpenGL = false);
+
+ bool hasCapability(Capability cap) const;
+ QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
+
+ QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
+
+ QList<QPlatformScreen *> screens() const { return mScreens; }
+
+ QPlatformFontDatabase *fontDatabase() const;
+ QPlatformClipboard *clipboard() const;
+
+ QPlatformNativeInterface *nativeInterface() const;
+
+private:
+ bool hasOpenGL() const;
+
+ bool mUseOpenGL;
+ QXlibScreen *mPrimaryScreen;
+ QList<QPlatformScreen *> mScreens;
+ QPlatformFontDatabase *mFontDb;
+ QPlatformClipboard *mClipboard;
+ QPlatformNativeInterface *mNativeInterface;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/xlib/qxlibkeyboard.cpp b/src/plugins/platforms/xlib/qxlibkeyboard.cpp
new file mode 100644
index 0000000000..8d94157e08
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibkeyboard.cpp
@@ -0,0 +1,1001 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibkeyboard.h"
+
+#include "qxlibscreen.h"
+#include "qxlibdisplay.h"
+
+#include <QtGui/QWindowSystemInterface>
+
+#include <QtCore/QTextCodec>
+
+#ifndef XK_ISO_Left_Tab
+#define XK_ISO_Left_Tab 0xFE20
+#endif
+
+#ifndef XK_dead_hook
+#define XK_dead_hook 0xFE61
+#endif
+
+#ifndef XK_dead_horn
+#define XK_dead_horn 0xFE62
+#endif
+
+#ifndef XK_Codeinput
+#define XK_Codeinput 0xFF37
+#endif
+
+#ifndef XK_Kanji_Bangou
+#define XK_Kanji_Bangou 0xFF37 /* same as codeinput */
+#endif
+
+// Fix old X libraries
+#ifndef XK_KP_Home
+#define XK_KP_Home 0xFF95
+#endif
+#ifndef XK_KP_Left
+#define XK_KP_Left 0xFF96
+#endif
+#ifndef XK_KP_Up
+#define XK_KP_Up 0xFF97
+#endif
+#ifndef XK_KP_Right
+#define XK_KP_Right 0xFF98
+#endif
+#ifndef XK_KP_Down
+#define XK_KP_Down 0xFF99
+#endif
+#ifndef XK_KP_Prior
+#define XK_KP_Prior 0xFF9A
+#endif
+#ifndef XK_KP_Next
+#define XK_KP_Next 0xFF9B
+#endif
+#ifndef XK_KP_End
+#define XK_KP_End 0xFF9C
+#endif
+#ifndef XK_KP_Insert
+#define XK_KP_Insert 0xFF9E
+#endif
+#ifndef XK_KP_Delete
+#define XK_KP_Delete 0xFF9F
+#endif
+
+// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special
+// multimedia keys. They are included here as not every system has them.
+#define XF86XK_MonBrightnessUp 0x1008FF02
+#define XF86XK_MonBrightnessDown 0x1008FF03
+#define XF86XK_KbdLightOnOff 0x1008FF04
+#define XF86XK_KbdBrightnessUp 0x1008FF05
+#define XF86XK_KbdBrightnessDown 0x1008FF06
+#define XF86XK_Standby 0x1008FF10
+#define XF86XK_AudioLowerVolume 0x1008FF11
+#define XF86XK_AudioMute 0x1008FF12
+#define XF86XK_AudioRaiseVolume 0x1008FF13
+#define XF86XK_AudioPlay 0x1008FF14
+#define XF86XK_AudioStop 0x1008FF15
+#define XF86XK_AudioPrev 0x1008FF16
+#define XF86XK_AudioNext 0x1008FF17
+#define XF86XK_HomePage 0x1008FF18
+#define XF86XK_Mail 0x1008FF19
+#define XF86XK_Start 0x1008FF1A
+#define XF86XK_Search 0x1008FF1B
+#define XF86XK_AudioRecord 0x1008FF1C
+#define XF86XK_Calculator 0x1008FF1D
+#define XF86XK_Memo 0x1008FF1E
+#define XF86XK_ToDoList 0x1008FF1F
+#define XF86XK_Calendar 0x1008FF20
+#define XF86XK_PowerDown 0x1008FF21
+#define XF86XK_ContrastAdjust 0x1008FF22
+#define XF86XK_Back 0x1008FF26
+#define XF86XK_Forward 0x1008FF27
+#define XF86XK_Stop 0x1008FF28
+#define XF86XK_Refresh 0x1008FF29
+#define XF86XK_PowerOff 0x1008FF2A
+#define XF86XK_WakeUp 0x1008FF2B
+#define XF86XK_Eject 0x1008FF2C
+#define XF86XK_ScreenSaver 0x1008FF2D
+#define XF86XK_WWW 0x1008FF2E
+#define XF86XK_Sleep 0x1008FF2F
+#define XF86XK_Favorites 0x1008FF30
+#define XF86XK_AudioPause 0x1008FF31
+#define XF86XK_AudioMedia 0x1008FF32
+#define XF86XK_MyComputer 0x1008FF33
+#define XF86XK_LightBulb 0x1008FF35
+#define XF86XK_Shop 0x1008FF36
+#define XF86XK_History 0x1008FF37
+#define XF86XK_OpenURL 0x1008FF38
+#define XF86XK_AddFavorite 0x1008FF39
+#define XF86XK_HotLinks 0x1008FF3A
+#define XF86XK_BrightnessAdjust 0x1008FF3B
+#define XF86XK_Finance 0x1008FF3C
+#define XF86XK_Community 0x1008FF3D
+#define XF86XK_AudioRewind 0x1008FF3E
+#define XF86XK_BackForward 0x1008FF3F
+#define XF86XK_Launch0 0x1008FF40
+#define XF86XK_Launch1 0x1008FF41
+#define XF86XK_Launch2 0x1008FF42
+#define XF86XK_Launch3 0x1008FF43
+#define XF86XK_Launch4 0x1008FF44
+#define XF86XK_Launch5 0x1008FF45
+#define XF86XK_Launch6 0x1008FF46
+#define XF86XK_Launch7 0x1008FF47
+#define XF86XK_Launch8 0x1008FF48
+#define XF86XK_Launch9 0x1008FF49
+#define XF86XK_LaunchA 0x1008FF4A
+#define XF86XK_LaunchB 0x1008FF4B
+#define XF86XK_LaunchC 0x1008FF4C
+#define XF86XK_LaunchD 0x1008FF4D
+#define XF86XK_LaunchE 0x1008FF4E
+#define XF86XK_LaunchF 0x1008FF4F
+#define XF86XK_ApplicationLeft 0x1008FF50
+#define XF86XK_ApplicationRight 0x1008FF51
+#define XF86XK_Book 0x1008FF52
+#define XF86XK_CD 0x1008FF53
+#define XF86XK_Calculater 0x1008FF54
+#define XF86XK_Clear 0x1008FF55
+#define XF86XK_ClearGrab 0x1008FE21
+#define XF86XK_Close 0x1008FF56
+#define XF86XK_Copy 0x1008FF57
+#define XF86XK_Cut 0x1008FF58
+#define XF86XK_Display 0x1008FF59
+#define XF86XK_DOS 0x1008FF5A
+#define XF86XK_Documents 0x1008FF5B
+#define XF86XK_Excel 0x1008FF5C
+#define XF86XK_Explorer 0x1008FF5D
+#define XF86XK_Game 0x1008FF5E
+#define XF86XK_Go 0x1008FF5F
+#define XF86XK_iTouch 0x1008FF60
+#define XF86XK_LogOff 0x1008FF61
+#define XF86XK_Market 0x1008FF62
+#define XF86XK_Meeting 0x1008FF63
+#define XF86XK_MenuKB 0x1008FF65
+#define XF86XK_MenuPB 0x1008FF66
+#define XF86XK_MySites 0x1008FF67
+#define XF86XK_News 0x1008FF69
+#define XF86XK_OfficeHome 0x1008FF6A
+#define XF86XK_Option 0x1008FF6C
+#define XF86XK_Paste 0x1008FF6D
+#define XF86XK_Phone 0x1008FF6E
+#define XF86XK_Reply 0x1008FF72
+#define XF86XK_Reload 0x1008FF73
+#define XF86XK_RotateWindows 0x1008FF74
+#define XF86XK_RotationPB 0x1008FF75
+#define XF86XK_RotationKB 0x1008FF76
+#define XF86XK_Save 0x1008FF77
+#define XF86XK_Send 0x1008FF7B
+#define XF86XK_Spell 0x1008FF7C
+#define XF86XK_SplitScreen 0x1008FF7D
+#define XF86XK_Support 0x1008FF7E
+#define XF86XK_TaskPane 0x1008FF7F
+#define XF86XK_Terminal 0x1008FF80
+#define XF86XK_Tools 0x1008FF81
+#define XF86XK_Travel 0x1008FF82
+#define XF86XK_Video 0x1008FF87
+#define XF86XK_Word 0x1008FF89
+#define XF86XK_Xfer 0x1008FF8A
+#define XF86XK_ZoomIn 0x1008FF8B
+#define XF86XK_ZoomOut 0x1008FF8C
+#define XF86XK_Away 0x1008FF8D
+#define XF86XK_Messenger 0x1008FF8E
+#define XF86XK_WebCam 0x1008FF8F
+#define XF86XK_MailForward 0x1008FF90
+#define XF86XK_Pictures 0x1008FF91
+#define XF86XK_Music 0x1008FF92
+#define XF86XK_Battery 0x1008FF93
+#define XF86XK_Bluetooth 0x1008FF94
+#define XF86XK_WLAN 0x1008FF95
+#define XF86XK_UWB 0x1008FF96
+#define XF86XK_AudioForward 0x1008FF97
+#define XF86XK_AudioRepeat 0x1008FF98
+#define XF86XK_AudioRandomPlay 0x1008FF99
+#define XF86XK_Subtitle 0x1008FF9A
+#define XF86XK_AudioCycleTrack 0x1008FF9B
+#define XF86XK_Time 0x1008FF9F
+#define XF86XK_Select 0x1008FFA0
+#define XF86XK_View 0x1008FFA1
+#define XF86XK_TopMenu 0x1008FFA2
+#define XF86XK_Suspend 0x1008FFA7
+#define XF86XK_Hibernate 0x1008FFA8
+
+
+// end of XF86keysyms.h
+
+// Special keys used by Qtopia, mapped into the X11 private keypad range.
+#define QTOPIAXK_Select 0x11000601
+#define QTOPIAXK_Yes 0x11000602
+#define QTOPIAXK_No 0x11000603
+#define QTOPIAXK_Cancel 0x11000604
+#define QTOPIAXK_Printer 0x11000605
+#define QTOPIAXK_Execute 0x11000606
+#define QTOPIAXK_Sleep 0x11000607
+#define QTOPIAXK_Play 0x11000608
+#define QTOPIAXK_Zoom 0x11000609
+#define QTOPIAXK_Context1 0x1100060A
+#define QTOPIAXK_Context2 0x1100060B
+#define QTOPIAXK_Context3 0x1100060C
+#define QTOPIAXK_Context4 0x1100060D
+#define QTOPIAXK_Call 0x1100060E
+#define QTOPIAXK_Hangup 0x1100060F
+#define QTOPIAXK_Flip 0x11000610
+
+// keyboard mapping table
+static const unsigned int KeyTbl[] = {
+
+ // misc keys
+
+ XK_Escape, Qt::Key_Escape,
+ XK_Tab, Qt::Key_Tab,
+ XK_ISO_Left_Tab, Qt::Key_Backtab,
+ XK_BackSpace, Qt::Key_Backspace,
+ XK_Return, Qt::Key_Return,
+ XK_Insert, Qt::Key_Insert,
+ XK_Delete, Qt::Key_Delete,
+ XK_Clear, Qt::Key_Delete,
+ XK_Pause, Qt::Key_Pause,
+ XK_Print, Qt::Key_Print,
+ 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq
+ 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq
+
+ // cursor movement
+
+ XK_Home, Qt::Key_Home,
+ XK_End, Qt::Key_End,
+ XK_Left, Qt::Key_Left,
+ XK_Up, Qt::Key_Up,
+ XK_Right, Qt::Key_Right,
+ XK_Down, Qt::Key_Down,
+ XK_Prior, Qt::Key_PageUp,
+ XK_Next, Qt::Key_PageDown,
+
+ // modifiers
+
+ XK_Shift_L, Qt::Key_Shift,
+ XK_Shift_R, Qt::Key_Shift,
+ XK_Shift_Lock, Qt::Key_Shift,
+ XK_Control_L, Qt::Key_Control,
+ XK_Control_R, Qt::Key_Control,
+ XK_Meta_L, Qt::Key_Meta,
+ XK_Meta_R, Qt::Key_Meta,
+ XK_Alt_L, Qt::Key_Alt,
+ XK_Alt_R, Qt::Key_Alt,
+ XK_Caps_Lock, Qt::Key_CapsLock,
+ XK_Num_Lock, Qt::Key_NumLock,
+ XK_Scroll_Lock, Qt::Key_ScrollLock,
+ XK_Super_L, Qt::Key_Super_L,
+ XK_Super_R, Qt::Key_Super_R,
+ XK_Menu, Qt::Key_Menu,
+ XK_Hyper_L, Qt::Key_Hyper_L,
+ XK_Hyper_R, Qt::Key_Hyper_R,
+ XK_Help, Qt::Key_Help,
+ 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab
+ 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11)
+ 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12)
+
+ // numeric and function keypad keys
+
+ XK_KP_Space, Qt::Key_Space,
+ XK_KP_Tab, Qt::Key_Tab,
+ XK_KP_Enter, Qt::Key_Enter,
+ //XK_KP_F1, Qt::Key_F1,
+ //XK_KP_F2, Qt::Key_F2,
+ //XK_KP_F3, Qt::Key_F3,
+ //XK_KP_F4, Qt::Key_F4,
+ XK_KP_Home, Qt::Key_Home,
+ XK_KP_Left, Qt::Key_Left,
+ XK_KP_Up, Qt::Key_Up,
+ XK_KP_Right, Qt::Key_Right,
+ XK_KP_Down, Qt::Key_Down,
+ XK_KP_Prior, Qt::Key_PageUp,
+ XK_KP_Next, Qt::Key_PageDown,
+ XK_KP_End, Qt::Key_End,
+ XK_KP_Begin, Qt::Key_Clear,
+ XK_KP_Insert, Qt::Key_Insert,
+ XK_KP_Delete, Qt::Key_Delete,
+ XK_KP_Equal, Qt::Key_Equal,
+ XK_KP_Multiply, Qt::Key_Asterisk,
+ XK_KP_Add, Qt::Key_Plus,
+ XK_KP_Separator, Qt::Key_Comma,
+ XK_KP_Subtract, Qt::Key_Minus,
+ XK_KP_Decimal, Qt::Key_Period,
+ XK_KP_Divide, Qt::Key_Slash,
+
+ // International input method support keys
+
+ // International & multi-key character composition
+ XK_ISO_Level3_Shift, Qt::Key_AltGr,
+ XK_Multi_key, Qt::Key_Multi_key,
+ XK_Codeinput, Qt::Key_Codeinput,
+ XK_SingleCandidate, Qt::Key_SingleCandidate,
+ XK_MultipleCandidate, Qt::Key_MultipleCandidate,
+ XK_PreviousCandidate, Qt::Key_PreviousCandidate,
+
+ // Misc Functions
+ XK_Mode_switch, Qt::Key_Mode_switch,
+ XK_script_switch, Qt::Key_Mode_switch,
+
+ // Japanese keyboard support
+ XK_Kanji, Qt::Key_Kanji,
+ XK_Muhenkan, Qt::Key_Muhenkan,
+ //XK_Henkan_Mode, Qt::Key_Henkan_Mode,
+ XK_Henkan_Mode, Qt::Key_Henkan,
+ XK_Henkan, Qt::Key_Henkan,
+ XK_Romaji, Qt::Key_Romaji,
+ XK_Hiragana, Qt::Key_Hiragana,
+ XK_Katakana, Qt::Key_Katakana,
+ XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana,
+ XK_Zenkaku, Qt::Key_Zenkaku,
+ XK_Hankaku, Qt::Key_Hankaku,
+ XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku,
+ XK_Touroku, Qt::Key_Touroku,
+ XK_Massyo, Qt::Key_Massyo,
+ XK_Kana_Lock, Qt::Key_Kana_Lock,
+ XK_Kana_Shift, Qt::Key_Kana_Shift,
+ XK_Eisu_Shift, Qt::Key_Eisu_Shift,
+ XK_Eisu_toggle, Qt::Key_Eisu_toggle,
+ //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou,
+ //XK_Zen_Koho, Qt::Key_Zen_Koho,
+ //XK_Mae_Koho, Qt::Key_Mae_Koho,
+ XK_Kanji_Bangou, Qt::Key_Codeinput,
+ XK_Zen_Koho, Qt::Key_MultipleCandidate,
+ XK_Mae_Koho, Qt::Key_PreviousCandidate,
+
+#ifdef XK_KOREAN
+ // Korean keyboard support
+ XK_Hangul, Qt::Key_Hangul,
+ XK_Hangul_Start, Qt::Key_Hangul_Start,
+ XK_Hangul_End, Qt::Key_Hangul_End,
+ XK_Hangul_Hanja, Qt::Key_Hangul_Hanja,
+ XK_Hangul_Jamo, Qt::Key_Hangul_Jamo,
+ XK_Hangul_Romaja, Qt::Key_Hangul_Romaja,
+ //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput,
+ XK_Hangul_Codeinput, Qt::Key_Codeinput,
+ XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja,
+ XK_Hangul_Banja, Qt::Key_Hangul_Banja,
+ XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja,
+ XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja,
+ //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
+ //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
+ //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
+ XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate,
+ XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
+ XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
+ XK_Hangul_Special, Qt::Key_Hangul_Special,
+ //XK_Hangul_switch, Qt::Key_Hangul_switch,
+ XK_Hangul_switch, Qt::Key_Mode_switch,
+#endif // XK_KOREAN
+
+ // dead keys
+ XK_dead_grave, Qt::Key_Dead_Grave,
+ XK_dead_acute, Qt::Key_Dead_Acute,
+ XK_dead_circumflex, Qt::Key_Dead_Circumflex,
+ XK_dead_tilde, Qt::Key_Dead_Tilde,
+ XK_dead_macron, Qt::Key_Dead_Macron,
+ XK_dead_breve, Qt::Key_Dead_Breve,
+ XK_dead_abovedot, Qt::Key_Dead_Abovedot,
+ XK_dead_diaeresis, Qt::Key_Dead_Diaeresis,
+ XK_dead_abovering, Qt::Key_Dead_Abovering,
+ XK_dead_doubleacute, Qt::Key_Dead_Doubleacute,
+ XK_dead_caron, Qt::Key_Dead_Caron,
+ XK_dead_cedilla, Qt::Key_Dead_Cedilla,
+ XK_dead_ogonek, Qt::Key_Dead_Ogonek,
+ XK_dead_iota, Qt::Key_Dead_Iota,
+ XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound,
+ XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound,
+ XK_dead_belowdot, Qt::Key_Dead_Belowdot,
+ XK_dead_hook, Qt::Key_Dead_Hook,
+ XK_dead_horn, Qt::Key_Dead_Horn,
+
+ // Special keys from X.org - This include multimedia keys,
+ // wireless/bluetooth/uwb keys, special launcher keys, etc.
+ XF86XK_Back, Qt::Key_Back,
+ XF86XK_Forward, Qt::Key_Forward,
+ XF86XK_Stop, Qt::Key_Stop,
+ XF86XK_Refresh, Qt::Key_Refresh,
+ XF86XK_Favorites, Qt::Key_Favorites,
+ XF86XK_AudioMedia, Qt::Key_LaunchMedia,
+ XF86XK_OpenURL, Qt::Key_OpenUrl,
+ XF86XK_HomePage, Qt::Key_HomePage,
+ XF86XK_Search, Qt::Key_Search,
+ XF86XK_AudioLowerVolume, Qt::Key_VolumeDown,
+ XF86XK_AudioMute, Qt::Key_VolumeMute,
+ XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp,
+ XF86XK_AudioPlay, Qt::Key_MediaPlay,
+ XF86XK_AudioStop, Qt::Key_MediaStop,
+ XF86XK_AudioPrev, Qt::Key_MediaPrevious,
+ XF86XK_AudioNext, Qt::Key_MediaNext,
+ XF86XK_AudioRecord, Qt::Key_MediaRecord,
+ XF86XK_Mail, Qt::Key_LaunchMail,
+ XF86XK_MyComputer, Qt::Key_Launch0, // ### Qt 5: remap properly
+ XF86XK_Calculator, Qt::Key_Launch1,
+ XF86XK_Memo, Qt::Key_Memo,
+ XF86XK_ToDoList, Qt::Key_ToDoList,
+ XF86XK_Calendar, Qt::Key_Calendar,
+ XF86XK_PowerDown, Qt::Key_PowerDown,
+ XF86XK_ContrastAdjust, Qt::Key_ContrastAdjust,
+ XF86XK_Standby, Qt::Key_Standby,
+ XF86XK_MonBrightnessUp, Qt::Key_MonBrightnessUp,
+ XF86XK_MonBrightnessDown, Qt::Key_MonBrightnessDown,
+ XF86XK_KbdLightOnOff, Qt::Key_KeyboardLightOnOff,
+ XF86XK_KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp,
+ XF86XK_KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown,
+ XF86XK_PowerOff, Qt::Key_PowerOff,
+ XF86XK_WakeUp, Qt::Key_WakeUp,
+ XF86XK_Eject, Qt::Key_Eject,
+ XF86XK_ScreenSaver, Qt::Key_ScreenSaver,
+ XF86XK_WWW, Qt::Key_WWW,
+ XF86XK_Sleep, Qt::Key_Sleep,
+ XF86XK_LightBulb, Qt::Key_LightBulb,
+ XF86XK_Shop, Qt::Key_Shop,
+ XF86XK_History, Qt::Key_History,
+ XF86XK_AddFavorite, Qt::Key_AddFavorite,
+ XF86XK_HotLinks, Qt::Key_HotLinks,
+ XF86XK_BrightnessAdjust, Qt::Key_BrightnessAdjust,
+ XF86XK_Finance, Qt::Key_Finance,
+ XF86XK_Community, Qt::Key_Community,
+ XF86XK_AudioRewind, Qt::Key_AudioRewind,
+ XF86XK_BackForward, Qt::Key_BackForward,
+ XF86XK_ApplicationLeft, Qt::Key_ApplicationLeft,
+ XF86XK_ApplicationRight, Qt::Key_ApplicationRight,
+ XF86XK_Book, Qt::Key_Book,
+ XF86XK_CD, Qt::Key_CD,
+ XF86XK_Calculater, Qt::Key_Calculator,
+ XF86XK_Clear, Qt::Key_Clear,
+ XF86XK_ClearGrab, Qt::Key_ClearGrab,
+ XF86XK_Close, Qt::Key_Close,
+ XF86XK_Copy, Qt::Key_Copy,
+ XF86XK_Cut, Qt::Key_Cut,
+ XF86XK_Display, Qt::Key_Display,
+ XF86XK_DOS, Qt::Key_DOS,
+ XF86XK_Documents, Qt::Key_Documents,
+ XF86XK_Excel, Qt::Key_Excel,
+ XF86XK_Explorer, Qt::Key_Explorer,
+ XF86XK_Game, Qt::Key_Game,
+ XF86XK_Go, Qt::Key_Go,
+ XF86XK_iTouch, Qt::Key_iTouch,
+ XF86XK_LogOff, Qt::Key_LogOff,
+ XF86XK_Market, Qt::Key_Market,
+ XF86XK_Meeting, Qt::Key_Meeting,
+ XF86XK_MenuKB, Qt::Key_MenuKB,
+ XF86XK_MenuPB, Qt::Key_MenuPB,
+ XF86XK_MySites, Qt::Key_MySites,
+ XF86XK_News, Qt::Key_News,
+ XF86XK_OfficeHome, Qt::Key_OfficeHome,
+ XF86XK_Option, Qt::Key_Option,
+ XF86XK_Paste, Qt::Key_Paste,
+ XF86XK_Phone, Qt::Key_Phone,
+ XF86XK_Reply, Qt::Key_Reply,
+ XF86XK_Reload, Qt::Key_Reload,
+ XF86XK_RotateWindows, Qt::Key_RotateWindows,
+ XF86XK_RotationPB, Qt::Key_RotationPB,
+ XF86XK_RotationKB, Qt::Key_RotationKB,
+ XF86XK_Save, Qt::Key_Save,
+ XF86XK_Send, Qt::Key_Send,
+ XF86XK_Spell, Qt::Key_Spell,
+ XF86XK_SplitScreen, Qt::Key_SplitScreen,
+ XF86XK_Support, Qt::Key_Support,
+ XF86XK_TaskPane, Qt::Key_TaskPane,
+ XF86XK_Terminal, Qt::Key_Terminal,
+ XF86XK_Tools, Qt::Key_Tools,
+ XF86XK_Travel, Qt::Key_Travel,
+ XF86XK_Video, Qt::Key_Video,
+ XF86XK_Word, Qt::Key_Word,
+ XF86XK_Xfer, Qt::Key_Xfer,
+ XF86XK_ZoomIn, Qt::Key_ZoomIn,
+ XF86XK_ZoomOut, Qt::Key_ZoomOut,
+ XF86XK_Away, Qt::Key_Away,
+ XF86XK_Messenger, Qt::Key_Messenger,
+ XF86XK_WebCam, Qt::Key_WebCam,
+ XF86XK_MailForward, Qt::Key_MailForward,
+ XF86XK_Pictures, Qt::Key_Pictures,
+ XF86XK_Music, Qt::Key_Music,
+ XF86XK_Battery, Qt::Key_Battery,
+ XF86XK_Bluetooth, Qt::Key_Bluetooth,
+ XF86XK_WLAN, Qt::Key_WLAN,
+ XF86XK_UWB, Qt::Key_UWB,
+ XF86XK_AudioForward, Qt::Key_AudioForward,
+ XF86XK_AudioRepeat, Qt::Key_AudioRepeat,
+ XF86XK_AudioRandomPlay, Qt::Key_AudioRandomPlay,
+ XF86XK_Subtitle, Qt::Key_Subtitle,
+ XF86XK_AudioCycleTrack, Qt::Key_AudioCycleTrack,
+ XF86XK_Time, Qt::Key_Time,
+ XF86XK_Select, Qt::Key_Select,
+ XF86XK_View, Qt::Key_View,
+ XF86XK_TopMenu, Qt::Key_TopMenu,
+ XF86XK_Bluetooth, Qt::Key_Bluetooth,
+ XF86XK_Suspend, Qt::Key_Suspend,
+ XF86XK_Hibernate, Qt::Key_Hibernate,
+ XF86XK_Launch0, Qt::Key_Launch2, // ### Qt 5: remap properly
+ XF86XK_Launch1, Qt::Key_Launch3,
+ XF86XK_Launch2, Qt::Key_Launch4,
+ XF86XK_Launch3, Qt::Key_Launch5,
+ XF86XK_Launch4, Qt::Key_Launch6,
+ XF86XK_Launch5, Qt::Key_Launch7,
+ XF86XK_Launch6, Qt::Key_Launch8,
+ XF86XK_Launch7, Qt::Key_Launch9,
+ XF86XK_Launch8, Qt::Key_LaunchA,
+ XF86XK_Launch9, Qt::Key_LaunchB,
+ XF86XK_LaunchA, Qt::Key_LaunchC,
+ XF86XK_LaunchB, Qt::Key_LaunchD,
+ XF86XK_LaunchC, Qt::Key_LaunchE,
+ XF86XK_LaunchD, Qt::Key_LaunchF,
+ XF86XK_LaunchE, Qt::Key_LaunchG,
+ XF86XK_LaunchF, Qt::Key_LaunchH,
+
+ // Qtopia keys
+ QTOPIAXK_Select, Qt::Key_Select,
+ QTOPIAXK_Yes, Qt::Key_Yes,
+ QTOPIAXK_No, Qt::Key_No,
+ QTOPIAXK_Cancel, Qt::Key_Cancel,
+ QTOPIAXK_Printer, Qt::Key_Printer,
+ QTOPIAXK_Execute, Qt::Key_Execute,
+ QTOPIAXK_Sleep, Qt::Key_Sleep,
+ QTOPIAXK_Play, Qt::Key_Play,
+ QTOPIAXK_Zoom, Qt::Key_Zoom,
+ QTOPIAXK_Context1, Qt::Key_Context1,
+ QTOPIAXK_Context2, Qt::Key_Context2,
+ QTOPIAXK_Context3, Qt::Key_Context3,
+ QTOPIAXK_Context4, Qt::Key_Context4,
+ QTOPIAXK_Call, Qt::Key_Call,
+ QTOPIAXK_Hangup, Qt::Key_Hangup,
+ QTOPIAXK_Flip, Qt::Key_Flip,
+
+ 0, 0
+};
+
+static const unsigned short katakanaKeysymsToUnicode[] = {
+ 0x0000, 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1,
+ 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3,
+ 0x30FC, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,
+ 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,
+ 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,
+ 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,
+ 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x309B, 0x309C
+};
+
+static const unsigned short cyrillicKeysymsToUnicode[] = {
+ 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0000, 0x045e, 0x045f,
+ 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0000, 0x040e, 0x040f,
+ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
+ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a
+};
+
+static const unsigned short greekKeysymsToUnicode[] = {
+ 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c,
+ 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015,
+ 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc,
+ 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
+ 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
+ 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+ 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+ 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
+ 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short technicalKeysymsToUnicode[] = {
+ 0x0000, 0x23B7, 0x250C, 0x2500, 0x2320, 0x2321, 0x2502, 0x23A1,
+ 0x23A3, 0x23A4, 0x23A6, 0x239B, 0x239D, 0x239E, 0x23A0, 0x23A8,
+ 0x23AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222B,
+ 0x2234, 0x221D, 0x221E, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000,
+ 0x223C, 0x2243, 0x0000, 0x0000, 0x0000, 0x21D4, 0x21D2, 0x2261,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x0000,
+ 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222A, 0x2227, 0x2228,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193, 0x0000
+};
+
+static const unsigned short specialKeysymsToUnicode[] = {
+ 0x25C6, 0x2592, 0x2409, 0x240C, 0x240D, 0x240A, 0x0000, 0x0000,
+ 0x2424, 0x240B, 0x2518, 0x2510, 0x250C, 0x2514, 0x253C, 0x23BA,
+ 0x23BB, 0x2500, 0x23BC, 0x23BD, 0x251C, 0x2524, 0x2534, 0x252C,
+ 0x2502, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short publishingKeysymsToUnicode[] = {
+ 0x0000, 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009,
+ 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025,
+ 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a,
+ 0x2105, 0x0000, 0x0000, 0x2012, 0x2329, 0x0000, 0x232a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000,
+ 0x0000, 0x2122, 0x2613, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25af,
+ 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x0000, 0x2032, 0x2033,
+ 0x0000, 0x271d, 0x0000, 0x25ac, 0x25c0, 0x25b6, 0x25cf, 0x25ae,
+ 0x25e6, 0x25ab, 0x25ad, 0x25b3, 0x25bd, 0x2606, 0x2022, 0x25aa,
+ 0x25b2, 0x25bc, 0x261c, 0x261e, 0x2663, 0x2666, 0x2665, 0x0000,
+ 0x2720, 0x2020, 0x2021, 0x2713, 0x2717, 0x266f, 0x266d, 0x2642,
+ 0x2640, 0x260e, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e, 0x0000
+};
+
+static const unsigned short aplKeysymsToUnicode[] = {
+ 0x0000, 0x0000, 0x0000, 0x003c, 0x0000, 0x0000, 0x003e, 0x0000,
+ 0x2228, 0x2227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00af, 0x0000, 0x22a5, 0x2229, 0x230a, 0x0000, 0x005f, 0x0000,
+ 0x0000, 0x0000, 0x2218, 0x0000, 0x2395, 0x0000, 0x22a4, 0x25cb,
+ 0x0000, 0x0000, 0x0000, 0x2308, 0x0000, 0x0000, 0x222a, 0x0000,
+ 0x2283, 0x0000, 0x2282, 0x0000, 0x22a2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x22a3, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short koreanKeysymsToUnicode[] = {
+ 0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137,
+ 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f,
+ 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147,
+ 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f,
+ 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157,
+ 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f,
+ 0x3160, 0x3161, 0x3162, 0x3163, 0x11a8, 0x11a9, 0x11aa, 0x11ab,
+ 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3,
+ 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb,
+ 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x316d,
+ 0x3171, 0x3178, 0x317f, 0x3181, 0x3184, 0x3186, 0x318d, 0x318e,
+ 0x11eb, 0x11f0, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9
+};
+
+static QChar keysymToUnicode(unsigned char byte3, unsigned char byte4)
+{
+ switch (byte3) {
+ case 0x04:
+ // katakana
+ if (byte4 > 0xa0 && byte4 < 0xe0)
+ return QChar(katakanaKeysymsToUnicode[byte4 - 0xa0]);
+ else if (byte4 == 0x7e)
+ return QChar(0x203e); // Overline
+ break;
+ case 0x06:
+ // russian, use lookup table
+ if (byte4 > 0xa0)
+ return QChar(cyrillicKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x07:
+ // greek
+ if (byte4 > 0xa0)
+ return QChar(greekKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x08:
+ // technical
+ if (byte4 > 0xa0)
+ return QChar(technicalKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x09:
+ // special
+ if (byte4 >= 0xe0)
+ return QChar(specialKeysymsToUnicode[byte4 - 0xe0]);
+ break;
+ case 0x0a:
+ // publishing
+ if (byte4 > 0xa0)
+ return QChar(publishingKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x0b:
+ // APL
+ if (byte4 > 0xa0)
+ return QChar(aplKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ case 0x0e:
+ // Korean
+ if (byte4 > 0xa0)
+ return QChar(koreanKeysymsToUnicode[byte4 - 0xa0]);
+ break;
+ default:
+ break;
+ }
+ return QChar(0x0);
+}
+
+Qt::KeyboardModifiers QXlibKeyboard::translateModifiers(int s)
+{
+ Qt::KeyboardModifiers ret = 0;
+ if (s & ShiftMask)
+ ret |= Qt::ShiftModifier;
+ if (s & ControlMask)
+ ret |= Qt::ControlModifier;
+ if (s & m_alt_mask)
+ ret |= Qt::AltModifier;
+ if (s & m_meta_mask)
+ ret |= Qt::MetaModifier;
+// if (s & m_mode_switch_mask) //doesn't seem to work correctly
+// ret |= Qt::GroupSwitchModifier;
+ return ret;
+}
+
+void QXlibKeyboard::setMask(KeySym sym, uint mask)
+{
+ if (m_alt_mask == 0
+ && m_meta_mask != mask
+ && m_super_mask != mask
+ && m_hyper_mask != mask
+ && (sym == XK_Alt_L || sym == XK_Alt_R)) {
+ m_alt_mask = mask;
+ }
+ if (m_meta_mask == 0
+ && m_alt_mask != mask
+ && m_super_mask != mask
+ && m_hyper_mask != mask
+ && (sym == XK_Meta_L || sym == XK_Meta_R)) {
+ m_meta_mask = mask;
+ }
+ if (m_super_mask == 0
+ && m_alt_mask != mask
+ && m_meta_mask != mask
+ && m_hyper_mask != mask
+ && (sym == XK_Super_L || sym == XK_Super_R)) {
+ m_super_mask = mask;
+ }
+ if (m_hyper_mask == 0
+ && m_alt_mask != mask
+ && m_meta_mask != mask
+ && m_super_mask != mask
+ && (sym == XK_Hyper_L || sym == XK_Hyper_R)) {
+ m_hyper_mask = mask;
+ }
+ if (m_mode_switch_mask == 0
+ && m_alt_mask != mask
+ && m_meta_mask != mask
+ && m_super_mask != mask
+ && m_hyper_mask != mask
+ && sym == XK_Mode_switch) {
+ m_mode_switch_mask = mask;
+ }
+ if (m_num_lock_mask == 0
+ && sym == XK_Num_Lock) {
+ m_num_lock_mask = mask;
+ }
+}
+
+int QXlibKeyboard::translateKeySym(uint key) const
+{
+ int code = -1;
+ int i = 0; // any other keys
+ while (KeyTbl[i]) {
+ if (key == KeyTbl[i]) {
+ code = (int)KeyTbl[i+1];
+ break;
+ }
+ i += 2;
+ }
+ if (m_meta_mask) {
+ // translate Super/Hyper keys to Meta if we're using them as the MetaModifier
+ if (m_meta_mask == m_super_mask && (code == Qt::Key_Super_L || code == Qt::Key_Super_R)) {
+ code = Qt::Key_Meta;
+ } else if (m_meta_mask == m_hyper_mask && (code == Qt::Key_Hyper_L || code == Qt::Key_Hyper_R)) {
+ code = Qt::Key_Meta;
+ }
+ }
+ return code;
+}
+
+QString QXlibKeyboard::translateKeySym(KeySym keysym, uint xmodifiers,
+ int &code, Qt::KeyboardModifiers &modifiers,
+ QByteArray &chars, int &count)
+{
+ // all keysyms smaller than 0xff00 are actally keys that can be mapped to unicode chars
+
+ QTextCodec *mapper = QTextCodec::codecForLocale();
+ QChar converted;
+
+ if (/*count == 0 &&*/ keysym < 0xff00) {
+ unsigned char byte3 = (unsigned char)(keysym >> 8);
+ int mib = -1;
+ switch(byte3) {
+ case 0: // Latin 1
+ case 1: // Latin 2
+ case 2: //latin 3
+ case 3: // latin4
+ mib = byte3 + 4; break;
+ case 5: // arabic
+ mib = 82; break;
+ case 12: // Hebrew
+ mib = 85; break;
+ case 13: // Thai
+ mib = 2259; break;
+ case 4: // kana
+ case 6: // cyrillic
+ case 7: // greek
+ case 8: // technical, no mapping here at the moment
+ case 9: // Special
+ case 10: // Publishing
+ case 11: // APL
+ case 14: // Korean, no mapping
+ mib = -1; // manual conversion
+ mapper= 0;
+#if !defined(QT_NO_XIM)
+ converted = keysymToUnicode(byte3, keysym & 0xff);
+#endif
+ case 0x20:
+ // currency symbols
+ if (keysym >= 0x20a0 && keysym <= 0x20ac) {
+ mib = -1; // manual conversion
+ mapper = 0;
+ converted = (uint)keysym;
+ }
+ break;
+ default:
+ break;
+ }
+ if (mib != -1) {
+ mapper = QTextCodec::codecForMib(mib);
+ if (chars.isEmpty())
+ chars.resize(1);
+ chars[0] = (unsigned char) (keysym & 0xff); // get only the fourth bit for conversion later
+ count = 1;
+ }
+ } else if (keysym >= 0x1000000 && keysym <= 0x100ffff) {
+ converted = (ushort) (keysym - 0x1000000);
+ mapper = 0;
+ }
+ if (count < (int)chars.size()-1)
+ chars[count] = '\0';
+
+ QString text;
+ if (!mapper && converted.unicode() != 0x0) {
+ text = converted;
+ } else if (!chars.isEmpty()) {
+ // convert chars (8bit) to text (unicode).
+ if (mapper)
+ text = mapper->toUnicode(chars.data(), count, 0);
+ if (text.isEmpty()) {
+ // no mapper, or codec couldn't convert to unicode (this
+ // can happen when running in the C locale or with no LANG
+ // set). try converting from latin-1
+ text = QString::fromLatin1(chars);
+ }
+ }
+
+ modifiers = translateModifiers(xmodifiers);
+
+ // Commentary in X11/keysymdef says that X codes match ASCII, so it
+ // is safe to use the locale functions to process X codes in ISO8859-1.
+ //
+ // This is mainly for compatibility - applications should not use the
+ // Qt keycodes between 128 and 255, but should rather use the
+ // QKeyEvent::text().
+ //
+ if (keysym < 128 || (keysym < 256 && (!mapper || mapper->mibEnum()==4))) {
+ // upper-case key, if known
+ code = isprint((int)keysym) ? toupper((int)keysym) : 0;
+ } else if (keysym >= XK_F1 && keysym <= XK_F35) {
+ // function keys
+ code = Qt::Key_F1 + ((int)keysym - XK_F1);
+ } else if (keysym >= XK_KP_Space && keysym <= XK_KP_9) {
+ if (keysym >= XK_KP_0) {
+ // numeric keypad keys
+ code = Qt::Key_0 + ((int)keysym - XK_KP_0);
+ } else {
+ code = translateKeySym(keysym);
+ }
+ modifiers |= Qt::KeypadModifier;
+ } else if (text.length() == 1 && text.unicode()->unicode() > 0x1f && text.unicode()->unicode() != 0x7f && !(keysym >= XK_dead_grave && keysym <= XK_dead_horn)) {
+ code = text.unicode()->toUpper().unicode();
+ } else {
+ // any other keys
+ code = translateKeySym(keysym);
+
+ if (code == Qt::Key_Tab && (modifiers & Qt::ShiftModifier)) {
+ // map shift+tab to shift+backtab, QShortcutMap knows about it
+ // and will handle it.
+ code = Qt::Key_Backtab;
+ text = QString();
+ }
+ }
+
+ return text;
+}
+
+QXlibKeyboard::QXlibKeyboard(QXlibScreen *screen)
+ : m_screen(screen)
+ , m_alt_mask(0)
+ , m_super_mask(0)
+ , m_hyper_mask(0)
+ , m_meta_mask(0)
+{
+ changeLayout();
+}
+
+void QXlibKeyboard::changeLayout()
+{
+ XkbDescPtr xkbDesc = XkbGetMap(m_screen->display()->nativeDisplay(), XkbAllClientInfoMask, XkbUseCoreKbd);
+ for (int i = xkbDesc->min_key_code; i < xkbDesc->max_key_code; ++i) {
+ const uint mask = xkbDesc->map->modmap ? xkbDesc->map->modmap[i] : 0;
+ if (mask == 0) {
+ // key is not bound to a modifier
+ continue;
+ }
+
+ for (int j = 0; j < XkbKeyGroupsWidth(xkbDesc, i); ++j) {
+ KeySym keySym = XkbKeySym(xkbDesc, i, j);
+ if (keySym == NoSymbol)
+ continue;
+ setMask(keySym, mask);
+ }
+ }
+ XkbFreeKeyboard(xkbDesc, XkbAllComponentsMask, true);
+
+}
+
+static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode)
+{
+ switch (qtcode) {
+ case Qt::Key_Control:
+ return Qt::ControlModifier;
+ case Qt::Key_Alt:
+ return Qt::AltModifier;
+ case Qt::Key_Shift:
+ return Qt::ShiftModifier;
+ case Qt::Key_Meta:
+ return Qt::MetaModifier;
+ default:
+ return Qt::NoModifier;
+ }
+}
+
+void QXlibKeyboard::handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev)
+{
+ int qtcode = 0;
+ Qt::KeyboardModifiers modifiers = translateModifiers(ev->state);
+ QByteArray chars;
+ chars.resize(513);
+ int count = 0;
+ KeySym keySym;
+ count = XLookupString(ev,chars.data(),chars.size(),&keySym,0);
+ QString text = translateKeySym(keySym,ev->state,qtcode,modifiers,chars,count);
+ QWindowSystemInterface::handleExtendedKeyEvent(widget,ev->time,type,qtcode,modifiers,ev->keycode,0,ev->state,text.left(count));
+}
diff --git a/src/plugins/platforms/xlib/qxlibkeyboard.h b/src/plugins/platforms/xlib/qxlibkeyboard.h
new file mode 100644
index 0000000000..5e0135afa6
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibkeyboard.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITEKEYBOARD_H
+#define QTESTLITEKEYBOARD_H
+
+#include "qxlibintegration.h"
+
+class QXlibKeyboard
+{
+public:
+ QXlibKeyboard(QXlibScreen *screen);
+
+ void changeLayout();
+
+ void handleKeyEvent(QWidget *widget, QEvent::Type type, XKeyEvent *ev);
+
+ Qt::KeyboardModifiers translateModifiers(int s);
+
+private:
+
+ void setMask(KeySym sym, uint mask);
+ int translateKeySym(uint key) const;
+ QString translateKeySym(KeySym keysym, uint xmodifiers,
+ int &code, Qt::KeyboardModifiers &modifiers,
+ QByteArray &chars, int &count);
+
+ QXlibScreen *m_screen;
+
+ uint m_alt_mask;
+ uint m_super_mask;
+ uint m_hyper_mask;
+ uint m_meta_mask;
+ uint m_mode_switch_mask;
+ uint m_num_lock_mask;
+};
+
+#endif // QTESTLITEKEYBOARD_H
diff --git a/src/plugins/platforms/xlib/qxlibmime.cpp b/src/plugins/platforms/xlib/qxlibmime.cpp
new file mode 100644
index 0000000000..e98983d340
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibmime.cpp
@@ -0,0 +1,322 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibmime.h"
+
+#include "qxlibstatic.h"
+#include "qxlibscreen.h"
+
+#include <QtCore/QTextCodec>
+#include <QtGui/QImageWriter>
+#include <QtCore/QBuffer>
+
+QXlibMime::QXlibMime()
+ : QInternalMimeData()
+{ }
+
+QXlibMime::~QXlibMime()
+{}
+
+
+
+
+
+QString QXlibMime::mimeAtomToString(Display *display, Atom a)
+{
+ if (!a) return 0;
+
+ if (a == XA_STRING || a == QXlibStatic::atom(QXlibStatic::UTF8_STRING)) {
+ return "text/plain"; // some Xdnd clients are dumb
+ }
+ char *atom = XGetAtomName(display, a);
+ QString result = QString::fromLatin1(atom);
+ XFree(atom);
+ return result;
+}
+
+Atom QXlibMime::mimeStringToAtom(Display *display, const QString &mimeType)
+{
+ if (mimeType.isEmpty())
+ return 0;
+ return XInternAtom(display, mimeType.toLatin1().constData(), False);
+}
+
+QStringList QXlibMime::mimeFormatsForAtom(Display *display, Atom a)
+{
+ QStringList formats;
+ if (a) {
+ QString atomName = mimeAtomToString(display, a);
+ formats.append(atomName);
+
+ // special cases for string type
+ if (a == QXlibStatic::atom(QXlibStatic::UTF8_STRING)
+ || a == XA_STRING
+ || a == QXlibStatic::atom(QXlibStatic::TEXT)
+ || a == QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT))
+ formats.append(QLatin1String("text/plain"));
+
+ // special cases for uris
+ if (atomName == QLatin1String("text/x-moz-url"))
+ formats.append(QLatin1String("text/uri-list"));
+
+ // special case for images
+ if (a == XA_PIXMAP)
+ formats.append(QLatin1String("image/ppm"));
+ }
+ return formats;
+}
+
+bool QXlibMime::mimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat)
+{
+ bool ret = false;
+ *atomFormat = a;
+ *dataFormat = 8;
+ QString atomName = mimeAtomToString(display, a);
+ if (QInternalMimeData::hasFormatHelper(atomName, mimeData)) {
+ *data = QInternalMimeData::renderDataHelper(atomName, mimeData);
+ if (atomName == QLatin1String("application/x-color"))
+ *dataFormat = 16;
+ ret = true;
+ } else {
+ if ((a == QXlibStatic::atom(QXlibStatic::UTF8_STRING)
+ || a == XA_STRING
+ || a == QXlibStatic::atom(QXlibStatic::TEXT)
+ || a == QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT))
+ && QInternalMimeData::hasFormatHelper(QLatin1String("text/plain"), mimeData)) {
+ if (a == QXlibStatic::atom(QXlibStatic::UTF8_STRING)){
+ *data = QInternalMimeData::renderDataHelper(QLatin1String("text/plain"), mimeData);
+ ret = true;
+ } else if (a == XA_STRING) {
+ *data = QString::fromUtf8(QInternalMimeData::renderDataHelper(
+ QLatin1String("text/plain"), mimeData)).toLocal8Bit();
+ ret = true;
+ } else if (a == QXlibStatic::atom(QXlibStatic::TEXT)
+ || a == QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT)) {
+ // the ICCCM states that TEXT and COMPOUND_TEXT are in the
+ // encoding of choice, so we choose the encoding of the locale
+ QByteArray strData = QString::fromUtf8(QInternalMimeData::renderDataHelper(
+ QLatin1String("text/plain"), mimeData)).toLocal8Bit();
+ char *list[] = { strData.data(), NULL };
+
+ XICCEncodingStyle style = (a == QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT))
+ ? XCompoundTextStyle : XStdICCTextStyle;
+ XTextProperty textprop;
+ if (list[0] != NULL
+ && XmbTextListToTextProperty(display, list, 1, style,
+ &textprop) == Success) {
+ *atomFormat = textprop.encoding;
+ *dataFormat = textprop.format;
+ *data = QByteArray((const char *) textprop.value, textprop.nitems * textprop.format / 8);
+ ret = true;
+
+ XFree(textprop.value);
+ }
+ }
+ } else if (atomName == QLatin1String("text/x-moz-url") &&
+ QInternalMimeData::hasFormatHelper(QLatin1String("text/uri-list"), mimeData)) {
+ QByteArray uri = QInternalMimeData::renderDataHelper(
+ QLatin1String("text/uri-list"), mimeData).split('\n').first();
+ QString mozUri = QString::fromLatin1(uri, uri.size());
+ mozUri += QLatin1Char('\n');
+ *data = QByteArray(reinterpret_cast<const char *>(mozUri.utf16()), mozUri.length() * 2);
+ ret = true;
+ } else if ((a == XA_PIXMAP || a == XA_BITMAP) && mimeData->hasImage()) {
+ ret = true;
+ }
+ }
+ return ret && data != 0;
+}
+
+QList<Atom> QXlibMime::mimeAtomsForFormat(Display *display, const QString &format)
+{
+ QList<Atom> atoms;
+ atoms.append(mimeStringToAtom(display, format));
+
+ // special cases for strings
+ if (format == QLatin1String("text/plain")) {
+ atoms.append(QXlibStatic::atom(QXlibStatic::UTF8_STRING));
+ atoms.append(XA_STRING);
+ atoms.append(QXlibStatic::atom(QXlibStatic::TEXT));
+ atoms.append(QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT));
+ }
+
+ // special cases for uris
+ if (format == QLatin1String("text/uri-list")) {
+ atoms.append(mimeStringToAtom(display,QLatin1String("text/x-moz-url")));
+ }
+
+ //special cases for images
+ if (format == QLatin1String("image/ppm"))
+ atoms.append(XA_PIXMAP);
+ if (format == QLatin1String("image/pbm"))
+ atoms.append(XA_BITMAP);
+
+ return atoms;
+}
+
+QVariant QXlibMime::mimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding)
+{
+ QString atomName = mimeAtomToString(display,a);
+ if (atomName == format)
+ return data;
+
+ if (!encoding.isEmpty()
+ && atomName == format + QLatin1String(";charset=") + QString::fromLatin1(encoding)) {
+
+ if (requestedType == QVariant::String) {
+ QTextCodec *codec = QTextCodec::codecForName(encoding);
+ if (codec)
+ return codec->toUnicode(data);
+ }
+
+ return data;
+ }
+
+ // special cases for string types
+ if (format == QLatin1String("text/plain")) {
+ if (a == QXlibStatic::atom(QXlibStatic::UTF8_STRING))
+ return QString::fromUtf8(data);
+ if (a == XA_STRING)
+ return QString::fromLatin1(data);
+ if (a == QXlibStatic::atom(QXlibStatic::TEXT)
+ || a == QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT))
+ // #### might be wrong for COMPUND_TEXT
+ return QString::fromLocal8Bit(data, data.size());
+ }
+
+ // special case for uri types
+ if (format == QLatin1String("text/uri-list")) {
+ if (atomName == QLatin1String("text/x-moz-url")) {
+ // we expect this as utf16 <url><space><title>
+ // the first part is a url that should only contain ascci char
+ // so it should be safe to check that the second char is 0
+ // to verify that it is utf16
+ if (data.size() > 1 && data.at(1) == 0)
+ return QString::fromRawData((const QChar *)data.constData(),
+ data.size() / 2).split(QLatin1Char('\n')).first().toLatin1();
+ }
+ }
+
+ // special cas for images
+ if (format == QLatin1String("image/ppm")) {
+ if (a == XA_PIXMAP && data.size() == sizeof(Pixmap)) {
+ Pixmap xpm = *((Pixmap*)data.data());
+ if (!xpm)
+ return QByteArray();
+ Window root;
+ int x;
+ int y;
+ uint width;
+ uint height;
+ uint border_width;
+ uint depth;
+
+ XGetGeometry(display, xpm, &root, &x, &y, &width, &height, &border_width, &depth);
+ XImage *ximg = XGetImage(display,xpm,x,y,width,height,AllPlanes,depth==1 ? XYPixmap : ZPixmap);
+ QImage qimg = QXlibStatic::qimageFromXImage(ximg);
+ XDestroyImage(ximg);
+
+ QImageWriter imageWriter;
+ imageWriter.setFormat("PPMRAW");
+ QBuffer buf;
+ buf.open(QIODevice::WriteOnly);
+ imageWriter.setDevice(&buf);
+ imageWriter.write(qimg);
+ return buf.buffer();
+ }
+ }
+ return QVariant();
+}
+
+Atom QXlibMime::mimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding)
+{
+ requestedEncoding->clear();
+
+ // find matches for string types
+ if (format == QLatin1String("text/plain")) {
+ if (atoms.contains(QXlibStatic::atom(QXlibStatic::UTF8_STRING)))
+ return QXlibStatic::atom(QXlibStatic::UTF8_STRING);
+ if (atoms.contains(QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT)))
+ return QXlibStatic::atom(QXlibStatic::COMPOUND_TEXT);
+ if (atoms.contains(QXlibStatic::atom(QXlibStatic::TEXT)))
+ return QXlibStatic::atom(QXlibStatic::TEXT);
+ if (atoms.contains(XA_STRING))
+ return XA_STRING;
+ }
+
+ // find matches for uri types
+ if (format == QLatin1String("text/uri-list")) {
+ Atom a = mimeStringToAtom(display,format);
+ if (a && atoms.contains(a))
+ return a;
+ a = mimeStringToAtom(display,QLatin1String("text/x-moz-url"));
+ if (a && atoms.contains(a))
+ return a;
+ }
+
+ // find match for image
+ if (format == QLatin1String("image/ppm")) {
+ if (atoms.contains(XA_PIXMAP))
+ return XA_PIXMAP;
+ }
+
+ // for string/text requests try to use a format with a well-defined charset
+ // first to avoid encoding problems
+ if (requestedType == QVariant::String
+ && format.startsWith(QLatin1String("text/"))
+ && !format.contains(QLatin1String("charset="))) {
+
+ QString formatWithCharset = format;
+ formatWithCharset.append(QLatin1String(";charset=utf-8"));
+
+ Atom a = mimeStringToAtom(display,formatWithCharset);
+ if (a && atoms.contains(a)) {
+ *requestedEncoding = "utf-8";
+ return a;
+ }
+ }
+
+ Atom a = mimeStringToAtom(display,format);
+ if (a && atoms.contains(a))
+ return a;
+
+ return 0;
+}
diff --git a/src/plugins/platforms/xlib/qxlibmime.h b/src/plugins/platforms/xlib/qxlibmime.h
new file mode 100644
index 0000000000..a9bc265f5b
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibmime.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITEMIME_H
+#define QTESTLITEMIME_H
+
+#include <private/qdnd_p.h>
+
+#include <QtGui/QClipboard>
+
+#include "qxlibintegration.h"
+#include "qxlibclipboard.h"
+
+class QXlibMime : public QInternalMimeData {
+ Q_OBJECT
+public:
+ QXlibMime();
+ ~QXlibMime();
+
+ static QList<Atom> mimeAtomsForFormat(Display *display, const QString &format);
+ static QString mimeAtomToString(Display *display, Atom a);
+ static bool mimeDataForAtom(Display *display, Atom a, QMimeData *mimeData, QByteArray *data, Atom *atomFormat, int *dataFormat);
+ static QStringList mimeFormatsForAtom(Display *display, Atom a);
+ static Atom mimeStringToAtom(Display *display, const QString &mimeType);
+ static QVariant mimeConvertToFormat(Display *display, Atom a, const QByteArray &data, const QString &format, QVariant::Type requestedType, const QByteArray &encoding);
+ static Atom mimeAtomForFormat(Display *display, const QString &format, QVariant::Type requestedType, const QList<Atom> &atoms, QByteArray *requestedEncoding);
+};
+
+#endif // QTESTLITEMIME_H
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.cpp b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
new file mode 100644
index 0000000000..4e950ffe2f
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibnativeinterface.h"
+
+#include "qxlibdisplay.h"
+#include <QtGui/private/qapplication_p.h>
+
+class QXlibResourceMap : public QMap<QByteArray, QXlibNativeInterface::ResourceType>
+{
+public:
+ QXlibResourceMap()
+ :QMap<QByteArray, QXlibNativeInterface::ResourceType>()
+ {
+ insert("display",QXlibNativeInterface::Display);
+ insert("egldisplay",QXlibNativeInterface::EglDisplay);
+ insert("connection",QXlibNativeInterface::Connection);
+ insert("screen",QXlibNativeInterface::Screen);
+ insert("graphicsdevice",QXlibNativeInterface::GraphicsDevice);
+ insert("eglcontext",QXlibNativeInterface::EglContext);
+ }
+};
+
+Q_GLOBAL_STATIC(QXlibResourceMap, qXlibResourceMap)
+
+
+void * QXlibNativeInterface::nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget)
+{
+ QByteArray lowerCaseResource = resourceString.toLower();
+ ResourceType resource = qXlibResourceMap()->value(lowerCaseResource);
+ void *result = 0;
+ switch(resource) {
+ case Display:
+ result = displayForWidget(widget);
+ break;
+ case EglDisplay:
+ result = eglDisplayForWidget(widget);
+ break;
+ case Connection:
+ result = connectionForWidget(widget);
+ break;
+ case Screen:
+ result = reinterpret_cast<void *>(qPlatformScreenForWidget(widget)->xScreenNumber());
+ break;
+ case GraphicsDevice:
+ result = graphicsDeviceForWidget(widget);
+ break;
+ case EglContext:
+ result = eglContextForWidget(widget);
+ break;
+ default:
+ result = 0;
+ }
+ return result;
+}
+
+void * QXlibNativeInterface::displayForWidget(QWidget *widget)
+{
+ return qPlatformScreenForWidget(widget)->display()->nativeDisplay();
+}
+
+void * QXlibNativeInterface::eglDisplayForWidget(QWidget *widget)
+{
+ Q_UNUSED(widget);
+ return 0;
+}
+
+void * QXlibNativeInterface::screenForWidget(QWidget *widget)
+{
+ Q_UNUSED(widget);
+ return 0;
+}
+
+void * QXlibNativeInterface::graphicsDeviceForWidget(QWidget *widget)
+{
+ Q_UNUSED(widget);
+ return 0;
+}
+
+void * QXlibNativeInterface::eglContextForWidget(QWidget *widget)
+{
+ Q_UNUSED(widget);
+ return 0;
+}
+
+QXlibScreen * QXlibNativeInterface::qPlatformScreenForWidget(QWidget *widget)
+{
+ QXlibScreen *screen;
+ if (widget) {
+ screen = static_cast<QXlibScreen *>(QPlatformScreen::platformScreenForWidget(widget));
+ }else {
+ screen = static_cast<QXlibScreen *>(QApplicationPrivate::platformIntegration()->screens()[0]);
+ }
+ return screen;
+}
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.h b/src/plugins/platforms/xlib/qxlibnativeinterface.h
new file mode 100644
index 0000000000..5ba0768272
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXLIBNATIVEINTERFACE_H
+#define QXLIBNATIVEINTERFACE_H
+
+#include "qxlibscreen.h"
+
+#include <QtGui/QPlatformNativeInterface>
+
+class QXlibNativeInterface : public QPlatformNativeInterface
+{
+public:
+ enum ResourceType {
+ Display,
+ EglDisplay,
+ Connection,
+ Screen,
+ GraphicsDevice,
+ EglContext
+ };
+
+ void *nativeResourceForWidget(const QByteArray &resourceString, QWidget *widget);
+
+ void *displayForWidget(QWidget *widget);
+ void *eglDisplayForWidget(QWidget *widget);
+ void *connectionForWidget(QWidget *widget);
+ void *screenForWidget(QWidget *widget);
+ void *graphicsDeviceForWidget(QWidget *widget);
+ void *eglContextForWidget(QWidget *widget);
+
+private:
+ static QXlibScreen *qPlatformScreenForWidget(QWidget *widget);
+};
+
+
+#endif // QXLIBNATIVEINTERFACE_H
diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp
new file mode 100644
index 0000000000..7c8a367373
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibscreen.cpp
@@ -0,0 +1,488 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibscreen.h"
+
+#include "qxlibcursor.h"
+#include "qxlibwindow.h"
+#include "qxlibkeyboard.h"
+#include "qxlibstatic.h"
+#include "qxlibclipboard.h"
+#include "qxlibdisplay.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QSocketNotifier>
+#include <QtCore/QElapsedTimer>
+
+#include <private/qapplication_p.h>
+
+#include <X11/extensions/Xfixes.h>
+
+QT_BEGIN_NAMESPACE
+
+static int (*original_x_errhandler)(Display *dpy, XErrorEvent *);
+static bool seen_badwindow;
+
+static int qt_x_errhandler(Display *dpy, XErrorEvent *err)
+{
+
+qDebug() << "qt_x_errhandler" << err->error_code;
+
+ switch (err->error_code) {
+ case BadAtom:
+#if 0
+ if (err->request_code == 20 /* X_GetProperty */
+ && (err->resourceid == XA_RESOURCE_MANAGER
+ || err->resourceid == XA_RGB_DEFAULT_MAP
+ || err->resourceid == ATOM(_NET_SUPPORTED)
+ || err->resourceid == ATOM(_NET_SUPPORTING_WM_CHECK)
+ || err->resourceid == ATOM(KDE_FULL_SESSION)
+ || err->resourceid == ATOM(KWIN_RUNNING)
+ || err->resourceid == ATOM(XdndProxy)
+ || err->resourceid == ATOM(XdndAware))
+
+
+ ) {
+ // Perhaps we're running under SECURITY reduction? :/
+ return 0;
+ }
+#endif
+ qDebug() << "BadAtom";
+ break;
+
+ case BadWindow:
+ if (err->request_code == 2 /* X_ChangeWindowAttributes */
+ || err->request_code == 38 /* X_QueryPointer */) {
+ for (int i = 0; i < ScreenCount(dpy); ++i) {
+ if (err->resourceid == RootWindow(dpy, i)) {
+ // Perhaps we're running under SECURITY reduction? :/
+ return 0;
+ }
+ }
+ }
+ seen_badwindow = true;
+ if (err->request_code == 25 /* X_SendEvent */) {
+ for (int i = 0; i < ScreenCount(dpy); ++i) {
+ if (err->resourceid == RootWindow(dpy, i)) {
+ // Perhaps we're running under SECURITY reduction? :/
+ return 0;
+ }
+ }
+#if 0
+ if (X11->xdndHandleBadwindow()) {
+ qDebug("xdndHandleBadwindow returned true");
+ return 0;
+ }
+#endif
+ }
+#if 0
+ if (X11->ignore_badwindow)
+ return 0;
+#endif
+ break;
+
+ case BadMatch:
+ if (err->request_code == 42 /* X_SetInputFocus */)
+ return 0;
+ break;
+
+ default:
+#if 0 //!defined(QT_NO_XINPUT)
+ if (err->request_code == X11->xinput_major
+ && err->error_code == (X11->xinput_errorbase + XI_BadDevice)
+ && err->minor_code == 3 /* X_OpenDevice */) {
+ return 0;
+ }
+#endif
+ break;
+ }
+
+ char errstr[256];
+ XGetErrorText( dpy, err->error_code, errstr, 256 );
+ char buffer[256];
+ char request_str[256];
+ qsnprintf(buffer, 256, "%d", err->request_code);
+ XGetErrorDatabaseText(dpy, "XRequest", buffer, "", request_str, 256);
+ if (err->request_code < 128) {
+ // X error for a normal protocol request
+ qWarning( "X Error: %s %d\n"
+ " Major opcode: %d (%s)\n"
+ " Resource id: 0x%lx",
+ errstr, err->error_code,
+ err->request_code,
+ request_str,
+ err->resourceid );
+ } else {
+ // X error for an extension request
+ const char *extensionName = 0;
+#if 0
+ if (err->request_code == X11->xrender_major)
+ extensionName = "RENDER";
+ else if (err->request_code == X11->xrandr_major)
+ extensionName = "RANDR";
+ else if (err->request_code == X11->xinput_major)
+ extensionName = "XInputExtension";
+ else if (err->request_code == X11->mitshm_major)
+ extensionName = "MIT-SHM";
+#endif
+ char minor_str[256];
+ if (extensionName) {
+ qsnprintf(buffer, 256, "%s.%d", extensionName, err->minor_code);
+ XGetErrorDatabaseText(dpy, "XRequest", buffer, "", minor_str, 256);
+ } else {
+ extensionName = "Uknown extension";
+ qsnprintf(minor_str, 256, "Unknown request");
+ }
+ qWarning( "X Error: %s %d\n"
+ " Extension: %d (%s)\n"
+ " Minor opcode: %d (%s)\n"
+ " Resource id: 0x%lx",
+ errstr, err->error_code,
+ err->request_code,
+ extensionName,
+ err->minor_code,
+ minor_str,
+ err->resourceid );
+ }
+
+ // ### we really should distinguish between severe, non-severe and
+ // ### application specific errors
+
+ return 0;
+}
+
+QXlibScreen::QXlibScreen()
+ : mFormat(QImage::Format_RGB32)
+#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
+ , mEGLDisplay(0)
+#endif
+{
+ char *display_name = getenv("DISPLAY");
+ Display *display = XOpenDisplay(display_name);
+ mDisplay = new QXlibDisplay(display);
+
+
+#ifndef DONT_USE_MIT_SHM
+ Status MIT_SHM_extension_supported = XShmQueryExtension (mDisplay->nativeDisplay());
+ Q_ASSERT(MIT_SHM_extension_supported == True);
+#endif
+ original_x_errhandler = XSetErrorHandler(qt_x_errhandler);
+
+ if (qgetenv("DO_X_SYNCHRONIZE").toInt())
+ XSynchronize(mDisplay->nativeDisplay(), true);
+
+ mScreen = DefaultScreen(mDisplay->nativeDisplay());
+ XSelectInput(mDisplay->nativeDisplay(),rootWindow(), KeymapStateMask | EnterWindowMask | LeaveWindowMask | PropertyChangeMask);
+ int width = DisplayWidth(mDisplay->nativeDisplay(), mScreen);
+ int height = DisplayHeight(mDisplay->nativeDisplay(), mScreen);
+ mGeometry = QRect(0,0,width,height);
+
+ int physicalWidth = DisplayWidthMM(mDisplay->nativeDisplay(), mScreen);
+ int physicalHeight = DisplayHeightMM(mDisplay->nativeDisplay(), mScreen);
+ mPhysicalSize = QSize(physicalWidth,physicalHeight);
+
+ int xSocketNumber = XConnectionNumber(mDisplay->nativeDisplay());
+
+ mDepth = DefaultDepth(mDisplay->nativeDisplay(),mScreen);
+#ifdef MYX11_DEBUG
+ qDebug() << "X socket:"<< xSocketNumber;
+#endif
+ QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this);
+ connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher()));
+
+ mCursor = new QXlibCursor(this);
+ mKeyboard = new QXlibKeyboard(this);
+}
+
+QXlibScreen::~QXlibScreen()
+{
+ delete mCursor;
+ delete mDisplay;
+}
+
+Window QXlibScreen::rootWindow()
+{
+ return RootWindow(mDisplay->nativeDisplay(), mScreen);
+}
+
+unsigned long QXlibScreen::blackPixel()
+{
+ return BlackPixel(mDisplay->nativeDisplay(), mScreen);
+}
+
+unsigned long QXlibScreen::whitePixel()
+{
+ return WhitePixel(mDisplay->nativeDisplay(), mScreen);
+}
+
+#ifdef KeyPress
+#undef KeyPress
+#endif
+#ifdef KeyRelease
+#undef KeyRelease
+#endif
+
+bool QXlibScreen::handleEvent(XEvent *xe)
+{
+ int quit = false;
+ QXlibWindow *platformWindow = 0;
+ QWidget *widget = QWidget::find(xe->xany.window);
+ if (widget) {
+ platformWindow = static_cast<QXlibWindow *>(widget->platformWindow());
+ }
+
+ Atom wmProtocolsAtom = QXlibStatic::atom(QXlibStatic::WM_PROTOCOLS);
+ Atom wmDeleteWindowAtom = QXlibStatic::atom(QXlibStatic::WM_DELETE_WINDOW);
+ switch (xe->type) {
+
+ case ClientMessage:
+ if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) {
+ Atom a = xe->xclient.data.l[0];
+ if (a == wmDeleteWindowAtom)
+ platformWindow->handleCloseEvent();
+ }
+ break;
+
+ case Expose:
+ if (platformWindow)
+ if (xe->xexpose.count == 0)
+ platformWindow->paintEvent();
+ break;
+ case ConfigureNotify:
+ if (platformWindow)
+ platformWindow->resizeEvent(&xe->xconfigure);
+ break;
+
+ case ButtonPress:
+ if (platformWindow)
+ platformWindow->mousePressEvent(&xe->xbutton);
+ break;
+
+ case ButtonRelease:
+ if (platformWindow)
+ platformWindow->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton);
+ break;
+
+ case MotionNotify:
+ if (platformWindow)
+ platformWindow->handleMouseEvent(QEvent::MouseMove, &xe->xbutton);
+ break;
+
+ case XKeyPress:
+ mKeyboard->handleKeyEvent(widget,QEvent::KeyPress, &xe->xkey);
+ break;
+
+ case XKeyRelease:
+ mKeyboard->handleKeyEvent(widget,QEvent::KeyRelease, &xe->xkey);
+ break;
+
+ case EnterNotify:
+ if (platformWindow)
+ platformWindow->handleEnterEvent();
+ break;
+
+ case LeaveNotify:
+ if (platformWindow)
+ platformWindow->handleLeaveEvent();
+ break;
+
+ case XFocusIn:
+ if (platformWindow)
+ platformWindow->handleFocusInEvent();
+ break;
+
+ case XFocusOut:
+ if (platformWindow)
+ platformWindow->handleFocusOutEvent();
+ break;
+
+ case PropertyNotify:
+ break;
+
+ case SelectionClear:
+ qDebug() << "Selection Clear!!!";
+ break;
+ case SelectionRequest:
+ handleSelectionRequest(xe);
+ break;
+ case SelectionNotify:
+ qDebug() << "Selection Notify!!!!";
+
+ break;
+
+
+ default:
+#ifdef MYX11_DEBUG
+ qDebug() << hex << xe->xany.window << "Other X event" << xe->type;
+#endif
+ break;
+ }
+
+ return quit;
+}
+
+static Bool checkForClipboardEvents(Display *, XEvent *e, XPointer)
+{
+ Atom clipboard = QXlibStatic::atom(QXlibStatic::CLIPBOARD);
+ return ((e->type == SelectionRequest && (e->xselectionrequest.selection == XA_PRIMARY
+ || e->xselectionrequest.selection == clipboard))
+ || (e->type == SelectionClear && (e->xselectionclear.selection == XA_PRIMARY
+ || e->xselectionclear.selection == clipboard)));
+}
+
+bool QXlibScreen::waitForClipboardEvent(Window win, int type, XEvent *event, int timeout)
+{
+ QElapsedTimer timer;
+ timer.start();
+ do {
+ if (XCheckTypedWindowEvent(mDisplay->nativeDisplay(),win,type,event))
+ return true;
+
+ // process other clipboard events, since someone is probably requesting data from us
+ XEvent e;
+ if (XCheckIfEvent(mDisplay->nativeDisplay(), &e, checkForClipboardEvents, 0))
+ handleEvent(&e);
+
+ mDisplay->flush();
+
+ // sleep 50 ms, so we don't use up CPU cycles all the time.
+ struct timeval usleep_tv;
+ usleep_tv.tv_sec = 0;
+ usleep_tv.tv_usec = 50000;
+ select(0, 0, 0, 0, &usleep_tv);
+ } while (timer.elapsed() < timeout);
+ return false;
+}
+
+void QXlibScreen::eventDispatcher()
+{
+ ulong marker = XNextRequest(mDisplay->nativeDisplay());
+ // int i = 0;
+ while (XPending(mDisplay->nativeDisplay())) {
+ XEvent event;
+ XNextEvent(mDisplay->nativeDisplay(), &event);
+ /* done = */
+ handleEvent(&event);
+
+ if (event.xany.serial >= marker) {
+ #ifdef MYX11_DEBUG
+ qDebug() << "potential livelock averted";
+ #endif
+ #if 0
+ if (XEventsQueued(mDisplay->nativeDisplay(), QueuedAfterFlush)) {
+ qDebug() << " with events queued";
+ QTimer::singleShot(0, this, SLOT(eventDispatcher()));
+ }
+ #endif
+ break;
+ }
+ }
+}
+
+QImage QXlibScreen::grabWindow(Window window, int x, int y, int w, int h)
+{
+ if (w == 0 || h ==0)
+ return QImage();
+
+ //WinId 0 means the desktop widget
+ if (!window)
+ window = rootWindow();
+
+ XWindowAttributes window_attr;
+ if (!XGetWindowAttributes(mDisplay->nativeDisplay(), window, &window_attr))
+ return QImage();
+
+ if (w < 0)
+ w = window_attr.width - x;
+ if (h < 0)
+ h = window_attr.height - y;
+
+ // Ideally, we should also limit ourselves to the screen area, but the Qt docs say
+ // that it's "unsafe" to go outside the screen, so we can ignore that problem.
+
+ //We're definitely not optimizing for speed...
+ XImage *xi = XGetImage(mDisplay->nativeDisplay(), window, x, y, w, h, AllPlanes, ZPixmap);
+
+ if (!xi)
+ return QImage();
+
+ //taking a copy to make sure we have ownership -- not fast
+ QImage result = QImage( (uchar*) xi->data, xi->width, xi->height, xi->bytes_per_line, QImage::Format_RGB32 ).copy();
+
+ XDestroyImage(xi);
+
+ return result;
+}
+
+QXlibScreen * QXlibScreen::testLiteScreenForWidget(QWidget *widget)
+{
+ QPlatformScreen *platformScreen = platformScreenForWidget(widget);
+ return static_cast<QXlibScreen *>(platformScreen);
+}
+
+QXlibDisplay * QXlibScreen::display() const
+{
+ return mDisplay;
+}
+
+int QXlibScreen::xScreenNumber() const
+{
+ return mScreen;
+}
+
+Visual * QXlibScreen::defaultVisual() const
+{
+ return DefaultVisual(display()->nativeDisplay(), xScreenNumber());
+}
+
+QXlibKeyboard * QXlibScreen::keyboard() const
+{
+ return mKeyboard;
+}
+
+void QXlibScreen::handleSelectionRequest(XEvent *event)
+{
+ QPlatformIntegration *integration = QApplicationPrivate::platformIntegration();
+ QXlibClipboard *clipboard = static_cast<QXlibClipboard *>(integration->clipboard());
+ clipboard->handleSelectionRequest(event);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibscreen.h b/src/plugins/platforms/xlib/qxlibscreen.h
new file mode 100644
index 0000000000..8c04c0fb38
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibscreen.h
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITESCREEN_H
+#define QTESTLITESCREEN_H
+
+#include <QtGui/QPlatformScreen>
+#include "qxlibintegration.h"
+
+QT_BEGIN_NAMESPACE
+
+class QXlibCursor;
+class QXlibKeyboard;
+class QXlibDisplay;
+
+class QXlibScreen : public QPlatformScreen
+{
+ Q_OBJECT
+public:
+ QXlibScreen();
+
+ ~QXlibScreen();
+
+ QRect geometry() const { return mGeometry; }
+ int depth() const { return mDepth; }
+ QImage::Format format() const { return mFormat; }
+ QSize physicalSize() const { return mPhysicalSize; }
+
+ Window rootWindow();
+ unsigned long blackPixel();
+ unsigned long whitePixel();
+
+ bool handleEvent(XEvent *xe);
+ bool waitForClipboardEvent(Window win, int type, XEvent *event, int timeout);
+
+ QImage grabWindow(Window window, int x, int y, int w, int h);
+
+ static QXlibScreen *testLiteScreenForWidget(QWidget *widget);
+
+ QXlibDisplay *display() const;
+ int xScreenNumber() const;
+
+ Visual *defaultVisual() const;
+
+ QXlibKeyboard *keyboard() const;
+
+#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
+ void *eglDisplay() const { return mEGLDisplay; }
+ void setEglDisplay(void *display) { mEGLDisplay = display; }
+#endif
+
+public slots:
+ void eventDispatcher();
+
+private:
+
+ void handleSelectionRequest(XEvent *event);
+ QRect mGeometry;
+ QSize mPhysicalSize;
+ int mDepth;
+ QImage::Format mFormat;
+ QXlibCursor *mCursor;
+ QXlibKeyboard *mKeyboard;
+
+ QXlibDisplay * mDisplay;
+#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
+ void *mEGLDisplay;
+#endif
+ int mScreen;
+};
+
+QT_END_NAMESPACE
+
+#endif // QTESTLITESCREEN_H
diff --git a/src/plugins/platforms/xlib/qxlibstatic.cpp b/src/plugins/platforms/xlib/qxlibstatic.cpp
new file mode 100644
index 0000000000..61177812d5
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibstatic.cpp
@@ -0,0 +1,512 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibstatic.h"
+#include "qxlibscreen.h"
+#include "qxlibdisplay.h"
+
+#include <qplatformdefs.h>
+
+#include <QtGui/private/qapplication_p.h>
+#include <QtCore/QBuffer>
+#include <QtCore/QLibrary>
+
+#include <QDebug>
+
+#ifndef QT_NO_XFIXES
+#include <X11/extensions/Xfixes.h>
+#endif // QT_NO_XFIXES
+
+static const char * x11_atomnames = {
+ // window-manager <-> client protocols
+ "WM_PROTOCOLS\0"
+ "WM_DELETE_WINDOW\0"
+ "WM_TAKE_FOCUS\0"
+ "_NET_WM_PING\0"
+ "_NET_WM_CONTEXT_HELP\0"
+ "_NET_WM_SYNC_REQUEST\0"
+ "_NET_WM_SYNC_REQUEST_COUNTER\0"
+
+ // ICCCM window state
+ "WM_STATE\0"
+ "WM_CHANGE_STATE\0"
+
+ // Session management
+ "WM_CLIENT_LEADER\0"
+ "WM_WINDOW_ROLE\0"
+ "SM_CLIENT_ID\0"
+
+ // Clipboard
+ "CLIPBOARD\0"
+ "INCR\0"
+ "TARGETS\0"
+ "MULTIPLE\0"
+ "TIMESTAMP\0"
+ "SAVE_TARGETS\0"
+ "CLIP_TEMPORARY\0"
+ "_QT_SELECTION\0"
+ "_QT_CLIPBOARD_SENTINEL\0"
+ "_QT_SELECTION_SENTINEL\0"
+ "CLIPBOARD_MANAGER\0"
+
+ "RESOURCE_MANAGER\0"
+
+ "_XSETROOT_ID\0"
+
+ "_QT_SCROLL_DONE\0"
+ "_QT_INPUT_ENCODING\0"
+
+ "_MOTIF_WM_HINTS\0"
+
+ "DTWM_IS_RUNNING\0"
+ "ENLIGHTENMENT_DESKTOP\0"
+ "_DT_SAVE_MODE\0"
+ "_SGI_DESKS_MANAGER\0"
+
+ // EWMH (aka NETWM)
+ "_NET_SUPPORTED\0"
+ "_NET_VIRTUAL_ROOTS\0"
+ "_NET_WORKAREA\0"
+
+ "_NET_MOVERESIZE_WINDOW\0"
+ "_NET_WM_MOVERESIZE\0"
+
+ "_NET_WM_NAME\0"
+ "_NET_WM_ICON_NAME\0"
+ "_NET_WM_ICON\0"
+
+ "_NET_WM_PID\0"
+
+ "_NET_WM_WINDOW_OPACITY\0"
+
+ "_NET_WM_STATE\0"
+ "_NET_WM_STATE_ABOVE\0"
+ "_NET_WM_STATE_BELOW\0"
+ "_NET_WM_STATE_FULLSCREEN\0"
+ "_NET_WM_STATE_MAXIMIZED_HORZ\0"
+ "_NET_WM_STATE_MAXIMIZED_VERT\0"
+ "_NET_WM_STATE_MODAL\0"
+ "_NET_WM_STATE_STAYS_ON_TOP\0"
+ "_NET_WM_STATE_DEMANDS_ATTENTION\0"
+
+ "_NET_WM_USER_TIME\0"
+ "_NET_WM_USER_TIME_WINDOW\0"
+ "_NET_WM_FULL_PLACEMENT\0"
+
+ "_NET_WM_WINDOW_TYPE\0"
+ "_NET_WM_WINDOW_TYPE_DESKTOP\0"
+ "_NET_WM_WINDOW_TYPE_DOCK\0"
+ "_NET_WM_WINDOW_TYPE_TOOLBAR\0"
+ "_NET_WM_WINDOW_TYPE_MENU\0"
+ "_NET_WM_WINDOW_TYPE_UTILITY\0"
+ "_NET_WM_WINDOW_TYPE_SPLASH\0"
+ "_NET_WM_WINDOW_TYPE_DIALOG\0"
+ "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU\0"
+ "_NET_WM_WINDOW_TYPE_POPUP_MENU\0"
+ "_NET_WM_WINDOW_TYPE_TOOLTIP\0"
+ "_NET_WM_WINDOW_TYPE_NOTIFICATION\0"
+ "_NET_WM_WINDOW_TYPE_COMBO\0"
+ "_NET_WM_WINDOW_TYPE_DND\0"
+ "_NET_WM_WINDOW_TYPE_NORMAL\0"
+ "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE\0"
+
+ "_KDE_NET_WM_FRAME_STRUT\0"
+
+ "_NET_STARTUP_INFO\0"
+ "_NET_STARTUP_INFO_BEGIN\0"
+
+ "_NET_SUPPORTING_WM_CHECK\0"
+
+ "_NET_WM_CM_S0\0"
+
+ "_NET_SYSTEM_TRAY_VISUAL\0"
+
+ "_NET_ACTIVE_WINDOW\0"
+
+ // Property formats
+ "COMPOUND_TEXT\0"
+ "TEXT\0"
+ "UTF8_STRING\0"
+
+ // xdnd
+ "XdndEnter\0"
+ "XdndPosition\0"
+ "XdndStatus\0"
+ "XdndLeave\0"
+ "XdndDrop\0"
+ "XdndFinished\0"
+ "XdndTypeList\0"
+ "XdndActionList\0"
+
+ "XdndSelection\0"
+
+ "XdndAware\0"
+ "XdndProxy\0"
+
+ "XdndActionCopy\0"
+ "XdndActionLink\0"
+ "XdndActionMove\0"
+ "XdndActionPrivate\0"
+
+ // Motif DND
+ "_MOTIF_DRAG_AND_DROP_MESSAGE\0"
+ "_MOTIF_DRAG_INITIATOR_INFO\0"
+ "_MOTIF_DRAG_RECEIVER_INFO\0"
+ "_MOTIF_DRAG_WINDOW\0"
+ "_MOTIF_DRAG_TARGETS\0"
+
+ "XmTRANSFER_SUCCESS\0"
+ "XmTRANSFER_FAILURE\0"
+
+ // Xkb
+ "_XKB_RULES_NAMES\0"
+
+ // XEMBED
+ "_XEMBED\0"
+ "_XEMBED_INFO\0"
+
+ // Wacom old. (before version 0.10)
+ "Wacom Stylus\0"
+ "Wacom Cursor\0"
+ "Wacom Eraser\0"
+
+ // Tablet
+ "STYLUS\0"
+ "ERASER\0"
+};
+
+/*!
+ \internal
+ Try to resolve a \a symbol from \a library with the version specified
+ by \a vernum.
+
+ Note that, in the case of the Xfixes library, \a vernum is not the same as
+ \c XFIXES_MAJOR - it is a part of soname and may differ from the Xfixes
+ version.
+*/
+static void* qt_load_library_runtime(const char *library, int vernum,
+ int highestVernum, const char *symbol)
+{
+ QList<int> versions;
+ // we try to load in the following order:
+ // explicit version -> the default one -> (from the highest (highestVernum) to the lowest (vernum) )
+ if (vernum != -1)
+ versions << vernum;
+ versions << -1;
+ if (vernum != -1) {
+ for(int i = highestVernum; i > vernum; --i)
+ versions << i;
+ }
+ Q_FOREACH(int version, versions) {
+ QLatin1String libName(library);
+ QLibrary xfixesLib(libName, version);
+ void *ptr = xfixesLib.resolve(symbol);
+ if (ptr)
+ return ptr;
+ }
+ return 0;
+}
+
+# define XFIXES_LOAD_RUNTIME(vernum, symbol, symbol_type) \
+ (symbol_type)qt_load_library_runtime("libXfixes", vernum, 4, #symbol);
+# define XFIXES_LOAD_V1(symbol) \
+ XFIXES_LOAD_RUNTIME(1, symbol, Ptr##symbol)
+# define XFIXES_LOAD_V2(symbol) \
+ XFIXES_LOAD_RUNTIME(2, symbol, Ptr##symbol)
+
+
+class QTestLiteStaticInfoPrivate
+{
+public:
+ QTestLiteStaticInfoPrivate()
+ : use_xfixes(false)
+ , xfixes_major(0)
+ , xfixes_eventbase(0)
+ , xfixes_errorbase(0)
+ {
+ QXlibScreen *screen = qobject_cast<QXlibScreen *> (QApplicationPrivate::platformIntegration()->screens().at(0));
+ Q_ASSERT(screen);
+
+ initializeAllAtoms(screen);
+ initializeSupportedAtoms(screen);
+
+ resolveXFixes(screen);
+ }
+
+ bool isSupportedByWM(Atom atom)
+ {
+ if (!m_supportedAtoms)
+ return false;
+
+ bool supported = false;
+ int i = 0;
+ while (m_supportedAtoms[i] != 0) {
+ if (m_supportedAtoms[i++] == atom) {
+ supported = true;
+ break;
+ }
+ }
+
+ return supported;
+ }
+
+ Atom atom(QXlibStatic::X11Atom atom)
+ {
+ return m_allAtoms[atom];
+ }
+
+ bool useXFixes() const { return use_xfixes; }
+
+ int xFixesEventBase() const {return xfixes_eventbase; }
+
+ PtrXFixesSelectSelectionInput xFixesSelectSelectionInput() const
+ {
+ return ptrXFixesSelectSelectionInput;
+ }
+
+ QImage qimageFromXImage(XImage *xi)
+ {
+ QImage::Format format = QImage::Format_ARGB32_Premultiplied;
+ if (xi->depth == 24)
+ format = QImage::Format_RGB32;
+ else if (xi->depth == 16)
+ format = QImage::Format_RGB16;
+
+ QImage image = QImage((uchar *)xi->data, xi->width, xi->height, xi->bytes_per_line, format).copy();
+
+ // we may have to swap the byte order
+ if ((QSysInfo::ByteOrder == QSysInfo::LittleEndian && xi->byte_order == MSBFirst)
+ || (QSysInfo::ByteOrder == QSysInfo::BigEndian && xi->byte_order == LSBFirst))
+ {
+ for (int i=0; i < image.height(); i++) {
+ if (xi->depth == 16) {
+ ushort *p = (ushort*)image.scanLine(i);
+ ushort *end = p + image.width();
+ while (p < end) {
+ *p = ((*p << 8) & 0xff00) | ((*p >> 8) & 0x00ff);
+ p++;
+ }
+ } else {
+ uint *p = (uint*)image.scanLine(i);
+ uint *end = p + image.width();
+ while (p < end) {
+ *p = ((*p << 24) & 0xff000000) | ((*p << 8) & 0x00ff0000)
+ | ((*p >> 8) & 0x0000ff00) | ((*p >> 24) & 0x000000ff);
+ p++;
+ }
+ }
+ }
+ }
+
+ // fix-up alpha channel
+ if (format == QImage::Format_RGB32) {
+ QRgb *p = (QRgb *)image.bits();
+ for (int y = 0; y < xi->height; ++y) {
+ for (int x = 0; x < xi->width; ++x)
+ p[x] |= 0xff000000;
+ p += xi->bytes_per_line / 4;
+ }
+ }
+
+ return image;
+ }
+
+
+private:
+
+ void initializeAllAtoms(QXlibScreen *screen) {
+ const char *names[QXlibStatic::NAtoms];
+ const char *ptr = x11_atomnames;
+
+ int i = 0;
+ while (*ptr) {
+ names[i++] = ptr;
+ while (*ptr)
+ ++ptr;
+ ++ptr;
+ }
+
+ Q_ASSERT(i == QXlibStatic::NPredefinedAtoms);
+
+ QByteArray settings_atom_name("_QT_SETTINGS_TIMESTAMP_");
+ settings_atom_name += XDisplayName(qPrintable(screen->display()->displayName()));
+ names[i++] = settings_atom_name;
+
+ Q_ASSERT(i == QXlibStatic::NAtoms);
+ #if 0//defined(XlibSpecificationRelease) && (XlibSpecificationRelease >= 6)
+ XInternAtoms(screen->display(), (char **)names, i, False, m_allAtoms);
+ #else
+ for (i = 0; i < QXlibStatic::NAtoms; ++i)
+ m_allAtoms[i] = XInternAtom(screen->display()->nativeDisplay(), (char *)names[i], False);
+ #endif
+ }
+
+ void initializeSupportedAtoms(QXlibScreen *screen)
+ {
+ Atom type;
+ int format;
+ long offset = 0;
+ unsigned long nitems, after;
+ unsigned char *data = 0;
+
+ int e = XGetWindowProperty(screen->display()->nativeDisplay(), screen->rootWindow(),
+ this->atom(QXlibStatic::_NET_SUPPORTED), 0, 0,
+ False, XA_ATOM, &type, &format, &nitems, &after, &data);
+ if (data)
+ XFree(data);
+
+ if (e == Success && type == XA_ATOM && format == 32) {
+ QBuffer ts;
+ ts.open(QIODevice::WriteOnly);
+
+ while (after > 0) {
+ XGetWindowProperty(screen->display()->nativeDisplay(), screen->rootWindow(),
+ this->atom(QXlibStatic::_NET_SUPPORTED), offset, 1024,
+ False, XA_ATOM, &type, &format, &nitems, &after, &data);
+
+ if (type == XA_ATOM && format == 32) {
+ ts.write(reinterpret_cast<char *>(data), nitems * sizeof(long));
+ offset += nitems;
+ } else
+ after = 0;
+ if (data)
+ XFree(data);
+ }
+
+ // compute nitems
+ QByteArray buffer(ts.buffer());
+ nitems = buffer.size() / sizeof(Atom);
+ m_supportedAtoms = new Atom[nitems + 1];
+ Atom *a = (Atom *) buffer.data();
+ uint i;
+ for (i = 0; i < nitems; i++)
+ m_supportedAtoms[i] = a[i];
+ m_supportedAtoms[nitems] = 0;
+
+ }
+ }
+
+ void resolveXFixes(QXlibScreen *screen)
+ {
+#ifndef QT_NO_XFIXES
+ // See if Xfixes is supported on the connected display
+ if (XQueryExtension(screen->display()->nativeDisplay(), "XFIXES", &xfixes_major,
+ &xfixes_eventbase, &xfixes_errorbase)) {
+ ptrXFixesQueryExtension = XFIXES_LOAD_V1(XFixesQueryExtension);
+ ptrXFixesQueryVersion = XFIXES_LOAD_V1(XFixesQueryVersion);
+ ptrXFixesSetCursorName = XFIXES_LOAD_V2(XFixesSetCursorName);
+ ptrXFixesSelectSelectionInput = XFIXES_LOAD_V2(XFixesSelectSelectionInput);
+
+ if(ptrXFixesQueryExtension && ptrXFixesQueryVersion
+ && ptrXFixesQueryExtension(screen->display()->nativeDisplay(), &xfixes_eventbase,
+ &xfixes_errorbase)) {
+ // Xfixes is supported.
+ // Note: the XFixes protocol version is negotiated using QueryVersion.
+ // We supply the highest version we support, the X server replies with
+ // the highest version it supports, but no higher than the version we
+ // asked for. The version sent back is the protocol version the X server
+ // will use to talk us. If this call is removed, the behavior of the
+ // X server when it receives an XFixes request is undefined.
+ int major = 3;
+ int minor = 0;
+ ptrXFixesQueryVersion(screen->display()->nativeDisplay(), &major, &minor);
+ use_xfixes = (major >= 1);
+ xfixes_major = major;
+ }
+ }
+#endif // QT_NO_XFIXES
+
+ }
+
+ Atom *m_supportedAtoms;
+ Atom m_allAtoms[QXlibStatic::NAtoms];
+
+#ifndef QT_NO_XFIXES
+ PtrXFixesQueryExtension ptrXFixesQueryExtension;
+ PtrXFixesQueryVersion ptrXFixesQueryVersion;
+ PtrXFixesSetCursorName ptrXFixesSetCursorName;
+ PtrXFixesSelectSelectionInput ptrXFixesSelectSelectionInput;
+#endif
+
+ bool use_xfixes;
+ int xfixes_major;
+ int xfixes_eventbase;
+ int xfixes_errorbase;
+
+};
+Q_GLOBAL_STATIC(QTestLiteStaticInfoPrivate, qTestLiteStaticInfoPrivate);
+
+
+Atom QXlibStatic::atom(QXlibStatic::X11Atom atom)
+{
+ return qTestLiteStaticInfoPrivate()->atom(atom);
+}
+
+bool QXlibStatic::isSupportedByWM(Atom atom)
+{
+ return qTestLiteStaticInfoPrivate()->isSupportedByWM(atom);
+}
+
+bool QXlibStatic::useXFixes()
+{
+ return qTestLiteStaticInfoPrivate()->useXFixes();
+}
+
+int QXlibStatic::xFixesEventBase()
+{
+ return qTestLiteStaticInfoPrivate()->xFixesEventBase();
+}
+
+#ifndef QT_NO_XFIXES
+PtrXFixesSelectSelectionInput QXlibStatic::xFixesSelectSelectionInput()
+{
+ qDebug() << qTestLiteStaticInfoPrivate()->useXFixes();
+ if (!qTestLiteStaticInfoPrivate()->useXFixes())
+ return 0;
+
+ return qTestLiteStaticInfoPrivate()->xFixesSelectSelectionInput();
+}
+
+QImage QXlibStatic::qimageFromXImage(XImage *xi)
+{
+ return qTestLiteStaticInfoPrivate()->qimageFromXImage(xi);
+}
+#endif //QT_NO_XFIXES
diff --git a/src/plugins/platforms/xlib/qxlibstatic.h b/src/plugins/platforms/xlib/qxlibstatic.h
new file mode 100644
index 0000000000..72cfaec54c
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibstatic.h
@@ -0,0 +1,413 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITESTATICINFO_H
+#define QTESTLITESTATICINFO_H
+
+#include <QtCore/QTextStream>
+#include <QtCore/QDataStream>
+#include <QtCore/QMetaType>
+#include <QtCore/QVariant>
+
+#if defined(_XLIB_H_) // crude hack, but...
+#error "cannot include <X11/Xlib.h> before this file"
+#endif
+#define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback
+#define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback
+#define XSetIMValues qt_XSetIMValues
+#include <X11/Xlib.h>
+#undef XRegisterIMInstantiateCallback
+#undef XUnregisterIMInstantiateCallback
+#undef XSetIMValues
+
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#ifdef index
+# undef index
+#endif
+#ifdef rindex
+# undef rindex
+#endif
+#ifdef Q_OS_VXWORS
+# ifdef open
+# undef open
+# endif
+# ifdef getpid
+# undef getpid
+# endif
+#endif // Q_OS_VXWORKS
+#include <X11/Xatom.h>
+
+//#define QT_NO_SHAPE
+#ifdef QT_NO_SHAPE
+# define XShapeCombineRegion(a,b,c,d,e,f,g)
+# define XShapeCombineMask(a,b,c,d,e,f,g)
+#else
+# include <X11/extensions/shape.h>
+#endif // QT_NO_SHAPE
+
+
+#if !defined (QT_NO_TABLET)
+# include <X11/extensions/XInput.h>
+#if defined (Q_OS_IRIX)
+# include <X11/extensions/SGIMisc.h>
+# include <wacom.h>
+#endif
+#endif // QT_NO_TABLET
+
+
+// #define QT_NO_XINERAMA
+#ifndef QT_NO_XINERAMA
+// XFree86 does not C++ify Xinerama (at least up to XFree86 4.0.3).
+extern "C" {
+# include <X11/extensions/Xinerama.h>
+}
+#endif // QT_NO_XINERAMA
+
+// #define QT_NO_XRANDR
+#ifndef QT_NO_XRANDR
+# include <X11/extensions/Xrandr.h>
+#endif // QT_NO_XRANDR
+
+// #define QT_NO_XRENDER
+#ifndef QT_NO_XRENDER
+# include <X11/extensions/Xrender.h>
+#endif // QT_NO_XRENDER
+
+#ifndef QT_NO_XSYNC
+extern "C" {
+# include "X11/extensions/sync.h"
+}
+#endif
+
+// #define QT_NO_XKB
+#ifndef QT_NO_XKB
+# include <X11/XKBlib.h>
+#endif // QT_NO_XKB
+
+
+#if !defined(XlibSpecificationRelease)
+# define X11R4
+typedef char *XPointer;
+#else
+# undef X11R4
+#endif
+
+#ifndef QT_NO_XFIXES
+typedef Bool (*PtrXFixesQueryExtension)(Display *, int *, int *);
+typedef Status (*PtrXFixesQueryVersion)(Display *, int *, int *);
+typedef void (*PtrXFixesSetCursorName)(Display *dpy, Cursor cursor, const char *name);
+typedef void (*PtrXFixesSelectSelectionInput)(Display *dpy, Window win, Atom selection, unsigned long eventMask);
+#endif // QT_NO_XFIXES
+
+#ifndef QT_NO_XCURSOR
+#include <X11/Xcursor/Xcursor.h>
+typedef Cursor (*PtrXcursorLibraryLoadCursor)(Display *, const char *);
+#endif // QT_NO_XCURSOR
+
+#ifndef QT_NO_XINERAMA
+typedef Bool (*PtrXineramaQueryExtension)(Display *dpy, int *event_base, int *error_base);
+typedef Bool (*PtrXineramaIsActive)(Display *dpy);
+typedef XineramaScreenInfo *(*PtrXineramaQueryScreens)(Display *dpy, int *number);
+#endif // QT_NO_XINERAMA
+
+#ifndef QT_NO_XRANDR
+typedef void (*PtrXRRSelectInput)(Display *, Window, int);
+typedef int (*PtrXRRUpdateConfiguration)(XEvent *);
+typedef int (*PtrXRRRootToScreen)(Display *, Window);
+typedef Bool (*PtrXRRQueryExtension)(Display *, int *, int *);
+#endif // QT_NO_XRANDR
+
+#ifndef QT_NO_XINPUT
+typedef int (*PtrXCloseDevice)(Display *, XDevice *);
+typedef XDeviceInfo* (*PtrXListInputDevices)(Display *, int *);
+typedef XDevice* (*PtrXOpenDevice)(Display *, XID);
+typedef void (*PtrXFreeDeviceList)(XDeviceInfo *);
+typedef int (*PtrXSelectExtensionEvent)(Display *, Window, XEventClass *, int);
+#endif // QT_NO_XINPUT
+
+/*
+ * Solaris patch 108652-47 and higher fixes crases in
+ * XRegisterIMInstantiateCallback, but the function doesn't seem to
+ * work.
+ *
+ * Instead, we disabled R6 input, and open the input method
+ * immediately at application start.
+ */
+
+//######### XFree86 has wrong declarations for XRegisterIMInstantiateCallback
+//######### and XUnregisterIMInstantiateCallback in at least version 3.3.2.
+//######### Many old X11R6 header files lack XSetIMValues.
+//######### Therefore, we have to declare these functions ourselves.
+
+extern "C" Bool XRegisterIMInstantiateCallback(
+ Display*,
+ struct _XrmHashBucketRec*,
+ char*,
+ char*,
+ XIMProc, //XFree86 has XIDProc, which has to be wrong
+ XPointer
+);
+
+extern "C" Bool XUnregisterIMInstantiateCallback(
+ Display*,
+ struct _XrmHashBucketRec*,
+ char*,
+ char*,
+ XIMProc, //XFree86 has XIDProc, which has to be wrong
+ XPointer
+);
+
+#ifndef X11R4
+# include <X11/Xlocale.h>
+#endif // X11R4
+
+
+#ifndef QT_NO_MITSHM
+# include <X11/extensions/XShm.h>
+#endif // QT_NO_MITSHM
+
+// rename a couple of X defines to get rid of name clashes
+// resolve the conflict between X11's FocusIn and QEvent::FocusIn
+enum {
+ XFocusOut = FocusOut,
+ XFocusIn = FocusIn,
+ XKeyPress = KeyPress,
+ XKeyRelease = KeyRelease,
+ XNone = None,
+ XRevertToParent = RevertToParent,
+ XGrayScale = GrayScale,
+ XCursorShape = CursorShape
+};
+#undef FocusOut
+#undef FocusIn
+#undef KeyPress
+#undef KeyRelease
+#undef None
+#undef RevertToParent
+#undef GrayScale
+#undef CursorShape
+
+#ifdef FontChange
+#undef FontChange
+#endif
+
+
+class QXlibStatic
+{
+public:
+ enum X11Atom {
+ // window-manager <-> client protocols
+ WM_PROTOCOLS,
+ WM_DELETE_WINDOW,
+ WM_TAKE_FOCUS,
+ _NET_WM_PING,
+ _NET_WM_CONTEXT_HELP,
+ _NET_WM_SYNC_REQUEST,
+ _NET_WM_SYNC_REQUEST_COUNTER,
+
+ // ICCCM window state
+ WM_STATE,
+ WM_CHANGE_STATE,
+
+ // Session management
+ WM_CLIENT_LEADER,
+ WM_WINDOW_ROLE,
+ SM_CLIENT_ID,
+
+ // Clipboard
+ CLIPBOARD,
+ INCR,
+ TARGETS,
+ MULTIPLE,
+ TIMESTAMP,
+ SAVE_TARGETS,
+ CLIP_TEMPORARY,
+ _QT_SELECTION,
+ _QT_CLIPBOARD_SENTINEL,
+ _QT_SELECTION_SENTINEL,
+ CLIPBOARD_MANAGER,
+
+ RESOURCE_MANAGER,
+
+ _XSETROOT_ID,
+
+ _QT_SCROLL_DONE,
+ _QT_INPUT_ENCODING,
+
+ _MOTIF_WM_HINTS,
+
+ DTWM_IS_RUNNING,
+ ENLIGHTENMENT_DESKTOP,
+ _DT_SAVE_MODE,
+ _SGI_DESKS_MANAGER,
+
+ // EWMH (aka NETWM)
+ _NET_SUPPORTED,
+ _NET_VIRTUAL_ROOTS,
+ _NET_WORKAREA,
+
+ _NET_MOVERESIZE_WINDOW,
+ _NET_WM_MOVERESIZE,
+
+ _NET_WM_NAME,
+ _NET_WM_ICON_NAME,
+ _NET_WM_ICON,
+
+ _NET_WM_PID,
+
+ _NET_WM_WINDOW_OPACITY,
+
+ _NET_WM_STATE,
+ _NET_WM_STATE_ABOVE,
+ _NET_WM_STATE_BELOW,
+ _NET_WM_STATE_FULLSCREEN,
+ _NET_WM_STATE_MAXIMIZED_HORZ,
+ _NET_WM_STATE_MAXIMIZED_VERT,
+ _NET_WM_STATE_MODAL,
+ _NET_WM_STATE_STAYS_ON_TOP,
+ _NET_WM_STATE_DEMANDS_ATTENTION,
+
+ _NET_WM_USER_TIME,
+ _NET_WM_USER_TIME_WINDOW,
+ _NET_WM_FULL_PLACEMENT,
+
+ _NET_WM_WINDOW_TYPE,
+ _NET_WM_WINDOW_TYPE_DESKTOP,
+ _NET_WM_WINDOW_TYPE_DOCK,
+ _NET_WM_WINDOW_TYPE_TOOLBAR,
+ _NET_WM_WINDOW_TYPE_MENU,
+ _NET_WM_WINDOW_TYPE_UTILITY,
+ _NET_WM_WINDOW_TYPE_SPLASH,
+ _NET_WM_WINDOW_TYPE_DIALOG,
+ _NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
+ _NET_WM_WINDOW_TYPE_POPUP_MENU,
+ _NET_WM_WINDOW_TYPE_TOOLTIP,
+ _NET_WM_WINDOW_TYPE_NOTIFICATION,
+ _NET_WM_WINDOW_TYPE_COMBO,
+ _NET_WM_WINDOW_TYPE_DND,
+ _NET_WM_WINDOW_TYPE_NORMAL,
+ _KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
+
+ _KDE_NET_WM_FRAME_STRUT,
+
+ _NET_STARTUP_INFO,
+ _NET_STARTUP_INFO_BEGIN,
+
+ _NET_SUPPORTING_WM_CHECK,
+
+ _NET_WM_CM_S0,
+
+ _NET_SYSTEM_TRAY_VISUAL,
+
+ _NET_ACTIVE_WINDOW,
+
+ // Property formats
+ COMPOUND_TEXT,
+ TEXT,
+ UTF8_STRING,
+
+ // Xdnd
+ XdndEnter,
+ XdndPosition,
+ XdndStatus,
+ XdndLeave,
+ XdndDrop,
+ XdndFinished,
+ XdndTypelist,
+ XdndActionList,
+
+ XdndSelection,
+
+ XdndAware,
+ XdndProxy,
+
+ XdndActionCopy,
+ XdndActionLink,
+ XdndActionMove,
+ XdndActionPrivate,
+
+ // Motif DND
+ _MOTIF_DRAG_AND_DROP_MESSAGE,
+ _MOTIF_DRAG_INITIATOR_INFO,
+ _MOTIF_DRAG_RECEIVER_INFO,
+ _MOTIF_DRAG_WINDOW,
+ _MOTIF_DRAG_TARGETS,
+
+ XmTRANSFER_SUCCESS,
+ XmTRANSFER_FAILURE,
+
+ // Xkb
+ _XKB_RULES_NAMES,
+
+ // XEMBED
+ _XEMBED,
+ _XEMBED_INFO,
+
+ XWacomStylus,
+ XWacomCursor,
+ XWacomEraser,
+
+ XTabletStylus,
+ XTabletEraser,
+
+ NPredefinedAtoms,
+
+ _QT_SETTINGS_TIMESTAMP = NPredefinedAtoms,
+ NAtoms
+ };
+
+ static Atom atom(X11Atom atom);
+ static bool isSupportedByWM(Atom atom);
+
+ static bool useXFixes();
+ static int xFixesEventBase();
+
+ #ifndef QT_NO_XFIXES
+ static PtrXFixesSelectSelectionInput xFixesSelectSelectionInput();
+ #endif //QT_NO_XFIXES
+
+ static QImage qimageFromXImage(XImage *xi);
+
+
+};
+
+#endif // QTESTLITESTATICINFO_H
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
new file mode 100644
index 0000000000..9a05fc620d
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -0,0 +1,737 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibwindow.h"
+
+#include "qxlibintegration.h"
+#include "qxlibscreen.h"
+#include "qxlibkeyboard.h"
+#include "qxlibstatic.h"
+#include "qxlibdisplay.h"
+
+#include <QtGui/QWindowSystemInterface>
+#include <QSocketNotifier>
+#include <QApplication>
+#include <QDebug>
+
+#include <QtGui/private/qwindowsurface_p.h>
+#include <QtGui/private/qapplication_p.h>
+
+#if !defined(QT_NO_OPENGL)
+#if !defined(QT_OPENGL_ES_2)
+#include "qglxintegration.h"
+#include "qglxconvenience.h"
+#else
+#include "../eglconvenience/qeglconvenience.h"
+#include "../eglconvenience/qeglplatformcontext.h"
+#include "../eglconvenience/qxlibeglintegration.h"
+#endif //QT_OPENGL_ES_2
+#endif //QT_NO_OPENGL
+
+//#define MYX11_DEBUG
+
+QT_BEGIN_NAMESPACE
+
+QXlibWindow::QXlibWindow(QWidget *window)
+ : QPlatformWindow(window)
+ , mGLContext(0)
+ , mScreen(QXlibScreen::testLiteScreenForWidget(window))
+{
+ int x = window->x();
+ int y = window->y();
+ int w = window->width();
+ int h = window->height();
+
+ if(window->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
+ && QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL) ) {
+#if !defined(QT_NO_OPENGL)
+#if !defined(QT_OPENGL_ES_2)
+ XVisualInfo *visualInfo = qglx_findVisualInfo(mScreen->display()->nativeDisplay(),mScreen->xScreenNumber(),window->platformWindowFormat());
+#else
+ QPlatformWindowFormat windowFormat = correctColorBuffers(window->platformWindowFormat());
+
+ EGLDisplay eglDisplay = mScreen->eglDisplay();
+ EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,windowFormat);
+ VisualID id = QXlibEglIntegration::getCompatibleVisualId(mScreen->display()->nativeDisplay(), eglDisplay, eglConfig);
+
+ XVisualInfo visualInfoTemplate;
+ memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+ visualInfoTemplate.visualid = id;
+
+ XVisualInfo *visualInfo;
+ int matchingCount = 0;
+ visualInfo = XGetVisualInfo(mScreen->display()->nativeDisplay(), VisualIDMask, &visualInfoTemplate, &matchingCount);
+#endif //!defined(QT_OPENGL_ES_2)
+ if (visualInfo) {
+ Colormap cmap = XCreateColormap(mScreen->display()->nativeDisplay(),mScreen->rootWindow(),visualInfo->visual,AllocNone);
+
+ XSetWindowAttributes a;
+ a.colormap = cmap;
+ x_window = XCreateWindow(mScreen->display()->nativeDisplay(), mScreen->rootWindow(),x, y, w, h,
+ 0, visualInfo->depth, InputOutput, visualInfo->visual,
+ CWColormap, &a);
+ } else {
+ qFatal("no window!");
+ }
+#endif //!defined(QT_NO_OPENGL)
+ } else {
+ x_window = XCreateSimpleWindow(mScreen->display()->nativeDisplay(), mScreen->rootWindow(),
+ x, y, w, h, 0 /*border_width*/,
+ mScreen->blackPixel(), mScreen->whitePixel());
+ }
+
+#ifdef MYX11_DEBUG
+ qDebug() << "QTestLiteWindow::QTestLiteWindow creating" << hex << x_window << window;
+#endif
+
+ XSetWindowBackgroundPixmap(mScreen->display()->nativeDisplay(), x_window, XNone);
+
+ XSelectInput(mScreen->display()->nativeDisplay(), x_window,
+ ExposureMask | KeyPressMask | KeyReleaseMask |
+ EnterWindowMask | LeaveWindowMask | FocusChangeMask |
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask |
+ ButtonMotionMask | PropertyChangeMask |
+ StructureNotifyMask);
+
+ gc = createGC();
+
+ Atom protocols[5];
+ int n = 0;
+ protocols[n++] = QXlibStatic::atom(QXlibStatic::WM_DELETE_WINDOW); // support del window protocol
+ protocols[n++] = QXlibStatic::atom(QXlibStatic::WM_TAKE_FOCUS); // support take focus window protocol
+// protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_PING); // support _NET_WM_PING protocol
+#ifndef QT_NO_XSYNC
+ protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_SYNC_REQUEST); // support _NET_WM_SYNC_REQUEST protocol
+#endif // QT_NO_XSYNC
+ if (window->windowFlags() & Qt::WindowContextHelpButtonHint)
+ protocols[n++] = QXlibStatic::atom(QXlibStatic::_NET_WM_CONTEXT_HELP);
+ XSetWMProtocols(mScreen->display()->nativeDisplay(), x_window, protocols, n);
+}
+
+
+
+QXlibWindow::~QXlibWindow()
+{
+#ifdef MYX11_DEBUG
+ qDebug() << "~QTestLiteWindow" << hex << x_window;
+#endif
+ delete mGLContext;
+ XFreeGC(mScreen->display()->nativeDisplay(), gc);
+ XDestroyWindow(mScreen->display()->nativeDisplay(), x_window);
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Mouse event stuff
+static Qt::MouseButtons translateMouseButtons(int s)
+{
+ Qt::MouseButtons ret = 0;
+ if (s & Button1Mask)
+ ret |= Qt::LeftButton;
+ if (s & Button2Mask)
+ ret |= Qt::MidButton;
+ if (s & Button3Mask)
+ ret |= Qt::RightButton;
+ return ret;
+}
+
+
+
+void QXlibWindow::handleMouseEvent(QEvent::Type type, XButtonEvent *e)
+{
+ static QPoint mousePoint;
+
+ Qt::MouseButton button = Qt::NoButton;
+ Qt::MouseButtons buttons = translateMouseButtons(e->state);
+ Qt::KeyboardModifiers modifiers = mScreen->keyboard()->translateModifiers(e->state);
+ if (type != QEvent::MouseMove) {
+ switch (e->button) {
+ case Button1: button = Qt::LeftButton; break;
+ case Button2: button = Qt::MidButton; break;
+ case Button3: button = Qt::RightButton; break;
+ case Button4:
+ case Button5:
+ case 6:
+ case 7: {
+ //mouse wheel
+ if (type == QEvent::MouseButtonPress) {
+ //logic borrowed from qapplication_x11.cpp
+ int delta = 120 * ((e->button == Button4 || e->button == 6) ? 1 : -1);
+ bool hor = (((e->button == Button4 || e->button == Button5)
+ && (modifiers & Qt::AltModifier))
+ || (e->button == 6 || e->button == 7));
+ QWindowSystemInterface::handleWheelEvent(widget(), e->time,
+ QPoint(e->x, e->y),
+ QPoint(e->x_root, e->y_root),
+ delta, hor ? Qt::Horizontal : Qt::Vertical);
+ }
+ return;
+ }
+ default: break;
+ }
+ }
+
+ buttons ^= button; // X event uses state *before*, Qt uses state *after*
+
+ QWindowSystemInterface::handleMouseEvent(widget(), e->time, QPoint(e->x, e->y),
+ QPoint(e->x_root, e->y_root),
+ buttons);
+
+ mousePoint = QPoint(e->x_root, e->y_root);
+}
+
+void QXlibWindow::handleCloseEvent()
+{
+ QWindowSystemInterface::handleCloseEvent(widget());
+}
+
+
+void QXlibWindow::handleEnterEvent()
+{
+ QWindowSystemInterface::handleEnterEvent(widget());
+}
+
+void QXlibWindow::handleLeaveEvent()
+{
+ QWindowSystemInterface::handleLeaveEvent(widget());
+}
+
+void QXlibWindow::handleFocusInEvent()
+{
+ QWindowSystemInterface::handleWindowActivated(widget());
+}
+
+void QXlibWindow::handleFocusOutEvent()
+{
+ QWindowSystemInterface::handleWindowActivated(0);
+}
+
+
+
+void QXlibWindow::setGeometry(const QRect &rect)
+{
+ XMoveResizeWindow(mScreen->display()->nativeDisplay(), x_window, rect.x(), rect.y(), rect.width(), rect.height());
+ QPlatformWindow::setGeometry(rect);
+}
+
+
+Qt::WindowFlags QXlibWindow::windowFlags() const
+{
+ return mWindowFlags;
+}
+
+WId QXlibWindow::winId() const
+{
+ return x_window;
+}
+
+void QXlibWindow::setParent(const QPlatformWindow *window)
+{
+ QPoint topLeft = geometry().topLeft();
+ XReparentWindow(mScreen->display()->nativeDisplay(),x_window,window->winId(),topLeft.x(),topLeft.y());
+}
+
+void QXlibWindow::raise()
+{
+ XRaiseWindow(mScreen->display()->nativeDisplay(), x_window);
+}
+
+void QXlibWindow::lower()
+{
+ XLowerWindow(mScreen->display()->nativeDisplay(), x_window);
+}
+
+void QXlibWindow::setWindowTitle(const QString &title)
+{
+ QByteArray ba = title.toLatin1(); //We're not making a general solution here...
+ XTextProperty windowName;
+ windowName.value = (unsigned char *)ba.constData();
+ windowName.encoding = XA_STRING;
+ windowName.format = 8;
+ windowName.nitems = ba.length();
+
+ XSetWMName(mScreen->display()->nativeDisplay(), x_window, &windowName);
+}
+
+GC QXlibWindow::createGC()
+{
+ GC gc;
+
+ gc = XCreateGC(mScreen->display()->nativeDisplay(), x_window, 0, 0);
+ if (gc < 0) {
+ qWarning("QTestLiteWindow::createGC() could not create GC");
+ }
+ return gc;
+}
+
+void QXlibWindow::paintEvent()
+{
+#ifdef MYX11_DEBUG
+// qDebug() << "QTestLiteWindow::paintEvent" << shm_img.size() << painted;
+#endif
+
+ if (QWindowSurface *surface = widget()->windowSurface())
+ surface->flush(widget(), widget()->geometry(), QPoint());
+}
+
+void QXlibWindow::requestActivateWindow()
+{
+ XSetInputFocus(mScreen->display()->nativeDisplay(), x_window, XRevertToParent, CurrentTime);
+}
+
+void QXlibWindow::resizeEvent(XConfigureEvent *e)
+{
+ int xpos = geometry().x();
+ int ypos = geometry().y();
+ if ((e->width != geometry().width() || e->height != geometry().height()) && e->x == 0 && e->y == 0) {
+ //qDebug() << "resize with bogus pos" << e->x << e->y << e->width << e->height << "window"<< hex << window;
+ } else {
+ //qDebug() << "geometry change" << e->x << e->y << e->width << e->height << "window"<< hex << window;
+ xpos = e->x;
+ ypos = e->y;
+ }
+#ifdef MYX11_DEBUG
+ qDebug() << hex << x_window << dec << "ConfigureNotify" << e->x << e->y << e->width << e->height << "geometry" << xpos << ypos << width << height;
+#endif
+
+ QRect newRect(xpos, ypos, e->width, e->height);
+ QWindowSystemInterface::handleGeometryChange(widget(), newRect);
+}
+
+void QXlibWindow::mousePressEvent(XButtonEvent *e)
+{
+ static long prevTime = 0;
+ static Window prevWindow;
+ static int prevX = -999;
+ static int prevY = -999;
+
+ QEvent::Type type = QEvent::MouseButtonPress;
+
+ if (e->window == prevWindow && long(e->time) - prevTime < QApplication::doubleClickInterval()
+ && qAbs(e->x - prevX) < 5 && qAbs(e->y - prevY) < 5) {
+ type = QEvent::MouseButtonDblClick;
+ prevTime = e->time - QApplication::doubleClickInterval(); //no double click next time
+ } else {
+ prevTime = e->time;
+ }
+ prevWindow = e->window;
+ prevX = e->x;
+ prevY = e->y;
+
+ handleMouseEvent(type, e);
+}
+
+QXlibMWMHints QXlibWindow::getMWMHints() const
+{
+ QXlibMWMHints mwmhints;
+
+ Atom type;
+ int format;
+ ulong nitems, bytesLeft;
+ uchar *data = 0;
+ Atom atomForMotifWmHints = QXlibStatic::atom(QXlibStatic::_MOTIF_WM_HINTS);
+ if ((XGetWindowProperty(mScreen->display()->nativeDisplay(), x_window, atomForMotifWmHints, 0, 5, false,
+ atomForMotifWmHints, &type, &format, &nitems, &bytesLeft,
+ &data) == Success)
+ && (type == atomForMotifWmHints
+ && format == 32
+ && nitems >= 5)) {
+ mwmhints = *(reinterpret_cast<QXlibMWMHints *>(data));
+ } else {
+ mwmhints.flags = 0L;
+ mwmhints.functions = MWM_FUNC_ALL;
+ mwmhints.decorations = MWM_DECOR_ALL;
+ mwmhints.input_mode = 0L;
+ mwmhints.status = 0L;
+ }
+
+ if (data)
+ XFree(data);
+
+ return mwmhints;
+}
+
+void QXlibWindow::setMWMHints(const QXlibMWMHints &mwmhints)
+{
+ Atom atomForMotifWmHints = QXlibStatic::atom(QXlibStatic::_MOTIF_WM_HINTS);
+ if (mwmhints.flags != 0l) {
+ XChangeProperty(mScreen->display()->nativeDisplay(), x_window,
+ atomForMotifWmHints, atomForMotifWmHints, 32,
+ PropModeReplace, (unsigned char *) &mwmhints, 5);
+ } else {
+ XDeleteProperty(mScreen->display()->nativeDisplay(), x_window, atomForMotifWmHints);
+ }
+}
+
+// Returns true if we should set WM_TRANSIENT_FOR on \a w
+static inline bool isTransient(const QWidget *w)
+{
+ return ((w->windowType() == Qt::Dialog
+ || w->windowType() == Qt::Sheet
+ || w->windowType() == Qt::Tool
+ || w->windowType() == Qt::SplashScreen
+ || w->windowType() == Qt::ToolTip
+ || w->windowType() == Qt::Drawer
+ || w->windowType() == Qt::Popup)
+ && !w->testAttribute(Qt::WA_X11BypassTransientForHint));
+}
+
+QVector<Atom> QXlibWindow::getNetWmState() const
+{
+ QVector<Atom> returnValue;
+
+ // Don't read anything, just get the size of the property data
+ Atom actualType;
+ int actualFormat;
+ ulong propertyLength;
+ ulong bytesLeft;
+ uchar *propertyData = 0;
+ if (XGetWindowProperty(mScreen->display()->nativeDisplay(), x_window, QXlibStatic::atom(QXlibStatic::_NET_WM_STATE), 0, 0,
+ False, XA_ATOM, &actualType, &actualFormat,
+ &propertyLength, &bytesLeft, &propertyData) == Success
+ && actualType == XA_ATOM && actualFormat == 32) {
+ returnValue.resize(bytesLeft / 4);
+ XFree((char*) propertyData);
+
+ // fetch all data
+ if (XGetWindowProperty(mScreen->display()->nativeDisplay(), x_window, QXlibStatic::atom(QXlibStatic::_NET_WM_STATE), 0,
+ returnValue.size(), False, XA_ATOM, &actualType, &actualFormat,
+ &propertyLength, &bytesLeft, &propertyData) != Success) {
+ returnValue.clear();
+ } else if (propertyLength != (ulong)returnValue.size()) {
+ returnValue.resize(propertyLength);
+ }
+
+ // put it into netWmState
+ if (!returnValue.isEmpty()) {
+ memcpy(returnValue.data(), propertyData, returnValue.size() * sizeof(Atom));
+ }
+ XFree((char*) propertyData);
+ }
+
+ return returnValue;
+}
+
+Qt::WindowFlags QXlibWindow::setWindowFlags(Qt::WindowFlags flags)
+{
+// Q_ASSERT(flags & Qt::Window);
+ mWindowFlags = flags;
+
+#ifdef MYX11_DEBUG
+ qDebug() << "QTestLiteWindow::setWindowFlags" << hex << x_window << "flags" << flags;
+#endif
+ Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+
+ if (type == Qt::ToolTip)
+ flags |= Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint;
+ if (type == Qt::Popup)
+ flags |= Qt::X11BypassWindowManagerHint;
+
+ bool topLevel = (flags & Qt::Window);
+ bool popup = (type == Qt::Popup);
+ bool dialog = (type == Qt::Dialog
+ || type == Qt::Sheet);
+ bool desktop = (type == Qt::Desktop);
+ bool tool = (type == Qt::Tool || type == Qt::SplashScreen
+ || type == Qt::ToolTip || type == Qt::Drawer);
+
+ Q_UNUSED(topLevel);
+ Q_UNUSED(dialog);
+ Q_UNUSED(desktop);
+
+ bool tooltip = (type == Qt::ToolTip);
+
+ XSetWindowAttributes wsa;
+
+ QXlibMWMHints mwmhints;
+ mwmhints.flags = 0L;
+ mwmhints.functions = 0L;
+ mwmhints.decorations = 0;
+ mwmhints.input_mode = 0L;
+ mwmhints.status = 0L;
+
+
+ ulong wsa_mask = 0;
+ if (type != Qt::SplashScreen) { // && customize) {
+ mwmhints.flags |= MWM_HINTS_DECORATIONS;
+
+ bool customize = flags & Qt::CustomizeWindowHint;
+ if (!(flags & Qt::FramelessWindowHint) && !(customize && !(flags & Qt::WindowTitleHint))) {
+ mwmhints.decorations |= MWM_DECOR_BORDER;
+ mwmhints.decorations |= MWM_DECOR_RESIZEH;
+
+ if (flags & Qt::WindowTitleHint)
+ mwmhints.decorations |= MWM_DECOR_TITLE;
+
+ if (flags & Qt::WindowSystemMenuHint)
+ mwmhints.decorations |= MWM_DECOR_MENU;
+
+ if (flags & Qt::WindowMinimizeButtonHint) {
+ mwmhints.decorations |= MWM_DECOR_MINIMIZE;
+ mwmhints.functions |= MWM_FUNC_MINIMIZE;
+ }
+
+ if (flags & Qt::WindowMaximizeButtonHint) {
+ mwmhints.decorations |= MWM_DECOR_MAXIMIZE;
+ mwmhints.functions |= MWM_FUNC_MAXIMIZE;
+ }
+
+ if (flags & Qt::WindowCloseButtonHint)
+ mwmhints.functions |= MWM_FUNC_CLOSE;
+ }
+ } else {
+ // if type == Qt::SplashScreen
+ mwmhints.decorations = MWM_DECOR_ALL;
+ }
+
+ if (tool) {
+ wsa.save_under = True;
+ wsa_mask |= CWSaveUnder;
+ }
+
+ if (flags & Qt::X11BypassWindowManagerHint) {
+ wsa.override_redirect = True;
+ wsa_mask |= CWOverrideRedirect;
+ }
+#if 0
+ if (wsa_mask && initializeWindow) {
+ Q_ASSERT(id);
+ XChangeWindowAttributes(dpy, id, wsa_mask, &wsa);
+ }
+#endif
+ if (mwmhints.functions != 0) {
+ mwmhints.flags |= MWM_HINTS_FUNCTIONS;
+ mwmhints.functions |= MWM_FUNC_MOVE | MWM_FUNC_RESIZE;
+ } else {
+ mwmhints.functions = MWM_FUNC_ALL;
+ }
+
+ if (!(flags & Qt::FramelessWindowHint)
+ && flags & Qt::CustomizeWindowHint
+ && flags & Qt::WindowTitleHint
+ && !(flags &
+ (Qt::WindowMinimizeButtonHint
+ | Qt::WindowMaximizeButtonHint
+ | Qt::WindowCloseButtonHint))) {
+ // a special case - only the titlebar without any button
+ mwmhints.flags = MWM_HINTS_FUNCTIONS;
+ mwmhints.functions = MWM_FUNC_MOVE | MWM_FUNC_RESIZE;
+ mwmhints.decorations = 0;
+ }
+
+ if (widget()->windowModality() == Qt::WindowModal) {
+ mwmhints.input_mode = MWM_INPUT_PRIMARY_APPLICATION_MODAL;
+ } else if (widget()->windowModality() == Qt::ApplicationModal) {
+ mwmhints.input_mode = MWM_INPUT_FULL_APPLICATION_MODAL;
+ }
+
+ setMWMHints(mwmhints);
+
+ QVector<Atom> netWmState = getNetWmState();
+
+ if (flags & Qt::WindowStaysOnTopHint) {
+ if (flags & Qt::WindowStaysOnBottomHint)
+ qWarning() << "QWidget: Incompatible window flags: the window can't be on top and on bottom at the same time";
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_ABOVE)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_ABOVE));
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_STAYS_ON_TOP)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_STAYS_ON_TOP));
+ } else if (flags & Qt::WindowStaysOnBottomHint) {
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_BELOW)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_BELOW));
+ }
+ if (widget()->isFullScreen()) {
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_FULLSCREEN)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_FULLSCREEN));
+ }
+ if (widget()->isMaximized()) {
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_HORZ)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_HORZ));
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_VERT)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MAXIMIZED_VERT));
+ }
+ if (widget()->windowModality() != Qt::NonModal) {
+ if (!netWmState.contains(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MODAL)))
+ netWmState.append(QXlibStatic::atom(QXlibStatic::_NET_WM_STATE_MODAL));
+ }
+
+ if (!netWmState.isEmpty()) {
+ XChangeProperty(mScreen->display()->nativeDisplay(), x_window,
+ QXlibStatic::atom(QXlibStatic::_NET_WM_STATE), XA_ATOM, 32, PropModeReplace,
+ (unsigned char *) netWmState.data(), netWmState.size());
+ } else {
+ XDeleteProperty(mScreen->display()->nativeDisplay(), x_window, QXlibStatic::atom(QXlibStatic::_NET_WM_STATE));
+ }
+
+//##### only if initializeWindow???
+
+ if (popup || tooltip) { // popup widget
+#ifdef MYX11_DEBUG
+ qDebug() << "Doing XChangeWindowAttributes for popup" << wsa.override_redirect;
+#endif
+ // set EWMH window types
+ // setNetWmWindowTypes();
+
+ wsa.override_redirect = True;
+ wsa.save_under = True;
+ XChangeWindowAttributes(mScreen->display()->nativeDisplay(), x_window, CWOverrideRedirect | CWSaveUnder,
+ &wsa);
+ } else {
+#ifdef MYX11_DEBUG
+ qDebug() << "Doing XChangeWindowAttributes for non-popup";
+#endif
+ }
+
+ return flags;
+}
+
+void QXlibWindow::setVisible(bool visible)
+{
+#ifdef MYX11_DEBUG
+ qDebug() << "QTestLiteWindow::setVisible" << visible << hex << x_window;
+#endif
+ if (isTransient(widget())) {
+ Window parentXWindow = x_window;
+ if (widget()->parentWidget()) {
+ QWidget *widgetParent = widget()->parentWidget()->window();
+ if (widgetParent && widgetParent->platformWindow()) {
+ QXlibWindow *parentWidnow = static_cast<QXlibWindow *>(widgetParent->platformWindow());
+ parentXWindow = parentWidnow->x_window;
+ }
+ }
+ XSetTransientForHint(mScreen->display()->nativeDisplay(),x_window,parentXWindow);
+ }
+
+ if (visible) {
+ //ensure that the window is viewed in correct position.
+ doSizeHints();
+ XMapWindow(mScreen->display()->nativeDisplay(), x_window);
+ } else {
+ XUnmapWindow(mScreen->display()->nativeDisplay(), x_window);
+ }
+}
+
+void QXlibWindow::setCursor(const Cursor &cursor)
+{
+ XDefineCursor(mScreen->display()->nativeDisplay(), x_window, cursor);
+ mScreen->display()->flush();
+}
+
+QPlatformGLContext *QXlibWindow::glContext() const
+{
+ if (!QApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
+ return 0;
+ if (!mGLContext) {
+ QXlibWindow *that = const_cast<QXlibWindow *>(this);
+#if !defined(QT_NO_OPENGL)
+#if !defined(QT_OPENGL_ES_2)
+ that->mGLContext = new QGLXContext(x_window, mScreen,widget()->platformWindowFormat());
+#else
+ EGLDisplay display = mScreen->eglDisplay();
+
+ QPlatformWindowFormat windowFormat = correctColorBuffers(widget()->platformWindowFormat());
+
+ EGLConfig config = q_configFromQPlatformWindowFormat(display,windowFormat);
+ QVector<EGLint> eglContextAttrs;
+ eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+ eglContextAttrs.append(2);
+ eglContextAttrs.append(EGL_NONE);
+
+ EGLSurface eglSurface = eglCreateWindowSurface(display,config,(EGLNativeWindowType)x_window,0);
+ that->mGLContext = new QEGLPlatformContext(display, config, eglContextAttrs.data(), eglSurface, EGL_OPENGL_ES_API);
+#endif
+#endif
+ }
+ return mGLContext;
+}
+
+Window QXlibWindow::xWindow() const
+{
+ return x_window;
+}
+
+GC QXlibWindow::graphicsContext() const
+{
+ return gc;
+}
+
+void QXlibWindow::doSizeHints()
+{
+ Q_ASSERT(widget()->testAttribute(Qt::WA_WState_Created));
+ XSizeHints s;
+ s.flags = 0;
+ QRect g = geometry();
+ s.x = g.x();
+ s.y = g.y();
+ s.width = g.width();
+ s.height = g.height();
+ s.flags |= USPosition;
+ s.flags |= PPosition;
+ s.flags |= USSize;
+ s.flags |= PSize;
+ s.flags |= PWinGravity;
+ s.win_gravity = QApplication::isRightToLeft() ? NorthEastGravity : NorthWestGravity;
+ XSetWMNormalHints(mScreen->display()->nativeDisplay(), x_window, &s);
+}
+
+QPlatformWindowFormat QXlibWindow::correctColorBuffers(const QPlatformWindowFormat &platformWindowFormat) const
+{
+ // I have only tested this setup on a dodgy intel setup, where I didn't use standard libs,
+ // so this might be not what we want to do :)
+ if ( !(platformWindowFormat.redBufferSize() == -1 &&
+ platformWindowFormat.greenBufferSize() == -1 &&
+ platformWindowFormat.blueBufferSize() == -1))
+ return platformWindowFormat;
+
+ QPlatformWindowFormat windowFormat = platformWindowFormat;
+ if (mScreen->depth() == 16) {
+ windowFormat.setRedBufferSize(5);
+ windowFormat.setGreenBufferSize(6);
+ windowFormat.setBlueBufferSize(5);
+ } else {
+ windowFormat.setRedBufferSize(8);
+ windowFormat.setGreenBufferSize(8);
+ windowFormat.setBlueBufferSize(8);
+ }
+
+ return windowFormat;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibwindow.h b/src/plugins/platforms/xlib/qxlibwindow.h
new file mode 100644
index 0000000000..08694a5026
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibwindow.h
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITEWINDOW_H
+#define QTESTLITEWINDOW_H
+
+#include "qxlibintegration.h"
+
+#include <QPlatformWindow>
+#include <QEvent>
+
+#include <QObject>
+#include <QImage>
+
+struct QXlibMWMHints {
+ ulong flags, functions, decorations;
+ long input_mode;
+ ulong status;
+};
+
+enum {
+ MWM_HINTS_FUNCTIONS = (1L << 0),
+
+ MWM_FUNC_ALL = (1L << 0),
+ MWM_FUNC_RESIZE = (1L << 1),
+ MWM_FUNC_MOVE = (1L << 2),
+ MWM_FUNC_MINIMIZE = (1L << 3),
+ MWM_FUNC_MAXIMIZE = (1L << 4),
+ MWM_FUNC_CLOSE = (1L << 5),
+
+ MWM_HINTS_DECORATIONS = (1L << 1),
+
+ MWM_DECOR_ALL = (1L << 0),
+ MWM_DECOR_BORDER = (1L << 1),
+ MWM_DECOR_RESIZEH = (1L << 2),
+ MWM_DECOR_TITLE = (1L << 3),
+ MWM_DECOR_MENU = (1L << 4),
+ MWM_DECOR_MINIMIZE = (1L << 5),
+ MWM_DECOR_MAXIMIZE = (1L << 6),
+
+ MWM_HINTS_INPUT_MODE = (1L << 2),
+
+ MWM_INPUT_MODELESS = 0L,
+ MWM_INPUT_PRIMARY_APPLICATION_MODAL = 1L,
+ MWM_INPUT_FULL_APPLICATION_MODAL = 3L
+};
+
+class QXlibWindow : public QPlatformWindow
+{
+public:
+ QXlibWindow(QWidget *window);
+ ~QXlibWindow();
+
+
+ void mousePressEvent(XButtonEvent*);
+ void handleMouseEvent(QEvent::Type, XButtonEvent *ev);
+
+ void handleCloseEvent();
+ void handleEnterEvent();
+ void handleLeaveEvent();
+ void handleFocusInEvent();
+ void handleFocusOutEvent();
+
+ void resizeEvent(XConfigureEvent *configure_event);
+ void paintEvent();
+
+ void requestActivateWindow();
+
+ void setGeometry(const QRect &rect);
+
+ Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
+ Qt::WindowFlags windowFlags() const;
+ void setVisible(bool visible);
+ WId winId() const;
+ void setParent(const QPlatformWindow *window);
+ void raise();
+ void lower();
+ void setWindowTitle(const QString &title);
+
+ void setCursor(const Cursor &cursor);
+
+ QPlatformGLContext *glContext() const;
+
+ Window xWindow() const;
+ GC graphicsContext() const;
+
+protected:
+ QVector<Atom> getNetWmState() const;
+ void setMWMHints(const QXlibMWMHints &mwmhints);
+ QXlibMWMHints getMWMHints() const;
+
+ void doSizeHints();
+
+private:
+ QPlatformWindowFormat correctColorBuffers(const QPlatformWindowFormat &windowFormat)const;
+
+ Window x_window;
+ GC gc;
+
+ GC createGC();
+
+ QPlatformGLContext *mGLContext;
+ QXlibScreen *mScreen;
+ Qt::WindowFlags mWindowFlags;
+};
+
+#endif
diff --git a/src/plugins/platforms/xlib/qxlibwindowsurface.cpp b/src/plugins/platforms/xlib/qxlibwindowsurface.cpp
new file mode 100644
index 0000000000..513f10dc6a
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibwindowsurface.cpp
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibwindowsurface.h"
+#include "qxlibintegration.h"
+
+#include <QtCore/qdebug.h>
+#include <QWindowSystemInterface>
+
+#include "qxlibwindow.h"
+#include "qxlibscreen.h"
+#include "qxlibdisplay.h"
+
+# include <sys/ipc.h>
+# include <sys/shm.h>
+# include <X11/extensions/XShm.h>
+
+QT_BEGIN_NAMESPACE
+
+
+struct QXlibShmImageInfo {
+ QXlibShmImageInfo(Display *xdisplay) : image(0), display(xdisplay) {}
+ ~QXlibShmImageInfo() { destroy(); }
+
+ void destroy();
+
+ XShmSegmentInfo shminfo;
+ XImage *image;
+ Display *display;
+};
+
+
+#ifndef DONT_USE_MIT_SHM
+void QXlibShmImageInfo::destroy()
+{
+ XShmDetach (display, &shminfo);
+ XDestroyImage (image);
+ shmdt (shminfo.shmaddr);
+ shmctl (shminfo.shmid, IPC_RMID, 0);
+}
+#endif
+
+void QXlibWindowSurface::resizeShmImage(int width, int height)
+{
+
+#ifdef DONT_USE_MIT_SHM
+ shm_img = QImage(width, height, QImage::Format_RGB32);
+#else
+
+ QXlibScreen *screen = QXlibScreen::testLiteScreenForWidget(window());
+ if (image_info)
+ image_info->destroy();
+ else
+ image_info = new QXlibShmImageInfo(screen->display()->nativeDisplay());
+
+ Visual *visual = screen->defaultVisual();
+
+ XImage *image = XShmCreateImage (screen->display()->nativeDisplay(), visual, 24, ZPixmap, 0,
+ &image_info->shminfo, width, height);
+
+
+ image_info->shminfo.shmid = shmget (IPC_PRIVATE,
+ image->bytes_per_line * image->height, IPC_CREAT|0777);
+
+ image_info->shminfo.shmaddr = image->data = (char*)shmat (image_info->shminfo.shmid, 0, 0);
+ image_info->shminfo.readOnly = False;
+
+ image_info->image = image;
+
+ Status shm_attach_status = XShmAttach(screen->display()->nativeDisplay(), &image_info->shminfo);
+
+ Q_ASSERT(shm_attach_status == True);
+
+ shm_img = QImage( (uchar*) image->data, image->width, image->height, image->bytes_per_line, QImage::Format_RGB32 );
+#endif
+ painted = false;
+}
+
+
+void QXlibWindowSurface::resizeBuffer(QSize s)
+{
+ if (shm_img.size() != s)
+ resizeShmImage(s.width(), s.height());
+}
+
+QSize QXlibWindowSurface::bufferSize() const
+{
+ return shm_img.size();
+}
+
+QXlibWindowSurface::QXlibWindowSurface (QWidget *window)
+ : QWindowSurface(window),
+ painted(false), image_info(0)
+{
+ xw = static_cast<QXlibWindow*>(window->platformWindow());
+// qDebug() << "QTestLiteWindowSurface::QTestLiteWindowSurface:" << xw->window;
+}
+
+QXlibWindowSurface::~QXlibWindowSurface()
+{
+ delete image_info;
+}
+
+QPaintDevice *QXlibWindowSurface::paintDevice()
+{
+ return &shm_img;
+}
+
+
+void QXlibWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ Q_UNUSED(region);
+ Q_UNUSED(offset);
+
+ if (!painted)
+ return;
+
+ QXlibScreen *screen = QXlibScreen::testLiteScreenForWidget(widget);
+ GC gc = xw->graphicsContext();
+ Window window = xw->xWindow();
+#ifdef DONT_USE_MIT_SHM
+ // just convert the image every time...
+ if (!shm_img.isNull()) {
+ Visual *visual = DefaultVisual(screen->display(), screen->xScreenNumber());
+
+ QImage image = shm_img;
+ //img.convertToFormat(
+ XImage *xi = XCreateImage(screen->display(), visual, 24, ZPixmap,
+ 0, (char *) image.scanLine(0), image.width(), image.height(),
+ 32, image.bytesPerLine());
+
+ int x = 0;
+ int y = 0;
+
+ /*int r =*/ XPutImage(screen->display(), window, gc, xi, 0, 0, x, y, image.width(), image.height());
+
+ xi->data = 0; // QImage owns these bits
+ XDestroyImage(xi);
+ }
+#else
+ // Use MIT_SHM
+ if (image_info && image_info->image) {
+ //qDebug() << "Here we go" << image_info->image->width << image_info->image->height;
+ int x = 0;
+ int y = 0;
+
+ // We could set send_event to true, and then use the ShmCompletion to synchronize,
+ // but let's do like Qt/11 and just use XSync
+ XShmPutImage (screen->display()->nativeDisplay(), window, gc, image_info->image, 0, 0,
+ x, y, image_info->image->width, image_info->image->height,
+ /*send_event*/ False);
+
+ screen->display()->sync();
+ }
+#endif
+}
+
+// from qwindowsurface.cpp
+extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
+
+bool QXlibWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ if (shm_img.isNull())
+ return false;
+
+ const QVector<QRect> rects = area.rects();
+ for (int i = 0; i < rects.size(); ++i)
+ qt_scrollRectInImage(shm_img, rects.at(i), QPoint(dx, dy));
+
+ return true;
+}
+
+
+void QXlibWindowSurface::beginPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+ resizeBuffer(size());
+}
+
+void QXlibWindowSurface::endPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+ painted = true; //there is content in the buffer
+}
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xlib/qxlibwindowsurface.h b/src/plugins/platforms/xlib/qxlibwindowsurface.h
new file mode 100644
index 0000000000..d46b7b41bc
--- /dev/null
+++ b/src/plugins/platforms/xlib/qxlibwindowsurface.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWINDOWSURFACE_TESTLITE_H
+#define QWINDOWSURFACE_TESTLITE_H
+
+#include <QtGui/private/qwindowsurface_p.h>
+
+
+QT_BEGIN_NAMESPACE
+
+class QXlibWindow;
+class QXlibIntegration;
+class QXlibScreen;
+class QXlibShmImageInfo;
+
+class QXlibWindowSurface : public QWindowSurface
+{
+public:
+ QXlibWindowSurface (QWidget *window);
+ ~QXlibWindowSurface();
+
+ QPaintDevice *paintDevice();
+ void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
+ bool scroll(const QRegion &area, int dx, int dy);
+
+ void beginPaint(const QRegion &region);
+ void endPaint(const QRegion &region);
+
+private:
+ bool painted;
+ void resizeBuffer(QSize);
+ QSize bufferSize() const;
+
+
+ void resizeShmImage(int width, int height);
+
+ QImage shm_img;
+ QXlibShmImageInfo *image_info;
+
+ QXlibWindow *xw;
+
+};
+
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/xlib/xlib.pro b/src/plugins/platforms/xlib/xlib.pro
new file mode 100644
index 0000000000..ea77a2905b
--- /dev/null
+++ b/src/plugins/platforms/xlib/xlib.pro
@@ -0,0 +1,62 @@
+TARGET = qxlib
+
+include(../../qpluginbase.pri)
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+
+SOURCES = \
+ main.cpp \
+ qxlibintegration.cpp \
+ qxlibwindowsurface.cpp \
+ qxlibwindow.cpp \
+ qxlibcursor.cpp \
+ qxlibscreen.cpp \
+ qxlibkeyboard.cpp \
+ qxlibclipboard.cpp \
+ qxlibmime.cpp \
+ qxlibstatic.cpp \
+ qxlibdisplay.cpp \
+ qxlibnativeinterface.cpp
+
+HEADERS = \
+ qxlibintegration.h \
+ qxlibwindowsurface.h \
+ qxlibwindow.h \
+ qxlibcursor.h \
+ qxlibscreen.h \
+ qxlibkeyboard.h \
+ qxlibclipboard.h \
+ qxlibmime.h \
+ qxlibstatic.h \
+ qxlibdisplay.h \
+ qxlibnativeinterface.h
+
+LIBS += -lX11 -lXext
+
+mac {
+ LIBS += -L/usr/X11/lib -lz -framework Carbon
+}
+
+include (../fontdatabases/genericunix/genericunix.pri)
+
+contains(QT_CONFIG, opengl) {
+ QT += opengl
+ !contains(QT_CONFIG, opengles2) {
+ include (../glxconvenience/glxconvenience.pri)
+ HEADERS += qglxintegration.h
+ SOURCES += qglxintegration.cpp
+ } else { # There is no easy way to detect if we'r suppose to use glx or not
+ HEADERS += \
+ ../eglconvenience/qeglplatformcontext.h \
+ ../eglconvenience/qeglconvenience.h \
+ ../eglconvenience/qxlibeglintegration.h
+
+ SOURCES += \
+ ../eglconvenience/qeglplatformcontext.cpp \
+ ../eglconvenience/qeglconvenience.cpp \
+ ../eglconvenience/qxlibeglintegration.cpp
+ LIBS += -lEGL
+ }
+}
+
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
+INSTALLS += target
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
new file mode 100644
index 0000000000..7479d2facb
--- /dev/null
+++ b/src/plugins/plugins.pro
@@ -0,0 +1,17 @@
+TEMPLATE = subdirs
+
+SUBDIRS *= sqldrivers script bearer
+unix:!symbian {
+ contains(QT_CONFIG,iconv)|contains(QT_CONFIG,gnu-libiconv)|contains(QT_CONFIG,sun-libiconv):SUBDIRS *= codecs
+} else {
+ SUBDIRS *= codecs
+}
+!contains(QT_CONFIG, no-gui): SUBDIRS *= imageformats iconengines
+!embedded:!qpa:SUBDIRS *= graphicssystems
+embedded:SUBDIRS *= gfxdrivers decorations mousedrivers kbddrivers
+!win32:!embedded:!mac:!symbian:SUBDIRS *= inputmethods
+!symbian:!contains(QT_CONFIG, no-gui):SUBDIRS += accessible
+symbian:SUBDIRS += s60
+contains(QT_CONFIG, phonon): SUBDIRS *= phonon
+qpa:SUBDIRS += platforms
+contains(QT_CONFIG, declarative): SUBDIRS *= qmltooling
diff --git a/src/plugins/qpluginbase.pri b/src/plugins/qpluginbase.pri
new file mode 100644
index 0000000000..bcf473f1fe
--- /dev/null
+++ b/src/plugins/qpluginbase.pri
@@ -0,0 +1,41 @@
+TEMPLATE = lib
+isEmpty(QT_MAJOR_VERSION) {
+ VERSION=4.8.0
+} else {
+ VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}
+}
+CONFIG += qt plugin
+
+win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release
+TARGET = $$qtLibraryTarget($$TARGET)
+contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
+
+include(../qt_targets.pri)
+
+wince*:LIBS += $$QMAKE_LIBS_GUI
+
+symbian: {
+ TARGET.EPOCALLOWDLLDATA=1
+ TARGET.CAPABILITY = All -Tcb
+ TARGET = $${TARGET}$${QT_LIBINFIX}
+ load(armcc_warnings)
+
+ # Make partial upgrade SIS file for Qt plugin dll's
+ # Partial upgrade SIS file
+ vendorinfo = \
+ "; Localised Vendor name" \
+ "%{\"Nokia\"}" \
+ " " \
+ "; Unique Vendor name" \
+ ":\"Nokia, Qt\"" \
+ " "
+ isEmpty(QT_LIBINFIX): PARTIAL_UPGRADE_UID = 0x2001E61C
+ else: PARTIAL_UPGRADE_UID = 0xE001E61C
+
+ pu_header = "; Partial upgrade package for testing $${TARGET} changes without reinstalling everything" \
+ "$${LITERAL_HASH}{\"$${TARGET}\"}, ($$PARTIAL_UPGRADE_UID), $${QT_MAJOR_VERSION},$${QT_MINOR_VERSION},$${QT_PATCH_VERSION}, TYPE=PU"
+ partial_upgrade.pkg_prerules = pu_header vendorinfo
+ partial_upgrade.files = $$QMAKE_LIBDIR_QT/$${TARGET}.dll
+ partial_upgrade.path = c:/sys/bin
+ DEPLOYMENT += partial_upgrade
+}
diff --git a/src/plugins/s60/3_1/3_1.pro b/src/plugins/s60/3_1/3_1.pro
new file mode 100644
index 0000000000..9437f3da29
--- /dev/null
+++ b/src/plugins/s60/3_1/3_1.pro
@@ -0,0 +1,9 @@
+include(../s60pluginbase.pri)
+
+TARGET = qts60plugin_3_1$${QT_LIBINFIX}
+
+SOURCES += ../src/qlocale_3_1.cpp \
+ ../src/qdesktopservices_3_1.cpp \
+ ../src/qcoreapplication_3_1.cpp
+
+TARGET.UID3=0x2001E620
diff --git a/src/plugins/s60/3_2/3_2.pro b/src/plugins/s60/3_2/3_2.pro
new file mode 100644
index 0000000000..b104c054b2
--- /dev/null
+++ b/src/plugins/s60/3_2/3_2.pro
@@ -0,0 +1,23 @@
+include(../s60pluginbase.pri)
+
+TARGET = qts60plugin_3_2$${QT_LIBINFIX}
+
+contains(S60_VERSION, 3.1) {
+ SOURCES += ../src/qlocale_3_1.cpp \
+ ../src/qdesktopservices_3_1.cpp \
+ ../src/qcoreapplication_3_1.cpp
+} else {
+ SOURCES += ../src/qlocale_3_2.cpp \
+ ../src/qdesktopservices_3_2.cpp \
+ ../src/qcoreapplication_3_2.cpp
+ contains(CONFIG, is_using_gnupoc) {
+ LIBS += -ldirectorylocalizer
+ } else {
+ LIBS += -lDirectoryLocalizer
+ }
+ LIBS += -lefsrv
+ LIBS += -lnumberconversion
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+}
+
+TARGET.UID3=0x2001E621
diff --git a/src/plugins/s60/5_0/5_0.pro b/src/plugins/s60/5_0/5_0.pro
new file mode 100644
index 0000000000..b0372155b1
--- /dev/null
+++ b/src/plugins/s60/5_0/5_0.pro
@@ -0,0 +1,23 @@
+include(../s60pluginbase.pri)
+
+TARGET = qts60plugin_5_0$${QT_LIBINFIX}
+
+contains(S60_VERSION, 3.1) {
+ SOURCES += ../src/qlocale_3_1.cpp \
+ ../src/qdesktopservices_3_1.cpp \
+ ../src/qcoreapplication_3_1.cpp
+} else {
+ SOURCES += ../src/qlocale_3_2.cpp \
+ ../src/qdesktopservices_3_2.cpp \
+ ../src/qcoreapplication_3_2.cpp
+ contains(CONFIG, is_using_gnupoc) {
+ LIBS += -ldirectorylocalizer
+ } else {
+ LIBS += -lDirectoryLocalizer
+ }
+ LIBS += -lefsrv
+ LIBS += -lnumberconversion
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+}
+
+TARGET.UID3=0x2001E622
diff --git a/src/plugins/s60/bwins/qts60pluginu.def b/src/plugins/s60/bwins/qts60pluginu.def
new file mode 100644
index 0000000000..b4110a9fb4
--- /dev/null
+++ b/src/plugins/s60/bwins/qts60pluginu.def
@@ -0,0 +1,8 @@
+EXPORTS
+ ?defaultFormatL@@YAXAAVTTime@@AAVTDes16@@ABVTDesC16@@ABVTLocale@@@Z @ 1 NONAME ; void defaultFormatL(class TTime &, class TDes16 &, class TDesC16 const &, class TLocale const &)
+ ?defaultGetTimeFormatSpec@@YA?AVTPtrC16@@AAVTExtendedLocale@@@Z @ 2 NONAME ; class TPtrC16 defaultGetTimeFormatSpec(class TExtendedLocale &)
+ ?defaultGetLongDateFormatSpec@@YA?AVTPtrC16@@AAVTExtendedLocale@@@Z @ 3 NONAME ; class TPtrC16 defaultGetLongDateFormatSpec(class TExtendedLocale &)
+ ?defaultGetShortDateFormatSpec@@YA?AVTPtrC16@@AAVTExtendedLocale@@@Z @ 4 NONAME ; class TPtrC16 defaultGetShortDateFormatSpec(class TExtendedLocale &)
+ ?localizedDirectoryName@@YA?AVQString@@AAV1@@Z @ 5 NONAME ; class QString localizedDirectoryName(class QString &)
+ ?systemDrive@@YA?AW4TDriveNumber@@AAVRFs@@@Z @ 6 NONAME ; enum TDriveNumber systemDrive(class RFs &)
+
diff --git a/src/plugins/s60/eabi/qts60pluginu.def b/src/plugins/s60/eabi/qts60pluginu.def
new file mode 100644
index 0000000000..df7895c0cb
--- /dev/null
+++ b/src/plugins/s60/eabi/qts60pluginu.def
@@ -0,0 +1,8 @@
+EXPORTS
+ _Z14defaultFormatLR5TTimeR6TDes16RK7TDesC16RK7TLocale @ 1 NONAME
+ _Z24defaultGetTimeFormatSpecR15TExtendedLocale @ 2 NONAME
+ _Z28defaultGetLongDateFormatSpecR15TExtendedLocale @ 3 NONAME
+ _Z29defaultGetShortDateFormatSpecR15TExtendedLocale @ 4 NONAME
+ _Z22localizedDirectoryNameR7QString @ 5 NONAME
+ _Z11systemDriveR3RFs @ 6 NONAME
+
diff --git a/src/plugins/s60/s60.pro b/src/plugins/s60/s60.pro
new file mode 100644
index 0000000000..c999fff656
--- /dev/null
+++ b/src/plugins/s60/s60.pro
@@ -0,0 +1,11 @@
+TEMPLATE = subdirs
+
+
+symbian {
+ contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) {
+ SUBDIRS += 3_1 3_2
+ }
+
+ # 5.0 is used also for Symbian3 and later
+ SUBDIRS += 5_0
+} \ No newline at end of file
diff --git a/src/plugins/s60/s60pluginbase.pri b/src/plugins/s60/s60pluginbase.pri
new file mode 100644
index 0000000000..4e1510299b
--- /dev/null
+++ b/src/plugins/s60/s60pluginbase.pri
@@ -0,0 +1,23 @@
+# Note: These version based 'plugins' are not an actual Qt plugins,
+# they are just regular runtime loaded libraries
+include(../qpluginbase.pri)
+
+CONFIG -= plugin
+
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/s60
+
+MMP_RULES += NOEXPORTLIBRARY
+
+symbian-abld|symbian-sbsv2 {
+ defBlock = \
+ "$${LITERAL_HASH}ifdef WINSCW" \
+ "DEFFILE ../bwins/qts60plugin.def" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../eabi/qts60plugin.def" \
+ "$${LITERAL_HASH}endif"
+} else {
+ CONFIG *= def_files
+ DEF_FILE = ../eabi/qts60pluginu.def
+}
+
+MMP_RULES += defBlock \ No newline at end of file
diff --git a/src/plugins/s60/src/qcoreapplication_3_1.cpp b/src/plugins/s60/src/qcoreapplication_3_1.cpp
new file mode 100644
index 0000000000..aa298dee17
--- /dev/null
+++ b/src/plugins/s60/src/qcoreapplication_3_1.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qglobal.h>
+#include <f32file.h>
+
+EXPORT_C TDriveNumber systemDrive(RFs&)
+{
+ return EDriveC;
+}
diff --git a/src/plugins/s60/src/qcoreapplication_3_2.cpp b/src/plugins/s60/src/qcoreapplication_3_2.cpp
new file mode 100644
index 0000000000..a6b6a775f8
--- /dev/null
+++ b/src/plugins/s60/src/qcoreapplication_3_2.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qglobal.h>
+#include <f32file.h>
+
+EXPORT_C TDriveNumber systemDrive(RFs& fs)
+{
+ return fs.GetSystemDrive();
+}
diff --git a/src/plugins/s60/src/qdesktopservices_3_1.cpp b/src/plugins/s60/src/qdesktopservices_3_1.cpp
new file mode 100644
index 0000000000..9ebe0f7849
--- /dev/null
+++ b/src/plugins/s60/src/qdesktopservices_3_1.cpp
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qglobal.h>
+#include <qstring.h>
+
+EXPORT_C QString localizedDirectoryName(QString&)
+{
+ qWarning("QDesktopServices::displayName() not implemented for this platform version");
+ return QString();
+}
diff --git a/src/plugins/s60/src/qdesktopservices_3_2.cpp b/src/plugins/s60/src/qdesktopservices_3_2.cpp
new file mode 100644
index 0000000000..5aab0990b1
--- /dev/null
+++ b/src/plugins/s60/src/qdesktopservices_3_2.cpp
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <private/qcore_symbian_p.h>
+#include <qstring.h>
+#include <qdir.h>
+
+#ifdef Q_WS_S60
+#include <e32base.h> // CBase -> Required by cdirectorylocalizer.h
+#include <CDirectoryLocalizer.h> // CDirectoryLocalizer
+
+EXPORT_C QString localizedDirectoryName(QString& rawPath)
+{
+ QString ret;
+ std::exception dummy; // voodoo fix for "Undefined symbol typeinfo for std::exception" in armv5 build
+
+ TRAPD(err,
+ QT_TRYCATCH_LEAVING(
+ CDirectoryLocalizer* localizer = CDirectoryLocalizer::NewL();
+ CleanupStack::PushL(localizer);
+ localizer->SetFullPath(qt_QString2TPtrC(QDir::toNativeSeparators(rawPath)));
+ if(localizer->IsLocalized()){
+ TPtrC locName(localizer->LocalizedName());
+ ret = qt_TDesC2QString(locName);
+ }
+ CleanupStack::PopAndDestroy(localizer);
+ )
+ )
+
+ if (err != KErrNone)
+ ret = QString();
+
+ return ret;
+}
+#else
+
+EXPORT_C QString localizedDirectoryName(QString& /* rawPath */)
+{
+ qWarning("QDesktopServices::displayName() not implemented for this platform version");
+ return QString();
+}
+#endif
diff --git a/src/plugins/s60/src/qlocale_3_1.cpp b/src/plugins/s60/src/qlocale_3_1.cpp
new file mode 100644
index 0000000000..7dcaba0d61
--- /dev/null
+++ b/src/plugins/s60/src/qlocale_3_1.cpp
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <e32std.h>
+#include <e32const.h>
+#include <e32debug.h>
+
+_LIT(KYear, "%Y");
+_LIT(KMonth, "%M");
+_LIT(KDay, "%D");
+_LIT(KLocaleIndependent, "%F");
+static TBuf<10> dateFormat;
+static TBuf<10> timeFormat;
+
+static void initialiseDateFormat()
+{
+ if(dateFormat.Length())
+ return;
+
+ TLocale locale;
+
+ //Separator 1 is used between 1st and 2nd components of the date
+ //Separator 2 is used between 2nd and 3rd components of the date
+ //Usually they are the same, but they are allowed to be different
+ TChar s1 = locale.DateSeparator(1);
+ TChar s2 = locale.DateSeparator(2);
+ dateFormat=KLocaleIndependent;
+ switch(locale.DateFormat()) {
+ case EDateAmerican:
+ dateFormat.Append(KMonth);
+ dateFormat.Append(s1);
+ dateFormat.Append(KDay);
+ dateFormat.Append(s2);
+ dateFormat.Append(KYear);
+ break;
+ case EDateEuropean:
+ dateFormat.Append(KDay);
+ dateFormat.Append(s1);
+ dateFormat.Append(KMonth);
+ dateFormat.Append(s2);
+ dateFormat.Append(KYear);
+ break;
+ case EDateJapanese:
+ default: //it's closest to ISO format
+ dateFormat.Append(KYear);
+ dateFormat.Append(s1);
+ dateFormat.Append(KMonth);
+ dateFormat.Append(s2);
+ dateFormat.Append(KDay);
+ break;
+ }
+#ifdef _DEBUG
+ RDebug::Print(_L("Date Format \"%S\""), &dateFormat);
+#endif
+}
+
+static void initialiseTimeFormat()
+{
+ if(timeFormat.Length())
+ return;
+
+ TLocale locale;
+ //Separator 1 is used between 1st and 2nd components of the time
+ //Separator 2 is used between 2nd and 3rd components of the time
+ //Usually they are the same, but they are allowed to be different
+ TChar s1 = locale.TimeSeparator(1);
+ TChar s2 = locale.TimeSeparator(2);
+ switch(locale.TimeFormat()) {
+ case ETime12:
+ timeFormat.Append(_L("%I"));
+ break;
+ case ETime24:
+ default:
+ timeFormat.Append(_L("%H"));
+ break;
+ }
+ timeFormat.Append(s1);
+ timeFormat.Append(_L("%T"));
+ timeFormat.Append(s2);
+ timeFormat.Append(_L("%S"));
+
+#ifdef _DEBUG
+ RDebug::Print(_L("Time Format \"%S\""), &timeFormat);
+#endif
+}
+
+EXPORT_C void defaultFormatL(TTime& time, TDes& des, const TDesC& fmt, const TLocale&)
+{
+ //S60 3.1 does not support format for a specific locale, so use default locale
+ time.FormatL(des, fmt);
+}
+
+//S60 3.1 doesn't support extended locale date&time formats, so use default locale
+EXPORT_C TPtrC defaultGetTimeFormatSpec(TExtendedLocale&)
+{
+ initialiseTimeFormat();
+ return TPtrC(timeFormat);
+}
+
+EXPORT_C TPtrC defaultGetLongDateFormatSpec(TExtendedLocale&)
+{
+ initialiseDateFormat();
+ return TPtrC(dateFormat);
+}
+
+EXPORT_C TPtrC defaultGetShortDateFormatSpec(TExtendedLocale&)
+{
+ initialiseDateFormat();
+ return TPtrC(dateFormat);
+}
diff --git a/src/plugins/s60/src/qlocale_3_2.cpp b/src/plugins/s60/src/qlocale_3_2.cpp
new file mode 100644
index 0000000000..ecbf46c3df
--- /dev/null
+++ b/src/plugins/s60/src/qlocale_3_2.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <exception>
+#include <e32std.h>
+#include <e32base.h>
+#include <numberconversion.h>
+
+EXPORT_C TPtrC defaultGetLongDateFormatSpec(TExtendedLocale& locale)
+{
+ return locale.GetLongDateFormatSpec();
+}
+
+EXPORT_C TPtrC defaultGetShortDateFormatSpec(TExtendedLocale& locale)
+{
+ return locale.GetShortDateFormatSpec();
+}
+
+EXPORT_C TPtrC defaultGetTimeFormatSpec(TExtendedLocale& locale)
+{
+ return locale.GetTimeFormatSpec();
+}
+
+EXPORT_C void defaultFormatL(TTime& time, TDes& des, const TDesC& format, const TLocale& locale)
+{
+ time.FormatL(des, format, locale);
+ NumberConversion::ConvertDigits(des, locale.DigitType());
+}
diff --git a/src/plugins/sqldrivers/README b/src/plugins/sqldrivers/README
new file mode 100644
index 0000000000..7000fb5613
--- /dev/null
+++ b/src/plugins/sqldrivers/README
@@ -0,0 +1,5 @@
+Please note that the DB2, Oracle and TDS client drivers are not distributed
+with the Qt Open Source Editions.
+
+This is because the client libraries are distributed under a license which
+is not compatible with the GPL license.
diff --git a/src/plugins/sqldrivers/db2/README b/src/plugins/sqldrivers/db2/README
new file mode 100644
index 0000000000..5bebe6a3f9
--- /dev/null
+++ b/src/plugins/sqldrivers/db2/README
@@ -0,0 +1,6 @@
+You will need IBM DB2 development headers and libraries installed before
+compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/db2/db2.pro b/src/plugins/sqldrivers/db2/db2.pro
new file mode 100644
index 0000000000..e053f3756b
--- /dev/null
+++ b/src/plugins/sqldrivers/db2/db2.pro
@@ -0,0 +1,6 @@
+TARGET = qsqldb2
+
+SOURCES = main.cpp
+include(../../../sql/drivers/db2/qsql_db2.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/db2/main.cpp b/src/plugins/sqldrivers/db2/main.cpp
new file mode 100644
index 0000000000..c6cdfb31b4
--- /dev/null
+++ b/src/plugins/sqldrivers/db2/main.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../sql/drivers/db2/qsql_db2.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDB2DriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QDB2DriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QDB2DriverPlugin::QDB2DriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QDB2DriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QDB2")) {
+ QDB2Driver* driver = new QDB2Driver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QDB2DriverPlugin::keys() const
+{
+ QStringList l;
+ l.append(QLatin1String("QDB2"));
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QDB2DriverPlugin)
+Q_EXPORT_PLUGIN2(qsqldb2, QDB2DriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/ibase/ibase.pro b/src/plugins/sqldrivers/ibase/ibase.pro
new file mode 100644
index 0000000000..7870ec8465
--- /dev/null
+++ b/src/plugins/sqldrivers/ibase/ibase.pro
@@ -0,0 +1,6 @@
+TARGET = qsqlibase
+
+SOURCES = main.cpp
+include(../../../sql/drivers/ibase/qsql_ibase.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/ibase/main.cpp b/src/plugins/sqldrivers/ibase/main.cpp
new file mode 100644
index 0000000000..a0553d5dc8
--- /dev/null
+++ b/src/plugins/sqldrivers/ibase/main.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../sql/drivers/ibase/qsql_ibase.h"
+
+QT_BEGIN_NAMESPACE
+
+class QIBaseDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QIBaseDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QIBaseDriverPlugin::QIBaseDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QIBaseDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QIBASE")) {
+ QIBaseDriver* driver = new QIBaseDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QIBaseDriverPlugin::keys() const
+{
+ QStringList l;
+ l << QLatin1String("QIBASE");
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QIBaseDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqlibase, QIBaseDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/mysql/README b/src/plugins/sqldrivers/mysql/README
new file mode 100644
index 0000000000..d1b372282d
--- /dev/null
+++ b/src/plugins/sqldrivers/mysql/README
@@ -0,0 +1,6 @@
+You will need the MySQL development headers and libraries installed
+before compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/mysql/main.cpp b/src/plugins/sqldrivers/mysql/main.cpp
new file mode 100644
index 0000000000..b86baa5729
--- /dev/null
+++ b/src/plugins/sqldrivers/mysql/main.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../sql/drivers/mysql/qsql_mysql.h"
+
+QT_BEGIN_NAMESPACE
+
+class QMYSQLDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QMYSQLDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QMYSQLDriverPlugin::QMYSQLDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QMYSQLDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QMYSQL") || name == QLatin1String("QMYSQL3")) {
+ QMYSQLDriver* driver = new QMYSQLDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QMYSQLDriverPlugin::keys() const
+{
+ QStringList l;
+ l << QLatin1String("QMYSQL3");
+ l << QLatin1String("QMYSQL");
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QMYSQLDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqlmysql, QMYSQLDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/mysql/mysql.pro b/src/plugins/sqldrivers/mysql/mysql.pro
new file mode 100644
index 0000000000..b6d42fffc8
--- /dev/null
+++ b/src/plugins/sqldrivers/mysql/mysql.pro
@@ -0,0 +1,6 @@
+TARGET = qsqlmysql
+
+SOURCES = main.cpp
+include(../../../sql/drivers/mysql/qsql_mysql.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/oci/README b/src/plugins/sqldrivers/oci/README
new file mode 100644
index 0000000000..97c27c537e
--- /dev/null
+++ b/src/plugins/sqldrivers/oci/README
@@ -0,0 +1,6 @@
+You will need the Oracle development headers and libraries installed
+before compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/oci/main.cpp b/src/plugins/sqldrivers/oci/main.cpp
new file mode 100644
index 0000000000..ba40f7185f
--- /dev/null
+++ b/src/plugins/sqldrivers/oci/main.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../sql/drivers/oci/qsql_oci.h"
+
+QT_BEGIN_NAMESPACE
+
+class QOCIDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QOCIDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QOCIDriverPlugin::QOCIDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QOCIDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QOCI") || name == QLatin1String("QOCI8")) {
+ QOCIDriver* driver = new QOCIDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QOCIDriverPlugin::keys() const
+{
+ QStringList l;
+ l.append(QLatin1String("QOCI8"));
+ l.append(QLatin1String("QOCI"));
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QOCIDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqloci, QOCIDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/oci/oci.pro b/src/plugins/sqldrivers/oci/oci.pro
new file mode 100644
index 0000000000..d7dcce9e35
--- /dev/null
+++ b/src/plugins/sqldrivers/oci/oci.pro
@@ -0,0 +1,6 @@
+TARGET = qsqloci
+
+SOURCES = main.cpp
+include(../../../sql/drivers/oci/qsql_oci.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/odbc/README b/src/plugins/sqldrivers/odbc/README
new file mode 100644
index 0000000000..279aa7f991
--- /dev/null
+++ b/src/plugins/sqldrivers/odbc/README
@@ -0,0 +1,6 @@
+You will need ODBC development headers and libraries installed before
+compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/odbc/main.cpp b/src/plugins/sqldrivers/odbc/main.cpp
new file mode 100644
index 0000000000..19650baf4a
--- /dev/null
+++ b/src/plugins/sqldrivers/odbc/main.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../sql/drivers/odbc/qsql_odbc.h"
+
+QT_BEGIN_NAMESPACE
+
+class QODBCDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QODBCDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QODBCDriverPlugin::QODBCDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QODBCDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QODBC") || name == QLatin1String("QODBC3")) {
+ QODBCDriver* driver = new QODBCDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QODBCDriverPlugin::keys() const
+{
+ QStringList l;
+ l.append(QLatin1String("QODBC3"));
+ l.append(QLatin1String("QODBC"));
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QODBCDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqlodbc, QODBCDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/odbc/odbc.pro b/src/plugins/sqldrivers/odbc/odbc.pro
new file mode 100644
index 0000000000..677eb6eedf
--- /dev/null
+++ b/src/plugins/sqldrivers/odbc/odbc.pro
@@ -0,0 +1,6 @@
+TARGET = qsqlodbc
+
+SOURCES = main.cpp
+include(../../../sql/drivers/odbc/qsql_odbc.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/psql/README b/src/plugins/sqldrivers/psql/README
new file mode 100644
index 0000000000..86bf16dd25
--- /dev/null
+++ b/src/plugins/sqldrivers/psql/README
@@ -0,0 +1,6 @@
+You will need the PostgreSQL development headers and libraries installed
+before compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/psql/main.cpp b/src/plugins/sqldrivers/psql/main.cpp
new file mode 100644
index 0000000000..3c1f2db985
--- /dev/null
+++ b/src/plugins/sqldrivers/psql/main.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../sql/drivers/psql/qsql_psql.h"
+
+QT_BEGIN_NAMESPACE
+
+class QPSQLDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QPSQLDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QPSQLDriverPlugin::QPSQLDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QPSQLDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QPSQL") || name == QLatin1String("QPSQL7")) {
+ QPSQLDriver* driver = new QPSQLDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QPSQLDriverPlugin::keys() const
+{
+ QStringList l;
+ l.append(QLatin1String("QPSQL7"));
+ l.append(QLatin1String("QPSQL"));
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QPSQLDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqlpsql, QPSQLDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/psql/psql.pro b/src/plugins/sqldrivers/psql/psql.pro
new file mode 100644
index 0000000000..8276c0ae90
--- /dev/null
+++ b/src/plugins/sqldrivers/psql/psql.pro
@@ -0,0 +1,6 @@
+TARGET = qsqlpsql
+
+SOURCES = main.cpp
+include(../../../sql/drivers/psql/qsql_psql.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/qsqldriverbase.pri b/src/plugins/sqldrivers/qsqldriverbase.pri
new file mode 100644
index 0000000000..2f6943ab9a
--- /dev/null
+++ b/src/plugins/sqldrivers/qsqldriverbase.pri
@@ -0,0 +1,8 @@
+include(../qpluginbase.pri)
+QT = core sql
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/sqldrivers
+
+target.path += $$[QT_INSTALL_PLUGINS]/sqldrivers
+INSTALLS += target
+
+DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
diff --git a/src/plugins/sqldrivers/sqldrivers.pro b/src/plugins/sqldrivers/sqldrivers.pro
new file mode 100644
index 0000000000..83d71e48f2
--- /dev/null
+++ b/src/plugins/sqldrivers/sqldrivers.pro
@@ -0,0 +1,13 @@
+TEMPLATE = subdirs
+
+contains(sql-plugins, psql) : SUBDIRS += psql
+contains(sql-plugins, mysql) : SUBDIRS += mysql
+contains(sql-plugins, odbc) : SUBDIRS += odbc
+contains(sql-plugins, tds) : SUBDIRS += tds
+contains(sql-plugins, oci) : SUBDIRS += oci
+contains(sql-plugins, db2) : SUBDIRS += db2
+contains(sql-plugins, sqlite) : SUBDIRS += sqlite
+contains(sql-plugins, sqlite2) : SUBDIRS += sqlite2
+contains(sql-plugins, ibase) : SUBDIRS += ibase
+
+symbian:contains(CONFIG, system-sqlite): SUBDIRS += sqlite_symbian
diff --git a/src/plugins/sqldrivers/sqlite/README b/src/plugins/sqldrivers/sqlite/README
new file mode 100644
index 0000000000..899361a6f5
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite/README
@@ -0,0 +1,6 @@
+You will need the SQLite development headers and libraries installed
+before compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/sqlite/smain.cpp b/src/plugins/sqldrivers/sqlite/smain.cpp
new file mode 100644
index 0000000000..d81b7011b5
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite/smain.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../../src/sql/drivers/sqlite/qsql_sqlite.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSQLiteDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QSQLiteDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QSQLiteDriverPlugin::QSQLiteDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QSQLiteDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QSQLITE")) {
+ QSQLiteDriver* driver = new QSQLiteDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QSQLiteDriverPlugin::keys() const
+{
+ QStringList l;
+ l << QLatin1String("QSQLITE");
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QSQLiteDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqlite, QSQLiteDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/sqlite/sqlite.pro b/src/plugins/sqldrivers/sqlite/sqlite.pro
new file mode 100644
index 0000000000..f4c1671a4b
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite/sqlite.pro
@@ -0,0 +1,8 @@
+TARGET = qsqlite
+
+SOURCES = smain.cpp
+include(../../../sql/drivers/sqlite/qsql_sqlite.pri)
+
+wince*: DEFINES += HAVE_LOCALTIME_S=0
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/sqlite2/README b/src/plugins/sqldrivers/sqlite2/README
new file mode 100644
index 0000000000..899361a6f5
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite2/README
@@ -0,0 +1,6 @@
+You will need the SQLite development headers and libraries installed
+before compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/sqlite2/smain.cpp b/src/plugins/sqldrivers/sqlite2/smain.cpp
new file mode 100644
index 0000000000..9631576725
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite2/smain.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#include "../../../../src/sql/drivers/sqlite2/qsql_sqlite2.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSQLite2DriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QSQLite2DriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QSQLite2DriverPlugin::QSQLite2DriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QSQLite2DriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QSQLITE2")) {
+ QSQLite2Driver* driver = new QSQLite2Driver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QSQLite2DriverPlugin::keys() const
+{
+ QStringList l;
+ l << QLatin1String("QSQLITE2");
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QSQLite2DriverPlugin)
+Q_EXPORT_PLUGIN2(qsqlite2, QSQLite2DriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/sqlite2/sqlite2.pro b/src/plugins/sqldrivers/sqlite2/sqlite2.pro
new file mode 100644
index 0000000000..e6197b9906
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite2/sqlite2.pro
@@ -0,0 +1,6 @@
+TARGET = qsqlite2
+
+SOURCES = smain.cpp
+include(../../../sql/drivers/sqlite2/qsql_sqlite2.pri)
+
+include(../qsqldriverbase.pri)
diff --git a/src/plugins/sqldrivers/sqlite_symbian/SQLite3_v9.2.zip b/src/plugins/sqldrivers/sqlite_symbian/SQLite3_v9.2.zip
new file mode 100644
index 0000000000..df7864410a
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite_symbian/SQLite3_v9.2.zip
Binary files differ
diff --git a/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri b/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri
new file mode 100644
index 0000000000..b7a87f38d8
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pri
@@ -0,0 +1,52 @@
+# We just want to include the sqlite3 binaries for Symbian for platforms that do not have them.
+!symbian-abld:!symbian-sbsv2 {
+ !symbian_no_export_sqlite:!exists($${EPOCROOT}epoc32/release/armv5/lib/sqlite3.dso) {
+ contains(QMAKE_HOST.os,Windows) {
+ # Trick on Windows to do a touch on the file, since copy keeps the timestamp.
+ copyWithTouch = copy /y /b NUL+
+ } else {
+ copyWithTouch = "$$QMAKE_COPY "
+ }
+ symbian_sqlite3_zip_file = $$PWD/SQLite3_v9.2.zip
+
+ # The QMAKE_COPY section is to update timestamp on the file.
+ symbian_sqlite3_header.input = symbian_sqlite3_zip_file
+ symbian_sqlite3_header.output = sqlite3.h
+ !isEmpty(MOC_DIR):symbian_sqlite3_header.output = $$MOC_DIR/$$symbian_sqlite3_header.output
+ symbian_sqlite3_header.CONFIG = combine no_link
+ symbian_sqlite3_header.dependency_type = TYPE_C
+ symbian_sqlite3_header.commands = $$QMAKE_UNZIP -j ${QMAKE_FILE_NAME} epoc32/include/stdapis/${QMAKE_FILE_OUT_BASE}.h \
+ && $${copyWithTouch}${QMAKE_FILE_OUT_BASE}.h ${QMAKE_FILE_OUT}.tmp \
+ && $$QMAKE_DEL_FILE ${QMAKE_FILE_OUT_BASE}.h \
+ && $$QMAKE_MOVE ${QMAKE_FILE_OUT}.tmp ${QMAKE_FILE_OUT}
+ silent:symbian_sqlite3_header.commands = @echo unzipping $@ && $$symbian_sqlite3_header.commands
+ QMAKE_EXTRA_COMPILERS += symbian_sqlite3_header
+
+ # The QMAKE_COPY section is to update timestamp on the file.
+ symbian_sqlite3_dso.input = symbian_sqlite3_zip_file
+ symbian_sqlite3_dso.output = sqlite3.dso
+ !isEmpty(OBJECTS_DIR):symbian_sqlite3_dso.output = $$OBJECTS_DIR/$$symbian_sqlite3_dso.output
+ symbian_sqlite3_dso.CONFIG = combine no_link target_predeps
+ symbian_sqlite3_dso.commands = $$QMAKE_UNZIP -j ${QMAKE_FILE_NAME} epoc32/release/armv5/lib/${QMAKE_FILE_OUT_BASE}.dso \
+ && $${copyWithTouch}${QMAKE_FILE_OUT_BASE}.dso ${QMAKE_FILE_OUT}.tmp \
+ && $$QMAKE_DEL_FILE ${QMAKE_FILE_OUT_BASE}.dso \
+ && $$QMAKE_MOVE ${QMAKE_FILE_OUT}.tmp ${QMAKE_FILE_OUT}
+ silent:symbian_sqlite3_dso.commands = @echo unzipping $@ && $$symbian_sqlite3_dso.commands
+ QMAKE_EXTRA_COMPILERS += symbian_sqlite3_dso
+
+ # Workaround for the fact that make doesn't understand that sqlite3.dso
+ # is the same as $OBJECTS_DIR/sqlite3.dso
+ symbian_sqlite3_dso_standalone.target = sqlite3.dso
+ symbian_sqlite3_dso_standalone.depends = $$symbian_sqlite3_dso.output
+ QMAKE_EXTRA_TARGETS += symbian_sqlite3_dso_standalone
+
+ symbian_sqlite3_ver_dso.input = symbian_sqlite3_zip_file
+ symbian_sqlite3_ver_dso.output = sqlite3{00060003}.dso
+ !isEmpty(OBJECTS_DIR):symbian_sqlite3_ver_dso.output = $$OBJECTS_DIR/$$symbian_sqlite3_ver_dso.output
+ symbian_sqlite3_ver_dso.CONFIG = $$symbian_sqlite3_dso.CONFIG
+ symbian_sqlite3_ver_dso.commands = $$symbian_sqlite3_dso.commands
+ QMAKE_EXTRA_COMPILERS += symbian_sqlite3_ver_dso
+
+ QMAKE_LIBDIR *= $$OBJECTS_DIR
+ }
+}
diff --git a/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pro b/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pro
new file mode 100644
index 0000000000..0d233e6d43
--- /dev/null
+++ b/src/plugins/sqldrivers/sqlite_symbian/sqlite_symbian.pro
@@ -0,0 +1,9 @@
+# Use subdirs template to suppress generation of unnecessary files
+TEMPLATE = subdirs
+
+# We just want to export the sqlite3 binaries for Symbian for platforms that do not have them.
+symbian-abld|symbian-sbsv2 {
+ !symbian_no_export_sqlite:!exists($${EPOCROOT}epoc32/release/armv5/lib/sqlite3.dso) {
+ BLD_INF_RULES.prj_exports += ":zip SQLite3_v9.2.zip"
+ }
+}
diff --git a/src/plugins/sqldrivers/tds/README b/src/plugins/sqldrivers/tds/README
new file mode 100644
index 0000000000..3d27ed46d2
--- /dev/null
+++ b/src/plugins/sqldrivers/tds/README
@@ -0,0 +1,6 @@
+You will need the dblib development headers and libraries installed before
+compiling this plugin.
+
+See the Qt SQL documentation for more information on compiling Qt SQL
+driver plugins (sql-driver.html).
+
diff --git a/src/plugins/sqldrivers/tds/main.cpp b/src/plugins/sqldrivers/tds/main.cpp
new file mode 100644
index 0000000000..646b2d725a
--- /dev/null
+++ b/src/plugins/sqldrivers/tds/main.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#define Q_UUIDIMPL
+#include <qsqldriverplugin.h>
+#include <qstringlist.h>
+#ifdef Q_OS_WIN32 // We assume that MS SQL Server is used. Set Q_USE_SYBASE to force Sybase.
+// Conflicting declarations of LPCBYTE in sqlfront.h and winscard.h
+#define _WINSCARD_H_
+#include <windows.h>
+#endif
+#include "../../../sql/drivers/tds/qsql_tds.h"
+
+QT_BEGIN_NAMESPACE
+
+
+class QTDSDriverPlugin : public QSqlDriverPlugin
+{
+public:
+ QTDSDriverPlugin();
+
+ QSqlDriver* create(const QString &);
+ QStringList keys() const;
+};
+
+QTDSDriverPlugin::QTDSDriverPlugin()
+ : QSqlDriverPlugin()
+{
+}
+
+QSqlDriver* QTDSDriverPlugin::create(const QString &name)
+{
+ if (name == QLatin1String("QTDS") || name == QLatin1String("QTDS7")) {
+ QTDSDriver* driver = new QTDSDriver();
+ return driver;
+ }
+ return 0;
+}
+
+QStringList QTDSDriverPlugin::keys() const
+{
+ QStringList l;
+ l.append(QLatin1String("QTDS7"));
+ l.append(QLatin1String("QTDS"));
+ return l;
+}
+
+Q_EXPORT_STATIC_PLUGIN(QTDSDriverPlugin)
+Q_EXPORT_PLUGIN2(qsqltds, QTDSDriverPlugin)
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sqldrivers/tds/tds.pro b/src/plugins/sqldrivers/tds/tds.pro
new file mode 100644
index 0000000000..b8e8ded321
--- /dev/null
+++ b/src/plugins/sqldrivers/tds/tds.pro
@@ -0,0 +1,6 @@
+TARGET = qsqltds
+
+SOURCES = main.cpp
+include(../../../sql/drivers/tds/qsql_tds.pri)
+
+include(../qsqldriverbase.pri)