Revision: 201033
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 18 Aug 2010 11:05:09 +0300
changeset 152 9f1c3fea0f87
parent 111 29ddb8a72f0e
child 156 ec4d3ac02166
child 168 2bd88482bfe5
Revision: 201033 Kit: 201033
egl/eglinterface/include/1.4/eglext.h
egl/egltest/bwins/egltestcommonu.def
egl/egltest/eabi/egltestcommonu.def
egl/egltest/endpointtestsuite/automated/group/eglendpointlifetimetesthelper.mmp
egl/egltest/endpointtestsuite/automated/group/eglendpointremotetest.mmp
egl/egltest/endpointtestsuite/automated/group/eglendpointtestserver.mmp
egl/egltest/endpointtestsuite/automated/inc/eglendpointwrap.h
egl/egltest/endpointtestsuite/automated/inc/egltest_commscommon.h
egl/egltest/endpointtestsuite/automated/inc/localtestbase.h
egl/egltest/endpointtestsuite/automated/inc/remotetestbase.h
egl/egltest/endpointtestsuite/automated/rom/egltestendpointauto.iby
egl/egltest/endpointtestsuite/automated/scripts/egltest_t_endpoint.script
egl/egltest/endpointtestsuite/automated/src/eglendpointwrap.cpp
egl/egltest/endpointtestsuite/automated/src/egltest_localteststepfactory.cpp
egl/egltest/endpointtestsuite/automated/src/egltest_remoteteststepfactory.cpp
egl/egltest/endpointtestsuite/automated/src/localtestbase.cpp
egl/egltest/endpointtestsuite/automated/src/remotetestbase.cpp
egl/egltest/endpointtestsuite/automated/src/renderstage.cpp
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine_execthread.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine_types.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_images.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_stress_engine.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_stressload.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_stresstests.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_parameters.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_releaseimagegles.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_surface.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_threadedstress.h
egl/egltest/endpointtestsuite/automated/tinc/egltest_threadmonitor.h
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_execthread.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_local.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_remote.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_images.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_stress_engine.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_stressload.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_stresstests.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointapiexposure_remote.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointdirtyarea.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointimagelifetime.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointlocking_local.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointstreamingtests_local.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointtearing_local.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointtearing_remote.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_releaseimagegles_local.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_releaseimagegles_remote.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_surface.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_threadedstress_local.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_threadedstress_remote.cpp
egl/egltest/endpointtestsuite/automated/tsrc/egltest_threadmonitor.cpp
egl/egltest/group/bld.inf
egl/egltest/group/egltest.mmp
egl/egltest/group/egltest_helium.pkg
egl/egltest/inc/egltest_surfacescaling.h
egl/egltest/inc/egltestcommonsession.h
egl/egltest/inc/egltestcommonutils.h
egl/egltest/inc/eglteststep.h
egl/egltest/rom/egltest.iby
egl/egltest/scripts/egltest_run.bat
egl/egltest/scripts/egltest_settings.ini
egl/egltest/scripts/egltest_t_oom_sgimage.script
egl/egltest/scripts/egltest_t_surfacescaling.script
egl/egltest/src/egltest_image.cpp
egl/egltest/src/egltest_image_multiprocess.cpp
egl/egltest/src/egltest_surfacescaling.cpp
egl/egltest/src/egltestcommonsession.cpp
egl/egltest/src/eglteststep.cpp
fbs/fontandbitmapserver/bwins/FBSCLI2U.DEF
fbs/fontandbitmapserver/bwins/fbservu.def
fbs/fontandbitmapserver/eabi/FBSCLI2U.DEF
fbs/fontandbitmapserver/eabi/fbservu.def
fbs/fontandbitmapserver/group/BLD.INF
fbs/fontandbitmapserver/group/FBSCLI.MMP
fbs/fontandbitmapserver/group/FBSERV.MMP
fbs/fontandbitmapserver/group/FbservTest.iby
fbs/fontandbitmapserver/group/TFbsServer.mmp
fbs/fontandbitmapserver/group/fbserv.iby
fbs/fontandbitmapserver/group/fbservtest_helium.pkg
fbs/fontandbitmapserver/group/fbsoogmplugin.iby
fbs/fontandbitmapserver/group/fbsoogmplugin.mmp
fbs/fontandbitmapserver/inc/FBS.H
fbs/fontandbitmapserver/inc/FbsMessage.H
fbs/fontandbitmapserver/sfbs/FBSCLI.CPP
fbs/fontandbitmapserver/sfbs/FBSFONT.CPP
fbs/fontandbitmapserver/sfbs/FBSTOP.CPP
fbs/fontandbitmapserver/sfbs/SERVER.CPP
fbs/fontandbitmapserver/sfbs/SERVER.H
fbs/fontandbitmapserver/sfbs/SESSION.CPP
fbs/fontandbitmapserver/sfbs/UTILS.H
fbs/fontandbitmapserver/sfbs/fbsglyphdataiterator.cpp
fbs/fontandbitmapserver/sfbs/fbsglyphdataiterator.h
fbs/fontandbitmapserver/sfbs/fbsglyphmetricsarray.cpp
fbs/fontandbitmapserver/sfbs/fbsglyphmetricsarray.h
fbs/fontandbitmapserver/sfbs/fbsoogmmessage.h
fbs/fontandbitmapserver/sfbs/fbsoogmmessage.inl
fbs/fontandbitmapserver/sfbs/fbsoogmplugin.cpp
fbs/fontandbitmapserver/sfbs/fbsoogmplugin.h
fbs/fontandbitmapserver/sfbs/fbsoogmplugin.rss
fbs/fontandbitmapserver/sfbs/glyphatlas.cpp
fbs/fontandbitmapserver/sfbs/glyphatlas.h
fbs/fontandbitmapserver/sfbs/patchableconstants.cpp
fbs/fontandbitmapserver/tfbs/TALLOC.H
fbs/fontandbitmapserver/tfbs/TBitmap.h
fbs/fontandbitmapserver/tfbs/TCLEAN.H
fbs/fontandbitmapserver/tfbs/TFBS.CPP
fbs/fontandbitmapserver/tfbs/TFBSDefect.h
fbs/fontandbitmapserver/tfbs/TFbsServer.cpp
fbs/fontandbitmapserver/tfbs/TGetAllBitmapsCapability.h
fbs/fontandbitmapserver/tfbs/TRalc.h
fbs/fontandbitmapserver/tfbs/TSecureFBS.h
fbs/fontandbitmapserver/tfbs/TStreamIdCache.h
fbs/fontandbitmapserver/tfbs/glyphatlastestwrapper.cpp
fbs/fontandbitmapserver/tfbs/glyphatlastestwrapper.h
fbs/fontandbitmapserver/tfbs/scripts/fbstest_T_IPCTest.script
fbs/fontandbitmapserver/tfbs/scripts/fbstest_run.bat
fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_fonttable.script
fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_glyphdata.script
fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_glyphdataoutlineshadow.script
fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_oogm.script
fbs/fontandbitmapserver/tfbs/scripts/glyphdata_config.ini
fbs/fontandbitmapserver/tfbs/scripts/ipctest_config.ini
fbs/fontandbitmapserver/tfbs/tcompressed.h
fbs/fontandbitmapserver/tfbs/textendedbitmapcommon.h
fbs/fontandbitmapserver/tfbs/tfbsbase.h
fbs/fontandbitmapserver/tfbs/tfbsglyphdata.cpp
fbs/fontandbitmapserver/tfbs/tfbsglyphdata.h
fbs/fontandbitmapserver/tfbs/tfbsglyphdataoutlineshadow.cpp
fbs/fontandbitmapserver/tfbs/tfbsglyphdataoutlineshadow.h
fbs/fontandbitmapserver/tfbs/tfbsglyphdatapanic.cpp
fbs/fontandbitmapserver/tfbs/tfbsglyphdatapanic.h
fbs/fontandbitmapserver/tfbs/tfbsmultithread.h
fbs/fontandbitmapserver/tfbs/tfbsoogm.cpp
fbs/fontandbitmapserver/tfbs/tfbsoogm.h
fbs/fontandbitmapserver/tfbs/tfonttableandglyph.h
fbs/fontandbitmapserver/tfbs/tglyphatlas.cpp
fbs/fontandbitmapserver/tfbs/tglyphatlas.h
fbs/fontandbitmapserver/tfbs/tipctest.CPP
fbs/fontandbitmapserver/tfbs/tipctest.h
fbs/fontandbitmapserver/tfbs/trfile.h
fbs/fontandbitmapserver/tfbs/twdp.h
fbs/fontandbitmapserver/traces/OstTraceDefinitions.h
fbs/fontandbitmapserver/traces/fixed_id.definitions
graphicsaccelaration/vgi/group/libvgi.mmp
graphicsaccelaration/vgi/inc/vg/vgcontext.h
graphicscomposition/openwfc_ri_displaychannel/group/bld.inf
graphicscomposition/openwfc_ri_displaychannel/group/graphics_openwfc_ri_displaychannel.mrp
graphicscomposition/openwfc_ri_displaychannel/group/openwfc_ri_displaychannel.iby
graphicscomposition/openwfc_ri_displaychannel/group/openwfc_ri_displaychannel.mmp
graphicscomposition/openwfc_ri_displaychannel/inc/openwfc_ri_displaychannel.h
graphicscomposition/openwfc_ri_displaychannel/src/openwfc_ri_displaychannel.cpp
graphicscomposition/openwfc_ri_displayupdater/group/bld.inf
graphicscomposition/openwfc_ri_displayupdater/group/graphics_openwfc_ri_displayupdater.mrp
graphicscomposition/openwfc_ri_displayupdater/group/openwfc_ri_displayupdater.iby
graphicscomposition/openwfc_ri_displayupdater/group/openwfc_ri_displayupdater.mmp
graphicscomposition/openwfc_ri_displayupdater/inc/openwfc_ri_displayupdater.h
graphicscomposition/openwfc_ri_displayupdater/src/openwfc_ri_displayupdater.cpp
graphicscomposition/openwfcinterface/group/openwfc.iby
graphicscomposition/openwfcompositionengine/adaptation/include/owfdisplaycontext.h
graphicscomposition/openwfcompositionengine/adaptation/include/owfdisplaycontextgeneral.h
graphicscomposition/openwfcompositionengine/adaptation/include/owfextensions.h
graphicscomposition/openwfcompositionengine/adaptation/include/owfmessagequeue.h
graphicscomposition/openwfcompositionengine/adaptation/include/owfnativestream.h
graphicscomposition/openwfcompositionengine/adaptation/include/owfnotifications.h
graphicscomposition/openwfcompositionengine/adaptation/include/owfscreen.h
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/owfnativestream.c
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfdisplaycontext.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfnativestreamstub.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfnotifications.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfscreen.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfscreen_displaychannel.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfconsole.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfextensions.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmessagequeue.c
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmessagequeue.cpp
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmutex.c
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfsemaphore.c
graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfthread.c
graphicscomposition/openwfcompositionengine/bwins/openwfc_ri_displayu.def
graphicscomposition/openwfcompositionengine/common/include/owfattributes.h
graphicscomposition/openwfcompositionengine/common/include/owfdebug.h
graphicscomposition/openwfcompositionengine/common/include/owfimage.h
graphicscomposition/openwfcompositionengine/common/include/owflinkedlist.h
graphicscomposition/openwfcompositionengine/common/include/owfmemory.h
graphicscomposition/openwfcompositionengine/common/include/owftypes.h
graphicscomposition/openwfcompositionengine/common/src/owfattributes.c
graphicscomposition/openwfcompositionengine/common/src/owfdebug.c
graphicscomposition/openwfcompositionengine/common/src/owfimage.c
graphicscomposition/openwfcompositionengine/common/src/owflinkedlist.c
graphicscomposition/openwfcompositionengine/common/src/owfmemory.c
graphicscomposition/openwfcompositionengine/common/src/owfpool.c
graphicscomposition/openwfcompositionengine/composition/include/wfccontext.h
graphicscomposition/openwfcompositionengine/composition/include/wfcdevice.h
graphicscomposition/openwfcompositionengine/composition/include/wfcelement.h
graphicscomposition/openwfcompositionengine/composition/include/wfcimageprovider.h
graphicscomposition/openwfcompositionengine/composition/include/wfcpipeline.h
graphicscomposition/openwfcompositionengine/composition/include/wfcscene.h
graphicscomposition/openwfcompositionengine/composition/include/wfcstructs.h
graphicscomposition/openwfcompositionengine/composition/src/wfcapi.c
graphicscomposition/openwfcompositionengine/composition/src/wfccontext.c
graphicscomposition/openwfcompositionengine/composition/src/wfcdevice.c
graphicscomposition/openwfcompositionengine/composition/src/wfcelement.c
graphicscomposition/openwfcompositionengine/composition/src/wfcimageprovider.c
graphicscomposition/openwfcompositionengine/composition/src/wfcpipeline.c
graphicscomposition/openwfcompositionengine/composition/src/wfcscene.c
graphicscomposition/openwfcompositionengine/eabi/openwfc_ri_displayu.def
graphicscomposition/openwfcompositionengine/group/bld.inf
graphicscomposition/openwfcompositionengine/group/graphics_openwfcompositionengine.mrp
graphicscomposition/openwfcompositionengine/group/openwfc.mmp
graphicscomposition/openwfcompositionengine/group/openwfc_ref.iby
graphicscomposition/openwfcompositionengine/group/openwfc_ri_displaylib.mmp
graphicscomposition/openwfcompositionengine/inc/openwfc_ri_display.h
graphicscomposition/openwfcompositionengine/inc/openwfc_ri_display_update.h
graphicscomposition/openwfcompositionengine/test/group/bld.inf
graphicscomposition/openwfcompositionengine/test/group/t_screeninterfaceserver.mmp
graphicscomposition/openwfcompositionengine/test/rom/t_screeninterface.iby
graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface.ini
graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface.script
graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface_emulator.ini
graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface_emulator.script
graphicscomposition/openwfcompositionengine/test/tscreeninterface/streamutility.cpp
graphicscomposition/openwfcompositionengine/test/tscreeninterface/streamutility.h
graphicscomposition/openwfcompositionengine/test/tscreeninterface/tscreeninterface.cpp
graphicscomposition/openwfcompositionengine/test/tscreeninterface/tscreeninterface.h
graphicscomposition/openwfcompositionengine/test/tscreeninterface/tscreeninterfaceserver.cpp
graphicscomposition/openwfsupport/bwins/WFCinteropu.def
graphicscomposition/openwfsupport/eabi/WFCinteropu.def
graphicscomposition/openwfsupport/inc/owftestexithelper.inl
graphicscomposition/openwfsupport/inc/streammap.h
graphicscomposition/openwfsupport/inc/surfacestream.h
graphicscomposition/openwfsupport/inc/symbianstream.h
graphicscomposition/openwfsupport/src/openwfcstream.cpp
graphicscomposition/openwfsupport/src/streammap.cpp
graphicscomposition/openwfsupport/src/surfacestream.cpp
graphicscomposition/openwfsupport/test/group/bld.inf
graphicscomposition/openwfsupport/test/group/tstreamoperation.mmp
graphicscomposition/openwfsupport/test/scripts/tstreamoperation.script
graphicscomposition/openwfsupport/test/tstreamoperation/tnativestream.cpp
graphicscomposition/openwfsupport/test/tstreamoperation/tnativestream.h
graphicscomposition/openwftest/group/bld.inf
graphicscomposition/openwftest/group/graphics_openwftest.mrp
graphicscomposition/openwftest/group/openwftest.mmp
graphicscomposition/openwftest/inc/eglsynchelper.h
graphicscomposition/openwftest/inc/openwftest.h
graphicscomposition/openwftest/inc/surfaceutility.h
graphicscomposition/openwftest/rom/openwftest.iby
graphicscomposition/openwftest/scripts/openwftest.script
graphicscomposition/openwftest/scripts/openwftest_automatic_c_save.ini
graphicscomposition/openwftest/scripts/openwftest_automatic_e_save.ini
graphicscomposition/openwftest/scripts/openwftest_automatic_nosave.ini
graphicscomposition/openwftest/scripts/openwftest_manual.ini
graphicscomposition/openwftest/src/eglsynchelper.c
graphicscomposition/openwftest/src/openwftest.cpp
graphicscomposition/openwftest/src/openwftestserver.cpp
graphicscomposition/openwftest/src/surfaceutility.cpp
graphicsdeviceinterface/bitgdi/group/BLD.INF
graphicsdeviceinterface/bitgdi/group/BitgdiTest.iby
graphicsdeviceinterface/bitgdi/group/TBitgdiServer.mmp
graphicsdeviceinterface/bitgdi/group/bitgditest_helium.pkg
graphicsdeviceinterface/bitgdi/sbit/FONTBMP.CPP
graphicsdeviceinterface/bitgdi/sbit/MAIN.CPP
graphicsdeviceinterface/bitgdi/tbit/TBitgdiServer.cpp
graphicsdeviceinterface/bitgdi/tbit/TDefect2.cpp
graphicsdeviceinterface/bitgdi/tbit/TDefect2.h
graphicsdeviceinterface/bitgdi/tbit/TFONT.CPP
graphicsdeviceinterface/bitgdi/tbit/TFontSelect.CPP
graphicsdeviceinterface/bitgdi/tbit/scripts/bitgditest_t_multiplescreens.script
graphicsdeviceinterface/bitgdi/tbit/scripts/toutlineandshadow.ini
graphicsdeviceinterface/bitgdi/tbit/tmultiplescreens.cpp
graphicsdeviceinterface/bitgdi/tbit/tmultiplescreens.h
graphicsdeviceinterface/bitgdi/tbit/toutlineandshadowfonts.cpp
graphicsdeviceinterface/gdi/bwins/GDI2U.def
graphicsdeviceinterface/gdi/inc/GDI.H
graphicsdeviceinterface/gdi/inc/gdiconsts.h
graphicsdeviceinterface/gdi/inc/gdiplatapi.h
graphicsdeviceinterface/screendriver/group/scdvtest_helium.pkg
graphicsdeviceinterface/screendriver/sbit/Cdsb.cpp
graphicsdeviceinterface/screendriver/sgeneric/scdraw.h
graphicsdeviceinterface/screendriver/sgeneric/scdraw.inl
graphicsdeviceinterface/screendriver/sgeneric/scnew.cpp
graphicshwdrivers/surfacemgr/inc/surface_hints.h
graphicshwdrivers/surfacemgr/test/group/surfacemanagertest_helium.pkg
graphicshwdrivers/surfacemgr/test/src/tsurfacemanager.cpp
graphicsresourceservices/graphicsresourceimplementation/test/group/sgresourcetest_helium.pkg
graphicsresourceservices/graphicsresourceimplementation/test/scripts/sgresourcetest_t_internal.script
graphicsresourceservices/graphicsresourceimplementation/test/scripts/sgresourcetest_t_stress_auto.script
graphicstest/graphicstestharness/automation/graphicssystemgui.sysdef.xml
graphicstest/graphicstestharness/automation/h4/roms.txt
graphicstest/graphicstestharness/automation/h4/tests_00b.txt
graphicstest/graphicstestharness/automation/h4/tests_01.txt
graphicstest/graphicstestharness/automation/h4/tests_01a.txt
graphicstest/graphicstestharness/automation/h4/tests_eglhybrid.txt
graphicstest/graphicstestharness/automation/h6/tests_00b.txt
graphicstest/graphicstestharness/automation/h6/tests_01.txt
graphicstest/graphicstestharness/automation/h6/tests_01a.txt
graphicstest/graphicstestharness/automation/h6/tests_eglhybrid.txt
graphicstest/graphicstestharness/automation/ne1/tests_01.txt
graphicstest/graphicstestharness/automation/ne1/tests_01a.txt
graphicstest/graphicstestharness/automation/ne1/tests_eglhybrid.txt
graphicstest/graphicstestharness/automation/winscw/tests.txt
graphicstest/graphicstestharness/bwins/tgraphicsfontutilsu.def
graphicstest/graphicstestharness/bwins/tprofileru.def
graphicstest/graphicstestharness/eabi/tgraphicsfontutilsu.def
graphicstest/graphicstestharness/eabi/tprofileru.def
graphicstest/graphicstestharness/group/BLD.INF
graphicstest/graphicstestharness/group/tgraphicsfontutils.mmp
graphicstest/graphicstestharness/inc/TGraphicsHarness.h
graphicstest/graphicstestharness/inc/graphicsfontutils.h
graphicstest/graphicstestharness/inc/singletontestexithelper.inl
graphicstest/graphicstestharness/inc/tprofiler.h
graphicstest/graphicstestharness/rom/graphics_sirocco_ne_wsini.iby
graphicstest/graphicstestharness/rom/graphics_testfontutils.iby
graphicstest/graphicstestharness/rom/minigui_chassis_bats.oby
graphicstest/graphicstestharness/rom/minigui_naviengine_smp.oby
graphicstest/graphicstestharness/src/graphicsfontutils.cpp
graphicstest/graphicstestharness/src/tprofiler.cpp
graphicstest/graphicstestharness/wsini/wsini_naviengine.ini
graphicstest/graphicstestharness/wsini/wsini_vasco.ini
graphicstest/uibench/group/bld.inf
graphicstest/uibench/group/te_uibench.iby
graphicstest/uibench/group/te_uibench.mmp
graphicstest/uibench/group/te_uibench_gce.mmp
graphicstest/uibench/group/te_uibench_helium.pkg
graphicstest/uibench/s60/group/te_uibench_s60.mmp
graphicstest/uibench/scripts/te_uibench.ini
graphicstest/uibench/scripts/te_uibench.script
graphicstest/uibench/scripts/te_uibench_gce.ini
graphicstest/uibench/scripts/te_uibench_gce.script
graphicstest/uibench/src/te_graphicsperformanceSuiteDefs.h
graphicstest/uibench/src/te_graphicsperformanceSuiteServer.cpp
graphicstest/uibench/src/tfbsfonthandleperf.cpp
graphicstest/uibench/src/tfbsglyphdata.cpp
graphicstest/uibench/src/tfbsglyphdata.h
graphicstest/uibench/src/tgcesuiteserver.cpp
graphicstest/uibench/src/trenderorientation.cpp
graphicstest/uibench/src/trenderorientation.h
graphicsutils/commongraphicsheaders/rom/graphics_adaptation.hby
graphicsutils/commongraphicsheaders/test/scripts/tdisplayconfiguration.script
m3g/m3gcore11/src/m3g_loader.c
m3g/m3gcore11/src/m3g_sprite.c
m3g/m3gcore11/src/m3g_vertexarray.c
m3g/m3gcore11/src/m3g_vertexbuffer.c
printingservices/printerdriversupport/group/pdrstoretest_helium.pkg
printingservices/printerdriversupport/inc/prnpath.h
printingservices/printerdriversupport/tps/T_PDR.CPP
printingservices/printerdriversupport/tps/T_PDRLST.CPP
printingservices/printerdriversupport/tps/T_PDRMEM.CPP
windowing/windowserver/SERVER/openwfc/panics.h
windowing/windowserver/SERVER/w32cmd.h
windowing/windowserver/bwins/WS322U.DEF
windowing/windowserver/bwins/ws32switchu.def
windowing/windowserver/debuglog/DECODER.CPP
windowing/windowserver/eabi/WS322U.DEF
windowing/windowserver/group/openwfc/BLD.INF
windowing/windowserver/group/openwfc/WServ_nga.MMP
windowing/windowserver/group/twsthemeserverpropertydefine.mmp
windowing/windowserver/group/wservu_multiscreen.ini
windowing/windowserver/group/wservu_multiscreen_changetracking.ini
windowing/windowserver/inc/Graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H
windowing/windowserver/inc/W32STD.H
windowing/windowserver/inc/graphics/wskeyrouter.h
windowing/windowserver/inc/wspublishandsubscribedata.h
windowing/windowserver/nga/CLIENT/RWINDOW.CPP
windowing/windowserver/nga/CLIENT/RWS.CPP
windowing/windowserver/nga/CLIENT/WSGRAPHIC.CPP
windowing/windowserver/nga/SERVER/CAPKEY.CPP
windowing/windowserver/nga/SERVER/EVENT.CPP
windowing/windowserver/nga/SERVER/EVENT.H
windowing/windowserver/nga/SERVER/EVQUEUE.CPP
windowing/windowserver/nga/SERVER/EVQUEUE.H
windowing/windowserver/nga/SERVER/POINTER.CPP
windowing/windowserver/nga/SERVER/PRIKEY.CPP
windowing/windowserver/nga/SERVER/PRIKEY.H
windowing/windowserver/nga/SERVER/debughelper.cpp
windowing/windowserver/nga/SERVER/debughelper.h
windowing/windowserver/nga/SERVER/openwfc/CLIENT.CPP
windowing/windowserver/nga/SERVER/openwfc/CLIENT.H
windowing/windowserver/nga/SERVER/openwfc/GROUPWIN.CPP
windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.cpp
windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.h
windowing/windowserver/nga/SERVER/openwfc/WINBASE.CPP
windowing/windowserver/nga/SERVER/openwfc/WINDOW.CPP
windowing/windowserver/nga/SERVER/openwfc/WSTOP.CPP
windowing/windowserver/nga/SERVER/openwfc/cliwin.cpp
windowing/windowserver/nga/SERVER/openwfc/gc.cpp
windowing/windowserver/nga/SERVER/openwfc/playbackgc.cpp
windowing/windowserver/nga/SERVER/openwfc/redrawmsgwindow.cpp
windowing/windowserver/nga/SERVER/openwfc/screen.h
windowing/windowserver/nga/SERVER/openwfc/server.h
windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.cpp
windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.h
windowing/windowserver/nga/SERVER/openwfc/wstop.h
windowing/windowserver/nga/SERVER/pointer.h
windowing/windowserver/nga/SERVER/renderorientationtracker.cpp
windowing/windowserver/nga/SERVER/renderorientationtracker.h
windowing/windowserver/nga/SERVER/renderstagemanager.cpp
windowing/windowserver/nga/SERVER/scrdev.cpp
windowing/windowserver/nga/SERVER/windowgroup.h
windowing/windowserver/nga/SERVER/wsdisplaychangeao.cpp
windowing/windowserver/nga/graphicdrawer/graphicdrawer.cpp
windowing/windowserver/nga/graphicdrawer/graphicdrawerarray.cpp
windowing/windowserver/nga/graphicdrawer/graphicdrawerenvironment.cpp
windowing/windowserver/nga/graphicdrawer/graphicdrawerfactory.cpp
windowing/windowserver/nga/graphicdrawer/graphicmsgbuf.cpp
windowing/windowserver/nga/graphicdrawer/wsplugin.cpp
windowing/windowserver/nga/graphicdrawer/wsrenderstage.cpp
windowing/windowserver/nga/remotegc/CommandBuffer.cpp
windowing/windowserver/nga/remotegc/DrawSection.cpp
windowing/windowserver/nonnga/CLIENT/RWS.CPP
windowing/windowserver/nonnga/SERVER/WSTOP.CPP
windowing/windowserver/stdgraphic/BITMAPANIMATIONGRAPHICDRAWER.CPP
windowing/windowserver/stdgraphic/stdgraphicdrawer.h
windowing/windowserver/stdgraphic/stdgraphictest.cpp
windowing/windowserver/stdgraphic/stdgraphictestdrawer.h
windowing/windowserver/test/TAutoServer/TAutoServer.cpp
windowing/windowserver/test/TAutoServer/openwfc/TAutoServer_nga.mmp
windowing/windowserver/test/TAutoServer/openwfc/TAutoServer_nonnga.mmp
windowing/windowserver/test/TAutoServer/tevent_captureapp.mmp
windowing/windowserver/test/scripts/wstest_config.cmd
windowing/windowserver/test/scripts/wstest_t_devicerotation_s0_nga.script
windowing/windowserver/test/t_gdcoverage/gdcoverage.h
windowing/windowserver/test/t_genericplugin/data/ini/wsini_naviengine_genericplugin.ini
windowing/windowserver/test/t_genericplugin/group/bld.inf
windowing/windowserver/test/t_genericplugin/src/t_testrenderstage.cpp
windowing/windowserver/test/t_integ/src/t_wservintegstepsurface.cpp
windowing/windowserver/test/t_ratelimiter/data/wsini_naviengine_ratelimiter.ini
windowing/windowserver/test/t_ratelimiter/data/wsini_vasco_ratelimiter.ini
windowing/windowserver/test/t_ratelimiter/group/bld.inf
windowing/windowserver/test/t_ratelimiter/group/t_ratelimiter_helium.pkg
windowing/windowserver/test/t_ratelimiter/tratelimitdrawer/ratelimitdrawer.h
windowing/windowserver/test/tauto/TCapKey.CPP
windowing/windowserver/test/tauto/TCapKey.H
windowing/windowserver/test/tauto/TEVENT.H
windowing/windowserver/test/tauto/TEvent.CPP
windowing/windowserver/test/tauto/TGRAPHICSDRAWER.CPP
windowing/windowserver/test/tauto/TGWHANDLE.CPP
windowing/windowserver/test/tauto/TOOM.CPP
windowing/windowserver/test/tauto/TOOM.H
windowing/windowserver/test/tauto/TPANIC.CPP
windowing/windowserver/test/tauto/TPANIC.H
windowing/windowserver/test/tauto/talphawin.cpp
windowing/windowserver/test/tauto/tdevicerotation.cpp
windowing/windowserver/test/tauto/tdevicerotation.h
windowing/windowserver/test/tauto/tevent_captureapp.cpp
windowing/windowserver/test/tauto/tgc.cpp
windowing/windowserver/test/tauto/themeserverpropertydefine.cpp
windowing/windowserver/test/tauto/themeserverpropertydefine.h
windowing/windowserver/test/tcsc/wscsc.script
windowing/windowserver/test/tdynamicres/group/bld.inf
windowing/windowserver/test/tdynamicres/group/wstestdynamicres.iby
windowing/windowserver/test/tdynamicres/group/wstestdynamicres_helium.pkg
windowing/windowserver/test/tdynamicres/inc/wsdynamicresbase.h
windowing/windowserver/test/tdynamicres/scripts/wsdynamicresbasic_sirocco.script
windowing/windowserver/test/tdynamicres/src/t_wsdynamicreswinbase.cpp
windowing/windowserver/test/tdynamicres/src/wsdynamicresbase.cpp
windowing/windowserver/test/tdynamicres/src/wsdynamicresbasic.cpp
windowing/windowserver/test/tframerate/framerate.h
windowing/windowserver/test/tlisten/listener.h
windowing/windowserver/test/tredir/redirector.h
windowing/windowserver/wins_switching/ws32_stubs.h
windowing/windowserverplugins/group/BLD.INF
windowing/windowserverplugins/keyeventrouting/bwins/keyrouteru.def
windowing/windowserverplugins/keyeventrouting/eabi/keyrouteru.def
windowing/windowserverplugins/keyeventrouting/group/bld.inf
windowing/windowserverplugins/keyeventrouting/group/keyeventrouting.iby
windowing/windowserverplugins/keyeventrouting/group/keyeventrouting.mmp
windowing/windowserverplugins/keyeventrouting/group/keyeventrouting_test.iby
windowing/windowserverplugins/keyeventrouting/group/keyeventrouting_test.mmp
windowing/windowserverplugins/keyeventrouting/src/keyaliases.h
windowing/windowserverplugins/keyeventrouting/src/keyrouter.cpp
windowing/windowserverplugins/keyeventrouting/src/keyrouterimpl.h
windowing/windowserverplugins/openwfc/group/stdplugin.mmp
windowing/windowserverplugins/openwfc/group/wserv_std_plugins.iby
windowing/windowserverplugins/openwfc/src/displayrenderstage.cpp
windowing/windowserverplugins/openwfc/src/fbrenderstage.cpp
--- a/egl/eglinterface/include/1.4/eglext.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/eglinterface/include/1.4/eglext.h	Wed Aug 18 11:05:09 2010 +0300
@@ -263,17 +263,17 @@
 EGLAPI EGLBoolean EGLAPIENTRY eglEndpointCancelNotificationNOK(EGLDisplay dpy, EGLEndpointNOK endpoint);
 #endif
 
-typedef EGLEndpointNOK ( *PFNEGLCREATEENDPOINTNOKPROC) (EGLDisplay dpy, EGLenum type, EGLenum source_type, EGLEndpointSourceNOK source, const EGLint* attrib_list);
-typedef EGLBoolean ( *PFNEGLDESTROYENDPOINTNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
-typedef EGLint ( *PFNEGLGETENDPOINTATTRIBNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLint attrib);
-typedef EGLBoolean ( *PFNEGLSETENDPOINTATTRIBNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLint attrib, EGLint value);
-typedef EGLBoolean ( *PFNEGLENDPOINTBEGINSTREAMINGNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
-typedef EGLBoolean ( *PFNEGLENDPOINTENDSTREAMINGNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
-typedef EGLImageKHR  ( *PFNEGLACQUIREIMAGENOKPROC)(EGLDisplay dpy, EGLEndpointNOK endpoint);
-typedef EGLBoolean ( *PFNEGLRELEASEIMAGENOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLImageKHR image, EGLenum api);
-typedef EGLint ( *PFNEGLGETENDPOINTDIRTYAREANOKPROC) (EGLDisplay dpy,  EGLEndpointNOK endpoint, EGLint* rects, EGLint start_rect, EGLint max_rects,  EGLBoolean collapse); 
-typedef EGLBoolean ( *PFNEGLENDPOINTREQUESTNOTIFICATIONNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLTRequestStatusNOK sync);
-typedef EGLBoolean ( *PFNEGLENDPOINTCANCELNOTIFICATIONNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
+typedef EGLEndpointNOK (EGLAPIENTRYP PFNEGLCREATEENDPOINTNOKPROC) (EGLDisplay dpy, EGLenum type, EGLenum source_type, EGLEndpointSourceNOK source, const EGLint* attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYENDPOINTNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
+typedef EGLint (EGLAPIENTRYP PFNEGLGETENDPOINTATTRIBNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLint attrib);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETENDPOINTATTRIBNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLint attrib, EGLint value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLENDPOINTBEGINSTREAMINGNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLENDPOINTENDSTREAMINGNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
+typedef EGLImageKHR  (EGLAPIENTRYP PFNEGLACQUIREIMAGENOKPROC)(EGLDisplay dpy, EGLEndpointNOK endpoint);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASEIMAGENOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLImageKHR image, EGLenum api);
+typedef EGLint (EGLAPIENTRYP PFNEGLGETENDPOINTDIRTYAREANOKPROC) (EGLDisplay dpy,  EGLEndpointNOK endpoint, EGLint* rects, EGLint start_rect, EGLint max_rects,  EGLBoolean collapse); 
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLENDPOINTREQUESTNOTIFICATIONNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint, EGLTRequestStatusNOK sync);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLENDPOINTCANCELNOTIFICATIONNOKPROC) (EGLDisplay dpy, EGLEndpointNOK endpoint);
 #endif
 
 #ifndef EGL_SYMBIAN_COMPOSITION
--- a/egl/egltest/bwins/egltestcommonu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/bwins/egltestcommonu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -84,7 +84,7 @@
 	?CheckExpectedError@CTestEglSession@@QAEHH@Z @ 83 NONAME ; int CTestEglSession::CheckExpectedError(int)
 	?GetVgFormat@CEglTestCommonIniSettings@@QAE?AW4VGImageFormat@@ABVTDesC16@@H@Z @ 84 NONAME ; enum VGImageFormat CEglTestCommonIniSettings::GetVgFormat(class TDesC16 const &, int)
 	?CleanupSurfaceFbsBitmapL@CTestEglSession@@QAEXXZ @ 85 NONAME ; void CTestEglSession::CleanupSurfaceFbsBitmapL(void)
-	?CreateWindowSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHAAVRWindow@@HHH@Z @ 86 NONAME ; void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(int, class RWindow &, int, int, int)
+	?CreateWindowSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHAAVRWindow@@HHHPAH@Z	 @ 86 NONAME ; void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(int, class RWindow &, int, int, int, int*)
 	?CloseSgDriver@CTestEglSession@@QAEXXZ @ 87 NONAME ; void CTestEglSession::CloseSgDriver(void)
 	?doTestStepPreambleL@CEglTestStep@@UAE?AW4TVerdict@@XZ @ 88 NONAME ; enum TVerdict CEglTestStep::doTestStepPreambleL(void)
 	??0CTestEglSession@@IAE@AAVCTestExecuteLogger@@AAHH@Z @ 89 NONAME ; CTestEglSession::CTestEglSession(class CTestExecuteLogger &, int &, int)
@@ -119,4 +119,3 @@
 	?GetThresholdGPUUsedMemory@CEglTestCommonIniSettings@@QAEHABVTDesC16@@@Z @ 118 NONAME ; int CEglTestCommonIniSettings::GetThresholdGPUUsedMemory(class TDesC16 const &)
 	?GetThresholdLastIteration@CEglTestCommonIniSettings@@QAEHABVTDesC16@@@Z @ 119 NONAME ; int CEglTestCommonIniSettings::GetThresholdLastIteration(class TDesC16 const &)
 	?GetWindowSize@CEglTestCommonIniSettings@@QAE?AVTSize@@ABVTDesC16@@@Z @ 120 NONAME ; class TSize CEglTestCommonIniSettings::GetWindowSize(class TDesC16 const &)
-
--- a/egl/egltest/eabi/egltestcommonu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/eabi/egltestcommonu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -82,7 +82,7 @@
 	_ZN15CTestEglSession31TryUsePixmapCFbsBitmapOpenGlesLEiRK5TSize12TDisplayModei @ 81 NONAME
 	_ZN15CTestEglSession34CreatePixmapSurfaceAndMakeCurrentLEiRK12TSgImageInfoNS_18TResourceCloseRuleEii @ 82 NONAME
 	_ZN15CTestEglSession34CreatePixmapSurfaceAndMakeCurrentLEiRK5TSize12TDisplayModeii @ 83 NONAME
-	_ZN15CTestEglSession34CreateWindowSurfaceAndMakeCurrentLEiR7RWindowiii @ 84 NONAME
+	_ZN15CTestEglSession34CreateWindowSurfaceAndMakeCurrentLEiR7RWindowiiiPi @ 84 NONAME
 	_ZN15CTestEglSession35CreatePbufferSurfaceAndMakeCurrentLEiRK5TSizeii @ 85 NONAME
 	_ZN15CTestEglSession42CreatePixmapSurfaceAndMakeCurrentAndMatchLERK12TSgImageInfoNS_18TResourceCloseRuleEii @ 86 NONAME
 	_ZN15CTestEglSession42CreatePixmapSurfaceAndMakeCurrentAndMatchLERK5TSize12TDisplayModeii @ 87 NONAME
@@ -138,4 +138,3 @@
 	_ZN25CEglTestCommonIniSettings13GetWindowSizeERK7TDesC16 @ 137 NONAME
 	_ZN25CEglTestCommonIniSettings25GetThresholdGPUUsedMemoryERK7TDesC16 @ 138 NONAME
 	_ZN25CEglTestCommonIniSettings25GetThresholdLastIterationERK7TDesC16 @ 139 NONAME
-
--- a/egl/egltest/endpointtestsuite/automated/group/eglendpointlifetimetesthelper.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/group/eglendpointlifetimetesthelper.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -46,7 +46,8 @@
 LIBRARY					rfileloggerclient.lib
 LIBRARY                 euser.lib
 LIBRARY                 libEGL.lib
-library         		libOpenVG.lib
+LIBRARY         		libOpenVG.lib
+LIBRARY                 libOpenVGU.lib
 LIBRARY                 testexecuteutils.lib
 LIBRARY                 testexecutelogclient.lib
 LIBRARY                 ws32.lib
--- a/egl/egltest/endpointtestsuite/automated/group/eglendpointremotetest.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/group/eglendpointremotetest.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -49,11 +49,14 @@
 SOURCEPATH			../tsrc
 SOURCE				egltest_endpointapiexposure_remote.cpp
 SOURCE				egltest_endpointtearing_remote.cpp
+SOURCE				egltest_threadedstress_remote.cpp
+SOURCE				egltest_releaseimagegles_remote.cpp
 
 // Utility code. 
 SOURCE				egltest_endpoint_images.cpp
 SOURCE				egltest_surface.cpp 
 SOURCE				egltest_endpoint_engine_remote.cpp
+SOURCE				egltest_threadmonitor.cpp
 
 LIBRARY				euser.lib
 LIBRARY				estor.lib
@@ -63,6 +66,7 @@
 library             fbscli.lib
 LIBRARY             gdi.lib
 library         	libOpenVG.lib
+LIBRARY             libOpenVGU.lib
 library 			surfacemanager.lib
 library             surfaceupdateclient.lib
 
--- a/egl/egltest/endpointtestsuite/automated/group/eglendpointtestserver.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/group/eglendpointtestserver.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -56,6 +56,11 @@
 SOURCE					egltest_endpointstreamingtests_local.cpp
 SOURCE					egltest_endpointnotification.cpp
 SOURCE					egltest_endpointdirtyarea.cpp
+SOURCE 					egltest_endpoint_stress_engine.cpp 
+SOURCE					egltest_endpoint_stresstests.cpp
+SOURCE					egltest_endpoint_stressload.cpp
+SOURCE					egltest_threadedstress_local.cpp
+SOURCE					egltest_releaseimagegles_local.cpp
 
 SOURCEPATH				../scripts
 DOCUMENT				egltest_t_endpoint.script
@@ -63,7 +68,8 @@
 LIBRARY					rfileloggerclient.lib
 LIBRARY                 euser.lib
 LIBRARY                 libEGL.lib
-library         		libOpenVG.lib
+LIBRARY         		libOpenVG.lib
+LIBRARY                 libOpenVGU.lib
 LIBRARY                 testexecuteutils.lib
 LIBRARY                 testexecutelogclient.lib
 LIBRARY                 ws32.lib
--- a/egl/egltest/endpointtestsuite/automated/inc/eglendpointwrap.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/inc/eglendpointwrap.h	Wed Aug 18 11:05:09 2010 +0300
@@ -40,7 +40,7 @@
  * were resolved. Trying to use one of the endpoint functions in the event of a
  * construction error will result in a panic.
  */
-class TEglEndpointWrap : public CBase
+class TEglEndpointWrap
     {
 public:
     TEglEndpointWrap();
--- a/egl/egltest/endpointtestsuite/automated/inc/egltest_commscommon.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/inc/egltest_commscommon.h	Wed Aug 18 11:05:09 2010 +0300
@@ -70,6 +70,15 @@
 
     //Image Tearing Test.
     ETestUidEndpointTearing,
+    
+    //Multithreaded stress tests.
+    ETestUidEndpointThreadStress,
+    
+    //Release Image with Gles context tests.
+    ETestUidEndpointReleaseImageGles,
+    
+    // vgThreading test.
+    ETestUidVgThreading,
     };
 
 
@@ -91,6 +100,16 @@
     TSurfaceId iSurfaceId;
     };
 
+struct TTestEndpointThreadStress
+    {
+    TInt iNumThreads;
+    };
+
+struct TTestEndpointReleaseImageGles
+    {
+    TBool iUseValidGlesContext;
+    };
+
 
 //Union for all of the structs that tests use to pass
 //params between the local side and the remote side.
@@ -101,9 +120,18 @@
 
     //Endpoint engine data.
     TTestEndpointEngine iEndpointEngine;
+    
+    // Endpoint Engine configuration data.
+    TTestEndpointEngineConfig iEndpointEngineConfig;
 
     //Image Tearing Test.
     TTestEndpointTearing iEndpointTearing;
+    
+    //Multithreaded stress tests.
+    TTestEndpointThreadStress iEndpointThreadStress;
+    
+    //Release Image with Gles context tests.
+    TTestEndpointReleaseImageGles iEndpointReleaseImageGles;
     };
 
 
--- a/egl/egltest/endpointtestsuite/automated/inc/localtestbase.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/inc/localtestbase.h	Wed Aug 18 11:05:09 2010 +0300
@@ -31,7 +31,7 @@
 
 
 // Entry point
-GLDEF_C TInt E32Main(void);
+GLDEF_C TInt E32Main();
 
 /**
 CEglEndpointTestServer	Server encapsulates the functionality required to execute Test Execute based test cases for the EGL endpoint extension.
--- a/egl/egltest/endpointtestsuite/automated/inc/remotetestbase.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/inc/remotetestbase.h	Wed Aug 18 11:05:09 2010 +0300
@@ -155,6 +155,8 @@
     virtual TRemoteTestVerdict DoRunRemoteTestCaseL(TInt aTestCase, const TRemoteTestParams& aMessageIn) = 0;
     virtual TRemoteTestVerdict DoEndRemoteTestStepL(const TRemoteTestParams& aMessageIn);
 
+    virtual TInt Timeout() const;
+    
     void Log(const TText8* aFile, TInt aLine, TInt aSeverity, TRefByValue<const TDesC> aFmt, ...);
     const TEglEndpointWrap& EglEndpoint() const;
 
--- a/egl/egltest/endpointtestsuite/automated/rom/egltestendpointauto.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/rom/egltestendpointauto.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -26,8 +26,8 @@
 ECOM_PLUGIN(eglendpointremotetest.dll,eglendpointremotetest.rsc)
 #endif
 
-file=ABI_DIR\DEBUG_DIR\eglendpointtestserver.exe                        sys\bin\eglendpointtestserver.exe
-file=ABI_DIR\DEBUG_DIR\eglendpointlifetimetesthelper.exe                sys\bin\eglendpointlifetimetesthelper.exe
+file=ABI_DIR\BUILD_DIR\eglendpointtestserver.exe                        sys\bin\eglendpointtestserver.exe
+file=ABI_DIR\BUILD_DIR\eglendpointlifetimetesthelper.exe                sys\bin\eglendpointlifetimetesthelper.exe
 // tef scripts
 data=DATAZ_\egltest\egltest_t_endpoint.script                    \egltest\egltest_t_endpoint.script
 data=DATAZ_\resource\apps\egltest_endpoint\image1.mbm 			 \resource\apps\egltest_endpoint\image1.mbm
--- a/egl/egltest/endpointtestsuite/automated/scripts/egltest_t_endpoint.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/scripts/egltest_t_endpoint.script	Wed Aug 18 11:05:09 2010 +0300
@@ -16,14 +16,10 @@
 PRINT Run EGL endpoint tests.
 LOAD_SUITE eglendpointtestserver
 
-//The remote side of the framework is hard coded to timeout after 10 seconds,
-//So any remote portion of a test that lasts longer than 10 seconds will
-//cause the whole test to timeout. This can be changed in remotetestbase.cpp.
-//The timeouts passed to TEF below MUST always be bigger than that used for
-//the remote side (currently 10 seconds).
+//Note: Tests should be sorted by "increasing dependency", so that the 
+//most basic functionality tests are done first.
 
-// Note: Tests should be sorted by "increasing dependency", so that the 
-// most basic functionality tests are done first. 
+//Functional Tests.
 RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointApiExposure
 RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointCreate
 RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointStreaming
@@ -37,3 +33,10 @@
 RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointStreamingTests
 RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointStreamingDispXTimesInStream
 RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointDirtyArea
+RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointReleaseImageGles
+
+//Stress Tests.
+RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointCrazyThreading
+// RUN_TEST_STEP 300 eglendpointtestserver EGL_EndpointOutOfHeapMemory
+RUN_TEST_STEP 1200 eglendpointtestserver EGL_EndpointStressLoad
+RUN_TEST_STEP 1200 eglendpointtestserver EGL_EndpointStressTests
--- a/egl/egltest/endpointtestsuite/automated/src/eglendpointwrap.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/src/eglendpointwrap.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -24,7 +24,6 @@
 #include "egltest_commscommon.h"
 
 
-
 /*
  * TEglEndpointWrap is a simple class that presents all of the EGL endpoint
  * extension functions without the user needing to perform an eglGetProcAddress()
@@ -74,7 +73,8 @@
     }
 
 
-EGLEndpointNOK TEglEndpointWrap::CreateEndpoint(EGLDisplay dpy, EGLenum type, EGLenum source_type, EGLEndpointSourceNOK source, const EGLint *attrib_list) const
+EGLEndpointNOK TEglEndpointWrap::CreateEndpoint(EGLDisplay dpy, EGLenum type, EGLenum source_type, 
+                                                EGLEndpointSourceNOK source, const EGLint *attrib_list) const
     {
     ENDPOINT_ASSERT_DEBUG(iError == KErrNone, User::Invariant());
     return ipfnEglCreateEndpointNOK(dpy, type, source_type, source, attrib_list);
@@ -130,7 +130,8 @@
     }
 
 
-EGLint TEglEndpointWrap::GetEndpointDirtyArea(EGLDisplay dpy, EGLEndpointNOK endpoint, EGLint* rects, EGLint start_rect, EGLint max_rects, EGLBoolean collapse) const
+EGLint TEglEndpointWrap::GetEndpointDirtyArea(EGLDisplay dpy, EGLEndpointNOK endpoint, EGLint* rects, 
+                                              EGLint start_rect, EGLint max_rects, EGLBoolean collapse) const
     {
     ENDPOINT_ASSERT_DEBUG(iError == KErrNone, User::Invariant());
     return ipfnEglGetEndpointDirtyAreaNOK(dpy, endpoint, rects, start_rect, max_rects, collapse);
--- a/egl/egltest/endpointtestsuite/automated/src/egltest_localteststepfactory.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/src/egltest_localteststepfactory.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -30,6 +30,10 @@
 #include "egltest_endpointstreamingtests.h"
 #include "egltest_endpointnotification.h"
 #include "egltest_endpointdirtyarea.h"
+#include "egltest_endpoint_stresstests.h"
+#include "egltest_endpoint_stressload.h"
+#include "egltest_threadedstress.h"
+#include "egltest_releaseimagegles.h"
 
 //LocalTestStep factory.
 CTestStep* CEglEndpointTestServer::CreateTestStep(const TDesC& aStepName)
@@ -86,7 +90,27 @@
         {
         return new CEglTest_LocalTestStep_EndpointDirtyArea;
         }
-
+    if (aStepName == KEGL_EndpointStressTests)
+        {
+        return CEglTest_TestStep_StressTests::New();
+        }
+    if (aStepName == KEGL_EndpointStressLoad)
+        {
+        return CEglTest_TestStep_StressLoad::New();
+        }
+    if (aStepName == KEGL_EndpointCrazyThreading)
+        {
+        return new CEglTest_LocalTestStep_EndpointCrazyThreading();
+        }
+    if (aStepName == KEGL_EndpointOutOfHeapMemory)
+        {
+        return new CEglTest_LocalTestStep_EndpointOutOfHeapMemory();
+        }
+    if (aStepName == KEGL_EndpointReleaseImageGles)
+        {
+        return new CEglTest_LocalTestStep_EndpointReleaseImageGles();
+        }
+    
     return NULL;
     }
 
--- a/egl/egltest/endpointtestsuite/automated/src/egltest_remoteteststepfactory.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/src/egltest_remoteteststepfactory.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -22,6 +22,8 @@
 #include "egltest_endpointapiexposure.h"
 #include "egltest_endpoint_engine.h"
 #include "egltest_endpointtearing.h"
+#include "egltest_threadedstress.h"
+#include "egltest_releaseimagegles.h"
 
 
 //RemoteTestStep Factory.
@@ -29,10 +31,12 @@
     {
     switch (aTestUid)
         {
-        case ETestUidEndpointApiExposure:   return new (ELeave) CEglTest_RemoteTestStep_EndpointApiExposure();
-        case ETestUidEndpointEngine:        return new (ELeave) CEgltest_Remote_Engine();
-        case ETestUidEndpointTearing:       return new (ELeave) CEglTest_RemoteTestStep_EndpointTearing();
-        default:                            User::Leave(KErrUnknown);
+        case ETestUidEndpointApiExposure:       return new (ELeave) CEglTest_RemoteTestStep_EndpointApiExposure();
+        case ETestUidEndpointEngine:            return new (ELeave) CEgltest_Remote_Engine();
+        case ETestUidEndpointTearing:           return new (ELeave) CEglTest_RemoteTestStep_EndpointTearing();
+        case ETestUidEndpointThreadStress:      return new (ELeave) CEglTest_RemoteTestStep_EndpointThreadStress();
+        case ETestUidEndpointReleaseImageGles:  return new (ELeave) CEglTest_RemoteTestStep_EndpointReleaseImageGles();
+        default:                                User::Leave(KErrUnknown);
         }
 
     //Stop the warning.
--- a/egl/egltest/endpointtestsuite/automated/src/localtestbase.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/src/localtestbase.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -71,6 +71,7 @@
     
     DoPostambleL();
     delete iResultLog;
+    iResultLog = NULL;
     iResultOutQueue.Close();
     iParamsInQueue.Close();
     return EPass;
@@ -405,7 +406,8 @@
 
 void CTestIdResultLogger::LogResult(TVerdict aVerdict)
     {
-    TBuf<20> verdict;
+    const TInt KMaxVerdictLength = 20;
+    TBuf<KMaxVerdictLength> verdict;
     switch(aVerdict)
         {
         case EPass:           verdict.Append(_L("PASS"));            break;
@@ -432,24 +434,21 @@
 
 TInt CTestIdResultLogger::PanicMonitorMain(TAny* aSelf)
     {
+    CTestIdResultLogger* self = static_cast<CTestIdResultLogger*>(aSelf);
+    
+    //Create cleanup stack.
     CTrapCleanup* cleanup = CTrapCleanup::New();
-
-    TRAPD(err,
-        //Create active scheduler.
-        CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
-        CleanupStack::PushL(scheduler);
-        CActiveScheduler::Install(scheduler);
-
-        //Run MainL.
-        CTestIdResultLogger* self = static_cast<CTestIdResultLogger*>(aSelf);
-        self->PanicMonitorMainL();
-
-        //Clean up.
-        CleanupStack::PopAndDestroy(scheduler);
-        );
+    ASSERT(cleanup);
     
+    //Create active scheduler.
+    CActiveScheduler* scheduler = new CActiveScheduler();
+    ASSERT(scheduler);
+    CActiveScheduler::Install(scheduler);
+    
+    TRAPD(err,  self->PanicMonitorMainL());
     __ASSERT_ALWAYS(err == KErrNone, User::Invariant());
-
+    
+    delete scheduler;
     delete cleanup;
     return KErrNone;
     }
@@ -541,7 +540,7 @@
 	{
 	__UHEAP_MARK;
 	CTrapCleanup* cleanup = CTrapCleanup::New();
-	if(cleanup == NULL)
+	if(!cleanup)
 		{
 		return KErrNoMemory;
 		}
--- a/egl/egltest/endpointtestsuite/automated/src/remotetestbase.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/src/remotetestbase.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -34,9 +34,11 @@
 #include <e32math.h>
 
 
-// Timout for remote test steps. This MUST be smaller
+// Default timout for remote test steps. This MUST be smaller
 // than any timeout passed to TEF for the local test step
-// in the script file.
+// in the script file. Remote test steps can override this 
+// value by implementing the Timeout() function in their 
+// derrived class.
 const TInt KRemoteTestStepTimeout = 10 * 1000000;
 
 
@@ -68,6 +70,7 @@
 
 CTimeoutTimer::~CTimeoutTimer()
     {
+    Cancel();
     }
 
 
@@ -315,7 +318,7 @@
         }
 
     //Activate the TimoutTimer, TestCaseListener and WorkerListener.
-    iTimeoutTimer->After(KRemoteTestStepTimeout);
+    iTimeoutTimer->After(iCurTestStep->Timeout());
     iTestCaseListener->Listen();
     iWorkerListener->Listen(iCurWorker);
 
@@ -464,7 +467,7 @@
 void CRemoteTestEnv::DoEglHeapMark()
     {
 #if USE_EGLHEAP_CHECKING
-    typedef void (*TEglDebugHeapMarkStartPtr)(void);
+    typedef void (*TEglDebugHeapMarkStartPtr)();
 
     TEglDebugHeapMarkStartPtr  heapMarkStart = reinterpret_cast<TEglDebugHeapMarkStartPtr>(eglGetProcAddress("egliDebugHeapMarkStart"));
     if (heapMarkStart)
@@ -562,23 +565,21 @@
 TInt CRemoteTestEnv::TestThreadEntryPoint(TAny* aSelf)
     {
     CRemoteTestEnv* self = static_cast<CRemoteTestEnv*>(aSelf);
+    
+    //Create cleanup stack.
     CTrapCleanup* cleanup = CTrapCleanup::New();
-
-    TRAPD(err,
-        //Create active scheduler.
-        CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
-        CleanupStack::PushL(scheduler);
-        CActiveScheduler::Install(scheduler);
-
-        //Run the current test step.
-        self->RunCurrentTestStepL();
-
-        //Clean up.
-        CleanupStack::PopAndDestroy(scheduler);
-        );
-
+    ASSERT(cleanup);
+    
+    //Create active scheduler.
+    CActiveScheduler* scheduler = new CActiveScheduler();
+    ASSERT(scheduler);
+    CActiveScheduler::Install(scheduler);
+    
+    TRAPD(err, self->RunCurrentTestStepL());
     __ASSERT_ALWAYS(err == KErrNone, User::Invariant());
 
+    //Clean up.
+    delete scheduler;
     delete cleanup;
     return KErrNone;
     }
@@ -637,6 +638,12 @@
     }
 
 
+TInt CRemoteTestStepBase::Timeout() const
+    {
+    return KRemoteTestStepTimeout;
+    }
+
+
 class TOverflowTruncate : public TDesOverflow
     {
 public:
--- a/egl/egltest/endpointtestsuite/automated/src/renderstage.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/src/renderstage.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -93,31 +93,25 @@
 TInt CRenderStage::TestEnvThreadEntryPoint(TAny* /*aSelf*/)
     {
     RDebug::Printf("CRenderStage: Entering Test Environment Thread...");
-
+    
+    //Create cleanup stack.
     CTrapCleanup* cleanup = CTrapCleanup::New();
-
-    TRAPD(err,
-        //Create active scheduler.
-        CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
-        CleanupStack::PushL(scheduler);
-        CActiveScheduler::Install(scheduler);
+    ASSERT(cleanup);
+    
+    //Create active scheduler.
+    CActiveScheduler* scheduler = new CActiveScheduler();
+    ASSERT(scheduler);
+    CActiveScheduler::Install(scheduler);
+    
+    //Create a CRemoteTestEnv.
+    CRemoteTestEnv* testEnv = NULL;
+    TRAPD(err, testEnv = CRemoteTestEnv::NewL());
+    __ASSERT_ALWAYS(err == KErrNone, User::Invariant());
+    testEnv->StartReceivingCmds();
 
-        //Create a CRemoteTestEnv.
-        CRemoteTestEnv* testEnv = CRemoteTestEnv::NewL();
-        CleanupStack::PushL(testEnv);
-        testEnv->StartReceivingCmds();
-
-        //Clean up.
-        CleanupStack::PopAndDestroy(2, scheduler);
-        );
-
-    if(err != KErrNone)
-        {
-        User::Invariant();
-        }
-
+    //Clean up.
+    delete scheduler;
     delete cleanup;
-
     RDebug::Printf("CRenderStage: Leaving Test Environment Thread...");
     return KErrNone;
     }
--- a/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine.h	Wed Aug 18 11:05:09 2010 +0300
@@ -29,23 +29,20 @@
 #include "egltest_endpoint_engine_types.h"
 #include "egltest_endpoint_images.h"
 
-
-#define ENGINE_ASSERT(x) DoEngineAssert(x, #x, __FILE__, __LINE__)
+#define ENGINE_ASSERT(x) DoEngineAssert((x) != 0, #x, __FILE__, __LINE__)
 
 static inline void DoEngineAssert(TInt aX, const char *aXStr, 
         const char *aFile, TInt aLine)
     {
     if (!aX)
         {
-        RDebug::Printf("ENGINE_ASSERT(%s) failed (value %d) at %s:%d\n",
+        RDebug::Printf("EGL_ENDPOINT_TEST_ENGINE ASSERT(%s) failed (value %d) at %s:%d\n",
                 aXStr, aX, aFile, aLine);
         User::Panic(_L("ENGINE_ASSERT"), aLine);
         }
     }
 
 
-
-
 // This could be wrapped in #if/#else to allow us to generate non-unicode text content.
 #define TESTIDS(x)  _S(x)
 #define CASETITLE(x)  _S(x)
@@ -85,10 +82,12 @@
     TVerdict             iBufferCountVerdict;
     // Get Surface parameter reply.
     TSurfaceParamsRemote iSurfaceParams;
-    // To check that we are in sync - it should match the request!
+    // To check that we are in sync - it should match the request.
     TEngineCases         iCase;
     };
 
+const TInt KMaxLoadThreads = 4;
+
 NONSHARABLE_CLASS(CEgltest_Local_Engine): public CLocalTestStepBase
     {
 private:
@@ -104,31 +103,41 @@
     virtual TVerdict doTestStepL();
     virtual void DoPreambleL();
     virtual void DoPostambleL();
+    void SetTestCasesL(const TTestCases * const aTestCases, TInt aNumCases);
     
 private:
-    void RunTestCaseL(const TTestCases &aTestCase);
-    void LogDump(const TEngineTestCase &aItem);
-    void RunOneTestCaseL(const TTestCase& aTestCase, TSurfaceType aSurfType);
-    void RunSingleCaseL(const TTestCase& aTestCase, TSurfaceType aSurfType);
+    void RunTestCase(const TTestCases &aTestCase);
+    void RunOneTestCase(const TTestCase& aTestCase, TSurfaceType aSurfType);
     void SendLocalTestCase(const TRemoteTestParams &aParams);
-    TVerdict RunRemoteTestCase(TInt aTestCase, const TRemoteTestParams& aMessageIn);
-    void RunLocalTestCase(const TRemoteTestParams& aMessageIn, TExecResult& aResult);
     void RunLocalTestCase(TEngineCases aCase);
     void DoSyncToLocal();
     void GetLocalResult(TExecResult& aResult, TEngineCases aCase);
     void DoMonitorThreadEntry();
     void ForwardPanic(RThread& aThread, RThread& aOtherThread, TRequestStatus &aStatus);
     static TInt MonitorThreadEntry(TAny *aParam);
+    void RunControllerLocalAndRemoteL(const TEngineTestCase&, const TRemoteTestParams& params);
+    
+protected:
+    void RunLocalTestCase(const TRemoteTestParams& aMessageIn, TExecResult& aResult);
+    TVerdict RunRemoteTestCase(TInt aTestCase, const TRemoteTestParams& aMessageIn);
+    void RunSingleCaseL(const TTestCase& aTestCase, TSurfaceType aSurfType);
+    void CommonPreambleL();
+    CEgltest_Local_Engine();
+    // The StartThread and EndThread needs to be overridden in the 
+    // implementation to provide a good functionality. 
+    virtual void StartThreadL(TInt aThreadNumber);
+    virtual void EndThread(TInt aThreadNumber);
     
 protected:
     const TTestCases*                  iTestCases;
-    const TInt                         iNumCases;
+    TInt                               iNumCases;
     RThread                            iExecThread;
     RThread                            iMonitorThread;
     RThread                            iControllerThread;  // Controller thread
     RMsgQueue<TExecResult>             iExecResultOutQueue;
     RMsgQueue<TRemoteTestParamsPacket> iExecParamsInQueue;
     TExecState                         iExecState;
+    TBool                              iLogging;
     };
 
 
@@ -139,6 +148,13 @@
     EGLImageKHR    iImage;
     };
 
+
+struct TAvailableMemory
+    {
+    TInt iHeapMemAvailable;
+    TInt iGpuMemAvailable;
+    };
+
 // Base class that allows "script" style exectution of testcases.
 NONSHARABLE_CLASS(CEgltest_Remote_Engine): public CRemoteTestStepBase
     {
@@ -166,6 +182,23 @@
     void GetEndpointDirtyAreaL(const TRemoteTestParams& aParams, const TRemoteTestArgs& aArgs);
     void DoCheckRectsL(EGLint *aActualRects, EGLint aRectCount, EGLint aMaxRects,
                        TInt aRectsIndex, const TRect aSurfacRect);
+    void CheckForMemoryLeaks();
+    void CheckForMemoryLeaksFinish();
+    
+    TInt FillGpuMemory();
+    TInt CalculateAvailableGPUMemory();
+    TInt CalculateAvailableHeapMemory();
+    
+    // Thread entry points for "load" threads.
+    static TInt LoadHeapMemory(TAny *);
+    void LoadHeapMemoryL();
+    static TInt LoadGpuMemory(TAny *);
+    void LoadGpuMemoryL();
+
+    void StartThreadL(TInt aThreadNumber);
+    void EndThread(TInt aThreadNumber);
+    TThreadFunction GetThreadFunction(TInt aThreadNumber);
+
 private:
     EGLEndpointNOK iEndpoints[KMaxEndpoints];
     EGLImageKHR iEglImage[KMaxEndpoints];
@@ -174,6 +207,22 @@
     TRemoteTestVerdict iTestVerdict;
     TBool iLogging;
     CEglWindowSurface *iSurface;
+    // when this flag is set, errors discovered during a test-step is logged.
+    // This is normally true, but for stress tests [etc], it can be turned
+    // off so that when a test is set up to run 1000 times, but only succeeds
+    // X times, we don't get "error, something failed", when we really didn't
+    // get an error.
+    TBool iLogErrors;
+    
+    // Tracking memory available. 
+    RArray<TAvailableMemory> iMemoryStats;
+    
+    // Variables to keep track of load-threads.
+    RThread iLoadThread[KMaxLoadThreads];
+    TBool   iStopThreadFlag[KMaxLoadThreads]; 
+    
+    RHeap* iMainThreadHeap;
+    PFNEGLQUERYPROFILINGDATANOKPROC ipfnEglQueryProfilingDataNOK;
     };
 
 
@@ -216,10 +265,31 @@
 	  CASE(EGetSurfaceParamsCase);
 	  CASE(EFinishedCase);
 	  CASE(ECreateVgImageCase);
+      CASE(EDestroySurfaceCase);
+      CASE(EStartLoadThreadCase);
+      CASE(EEndLoadThreadCase);
+      CASE(ECheckForMemoryLeaks);
+      CASE(ECheckForMemoryLeaksFinish);
         }
     return caseName;
     }
 
 #undef CASE
 
+
+inline void LogDump(CTestExecuteLogger &aLogger, const TEngineTestCase& aCase)
+{
+    const TText *caseName = EngineCaseName(aCase.iCase);
+    aLogger.LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo,
+                    _L("Performing subcase %d (%s), with flags=%d, err=%04x endpointidx=%d, image=%d, args=(%d, %d)"),
+                    aCase.iCase,
+                    caseName,
+                    aCase.iFlags,
+                    aCase.iErrorExpected,
+                    aCase.iEndpointIndex,
+                    aCase.iImageIndex,
+                    aCase.iArg1, aCase.iArg2);
+}
+
+
 #endif // __EGLTEST_ENDPOINT_ENGINE_H__
--- a/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine_execthread.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine_execthread.h	Wed Aug 18 11:05:09 2010 +0300
@@ -27,6 +27,8 @@
 _LIT(KExecResultQueueName, "EGLEndpointExecTestEnvResultQueue");
 _LIT(KExecParamsQueueName, "EGLEndpointExecTestEnvParamsQueue");
 
+// For description of the work done as part of this class, see the 
+// egltest_endpoint_engine_execthread.cpp
 NONSHARABLE_CLASS(CEgltest_Local_Engine_Exec): public CBase
     {
 public:
@@ -36,7 +38,7 @@
     static CEgltest_Local_Engine_Exec* NewL();
     CTestExecuteLogger &Logger() { return iLogger; }
     void SetTestStepResult(TVerdict aVerdict);
-    TVerdict TestStepResult(void) const;
+    TVerdict TestStepResult() const;
     void TidyUp();
     void SetUpL();
     
@@ -45,7 +47,6 @@
     static void ThreadEntryL();
     TInt ThreadLoopL();
     void ConstructL();
-    void LogDump(const TEngineTestCase& aCase);
     void SendResult(const TExecResult &aResult);
     
 private:
--- a/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine_types.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_engine_types.h	Wed Aug 18 11:05:09 2010 +0300
@@ -56,7 +56,7 @@
     // iEndpointIndex indicates which surface to use.
     // iImageIndex index to the rectangle set to pass in as "dirty rectangles".
     //             if index = 0, then a NULL is passed - indicating full surface 
-    //             (no other value currently supported)!
+    //             (no other value currently supported).
     // iFlags: ENoWait: complete immediately, rather than wait for displayed 
     //                  notification (only valid for non-EGL surfaces).
     //         ENoSync: Do not wait for contentupdate to complete, instead, 
@@ -105,7 +105,7 @@
     ECreateSurfaceCase = 11,
 
     // EDrawContentCase
-    // Also draws an image before swapping.
+    // Draws an image.
     // iEndpointIndex indicates the surface to draw to.
     // iImageIndex is the index of the image to be drawn.
     EDrawContentCase = 12,
@@ -206,19 +206,76 @@
     // RWindow component that is part of an EGL surface in the thread that
     // created the RWindow.
     EGetSurfaceParamsCase = 26, 
+    
+    // EDestroySurfaceCase
+    // Opposite of ECreatSurfaceCase.
+    // iEndpointIndex indicates which surface object
+    EDestroySurfaceCase = 27,
+    
+    // EStartLoadThreadCase
+    // For tests that have some sort of second thread that does "loading" 
+    // (e.g. heavy drawing or using up memory), this will start that thread.
+    // iEndpointIndex is the thread number. 
+    // Note, relies on the thread implementing a StartLoadThread() function -
+    // default implementation will panic.
+    EStartLoadThreadCase = 28,
+    
+    // EEndLoadThreadCase
+    // For tests that have some sort of second thread that does "loading" 
+    // (e.g. heavy drawing or using up memory), this will end the thread.
+    // iEndpointIndex is the thread number. 
+    // Note, relies on the thread implementing a EndLoadThread() function -
+    // default implementation will panic.
+    EEndLoadThreadCase = 29,
+    
+    // ECheckForMemoryLeaks
+    // Used by tests that perform for example out-of-memory testing. 
+    // Executed on the in the remote engine code. 
+    // The amount of memory available is stored in an array, and when 
+    // the ECheckForMemoryLeaksFinish is called, the statistics is
+    // calculated abd deternubed if there is a leak or not. 
+    ECheckForMemoryLeaks = 30,
+    
+    // ECheckForMemoryLeaksFinish
+    // Check the collected data from ECheckForMemoryLeaks, and determine the
+    // trend of memory usage. 
+    // See ECheckForMemoryLeaks
+    ECheckForMemoryLeaksFinish = 31,
+    
+    // ESpecialEglHeapCase
+    // Configure a heap for the EGL calls. 
+    // This is used to allow egl calls to be done with a heap that is full.
+    // iEndpointIndex = min size
+    // iImageIndex = max size
+    // IMPORTANT NOTE: This HAS TO BE the first case sent to the remote engine. 
+    ESpecialEglHeapCase = 32,
 
+    
     ///
     /// Debug cases
     ///
     // EBreakPointCase
     // Used for debugging.
-    // iFlags = EDebugLocal, EDebugRemote - break local and/or remote side engine.
+    // iFlags = EDebugExecThread, EDebugController, EDebugRemote - break 
+    // exec_thread, controller and/or remote part of engine.
     EBreakPointCase = 64,
 
     // ELogEnableCase
     // Logging enable - all items executed after this point are written out, including data parameters.
     // iFlags = EDebugLocal, EDebugRemote - log on local/remote side.
     ELogEnableCase = 65,
+
+    ///////////////////////////////////////////////////////
+    // Control messages - "done", "sync", etc.
+    ///////////////////////////////////////////////////////
+    
+    // ESetVerdictCase
+    // Used to set the relevant threads "teststepresult".
+    // Flags indicate which thread is updated.
+    // iEndpointIndex = verdict to set. 
+    // Note: Remote value is not using the ERtvXXX values, the standard
+    // values in Test Framework are translated in the remote step.
+    ESetVerdictCase = 996,
     
     // ESyncLocalCase
     // Used for synchronizing the local execution thread. 
@@ -228,7 +285,8 @@
 
     // EPanicCase
     // Cause panic on local or remote side. Used for testing purposes only.
-    // iFlags = EDebugLocal, EDebugRemote - choose between local/remote side.
+    // iFlags = EDebugExecThread, EDebugController, EDebugRemote - break 
+    // exec_thread, controller and/or remote part of engine.
     EPanicCase = 998,
 
     // EIllegalCase
@@ -236,7 +294,7 @@
     // statement for this in the engine, it should be treated as a "unknown" case,
     // and cause any test to fail in the same way as if an unused value was put
     // in the table. Used for testing purposes, and can also be used to make a
-    // particular test fail on purpose (e.g. due to production code bugs!)
+    // particular test fail on purpose (e.g. due to production code bugs).
     // All arguments ignored.
     EIllegalCase = 999,
 
@@ -265,10 +323,19 @@
     ENoWait             = 1 << 14,
     ENoSync             = 1 << 15,
 
-    // Debug flags
-    EDebugLocal         = 1 << 16,
+    // Debug flags - perform operation on "Local"
+    EDebugExecThread      = 1 << 16,
     EDebugRemote        = 1 << 17,
     EDebugController    = 1 << 18,
+    
+    // ThreadingFlags - just rename the debug flags, because it's actually the
+    // same thing. We _RELY_ on this being the same to simplify the code in 
+    // the controller thread.
+    // Note: the lack of "execthread" is intentional. Since controller and exec
+    // are in the same process, there is no reason to use the ExecThread to 
+    // start a new thread. ??This may need to be changed int he future.??
+    EThreadRemote       = EDebugRemote,
+    EThreadController   = EDebugController,
     };
 
 enum TEngineFlagsMask
@@ -284,15 +351,23 @@
                           EUseBadApi           |
                           EUseBadSync          |
                           EUseBadRects         |
-                          0   // So that it's easier to merge!
+                          0   // So that it's easier to merge.
     };
 
 
+enum TRemoteThreadEngineThread
+    {
+    EUnknownThread = 0,
+    EThreadLoadHeapMemory = 1,
+    EThreadLoadGpuMemory = 2,
+    EThreadLoadGpuProcessor = 3,
+    };
+
 struct TEngineTestCase
     {
-    TEngineCases iCase;
+    TEngineCases iCase;             // Command to execute. See TEngineCases for details.
     TInt         iFlags;            // Flags to indicate for example bad parameters (TEngineFlags).
-    TInt         iErrorExpected;    // What value is expected in eglGetError()?
+    TInt         iErrorExpected;    // The value that eglGetError() is expected to return.
     TInt         iEndpointIndex;    // Index to the endpoint to use.
     TInt         iImageIndex;       // Index to image to draw/compare(egltest_endpoint_images)
     TInt         iArg1;             // E.g. GetAttrib or SetAttrib attrib.
@@ -306,19 +381,44 @@
     TEngineTestCase      iEngineTestCase;
     };
 
+// Passed to StartRemoteTestStep() during test startup.
+struct TTestEndpointEngineConfig
+    {
+    TBool iLogErrors; 
+    };
+
+// Number of small steps that each test is allowed to contain. Since each test
+// that uses the engine has at least one table like this, increasing this 
+// hugely will increase the overall  memory usage of the application (each 
+// entry is about 28 bytes). So, don't go multiplying by 10 or some such
+// unless there is a REAL need for that.
+// THe current tables take up approximately 28 * 80 = 2240 bytes.
+// As of right now, there are about 100 tests -> 220KB of tables.
 const TInt KMaxCases    = 80;
+
 // Should be PLENTY of endpoints [also used for surfaces, images and other
-// objects that have roughly 1:1 mapping with endpoints.
-const TInt KMaxEndpoints = 400;
+// objects that have roughly 1:1 mapping with endpoints. This is dynamically
+// allocated in the constructor of the engine class.
+const TInt KMaxEndpoints = 1000;
+
+// Max number of surfacetypes we expect to be listed. 
+// This can be increased as and when needed. 
+const TInt KMaxSurfaceList = 4;   
+
+struct TTestCaseBase
+    {
+    const TText*       iRelatedTestIds;
+    const TText*       iName;
+    TInt               iSurfaceTypeCount;
+    TSurfaceType       iSurfaceTypeList[KMaxSurfaceList];
+    };
 
 // Structure for lists of cases to execute
 struct TTestCase
     {
-    const TText*    iRelatedTestIds;
-    const TText*    iName;
-    TInt            iSurfaceTypeCount;
-    TSurfaceType    iSurfaceTypeList[ESurfTypeMaxTypes];
-    TEngineTestCase iEngineTestCase[KMaxCases];
+    // Use anonymous struct to avoid changing code all over the place.
+    TTestCaseBase      iBase;
+    TEngineTestCase    iEngineTestCase[KMaxCases];
     };
 
 struct TTestCases
@@ -327,5 +427,4 @@
     TInt             iCount;
     };
 
-
 #endif
--- a/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_images.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_images.h	Wed Aug 18 11:05:09 2010 +0300
@@ -85,6 +85,7 @@
 class CTestVgEglImage: public CTestVgImage
     {
 public:
+    static CTestVgEglImage *New(EGLImageKHR aEglImage);
     static CTestVgEglImage *NewL(EGLImageKHR aEglImage);
 private:
     void ConstructL(EGLImageKHR aEglImage);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_stress_engine.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,248 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#ifndef __EGLTEST_ENDPOINT_STRESS_ENGINE_H__
+#define __EGLTEST_ENDPOINT_STRESS_ENGINE_H__
+
+#include "egltest_endpoint_engine_types.h"
+#include "egltest_endpoint_engine.h"
+#include "localtestbase.h"
+
+#define TESTTABLE(x) sizeof(x) / sizeof(x[0]), x
+
+// This file provides extensions to the egltest engine functionality to 
+// support stress tests that aren't practical to do as small tables. The main
+// point is to support copying a set of table entries many times.
+// Number of sections we expect is needed. This is just an arbitrary value, and a 
+// larger value can be used. 
+const TInt KMaxSections = 10;
+
+// Max parameters must be a 2^n number so that we can use binary and magig...
+const TInt KMaxParams = 4;
+// Log2 of KMaxParams
+const TInt KMaxParamsLog2 = 2;
+
+
+// Parameter types. Used to build tables at compile time and passed to factory
+// function to request the implementation object for that iterator.
+enum TParamType
+    {
+    EParamTypeNone = 0,
+    EParamTypeIterator,
+    EParamTypeTable,
+    EParamTypeRandomizer
+    };
+
+// Parameter declaration. Used to build tables at compile time. 
+struct TParamDeclaration
+    {
+    TParamType iType;
+    TInt       iInit;       
+    TInt       iEnd;
+    TInt       iStep;
+    };
+
+// These enums define what should be done when there's
+// a failure in a stress test section.
+enum TOnErrorPolicy
+    {
+    // Unknown - this is not a policy, but a placeholder for "uninitialized"
+    EOnErrorPolicyUnknown,
+    // Break - this policy is where a failure causes a section to be broken,
+    // that is, we skip to the next section and remember the number of times this
+    // section was run. 
+    EOnErrorPolicyBreak,
+    // Continue - ignore errors, and continue.
+    EOnErrorPolicyContinue,
+    // Fail - errors lead to failing the test.
+    EOnErrorPolicyFail
+    };
+
+// The basic component for producing many table entries from a short table.
+struct TStressTestSection
+    {
+    // Number of iterations to run.
+    TInt iIterations;
+    // What to do when we have a "fail" during the stress test...
+    TOnErrorPolicy iErrorPolicy;
+    // Parameter declarations
+    TParamDeclaration iParams[KMaxParams];
+    // The actual test cases.
+    TEngineTestCase iEngineTestCase[KMaxCases];
+    };
+
+
+// Used to create a list of TStessTestSections.
+// 
+// A typical stress test table would have a epilog, body and prolog, where
+// the epilog and prolog are copied once to the table, and the body copied
+// many times over. Sometimes, there may be a test that for example creates
+// a large number of endpoints, then does something and then cleans up the
+// endpoints. This would have 5 sections: 
+// prolog to start things off copied once. 
+// creation of endpoints (body part 1), copied n times.
+// do some work with endpoints (body part 2), copied n times.
+// cleanup of endpoints (body part 3), copied n times. 
+// epilog to clean up final items, copied once.
+struct TStressTestTable
+    {
+    TTestCaseBase             iTestCaseBase;
+    TUint                     iNumSections;
+    const TStressTestSection* iSections;
+    };
+
+
+// A collection of constant values for the purpose of marking/extracting the
+// parameter index.
+enum TExpandEntryFlags 
+    {
+    EParamBitsInInt  = 32,
+    EExpandParamBit = EParamBitsInInt-1,
+    EExpandParamFlag = 1 << 31,
+    EParamShift      = (30-KMaxParamsLog2),
+    EParamMask       = ((KMaxParams-1) << EParamShift),
+    EAllFlags = EExpandParamFlag | EParamMask,
+    ERemoveFlagsMask = ~EAllFlags,
+    };
+
+NONSHARABLE_CLASS(CStressParam) : CBase
+    {
+public:
+    virtual void Initialize(TInt aInit, TInt aEnd, TInt aStep) = 0;
+    virtual void Next() = 0;
+    virtual TInt Value() = 0;
+    virtual ~CStressParam();
+    static CStressParam *Factory(const TParamDeclaration &aParamDecl);
+    
+    };
+
+NONSHARABLE_CLASS(CStressParamIterator) : public CStressParam 
+    {
+public:
+    CStressParamIterator();
+    ~CStressParamIterator();
+    virtual void Initialize(TInt aInit, TInt aEnd, TInt aStep);
+    virtual void Next();
+    virtual TInt Value();
+private:
+    TInt iIterator;
+    TInt iInit;
+    TInt iEnd;
+    TInt iStep;
+    };
+
+NONSHARABLE_CLASS(CStressParamTable) : public CStressParam 
+    {
+public:
+    CStressParamTable();
+    ~CStressParamTable();
+    virtual void Initialize(TInt aTable, TInt aCount, TInt /* aUnused */);
+    virtual void Next();
+    virtual TInt Value();
+private:
+    TInt  iIndex;
+    TInt* iTable;
+    TInt  iCount;
+    };
+
+NONSHARABLE_CLASS(CStressParamRandomizer) : public CStressParam
+    {
+public:
+    CStressParamRandomizer();
+    ~CStressParamRandomizer();
+    virtual void Initialize(TInt aMin, TInt aMax, TInt aMul);
+    virtual void Next();
+    virtual TInt Value();
+private:
+    TInt  iMin;
+    TInt  iMax;
+    TInt  iMul;
+    TInt  iCurrent;
+    };
+
+#define PARAM_DECL(type, init, end, step) { type, init, end, step }
+// Iterator parameter: Goes from init to end in step increments. If the total
+// loop is bigger than (end - init), it restarts on init. 
+#define PARAM_DECL_ITER(init, end, step) PARAM_DECL(EParamTypeIterator, init, end, step)
+// Table iterator. Steps over table. Rstarts at index 0 when going past the end. 
+#define PARAM_DECL_TABLE(table) \
+    PARAM_DECL(EParamTypeTable, (TInt)table, sizeof(table)/sizeof(table[0]), 0)
+// Random generator. generates an integer in the range [min..max[ then 
+// multiples by mul. 
+// Example: PARAM_DECL_RANDOM(2, 6, 3) will generate numbers that are multiples 
+// of three in the range 6..15. 
+#define PARAM_DECL_RANDOM(min, max, mul) PARAM_DECL(EParamTypeRandom, min, max, mul)
+
+#define NO_PARAMS  { EParamTypeNone, 0, 0, 0 }
+
+// Make Parameter entry
+#define PARAM(n, offset) (EExpandParamFlag | (n << EParamShift) | offset)
+#define PARAM0(offset)   PARAM(0, offset)
+#define PARAM1(offset)   PARAM(1, offset)
+#define PARAM2(offset)   PARAM(2, offset)
+#define PARAM3(offset)   PARAM(3, offset)
+
+class CTestExecuteLogger;
+
+// A class to allow tests that run many operations to be written as tables
+// without having very long tables. Instead the table structure is (as 
+// described for the TStressTestTable), consists of a generic header and
+// multiple sections of table that have a "number of times to run" counter. 
+
+// To allow for these changes to the table structure, we derive the 
+// CEgttest_Local_Engine class, but provide alternative solutions for a few of
+// A class to build stress tests. 
+NONSHARABLE_CLASS(CStressTestEngine): public CEgltest_Local_Engine
+    {
+public:
+    static CStressTestEngine *NewL(const TStressTestTable aStressTable[], TUint aNumTables);
+    ~CStressTestEngine();
+    TVerdict doTestStepL();
+    CStressTestEngine();
+    virtual void DoPreambleL();
+    virtual void DoPostambleL();
+    
+protected:
+    void ConstructL(const TStressTestTable aStressTable[], TUint aNumTables);
+    void StartThreadL(TInt aThreadNumber);
+    void EndThread(TInt aThreadNumber);
+    virtual TThreadFunction GetThreadFunction(TInt aThreadNumber);
+    
+private:
+    void ModifyL(TEngineTestCase &aTestCase);
+    void DoModifyL(TInt &aItem);
+    
+    void CreateParams(const TStressTestSection &aSection);
+    void DestroyParams();
+    void NextParams();
+    TBool HandleError(const TStressTestSection &section, TInt aCopy, 
+            TInt aCopies, TInt aCurSection, TInt &aPreviousCopiesRun);
+    void UpdateVerdict(TVerdict aVerdict);
+    
+private:
+    const TStressTestTable *iStressTable;
+    CStressParam *iParams[KMaxParams];
+protected:
+    RThread iLoadThread[KMaxLoadThreads];
+    TBool   iStopThreadFlag[KMaxLoadThreads];
+    };
+
+#endif // __EGLTEST_ENDPOINT_STRESS_ENGINE_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_stressload.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,42 @@
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "egltest_endpoint_stress_engine.h"
+#include "egltest_endpoint_engine.h"
+
+_LIT(KEGL_EndpointStressLoad, "EGL_EndpointStressLoad");
+
+
+NONSHARABLE_CLASS(CEglTest_TestStep_StressLoad): public CStressTestEngine
+    {
+public:
+    static CEglTest_TestStep_StressLoad *New();
+
+protected:
+    TThreadFunction GetThreadFunction(TInt aThreadNumber);
+private:
+    CEglTest_TestStep_StressLoad();
+    static TInt LoadGpuProcessor(TAny *aSelf);
+    void LoadGpuProcessorL();
+    static TInt LoadGpuMemory(TAny *aSelf);
+    void LoadGpuMemoryL();
+
+private:
+    EGLDisplay iDisplay;
+    };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_endpoint_stresstests.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,42 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "egltest_endpoint_stress_engine.h"
+#include "egltest_endpoint_engine.h"
+
+_LIT(KEGL_EndpointStressTests, "EGL_EndpointStressTests");
+
+
+NONSHARABLE_CLASS(CEglTest_TestStep_StressTests): public CStressTestEngine
+    {
+public:
+    static CEglTest_TestStep_StressTests *New();
+private:
+    CEglTest_TestStep_StressTests();
+    };
+
+NONSHARABLE_CLASS(CEglTest_TestStep_StressTests2): public CStressTestEngine
+    {
+public:
+    static CEglTest_TestStep_StressTests2 *New();
+private:
+    CEglTest_TestStep_StressTests2();
+    };
--- a/egl/egltest/endpointtestsuite/automated/tinc/egltest_parameters.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_parameters.h	Wed Aug 18 11:05:09 2010 +0300
@@ -188,7 +188,6 @@
                 break;
                 }
             }
-        // Can/should we use "search" here?
         // Check if it's already in the list - no point in testing the same value more than once.
         for(TInt j = 0; useCurParam && j < iParams.Count(); j++)
             {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_releaseimagegles.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,67 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#ifndef __EGLTEST_RELEASEIMAGEGLES_H__
+#define __EGLTEST_RELEASEIMAGEGLES_H__
+
+
+#include "localtestbase.h"
+#include "remotetestbase.h"
+
+
+_LIT(KEGL_EndpointReleaseImageGles, "EGL_EndpointReleaseImageGles");
+NONSHARABLE_CLASS(CEglTest_LocalTestStep_EndpointReleaseImageGles) : public CLocalTestStepBase
+    {
+public:
+CEglTest_LocalTestStep_EndpointReleaseImageGles();
+    ~CEglTest_LocalTestStep_EndpointReleaseImageGles();
+    void DoPreambleL();
+    void DoPostambleL();
+    TVerdict doTestStepL();
+    };
+
+
+NONSHARABLE_CLASS(CEglTest_RemoteTestStep_EndpointReleaseImageGles) : public CRemoteTestStepBase
+    {
+public:
+    CEglTest_RemoteTestStep_EndpointReleaseImageGles();
+    ~CEglTest_RemoteTestStep_EndpointReleaseImageGles();
+    
+    virtual TRemoteTestVerdict DoRunRemoteTestCaseL(TInt aTestCase, const TRemoteTestParams& aParams);
+    virtual TRemoteTestVerdict DoStartRemoteTestStepL(const TRemoteTestParams& aMessageIn);
+    virtual TRemoteTestVerdict DoEndRemoteTestStepL(const TRemoteTestParams& aMessageIn);
+    
+private:
+    TRemoteTestVerdict GlesContextTestCaseL(const TRemoteTestParams& aParams);
+    TRemoteTestVerdict DoGlesContextTestCaseL(const TRemoteTestParams& aParams);
+    
+private:
+    EGLDisplay iDisplay;
+    CSurface* iSurface;
+    EGLEndpointNOK iEndpoint;
+    };
+
+
+#endif
--- a/egl/egltest/endpointtestsuite/automated/tinc/egltest_surface.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_surface.h	Wed Aug 18 11:05:09 2010 +0300
@@ -36,6 +36,7 @@
     ESurfTypeRaw,
     ESurfTypeEglWindow,
     ESurfTypeRawSingleBuffered,
+    ESurfTypePBuffer,
     ESurfTypeMaxTypes  // Should be the last enum.
     };
 
@@ -49,6 +50,9 @@
     EUnusualStrideSurface,
     EUnalignedPixelSizeSurface,
     ELargeSurface,
+    ELargestPossibleSurface,
+    ESmallSurface,
+    ETinySurface
     };
 
 // Notification enums - allows us to use one function to request several notifications.
@@ -86,6 +90,7 @@
     };
 
 
+
 //Interface for creating, drawing to and submitting content for a surface
 //Derived classes can implement different types of surface, that can be
 //used in the same test code. Ie surface manager surface (raw), egl window
@@ -93,21 +98,31 @@
 class CSurface: public CBase
     {
 public:
-    virtual void CreateL(TInt aIndex) = 0;
+    // This function is kept for compatibility - new code should use offset
+    // form of CreateL... 
+    virtual void CreateL(TInt aIndex);
+    // Allow an offset for the top left corner of the surface on screen. 
+    virtual void CreateL(TInt aIndex, const TPoint& aOffset) = 0;
     virtual void DrawContentL(TInt aImageIndex) = 0;
     virtual void DrawContentL(const TRgb& aColour) = 0;
-    virtual void SubmitContentL(TBool aShouldWaitForDisplay, TInt aRectIndex = 0) = 0;
+    virtual void DrawComplexL(const TRgb& aColour) = 0;
+    virtual TInt SubmitContent(TBool aShouldWaitForDisplay, TInt aRectIndex = 0) = 0;
     virtual TSurfaceId SurfaceId() const = 0;
     virtual void GetSurfaceParamsL(TSurfaceParamsRemote &aParams) = 0;
     virtual const TText *GetSurfaceTypeStr() const = 0;
     virtual TInt Notify(TNotification aWhen, TRequestStatus &aStatus, TUint32 aXTimes) = 0;
     virtual TInt WaitFor(TNotification aWhen, TRequestStatus &aStatus, TInt aTimeoutInMicroseconds, TUint32& aTimeStamp) = 0;
+    virtual TInt SizeInBytes() const;
+   
+    
+    TSize Size();
 
 public:
     // Factory function to create a surface of aSurfType.
     static CSurface *SurfaceFactoryL(TSurfaceType aSurfType);
 protected:
-    TInt iParamIndex;
+    TInt  iParamIndex;
+    TSize iActualSize;
     };
 
 
@@ -118,12 +133,12 @@
     static CRawSurface* NewL();
     ~CRawSurface();
 
-    //From CSurface.
-    void CreateL(TInt aIndex);
-    void GetSurfAttribs(RSurfaceManager::TSurfaceCreationAttributesBuf &aSurfaceAttribs, TInt aIndex);
+    // From CSurface
+    virtual void CreateL(TInt aIndex, const TPoint& aOffset);
     void DrawContentL(TInt aIndex);
     void DrawContentL(const TRgb& aColour);
-    void SubmitContentL(TBool aShouldWaitForDisplay, TInt aRectIndex = 0);
+    void DrawComplexL(const TRgb& aColour);
+    TInt SubmitContent(TBool aShouldWaitForDisplay, TInt aRectIndex = 0);
     TSurfaceId SurfaceId() const;
     void GetSurfaceParamsL(TSurfaceParamsRemote &aParams);
     virtual const TText *GetSurfaceTypeStr() const;
@@ -134,24 +149,25 @@
     CRawSurface();
     void ConstructL();
     TUint8* MapSurfaceAndGetInfoLC(RSurfaceManager::TSurfaceInfoV01& aInfo);
+    void GetSurfAttribs(RSurfaceManager::TSurfaceCreationAttributesBuf &aSurfaceAttribs, TInt aIndex, TInt aSizeIndex);
 
 private:
     static TInt PixelSize(TUidPixelFormat aPixelFormat);
     static TRequestStatus *GetRequestPtr(TNotification aWhen);
 
 private:
-    RSurfaceUpdateSession iSurfaceUpdate;
-    TRequestStatus        iAvailable;
-    TRequestStatus        iDisplayed;
-    TRequestStatus        iDisplayedXTimes;
-    TTimeStamp            iTimeStamp;
-    TInt                  iDrawBuffer;
-    RChunk                iSurfaceChunk;
+    RSurfaceUpdateSession  iSurfaceUpdate;
+    TRequestStatus         iAvailable;
+    TRequestStatus         iDisplayed;
+    TRequestStatus         iDisplayedXTimes;
+    TTimeStamp             iTimeStamp;
+    TInt                   iDrawBuffer;
+    RChunk                 iSurfaceChunk;
 
 protected:
-    TInt                  iBuffers;
-    RSurfaceManager       iSurfaceManager;
-    TSurfaceId            iSurfaceId;
+    TInt                   iBuffers;
+    RSurfaceManager        iSurfaceManager;
+    TSurfaceId             iSurfaceId;
     };
 
 // Simple wrapper to enable a list of "singlebuffer" in the list of buffer types.
@@ -161,8 +177,7 @@
     static CRawSingleBufferSurface* NewL();
     ~CRawSingleBufferSurface();
 
-    //From CSurface.
-    void CreateL(TInt aIndex);
+    virtual void CreateL(TInt aIndex, const TPoint& aOffset);
     virtual const TText *GetSurfaceTypeStr() const;
     };
 
@@ -170,34 +185,66 @@
 class CWindow;
 class CTestVgImage;
 
-class CEglWindowSurface : public CSurface
+class CEglSurfaceBase : public CSurface
+    {
+public:
+    void CreateL(TInt aIndex, const TPoint& aOffset);
+    void DrawContentL(TInt aImageIndex);
+    void DrawContentL(const TRgb& aColour);
+    void DrawComplexL(const TRgb& aColour);
+    TInt SubmitContent(TBool aShouldWaitForDisplay, TInt aRectIndex = 0);
+    TInt Activate();
+    void ActivateL();
+    void GetSurfaceParamsL(TSurfaceParamsRemote &aParams);
+    virtual TInt Notify(TNotification aWhen, TRequestStatus &aStatus, TUint32 aXTimes);
+    virtual TInt WaitFor(TNotification aWhen, TRequestStatus &aStatus, TInt aTimeoutInMicroseconds, TUint32& aTimeStamp);
+
+protected:
+    void BaseCreateL(TInt aIndex, EGLint aSurfaceType);
+    virtual void DoCreateL(TInt aIndex, const TPoint& aOffset, TInt aSizeIndex) = 0;
+    void Destroy();
+
+protected:
+    EGLContext iContext;
+    EGLSurface iSurface;
+    EGLDisplay iDisplay;
+    EGLConfig  iConfig;
+    };
+
+class CEglWindowSurface : public CEglSurfaceBase
     {
 public:
     static CEglWindowSurface* NewL();
     ~CEglWindowSurface();
 
-    void CreateL(TInt aIndex);
-    void DrawContentL(TInt aImageIndex);
-    void DrawContentL(const TRgb& aColour);
-    void SubmitContentL(TBool aShouldWaitForDisplay, TInt aRectIndex = 0);
-    void ActivateL();
     TSurfaceId SurfaceId() const;
-    void GetSurfaceParamsL(TSurfaceParamsRemote &aParams);
     virtual const TText *GetSurfaceTypeStr() const;
-    virtual TInt Notify(TNotification aWhen, TRequestStatus &aStatus, TUint32 aXTimes);
-    virtual TInt WaitFor(TNotification aWhen, TRequestStatus &aStatus, TInt aTimeoutInMicroseconds, TUint32& aTimeStamp);
 
 private:
     CEglWindowSurface();
+    void DoCreateL(TInt aIndex, const TPoint& aOffset, TInt aSizeIndex);
     void ConstructL();
 
 private:
-    EGLContext iContext;
-    EGLSurface iSurface;
-    EGLDisplay iDisplay;
     CWindow*   iWindow;
     };
 
+class CEglPBufferSurface : public CEglSurfaceBase
+    {
+public:
+    static CEglPBufferSurface* NewL();
+    ~CEglPBufferSurface();
+    TSurfaceId SurfaceId() const;
+
+    virtual const TText *GetSurfaceTypeStr() const;
+
+    TInt SizeInBytes() const;
+
+private:
+    CEglPBufferSurface();
+    void ConstructL();
+    void DoCreateL(TInt aIndex, const TPoint& aOffset, TInt aSizeIndex);
+    };
 
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_threadedstress.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#ifndef __EGLTEST_THREADEDSTRESS_H__
+#define __EGLTEST_THREADEDSTRESS_H__
+
+
+#include "localtestbase.h"
+#include "remotetestbase.h"
+
+
+_LIT(KEGL_EndpointCrazyThreading, "EGL_EndpointCrazyThreading");
+NONSHARABLE_CLASS(CEglTest_LocalTestStep_EndpointCrazyThreading) : public CLocalTestStepBase
+    {
+public:
+    CEglTest_LocalTestStep_EndpointCrazyThreading();
+    ~CEglTest_LocalTestStep_EndpointCrazyThreading();
+    void DoPreambleL();
+    void DoPostambleL();
+    TVerdict doTestStepL();
+    };
+
+
+_LIT(KEGL_EndpointOutOfHeapMemory, "EGL_EndpointOutOfHeapMemory");
+NONSHARABLE_CLASS(CEglTest_LocalTestStep_EndpointOutOfHeapMemory) : public CLocalTestStepBase
+    {
+public:
+CEglTest_LocalTestStep_EndpointOutOfHeapMemory();
+    ~CEglTest_LocalTestStep_EndpointOutOfHeapMemory();
+    void DoPreambleL();
+    void DoPostambleL();
+    TVerdict doTestStepL();
+    };
+
+
+NONSHARABLE_CLASS(CEglTest_RemoteTestStep_EndpointThreadStress) : public CRemoteTestStepBase
+    {
+public:
+    CEglTest_RemoteTestStep_EndpointThreadStress();
+    ~CEglTest_RemoteTestStep_EndpointThreadStress();
+    
+    virtual TRemoteTestVerdict DoRunRemoteTestCaseL(TInt aTestCase, const TRemoteTestParams& aParams);
+    virtual TRemoteTestVerdict DoStartRemoteTestStepL(const TRemoteTestParams& aMessageIn);
+    virtual TRemoteTestVerdict DoEndRemoteTestStepL(const TRemoteTestParams& aMessageIn);
+    
+    virtual TInt Timeout() const;
+    
+private:
+    TRemoteTestVerdict CrazyThreadingTestCaseL(const TRemoteTestParams& aParams);
+    TRemoteTestVerdict OutOfHeapMemoryTestCaseL(const TRemoteTestParams& aParams);
+    TRemoteTestVerdict DoOutOfHeapMemoryTestCaseL(const TRemoteTestParams& aParams);
+    };
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tinc/egltest_threadmonitor.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#ifndef __EGLTEST_THREADMONITOR_H__
+#define __EGLTEST_THREADMONITOR_H__
+
+
+#include <e32std.h>
+#include <e32base.h>
+
+
+class CThreadMonitor : public CBase
+    {
+public:
+    static CThreadMonitor* NewL(const RArray<TThreadId>& aThreadsToMonitor);
+    ~CThreadMonitor();
+    
+private:
+    CThreadMonitor(const RArray<TThreadId>& aThreadsToMonitor);
+    void ConstructL();
+    static TInt MonitorThreadEntry(TAny* aThreadsToMonitor);
+    static void MonitorThreadEntryL(const RArray<TThreadId>& aThreadsToMonitor, TRequestStatus*& aNotifyCancel);
+    
+private:
+    const RArray<TThreadId>& iThreadsToMonitor;
+    TRequestStatus* iNotifyCancel;
+    RThread iMonitor;
+    };
+
+
+#endif
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_execthread.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_execthread.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -115,6 +115,7 @@
     delete cleanUpStack;
     if (err != KErrNone)
         {
+        RDebug::Printf("Thread left with err=%d", err);
         User::Panic(_L("ExecThread"), __LINE__);
         }
     return err;
@@ -128,15 +129,16 @@
     TInt err = KErrNone;
     TInt ret = 0;
     do {
-        self->SetUpL();
         TRAP(err, ret = self->ThreadLoopL());
         if (err != KErrNone)
             {
             self->SetTestStepResult(EFail);
+            RDebug::Printf("%s:%d: Leaving with %d", __FILE__, __LINE__, err);
             User::Leave(err);
             }
-        self->TidyUp();
+        self->Logger().Close();
     } while(ret != KTerminated);
+    self->TidyUp();
     CleanupStack::PopAndDestroy(self);
     }
 
@@ -149,7 +151,7 @@
     if (iDisplay == EGL_NO_DISPLAY)
         {
         err = eglGetError();
-        INFO_PRINTF2(_L("EglInitialize failed: err = %x"), err);
+        INFO_PRINTF2(_L("eglGetDisplay failed: err = %x"), err);
         User::Leave(KErrNotSupported);
         }
 
@@ -164,7 +166,6 @@
 void CEgltest_Local_Engine_Exec::TidyUp()
     {
     // Clean up. 
-    Logger().Close();
     iSurfaceTypeDisplayed = EFalse;
     for(TInt i = 0; i < KMaxEndpoints; i++)
         {
@@ -178,22 +179,6 @@
     eglReleaseThread();
     }
 
-
-void CEgltest_Local_Engine_Exec::LogDump(const TEngineTestCase& aCase)
-    {
-    const TText *caseName = EngineCaseName(aCase.iCase);
-    Logger().LogExtra(((TText8*)__FILE__), __LINE__, ESevrInfo,
-                    _L("Performing subcase %d (%s), with flags=%d, err=%04x endpointidx=%d, image=%d, args=(%d, %d)"),
-                    aCase.iCase,
-                    caseName,
-                    aCase.iFlags,
-                    aCase.iErrorExpected,
-                    aCase.iEndpointIndex,
-                    aCase.iImageIndex,
-                    aCase.iArg1, aCase.iArg2);
-    }
-
-
 void CEgltest_Local_Engine_Exec::SetTestStepResult(TVerdict aVerdict)
     {
     iVerdict = aVerdict;
@@ -227,49 +212,110 @@
         
         if (iLogging)
             {
-            LogDump(ec);
+            LogDump(Logger(), ec);
             }
 
         switch(ec.iCase)
             {
+            case EInitializeCase:
+                TidyUp();
+                SetUpL();
+                break;
+                
             case ECreateSurfaceCase:
                 {
                 ENGINE_ASSERT(endpointIndex < KMaxEndpoints);
                 ENGINE_ASSERT(!iSurfaces[endpointIndex]);
                 TSurfaceType surfType = params.iParams.iEndpointEngine.iSurfaceParams.iSurfaceType;
                 iSurfaces[endpointIndex] = CSurface::SurfaceFactoryL(surfType);
-                if (!iSurfaceTypeDisplayed)
+                TRAPD(err, iSurfaces[endpointIndex]->CreateL(index));
+                if (err == KErrNone)
                     {
-                    INFO_PRINTF2(_L("Using surfaces of type %s"), iSurfaces[endpointIndex]->GetSurfaceTypeStr());
-                    iSurfaceTypeDisplayed = ETrue;
+                    if (!iSurfaceTypeDisplayed)
+                        {
+                        INFO_PRINTF4(_L("Using surfaces of type %s (%dx%d pixels)"), 
+                                iSurfaces[endpointIndex]->GetSurfaceTypeStr(),
+                                        iSurfaces[endpointIndex]->Size().iWidth,
+                                        iSurfaces[endpointIndex]->Size().iHeight);
+                        iSurfaceTypeDisplayed = ETrue;
+                        }
                     }
-                iSurfaces[endpointIndex]->CreateL(index);
+                else
+                    {
+                    INFO_PRINTF2(_L("Could not create surface, err=%d"), err);
+                    delete iSurfaces[endpointIndex];
+                    iSurfaces[endpointIndex] = NULL;
+                    SetTestStepResult(EFail);
+                    }
+                }
+                break;
+                
+            case EDestroySurfaceCase:
+                {
+                delete iSurfaces[endpointIndex];
+                iSurfaces[endpointIndex] = NULL;
                 }
                 break;
 
             case EContentUpdateCase:
-                iSurfaces[endpointIndex]->SubmitContentL(!(ec.iFlags & ENoWait), index);
+                {
+                TInt err;
+                if (!iSurfaces[endpointIndex])
+                    {
+                    err = KErrNotSupported;
+                    }
+                else
+                    {
+                    err = iSurfaces[endpointIndex]->SubmitContent(!(ec.iFlags & ENoWait), index);
+                    }
+                
+                if (err != KErrNone)
+                    {
+                    ERR_PRINTF2(_L("ContentUpdate failed, err=%d"), err);
+                    SetTestStepResult(EFail);
+                    }
+                }
                 break;
 
             case EDrawContentCase:
-                iSurfaces[endpointIndex]->DrawContentL(index);
+                if (iSurfaces[endpointIndex])
+                    {
+                    TRAPD(err, iSurfaces[endpointIndex]->DrawContentL(index % CTestImage::KImageCount));
+                    if (err != KErrNone)
+                        {
+                        SetTestStepResult(EFail);
+                        }
+                    }
+                else
+                    {
+                    SetTestStepResult(EFail);
+                    }
                 break;
 
             case EBufferCountCase:
                 {
+                TBool pass = ETrue;
                 TSurfaceParamsRemote surfParams;
-                iSurfaces[endpointIndex]->GetSurfaceParamsL(surfParams);
-                TInt buffers = surfParams.iCommonParams.iBuffers;
+                TInt buffers = 0;
                 TInt min = ec.iArg1;
                 TInt max = ec.iArg2;
-                TBool pass = ETrue;
-                if (min && buffers < min)
+
+                if (!iSurfaces[endpointIndex])
                     {
                     pass = EFalse;
                     }
-                if (max && buffers > max)
+                else
                     {
-                    pass = EFalse;
+                    iSurfaces[endpointIndex]->GetSurfaceParamsL(surfParams);
+                    buffers = surfParams.iCommonParams.iBuffers;
+                    if (min && buffers < min)
+                        {
+                        pass = EFalse;
+                        }
+                    if (max && buffers > max)
+                        {
+                        pass = EFalse;
+                        }
                     }
                 if (!pass)
                     {
@@ -287,12 +333,19 @@
 
             case ENotifyWhenCase:
                 {
-                TInt err = iSurfaces[endpointIndex]->Notify((TNotification)index, iStatus[endpointIndex], ec.iArg1);
-                if (err != ec.iErrorExpected)
+                if (!iSurfaces[endpointIndex])
+                    {
+                    SetTestStepResult(EFail);
+                    }
+                else
                     {
-                    ERR_PRINTF4(_L("Wrong error code from 'NotifyWhen' for notifiction %d - error %d, expected %d"),
-                                index, err, ec.iErrorExpected);
-                    SetTestStepResult(EFail);
+                    TInt err = iSurfaces[endpointIndex]->Notify((TNotification)index, iStatus[endpointIndex], ec.iArg1);
+                    if (err != ec.iErrorExpected)
+                        {
+                        ERR_PRINTF4(_L("Wrong error code from 'NotifyWhen' for notifiction %d - error %d, expected %d"),
+                                    index, err, ec.iErrorExpected);
+                        SetTestStepResult(EFail);
+                        }
                     }
                 }
                 break;
@@ -307,33 +360,40 @@
                 TUint32 beginTimeStamp = iTimeStamp[endpointIndex];
                 TUint32 endTimeStamp = User::FastCounter();
                 ENGINE_ASSERT(endpointIndex < KMaxEndpoints);
-                TInt err = iSurfaces[endpointIndex]->WaitFor((TNotification)index,
-                        iStatus[endpointIndex], ec.iArg1, endTimeStamp);
-
-                //Now, figure out the delta in microseconds.
-                TUint32 deltaTime = endTimeStamp - beginTimeStamp;
-                deltaTime *= 1000;
-                deltaTime /= (iFastFreq / 1000);
-
-                if (err != ec.iErrorExpected)
+                if (!iSurfaces[endpointIndex])
                     {
-                    ERR_PRINTF4(_L("Wrong error code from 'WaitFor' for notifiction %d - error %d, expected %d"),
-                                index, err, ec.iErrorExpected);
-                    INFO_PRINTF5(_L("Timeout: %d, beginTimeStamp = %u, endTimeStamp = %u, deltaTime = %u"),
-                                 ec.iArg1, beginTimeStamp, endTimeStamp, deltaTime);
                     SetTestStepResult(EFail);
                     }
-                // If iArg2 is non-zero, and we waited for "displayed" and no error, check the timestamp.
-                if (index == ENotifyWhenDisplayed && err == KErrNone && ec.iArg2)
+                else
                     {
-                    if (Abs((TInt)deltaTime - ec.iArg2) > KDiffAllowed)
+                    TInt err = iSurfaces[endpointIndex]->WaitFor((TNotification)index,
+                            iStatus[endpointIndex], ec.iArg1, endTimeStamp);
+    
+                    //Now, figure out the delta in microseconds.
+                    TUint32 deltaTime = endTimeStamp - beginTimeStamp;
+                    deltaTime *= 1000;
+                    deltaTime /= (iFastFreq / 1000);
+    
+                    if (err != ec.iErrorExpected)
                         {
-                        ERR_PRINTF3(_L("TimeStamp is incorrect - expected %d microseconds, got %d microseconds"),
-                                ec.iArg2, deltaTime);
-                        INFO_PRINTF4(_L("original timestamp: %u, endpoint ts=%u, iFastFreq=%u"),
-                                endTimeStamp, iTimeStamp[endpointIndex], iFastFreq);
+                        ERR_PRINTF4(_L("Wrong error code from 'WaitFor' for notifiction %d - error %d, expected %d"),
+                                    index, err, ec.iErrorExpected);
+                        INFO_PRINTF5(_L("Timeout: %d, beginTimeStamp = %u, endTimeStamp = %u, deltaTime = %u"),
+                                     ec.iArg1, beginTimeStamp, endTimeStamp, deltaTime);
                         SetTestStepResult(EFail);
                         }
+                    // If iArg2 is non-zero, and we waited for "displayed" and no error, check the timestamp.
+                    if (index == ENotifyWhenDisplayed && err == KErrNone && ec.iArg2)
+                        {
+                        if (Abs((TInt)deltaTime - ec.iArg2) > KDiffAllowed)
+                            {
+                            ERR_PRINTF3(_L("TimeStamp is incorrect - expected %d microseconds, got %d microseconds"),
+                                    ec.iArg2, deltaTime);
+                            INFO_PRINTF4(_L("original timestamp: %u, endpoint ts=%u, iFastFreq=%u"),
+                                    endTimeStamp, iTimeStamp[endpointIndex], iFastFreq);
+                            SetTestStepResult(EFail);
+                            }
+                        }
                     }
                 }
                 break;
@@ -348,17 +408,11 @@
                 break;
                 
             case EBreakPointCase:
-                if (ec.iFlags & EDebugLocal)
-                    {
-                    __BREAKPOINT();
-                    }
+                __BREAKPOINT();
                 break;
                 
             case ELogEnableCase:
-                if (ec.iFlags & EDebugLocal)
-                    {
-                    iLogging = ETrue;
-                    }
+                iLogging = ETrue;
                 break;
                 
             case ESyncLocalCase:
@@ -370,7 +424,10 @@
             case EGetSurfaceParamsCase:
                 {
                 TExecResult result(TestStepResult(), ec.iCase);
-                iSurfaces[endpointIndex]->GetSurfaceParamsL(result.iSurfaceParams);
+                if (iSurfaces[endpointIndex])
+                    {
+                    iSurfaces[endpointIndex]->GetSurfaceParamsL(result.iSurfaceParams);
+                    }
                 SendResult(result);
                 }
                 break;
@@ -379,17 +436,22 @@
                 SendResult(TExecResult(TestStepResult(), ec.iCase));
                 return KTerminated;
                 
+            case ESetVerdictCase:
+                {
+                SetTestStepResult(static_cast<TVerdict>(endpointIndex));
+                TExecResult result(TestStepResult(), ec.iCase);
+                SendResult(result);
+                }
+                break;
+                
             case EPanicCase:
                 // This part is intended to be used to test the implementation.
                 // In normal tests, this functionality should not be used.
                 // If anyone decides to use this for some purpose in normal
                 // code, then please change the above comment to reflect
                 // that it IS used, and explain why it makes sense.
-                if (ec.iFlags & EDebugLocal)
-                    {
-                    INFO_PRINTF1(_L("Performing intentional panic!"));
-                    User::Panic(_L("EPanicCase"), -1);
-                    }
+                INFO_PRINTF1(_L("Performing intentional panic!"));
+                User::Panic(_L("EPanicCase"), -1);
                 break;
                 
             default:
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_local.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_local.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -51,6 +51,14 @@
     {
     }
 
+CEgltest_Local_Engine::CEgltest_Local_Engine() :
+    CLocalTestStepBase(ETestUidEndpointEngine),
+    iTestCases(NULL),
+    iNumCases(0)
+    {
+    }
+
+
 CEgltest_Local_Engine::~CEgltest_Local_Engine()
     {
     }
@@ -67,12 +75,15 @@
         TInt numInnerCases = outerCases[curOuterCase].iCount;
         for(TInt curInnerCase = 0; curInnerCase < numInnerCases; curInnerCase++)
             {
-            TPtrC testIds(innerCases[curInnerCase].iRelatedTestIds);
+            TPtrC testIds(innerCases[curInnerCase].iBase.iRelatedTestIds);
             RegisterTestIdsL(testIds);
             }
         }
-    
-    
+    CommonPreambleL();
+    }
+
+void CEgltest_Local_Engine::CommonPreambleL()
+    {
     // For details about the threads, see comment in the egltest_local_engine_exec.cpp
     
     // Amount of stack-space we allow for the execution thread. 
@@ -142,7 +153,6 @@
     iExecThread.Resume();
     }
 
-
 TInt CEgltest_Local_Engine::MonitorThreadEntry(TAny *aParam)
     {
     CEgltest_Local_Engine *self = reinterpret_cast<CEgltest_Local_Engine *>(aParam);
@@ -150,7 +160,6 @@
     return 0;
     }
 
-
 // Forward a the panic from the controller to the exec thread or vice versa.
 void CEgltest_Local_Engine::DoMonitorThreadEntry()
     {
@@ -200,7 +209,6 @@
     execThread.Close();
     }
 
-
 // Tear down threads.
 void CEgltest_Local_Engine::DoPostambleL()
     {
@@ -222,27 +230,29 @@
     INFO_PRINTF2(_L("Executing test with %d cases..."), iNumCases);
     for(TInt runCase = 0; runCase < iNumCases; runCase++)
         {
-        RunTestCaseL(iTestCases[runCase]);
+        RunTestCase(iTestCases[runCase]);
         }
     return TestStepResult();
     }
 
-
-
-void CEgltest_Local_Engine::RunTestCaseL(const TTestCases &aTestCases)
+void CEgltest_Local_Engine::RunTestCase(const TTestCases &aTestCases)
     {
     for(TInt testCase = 0; testCase < aTestCases.iCount; testCase++)
         {
         const TTestCase &thisCase = aTestCases.iCase[testCase];
         
         //Set the Ids of the test case as the current ones.
-        TPtrC testIds(thisCase.iRelatedTestIds);
+        TPtrC testIds(thisCase.iBase.iRelatedTestIds);
         SetCurrentTestIds(testIds);
         
-        for(TInt surfIter= 0; surfIter < thisCase.iSurfaceTypeCount; surfIter++)
+        for(TInt surfIter= 0; surfIter < thisCase.iBase.iSurfaceTypeCount; surfIter++)
             {
-            TSurfaceType surfType = thisCase.iSurfaceTypeList[surfIter];
-            RunOneTestCaseL(thisCase, surfType);
+            TSurfaceType surfType = thisCase.iBase.iSurfaceTypeList[surfIter];
+            
+            INFO_PRINTF3(_L("Running testcase GRAPHICS-EGL-%s: %s"),
+                    thisCase.iBase.iRelatedTestIds, thisCase.iBase.iName);
+
+            RunOneTestCase(thisCase, surfType);
             }
         }
     }
@@ -308,6 +318,61 @@
     RunLocalTestCase(params, result);
     }
 
+
+void CEgltest_Local_Engine::StartThreadL(TInt aThreadNumber)
+    {
+    INFO_PRINTF2(_L("Attempt to start thread %d using base-class StartThreadL"), aThreadNumber);
+    User::Panic(_L("StartThreadL"), __LINE__);
+    }
+
+
+void CEgltest_Local_Engine::EndThread(TInt aThreadNumber)
+    {
+    INFO_PRINTF2(_L("Attempt to end thread %d using base-class EndThread"), aThreadNumber);
+    User::Panic(_L("EndThread"), __LINE__);
+    }
+
+void CEgltest_Local_Engine::RunControllerLocalAndRemoteL(const TEngineTestCase& aCase, const TRemoteTestParams& aParams)
+    {
+    if (aCase.iFlags & EDebugController)
+        {
+        switch(aCase.iCase)
+            {
+            case EBreakPointCase:
+                __BREAKPOINT();
+                break;
+            case ELogEnableCase:
+                iLogging = ETrue;
+                break;
+            case EEndLoadThreadCase:
+                EndThread(aCase.iEndpointIndex);
+                break;
+            case EStartLoadThreadCase:
+                StartThreadL(aCase.iEndpointIndex);
+                break;
+            case EPanicCase:
+                User::Panic(_L("EPanicCase"), -1);
+                break;
+            case ESetVerdictCase:
+                SetTestStepResult(static_cast<TVerdict>(aCase.iEndpointIndex));
+                break;
+            default:
+                ERR_PRINTF2(_L("Unrecognised case %d"), aCase.iCase);
+                User::Panic(_L("BADCASE"), -2);
+                break;
+            }
+        }
+    if (aCase.iFlags & EDebugExecThread)
+        {
+        SendLocalTestCase(aParams);
+        }
+    if (aCase.iFlags & EDebugRemote)
+        {
+        RunRemoteTestCase(aCase.iCase, aParams);
+        }
+    }
+
+
 // This function runs one set of table entries for one surface type. 
 void CEgltest_Local_Engine::RunSingleCaseL(const TTestCase& aTestCase, TSurfaceType aSurfType)
     {
@@ -321,11 +386,17 @@
         const TEngineTestCase& ec = cs.iEngineTestCase[j];
         params.iEndpointEngine.iEngineTestCase = ec;
         params.iEndpointEngine.iSurfaceParams.iSurfaceType = aSurfType;
+        
+        if (iLogging)
+            {
+            LogDump(Logger(), ec);
+            }
 
         switch(ec.iCase)
             {
             // Work done locally. 
             case ECreateSurfaceCase:
+            case EDestroySurfaceCase:
             case EDrawContentCase:
             case ENotifyWhenCase:
             case EWaitForCase:
@@ -367,7 +438,6 @@
             case EReleaseImageCase:
             case EDestroyEndpointCase:
             case EBeginStreamingCase:
-            case EInitializeCase:
             case ETerminateCase:
             case EGetAttribCase:
             case ESetAttribCase:
@@ -380,6 +450,9 @@
             case ECancelNotificationCase:
             case EWaitForNotificationCase:
             case EGetEndpointDirtyAreaCase:
+            case ECheckForMemoryLeaks:
+            case ECheckForMemoryLeaksFinish:
+            case ESpecialEglHeapCase:
                 RunRemoteTestCase(ec.iCase, params);
                 break;
 
@@ -397,31 +470,24 @@
                 RunRemoteTestCase(ec.iCase, params);
                 }
                 break;
-
-            // Some commands that go to BOTH local and remote side!
-            case ELogEnableCase:
+                
+            case EInitializeCase:
                 SendLocalTestCase(params);
                 RunRemoteTestCase(ec.iCase, params);
                 break;
                 
+
+            // These commands are controlled by the EDebugXXX flags
+            // They may go to this thread, the exectrhead or the remote RS.
+            case EStartLoadThreadCase:
+            case EEndLoadThreadCase:
+            case ELogEnableCase:
             case EBreakPointCase:
-                if (ec.iFlags & EDebugController)
-                    {
-                    __BREAKPOINT();
-                    }
-                SendLocalTestCase(params);
-                RunRemoteTestCase(ec.iCase, params);
+            case EPanicCase:
+            case ESetVerdictCase:
+                RunControllerLocalAndRemoteL(ec, params);
                 break;
                 
-            case EPanicCase:
-                if (ec.iFlags & EDebugController)
-                    {
-                    User::Panic(_L("EPanicCase"), -1);
-                    }
-                SendLocalTestCase(params);
-                RunRemoteTestCase(ec.iCase, params);
-                break;
-
            default:
                 ERR_PRINTF2(_L("Unknown case: %d"), ec.iCase);
                 SetTestStepResult(EFail);
@@ -432,23 +498,17 @@
     RunLocalTestCase(EFinishedCase);
     }
 
-
-
-void CEgltest_Local_Engine::RunOneTestCaseL(const TTestCase& aTestCase, TSurfaceType aSurfType)
+void CEgltest_Local_Engine::RunOneTestCase(const TTestCase& aTestCase, TSurfaceType aSurfType)
     {
-    INFO_PRINTF3(_L("Running testcase GRAPHICS-EGL-%s: %s"),
-            aTestCase.iRelatedTestIds, aTestCase.iName);
-    static const TRemoteTestParams nullParams = {};
+    TRemoteTestParams nullParams = {};
+    nullParams.iEndpointEngineConfig.iLogErrors = ETrue;
+    
     StartRemoteTestStep(nullParams);
 
-    TRAPD(err2, RunSingleCaseL(aTestCase, aSurfType));
-    if (err2 != KErrNone)
+    TRAPD(err, RunSingleCaseL(aTestCase, aSurfType));
+    if (err != KErrNone)
         {
-        INFO_PRINTF2(_L("RunSingleCaseL left with an error: %d"), err2);
-        }
-    else
-        {
-        INFO_PRINTF1(_L("testcase finished..."));
+        INFO_PRINTF2(_L("RunSingleCaseL left with an error: %d"), err);
         }
 
     EndRemoteTestStep(nullParams);
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_remote.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_engine_remote.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -20,14 +20,20 @@
 */
 
 #include <e32std.h>
+#include <e32math.h>
+#include <e32atomics.h> 
 #include "egltest_endpoint_engine.h"
 #include "egltest_endpoint_images.h"
 #include "egltest_surface.h"
 #include "egltest_parameters.h"
 
+
+const TInt KMemStatsReserve = 3;
+
 CEgltest_Remote_Engine::CEgltest_Remote_Engine()
     : CRemoteTestStepBase(ETestUidEndpointEngine), iTestVerdict(ERtvPass), iLogging(EFalse), iSurface(0)
     {
+    iMainThreadHeap = &User::Heap();   // ?? Is this the right heap ??
     for (TInt i = 0; i < KMaxEndpoints; i++)
         {
         iEndpoints[i] = EGL_NO_ENDPOINT_NOK;
@@ -35,6 +41,11 @@
         iVgImage[i] = NULL;
         iRequestStatus[i] = KRequestPending;
         }
+    ipfnEglQueryProfilingDataNOK = reinterpret_cast<PFNEGLQUERYPROFILINGDATANOKPROC>(eglGetProcAddress("eglQueryProfilingDataNOK"));
+    if (ipfnEglQueryProfilingDataNOK)
+        {
+        RDebug::Printf("%s:%d: found eglQueryProfilingDataNOK function");
+        }
     }
 
 CEgltest_Remote_Engine::~CEgltest_Remote_Engine()
@@ -45,20 +56,24 @@
     }
 
 TRemoteTestVerdict CEgltest_Remote_Engine::DoStartRemoteTestStepL(
-        const TRemoteTestParams& /* aParams */)
+        const TRemoteTestParams& aParams)
     {
+    iMainThreadHeap = &User::Heap();   
+    
+    iMemoryStats.ReserveL(KMemStatsReserve);
     iLogging = EFalse;
+    iLogErrors = aParams.iEndpointEngineConfig.iLogErrors;
     return ERtvPass;
     }
 
 TRemoteTestVerdict CEgltest_Remote_Engine::DoEndRemoteTestStepL(
         const TRemoteTestParams& /* aParams */)
     {
+    iMemoryStats.Close();
     delete iSurface;
     return ERtvPass;
     }
 
-
 void CEgltest_Remote_Engine::CheckReturn(TInt aRetval,
         const TEngineTestCase& aEngineTestCase, TInt aFailValue,
         const TText* aFailSymbol, const TText* aFunction)
@@ -69,44 +84,61 @@
     EGLint err = eglGetError();
     if (err != aEngineTestCase.iErrorExpected)
         {
-        REMOTE_ERR_PRINTF3(_L("testcase failed: expected %04x, got %04x"), aEngineTestCase.iErrorExpected, err);
+        if (iLogErrors)
+            {
+            REMOTE_ERR_PRINTF3(_L("testcase failed: expected %04x, got %04x"), aEngineTestCase.iErrorExpected, err);
+            }
         iTestVerdict = ERtvFail;
         }
 
     if (!isEqual && expectFail)
         {
-        REMOTE_ERR_PRINTF5(
-                _L("return value when failing from %s is not expected fail value %s (%d). Value returned is %d"),
-                aFunction, aFailSymbol, aFailValue, aRetval);
+        if (iLogErrors)
+            {
+            REMOTE_ERR_PRINTF5(
+                    _L("return value when failing from %s is not expected fail value %s (%d). Value returned is %d"),
+                    aFunction, aFailSymbol, aFailValue, aRetval);
+            }
         iTestVerdict = ERtvFail;
         }
     else if (isEqual && !expectFail)
         {
-        REMOTE_ERR_PRINTF5(
-                _L("return value when succeeding from %s is equal to expected fail value %s (%d). Value returned is %d"),
-                aFunction, aFailSymbol, aFailValue, aRetval);
+        if (iLogErrors)
+            {
+            REMOTE_ERR_PRINTF5(
+                    _L("return value when succeeding from %s is equal to expected fail value %s (%d). Value returned is %d"),
+                    aFunction, aFailSymbol, aFailValue, aRetval);
+            }
         iTestVerdict = ERtvFail;
         }
     if (isEqual != expectFail)
         {
-        RDebug::Printf(
-                "%s:%d: Called for %s, with expected fail %s, flags = %d",
-                __FILE__, __LINE__, aFunction, aFailSymbol,
-                aEngineTestCase.iFlags);
+        if (iLogErrors)
+            {
+            REMOTE_ERR_PRINTF4(_L("Unexpected result for %s, failvalue is %s, flags = %d"),
+                    aFunction, aFailSymbol,
+                    aEngineTestCase.iFlags);
+            }
         iTestVerdict = ERtvFail;
         }
     // Now check
     if (expectFail && err == EGL_SUCCESS)
         {
-        REMOTE_ERR_PRINTF2(_L("Got EGL_SUCCESS in error when calling %s, when we expected an error"),
-                aFunction);
+        if (iLogErrors)
+            {
+            REMOTE_ERR_PRINTF2(_L("Got EGL_SUCCESS in error when calling %s, when we expected an error"),
+                    aFunction);
+            }
         iTestVerdict = ERtvFail;
         }
     // Didn't expect to fail, so we
     else if (!expectFail && err != EGL_SUCCESS)
         {
-        REMOTE_ERR_PRINTF3(_L("Got an error (%x) on successful call to %s, when expecting EGL_SUCCESS"),
-                err, aFunction);
+        if (iLogErrors)
+            {
+            REMOTE_ERR_PRINTF3(_L("Got an error (%x) on successful call to %s, when expecting EGL_SUCCESS"),
+                    err, aFunction);
+            }
         iTestVerdict = ERtvFail;
         }
     }
@@ -164,7 +196,7 @@
                 args.iImage = (*imageParams)[imageIter];
 
                 RunCaseL(aTestCase, aParams, args);
-                if (iTestVerdict != ERtvPass || iLogging)
+                if (iLogErrors && iTestVerdict != ERtvPass || iLogging)
                     {
                     if (iTestVerdict != ERtvPass)
                         {
@@ -187,13 +219,165 @@
     if (!iSurface)
         {
         iSurface = CEglWindowSurface::NewL();
-        RDebug::Printf("%s:%d: iSurface = %08x", __FILE__, __LINE__, iSurface);
-        iSurface->CreateL(EStandardSurface);
+        iSurface->CreateL(EStandardSurface, TPoint(0, 110));
         }
     iSurface->ActivateL();
     }
 
 
+TInt CEgltest_Remote_Engine::FillGpuMemory()
+    {
+    TSurfaceIndex table[] = 
+            {
+            ELargeSurface,
+            EStandard128sqSurface,
+            ESmallSurface,
+            ETinySurface
+            };
+    const TInt KNumSurfaceTypes = sizeof(table) / sizeof(table[0]);
+    
+    TInt nSurfaces = 0;
+    const TInt KMaxSurfaceAllocs = 1000;
+    CSurface **surfaces = new CSurface*[KMaxSurfaceAllocs];
+    TInt size = 0;
+    ENGINE_ASSERT(surfaces);
+    for(TInt i = 0; i < KNumSurfaceTypes; i++)
+        {
+        TInt err = KErrNone;
+        while(err == KErrNone)     
+            {
+            ENGINE_ASSERT(nSurfaces < KMaxSurfaceAllocs);
+            CSurface* s = CSurface::SurfaceFactoryL(ESurfTypePBuffer);
+            if (s)
+                {
+                TRAP(err, s->CreateL(table[i]));
+                if (err == KErrNone)
+                    {
+                    surfaces[nSurfaces++] = s;
+//                    s->DrawContentL(TRgb(0x10, 0x20, 0xB0));
+                    size += s->SizeInBytes();
+                    }
+                }
+            }
+        }
+    RDebug::Printf("nSurfaces=%d", nSurfaces);
+    while(nSurfaces)
+        {
+        delete surfaces[--nSurfaces];
+        }
+    delete [] surfaces;
+    return size;
+    }
+
+TInt CEgltest_Remote_Engine::CalculateAvailableGPUMemory()
+    {
+    TInt result = 0;
+    if (ipfnEglQueryProfilingDataNOK)
+        {
+        EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+        ENGINE_ASSERT(display != EGL_NO_DISPLAY);
+        TInt count;
+        ipfnEglQueryProfilingDataNOK(
+                display, EGL_PROF_QUERY_MEMORY_USAGE_BIT_NOK, 
+                NULL, 0, &count);
+        ENGINE_ASSERT(count);
+        TInt *mem = new TInt[count * 2];
+        ENGINE_ASSERT(mem);
+        TInt newCount;
+        ipfnEglQueryProfilingDataNOK(
+                display, EGL_PROF_QUERY_MEMORY_USAGE_BIT_NOK, 
+                mem, count, &newCount);
+        ENGINE_ASSERT(newCount == count);
+        for(TInt i = 0; i < count; i ++)
+            {
+            switch(mem[i*2])
+                {
+            case EGL_PROF_USED_MEMORY_NOK:
+                // Assert that we only have one entry - if there are
+                // more than one, we can't really know what is the "right" one.
+                ENGINE_ASSERT(!result);
+                result = mem[i*2+1];
+                break;
+                }
+            }
+        delete [] mem;
+        }
+    else
+        {
+#if 1
+        result = 1000;
+#else
+        // This code currently causes a memory leak to be detected when the
+        // remote thread is destroyed. This causes further tests to be skipped.
+        // We disable this function at the moment, to allow other tests to run.
+        result = FillGpuMemory();
+#endif
+        }
+    return result;
+    }
+
+
+TInt CEgltest_Remote_Engine::CalculateAvailableHeapMemory()
+    {
+    TInt biggest = 0;
+    return User::Heap().Available(biggest);
+    }
+
+
+void CEgltest_Remote_Engine::CheckForMemoryLeaks()
+    {
+    TAvailableMemory mem;
+    mem.iGpuMemAvailable = CalculateAvailableGPUMemory();
+    mem.iHeapMemAvailable = CalculateAvailableHeapMemory();
+    
+    REMOTE_INFO_PRINTF3(_L("GPU memory available: %d, heapmemory available: %d"), 
+            mem.iGpuMemAvailable, mem.iHeapMemAvailable);
+    if (iMemoryStats.Count() ==  KMemStatsReserve)
+        {
+        REMOTE_INFO_PRINTF2(_L("false positive HEAP leak possible, as reserved memory is exhausted... (%d)"), KMemStatsReserve);
+        }
+    TInt err = iMemoryStats.Append(mem); 
+    if (err)
+        {
+        REMOTE_ERR_PRINTF2(_L("CheckForMemoryLeaks could not append to iMemoryStats. err=%d"), err);
+        }
+    }
+
+void CEgltest_Remote_Engine::CheckForMemoryLeaksFinish()
+    {
+    TInt count = iMemoryStats.Count();
+    if (count)
+        {
+        TReal sumGpu = 0.0;
+        TReal sumHeap = 0.0;
+        
+        for(TInt i = 0; i < count; i++)
+            {
+            sumGpu += iMemoryStats[i].iGpuMemAvailable;
+            sumHeap += iMemoryStats[i].iHeapMemAvailable;
+            }
+        REMOTE_INFO_PRINTF2(_L("CheckMemoryLeaksFinish - average = %6.2f"), sumGpu / count);
+        REMOTE_INFO_PRINTF2(_L("CheckMemoryLeaksFinish - average = %6.2f"), sumHeap / count);
+        }
+    else
+        {
+        REMOTE_INFO_PRINTF1(_L("CheckMemoryLeaksFinish - no data collected"));
+        }
+    iMemoryStats.Close();
+    }
+
+TRemoteTestVerdict ConvertToLocalVerdict(TInt aVerdict)
+    {
+    switch(aVerdict)
+        {
+        case EPass:
+            return ERtvPass;
+        case EFail:
+            return ERtvFail;
+        }
+        return ERtvInconclusive;
+    }
+
 void CEgltest_Remote_Engine::RunCaseL(TInt aTestCase, const TRemoteTestParams &aParams, const TRemoteTestArgs& aArgs)
     {
     const TEngineTestCase &si = aParams.iEndpointEngine.iEngineTestCase;
@@ -233,28 +417,44 @@
 
                 CTestCFbsImage *image = CTestCFbsImage::NewL(si.iImageIndex);
                 CleanupStack::PushL(image);
-                CTestVgEglImage *vgImage = CTestVgEglImage::NewL(iEglImage[si.iEndpointIndex]);
-                CleanupStack::PushL(vgImage);
-                TBool res = vgImage->CompareImageL(image, !!(si.iFlags & EExpectError));
-                if (res != !(si.iFlags & EExpectError))
+                CTestVgEglImage *vgImage = CTestVgEglImage::New(iEglImage[si.iEndpointIndex]);
+                if (!vgImage)
                     {
-                    REMOTE_ERR_PRINTF1(_L("Pixel comparison failed...."));
-                    iTestVerdict = ERtvFail;
+                    REMOTE_INFO_PRINTF2(_L("Could not create vgimage from eglimage: endpointindex=%d"), 
+                            si.iEndpointIndex);
                     }
-                else if (!(si.iFlags & EExpectError))
+                else
                     {
-                    TInt imageIndex2 = (si.iImageIndex + 1) % CTestImage::KImageCount;
-                    CTestCFbsImage *image2 = CTestCFbsImage::NewL(imageIndex2);
-                    CleanupStack::PushL(image2);
-                    res = vgImage->CompareImageL(image2, !(si.iFlags & EExpectError));
-                    if (res == !(si.iFlags & EExpectError))
+                    CleanupStack::PushL(vgImage);
+                    TBool res = vgImage->CompareImageL(image, !!(si.iFlags & EExpectError));
+                    if (res != !(si.iFlags & EExpectError))
                         {
-                        REMOTE_ERR_PRINTF1(_L("Pixel comparison didn't fail - two images the same?...."));
+                        if (iLogErrors)
+                            {
+                        REMOTE_ERR_PRINTF1(_L("Pixel comparison failed...."));
+                            }
                         iTestVerdict = ERtvFail;
                         }
-                    CleanupStack::PopAndDestroy(image2);
+                    else if (!(si.iFlags & EExpectError))
+                        {
+                        // Extra check that ANOTHER image doesn't match the image
+                        // we compared with.
+                        // This would detect when images have incorrect content or
+                        // the code for comparing images have been broken. 
+                        TInt imageIndex2 = (si.iImageIndex + 1) % CTestImage::KImageCount;
+                        CTestCFbsImage *image2 = CTestCFbsImage::NewL(imageIndex2);
+                        CleanupStack::PushL(image2);
+                        res = vgImage->CompareImageL(image2, ETrue);
+                        if (res)
+                            {
+                            REMOTE_ERR_PRINTF1(_L("Pixel comparison didn't fail - two images the same?...."));
+                            iTestVerdict = ERtvFail;
+                            }
+                        CleanupStack::PopAndDestroy(image2);
+                        }
+                    CleanupStack::PopAndDestroy(vgImage);
                     }
-                CleanupStack::PopAndDestroy(2, image);
+                CleanupStack::PopAndDestroy(image);
                 }
             break;
 
@@ -277,7 +477,7 @@
         case EGetAttribCase:
             {
             TInt value = EglEndpoint().GetEndpointAttrib(dpy, endpoint, si.iArg1);
-            // We can't use the macro CHECK_RETURN_L here, as the return value for
+            // We can't use the macro CHECK_RETURN here, as the return value for
             // "success" can be any integer value, including "EGL_FALSE". So we can
             // only check when we expect failure.
             if (si.iFlags & EExpectFailureMask)
@@ -444,30 +644,44 @@
             REMOTE_INFO_PRINTF1(_L("calling EglEndL()"));
             EglEndL();
             break;
+            
+        // Memory leak checking functions.
+        case ECheckForMemoryLeaks:
+            CheckForMemoryLeaks();
+            break;
+            
+        case ECheckForMemoryLeaksFinish:
+            CheckForMemoryLeaksFinish();
+            break;
+            
+            
+        case EStartLoadThreadCase:
+            StartThreadL(si.iEndpointIndex);
+            break;
+            
+        case EEndLoadThreadCase:
+            EndThread(si.iEndpointIndex);
+            break;
+            
+        case ESetVerdictCase:
+            iTestVerdict = ConvertToLocalVerdict(si.iEndpointIndex);
+            break;
+            
 
         /*
          * Debug cases
          */
 
         case EBreakPointCase:
-            if (si.iFlags & EDebugRemote)
-                {
-                __BREAKPOINT();
-                }
+            __BREAKPOINT();
             break;
 
         case ELogEnableCase:
-            if (si.iFlags & EDebugRemote)
-                {
-                iLogging = ETrue;
-                }
+            iLogging = ETrue;
             break;
             
         case EPanicCase:
-            if (si.iFlags & EDebugRemote)
-                {
-                User::Panic(_L("EPanicCase"), -1);
-                }
+            User::Panic(_L("EPanicCase"), -1);
             break;
 
         default:
@@ -478,6 +692,61 @@
     }
 
 
+// Create thread that consumes some sort of resource (e.g. Heap or GPU memory)
+// @param aThreadNumber indicates "which" 
+void CEgltest_Remote_Engine::StartThreadL(TInt aThreadNumber)
+    {
+    const TInt KStackSize = 12000;
+    const TInt KHeapMinSize = 16000;
+    const TInt KHeapMaxSize = 1000000;
+
+    if (aThreadNumber >= KMaxLoadThreads)
+        {
+        User::Panic(_L("StartThreadL"), __LINE__);
+        }
+    
+    __e32_atomic_store_rel32(&iStopThreadFlag[aThreadNumber], EFalse);
+    
+    TUint32 random = Math::Random();
+    TName threadName;
+    _LIT(KThreadNameFormat, "%S-%u");
+
+    // Create a load-thread.
+    _LIT(KThreadName, "EpTestLoadThread");
+    threadName.Format(KThreadNameFormat, &KThreadName, random);
+    TThreadFunction threadFunc = GetThreadFunction(aThreadNumber);
+    if (threadFunc == NULL)
+        {
+        REMOTE_ERR_PRINTF2(_L("Requested thread function %d, got NULL pointer back!"), aThreadNumber);
+        User::Leave(KErrArgument);
+        }
+    TInt err = iLoadThread[aThreadNumber].Create(threadName, threadFunc, 
+                    KStackSize, KHeapMinSize, KHeapMaxSize, this, EOwnerThread);
+    if(err != KErrNone)
+        {
+        REMOTE_ERR_PRINTF2(_L("Could not create load thread - err=%d"), err);
+        User::Leave(err);
+        }
+    iLoadThread[aThreadNumber].Resume();
+    }
+
+
+void CEgltest_Remote_Engine::EndThread(TInt aThreadNumber)
+    {
+    if (aThreadNumber >= KMaxLoadThreads)
+        {
+        User::Panic(_L("StartThreadL"), __LINE__);
+        }
+
+    TRequestStatus status;
+    iLoadThread[aThreadNumber].Logon(status);
+    // Tell thread to go away. 
+    __e32_atomic_store_rel32(&iStopThreadFlag[aThreadNumber], ETrue);
+    User::WaitForRequest(status);
+    iLoadThread[aThreadNumber].Close();
+    }
+
+
 void CEgltest_Remote_Engine::CreateEndpointCaseL(const TRemoteTestParams &aParams, const TRemoteTestArgs& aArgs)
     {
     const TEngineTestCase &si = aParams.iEndpointEngine.iEngineTestCase;
@@ -694,3 +963,158 @@
         }
     }
 
+
+TInt CEgltest_Remote_Engine::LoadHeapMemory(TAny *aSelf)
+    {
+    CEgltest_Remote_Engine* self = reinterpret_cast<CEgltest_Remote_Engine*>(aSelf);
+    User::SwitchHeap(self->iMainThreadHeap);
+    CTrapCleanup *cleanUpStack = CTrapCleanup::New();
+    if (!cleanUpStack)
+       {
+       // Can't use INFO_PRINTF here, as we have not yet
+       // created the logger object - nor can we until we have
+       // a working cleanupstack, so we just do our best at a 
+       // reasonable error message.
+       RDebug::Printf("Could not allocate memory for cleanupStack!");
+       User::Panic(_L("LoadThread"), __LINE__);
+       return KErrNoMemory;
+       }
+
+    TRAPD(err, self->LoadHeapMemoryL());
+    delete cleanUpStack;
+    if (err != KErrNone)
+        {
+        RDebug::Printf("LoadThreadL left with %d", err);
+        User::Panic(_L("LoadThread"), __LINE__);
+        }
+    return err;    
+    }
+
+
+void CEgltest_Remote_Engine::LoadHeapMemoryL()
+    {
+    const TInt KMaxAllocs = 40000;
+    char **ptr = new char*[KMaxAllocs];
+    TInt nAllocs = 0;
+    while(!__e32_atomic_load_acq32(&iStopThreadFlag[EThreadLoadHeapMemory]))
+        {
+        char *p = new char[1000];
+        if (p)
+            {
+            if (nAllocs >= KMaxAllocs)
+                {
+                User::Panic(_L("KMaxAllocs"), -3);
+                }
+            ptr[nAllocs++] = p;
+            }
+        else
+            {
+            RDebug::Printf("Memory full after %d allocations - freeing some", nAllocs);
+            // Now release 1/4 of the allocations...
+            TInt nRelease = nAllocs / 4;
+            for(int i = 0; i < nRelease; i++)
+                {
+                // Decrement first, then use as index.
+                delete [] ptr[--nAllocs];
+                }
+            User::After(10 * 1000);   // Let others run for a bit
+            }
+        }
+    // Done - let's deallocate.
+    while(nAllocs)
+        {
+        delete [] ptr[--nAllocs];
+        }
+    delete [] ptr;
+    eglReleaseThread();
+    }
+
+
+TInt CEgltest_Remote_Engine::LoadGpuMemory(TAny* aSelf)
+    { 
+    CEgltest_Remote_Engine* self = reinterpret_cast<CEgltest_Remote_Engine*>(aSelf);
+    CTrapCleanup *cleanUpStack = CTrapCleanup::New();
+    if (!cleanUpStack)
+       {
+       // Can't use INFO_PRINTF here, as we have not yet
+       // created the logger object - nor can we until we have
+       // a working cleanupstack, so we just do our best at a 
+       // reasonable error message.
+       RDebug::Printf("Could not allocate memory for cleanupStack!");
+       User::Panic(_L("LoadThread"), __LINE__);
+       return KErrNoMemory;
+       }
+
+    TRAPD(err, self->LoadGpuMemoryL());
+    delete cleanUpStack;
+    if (err != KErrNone)
+        {
+        RDebug::Printf("LoadThreadL left with %d", err);
+        User::Panic(_L("LoadThread"), __LINE__);
+        }
+    return err;
+    }
+
+
+void CEgltest_Remote_Engine::LoadGpuMemoryL()
+    {
+    const TInt KMaxSurfaceAllocs = 1000;
+    CSurface **surfaces = new CSurface*[KMaxSurfaceAllocs];
+    ENGINE_ASSERT(surfaces);
+    TInt nSurfaces = 0;
+    while(!__e32_atomic_load_acq32(&iStopThreadFlag[EThreadLoadGpuMemory]))     
+        {
+        ENGINE_ASSERT(nSurfaces < KMaxSurfaceAllocs);
+        CSurface* s = CSurface::SurfaceFactoryL(ESurfTypePBuffer);
+        if (s)
+            {
+            TRAPD(err, s->CreateL(ELargeSurface));
+            if (err == KErrNone)
+                {
+                if (nSurfaces >= KMaxSurfaceAllocs)
+                    {
+                    User::Panic(_L("KMaxAllocs"), -3);
+                    }
+                surfaces[nSurfaces++] = s;
+                s->DrawContentL(TRgb(0x10, 0x20, 0xB0));
+                }
+            else
+                {
+                delete s;
+                s = NULL;
+                }
+            }
+        if (!s)
+            {
+            User::After(100 * 1000);
+            TInt nRelease = nSurfaces / 4;
+            for(TInt i = 0; i < nRelease; i++)
+                {
+                delete surfaces[--nSurfaces];
+                surfaces[nSurfaces] = NULL;
+                }
+            User::After(100 * 1000); // 100 ms. 
+            }
+        }
+    while(nSurfaces)
+        {
+        delete surfaces[--nSurfaces];
+        }
+    delete [] surfaces;
+    eglReleaseThread();
+    }
+
+
+
+TThreadFunction CEgltest_Remote_Engine::GetThreadFunction(TInt aThreadNumber)
+    {
+    switch(aThreadNumber)
+        {
+        case EThreadLoadHeapMemory:
+            return LoadHeapMemory;
+        case EThreadLoadGpuMemory:
+            return LoadGpuMemory;
+        }
+    RDebug::Printf("%s:%d: Unknown thread function %d", __FILE__, __LINE__, aThreadNumber);
+    return NULL;
+    }
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_images.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_images.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -102,7 +102,12 @@
             break;
             }
         }
-
+    TInt err = vgGetError();
+    if (err != VG_NO_ERROR)
+        {
+        RDebug::Printf("%s:%d: Could not fetch pixels??? err=%x", __FILE__, __LINE__, err);
+        retVal = EFalse;
+        }
     CleanupStack::PopAndDestroy(&points);
     return retVal;
     }
@@ -132,7 +137,13 @@
             break;
             }
         }
-
+    TInt err = vgGetError();
+    if (err != VG_NO_ERROR)
+        {
+        RDebug::Printf("Could not fetch pixels??? err=%x", err);
+        retVal = EFalse;
+        }
+    
     CleanupStack::PopAndDestroy(&points);
     return retVal;
     }
@@ -285,7 +296,7 @@
     if (iVgImage == VG_INVALID_HANDLE)
         {
         VGint err = vgGetError();
-        RDebug::Printf("%s:%d: Could not create vgimage: error = 0x%x", err);
+        RDebug::Printf("%s:%d: Could not create vgimage: error = 0x%x", __FILE__, __LINE__, err);
         User::Leave(KErrNotSupported);
         }
     vgImageSubData(iVgImage, address, dataStride, iDataFormat, 0, 0, width, height);
@@ -310,7 +321,7 @@
 
 TRgb CTestVgImage::Pixel(TInt x, TInt y) const
     {
-    TRgb rgb;
+    TRgb rgb(0, 0, 0);
     TSize size = Size();
     if (size.iHeight <= y || size.iWidth <= x)
         {
@@ -337,12 +348,25 @@
             rgb = TRgb::Color16MA(intPixelSample);
             }
             break;
+            
+        case VG_sABGR_8888:
+        case VG_sXBGR_8888:
+        case VG_sABGR_8888_PRE:
+            {
+            TUint32 intPixelSample;
+            vgGetImageSubData(iVgImage, &intPixelSample, sizeof(intPixelSample), iDataFormat, x, y, 1, 1);
+            rgb = TRgb::Color16MA(intPixelSample);
+            // Now swap R & B, as we have BGR in the source, not RGB!
+            TInt temp = rgb.Red();
+            rgb.SetRed(rgb.Blue());
+            rgb.SetBlue(temp);
+            }
+            break;
+            
         default:
             ASSERT(0 && "Invalid dataformat");
             break;
         }
-    VGint err = vgGetError();
-    __ASSERT_ALWAYS(err == VG_NO_ERROR, User::Panic(_L("Pixel"), __LINE__));
     return rgb;
     }
 
@@ -350,12 +374,31 @@
     {
     }
 
-CTestVgEglImage* CTestVgEglImage::NewL(EGLImageKHR aEglImage)
+CTestVgEglImage* CTestVgEglImage::New(EGLImageKHR aEglImage)
     {
     CTestVgEglImage *self = new (ELeave) CTestVgEglImage;
-    CleanupStack::PushL(self);
-    self->ConstructL(aEglImage);
-    CleanupStack::Pop(self);
+    if (self)
+        {
+        CleanupStack::PushL(self);
+        TRAPD(err, self->ConstructL(aEglImage));
+        if (err != KErrNone)
+            {
+            CleanupStack::PopAndDestroy(self);
+            return NULL;
+            }
+        else
+            {
+            CleanupStack::Pop(self);
+            }
+        }
+    return self;
+    }
+
+
+CTestVgEglImage* CTestVgEglImage::NewL(EGLImageKHR aEglImage)
+    {
+    CTestVgEglImage *self = New(aEglImage);
+    User::LeaveIfNull(self);
     return self;
     }
 
@@ -367,7 +410,7 @@
     iVgImage = createFromEglTarget(aEglImage);
     if (iVgImage == VG_INVALID_HANDLE)
         {
-        RDebug::Printf("%s:%d: Unable to create VGImage from EGLImage: Error code=%d", __FILE__, __LINE__, vgGetError());
+        RDebug::Printf("%s:%d: Unable to create VGImage from EGLImage: Error code=0x%x", __FILE__, __LINE__, vgGetError());
         User::Leave(KErrBadHandle);
         }
     iDataFormat = static_cast<VGImageFormat>(vgGetParameteri(iVgImage, VG_IMAGE_FORMAT));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_stress_engine.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,514 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <e32std.h>
+#include <e32math.h>
+#include <e32atomics.h>
+#include "egltest_endpoint_engine.h"
+#include "egltest_endpoint_stress_engine.h"
+
+
+CStressTestEngine * CStressTestEngine::NewL(const TStressTestTable aStressTable[], TUint aNumTables)
+    {
+    CStressTestEngine *self = new (ELeave) CStressTestEngine;
+    CleanupStack::PushL(self);
+    self->ConstructL(aStressTable, aNumTables);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+void CStressTestEngine::ConstructL(const TStressTestTable aStressTable[], TUint aNumCases)
+    {
+    iStressTable = aStressTable;
+    iNumCases = aNumCases;
+    }
+
+
+// DoPreamble - called from framework, set up list of Test IDs, so that we can
+// mark them done later on - this is different from the regular 
+//  CEglTest_Engine_Local code in that the data structure is different.
+//
+// Then call the common part with the regular CEglTest_Engine_Local 
+void CStressTestEngine::DoPreambleL()
+    {
+    for(TInt curOuterCase = 0; curOuterCase < iNumCases; curOuterCase++)
+        {
+        const TTestCaseBase& innerCases = iStressTable[curOuterCase].iTestCaseBase;
+        TPtrC testIds(innerCases.iRelatedTestIds);
+        RegisterTestIdsL(testIds);
+        }
+    
+    CommonPreambleL();
+    }
+
+// Derived function from CEglTest_Engine_Local, so that we can keep the local
+// test result. 
+void CStressTestEngine::DoPostambleL()
+    {
+    // Don't loose the verdict.
+    TVerdict v = TestStepResult();
+    CEgltest_Local_Engine::DoPostambleL();
+    SetTestStepResult(v);
+    }
+
+CStressTestEngine::CStressTestEngine()
+    {
+    }
+
+
+CStressTestEngine::~CStressTestEngine()
+    {
+    }
+
+
+// Check if the entry needs modification, if so modify it. Modification is 
+// indicated by presence of a flag bit and an index for which parameter
+// to use. 
+void CStressTestEngine::DoModifyL(TInt& aItem)
+    {
+    if (aItem & EExpandParamFlag)
+        {
+        TInt paramIndex = (aItem & EParamMask) >> EParamShift;
+        if (!iParams[paramIndex])
+            {
+            ERR_PRINTF2(_L("Using undefined parameter PARAM%d"), paramIndex);
+            User::Leave(KErrArgument);
+            }
+        User::LeaveIfNull(iParams[paramIndex]);
+        aItem &= ERemoveFlagsMask;
+        aItem += iParams[paramIndex]->Value();
+        }
+    }
+
+
+// Modification of parameters of the testcase entry.
+void CStressTestEngine::ModifyL(TEngineTestCase &aTestCase)
+    {
+    DoModifyL(aTestCase.iEndpointIndex);
+    DoModifyL(aTestCase.iImageIndex);
+    DoModifyL(aTestCase.iArg1);
+    DoModifyL(aTestCase.iArg2);
+    }
+
+
+// Move to the next parameter for the parameter set.
+void CStressTestEngine::NextParams()
+    {
+    for(TInt i = 0; i < KMaxParams; i++)
+        {
+        // Only update parameters that have been created.
+        if (iParams[i])
+            {
+            iParams[i]->Next();
+            }
+        }
+    }
+
+
+// Create parameter set.
+void CStressTestEngine::CreateParams(const TStressTestSection &aSection)
+    {
+    for(TInt i = 0; i < KMaxParams; i++)
+        {
+        ENGINE_ASSERT(!iParams[i]);
+        iParams[i] = CStressParam::Factory(aSection.iParams[i]);
+        }
+    }
+
+
+// Destroy parameter set.
+void CStressTestEngine::DestroyParams()
+    {
+    for(TInt i = 0; i < KMaxParams; i++)
+        {
+        // It is harmless to delete a non-existant parameter, so 
+        // no check needed.
+        delete iParams[i];
+        iParams[i] = NULL;
+        }
+    }
+
+
+// Set the verdict for this operation on the local exec thread.
+void CStressTestEngine::UpdateVerdict(TVerdict aVerdict)
+    {
+    TRemoteTestParams params;
+    params.iEndpointEngine.iEngineTestCase.iCase = ESetVerdictCase;
+    params.iEndpointEngine.iEngineTestCase.iEndpointIndex = EPass;
+    TExecResult result;
+    RunLocalTestCase(params, result);
+    RunRemoteTestCase(ESetVerdictCase, params); 
+    SetTestStepResult(aVerdict);
+    }
+
+
+// Look at the error value and update the verdict accordingly.
+// Returns true if we should stop the iterating over the rest of the section.
+// @param aSection - the section currently being executed.
+// @param aCopy - the current iteration of the loop. 
+// @param aCopies - total number of iterations to run. 
+// @param aCurSection - numeric indication of the section. 
+// @param aPreviousCopiesRun - updated according to policy to indicate how
+//      many iterations to run the next section. 
+TBool CStressTestEngine::HandleError(
+        const TStressTestSection &aSection, 
+        TInt aCopy, 
+        TInt aCopies, 
+        TInt aCurSection,
+        TInt &aPreviousCopiesRun)
+    {
+    switch(aSection.iErrorPolicy)
+        {
+        case EOnErrorPolicyContinue:
+            // Just let it pass...
+            UpdateVerdict(EPass);
+            break;
+        case EOnErrorPolicyFail:
+            // We should not have errors here.
+            UpdateVerdict(EFail);
+            break;
+        case EOnErrorPolicyBreak:
+            // Do not continue after errors.
+            INFO_PRINTF4(_L("Ran only %d iterations of %d of section %d [not a failure]"), 
+                    aCopy, aCopies, aCurSection);
+            aPreviousCopiesRun = aCopy-1;
+            UpdateVerdict(EPass);
+            return ETrue;
+        default:
+            ENGINE_ASSERT(0);
+            break;
+        }
+    return EFalse;
+    }
+
+// The main loop for the test. 
+// Brief pseudo-code: 
+// for each testcase
+//   for each surface_type
+//     for each section
+//       for each copy of the section
+//         perform engine operation
+// Copy is really just an iteration. 
+// The above pseudo-code is very simplified, but shows the overall flow. 
+// Complications ommitted are:
+// 1. We should adjust the number of iterations to run if there are errors.
+// 2. We need to check for errors, and depending on circumstances, alter
+//    the verdict.
+TVerdict CStressTestEngine::doTestStepL()
+    {
+    INFO_PRINTF2(_L("Executing test with %d cases..."), iNumCases);
+
+    for(TInt tests = 0; tests < iNumCases; tests++)
+        {
+        TTestCase tc;
+        RDebug::Printf("%s:%d: tests = %d", __FILE__, __LINE__, tests);
+        tc.iBase = iStressTable[tests].iTestCaseBase;
+        TPtrC testIds(tc.iBase.iRelatedTestIds);
+        SetCurrentTestIds(testIds);
+        for(TInt surfIter= 0; surfIter < tc.iBase.iSurfaceTypeCount; surfIter++)
+            {
+            TInt previousCopiesRun = 1;
+            TSurfaceType surfType = tc.iBase.iSurfaceTypeList[surfIter];
+            
+            INFO_PRINTF4(_L("Running testcase GRAPHICS-EGL-%s: %s (surf=%d)"),
+                    tc.iBase.iRelatedTestIds, tc.iBase.iName, surfType);
+
+            TRemoteTestParams configParams = {};
+            configParams.iEndpointEngineConfig.iLogErrors = EFalse; 
+            StartRemoteTestStep(configParams);
+            
+            for(TInt curSection = 0; curSection < iStressTable[tests].iNumSections; curSection++)
+                {
+                INFO_PRINTF3(_L("Section %d, result=%d"), curSection, TestStepResult());
+                const TStressTestSection &section = iStressTable[tests].iSections[curSection];
+                CreateParams(section);
+                TInt copies = section.iIterations;
+                if (section.iErrorPolicy == EOnErrorPolicyBreak)
+                    {
+                    if (section.iIterations != 1 && previousCopiesRun == 1)
+                        {
+                        previousCopiesRun = section.iIterations;
+                        }
+                    // We should not run more than iCopies times, but also not 
+                    // allow previousCopiesRun to be zero to completely avoid 
+                    // running a section.
+                    copies = Min(section.iIterations, Max(previousCopiesRun, 1));
+                    }
+
+                for(TInt copy = 0; copy < copies; copy++)
+                    {
+                    // Make a copy and put it into the "tc" variable that we set up earlier....
+                    TInt i = 0;
+                    for(; section.iEngineTestCase[i].iCase != EFinishedCase; i++)
+                        {
+                        TEngineTestCase ec = section.iEngineTestCase[i];
+                        ModifyL(ec);
+                        tc.iEngineTestCase[i] = ec;
+                        }
+                    tc.iEngineTestCase[i].iCase = EFinishedCase;
+                    TRAPD(err, RunSingleCaseL(tc, surfType));
+                    if (err != KErrNone)
+                        {
+                        INFO_PRINTF2(_L("RunSingleCaseL left with an error: %d"), err);
+                        }
+                    if (err != KErrNone || TestStepResult() != EPass)
+                        {
+                        if (HandleError(section, copy, copies, 
+                                curSection, previousCopiesRun))
+                            {
+                            break;
+                            }
+                        }
+                    NextParams();
+                    }
+                DestroyParams();
+                }              
+            // params are not used in this call, so we just pass some suitable type in.
+            // Save the result, as the remote side may have failed, but it's
+            // not a real failure in a stress-test.
+            TVerdict v = TestStepResult();
+            EndRemoteTestStep(configParams);
+            SetTestStepResult(v);
+            }
+        }
+    return TestStepResult();
+    }
+
+
+
+
+// Derived function to start a thread. 
+void CStressTestEngine::StartThreadL(TInt aThreadNumber)
+    {
+    const TInt KStackSize = 12000;
+    const TInt KHeapMinSize = 16000;
+    const TInt KHeapMaxSize = 1000000;
+
+    if (aThreadNumber >= KMaxLoadThreads)
+        {
+        User::Panic(_L("StartThreadL"), __LINE__);
+        }
+    
+    __e32_atomic_store_rel32(&iStopThreadFlag[aThreadNumber], EFalse);
+    TUint32 random = Math::Random();
+    TName threadName;
+    _LIT(KThreadNameFormat, "%S-%u");
+
+    // Create a loadthread. 
+    _LIT(KThreadName, "EpTestLoadThread");
+    threadName.Format(KThreadNameFormat, &KThreadName, random);
+    TThreadFunction threadFunc = GetThreadFunction(aThreadNumber);
+    if (threadFunc == NULL)
+        {
+        ERR_PRINTF2(_L("Requested thread function %d, got NULL pointer back!"), aThreadNumber);
+        User::Leave(KErrArgument);
+        }
+    TInt err = iLoadThread[aThreadNumber].Create(threadName, threadFunc, 
+                    KStackSize, KHeapMinSize, KHeapMaxSize, this, EOwnerThread);
+    if(err != KErrNone)
+        {
+        ERR_PRINTF2(_L("Could not create load thread - err=%d"), err);
+        User::Leave(err);
+        }
+    iLoadThread[aThreadNumber].Resume();
+    }
+
+
+// Terminate a previously started thread.
+void CStressTestEngine::EndThread(TInt aThreadNumber)
+    {
+    TRequestStatus status;
+    iLoadThread[aThreadNumber].Logon(status);
+    RDebug::Printf("Ending thread %d", aThreadNumber);
+    __e32_atomic_store_rel32(&iStopThreadFlag[aThreadNumber], ETrue);
+    // Wait for thread to exit.
+    User::WaitForRequest(status);
+    iLoadThread[aThreadNumber].Close();
+    }
+
+// This function is intended to be implemented by a derived class - just print
+// an error and return NULL.   
+TThreadFunction CStressTestEngine::GetThreadFunction(TInt aThreadNumber)
+    {
+    ERR_PRINTF2(_L("Should not be called: CStressTestEngine::GetThreadFunction() with %d"), aThreadNumber);
+    return NULL;
+    }
+
+
+// Parameter class implementation.
+// General description:
+// The class uses a virtual interface that has three member functions:
+// Initialize(start, end, step) 
+//   Setup. The values of start, end and step may be used for other purposes
+// Value()
+//   Return current value of the parameter. Does not alter the value.
+// Next()
+//   Update the value to the next one. Where relevant, wrap around to the 
+//   starting value if the end has been reached.
+
+// Factory function to create parameter instances.
+CStressParam * CStressParam::Factory(const TParamDeclaration &aParamDecl)
+    {
+    CStressParam *p;
+    switch(aParamDecl.iType)
+        {
+        case EParamTypeNone:
+            // Didn't want this parameter - return NULL!
+            // We later check if the pointer is NULL and complain if an
+            // attempt is made to USE this parameter.
+            p = NULL;
+            break;
+            
+        case EParamTypeIterator:
+            p = new CStressParamIterator;
+            break;
+            
+        case EParamTypeTable:
+            p = new CStressParamTable;
+            break;
+            
+        case EParamTypeRandomizer:
+            p = new CStressParamRandomizer;
+            break;
+            
+        default:
+            RDebug::Printf("%s:%d: Type not implemented (type = %d)", 
+                    __FILE__, __LINE__, aParamDecl.iType);
+            p = NULL;
+            break;
+        }
+    if (p)
+        {
+        p->Initialize(aParamDecl.iInit, aParamDecl.iEnd, aParamDecl.iStep);
+        }
+    return p;
+    }
+
+
+CStressParam::~CStressParam()
+    {
+    }
+
+
+CStressParamIterator::CStressParamIterator()
+    {
+    }
+
+
+CStressParamIterator::~CStressParamIterator()
+    {
+    }
+
+
+void CStressParamIterator::Initialize(TInt aInit, TInt aEnd, TInt aStep)
+    {
+    iInit = aInit;
+    iEnd = aEnd;
+    iStep = aStep;
+    iIterator = iInit;
+    }
+
+void CStressParamIterator::Next()
+    {
+    iIterator += iStep;
+    if (iStep > 0)
+        {
+        if (iIterator >= iEnd)
+            {
+            iIterator = iInit;
+            }
+        }
+    else
+        {
+        if (iIterator <= iEnd)
+            {
+            iIterator = iInit;
+            }
+        }
+    }
+
+
+TInt CStressParamIterator::Value()
+    {
+    return iIterator;
+    }
+
+
+CStressParamRandomizer::CStressParamRandomizer()
+    {
+    }
+
+
+CStressParamRandomizer::~CStressParamRandomizer()
+    {
+    }
+
+
+void CStressParamRandomizer::Initialize(TInt aMin, TInt aMax, TInt aMul)
+    {
+    iMin = aMin;
+    iMax = aMax;
+    iMul = aMul;
+    // Now, pick a new random number. 
+    Next();  
+    }
+
+
+void CStressParamRandomizer::Next()
+    {
+    iCurrent = (((TInt)Math::Random()) % ((iMax - iMin) + iMin)) * iMul;
+    }
+
+TInt CStressParamRandomizer::Value()
+    {
+    return iCurrent;
+    }
+
+
+CStressParamTable::CStressParamTable()
+    {
+    }
+
+
+CStressParamTable::~CStressParamTable()
+    {
+    }
+
+
+void CStressParamTable::Initialize(TInt aTable, TInt aCount, TInt /* aUnused */)
+    {
+    iTable = reinterpret_cast<TInt *>(aTable);
+    iCount = aCount;
+    iIndex = 0;
+    }
+
+
+void CStressParamTable::Next()
+    {
+    iIndex = (iIndex + 1) % iCount;
+    }
+
+
+TInt CStressParamTable::Value()
+    {
+    return iTable[iIndex];
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_stressload.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,357 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <e32math.h>
+#include <e32atomics.h>
+#include "egltest_endpoint_stressload.h"
+#include "egltest_endpoint_engine.h"
+
+
+// This would run in conjunction with 
+static TStressTestSection test603[] =
+{
+    1, EOnErrorPolicyFail, 
+    { NO_PARAMS },
+    {
+        { EInitializeCase,           0,                 EGL_SUCCESS },
+        { EStartLoadThreadCase,      EThreadController, EGL_SUCCESS, EThreadLoadGpuProcessor },
+        { EFinishedCase }
+    },
+    1000, EOnErrorPolicyContinue, 
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0, 0 },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EEndLoadThreadCase,        EThreadController, EGL_SUCCESS, EThreadLoadGpuProcessor },
+        { ETerminateCase,            0,                 EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+
+static TStressTestSection test625[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,           0,                 EGL_SUCCESS },
+        { EStartLoadThreadCase,      EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { EFinishedCase }
+    },
+    200, EOnErrorPolicyContinue, 
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0, 0 },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EEndLoadThreadCase,        EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { ECheckForMemoryLeaks,      0,              EGL_SUCCESS }, 
+        { EStartLoadThreadCase,      EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { EFinishedCase }
+    },
+    200, EOnErrorPolicyContinue, 
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0, 0 },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EEndLoadThreadCase,        EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { ECheckForMemoryLeaks,      0,              EGL_SUCCESS }, 
+        { EStartLoadThreadCase,      EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { EFinishedCase }
+    },
+    200, EOnErrorPolicyContinue,
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0, 0 },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EEndLoadThreadCase,        EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { ECheckForMemoryLeaks,      0,              EGL_SUCCESS }, 
+        { EStartLoadThreadCase,      EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { EFinishedCase }
+    },
+    200, EOnErrorPolicyContinue,
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0, 0 },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EEndLoadThreadCase,        EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { ECheckForMemoryLeaks,      0,              EGL_SUCCESS }, 
+        { EStartLoadThreadCase,      EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { EFinishedCase }
+    },
+    200, EOnErrorPolicyContinue,
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0, 0 },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail, 
+    { NO_PARAMS },
+    {
+        { EEndLoadThreadCase,        EThreadController, EGL_SUCCESS, EThreadLoadGpuMemory },
+        { ECheckForMemoryLeaks,      0,                 EGL_SUCCESS }, 
+        { ECheckForMemoryLeaksFinish,0,                 EGL_SUCCESS },
+        { ETerminateCase,            0,                 EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+
+static const TStressTestTable testTable[] =
+{
+    {
+        {
+        TESTIDS("625"),
+        CASETITLE("Stress: Test with GPU memory low."),
+        SurfaceTypes3(ESurfTypeEglWindow, ESurfTypeRawSingleBuffered, ESurfTypeRaw),
+        },
+        TESTTABLE(test625)
+    },
+    {
+        {
+        TESTIDS("603"),
+        CASETITLE("Stress: Test with high GPU load."),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test603)
+    },
+};
+
+
+CEglTest_TestStep_StressLoad::CEglTest_TestStep_StressLoad()
+    {
+    }
+
+CEglTest_TestStep_StressLoad* CEglTest_TestStep_StressLoad::New()
+    {
+    CEglTest_TestStep_StressLoad *self = new CEglTest_TestStep_StressLoad;
+    
+    if (self)
+        {
+        self->ConstructL(testTable, sizeof(testTable)/sizeof(testTable[0]));
+        }
+    return self;
+    }
+
+
+TInt CEglTest_TestStep_StressLoad::LoadGpuProcessor(TAny* aSelf )
+    {
+    CEglTest_TestStep_StressLoad* self = reinterpret_cast<CEglTest_TestStep_StressLoad*>(aSelf);
+    CTrapCleanup *cleanUpStack = CTrapCleanup::New();
+    if (!cleanUpStack)
+       {
+       // Can't use INFO_PRINTF here, as we have not yet
+       // created the logger object - nor can we until we have
+       // a working cleanupstack, so we just do our best at a 
+       // reason able error message.
+       RDebug::Printf("Could not allocate memory for cleanupStack!");
+       User::Panic(_L("LoadThread"), __LINE__);
+       return KErrNoMemory;
+       }
+
+    TRAPD(err, self->LoadGpuProcessorL());
+    delete cleanUpStack;
+    if (err != KErrNone)
+        {
+        RDebug::Printf("LoadGpuProcessorL left with %d", err);
+        User::Panic(_L("LoadGpuProc"), __LINE__);
+        }
+    return err;
+    }
+
+
+void CEglTest_TestStep_StressLoad::LoadGpuProcessorL()
+    {
+    CSurface  *surface = CSurface::SurfaceFactoryL(ESurfTypeEglWindow);
+    CleanupStack::PushL(surface);
+    surface->CreateL(EStandard128sqSurface, TPoint(128, 128));
+    TRgb bg = TRgb(0x55, 0x88, 0xff);   // Cyan/turqoise-ish.  
+    TRgb fg = TRgb(0xff, 0x11, 0x22);   // Red (sort of)
+    while(!__e32_atomic_load_acq32(&iStopThreadFlag[EThreadLoadGpuProcessor])) 
+        {
+            surface->DrawContentL(bg);
+            surface->DrawComplexL(fg);
+            surface->SubmitContent(ETrue);
+        }
+    CleanupStack::PopAndDestroy(surface);
+    eglReleaseThread();
+    }
+
+
+TInt CEglTest_TestStep_StressLoad::LoadGpuMemory(TAny* aSelf)
+    { 
+    CEglTest_TestStep_StressLoad* self = reinterpret_cast<CEglTest_TestStep_StressLoad*>(aSelf);
+    CTrapCleanup *cleanUpStack = CTrapCleanup::New();
+    if (!cleanUpStack)
+       {
+       // Can't use INFO_PRINTF here, as we have not yet
+       // created the logger object - nor can we until we have
+       // a working cleanupstack, so we just do our best at a 
+       // reasonable error message.
+       RDebug::Printf("Could not allocate memory for cleanupStack!");
+       User::Panic(_L("LoadThread"), __LINE__);
+       return KErrNoMemory;
+       }
+
+    TRAPD(err, self->LoadGpuMemoryL());
+    delete cleanUpStack;
+    if (err != KErrNone)
+        {
+        RDebug::Printf("LoadThreadL left with %d", err);
+        User::Panic(_L("LoadThread"), __LINE__);
+        }
+    return err;
+    }
+
+
+void CEglTest_TestStep_StressLoad::LoadGpuMemoryL()
+    {
+    const TInt KMaxSurfaceAllocs = 1000;
+    CSurface **surfaces = new CSurface*[KMaxSurfaceAllocs];
+    ENGINE_ASSERT(surfaces);
+    TInt nSurfaces = 0;
+    TInt err;
+    while(!__e32_atomic_load_acq32(&iStopThreadFlag[EThreadLoadGpuMemory]))     
+        {
+        ENGINE_ASSERT(nSurfaces < KMaxSurfaceAllocs);
+        CSurface* s = CSurface::SurfaceFactoryL(ESurfTypePBuffer);
+        if (s)
+            {
+            TRAP(err, s->CreateL(ELargeSurface));
+            if (err == KErrNone)
+                {
+                surfaces[nSurfaces++] = s;
+                TRAP(err, s->DrawContentL(TRgb(0x10, 0x20, 0xB0)));
+                }
+            else
+                {
+                delete s;
+                s = NULL;
+                }
+            }
+        if (!s)
+            {
+            User::After(100 * 1000);
+            TInt nRelease = nSurfaces / 4;
+            for(TInt i = 0; i < nRelease; i++)
+                {
+                delete surfaces[--nSurfaces];
+                surfaces[nSurfaces] = NULL;
+                }
+            User::After(100 * 1000); // 100 ms. 
+            }
+        }
+    while(nSurfaces)
+        {
+        delete surfaces[--nSurfaces];
+        }
+    delete [] surfaces;
+    eglReleaseThread();
+    }
+
+
+
+TThreadFunction CEglTest_TestStep_StressLoad::GetThreadFunction(TInt aThreadNumber)
+    {
+    switch(aThreadNumber)
+        {
+        case EThreadLoadGpuProcessor:
+            return LoadGpuProcessor; 
+
+        case EThreadLoadGpuMemory:
+            return LoadGpuMemory;
+        }
+    RDebug::Printf("%s:%d: Unknown thread number %d", __FILE__, __LINE__, aThreadNumber);
+    return NULL;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpoint_stresstests.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,337 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "egltest_endpoint_stresstests.h"
+#include "egltest_endpoint_engine.h"
+
+
+// an example of table with "random order numbers 0..3". 
+static const TInt KImageTable[] = { 1, 3, 0, 2, 3, 1, 2, 0 };
+
+static TStressTestSection test588A[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,           0,                EGL_SUCCESS },
+        { EFinishedCase }
+    },
+    100, EOnErrorPolicyBreak,
+    { PARAM_DECL_ITER(0, 100, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, PARAM0(0), EStandardSurface },
+        { EFinishedCase }
+    },
+    100, EOnErrorPolicyBreak,
+    { PARAM_DECL_ITER(0, 100, 1), PARAM_DECL_TABLE(KImageTable) },
+    {
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, PARAM0(0) },
+        { EDrawContentCase,          0,              EGL_SUCCESS, PARAM0(0), PARAM1(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, PARAM0(0) },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, PARAM0(0) },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, PARAM0(0) },
+        { ECompareImageCase,         0,              EGL_SUCCESS, PARAM0(0), PARAM1(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, PARAM0(0), PARAM0(0) },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, PARAM0(0) },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { ETerminateCase,            0,              EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+static TStressTestSection test588B[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,           0,                EGL_SUCCESS },
+        { EFinishedCase }
+    },
+    1000, EOnErrorPolicyBreak,
+    { PARAM_DECL_ITER(0, 1000, 1) },
+    {
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, PARAM0(0), EStandardSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, PARAM0(0) },
+        { EDrawContentCase,          0,              EGL_SUCCESS, PARAM0(0), PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, PARAM0(0) },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, PARAM0(0) },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, PARAM0(0) },
+        { EFinishedCase }
+    },
+    1000, EOnErrorPolicyBreak,
+    { PARAM_DECL_ITER(0, 1000, 1) },
+    {
+        { EReleaseImageCase,         0,              EGL_SUCCESS, PARAM0(0), PARAM0(0) },
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, PARAM0(0) },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { ETerminateCase,            0,              EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+static TStressTestSection test589[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,           0,              EGL_SUCCESS },
+        { ECreateSurfaceCase,        0,              EGL_SUCCESS, 0, ELargestPossibleSurface },
+        { ECreateEndpointCase,       0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    5, EOnErrorPolicyBreak,
+    { PARAM_DECL_ITER(0, 4, 1) },
+    {
+        { EDrawContentCase,          0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EContentUpdateCase,        0,              EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,       0,              EGL_SUCCESS, 0 },
+        { EAcquireImageCase,         0,              EGL_SUCCESS, 0 },
+        { ECompareImageCase,         0,              EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,         0,              EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EDestroyEndpointCase,      0,              EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,       0,              EGL_SUCCESS, 0 },
+        { ETerminateCase,            0,              EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+static TStressTestSection test590A[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,          0,          EGL_SUCCESS },
+        { ECreateSurfaceCase,       0,          EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,      0,          EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1000, EOnErrorPolicyBreak,
+    { PARAM_DECL_TABLE(KImageTable) },
+    {
+        { EDrawContentCase,         0,         EGL_SUCCESS, 0, PARAM0(0)},
+        { EContentUpdateCase,       0,         EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,      0,         EGL_SUCCESS, 0 },
+        { EAcquireImageCase,        0,         EGL_SUCCESS, 0 },
+        { ECompareImageCase,        0,         EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,        0,         EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EDestroyEndpointCase,     0,          EGL_SUCCESS, 0 },
+        { ETerminateCase,           0,          EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+static TStressTestSection test590B[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,          0,          EGL_SUCCESS },
+        { EFinishedCase }
+    },
+    260, EOnErrorPolicyBreak,
+    {PARAM_DECL_ITER(0, 260, 1), PARAM_DECL_TABLE(KImageTable)},
+    {
+        { ECreateSurfaceCase,       0,          EGL_SUCCESS, PARAM0(0), EStandardSurface },
+        { ECreateEndpointCase,      0,          EGL_SUCCESS, PARAM0(0) },
+        { EDrawContentCase,         0,          EGL_SUCCESS, PARAM0(0), PARAM1(0)},
+        { EContentUpdateCase,       0,          EGL_SUCCESS, PARAM0(0) },
+        { EBeginStreamingCase,      0,          EGL_SUCCESS, PARAM0(0) },
+        { EAcquireImageCase,        0,          EGL_SUCCESS, PARAM0(0) },
+        { ECompareImageCase,        0,          EGL_SUCCESS, PARAM0(0), PARAM1(0)},
+        { EFinishedCase }
+    },
+    260, EOnErrorPolicyBreak,
+    {PARAM_DECL_ITER(0, 260, 1)},
+    {
+        { EReleaseImageCase,        0,          EGL_SUCCESS, PARAM0(0), PARAM0(0) },
+        { EDestroyEndpointCase,     0,          EGL_SUCCESS, PARAM0(0) },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { ETerminateCase,           0,          EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+static TStressTestSection test592A[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,          0,          EGL_SUCCESS },
+        { ECreateSurfaceCase,       0,          EGL_SUCCESS, 0, EStandardSurface },
+        { EFinishedCase }
+    },
+    1000, EOnErrorPolicyBreak,
+    { PARAM_DECL_TABLE(KImageTable) },
+    {
+        { ECreateEndpointCase,      0,          EGL_SUCCESS, 0 },
+        { EDrawContentCase,         0,          EGL_SUCCESS, 0, PARAM0(0)},
+        { EContentUpdateCase,       0,          EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,      0,          EGL_SUCCESS, 0 },
+        { EAcquireImageCase,        0,          EGL_SUCCESS, 0 },
+        { ECompareImageCase,        0,          EGL_SUCCESS, 0, PARAM0(0)},
+        { EReleaseImageCase,        0,          EGL_SUCCESS, 0 },
+        { EDestroyEndpointCase,     0,          EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { ETerminateCase,           0,          EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+
+static TStressTestSection test592B[] =
+{
+    1, EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { EInitializeCase,          0,          EGL_SUCCESS },
+        { EFinishedCase }
+    },
+    1000, EOnErrorPolicyBreak,
+    { PARAM_DECL_TABLE(KImageTable) },
+    {
+        { ECreateSurfaceCase,       0,          EGL_SUCCESS, 0, EStandardSurface },
+        { ECreateEndpointCase,      0,          EGL_SUCCESS, 0 },
+        { EDrawContentCase,         0,          EGL_SUCCESS, 0, PARAM0(0)},
+        { EContentUpdateCase,       0,          EGL_SUCCESS, 0 },
+        { EBeginStreamingCase,      0,          EGL_SUCCESS, 0 },
+        { EAcquireImageCase,        0,          EGL_SUCCESS, 0 },
+        { ECompareImageCase,        0,          EGL_SUCCESS, 0, PARAM0(0) },
+        { EReleaseImageCase,        0,          EGL_SUCCESS, 0 },
+        { EDestroyEndpointCase,     0,          EGL_SUCCESS, 0 },
+        { EDestroySurfaceCase,      0,          EGL_SUCCESS, 0 },
+        { EFinishedCase }
+    },
+    1,  EOnErrorPolicyFail,
+    { NO_PARAMS },
+    {
+        { ETerminateCase,           0,          EGL_SUCCESS },
+        { EFinishedCase }
+    },
+};
+static const TStressTestTable testTable[] =
+{
+#if 0
+    {
+        {
+        TESTIDS("588A"),
+        CASETITLE("Functional: Stress: Test 100 surfaces."),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test588A)
+    },
+    {
+        {
+        TESTIDS("588B"),
+        CASETITLE("Functional: Stress: Test 1000 surfaces, destroy after."),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test588B)
+    },
+    {
+        {
+        TESTIDS("589"),
+        CASETITLE("Functional: Stress: Test with largest possible surface"),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test589)
+    }, 
+#endif
+    {
+        {
+        TESTIDS("590A"),
+        CASETITLE("Functional: Stress: Test with 1000 surface updates"),
+        SurfaceTypes3(ESurfTypeEglWindow, ESurfTypeRaw, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test590A) 
+    },
+#if 0
+    {
+        {
+        TESTIDS("590B"),
+        CASETITLE("Functional: Stress: Test with 260 surfaces"),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test590B)
+    },
+    {
+        {
+        TESTIDS("592A"),
+        CASETITLE("Functional: Stress: Large number of endpoint creation/destruction"),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test592A) 
+    },   
+    {
+        {
+        TESTIDS("592B"),
+        CASETITLE("Functional: Stress: Large number of endpoint creation/destruction"),
+        SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
+        },
+        TESTTABLE(test592B)       
+    },
+#endif
+};
+
+
+CEglTest_TestStep_StressTests::CEglTest_TestStep_StressTests()
+    {
+    }
+
+CEglTest_TestStep_StressTests* CEglTest_TestStep_StressTests::New()
+    {
+    CEglTest_TestStep_StressTests *self = new CEglTest_TestStep_StressTests;
+    
+    if (self)
+        {
+        self->ConstructL(testTable, sizeof(testTable)/sizeof(testTable[0]));
+        }
+    return self;
+    }
+
+
+
+
+
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointapiexposure_remote.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointapiexposure_remote.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -72,7 +72,7 @@
         REMOTE_INFO_PRINTF1(_L("Rest of test is being skipped due to failure."));
         return ERtvFail;
         }
-
+    eglReleaseThread(); // otherwise we leak handles
     return ERtvPass;
     }
 
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointdirtyarea.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointdirtyarea.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -26,7 +26,7 @@
 {
     {
         TESTIDS("614"),
-        CASETITLE("Functional: Postive: eglGetEndpointDirtyArea basic test."),
+        CASETITLE("Functional: Positive: eglGetEndpointDirtyArea basic test."),
         SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
         {
         { EInitializeCase,           0,              EGL_SUCCESS },
@@ -45,7 +45,7 @@
     },
     {
         TESTIDS("615"),
-        CASETITLE("Functional: Postive: eglGetEndpointDirtyArea simple working test - collapse area."),
+        CASETITLE("Functional: Positive: eglGetEndpointDirtyArea simple working test - collapse area."),
         SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
         {
         { EInitializeCase,           0,                EGL_SUCCESS },
@@ -64,7 +64,7 @@
     },
     {
         TESTIDS("617"),
-        CASETITLE("Functional: Postive: eglGetEndpointDirtyArea - check number of rects avialable"),
+        CASETITLE("Functional: Positive: eglGetEndpointDirtyArea - check number of rects avialable"),
         SurfaceTypes3(ESurfTypeRaw, ESurfTypeEglWindow, ESurfTypeRawSingleBuffered),
         {
         { EInitializeCase,           0,              EGL_SUCCESS },
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointimagelifetime.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointimagelifetime.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -85,7 +85,7 @@
 
     // Draw something.
     surface->DrawContentL(0);
-    surface->SubmitContentL(EFalse);
+    User::LeaveIfError(surface->SubmitContent(ETrue));
 
     if (result)
         {
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointlocking_local.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointlocking_local.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -60,58 +60,6 @@
 static const TTestCase KLockingMultibufferCases[] =
 {
     {
-        TESTIDS("571"),
-        CASETITLE("Functional Locking: Multiple Buffers: Surface Update Server Basic Notifications"),
-        SurfaceTypes1(ESurfTypeRaw),
-        {
-        { EInitializeCase,      0,              EGL_SUCCESS },
-        { ECreateSurfaceCase,   0,              EGL_SUCCESS, 0, EStandardSurface },
-        { ECreateEndpointCase,  0,              EGL_SUCCESS },
-        { EDrawContentCase,     0,              EGL_SUCCESS },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EBeginStreamingCase,  0,              EGL_SUCCESS },
-        { ESetAttribCase,       0,              EGL_SUCCESS,  0, 0, EGL_DELAY_NOK, 50000 }, //50ms delay
-        { ENotifyWhenCase,      0,              KErrNone,     0, ENotifyWhenAvailable },
-        { EContentUpdateCase,   ENoWait,        EGL_SUCCESS },
-        { EAcquireImageCase,    0,              EGL_SUCCESS },
-        { EWaitForCase,         0,              KErrTimedOut,     0, ENotifyWhenAvailable, 100000, 50000 }, //100 ms timeout, timestamp not used
-        { EReleaseImageCase,    0,              EGL_SUCCESS },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EAcquireImageCase,    0,              EGL_SUCCESS },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EWaitForCase,         0,              KErrNone,     0, ENotifyWhenAvailable, 100000, 50000 }, //100 ms timeout, timestamp not used
-        { EReleaseImageCase,    0,              EGL_SUCCESS },
-        { EEndStreamingCase,    0,              EGL_SUCCESS },
-        { EDestroyEndpointCase, 0,              EGL_SUCCESS },
-        { ETerminateCase,       0,              EGL_SUCCESS },
-        { EFinishedCase }
-        },
-    },
-    {
-        TESTIDS("575"),
-        CASETITLE("Functional Locking: Multiple Buffers: Update Server Notifications with eglEndpointEndStreamingNOK"),
-        SurfaceTypes1(ESurfTypeRaw),
-        {
-        { EInitializeCase,      0,              EGL_SUCCESS },
-        { ECreateSurfaceCase,   0,              EGL_SUCCESS, 0, EStandardSurface },
-        { ECreateEndpointCase,  0,              EGL_SUCCESS },
-        { EDrawContentCase,     0,              EGL_SUCCESS },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EBeginStreamingCase,  0,              EGL_SUCCESS },
-        { ESetAttribCase,       0,              EGL_SUCCESS,  0, 0, EGL_DELAY_NOK, 50000 }, //50ms delay
-        { ENotifyWhenCase,      0,              KErrNone,     0, ENotifyWhenAvailable },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EAcquireImageCase,    0,              EGL_SUCCESS },
-        { EWaitForCase,         0,              KErrTimedOut,     0, ENotifyWhenAvailable, 100000, 50000 }, //100 ms timeout, timestamp not used
-        { EEndStreamingCase,    0,              EGL_SUCCESS },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EWaitForCase,         0,              KErrNone,     0, ENotifyWhenAvailable, 100000, 50000 }, //100 ms timeout, timestamp not used
-        { EDestroyEndpointCase, 0,              EGL_SUCCESS },
-        { ETerminateCase,       0,              EGL_SUCCESS },
-        { EFinishedCase }
-        },
-    },
-    {
         TESTIDS("611"),
         CASETITLE("Functional Locking: Update Server Notifications with acquire and release"),
         SurfaceTypes1(ESurfTypeRaw),
@@ -133,28 +81,6 @@
         },
     },
     {
-        TESTIDS("576"),
-        CASETITLE("Functional Locking: Multiple Buffers: Update Server Notifications with eglDestroyEndpointNOK"),
-        SurfaceTypes1(ESurfTypeRaw),
-        {
-        { EInitializeCase,      0,              EGL_SUCCESS },
-        { ECreateSurfaceCase,   0,              EGL_SUCCESS, 0, EStandardSurface },
-        { ECreateEndpointCase,  0,              EGL_SUCCESS },
-        { EDrawContentCase,     0,              EGL_SUCCESS },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EBeginStreamingCase,  0,              EGL_SUCCESS },
-        { ESetAttribCase,       0,              EGL_SUCCESS,  0, 0, EGL_DELAY_NOK, 50000 }, //50ms delay
-        { ENotifyWhenCase,      0,              KErrNone,     0, ENotifyWhenAvailable },
-        { EContentUpdateCase,   0,              EGL_SUCCESS },
-        { EAcquireImageCase,    0,              EGL_SUCCESS },
-        { EWaitForCase,         0,              KErrTimedOut,     0, ENotifyWhenAvailable, 100000, 50000 }, //100 ms timeout, timestamp not used
-        { EDestroyEndpointCase, 0,              EGL_SUCCESS },
-        { EWaitForCase,         0,              KErrNone,     0, ENotifyWhenAvailable, 100000, 50000 }, //100 ms timeout, timestamp not used
-        { ETerminateCase,       0,              EGL_SUCCESS },
-        { EFinishedCase }
-        },
-    },
-    {
         TESTIDS("577"),
         CASETITLE("Functional Locking: Multiple Buffer: DestroyEndpoint results in EndStreaming if in streaming mode."),
         SurfaceTypes1(ESurfTypeRaw),
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointstreamingtests_local.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointstreamingtests_local.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -222,7 +222,7 @@
     User::LeaveIfError(aSurface->Notify(ENotifyWhenDispXTimes, dispXTimesRs, aNumTimes));
     
     TUint startTickCount = User::TickCount();
-    aSurface->SubmitContentL(EFalse);
+    User::LeaveIfError(aSurface->SubmitContent(EFalse));
     
     TUint32 dummyTimeStamp;
     TInt err = aSurface->WaitFor(ENotifyWhenDispXTimes, dispXTimesRs, timeout, dummyTimeStamp);
@@ -254,7 +254,7 @@
     CleanupStack::PushL(TCleanupItem(CleanupRemoteTestStep, this));
     
     //Local: Submit update for the surface so that the endpoint enters the ready state.
-    surface->SubmitContentL(EFalse);
+    User::LeaveIfError(surface->SubmitContent(ETrue));
     
     //Remote: Set the EGL_DELAY_NOK value and begin streaming on the endpoint.
     static const TEngineTestCase setDelayAndBeginStreamingSteps[] = 
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointtearing_local.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointtearing_local.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -213,7 +213,9 @@
     iStartDraw.Wait();
     surface->DrawContentL(TRgb(currentColour, 255));
     surface->Notify(ENotifyWhenAvailable, availableStat[currentStat++ & 1], 0);
-    surface->SubmitContentL(EFalse);
+    // We must wait until the image is copied; the endpoint isn't ready until the ContentUpdated has been processed by GCE BE.
+    // It isn't enough to simply call SubmitContentL; there's multiple process/thread boundaries to cross before the endpoint is 'ready'
+    User::LeaveIfError(surface->SubmitContent(ETrue));
     iFirstDrawDone.Signal();
     
     //Loop until we are told to stop drawing.
@@ -222,7 +224,7 @@
         //Draw content, ask for notification when the buffer we have drawn to is available and submit.
         surface->DrawContentL(TRgb(currentColour, 255));
         surface->Notify(ENotifyWhenAvailable, availableStat[currentStat++ & 1], 0);
-        surface->SubmitContentL(EFalse);
+        User::LeaveIfError(surface->SubmitContent(EFalse));
         
         //Wait until the other buffer is free, so we don't tear. There are 2 buffers 
         //in the surface: We asked for ELargeSurface, which is double buffered.
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointtearing_remote.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_endpointtearing_remote.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -90,7 +90,7 @@
     //Create an EglWindowSurface so we have a current context for vg operations.
     CEglWindowSurface* surface = CEglWindowSurface::NewL();
     CleanupStack::PushL(surface);
-    surface->CreateL(EStandardSurface);
+    surface->CreateL(EStandardSurface, TPoint(0, 0));
     surface->ActivateL();
     
     REMOTE_INFO_PRINTF1(_L("Repeatedly acquiring images and checking for evidence of tearing."));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_releaseimagegles_local.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#include "egltest_releaseimagegles.h"
+
+
+//This test case acquires an image from an endpoint then attempts to 
+//release the image, passing in EGL_OPENGL_ES_API as the API flag.
+//There are two configurations for the test, that is controlled by
+//a flag in aParams. The options are to have a valid GLES context 
+//set current, or to have nothing current.
+
+
+CEglTest_LocalTestStep_EndpointReleaseImageGles::CEglTest_LocalTestStep_EndpointReleaseImageGles() :
+    CLocalTestStepBase(ETestUidEndpointReleaseImageGles)
+    {
+    }
+
+
+CEglTest_LocalTestStep_EndpointReleaseImageGles::~CEglTest_LocalTestStep_EndpointReleaseImageGles()
+    {
+    }
+
+
+void CEglTest_LocalTestStep_EndpointReleaseImageGles::DoPreambleL()
+    {
+    //Register the test id.
+    _LIT(KTestId, "COV");
+    RegisterTestIdsL(KTestId);
+    SetCurrentTestIds(KTestId);
+    }
+
+
+void CEglTest_LocalTestStep_EndpointReleaseImageGles::DoPostambleL()
+    {
+    }
+
+
+TVerdict CEglTest_LocalTestStep_EndpointReleaseImageGles::doTestStepL()
+    {
+    TRemoteTestParams params;
+    StartRemoteTestStep(TRemoteTestParams());
+    
+    //Valid GLES context test.
+    params.iEndpointReleaseImageGles.iUseValidGlesContext = ETrue;
+    RunRemoteTestCase(0, params);
+    
+    //Invalid GLES context test.
+    params.iEndpointReleaseImageGles.iUseValidGlesContext = EFalse;
+    RunRemoteTestCase(0, params);
+        
+    EndRemoteTestStep(TRemoteTestParams());
+    return TestStepResult();
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_releaseimagegles_remote.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,184 @@
+#include "egltest_releaseimagegles.h"
+#include "eglendpointwrap.h"
+#include "egltest_surface.h"
+
+
+//Remote test step----------------------------------------------------------------
+
+CEglTest_RemoteTestStep_EndpointReleaseImageGles::CEglTest_RemoteTestStep_EndpointReleaseImageGles() :
+    CRemoteTestStepBase(ETestUidEndpointReleaseImageGles)
+    {
+    }
+
+
+CEglTest_RemoteTestStep_EndpointReleaseImageGles::~CEglTest_RemoteTestStep_EndpointReleaseImageGles()
+    {
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoStartRemoteTestStepL(const TRemoteTestParams& /*aMessageIn*/)
+    {
+    REMOTE_INFO_PRINTF1(_L("Starting Remote Test Step."));
+    EglStartL();
+    
+    iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    
+    //Create a raw surface that will be encapsulated by the endpoint.
+    iSurface = CRawSurface::NewL();
+    iSurface->CreateL(EStandardSurface, TPoint(0, 0));
+
+    TSurfaceId id = iSurface->SurfaceId();
+    iEndpoint = EglEndpoint().CreateEndpoint(iDisplay, EGL_ENDPOINT_TYPE_CONSUMER_NOK, EGL_TSURFACEID_NOK, &id, NULL);
+    if(iEndpoint == EGL_NO_ENDPOINT_NOK)
+        {
+        REMOTE_ERR_PRINTF1(_L("Failed to create endpoint."));
+        User::Leave(KErrUnknown);
+        }
+    
+    iSurface->DrawContentL(TRgb(128,128,128));
+    User::LeaveIfError(iSurface->SubmitContent(EFalse));
+    EGLBoolean ret = EglEndpoint().EndpointBeginStreaming(iDisplay, iEndpoint);
+    if(!ret)
+        {
+        REMOTE_ERR_PRINTF1(_L("Failed to begin streaming from endpoint."));
+        User::Leave(KErrUnknown);
+        }
+    
+    return ERtvPass;
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoEndRemoteTestStepL(const TRemoteTestParams& /*aMessageIn*/)
+    {
+    REMOTE_INFO_PRINTF1(_L("Ending Remote Test Step."));
+    if(iEndpoint != EGL_NO_ENDPOINT_NOK)
+        {
+        EglEndpoint().EndpointEndStreaming(iDisplay, iEndpoint);
+        EglEndpoint().DestroyEndpoint(iDisplay, iEndpoint);
+        }
+    delete iSurface;
+    EglEndL();
+    return ERtvPass;
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoRunRemoteTestCaseL(TInt aTestCase, const TRemoteTestParams& aParams)
+    {
+    switch(aTestCase)
+        {
+        case 0:     return GlesContextTestCaseL(aParams);
+        default:    return ERtvAbort;
+        }
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::GlesContextTestCaseL(const TRemoteTestParams& aParams)
+    {
+    //This test case acquires an image from an endpoint then attempts to 
+    //release the image, passing in EGL_OPENGL_ES_API as the API flag.
+    //There are two configurations for the test, that is controlled by
+    //a flag in aParams. The options are to have a valid GLES context 
+    //set current, or to have nothing current.
+    
+    EGLContext glesContext = EGL_NO_CONTEXT;
+    EGLSurface glesSurface = EGL_NO_SURFACE;
+    
+    //Create GLES state and set it current if the test requires it.
+    if(aParams.iEndpointReleaseImageGles.iUseValidGlesContext)
+        {
+        EGLConfig config;
+        EGLint nConfigs = 0;
+        
+        static const EGLint KConfigAttribs[] =
+        {
+            EGL_BUFFER_SIZE,    32,
+            EGL_RED_SIZE,       8,
+            EGL_GREEN_SIZE,     8,
+            EGL_BLUE_SIZE,      8,
+            EGL_ALPHA_SIZE,     8,
+            EGL_SURFACE_TYPE,   EGL_PBUFFER_BIT,
+            EGL_RENDERABLE_TYPE,EGL_OPENGL_ES_BIT,
+            EGL_NONE
+        };
+
+        eglChooseConfig(iDisplay, KConfigAttribs, &config, 1, &nConfigs);
+        if (!nConfigs)
+            {
+            RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, eglGetError());
+            User::Leave(KErrNotSupported);
+            }
+    
+        if (!eglBindAPI(EGL_OPENGL_ES_API))
+            {
+            RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, eglGetError());
+            User::Leave(KErrNotSupported);
+            }
+        
+        glesContext = eglCreateContext(iDisplay, config, 0, NULL);
+        if (glesContext == EGL_NO_CONTEXT)
+            {
+            RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, eglGetError());
+            User::Leave(KErrNotSupported);
+            }
+        
+        static const EGLint KPbufferAttribs[] =
+            {
+            EGL_WIDTH, 100,
+            EGL_HEIGHT, 100,
+            EGL_NONE,
+            };
+        
+        glesSurface = eglCreatePbufferSurface(iDisplay, config, KPbufferAttribs);
+        if (glesSurface == EGL_NO_SURFACE)
+            {
+            RDebug::Printf("%s:%d: err = %x", __FILE__, __LINE__, eglGetError());
+            User::Leave(KErrNotSupported);
+            }
+        
+        eglMakeCurrent(iDisplay, glesSurface, glesSurface, glesContext);
+        }
+    
+    //Run the test case ansd trap to give us an opportunity to destroy the GLES state if it exists.
+    TRemoteTestVerdict verdict = ERtvPass;
+    TRAPD(err, verdict = DoGlesContextTestCaseL(aParams));
+    
+    //Destroy the GLES state if it exists.
+    if(aParams.iEndpointReleaseImageGles.iUseValidGlesContext)
+        {
+        eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+        eglDestroySurface(iDisplay, glesSurface);
+        eglDestroyContext(iDisplay, glesContext);
+        }
+    
+    //Releave if the test left or return the verdict.
+    User::LeaveIfError(err);
+    return verdict;
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoGlesContextTestCaseL(const TRemoteTestParams& /*aParams*/)
+    {
+    //Draw to the surface and submit the update.
+    iSurface->DrawContentL(TRgb(128,128,128));
+    User::LeaveIfError(iSurface->SubmitContent(ETrue));
+    
+    //Acquire an image and check that it was successful.
+    EGLImageKHR image = EglEndpoint().AcquireImage(iDisplay, iEndpoint);
+    if(image == EGL_NO_IMAGE_KHR)
+        {
+        REMOTE_ERR_PRINTF2(_L("Failed to acquire image from endpoint with error = %d"), eglGetError());
+        return ERtvFail;
+        }
+    
+    //Attempt to release the image. This must always succeed regardless of whether there is a valid GLES context.
+    EGLBoolean ret = EglEndpoint().ReleaseImage(iDisplay, iEndpoint, image, EGL_OPENGL_ES_API);
+    if(!ret)
+        {
+        REMOTE_ERR_PRINTF2(_L("Failed to release image from endpoint with error = %d"), eglGetError());
+        return ERtvFail;
+        }
+    
+    return ERtvPass;
+    }
+
+//--------------------------------------------------------------------------------
--- a/egl/egltest/endpointtestsuite/automated/tsrc/egltest_surface.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_surface.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -23,6 +23,10 @@
 #include "egltest_surface.h"
 #include "egltest_endpoint_images.h"
 #include <graphics/surfaceconfiguration.h>
+#include <e32std.h>
+#include <e32math.h>
+#include <VG/vgu.h>
+
 
 #define SURF_ASSERT(x) { if (!(x)) { RDebug::Printf("ASSERT(%s) failed at %s:%d", #x, __FILE__, __LINE__); User::Panic(_L("ASSERT SURF"), __LINE__); }}
 
@@ -38,6 +42,8 @@
 #define WindowPos(x, y)  x, y
 #define WindowMode(m) m
 
+#define LARGEST_POSSIBLE_FLAG 0x80000000
+
 static const TSurfaceParamsCommon KSurfaceParams[] =
 {
     {
@@ -131,10 +137,123 @@
         WindowPos(0, 0),
         WindowMode(EColor16MAP)
     },
+    {
+        ELargestPossibleSurface,
+        SIZE(LARGEST_POSSIBLE_FLAG, LARGEST_POSSIBLE_FLAG),
+        Buffers(2),
+        DefaultAlignment,
+        DefaultStride,
+        Offset(0),
+        EUidPixelFormatARGB_8888_PRE,
+        EFalse,
+        { 0 },
+        WindowPos(0, 0),
+        WindowMode(EColor16MAP)
+    },    
+    {
+        ESmallSurface,
+        SIZE(16, 16),
+        Buffers(1),
+        DefaultAlignment,
+        DefaultStride,
+        Offset(0),
+        EUidPixelFormatARGB_8888_PRE,
+        EFalse,
+        { 0 },
+        WindowPos(0, 0),
+        WindowMode(EColor16MAP)
+    },
+    {
+        ETinySurface,
+        SIZE(8, 8),
+        Buffers(1),
+        DefaultAlignment,
+        DefaultStride,
+        Offset(0),
+        EUidPixelFormatARGB_8888_PRE,
+        EFalse,
+        { 0 },
+        WindowPos(0, 0),
+        WindowMode(EColor16MAP)
+    },
 };
 
+const TInt KSurfaceMaxIndex = sizeof(KSurfaceParams) / sizeof(KSurfaceParams[0]);
 
-TInt KSurfaceMaxIndex = sizeof(KSurfaceParams) / sizeof(KSurfaceParams[0]);
+struct TSurfaceSize
+    {
+    TInt iWidth;
+    TInt iHeight;
+    };
+
+static const TSurfaceSize KSurfaceSizes[] =
+    {
+        {  320,  240 },
+        {  640,  480 },
+        {  720,  480 },
+        {  854,  480 },
+        {  720,  576 },
+        {  854,  576 },
+        { 1280,  720 },
+        { 1024,  768 },
+        { 1280, 1024 },
+        { 1920, 1080 },
+        { 1600, 1200 },
+#if 0
+        { 2048, 1536 },
+        { 2560, 1920 },
+        { 3648, 2736 },
+        { 4216, 2638 },
+        { 4000, 3000 },
+        { 4616, 2600 },
+#endif
+    };
+
+const TInt KMaxSurfaceSizes =  sizeof(KSurfaceSizes) / sizeof(KSurfaceSizes[0]);
+
+LOCAL_C TUint RandomNumberInRange(TUint aLow, TUint aHigh)
+    {
+    TReal32 rand = Math::Random();
+    rand /= KMaxTUint;
+    rand *= aHigh - aLow;
+    rand += aLow;
+    return TUint(rand);
+    }
+
+
+void CSurface::CreateL(TInt aIndex)
+    {
+    CreateL(aIndex, TPoint(0, 0));
+    }
+
+
+TSize CSurface::Size()
+    {
+    return iActualSize;
+    }
+
+
+TInt CSurface::SizeInBytes() const
+    {
+    RSurfaceManager::TInfoBuf infoBuf;
+    RSurfaceManager surfMgr;
+    TInt err = surfMgr.Open();
+    if (err != KErrNone)
+        {
+        RDebug::Printf("Error opening surface manager... Err=%d", err);
+        return 0;
+        }
+    err = surfMgr.SurfaceInfo(SurfaceId(), infoBuf);
+    if (err != KErrNone)
+        {
+        RDebug::Printf("Could not get surface info - err = %d", err);
+        return 0;
+        }
+    TInt size = infoBuf().iBuffers * infoBuf().iSize.iHeight * infoBuf().iStride;
+    surfMgr.Close();
+    return size;
+    }
+
 
 CRawSurface* CRawSurface::NewL()
     {
@@ -146,6 +265,7 @@
     }
 
 
+
 CRawSurface::CRawSurface() : iDrawBuffer(0), iBuffers(0)
     {
     }
@@ -155,7 +275,7 @@
     {
     iSurfaceId = TSurfaceId::CreateNullId();
     User::LeaveIfError(iSurfaceManager.Open());
-    User::LeaveIfError(iSurfaceUpdate.Connect(5));
+    User::LeaveIfError(iSurfaceUpdate.Connect());
     }
 
 
@@ -192,19 +312,30 @@
     }
 
 
-void CRawSurface::GetSurfAttribs(RSurfaceManager::TSurfaceCreationAttributesBuf &aSurfaceAttribs, TInt aIndex)
+void CRawSurface::GetSurfAttribs(RSurfaceManager::TSurfaceCreationAttributesBuf &aSurfaceAttribs, 
+        TInt aIndex, TInt aSizeIndex)
     {
     SURF_ASSERT(aIndex < KSurfaceMaxIndex);
     SURF_ASSERT(aIndex == KSurfaceParams[aIndex].iIndex);
     iParamIndex = aIndex;
-    aSurfaceAttribs().iSize = TSize(KSurfaceParams[aIndex].iXSize, KSurfaceParams[aIndex].iYSize);
+    if (KSurfaceParams[aIndex].iXSize & LARGEST_POSSIBLE_FLAG)
+        {
+        
+        aSurfaceAttribs().iSize = 
+                TSize(KSurfaceSizes[aSizeIndex].iWidth, KSurfaceSizes[aSizeIndex].iHeight);
+        }
+    else
+        {
+        aSurfaceAttribs().iSize = 
+                TSize(KSurfaceParams[aIndex].iXSize, KSurfaceParams[aIndex].iYSize);
+        }
     iBuffers = KSurfaceParams[aIndex].iBuffers;
     aSurfaceAttribs().iBuffers = iBuffers;
     aSurfaceAttribs().iPixelFormat = KSurfaceParams[aIndex].iPixelFormat;
     TInt stride = KSurfaceParams[aIndex].iStrideInBytes;
     if (stride == 0)
         {
-        stride = KSurfaceParams[aIndex].iXSize * PixelSize(KSurfaceParams[aIndex].iPixelFormat);
+        stride = aSurfaceAttribs().iSize.iWidth * PixelSize(KSurfaceParams[aIndex].iPixelFormat);
         }
     aSurfaceAttribs().iStride = stride;
     aSurfaceAttribs().iOffsetToFirstBuffer = KSurfaceParams[aIndex].iOffsetToFirstBuffer;
@@ -218,13 +349,25 @@
     }
 
 
-//From CSurface.
-void CRawSurface::CreateL(TInt aIndex)
+void CRawSurface::CreateL(TInt aIndex, const TPoint &/* aPoint */)
     {
     RSurfaceManager::TSurfaceCreationAttributesBuf surfaceAttribs;
-
-    GetSurfAttribs(surfaceAttribs, aIndex);
-    TInt err = iSurfaceManager.CreateSurface(surfaceAttribs, iSurfaceId);
+    SURF_ASSERT(aIndex < KSurfaceMaxIndex);
+    TInt sizeIndex = 0;
+    if (KSurfaceParams[aIndex].iXSize & LARGEST_POSSIBLE_FLAG)
+        {
+        sizeIndex = KMaxSurfaceSizes-1;
+        
+        }
+    TInt err = KErrNone;
+    do
+        {
+        GetSurfAttribs(surfaceAttribs, aIndex, sizeIndex);
+        err = iSurfaceManager.CreateSurface(surfaceAttribs, iSurfaceId);
+        iActualSize = surfaceAttribs().iSize;
+        sizeIndex--;
+        }
+    while(err != KErrNone && sizeIndex >= 0);
     User::LeaveIfError(err);
     }
 
@@ -239,6 +382,7 @@
     aInfo = infoBuf();
     TInt offset = -1000;  // So we hopefully detect when it goes horribly wrong.
     User::LeaveIfError(iSurfaceManager.GetBufferOffset(iSurfaceId, iDrawBuffer, offset));
+    SURF_ASSERT(offset >= 0);
     return iSurfaceChunk.Base() + offset;
     }
 
@@ -266,7 +410,6 @@
     CleanupStack::PopAndDestroy(2, image);
     }
 
-
 void CRawSurface::DrawContentL(const TRgb& aColour)
     {
     //Map the surface and get its info.
@@ -298,7 +441,13 @@
     }
 
 
-void CRawSurface::SubmitContentL(TBool aShouldWaitForDisplay, TInt /* aRectsIndex */)
+void CRawSurface::DrawComplexL(const TRgb& aColour)
+    {
+    DrawContentL(aColour);
+    }
+
+
+TInt CRawSurface::SubmitContent(TBool aShouldWaitForDisplay, TInt /* aRectsIndex */)
     {
     TRequestStatus displayNotify = KRequestPending;
     TTimeStamp timeStamp;
@@ -309,19 +458,27 @@
         }
 
     TInt err = iSurfaceUpdate.SubmitUpdate(KAllScreens, iSurfaceId, iDrawBuffer, NULL);
-    User::LeaveIfError(err);
+    if (err != KErrNone)
+        {
+        if (err != KErrNone)
+            {
+            RDebug::Printf("%s:%d: SubmitUpdate gave unexpected error %d", __FILE__, __LINE__, err);
+            }
+        return err;
+        }
     iDrawBuffer = (iDrawBuffer + 1) % iBuffers;
 
     if(aShouldWaitForDisplay)
         {
         TUint32 dummy;
-        TInt err = WaitFor(ENotifyWhenDisplayed, displayNotify, 100 * 1000, dummy);
+        err = WaitFor(ENotifyWhenDisplayed, displayNotify, 100 * 1000, dummy);
         if (err != KErrNone && err != KErrNotVisible && err != KErrOverflow)
             {
-            RDebug::Printf("%s:%d: NotifyWhenDisplayed gave unexpected error %d", __FILE__, __LINE__, err);
-            User::Leave(err);
+//            RDebug::Printf("%s:%d: NotifyWhenDisplayed gave unexpected error %d", __FILE__, __LINE__, err);
+            return err;
             }
         }
+    return KErrNone;
     }
 
 
@@ -372,6 +529,7 @@
     TInt err = timer.CreateLocal();
     if (err != KErrNone)
         {
+        RDebug::Printf("%s:%d: Could not create timer... err= %d", __FILE__, __LINE__, err);
         return err;
         }
     TRequestStatus timerStatus = KRequestPending;
@@ -403,8 +561,6 @@
     return result;
     }
 
-
-
 const TText *CRawSingleBufferSurface::GetSurfaceTypeStr() const
     {
     return _S("CRawSingleBufferedSurface");
@@ -420,31 +576,283 @@
     }
 
 
-void CRawSingleBufferSurface::CreateL(TInt aIndex)
+void CRawSingleBufferSurface::CreateL(TInt aIndex, const TPoint & /*aPoint */)
     {
     RSurfaceManager::TSurfaceCreationAttributesBuf surfaceAttribs;
 
-    GetSurfAttribs(surfaceAttribs, aIndex);
-
-    iBuffers = 1;
-    surfaceAttribs().iBuffers = 1;
-
-    TInt err = iSurfaceManager.CreateSurface(surfaceAttribs, iSurfaceId);
-    User::LeaveIfError(err);
+    TInt sizeIndex = 0;
+    if (KSurfaceParams[aIndex].iXSize & LARGEST_POSSIBLE_FLAG)
+        {
+        sizeIndex = KMaxSurfaceSizes-1;
+        }
+    TInt err = KErrNone;
+    do
+        {
+        GetSurfAttribs(surfaceAttribs, aIndex, sizeIndex);
+        iBuffers = 1;
+        surfaceAttribs().iBuffers = 1;
+        err = iSurfaceManager.CreateSurface(surfaceAttribs, iSurfaceId);
+        iActualSize = surfaceAttribs().iSize;
+        sizeIndex--;
+        }
+    while(err != KErrNone && sizeIndex >= 0);
     }
 
 CRawSingleBufferSurface::~CRawSingleBufferSurface()
     {
     }
 
+
+TInt CEglSurfaceBase::Activate()
+    {
+    if (!eglMakeCurrent(iDisplay, iSurface, iSurface, iContext))
+        {
+        EGLint err = eglGetError();
+        RDebug::Printf("%s:%d: eglMakeCurrent gave error 0x%x", __FILE__, __LINE__, err);
+        return KErrBadHandle;
+        }
+    return KErrNone;
+    }
+
+void CEglSurfaceBase::ActivateL()
+    {
+    User::LeaveIfError(Activate());
+    }
+
+void CEglSurfaceBase::DrawComplexL(const TRgb& aColour)
+    {
+    ActivateL();
+
+    TSize size;
+    eglQuerySurface(iDisplay, iSurface, EGL_WIDTH, &size.iWidth);
+    eglQuerySurface(iDisplay, iSurface, EGL_HEIGHT, &size.iHeight);
+    
+    //Paint lots of random circles to keep the GPU busy.
+    for(TInt i=0; i < 300; i++)
+        {
+        VGPaint paint = vgCreatePaint();
+        VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_APPEND_TO);
+        
+        TInt minDim = Min(size.iWidth, size.iHeight);
+        VGfloat cx = RandomNumberInRange(0, size.iWidth);
+        VGfloat cy = RandomNumberInRange(0, size.iHeight);
+        VGfloat diameter = RandomNumberInRange(minDim / 20, minDim / 3);
+        TRgb fillColour(RandomNumberInRange(0, 255), RandomNumberInRange(0, 255), RandomNumberInRange(0, 255), RandomNumberInRange(0, 255));
+        
+        vguEllipse(path, cx, cy, diameter, diameter);
+        vgSetPaint(paint, VG_FILL_PATH);
+        vgSetColor(paint, fillColour.Value());
+        vgDrawPath(path, VG_FILL_PATH);
+        
+        vgDestroyPath(path);
+        vgDestroyPaint(paint);
+        }
+    
+    //Paint the top corner with aColour so we can identify the drawing.
+    VGfloat fillColour[4];
+    fillColour[0] = (VGfloat)aColour.Red() / 255.0f;
+    fillColour[1] = (VGfloat)aColour.Green() / 255.0f;
+    fillColour[2] = (VGfloat)aColour.Blue() / 255.0f;
+    fillColour[3] = (VGfloat)aColour.Alpha() / 255.0f;
+    
+    vgSetfv(VG_CLEAR_COLOR, 4, fillColour);
+    vgClear(0, 0, 20, size.iHeight);
+    }
+
+void CEglSurfaceBase::DrawContentL(const TRgb& aColour)
+    {
+    ActivateL();
+
+    TSize size;
+    eglQuerySurface(iDisplay, iSurface, EGL_WIDTH, &size.iWidth);
+    eglQuerySurface(iDisplay, iSurface, EGL_HEIGHT, &size.iHeight);
+
+    VGfloat fillColour[4];
+    fillColour[0] = (VGfloat)aColour.Red() / 255.0f;
+    fillColour[1] = (VGfloat)aColour.Green() / 255.0f;
+    fillColour[2] = (VGfloat)aColour.Blue() / 255.0f;
+    fillColour[3] = (VGfloat)aColour.Alpha() / 255.0f;
+
+    vgSetfv(VG_CLEAR_COLOR, 4, fillColour);
+    vgClear(0, 0, size.iWidth, size.iHeight);
+    }
+
+void CEglSurfaceBase::CreateL(TInt aIndex, const TPoint &aOffset)
+    {
+    SURF_ASSERT(aIndex < KSurfaceMaxIndex);
+    SURF_ASSERT(aIndex == KSurfaceParams[aIndex].iIndex);
+
+    TInt sizeIndex = 0;
+    if (KSurfaceParams[aIndex].iXSize & LARGEST_POSSIBLE_FLAG)
+        {
+        sizeIndex = KMaxSurfaceSizes-1;
+        }
+    TInt err = KErrNone;
+    do
+        {
+        TRAP(err, DoCreateL(aIndex, aOffset, sizeIndex));
+        sizeIndex--;
+        }
+    while(err != KErrNone && sizeIndex >= 0);
+    if (err != KErrNone)
+        {
+//        RDebug::Printf("%s:%d: err=%d (%d x %d)", __FILE__, __LINE__, err, iActualSize.iWidth, iActualSize.iHeight);
+        User::Leave(err);
+        }
+    }
+
+TInt CEglSurfaceBase::SubmitContent(TBool aShouldWaitForDisplay, TInt /* aRectsIndex */)
+    {
+    TInt err = Activate();
+    if (err != KErrNone)
+        {
+        return err;
+        }
+    if (!eglSwapBuffers(iDisplay, iSurface))
+        {
+        EGLint err = eglGetError();
+        RDebug::Printf("%s:%d: eglSwapBuffers gave error 0x%x", __FILE__, __LINE__, err);
+        return KErrBadHandle;
+        }
+    if (aShouldWaitForDisplay)
+        {
+        // We are cheating: We just wait for a bit to ensure that the swapbuffer is actually finished.
+        // There is no way to determine how long this takes, so we just grab a number that should be
+        // large enough...
+        User::After(100 * 1000);  // Wait 100ms.
+        }
+    return KErrNone;
+    }
+
+void CEglSurfaceBase::DrawContentL(TInt aIndex)
+    {
+    ActivateL();
+    CTestVgImage *vgImage = CTestVgImage::NewL(aIndex);
+    CleanupStack::PushL(vgImage);
+    vgDrawImage(vgImage->VGImage());
+    CleanupStack::PopAndDestroy(vgImage);
+    }
+
+void CEglSurfaceBase::GetSurfaceParamsL(TSurfaceParamsRemote &aParams)
+    {
+    RSurfaceManager surfaceManager;
+    User::LeaveIfError(surfaceManager.Open());
+    RSurfaceManager::TInfoBuf infoBuf;
+    TInt err = surfaceManager.SurfaceInfo(SurfaceId(), infoBuf);
+    User::LeaveIfError(err);
+    surfaceManager.Close();
+    RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
+    aParams.iSurfaceId = SurfaceId();
+    aParams.iCommonParams.iAlignment = -1;  // N/A
+    aParams.iCommonParams.iBuffers = info.iBuffers;
+    aParams.iCommonParams.iOffsetToFirstBuffer = -1;
+    aParams.iCommonParams.iPixelFormat = info.iPixelFormat;
+    aParams.iCommonParams.iStrideInBytes = info.iStride;
+    aParams.iCommonParams.iXSize = info.iSize.iWidth;
+    aParams.iCommonParams.iYSize = info.iSize.iHeight;
+    aParams.iCommonParams.iUseAttribList = KSurfaceParams[iParamIndex].iUseAttribList;
+    for(TInt i = 0; i < KNumAttribs; i++)
+        {
+        aParams.iCommonParams.iAttribs[i] = KSurfaceParams[iParamIndex].iAttribs[i];
+        }
+    }
+
+
+TInt CEglSurfaceBase::Notify(TNotification /*aWhen*/, TRequestStatus& /*aStatus*/, TUint32 /*aXTImes*/)
+    {
+    return KErrNotSupported;
+    }
+
+TInt CEglSurfaceBase::WaitFor(TNotification /*aWhen*/, TRequestStatus& /*aStatus*/,
+        TInt /*aTimeoutinMicroseconds*/, TUint32 & /*aTimeStamp*/)
+    {
+    return KErrNotSupported;
+    }
+
+void CEglSurfaceBase::BaseCreateL(TInt aIndex, EGLint aSurfaceType)
+    {
+    iParamIndex = aIndex;
+    iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    
+    EGLint err;
+    if (iDisplay == EGL_NO_DISPLAY)
+        {
+        err = eglGetError();
+        RDebug::Printf("%s:%d: err = 0x%x", __FILE__, __LINE__, err);
+        User::Leave(KErrNotSupported);
+        }
+    
+    EGLint nConfigs = 0;
+    
+    // TODO: Need to use differnet config attribs based on aIndex.
+    EGLint configAttribs[] =
+    {
+        EGL_BUFFER_SIZE,    32,
+        EGL_RED_SIZE,       8,
+        EGL_GREEN_SIZE,     8,
+        EGL_BLUE_SIZE,      8,
+        EGL_ALPHA_SIZE,     8,
+        EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
+        EGL_RENDERABLE_TYPE,EGL_OPENVG_BIT,
+        EGL_NONE
+    };
+    
+    // Update surfacetype type to match 
+    for(TInt i = 0; configAttribs[i] != EGL_NONE; i += 2)
+        {
+        if (configAttribs[i] == EGL_SURFACE_TYPE)
+            {
+            configAttribs[i+1] = aSurfaceType;
+            }
+        }
+    // Need some way to configure the attribs ...
+    eglChooseConfig(iDisplay, configAttribs, &iConfig, 1, &nConfigs);
+    if (!nConfigs)
+        {
+        err = eglGetError();
+        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
+        User::Leave(KErrNotSupported);
+        }
+    
+    if (!eglBindAPI(EGL_OPENVG_API))
+        {
+        err = eglGetError();
+        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
+        User::Leave(KErrNotSupported);
+        }
+    iContext = eglCreateContext(iDisplay, iConfig, 0, NULL);
+    if (iContext == EGL_NO_CONTEXT)
+        {
+        err = eglGetError();
+        //RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
+        User::Leave(KErrNotSupported);
+        }
+    }
+
+void CEglSurfaceBase::Destroy()
+    {
+    eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+    if (iSurface != EGL_NO_SURFACE)
+        {
+        eglDestroySurface(iDisplay, iSurface);
+        iSurface = EGL_NO_SURFACE;
+        }
+
+    if (iDisplay != EGL_NO_DISPLAY)
+        {
+        eglDestroyContext(iDisplay, iContext);
+        }
+    }
+
+
 class CWindow: public CBase
     {
 public:
-    static CWindow *NewL(TInt aIndex);
+    static CWindow *NewL(TInt aIndex, const TPoint &aOffset, TInt aSizeIndex);
     RWindow& Window();
     ~CWindow();
 private:
-    void ConstructL(TInt aIndex);
+    void ConstructL(TInt aIndex, const TPoint &aOffset, TInt aSizeIndex);
     CWindow();
 
 private:
@@ -454,17 +862,17 @@
     };
 
 
-CWindow* CWindow::NewL(TInt aIndex)
+CWindow* CWindow::NewL(TInt aIndex, const TPoint &aOffset, TInt aSizeIndex)
     {
     CWindow *self = new (ELeave) CWindow;
     CleanupStack::PushL(self);
-    self->ConstructL(aIndex);
+    self->ConstructL(aIndex, aOffset, aSizeIndex);
     CleanupStack::Pop(self);
     return self;
     }
 
 
-void CWindow::ConstructL(TInt aIndex)
+void CWindow::ConstructL(TInt aIndex, const TPoint &aOffset, TInt aSizeIndex)
     {
     RFbsSession::Connect();
     if (aIndex >= KSurfaceMaxIndex)
@@ -476,8 +884,17 @@
     User::LeaveIfError(iWindowGroup.Construct((TUint32)this));
     iWindow = RWindow(iWsSession);
     User::LeaveIfError(iWindow.Construct(iWindowGroup, -1U));
-    const TSurfaceParamsCommon& winAttrib = KSurfaceParams[aIndex];
-    iWindow.SetExtent(TPoint(winAttrib.iXPos, winAttrib.iYPos), TSize(winAttrib.iXSize, winAttrib.iYSize));
+    TSurfaceParamsCommon winAttrib = KSurfaceParams[aIndex];
+    TSize winSize;
+    if (winAttrib.iXSize & LARGEST_POSSIBLE_FLAG)
+        {
+        winSize = TSize(KSurfaceSizes[aSizeIndex].iWidth, KSurfaceSizes[aSizeIndex].iHeight);
+        }
+    else
+        {
+        winSize = TSize(winAttrib.iXSize, winAttrib.iYSize);
+        }
+    iWindow.SetExtent(TPoint(winAttrib.iXPos + aOffset.iX, winAttrib.iYPos + aOffset.iY), winSize);
     iWindow.SetRequiredDisplayMode(winAttrib.iDisplayMode);
     iWindow.Activate();
     }
@@ -523,110 +940,32 @@
     }
 
 
-void CEglWindowSurface::CreateL(TInt aIndex)
-    {
-    SURF_ASSERT(aIndex < KSurfaceMaxIndex);
-    SURF_ASSERT(aIndex == KSurfaceParams[aIndex].iIndex);
-    iParamIndex = aIndex;
-    iWindow = CWindow::NewL(aIndex);
-    iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-    EGLint err;
-    if (iDisplay == EGL_NO_DISPLAY)
-        {
-        err = eglGetError();
-        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
-        User::Leave(KErrNotSupported);
-        }
-
-    EGLConfig config;
-    EGLint nConfigs = 0;
-
-    // TODO: Need to use differnet config attribs based on aIndex.
-    static const EGLint KConfigAttribs[] =
+void CEglWindowSurface::DoCreateL(TInt aIndex, const TPoint &aOffset, TInt aSizeIndex)
     {
-        EGL_BUFFER_SIZE,    32,
-        EGL_RED_SIZE,       8,
-        EGL_GREEN_SIZE,     8,
-        EGL_BLUE_SIZE,      8,
-        EGL_ALPHA_SIZE,     8,
-        EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
-        EGL_RENDERABLE_TYPE,EGL_OPENVG_BIT,
-        EGL_NONE
-    };
-
-    // Need some way to configure the attribs ...
-    eglChooseConfig(iDisplay, KConfigAttribs, &config, 1, &nConfigs);
-    if (!nConfigs)
-        {
-        err = eglGetError();
-        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
-        User::Leave(KErrNotSupported);
-        }
-
-    if (!eglBindAPI(EGL_OPENVG_API))
-        {
-        err = eglGetError();
-        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
-        User::Leave(KErrNotSupported);
-        }
-    iContext = eglCreateContext(iDisplay, config, 0, NULL);
-    if (iContext == EGL_NO_CONTEXT)
-        {
-        err = eglGetError();
-        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
-        User::Leave(KErrNotSupported);
-        }
-
-    iSurface = eglCreateWindowSurface(iDisplay, config, &iWindow->Window(), NULL);
+    iParamIndex = aIndex;
+    iWindow = CWindow::NewL(aIndex, aOffset, aSizeIndex);
+    iActualSize = iWindow->Window().Size();
+    
+    CEglSurfaceBase::BaseCreateL(aIndex, EGL_WINDOW_BIT);
+    
+    iSurface = eglCreateWindowSurface(iDisplay, iConfig, &iWindow->Window(), NULL);
     if (iSurface == EGL_NO_SURFACE)
         {
-        err = eglGetError();
-        RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, err);
+        EGLint err = eglGetError();
+        RDebug::Printf("%s:%d: err = %x (%d x %d)", __FILE__, __LINE__, err, iActualSize.iWidth, iActualSize.iHeight);
         User::Leave(KErrNotSupported);
         }
     }
 
-void CEglWindowSurface::SubmitContentL(TBool aShouldWaitForDisplay, TInt /* aRectsIndex */)
-    {
-    ActivateL();
-    if (!eglSwapBuffers(iDisplay, iSurface))
-        {
-        User::Leave(KErrBadHandle);
-        }
-    if (aShouldWaitForDisplay)
-        {
-        // We are cheating: We just wait for a bit to ensure that the swapbuffer is actually finished.
-        // There is no way to determine how long this takes, so we just grab a number that should be
-        // large enough...
-        User::After(100 * 1000);  // Wait 100ms.
-        }
-    }
-
-void CEglWindowSurface::ActivateL()
-    {
-    if (!eglMakeCurrent(iDisplay, iSurface, iSurface, iContext))
-        {
-        User::Leave(KErrBadHandle);
-        }
-    }
 
 CEglWindowSurface::~CEglWindowSurface()
     {
-    eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-    if (iSurface != EGL_NO_SURFACE)
-        {
-        eglDestroySurface(iDisplay, iSurface);
-        iSurface = EGL_NO_SURFACE;
-        }
-
-    if (iDisplay != EGL_NO_DISPLAY)
-        {
-        eglDestroyContext(iDisplay, iContext);
-        }
-
+    Destroy();
+	eglReleaseThread();
     delete iWindow;
     }
 
+
 TSurfaceId CEglWindowSurface::SurfaceId() const
     {
     // Default constructor for id sets it to a NULL-value, so if no window is created, we get
@@ -642,72 +981,104 @@
     }
 
 
-void CEglWindowSurface::DrawContentL(const TRgb& aColour)
-    {
-    ActivateL();
-
-    TSize size;
-    eglQuerySurface(iDisplay, iSurface, EGL_WIDTH, &size.iWidth);
-    eglQuerySurface(iDisplay, iSurface, EGL_HEIGHT, &size.iHeight);
-
-    VGfloat fillColour[4];
-    fillColour[0] = (VGfloat)aColour.Red() / 255.0f;
-    fillColour[1] = (VGfloat)aColour.Green() / 255.0f;
-    fillColour[2] = (VGfloat)aColour.Blue() / 255.0f;
-    fillColour[3] = (VGfloat)aColour.Alpha() / 255.0f;
-
-    vgSetfv(VG_CLEAR_COLOR, 4, fillColour);
-    vgClear(0, 0, size.iWidth, size.iHeight);
-    }
-
-
-void CEglWindowSurface::DrawContentL(TInt aIndex)
-    {
-    ActivateL();
-    CTestVgImage *vgImage = CTestVgImage::NewL(aIndex);
-    CleanupStack::PushL(vgImage);
-    vgDrawImage(vgImage->VGImage());
-    CleanupStack::PopAndDestroy(vgImage);
-    }
-
-void CEglWindowSurface::GetSurfaceParamsL(TSurfaceParamsRemote &aParams)
-    {
-    RSurfaceManager surfaceManager;
-    User::LeaveIfError(surfaceManager.Open());
-    RSurfaceManager::TInfoBuf infoBuf;
-    TInt err = surfaceManager.SurfaceInfo(SurfaceId(), infoBuf);
-    User::LeaveIfError(err);
-    surfaceManager.Close();
-    RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
-    aParams.iSurfaceId = SurfaceId();
-    aParams.iCommonParams.iAlignment = -1;  // N/A
-    aParams.iCommonParams.iBuffers = info.iBuffers;
-    aParams.iCommonParams.iOffsetToFirstBuffer = -1;
-    aParams.iCommonParams.iPixelFormat = info.iPixelFormat;
-    aParams.iCommonParams.iStrideInBytes = info.iStride;
-    aParams.iCommonParams.iXSize = info.iSize.iWidth;
-    aParams.iCommonParams.iYSize = info.iSize.iHeight;
-    aParams.iCommonParams.iUseAttribList = KSurfaceParams[iParamIndex].iUseAttribList;
-    for(TInt i = 0; i < KNumAttribs; i++)
-        {
-        aParams.iCommonParams.iAttribs[i] = KSurfaceParams[iParamIndex].iAttribs[i];
-        }
-    }
-
 const TText *CEglWindowSurface::GetSurfaceTypeStr() const
     {
     return _S("CEglWindowSurface");
     }
 
-TInt CEglWindowSurface::Notify(TNotification /*aWhen*/, TRequestStatus& /*aStatus*/, TUint32 /*aXTImes*/)
+
+CEglPBufferSurface::CEglPBufferSurface()
+    {
+    }
+
+
+CEglPBufferSurface::~CEglPBufferSurface()
+    {
+    Destroy();
+	eglReleaseThread();
+    }
+    
+
+CEglPBufferSurface* CEglPBufferSurface::NewL()
     {
-    return KErrNotSupported;
+    CEglPBufferSurface* self = new (ELeave) CEglPBufferSurface;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+void CEglPBufferSurface::ConstructL()
+    {
+    }
+    
+
+const TText *CEglPBufferSurface::GetSurfaceTypeStr() const
+    {
+    return _S("CEglPBufferSurface");
     }
 
-TInt CEglWindowSurface::WaitFor(TNotification /*aWhen*/, TRequestStatus& /*aStatus*/,
-        TInt /*aTimeoutinMicroseconds*/, TUint32 & /*aTimeStamp*/)
+
+void CEglPBufferSurface::DoCreateL(TInt aIndex, const TPoint &/*aOffset*/, TInt aSizeIndex)
     {
-    return KErrNotSupported;
+    CEglSurfaceBase::BaseCreateL(aIndex, EGL_PBUFFER_BIT);
+
+    EGLint attribs[] = 
+            {
+                EGL_WIDTH, 0,
+                EGL_HEIGHT, 0,
+                EGL_NONE,
+            };
+    if (KSurfaceParams[aIndex].iXSize & ELargestPossibleSurface)
+        {
+        iActualSize.iWidth = KSurfaceSizes[aSizeIndex].iWidth;
+        iActualSize.iHeight = KSurfaceSizes[aSizeIndex].iHeight;
+        }
+    else
+        {
+        iActualSize.iWidth = KSurfaceParams[aIndex].iXSize;
+        iActualSize.iHeight = KSurfaceParams[aIndex].iYSize;
+        }
+    for(TInt i = 0; attribs[i] != EGL_NONE; i += 2)
+        {
+        switch(attribs[i])
+            {
+            case EGL_HEIGHT:
+                attribs[i+1] = iActualSize.iHeight;
+                break;
+            case EGL_WIDTH:
+                attribs[i+1] = iActualSize.iWidth;
+                break;
+            }
+        }
+    
+    iSurface = eglCreatePbufferSurface(iDisplay, iConfig, attribs);
+    if (iSurface == EGL_NO_SURFACE)
+        {
+        EGLint err = eglGetError();
+        User::Leave(KErrNotSupported);
+        }
+    }
+
+
+TSurfaceId CEglPBufferSurface::SurfaceId() const
+    {
+    SURF_ASSERT(0);  // We shouldn't call this!
+    return TSurfaceId::CreateNullId();
+    }
+
+TInt CEglPBufferSurface::SizeInBytes() const
+    {
+    // size of a pixel in bits. 
+    EGLint size;
+    if (!eglGetConfigAttrib(iDisplay, iConfig, EGL_BUFFER_SIZE, &size))
+        {
+        RDebug::Printf("Unable to get EGL_BUFFER_SIZE from config %d, err = %04x", iConfig, eglGetError());
+        return 0;
+        }
+    
+    return (KSurfaceParams[iParamIndex].iXSize * KSurfaceParams[iParamIndex].iYSize * size) / 8;
     }
 
 
@@ -718,13 +1089,18 @@
         {
         case ESurfTypeRaw:
             return CRawSurface::NewL();
+            
         case ESurfTypeEglWindow:
             return CEglWindowSurface::NewL();
+            
         case ESurfTypeRawSingleBuffered:
             return CRawSingleBufferSurface::NewL();
+            
+        case ESurfTypePBuffer:
+            return CEglPBufferSurface::NewL();
+            
         default:
             SURF_ASSERT(0);
             return NULL;
         }
     }
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_threadedstress_local.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#include "egltest_threadedstress.h"
+
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0594
+
+@SYMTestPriority 2
+
+@SYMPREQ 2670
+
+@SYMREQ
+
+@SYMTestCaseDesc
+To ensure thread safety of endpoint implementation
+
+@SYMTestActions
+Create 4 set of threads with each performing following steps:
+1.  Repeat the following steps (2-16) for 60 seconds
+2.  Create surface
+3.  Random Delay 
+4.  Create endpoint. 
+5.  Random Delay
+6.  Draw content to surface
+7.  Random Delay 
+8.  Submit Update
+9.  Random Delay 
+10. Acquire image
+11. Random Delay
+12. Compare image with expected value (??)
+13. Release image
+14. Random Delay 
+15. Destroy endpoint
+16. Destroy Surface
+
+@SYMTestExpectedResults
+The test runs to completion.
+*/
+
+
+CEglTest_LocalTestStep_EndpointCrazyThreading::CEglTest_LocalTestStep_EndpointCrazyThreading() :
+    CLocalTestStepBase(ETestUidEndpointThreadStress)
+    {
+    }
+
+
+CEglTest_LocalTestStep_EndpointCrazyThreading::~CEglTest_LocalTestStep_EndpointCrazyThreading()
+    {
+    }
+
+
+void CEglTest_LocalTestStep_EndpointCrazyThreading::DoPreambleL()
+    {
+    //Register the test id.
+    _LIT(KTestId, "594");
+    RegisterTestIdsL(KTestId);
+    SetCurrentTestIds(KTestId);
+    }
+
+
+void CEglTest_LocalTestStep_EndpointCrazyThreading::DoPostambleL()
+    {
+    }
+
+
+TVerdict CEglTest_LocalTestStep_EndpointCrazyThreading::doTestStepL()
+    {
+    StartRemoteTestStep(TRemoteTestParams());
+    RunRemoteTestCase(0, TRemoteTestParams());
+    EndRemoteTestStep(TRemoteTestParams());
+    return TestStepResult();
+    }
+
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0601
+
+@SYMTestPriority 2
+
+@SYMPREQ 2670
+
+@SYMREQ
+
+@SYMTestCaseDesc
+To ensure endpoint operations can succeed in low memory condition.
+
+@SYMTestActions
+Use Method B.
+1.  Thread 1: 
+1.1.    Create a heap that can expand to maximum available system memory size
+1.2.    Allocate random sizes of memory on that system heap until failure occurs, recording and counting as N.
+1.3.    Delay
+1.4.     De-allocate last N/4 allocations. 
+1.5.     Delay
+1.6.     Go to 1.2
+2.  Thread 2: 
+2.1.    Create surface 100x100
+2.2.    Draw content to surface
+2.3.    Submit Update
+2.4.    Create endpoint. 
+2.5.    Acquire image
+2.6.    Verify image content with pixel sample
+2.7.    Release image
+2.8.    Destroy endpoint
+2.9.    Destroy Surface
+3.  Repeat Step 2 1000 times.   After every 200 iterations check memory usage as described in 7.3.1.
+4.  Destroy thread 2 and 1.
+
+@SYMTestExpectedResults
+The test runs to completion.
+*/
+
+
+CEglTest_LocalTestStep_EndpointOutOfHeapMemory::CEglTest_LocalTestStep_EndpointOutOfHeapMemory() :
+    CLocalTestStepBase(ETestUidEndpointThreadStress)
+    {
+    }
+
+
+CEglTest_LocalTestStep_EndpointOutOfHeapMemory::~CEglTest_LocalTestStep_EndpointOutOfHeapMemory()
+    {
+    }
+
+
+void CEglTest_LocalTestStep_EndpointOutOfHeapMemory::DoPreambleL()
+    {
+    //Register the test id.
+    _LIT(KTestId, "601, 625");
+    RegisterTestIdsL(KTestId);
+    SetCurrentTestIds(KTestId);
+    }
+
+
+void CEglTest_LocalTestStep_EndpointOutOfHeapMemory::DoPostambleL()
+    {
+    }
+
+
+TVerdict CEglTest_LocalTestStep_EndpointOutOfHeapMemory::doTestStepL()
+    {
+    TRemoteTestParams params;
+    StartRemoteTestStep(TRemoteTestParams());
+    
+    INFO_PRINTF1(_L("Performing out of heap memory test with 1 exercise thread..."));
+    params.iEndpointThreadStress.iNumThreads = 1;
+    TVerdict ret = RunRemoteTestCase(1, params);
+    if(ret == EPass)
+        {
+        INFO_PRINTF1(_L("...done."));
+        }
+    else
+        {
+        ERR_PRINTF1(_L("...Failed, skipping rest of test step."));
+        return ret;
+        }
+    
+    INFO_PRINTF1(_L("Performing out of heap memory test with 10 exercise threads..."));
+        params.iEndpointThreadStress.iNumThreads = 10;
+        ret = RunRemoteTestCase(1, params);
+        if(ret == EPass)
+            {
+            INFO_PRINTF1(_L("...done."));
+            }
+        else
+            {
+            ERR_PRINTF1(_L("...Failed, skipping rest of test step."));
+            return ret;
+            }
+        
+    EndRemoteTestStep(TRemoteTestParams());
+    return TestStepResult();
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_threadedstress_remote.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,883 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#include "egltest_threadedstress.h"
+#include "eglendpointwrap.h"
+#include "egltest_endpoint_images.h"
+#include "egltest_threadmonitor.h"
+#include <e32atomics.h>
+#include "egltest_endpoint_images.h"
+#include <e32math.h>
+
+
+//Private Helper Class Declarations-----------------------------------------------
+
+class CTightLoopThread : public CBase, public MLog
+    {
+public:
+    ~CTightLoopThread();
+    
+    //Control the loop from the controlling thread. 
+    //Calling Start() more than once causes panic.
+    void Start();
+    TRemoteTestVerdict Stop();
+    TThreadId ThreadId() const;
+    
+protected:
+    CTightLoopThread();
+    void ConstructL(TBool aSharedHeap);
+    MLog& Logger() const;
+    void Log(const TText8* aFile, TInt aLine, TInt aSeverity, TRefByValue<const TDesC> aFmt, ...);
+    
+    //To be implemented by derived class.
+    virtual void SetupInThreadContextL() = 0;
+    virtual void TeardownInThreadContextL() = 0;
+    virtual TBool ExecuteInnerLoopBody() = 0;
+    
+private:
+    static TInt ThreadEntryPoint(TAny* aSelf);
+    void EnterThreadLoopL();
+
+private:
+    RThread iThread;
+    TRequestStatus iNotifyStart;
+    volatile TBool iNotifyStop;
+    TBool iHasBeenStarted;
+    TBool iHasBeenStopped;
+    };
+
+
+class CEndpointExercise : public CTightLoopThread
+    {
+public:
+    static CEndpointExercise* NewL(TBool aSharedHeap);
+    ~CEndpointExercise();
+    
+    void SetupInThreadContextL();
+    void TeardownInThreadContextL();
+    TBool ExecuteInnerLoopBody();
+    
+private:
+    CEndpointExercise();
+    void ConstructL(TBool aSharedHeap);
+    void ExecuteInnerLoopBodyL();
+    TInt CheckImage(EGLImageKHR aEglImage);
+    
+    //Logging helpers.
+    void PanicIfError(TInt aError, const TText8* aFile, TInt aLine) const;
+    void PanicIfFalse(TBool aBool, const TText8* aFile, TInt aLine) const;
+    void LogAndLeaveIfErrorL(TInt aError, const TText8* aFile, TInt aLine) const;
+    void LogAndLeaveIfFalseL(TBool aBool, const TText8* aFile, TInt aLine) const;
+    #define PANIC_IF_ERROR(ERROR)           PanicIfError((ERROR), (TText8*)__FILE__, __LINE__)
+    #define PANIC_IF_FALSE(BOOL)            PanicIfFalse((BOOL), (TText8*)__FILE__, __LINE__)
+    #define LOG_AND_LEAVE_IF_ERROR_L(ERROR) LogAndLeaveIfErrorL((ERROR), (TText8*)__FILE__, __LINE__)
+    #define LOG_AND_LEAVE_IF_FALSE_L(BOOL)  LogAndLeaveIfFalseL((BOOL), (TText8*)__FILE__, __LINE__)
+
+private:
+    TInt iIteration;
+    TInt iCurrentColour;
+    RSurfaceManager iSurfaceManager;
+    RSurfaceUpdateSession iSurfaceUpdate;
+    RSurfaceManager::TSurfaceCreationAttributesBuf iSurfaceAttribs;
+    EGLDisplay iDisplay;
+    TEglEndpointWrap iEglEp;
+    CEglWindowSurface* iDummyWindowSurface;
+    };
+
+//--------------------------------------------------------------------------------
+
+
+//Cleanup Items used through out tests--------------------------------------------
+
+struct TCleanupSurface
+    {
+    RSurfaceManager* iSurfaceManager;
+    TSurfaceId iSurfaceId;
+    };
+static void CleanupSurface(TAny* aCleanupSurface)
+    {
+    TCleanupSurface* surface = static_cast<TCleanupSurface*>(aCleanupSurface);
+    TInt err = surface->iSurfaceManager->CloseSurface(surface->iSurfaceId);
+    ASSERT(err == KErrNone);
+    }
+
+
+struct TCleanupEndpoint
+    {
+    EGLDisplay iDisplay;
+    EGLEndpointNOK iEndpoint;
+    };
+static void CleanupEndpoint(TAny* aCleanupEndpoint)
+    {
+    TCleanupEndpoint* endpoint = static_cast<TCleanupEndpoint*>(aCleanupEndpoint);
+    TEglEndpointWrap ep;
+    ASSERT(ep.Error() == KErrNone);
+    EGLBoolean err = ep.DestroyEndpoint(endpoint->iDisplay, endpoint->iEndpoint);
+    ASSERT(err);
+    }
+
+
+struct TCleanupImage
+    {
+    EGLDisplay iDisplay;
+    EGLEndpointNOK iEndpoint;
+    EGLImageKHR iImage;
+    };
+static void CleanupImage(TAny* aCleanupImage)
+    {
+    TCleanupImage* image = static_cast<TCleanupImage*>(aCleanupImage);
+    TEglEndpointWrap ep;
+    ASSERT(ep.Error() == KErrNone);
+    EGLBoolean err = ep.ReleaseImage(image->iDisplay, image->iEndpoint, image->iImage, EGL_NONE);
+    ASSERT(err);
+    }
+
+
+static void CleanupPointerArray(TAny* aPointerArray)
+    {
+    RPointerArray<CEndpointExercise>* array = static_cast<RPointerArray<CEndpointExercise>*>(aPointerArray);
+    array->ResetAndDestroy();
+    }
+
+//--------------------------------------------------------------------------------
+
+
+//Utility Functions---------------------------------------------------------------
+
+inline TInt RandomNumberInRange(TInt aMin, TInt aMax)
+    {
+    if(aMin > aMax)
+        {
+        TInt temp = aMin;
+        aMin = aMax;
+        aMax = temp;
+        }
+    
+    //Scale and offset to put random into the range inclusively.
+    TUint range = aMax - aMin;
+    TUint random  = Math::Random() % (range + 1);
+    return (TInt)random + aMin;
+    }
+
+
+inline TReal Square(TReal aNumber)
+    {
+    return aNumber * aNumber;
+    }
+
+
+static TBool SamplesAreIncreasing(TInt* aSampledData, TInt aNumSamples)
+    {
+    //Naive linear least squares to get gradient of fit line and correlation coefficient.
+    //Using TReal to avoid worrying about wrap.
+    
+    TReal n = aNumSamples;
+    TReal sumX = 0.0;
+    TReal sumXSq = 0.0;
+    TReal sumY = 0.0;
+    TReal sumYSq = 0.0;
+    TReal sumXTimesY = 0.0;
+    
+    for(TInt i=0; i < aNumSamples; i++)
+        {
+        TReal x = (TReal)(i + 1);
+        TReal y = (TReal)aSampledData[i];
+        sumX += x;
+        sumXSq += Square(x);
+        sumY += y;
+        sumYSq += Square(y);
+        sumXTimesY += x * y;
+        }
+    
+    TReal xBar = sumX / n;
+    TReal yBar = sumY / n;
+    
+    TReal gradient = (sumXTimesY - (n * xBar * yBar)) / (sumXSq - (n * Square(xBar)));
+    TReal correlation = Square(sumXTimesY - (n * xBar * yBar)) / ((sumXSq - (n * Square(xBar))) * (sumYSq - (n * Square(yBar))));
+    
+    //If the gradient is positive and the correlation coefficient is high, the samples are increasing.
+    return (correlation > 0.8) && (gradient > 0.0);
+    }
+
+//--------------------------------------------------------------------------------
+
+
+//CTightLoopThread----------------------------------------------------------------
+
+CTightLoopThread::CTightLoopThread() :
+    iNotifyStop(EFalse),
+    iHasBeenStarted(EFalse),
+    iHasBeenStopped(EFalse)
+    {
+    }
+
+
+void CTightLoopThread::ConstructL(TBool aSharedHeap)
+    {
+    //Stack and heap sizes.
+    static const TInt KStackSize =   0x2000;      //  8KB
+    static const TInt KHeapMinSize = 0x1000;      //  4KB
+    static const TInt KHeapMaxSize = 0x1000000;   // 16MB
+    
+    //The new thread either has its own heap or shares ours.
+    if(aSharedHeap)
+        {
+        User::LeaveIfError(iThread.Create(KNullDesC, ThreadEntryPoint, KStackSize, NULL, this, EOwnerThread));
+        }
+    else
+        {
+        User::LeaveIfError(iThread.Create(KNullDesC, ThreadEntryPoint, KStackSize, KHeapMinSize, KHeapMaxSize, this, EOwnerThread));
+        }
+    
+    //Resume and rendezvous.
+    iThread.Resume();
+    TRequestStatus rendezvous;
+    iThread.Rendezvous(rendezvous);
+    User::WaitForRequest(rendezvous);
+    User::LeaveIfError(rendezvous.Int());
+    }
+
+
+MLog& CTightLoopThread::Logger() const
+    {
+    return *const_cast<CTightLoopThread*>(this);
+    }
+
+
+class TOverflowTruncate : public TDesOverflow
+    {
+public:
+    virtual void Overflow(TDes& /*aDes*/)
+        {
+        //Do nothing - just let it truncate.
+        }
+    };
+
+
+void CTightLoopThread::Log(const TText8* aFile, TInt aLine, TInt aSeverity, TRefByValue<const TDesC> aFmt, ...)
+    {
+    TOverflowTruncate overflow;
+    VA_LIST list;
+    VA_START(list, aFmt);
+    TBuf<0x100> buf;
+    buf.AppendFormatList(aFmt, list, &overflow);
+    TPtrC8 file8(aFile);
+    TBuf<0x100> file16;
+    file16.Copy(file8);
+    //Lots of effort is required to pump this into the TEF log file, so for now we just print to debug.
+    RDebug::Print(_L("CTightLoopThread: %S:%d, Severity=%d, Message=\"%S\""), &file16, aLine, aSeverity, &buf);
+    }
+
+
+CTightLoopThread::~CTightLoopThread()
+    {
+    //Shutdown the thread according to the state it is in.
+    if(!iHasBeenStarted)
+        {
+        TRequestStatus* notifyStart = &iNotifyStart;
+        iThread.RequestComplete(notifyStart, KErrAbort);
+        }
+    if(iHasBeenStarted && !iHasBeenStopped)
+        {
+        Stop();
+        }
+    iThread.Close();
+    }
+
+
+void CTightLoopThread::Start()
+    {
+    ASSERT(!iHasBeenStarted);
+    TRequestStatus* notifyStart = &iNotifyStart;
+    iThread.RequestComplete(notifyStart, KErrNone);
+    iHasBeenStarted = ETrue;
+    }
+
+
+TRemoteTestVerdict CTightLoopThread::Stop()
+    {
+    ASSERT(iHasBeenStarted);
+    ASSERT(!iHasBeenStopped);
+    
+    TRequestStatus logon;
+    iThread.Logon(logon);
+    __e32_atomic_store_rel32(&iNotifyStop, ETrue);
+    User::WaitForRequest(logon);
+    
+    TExitType exitType = iThread.ExitType();
+    iThread.Close();
+    iHasBeenStopped = ETrue;
+    
+    switch(exitType)
+        {
+        case EExitKill:
+            //Terminated normally (since we never call kill).
+            return ERtvPass; 
+        
+        case EExitPanic:
+            //Thread panicked.
+            return ERtvPanic;
+            
+        default:
+            //Any other option should be impossible in our use case.
+            ASSERT(0);
+        }
+    return ERtvAbort;
+    }
+
+
+TThreadId CTightLoopThread::ThreadId() const
+    {
+    return iThread.Id();
+    }
+
+
+TInt CTightLoopThread::ThreadEntryPoint(TAny* aSelf)
+    {
+    CTightLoopThread* self = static_cast<CTightLoopThread*>(aSelf);
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    
+    TRAPD(err,
+        //Create active scheduler.
+        CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+        CleanupStack::PushL(scheduler);
+        CActiveScheduler::Install(scheduler);
+
+        //Setup the draw loop.
+        self->EnterThreadLoopL();
+
+        //Clean up.
+        CleanupStack::PopAndDestroy(scheduler);
+        );
+    
+    __ASSERT_ALWAYS(err == KErrNone, User::PanicUnexpectedLeave());
+    delete cleanup;
+    
+    return KErrNone;
+    }
+
+
+void CTightLoopThread::EnterThreadLoopL()
+    {
+    //Setup the derived class in this thread context.
+    TRAPD(err, SetupInThreadContextL());
+    
+    //Set the request to pending, rendezvous with parent and wait for start signal.
+    iNotifyStart = KRequestPending;
+    RThread().Rendezvous(err);
+    User::WaitForRequest(iNotifyStart);
+    
+    //Exit immediately if the KErrAbort signal was received.
+    TBool keepGoing = ETrue;
+    if(iNotifyStart == KErrAbort)
+        {
+        keepGoing = EFalse;
+        }
+    else
+        {
+        ASSERT(iNotifyStart == KErrNone);
+        }
+    
+    //Loop until we are told to stop.
+    while(!__e32_atomic_load_acq32(&iNotifyStop) && keepGoing)
+        {
+        keepGoing = ExecuteInnerLoopBody();
+        }
+    
+    //Teardown the derived class in this thread context.
+    TeardownInThreadContextL();
+    }
+
+//--------------------------------------------------------------------------------
+
+
+//CEndpointExercise---------------------------------------------------------------
+
+CEndpointExercise* CEndpointExercise::NewL(TBool aSharedHeap)
+    {
+    CEndpointExercise* self = new (ELeave) CEndpointExercise();
+    CleanupStack::PushL(self);
+    self->ConstructL(aSharedHeap);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+CEndpointExercise::CEndpointExercise()
+    {
+    }
+
+
+void CEndpointExercise::ConstructL(TBool aSharedHeap)
+    {
+    CTightLoopThread::ConstructL(aSharedHeap);
+    User::LeaveIfError(iEglEp.Error());
+    }
+
+
+CEndpointExercise::~CEndpointExercise()
+    {
+    }
+
+
+void CEndpointExercise::PanicIfError(TInt aError, const TText8* aFile, TInt aLine) const
+    {
+    if(aError != KErrNone)
+        {
+        Logger().Log(aFile, aLine, ESevrErr, _L("Panicking due to error %d"), aError);
+        User::Panic(_L("EPTHREADEDSTRESS"), aLine);
+        }
+    }
+
+
+void CEndpointExercise::PanicIfFalse(TBool aBool, const TText8* aFile, TInt aLine) const
+    {
+    if(!aBool)
+        {
+        Logger().Log(aFile, aLine, ESevrErr, _L("Panicking due to failing invariant test"));
+        User::Panic(_L("EPTHREADEDSTRESS"), aLine);
+        }
+    }
+
+
+void CEndpointExercise::LogAndLeaveIfErrorL(TInt aError, const TText8* aFile, TInt aLine) const
+    {
+    if(aError != KErrNone)
+        {
+        Logger().Log(aFile, aLine, ESevrWarn, _L("Abandoning iteration due to error %d"), aError);
+        User::Leave(aError);
+        }
+    }
+
+
+void CEndpointExercise::LogAndLeaveIfFalseL(TBool aBool, const TText8* aFile, TInt aLine) const
+    {
+    if(!aBool)
+        {
+        Logger().Log(aFile, aLine, ESevrWarn, _L("Abandoning iteration due to failing invariant test"));
+        User::Leave(KErrUnknown);
+        }
+    }
+
+
+TInt CEndpointExercise::CheckImage(EGLImageKHR aEglImage)
+    {
+    TRAPD
+        (err,
+        //Convert the image to a CTestVgEglImage
+        CTestVgEglImage* vgEglImage = CTestVgEglImage::NewL(aEglImage);
+        CleanupStack::PushL(vgEglImage);
+        
+        //Check the corners and center pixel are the same colour.
+        //Since this test is focussed on correct OOM behaviour, 
+        //we panic if the functionality is incorrect.
+        PANIC_IF_FALSE(vgEglImage->IsSolidColourL());
+        
+        CleanupStack::PopAndDestroy(vgEglImage);
+        );
+    return err;
+    }
+
+
+void CEndpointExercise::SetupInThreadContextL()
+    {
+    //Colour to fill surface with (this is incremented every frame).
+    iCurrentColour = 0x88CC44;
+    
+    //Connections to SUS and surface manager.
+    User::LeaveIfError(iSurfaceManager.Open());
+    User::LeaveIfError(iSurfaceUpdate.Connect(5));
+    
+    //Surface attribs to create surface with.
+    iSurfaceAttribs().iSize = TSize(100, 100);
+    iSurfaceAttribs().iBuffers = 2;
+    iSurfaceAttribs().iPixelFormat = EUidPixelFormatARGB_8888_PRE;
+    iSurfaceAttribs().iStride = 100 * 4;
+    iSurfaceAttribs().iOffsetToFirstBuffer = 0;
+    iSurfaceAttribs().iAlignment = 32;
+    iSurfaceAttribs().iContiguous = EFalse;
+    iSurfaceAttribs().iCacheAttrib = RSurfaceManager::ECached;
+    iSurfaceAttribs().iOffsetBetweenBuffers = 0;
+    iSurfaceAttribs().iSurfaceHints = NULL;
+    iSurfaceAttribs().iHintCount = 0;
+    iSurfaceAttribs().iMappable = ETrue;
+    
+    iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    
+    //Create an EglWindowSurface so we have a current context for vg operations.
+    iDummyWindowSurface = CEglWindowSurface::NewL();
+    iDummyWindowSurface->CreateL(EStandardSurface, TPoint(0, 0));
+    iDummyWindowSurface->ActivateL();
+    }
+
+
+void CEndpointExercise::TeardownInThreadContextL()
+    {
+    delete iDummyWindowSurface;
+    iSurfaceUpdate.Close();
+    iSurfaceManager.Close();
+    }
+
+
+TBool CEndpointExercise::ExecuteInnerLoopBody()
+    {
+    TRAPD(err, ExecuteInnerLoopBodyL());
+    if(err != KErrNone)
+        {
+        Logger().Log((TText8*)__FILE__, __LINE__, ESevrWarn, _L("Iteration %d did not run to completion, due to an acceptable error in low memory conditions"), iIteration);
+        }
+    iIteration++;
+    return ETrue;
+    }
+
+
+void CEndpointExercise::ExecuteInnerLoopBodyL()
+    {
+    //Create a surface.
+    TCleanupSurface surface = {&iSurfaceManager, TSurfaceId::CreateNullId()};
+    LOG_AND_LEAVE_IF_ERROR_L(iSurfaceManager.CreateSurface(iSurfaceAttribs, surface.iSurfaceId));
+    CleanupStack::PushL(TCleanupItem(CleanupSurface, &surface));
+    
+    //Map surface and get pointer to buffer 0.
+    RChunk surfaceChunk;
+    TInt offset;
+    PANIC_IF_ERROR(iSurfaceManager.MapSurface(surface.iSurfaceId, surfaceChunk));
+    CleanupClosePushL(surfaceChunk);
+    PANIC_IF_ERROR(iSurfaceManager.GetBufferOffset(surface.iSurfaceId, 0, offset));
+    TUint32* buffer = (TUint32*)(surfaceChunk.Base() + offset);
+    
+    //Fill surface with current colour. This could
+    //be much faster but its good enough for testing.
+    TUint32 fillColour = TRgb(iCurrentColour, 255)._Color16MAP();
+    for(TInt y=0; y < iSurfaceAttribs().iSize.iHeight; ++y)
+        {
+        for(TInt x=0; x < iSurfaceAttribs().iSize.iWidth; ++x)
+            {
+            buffer[x] = fillColour;
+            }
+        buffer += iSurfaceAttribs().iStride >> 2;
+        }
+    
+    //Create an endpoint for the surface.
+    TCleanupEndpoint endpoint = {iDisplay, EGL_NO_ENDPOINT_NOK};
+    endpoint.iEndpoint = iEglEp.CreateEndpoint(iDisplay, EGL_ENDPOINT_TYPE_CONSUMER_NOK, EGL_TSURFACEID_NOK, &surface.iSurfaceId, NULL);
+    LOG_AND_LEAVE_IF_FALSE_L(endpoint.iEndpoint != EGL_NO_ENDPOINT_NOK);
+    CleanupStack::PushL(TCleanupItem(CleanupEndpoint, &endpoint));
+    
+    //Submit buffer 0 to surface update server.
+    TRequestStatus displayed;
+    iSurfaceUpdate.NotifyWhenDisplayedXTimes(1, displayed);
+    LOG_AND_LEAVE_IF_ERROR_L(iSurfaceUpdate.SubmitUpdate(KAllScreens, surface.iSurfaceId, 0, NULL));
+    User::WaitForRequest(displayed);
+    
+    //Begin streaming. Should not fail since we have submitted a buffer since creating ep.
+    LOG_AND_LEAVE_IF_FALSE_L(iEglEp.EndpointBeginStreaming(iDisplay, endpoint.iEndpoint));
+    
+    //Acquire an image from the endpoint.
+    TCleanupImage image = {iDisplay, endpoint.iEndpoint, EGL_NO_IMAGE_KHR};
+    image.iImage = iEglEp.AcquireImage(iDisplay, endpoint.iEndpoint);
+    LOG_AND_LEAVE_IF_FALSE_L(image.iImage != EGL_NO_IMAGE_KHR);
+    CleanupStack::PushL(TCleanupItem(CleanupImage, &image));
+    
+    //Check that the image we acquired is coherrent.
+    LOG_AND_LEAVE_IF_ERROR_L(CheckImage(image.iImage));
+    
+    //Release image, destroy endpoint, close chunk and close surface.
+    CleanupStack::PopAndDestroy(4);
+    
+    //Modify the colour that we draw.
+    iCurrentColour += 16;
+    }
+
+//--------------------------------------------------------------------------------
+
+
+//Remote test step----------------------------------------------------------------
+
+CEglTest_RemoteTestStep_EndpointThreadStress::CEglTest_RemoteTestStep_EndpointThreadStress() :
+    CRemoteTestStepBase(ETestUidEndpointThreadStress)
+    {
+    }
+
+
+CEglTest_RemoteTestStep_EndpointThreadStress::~CEglTest_RemoteTestStep_EndpointThreadStress()
+    {
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointThreadStress::DoStartRemoteTestStepL(const TRemoteTestParams& /*aMessageIn*/)
+    {
+    REMOTE_INFO_PRINTF1(_L("Starting Remote Test Step."));
+    EglStartL();
+    return ERtvPass;
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointThreadStress::DoEndRemoteTestStepL(const TRemoteTestParams& /*aMessageIn*/)
+    {
+    REMOTE_INFO_PRINTF1(_L("Ending Remote Test Step."));
+    EglEndL();
+    return ERtvPass;
+    }
+
+
+TInt CEglTest_RemoteTestStep_EndpointThreadStress::Timeout() const
+    {
+    return 120 * 1000000; //2 min.
+    }
+
+
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointThreadStress::DoRunRemoteTestCaseL(TInt aTestCase, const TRemoteTestParams& aParams)
+    {
+    switch(aTestCase)
+        {
+        case 0:     return CrazyThreadingTestCaseL(aParams);
+        case 1:     return OutOfHeapMemoryTestCaseL(aParams);
+        default:    return ERtvAbort;
+        }
+    }
+
+
+//For a detailed description of this test case (GRAPHICS-EGL-594), see the local side cpp file.
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointThreadStress::CrazyThreadingTestCaseL(const TRemoteTestParams& /*aParams*/)
+    {
+    //Create the exercises. These run an endpoint exercise in a tight loop in a private thread.
+    CEndpointExercise* exercise1 = CEndpointExercise::NewL(EFalse);
+    CleanupStack::PushL(exercise1);
+    CEndpointExercise* exercise2 = CEndpointExercise::NewL(EFalse);
+    CleanupStack::PushL(exercise2);
+    
+    //Create a monitor to cleanup if any of the threads panic. The controller thread 
+    //must be at index zero in the array. This will even work if a deadlock occurs 
+    //between the  exercise threads, since the call to stop the exercise will never 
+    //return and the framework will eventually time us out. The monitor will notice
+    //that the controller thread has panicked and will forward the panic to the exercises.
+    RArray<TThreadId> threads;
+    CleanupClosePushL(threads);
+    threads.AppendL(RThread().Id());
+    threads.AppendL(exercise1->ThreadId());
+    threads.AppendL(exercise2->ThreadId());
+    CThreadMonitor* monitor = CThreadMonitor::NewL(threads);
+    CleanupStack::PushL(monitor);
+    
+    //Start the exercises.
+    exercise1->Start();
+    exercise2->Start();
+    
+    //Let the exercises run for 20 seconds.
+    User::After(20 * 1000000);
+    
+    //Stop the exercises and record the results.
+    TRemoteTestVerdict result1 = exercise1->Stop();
+    TRemoteTestVerdict result2 = exercise2->Stop();
+    
+    CleanupStack::PopAndDestroy(4, exercise1);
+    return (result1 != ERtvPass) ? result1 : result2;
+    }
+
+
+class THeapGobbler
+    {
+public:
+    static THeapGobbler* New(TInt aSize)
+        {
+        THeapGobbler* self = (THeapGobbler*)new TUint8[sizeof(THeapGobbler) - sizeof(TUint8) + aSize];
+        if(!self)
+            {
+            return NULL;
+            }
+        self->iSize = aSize;
+        self->iNext = NULL;
+        return self;
+        }
+    
+public:
+    THeapGobbler* iNext;
+    TInt iSize;
+    TUint8 iMemory[1];
+    };
+
+
+//For a detailed description of this test case (GRAPHICS-EGL-601), see the local side cpp file.
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointThreadStress::OutOfHeapMemoryTestCaseL(const TRemoteTestParams& aParams)
+    {
+    const TInt KHeapSizeMin = 0x100000;   //1MB.
+    const TInt KHeapSizeMax = 0x10000000; //256MB.
+
+    RHeap* testHeap = User::ChunkHeap(NULL, KHeapSizeMin, KHeapSizeMax, KMinHeapGrowBy, 4);
+    if(!testHeap)
+        {
+        REMOTE_ERR_PRINTF1(_L("Failed to create chunk heap. Aborting."));
+        return ERtvAbort;
+        }
+    RHeap* oldHeap = User::SwitchHeap(testHeap);
+    
+    CTrapCleanup *cleanUpStack = CTrapCleanup::New();
+    if (!cleanUpStack)
+        {
+        User::SwitchHeap(oldHeap);
+        testHeap->Close();
+        User::Leave(KErrNoMemory);
+        }
+
+    TRemoteTestVerdict verdict = ERtvPass;
+    TRAPD(err, verdict = DoOutOfHeapMemoryTestCaseL(aParams));
+    
+    delete cleanUpStack;
+    User::SwitchHeap(oldHeap);
+    testHeap->Close();
+    
+    User::LeaveIfError(err);
+    return verdict;
+    }
+
+ 
+TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointThreadStress::DoOutOfHeapMemoryTestCaseL(const TRemoteTestParams& aParams)
+    {
+    const TInt numExercises = aParams.iEndpointThreadStress.iNumThreads;
+    
+    const TInt KMinCellSize = 500;
+    const TInt KMaxCellSize = 2000;
+    const TInt KNumIterations = 20;
+    TInt heapAllocSize[KNumIterations];
+    TRemoteTestVerdict exerciseResult = ERtvPass;
+    
+    //One iteration of the outer loop results in one data point for deciding if the heap is leaking or not. 
+    for(TInt x=0; x < KNumIterations; x++)
+        {
+        //Reserving space in these arrays ahead of time to 
+        //make cleanup stack manipulation more staightforward.
+        RPointerArray<CEndpointExercise> exercises;
+        CleanupStack::PushL(TCleanupItem(CleanupPointerArray, &exercises));
+        exercises.ReserveL(numExercises);
+        RArray<TThreadId> threads;
+        CleanupClosePushL(threads);
+        threads.ReserveL(numExercises + 1);
+        
+        //Save the controller thread id for the monitor.
+        threads.Append(RThread().Id());
+        
+        //Create endpoint exercise threads and save the thread Ids for the monitor.
+        for(TInt j=0; j < numExercises; j++)
+            {
+            //Appends can't fail since we have already reserved space.
+            //Note that the exercises all share the same heap as this thread.
+            exercises.Append(CEndpointExercise::NewL(ETrue));
+            threads.Append(exercises[j]->ThreadId());
+            }
+
+        //Create a monitor to handle thread cleanup if something panics or deadlocks.
+        CThreadMonitor* monitor = CThreadMonitor::NewL(threads);
+        
+        //Nothing can leave after this.
+        CleanupStack::Pop(2);
+        
+        //Start the exercises.
+        for(TInt j=0; j < numExercises; j++)
+            {
+            exercises[j]->Start();
+            }
+        
+        THeapGobbler* firstCell = NULL;
+        THeapGobbler* lastCell = NULL;
+        TInt numberOfCells = 0;
+        
+        for(TInt i=0; i < 2; i++)
+            {
+            //Allocate random sizes until full.
+            THeapGobbler* newCell = THeapGobbler::New(RandomNumberInRange(KMinCellSize, KMaxCellSize));
+            while(newCell)
+                {
+                if(lastCell)
+                    lastCell->iNext = newCell;
+                if(!firstCell)
+                    firstCell = newCell;
+                lastCell = newCell;
+                numberOfCells++;
+                newCell = THeapGobbler::New(RandomNumberInRange(KMinCellSize, KMaxCellSize));
+                }
+            
+            //Let exercise run while heap is full.
+            User::After(1 * 1000);
+            
+            //Deallocate n/4 cells.
+            for(TInt n = numberOfCells / 4; n >= 1; --n)
+                {
+                THeapGobbler* oldCell = firstCell;
+                firstCell = oldCell->iNext;
+                delete oldCell;
+                numberOfCells--;
+                if(!firstCell)
+                    {
+                    lastCell = NULL;
+                    ASSERT(numberOfCells == 0);
+                    break;
+                    }
+                }
+            
+            //Let exercise run while heap is not full.
+            User::After(1 * 1000);
+            }
+        
+        //Deallocate all cells.
+        while(firstCell)
+            {
+            THeapGobbler* oldCell = firstCell;
+            firstCell = oldCell->iNext;
+            delete oldCell;
+            }
+        lastCell = NULL;
+        numberOfCells = 0;
+        
+        //Stop the exercises and save the result.
+        for(TInt j=0; j < numExercises; j++)
+            {
+            TRemoteTestVerdict ret = exercises[j]->Stop();
+            exerciseResult = (exerciseResult == ERtvPass) ? ret : exerciseResult;
+            }
+
+        delete monitor;
+        threads.Close();
+        exercises.ResetAndDestroy();
+        
+        if(exerciseResult != ERtvPass)
+            {
+            REMOTE_ERR_PRINTF2(_L("Aborting because the endpoint exercise failed for iteration %d"), x);
+            return exerciseResult;
+            }
+        
+        //Save the heap size.
+        User::Heap().AllocSize(heapAllocSize[x]);
+        }
+    
+    //Work out if any memory has leaked and return a verdict.
+    TBool memoryIsLeaking = SamplesAreIncreasing(heapAllocSize, KNumIterations);
+    if(memoryIsLeaking)
+        {
+        REMOTE_ERR_PRINTF1(_L("Heap memory is increasing over time with high certainty, there is probably a memory leak."));
+        }
+    else
+        {
+        REMOTE_INFO_PRINTF1(_L("No heap memory leak detected."));
+        }
+    return memoryIsLeaking ? ERtvFail : ERtvPass;
+    }
+
+//--------------------------------------------------------------------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/endpointtestsuite/automated/tsrc/egltest_threadmonitor.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,315 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#include <e32math.h>
+#include "egltest_threadmonitor.h"
+
+
+//CThreadMonitor creates a new monitor thread and instanciates a CThreadMonitorBackend object.
+//The thread monitor backend is constructed on the monitor thread's heap and only 
+//runs in that context. It creates a CThread instance for each thread that it needs
+//to monitor. The CThread instance reports back to the monitor backend when the
+//thread that it wraps has exitted. The backend is then responsible for deciding 
+//how to respond: If the exit type is a panic, it forwards that panic to all the 
+//other threads, then exits itself. Note: The controller thread MUST be at position
+//zero in the passed in array.
+class CThreadMonitorBackend : public CActive
+    {
+private:
+    class CThread : public CActive
+        {
+    public:
+        static CThread* NewL(const TThreadId& aThread, CThreadMonitorBackend& aMonitor);
+        ~CThread();
+        void Panic(TInt aExitReason, const TExitCategoryName& aExitCategory);
+        
+    private:
+        CThread(CThreadMonitorBackend& aMonitor);
+        void ConstructL(const TThreadId& aThread);
+        void RunL();
+        void DoCancel();
+    
+    private:
+        CThreadMonitorBackend& iMonitor;
+        RThread iThread;
+        };
+
+public:
+    static CThreadMonitorBackend* NewL(const RArray<TThreadId>& aThreadsToMonitor, TRequestStatus*& aNotifyCancel);
+    ~CThreadMonitorBackend();
+    void StartMonitoring();
+    void ThreadExitted(CThread* aThread, TExitType aExitType, TInt aExitReason, const TExitCategoryName& aExitCategory);
+    
+private:
+    CThreadMonitorBackend(TRequestStatus*& aNotifyCancel);
+    void ConstructL(const RArray<TThreadId>& aThreadsToMonitor);
+    TBool ThreadIsController(CThread* aThread) const;
+    void RunL();
+    void DoCancel();
+    
+private:
+    RPointerArray<CThread> iThreads;
+    };
+
+
+//CThreadMonitor---------------------------------------------------------------
+
+CThreadMonitor* CThreadMonitor::NewL(const RArray<TThreadId>& aThreadsToMonitor)
+    {
+    CThreadMonitor* self = new (ELeave) CThreadMonitor(aThreadsToMonitor);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+CThreadMonitor::~CThreadMonitor()
+    {
+    //Tell the backend to stop monitoring.
+    iMonitor.RequestComplete(iNotifyCancel, KErrNone);
+    iMonitor.Close();
+    }
+
+
+CThreadMonitor::CThreadMonitor(const RArray<TThreadId>& aThreadsToMonitor) :
+    iThreadsToMonitor(aThreadsToMonitor)
+    {
+    }
+
+
+void CThreadMonitor::ConstructL()
+    {
+    const TInt KStackSize = 12000;
+    const TInt KHeapMinSize = 16000;
+    const TInt KHeapMaxSize = 1000000;
+    
+    TUint32 random = Math::Random();
+    TName threadName;
+    _LIT(KThreadNameFormat, "%S-%u");
+    _LIT(KMonitorName, "EpThreadMonitor");
+    threadName.Format(KThreadNameFormat, &KMonitorName, random);
+    
+    User::LeaveIfError(iMonitor.Create(threadName, MonitorThreadEntry, KStackSize, KHeapMinSize, KHeapMaxSize, this, EOwnerThread));
+    TRequestStatus rendezvous;
+    iMonitor.Rendezvous(rendezvous);
+    iMonitor.Resume();
+    User::WaitForRequest(rendezvous);
+    User::LeaveIfError(rendezvous.Int());
+    ASSERT(iNotifyCancel);
+    }
+
+
+TInt CThreadMonitor::MonitorThreadEntry(TAny* aSelf)
+    {
+    CThreadMonitor* self = static_cast<CThreadMonitor*>(aSelf);
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    
+    TRAPD(err, MonitorThreadEntryL(self->iThreadsToMonitor, self->iNotifyCancel));
+    __ASSERT_ALWAYS(err == KErrNone, User::Invariant());
+
+    delete cleanup;
+    return KErrNone;
+    }
+
+
+void CThreadMonitor::MonitorThreadEntryL(const RArray<TThreadId>& aThreadsToMonitor, TRequestStatus*& aNotifyCancel)
+    {
+    //Create active scheduler.
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    //Create the monitor and start monitoring.
+    CThreadMonitorBackend* monitor = CThreadMonitorBackend::NewL(aThreadsToMonitor, aNotifyCancel);
+    RThread().Rendezvous(KErrNone);
+    monitor->StartMonitoring();
+    delete monitor;
+
+    //Clean up.
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//-----------------------------------------------------------------------------
+
+
+//CThreadMonitorBackend--------------------------------------------------------
+
+CThreadMonitorBackend* CThreadMonitorBackend::NewL(const RArray<TThreadId>& aThreadsToMonitor, TRequestStatus*& aNotifyCancel)
+    {
+    CThreadMonitorBackend* self = new (ELeave) CThreadMonitorBackend(aNotifyCancel);
+    CleanupStack::PushL(self);
+    self->ConstructL(aThreadsToMonitor);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+CThreadMonitorBackend::CThreadMonitorBackend(TRequestStatus*& aNotifyCancel) :
+    CActive(CActive::EPriorityStandard)
+    {
+    CActiveScheduler::Add(this);
+    iStatus = KRequestPending;
+    SetActive();
+    
+    //Pass the cancel TRequestStatus back to the controller thread.
+    aNotifyCancel = &iStatus;
+    }
+
+
+void CThreadMonitorBackend::ConstructL(const RArray<TThreadId>& aThreadsToMonitor)
+    {
+    //Reserve the space up front so we can gaurantee that the append will not fail.
+    //This way we don't need to use the cleanup stack to hold the new CThread while
+    //we attempt to append.
+    iThreads.ReserveL(aThreadsToMonitor.Count());
+    for(TInt i=0; i < aThreadsToMonitor.Count(); i++)
+        {
+        iThreads.Append(CThread::NewL(aThreadsToMonitor[i], *this));
+        }
+    }
+
+
+CThreadMonitorBackend::~CThreadMonitorBackend()
+    {
+    Cancel();
+    iThreads.ResetAndDestroy();
+    }
+
+
+void CThreadMonitorBackend::StartMonitoring()
+    {
+    CActiveScheduler::Start();
+    }
+
+
+void CThreadMonitorBackend::ThreadExitted(CThread* aThread, TExitType aExitType, TInt aExitReason, const TExitCategoryName& aExitCategory)
+    {
+    //If a worker thread exits normally, do nothing.
+    //If a worker thread panics, forward the panic to all other threads and stop active scheduler.
+    //If the controller thread exits normally, stop active scheduler.
+    //If the controller thread panics, forward the panic to all other threads and stop active scheduler.
+    
+    //Stop monitoring according to above.
+    if(ThreadIsController(aThread) || aExitType == EExitPanic)
+        {
+        CActiveScheduler::Stop();
+        }
+
+    //Forward panic according to above. Second condition is for when controller times out.
+    if(aExitType == EExitPanic || (ThreadIsController(aThread) && aExitType == EExitKill && aExitReason == KErrTimedOut))
+        {
+        for(TInt i=0; i < iThreads.Count(); i++)
+            {
+            iThreads[i]->Panic(aExitReason, aExitCategory);
+            }
+        }
+    }
+
+
+TBool CThreadMonitorBackend::ThreadIsController(CThread* aThread) const
+    {
+    //The controller thread must be at index zero in the passed in array.
+    //Due to way we construct, we gaurantee that it is also at index zero in iThread.
+    return (iThreads.Count() > 0) && (iThreads[0] == aThread);
+    }
+
+
+void CThreadMonitorBackend::RunL()
+    {
+    //The client has destructed the CThreadMonitor object, 
+    //so stop the active scheduler so we exit the thread.
+    CActiveScheduler::Stop();
+    }
+
+
+void CThreadMonitorBackend::DoCancel()
+    {
+    //Not ideal, but we should only get here if the thread that created 
+    //the original ConitorThread panics, so it should be safe.
+    TRequestStatus* status =&iStatus;
+    User::RequestComplete(status, KErrCancel);
+    }
+
+//-----------------------------------------------------------------------------
+
+
+//CThreadMonitorBackend::CThread-----------------------------------------------
+
+CThreadMonitorBackend::CThread* CThreadMonitorBackend::CThread::NewL(const TThreadId& aThread, CThreadMonitorBackend& aMonitor)
+    {
+    CThread* self = new (ELeave) CThread(aMonitor);
+    CleanupStack::PushL(self);
+    self->ConstructL(aThread);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+CThreadMonitorBackend::CThread::CThread(CThreadMonitorBackend& aMonitor) :
+    CActive(CActive::EPriorityStandard),
+    iMonitor(aMonitor)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+
+void CThreadMonitorBackend::CThread::ConstructL(const TThreadId& aThread)
+    {
+    User::LeaveIfError(iThread.Open(aThread, EOwnerThread));
+    iThread.Logon(iStatus);
+    SetActive();
+    }
+
+
+CThreadMonitorBackend::CThread::~CThread()
+    {
+    Cancel();
+    iThread.Close();
+    }
+
+
+void CThreadMonitorBackend::CThread::Panic(TInt aExitReason, const TExitCategoryName& aExitCategory)
+    {
+    iThread.Panic(aExitCategory, aExitReason);
+    }
+
+
+void CThreadMonitorBackend::CThread::RunL()
+    {
+    //Inform the monitor backend that the thread exitted.
+    TExitCategoryName category = iThread.ExitCategory();
+    TInt reason = iThread.ExitReason();
+    TExitType type = iThread.ExitType();
+    iMonitor.ThreadExitted(this, type, reason, category);
+    }
+
+
+void CThreadMonitorBackend::CThread::DoCancel()
+    {
+    iThread.LogonCancel(iStatus);
+    }
+
+//-----------------------------------------------------------------------------
--- a/egl/egltest/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -61,6 +61,7 @@
 ../scripts/egltest_t_oom_sgimage.script					z:/egltest/egltest_t_oom_sgimage.script
 ../scripts/egltest_t_stress_sgimage.script					z:/egltest/egltest_t_stress_sgimage.script
 ../scripts/egltest_t_benchmark_swapbuffers.script			z:/egltest/egltest_t_benchmark_swapbuffers.script
+../scripts/egltest_t_surfacescaling.script			        z:/egltest/egltest_t_surfacescaling.script
 
 //Include the endpoint test suite
 #include "../endpointtestsuite/group/bld.inf"
--- a/egl/egltest/group/egltest.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/group/egltest.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -48,6 +48,7 @@
 SOURCE                  egltest_stress_sgimage.cpp
 SOURCE                  egltest_stress_common_sgimage.cpp
 SOURCE                  egltest_benchmark_swapbuffers.cpp
+SOURCE                  egltest_surfacescaling.cpp
 
 
 SOURCEPATH             ../scripts
@@ -69,6 +70,7 @@
 DOCUMENT               egltest_t_oom_sgimage.script
 DOCUMENT               egltest_t_stress_sgimage.script
 DOCUMENT               egltest_t_benchmark_swapbuffers.script
+DOCUMENT               egltest_t_surfacescaling.script
 
 
 LIBRARY                 rfileloggerclient.lib
--- a/egl/egltest/group/egltest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/group/egltest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -48,5 +48,8 @@
 "\epoc32\data\z\egltest\egltest_t_image_multiprocess.script"-"c:\egltest\egltest_t_image_multiprocess.script"
 "\epoc32\data\z\egltest\egltest_t_image_negative.script"-"c:\egltest\egltest_t_image_negative.script"
 "\epoc32\data\z\egltest\egltest_t_benchmark_sgimage.script"-"c:\egltest\egltest_t_benchmark_sgimage.script"
-"\epoc32\data\z\egltest\egltest_t_benchmark_swapbuffers.script"-"c:\egltest\egltest_t_benchmark_swapbuffers.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\egltest\egltest_t_benchmark_swapbuffers.script"-"c:\egltest\egltest_t_benchmark_swapbuffers.script"
+"\epoc32\data\z\egltest\egltest_t_oom_sgimage.script"-"c:\egltest\egltest_t_oom_sgimage.script"
+;"\epoc32\data\z\egltest\egltest_t_stress_sgimage.script"-"c:\egltest\egltest_t_stress_sgimage.script"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/inc/egltest_surfacescaling.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,266 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+*/
+
+#ifndef EGLTEST_SURFACESCALING_H
+#define EGLTEST_SURFACESCALING_H
+
+#include "eglteststep.h"
+#include <test/egltestcommonsession.h>
+#include <test/graphicsscreencomparison.h>
+
+enum TEglTestScalingConfig
+	{ 
+	EWindowAttribs_NoScaling,
+	EWindowAttribsColor16MU_Scaling 
+	};
+
+static const EGLint KScalingConfigAttribs[2][17] =
+	{
+		{
+		//Window - Scaling not supported
+		EGL_BUFFER_SIZE,    	 0,
+		EGL_RED_SIZE,			 0,
+		EGL_GREEN_SIZE, 		 0,
+		EGL_BLUE_SIZE,			 0,
+		EGL_ALPHA_SIZE, 		 0,
+		EGL_RENDERABLE_TYPE,	 EGL_OPENVG_BIT,
+		EGL_SURFACE_TYPE,		 EGL_WINDOW_BIT,
+		EGL_SURFACE_SCALING_NOK, EGL_FALSE,
+		EGL_NONE
+		},
+		{
+		//EColor16MU - Window - Scaling supported
+		EGL_BUFFER_SIZE,    	 24,
+		EGL_RED_SIZE,			 8,
+		EGL_GREEN_SIZE, 		 8,
+		EGL_BLUE_SIZE,			 8,
+		EGL_ALPHA_SIZE,     	 0,
+		EGL_RENDERABLE_TYPE,	 EGL_OPENVG_BIT,
+		EGL_SURFACE_TYPE,		 EGL_WINDOW_BIT,
+		EGL_SURFACE_SCALING_NOK, EGL_TRUE,
+		EGL_NONE
+		},
+	};
+
+//base class for all surface scaling test cases
+//all common functionality should go here
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingBase) : public CEglTestStep
+    {
+public:
+    ~CEglTest_SurfaceScalingBase();
+
+protected:
+    // from CTestStep
+    TVerdict doTestStepPreambleL();
+    TVerdict doTestStepPostambleL();
+
+    // helper methods
+    void CheckBorderColorL(EGLint aExpectedRedChannelColor, EGLint aExpectedBlueChannelColor, EGLint aExpectedGreenChannelColor);
+    void CheckScalingAttributesL(EGLint aExpectedSurfaceWidth, EGLint aExpectedSurfaceHeight, EGLint aExpectedExtentWidth, EGLint aExpectedExtentHeight, EGLint aExpectedOffsetX, EGLint aExpectedOffsetY);
+    CFbsBitmap* CreateBitmapLC(const TSize& aSize, TInt aBorderTop, TInt aBorderBottom, TInt aBorderLeft, TInt aBorderRight, const TRgb& aBorderColor);
+    void WritePixelsToSurfaceL(const CFbsBitmap& aBitmap);
+    void CreateAndActivateWindowL(const TSize& aWindowSize);
+    void CloseWindow();
+
+protected:
+    CWsScreenDevice* iScreenDevice;
+    RWindow iWindow;
+    // surface scaling extension functions
+    TFPtrEglQuerySurfaceScalingCapabilityNok iPfnEglQuerySurfaceScalingCapabilityNOK;
+    TFPtrEglSetSurfaceScalingNok iPfnEglSetSurfaceScalingNOK;
+    // surface scaling attributes
+    TInt iWindowWidth;
+    TInt iWindowHeight;
+    TInt iSurfaceWidth;
+    TInt iSurfaceHeight;
+    TInt iExtentWidth;
+    TInt iExtentHeight;
+    TInt iOffsetX;
+    TInt iOffsetY;
+    TRgb iBorderColor;
+    // surface scaling related attributes for reference bitmap
+    TInt iBorderTop;
+    TInt iBorderBottom;
+    TInt iBorderLeft;
+    TInt iBorderRight;
+    // image comparison
+    CTGraphicsScreenComparison* iImageComparison;
+    // properties of the particular surface scaling implementation under testing
+    TBool iAllScalable;
+    TSize iScreenSize;
+    };
+
+
+// EGL Surface Scaling tests
+_LIT(KSurfaceScaling_Positive, "SurfaceScaling_Positive");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_Positive) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    TVerdict doTestPartialStepL();
+    };
+
+_LIT(KSurfaceScaling_WindowResize, "SurfaceScaling_WindowResize");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_WindowResize) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    TVerdict doTestPartialStepL();
+    };
+
+_LIT(KSurfaceScaling_ExtentPositionChange, "SurfaceScaling_ExtentPositionChange");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_ExtentPositionChange) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    TVerdict doTestPartialStepL(const CFbsBitmap& aRefBitmap);
+private:
+    TInt iRefBitmapOffset;
+    };
+
+_LIT(KSurfaceScaling_ExtentSizeChange, "SurfaceScaling_ExtentSizeChange");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_ExtentSizeChange) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    TVerdict doTestPartialStepL();
+    };
+
+_LIT(KSurfaceScaling_SwapBuffers, "SurfaceScaling_SwapBuffers");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_SwapBuffers) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    TVerdict doTestPartialStepL();
+    };
+
+_LIT(KSurfaceScaling_WindowSurface_Check, "SurfaceScaling_WindowSurface_Check");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_WindowSurface_Check) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScaling_Negative_CreateWindowSurface, "SurfaceScaling_Negative_CreateWindowSurface");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_Negative_CreateWindowSurface) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScaling_Negative_FixedSize_NonWindowSurface, "SurfaceScaling_Negative_FixedSize_NonWindowSurface");
+NONSHARABLE_CLASS(CEglTest_SurfaceScaling_Negative_FixedSize_NonWindowSurface) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingDefaultBorderColor, "SurfaceScalingDefaultBorderColor");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingDefaultBorderColor) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingModifyingBorderColor, "SurfaceScalingModifyingBorderColor");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingModifyingBorderColor) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingModifyingBorderColorNonFixed, "SurfaceScalingModifyingBorderColorNonFixed");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingModifyingBorderColorNonFixed) : public CEglTest_SurfaceScalingBase
+    {
+public:
+	TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingModifyingInvalidBorderColor, "SurfaceScalingModifyingInvalidBorderColor");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingModifyingInvalidBorderColor) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingModifyingExtent, "SurfaceScalingModifyingExtent");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingModifyingExtent) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingModifyingExtentNonFixed, "SurfaceScalingModifyingExtentNonFixed");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingModifyingExtentNonFixed) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingQuerySurface, "SurfaceScalingQuerySurface");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingQuerySurface) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingQuerySurfaceNonFixed, "SurfaceScalingQuerySurfaceNonFixed");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingQuerySurfaceNonFixed) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingCapability, "SurfaceScalingCapability");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingCapability) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingSet, "SurfaceScalingSet");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingSet) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingSetNonFixed, "SurfaceScalingSetNonFixed");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingSetNonFixed) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingSetInvalidAttributes, "SurfaceScalingSetInvalidAttributes");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingSetInvalidAttributes) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+_LIT(KSurfaceScalingNotInitialized, "SurfaceScalingNotInitialized");
+NONSHARABLE_CLASS(CEglTest_SurfaceScalingNotInitialized) : public CEglTest_SurfaceScalingBase
+    {
+public:
+    TVerdict doTestStepL();
+    };
+
+#endif // EGLTEST_SURFACESCALING_H
--- a/egl/egltest/inc/egltestcommonsession.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/inc/egltestcommonsession.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -46,6 +46,10 @@
 typedef EGLBoolean (*TFPtrEglGetSyncAttribKhr) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
 typedef EGLint (*TFPtrEglPrivateSignalSyncNok) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
 
+//pointer to function for surface scaling
+typedef EGLBoolean (*TFPtrEglQuerySurfaceScalingCapabilityNok) (EGLDisplay dpy, EGLConfig config, EGLint surface_width, EGLint surface_height, EGLint target_width, EGLint target_height, EGLint *value);
+typedef EGLBoolean (*TFPtrEglSetSurfaceScalingNok) (EGLDisplay dpy, EGLSurface surface, EGLint target_offset_x, EGLint target_offset_y, EGLint target_width, EGLint target_height);
+
 const TUint KImagesArrayGranularity = 4;
 
 // forward declarations
@@ -104,7 +108,7 @@
 	//
 	//Compound functions that construct surface 
 	//
-	IMPORT_C void CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, TBool aVgAlphaFormatPre = EFalse, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1);	
+	IMPORT_C void CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, TBool aVgAlphaFormatPre = EFalse, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1, EGLint* aAttribList = NULL);	
 	IMPORT_C void CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1);
 	IMPORT_C void CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSize& aSize, TDisplayMode aDisplayMode, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1);
     IMPORT_C void CreatePbufferSurfaceAndMakeCurrentL(EGLConfig aConfig, const TSize& aSize, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1);
@@ -265,7 +269,7 @@
 #endif	
 	TBool 		iFbsSessionOpen;
 
-	//we will use a “lazy” initialization for iIsOpenGLESSupported, iIsOpenGLES2Supported and iIsOpenVGSupportedvariable members, 
+	//we will use a "lazy" initialization for iIsOpenGLESSupported, iIsOpenGLES2Supported and iIsOpenVGSupportedvariable members, 
 	//i.e. they will be initialized upon the first request
 	TBool       iIsSupportedRenderInitialized; //signify that iIsOpenGLESSupported, iIsOpenGLES2Supported and iIsOpenVGSupported members have been initialized   
 	TBool       iIsOpenGLESSupported;  
--- a/egl/egltest/inc/egltestcommonutils.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/inc/egltestcommonutils.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -372,6 +372,8 @@
 _LIT8(KEglKhrReusableSync,"EGL_KHR_reusable_sync");
 _LIT8(KEglNokPrivateSignalSync,"EGL_NOK__private__signal_sync");
 _LIT8(KEglNokiaSwapBuffers,"EGL_NOKIA_swap_buffers");
+_LIT8(KEglNokiaImageEndpoint,"EGL_NOK_image_endpoint");
+_LIT8(KEglNokiaSurfaceScaling,"EGL_NOK_surface_scaling");
 #ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
 _LIT8(KEglSymbianImagePreserved,"EGL_SYMBIAN_image_preserved");
 #endif
@@ -387,7 +389,9 @@
 	KEGL_KHR_reusable_sync			= 0x10,
 	KEGL_NOK__private__signal_sync  = 0x20,
 	KEGL_NOKIA_swap_buffers         = 0x40,
-	KEGL_SYMBIAN_image_preserved	= 0x80
+    KEGL_SYMBIAN_image_preserved    = 0x80,
+    KEGL_NOK_image_endpoint         = 0x100,
+    KEGL_NOK_surface_scaling        = 0x200
 	};
 
 const TUid KUidEglTestServer={0x10281B40};
--- a/egl/egltest/inc/eglteststep.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/inc/eglteststep.h	Wed Aug 18 11:05:09 2010 +0300
@@ -21,8 +21,6 @@
 #ifndef EGLTEST_STEP_H
 #define EGLTEST_STEP_H
 
-#include <e32msgqueue.h>
-
 #include <test/eglteststepfactory.h>
 
 _LIT(KEglTestStepDllName, "egltest.dll");
--- a/egl/egltest/rom/egltest.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/rom/egltest.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -66,6 +66,8 @@
 data=DATAZ_\egltest\egltest_t_oom_sgimage.script                 \egltest\egltest_t_oom_sgimage.script
 data=DATAZ_\egltest\egltest_t_stress_sgimage.script              \egltest\egltest_t_stress_sgimage.script
 data=DATAZ_\egltest\egltest_t_benchmark_swapbuffers.script		 \egltest\egltest_t_benchmark_swapbuffers.script
+data=DATAZ_\egltest\egltest_t_surfacescaling.script		         \egltest\egltest_t_surfacescaling.script
 data=DATAZ_\egltest\egltest_run.bat                          	\egltest_run.bat
 
+
 #endif // __EGLTEST_IBY__
--- a/egl/egltest/scripts/egltest_run.bat	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/scripts/egltest_run.bat	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,5 @@
 @rem
-@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 @rem All rights reserved.
 @rem This component and the accompanying materials are made available
 @rem under the terms of "Eclipse Public License v1.0"
@@ -30,6 +30,7 @@
 testexecute.exe z:\egltest\egltest_t_oom_sgimage.script
 testexecute.exe z:\egltest\egltest_t_stress_sgimage.script
 testexecute.exe z:\egltest\egltest_t_benchmark_swapbuffers.script
+testexecute.exe z:\egltest\egltest_t_surfacescaling.script
 
 :: Ignore the following if using this script for emulator testing.
 :: Logs are automatically copied on hardware to MMC
--- a/egl/egltest/scripts/egltest_settings.ini	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/scripts/egltest_settings.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -31,34 +31,33 @@
 Format2	= VG_sARGB_8888_PRE
 
 [SyncObject]
-Threshold=500000
-DelaySignalling=2500000
-WaitSyncTimeout=5000000
-LongDelaySignalling=7500000
-NumIterations=1000
+Threshold = 500000
+DelaySignalling = 2500000
+WaitSyncTimeout = 5000000
+LongDelaySignalling = 7500000
+NumIterations = 1000
+
+[SurfaceScaling]
+AllScalable = ETrue
 
 [Benchmark]
-NumIterations = 300 // Needs to be set with care. Making this value greater may cause an allocation failure.
-                    // On the emulator, it fails to create SgImage at some point.
-                    // Hardware will have their own limitations which also need to be considered.
-ImageWidth = 50 // width of RSgImage
-ImageHeight = 50 // height of RSgImage
+// NumIterations needs to be set with care (and hardware limitations must be considered)
+// Making this value greater may cause an allocation failure 
+NumIterations = 300 
+ImageWidth = 50
+ImageHeight = 50
 NumFormats = 1
 Format0 = EUidPixelFormatARGB_8888_PRE
 
 [OOM]
+// Width and height need to be set with care (and hardware limitations must be considered)
+// Making these values too small may result in the test taking a very long time to reach an out of memory situation
 NumIterations = 5
-ImageWidth = 200  // width of RSgImage
-ImageHeight = 200 // height of RSgImage
-		  // Width and height need to be set with care. Making these values too small may result
-		  // in the test taking a very long time to reach an out of memory situation.
-		  // Different hardware platforms will have different memory limitations 
-ThresholdGPUUsedMemory = 5 //Deviation in percentage between max and min of GPU memory
-			   //retrieved at the end of each attempt through NOK_resource_profiling2 egl extension inteface
-ThresholdLastIteration = 5 //Deviation in percentage between max and min of successful iteration number 
-			   //retrieved at the end of each attempt
-
+ImageWidth = 200
+ImageHeight = 200
+ThresholdGPUUsedMemory = 5
+ThresholdLastIteration = 5
 
 [SwapBuffers]
-WindowWidth=200
-WindowHeight=200
\ No newline at end of file
+WindowWidth = 200
+WindowHeight = 200
--- a/egl/egltest/scripts/egltest_t_oom_sgimage.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/scripts/egltest_t_oom_sgimage.script	Wed Aug 18 11:05:09 2010 +0300
@@ -22,5 +22,6 @@
 RUN_TEST_STEP 400 egltestserver OOM_CloseVGImage
 RUN_TEST_STEP 400 egltestserver OOM_ClosePixmapSurfaceWithTermination
 RUN_TEST_STEP 400 egltestserver OOM_ClosePixmapSurface
-RUN_TEST_STEP 400 egltestserver OOM_CloseSgImageSameThread
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 400 egltestserver OOM_CloseSgImageSameThread
 RUN_TEST_STEP 400 egltestserver OOM_CloseSgImageDifferentProcess
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/scripts/egltest_t_surfacescaling.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,43 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: 
+// Run EGL surface scaling tests.
+//
+
+PRINT Run EGL surface scaling tests
+
+LOAD_SUITE egltestserver
+
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_Positive
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_WindowResize
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_ExtentPositionChange
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_ExtentSizeChange
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_SwapBuffers
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_WindowSurface_Check
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_Negative_CreateWindowSurface
+RUN_TEST_STEP 100 egltestserver SurfaceScaling_Negative_FixedSize_NonWindowSurface
+RUN_TEST_STEP 100 egltestserver SurfaceScalingDefaultBorderColor
+RUN_TEST_STEP 100 egltestserver SurfaceScalingModifyingBorderColor
+RUN_TEST_STEP 100 egltestserver SurfaceScalingModifyingBorderColorNonFixed
+RUN_TEST_STEP 100 egltestserver SurfaceScalingModifyingInvalidBorderColor
+RUN_TEST_STEP 100 egltestserver SurfaceScalingModifyingExtent
+RUN_TEST_STEP 100 egltestserver SurfaceScalingModifyingExtentNonFixed
+RUN_TEST_STEP 100 egltestserver SurfaceScalingQuerySurface
+RUN_TEST_STEP 100 egltestserver SurfaceScalingQuerySurfaceNonFixed
+RUN_TEST_STEP 100 egltestserver SurfaceScalingCapability
+RUN_TEST_STEP 100 egltestserver SurfaceScalingSet
+RUN_TEST_STEP 100 egltestserver SurfaceScalingSetNonFixed
+RUN_TEST_STEP 100 egltestserver SurfaceScalingSetInvalidAttributes
+RUN_TEST_STEP 100 egltestserver SurfaceScalingNotInitialized
+
+PRINT Complete egltest_t_surfacescaling
--- a/egl/egltest/src/egltest_image.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/src/egltest_image.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -146,6 +146,7 @@
 	address += (bitmapSize.iHeight - 1) * stride;
 	vgWritePixels(address, -stride, KDefaultSurfaceFormat,0,0, bitmapSize.iWidth, bitmapSize.iHeight);
 	ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+	eglWaitClient();   // wait for writing to finish
    	ASSERT_EGL_TRUE(eglDestroySurface(iDisplay, surface));				//Destroying Surface handle
 
 	INFO_PRINTF1(_L("Create a EGLImage out of the SgImage"));
--- a/egl/egltest/src/egltest_image_multiprocess.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/src/egltest_image_multiprocess.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1468,6 +1468,7 @@
     	TInt stride = bitmap->DataStride();
     	address += (bitmapSize.iHeight - 1) * stride;
     	vgWritePixels(address, -stride, iSurfaceFormat, 0,0, bitmapSize.iWidth, bitmapSize.iHeight);
+   	    eglWaitClient();   // wait for writing to finish
 		delete bitmap;
 		bitmap = NULL;
 		ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/src/egltest_surfacescaling.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,3103 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+*/
+
+#include "egltest_surfacescaling.h"
+
+#include <test/tefunit.h> // for ASSERT macros
+#include <test/egltestcommonutils.h>
+#include "egltestcommoninisettings.h"
+
+//We are restricted by the screen comparison utility that requires images to be EColor16MU
+const TDisplayMode KTestSourceDisplayMode = EColor16MU;
+
+CEglTest_SurfaceScalingBase::~CEglTest_SurfaceScalingBase()
+    {
+	CleanAll();
+	delete iImageComparison;
+	delete iScreenDevice;
+    CloseWindow();
+    CloseWsSession();
+    }
+
+TVerdict CEglTest_SurfaceScalingBase::doTestStepPreambleL()
+    {
+    TVerdict verdict = CEglTestStep::doTestStepPreambleL();
+
+    INFO_PRINTF1(_L("doTestStepPreambleL() - Initialise surface scaling test settings..."));
+    if(!CheckForExtensionL(KEGL_NOK_surface_scaling))
+        {
+		ERR_PRINTF1(_L("KEGL_NOK_surface_scaling not supported!"));
+        User::Leave(KErrNotSupported);
+        }
+    //retrieve the pointers to the EGL surface scaling extension functions 
+    iPfnEglQuerySurfaceScalingCapabilityNOK = reinterpret_cast <TFPtrEglQuerySurfaceScalingCapabilityNok> (eglGetProcAddress("eglQuerySurfaceScalingCapabilityNOK"));
+    iPfnEglSetSurfaceScalingNOK = reinterpret_cast <TFPtrEglSetSurfaceScalingNok> (eglGetProcAddress("eglSetSurfaceScalingNOK"));
+	if(!iPfnEglQuerySurfaceScalingCapabilityNOK)
+		{
+		ERR_PRINTF1(_L("   Cannot retrieve address of the \"eglQuerySurfaceScalingCapabilityNOK\" function"));
+        User::Leave(KErrNotSupported);
+		}
+	if(!iPfnEglSetSurfaceScalingNOK)
+		{
+		ERR_PRINTF1(_L("   Cannot retrieve address of the \"eglSetSurfaceScalingNOK\" function"));
+        User::Leave(KErrNotSupported);
+		}
+
+    //retrieve surface scaling ini settings
+	CIniData* iniData = CIniData::NewL(KConfigFileName);
+    CleanupStack::PushL(iniData);
+    
+    _LIT(KSectionSurfaceScaling, "SurfaceScaling");
+    _LIT(KKeyAllScalable, "AllScalable"); 
+    
+    TPtrC scalable;
+	if(!iniData->FindVar(KSectionSurfaceScaling,KKeyAllScalable,scalable))
+        {
+		ERR_PRINTF3(_L("   Cannot retrieve section:%S key:%S"), &KSectionSurfaceScaling, &KKeyAllScalable);
+		User::Leave(KErrNotSupported);
+        }
+	iAllScalable = (scalable.FindF( _L("true"))==KErrNotFound)? EFalse : ETrue;
+	INFO_PRINTF1(_L("  ************************************************************************"));
+	INFO_PRINTF1(_L("  ****   The test will be run in following configuration: "));
+	INFO_PRINTF2(_L("  ****   All window surfaces scalable: %S"), &scalable);
+	INFO_PRINTF1(_L("  ************************************************************************"));
+	CleanupStack::PopAndDestroy(iniData);
+
+    //Initiate a window server session and create a window group
+    OpenWsSessionL(KDefaultWindowGroupId);
+
+    //Create a Screen Device
+    const TInt screen0 = 0;
+    iScreenDevice = new(ELeave) CWsScreenDevice(iWsSession);
+    User::LeaveIfError(iScreenDevice->Construct(screen0));
+    
+    // get full screen size
+    TPixelsAndRotation sizeAndRotation;
+    iScreenDevice->GetDefaultScreenSizeAndRotation(sizeAndRotation);
+    iScreenSize = sizeAndRotation.iPixelSize;
+    		
+	//Create the image comparison tool from the screen device as required by most tests 		
+    iImageComparison = CTGraphicsScreenComparison::NewL(*iScreenDevice);
+
+    return verdict;
+    }
+
+TVerdict CEglTest_SurfaceScalingBase::doTestStepPostambleL()
+    {
+	INFO_PRINTF1(_L("doTestStepPostambleL() - Cleaning up"));
+	
+	// cleanup egltest framework stuff
+	CleanAll();
+
+	// cleanup member variables
+	delete iImageComparison;
+	iImageComparison = NULL;
+	delete iScreenDevice;
+	iScreenDevice = NULL;
+	
+	// close window and wserver session
+    CloseWindow();
+    CloseWsSession();
+
+    return CEglTestStep::doTestStepPostambleL();
+    }
+
+void CEglTest_SurfaceScalingBase::CreateAndActivateWindowL(const TSize& aWindowSize)
+    {
+    ConstructWindowL(iWindow, aWindowSize);
+    }
+
+void CEglTest_SurfaceScalingBase::CloseWindow()
+    {
+	iWindow.Close();
+    }
+
+//check if border color matches with expected values
+void CEglTest_SurfaceScalingBase::CheckBorderColorL(EGLint aExpectedRedChannelColor, EGLint aExpectedBlueChannelColor, EGLint aExpectedGreenChannelColor)
+    {
+    EGLint value = 0xffff; //set color channel to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedRedChannelColor);
+
+    value = 0xffff; //set color channel to some arbitrary number
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedGreenChannelColor);
+
+    value = 0xffff; //set color channel to some arbitrary number
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedBlueChannelColor);
+    }
+
+//check if scaling attributes match with expected values
+void CEglTest_SurfaceScalingBase::CheckScalingAttributesL(EGLint aExpectedSurfaceWidth, EGLint aExpectedSurfaceHeight, EGLint aExpectedExtentWidth, EGLint aExpectedExtentHeight, EGLint aExpectedOffsetX, EGLint aExpectedOffsetY)
+    {
+    EGLint value = 0xffff; //set initial value to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_WIDTH, &value));
+    ASSERT_EQUALS(value, aExpectedSurfaceWidth);
+    
+    value = 0xffff; //set initial value to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_HEIGHT, &value));
+    ASSERT_EQUALS(value, aExpectedSurfaceHeight);
+    
+    value = 0xffff; //set initial value to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_WIDTH_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedExtentWidth);
+
+    value = 0xffff; //set initial value to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_HEIGHT_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedExtentHeight);
+   
+    value = 0xffff; //set initial value to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_X_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedOffsetX);
+   
+    value = 0xffff; //set initial value to some arbitrary number 
+    ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_Y_NOK, &value));
+    ASSERT_EQUALS(value, aExpectedOffsetY);
+    }
+
+/*
+ Simple create bitmap function to initialise a rectangular bitmap in four simple colours plus borders
+     ---------------------------
+    ¦         borderTop         ¦
+    ¦     -----------------     ¦
+    ¦ b. ¦        ¦        ¦ b. ¦
+    ¦    ¦    1   ¦   2    ¦    ¦
+    ¦ L  ¦        ¦        ¦ R  ¦
+    ¦ e  ¦--------¦--------¦ i  ¦
+    ¦ f  ¦        ¦        ¦ g  ¦
+    ¦ t  ¦    3   ¦   4    ¦ h  ¦
+    ¦    ¦        ¦        ¦ t  ¦
+    ¦     -----------------     ¦
+    ¦       borderBottom        ¦
+     --------------------------- 
+*/
+CFbsBitmap* CEglTest_SurfaceScalingBase::CreateBitmapLC(const TSize& aSize, TInt aBorderTop, TInt aBorderBottom, TInt aBorderLeft, TInt aBorderRight, const TRgb& aBorderColor)
+    {
+    // create the bitmap to the requested size (DisplayMode set to default value)
+    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();
+    CleanupStack::PushL(bitmap);
+    User::LeaveIfError(bitmap->Create(aSize,KTestSourceDisplayMode));
+    TEST(bitmap->SizeInPixels().iHeight == aSize.iHeight);
+    TEST(bitmap->SizeInPixels().iWidth == aSize.iWidth);
+
+    //Create a device and context for the purpose of generating the bitmap which will be the
+    //master reference used in the test
+    CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmap);
+    CleanupStack::PushL(bitmapDevice);
+    CFbsBitGc* bitmapGc = CFbsBitGc::NewL();
+    CleanupStack::PushL(bitmapGc);
+    bitmapGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+    bitmapGc->Activate(bitmapDevice);
+
+    // First off, set the whole bitmap to the border colour
+    bitmapGc->SetBrushColor(aBorderColor);
+    bitmapGc->SetPenColor(aBorderColor);
+    bitmapGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+    bitmapGc->DrawRect(aSize);
+    
+    // Set each individual quadrant to a different arbitrary colour
+    const TInt height = aSize.iHeight;
+    const TInt width  = aSize.iWidth;
+    const TInt quadrantHeight = (height - aBorderTop - aBorderBottom) / 2;
+    const TInt quadrantWidth = (width - aBorderLeft - aBorderRight) / 2;
+
+    // quadrant 1 - Colour KRgbMagenta
+    TRect rect = TRect(TPoint(aBorderLeft, aBorderTop), TSize(quadrantWidth, quadrantHeight));
+    bitmapGc->SetBrushColor(KRgbMagenta);
+    bitmapGc->SetPenColor(KRgbMagenta);
+    bitmapGc->DrawRect(rect);
+
+    // quadrant 2 - Colour KRgbCyan
+    rect = TRect(TPoint(aBorderLeft+quadrantWidth, aBorderTop), TSize(quadrantWidth, quadrantHeight));
+    bitmapGc->SetBrushColor(KRgbCyan);
+    bitmapGc->SetPenColor(KRgbCyan);
+    bitmapGc->DrawRect(rect);
+
+    // quadrant 3 - Colour KRgbYellow
+    rect = TRect(TPoint(aBorderLeft, aBorderTop+quadrantHeight), TSize(quadrantWidth, quadrantHeight));
+    bitmapGc->SetBrushColor(KRgbYellow);
+    bitmapGc->SetPenColor(KRgbYellow);
+    bitmapGc->DrawRect(rect);
+
+    // quadrant 4 - Colour KRgbDarkGreen
+    rect = TRect(TPoint(aBorderLeft+quadrantWidth, aBorderTop+quadrantHeight), TSize(quadrantWidth, quadrantHeight));
+    bitmapGc->SetBrushColor(KRgbDarkGreen);
+    bitmapGc->SetPenColor(KRgbDarkGreen);
+    bitmapGc->DrawRect(rect);
+
+    //clean-up
+    CleanupStack::PopAndDestroy(2, bitmapDevice);
+    return bitmap;
+    }
+
+void CEglTest_SurfaceScalingBase::WritePixelsToSurfaceL(const CFbsBitmap& aBitmap)
+	{
+    // Mind the fact that CFbsBitmap and VGImages use different coordinates origin
+    const TSize bitmapSize = aBitmap.SizeInPixels();
+    TUint8* address = reinterpret_cast<TUint8*>(aBitmap.DataAddress());
+    const TInt stride = aBitmap.DataStride();
+    address += (bitmapSize.iHeight - 1) * stride;
+    
+    // copy pixel data to the drawing surface
+    vgWritePixels(address, -stride, KDefaultSurfaceFormat,0,0, bitmapSize.iWidth, bitmapSize.iHeight);
+    ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
+    
+    // force all outstanding requests on the current context to complete
+    vgFinish();
+    iWsSession.Finish();
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0651
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Choose a suitable extent to test that specified border colours are correct.
+
+@SYMTestActions
+For a number of different situations, do the following:
+1. Create a window of known size
+2. Create a fixed size surface, filled in with a predefined bitmap
+3. Draw the surface onto the window for a set extent and border colour
+4. Compare window content and border against a reference bitmap containing expected values. 
+
+@SYMTestExpectedResults
+The window content matches the independently created reference bitmap in each situation
+*/
+TVerdict CEglTest_SurfaceScaling_Positive::doTestStepL()
+    {
+    SetTestStepID(_L("GRAPHICS-EGL-0651"));
+    SetTestStepName(_L("GRAPHICS-EGL-0651"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_Positive::doTestStepL started...."));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+    
+    //  NOTE: Borders depend on what you set as extent, offset, window and surface
+    //        Care should be taken when choosing size values, better to use even numbers
+	//		  (CreateBitmap splits rectangle in four, so we don't want a pixel mismatch there) 
+    for (TInt index=1; index<=17; index++)
+    	{
+		// Set some default values which are used in most cases
+		iWindowWidth = iWindowHeight = 200;
+		iBorderColor = TRgb(0,0,0);
+	    iBorderTop = iBorderBottom = iBorderLeft = iBorderRight = 0;
+
+	    switch(index)
+        {
+		case 1:
+			// surface scaled to same window size with no border
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 200; iExtentHeight = 200;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 2:
+			// surface scaled to half the window size with border top 
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 200; iExtentHeight = 100;
+		    iOffsetX = 0; iOffsetY = 100;
+		    iBorderColor = TRgb(0,0,0);         // arbitrary border colour
+		    iBorderTop = 100;
+			break;
+		case 3:
+			// surface scaled to half the window size with border bottom
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 200; iExtentHeight = 100;
+		    iOffsetX = 0; iOffsetY = 0;
+		    iBorderColor = TRgb(128,0,255);     // arbitrary border colour
+		    iBorderBottom = 100;
+			break;
+		case 4:
+			// surface scaled to half the window size with border top and bottom
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 200; iExtentHeight = 100;
+		    iOffsetX = 0; iOffsetY = 50;
+		    iBorderColor = TRgb(128,0,0);         // arbitrary border colour
+		    iBorderTop = 50; iBorderBottom = 50;
+			break;
+		case 5:
+			// surface scaled to half the window size with border left
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 100; iExtentHeight = 200;
+		    iOffsetX = 100; iOffsetY = 0;
+		    iBorderColor = TRgb(96,96,96);         // arbitrary border colour
+		    iBorderLeft = 100;
+			break;
+		case 6:
+			// surface scaled to half the window size with border right
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 100; iExtentHeight = 200;
+		    iOffsetX = 0; iOffsetY = 0;
+		    iBorderColor = TRgb(192,192,192);       // arbitrary border colour
+		    iBorderRight = 100;
+			break;
+		case 7:
+			// surface scaled to half the window size with border left and right
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 100; iExtentHeight = 200;
+		    iOffsetX = 50; iOffsetY = 0;
+		    iBorderColor = TRgb(0,0,0);				// arbitrary border colour
+		    iBorderLeft = 50; iBorderRight = 50;
+			break;
+		case 8:
+			// surface scaled in different proportions in width and height, with borders 
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 190; iExtentHeight = 10;
+		    iOffsetX = 5; iOffsetY = 95;
+		    iBorderColor = TRgb(240,240,240);       // arbitrary border colour
+		    iBorderTop = 95; iBorderBottom = 95; iBorderLeft = 5; iBorderRight = 5;
+			break;
+		case 9:
+			// surface scaled to double the window height size, surface cropped with no borders
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 400; iExtentHeight = 200;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 10:
+			// surface scaled to double the window width and height size, surface cropped with no borders
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 400; iExtentHeight = 400;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 11:
+			// surface scaled to double the window width and height size, surface cropped with borders top and left
+		    iSurfaceWidth = 100; iSurfaceHeight = 50;
+		    iExtentWidth = 400; iExtentHeight = 400;
+		    iOffsetX = 100; iOffsetY = 100;
+		    iBorderColor = TRgb(255,128,255);      // arbitrary border colour
+		    iBorderTop = 100; iBorderLeft = 100;
+			break;
+		case 12:
+			// QnHD to full screen size
+			iWindowWidth = iScreenSize.iWidth; iWindowHeight = iScreenSize.iHeight;
+		    iSurfaceWidth = 320; iSurfaceHeight = 180;
+		    iExtentWidth = iWindowWidth; iExtentHeight = iWindowHeight;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 13:
+			// QVGA to full screen size
+			iWindowWidth = iScreenSize.iWidth; iWindowHeight = iScreenSize.iHeight;
+		    iSurfaceWidth = 320; iSurfaceHeight = 240;
+		    iExtentWidth = iWindowWidth; iExtentHeight = iWindowHeight;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 14:
+			// HVGA to full screen size
+			iWindowWidth = iScreenSize.iWidth; iWindowHeight = iScreenSize.iHeight;
+		    iSurfaceWidth = 480; iSurfaceHeight = 320;
+		    iExtentWidth = iWindowWidth; iExtentHeight = iWindowHeight;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 15:
+			// 480x270 to full screen size
+			iWindowWidth = iScreenSize.iWidth; iWindowHeight = iScreenSize.iHeight;
+		    iSurfaceWidth = 480; iSurfaceHeight = 270;
+		    iExtentWidth = iWindowWidth; iExtentHeight = iWindowHeight;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 16:
+			// VGA to full screen size
+			iWindowWidth = iScreenSize.iWidth; iWindowHeight = iScreenSize.iHeight;
+		    iSurfaceWidth = 640; iSurfaceHeight = 480;
+		    iExtentWidth = iWindowWidth; iExtentHeight = iWindowHeight;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		case 17:
+			// WVGA to full screen size
+			iWindowWidth = iScreenSize.iWidth; iWindowHeight = iScreenSize.iHeight;
+		    iSurfaceWidth = 768; iSurfaceHeight = 480;
+		    iExtentWidth = iWindowWidth; iExtentHeight = iWindowHeight;
+		    iOffsetX = 0; iOffsetY = 0;
+			break;
+		default:
+		    ERR_PRINTF2(_L("Inconsistency in test code, case does not exist: %d."), index);
+		    User::Leave(KErrNotSupported);
+		    break;
+        }
+
+		// perform the testing
+	    doTestPartialStepL();
+    	}
+
+    // clean-up
+    CleanAll();
+
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_Positive::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+TVerdict CEglTest_SurfaceScaling_Positive::doTestPartialStepL()
+    {
+    INFO_PRINTF5(_L("doTestPartialStepL started with (%d,%d) fixed surface scaled to (%d,%d) extent...."), iSurfaceWidth, iSurfaceHeight, iExtentWidth, iExtentHeight);
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(iWindowWidth, iWindowHeight));
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, iSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, iSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, iOffsetX,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, iOffsetY,
+              EGL_TARGET_EXTENT_WIDTH_NOK, iExtentWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, iExtentHeight,
+              EGL_BORDER_COLOR_RED_NOK, iBorderColor.Red(),
+              EGL_BORDER_COLOR_GREEN_NOK, iBorderColor.Green(),
+              EGL_BORDER_COLOR_BLUE_NOK, iBorderColor.Blue(),
+              EGL_NONE};
+    
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+    // Create the test bitmap that will be used in the scaled surface 
+    //  NOTE: This bitmap generally does not have borders, 
+    CFbsBitmap* testBitmap = CreateBitmapLC(TSize(iSurfaceWidth, iSurfaceHeight),0,0,0,0,TRgb(0,0,0));
+    
+    // Copy test bitmap to drawing surface
+    WritePixelsToSurfaceL(*testBitmap);
+
+    //call eglSwapBuffers
+    ASSERT_EGL_TRUE(eglSwapBuffers(iDisplay, iEglSess->Surface()));
+    //Wait for the draw operation to complete
+    eglWaitClient();
+
+    // Create the reference bitmap that should be expected after the scaling 
+    //  NOTE: This bitmap may have borders
+    //        Size could exceed that of the window, so check both extent and window
+    const TInt refWidth = iExtentWidth>iWindowWidth ? iExtentWidth : iWindowWidth;
+    const TInt refHeight = iExtentHeight>iWindowHeight ? iExtentHeight : iWindowHeight;
+    CFbsBitmap* refBitmap = CreateBitmapLC(TSize(refWidth, refHeight), iBorderTop, iBorderBottom, iBorderLeft, iBorderRight, iBorderColor);
+
+    // compare window contents with expected bitmap
+    TInt comparison = iImageComparison->CompareScreenImageL(TSize(iWindowWidth, iWindowHeight), TPoint(0,0), TPoint(0,0), *refBitmap, TestStepName());
+    TEST(comparison==KErrNone);
+    INFO_PRINTF3(_L("CompareScreenImageL returns %d (expected is %d)"), comparison, KErrNone);
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(2, testBitmap); // refBitmap, testBitmap
+    iEglSess->CleanupSurfaceAndContextL();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....doTestPartialStepL completed!"));
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0661
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Resize native window to verify target extent remains fixed.
+
+@SYMTestActions
+1. Create a window of known size
+2. Create a fixed size surface, filled in with a predefined bitmap
+3. Draw the surface onto the window for a set extent and border colour
+4. Repeat step 3 but increasing native window size by (1,1) pixels.
+5. Compare window content and border against a reference bitmap containing expected values. 
+
+@SYMTestExpectedResults
+The window content matches the independently created reference bitmap in each situation
+*/
+TVerdict CEglTest_SurfaceScaling_WindowResize::doTestStepL()
+    {
+    SetTestStepID(_L("GRAPHICS-EGL-0661"));
+    SetTestStepName(_L("GRAPHICS-EGL-0661"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_WindowResize::doTestStepL started...."));
+
+    // set the initial value of a square window
+    const TInt KWindowSize = 100;
+    
+    // surface with size and extent that matches the window size and no offset
+    iWindowWidth = iWindowHeight = KWindowSize;
+    iSurfaceWidth = iSurfaceHeight = KWindowSize;
+    iExtentWidth = iExtentHeight = KWindowSize;
+    iOffsetX = 0; iOffsetY = 0;
+    iBorderColor = TRgb(0x99,0xcc,0xff);	// set some arbitrary colour
+    iBorderTop = 0; iBorderBottom = 0; iBorderLeft = 0; iBorderRight = 0;
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(iWindowWidth, iWindowHeight));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, iSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, iSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, iOffsetX,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, iOffsetY,
+              EGL_TARGET_EXTENT_WIDTH_NOK, iExtentWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, iExtentHeight,
+              EGL_BORDER_COLOR_RED_NOK, iBorderColor.Red(),
+              EGL_BORDER_COLOR_GREEN_NOK, iBorderColor.Green(),
+              EGL_BORDER_COLOR_BLUE_NOK, iBorderColor.Blue(),
+              EGL_NONE};
+    
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+    
+    // Create the test bitmap that will be used in the scaled surface 
+    //  NOTE: This bitmap generally does not have borders, 
+    CFbsBitmap* testBitmap = CreateBitmapLC(TSize(iSurfaceWidth, iSurfaceHeight),0,0,0,0,TRgb(0,0,0));
+    
+    // Copy test bitmap to drawing surface
+    WritePixelsToSurfaceL(*testBitmap);
+
+    // Start doing iterations by increasing native window size.
+    INFO_PRINTF1(_L("Start increasing native window size by (1,1)..."));
+    iWindowWidth=1;
+    iWindowHeight=1;
+    while(iWindowWidth<=(KWindowSize*2) && iWindowHeight<=(KWindowSize*2))
+    	{
+		// Note that borders will appear while window size is bigger than extent
+		//  - iSurfaceWidth/iSurfaceHeight - unmodified
+		//  - iExtentWidth/iExtentHeight - unmodified
+		//  - iOffsetX/iOffsetY - unmodified 
+		// Set up expected values for the border
+		iBorderTop = 0; iBorderLeft = 0; 
+		iBorderBottom = iExtentHeight<iWindowHeight ? iWindowHeight-iExtentHeight : 0; 
+		iBorderRight = iExtentWidth<iWindowWidth ? iWindowWidth-iExtentWidth : 0; 
+
+		// resize window to new given size
+	    iWindow.Invalidate();
+		iWindow.BeginRedraw();
+		iWindow.SetSize(TSize(iWindowWidth, iWindowHeight));
+		iWindow.EndRedraw();
+
+		// re-populate buffers with the unmodified fixed size surface content
+	    WritePixelsToSurfaceL(*testBitmap);
+		
+		// perform the testing
+		doTestPartialStepL();
+		++iWindowWidth;
+		++iWindowHeight;
+    	}
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(testBitmap);
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_WindowResize::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+TVerdict CEglTest_SurfaceScaling_WindowResize::doTestPartialStepL()
+    {
+    INFO_PRINTF3(_L("doTestPartialStepL started for native window size of (%d, %d)...."), iWindowWidth, iWindowHeight);
+
+	// resize may be effective only after swapbuffers 
+	ASSERT_EGL_TRUE(eglSwapBuffers(iDisplay, iEglSess->Surface()));
+	ASSERT_EGL_TRUE(eglWaitClient());
+	
+	//check all expected values
+    CheckScalingAttributesL(iSurfaceWidth, iSurfaceHeight, iExtentWidth, iExtentHeight, iOffsetX, iOffsetY); 
+    CheckBorderColorL(iBorderColor.Red(), iBorderColor.Blue(), iBorderColor.Green()); 
+
+    // Create the reference bitmap that should be expected after the window resize 
+    //  NOTE: This bitmap may have borders
+    //        Size could exceed that of the window, so check both extent and window
+    const TInt refWidth = iExtentWidth>iWindowWidth ? iExtentWidth : iWindowWidth;
+    const TInt refHeight = iExtentHeight>iWindowHeight ? iExtentHeight : iWindowHeight;
+    CFbsBitmap* refBitmap = CreateBitmapLC(TSize(refWidth, refHeight), iBorderTop, iBorderBottom, iBorderLeft, iBorderRight, iBorderColor);
+    
+    // compare window contents with expected bitmap
+    TInt comparison = iImageComparison->CompareScreenImageL(TSize(iWindowWidth, iWindowHeight), TPoint(0,0), TPoint(0,0), *refBitmap, TestStepName());
+    TEST(comparison==KErrNone);
+    INFO_PRINTF3(_L("CompareScreenImageL returns %d (expected is %d)"), comparison, KErrNone);
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(refBitmap);
+
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0668
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Create a fixed size surface and vary the extent position for a range of values.
+
+@SYMTestActions
+1. Create a window of known size
+2. Create a fixed size surface, filled in with a predefined bitmap
+3. Draw the surface onto the window for a set extent and border colour
+4. Repeat step 3 but increasing target extent offset by (1,1) pixels.
+5. Compare window content and border against a reference bitmap containing expected values. 
+
+@SYMTestExpectedResults
+The window content matches the independently created reference bitmap in each situation
+*/
+TVerdict CEglTest_SurfaceScaling_ExtentPositionChange::doTestStepL()
+    {
+    SetTestStepID(_L("GRAPHICS-EGL-0668"));
+    SetTestStepName(_L("GRAPHICS-EGL-0668"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_ExtentPositionChange::doTestStepL started...."));
+
+    // surface with size and extent that matches the window size and no offset
+    iWindowWidth = iWindowHeight = 100;
+    iSurfaceWidth = iExtentWidth = iWindowWidth;
+    iSurfaceHeight = iExtentHeight = iWindowHeight;
+    iOffsetX = 0; iOffsetY = 0;
+    iBorderColor = TRgb(0x11,0x22,0x33);	// set some arbitrary colour
+    iBorderTop = 0; iBorderBottom = 0; iBorderLeft = 0; iBorderRight = 0;
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(iWindowWidth, iWindowHeight));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, iSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, iSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, iOffsetX,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, iOffsetY,
+              EGL_TARGET_EXTENT_WIDTH_NOK, iExtentWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, iExtentHeight,
+              EGL_BORDER_COLOR_RED_NOK, iBorderColor.Red(),
+              EGL_BORDER_COLOR_GREEN_NOK, iBorderColor.Green(),
+              EGL_BORDER_COLOR_BLUE_NOK, iBorderColor.Blue(),
+              EGL_NONE};
+    
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+    
+    // Create the test bitmap that will be used in the scaled surface 
+    //  NOTE: This bitmap generally does not have borders, 
+    CFbsBitmap* testBitmap = CreateBitmapLC(TSize(iSurfaceWidth, iSurfaceHeight),0,0,0,0,TRgb(0,0,0));
+    
+    // Copy test bitmap to drawing surface
+    WritePixelsToSurfaceL(*testBitmap);
+
+	// This test is a bit different. Since the extent remains the same, and we only change
+    //  the offset, we create an oversized reference bitmap and compare the screen with a
+    //  region contained within the reference bitmap 
+    // Size is three times the extent so that it has extent size borders all around
+    const TInt refWidth = 3*iExtentWidth;
+    const TInt refHeight = 3*iExtentHeight;
+    iBorderTop=iBorderBottom=iBorderLeft=iBorderRight=iExtentWidth;	
+    CFbsBitmap* refBitmap = CreateBitmapLC(TSize(refWidth, refHeight), iBorderTop, iBorderBottom, iBorderLeft, iBorderRight, iBorderColor);
+
+    // Start doing iterations by increasing target extent offset
+    INFO_PRINTF1(_L("Start increasing target extent offset size by (1,1)..."));
+    for (iOffsetX=-iExtentWidth,iOffsetY=-iExtentHeight; iOffsetX<=iExtentWidth&&iOffsetY<=iExtentHeight; ++iOffsetX,++iOffsetY)
+    	{
+		// Note that borders will appear other than when offset is (0,0)
+		//  - iSurfaceWidth/iSurfaceHeight - unmodified
+		//  - iExtentWidth/iExtentHeight - unmodified
+	
+	    // set new offset values
+	    ASSERT_EGL_TRUE(iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), iOffsetX, iOffsetY, iExtentWidth, iExtentHeight));
+
+		// re-populate buffers with the unmodified fixed size surface content
+	    WritePixelsToSurfaceL(*testBitmap);
+
+		// perform the testing
+		doTestPartialStepL(*refBitmap);
+    	}
+    
+    /// Cleanup
+    CleanupStack::PopAndDestroy(2, testBitmap); //testBitmap, refBitmap
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_ExtentPositionChange::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+TVerdict CEglTest_SurfaceScaling_ExtentPositionChange::doTestPartialStepL(const CFbsBitmap& aRefBitmap)
+    {
+    INFO_PRINTF3(_L("doTestPartialStepL started for offset of (%d, %d)...."), iOffsetX, iOffsetY);
+
+    // offset change may be effective only after swapbuffers 
+	ASSERT_EGL_TRUE(eglSwapBuffers(iDisplay, iEglSess->Surface()));
+	ASSERT_EGL_TRUE(eglWaitClient());
+	// Finish() to ensure all native window operations related to the surface complete before image comparision.
+	iWsSession.Finish();
+	
+	//check all expected values
+    CheckScalingAttributesL(iSurfaceWidth, iSurfaceHeight, iExtentWidth, iExtentHeight, iOffsetX, iOffsetY); 
+    CheckBorderColorL(iBorderColor.Red(), iBorderColor.Blue(), iBorderColor.Green()); 
+
+    // Prepare the offset of the reference bitmap to know what sub-region should be compared
+    const TInt refWidth = 3*iExtentWidth;
+    const TInt refHeight = 3*iExtentHeight;
+    TPoint bitmapOffset(refWidth-iExtentWidth-iRefBitmapOffset, refHeight-iExtentHeight-iRefBitmapOffset);
+    iRefBitmapOffset++;		// increase offset for next iteration
+    
+    // Comparision takes into account specific region within the reference bitmap
+    TInt comparison = iImageComparison->CompareScreenImageL(TSize(iWindowWidth, iWindowHeight), TPoint(0,0), bitmapOffset, aRefBitmap, TestStepName());
+    TEST(comparison==KErrNone);
+    INFO_PRINTF3(_L("CompareScreenImageL returns %d (expected is %d)"), comparison, KErrNone);
+
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0669
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Create a fixed size surface and vary the extent size for a range of values
+
+@SYMTestActions
+1. Create a window of known size
+2. Create a fixed size surface, filled in with a predefined bitmap
+3. Draw the surface onto the window for a set extent and border colour
+4. Repeat step 3 but increasing target extent size by (2,2) pixels.
+5. Compare window content and border against a reference bitmap containing expected values. 
+
+@SYMTestExpectedResults
+The window content matches the independently created reference bitmap in each situation
+*/
+TVerdict CEglTest_SurfaceScaling_ExtentSizeChange::doTestStepL()
+    {
+    SetTestStepID(_L("GRAPHICS-EGL-0669"));
+    SetTestStepName(_L("GRAPHICS-EGL-0669"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_ExtentSizeChange::doTestStepL started...."));
+
+    // set the initial value of a square window
+    const TInt KWindowSize = 100;
+    
+    // surface with size and extent that matches the window size and no offset
+    iWindowWidth = iWindowHeight = KWindowSize;
+    iSurfaceWidth = iSurfaceHeight = KWindowSize;
+    iExtentWidth = iExtentHeight = KWindowSize; 	
+    iOffsetX = 0; iOffsetY = 0;
+    iBorderColor = TRgb(0x80,0x40,0xF0);	// set some arbitrary colour
+    iBorderTop = 0; iBorderBottom = 0; iBorderLeft = 0; iBorderRight = 0;
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(iWindowWidth, iWindowHeight));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, iSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, iSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, iOffsetX,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, iOffsetY,
+              EGL_TARGET_EXTENT_WIDTH_NOK, iExtentWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, iExtentHeight,
+              EGL_BORDER_COLOR_RED_NOK, iBorderColor.Red(),
+              EGL_BORDER_COLOR_GREEN_NOK, iBorderColor.Green(),
+              EGL_BORDER_COLOR_BLUE_NOK, iBorderColor.Blue(),
+              EGL_NONE};
+    
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+    
+    // Create the test bitmap that will be used in the scaled surface 
+    //  NOTE: This bitmap generally does not have borders, 
+    CFbsBitmap* testBitmap = CreateBitmapLC(TSize(iSurfaceWidth, iSurfaceHeight),0,0,0,0,TRgb(0,0,0));
+    
+    // Copy test bitmap to drawing surface
+    WritePixelsToSurfaceL(*testBitmap);
+
+    // Start doing iterations by increasing target extent size 
+    //  We do increments of (2,2) because the reference bitmap is simetrically split into 4 areas, so size
+    //  of this reference bitmap should be an even number of pixels
+    INFO_PRINTF1(_L("Start increasing target extent size by (2,2)..."));
+    iExtentWidth=2;
+    iExtentHeight=2;
+	while(iExtentWidth <= (KWindowSize*2) && iExtentHeight <= (KWindowSize*2))
+    	{
+		// Note that borders will appear while extent is smaller than window
+		//  - iSurfaceWidth/iSurfaceHeight - unmodified
+		//  - iOffsetX/iOffsetY - unmodified 
+		// Set up expected values for the border
+		iBorderTop = 0; iBorderLeft = 0; 
+		iBorderBottom = iExtentHeight<iWindowHeight ? iWindowHeight-iExtentHeight : 0; 
+		iBorderRight = iExtentWidth<iWindowWidth ? iWindowWidth-iExtentWidth : 0; 
+
+	    // set new target extent values
+	    ASSERT_EGL_TRUE(iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), iOffsetX, iOffsetY, iExtentWidth, iExtentHeight));
+
+		// re-populate buffers with the unmodified fixed size surface content
+	    WritePixelsToSurfaceL(*testBitmap);
+		
+		// perform the testing
+		doTestPartialStepL();
+		iExtentWidth+=2;
+		iExtentHeight+=2;
+		}
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(testBitmap);
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_ExtentSizeChange::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+TVerdict CEglTest_SurfaceScaling_ExtentSizeChange::doTestPartialStepL()
+    {
+    INFO_PRINTF3(_L("doTestPartialStepL started for extent size of (%d, %d)...."), iExtentWidth, iExtentHeight);
+
+    // extent change may be effective only after swapbuffers 
+	ASSERT_EGL_TRUE(eglSwapBuffers(iDisplay, iEglSess->Surface()));
+	ASSERT_EGL_TRUE(eglWaitClient());
+	// Finish() to ensure all native window operations related to the surface complete before image comparision.
+	iWsSession.Finish();
+	
+	//check all expected values
+    CheckScalingAttributesL(iSurfaceWidth, iSurfaceHeight, iExtentWidth, iExtentHeight, iOffsetX, iOffsetY); 
+    CheckBorderColorL(iBorderColor.Red(), iBorderColor.Blue(), iBorderColor.Green()); 
+
+    // Create the reference bitmap that should be expected after the window resize 
+    //  NOTE: This bitmap may have borders
+    //        Size could exceed that of the window, so check both extent and window
+    const TInt refWidth = iExtentWidth>iWindowWidth ? iExtentWidth : iWindowWidth;
+    const TInt refHeight = iExtentHeight>iWindowHeight ? iExtentHeight : iWindowHeight;
+    CFbsBitmap* refBitmap = CreateBitmapLC(TSize(refWidth, refHeight), iBorderTop, iBorderBottom, iBorderLeft, iBorderRight, iBorderColor);
+    
+    // compare window contents with expected bitmap
+    TInt comparison = iImageComparison->CompareScreenImageL(TSize(iWindowWidth, iWindowHeight), TPoint(0,0), TPoint(0,0), *refBitmap, TestStepName());
+    TEST(comparison==KErrNone);
+    INFO_PRINTF3(_L("CompareScreenImageL returns %d (expected is %d)"), comparison, KErrNone);
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(refBitmap);
+
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0670
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Check that updating surface scaling attributes is visible only after calling eglSwapBuffers
+
+@SYMTestActions
+1. Create a window of known size
+2. Create a fixed size surface, filled in with a predefined bitmap
+3. Draw the surface onto the window for a set extent and border colour
+4. Repeat step 3 but increasing target extent size and changing border colours
+5. Compare window content and border against a reference bitmap containing expected values
+  5a. Before calling eglSwapBuffers
+  5b. After callnig eglSwapBuffers  
+
+@SYMTestExpectedResults
+5a. The window content matches the independently created reference with old values
+5b. The window content matches the independently created reference with new values
+*/
+TVerdict CEglTest_SurfaceScaling_SwapBuffers::doTestStepL()
+    {
+    SetTestStepID(_L("GRAPHICS-EGL-0670"));
+    SetTestStepName(_L("GRAPHICS-EGL-0670"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_SwapBuffers::doTestStepL started...."));
+
+    // set the initial value of a square window
+    const TInt KWindowSize = 200;
+    
+    // surface with size that matches the window size and no offset and extent a quarter 
+    // of that originally positioned in the middle (so borders should be seen)
+    iWindowWidth = iWindowHeight = KWindowSize;
+    iSurfaceWidth = iSurfaceHeight = KWindowSize;
+    iExtentWidth = iExtentHeight = KWindowSize/4; 	
+    iOffsetX = (iWindowWidth-iExtentWidth)/2; iOffsetY = (iWindowHeight-iExtentHeight)/2;	// to center the surface at the middle of the window
+    iBorderColor = TRgb(0xFF,0xFF,0x00);	// set some arbitrary colour with blue channel to 0x00
+	iBorderTop = iBorderBottom = iExtentHeight<iWindowHeight ? (iWindowHeight-iExtentHeight)/2 : 0; 
+	iBorderLeft = iBorderRight = iExtentWidth<iWindowWidth ? (iWindowWidth-iExtentWidth)/2 : 0; 
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(iWindowWidth, iWindowHeight));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, iSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, iSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, iOffsetX,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, iOffsetY,
+              EGL_TARGET_EXTENT_WIDTH_NOK, iExtentWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, iExtentHeight,
+              EGL_BORDER_COLOR_RED_NOK, iBorderColor.Red(),
+              EGL_BORDER_COLOR_GREEN_NOK, iBorderColor.Green(),
+              EGL_BORDER_COLOR_BLUE_NOK, iBorderColor.Blue(),
+              EGL_NONE};
+    
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+    
+    // Create the test bitmap that will be used in the scaled surface 
+    //  NOTE: This bitmap generally does not have borders, 
+    CFbsBitmap* testBitmap = CreateBitmapLC(TSize(iSurfaceWidth, iSurfaceHeight),0,0,0,0,TRgb(0,0,0));
+    
+    // Copy test bitmap to drawing surface
+    WritePixelsToSurfaceL(*testBitmap);
+
+    // we need to update the window content for the first frame comparison inside the loop further down 
+	ASSERT_EGL_TRUE(eglSwapBuffers(iDisplay, iEglSess->Surface()));
+	ASSERT_EGL_TRUE(eglWaitClient());
+
+	// Start doing iterations changing border colours and increasing target extent size 
+    //  We do increments of (2,2) because the reference bitmap is simetrically split into 4 areas, so size
+    //  of this reference bitmap should be an even number of pixels
+    INFO_PRINTF1(_L("Start changing border colours and increasing target extent size by (2,2)..."));
+    for (;;)
+    	{
+		// re-populate buffers with the unmodified fixed size surface content
+		WritePixelsToSurfaceL(*testBitmap);
+
+		// perform the testing
+		doTestPartialStepL();
+		
+		// break the loop when necessary
+		if (iBorderColor.Blue()>=255)
+			break;
+		}
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(testBitmap);
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_SwapBuffers::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+TVerdict CEglTest_SurfaceScaling_SwapBuffers::doTestPartialStepL()
+    {
+    INFO_PRINTF4(_L("doTestPartialStepL started for border colour (%d,%d,%d)...."), iBorderColor.Red(), iBorderColor.Green(), iBorderColor.Blue());
+
+	// Note that borders will appear while extent is smaller than window
+	//  - iSurfaceWidth/iSurfaceHeight - unmodified
+	//  - iExtentWidth/iExtentHeight - modified 
+	//  - iOffsetX/iOffsetY - modified
+	
+    // Set up new value for border blue channel, storing old ones
+	TRgb oldBorderColor(iBorderColor);
+	TInt newColorBlue = oldBorderColor.Blue() + 5;
+	TESTL(newColorBlue>=0 && newColorBlue<=255);
+	iBorderColor.SetBlue(newColorBlue);
+	
+    // Set up new values for extent/offset, storing old ones
+	TInt oldExtentWidth = iExtentWidth;
+	TInt oldExtentHeight = iExtentHeight;
+	iExtentWidth+=2;
+	iExtentHeight+=2;
+	iOffsetX = (iWindowWidth-iExtentWidth)/2; 
+	iOffsetY = (iWindowHeight-iExtentHeight)/2;
+	
+	// Set up expected values for the border, storing old ones
+	TInt oldBorderTop = iBorderTop;
+	TInt oldBorderBottom = iBorderBottom;
+	TInt oldBorderLeft = iBorderLeft;
+	TInt oldBorderRight = iBorderRight;
+	iBorderTop = iBorderBottom = iExtentHeight<iWindowHeight ? (iWindowHeight-iExtentHeight)/2 : 0; 
+	iBorderLeft = iBorderRight = iExtentWidth<iWindowWidth ? (iWindowWidth-iExtentWidth)/2 : 0; 
+
+    // set new extent/offset values
+    ASSERT_EGL_TRUE(iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), iOffsetX, iOffsetY, iExtentWidth, iExtentHeight));
+    // set new border colour values
+    ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, iBorderColor.Blue()));
+    
+    // Check that values have been updated as expected
+    CheckScalingAttributesL(iSurfaceWidth, iSurfaceHeight, iExtentWidth, iExtentHeight, iOffsetX, iOffsetY); 
+    CheckBorderColorL(iBorderColor.Red(), iBorderColor.Blue(), iBorderColor.Green()); 
+
+    // Check that the screen has NOT BEEN UPDATED just yet
+
+    // Create the reference bitmap that should be expected before the extent/border changes 
+    TInt refWidth = oldExtentWidth>iWindowWidth ? oldExtentWidth : iWindowWidth;
+    TInt refHeight = oldExtentHeight>iWindowHeight ? oldExtentHeight : iWindowHeight;
+    CFbsBitmap* oldRefBitmap = CreateBitmapLC(TSize(refWidth, refHeight), oldBorderTop, oldBorderBottom, oldBorderLeft, oldBorderRight, oldBorderColor);
+
+    // compare screen with old reference bitmap
+    TInt comparison = iImageComparison->CompareScreenImageL(TSize(iWindowWidth, iWindowHeight), TPoint(0,0), TPoint(0,0), *oldRefBitmap, TestStepName());
+    TEST(comparison==KErrNone);
+    INFO_PRINTF3(_L("CompareScreenImageL before eglSwapBuffers returns %d (expected is %d)"), comparison, KErrNone);
+
+    // extent/offset changes MUST be effective only after swapbuffers 
+	ASSERT_EGL_TRUE(eglSwapBuffers(iDisplay, iEglSess->Surface()));
+	ASSERT_EGL_TRUE(eglWaitClient());
+	// Finish() to ensure all native window operations related to the surface complete before image comparision.
+	iWsSession.Finish();
+	
+	//check values still are as expected
+    CheckScalingAttributesL(iSurfaceWidth, iSurfaceHeight, iExtentWidth, iExtentHeight, iOffsetX, iOffsetY); 
+    CheckBorderColorL(iBorderColor.Red(), iBorderColor.Blue(), iBorderColor.Green()); 
+
+    // Create the reference bitmap that should be expected after the extent/border changes 
+    refWidth = iExtentWidth>iWindowWidth ? iExtentWidth : iWindowWidth;
+    refHeight = iExtentHeight>iWindowHeight ? iExtentHeight : iWindowHeight;
+    CFbsBitmap* newRefBitmap = CreateBitmapLC(TSize(refWidth, refHeight), iBorderTop, iBorderBottom, iBorderLeft, iBorderRight, iBorderColor);
+
+    // compare screen with new reference bitmap
+    comparison = iImageComparison->CompareScreenImageL(TSize(iWindowWidth, iWindowHeight), TPoint(0,0), TPoint(0,0), *newRefBitmap, TestStepName());
+    TEST(comparison==KErrNone);
+    INFO_PRINTF3(_L("CompareScreenImageL after eglSwapBuffers returns %d (expected is %d)"), comparison, KErrNone);
+
+    /// Cleanup
+    CleanupStack::PopAndDestroy(2, oldRefBitmap); // oldRefBitmap, newRefBitmap
+
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0652
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Check that all configs that support surface scaling also support window surfaces.
+
+@SYMTestActions
+1. Query number of configs
+2. Iterate through all configs and check if surface scaling is supported
+3. If surface scaling is supported, chech that it supports window surfaces and 
+	attempt to create a fixed size window surface
+4. If surface scaling is not supported, check eglGetConfigAttrib return value and 
+	attempt to create a fixed size window surface
+
+@SYMTestExpectedResults
+3. All configs that support surface scaling support window surfaces and window surface creation succeeds.
+4. If surface scaling is not supported, eglGetConfigAttrib sets value to EGL_FALSE and window surface creation fails.
+*/
+TVerdict CEglTest_SurfaceScaling_WindowSurface_Check::doTestStepL()
+    {
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_WindowSurface_Check::doTestStepL"));
+    SetTestStepName(_L("GRAPHICS-EGL-0652"));
+    SetTestStepID(_L("GRAPHICS-EGL-0652"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    EGLConfig matchingConfigs[KMaxEglConfigs];
+    EGLint numConfigs = 0;
+
+    EGLint attrib_list[] = {
+					EGL_FIXED_WIDTH_NOK, 50,
+					EGL_FIXED_HEIGHT_NOK, 50,
+					EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+					EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+					EGL_TARGET_EXTENT_WIDTH_NOK, 100,
+					EGL_TARGET_EXTENT_HEIGHT_NOK, 100,
+					EGL_NONE};
+
+    // Query total number of configs
+    ASSERT_EGL_TRUE(eglGetConfigs(iDisplay, NULL, KMaxTInt, &numConfigs));
+    TESTL(numConfigs >= 1 && numConfigs <= KMaxEglConfigs);
+    INFO_PRINTF2(_L("Found %d configs in total"), numConfigs);
+
+    // Get all configs
+    ASSERT_EGL_TRUE(eglGetConfigs(iDisplay, matchingConfigs, KMaxEglConfigs, &numConfigs));
+
+    // Check that if surface scaling is supported in the config, then window surfaces are supported too
+    for(TInt i=0; i<numConfigs; i++)
+        {
+		// query scaling support
+		EGLint scalingSupport = -32; // arbitraty value which is neither EGL_TRUE nor EGL_FALSE
+		ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, matchingConfigs[i], EGL_SURFACE_SCALING_NOK, &scalingSupport));
+		
+		// query window surface support
+		EGLint surfaceType=-1;
+		ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, matchingConfigs[i], EGL_SURFACE_TYPE, &surfaceType));
+		
+		// check that if surface scaling is supported, it also supports window surfaces
+		if (scalingSupport==EGL_TRUE)
+			{
+			INFO_PRINTF2(_L("Config %d supports surface scaling. Checking window surface support..."), i);
+			TEST((surfaceType&EGL_WINDOW_BIT) == EGL_WINDOW_BIT);
+			}
+		else
+			{
+			// check value was updated accordingly
+			INFO_PRINTF2(_L("Config %d does NOT support surface scaling."), i);
+			TEST(scalingSupport==EGL_FALSE);
+			}
+
+		// check if config supports window surface, fixed window surface creation follows scaling support 
+		if ((surfaceType&EGL_WINDOW_BIT) == EGL_WINDOW_BIT)
+			{
+			EGLSurface windowSurface = eglCreateWindowSurface(iDisplay, matchingConfigs[i], &iWindow, attrib_list);
+			if (scalingSupport==EGL_TRUE)
+				{
+				INFO_PRINTF1(_L("Checking window surface creation succeeds..."));
+				TEST_EGL_ERROR(windowSurface =! EGL_NO_SURFACE, EGL_SUCCESS);
+				}
+			else
+				{
+				INFO_PRINTF1(_L("Checking window surface creation fails..."));
+				TEST_EGL_ERROR(windowSurface == EGL_NO_SURFACE, EGL_BAD_MATCH);
+				}
+			}
+        }
+
+    // clean-up
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_WindowSurface_Check::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0653
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative test. This test is to check the return value and error code of eglCreateWindowSurface 
+when creating a fixed size window surface with invalid combination of Surface Scaling attributes 
+and illegal values for each attribute.
+
+@SYMTestActions
+1. Create a fixed size Window Surface with invalid combination of Surface Scaling attributes.
+    - Only specify 5 out of 6 of the following attributes, when specified, should be valid.
+    EGL_EXTENT_WIDTH_NOK, EGL_EXTENT_HEIGHT_NOK, EGL_TARGET_EXTENT_WIDTH_NOK, 
+    EGL_TARGET_EXTENT_HEIGHT_NOK, EGL_TARGET_EXTENT_OFFSET_X_NOK, EGL_TARGET_EXTENT_OFFSET_Y_NOK
+2. Create a fixed size Window Surface with illegal values for each attribute.
+    [attribute]                         [illegal value]
+    EGL_FIXED_WIDTH_NOK                 less than or equal to zero
+    EGL_FIXED_HEIGHT_NOK                less than or equal to zero
+    EGL_TARGET_EXTENT_WIDTH_NOK         less than or equal to zero
+    EGL_TARGET_EXTENT_HEIGHT_NOK        less than or equal to zero
+
+@SYMTestExpectedResults
+1. EGL_NO_SURFACE is returned with error set to EGL_BAD_ATTRIBUTE
+2. EGL_NO_SURFACE is returned with error set to EGL_BAD_ATTRIBUTE
+*/
+TVerdict CEglTest_SurfaceScaling_Negative_CreateWindowSurface::doTestStepL()
+    {
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_Negative_CreateWindowSurface::doTestStepL"));
+    SetTestStepName(_L("GRAPHICS-EGL-0653"));
+    SetTestStepID(_L("GRAPHICS-EGL-0653"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();
+    iEglSess->InitializeL();
+    
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+    
+    // Make the fixed size surface half width and height of the window
+    TInt surfaceWidth = iWindow.Size().iWidth / 2;
+    TInt surfaceHeight = iWindow.Size().iHeight / 2;
+    
+    TInt invalidCombinationAttrNum = 6;
+    EGLint invalid_combination_attrib_list[][11] = {
+            {
+                EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                EGL_NONE},
+            {
+                EGL_FIXED_WIDTH_NOK, surfaceWidth,
+                EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                EGL_NONE},
+            {
+                EGL_FIXED_WIDTH_NOK, surfaceWidth,
+                EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                EGL_NONE},
+            {
+                EGL_FIXED_WIDTH_NOK, surfaceWidth,
+                EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                EGL_NONE},
+            {
+                EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                EGL_NONE},
+            {
+                EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                EGL_NONE}
+            };
+    
+    TInt illegalValAttrNum = 14;
+    EGLint illegal_value_attrib_list[][19] = {
+                {
+                    EGL_FIXED_WIDTH_NOK, -1,
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, 0,
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,
+                    EGL_FIXED_HEIGHT_NOK, -1,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,
+                    EGL_FIXED_HEIGHT_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, -1,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, 0,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, -1,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, 0,
+                    EGL_BORDER_COLOR_RED_NOK, 0xfc,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0xfd,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0xfe,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, -1,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0,
+                    EGL_BORDER_COLOR_GREEN_NOK, -1,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0,
+                    EGL_BORDER_COLOR_BLUE_NOK, -1,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 256,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0,
+                    EGL_BORDER_COLOR_GREEN_NOK, 256,
+                    EGL_BORDER_COLOR_BLUE_NOK, 0,
+                    EGL_NONE},
+                {
+                    EGL_FIXED_WIDTH_NOK, surfaceWidth,  
+                    EGL_FIXED_HEIGHT_NOK, surfaceHeight,
+                    EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                    EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                    EGL_TARGET_EXTENT_WIDTH_NOK, iWindow.Size().iWidth,
+                    EGL_TARGET_EXTENT_HEIGHT_NOK, iWindow.Size().iHeight,
+                    EGL_BORDER_COLOR_RED_NOK, 0,
+                    EGL_BORDER_COLOR_GREEN_NOK, 0,
+                    EGL_BORDER_COLOR_BLUE_NOK, 256,
+                    EGL_NONE}
+                };
+
+    INFO_PRINTF1(_L("Calling eglCreateWindowSurface with invalid combination of Surface Scaling attributes... - only five out of six compulsary attributes specified"));
+    for(TInt i = 0;i < invalidCombinationAttrNum;i++)
+        {
+        EGLSurface surface = eglCreateWindowSurface(iDisplay, matchingConfigs[0], &iWindow, invalid_combination_attrib_list[i]);    
+        TEST_EGL_ERROR(surface == EGL_NO_SURFACE, EGL_BAD_ATTRIBUTE);
+        }
+    
+    INFO_PRINTF1(_L("Calling eglCreateWindowSurface with illegal values for each attribute..."));
+    for(TInt i = 0;i < illegalValAttrNum;i++)
+        {
+        EGLSurface surface = eglCreateWindowSurface(iDisplay, matchingConfigs[0], &iWindow, illegal_value_attrib_list[i]);    
+        TEST_EGL_ERROR(surface == EGL_NO_SURFACE, EGL_BAD_ATTRIBUTE);
+        }
+
+    // clean-up
+    CloseWindow();
+    CleanAll();
+
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_Negative_CreateWindowSurface::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0654
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative test. This test is to check the return value and error code when creating
+a fixed size non window surface.
+
+@SYMTestActions
+1. Attempt to create a pixmap with scaling attributes specified
+2. Attempt to create a pbuffer surface with scaling attributes specified
+3. Attempt to create a window surface with scaling attributes specified but 
+   config doesn't support surface scaling
+
+@SYMTestExpectedResults
+1. EGL_NO_SURFACE is returned with error set to EGL_BAD_ATTRIBUTE
+2. EGL_NO_SURFACE is returned with error set to EGL_BAD_ATTRIBUTE
+3. EGL_NO_SURFACE is returned with error set to EGL_BAD_MATCH
+*/
+TVerdict CEglTest_SurfaceScaling_Negative_FixedSize_NonWindowSurface::doTestStepL()
+    {
+    INFO_PRINTF1(_L("CEglTest_SurfaceScaling_Negative_FixedSize_NonWindowSurface::doTestStepL"));
+    SetTestStepName(_L("GRAPHICS-EGL-0654"));
+    SetTestStepID(_L("GRAPHICS-EGL-0654"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    // Create bitmap
+    User::LeaveIfError(RFbsSession::Connect());
+    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();
+    CleanupStack::PushL(bitmap);
+    User::LeaveIfError(bitmap->Create(TSize(20, 20), EColor16MU));
+    
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();
+    iEglSess->InitializeL();
+    
+    EGLConfig config;
+    EGLSurface surface = EGL_NO_SURFACE;
+    EGLint numConfigs = 0;
+    
+    // Use OpenVG to draw
+    ASSERT_EGL_TRUE(eglBindAPI(EGL_OPENVG_API));
+    
+    const EGLint KFixedSize_surface_attrib_list[] = {
+                EGL_FIXED_WIDTH_NOK, 100,
+                EGL_FIXED_HEIGHT_NOK, 100,
+                EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+                EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+                EGL_TARGET_EXTENT_WIDTH_NOK, 150,
+                EGL_TARGET_EXTENT_HEIGHT_NOK, 150,
+                EGL_NONE};
+           
+    // If all window surfaces in EGL are scalable, first case must be skipped. Others still valid
+    TInt index = iAllScalable ? 1 : 0;
+    for(; index < 3; index++)
+        {
+        switch(index)
+            {
+		case 0:
+			INFO_PRINTF1(_L("Calling eglCreateWindowSurface with surface scaling attribute specified in a config that does not support scaling..."));
+			ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribs_NoScaling], &config, 1, &numConfigs));
+			TEST(numConfigs==1);
+			surface = eglCreateWindowSurface(iDisplay, config, &iWindow, KFixedSize_surface_attrib_list);    
+			TEST_EGL_ERROR(surface == EGL_NO_SURFACE, EGL_BAD_MATCH);
+			break;
+        case 1:
+			INFO_PRINTF1(_L("Calling eglCreatePixmapSurface with surface scaling attribute specified..."));
+		    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPixmapAttribsColor16MU], &config, 1, &numConfigs));
+		    TEST(numConfigs==1);
+			surface = eglCreatePixmapSurface(iDisplay, config, (NativePixmapType)bitmap, KFixedSize_surface_attrib_list);
+			TEST_EGL_ERROR(surface == EGL_NO_SURFACE, EGL_BAD_ATTRIBUTE);
+            break;
+        case 2:
+            INFO_PRINTF1(_L("Calling eglCreatePbufferSurface with surface scaling attribute specified..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPBufferAttribsColor64K], &config, 1, &numConfigs));
+            TEST(numConfigs==1);
+            surface = eglCreatePbufferSurface(iDisplay, config, KFixedSize_surface_attrib_list);    
+            TEST_EGL_ERROR(surface == EGL_NO_SURFACE, EGL_BAD_ATTRIBUTE);
+            break;
+			}
+        }
+   
+    // cleanup
+    CleanupStack::PopAndDestroy(bitmap);
+    CloseWindow();
+    CleanAll();
+    RFbsSession::Disconnect();
+
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScaling_Negative_FixedSize_NonWindowSurface::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0655
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Exercising border color set by default.
+
+@SYMTestActions
+1. Create a fixed size EGL Window Surface without border color specified.
+2. Create a fixed size EGL Window Surface with border color specified for one channel.
+3. Create a fixed size EGL Window Surface with border color specified for two channels.
+ 
+@SYMTestExpectedResults
+Retrieved border color matches to the value it has been set at surface creation, 
+if during the surface creation border color has not been specified it is set to black (0x0).   
+*/
+TVerdict CEglTest_SurfaceScalingDefaultBorderColor::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0655"));
+    SetTestStepID(_L("GRAPHICS-EGL-0655"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingDefaultBorderColor::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+    
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL (numConfigs == 1); // Abort the test if the EGL config is not supported
+    
+    // Make the fixed size surface half width and height of the window
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    
+    EGLint attrib_list1[] = {
+              EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+              EGL_TARGET_EXTENT_WIDTH_NOK, KWindowWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, KWindowHeight,
+              EGL_NONE};
+
+    EGLint attrib_list2[] = {
+              EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+              EGL_TARGET_EXTENT_WIDTH_NOK, KWindowWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, KWindowHeight,
+              EGL_BORDER_COLOR_RED_NOK, 0xf0,
+              EGL_NONE};
+
+    EGLint attrib_list3[] = {
+              EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+              EGL_TARGET_EXTENT_WIDTH_NOK, KWindowWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, KWindowHeight,
+              EGL_BORDER_COLOR_BLUE_NOK, 0xf8,
+              EGL_BORDER_COLOR_GREEN_NOK, 0xfc,
+              EGL_NONE};
+    
+    for(TInt index = 0; index < 3; index++)
+        {
+        EGLint* attrib_list = NULL;
+        EGLint expectedRedChannelColor = 0; 
+        EGLint expectedGreenChannelColor = 0; 
+        EGLint expectedBlueChannelColor = 0; 
+
+        switch(index)
+            {
+        case 0:
+            attrib_list = attrib_list1;
+            break;
+        case 1:
+            expectedRedChannelColor = 0xf0;
+            attrib_list = attrib_list2;
+            break;
+        case 2:
+            expectedBlueChannelColor = 0xf8;
+            expectedGreenChannelColor = 0xfc;
+            attrib_list = attrib_list3;
+            break;
+            }
+        // Create the window surface and the egl context and make them current
+        iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+        
+        // Check expected border colours 
+        CheckBorderColorL(expectedRedChannelColor, expectedBlueChannelColor, expectedGreenChannelColor);
+    
+        // Cleanup
+        iEglSess->CleanupSurfaceAndContextL();
+        }
+    
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingDefaultBorderColor::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0656
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Modifying an existing fixed size surface border color. 
+
+@SYMTestActions
+1. Create a fixed size EGL Window Surface with border color specified.
+2. Modify border color with the new values.
+ 
+@SYMTestExpectedResults
+New color will take place only after setting new values.   
+*/
+
+TVerdict CEglTest_SurfaceScalingModifyingBorderColor::doTestStepL()
+    {
+	SetTestStepName(_L("GRAPHICS-EGL-0656"));
+	SetTestStepID(_L("GRAPHICS-EGL-0656"));
+	INFO_PRINTF1(_L("CEglTest_SurfaceScalingModifyingBorderColor::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL (numConfigs == 1); // Abort the test if the EGL config is not supported
+    
+    // Make the fixed size surface half width and height of the window
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const TInt KExtentWidth = KSurfaceWidth;
+    const TInt KExtentHeight = KSurfaceHeight;
+    const EGLint KRedChannelColor = 0x20; 
+    const EGLint KGreenChannelColor = 0x40; 
+    const EGLint KBlueChannelColor = 0x60; 
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+              EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight,
+              EGL_BORDER_COLOR_RED_NOK, KRedChannelColor,
+              EGL_BORDER_COLOR_BLUE_NOK, KBlueChannelColor,
+              EGL_BORDER_COLOR_GREEN_NOK, KGreenChannelColor,
+              EGL_NONE};
+
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+    CheckBorderColorL(KRedChannelColor, KBlueChannelColor, KGreenChannelColor);
+    
+    //modify existing attributes
+    const EGLint KOffsetColor = 100; 
+    ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, KRedChannelColor + KOffsetColor));
+    ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, KBlueChannelColor + KOffsetColor));
+    ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, KGreenChannelColor + KOffsetColor));
+
+    //check that border color has been modified now
+    CheckBorderColorL(KRedChannelColor+KOffsetColor, KBlueChannelColor+KOffsetColor, KGreenChannelColor+KOffsetColor);
+    
+    // Cleanup
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+    
+	INFO_PRINTF1(_L("....CEglTest_SurfaceScalingModifyingBorderColor::doTestStepL completed!"));
+
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID 	GRAPHICS-EGL-0657
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Modifying an existing non-fixed size surface border color. 
+
+@SYMTestActions
+1. Create a non-fixed size EGL Window Surface.
+2. Try to set border color after surface creation.
+3. Repeat steps 1-2 for pixmap and pbuffer surface
+
+@SYMTestExpectedResults
+Setting border color has no effect.   
+*/
+TVerdict CEglTest_SurfaceScalingModifyingBorderColorNonFixed::doTestStepL()
+    {
+	SetTestStepName(_L("GRAPHICS-EGL-0657"));
+	SetTestStepID(_L("GRAPHICS-EGL-0657"));
+	INFO_PRINTF1(_L("CEglTest_SurfaceScalingModifyingBorderColorNonFixed::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth;
+    const TInt KSurfaceHeight = KWindowHeight;
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    // If all window surfaces in EGL are scalable, first case must be skipped. Others still valid
+    TInt index = iAllScalable ? 1 : 0;
+    for(; index < 3; index++)
+        {
+        switch(index)
+            {
+        case 0:
+            // Create the non-fixed size window surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the non-fixed size window surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribs_NoScaling], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow);    
+            break;
+        case 1:
+            // Create the pbuffer surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pbuffer surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPBufferAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePbufferSurfaceAndMakeCurrentL(matchingConfigs[0], TSize(KSurfaceWidth, KSurfaceHeight));
+            break;
+        case 2:
+            // Create the pixmap surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pixmap surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPixmapAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(TSize(KSurfaceWidth, KSurfaceHeight), EColor16MU);
+            break;
+            }
+
+		// Set border color values to a non fixed size window (nothing should happen)
+		const EGLint KRedChannelColor = 0x20; 
+		const EGLint KGreenChannelColor = 0x40; 
+		const EGLint KBlueChannelColor = 0x60; 
+		ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, KRedChannelColor));
+		ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, KBlueChannelColor));
+		ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, KGreenChannelColor));
+
+		// Check all attributes (this is a non-fixed size window) 
+		// Note that we cannot use CheckBorderColorL because values are not updated
+		EGLint redChannelColor = -1; 
+		EGLint greenChannelColor = -2; 
+		EGLint blueChannelColor = -3; 
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, &redChannelColor));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, &blueChannelColor));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, &greenChannelColor));
+		TEST(redChannelColor == -1);
+		TEST(greenChannelColor == -2);
+		TEST(blueChannelColor == -3);
+
+		// Set invalid border color values to a non fixed size window (nothing should happen)
+		INFO_PRINTF1(_L("Attempt to set invalid border color values to a non fixed size window..."));
+		ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, KRedChannelColor+256));
+		ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, KBlueChannelColor+256));
+		ASSERT_EGL_TRUE(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, KGreenChannelColor+256));
+		
+		// Check all attributes (this is a non-fixed size window) 
+		// Note that we cannot use CheckBorderColorL because values are not updated
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, &redChannelColor));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, &blueChannelColor));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, &greenChannelColor));
+		TEST(redChannelColor == -1);
+		TEST(greenChannelColor == -2);
+		TEST(blueChannelColor == -3);
+    
+	   	// destroy surface and context
+	    iEglSess->CleanupSurfaceAndContextL();
+        }
+    
+    // Cleanup
+    CleanAll();
+    CloseWindow();
+    
+	INFO_PRINTF1(_L("....CEglTest_SurfaceScalingModifyingBorderColorNonFixed::doTestStepL completed!"));
+
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0658
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Attempt to modify an existing fixed size surface border color with invalid values. 
+
+@SYMTestActions
+1. Create a fixed size EGL Window Surface with border color specified.
+2. Try to modify border color with the negative values.
+3. Try to modify border color with the positive values greater than 255.
+ 
+@SYMTestExpectedResults
+Attempt to modify the border color with the new values will fail with error code EGL_BAD_ATTRIBUTE.   
+*/
+TVerdict CEglTest_SurfaceScalingModifyingInvalidBorderColor::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0658"));
+    SetTestStepID(_L("GRAPHICS-EGL-0658"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingModifyingInvalidBorderColor::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL (numConfigs == 1); // Abort the test if the EGL config is not supported
+    
+    // Make the fixed size surface half width and height of the window
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const EGLint KRedChannelColor = 0x20; 
+    const EGLint KGreenChannelColor = 0x40; 
+    const EGLint KBlueChannelColor = 0x60; 
+
+    EGLint attrib_list[] = {
+              EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+              EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+              EGL_TARGET_EXTENT_OFFSET_X_NOK, 0,
+              EGL_TARGET_EXTENT_OFFSET_Y_NOK, 0,
+              EGL_TARGET_EXTENT_WIDTH_NOK, KWindowWidth,
+              EGL_TARGET_EXTENT_HEIGHT_NOK, KWindowHeight,
+              EGL_BORDER_COLOR_RED_NOK, KRedChannelColor,
+              EGL_BORDER_COLOR_BLUE_NOK, KBlueChannelColor,
+              EGL_BORDER_COLOR_GREEN_NOK, KGreenChannelColor,
+              EGL_NONE};
+
+
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+    // check initial values match
+    CheckBorderColorL(KRedChannelColor, KBlueChannelColor, KGreenChannelColor);
+    
+    //modify existing attributes with negative value
+	INFO_PRINTF1(_L("Attempt to set negative border color values..."));
+    TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, -KRedChannelColor) == EGL_FALSE);
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, -KBlueChannelColor) == EGL_FALSE);
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, -KGreenChannelColor) == EGL_FALSE);
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+
+    //check that border color has not been modified
+    CheckBorderColorL(KRedChannelColor, KBlueChannelColor, KGreenChannelColor);
+    
+    //modify existing attributes with very big positive value
+	INFO_PRINTF1(_L("Attempt to set border color values that are too big..."));
+    TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, KRedChannelColor + 256) == EGL_FALSE);
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, KBlueChannelColor + 256) == EGL_FALSE);
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, KGreenChannelColor + 256) == EGL_FALSE);
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+
+    //check that border color has not been modified
+    CheckBorderColorL(KRedChannelColor, KBlueChannelColor, KGreenChannelColor);
+
+    /// Cleanup
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingModifyingInvalidBorderColor::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0659
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Attempt to modify an extent with eglSurfaceAttrib() after surface has been created. 
+
+@SYMTestActions
+1. Create a fixed size EGL Window Surface.
+2. Try to modify a surface extent parameters with arbitrary values via eglSurfaceAttrib().
+
+@SYMTestExpectedResults
+Attempt to modify the extent will fail with error code EGL_BAD_ATTRIBUTE.   
+*/
+TVerdict CEglTest_SurfaceScalingModifyingExtent::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0659"));
+    SetTestStepID(_L("GRAPHICS-EGL-0659"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingModifyingExtent::doTestStepL"));
+
+     // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    INFO_PRINTF1(_L("Attempt to modify surface extent for fixed size surfaces..."));
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+	TESTL (numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+	const TInt KSurfaceHeight = KWindowHeight/2;
+	const TInt KExtentWidth = KWindowWidth;
+	const TInt KExtentHeight = KWindowHeight;
+    const TInt KOffsetX = 10;
+	const TInt KOffsetY = 20;
+            
+    EGLint attrib_list[] = {
+                  EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+                  EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+                  EGL_TARGET_EXTENT_OFFSET_X_NOK, KOffsetX,
+                  EGL_TARGET_EXTENT_OFFSET_Y_NOK, KOffsetY,
+                  EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth,
+                  EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight,
+                  EGL_NONE};
+    
+	// Create the window surface and the egl context and make them current
+	iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+	// Invalid update - modify existing attributes with any value
+	TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_FIXED_WIDTH_NOK, KSurfaceWidth/2) == EGL_FALSE);
+	ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+	TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_FIXED_HEIGHT_NOK, KSurfaceHeight/2) == EGL_FALSE);
+	ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+	TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth/2) == EGL_FALSE);
+	ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+	TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight/2) == EGL_FALSE);
+	ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+	TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_X_NOK, KOffsetX/2) == EGL_FALSE);
+	ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+	TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_Y_NOK, KOffsetY/2) == EGL_FALSE);
+	ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+
+    // check that attributes have not been modified
+    CheckScalingAttributesL(KSurfaceWidth, KSurfaceHeight, KExtentWidth, KExtentHeight, KOffsetX, KOffsetY);
+
+	/// Cleanup
+    iEglSess->CleanupSurfaceAndContextL();
+    CleanAll();
+    CloseWindow();
+
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingModifyingExtent::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0671
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Attempt to modify an extent with eglSurfaceAttrib() after surface has been created. 
+
+@SYMTestActions
+1. Create a non fixed size EGL Window Surface.
+2. Try to modify a surface extent parameters with arbitrary values via eglSurfaceAttrib().
+3. Repeat steps 2-3 for pixmap and pbuffer surface
+
+@SYMTestExpectedResults
+Attempt to modify the extent will fail with error code EGL_BAD_ATTRIBUTE.   
+*/
+TVerdict CEglTest_SurfaceScalingModifyingExtentNonFixed::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0671"));
+    SetTestStepID(_L("GRAPHICS-EGL-0671"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingModifyingExtentNonFixed::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth;
+    const TInt KSurfaceHeight = KWindowHeight;
+	const TInt KExtentWidth = KWindowWidth;
+	const TInt KExtentHeight = KWindowHeight;
+    const TInt KOffsetX = 11;
+	const TInt KOffsetY = 22;
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+     
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    // If all window surfaces in EGL are scalable, first case must be skipped. Others still valid
+    TInt index = iAllScalable ? 1 : 0;
+    for(; index < 3; index++)
+        {
+        switch(index)
+            {
+        case 0:
+            // Create the non-fixed size window surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the non-fixed size window surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribs_NoScaling], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow);    
+            break;
+        case 1:
+            // Create the pbuffer surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pbuffer surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPBufferAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePbufferSurfaceAndMakeCurrentL(matchingConfigs[0], TSize(KSurfaceWidth, KSurfaceHeight));
+            break;
+        case 2:
+            // Create the pixmap surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pixmap surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPixmapAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(TSize(KSurfaceWidth, KSurfaceHeight), EColor16MU);
+            break;
+            }
+
+		// Invalid update - modify existing attributes with any value
+		TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_FIXED_WIDTH_NOK, KSurfaceWidth/2) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+		TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_FIXED_HEIGHT_NOK, KSurfaceHeight/2) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+		TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth/2) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+		TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight/2) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+		TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_X_NOK, KOffsetX/2) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+		TEST(eglSurfaceAttrib(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_Y_NOK, KOffsetY/2) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+
+	   	// destroy surface and context
+	    iEglSess->CleanupSurfaceAndContextL();
+        }
+    
+	/// Cleanup
+    CleanAll();
+    CloseWindow();
+
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingModifyingExtentNonFixed::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0660
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Query surface attrubutes related to scaling. 
+
+@SYMTestActions
+1. Create a non-fixed size EGL Window Surface.
+2. Query surface attributes.
+
+@SYMTestExpectedResults
+2. Query surface attributes succeeds and all atributes matches to the expected values.
+*/
+TVerdict CEglTest_SurfaceScalingQuerySurface::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0660"));
+    SetTestStepID(_L("GRAPHICS-EGL-0660"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingQuerySurface::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL (numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const TInt KExtentWidth = KWindowWidth;
+    const TInt KExtentHeight = KWindowHeight;
+    const EGLint KXOffset = 10;
+    const EGLint KYOffset = 20;
+    const EGLint KBorderColorRed = 0xa0;
+    const EGLint KBorderColorBlue = 0xf0;
+    const EGLint KBorderColorGreen = 0xfc;
+
+    EGLint attrib_list[] = {
+                  EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+                  EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+                  EGL_TARGET_EXTENT_OFFSET_X_NOK, KXOffset,
+                  EGL_TARGET_EXTENT_OFFSET_Y_NOK, KYOffset,
+                  EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth,
+                  EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight,
+                  EGL_BORDER_COLOR_BLUE_NOK, KBorderColorBlue,
+                  EGL_BORDER_COLOR_GREEN_NOK, KBorderColorGreen,
+                  EGL_BORDER_COLOR_RED_NOK, KBorderColorRed,
+                  EGL_NONE};
+
+	// Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+    INFO_PRINTF1(_L("Query surface attributes and border colour back and check expected values..."));
+    CheckBorderColorL(KBorderColorRed, KBorderColorBlue, KBorderColorGreen);
+    CheckScalingAttributesL(KSurfaceWidth, KSurfaceHeight, KExtentWidth, KExtentHeight, KXOffset, KYOffset);
+   
+    INFO_PRINTF1(_L("Check EGL_FIXED_WIDTH_NOK and EGL_FIXED_HEIGHT_NOK cannot be queried..."));
+    EGLint surfaceFixedWidth = -1;
+    EGLint surfaceFixedHeight = -2;
+    TEST(EGL_FALSE == eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_FIXED_WIDTH_NOK, &surfaceFixedWidth));
+    ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+    TEST(EGL_FALSE == eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_FIXED_HEIGHT_NOK, &surfaceFixedHeight));
+    ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+	TEST(surfaceFixedWidth == -1);
+	TEST(surfaceFixedHeight == -2);
+    
+	// clean-up
+	iEglSess->CleanupSurfaceAndContextL();
+    CloseWindow();
+    CleanAll();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingQuerySurface::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+    
+/**
+@SYMTestCaseID GRAPHICS-EGL-0662
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Query surface attributes which are not supported by this API. 
+
+@SYMTestActions
+1. Create a non-fixed size EGL window surface.
+2. Query surface attributes.
+3. Repeat step 2 for EGL window surface, pixmap and pbuffer surface
+
+@SYMTestExpectedResults
+Query surface attributes will fail with error code EGL_BAD_ATTRIBUTE.   
+*/
+TVerdict CEglTest_SurfaceScalingQuerySurfaceNonFixed::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0662"));
+    SetTestStepID(_L("GRAPHICS-EGL-0662"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingQuerySurfaceNonFixed::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100,100));
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth;
+    const TInt KSurfaceHeight = KWindowHeight;
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+     
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    // If all window surfaces in EGL are scalable, first case must be skipped. Others still valid
+    TInt index = iAllScalable ? 1 : 0;
+    for(; index < 3; index++)
+        {
+        switch(index)
+            {
+        case 0:
+            // Create the non-fixed size window surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the non-fixed size window surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribs_NoScaling], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow);    
+            break;
+        case 1:
+            // Create the pbuffer surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pbuffer surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPBufferAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePbufferSurfaceAndMakeCurrentL(matchingConfigs[0], TSize(KSurfaceWidth, KSurfaceHeight));
+            break;
+        case 2:
+            // Create the pixmap surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pixmap surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPixmapAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(TSize(KSurfaceWidth, KSurfaceHeight), EColor16MU);
+            break;
+            }
+
+        INFO_PRINTF1(_L("Check EGL_FIXED_WIDTH_NOK and EGL_FIXED_HEIGHT_NOK cannot be queried..."));
+        EGLint surfaceFixedWidth = -1;
+        EGLint surfaceFixedHeight = -2;
+        TEST(EGL_FALSE == eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_FIXED_WIDTH_NOK, &surfaceFixedWidth));
+        ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+        TEST(EGL_FALSE == eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_FIXED_HEIGHT_NOK, &surfaceFixedHeight));
+        ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
+        TEST(surfaceFixedWidth == -1);
+        TEST(surfaceFixedHeight == -2);
+    
+        INFO_PRINTF1(_L("Check surface size is as we would expect..."));
+        EGLint surfaceWidth = 0;
+    	EGLint surfaceHeight = 0;
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_WIDTH, &surfaceWidth));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_HEIGHT, &surfaceHeight));
+    	TEST(surfaceWidth == KWindowWidth);		// non-fixed size surface
+    	TEST(surfaceHeight == KWindowHeight);	// non-fixed size surface
+
+    	INFO_PRINTF1(_L("Check scaling attributes cannot be queried..."));
+    	EGLint extentOffsetX = -1;
+    	EGLint extentOffsetY = -2;
+    	EGLint extentWidth = -3;
+    	EGLint extentHeight = -4;
+    	EGLint borderColorBlue = -5;
+    	EGLint borderColorRed = -6;
+    	EGLint borderColorGreen = -7;
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_X_NOK, &extentOffsetX));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_Y_NOK, &extentOffsetY));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_WIDTH_NOK, &extentWidth));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_HEIGHT_NOK, &extentHeight));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_BLUE_NOK, &borderColorBlue));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_GREEN_NOK, &borderColorGreen));
+    	ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_BORDER_COLOR_RED_NOK, &borderColorRed));
+    	TEST(extentOffsetX == -1);
+    	TEST(extentOffsetY == -2);
+    	TEST(extentWidth == -3);
+    	TEST(extentHeight == -4);
+    	TEST(borderColorBlue == -5);
+    	TEST(borderColorRed == -6);
+    	TEST(borderColorGreen == -7);
+
+    	// destroy surface and context
+        iEglSess->CleanupSurfaceAndContextL();
+        }
+
+    // clean-up
+    CloseWindow();
+    CleanAll();
+
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingQuerySurfaceNonFixed::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0663
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Query surface scaling capability with invalid parameters. 
+
+@SYMTestActions
+1. Query surface scaling capability for the different configs.
+2. Query surface scaling capability with invalid display.
+3. Query surface scaling capability with negative surface width.
+4. Query surface scaling capability with negative surface height.
+5. Query surface scaling capability with negative target width.
+6. Query surface scaling capability with negative target height.
+7. Query surface scaling capability with zero surface width.
+8. Query surface scaling capability with zero surface height.
+9. Query surface scaling capability with zero target width.
+10. Query surface scaling capability with zero target height.
+
+@SYMTestExpectedResults
+1. Query surface capability will fail with error code EGL_BAD_MATCH if config doesn't support scaling and succeed otherwise.   
+2. Query surface capability will fail with error code EGL_BAD_DISPLAY.   
+3. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+4. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+5. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+6. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+7. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+8. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+9. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+10. Query surface capability will fail with error code EGL_BAD_PARAMETER.   
+*/
+TVerdict CEglTest_SurfaceScalingCapability::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0663"));
+    SetTestStepID(_L("GRAPHICS-EGL-0663"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingCapability::doTestStepL"));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[KMaxEglConfigs];
+    EGLint numConfigs = 0;
+    
+    CreateAndActivateWindowL(TSize(100,100));
+    
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const EGLDisplay KInvalidDisplay = iDisplay - 100;
+    EGLint capability = -1; //arbitrary number beyond the existing range 
+    EGLConfig config = -1;
+    
+    INFO_PRINTF1(_L("Calling eglGetConfigs to get configs..."));
+    ASSERT_EGL_TRUE(eglGetConfigs(iDisplay, matchingConfigs, KMaxEglConfigs, &numConfigs));
+    for(TInt index = 0; index < numConfigs; index++)
+        {
+        EGLint value = EGL_FALSE;
+        ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, matchingConfigs[index], EGL_SURFACE_SCALING_NOK, &value));
+        if(value == EGL_FALSE)
+            {
+            TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, matchingConfigs[index], KSurfaceWidth, KSurfaceHeight, KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+            TEST(capability == -1); //make sure that value has not been modified
+            ASSERT_EGL_ERROR(EGL_BAD_MATCH);
+            }
+        else  
+            {
+            if(config == -1) 
+                {//memorize the first config that supports scaling
+                config = matchingConfigs[index];
+                }
+            ASSERT_EGL_TRUE(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, matchingConfigs[index], KSurfaceWidth, KSurfaceHeight, KWindowWidth, KWindowHeight, &capability));
+            TEST((capability == EGL_SUPPORTED_NOK) || (capability == EGL_SLOW_NOK));
+            capability = -1; 
+            }
+        }
+    capability = -1; 
+    TEST(config != -1); // make sure that at least one config supports scaling 
+    
+    //invalid display
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(KInvalidDisplay, config, KSurfaceWidth, KSurfaceHeight, KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_DISPLAY);
+
+    //negative width
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, -KSurfaceWidth, KSurfaceHeight, KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, KSurfaceWidth, KSurfaceHeight, -KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    //negative height
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, KSurfaceWidth, -KSurfaceHeight, KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, KSurfaceWidth, KSurfaceHeight, KWindowWidth, -KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    
+    //zero width
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, -0, KSurfaceHeight, KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, KSurfaceWidth, KSurfaceHeight, -0, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    //zero height
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, KSurfaceWidth, -0, KWindowWidth, KWindowHeight, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+    TEST(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, config, KSurfaceWidth, KSurfaceHeight, KWindowWidth, -0, &capability) == EGL_FALSE);
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
+   
+    // Cleanup
+    CloseWindow();
+    CleanAll();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingCapability::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0664
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Call eglSetSurfaceScalingNOK with fixed size surface and a target extent that can be set. 
+
+@SYMTestActions
+Retrieve all available EGL configs and for those that support surface scaling 
+1. Create a window surface with surface scaling attributes and make it current
+2. Query these attributes and check they correspond with what is expected
+3. Query if surface supports scaling to a different extent
+4. Set the new extent and new offset to the surface
+5. Query these attributes
+
+@SYMTestExpectedResults
+5. Surface scaling attributes have been updated    
+*/
+TVerdict CEglTest_SurfaceScalingSet::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0664"));
+    SetTestStepID(_L("GRAPHICS-EGL-0664"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingSet::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const TInt KExtentWidth = KWindowWidth;
+    const TInt KExtentHeight = KWindowHeight;
+    const EGLint KOffsetX = 3;
+    const EGLint KOffsetY = 7;
+
+    EGLint attrib_list[] = {
+                  EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+                  EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+                  EGL_TARGET_EXTENT_OFFSET_X_NOK, KOffsetX,
+                  EGL_TARGET_EXTENT_OFFSET_Y_NOK, KOffsetY,
+                  EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth,
+                  EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight,
+                  EGL_NONE};
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[KMaxEglConfigs];
+    EGLint numConfigs = 0;
+
+    // Query total number of configs
+    ASSERT_EGL_TRUE(eglGetConfigs(iDisplay, NULL, KMaxTInt, &numConfigs));
+    TESTL(numConfigs >= 1 && numConfigs <= KMaxEglConfigs);
+    INFO_PRINTF2(_L("Found %d configs"), numConfigs);
+
+    // Get the configs
+    ASSERT_EGL_TRUE(eglGetConfigs(iDisplay, matchingConfigs, KMaxEglConfigs, &numConfigs));
+
+    // Check if surface scaling is supported in the config, if so, create surface
+    for(TInt i=0; i<numConfigs; i++)
+        {
+		EGLint value = -32; // arbitraty value which is neither EGL_TRUE nor EGL_FALSE
+		ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, matchingConfigs[i], EGL_SURFACE_SCALING_NOK, &value));
+		if (value==EGL_TRUE)
+			{
+			INFO_PRINTF2(_L("Config %d supports surface scaling. Create a window surface..."), i);
+
+		    // Create the window surface and the egl context and make them current
+			EGLint renderableType = 0;
+			ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, matchingConfigs[i],  EGL_RENDERABLE_TYPE, &renderableType));
+			if (renderableType&EGL_OPENVG_BIT)
+				{
+				iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[i], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);
+				}
+			else if (renderableType&EGL_OPENGL_ES_BIT)
+				{
+				iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[i], iWindow, EFalse, EGL_OPENGL_ES_API, 1, attrib_list);
+				}
+			else
+				{
+				WARN_PRINTF2(_L("Config %d does not support either OPENVG or OPENGL_ES. Skip!"), i);
+				continue;
+				}
+
+		    // Check values are as expected
+	        CheckScalingAttributesL(KSurfaceWidth, KSurfaceHeight, KExtentWidth, KExtentHeight, KOffsetX, KOffsetY);
+
+	        // modify target extent atttributes
+	        // 1 - first check that this new extent is supported, should do as we're reducing it
+	        EGLint capability = -1; 	//arbitrary number beyond the existing range 
+	        EGLint newExtentWidth = KExtentWidth / 2;
+	    	EGLint newExtentHeight = KExtentHeight / 2;
+	        EGLint newOffsetX = KOffsetX * 2;
+	    	EGLint newOffsetY = KOffsetY * 2;
+	        ASSERT_EGL_TRUE(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, matchingConfigs[i], KSurfaceWidth, KSurfaceHeight, newExtentWidth, newExtentHeight, &capability));
+            TEST((capability == EGL_SUPPORTED_NOK) || (capability == EGL_SLOW_NOK));
+			// 2 - set new extent
+	        ASSERT_EGL_TRUE(iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), newOffsetX, newOffsetY, newExtentWidth, newExtentHeight));
+
+	        // Check attributes have changed
+	        CheckScalingAttributesL(KSurfaceWidth, KSurfaceHeight, newExtentWidth, newExtentHeight, newOffsetX, newOffsetY);
+
+			// Cleanup
+	        iEglSess->CleanupSurfaceAndContextL();
+			}
+        }
+    
+    // Cleanup
+    CloseWindow();
+    CleanAll();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingSet::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0665
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Call eglSetSurfaceScalingNOK with invalid parameters 
+
+@SYMTestActions
+1. Set surface scaling with invalid display.
+2. Set surface scaling with negative target width.
+3. Set surface scaling with negative target height.
+3. Set surface scaling with zero target width.
+3. Set surface scaling with zero target height.
+@SYMTestExpectedResults
+1. Set surface scaling will fail with error code EGL_BAD_DISPLAY.   
+2. Set surface scaling will fail with error code EGL_BAD_PARAMETER.   
+3. Set surface scaling will fail with error code EGL_BAD_PARAMETER.   
+4. Set surface scaling will fail with error code EGL_BAD_PARAMETER.   
+5. Set surface scaling will fail with error code EGL_BAD_PARAMETER.   
+*/
+TVerdict CEglTest_SurfaceScalingSetInvalidAttributes::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0665"));
+    SetTestStepID(_L("GRAPHICS-EGL-0665"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingSetInvalidAttributes::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const TInt KExtentWidth = KWindowWidth;
+    const TInt KExtentHeight = KWindowHeight;
+    const EGLint KOffsetX = 11;
+    const EGLint KOffsetY = 13;
+    EGLint attrib_list[] = {
+                  EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+                  EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+                  EGL_TARGET_EXTENT_OFFSET_X_NOK, KOffsetX,
+                  EGL_TARGET_EXTENT_OFFSET_Y_NOK, KOffsetY,
+                  EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth,
+                  EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight,
+                  EGL_NONE};
+
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+    // Check all attributes
+    CheckScalingAttributesL(KSurfaceWidth, KSurfaceHeight, KExtentWidth, KExtentHeight, KOffsetX, KOffsetY);
+
+    for(TInt index = 0; index < 5; index++)
+        {
+		// new attribute values
+		EGLDisplay newDisplay = iDisplay;
+		EGLint newExtentWidth = KExtentWidth;
+		EGLint newExtentHeight = KExtentHeight;
+		EGLint newOffsetX = KOffsetX;
+		EGLint newOffsetY = KOffsetY;
+		// expected error value
+		EGLint error = EGL_BAD_PARAMETER;
+		
+		switch(index)
+            {
+        case 0:
+            // Invalid display - valid extent
+            newDisplay = newDisplay - 100;
+            error = EGL_BAD_DISPLAY;
+            break;
+        case 1:
+            // Valid display - Negative extent width
+        	newExtentWidth = -newExtentHeight;
+            break;
+        case 2:
+            // Valid display - Negative extent height
+        	newExtentHeight = -newExtentHeight;
+        	break;
+		case 3:
+			// Valid display - zero extent width
+			newExtentWidth = 0;
+			break;
+		case 4:
+			// Valid display - zero extent height
+			newExtentHeight = 0;
+			break;
+			}
+
+		TEST(EGL_FALSE == iPfnEglSetSurfaceScalingNOK(newDisplay, iEglSess->Surface(), newOffsetX, newOffsetY, newExtentWidth, newExtentHeight));
+		ASSERT_EGL_ERROR(error);
+
+		// attributes haven't changed
+	    CheckScalingAttributesL(KSurfaceWidth, KSurfaceHeight, KWindowWidth, KWindowHeight, KOffsetX, KOffsetY);
+        }
+    
+    // Cleanup
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingSetInvalidAttributes::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0666
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Query scaling attributes in non-fixed size surfaces 
+
+@SYMTestActions
+1. Create a window surface from a non-fixed size surface
+2. Set surface scaling with valid target extent.
+3. Query scaling attributes
+4. Repeat step 2-3 for EGL window surface, pixmap and pbuffer surface
+
+@SYMTestExpectedResults
+2. Set surface scaling will fail with error code EGL_BAD_MATCH.
+3. Query scaling attributes does not fail, but values not updated
+*/
+TVerdict CEglTest_SurfaceScalingSetNonFixed::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0666"));
+    SetTestStepID(_L("GRAPHICS-EGL-0666"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingSetNonFixed::doTestStepL"));
+
+    // Establish the connection to the window server and create
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth;
+    const TInt KSurfaceHeight = KWindowHeight;
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config - Make sure it DOES NOT support surface scaling
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    
+    // If all window surfaces in EGL are scalable, first case must be skipped. Others still valid
+    TInt index = iAllScalable ? 1 : 0;
+    for(; index < 3; index++)
+        {
+        switch(index)
+            {
+        case 0:
+            // Create the non-fixed size window surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the non-fixed size window surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribs_NoScaling], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow);    
+            break;
+        case 1:
+            // Create the pbuffer surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pbuffer surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPBufferAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePbufferSurfaceAndMakeCurrentL(matchingConfigs[0], TSize(KSurfaceWidth, KSurfaceHeight));
+            break;
+        case 2:
+            // Create the pixmap surface and the egl context and make them current
+            INFO_PRINTF1(_L("Create the pixmap surface and the egl context and make them current..."));
+            ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[EPixmapAttribsColor16MU], matchingConfigs, 1, &numConfigs));
+            TESTL(numConfigs == 1);
+            iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(TSize(KSurfaceWidth, KSurfaceHeight), EColor16MU);
+            break;
+            }
+
+		// Check all attributes (this is a non-fixed size surface)  - 
+		// Note that we cannot use CheckScalingAttributesL because values are not updated
+		EGLint surfaceWidth = 0;
+		EGLint surfaceHeight = 0;
+		EGLint extentWidth = -1;	
+		EGLint extentHeight = -2;
+		EGLint offsetX = -3;
+		EGLint offsetY = -4;
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_WIDTH, &surfaceWidth));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_HEIGHT, &surfaceHeight));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_WIDTH_NOK, &extentWidth));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_HEIGHT_NOK, &extentHeight));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_X_NOK, &offsetX));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_Y_NOK, &offsetY));
+		TEST((surfaceWidth == KWindowWidth) && (surfaceHeight == KWindowHeight));
+		// following values should not be modified (non fixed size window)
+		TEST((extentWidth == -1) && (extentHeight == -2));
+		TEST((offsetX == -3) && (offsetY == -4));
+	
+		// new attribute values
+		EGLint newExtentWidth = extentWidth / 2;
+		EGLint newExtentHeight = extentHeight / 2;
+		EGLint newOffsetX = offsetX * 2;
+		EGLint newOffsetY = offsetY * 2;
+	
+		// Valid parameters - But non fixed size surface
+		TEST(iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), newOffsetX, newOffsetY, newExtentWidth, newExtentHeight) == EGL_FALSE);
+		ASSERT_EGL_ERROR(EGL_BAD_MATCH);
+	
+		// attributes haven't changed
+		// Note that we cannot use CheckScalingAttributesL because values are not updated
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_WIDTH, &surfaceWidth));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_HEIGHT, &surfaceHeight));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_WIDTH_NOK, &extentWidth));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_HEIGHT_NOK, &extentHeight));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_X_NOK, &offsetX));
+		ASSERT_EGL_TRUE(eglQuerySurface(iDisplay, iEglSess->Surface(), EGL_TARGET_EXTENT_OFFSET_Y_NOK, &offsetY));
+		TEST((surfaceWidth == KWindowWidth) && (surfaceHeight == KWindowHeight));
+		TEST((extentWidth == -1) && (extentHeight == -2));
+		TEST((offsetX == -3) && (offsetY == -4));
+	
+    	// destroy surface and context
+        iEglSess->CleanupSurfaceAndContextL();
+        }
+
+    // Cleanup
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingSetNonFixed::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0667
+
+@SYMTestPriority 1
+
+@SYMPREQ 2676
+
+@SYMREQ 417-56592
+
+@SYMTestCaseDesc
+Negative testing. Calling extensions without initialising EGL
+
+@SYMTestActions
+Without initialising EGL
+1. Call query surface scaling capability
+2. Call set surface scaling
+
+@SYMTestExpectedResults
+1. Query scaling capability will fail with error code EGL_NOT_INITIALIZED.
+2. Set surface scaling will fail with error code EGL_NOT_INITIALIZED.
+*/
+TVerdict CEglTest_SurfaceScalingNotInitialized::doTestStepL()
+    {
+    SetTestStepName(_L("GRAPHICS-EGL-0667"));
+    SetTestStepID(_L("GRAPHICS-EGL-0667"));
+    INFO_PRINTF1(_L("CEglTest_SurfaceScalingNotInitialized::doTestStepL"));
+
+    // a WindowGroup and a Window object
+    CreateAndActivateWindowL(TSize(100, 100));
+
+    // Create display object
+    GetDisplayL();
+    CreateEglSessionL();    // initialise EGL Session so we can make use of its helper objects
+    iEglSess->InitializeL();
+
+    // Choose EGL config
+    EGLConfig matchingConfigs[1];
+    EGLint numConfigs = 0;
+    ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KScalingConfigAttribs[EWindowAttribsColor16MU_Scaling], matchingConfigs, 1, &numConfigs));
+    TESTL(numConfigs == 1); // Abort the test if the EGL config is not supported
+
+    const TInt KWindowWidth = iWindow.Size().iWidth;
+    const TInt KWindowHeight = iWindow.Size().iHeight;
+    const TInt KSurfaceWidth = KWindowWidth/2;
+    const TInt KSurfaceHeight = KWindowHeight/2;
+    const TInt KExtentWidth = KWindowWidth;
+    const TInt KExtentHeight = KWindowHeight;
+    const EGLint KOffsetX = 11;
+    const EGLint KOffsetY = 13;
+    EGLint attrib_list[] = {
+                  EGL_FIXED_WIDTH_NOK, KSurfaceWidth,
+                  EGL_FIXED_HEIGHT_NOK, KSurfaceHeight,
+                  EGL_TARGET_EXTENT_OFFSET_X_NOK, KOffsetX,
+                  EGL_TARGET_EXTENT_OFFSET_Y_NOK, KOffsetY,
+                  EGL_TARGET_EXTENT_WIDTH_NOK, KExtentWidth,
+                  EGL_TARGET_EXTENT_HEIGHT_NOK, KExtentHeight,
+                  EGL_NONE};
+
+    // Create the window surface and the egl context and make them current
+    iEglSess->CreateWindowSurfaceAndMakeCurrentL(matchingConfigs[0], iWindow, EFalse, EGL_OPENVG_API, 1, attrib_list);    
+
+    // First set new offset attributes (fairly simple, so should be supported)
+    INFO_PRINTF1(_L("Set new offset attributes - should succeed..."));
+    EGLint capability = -1; 	//arbitrary number beyond the existing range 
+    ASSERT_EGL_TRUE(iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, matchingConfigs[0], KSurfaceWidth, KSurfaceHeight, KExtentWidth, KExtentHeight, &capability));
+    TEST((capability == EGL_SUPPORTED_NOK) || (capability == EGL_SLOW_NOK));
+    ASSERT_EGL_TRUE(iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), KOffsetX+1, KOffsetY+1, KExtentWidth, KExtentHeight));
+    
+    // Terminate display and try again
+    INFO_PRINTF1(_L("Terminate display and try again, should fail now..."));
+    eglTerminate(iDisplay);
+
+    capability = -1; 	//arbitrary number beyond the existing range 
+    TEST(EGL_FALSE == iPfnEglQuerySurfaceScalingCapabilityNOK(iDisplay, matchingConfigs[0], KSurfaceWidth, KSurfaceHeight, KExtentWidth, KExtentHeight, &capability));
+    TEST(capability == -1); //make sure that value has not been modified
+    ASSERT_EGL_ERROR(EGL_NOT_INITIALIZED);
+    
+    TEST(EGL_FALSE == iPfnEglSetSurfaceScalingNOK(iDisplay, iEglSess->Surface(), KOffsetX, KOffsetY, KExtentWidth, KExtentHeight));
+    ASSERT_EGL_ERROR(EGL_NOT_INITIALIZED);
+    
+    // Cleanup
+    CleanAll();
+    CloseWindow();
+    
+    INFO_PRINTF1(_L("....CEglTest_SurfaceScalingNotInitialized::doTestStepL completed!"));
+    RecordTestResultL();
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+    }
+
--- a/egl/egltest/src/egltestcommonsession.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/src/egltestcommonsession.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -779,7 +779,7 @@
 	return ETrue;
 	}
 
-EXPORT_C void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, TBool aVgAlphaFormatPre, EGLenum aBindAPI, TInt aRenderVersionNumber)
+EXPORT_C void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, TBool aVgAlphaFormatPre, EGLenum aBindAPI, TInt aRenderVersionNumber, EGLint* aAttribList)
 	{
 	ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
 	ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
@@ -787,12 +787,16 @@
 	ASSERT_EGL_TRUE(eglBindAPI(aBindAPI));
 
 	// Create a Window surface from the native image
-	const EGLint* windowAttribs = (aVgAlphaFormatPre && aBindAPI == EGL_OPENVG_API) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
+	const EGLint* windowAttribs = aAttribList;
+    if(!windowAttribs)
+        {
+        windowAttribs = (aVgAlphaFormatPre && aBindAPI == EGL_OPENVG_API) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
+        }
 	iSurface = eglCreateWindowSurface(iDisplay, aConfig, &aWindow, windowAttribs);
 	ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
 
 	// Create a context for drawing to/reading from the pixmap surface and make it current
-	const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
+	const EGLint KAttribsListCtxNone[] = { EGL_NONE };
 	const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
 	const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
 	iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list_ctx);
@@ -930,7 +934,7 @@
 		}
 
 	// Create a context for drawing to/reading from the pixmap surface and make it current
-	const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
+	const EGLint KAttribsListCtxNone[] = { EGL_NONE };
 	const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
 	const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
 	iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list_ctx);
@@ -1049,7 +1053,7 @@
 	ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
 
 	// Create a context for drawing to/reading from the pixmap surface and make it current
-	const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
+	const EGLint KAttribsListCtxNone[] = { EGL_NONE };
 	const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
 	const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
 	iContext = eglCreateContext(iDisplay, config, EGL_NO_CONTEXT, attrib_list_ctx);
@@ -1080,7 +1084,7 @@
 	ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
 
 	// Create a context for drawing to/reading from the pixmap surface and make it current
-	const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
+	const EGLint KAttribsListCtxNone[] = { EGL_NONE };
 	const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
 	const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
 	iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list_ctx);
@@ -1716,7 +1720,7 @@
 			return EFalse;
 			}
 		}
-    if(aExtension & KEGL_NOK__private__signal_sync)
+    if(aExtension & KEGL_NOK__private__signal_sync || extensionName.Compare(KEglNokPrivateSignalSync)==0)
         {
         TBool bFoundExtensionEGL_NOK__private__signal_sync = FindExtensionStringL(EIsEGL,KEglNokPrivateSignalSync);
         if (!bFoundExtensionEGL_NOK__private__signal_sync)
@@ -1725,7 +1729,7 @@
             return EFalse;
             }
         }
-    if(aExtension & KEGL_NOKIA_swap_buffers)
+    if(aExtension & KEGL_NOKIA_swap_buffers || extensionName.Compare(KEglNokiaSwapBuffers)==0)
         {
         TBool bFoundExtensionEGL_NOKIA_swap_buffer = FindExtensionStringL(EIsEGL,KEglNokiaSwapBuffers);
         if (!bFoundExtensionEGL_NOKIA_swap_buffer)
@@ -1735,7 +1739,7 @@
             }
         }
 #ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
-    if(aExtension & KEGL_SYMBIAN_image_preserved)
+    if(aExtension & KEGL_SYMBIAN_image_preserved || extensionName.Compare(KEglSymbianImagePreserved)
         {
         TBool bFoundExtensionEGL_SYMBIAN_image_preserved = FindExtensionStringL(EIsEGL,KEglSymbianImagePreserved);
         if (!bFoundExtensionEGL_SYMBIAN_image_preserved)
@@ -1745,7 +1749,24 @@
             }
         }
 #endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
-
+    if(aExtension & KEGL_NOK_image_endpoint || extensionName.Compare(KEglNokiaImageEndpoint)==0)
+        {
+        TBool bFoundExtensionEGL_NOK_image_endpoint = FindExtensionStringL(EIsEGL,KEglNokiaImageEndpoint);
+        if (!bFoundExtensionEGL_NOK_image_endpoint)
+            {
+            // The extension is not supported
+            return EFalse;
+            }
+        }
+    if(aExtension & KEGL_NOK_surface_scaling || extensionName.Compare(KEglNokiaSurfaceScaling)==0)
+        {
+        TBool bFoundExtensionEGL_NOK_surface_scaling = FindExtensionStringL(EIsEGL,KEglNokiaSurfaceScaling);
+        if (!bFoundExtensionEGL_NOK_surface_scaling)
+            {
+            // The extension is not supported
+            return EFalse;
+            }
+        }
 	return ETrue;
 	}
 
@@ -1840,7 +1861,6 @@
 	TBitmapUtil bmpUtil(bitmap);
 	bmpUtil.Begin(TPoint(0,0));
 	for (TInt colIndex = 0; colIndex < width; ++colIndex)
-
 		{
 		bmpUtil.SetPos(TPoint(colIndex, 0));
 		for (TInt rowIndex =0; rowIndex < height; ++rowIndex)
--- a/egl/egltest/src/eglteststep.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/egl/egltest/src/eglteststep.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -34,6 +34,7 @@
 #include "egltest_oom_sgimage.h"
 #include "egltest_stress_sgimage.h"
 #include "egltest_benchmark_swapbuffers.h"
+#include "egltest_surfacescaling.h"
 
 /*
 Entry point from egltest to create test step
@@ -67,7 +68,7 @@
     else if (aStepName == KDisplay_OOM_ClientHeap_Initialize)                                       testStep = new CEglTest_Display_OOM_ClientHeap_Initialize;
 
 	// SyncObject tests excluding WaitFlush which requires OpenVG and OpenGL ES
-	else if (aStepName == KSyncObject_Positive_GetProcAddress)											testStep = new CEglTest_SyncObject_Positive_GetProcAddress;
+	else if (aStepName == KSyncObject_Positive_GetProcAddress)										testStep = new CEglTest_SyncObject_Positive_GetProcAddress;
 	else if (aStepName == KSyncObject_Positive_CreateDestroy)										testStep = new CEglTest_SyncObject_Positive_CreateDestroy;
 	else if (aStepName == KSyncObject_Positive_WaitSignal)											testStep = new CEglTest_SyncObject_Positive_WaitSignal;
 	else if (aStepName == KSyncObject_Positive_WaitSignal2)											testStep = new CEglTest_SyncObject_Positive_WaitSignal2;
@@ -171,5 +172,28 @@
     //Stress - SgImage
     else if (aStepName == KStress)                                                                  testStep = new CEglTest_Stress;
 
+    // Surface Scaling
+    else if (aStepName == KSurfaceScaling_Positive)                                                 testStep = new CEglTest_SurfaceScaling_Positive;
+    else if (aStepName == KSurfaceScaling_WindowResize)                                             testStep = new CEglTest_SurfaceScaling_WindowResize;
+    else if (aStepName == KSurfaceScaling_ExtentPositionChange)                                     testStep = new CEglTest_SurfaceScaling_ExtentPositionChange;
+    else if (aStepName == KSurfaceScaling_ExtentSizeChange)                                     	testStep = new CEglTest_SurfaceScaling_ExtentSizeChange;
+    else if (aStepName == KSurfaceScaling_SwapBuffers)                                     			testStep = new CEglTest_SurfaceScaling_SwapBuffers;
+    else if (aStepName == KSurfaceScaling_WindowSurface_Check)                                      testStep = new CEglTest_SurfaceScaling_WindowSurface_Check;
+	else if (aStepName == KSurfaceScaling_Negative_CreateWindowSurface)                             testStep = new CEglTest_SurfaceScaling_Negative_CreateWindowSurface;
+    else if (aStepName == KSurfaceScaling_Negative_FixedSize_NonWindowSurface)                      testStep = new CEglTest_SurfaceScaling_Negative_FixedSize_NonWindowSurface;
+    else if (aStepName == KSurfaceScalingDefaultBorderColor)                                        testStep = new CEglTest_SurfaceScalingDefaultBorderColor;
+    else if (aStepName == KSurfaceScalingModifyingBorderColor)                                      testStep = new CEglTest_SurfaceScalingModifyingBorderColor;
+    else if (aStepName == KSurfaceScalingModifyingBorderColorNonFixed)                          	testStep = new CEglTest_SurfaceScalingModifyingBorderColorNonFixed;
+    else if (aStepName == KSurfaceScalingModifyingInvalidBorderColor)                               testStep = new CEglTest_SurfaceScalingModifyingInvalidBorderColor;
+    else if (aStepName == KSurfaceScalingModifyingExtent)                                           testStep = new CEglTest_SurfaceScalingModifyingExtent;
+    else if (aStepName == KSurfaceScalingModifyingExtentNonFixed)                                   testStep = new CEglTest_SurfaceScalingModifyingExtentNonFixed;
+    else if (aStepName == KSurfaceScalingQuerySurface)                                              testStep = new CEglTest_SurfaceScalingQuerySurface;
+    else if (aStepName == KSurfaceScalingQuerySurfaceNonFixed)                                      testStep = new CEglTest_SurfaceScalingQuerySurfaceNonFixed;
+    else if (aStepName == KSurfaceScalingCapability)                                                testStep = new CEglTest_SurfaceScalingCapability;
+    else if (aStepName == KSurfaceScalingSet)                                                		testStep = new CEglTest_SurfaceScalingSet;
+    else if (aStepName == KSurfaceScalingSetNonFixed)                              					testStep = new CEglTest_SurfaceScalingSetNonFixed;
+    else if (aStepName == KSurfaceScalingSetInvalidAttributes)                                      testStep = new CEglTest_SurfaceScalingSetInvalidAttributes;
+    else if (aStepName == KSurfaceScalingNotInitialized)                                      		testStep = new CEglTest_SurfaceScalingNotInitialized;
+		
 	return testStep;
 	}
--- a/fbs/fontandbitmapserver/bwins/FBSCLI2U.DEF	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/bwins/FBSCLI2U.DEF	Wed Aug 18 11:05:09 2010 +0300
@@ -229,4 +229,19 @@
 	?CreateExtendedBitmap@CFbsBitmap@@QAEHABVTSize@@W4TDisplayMode@@VTUid@@PBXH@Z @ 228 NONAME ; int CFbsBitmap::CreateExtendedBitmap(class TSize const &, enum TDisplayMode, class TUid, void const *, int)
 	?UpdateLinkedTypeface@CFbsTypefaceStore@@QAEHABVCLinkedTypefaceSpecification@@@Z @ 229 NONAME ; int CFbsTypefaceStore::UpdateLinkedTypeface(class CLinkedTypefaceSpecification const &)
 	?GetExtraBuffer@CFbsBitmap@@SAPAVHBufC8@@H@Z @ 230 NONAME ; class HBufC8 * CFbsBitmap::GetExtraBuffer(int)
+	?Rect@RFbsGlyphDataIterator@@QBEABVTRect@@XZ @ 231 NONAME ; class TRect const & RFbsGlyphDataIterator::Rect(void) const
+	?Image@RFbsGlyphDataIterator@@QBEABVRSgImage@@XZ @ 232 NONAME ; class RSgImage const & RFbsGlyphDataIterator::Image(void) const
+	??0RFbsGlyphMetricsArray@@QAE@XZ @ 233 NONAME ; RFbsGlyphMetricsArray::RFbsGlyphMetricsArray(void)
+	?Count@RFbsGlyphMetricsArray@@QBEHXZ @ 234 NONAME ; int RFbsGlyphMetricsArray::Count(void) const
+	?Next@RFbsGlyphDataIterator@@QAEHXZ @ 235 NONAME ; int RFbsGlyphDataIterator::Next(void)
+	?Metrics@RFbsGlyphDataIterator@@QBEABVTOpenFontCharMetrics@@XZ @ 236 NONAME ; class TOpenFontCharMetrics const & RFbsGlyphDataIterator::Metrics(void) const
+	?Close@RFbsGlyphMetricsArray@@QAEXXZ @ 237 NONAME ; void RFbsGlyphMetricsArray::Close(void)
+	??0RFbsGlyphDataIterator@@QAE@XZ @ 238 NONAME ; RFbsGlyphDataIterator::RFbsGlyphDataIterator(void)
+	??ARFbsGlyphMetricsArray@@QBEABVTOpenFontCharMetrics@@H@Z @ 239 NONAME ; class TOpenFontCharMetrics const & RFbsGlyphMetricsArray::operator[](int) const
+	?GlyphCode@RFbsGlyphDataIterator@@QBEIXZ @ 240 NONAME ; unsigned int RFbsGlyphDataIterator::GlyphCode(void) const
+	?Close@RFbsGlyphDataIterator@@QAEXXZ @ 241 NONAME ; void RFbsGlyphDataIterator::Close(void)
+	?Get@RFbsGlyphMetricsArray@@QAEHAAVCFbsFont@@PBIH@Z @ 242 NONAME ; int RFbsGlyphMetricsArray::Get(class CFbsFont &, unsigned int const *, int)
+	?Open@RFbsGlyphDataIterator@@QAEHAAVCFbsFont@@PBIH@Z @ 243 NONAME ; int RFbsGlyphDataIterator::Open(class CFbsFont &, unsigned int const *, int)
+	?GetGlyphCacheMetrics@RFbsSession@@QAEHAAVTGlyphCacheMetrics@@@Z @ 244 NONAME ; int RFbsSession::GetGlyphCacheMetrics(class TGlyphCacheMetrics &)
+	?ConveyOogmMessage@RFbsSession@@QAEHAAVTFbsOogmMessage@@@Z @ 245 NONAME ; int RFbsSession::ConveyOogmMessage(class TFbsOogmMessage &)
 
--- a/fbs/fontandbitmapserver/bwins/fbservu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/bwins/fbservu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 EXPORTS
 	?KFbServSharedHeapMaxSize@@3HB @ 1 NONAME ; int const KFbServSharedHeapMaxSize
 	?KFbServWritableDataPagingMode@@3HB @ 2 NONAME ; int const KFbServWritableDataPagingMode
+	?KFbServGlyphAtlasCacheLimit@@3HB @ 3 NONAME ; int const KFbServGlyphAtlasCacheLimit
 
--- a/fbs/fontandbitmapserver/eabi/FBSCLI2U.DEF	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/eabi/FBSCLI2U.DEF	Wed Aug 18 11:05:09 2010 +0300
@@ -264,4 +264,21 @@
 	_ZNK10CFbsBitmap8DataSizeEv @ 263 NONAME
 	_ZN17CFbsTypefaceStore20UpdateLinkedTypefaceERK28CLinkedTypefaceSpecification @ 264 NONAME
 	_ZN10CFbsBitmap14GetExtraBufferEi @ 265 NONAME
+	_ZN21RFbsGlyphDataIterator4NextEv @ 266 NONAME
+	_ZN21RFbsGlyphDataIterator4OpenER8CFbsFontPKji @ 267 NONAME
+	_ZN21RFbsGlyphDataIterator5CloseEv @ 268 NONAME
+	_ZN21RFbsGlyphDataIteratorC1Ev @ 269 NONAME
+	_ZN21RFbsGlyphDataIteratorC2Ev @ 270 NONAME
+	_ZN21RFbsGlyphMetricsArray3GetER8CFbsFontPKji @ 271 NONAME
+	_ZN21RFbsGlyphMetricsArray5CloseEv @ 272 NONAME
+	_ZN21RFbsGlyphMetricsArrayC1Ev @ 273 NONAME
+	_ZN21RFbsGlyphMetricsArrayC2Ev @ 274 NONAME
+	_ZNK21RFbsGlyphDataIterator4RectEv @ 275 NONAME
+	_ZNK21RFbsGlyphDataIterator5ImageEv @ 276 NONAME
+	_ZNK21RFbsGlyphDataIterator7MetricsEv @ 277 NONAME
+	_ZNK21RFbsGlyphDataIterator9GlyphCodeEv @ 278 NONAME
+	_ZNK21RFbsGlyphMetricsArray5CountEv @ 279 NONAME
+	_ZNK21RFbsGlyphMetricsArrayixEi @ 280 NONAME
+	_ZN11RFbsSession20GetGlyphCacheMetricsER18TGlyphCacheMetrics @ 281 NONAME
+	_ZN11RFbsSession17ConveyOogmMessageER15TFbsOogmMessage @ 282 NONAME
 
--- a/fbs/fontandbitmapserver/eabi/fbservu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/eabi/fbservu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 EXPORTS
 	KFbServSharedHeapMaxSize @ 1 NONAME DATA 4
 	KFbServWritableDataPagingMode @ 2 NONAME DATA 4
+	KFbServGlyphAtlasCacheLimit @ 3 NONAME DATA 4
 
--- a/fbs/fontandbitmapserver/group/BLD.INF	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/BLD.INF	Wed Aug 18 11:05:09 2010 +0300
@@ -34,13 +34,18 @@
 ../inc/fbsrasterizerclearcache.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/fbsrasterizerclearcache.h)
 ../inc/bitmapuid.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/bitmapuid.h)
 ../inc/fbsdefs.h    SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(graphics/fbsdefs.h)
+../sfbs/fbsglyphdataiterator.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/fbsglyphdataiterator.h)
+../sfbs/fbsglyphmetricsarray.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/fbsglyphmetricsarray.h)
+../sfbs/fbsoogmmessage.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/fbsoogmmessage.h)
+../sfbs/fbsoogmmessage.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/fbsoogmmessage.inl)
+
 
 ../bwins/fbsrasterizeru.def /epoc32/include/graphics/def/bwins/fbsrasterizeru.def
 ../eabi/fbsrasterizeru.def /epoc32/include/graphics/def/eabi/fbsrasterizeru.def
 
 ../group/fbserv.iby        	/epoc32/rom/include/fbserv.iby
 ../group/fbsrasterizer_stub.iby	/epoc32/rom/include/fbsrasterizer_stub.iby
-
+../group/fbsoogmplugin.iby	/epoc32/rom/include/fbsoogmplugin.iby
 
 PRJ_MMPFILES
 
@@ -48,6 +53,7 @@
 ../group/FBSERV.MMP
 ../group/fbsrasterizerlib.mmp
 ../group/stubrasterizer.mmp
+//../group/fbsoogmplugin.mmp
 
 PRJ_TESTEXPORTS
 
@@ -84,6 +90,11 @@
 ../tfbs/scripts/fbstest_T_WDP_page_bitmap_data_and_shared_heap_only.script	z:/fbstest/fbstest_t_wdp_page_bitmap_data_and_shared_heap_only.script
 ../tfbs/scripts/extendedbitmap_config.ini						z:/fbstest/extendedbitmap_config.ini
 ../tfbs/scripts/wdptest_config.ini								z:/fbstest/wdptest_config.ini
+../tfbs/scripts/fbstest_t_glyphdata.script						z:/fbstest/fbstest_t_glyphdata.script
+../tfbs/scripts/glyphdata_config.ini						z:/fbstest/glyphdata_config.ini
+../tfbs/scripts/fbstest_t_glyphdataoutlineshadow.script				z:/fbstest/fbstest_t_glyphdataoutlineshadow.script
+../tfbs/scripts/fbstest_t_oogm.script						z:/fbstest/fbstest_t_oogm.script
+
 
 // Fbserv WDP Alloc stress test
 ../tfbs/scripts/fbstest_T_WDP_Alloc_Stress.script			z:/fbstest/fbstest_t_wdp_alloc_stress.script
--- a/fbs/fontandbitmapserver/group/FBSCLI.MMP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/FBSCLI.MMP	Wed Aug 18 11:05:09 2010 +0300
@@ -28,7 +28,9 @@
 SOURCEPATH      ../sfbs
 
 userinclude     ../inc
+userinclude     ../traces
 
+OS_LAYER_SYSTEMINCLUDE
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
 source          BITBMP.CPP
@@ -46,6 +48,8 @@
 source          ShiftedFileStore.cpp
 source          BitmapCompr.cpp
 source          patchableconstantscli.cpp
+source          fbsglyphdataiterator.cpp
+source          fbsglyphmetricsarray.cpp
 
 library         euser.lib
 library         efsrv.lib
@@ -56,6 +60,7 @@
 library         palette.lib
 library         lookuptable.lib
 library         hal.lib
+library         sgresource.lib
 #if !defined(WINS)
 library         fbsrasterizer.lib
 #endif
--- a/fbs/fontandbitmapserver/group/FBSERV.MMP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/FBSERV.MMP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -35,7 +35,9 @@
 
 userinclude     ../inc
 userinclude     ../sfbs
+userinclude     ../traces
 
+OS_LAYER_SYSTEMINCLUDE
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 OS_LAYER_ESTLIB_SYSTEMINCLUDE
 
@@ -49,7 +51,8 @@
 source          FBSMBMC.CPP
 source          ShiftedFileStore.cpp
 source          HASHMAP.CPP
-source			patchableconstants.cpp
+source		patchableconstants.cpp
+source          glyphatlas.cpp
 
 library         euser.lib
 library         efsrv.lib
@@ -59,6 +62,7 @@
 library         estor.lib
 library         ecom.lib
 library         hal.lib
+library         sgresource.lib
 
 start wins
 baseaddress     0x41500000
--- a/fbs/fontandbitmapserver/group/FbservTest.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/FbservTest.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -19,36 +19,45 @@
 #define __FBSERVTEST_IBY__
 
 #include <graphics_testharness.iby>
-#include <internaltestfonts.iby>  
+#include <graphics_testfontutils.iby>
+#include <internaltestfonts.iby>
+#include <egl.iby>
+#include <openvg.iby>
 
 // batch file that runs all automatic fbserv tests
 data=DATAZ_\fbstest\fbstest_run.bat		\fbstest_run.bat
 data=DATAZ_\fbstest\fbstest.bat			\fbstest.bat
 
 //script files
-data=DATAZ_\fbstest\fbstest_T_All.script						\fbstest\fbstest_T_All.script
-data=DATAZ_\fbstest\fbstest_T_Alloc.script						\fbstest\fbstest_T_Alloc.script
+data=DATAZ_\fbstest\fbstest_T_All.script					\fbstest\fbstest_T_All.script
+data=DATAZ_\fbstest\fbstest_T_Alloc.script					\fbstest\fbstest_T_Alloc.script
 data=DATAZ_\fbstest\fbstest_T_Alloc.ini						\fbstest\fbstest_T_Alloc.ini
-data=DATAZ_\fbstest\fbstest_T_Bitmap.script						\fbstest\fbstest_T_Bitmap.script
-data=DATAZ_\fbstest\fbstest_T_Fbs.script						\fbstest\fbstest_T_Fbs.script
+data=DATAZ_\fbstest\fbstest_T_Bitmap.script					\fbstest\fbstest_T_Bitmap.script
+data=DATAZ_\fbstest\fbstest_T_Fbs.script					\fbstest\fbstest_T_Fbs.script
 data=DATAZ_\fbstest\fbstest_T_Compressed.script					\fbstest\fbstest_T_Compressed.script
-data=DATAZ_\fbstest\fbstest_T_Ralc.script						\fbstest\fbstest_T_Ralc.script
-data=DATAZ_\fbstest\fbstest_T_Defect.script						\fbstest\fbstest_T_Defect.script
+data=DATAZ_\fbstest\fbstest_T_Ralc.script					\fbstest\fbstest_T_Ralc.script
+data=DATAZ_\fbstest\fbstest_T_Defect.script					\fbstest\fbstest_T_Defect.script
 data=DATAZ_\fbstest\fbstest_T_StreamIdCache.script				\fbstest\fbstest_T_StreamIdCache.script
-data=DATAZ_\fbstest\fbstest_T_Secure.script						\fbstest\fbstest_T_Secure.script
-data=DATAZ_\fbstest\fbstest_T_File.script						\fbstest\fbstest_T_File.script
-data=DATAZ_\fbstest\fbstest_t_getallbitmapscapability.script	\fbstest\fbstest_t_getallbitmapscapability.script
-data=DATAZ_\fbstest\fbstest_T_Clean.script						\fbstest\fbstest_T_Clean.script
+data=DATAZ_\fbstest\fbstest_T_Secure.script					\fbstest\fbstest_T_Secure.script
+data=DATAZ_\fbstest\fbstest_T_File.script					\fbstest\fbstest_T_File.script
+data=DATAZ_\fbstest\fbstest_t_getallbitmapscapability.script			\fbstest\fbstest_t_getallbitmapscapability.script
+data=DATAZ_\fbstest\fbstest_T_Clean.script					\fbstest\fbstest_T_Clean.script
 data=DATAZ_\fbstest\fbstest_t_fonttable.script					\fbstest\fbstest_t_fonttable.script
 data=DATAZ_\fbstest\fbstest_T_IPCTest.script					\fbstest\fbstest_T_IPCTest.script
-data=DATAZ_\fbstest\ipctest_config.ini							\fbstest\ipctest_config.ini
+data=DATAZ_\fbstest\ipctest_config.ini						\fbstest\ipctest_config.ini
 data=DATAZ_\fbstest\fbstest_t_extendedbitmap.script				\fbstest\fbstest_t_extendedbitmap.script
 data=DATAZ_\fbstest\extendedbitmap_config.ini					\fbstest\extendedbitmap_config.ini
 data=DATAZ_\fbstest\fbstest_T_WDP_pagedata.script				\fbstest\fbstest_T_WDP_pagedata.script
 data=DATAZ_\fbstest\fbstest_T_WDP_unpagedata.script				\fbstest\fbstest_T_WDP_unpagedata.script
-data=DATAZ_\fbstest\fbstest_T_WDP_page_bitmap_data_only.script	\fbstest\fbstest_T_WDP_page_bitmap_data_only.script
-data=DATAZ_\fbstest\fbstest_T_WDP_page_bitmap_data_and_shared_heap_only.script		\fbstest\fbstest_T_WDP_page_bitmap_data_and_shared_heap_only.script
-data=DATAZ_\fbstest\wdptest_config.ini						    \fbstest\wdptest_config.ini
+data=DATAZ_\fbstest\fbstest_T_WDP_page_bitmap_data_only.script			\fbstest\fbstest_T_WDP_page_bitmap_data_only.script
+data=DATAZ_\fbstest\fbstest_t_oogm.script					\fbstest\fbstest_t_oogm.script
+data=DATAZ_\fbstest\fbstest_T_WDP_page_bitmap_data_and_shared_heap_only.script	\fbstest\fbstest_T_WDP_page_bitmap_data_and_shared_heap_only.script
+data=DATAZ_\fbstest\wdptest_config.ini						\fbstest\wdptest_config.ini
+
+REM GPU Glyph caching tests
+data=DATAZ_\fbstest\fbstest_t_glyphdata.script		\fbstest\fbstest_t_glyphdata.script
+data=DATAZ_\fbstest\glyphdata_config.ini					\fbstest\glyphdata_config.ini
+data=DATAZ_\fbstest\fbstest_t_glyphdataoutlineshadow.script		\fbstest\fbstest_t_glyphdataoutlineshadow.script
 
 // Fbserv WDP Alloc stress test
 data=DATAZ_\fbstest\fbstest_T_WDP_Alloc_Stress.script				\fbstest\fbstest_T_WDP_Alloc_Stress.script
--- a/fbs/fontandbitmapserver/group/TFbsServer.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/TFbsServer.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -27,14 +27,15 @@
 
 CAPABILITY       All -Tcb -AllFiles
 
-userinclude		../../../graphicstest/graphicstestharness/inc
-userinclude		../tfbs ../sfbs ../inc 
+userinclude		../tfbs 
+userinclude		../sfbs 
+userinclude		../inc 
 userinclude		../trasterizer/src
+userinclude		../traces
 
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 OS_LAYER_ESTLIB_SYSTEMINCLUDE
 
-SOURCEPATH  .
 SOURCEPATH  ../tfbs
 SOURCE		TFbsServer.cpp
 SOURCE		TALLOC.CPP
@@ -56,12 +57,19 @@
 SOURCE 		textendedbitmappanic.cpp
 SOURCE 		twdp.cpp
 SOURCE		tfonttableandglyph.cpp
+SOURCE  	tfbsglyphdata.cpp
+SOURCE 		tfbsglyphdatapanic.cpp 
+SOURCE 		tfbsglyphdataoutlineshadow.cpp
+SOURCE  	tglyphatlas.cpp
+SOURCE		tfbsoogm.cpp
+SOURCE  	glyphatlastestwrapper.cpp
 
 
 SOURCEPATH		../sfbs
 SOURCE			FbsRalc.cpp
 SOURCE			FBSMBMC.CPP
 SOURCE			ShiftedFileStore.cpp
+SOURCE			glyphatlas.cpp
 
 
 LIBRARY			euser.lib
@@ -75,9 +83,13 @@
 library			bitgdi.lib
 LIBRARY	    	testexecuteutils.lib 
 LIBRARY	    	tgraphicsharness.lib
+LIBRARY			tgraphicsfontutils.lib
 LIBRARY	    	testexecutelogclient.lib
 library			lookuptable.lib
 LIBRARY			hal.lib
+LIBRARY			sgresource.lib
+LIBRARY			libEGL.lib
+LIBRARY			libOpenVG.lib
 
 #if defined(WINS)
 LIBRARY			fontinjector.lib
@@ -87,3 +99,5 @@
 EPOCSTACKSIZE	0xf000
 
 SMPSAFE
+
+
--- a/fbs/fontandbitmapserver/group/fbserv.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/fbserv.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -58,4 +58,6 @@
 #include <graphics_adaptation.hby>
 #include FBSRASTERIZER_DRV
 
+//#include <fbsoogmplugin.iby>
+
 #endif //__FBSERV_IBY__
--- a/fbs/fontandbitmapserver/group/fbservtest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/group/fbservtest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -35,7 +35,8 @@
 
 "\epoc32\data\z\fbstest\fbstest_T_Alloc.script"-"c:\fbstest\fbstest_T_Alloc.script"
 "\epoc32\data\z\fbstest\fbstest_T_Bitmap.script"-"c:\fbstest\fbstest_T_Bitmap.script"
-"\epoc32\data\z\fbstest\fbstest_T_Fbs.script"-"c:\fbstest\fbstest_T_Fbs.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\fbstest\fbstest_T_Fbs.script"-"c:\fbstest\fbstest_T_Fbs.script"
 "\epoc32\data\z\fbstest\fbstest_T_Compressed.script"-"c:\fbstest\fbstest_T_Compressed.script"
 "\epoc32\data\z\fbstest\fbstest_T_Ralc.script"-"c:\fbstest\fbstest_T_Ralc.script"
 "\epoc32\data\z\fbstest\fbstest_T_Defect.script"-"c:\fbstest\fbstest_T_Defect.script"
@@ -49,4 +50,7 @@
 "\epoc32\data\z\fbstest\ipctest_config.ini"-"c:\fbstest\ipctest_config.ini"
 "\epoc32\data\z\fbstest\fbstest_t_extendedbitmap.script"-"c:\fbstest\fbstest_t_extendedbitmap.script"
 "\epoc32\data\z\fbstest\extendedbitmap_config.ini"-"c:\fbstest\extendedbitmap_config.ini"
+"\epoc32\data\z\fbstest\fbstest_t_glyphdata.script"-"c:\fbstest\fbstest_t_glyphdata.script"
+"\epoc32\data\z\fbstest\glyphdata_config.ini"-"c:\fbstest\glyphdata_config.ini"
+"\epoc32\data\z\fbstest\fbstest_t_glyphdataoutlineshadow.script"-"c:\fbstest\fbstest_t_glyphdataoutlineshadow.script"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/group/fbsoogmplugin.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#ifndef __FBSOOGMPLUGIN_IBY__
+#define __FBSOOGMPLUGIN_IBY__
+
+ECOM_PLUGIN(fbsoogmplugin.dll, fbsoogmplugin.rsc)
+
+#endif // __FBSOOGMPLUGIN_IBY__
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/group/fbsoogmplugin.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This is the .mmp for building font and bitmap server  out-of-graphics-memory Plugin
+*/
+
+
+
+#include <data_caging_paths.hrh>
+#include <platform_paths.hrh>
+
+
+TARGET      		fbsoogmplugin.dll
+TARGETTYPE 		PLUGIN
+UID			0x10009d8d 0x2002B638
+
+CAPABILITY  		CAP_ECOM_PLUGIN 
+VENDORID    		0x70000001
+
+// This is a SYSTEMINCLUDE macro containing the middleware
+// layer specific include directories
+MW_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE		.
+USERINCLUDE		../inc
+USERINCLUDE		../sfbs 
+USERINCLUDE		../traces
+
+TARGETPATH		 /sys/bin  
+SOURCEPATH		../sfbs
+
+SOURCE			fbsoogmplugin.cpp
+
+START RESOURCE		fbsoogmplugin.rss
+TARGET			fbsoogmplugin.rsc
+END
+
+LIBRARY			ecom.lib
+LIBRARY			euser.lib
+LIBRARY			goommonitor.lib
+LIBRARY			fbscli.lib
+
--- a/fbs/fontandbitmapserver/inc/FBS.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/inc/FBS.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -40,6 +40,15 @@
 */
 #define SYMBIAN_FBSERV_V2
 
+/**
+Indicates version of FBS that provides the CFbsFont extension 
+interfaces RFbsGlyphDataIterator for using hardware glyphs, and
+RFbsGlyphMetricsArray.
+@publishedAll
+@prototype
+*/
+//#define SYMBIAN_FBSERV_GLYPHDATA
+
 /** 
 Character width and adjustment information. 
 @publishedAll
@@ -61,6 +70,8 @@
 class CFbsRalCache;
 class CFbsSessionHelper;
 class CFbsRasterizer;
+class TGlyphCacheMetrics;
+class TFbsOogmMessage;
 
 /** 
 A session with the font and bitmap server. 
@@ -101,6 +112,9 @@
 	HBufC8* GetDecompressionBuffer(TInt aSize);
 	HBufC8* GetExtraBuffer(TInt aSize);
     TInt ServerSessionHandle() const;
+    IMPORT_C TInt GetGlyphCacheMetrics(TGlyphCacheMetrics& aGlyphCacheMetrics);
+    IMPORT_C TInt ConveyOogmMessage( TFbsOogmMessage& aOogmMessage );
+
 public:
 	/** WARNING: For internal use ONLY.  Compatibility is not guaranteed in future releases.	 
 	Used for testing server side out of memory failures.	
@@ -149,6 +163,8 @@
 class CFbsFont: public CFont
 	{
 	friend class CFbsTypefaceStore;
+	friend class RFbsGlyphDataIterator;
+	friend class RFbsGlyphMetricsArray;
 
 private:
 	// From CFont
@@ -208,7 +224,7 @@
 	RFbsSession* iFbs;
 	CBitmapFont* iAddressPointer;
 	TInt iHandle;
-	TInt iServerHandle;
+    TInt iServerHandle;
 	};
 
 /**
@@ -505,4 +521,22 @@
 	CDitherColor256* iDither;
 	};
 
-#endif
+
+/**
+ A class encapsulating the current state of the glyph cache.
+
+ @publishedAll
+ @released
+*/
+class TGlyphCacheMetrics
+    {
+public:
+    TInt iMaxCacheSizeInBytes;
+    TInt iMaxCacheSizeHigh;
+    TInt iMaxCacheSizeLow;
+    TInt iCacheSizeInBytes;
+    TBool iGpuCacheSizeLimitIsMax;
+    };
+
+#endif // __FBS_H__
+
--- a/fbs/fontandbitmapserver/inc/FbsMessage.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/inc/FbsMessage.H	Wed Aug 18 11:05:09 2010 +0300
@@ -74,7 +74,7 @@
 	EFbsMessSetHeapReset, //for memory testing only
 	EFbsMessSetHeapCheck, //for memory testing only
 	EFbsMessHeap, //for memory testing only
-	EFbsMessUnused2, //to put a character in the linked fonts cache
+	EFbsMessUnused2, //Implementation removed
 	EFbsMessBitmapClean, // replace a dirty bitmap with the clean one
 	EFbsMessBitmapLoadFast, // for loading bitmap from mbm or rsc file not opened by the client
 	EFbsMessBitmapNotifyDirty, // notify when any bitmap becomes dirty
@@ -87,6 +87,13 @@
 	EFbsMessReleaseFontTable,
 	EFbsMessGetGlyphOutline,
 	EFbsMessReleaseGlyphOutline,
+	EFbsMessGetGlyphs, // Retrieve rasterised glyphs from glyph atlas and closes last glyph retrieved
+	EFbsMessNoOp, // No-op call; used to ensure that the RSgImage of the last glyph retrieved from glyph atlas has been closed
+	EFbsMessGetGlyphMetrics, // Retrieve metrics of multiple glyph codes in one message
+	EFbsMessAtlasFontCount, // (Debug-only) Retrieve the number of fonts with glyphs in the H/W Glyph cache
+	EFbsMessAtlasGlyphCount, // (Debug-only) Retrieve the number of glyphs (optionally, given a specific font) stored in the H/W Glyph cache
+	EFbsMessOogmNotification, // An action requested by the GOoM framework. Reduce or re-instate graphics memory usage.
+	EFbsMessGetGlyphCacheMetrics, // Retrieve the glyph-cache size, its maximum limit and whether the maximum is the reduced value used in OoGm situations.
 	// If you are adding new messages don't forget to check that the 
 	// security permissions are set correctly (KRanges & KElementsIndex in server.cpp)
 	};
--- a/fbs/fontandbitmapserver/sfbs/FBSCLI.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/FBSCLI.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -16,11 +16,20 @@
 #include <fntstore.h>
 #include <bitmap.h>
 #include <openfont.h>
+#include <graphics/fbsoogmmessage.h>
 #include "FbsMessage.H"
 #include "SERVER.H"
 #include "BackGroundCompression.h"
 #include <shapeinfo.h>
 #include <graphics/shaperparams.h>
+#include "glyphatlas.h"
+
+
+/**
+Bitwise mask that sets the MSB to indicate to a font rasterizer
+that a code is a glyphcode and not a character code
+*/
+const TUint32 KTreatAsGlyphCodeFlag = 1UL << 31;
 
 /** Helper function for converting a pointer to an offset from the passed
 heap base. Use OffsetToPointer() to convert the returned offset back to a
@@ -33,11 +42,12 @@
  */
 LOCAL_C TInt PointerToOffset(const TAny* aAny, TInt aHeapBase)
 	{
+	TInt offset = 0;
 	if (aAny && aHeapBase)
 		{
-		return reinterpret_cast<TInt>(aAny) - aHeapBase;
+		offset = reinterpret_cast<TInt>(aAny) - aHeapBase;
 		}
-	return 0;
+	return offset;
 	}
 
 /** Helper function for converting an offset (that was calculated using
@@ -58,9 +68,6 @@
 
 CFbClient::CFbClient(RHeap* aHeap):
 	CSession2(),
-	iConnectionHandle(0),
-	iIx(NULL),
-	iResourceCount(0),
 	iHeap(aHeap)
 #ifdef _DEBUG
 	,iOwnHeapFailNumber(-1),
@@ -71,14 +78,24 @@
 
 CFbClient* CFbClient::NewL(RHeap* aHeap)
 	{
-	CFbClient* c = new(ELeave) CFbClient(aHeap);
-	c->iOpenFontGlyphData = TOpenFontGlyphData::New(aHeap,4 * 1024);
-	if (!c->iOpenFontGlyphData)
+	CFbClient* self = new (ELeave) CFbClient(aHeap);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(); // self;
+	return self;
+	}
+
+/**
+Two-phase constructor.
+@leave KErrNoMemory if TOpenFontGlyphData construction failed.
+*/
+void CFbClient::ConstructL()
+	{
+	iOpenFontGlyphData = TOpenFontGlyphData::New(iHeap, 4 * 1024);
+	if (!iOpenFontGlyphData)
 		{
-		delete c;
 		User::Leave(KErrNoMemory);
 		}
-	return c;
 	}
 
 CFbClient::~CFbClient()
@@ -103,24 +120,32 @@
 		iHeap->Free(iOpenFontGlyphData);
 		}
 	
-	// delete fonts hold by the client
+	// delete fonts held by the client
 	delete iIx;
 	
-	// delete font files hold by the client
+	// delete font files held by the client
 	if (iFontFileIndex)
 		{
 		TInt count = iFontFileIndex->Count();
 		for (TInt index = 0;index < count; index++)
 			{
 			if (font_store)
+				{
 				font_store->RemoveFile(iFontFileIndex->At(0).iUid);
+				}
 			iFontFileIndex->Delete(0);
 			}
 		delete iFontFileIndex;
 		}
 
-	// Close the buffer used to hold the text thats needs shaping.
+	// Close the buffer used to hold the text that needs shaping.
 	iTextToShape.Close();
+
+	for (TInt i = iGlyphImagesInTransit.Count() - 1; i >= 0; --i)
+		{
+		iGlyphImagesInTransit[i].Close();
+		}
+	iGlyphImagesInTransit.Close();
 	}
 
 void CFbClient::Init(TUint aConnectionHandle)
@@ -143,9 +168,13 @@
 	{
 	CFontBitmapServer* server = FontBitmapServer();
 	if (server)
+		{
 		return server->TopLevelStore();
+		}
 	else
+		{
 		return NULL;
+		}
 	}
 
 void CFbClient::CopyFontInfo(CFontObject* aFontObjPtr,TInt aHandle,TFontInfo& aFontInfo)
@@ -158,6 +187,7 @@
 
 void CFbClient::ServiceL(const RMessage2& aMessage)
 	{
+
 #ifdef _DEBUG
 	TBool resetOwnHeap=EFalse;
 	TBool resetSharedHeap=EFalse;
@@ -189,6 +219,14 @@
 		__RHEAP_MARK(iHeap);
 		}		
 #endif		
+	//Call close on RSgImage handles being used to share glyph data with clients.
+	//The glyph images are held open to prevent the GlyphAtlas from closing them
+	//before a client can use them.
+	for (TInt i = iGlyphImagesInTransit.Count() - 1; i >= 0; --i)
+		{
+		iGlyphImagesInTransit[i].Close();
+		iGlyphImagesInTransit.Remove(i);
+		}
 	
 	switch(aMessage.Function())
 		{
@@ -246,6 +284,7 @@
 	case EFbsMessFetchLinkedTypeface:
 	case EFbsMessRegisterLinkedTypeface:
 	case EFbsMessUpdateLinkedTypeface:
+
 #ifdef _DEBUG
 		FontBitmapServer()->ProcMessage(aMessage,iSessionHandle,iRet);
 #else
@@ -277,6 +316,8 @@
 #if (_DEBUG)
 	case EFbsMessSetDuplicateFail:
 #endif
+	case EFbsMessGetGlyphs:
+	case EFbsMessGetGlyphMetrics:
 		ProcFontMessage(aMessage);
 		break;
 // bitmap messages
@@ -305,6 +346,31 @@
 		aMessage.Complete(KErrNone);
 #endif	
 		break;
+// Glyph Atlas messages (debug-only)
+	case EFbsMessAtlasFontCount:
+	case EFbsMessAtlasGlyphCount:
+#ifdef _DEBUG
+		ProcAtlasMessage(aMessage);
+#else
+		aMessage.Complete(KErrNotSupported);
+#endif
+		break;
+    case EFbsMessOogmNotification:
+
+        aMessage.Complete( HandleMesgOogmStatus( aMessage ) );
+        break;
+    case EFbsMessGetGlyphCacheMetrics:
+
+        HandleMesgGlyphCacheMetrics( aMessage );
+        break;
+
+//No-op message
+	case EFbsMessNoOp:
+#ifdef _DEBUG
+		iRet = KErrNone;
+#endif
+		aMessage.Complete(KErrNone);
+		break;
 	default:
 		aMessage.Panic(KFBSERVPanicCategory,KErrArgument);
 		break;
@@ -372,7 +438,9 @@
 	{
 #if _DEBUG
 	if (iFontDuplicateToFail)
+		{
 		return KErrNoMemory; //return with this error since this error is possible
+		}
 #endif
 	CFontObject* fontptr = (CFontObject*) aMessage.Int0();
 	if(!TopLevelStore()->ValidFontHandle((TInt)fontptr))
@@ -380,7 +448,7 @@
 		return KErrUnknown;
 		}
 
-	TPckgBuf<TFontInfo> foninfo;
+	TPckgBuf<TFontInfo> fontinfo;
 	TInt localhandle = 0;
 	TInt ret = fontptr->Open();
 	if (ret != KErrNone)
@@ -393,9 +461,9 @@
 		fontptr->Close();
 		return ret;
 		}
-	CopyFontInfo(fontptr,localhandle,foninfo());
+	CopyFontInfo(fontptr,localhandle,fontinfo());
 	fontptr->iHeightInTwips = ((fontptr->iAddressPointer->HeightInPixels() * fontptr->iFontStore->iKPixelHeightInTwips) + 667) / 1000;
-	ret = aMessage.Write(1, foninfo);
+	ret = aMessage.Write(1, fontinfo);
 	if(ret != KErrNone)
 		{
 		iIx->Remove(localhandle);
@@ -422,14 +490,14 @@
 	TInt pckgMaxHeight;
 	TPckgBuf<TSizeInfo> info;
 
-	const TFbsMessage	fbsMessage = static_cast<TFbsMessage>(aMessage.Function());
+	const TFbsMessage fbsMessage = static_cast<TFbsMessage>(aMessage.Function());
 
 	TInt ret = aMessage.Read(0, pckgFontSpec);
 	TFontSpec& fontSpec = pckgFontSpec();
 	if (ret == KErrNone )
 		{
 		TInt length = fontSpec.iTypeface.iName.Length();
-		if(length < 0 || length > TOpenFontFaceAttribBase::ENameLength)
+		if((length < 0) || (length > TOpenFontFaceAttribBase::ENameLength))
 			{
 			aPanicRequired = ETrue;
 			return KErrArgument;
@@ -644,6 +712,183 @@
 	return EFalse;
 	}
 
+/** Handler for EFbsMessGetGlyphs message.
+Reads a batch of up to KMaxGlyphBatchSize glyph codes, and on success returns
+the corresponding TGlyphImageInfo objects.
+ @param aMessage input parameters
+ @param aPanicRequired flag that is set if a client panic is required
+ @return KErrNone if successful, otherwise any system-wide error code.
+ */
+TInt CFbClient::HandleMesgGetGlyphs(const RMessage2& aMessage, TBool& aPanicRequired)
+	{
+	CFbTop* fbtop = TopLevelStore();
+	// Previously requested glyphs were closed in ServiceL()
+	CGlyphAtlas* glyphAtlas = fbtop->GlyphAtlas();
+	if (!glyphAtlas)
+		{
+		return KErrNotSupported;
+		}
+	CFontObject* fontptr = static_cast<CFontObject*>(iIx->At(aMessage.Int0(), fbtop->FontConUniqueID()));
+	if(!fontptr)
+		{
+		aPanicRequired = ETrue;
+		return KErrBadHandle;
+		}
+
+	TUint glyphCodes[KMaxGlyphBatchSize];
+	TGlyphImageInfo glyphImageInfo[KMaxGlyphBatchSize];
+	TPckg<TUint[KMaxGlyphBatchSize]> glyphBatchPckg(glyphCodes);
+
+	TInt err = aMessage.Read(1, glyphBatchPckg);
+	if (err != KErrNone)
+		{
+		aPanicRequired = ETrue;
+		return err;
+		}
+	TInt glyphCodesCount = glyphBatchPckg.Length() / sizeof(TUint);
+	if (glyphCodesCount > KMaxGlyphBatchSize)
+		{
+		aPanicRequired = ETrue;
+		return KErrOverflow;
+		}
+
+	TInt glyphsProcessed = 0;
+	CBitmapFont* font = fontptr->iAddressPointer;
+	for (; (glyphsProcessed < glyphCodesCount); ++glyphsProcessed)
+		{
+		TUint32 glyphCode = glyphCodes[glyphsProcessed];
+		err = glyphAtlas->GetGlyph(*font, glyphCode, glyphImageInfo[glyphsProcessed]);
+		// Search for glyph in glyph atlas
+		if (KErrNone != err)
+			{
+			const TUint8* bitmapData = NULL;
+			TOpenFontCharMetrics metrics;
+			// search for glyph in font glyph cache and session cache.
+			if (!font->GetCharacterData(iSessionHandle, glyphCode | KTreatAsGlyphCodeFlag, metrics, bitmapData))
+				{
+				// Rasterize the glyph
+				if(!font->Rasterize(iSessionHandle, glyphCode | KTreatAsGlyphCodeFlag, iOpenFontGlyphData))
+					{
+					err = KErrNoMemory;
+					break;
+					}
+				metrics = *(iOpenFontGlyphData->Metrics());
+				bitmapData = iOpenFontGlyphData->BitmapPointer();
+				}
+			CGlyphAtlas::TAddGlyphArgs args(bitmapData, glyphCode, metrics);
+			err = glyphAtlas->AddGlyph(*font, args, glyphImageInfo[glyphsProcessed]);
+			}
+		if ((err == KErrNone) && (glyphImageInfo[glyphsProcessed].iImageId != KSgNullDrawableId))
+			{
+			// To prevent other threads closing the glyph image in the glyph atlas 
+			// before client has had chance to open the drawable id, open a local
+			// handle to the glyph image for the session, which will be closed either
+			// next time a request is made or when EFbsMessCloseGlyphs is handled.
+			RSgImage glyphImage;
+			err = glyphImage.Open(glyphImageInfo[glyphsProcessed].iImageId);
+			if (err == KErrNone)
+				{
+				err = iGlyphImagesInTransit.Append(glyphImage);
+				}
+			}
+		// If an error occurred during this iteration, abort now before the glyphsProcessed
+		// counter is incremented, which would give one too many processed glyphs.
+		if (KErrNone != err)
+			{
+			break;
+			}
+		}
+
+	// Even if there was an error, if at least one glyph was processed successfully
+	// send that back to the client, and reset the error code.
+	if (glyphsProcessed > 0)
+		{
+		TPckg<TGlyphImageInfo[KMaxGlyphBatchSize]> glyphImageInfoPckg(glyphImageInfo);
+		glyphImageInfoPckg.SetLength(glyphsProcessed * sizeof(TGlyphImageInfo));
+		err = aMessage.Write(2, glyphImageInfoPckg);
+		if (err != KErrNone)
+			{
+			aPanicRequired = ETrue;
+			return err;
+			}
+		}
+	else
+		{
+		// No glyphs being returned, so an error code must be returned.
+		__ASSERT_DEBUG(err != KErrNone, User::Panic(KFBSERVPanicCategory, err));
+		}
+	return err;
+	}
+
+/**
+Handler for EFbsMessGetGlyphMetrics message.
+Reads an array of glyph codes, and returns the offset from the heap base for the 
+corresponding metrics object.
+@pre The glyph codes have already been searched client-side in the font glyph
+	cache and the session cache.
+@param aMessage input parameters
+@param aPanicRequired flag that is set if a client panic is required
+@return KErrNone if successful, otherwise any system-wide error code.
+ */
+TInt CFbClient::HandleMesgGetGlyphMetrics(const RMessage2& aMessage, TBool& aPanicRequired)
+	{
+	CFbTop* fbtop = TopLevelStore();
+	CFontObject* fontptr = static_cast<CFontObject*>(iIx->At(aMessage.Int0(), fbtop->FontConUniqueID()));
+	if(!fontptr)
+		{
+		aPanicRequired = ETrue;
+		return KErrBadHandle;
+		}
+	
+	TInt err = KErrNone;
+	TUint glyphCodes[KMaxMetricsBatchSize];
+	TPckg<TUint[KMaxMetricsBatchSize]> glyphBatchPckg(glyphCodes);
+	err = aMessage.Read(1, glyphBatchPckg);
+	if (err != KErrNone)
+		{
+		aPanicRequired = ETrue;
+		return err;
+		}
+	
+	TInt numGlyphCodes = glyphBatchPckg.Length() / sizeof(TUint);	
+	if (numGlyphCodes > KMaxMetricsBatchSize)
+		{
+		aPanicRequired = ETrue;
+		return KErrOverflow;
+		}
+	
+	CBitmapFont* font = fontptr->iAddressPointer;
+	const TInt heapbase = fbtop->HeapBase();
+
+	TInt glyphProcessed;
+	TInt glyphMetricsOffsets[KMaxMetricsBatchSize];
+	for (glyphProcessed = 0; (glyphProcessed < numGlyphCodes) && (err == KErrNone); ++glyphProcessed)
+		{
+		if (font->Rasterize(iSessionHandle, glyphCodes[glyphProcessed] | KTreatAsGlyphCodeFlag, iOpenFontGlyphData))
+			{
+			// Convert all pointers to be passed back to the client to offsets from
+			// the heap base so that they can be recreated client side relative to the
+			// client's heap base
+			glyphMetricsOffsets[glyphProcessed] = PointerToOffset(iOpenFontGlyphData->Metrics(), heapbase);
+			}
+		else
+			{
+			err = KErrNoMemory;
+			}
+		}
+
+	if (err == KErrNone)
+		{
+		TPckg<TInt[KMaxMetricsBatchSize]> glyphMetricsOffsetsPckg(glyphMetricsOffsets);
+		glyphMetricsOffsetsPckg.SetLength(glyphProcessed * sizeof(TInt));
+		err = aMessage.Write(2, glyphMetricsOffsetsPckg);
+		if (err != KErrNone)
+			{
+			aPanicRequired = ETrue;
+			}
+		}	
+	return err;
+	}
 
 /** Handler for EFbsMessFaceAttrib message
  @param aMessage Input and output parameters
@@ -661,21 +906,21 @@
 		}
 	CBitmapFont* bitmapFont = fontptr->iAddressPointer;
 
+	TInt ret = EFalse;
 	TPckgBuf<TOpenFontFaceAttrib> package;
 	if ( (bitmapFont != NULL) && (bitmapFont->GetFaceAttrib(package())) )
 		{
-		TInt ret = aMessage.Write(1,package);
+		ret = aMessage.Write(1,package);
 		if (ret == KErrNone)
 			{
-			return ETrue;
+			ret = ETrue;
 			}
 		else
 			{
 			aPanicRequired = ETrue;
-			return ret;
 			}
 		}
-	return EFalse;
+	return ret;
 	}
 
 
@@ -717,7 +962,6 @@
 	{
 	TInt error = KErrNone;
 	TShapeHeader* shape = 0;
-	TPckgBuf<TShapeMessageParameters> sp;
 	if (aMessage.GetDesLength(2) != sizeof(TShapeMessageParameters))
 		{
 		aPanicRequired = ETrue;
@@ -731,7 +975,6 @@
 		aPanicRequired = ETrue;
 		return KErrArgument;
 		}
-	CBitmapFont* bitmapFont = fontptr->iAddressPointer;
 
 	TInt inputTextLength = aMessage.GetDesLength(1);
 	if (inputTextLength < 0)
@@ -744,7 +987,9 @@
 		{
 		iTextToShape.Zero();
 		if (iTextToShape.MaxLength() < inputTextLength)
+			{
 			error = iTextToShape.ReAlloc(inputTextLength);
+			}
 		}
 	if (error == KErrNone)
 		{
@@ -754,12 +999,14 @@
 			aPanicRequired = ETrue;
 			return error;
 			}
+		TPckgBuf<TShapeMessageParameters> sp;
 		error = aMessage.Read(2, sp);
 		if (error != KErrNone)
 			{
 			aPanicRequired = ETrue;
 			return error;
 			}
+		CBitmapFont* bitmapFont = fontptr->iAddressPointer;
 		TRAP(error, shape = bitmapFont->ShapeTextL(iTextToShape, iSessionHandle, sp()) );
 		if (error == KErrNone)
 			{
@@ -953,9 +1200,70 @@
 	return ret;
 	}
 
+
+/**
+ Called in response to the GoomMonitor framework's call into FbsOogmPlugin.
+ We wish to either free some GPU memory, or reinstate its normal usage.
+
+@param  aMessage The IPC message.
+@return KErrNone If the value contained in the TFbsOogmMessage enumeration member is meaningful and the glyph atlas is present.
+        KErrNotSupported if there is no glyph atlas.
+        KErrUnknown if the value contained in the TFbsOogmMessage enumeration member is not meaningful.
+ */
+TInt CFbClient::HandleMesgOogmStatus( const RMessage2& aMessage )
+    {
+    TInt ret = KErrNone;
+    CGlyphAtlas* glyphAtlas = TopLevelStore()->GlyphAtlas();
+
+    if ( NULL == glyphAtlas )
+        {
+        return KErrNotSupported;
+        }
+
+
+    TPckgBuf<TFbsOogmMessage> oogmMessage;
+    aMessage.Read( 0, oogmMessage );
+
+    switch( oogmMessage().iOogmNotification )
+        {
+    case TFbsOogmMessage::EFbsOogmNoAction:
+        break;
+
+    case TFbsOogmMessage::EFbsOogmLowNotification:
+        {
+        glyphAtlas->ReleaseGpuMemory( oogmMessage().iBytesToFree, oogmMessage().iFlags );
+        }
+         break;
+
+    case TFbsOogmMessage::EFbsOogmOkayNotification:
+        {
+        glyphAtlas->InstateGpuMemory( oogmMessage().iFlags );
+        }
+        break;
+
+    default:
+        ret = KErrUnknown;
+        break;
+        }
+
+    return ret;
+    }
+
+
+void CFbClient::HandleMesgGlyphCacheMetrics( const RMessage2& aMessage )
+    {
+    CGlyphAtlas* glyphAtlas = TopLevelStore()->GlyphAtlas();
+    TPckgBuf<TGlyphCacheMetrics>  metrics;
+
+    glyphAtlas->GetGlyphCacheMetrics( metrics() );
+
+    aMessage.Complete( aMessage.Write(0, metrics) );
+    }
+
+
 void CFbClient::ProcFontMessage(const RMessage2& aMessage)
 	{
-	TInt ret = KErrUnknown;
+	TInt ret = KErrNone;
 	TBool panicRequired = EFalse;
 
 	switch(aMessage.Function())
@@ -1082,9 +1390,20 @@
 			ret = HandleMesgReleaseFontTable(aMessage, panicRequired);
 			break;
 			}
+		case EFbsMessGetGlyphs:
+			{
+			ret = HandleMesgGetGlyphs(aMessage, panicRequired);
+			break;
+			}
+		case EFbsMessGetGlyphMetrics:
+			{
+			ret = HandleMesgGetGlyphMetrics(aMessage, panicRequired);
+			break;
+			}
 
 #ifdef _DEBUG
 		case EFbsMessSetDuplicateFail:
+			{
 			TInt argument =aMessage.Int0();
 			if (argument)
 				{
@@ -1096,7 +1415,10 @@
 				}
 			ret=KErrNone;
 			break;
+			}
 #endif
+		default:
+			ret = KErrUnknown;
 		}
 
 	// either have a result or an error code to panic the client with
@@ -1120,7 +1442,7 @@
 	{
 	CBitmapObject* bmpptr=NULL;
 	TInt localhandle=0;
-	TInt ret=KErrUnknown;
+	TInt ret = KErrNone;
 	switch(aMessage.Function())
 		{
 	case EFbsMessBitmapCreate:
@@ -1283,14 +1605,18 @@
 			}
 		ret = fbtop->GetCleanBitmap(bmpptr);
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		TSize newsize(aMessage.Int1(),aMessage.Int2());
  		const TBool compressedInRam = bmpptr->Address()->IsCompressedInRAM();  //It must be set before the resizing is done.
 		const TDisplayMode dispMode = bmpptr->Address()->DisplayMode();
 		CBitmapObject* newbmpptr = NULL;
 		TRAP(ret, newbmpptr = fbtop->CreateBitmapL(newsize, dispMode, KUidCFbsBitmapCreation, ETrue));
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		ret = newbmpptr->Address()->CopyData(*bmpptr->Address());
 		if (ret != KErrNone)
 			{
@@ -1325,7 +1651,9 @@
 			}
 		bmpptr->SetCleanBitmap(newbmpptr);
 		if (bmpptr->AccessCount() >= 2)
+			{
 			fbtop->NotifyDirtyBitmap(*bmpptr, this);
+			}
 		iIx->Remove(localhandle);
 		TPckgBuf<TBmpHandles> handlebuffer;
 		handlebuffer().iHandle = newlocalhandle;
@@ -1353,7 +1681,9 @@
 		TopLevelStore()->GetCleanBitmap(bmpptr);
 		ret = bmpptr->Open();
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		TPckgBuf<TBmpHandles> handlebuffer;
 		TRAP(ret,localhandle=iIx->AddL(bmpptr));
 		if(ret!=KErrNone)
@@ -1386,13 +1716,17 @@
 			}
 		ret = fbtop->GetCleanBitmap(bmpptr);
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		const TSize size = bmpptr->Address()->SizeInPixels();
 		const TDisplayMode dispMode = bmpptr->Address()->DisplayMode();
 		CBitmapObject* newbmpptr = NULL;
 		TRAP(ret, newbmpptr = fbtop->CreateBitmapL(size, dispMode, KUidCFbsBitmapCreation, ETrue));
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		ret = newbmpptr->Address()->CopyData(*bmpptr->Address());
 		if (ret != KErrNone)
 			{
@@ -1420,7 +1754,9 @@
 			}
 		bmpptr->SetCleanBitmap(newbmpptr);
 		if (bmpptr->AccessCount() >= 2)
+			{
 			fbtop->NotifyDirtyBitmap(*bmpptr, this);
+			}
 		iIx->Remove(localhandle);
 		TPckgBuf<TBmpHandles> handlebuffer;
 		handlebuffer().iHandle = newlocalhandle;
@@ -1451,7 +1787,9 @@
 		if (ret != KErrNone)
 			{
 			if (!async)
+				{
 				ret = KErrNone;
+				}
 			break;
 			}
 		ret = bmpptr->Address()->CheckBackgroundCompressData();
@@ -1459,10 +1797,14 @@
 			{
 			ret = fbtop->BackgroundCompression()->AddToCompressionQueue(bmpptr, scheme, async ? &aMessage : NULL);
 			if (ret == KErrNone && async)
+				{
 				return; // do not complete the client's request - that will be done by the background compression thread
+				}
 			}
 		if (KErrAlreadyExists == ret)
+			{
 			ret = KErrNone;
+			}
 		break;
 		}
 	case EFbsMessBitmapClean:
@@ -1477,10 +1819,14 @@
 			}
 		ret = fbtop->GetCleanBitmap(bmpptr);
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		ret = bmpptr->Open();
 		if (ret != KErrNone)
+			{
 			break;
+			}
 		TInt cleanlocalhandle = 0;
 		TRAP(ret, cleanlocalhandle = iIx->AddL(bmpptr));
 		if (ret != KErrNone)
@@ -1530,17 +1876,19 @@
 			iHelper->iMessage = aMessage;
 			return; // do not complete the client's request yet - that will be done when a bitmap becomes dirty
 			}
-		ret = KErrNone;
 		iHelper->iDirty = EFalse;
 		}
 		break;
 	case EFbsMessBitmapCancelNotifyDirty:
 		{
 		if (iHelper != NULL && !iHelper->iMessage.IsNull())
+			{
 			iHelper->iMessage.Complete(KErrCancel);
-		ret = KErrNone;
+			}
 		}
 		break;
+	default:
+		ret = KErrUnknown;
 		}
 		
 	if(!aMessage.IsNull())
@@ -1616,7 +1964,9 @@
 	if (iHelper)
 		{
 		if (!iHelper->iMessage.IsNull())
+			{
 			iHelper->iMessage.Complete(KErrDisconnected);
+			}
 		iHelper->Deque();
 		delete iHelper;
 		iHelper = NULL;
@@ -1678,7 +2028,58 @@
 			break;
 		case EFbsMessHeap:
 			ret=(TInt)iHeap;
-			break;			
+			break;
+		default:
+			ret = KErrUnknown;
+		}
+	aMessage.Complete(ret);
+	iRet=ret;
+	}
+
+/**
+Processes messages associated with the Glyph Atlas.
+@param aMessage The message used to perform IPC to the client.
+ */
+void CFbClient::ProcAtlasMessage(const RMessage2 &aMessage)
+	{
+	TInt ret = KErrNone;
+	CFbTop* fbtop = TopLevelStore();
+	CGlyphAtlas* glyphAtlas = fbtop->GlyphAtlas();
+	if (!glyphAtlas)
+		{
+		ret = KErrNotSupported;
+		}
+	else
+		{
+		switch(aMessage.Function())
+			{
+			case EFbsMessAtlasFontCount:
+				ret = glyphAtlas->FontCount();
+				break;
+			case EFbsMessAtlasGlyphCount:
+				{
+				TInt fontHandle = aMessage.Int0();
+				if (fontHandle != 0)
+					{
+					if (fbtop->ValidFontHandle(fontHandle))
+						{
+						CFontObject* fontptr = reinterpret_cast<CFontObject*>(fontHandle);
+						ret = glyphAtlas->GlyphCount(static_cast<CBitmapFont&>(*(fontptr->iAddressPointer)));
+						}
+					else
+						{
+						ret = KErrNotFound;
+						}
+					}
+				else
+					{
+					ret = glyphAtlas->GlyphCount();
+					}
+				}
+				break;
+			default:
+				ret = KErrUnknown;
+			}
 		}
 	aMessage.Complete(ret);
 	iRet=ret;
--- a/fbs/fontandbitmapserver/sfbs/FBSFONT.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/FBSFONT.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -85,7 +85,9 @@
 EXPORT_C void CFbsFont::Reset()
 	{
 	if (iHandle)
+	    {
 		iFbs->SendCommand(EFbsMessClose,iHandle);
+	    }
 	iHandle = 0;
 	}
 	
@@ -115,7 +117,7 @@
 	if (!aFontHandle)
 		return KErrUnknown;
 	// close any existing handle
-	Reset();
+	Reset();	
 	// ask server to create the duplicate handle
 	TPckgBuf<TFontInfo> tfpckg;
 	TIpcArgs args(aFontHandle,&tfpckg);
@@ -137,7 +139,9 @@
 EXPORT_C TInt CFbsFont::Handle() const
 	{
 	if (!iHandle)
+		{
 		return 0;
+		}
 	return iServerHandle;
 	}
 
@@ -727,6 +731,9 @@
 provide and/or return information to/from the particular extension function,
 defaults to NULL.
 @return Integer return value from extension function, a system wide error code.
+@panic FBSCLI 31, in debug builds only, if iExtra is NULL when it must not be.
+@panic FBSCLI 38, in debug builds only, if a reserved error code is returned 
+	from an extended function.
 @internalTechnology
 @released
 */
--- a/fbs/fontandbitmapserver/sfbs/FBSTOP.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/FBSTOP.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -18,7 +18,6 @@
 #include <fntstore.h>
 #include <bitmap.h>
 #include <ecom/ecom.h>
-#include "FbsMessage.H"
 #include <graphics/bitmapuid.h>
 #include "SERVER.H"
 #include "BackGroundCompression.h"
@@ -27,6 +26,8 @@
 #include <graphics/openfontconstants.h>
 #include <graphics/openfontrasterizer.h>
 #include <graphics/gdi/glyphsample.h>
+#include "glyphatlas.h"
+#include "FbsMessage.H"
 
 // Local utility functions
 void ListImplementationsWithRetry(TUid& aInterfaceUid, RImplInfoPtrArray &aImplementationArray, TBool aRomOnly);
@@ -61,6 +62,7 @@
 #endif
 	iFontNameAlias.ResetAndDestroy();
 	iBitmapObjectIndex.Reset();
+	delete iGlyphAtlas;
 	REComSession::FinalClose();
 	}
 
@@ -140,9 +142,15 @@
 	iMBMCache=new (ELeave) CFbTopStreamIdCache(30,30,5);
 
 	LoadOpenFontLibraries();
-	
 	iFontStore->LoadFontsAtStartupL();
 	LoadShaperFactories();
+	TRAP_IGNORE(iGlyphAtlas = CGlyphAtlas::NewL(KFbServGlyphAtlasCacheLimit);)
+#ifdef _DEBUG
+	if (!iGlyphAtlas)
+	    {
+        RDebug::Printf("FBSERV failed to initialize Glyph Atlas");
+	    }
+#endif
 
 	// start a new thread for background compression after all the other objects have been created
 	iBackgroundCompression = CFbsBackgroundCompression::NewL(*this);
@@ -307,8 +315,8 @@
 		{
 		return ret;
 		}
-
-	return CreateFontObjectFromFont(aFontObjPtr, font);
+	
+	return GetFontObjectFromFont(aFontObjPtr, font);
 	}
 	
 /**
@@ -349,9 +357,27 @@
 	return ret;
 	}
 
-TInt CFbTop::CreateFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont)
+TInt CFbTop::GetFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont)
 	{
-	CFontObject* fontObjPtr = new CFontObject(iFontStore);
+	// First, check if a CFontObject exists for this CFont.
+	// If so, increment its reference count and return it.
+	for (TInt ii = iFontCon->Count() - 1; ii >= 0; --ii)
+		{
+		CFontObject* fontObjPtr = reinterpret_cast<CFontObject*>((*iFontCon)[ii]);
+		if (fontObjPtr->iAddressPointer == reinterpret_cast<CBitmapFont*>(aFont))
+			{
+			aFontObjPtr = fontObjPtr;
+			// The CFontObject instance keeps the reference count of the CBitmapFont, 
+			// not the font store. There is only one CFontObject instance
+			// per CBitmapFont, so to keep the reference count at 1 in the fontstore
+			// call ReleaseFont(). 
+			iFontStore->ReleaseFont(aFont);
+			return fontObjPtr->Open();
+			}
+		}
+	
+	// Existing FontObject not found, so create new one.
+	CFontObject* fontObjPtr = new CFontObject(iFontStore, iGlyphAtlas);
 	if (!fontObjPtr)
 		{
 		iFontStore->ReleaseFont(aFont);
@@ -389,7 +415,7 @@
 		{
 		return ret;
 		}
-	return CreateFontObjectFromFont(aFontObjPtr, font);
+	return GetFontObjectFromFont(aFontObjPtr, font);
 	}
 
 
@@ -561,18 +587,6 @@
 	return(EFalse);
 	}
 	
-TBool CFbTop::ValidBitmapFont(TInt aHandle)
-	{
-	TInt limit=iFontCon->Count();
-	for(TInt count=0;count<limit;count++)
-		{
-		CFontObject* fontObjPtr = reinterpret_cast<CFontObject*>((*iFontCon)[count]);
-		if(aHandle==(TInt)(fontObjPtr->iAddressPointer))
-			return(ETrue);
-		}
-	return(EFalse);
-	}
-
 CFontStore* CFbTop::FontStore() const
 	{
 	return(iFontStore);
@@ -724,3 +738,8 @@
 	{
 	return iFontCon->UniqueID();
 	}
+
+CGlyphAtlas* CFbTop::GlyphAtlas() const
+	{
+	return iGlyphAtlas;
+	}
--- a/fbs/fontandbitmapserver/sfbs/SERVER.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/SERVER.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -22,7 +22,7 @@
 #include "BitwiseBitmap.inl"
 
 const TInt KFbsPriority = 0;
-
+const TInt KFbsGoomMonitorSid = 0x10207218;
 // Setup security policies
 const TInt KRanges[] = 
 	{
@@ -37,7 +37,10 @@
 	EFbsMessFetchLinkedTypeface,
 	EFbsMessUpdateLinkedTypeface,
 	EFbsMessGetFontTable,
+    EFbsMessOogmNotification,
+    EFbsMessGetGlyphCacheMetrics,
 	};
+
 const TUint KRangeCount = sizeof(KRanges)/sizeof(TInt);
 const TUint8 KElementsIndex[KRangeCount] = 
 	{
@@ -52,14 +55,19 @@
 	2, // ECapabilityReadDeviceData for EFbsMessFetchLinkedTypeface
 	1, // ECapabilityWriteDeviceData for EFbsMessUpdateLinkedTypeface
 	0, // ECapability_None for EFbsMessGetFontTable and beyond
+    4, // SID for EFbsMessOogmNotification.
+    0, // For EFbsMessGetGlyphCacheMetrics and on.
 	};
+
 const CPolicyServer::TPolicyElement KElements[] = 
 	{
 	{_INIT_SECURITY_POLICY_C1(ECapability_None), CPolicyServer::EFailClient},
 	{_INIT_SECURITY_POLICY_C1(ECapabilityWriteDeviceData), CPolicyServer::EFailClient},
 	{_INIT_SECURITY_POLICY_C1(ECapabilityReadDeviceData), CPolicyServer::EFailClient},
-	{_INIT_SECURITY_POLICY_C1(ECapabilityPowerMgmt), CPolicyServer::EFailClient},	
+	{_INIT_SECURITY_POLICY_C1(ECapabilityPowerMgmt), CPolicyServer::EFailClient},
+	{_INIT_SECURITY_POLICY_S0(KFbsGoomMonitorSid), CPolicyServer::EFailClient}
  	};
+
 const CPolicyServer::TPolicy KFbsPolicy =
 	{
 	CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass
@@ -70,9 +78,7 @@
 	};
 
 CFontBitmapServer::CFontBitmapServer():
-	CPolicyServer(KFbsPriority, KFbsPolicy),
-	iConnectionId(0),
-	iTopLevelStore(NULL)
+	CPolicyServer(KFbsPriority, KFbsPolicy)
 	{
 	}
 
@@ -85,25 +91,33 @@
 
 CFontBitmapServer* CFontBitmapServer::NewL()
 	{
-	CFontBitmapServer* fbs=new(ELeave) CFontBitmapServer;
-	CleanupStack::PushL(fbs);
-	fbs->iTopLevelStore=CFbTop::NewL();
+	CFontBitmapServer* self = new(ELeave) CFontBitmapServer;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(); //self
+	return self;
+	}
+
+/**
+Two-phase constructor.
+*/
+void CFontBitmapServer::ConstructL()
+	{
+	iTopLevelStore=CFbTop::NewL();
 	
 	// If fbserv data paging is configured as unpaged, automatically pin client descriptors 
 	if(!RProcess().DefaultDataPaged())
 		{
-		fbs->SetPinClientDescriptors(ETrue);
+		SetPinClientDescriptors(ETrue);
 		}
-
-	fbs->StartL(KFBSERVGlobalThreadName);
-	CleanupStack::Pop();
-	return(fbs);
+	StartL(KFBSERVGlobalThreadName);
 	}
 
 CFbTop* CFontBitmapServer::TopLevelStore()
 	{
 	return(iTopLevelStore);
 	}
+
 CSession2* CFontBitmapServer::NewSessionL(const TVersion& aVersion,const RMessage2& /*aMessage*/ ) const
 	{
 	TVersion v(KFbsMajorVersionNumber,KFbsMinorVersionNumber,KFbsBuildVersionNumber);
@@ -127,7 +141,7 @@
 	TPckgBuf<TSize> pixelSize;
 	TInt index=aMessage.Int0();
 	TInt limit=iTopLevelStore->FontStore()->NumTypefaces();
-	if(index<0 || index>limit)
+	if(index < 0 || index > limit)
 		{
 		return KErrArgument;
 		}
@@ -195,7 +209,7 @@
 void CFontBitmapServer::ProcMessage(const RMessage2& aMessage, TInt aSession)
 #endif
 	{
-	TInt ret=KErrNone;
+    TInt ret=KErrNone;
 	TBool clientPanicRequired = EFalse;
 #ifdef _DEBUG
 	TInt num=0;
@@ -346,6 +360,7 @@
 #ifdef _DEBUG
 	aRet=ret;
 #endif	
+
 	}
 
 /**
@@ -363,9 +378,9 @@
 void CFontBitmapServer::GetHeapSizesL(const RMessage2& aMessage)
 	{
 	TPckgBuf<THeapSizes> data;
-	TInt defaultHeapSize;
-	TInt smallBmpHeapSize;		
-	TInt bigBmpHeapSize;		
+	TInt defaultHeapSize = 0;
+	TInt smallBmpHeapSize = 0;		
+	TInt bigBmpHeapSize = 0;		
 	
 	User::Heap().AllocSize(defaultHeapSize);
 	bigBmpHeapSize = iTopLevelStore->iLargeBitmapChunk.Size();
@@ -385,18 +400,24 @@
 #endif
 
 
-CFontObject::CFontObject(CFontStore* aFontStore):
+CFontObject::CFontObject(CFontStore* aFontStore, CGlyphAtlas* aGlyphAtlas):
 	CObject(),
-	iAddressPointer(NULL),
-	iFontStore(aFontStore)
+	iFontStore(aFontStore),
+	iGlyphAtlas(aGlyphAtlas)
 	{
 	}
 
 CFontObject::~CFontObject()
 	{
 	if (AccessCount()==1)
+		{
 		Dec();
+		}
 	iFontStore->ReleaseFont(iAddressPointer);
+	if (iGlyphAtlas)
+		{
+		iGlyphAtlas->FontReleased(*iAddressPointer);
+		}
 	}
 
 // CBitmapObject constructor - takes ownership of aBmp
@@ -426,7 +447,9 @@
 		{
 		iHandle = reinterpret_cast<TInt>(this);
 		while (iFbTop->iBitmapObjectIndex.FindInOrder(this, Compare) != KErrNotFound)
+			{
 			++iHandle;
+			}
 		User::LeaveIfError(iFbTop->iBitmapObjectIndex.InsertInOrder(this, Compare));
 		}
 	}
@@ -471,9 +494,13 @@
 			if (index != KErrNotFound)
 				{
 				if (iCleanBitmap)
+					{
 					iFbTop->iBitmapObjectIndex[index] = iCleanBitmap;
+					}
 				else
+					{
 					iFbTop->iBitmapObjectIndex.Remove(index);
+					}
 				}
 			}
 		if (iCleanBitmap != NULL)
@@ -502,7 +529,7 @@
 
 void CBitmapObject::Close()
 	{
-	if (iCleanBitmap != NULL && Owner() != NULL && AccessCount() == 2)
+	if ((iCleanBitmap != NULL) && (Owner() != NULL) && (AccessCount() == 2))
 		{
 		static_cast<CBitmapObject*>(Owner())->iCleanBitmap = iCleanBitmap;
 		iCleanBitmap->SetOwner(Owner());
@@ -525,8 +552,7 @@
 // CSharedBitmapObject constructor - takes ownership of aBmp and aKey
 CSharedBitmapObject::CSharedBitmapObject(CFbTop& aFbTop, CBitwiseBitmap* aBmp, TDesC* aKey):
 	CBitmapObject(aFbTop, aBmp),
-	iKey(aKey),
-	iNext(NULL)
+	iKey(aKey)
 	{
 	__ASSERT_DEBUG(iKey, User::Invariant());	
 	}
--- a/fbs/fontandbitmapserver/sfbs/SERVER.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/SERVER.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -13,33 +13,37 @@
 // Description:
 //
 
-#ifndef __FBSERV_H__
-#define __FBSERV_H__
+#ifndef SERVER_H
+#define SERVER_H
 
 #include <e32base.h>
 #include <f32file.h>
 #include <fbs.h>
+#include <sgresource/sgimage.h>
 #include "UTILS.H"
 #include "FBSMBMC.H"
 #include "FbsMessage.H"
+#include "glyphatlas.h"
 
 class CFbTop;
 class CFbsBackgroundCompression;
 class CFbsBackgroundCompressionQueueElement;
 class TOpenFontGlyphData;
 
+
 NONSHARABLE_CLASS(CFontObject): public CObject
 /**
 @internalComponent
 */
 	{
 public:
-	CFontObject(CFontStore* aFontStore);
+	CFontObject(CFontStore* aFontStore, CGlyphAtlas* aGlyphAtlas);
 	~CFontObject();
 public:
 	CBitmapFont* iAddressPointer;
 	CFontStore* iFontStore;
 	TInt iHeightInTwips;
+	CGlyphAtlas* iGlyphAtlas;
 	};
 
 NONSHARABLE_CLASS(CBitmapObject): public CObject
@@ -113,6 +117,7 @@
 	CFbTop* TopLevelStore();
 
 private:
+	void ConstructL();
 	void GetHeapSizesL(const RMessage2& aMessage);
 	TInt HandleMesgTypefaceSupport(const RMessage2& aMessage, TBool& aClientPanicRequired);
 	TInt HandleMesgFontHeight(const RMessage2& aMessage, TBool aInTwips);
@@ -171,8 +176,10 @@
 	void Disconnect(const RMessage2 &aMessage);
 #ifdef _DEBUG
 	void ProcMemMessage (const RMessage2& aMessage);
+	void ProcAtlasMessage (const RMessage2& aMessage);
 #endif	
 private:
+	void ConstructL();
 	CFbClient(RHeap* aHeap);
 	TInt HandleMesgFontDuplicate(const RMessage2& aMessage, TBool& aPanicRequired);
 	TInt HandleMesgGetNearestFont(const RMessage2& aMessage, TBool& aPanicRequired);
@@ -189,6 +196,10 @@
 	TInt HandleMesgGetGlyphOutline(const RMessage2& aMessage, TBool& aPanicRequired);
 	TInt HandleMesgReleaseGlyphOutline(const RMessage2& aMessage, TBool& aPanicRequired);
 	TInt HandleMesgReleaseFontTable(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgGetGlyphs(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgGetGlyphMetrics(const RMessage2& aMessage, TBool& aPanicRequired);
+	TInt HandleMesgOogmStatus(const RMessage2& aMessage);
+	void HandleMesgGlyphCacheMetrics(const RMessage2& aMessage);
 
 protected:
 	TUint iConnectionHandle;
@@ -202,6 +213,7 @@
 
 private:
 	RBuf16 iTextToShape;						// buffer used to hold incoming text that needs shaping
+	RArray<RSgImage> iGlyphImagesInTransit;	// last glyph images retrieved from glyph atlas
 #ifdef _DEBUG	
 	TBool iOwnHeapCheck; //for the process heap - current state
 	TBool iHeapCheck;	//for iHeap - current state
@@ -250,6 +262,7 @@
 
 
 IMPORT_C extern const TInt KFbServSharedHeapMaxSize;
+IMPORT_C extern const TInt KFbServGlyphAtlasCacheLimit;
 
 
 NONSHARABLE_CLASS(CFbTop): public CBase
@@ -271,7 +284,6 @@
 	TInt GetCleanBitmap(CBitmapObject*& aBmpObjPtr);
 	CBitmapObject* FindBitmap(TInt aHandle);
 	TBool ValidFontHandle(TInt aHandle);
-	TBool ValidBitmapFont(TInt aHandle);
 	CFontStore* FontStore() const;
 	RHeap* Heap() const;
 	CChunkPile* Pile() const;
@@ -287,6 +299,7 @@
 	void NotifyDirtyBitmap(CBitmapObject& aBmpObj, CFbClient* aClient);
 	TInt BitmapConUniqueID() const;
 	TInt FontConUniqueID() const;
+	CGlyphAtlas* GlyphAtlas() const;
 private:
 	CFbTop();
 	void ConstructL();
@@ -296,7 +309,7 @@
 	TInt FindFontNameAlias(const TDesC& aAlias);
 	void LoadShaperFactories();
 	void SafeInstallOfShaperFactoryL(TUid aInterfaceImplUid);
-	TInt CreateFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont);
+	TInt GetFontObjectFromFont(CFontObject*& aFontObjPtr, CFont* aFont);
 	TInt GetNearestNonAliasedFont(CFont*& aFont, TFbsMessage aMessage, const TFontSpec&	aFontSpec, TInt	aMaxHeight);
 private:
 	RFs iFilesys;
@@ -318,6 +331,7 @@
 	TBuf<KMaxTypefaceNameLength> iSystemDefaultFontTypefaceName;
 	TDblQue<TFbClientHelper> iClientHelpers;
 	TInt64 iNextAvailableSerialNumber;
+	CGlyphAtlas* iGlyphAtlas;
 	};
 
 inline CBitwiseBitmap* CBitmapObject::Address() const
@@ -360,5 +374,5 @@
 	return iFilesys;
 	}
 
-#endif
+#endif // SERVER_H
 
--- a/fbs/fontandbitmapserver/sfbs/SESSION.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/SESSION.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -20,6 +20,7 @@
 #include "FbsRalc.h"
 #include "fbshelper.h"
 #include "FbsMessage.H"
+#include <graphics/fbsoogmmessage.h>
 
 GLDEF_C void Panic(TFbsPanic aPanic)
 	{
@@ -238,6 +239,7 @@
 EXPORT_C TInt RFbsSession::SendCommand(TInt aMessage,TInt aInt0,TInt aInt1,TInt aInt2,TInt aInt3) const
    {
 	__ASSERT_ALWAYS(iConnections>0,Panic(EFbsPanicBadConnection));
+
 	switch(aMessage)
 		{
 	case EFbsMessShutdown:
@@ -247,7 +249,9 @@
 	default:
 		break;
 		}
+
 	TInt ret = SendReceive(aMessage, TIpcArgs(aInt0,aInt1,aInt2,aInt3));
+
 	return(ret);
 	}
 
@@ -486,6 +490,36 @@
 	return iHelper->iServerSessionHandle;
 	}
 
+EXPORT_C TInt RFbsSession::GetGlyphCacheMetrics( TGlyphCacheMetrics& aGlyphCacheMetrics )
+    {
+    TPckgBuf<TGlyphCacheMetrics> metrics;
+    TIpcArgs args( &metrics );
+
+    TInt ret = SendReceive( EFbsMessGetGlyphCacheMetrics, args );
+    aGlyphCacheMetrics = metrics();
+
+    return ret;
+    }
+
+/**
+ Perform the IPC to convey the desired OoGM action to the glyph atlas.
+
+ @return KErrNone if IPC was successful. One of the system-wide error
+         codes, as described for RSessionBase::SendReceive(), if not.
+
+ @note The server-side platform security policy applied to this method is such that it is only useable by the GOoM framework.
+
+ @param aOogmMessage. A reference to the class encapsulating the OoGM action required of the glyph atlas.
+*/
+EXPORT_C TInt RFbsSession::ConveyOogmMessage( TFbsOogmMessage& aOogmMessage )
+    {
+    TPckgBuf<TFbsOogmMessage> oogmMessage;
+    oogmMessage() = aOogmMessage;
+    TIpcArgs args( &oogmMessage );
+
+    return SendReceive( EFbsMessOogmNotification, args );
+    }
+
 /**
 Returns the current sizes of the FBServ default heap, the heap for large bitmaps, 
 and the heap for small bitmaps.
--- a/fbs/fontandbitmapserver/sfbs/UTILS.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/UTILS.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -20,8 +20,9 @@
 #include <gdi.h>
 #include <fntstore.h>
 #include <bitmap.h>
+#include <sgresource/sgimage.h>
 
-
+class RFbsSession;
 
 /**
 @internalComponent
@@ -43,35 +44,43 @@
 */
 enum TFbsPanic
 	{
-	EFbsPanicNoConnection=1,
-	EFbsPanicBadConnection,
-	EFbsPanicUnknownMessage,
-	EFbsPanicActiveSchedulerError,
-	EFbsPanicStartupFailed,
-	EFbsTypefaceStoreError,
-	EFbsFontCreateFailed,
-	EFbsFontAddressViolation,
-	EFbsBitmapInvalidFormat,
-	EFbsBitmapInvalidMode,
-	EFbsBitmapInvalidCompression,
-	EFbsBitmapDecompressionError,
-	EFbsPanicChunkError,
-	EFbsColor256UtilError,
-	EFbsHardwareBitmapError,
-	EFbsNotSupportedForCompression,
-	EFbsBitmapAlignment,
-	EFbsBitmapInvalidScanLinePtr,
-	EFbsBitmapInvalidMode2,
-	EFbsBitmapInvalidMode3,
-	EFbsBitmapSwappingImpossible,
-	EFbsPanicBadHeapLock,
-	EFbsShaperNotYetCalled,
-	EFbsShaperInvalidArguments,
-	EFbsInvalidCompressionThreshold,
-	EFbsTypefaceIndexOutOfRange,
-	EFbsPanicBitmapDataCopy,
-	EFbsPanicBitmapReadOnly,
-	EFbsPanicInvalidBitmapType
+	EFbsPanicNoConnection = 1,
+	EFbsPanicBadConnection = 2,
+	EFbsPanicUnknownMessage = 3,
+	EFbsPanicActiveSchedulerError = 4,
+	EFbsPanicStartupFailed = 5,
+	EFbsTypefaceStoreError = 6,
+	EFbsFontCreateFailed = 7,
+	EFbsFontAddressViolation = 8,
+	EFbsBitmapInvalidFormat = 9,
+	EFbsBitmapInvalidMode = 10,
+	EFbsBitmapInvalidCompression = 11,
+	EFbsBitmapDecompressionError = 12,
+	EFbsPanicChunkError = 13,
+	EFbsColor256UtilError = 14,
+	EFbsHardwareBitmapError = 15,
+	EFbsNotSupportedForCompression = 16,
+	EFbsBitmapAlignment = 17,
+	EFbsBitmapInvalidScanLinePtr = 18,
+	EFbsBitmapInvalidMode2 = 19,
+	EFbsBitmapInvalidMode3 = 20,
+	EFbsBitmapSwappingImpossible = 21,
+	EFbsPanicBadHeapLock = 22,
+	EFbsShaperNotYetCalled = 23,
+	EFbsShaperInvalidArguments = 24,
+	EFbsInvalidCompressionThreshold = 25,
+	EFbsTypefaceIndexOutOfRange = 26,
+	EFbsPanicBitmapDataCopy = 27,
+	EFbsPanicBitmapReadOnly = 28,
+	EFbsPanicFontNullHandle = 29,
+    EFbsPanicGlyphDataIteratorClosed = 31,
+	EFbsPanicGlyphMetricsArrayOutOfBounds = 32,
+	EFbsPanicGlyphDataIteratorIndexOutOfRange = 33,
+	EFbsPanicInvalidBitmapType = 35,
+	EFbsPanicGlyphAtlasInconsistentState = 36,
+	EFbsPanicGlyphDataIteratorFailedToOpenImage = 37,
+	EFbsPanicGlyphDataIteratorInvalidState = 39,
+	EFbsPanicGlyphMetricsArrayInvalidState = 40,
 	};
 
 class TScanLine
@@ -125,9 +134,9 @@
 @internalComponent
 */
 	{
-	public:
-		TSizeInfo(){}
-		TSizeInfo(TInt aMaxHeight,TSize aDevSize):iMaxHeight(aMaxHeight),iDevSize(aDevSize) {}
+public:
+	TSizeInfo(){}
+	TSizeInfo(TInt aMaxHeight,TSize aDevSize):iMaxHeight(aMaxHeight),iDevSize(aDevSize) {}
 
 	TInt iMaxHeight;
 	TSize iDevSize;
@@ -182,7 +191,8 @@
 	void ShrinkSmallSection(TInt aShrinkBy);
 private:
 	RChunk iChunk;
-	TInt iPageSize, iPageMask;
+	TInt iPageSize;
+	TInt iPageMask;
 	RPointerArray<TUint8> iSmallCells; // last address is not a cell but the top of the small section
 	RArray<TInt> iFreeSmallCellLinks; // index of Nth free small cell is element 0 + element 1 + ... + element N-1
 	TInt iLargeSectionBottom; // boundary between small & large sections
@@ -264,6 +274,74 @@
     TInt iLen;
     };
 
-#endif
+/**
+Maximum number of glyphs to be sent to server/received from client at a time, 
+when retrieval of glyphs is necessary for implementation of RFbsGlyphDataIterator.
+*/
+const TInt KMaxGlyphBatchSize = 8;
+
+/**
+Maximum number of TOpenFontCharMetrics structures to be sent to server/received
+from client at a time, when retrieval of glyph metrics is necessary for
+implementation of RFbsGlyphMetricsArray.
+*/
+const TInt KMaxMetricsBatchSize = 16;
+
+/**
+Used by RFbsGlyphDataIterator for client/server communication of glyph info.
+Contains all the data necessary to retrieve a glyph from server and recreate
+glyph in client process.
+@internalComponent 
+ */
+class TGlyphImageInfo
+    {
+public:
+    inline TGlyphImageInfo() : iImageId(KSgNullDrawableId), iPosX(0), iPosY(0) {}
+public:
+    TSgDrawableId iImageId;
+    TInt16 iPosX;
+    TInt16 iPosY;
+    TOpenFontCharMetrics iMetrics;
+    };
 
+/**
+Used by CGlyphDataIteratorImpl. It is a container to group the 
+metadata and the image data of an individual glyph recevied from the
+server, all together. A collection of these is stored in the font,
+received from the server in batches.
+@internalComponent 
+*/
+struct TGlyphBatchItem
+    {
+    TSglQueLink iLink;
+    RSgImage iImage;
+    TGlyphImageInfo iInfo;
+    };
 
+/**
+Implementor class of RFbsGlyphDataIterator. This class contains all
+state information and contains much of the implementation of the
+behaviour.
+@internalComponent 
+ */
+NONSHARABLE_CLASS(CGlyphDataIteratorImpl) : public CBase
+    {
+public:
+    CGlyphDataIteratorImpl(TInt aFbsFontHandle, const TUint* aGlyphCodes, TInt aCount);
+    ~CGlyphDataIteratorImpl();
+    TInt Initialise();
+    TInt Next();
+    void UpdateGlyphRect();
+    TInt UpdateGlyphBatch(TInt aIndex);
+    
+public:    
+    TSglQue<TGlyphBatchItem> iGlyphBatch;   // Linked-list of the current batch of received glyphs.
+    const TUint* iGlyphDataIterCodes;       // An array of glyph codes
+    TInt  iGlyphDataIterCodeCount;          // The number of glyph codes in the array
+    TInt  iGlyphDataIterCodeIndex;          // The index of the current glyph code in the array
+    TRect iGlyphDataIterRect;               // The current glyph rectangle.
+    TInt  iFbsFontHandle;                   // The Font Handle the iterator was opened with  
+    RFbsSession* iFbs;
+    };
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsglyphdataiterator.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,465 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32def.h>
+#include <gdi.h>
+#include <graphics/gdi/gdistructs.h>
+#include <graphics/gdi/gdiconsts.h>
+#include <graphics/fbsglyphdataiterator.h>
+#include "FbsMessage.h"
+#include "UTILS.H"
+
+const TInt KFbsGlyphDataIterCodeInvalid = -1;
+
+extern void Panic(TFbsPanic aPanic);
+
+/**
+The default constructor sets the iterator to a closed and empty state. It 
+is the only way of constructing an iterator as instances cannot be copied by 
+assignment or passed by value.
+ */
+EXPORT_C RFbsGlyphDataIterator::RFbsGlyphDataIterator() :
+    iImpl(NULL)
+    {
+    }
+
+/**
+For a given font (aFont), this method retrieves the glyph data for a list of 
+glyph codes (aGlyphCodes), containing a number (aCount) of codes. On success, 
+the iterator is initialised with the data for the first glyph in aGlyphCodes.
+
+The memory allocated to aGlyphCodes must not be freed or altered while the 
+iterator is in use (i.e. until the iterator has been closed). 
+
+Open() may not be called on an already open iterator. In order to re-open an 
+iterator, it must first be closed by a call tor Close().
+
+If a glyph code is passed in that is not a recognised glyph code for the 
+associated font, an empty-box glyph will be returned. This behaviour is 
+consistent with CFbsFont::GetCharacterData().
+
+@pre The iterator is not already open. 
+
+@param aFont The font to provide the glyph code data for.
+@param aGlyphCodes An array of glyph codes that the iterator will 
+	provide data for. This memory allocated for this array must not be 
+	freed before the iterator is closed.
+@param aCount The number of glyph codes in aGlyphCodes.
+
+@return 
+	KErrNone, if the iterator is successfully initialised to retrieve 
+		the glyph data;
+	KErrInUse, if the iterator is already open, in which case the state of
+        the iterator is left unchanged;
+	KErrNoMemory, if the iterator cannot be opened due to insufficient 
+		system memory;
+	KErrNotSupported, if aFont refers to a bitmap font or an outline & shadow
+        font, if the required version of the hardware driver is not available
+        (EGL 1.3 or later is required), or if RSgImages are not supported by
+        the system;
+	KErrArgument, if aCount is negative or zero, or if aGlyphCodes is null.
+ */
+EXPORT_C TInt RFbsGlyphDataIterator::Open(CFbsFont& aFont, const TUint* aGlyphCodes, TInt aCount)
+	{  
+	if (iImpl)
+		{
+		return KErrInUse;
+		}
+	if ((aCount <= 0) || !aGlyphCodes)
+		{
+		return KErrArgument;
+		}
+	if (!aFont.Address()->IsOpenFont())
+        {
+        return KErrNotSupported;
+        }
+    TInt glyphBitmapType = aFont.Address()->GlyphBitmapType();
+    if (!( (glyphBitmapType == EMonochromeGlyphBitmap) || (glyphBitmapType == EAntiAliasedGlyphBitmap) ))
+        {
+        //Only supported bitmap types can be used i.e. EMonochromeGlyphBitmap or EAntiAliasedGlyphBitmap
+        return KErrNotSupported;
+        }
+    // Check that the max width and height of the font are both no more than 2048.
+    // This is the smallest maximum size an RSgImage can be created with.
+    // This limit is arbitrarily set as it should cover nearly all use cases.
+    const TInt KMaxFontSizeInPixels = 2048;
+    TInt maxHeight = aFont.FontMaxHeight();
+    TInt maxWidth = aFont.MaxCharWidthInPixels();
+    if ( (KMaxFontSizeInPixels < maxHeight) || (KMaxFontSizeInPixels < maxWidth) )
+        {
+        return KErrTooBig;
+        }
+    // Construct implementor object that holds the state for the iterator.
+	iImpl = new CGlyphDataIteratorImpl(aFont.iHandle, aGlyphCodes, aCount);
+	if (!iImpl)
+	    {
+	    return KErrNoMemory;
+	    }
+	TInt err = iImpl->Initialise();
+	if (err != KErrNone)
+	    {
+        Close();
+	    }
+	return err;   
+	}
+
+/**
+Moves the iterator to the data for the next glyph code in the array passed 
+into RFbsGlyphDataIterator::Open(). Data for the glyph can then be accessed 
+using the Image(), Rect() and Metrics() methods.
+
+Once Next() has been called, the references returned by Image(), Rect() and 
+Metrics() methods during the previous iteration should be considered invalid 
+and must be discarded. 
+
+Calling Next() repeatedly will iterate through the glyph data for all the glyph
+codes, until it has reached the last glyph code in the array (assuming no errors
+are encountered), at which point KErrNotFound is returned, and the array of glyph
+codes passed to RFbsGlyphDataIterator::Open() can safely be deleted.
+
+If the call was successful, KErrNone is returned. If an error is encountered an
+error code will be returned and the state of the iterator is left unchanged.
+
+@pre The iterator has been opened by a successful call to Open().
+@post The properties of the iterator are of the glyph corresponding
+	to the next code passed in the array to Open().	However, if an error code 
+	was returned, the state of the iterator	is unchanged.
+	
+@return 
+	KErrNone, if the iterator was successfully advanced;
+	KErrNotFound, if the iterator is already at the last element and cannot
+		be advanced any further;
+	KErrNoMemory, if there is insufficient system memory available;
+	KErrNoGraphicsMemory, if there is insufficient graphics memory available.
+	
+@panic FBSCLI 31, if the iterator is not open.
+@panic FBSERV -8, if as a result of this call, communication with the 
+    server is invoked, and the associated CFbsFont has been destroyed.
+ */
+EXPORT_C TInt RFbsGlyphDataIterator::Next()
+    {
+    __ASSERT_ALWAYS(iImpl, Panic(EFbsPanicGlyphDataIteratorClosed));
+    return iImpl->Next();
+    }
+
+/**
+Closes the iterator and releases its internal resources. After calling, all data 
+retrieved by the iterator is no longer safe to use. Once closed, this iterator 
+can be re-opened. Calling Close() on an already closed iterator has no effect.
+
+Once an iterator is closed, the array of glyphs (aGlyphCodes) passed to
+RFbsGlyphDataIterator::Open() can safely be deleted.
+
+@post The iterator is closed.
+ */
+EXPORT_C void RFbsGlyphDataIterator::Close()
+    {
+    delete iImpl;
+    iImpl = NULL;
+    }
+
+/**
+Returns a reference to the RSgImage that contains the glyph for the current 
+iteration. The image representation of the glyph is the same as the image 
+returned by the existing CFbsFont::GetCharacterData() method (i.e. an alpha mask). 
+
+The RSgImage should only be considered a temporary handle for use in this 
+iteration, and should not be used after a call to Next() or Close() has 
+been made.
+
+Note: For glyphs such as space which have no visible representation, Image() 
+will return a null image handle (i.e. RSgImage::IsNull() returns ETrue). This 
+cannot be used for drawing. In this case Rect() will be empty however 
+Metrics() will still be valid. 
+
+@pre The iterator has been initialised by successfully calling Open().
+     
+@return A handle to the image where the glyph for this iteration is stored.
+     
+@panic FBSCLI 31, if the iterator is not open.
+ */
+EXPORT_C const RSgImage& RFbsGlyphDataIterator::Image() const
+    {
+    __ASSERT_ALWAYS(iImpl, Panic(EFbsPanicGlyphDataIteratorClosed));
+    __ASSERT_DEBUG(!iImpl->iGlyphBatch.IsEmpty(), Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    return iImpl->iGlyphBatch.First()->iImage;
+    }
+
+/**
+Returns the area within the RSgImage where the glyph for the current
+iteration is located. The reference returned by Rect() should be considered 
+temporary for use within this iteration and should not be used after a call to 
+Next() or Close() has been made.
+ 
+@pre The iterator has been initialised by successfully calling Open().
+     
+@return A rectangle representing the position and size in pixels, 
+	of the glyph for this iteration on the RSgImage provided by Image().
+     
+@panic FBSCLI 31, if the iterator is not open.
+ */
+EXPORT_C const TRect& RFbsGlyphDataIterator::Rect() const
+    {
+    __ASSERT_ALWAYS(iImpl, Panic(EFbsPanicGlyphDataIteratorClosed));
+    __ASSERT_DEBUG(!iImpl->iGlyphBatch.IsEmpty(), Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    return iImpl->iGlyphDataIterRect;
+    }
+
+/**
+Returns the glyph metrics for the current iteration. The reference returned by 
+Metrics() should be considered temporary for use within this iteration and 
+should not be used after a call to Next() or Close() has been made.
+
+@pre The iterator has been initialised by successfully calling Open().
+ 
+@return The metrics for the glyph at the current iteration.
+
+@panic FBSCLI 31, if the iterator is not open.
+ */
+EXPORT_C const TOpenFontCharMetrics& RFbsGlyphDataIterator::Metrics() const
+    {
+    __ASSERT_ALWAYS(iImpl, Panic(EFbsPanicGlyphDataIteratorClosed));
+    __ASSERT_DEBUG(!iImpl->iGlyphBatch.IsEmpty(), Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    return iImpl->iGlyphBatch.First()->iInfo.iMetrics;
+    }
+
+/**
+Returns the glyph code associated with the data for the current iteration.
+
+@pre The iterator has been initialised by successfully calling Open().
+ 
+@return The glyph code of the glyph at the current iteration.
+
+@panic FBSCLI 31, if the iterator is not open.
+ */
+EXPORT_C TUint RFbsGlyphDataIterator::GlyphCode() const
+    {
+    __ASSERT_ALWAYS(iImpl, Panic(EFbsPanicGlyphDataIteratorClosed));
+    __ASSERT_DEBUG(!iImpl->iGlyphBatch.IsEmpty(), Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    return iImpl->iGlyphDataIterCodes[iImpl->iGlyphDataIterCodeIndex];
+    }
+
+
+/**
+Constructs a CGlyphDataIteratorImpl. 
+@param aFbsFontHandle The handle of the FbsFont that the iterator is working with.
+@param aGlyphCodes The array of glyph codes sent to RFbsGlyphDataIterator::Open()
+@param aCount The number of glyph codes in aGlyphCodes.
+ */
+CGlyphDataIteratorImpl::CGlyphDataIteratorImpl(TInt aFbsFontHandle, const TUint* aGlyphCodes, TInt aCount) :
+    iGlyphBatch(_FOFF(TGlyphBatchItem, iLink)),
+    iGlyphDataIterCodes(aGlyphCodes),
+    iGlyphDataIterCodeCount(aCount),
+    iGlyphDataIterCodeIndex(KFbsGlyphDataIterCodeInvalid),
+    iFbsFontHandle(aFbsFontHandle)
+    {
+    }
+
+/** 
+Destructor. Releases all resources, disconnects from server and frees any
+items in the list of batched items.
+ */
+CGlyphDataIteratorImpl::~CGlyphDataIteratorImpl()
+    {
+    if (iFbs)
+        {
+        if (iGlyphDataIterCodeIndex != KFbsGlyphDataIterCodeInvalid)
+            {
+            //Send the No-Op command to ensure that the "In Transit" RSgImage(s) are closed.
+            iFbs->SendCommand(EFbsMessNoOp);
+            }
+        RFbsSession::Disconnect();
+        iFbs = NULL;
+        }
+    while (!iGlyphBatch.IsEmpty())
+        {
+        TGlyphBatchItem* item = iGlyphBatch.First();
+        item->iImage.Close();
+        iGlyphBatch.Remove(*item);
+        delete item;
+        }
+    iGlyphBatch.Reset();
+    }
+
+/**
+Sets up the CGlyphDataIteratorImpl, populating the first batch of glyphs.
+Should only be called once, immediately after construction.
+ */
+TInt CGlyphDataIteratorImpl::Initialise()
+    {
+    __ASSERT_DEBUG(iFbsFontHandle, Panic(EFbsPanicGlyphDataIteratorInvalidState));    
+    __ASSERT_DEBUG(iGlyphDataIterCodes, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    __ASSERT_DEBUG(iGlyphDataIterCodeCount, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    __ASSERT_DEBUG(iGlyphDataIterCodeIndex == KFbsGlyphDataIterCodeInvalid, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    
+    // If the client already has a session open, this is just a reference counting exercise and should incur no performance impact.
+    TInt err = RFbsSession::Connect();
+    if (err == KErrNone)
+        {
+        iFbs = RFbsSession::GetSession();
+        err = UpdateGlyphBatch(0);
+        }
+    if (err == KErrNone)
+        {
+        iGlyphDataIterCodeIndex = 0;
+        UpdateGlyphRect();
+        }
+    return err;
+    }
+
+/**
+Increments the current iteration if possible, re-sending the request
+for more glyphs if the current batch of glyphs is down to the last
+item.
+@see RFbsGlyphDataIterator::Next()
+ */
+TInt CGlyphDataIteratorImpl::Next()
+    {
+    __ASSERT_DEBUG(!iGlyphBatch.IsEmpty(), Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    if ( (iGlyphDataIterCodeIndex + 1) >= iGlyphDataIterCodeCount) 
+        {
+        return KErrNotFound; 
+        }
+    TInt err = UpdateGlyphBatch(iGlyphDataIterCodeIndex + 1);
+    if (err == KErrNone)
+        {
+        ++iGlyphDataIterCodeIndex;
+        // Close the current image and pop the head of the batch.
+        TGlyphBatchItem* item = iGlyphBatch.First();
+        item->iImage.Close();
+        iGlyphBatch.Remove(*item);
+        delete item;
+        __ASSERT_DEBUG(!iGlyphBatch.IsEmpty(), Panic(EFbsPanicGlyphDataIteratorInvalidState));
+        UpdateGlyphRect();
+        }
+    return err;
+    }
+
+/**
+Checks whether a call to the server is required to get a new batch of glyph 
+info, and processes the response from the server as necessary.
+
+@param aIndex Specifies the index into the glyph array which needs to be in
+the active glyph batch. If it is not there, a request is made to the server
+to get it.
+@return KErrNone if getting at least one glyph succeeded or a call to the
+    server was not necessary, otherwise one of the system wide error codes.
+@panic FBSCLI 31 (debug only), if the iterator is not open
+@panic FBSCLI 33 (debug only), if an unexpected number of glyphs was received
+    as a result of requesting glyphs from the server, or if the current batch
+    of glyphs is empty when there should be at least one item.
+ */
+TInt CGlyphDataIteratorImpl::UpdateGlyphBatch(TInt aIndex)
+    {
+    __ASSERT_DEBUG(Rng(0, aIndex, iGlyphDataIterCodeCount - 1), Panic(EFbsPanicGlyphDataIteratorIndexOutOfRange));
+
+    TInt err = KErrNone;
+    
+    TBool needMoreGlyphs = EFalse;
+    if (iGlyphBatch.IsEmpty())
+        {
+        // Current batch is empty, must request more. Should only get here when the iterator 
+        // is first opened, since one item should always be in the list from then on.
+        __ASSERT_DEBUG(aIndex == 0, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+        needMoreGlyphs = ETrue;
+        }
+    else if (iGlyphBatch.IsLast(iGlyphBatch.First()))
+        {
+        // Only one item in the list. 
+        needMoreGlyphs = ETrue;
+        }
+    
+    if (needMoreGlyphs)
+        {
+        // If the array of batched images is empty OR only one left, means we need to request a new batch.
+        // We make sure there is at least one glyph in the batch so the iterator is always usable even
+        // when a failure to move to the next iteration occurs.
+    
+        TBool glyphAddedToBatch = EFalse;
+        TUint glyphCodes[KMaxGlyphBatchSize];
+        
+        TInt numGlyphsToRequest = Min(iGlyphDataIterCodeCount - aIndex, KMaxGlyphBatchSize);        
+        (void)Mem::Copy(glyphCodes, &(iGlyphDataIterCodes[aIndex]), sizeof(TUint) * numGlyphsToRequest);
+        TPckg<TUint[KMaxGlyphBatchSize]> argGlyphCodes(glyphCodes);
+        
+        TGlyphImageInfo rcvdGlyphInfo[KMaxGlyphBatchSize];
+        TPckg<TGlyphImageInfo[KMaxGlyphBatchSize]> argGlyphInfo(rcvdGlyphInfo);
+        
+        if (numGlyphsToRequest < KMaxGlyphBatchSize)
+            {
+            argGlyphCodes.SetLength(numGlyphsToRequest * sizeof(TUint));
+            argGlyphInfo.SetLength(numGlyphsToRequest * sizeof(TGlyphImageInfo));
+            }
+        
+        err = iFbs->SendCommand(EFbsMessGetGlyphs, TIpcArgs(iFbsFontHandle, &argGlyphCodes, &argGlyphInfo));
+        if (err == KErrNone)
+            {
+            __ASSERT_DEBUG(argGlyphInfo.Length() % sizeof(TGlyphImageInfo) == 0, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+            TInt numRcvdGlyphs = argGlyphInfo.Length() / sizeof(TGlyphImageInfo);
+            __ASSERT_DEBUG(numRcvdGlyphs > 0, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+            __ASSERT_DEBUG(numRcvdGlyphs <= KMaxGlyphBatchSize, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+            
+            // Store the received glyph data, and open the image handles so that the IDs
+            // will not be released by FbServ between now and the client using them.
+            // If a failure occurs while processing one of the recevied glyphs,
+            // abort the rest but keep the ones that succeeded.
+            for (TInt i = 0; (i < numRcvdGlyphs) && (err == KErrNone); ++i)
+                {
+                TGlyphBatchItem* glyphEntry = new TGlyphBatchItem;
+                if (!glyphEntry)
+                    {
+                    err = KErrNoMemory;
+                    }
+                else
+                    {
+                    glyphEntry->iInfo = rcvdGlyphInfo[i];
+                    
+                    RSgImage glyphImage;
+                    if (rcvdGlyphInfo[i].iImageId != KSgNullDrawableId)
+                        {
+                        err = glyphEntry->iImage.Open(rcvdGlyphInfo[i].iImageId);
+                        }
+                    if (err == KErrNone)
+                        {
+                        iGlyphBatch.AddLast(*glyphEntry);
+                        glyphAddedToBatch = ETrue;
+                        }
+                    else
+                        {
+                        delete glyphEntry;
+                        }
+                    }
+                }
+            }
+        if (err != KErrNone && glyphAddedToBatch)
+            {
+            // There was an error adding an item to the batch. Rather than return the
+            // error to the client, ignore it and use what glyphs we successfully batched.
+            err = KErrNone; 
+            }
+        }    
+    return err;
+    }
+
+/**
+Updates the glyph rectangle member based on the current glyph metrics.
+@post The iGlyphDataIterRect member is updated to reflect the position
+    and size of the currently active glyph.
+ */
+void CGlyphDataIteratorImpl::UpdateGlyphRect()
+    {
+    iGlyphDataIterRect.iTl = TPoint(iGlyphBatch.First()->iInfo.iPosX, iGlyphBatch.First()->iInfo.iPosY);
+    iGlyphDataIterRect.SetSize(TSize(iGlyphBatch.First()->iInfo.iMetrics.Width(), iGlyphBatch.First()->iInfo.iMetrics.Height()));
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsglyphdataiterator.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,53 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+#ifndef FBSGLYPHDATAITERATOR_H
+#define FBSGLYPHDATAITERATOR_H
+
+#include <e32def.h>
+#include <fbs.h>
+#include <sgresource/sgimage.h>
+
+class CGlyphDataIteratorImpl;
+class TOpenFontCharMetrics;
+
+/**
+An iterator class to provide access to glyph image data and metrics, 
+one glyph per iteration.
+@publishedPartner
+@prototype
+*/
+NONSHARABLE_CLASS(RFbsGlyphDataIterator)
+	{
+public:
+	IMPORT_C RFbsGlyphDataIterator();
+	IMPORT_C TInt Open(CFbsFont& aFont, const TUint* aGlyphCodes, TInt aCount);
+	IMPORT_C TInt Next();
+	IMPORT_C void Close();
+	IMPORT_C const RSgImage& Image() const;
+	IMPORT_C const TRect& Rect() const;
+	IMPORT_C const TOpenFontCharMetrics& Metrics() const;
+	IMPORT_C TUint GlyphCode() const;
+	
+private:
+	RFbsGlyphDataIterator(const RFbsGlyphDataIterator&);
+	const RFbsGlyphDataIterator& operator =(const RFbsGlyphDataIterator&);
+	
+private:
+    CGlyphDataIteratorImpl* iImpl;
+	};
+
+#endif /* FBSGLYPHDATAITERATOR_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsglyphmetricsarray.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,274 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+#include <e32def.h>
+#include <gdi.h>
+#include <graphics/gdi/gdistructs.h>
+#include <graphics/gdi/gdiconsts.h>
+#include <graphics/fbsglyphmetricsarray.h>
+#include "UTILS.H"
+#include "FbsMessage.h"
+
+// 'most significant bit' flag to ensure value is interpreted as a glyph code rather than an ascii code
+const TUint KGlyphCodeFlag = 0x80000000;      
+
+extern void Panic(TFbsPanic aPanic);
+
+/** Helper function for converting an offset (that was calculated using
+PointerToOffset()) back to a pointer relative to the passed heap base.
+@param aOffset The offset to be converted to a pointer.
+@param aHeapBase A pointer to the heap base of the current process.
+@return A pointer relative to the passed heap base.
+*/
+static TAny* OffsetToPointer(const TInt aOffset, TUint8* aHeapBase)
+    {
+    if ( (aOffset != 0) && (aHeapBase != NULL) )
+        {
+        return (TAny*)(aOffset + aHeapBase);
+        }
+    return NULL;
+    }
+
+/**
+Constructs an empty RFbsGlyphMetricsArray instance. This will not allocate any memory.
+ */
+EXPORT_C RFbsGlyphMetricsArray::RFbsGlyphMetricsArray() :
+    iGlyphCodes(NULL)
+    {
+    }
+
+/**
+Allocates the memory for the array if it has not already been allocated, and 
+populates the RFbsGlyphMetricsArray with the metrics information for aCount glyph 
+codes passed in as the array aGlyphCodes, for the font aFont. If the operation 
+is successful, KErrNone is returned and the array is populated with glyph 
+metrics data. Each entry in the array will be in the same order as the 
+corresponding codes in aGlyphCodes.
+
+The memory allocated to aGlyphCodes can be freed after the call to Get().
+
+Get() can be called on an RFbsGlyphMetricsArray multiple times without calling 
+Close(), since the memory for the array is not de-allocated until a call to 
+Close(). Calls to Get() will cause the previous content of the array to be 
+overwritten.
+
+In the event of an error code other than KErrNone, the state of the array
+will remain unchanged.
+ 
+@param aFont A font which to retrieve the glyph metrics for.
+@param aGlyphCodes An array of glyph codes to retrieve the metrics for.
+@param aCount The number of glyph codes in aGlyphCodes.
+
+@return
+	KErrNone, if the array is successfully populated with glyph metrics;
+	KErrNoMemory, if insufficient system memory is available;
+	KErrArgument, if aCount is negative or zero, or if aGlyphCodes is null;
+	KErrNotSupported, if aFont is a bitmap font.
+*/
+EXPORT_C TInt RFbsGlyphMetricsArray::Get(CFbsFont& aFont, const TUint* aGlyphCodes, TInt aCount)
+	{
+    if ((aCount <= 0) || !aGlyphCodes)
+        {
+        return KErrArgument;
+        }
+    if (iMetrics.Reserve(aCount) != KErrNone)
+        {
+        return KErrNoMemory;
+        }
+    if (!aFont.Address()->IsOpenFont())
+        {
+        return KErrNotSupported;
+        }
+    
+    iGlyphCodes = aGlyphCodes;
+    iCount = aCount;
+    TInt err = KErrNone;
+    
+    
+    // If iMetrics array already has a count greater than aCount, remove entries
+    // until count is same as aCount so that we can reuse the existing entries.
+    TInt numEntriesToRemove = iMetrics.Count() - aCount;
+    while (0 < numEntriesToRemove)
+        {
+        --numEntriesToRemove;
+        iMetrics.Remove(aCount + numEntriesToRemove);
+        }
+    const TInt indexToGrowArrayAt = iMetrics.Count();
+    
+    CBitmapFont* font = aFont.Address();
+    TUint ipcGlyphArrayIndex[KMaxMetricsBatchSize];
+    TInt ipcGlyphArrayIndexCount = 0;   
+    const TUint8* dummyBitmap;
+    TOpenFontCharMetrics charDataMetrics;
+            
+    for (TInt i = 0; i < aCount && (err == KErrNone); ++i)
+        {
+        // First check the cache in shared memory - if present it will avoid using IPC.
+        if (font->GetCharacterData(aFont.iFbs->ServerSessionHandle(), aGlyphCodes[i] | KGlyphCodeFlag, charDataMetrics, dummyBitmap))
+            {
+            if (i < indexToGrowArrayAt)
+                {
+                iMetrics[i] = charDataMetrics;
+                }
+            else
+                {
+                // Extending the size of the array, but memory is already reserved.
+                (void) iMetrics.Append(charDataMetrics);    
+                }
+            }            
+        else
+            {
+            // Not found in shared memory - instead add the index to index array, which will
+            // be processed when the array is full or at the end of the loop.
+            ipcGlyphArrayIndex[ipcGlyphArrayIndexCount++] = i;
+            if (ipcGlyphArrayIndexCount == KMaxMetricsBatchSize)
+                {
+                err = SendRecvGlyphMetrics(aFont, ipcGlyphArrayIndex, ipcGlyphArrayIndexCount, &iMetrics);
+                ipcGlyphArrayIndexCount = 0;
+                }
+            else if (i >= indexToGrowArrayAt)
+                {
+                // Add a metrics placeholder to keep the size of the array and the currently
+                // processed glyph in sync. It will later get overwritten when it is received
+                // from the server.
+                (void) iMetrics.Append(charDataMetrics);
+                }
+            }
+        }
+    if ((err == KErrNone) && (ipcGlyphArrayIndexCount != 0))
+        {
+        err = SendRecvGlyphMetrics(aFont, ipcGlyphArrayIndex, ipcGlyphArrayIndexCount, &iMetrics);
+        }
+    
+    __ASSERT_DEBUG((err != KErrNone) || (aCount == iMetrics.Count()), Panic(EFbsPanicGlyphMetricsArrayInvalidState));  
+    
+    return err;    
+	}
+/**
+Helper function for Get(). 
+Given a list of indices into a glyph code array, the corresponding glyph
+codes are made into a single list sent to the server, and the received glyph
+metrics are set in the array of metrics at the corresponding indices.
+
+@param aFont The font to receive the glyph metrics of.
+@param aArrayIndices An array of indices into the glyphcode array which
+    will be sent for requesting of metrics to the server.
+@param aArrayIndicesCount The number of glyphs in aGlyphArrayIndices.
+@param aMetrics The array which will store the resulting metrics objects upon
+    completion.
+@return KErrNone if successful, otherwise one of the system-wide error codes. 
+
+@panic FBSCLI 39 in debug builds only, if the parameters to this method are
+    invalid, or if the output array is of the wrong size when appending to it.
+ */
+TInt RFbsGlyphMetricsArray::SendRecvGlyphMetrics(CFbsFont& aFont, TUint* aArrayIndices, TInt aArrayIndicesCount, RArray<TOpenFontCharMetrics>* aMetrics) const
+    {
+    __ASSERT_DEBUG(aArrayIndicesCount > 0, Panic(EFbsPanicGlyphDataIteratorInvalidState)); 
+    __ASSERT_DEBUG(aArrayIndicesCount <= KMaxMetricsBatchSize, Panic(EFbsPanicGlyphDataIteratorInvalidState)); 
+    __ASSERT_DEBUG(aArrayIndices, Panic(EFbsPanicGlyphDataIteratorInvalidState));
+    TInt err = KErrNone;
+    
+    TUint glyphCodes[KMaxMetricsBatchSize];
+    for (TInt i = 0; i < aArrayIndicesCount; ++i)
+        {
+        glyphCodes[i] = iGlyphCodes[aArrayIndices[i]];
+        }
+    
+    TInt rcvdGlyphMetricsOffsets[KMaxMetricsBatchSize];
+    TPckg<TUint[KMaxMetricsBatchSize]> argGlyphCodes(glyphCodes);
+    TPckg<TInt[KMaxMetricsBatchSize]> argGlyphMetricsOffsets(rcvdGlyphMetricsOffsets);
+    if (aArrayIndicesCount < KMaxMetricsBatchSize)
+        {
+        argGlyphCodes.SetLength(aArrayIndicesCount * sizeof(TUint));
+        argGlyphMetricsOffsets.SetLength(aArrayIndicesCount * sizeof(TInt));
+        }   
+    err = aFont.iFbs->SendCommand(EFbsMessGetGlyphMetrics, TIpcArgs(aFont.iHandle, &argGlyphCodes, &argGlyphMetricsOffsets));
+    
+    if (err == KErrNone)
+        {
+        TInt numRcvdMetrics = argGlyphMetricsOffsets.Length() / sizeof(TInt);
+        __ASSERT_DEBUG(argGlyphMetricsOffsets.Length() % sizeof(TInt) == 0, Panic(EFbsPanicGlyphMetricsArrayInvalidState));
+        __ASSERT_DEBUG(numRcvdMetrics == aArrayIndicesCount, Panic(EFbsPanicGlyphMetricsArrayInvalidState));
+        
+        if (numRcvdMetrics == aArrayIndicesCount)
+            {
+            TInt arrayCount = aMetrics->Count();
+            TUint8* heapBase = aFont.iFbs->HeapBase();
+            for (TInt rcvdMetricsItem = 0; rcvdMetricsItem < numRcvdMetrics; ++rcvdMetricsItem)
+                {
+                TInt arrayIndex = aArrayIndices[rcvdMetricsItem];
+                // The array should never need to grow more than one item. If the difference is larger, 
+                // it means the glyph and the metrics are not in sync.
+                __ASSERT_DEBUG(arrayIndex <= arrayCount, Panic(EFbsPanicGlyphMetricsArrayInvalidState));
+                
+                TInt metricsOffset = rcvdGlyphMetricsOffsets[rcvdMetricsItem];              
+                const TOpenFontCharMetrics* metrics = (const TOpenFontCharMetrics*)(OffsetToPointer(metricsOffset, heapBase));
+                
+                if (arrayIndex < arrayCount)
+                    {
+                    // Copy metrics into existing element
+                    (*aMetrics)[arrayIndex] = *metrics;
+                    }
+                else if (arrayIndex == arrayCount)
+                    {
+                    // Memory should already be reserved by GetGlyphMetricsArray()
+                    (void) aMetrics->Append(*metrics);    
+                    ++arrayCount;
+                    }
+                }
+            }
+        else
+            {
+            // did not receive the same number of glyphs as was asked.
+            err = KErrGeneral;
+            }
+        }
+    return err;
+    }
+
+/**
+Closes the array, and releases the memory for the array. Calling Close() on an 
+already closed RFbsGlyphMetricsArray has no effect. 
+
+In the typical case where the array is a member of a class, Close() should only 
+be called in the destructor of that class.
+ */
+EXPORT_C void RFbsGlyphMetricsArray::Close()
+	{
+	iMetrics.Close();
+	}
+
+/**
+Retrieves the glyph metrics for the glyph which was at position aIndex in the 
+array passed to Get().
+
+@param aIndex The index of the entry in the array to access.
+@return The metrics for the glyph at the requested index.
+@panic FBSCLI 32, if aIndex is out of bounds.
+ */
+EXPORT_C const TOpenFontCharMetrics& RFbsGlyphMetricsArray::operator[](TInt aIndex) const
+	{
+	__ASSERT_ALWAYS(aIndex >= 0 && aIndex < iMetrics.Count(), Panic(EFbsPanicGlyphMetricsArrayOutOfBounds));
+	return (iMetrics)[aIndex];
+	}
+
+/**
+@return The number of glyph metrics held in the array.
+ */
+EXPORT_C TInt RFbsGlyphMetricsArray::Count() const
+	{
+	return iMetrics.Count();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsglyphmetricsarray.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,47 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef FBSGLYPHMETRICSARRAY_H
+#define FBSGLYPHMETRICSARRAY_H
+
+#include <e32def.h>
+#include <openfont.h>
+#include <fbs.h>
+
+/**
+@publishedPartner
+@prototype
+*/
+NONSHARABLE_CLASS(RFbsGlyphMetricsArray)
+	{
+public:
+	IMPORT_C RFbsGlyphMetricsArray();
+	IMPORT_C TInt Get(CFbsFont& aFont, const TUint* aGlyphCodes, TInt aCount);
+	IMPORT_C void Close();
+	IMPORT_C TInt Count() const;
+	IMPORT_C const TOpenFontCharMetrics& operator[](TInt aIndex) const;
+	
+private:
+	RFbsGlyphMetricsArray(const RFbsGlyphMetricsArray&);
+	const RFbsGlyphMetricsArray& operator =(const RFbsGlyphMetricsArray&);
+	TInt SendRecvGlyphMetrics(CFbsFont& aFont, TUint* aArrayIndices, TInt aArrayIndicesCount, RArray<TOpenFontCharMetrics>* aMetrics) const;    
+	
+private:
+	RArray<TOpenFontCharMetrics> iMetrics;
+	const TUint* iGlyphCodes;
+	TInt iCount;
+	};
+
+#endif /* FBSGLYPHMETRICSARRAY_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsoogmmessage.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,45 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+// Message class defining the action desired in response to a notification from
+// FBserv's Out-of-Graphics-Memory plug-in.
+//
+#ifndef FBSOOGMMESSAGE_H
+#define FBSOOGMMESSAGE_H
+
+
+class TFbsOogmMessage
+    {
+public:
+
+    enum TOogmAction
+        {
+        EFbsOogmNoAction = 0,
+        EFbsOogmLowNotification,
+        EFbsOogmOkayNotification
+        };
+
+public:
+    inline TFbsOogmMessage();
+    inline TFbsOogmMessage( TOogmAction aOogmAction, TInt aBytesToFree, TInt aFlags );
+
+public:
+    TOogmAction iOogmNotification;
+    TInt iBytesToFree;
+    TInt iFlags;
+    };
+
+
+#include <graphics/fbsoogmmessage.inl>
+#endif // FBSOOGMMESSAGE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsoogmmessage.inl	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,33 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+#ifndef FBSOOGMMESSAGE_INL
+#define FBSOOGMMESSAGE_INL
+
+const TInt KFbsOogmBytesToFreeNone = 0;
+const TInt KFbsOogmFlagsClear = 0;
+
+
+inline TFbsOogmMessage::TFbsOogmMessage()
+: iOogmNotification( EFbsOogmNoAction ), iBytesToFree( KFbsOogmBytesToFreeNone ), iFlags( KFbsOogmFlagsClear )
+    {
+    }
+
+
+inline TFbsOogmMessage::TFbsOogmMessage( TOogmAction aOogmAction, TInt aBytesToFree, TInt aFlags )
+: iOogmNotification( aOogmAction ), iBytesToFree( aBytesToFree), iFlags( aFlags )
+    {
+    }
+
+#endif // FBSOOGMMESSAGE_INL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsoogmplugin.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,162 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Graphics-Out-Of-Memory plugin for Font and Bitmap server.
+*
+*/
+
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <graphics/fbsoogmmessage.h>
+#include <w32std.h>
+#include <FBS.H>
+
+#include "fbsoogmplugin.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "fbsoogmpluginTraces.h"
+#endif
+
+
+/**
+ Called by the GOoM monitor framework in the case of low GPU memory.
+
+ Note: In the case of failure, this framework method will do so silently.
+
+ @param aBytesToFree The amount of GPU memory to be freed.
+ */
+void CFbsOogmMonitorPlugin::FreeRam( TInt aBytesToFree, TInt aFlags )
+    {
+    OstTrace0( TRACE_NORMAL, CFBSOOGMMONITORPLUGIN_FREERAM, "> " );
+
+    if ( (NULL == RFbsSession::GetSession()) )
+         {
+         if ( KErrNone != RFbsSession::Connect() )
+             {
+             OstTrace0( TRACE_NORMAL, DUP2_CFBSOOGMMONITORPLUGIN_FREERAM, "< No FbsSession" );
+
+             return;
+             }
+
+         }
+
+    TFbsOogmMessage oogmMessage( TFbsOogmMessage::EFbsOogmLowNotification, aBytesToFree, aFlags );
+    (void)RFbsSession::GetSession()->ConveyOogmMessage( oogmMessage );
+
+    OstTrace0( TRACE_NORMAL, DUP1_CFBSOOGMMONITORPLUGIN_FREERAM, "< " );
+    }
+
+
+
+/**
+ Called by the GOoM monitor framework in the case of normal GPU memory-usage being permissible.
+
+ Note: In the case of failure, this framework method will do so silently.
+ */
+void CFbsOogmMonitorPlugin::MemoryGood( TInt aFlags )
+    {
+    OstTrace0( TRACE_NORMAL, CFBSOOGMMONITORPLUGIN_MEMORYGOOD, ">" );
+
+    if ( (NULL == RFbsSession::GetSession()) )
+         {
+        if ( KErrNone != RFbsSession::Connect() )
+            {
+            OstTrace0( TRACE_NORMAL, DUP2_CFBSOOGMMONITORPLUGIN_MEMORYGOOD, "< No FbsSession" );
+
+            return;
+            }
+
+         }
+
+    const TInt KOogmDummyIntegerArgument = 0;
+    TFbsOogmMessage oogmMessage( TFbsOogmMessage::EFbsOogmOkayNotification, KOogmDummyIntegerArgument, aFlags );
+    (void)RFbsSession::GetSession()->ConveyOogmMessage( oogmMessage );
+
+	OstTrace0( TRACE_NORMAL, DUP1_CFBSOOGMMONITORPLUGIN_MEMORYGOOD, "<" );
+    }
+
+
+
+/**
+
+ */
+CFbsOogmMonitorPlugin::CFbsOogmMonitorPlugin()
+    {
+    }
+
+
+
+/**
+
+ */
+CFbsOogmMonitorPlugin::~CFbsOogmMonitorPlugin()
+    {
+    RFbsSession::Disconnect();
+    }
+
+
+
+/**
+
+ */
+void CFbsOogmMonitorPlugin::ConstructL()
+    {
+    CGOomMonitorPluginBase::ConstructL();
+    }
+
+
+
+/**
+
+ */
+TAny* CreatePlugin()
+    {
+    CFbsOogmMonitorPlugin* self = new CFbsOogmMonitorPlugin;
+    if ( self )
+        {
+        TRAPD( err, self->ConstructL() );
+        if ( err != KErrNone )
+            {
+            delete self;
+            self = NULL;
+            }
+        }
+
+    return self;
+    }
+
+
+
+/**
+
+ */
+const TImplementationProxy ImplementationTable[] =
+    {
+    { {0x2002B638}, ::CreatePlugin }
+    };
+
+
+
+/**
+
+ */
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+    OstTrace0( TRACE_NORMAL, _IMPLEMENTATIONGROUPPROXY, "> ::ImplementationGroupProxy" );
+    
+    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ) ;
+    return ImplementationTable;
+    }
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsoogmplugin.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Graphics-Out-Of-Memory plugin for Font and Bitmap server.
+*
+*/
+
+#ifndef FBSOOGMPLUGIN_H
+#define FBSOOGMPLUGIN_H
+
+#include <goommonitorplugin.h>
+
+class CFbsOogmMonitorPlugin : public CGOomMonitorPlugin
+    {
+public:
+    CFbsOogmMonitorPlugin();
+    ~CFbsOogmMonitorPlugin();
+    void ConstructL();
+
+public:
+    void FreeRam( TInt aBytesToFree, TInt aFlags );
+    void MemoryGood( TInt aFlags );
+    };
+
+#endif /* FBSOOGMPLUGIN_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/fbsoogmplugin.rss	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* ============================================================================
+*  Name        : FbsOogmPlugin.rss
+*  Part of     : FbSrv OOGM Plugin
+*  Interface   :  
+*  Description : ECOM Resource file for Font and bitmap server OOGM Framework Plugin
+*
+*  Copyright © 2010 Nokia.  All rights reserved.
+*  This material, including documentation and any related computer
+*  programs, is protected by copyright controlled by Nokia.  All
+*  rights are reserved.  Copying, including reproducing, storing,
+*  adapting or translating, any or all of this material requires the
+*  prior written consent of Nokia.  This material also contains
+*  confidential information which may not be disclosed to others
+*  without the prior written consent of Nokia.
+* ============================================================================
+* Template version: 4.0
+*/
+
+#include <ecom/registryinfov2.rh>
+#include <goommonitorplugin.hrh>
+
+
+
+
+// ---------------------------------------------------------------------------
+// Registration info for ECOM framework.
+// ---------------------------------------------------------------------------
+//
+RESOURCE REGISTRY_INFO theInfo
+    {
+    resource_format_version = RESOURCE_FORMAT_VERSION_2; 
+    dll_uid = 0x2002B638;
+    interfaces = 
+        {
+        INTERFACE_INFO
+            {
+            interface_uid = KGOomPluginInterfaceUidValue;
+            implementations = 
+                {
+                IMPLEMENTATION_INFO
+                    {
+                    implementation_uid = 0x2002B638;
+                    version_no = 1;
+                    display_name = "FbsOogmPlugin";
+                    opaque_data = "";
+					default_data = "FbsOogmPlugin";
+                    }
+                };       
+            }
+        };
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/glyphatlas.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,1060 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "glyphatlas.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "glyphatlasTraces.h"
+#endif
+
+
+extern void Panic(TFbsPanic aPanic);
+
+static TInt16 Load16(const TUint8* aPtr);
+static void DecodeBinaryData(const TSize& aGlyphSize, const TUint8* aEncodedData, TUint8* aByteData);
+static void DecodeBinaryDataExLarge(const TSize& aGlyphSize, const TUint8* aEncodedData, TUint8* aByteData);
+static void Convert1BppTo8Bpp(TUint32 aSrcData, TUint8*& aDestDataPtr, const TUint8* aDestDataPtrLimit);
+static void CopyCharLine(TUint8*& aByteDataPtr, TInt aWidthInBytes, const TUint8* aSrcData, TInt aBitShift, TInt16 aRepeatCount);
+
+// === CGlyphAtlas Functions ===
+
+/**
+Glyph Atlas constructor.
+@param aMaxCacheSizeInBytes The maximum amount of specialised graphics memory 
+	that the glyph atlas should use. If this value is KGlyphAtlasNoCacheLimit,
+	then there is no limit and the atlas will use as much memory as is available
+	in the system.
+*/
+CGlyphAtlas::CGlyphAtlas(TInt aMaxCacheSizeInBytes)
+	:iLruPageList(_FOFF(CGlyphAtlasPage, iLink)),
+	 iFontEntryArray(32, _FOFF(TFontEntryMap, iFont)),
+	 iMaxCacheSizeInBytes(aMaxCacheSizeInBytes),
+	 iMaxCacheSizeHigh(aMaxCacheSizeInBytes),
+	 iGpuCacheSizeLimitIsMax(ETrue)
+	{
+    iMaxCacheSizeLow = ( KGlyphAtlasNoCacheLimit == aMaxCacheSizeInBytes )
+                     ? KGlyphAtlasLowMemCacheLimitDefault
+                     : ( aMaxCacheSizeInBytes / KGlyphAtlasLowMemCacheLimitDivisor );
+	}
+
+/**
+Glyph Atlas destructor.
+Frees all the RSgImage handles, frees all the allocated system memory, and
+closes the Graphics Resource driver. 
+*/
+CGlyphAtlas::~CGlyphAtlas()
+	{
+	// cycle through all the font entries and destroy them
+	for (TInt ii = iFontEntryArray.Count()-1; ii >= 0; --ii)
+		{
+		DeleteFontEntry(iFontEntryArray[ii].iEntry);
+		}
+	iFontEntryArray.Close();
+	__ASSERT_DEBUG(iLruPageList.IsEmpty(), Panic(EFbsPanicGlyphAtlasInconsistentState));
+	
+	// there shouldn't be any remaining pages, but if there are, destroy them.
+	while (!iLruPageList.IsEmpty())
+		{
+		delete iLruPageList.First();
+		}
+	iSgDriver.Close();
+	}
+
+/**
+Factory constructor method. Creates a new glyph atlas.
+
+@param aMaxCacheSizeInBytes The size in bytes, to use as the upper limit
+	for the size of memory used by the glyph images in the atlas. If this
+	value is KGlyphAtlasNoCacheLimit, then there is no limit and the atlas
+	will use as much memory as is available in the system.
+
+@return A pointer to the newly-constructed atlas
+
+@leave KErrNoMemory if there was insufficient memory to create the atlas, 
+	or a system wide error code if its RSgDriver failed to open.
+*/
+CGlyphAtlas* CGlyphAtlas::NewL(TInt aMaxCacheSizeInBytes)
+	{
+	CGlyphAtlas* self = new (ELeave) CGlyphAtlas(aMaxCacheSizeInBytes);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(); // self;
+	return self;
+	}
+
+/**
+Two-phase constructor.
+@leave A system wide error code if RSgDriver failed to open.
+*/
+void CGlyphAtlas::ConstructL()
+	{
+	User::LeaveIfError(iSgDriver.Open());
+	}
+
+/**
+Retrieves a glyph from the atlas.
+If the glyph is found, the glyph data passed in is populated.
+
+@param[in] aFont The font the glyph belongs to.
+@param[in] aGlyphCode The glyph code for the glyph being requested.
+@param[out] aGlyphImageInfo The glyph image information if this function is successful.
+@return KErrNone if the glyph is found, KErrNotFound if not. 
+*/
+TInt CGlyphAtlas::GetGlyph(const CBitmapFont& aFont, TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo)
+	{
+    OstTraceExt2( TRACE_NORMAL, CGLYPHATLAS_GETGLYPH, "> f=%x; gc=%04x",(TUint)&aFont, aGlyphCode);
+    
+	CGlyphAtlasFontEntry* fontEntry = FindFontEntry(aFont);
+	if (!fontEntry)
+		{
+        OstTrace0( TRACE_NORMAL, CGLYPHATLAS_GETGLYPH_END2, "< KErrNotFound");
+		return KErrNotFound;
+		}
+	TInt err = fontEntry->GetGlyph(aGlyphCode, aGlyphImageInfo);
+	
+	OstTraceExt5( TRACE_NORMAL, CGLYPHATLAS_GETGLYPH_END1, "< id=%08x%08x; w=%u; h=%u; err=%d", 
+	        (TUint)I64HIGH(aGlyphImageInfo.iImageId.iId), (TUint)I64LOW(aGlyphImageInfo.iImageId.iId),
+	        (TUint)aGlyphImageInfo.iMetrics.Width(), (TUint)aGlyphImageInfo.iMetrics.Height(), (TInt)err);
+	
+	return err;
+	}
+
+/**
+Adds a glyph to the atlas from a bitmap glyph and retrieves the glyph data.
+If there is insufficient memory to create a RSgImage, then the least recently 
+used pages (and all the glyphs contained within) are removed until there is 
+enough memory to continue.
+
+@param[in] aFont The font the glyph belongs to.
+@param[in] aArgs The information needed to create a glyph.
+@param[out] aGlyphImageInfo Upon return contains all the glyph image information needed to use the 
+		glyph in another process.
+@return KErrNone if the glyph was successfully added or other system-wide error.
+*/
+TInt CGlyphAtlas::AddGlyph(const CBitmapFont& aFont, const TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo)
+	{
+	OstTraceDefExt5( OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_ADDGLYPH, "> f=%x; bp=%08x; gc=%04x; w=%u; h=%u", 
+	        (TUint)&aFont, (TUint)aArgs.iBitmapPointer, aArgs.iGlyphCode, 
+	        aArgs.iMetrics->Width(), aArgs.iMetrics->Height());
+	
+    // Find font entry and create if none found
+	CGlyphAtlasFontEntry* fontEntry = FindFontEntry(aFont);
+	TBool isNewFont = EFalse;
+	if (!fontEntry)
+		{
+		// Create a new font.
+		fontEntry = CreateFontEntry(aFont);
+		if (!fontEntry)
+			{
+            OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_ADDGLYPH_END2, "< KErrNoMemory");
+			return KErrNoMemory;
+			}
+		isNewFont = ETrue;
+		}
+	TInt glyphSizeInBytes = 0;
+	TInt err = fontEntry->AddGlyph(aArgs, aGlyphImageInfo, glyphSizeInBytes);
+	if (KErrNone != err)
+		{
+		if (isNewFont)
+			{
+			DeleteFontEntry(fontEntry);
+			}
+		OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_ADDGLYPH_END3, "< err=%d", err);
+		return err;
+		}
+	iCacheSizeInBytes += glyphSizeInBytes;
+
+	// If there is a cache limit and it is now exceeded, remove the least
+	// recently used pages until the cache size is within the upper limit. Do 
+	// not remove the page relating to the glyph which is being added, which is 
+	// now at the head of the LRU array.
+	if (iMaxCacheSizeInBytes != KGlyphAtlasNoCacheLimit)
+		{
+		TBool morePagesToDelete = ETrue;
+		while ((iCacheSizeInBytes > iMaxCacheSizeInBytes) && morePagesToDelete)
+			{
+			morePagesToDelete = DeleteLeastRecentlyUsedPage(EFalse);
+			}
+		}
+	
+	OstTraceDefExt2(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_ADDGLYPH_END1, "< id=%08x%08x", 
+	            I64HIGH(aGlyphImageInfo.iImageId.iId), I64LOW(aGlyphImageInfo.iImageId.iId));
+    
+	return KErrNone;
+	}
+
+/**
+Releases all glyphs associated with a particular font when it has been
+released by the font system.
+
+@param aFont The font which is released.
+ */
+void CGlyphAtlas::FontReleased(const CBitmapFont& aFont)
+	{
+	OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_FONTRELEASED, "> f=%x", (TUint)&aFont);
+	
+    TInt index = iFontEntryArray.FindInUnsignedKeyOrder(TFontEntryMap(&aFont, NULL));
+	if (KErrNotFound == index)
+		{
+        OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_FONTRELEASED_END2, "< KErrNotFound");
+		return;
+		}
+	CGlyphAtlasFontEntry* fontEntry = iFontEntryArray[index].iEntry;
+	iCacheSizeInBytes -= fontEntry->SizeInBytes();
+	delete fontEntry;
+	iFontEntryArray.Remove(index);
+	OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_FONTRELEASED_END3, "< KErrNone");
+	}
+
+/**
+Searches the array of font entries to find the entry for the given font.
+If the font entry is found, the entry is returned. If not a NULL pointer is 
+returned.
+
+@param aFont The font to match an entry with.
+@return The font entry if a match is found, NULL if not. 
+*/
+CGlyphAtlasFontEntry* CGlyphAtlas::FindFontEntry(const CBitmapFont& aFont) const
+	{
+	TFontEntryMap entryToMatch(&aFont, NULL);
+	TInt index = iFontEntryArray.FindInUnsignedKeyOrder(entryToMatch);
+	if (KErrNotFound == index)
+		{
+		return NULL;
+		}
+	return iFontEntryArray[index].iEntry;
+	}
+
+/**
+Deletes the given font entry.
+The mapping from the font to the font entry is removed.
+
+@param aFontEntry The entry to delete.
+*/
+void CGlyphAtlas::DeleteFontEntry(CGlyphAtlasFontEntry* aFontEntry)
+	{
+    __ASSERT_DEBUG(aFontEntry, Panic(EFbsPanicGlyphAtlasInconsistentState));
+    TInt index = iFontEntryArray.FindInUnsignedKeyOrder(TFontEntryMap(&aFontEntry->Font(), NULL));
+    __ASSERT_DEBUG(KErrNotFound != index, Panic(EFbsPanicGlyphAtlasInconsistentState));
+    if (KErrNotFound != index)
+        {
+        iFontEntryArray.Remove(index);
+        }
+    iCacheSizeInBytes -= aFontEntry->SizeInBytes();
+    delete aFontEntry;
+	}
+
+/**
+Moves the given page to the front (the position of the most recently used page) 
+of the usage order list.
+
+@param aPage The most recently used page.
+*/
+void CGlyphAtlas::MovePageToFront(CGlyphAtlasPage& aPage)
+	{
+	aPage.MoveToFirstInQueue(iLruPageList);
+	}
+
+/**
+Creates a font entry from the given font and adds a mapping from the font 
+to the font entry.
+If successful, the font entry is returned.
+If either the creation of the font entry or the adding the mapping fails, then 
+a NULL pointer is returned.
+
+@param aFont The font used to create a font entry from.
+@return A new font entry if successful, NULL if not.
+*/
+CGlyphAtlasFontEntry* CGlyphAtlas::CreateFontEntry(const CBitmapFont& aFont)
+	{
+	CGlyphAtlasFontEntry* fontEntry = new CGlyphAtlasFontEntry(aFont, *this);
+	if (!fontEntry)
+		{
+		return NULL;
+		}
+	// Add font entry to font entry array
+	TFontEntryMap fontEntryMap(&aFont, fontEntry);
+	TInt err = iFontEntryArray.InsertInUnsignedKeyOrder(fontEntryMap);
+	__ASSERT_DEBUG(KErrAlreadyExists != err, Panic(EFbsPanicGlyphAtlasInconsistentState));
+	if (KErrNone != err)
+		{
+		delete fontEntry;
+		fontEntry = NULL;
+		}
+	return fontEntry;
+	}
+
+/**
+Deletes the least recently used page and removes it from the list of pages
+held by the atlas.
+
+@param aAllowMruPageDeletion ETrue if the most recently used page can be deleted, 
+	EFalse otherwise.
+@return ETrue, if there are pages remaining in the atlas after the deletion, EFalse
+	otherwise. If there is only one page in the atlas and aAllowMruPageDeletion is EFalse,
+	EFalse is returned. 
+*/
+TBool CGlyphAtlas::DeleteLeastRecentlyUsedPage(TBool aAllowMruPageDeletion)
+	{
+    OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_DELETELEASTRECENTLYUSEDPAGE, "> mru=%d", aAllowMruPageDeletion );
+    
+	CGlyphAtlasPage* lruPage = NULL;
+	if (!iLruPageList.IsEmpty())
+		{
+		lruPage = iLruPageList.Last();
+		if (!aAllowMruPageDeletion && (lruPage == iLruPageList.First()))
+			{
+			lruPage = NULL;
+			}
+		}
+	TBool canDeleteMorePages = EFalse;
+	if (lruPage)
+		{
+		iCacheSizeInBytes -= lruPage->SizeInBytes();
+		CGlyphAtlasFontEntry& fontEntry = lruPage->FontEntry();
+		fontEntry.DeletePage(lruPage);
+		lruPage = NULL;
+		if (fontEntry.IsEmpty())
+			{
+			DeleteFontEntry(&fontEntry);
+			}
+		canDeleteMorePages = !iLruPageList.IsEmpty();
+		}
+	OstTraceDefExt2(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_DELETELEASTRECENTLYUSEDPAGE_END, "< more=%u; size=%u", (TUint)canDeleteMorePages, iCacheSizeInBytes);
+	return canDeleteMorePages;
+	}
+
+/**
+Utility function that calculates the number of unique fonts associated with the atlas.
+@return Number of fonts in the atlas.
+ */
+TInt CGlyphAtlas::FontCount() const
+	{
+	return iFontEntryArray.Count();
+	}
+
+/**
+Utility function that calculates the number of glyphs across all fonts stored in
+the atlas.
+@return Number of glyphs in the atlas.
+ */
+TInt CGlyphAtlas::GlyphCount() const
+	{
+	TInt glyphCount = 0;
+	for (TInt ii = iFontEntryArray.Count() - 1; ii >= 0; --ii)
+		{
+		glyphCount += iFontEntryArray[ii].iEntry->GlyphCount();
+		}
+	return glyphCount;
+	}
+
+/**
+Utility function that calculates the number of glyphs for a given font in the atlas.
+@param The font to return the number of glyphs for.
+@return Number of glyphs in the atlas.
+ */
+TInt CGlyphAtlas::GlyphCount(const CBitmapFont& aFont) const
+	{
+	CGlyphAtlasFontEntry* fontEntry = FindFontEntry(aFont);
+	return (fontEntry) ? fontEntry->GlyphCount() : 0;
+	}
+
+void CGlyphAtlas::GetGlyphCacheMetrics( TGlyphCacheMetrics& aGlyphCacheMetrics )
+    {
+    aGlyphCacheMetrics.iMaxCacheSizeInBytes = iMaxCacheSizeInBytes;
+    aGlyphCacheMetrics.iMaxCacheSizeHigh = iMaxCacheSizeHigh;
+    aGlyphCacheMetrics.iMaxCacheSizeLow = iMaxCacheSizeLow;
+    aGlyphCacheMetrics.iCacheSizeInBytes = iCacheSizeInBytes;
+    aGlyphCacheMetrics.iGpuCacheSizeLimitIsMax = iGpuCacheSizeLimitIsMax;
+    }
+
+/**
+ Function to release the GPU cache. Called in response to the GoomMonitor's
+ requirement to reduce GPU memory use.
+
+ @param aBytes. The amount of memory the GOoM framework would like us to relinquish.
+ @param aFlags. The flags conveyed from the GOoM monitor framework.
+*/
+void CGlyphAtlas::ReleaseGpuMemory( TInt /*aBytes*/, TInt /*aFlags*/ )
+    {
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_RELEASEGPUMEMORY, "> max=%d; size=%d", iMaxCacheSizeInBytes, iCacheSizeInBytes);
+
+    if ( iCacheSizeInBytes > 0 )
+        {
+        while( DeleteLeastRecentlyUsedPage(ETrue) )
+            {
+            // Do nothing
+            }
+        }
+
+    // If appropriate, reduce the cache-size limit.
+    if ( GpuCacheSizeLimitIsMax() )
+        {
+        SwitchGpuCacheSizeLimit();
+        }
+
+    OstTraceDefExt2( OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_RELEASEGPUMEMORY_EXIT, "< max=%d; size=%d", iMaxCacheSizeInBytes, iCacheSizeInBytes);
+    }
+
+/**
+ Function to establish GPU memory use. Called in response to the GoomMonitor's
+ notification that GPU memory may once more be utilised in the usual manner.
+
+ @param aFlags. The flags conveyed from the GOoM monitor framework.
+ */
+void CGlyphAtlas::InstateGpuMemory( TInt /*aFlags*/ )
+    {
+    OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_INSTATEGPUMEMORY, "> max=%d", iMaxCacheSizeInBytes );
+
+    // If appropriate, reinstate the full cache-size limit.
+    if ( !GpuCacheSizeLimitIsMax() )
+        {
+        SwitchGpuCacheSizeLimit();
+        }
+
+    OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_NORMAL, CGLYPHATLAS_INSTATEGPUMEMORY_EXIT, "< max=%d", iMaxCacheSizeInBytes );
+    }
+
+/**
+ Utility function to toggle between full and reduced GPU cache-size limits.
+
+ Use in conjunction with TBool GpuCacheSizeLimitIsMax()
+ */
+void CGlyphAtlas::SwitchGpuCacheSizeLimit()
+    {
+    if ( GpuCacheSizeLimitIsMax() )
+        {
+        // The short-circuit operator obviates tautological conditionals.
+        while ( (iCacheSizeInBytes >= iMaxCacheSizeLow) && DeleteLeastRecentlyUsedPage(ETrue) )
+            {
+            // Do Nothing...
+            }
+
+        iMaxCacheSizeInBytes = iMaxCacheSizeLow;
+        iGpuCacheSizeLimitIsMax = EFalse;
+        }
+    else
+        {
+        iMaxCacheSizeInBytes = iMaxCacheSizeHigh;
+        iGpuCacheSizeLimitIsMax = ETrue;
+        }
+    }
+
+
+/**
+ Utility function to report whether the GPU cache-size limit is set to the maximum permissible
+ level, or to its reduced level.
+
+ @return ETrue if the cache-size is set to the maximum permissible limit.
+         EFalse if it is set to the reduced limit.
+ */
+TBool CGlyphAtlas::GpuCacheSizeLimitIsMax() const
+    {
+    return iGpuCacheSizeLimitIsMax;
+    }
+
+// === CGlyphAtlasFontEntry Functions ===
+/**
+Font entry constructor.
+
+@param aFont The font to which this font entry should be associated.
+@param aGlyphAtlas The glyph atlas to which this font entry belongs.
+*/
+CGlyphAtlasFontEntry::CGlyphAtlasFontEntry(const CBitmapFont& aFont, CGlyphAtlas& aGlyphAtlas)
+	:iFont(aFont),
+	 iPageArray(32, _FOFF(TPageMap, iGlyphCode)),
+	 iAtlas(aGlyphAtlas)
+	{
+	}
+
+/**
+Font entry destructor.
+Destroys the pages owned by the font entry.
+*/
+CGlyphAtlasFontEntry::~CGlyphAtlasFontEntry()
+	{
+	// cycle through all the font entries and destroy them
+	for (TInt ii = iPageArray.Count()-1; ii >= 0; --ii)
+		{
+		DeletePage(iPageArray[ii].iPage);
+		}
+	__ASSERT_DEBUG(iSizeInBytes == 0, Panic(EFbsPanicGlyphAtlasInconsistentState));
+	iPageArray.Close();
+	}
+
+/**
+Deletes the given page.
+The page mapping is removed and the page is deleted.
+
+@param aPage The page to delete.
+*/
+void CGlyphAtlasFontEntry::DeletePage(CGlyphAtlasPage* aPage)
+	{
+    __ASSERT_DEBUG(aPage, Panic(EFbsPanicGlyphAtlasInconsistentState));
+    __ASSERT_DEBUG(iPageArray.Count() > 0, Panic(EFbsPanicGlyphAtlasInconsistentState));
+		
+    TInt numGlyphsInPage = aPage->GlyphCount();
+
+    for (TInt ii = 0; ii < numGlyphsInPage; ++ii)
+        {
+        TInt index = iPageArray.FindInUnsignedKeyOrder(TPageMap(aPage->GlyphCodeAt(ii), NULL));
+
+        __ASSERT_DEBUG(KErrNotFound != index, Panic(EFbsPanicGlyphAtlasInconsistentState));
+
+        if (KErrNotFound != index)
+            {
+            iPageArray.Remove(index);
+            iPageArray.GranularCompress();
+            }
+        }
+    iSizeInBytes -= aPage->SizeInBytes();
+    delete aPage;
+
+	}
+
+/**
+Adds a glyph to the font from a bitmap glyph and gets the glyph image info back.
+
+@param[in] aArgs The information needed to create a glyph.
+@param[out] aGlyphImageInfo Upon return contains all the glyph image information needed to use the 
+		glyph in another process.
+@param[out] aSizeInBytes Upon return contains the size of the added glyph's image data in bytes.
+@return KErrNone if the glyph was successfully added or other system-wide error.
+*/
+TInt CGlyphAtlasFontEntry::AddGlyph(const CGlyphAtlas::TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo, TInt& aSizeInBytes)
+	{
+    CGlyphAtlasPage* newPage = new CGlyphAtlasPage(*this);
+	if (!newPage)
+		{
+		return KErrNoMemory;
+		}
+	
+	TInt err = newPage->AddGlyph(aArgs, aGlyphImageInfo, aSizeInBytes);
+	if (KErrNone != err)
+		{
+		delete newPage;
+		return err;
+		}
+
+	err = iPageArray.InsertInUnsignedKeyOrder(TPageMap(aArgs.iGlyphCode, newPage));
+	__ASSERT_DEBUG(KErrAlreadyExists != err, Panic(EFbsPanicGlyphAtlasInconsistentState));
+	if (KErrNone != err)
+		{
+		delete newPage;
+		return err;
+		}
+	iSizeInBytes += aSizeInBytes;
+	iAtlas.MovePageToFront(*newPage);
+	return err;
+	}
+
+/**
+Searches the array of pages to find the page containing the given glyph.
+If the page is found, the glyph image info is populated and the page is moved 
+to the front of the Glyph Atlas' LRU page array.
+
+@param[in] aGlyphCode The glyph code for the glyph being requested.
+@param[out] aGlyphImageInfo Upon return contains all the glyph image information needed to use the 
+		glyph in another process.
+@return KErrNone if the glyph was found, KErrNotFound if not. 
+*/
+TInt CGlyphAtlasFontEntry::GetGlyph(TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo)
+	{
+	TInt index = iPageArray.FindInUnsignedKeyOrder(TPageMap(aGlyphCode, NULL));
+	if (KErrNotFound == index)
+		{
+		return KErrNotFound;
+		}
+	CGlyphAtlasPage* page = iPageArray[index].iPage;
+	page->GetGlyph(aGlyphCode, aGlyphImageInfo);
+	iAtlas.MovePageToFront(*page);
+	return KErrNone;
+	}
+
+/**
+Gets the font associated with the font entry.
+
+@return The font associated with this entry. 
+*/
+const CBitmapFont& CGlyphAtlasFontEntry::Font() const
+	{
+	return iFont;
+	}
+
+/**
+Gets the amount of memory allocated for all the image data for this font.
+
+@return The size of the font's image data in bytes.
+*/
+TInt CGlyphAtlasFontEntry::SizeInBytes() const
+	{
+	return iSizeInBytes;
+	}
+
+/**
+Tests whether the font entry has any pages.
+
+@return ETrue if the font entry does not contain any pages, EFalse if it does..
+*/
+TBool CGlyphAtlasFontEntry::IsEmpty() const
+	{
+	if (iPageArray.Count() == 0)
+		{
+		__ASSERT_DEBUG(iSizeInBytes == 0, Panic(EFbsPanicGlyphAtlasInconsistentState));
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+/**
+Gets the glyph atlas the font entry belongs to.
+
+@return The font entry's glyph atlas.
+*/
+CGlyphAtlas& CGlyphAtlasFontEntry::GlyphAtlas() const
+	{
+	return iAtlas;
+	}
+
+/** 
+@return The number of glyphs this font entry has.
+ */
+TInt CGlyphAtlasFontEntry::GlyphCount() const
+	{
+	TInt glyphCount = 0;
+	for (TInt ii = iPageArray.Count() - 1; ii >= 0; --ii)
+		{
+		glyphCount += iPageArray[ii].iPage->GlyphCount();
+		}
+	return glyphCount;
+	}
+
+
+// === CGlyphAtlasPage Functions ===
+
+/**
+Page constructor.
+
+@param aFontEntry The font entry to which the page is associated.
+*/
+CGlyphAtlasPage::CGlyphAtlasPage(CGlyphAtlasFontEntry& aFontEntry)
+	:iFontEntry(aFontEntry)
+	{
+	}
+
+/**
+Page destructor.
+Releases the RSgImage handles held by the page.
+Removes the page from the Glyph Atlas' LRU page array. 
+*/
+CGlyphAtlasPage::~CGlyphAtlasPage()
+	{
+	iLink.Deque();
+	iGlyphImage.Close();
+	}
+
+/**
+Adds a glyph to the page from a bitmap glyph and gets the glyph image info back.
+An RSgImage handle is acquired for the glyph. 
+If there is not enough specialised graphics memory to create a RSgImage, then the
+least recently used pages are deleted until there there is either enough memory 
+for the creation to be successful or if there are no more pages to delete (in 
+which case an appropriate out of memory error message is returned). 
+
+@param[in] aArgs The information needed to create a glyph.
+@param[out] aGlyphImageInfo Upon return contains all the glyph image information needed to use the 
+		glyph in another process.
+@param[out] aSizeInBytes Upon return contains the size of the added glyph's image data in bytes.
+@return KErrNone if the glyph was successfully added; 
+	KErrNoMemory if there is not enough system memory available;
+	KErrNoGraphicsMemory if there is not enough specialised graphics memory available.
+*/
+TInt CGlyphAtlasPage::AddGlyph(const CGlyphAtlas::TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo, TInt& aSizeInBytes)
+	{
+	const TSize glyphSize(aArgs.iMetrics->Width(), aArgs.iMetrics->Height());
+	// If glyph has zero size (e.g. space), set glyph data and return 
+	if (glyphSize.iWidth == 0 || glyphSize.iHeight == 0)
+		{
+		iPosX = 0;
+		iPosY = 0;
+		iMetrics = *aArgs.iMetrics;
+		iGlyphCode = aArgs.iGlyphCode;
+		iSizeInBytes = 0;
+		iNumGlyphs++;
+		aGlyphImageInfo.iImageId = KSgNullDrawableId;
+		aGlyphImageInfo.iPosX = iPosX;
+		aGlyphImageInfo.iPosY = iPosY;
+		aGlyphImageInfo.iMetrics = iMetrics;
+		return KErrNone;
+		}
+	TUint8* buf = NULL;
+	TSgImageInfo info;
+	info.iSizeInPixels = glyphSize;
+	info.iUsage = ESgUsageBitOpenVgImage;
+	info.iPixelFormat = EUidPixelFormatA_8;
+	TInt dataStride = 0;
+	const TInt KDataArraySize = 256;
+	TUint8 byteDataArray[KDataArraySize];
+	TUint8* tempBuf = NULL;
+	TUint8* byteDataBuf = NULL;
+	TGlyphBitmapType glyphBitmapType = iFontEntry.Font().GlyphBitmapType(); 
+
+	switch (glyphBitmapType)
+		{
+		case EMonochromeGlyphBitmap:
+			// Decompress to 8bpp buffer
+			dataStride = glyphSize.iWidth;
+			byteDataBuf = byteDataArray;
+			// If data too big to fit in byteDataArray, allocate memory on the heap
+			if (glyphSize.iHeight * glyphSize.iWidth > KDataArraySize)
+				{
+				tempBuf = (TUint8*) User::AllocZ(dataStride * glyphSize.iHeight);
+				if (!tempBuf)
+					{
+					return KErrNoMemory;
+					}
+				byteDataBuf = tempBuf;
+				}
+			else
+				{
+				// fill array with zeros.
+				Mem::FillZ(&byteDataArray, KDataArraySize);
+				}
+			
+			if (glyphSize.iWidth >32)
+				{
+				DecodeBinaryDataExLarge(glyphSize, aArgs.iBitmapPointer, byteDataBuf);
+				}
+			else
+				{
+				DecodeBinaryData(glyphSize, aArgs.iBitmapPointer, byteDataBuf);
+				}
+			buf = byteDataBuf;
+			break;
+		case EAntiAliasedGlyphBitmap:
+			buf = const_cast<TUint8*>(aArgs.iBitmapPointer);
+			dataStride = glyphSize.iWidth;
+			break;
+		default:
+			return KErrNotSupported;
+		}
+
+	TInt err = iGlyphImage.Create(info, buf, dataStride);
+
+	// If RSgImage creation fails due to out of memory, delete the least
+	// recently used pages to free up memory until either creation succeeds or 
+	// there are no more pages to remove.
+	TBool morePagesToDelete = ETrue;
+	while ((KErrNoGraphicsMemory == err || KErrNoMemory == err) && morePagesToDelete)
+		{
+		// Delete least used page.  Can delete all pages if necessary as this  
+		// page has not been added to the LRU array yet.
+		morePagesToDelete = iFontEntry.GlyphAtlas().DeleteLeastRecentlyUsedPage(ETrue);
+		err = iGlyphImage.Create(info, buf, dataStride);
+		}
+
+	User::Free(tempBuf);
+	
+	if (KErrNone != err)
+		{
+		return err;
+		}
+	aSizeInBytes = glyphSize.iHeight * glyphSize.iWidth;
+	iGlyphCode = aArgs.iGlyphCode;
+	iPosX = 0;
+	iPosY = 0;
+	iMetrics = *aArgs.iMetrics;
+	// As the image is stored as one byte per pixel, the size in bytes is 
+	// just the number of pixels.
+	// TODO: Replace estimating size with call to SgImage/SgDriver to get accurate size.
+	iSizeInBytes += aSizeInBytes;
+	iNumGlyphs++;
+	aGlyphImageInfo.iPosX = iPosX;
+	aGlyphImageInfo.iPosY = iPosY;
+	aGlyphImageInfo.iImageId = iGlyphImage.Id();
+	aGlyphImageInfo.iMetrics = iMetrics;
+	return err;
+	}
+
+/**
+Retrieves the glyph image information for the given glyph code necessary to be 
+able to use the glyph in another process.
+
+@param aGlyphCode The glyph code for the glyph being requested
+@param aGlyphImageInfo Upon return contains all the glyph image information needed to use the 
+		glyph in another process if the glyph is contained in the page.
+*/
+void CGlyphAtlasPage::GetGlyph(TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo) const
+	{
+	__ASSERT_DEBUG(iGlyphCode == aGlyphCode, Panic(EFbsPanicGlyphAtlasInconsistentState));
+	aGlyphImageInfo.iMetrics = iMetrics;
+	aGlyphImageInfo.iPosX = iPosX;
+	aGlyphImageInfo.iPosY = iPosY;
+	aGlyphImageInfo.iImageId = iGlyphImage.Id();
+	}
+
+/**
+Gets the amount of memory allocated for the image data for this page.
+
+@return The size of the page's image data in bytes.
+*/
+TInt CGlyphAtlasPage::SizeInBytes() const
+	{
+	return iSizeInBytes;
+	}
+
+/**
+Gets the glyph code at the given index associated with the page.
+
+@param aIndex The index of the glyph code within the page.
+@return The glyph code at the given index.
+*/
+TUint CGlyphAtlasPage::GlyphCodeAt(TInt aIndex) const
+	{
+	__ASSERT_DEBUG(0 == aIndex, Panic(EFbsPanicGlyphAtlasInconsistentState));
+	return iGlyphCode;
+	}
+
+/**
+Gets the number of glyphs stored in the page.
+
+@return The number of glyphs in the page.
+*/
+TInt CGlyphAtlasPage::GlyphCount() const
+	{
+	return iNumGlyphs;
+	}
+
+/**
+Gets the font entry which owns the page.
+
+@return The font entry which owns the page. 
+*/
+CGlyphAtlasFontEntry& CGlyphAtlasPage::FontEntry() const
+	{
+	return iFontEntry;
+	}
+
+
+void CGlyphAtlasPage::MoveToFirstInQueue(TDblQue<CGlyphAtlasPage>& aList)
+	{
+	if(!aList.IsFirst(this))
+		{
+		iLink.Deque();
+		aList.AddFirst(*this);
+		}
+	}
+
+// === Static Utility Functions ===
+
+/**
+Combines 2 8-bit unsigned integers into a 16-bit integer.
+@param aPtr A pointer to a source buffer of 2 8-bit unsigned integers.
+@return The two 8-bit integers combined into a 16-bit integer.
+*/
+static TInt16 Load16(const TUint8* aPtr)
+	{
+	return TInt16(aPtr[0]+(aPtr[1]<<8)); 
+	}
+
+/**
+Decodes binary data for monochrome glyph bitmap.
+
+@param aGlyphSize size of glyph in pixels.
+@param aEncodedData Pointer to an encoded source buffer.
+@param aByteData Pointer to a destination buffer (8 bits per pixel).
+*/
+void DecodeBinaryData(const TSize& aGlyphSize, const TUint8* aEncodedData, TUint8* aByteData)
+	{
+	const TInt dataHeight = aGlyphSize.iHeight;
+	const TInt dataWidth = aGlyphSize.iWidth;
+	TUint32 binaryData = 0;
+	
+	// The data is encoded as follows:
+	// 1 bit for a multiple lines flag (1=yes)
+	// 4 bits for a repeat count which represents:
+	// -if the multiple line flag is 0 the number of lines whose data is repeated
+	// -if the flag is 1, the number of lines which differ from line to line.
+	// n bits representing the data at 1 bit per pixel, where:
+	// -if the multiple line flag is 0, n is the width of the glyph.
+	// -if the flag is 1, n is width of glyph multiplied by the repeat count for this block of data.
+	// This information presented in continuous packed blocks of:
+	// [data][reps][multiLineFlag]
+	TInt bitIndex = 0;
+	TInt16 repeatCount = 0;
+	TUint8* byteDataPtr = aByteData;
+	TUint8* byteDataPtrLimit = NULL;
+	for (TInt charLine = 0; charLine < dataHeight; charLine += repeatCount) // for lines in the character...
+		{
+		// Get first 5 bits of block
+		repeatCount = Load16(aEncodedData + (bitIndex >> 3));
+		repeatCount >>= bitIndex & 7;
+		// strip out multiple line flag (1st bit)
+		TInt multiLineFlag = repeatCount & 1;
+		// Get repeat count (last 4 bits)
+		repeatCount >>= 1;
+		repeatCount &= 0xf;
+		// move bit index to point to first bit of image data
+		bitIndex += 5;
+		// end pointer of destination buffer for this block of data to fill 
+		byteDataPtrLimit = aByteData + dataWidth * (charLine + repeatCount);
+		if (multiLineFlag)
+			{
+			while (byteDataPtr < byteDataPtrLimit)
+				{
+				// Pointer to beginning of data in source buffer for current scanline
+				TInt charDataOffsetPtr = TInt(aEncodedData) + (bitIndex >> 3);
+				// Pointer to beginning of current word.
+				TUint32* charDataWord = (TUint32*)(charDataOffsetPtr &~ 3);
+				// Number of bits to shift in current word to get to beginning of scanline
+				TInt bitShift = bitIndex & 7;
+				bitShift += (charDataOffsetPtr & 3) << 3;
+				// Copy scanline data into temporary buffer
+				binaryData = (*charDataWord++) >> bitShift;
+				// If data crosses a word boundary, get the rest of the data from next word.
+				if (bitShift)
+					{
+					binaryData |= (*charDataWord << (32-bitShift));
+					}
+				Convert1BppTo8Bpp(binaryData, byteDataPtr, byteDataPtr + dataWidth);
+				// Move bit index to beginning of next block
+				bitIndex += dataWidth;
+				}
+			}
+		else
+			{
+			TInt charDataOffsetPtr = TInt(aEncodedData) + (bitIndex >> 3);
+			TUint32* charDataWord = (TUint32*)(charDataOffsetPtr &~ 3);
+			TInt bitShift = bitIndex & 7;
+			bitShift += (charDataOffsetPtr & 3) << 3;
+			binaryData = (*charDataWord++) >> bitShift;
+			if (bitShift)
+				{
+				binaryData |= (*charDataWord << (32-bitShift));
+				}
+			TUint8* startByteDataPtr = byteDataPtr;
+			Convert1BppTo8Bpp(binaryData, byteDataPtr, byteDataPtr + dataWidth);
+			
+			while (byteDataPtr < byteDataPtrLimit)
+				{
+				Mem::Copy(byteDataPtr, startByteDataPtr, dataWidth);
+				byteDataPtr += dataWidth;
+				}
+			bitIndex += dataWidth;
+			}
+		}
+	}
+
+/**
+Converts binary data in 1 bit per pixel format to 8 bits per pixel format, where
+0 is converted to 0x00 and 1 is converted to 0xFF.
+
+@param aSrcData Pointer to a 1bpp source buffer.
+@param aDestDataPtr Pointer to a 8bpp destination buffer.
+@param aDestDataPtrLimit Pointer to the end position in destination buffer to convert to.
+*/
+void Convert1BppTo8Bpp(TUint32 aSrcData, TUint8*& aDestDataPtr, const TUint8* aDestDataPtrLimit)
+	{
+	for (; aDestDataPtr < aDestDataPtrLimit; ++aDestDataPtr, aSrcData >>= 1)
+		{
+		if (aSrcData&1)
+			{
+			*aDestDataPtr = 0xFF;
+			}
+		}
+	}
+
+/**
+Decodes binary data for extra large monochrome glyph bitmap.
+
+@param aGlyphSize Size of glyph in pixels.
+@param aEncodedData Pointer to an encoded source buffer.
+@param aByteData Pointer to a destination buffer (8 bits per pixel).
+*/
+void DecodeBinaryDataExLarge(const TSize& aGlyphSize, const TUint8* aEncodedData, TUint8* aByteData)
+	{
+	const TInt dataWidth = aGlyphSize.iWidth;
+	const TInt dataHeight = aGlyphSize.iHeight;
+	TInt bitIndex = 0;
+	TInt16 repeatCount = 0;
+
+	for (TInt charLine = 0; charLine < dataHeight; charLine += repeatCount) // for lines in the character...
+		{
+		repeatCount = Load16(aEncodedData + (bitIndex >> 3));
+		repeatCount >>= bitIndex & 7;
+		const TInt multiLineFlag = repeatCount & 1;
+		repeatCount >>= 1;
+		repeatCount &= 0xf;
+		bitIndex += 5;
+		if (multiLineFlag)
+			{
+			for (TInt currentline = 0; currentline < repeatCount; currentline++)
+				{
+				CopyCharLine(aByteData, dataWidth, aEncodedData + (bitIndex >> 3), bitIndex & 7, 1);
+				bitIndex += dataWidth;
+				}
+			}
+		else
+			{
+			CopyCharLine(aByteData, dataWidth, aEncodedData + (bitIndex >> 3), bitIndex & 7, repeatCount);
+			bitIndex += dataWidth;
+			}
+		}
+	}
+
+/**
+Copies glyph image data line(s)(1 bit per pixel) to an 8 bit per pixel
+destination buffer.
+
+@param aByteDataPtr Pointer to a destination buffer (8bpp).
+@param aWidthInBytes Stride of the image.
+@param aSrcData Pointer to a source buffer (1bpp).
+@param aBitShift Number of bits the source data pointer will be shifted. 
+@param aRepeatCount Number of lines to copy.
+*/
+void CopyCharLine(TUint8*& aByteDataPtr, TInt aWidthInBytes, const TUint8* aSrcData, TInt aBitShift, TInt16 aRepeatCount)
+	{
+	aBitShift &= 7;
+	TUint8* ptrLimit = aByteDataPtr + aWidthInBytes;
+	TUint32* dataWord = (TUint32*)(TInt(aSrcData) &~ 3);
+	aBitShift += (TInt(aSrcData) - TInt(dataWord)) << 3;
+
+	TUint8* startByteDataPtr = aByteDataPtr;
+	TUint32 binaryData = 0;
+	while (aByteDataPtr < ptrLimit)
+		{
+		binaryData = *dataWord++;
+		binaryData >>= aBitShift;
+		if (aBitShift)
+			{
+			binaryData |= (*dataWord << (32-aBitShift));
+			}
+		TUint8* wordLimit = aByteDataPtr + 32;
+		if (wordLimit > ptrLimit)
+			{
+			wordLimit = ptrLimit;
+			}
+		Convert1BppTo8Bpp(binaryData, aByteDataPtr, wordLimit);
+		}
+
+	while (aRepeatCount > 1)
+		{
+		Mem::Copy(aByteDataPtr, startByteDataPtr, aWidthInBytes);
+		aByteDataPtr += aWidthInBytes;
+		--aRepeatCount;
+		}
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/glyphatlas.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,185 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Font & Bitmap Server Glyph Atlas
+//
+
+#ifndef GLYPHATLAS_H
+#define GLYPHATLAS_H
+
+#include <e32base.h>
+#include <sgresource/sgimage.h>
+#include <fbs.h>
+#include "UTILS.H"
+
+class CGlyphAtlasFontEntry;
+class CGlyphAtlasPage;
+class TGlyphCacheMetrics;
+
+/**
+The Glyph Atlas manages the storing and retrieval of glyphs stored in GPU 
+memory as RSgImages.
+
+CGlyphAtlas is the main class which processes requests to add and retrieve
+glyphs. Only one instance of this class will exist throughout the lifetime of 
+the Font and Bitmap Server.
+@internalComponent
+*/
+NONSHARABLE_CLASS(CGlyphAtlas) : public CBase
+	{
+friend class CGlyphAtlasTestWrapper;
+public:
+	/**
+	Structure used to pass information required to create a new glyph so that it can 
+	be added to the glyph atlas.
+	@internalComponent 
+	*/
+	class TAddGlyphArgs
+		{
+	public:
+		inline TAddGlyphArgs(const TUint8* aBitmapPointer, TUint aGlyphCode, const TOpenFontCharMetrics& aMetrics)
+			: iBitmapPointer(aBitmapPointer), iGlyphCode(aGlyphCode), iMetrics(&aMetrics) {}
+	public:
+		const TUint8* iBitmapPointer;	/**< The address of the bitmap glyph. No ownership.*/
+		TUint iGlyphCode;	/**< The glyph code for the glyph being added. No ownership.*/
+		const TOpenFontCharMetrics* iMetrics;	/**< The metrics for the glyph being added. No ownership.*/
+		};
+
+public:
+	~CGlyphAtlas();
+	static CGlyphAtlas* NewL(TInt aMaxCacheSizeInBytes);
+	TInt GetGlyph(const CBitmapFont& aFont, TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo);
+	TInt AddGlyph(const CBitmapFont& aFont, const TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo);
+	void FontReleased(const CBitmapFont& aFont);
+	void MovePageToFront(CGlyphAtlasPage& aPage);
+	TBool DeleteLeastRecentlyUsedPage(TBool aAllowMruPageDeletion);
+	TInt FontCount() const;
+	TInt GlyphCount() const;
+	TInt GlyphCount(const CBitmapFont& aFont) const;
+	void GlyphCacheMetrics(TInt& aSizeInBytes, TInt& aMaxSizeInBytes, TBool& aGpuCacheSizeLimitIsMax);
+	void ReleaseGpuMemory( TInt /*aBytes*/, TInt /*aFlags*/ );
+	void InstateGpuMemory( TInt /*aFlags*/ );
+	void GetGlyphCacheMetrics( TGlyphCacheMetrics& aGlyphCacheMetrics );
+
+private:
+	CGlyphAtlas(TInt aMaxCacheSizeInBytes);
+	void ConstructL();
+	CGlyphAtlasFontEntry* CreateFontEntry(const CBitmapFont& aFont);
+	CGlyphAtlasFontEntry* FindFontEntry(const CBitmapFont& aFont) const;
+	void DeleteFontEntry(CGlyphAtlasFontEntry* aFontEntry);
+    void SwitchGpuCacheSizeLimit();
+    TBool GpuCacheSizeLimitIsMax() const;
+
+private:
+	class TFontEntryMap
+		{
+	public:
+		inline TFontEntryMap(const CBitmapFont* aFont, CGlyphAtlasFontEntry* aEntry)
+				: iFont(aFont),iEntry(aEntry) {}
+	public:			
+		const CBitmapFont* iFont;
+		CGlyphAtlasFontEntry* iEntry;
+		};
+private:
+	RSgDriver iSgDriver;
+	TDblQue<CGlyphAtlasPage> iLruPageList; /**< Least-recently used ordered queue (most-recently used at head).*/
+	RArray<TFontEntryMap> iFontEntryArray; /**< Array of font entries maintained in unsigned ordered by font pointer.*/
+	TUint iMaxCacheSizeInBytes;	/**< Maximum specialised graphics memory the cache should use. If zero, there is no limit.*/
+	TInt iMaxCacheSizeHigh;                /**< The high cach-size threshold.*/
+	TInt iMaxCacheSizeLow;                 /**< The low cach-size threshold.*/
+	TUint iCacheSizeInBytes; 	/**< Actual amount of specialised graphics memory used by the entire atlas.*/
+	TBool iGpuCacheSizeLimitIsMax;         /**< Is the cache-size limit set to it's maximum value? */
+	};
+
+
+/**
+Each font entry manages the storing and retrieval of glyphs belonging to a font.
+@internalComponent
+*/
+NONSHARABLE_CLASS(CGlyphAtlasFontEntry): public CBase
+	{
+public:
+	CGlyphAtlasFontEntry(const CBitmapFont& aFont, CGlyphAtlas& aGlyphAtlas);
+	~CGlyphAtlasFontEntry();
+	const CBitmapFont& Font() const;
+	void DeletePage(CGlyphAtlasPage* aPage);
+	TInt GetGlyph(TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo);
+	TInt AddGlyph(const CGlyphAtlas::TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo, TInt& aSizeInBytes);
+	TInt SizeInBytes() const;
+	TBool IsEmpty() const;
+	CGlyphAtlas& GlyphAtlas() const;
+	TInt GlyphCount() const;
+
+private:
+	// Class that handles association between glyph code and page the 
+	// image that glyph code resides on. Used in pointer arrays.
+	class TPageMap
+		{
+	public:
+		inline TPageMap(TUint aGlyphCode, CGlyphAtlasPage* aPage)
+				: iGlyphCode(aGlyphCode),iPage(aPage) {}
+	public:			
+		TUint iGlyphCode;
+		CGlyphAtlasPage* iPage;
+		};
+private:
+	const CBitmapFont& iFont;	/**< The font which the stored glyph belongs to.*/
+	RArray<TPageMap> iPageArray;	/**< Array of pages maintained in unsigned ordered by glyph code.*/
+	CGlyphAtlas& iAtlas;		/**< The glyph atlas the font entry belongs to.*/
+	TInt iSizeInBytes;			/**< The amount of specialised graphics memory used by all owned pages.*/
+	};
+
+
+/**
+Each page in the glyph atlas stores one glyph in one RSgImage.
+@internalComponent
+*/
+NONSHARABLE_CLASS(CGlyphAtlasPage): public CBase
+	{
+friend CGlyphAtlas::CGlyphAtlas(TInt);
+public:
+	CGlyphAtlasPage(CGlyphAtlasFontEntry& aFontEntry);
+	~CGlyphAtlasPage();
+	TInt AddGlyph(const CGlyphAtlas::TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo, TInt& aSizeInBytes);
+	void GetGlyph(TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo) const;
+	TUint GlyphCodeAt(TInt aIndex) const;
+	TInt GlyphCount() const;
+	CGlyphAtlasFontEntry& FontEntry() const;
+	TInt SizeInBytes() const;
+	void MoveToFirstInQueue(TDblQue<CGlyphAtlasPage>& aList);
+
+private:
+	TDblQueLink iLink;
+	// Data for the stored glyph
+	CGlyphAtlasFontEntry& iFontEntry;	/**< The font entry asssociated with the page.*/
+	RSgImage iGlyphImage;		/**< The image which contains the stored glyph.*/
+	TInt16 iPosX;				/**< The x-coord of the position of the stored glyph within the image.*/
+	TInt16 iPosY;				/**< The y-coord of the position of the stored glyph within the image.*/
+	TOpenFontCharMetrics iMetrics;	/**< The character metrics for the stored glyph.*/
+	TUint iGlyphCode;			/**< The glyph code for the stored glyph.*/
+	TInt iSizeInBytes;			/**< The amount of specialised graphics memory used by this page.*/
+	TInt iNumGlyphs;			/**< The number of glyphs contained in the page.*/
+	};
+
+
+// If no limit to the size of the glyph atlas cache is desired, this
+// constant must be passed to CGlyphCache::NewL()
+// In this case the cache lower maximum limit, deployed in response to GooM,
+// will be set to KGlyphAtlasLowMemCacheLimitDefault
+const TInt KGlyphAtlasNoCacheLimit = 0;
+const TInt KGlyphAtlasLowMemCacheLimitDivisor = 2;
+const TInt KGlyphAtlasLowMemCacheLimitDefault = 0x40000;
+
+
+#endif // GLYPHATLAS_H
+
--- a/fbs/fontandbitmapserver/sfbs/patchableconstants.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/sfbs/patchableconstants.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -54,6 +54,19 @@
 */
 EXPORT_C extern const TInt KFbServWritableDataPagingMode = 0x00;
 
+/**
+@SYMPatchable
+@publishedPartner
+@prototype
+
+This constant determines the maximum size of the GPU memory that the font and 
+bitmap server's glyph atlas can use.
+The glyph atlas will store glyphs in this memory.  When the glyph atlas reaches 
+this limit, old glyphs will be evicted from the cache to make space for new glyphs.
+@note	Default value: 0.5 MB (0x00080000).
+*/
+EXPORT_C extern const TInt KFbServGlyphAtlasCacheLimit = 0x00080000;
+
 // Header files declaring these constants are included to confirm that the definition matches.
 // They are included at the end because otherwise the ARM compiler refuses to initialise the values.
 #if (__ARMCC_VERSION >= 310000)
--- a/fbs/fontandbitmapserver/tfbs/TALLOC.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TALLOC.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TALLOC_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTAlloc : public CTGraphicsBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/TBitmap.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TBitmap.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -20,8 +20,8 @@
 
 #include <gdi.h>
 #include "TFBS.H"
-#include "TGraphicsHarness.h"
-#include "../sfbs/fbsbitmapasyncstreamer.h"
+#include "test/TGraphicsHarness.h"
+#include "fbsbitmapasyncstreamer.h"
 
 
 //The main test class. Add your test methods here.
--- a/fbs/fontandbitmapserver/tfbs/TCLEAN.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TCLEAN.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TCLEAN_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 enum TTestType
 	{
--- a/fbs/fontandbitmapserver/tfbs/TFBS.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TFBS.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -187,7 +187,7 @@
 		TestSingletonServer();
 		break;
 	case 21:
-		((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0620"));
+		((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0623"));
 		TestFontSessionCacheLookupL();
 		break;
 	case 22:
@@ -649,7 +649,7 @@
 	CheckResourceCount();
 	TEST(fbsalt->ResourceCount()==iResourceCount);
 	font3->Reset();
-	User::Free(font3);
+	delete font3;
 	iResourceCount--;
 	CheckResourceCount();
 	TEST(fbsalt->ResourceCount()==iResourceCount);
@@ -2133,7 +2133,7 @@
 	}
 
 /**
-@SYMTestCaseID      GRAPHICS-FBSERV-0620
+@SYMTestCaseID      GRAPHICS-FBSERV-0623
 @SYMTestPriority    High
 @SYMTestStatus      Implemented
 @SYMDEF             DEF140138
--- a/fbs/fontandbitmapserver/tfbs/TFBSDefect.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TFBSDefect.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TFBSDEFECT_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTFbsDefect : public CTGraphicsBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/TFbsServer.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TFbsServer.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -38,8 +38,12 @@
 #include "textendedbitmappanic.h"
 #include "twdp.h"
 #include "tfonttableandglyph.h"
+#include "tfbsglyphdata.h"
+#include "tfbsglyphdatapanic.h"
+#include "tfbsglyphdataoutlineshadow.h"
+#include "tglyphatlas.h"
+#include "tfbsoogm.h"
 
- 
 /* Path to the script
 
 z:\GraphicsTest\fbstest.script
@@ -196,9 +200,29 @@
 		testStep = new CTWDPStep();
 		}
    	else if(aStepName == KTFontTableAndGlyphStep)
-        	{
-        	testStep = new CTFontAndGlyphStep();
-        	}
-	
+        {
+        testStep = new CTFontAndGlyphStep();
+        }
+	else if(aStepName == KTFbsGlyphDataStep)
+		{
+		testStep = new CTFbsGlyphDataStep();
+		}
+    else if(aStepName == KTFbsGlyphDataPanicStep)
+        {
+        testStep = new CTFbsGlyphDataPanicStep();
+        }
+    else if(aStepName == KTFbsGlyphDataOutlineAndShadowStep)
+        {
+        testStep = new CTFbsGlyphDataOutlineAndShadowStep();
+        }
+    else if(aStepName == KTGlyphAtlasStep)
+    	{
+		testStep = new CTGlyphAtlasStep();
+    	}
+    else if(aStepName == KTFbsOogmStep)
+        {
+        testStep = new CTFbsOogmStep();
+        }
+
 	return testStep;
 	}
--- a/fbs/fontandbitmapserver/tfbs/TGetAllBitmapsCapability.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TGetAllBitmapsCapability.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -16,7 +16,7 @@
 #ifndef __TGETALLBITMAPSCAPABILITY_H__
 #define __TGETALLBITMAPSCAPABILITY_H__
 
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 // The main test class. Add your test methods here.
 class CTGetAllBitmapsCapability : public CTGraphicsBase
--- a/fbs/fontandbitmapserver/tfbs/TRalc.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TRalc.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TRALC_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTRalc : public CTGraphicsBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/TSecureFBS.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TSecureFBS.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TSECUREFBS_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTFbsSecure : public CTGraphicsBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/TStreamIdCache.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/TStreamIdCache.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TSTREAMIDCACHE_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTStreamIdCache : public CTGraphicsBase
 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/glyphatlastestwrapper.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,167 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "glyphatlastestwrapper.h"
+
+/**
+Panic function required for glyphatlas.cpp to compile in the test project.
+*/
+GLDEF_C void Panic(TFbsPanic aPanic)
+	{
+	_LIT(KFBSERVClientPanicCategory,"FBSCLI");
+	User::Panic(KFBSERVClientPanicCategory,aPanic);
+	}
+
+
+/**
+Glyph Atlas test wrapper constructor.
+*/
+CGlyphAtlasTestWrapper::CGlyphAtlasTestWrapper()
+	{
+	}
+
+/**
+Two-phase constructor.
+@leave A system wide error code if RSgDriver failed to open.
+*/
+void CGlyphAtlasTestWrapper::ConstructL(TInt aMaxCacheSizeInBytes)
+	{
+	iAtlas = CGlyphAtlas::NewL(aMaxCacheSizeInBytes);
+	}
+
+/**
+Factory constructor method. Creates a new glyph atlas test wrapper.
+
+@param aMaxCacheSizeInBytes The size in bytes, to use as the upper limit
+	for the size of memory used by the glyph images in the atlas. If this
+	value is KGlyphAtlasNoCacheLimit, then there is no limit and the atlas
+	will use as much memory as is available in the system.
+
+@return A pointer to the newly-constructed atlas test wrapper
+
+@leave KErrNoMemory if there was insufficient memory to create the atlas, 
+	or a system wide error code if its RSgDriver failed to open.
+*/
+CGlyphAtlasTestWrapper* CGlyphAtlasTestWrapper::NewL(TInt aMaxCacheSizeInBytes)
+    {
+    CGlyphAtlasTestWrapper* self = CGlyphAtlasTestWrapper::NewLC( aMaxCacheSizeInBytes );
+    CleanupStack::Pop(); // self;
+
+    return self;
+    }
+
+CGlyphAtlasTestWrapper* CGlyphAtlasTestWrapper::NewLC(TInt aMaxCacheSizeInBytes)
+    {
+    CGlyphAtlasTestWrapper* self = new (ELeave) CGlyphAtlasTestWrapper();
+    CleanupStack::PushL(self);
+    self->ConstructL(aMaxCacheSizeInBytes);
+
+    return self;
+    }
+
+TInt CGlyphAtlasTestWrapper::GetGlyph(const CBitmapFont& aFont, TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo)
+	{
+	return iAtlas->GetGlyph(aFont, aGlyphCode, aGlyphImageInfo);
+	}
+
+TInt CGlyphAtlasTestWrapper::AddGlyph(const CBitmapFont& aFont, const CGlyphAtlas::TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo)
+	{
+	return iAtlas->AddGlyph(aFont, aArgs, aGlyphImageInfo);
+	}
+
+void CGlyphAtlasTestWrapper::FontReleased(const CBitmapFont& aFont)
+	{
+	iAtlas->FontReleased(aFont);
+	}
+
+/**
+Returns the current size of the glyph image memory used by the atlas in bytes.
+*/
+TInt CGlyphAtlasTestWrapper::SizeInBytes() const
+	{
+	return iAtlas->iCacheSizeInBytes;
+	}
+
+/**
+Tests whether the least recently used page contains the given glyph.
+@param aGlyphCode The glyph code to match.
+@return ETrue if the lru page contains the given glyph, EFalse if not.
+*/
+TBool CGlyphAtlasTestWrapper::LruPageContainsGlyph(TUint aGlyphCode) const
+	{
+	CGlyphAtlasPage* page = iAtlas->iLruPageList.Last();
+	TInt numGlyphsInPage = page->GlyphCount();
+	TBool glyphFound = EFalse;
+	for (TInt ii = 0; ii < numGlyphsInPage && !glyphFound; ++ii)
+		{
+		glyphFound = (aGlyphCode == page->GlyphCodeAt(ii));
+		}
+	return glyphFound;
+	}
+
+/**
+Returns the number of glyphs associated to the given font in the atlas.
+*/
+TInt CGlyphAtlasTestWrapper::GlyphCountByFont(const CBitmapFont* aFont)
+	{
+	TInt glyphCount = 0;
+	TDblQueIter<CGlyphAtlasPage> iter(iAtlas->iLruPageList);
+	CGlyphAtlasPage* page;
+	while((page=iter++) != NULL)
+		{
+		if (&page->FontEntry().Font() == aFont)
+			{
+			glyphCount += page->GlyphCount();
+			}
+		}
+	return glyphCount;
+	}
+
+/**
+Returns the number of glyphs in the atlas.
+*/
+TInt CGlyphAtlasTestWrapper::GlyphCount()
+	{
+	TInt glyphCount = 0;
+	TDblQueIter<CGlyphAtlasPage> iter(iAtlas->iLruPageList);
+	CGlyphAtlasPage* page;
+	while((page=iter++) != NULL)
+		{
+		glyphCount += page->GlyphCount();
+		}
+	return glyphCount;
+	}
+
+/**
+Returns the number of fonts in the atlas.
+*/
+TInt CGlyphAtlasTestWrapper::FontCount() const
+	{
+	return iAtlas->iFontEntryArray.Count();
+	}
+
+/**
+Glyph Atlas test wrapper destructor.
+*/
+CGlyphAtlasTestWrapper::~CGlyphAtlasTestWrapper()
+	{
+	delete iAtlas;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/glyphatlastestwrapper.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,48 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef GLYPHATLASTESTWRAPPER_H
+#define GLYPHATLASTESTWRAPPER_H
+
+#include "glyphatlas.h"
+
+
+/**
+Class to provide access to glyph atlas metrics for test purposes
+*/
+NONSHARABLE_CLASS(CGlyphAtlasTestWrapper)
+    {
+public:
+	~CGlyphAtlasTestWrapper();
+	static CGlyphAtlasTestWrapper* NewL(TInt aMaxCacheSizeInBytes);
+	static CGlyphAtlasTestWrapper* NewLC(TInt aMaxCacheSizeInBytes);
+	TInt GetGlyph(const CBitmapFont& aFont, TUint aGlyphCode, TGlyphImageInfo& aGlyphImageInfo);
+	TInt AddGlyph(const CBitmapFont& aFont, const CGlyphAtlas::TAddGlyphArgs& aArgs, TGlyphImageInfo& aGlyphImageInfo);
+	void FontReleased(const CBitmapFont& aFont);
+	
+	// Utility functions providing access to internals of glyph atlas
+	TInt SizeInBytes() const;
+	TInt GlyphCountByFont(const CBitmapFont* aFont);
+	TInt GlyphCount();
+	TInt FontCount() const;
+	TBool LruPageContainsGlyph(TUint aGlyphCode) const;
+private:
+	CGlyphAtlasTestWrapper();
+	void ConstructL(TInt aMaxCacheSizeInBytes);
+private:
+	CGlyphAtlas* iAtlas;
+    };
+
+#endif /* GLYPHATLASTESTWRAPPER_H */
--- a/fbs/fontandbitmapserver/tfbs/scripts/fbstest_T_IPCTest.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/scripts/fbstest_T_IPCTest.script	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -46,7 +46,10 @@
 RUN_TEST_STEP !PanicCode=-6 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini ShapeDelete
 RUN_TEST_STEP !PanicCode=-6 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini SetTwipsHeight
 RUN_TEST_STEP !PanicCode=-6 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini GetTwipsHeight
+RUN_TEST_STEP !PanicCode=-8 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini GetGlyphs
+RUN_TEST_STEP !PanicCode=-8 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini GetGlyphMetrics
 RUN_TEST_STEP !PanicCode=-6 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini GetFontTableWrongMsg
 RUN_TEST_STEP !PanicCode=-6 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini ReleaseFontTableWrongMsg
 RUN_TEST_STEP !PanicCode=-38 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini GetGlyphOutlineWrongMsg
 RUN_TEST_STEP !PanicCode=-38 100 TFbsServer TIPCTest z:\fbstest\ipctest_config.ini ReleaseGlyphOutlineWrongMsg
+
--- a/fbs/fontandbitmapserver/tfbs/scripts/fbstest_run.bat	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/scripts/fbstest_run.bat	Wed Aug 18 11:05:09 2010 +0300
@@ -26,6 +26,9 @@
 testexecute.exe  z:\fbstest\fbstest_t_ipctest.script
 testexecute.exe  z:\fbstest\fbstest_t_extendedbitmap.script
 testexecute.exe  z:\fbstest\fbstest_t_fonttable.script
+testexecute.exe  z:\fbstest\fbstest_t_glyphdata.script		
+testexecute.exe  z:\fbstest\fbstest_t_glyphdataoutlineshadow.script	
+testexecute.exe  z:\fbstest\fbstest_t_oogm.script
 
 @echo off
 md e:\logs
--- a/fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_fonttable.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_fonttable.script	Wed Aug 18 11:05:09 2010 +0300
@@ -16,10 +16,10 @@
 PRINT Run TFontTableAndGlyphOutline Fbserv test 
 
 RUN_UTILS MakeReadWrite C:\DejaVuSans.ttf
-RUN_UTILS CopyFile z:\RESOURCE\FONTS\DejaVuSans.ttf C:\DejaVuSans.ttf
+RUN_UTILS CopyFile z:\RESOURCE\FONTS\DejaVuSansCondensed.ttf C:\DejaVuSans.ttf
 RUN_UTILS MakeReadWrite C:\DejaVuSans.TTF 
 RUN_UTILS MakeReadWrite C:\DejaVuSerif.ttf
-RUN_UTILS CopyFile z:\RESOURCE\FONTS\DejaVuSerif.ttf C:\DejaVuSerif.ttf
+RUN_UTILS CopyFile z:\RESOURCE\FONTS\DejaVuSerifCondensed.ttf C:\DejaVuSerif.ttf
 RUN_UTILS MakeReadWrite C:\DejaVuSerif.ttf
 
 // Set test server to have no Capabilitities
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_glyphdata.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,33 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRINT Run TGlyphAtlas & TFbsGlyphData Fbserv tests 
+//
+LOAD_SUITE TFbsServer
+RUN_TEST_STEP 100 TFbsServer TGlyphAtlas
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 800 TFbsServer TFbsGlyphData
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini NotInitializedNext
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini NotInitializedImage
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini NotInitializedMetrics
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini NotInitializedGlyphCode
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini ClosedNext
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini ClosedImage
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini ClosedMetrics
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini ClosedGlyphCode
+RUN_PANIC_STEP_RESULT -8 FBSERV 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini DiscardUsedFont
+RUN_PANIC_STEP_RESULT 32 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini IndexNegative
+RUN_PANIC_STEP_RESULT 32 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini IndexTooHigh
+RUN_PANIC_STEP_RESULT 31 FBSCLI 100 TFbsServer TFbsGlyphDataPanic z:\fbstest\glyphdata_config.ini IteratorOpenFailed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_glyphdataoutlineshadow.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,20 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRINT Run TFbsGlyphData Fbserv test 
+//
+LOAD_SUITE TFbsServer
+//the following test must be run with a rasterizer which supports outline and shadow
+RUN_TEST_STEP 300 TFbsServer TFbsGlyphDataOutlineAndShadow
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/scripts/fbstest_t_oogm.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,19 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRINT Run TFbsOogm Fbserv tests 
+//
+LOAD_SUITE TFbsServer
+RUN_TEST_STEP 100 TFbsServer TFbsOogm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/scripts/glyphdata_config.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,36 @@
+[NotInitializedNext]
+CaseNumber = 1
+
+[NotInitializedImage]
+CaseNumber = 2
+
+[NotInitializedMetrics]
+CaseNumber = 3
+
+[NotInitializedGlyphCode]
+CaseNumber = 4
+
+[ClosedNext]
+CaseNumber = 5
+
+[ClosedImage]
+CaseNumber = 6
+
+[ClosedMetrics]
+CaseNumber = 7
+
+[ClosedGlyphCode]
+CaseNumber = 8
+
+[DiscardUsedFont]
+CaseNumber = 9
+
+[IndexNegative]
+CaseNumber = 10
+
+[IndexTooHigh]
+CaseNumber = 11
+
+[IteratorOpenFailed]
+CaseNumber = 12
+
--- a/fbs/fontandbitmapserver/tfbs/scripts/ipctest_config.ini	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/scripts/ipctest_config.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -67,14 +67,21 @@
 [GetTwipsHeight]
 CaseNumber = 23
 
-[GetFontTableWrongMsg]
+[GetGlyphs]
 CaseNumber = 24
 
-[ReleaseFontTableWrongMsg]
+[GetGlyphMetrics]
 CaseNumber = 25
 
-[GetGlyphOutlineWrongMsg]
+[GetFontTableWrongMsg]
 CaseNumber = 26
 
+[ReleaseFontTableWrongMsg]
+CaseNumber = 27
+
+[GetGlyphOutlineWrongMsg]
+CaseNumber = 28
+
 [ReleaseGlyphOutlineWrongMsg]
-CaseNumber = 27
+CaseNumber = 29
+
--- a/fbs/fontandbitmapserver/tfbs/tcompressed.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/tcompressed.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -18,7 +18,7 @@
 
 #include <fbs.h>
 #include "TFBS.H"
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTCompressed : public CTGraphicsBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/textendedbitmapcommon.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/textendedbitmapcommon.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -16,7 +16,7 @@
 #ifndef TEXTENDEDBITMAPCOMMON_H
 #define TEXTENDEDBITMAPCOMMON_H
 
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 // Uid for use when testing an extended bitmap that does not need to be
 // drawn using the example rasterizer.
--- a/fbs/fontandbitmapserver/tfbs/tfbsbase.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/tfbsbase.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -16,7 +16,7 @@
 #ifndef TFBSBASE_H
 #define TFBSBASE_H
 
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 #include <f32file.h>
 
 #define INFO_PRINTF9(p1, p2, p3, p4, p5, p6, p7, p8, p9) \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsglyphdata.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,3212 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <test/graphicsfontutils.h>
+#include <EGL/egl.h>
+#include <VG/openvg.h>
+#include <graphics/fbsglyphmetricsarray.h> 
+#include <graphics/fbsglyphdataiterator.h>
+#include <sgresource/sgimage.h>
+#include <sgresource/sgdriver_test.h>
+#include <sgresource/sgdriver_profiling.h>
+#include "FbsMessage.h"
+#include "tfbsglyphdata.h"
+
+_LIT(KTypefaceName, "DejaVu Sans Condensed");
+//_LIT(KMonoTypefaceName, "DejaVu Sans Mono");
+const TInt KNumGlyphCodesLatin = 96;
+const TUint KDejaVuInvalidGlyphCode = 0;
+
+// Currently only used in debug. When TestMultithreadStressAtlas() test is enabled, #ifdef to be removed. 
+#ifdef _DEBUG
+const TInt KTestThreadMinHeapSize = 0x20000;
+const TInt KTestThreadMaxHeapSize = 0x20000;
+#endif
+
+// 'most significant bit' flag to ensure value is interpreted as a glyph code rather than an ascii code
+const TUint KGlyphCodeFlag = 0x80000000;      
+
+
+// Please note the following macros which enable helper functions, and are declared in the header.
+// SAVEGLYPHSTOMBMDURINGCOMPARISON and
+// SAVEGLYPHSTOMBMDEBUGFUNCTION
+
+// Utility function declarations - utilities used by the tests
+static TFontSpec GenerateDejaVuFontSpec(TInt aSeed);
+static void CopyCharLine(TUint32*& aBinaryDataPtr,TInt aBufferWords,const TUint8* aData,TInt aBitShift,TInt aCharWidth, TInt16 aRepeatCount);
+static void DecodeBinaryData(const TSize& aDataSize, const TUint8* aData, TInt aStride,	TUint32* aBinaryData);
+static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage);
+static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage, TUint8* aBuffer1, TUint8* aBuffer2);
+// Following functions commented out because the tests which use these functions 
+// are currently commented out due to Broadcom defect 
+// ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM
+//static TInt FillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages);
+//static TInt NearlyFillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages);
+
+#if defined (SAVEGLYPHSTOMBMDEBUGFUNCTION) || defined (SAVEGLYPHSTOMBMDURINGCOMPARISON)
+/**
+Static utility function. Converts an A8 RSgImage into a CFbsBitmap.
+To do this, the RSgImage is converted to an EGLImage, then to a VGImage,
+where the image memory is read into a CFbsBitmap.
+
+@param aEGL The EGL helper object that will read the SgImage into a memory buffer.
+@param aSgImage The RSgImage to convert.
+@param aRect A rectangular region of the RSgImage to convert.
+@param aBitmap On success, holds a pointer to a CFbsBitmap which contains the image
+	data of the RSgImage.
+@return One of the system-wide error codes.
+*/
+static TInt CreateBitmapFromSgImage(CEGLHelper* aEGL, const RSgImage& aSgImage, const TRect& aRect, CFbsBitmap*& aBitmap)
+	{
+	TInt err = KErrNone;
+	const TSize bufferSize = aRect.Size();
+	const TInt dataStride = bufferSize.iWidth;
+
+	TUint8* imageBuffer = reinterpret_cast<TUint8*>(User::AllocZ(bufferSize.iHeight * dataStride));
+	if (!imageBuffer)
+		{
+		return KErrNoMemory;
+		}
+	err = aEGL->GetSgImageData(aSgImage, aRect, imageBuffer);
+	if (err != KErrNone)
+		{
+		User::Free(imageBuffer);
+		return err;
+		}
+	aBitmap = new CFbsBitmap();
+	if (!aBitmap)
+		{
+		User::Free(imageBuffer);
+		return KErrNoMemory;
+		}
+
+	err = aBitmap->Create(bufferSize, EGray256);
+	if (KErrNone == err)
+		{
+		TUint8* buf = imageBuffer;
+		aBitmap->BeginDataAccess();
+		TUint8* dataAddress = reinterpret_cast<TUint8*>(aBitmap->DataAddress());
+		const TInt dataStride = aBitmap->DataStride();	
+		for (TInt scanline = 0; scanline < bufferSize.iHeight; scanline++)
+			{
+			Mem::Copy(dataAddress, buf, bufferSize.iWidth);
+			dataAddress += dataStride;
+			buf += bufferSize.iWidth;
+			}
+		aBitmap->EndDataAccess(EFalse);
+		}
+	else
+		{
+		delete aBitmap;
+		aBitmap = NULL;
+		}
+
+	User::Free(imageBuffer);
+	return err;
+	}
+
+/**
+Utility function to aid with debugging.
+Saves a bitmap to file.
+
+@param aBmp Bitmap to save
+@param aMeta Optional. If specified, it is added to the name of the bitmap file.
+@param aRef Flag to show whether bitmap is a reference bitmap (ETrue) or test bitmap (EFalse).
+*/
+static void SaveBmp(CFbsBitmap* aBmp, TPtrC* aMeta, TBool aRef)
+	{
+	if (!aBmp)
+		{
+		return;
+		}
+	
+	TBuf<256> testFileName;
+	if (aRef)
+		{
+		testFileName.Append(_L("Ref"));
+		}
+	else
+		{
+		testFileName.Append(_L("Test"));
+		}
+	if (aMeta)
+		{
+		testFileName.Append(*aMeta);
+		}
+
+	TFileName mbmFile;
+	TBuf<20> testPathName;
+	#ifdef __WINS__
+		testPathName.Append(_L("c:\\%S.mbm"));
+	#else
+		testPathName.Append(_L("e:\\%S.mbm"));
+	#endif
+	mbmFile.Format(testPathName, &testFileName);
+
+	// As this is for debugging purposes only, doesn't matter reporting whether
+	// saving succeeded or not.
+	aBmp->Save(mbmFile);
+	}
+#endif // SAVEGLYPHSTOMBMDEBUGFUNCTION OR SAVEGLYPHSTOMBMDURINGCOMPARISON
+
+
+#ifdef SAVEGLYPHSTOMBMDEBUGFUNCTION
+void CTFbsGlyphData::SaveRSgImagesAsMbms(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, const RSgImage& aImageB, const TRect& aRectB )
+	{
+	static TInt countToAppend = 0;
+
+	CFbsBitmap* bitmap = NULL;
+	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageA, aRectA, bitmap))
+		{
+		TBuf<KMaxFileName> buf( _L("String") );
+		buf.AppendNum( countToAppend );
+		TPtrC nameAppend( buf );
+
+		SaveBmp(bitmap, &nameAppend, EFalse);
+		}
+	delete bitmap;  
+	bitmap = NULL;
+
+	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageB, aRectB, bitmap))
+		{
+		TBuf<KMaxFileName> buf( _L("String") );
+		buf.AppendNum( countToAppend );
+		TPtrC nameAppend( buf );
+
+		SaveBmp(bitmap, &nameAppend, ETrue);
+		}
+	delete bitmap;
+	bitmap = NULL;
+
+	countToAppend++;
+	}
+
+/**
+Static debug utility method that outputs the glyph images of the given glyph
+codes for the given font to a file.
+ */
+static void DumpFontGlyphs(CEGLHelper* aEGL, CFont* aFont, TInt aCodesCount)
+	{
+	TFontSpec fontSpec = aFont->FontSpecInTwips();
+	TOpenFontCharMetrics charMetrics;
+	TSize bitmapSize;
+	const TUint8* bitmapData = NULL;
+	
+	for (TInt glyphCode = 0; glyphCode < aCodesCount; glyphCode++)
+		{
+		CFont::TCharacterDataAvailability availability = aFont->GetCharacterData(glyphCode | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
+		if (availability == CFont::EAllCharacterData)
+			{
+			RSgImage characterDataImage;
+			TInt err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage);
+			if (err == KErrNone)
+				{
+				CFbsBitmap* bitmap = NULL;
+				err = CreateBitmapFromSgImage(aEGL, characterDataImage, TRect(TPoint(0, 0), bitmapSize), bitmap);
+				if (err == KErrNone)
+					{
+					TBuf<256> bitmapName;
+					bitmapName.AppendFormat(_L("%S-%i"), &(fontSpec.iTypeface.Name()), glyphCode);
+					TPtrC bitmapNamePtr(bitmapName);
+					SaveBmp(bitmap, &bitmapNamePtr, EFalse);
+					delete bitmap;
+					}
+				}
+			characterDataImage.Close();
+			}
+		}
+	}
+#endif // SAVEGLYPHSTOMBMDEBUGFUNCTION
+
+
+/**
+Utility to return a fontspec such that the font created from it will
+not match any other font generated by a different seed. The font
+will be useable by RFbsGlyphDataIterator and RFbsGlyphMetricsArray.
+It will always return a font based on the DejaVu fontspec, this is 
+so that the glyphcodes in DejaVuASCIIToGlyphCode are guaranteed to
+work.
+
+@param aSeed Specifies a variant of the fontspec to create. Passing the
+	same seed will cause the same TFontSpec to be returned.
+@return The generated fontspec. 
+ */
+static TFontSpec GenerateDejaVuFontSpec(TInt aSeed)
+	{
+	const TInt KFontHeightStep = 4;
+	const TInt KFontInitialHeight = 8;
+	
+	const TInt KNumFontTypefaces = 3;
+	const TInt KNumFontBitmapTypes = 2;
+	const TInt KNumFontStyles = 4;
+	
+	TInt fontBitmapTypeVariant = aSeed % KNumFontBitmapTypes;
+	TInt fontStyleVariant = (aSeed / KNumFontBitmapTypes) % KNumFontStyles;
+	TInt fontTypefaceVariant = (aSeed / ( KNumFontStyles * KNumFontBitmapTypes)) % KNumFontTypefaces;
+	TInt fontHeightVariant = aSeed / (KNumFontStyles * KNumFontTypefaces * KNumFontBitmapTypes);
+	
+	TFontSpec fontSpec;	
+	fontSpec.iHeight = KFontInitialHeight + (fontHeightVariant * KFontHeightStep);
+	// Set the typeface name
+	// Set the style.
+	switch (fontStyleVariant)
+		{
+		case 1: // italic
+			fontSpec.iFontStyle.SetPosture(EPostureItalic);
+			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
+			break;
+		case 2: // bold
+			fontSpec.iFontStyle.SetPosture(EPostureUpright);
+			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
+			break;
+		case 3: // bold italic
+			fontSpec.iFontStyle.SetPosture(EPostureItalic);
+			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
+			break;
+		default: // normal 
+			fontSpec.iFontStyle.SetPosture(EPostureUpright);
+			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
+			break;
+		}
+	switch (fontTypefaceVariant)
+		{
+		case 1:
+			fontSpec.iTypeface.SetName(_L("DejaVu Sans Mono"));
+			break;
+		case 2:
+			fontSpec.iTypeface.SetName(_L("DejaVu Serif Condensed"));
+			break;
+		case 3:
+			fontSpec.iTypeface.SetName(_L("DejaVu Sans Condensed"));
+			break;
+		}
+	switch(fontBitmapTypeVariant)
+		{
+		case 1:
+			fontSpec.iFontStyle.SetBitmapType(EMonochromeGlyphBitmap);
+			break;
+		default:
+			fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
+			break;
+		}
+
+	return fontSpec;
+	}
+
+
+/**
+ * 
+ EGL helper class to retrieve image data from an SgImage into a memory buffer.
+ */
+CEGLHelper::CEGLHelper() :
+	iDisplay(EGL_NO_DISPLAY),
+	iContext(EGL_NO_CONTEXT),
+	iSurface(EGL_NO_SURFACE)
+	{
+	}
+CEGLHelper::~CEGLHelper()
+	{
+	iMutex.Close();
+	eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+	eglDestroyContext(iDisplay, iContext);
+	eglDestroySurface(iDisplay, iSurface);
+	eglTerminate(iDisplay);
+	eglReleaseThread();
+	iSgDriver.Close();
+	}
+
+/**
+Factory method to create CEGLHelper.
+@return A pointer to an instance of CEGLHelper.
+ */
+CEGLHelper* CEGLHelper::NewL()
+	{
+	CEGLHelper* self = new CEGLHelper();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(1); // self
+	return self;
+	}
+
+/**
+Opens handle to the process-wide synchronisation semaphore,
+loads EGL and VG extension function pointers,
+sets up EGL resources so that EGLImages can be constructed. 
+ */
+void CEGLHelper::ConstructL()
+	{
+	_LIT(KEGLMutex, "TFbsGlyphDataEGLMutex");
+	User::LeaveIfError(iMutex.CreateGlobal(KEGLMutex, EOwnerProcess));
+	User::LeaveIfError(iSgDriver.Open());
+
+	iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+	if (iDisplay == EGL_NO_DISPLAY)
+		{
+		User::Leave(KErrNotSupported);
+		}
+	if (EGL_TRUE != eglInitialize(iDisplay, NULL, NULL))
+		{
+		User::Leave(KErrNotSupported);
+		}
+	eglBindAPI(EGL_OPENVG_API);
+
+	// Load the necessary EGL extensions...
+	eglCreateImageKHR = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
+	eglDestroyImageKHR = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
+	vgCreateImageTargetKHR = reinterpret_cast<TvgCreateEGLImageTargetKHRTypefPtr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
+	if (!eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateImageTargetKHR)
+		{
+		User::Leave(KErrExtensionNotSupported);
+		}
+
+	// In order to create VGImages from EGLImages, a context must be current.
+	// Therefore create an EGLContext and EGLSurface to make current, using
+	// a dummy RSgImage.
+
+	RSgImage dummySurface;
+	TSgImageInfo dummySurfaceInfo(TSize(1, 1), ESgPixelFormatRGB_565, ESgUsageBitOpenVgSurface);
+	User::LeaveIfError(dummySurface.Create(dummySurfaceInfo, NULL, 0));
+	CleanupClosePushL(dummySurface);
+
+	EGLint configAttribs[] = 
+		{
+		EGL_MATCH_NATIVE_PIXMAP, (EGLint)&dummySurface,
+		EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
+		EGL_NONE
+		};
+
+	EGLint configId = 0;
+	EGLint numConfigs = 0;
+	if (EGL_FALSE == eglChooseConfig(iDisplay, configAttribs, &configId, 1, &numConfigs) || numConfigs == 0)
+		{
+		User::Leave(KErrGeneral);
+		}
+	iContext = eglCreateContext(iDisplay, configId, EGL_NO_CONTEXT, NULL);
+	if (iContext == EGL_NO_CONTEXT)
+		{
+		User::Leave(KErrGeneral);
+		}
+	iSurface = eglCreatePixmapSurface(iDisplay, configId, &dummySurface, NULL);
+	if (iSurface == EGL_NO_SURFACE)
+		{
+		User::Leave(KErrGeneral);
+		}
+	CleanupStack::PopAndDestroy(1); // dummySurface
+	}
+
+/**
+Retrieves the data from an A8 RSgImage into a buffer.
+To do this, the RSgImage is converted to an EGLImage, then to a VGImage,
+where the image memory is read into the given buffer.
+The function can be called from multiple threads and synchronisation
+with EGL is controlled via a mutex.
+
+@param aSgImage The RSgImage to convert.
+@param aRect A rectangular region of the RSgImage to convert.
+@param aBuf On success, contains the image data of the RSgImage.
+@return One of the system-wide error codes.
+ */
+TInt CEGLHelper::GetSgImageData(const RSgImage& aSgImage, const TRect& aRect, TUint8*& aBuf)
+	{
+	const TSize bufferSize = aRect.Size();
+	const TInt dataStride = bufferSize.iWidth;
+
+	if (bufferSize == TSize(0,0))
+		{
+		return KErrNone;
+		}
+	iMutex.Wait();
+
+	TInt err = KErrNone;
+	EGLImageKHR eglImage;
+	if (EGL_FALSE == eglBindAPI(EGL_OPENVG_API))
+		{
+		err = KErrGeneral;
+		}
+	else if (EGL_FALSE == eglMakeCurrent(iDisplay, iSurface, iSurface, iContext))
+		{
+		err = KErrGeneral;
+		}
+	else
+		{
+		// Create EGLImages from the RSgImage.
+		EGLint imageAttribs[] =
+			{
+			EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, 
+			EGL_NONE
+			};
+		eglImage = eglCreateImageKHR(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<EGLClientBuffer>(&aSgImage), imageAttribs);
+		if (eglImage == EGL_NO_IMAGE_KHR)
+			{
+			err = KErrArgument;
+			}
+		}
+	if (err == KErrNone)
+		{
+		// Create VGImages from the EGLImage.
+		VGImage vgImage = vgCreateImageTargetKHR(eglImage);
+		eglDestroyImageKHR(iDisplay, eglImage);
+		if (vgImage == VG_INVALID_HANDLE)
+			{
+			err = KErrArgument;
+			}
+		else
+			{
+			// Get the image data in 8bpp format
+			vgGetImageSubData(vgImage, aBuf, dataStride, VG_A_8, aRect.iTl.iX, aRect.iTl.iY, bufferSize.iWidth, bufferSize.iHeight);
+			vgDestroyImage(vgImage);
+			}
+		}
+	eglReleaseThread();
+	iMutex.Signal();
+	return err;
+	}
+
+CTFbsGlyphData::CTFbsGlyphData(CTestStep* aStep):
+	CTGraphicsBase(aStep)
+	{
+	}
+
+void CTFbsGlyphData::ConstructL()
+	{
+	User::LeaveIfError(Logger().ShareAuto());
+	User::LeaveIfError(RFbsSession::Connect());
+	iFbs = RFbsSession::GetSession();
+	iTs = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL);
+	User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont, TFontSpec(KTypefaceName, 15)));
+	User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont2, TFontSpec(KTypefaceName, 8)));
+	
+	CCharCodeConverter* converter = CCharCodeConverter::NewLC();
+	converter->UseFontL(iFont);
+	iGlyphCodesLatin = new(ELeave) TUint[KNumGlyphCodesLatin];
+	for (TInt ii = 0; ii < KNumGlyphCodesLatin; ++ii)
+		{
+		TUint asciiCode = ii+0x20; // ASCII characters from 0020 to 007F
+		iGlyphCodesLatin[ii] = converter->GlyphCodeL(asciiCode);
+		}
+	CleanupStack::PopAndDestroy(1); // converter
+	
+	User::LeaveIfError(iSgDriver.Open());
+	iEGL = CEGLHelper::NewL();
+	
+	// Creating a CFbsBitmap will force the RFbsSession to allocate a scanline buffer
+	// now rather than in the middle of a test, thus avoiding heap check failure. 
+	CFbsBitmap* dummyBitmap = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(dummyBitmap);
+	User::LeaveIfError(dummyBitmap->Create(TSize(512, 1), EGray256));
+	CleanupStack::PopAndDestroy(dummyBitmap);
+
+	INFO_PRINTF1(_L("FBSERV Glyph Data Testing"));
+	}
+
+
+
+
+CTFbsGlyphData::~CTFbsGlyphData()
+	{
+	delete iEGL;
+	iSgDriver.Close();
+	if (iTs)
+		{
+		iTs->ReleaseFont(iFont);
+		iTs->ReleaseFont(iFont2);
+		}
+	delete iTs;
+	delete[] iGlyphCodesLatin;
+	User::Free(iTempBuf1);
+	User::Free(iTempBuf2);
+	RFbsSession::Disconnect();
+	}
+
+void CTFbsGlyphData::RunTestCaseL(TInt aCurTestCase)
+	{
+	((CTFbsGlyphDataStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	
+	TRAPD(leave, 
+
+	switch(aCurTestCase)
+		{
+	case 1:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0624"));
+		TestConsistencyWithGetCharacterData();
+		break;
+	case 2:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0625"));
+		TestInvalidGlyphCode();
+		break;
+	case 3:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0626"));
+		TestGlyphMetricsArrayParameters();
+		break;
+	case 4:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0627"));
+		TestGlyphMetricsArrayReuse();
+		break;
+	case 5:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0628"));
+		TestGlyphDataIteratorClose();
+		break;
+	case 6:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0629"));
+		TestGlyphDataIteratorSequence();
+		break;	
+	case 7:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0632"));
+		TestGlyphDataIteratorMultipleUsesOnMultipleFonts();
+		break;
+	case 8:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0633"));
+		TestGlyphDataIteratorImageValidity();
+		break;
+	case 9:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0634"));
+		TestGlyphDataIteratorOpenInvalidCode();
+		break;
+	case 10:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0636"));
+		TestGlyphDataIteratorOpenTwice();
+		break;
+	case 11:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0637"));
+		TestGlyphDataIteratorOpenTwiceWithDifferentFonts();
+		break;
+	case 12:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0638"));
+		TestGlyphDataIteratorOpenTooBigFont();
+		break;
+	case 13:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0640"));
+		TestGlyphDataIteratorOpenWithWrongArgument();
+		break;
+	case 14:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0641"));
+		TestGlyphDataIteratorImageMemoryLeak();
+		break;
+	case 15:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0662"));
+		TestGlyphDataIteratorNoGraphicsMemory();
+		break;
+	case 16: 
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0659"));
+		TestGlyphDataIteratorLargeFontStress();
+		break;
+	case 17: 
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0660"));
+		TestGlyphDataIteratorManyFontsStressL();
+		break;
+	case 18:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0666"));
+		TestGlyphDataIteratorNextIsAtomic();
+		break;
+	case 19:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0665"));
+		TestGlyphDataIteratorSameGlyphCodes();
+		break;
+	case 20:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0668"));
+		TestGlyphDataIteratorManyArraySizes();
+		break;
+	case 21:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0669"));
+		TestBitmapFontSupport();
+		break;
+	case 22:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0671"));
+		TestMultithreadShareSingleFont();
+		break;
+	case 23:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0672"));
+		TestMultithreadStressAtlas();
+		break;
+    case 24:
+        ((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0673"));
+        TestGlyphMetricsArrayHeapOOML();
+        break;
+    case 25:
+        ((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0674"));
+        TestGlyphDataIteratorHeapOOML();
+        break;
+	default:
+		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTFbsGlyphDataStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+		}
+	
+	); // TRAPD
+
+	if (leave != KErrNone)
+		{
+		ERR_PRINTF2(_L("Leave %d occurred during test"), leave);
+		iStep->SetTestStepResult(EFail);
+		}
+
+	((CTFbsGlyphDataStep*)iStep)->RecordTestResultL();
+	}
+
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0624
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that RFbsGlyphMetricsArray::Get() and CFont::GetCharacterData() all 
+	provide the same metrics for the same set of glyph codes when using a CFbsFont.
+	Shows that RFbsGlyphDataIterator::Metrics() and CFont::GetCharacterData()
+	provide the same metrics for the same set of glyph codes.
+
+@SYMTestActions
+	i. Call RFbsGlyphMetricsArray::Get() for a set of glyph codes with 1 glyph code per call.
+	ii. Call RFbsGlyphMetricsArray::Get() for a set of glyph codes all in 1 call.
+	iii. Call RFbsGlyphDataIterator::Open() for a set of glyph codes.
+	iv. Call CFont::GetCharacterData() for the same set of glyph codes.
+	v. Compare the metrics for each glyph code from all calls.
+
+@SYMTestExpectedResults
+	For each glyph code, metrics received from RFbsGlyphMetricsArray::Get() and
+	CFont::GetCharacterData() and RFbsGlyphDataIterator are all the same.
+*/
+void CTFbsGlyphData::TestConsistencyWithGetCharacterData()
+	{
+	INFO_PRINTF1(_L("Test RFbsGlyphMetricsArray::Get() with GetCharacterData()"));
+	
+	__UHEAP_MARK;
+
+	RFbsGlyphDataIterator iter;
+	RFbsGlyphMetricsArray glyphMetricsArray;
+	RFbsGlyphMetricsArray glyphMetricsArraySingle;
+	
+	TInt numMismatches = 0;
+	TOpenFontCharMetrics charMetrics;
+	TSize bitmapSize;
+	const TUint8* bitmapData = NULL;
+	
+	// Retrieve list of metrics for all glyph codes in one call
+	TInt err = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+	TESTNOERROR(err);
+	if (err == KErrNone)
+		{
+		TEST(KNumGlyphCodesLatin == glyphMetricsArray.Count());
+		
+		TInt index = 0;
+		TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+		TESTNOERROR(iterErr);
+		for (; iterErr == KErrNone; iterErr = iter.Next(), index++)
+			{
+			iFont->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
+			
+			// Retrieve the metrics for each glyph code, one at a time
+			TESTNOERROR(err = glyphMetricsArraySingle.Get(*iFont, &iGlyphCodesLatin[index], 1));
+			if (KErrNone == err)
+				{
+				// Compare GetCharacterData() metrics with single RFbsGlyphMetricsArray.
+				TUint32 comparison1 = CompareMetrics(charMetrics, glyphMetricsArraySingle[0]); 
+				// Compare GetCharacterData() metrics with large RFbsGlyphMetricsArray.
+				TUint32 comparison2 = CompareMetrics(charMetrics, glyphMetricsArray[index]);
+				// Compare GetCharacterData() metrics with RFbsGlyphDataIterator.
+				TUint32 comparison3 = CompareMetrics(charMetrics, iter.Metrics());
+				if (comparison1 != 0 || comparison2 != 0 || comparison3 != 0)
+					{
+					ERR_PRINTF5(_L("Glyphcode %i : Metrics mismatch: %d/%d/%d"), iGlyphCodesLatin[index], comparison1, comparison2, comparison3);
+					++numMismatches;
+					}
+				}
+			}
+			iter.Close();
+			glyphMetricsArray.Close();
+			glyphMetricsArraySingle.Close();
+			TESTE(iterErr == KErrNotFound, iterErr);
+			TEST(numMismatches == 0);
+			TEST(index == KNumGlyphCodesLatin);
+		}		
+	
+	__UHEAP_MARKEND;
+	}
+
+/**
+@return A series of success/fail booleans as a bitmask. A return value of zero
+	indicates all tests passed, a result of 1 indicates the first test case failed, 
+	a return of 3 indicates the first and second test failed, and so on.
+*/
+TUint32 CTFbsGlyphData::CompareMetrics(const TOpenFontCharMetrics& aMetrics1, const TOpenFontCharMetrics& aMetrics2)
+	{
+	TUint32 result = 0;
+	result |= (aMetrics1.Width() == aMetrics2.Width()) ? 0 : (1 << 0);
+	result |= (aMetrics1.Height() == aMetrics2.Height()) ? 0 : (1 << 1);
+	result |= (aMetrics1.HorizBearingX() == aMetrics2.HorizBearingX()) ? 0 : (1 << 2);
+	result |= (aMetrics1.HorizBearingY() == aMetrics2.HorizBearingY()) ? 0 : (1 << 3);
+	result |= (aMetrics1.HorizAdvance() == aMetrics2.HorizAdvance()) ? 0 : (1 << 4);
+	result |= (aMetrics1.VertBearingX() == aMetrics2.VertBearingX()) ? 0 : (1 << 5);
+	result |= (aMetrics1.VertBearingY() == aMetrics2.VertBearingY()) ? 0 : (1 << 6);
+	result |= (aMetrics1.VertAdvance() == aMetrics2.VertAdvance()) ? 0 : (1 << 7);
+	TRect rect1;
+	aMetrics1.GetHorizBounds(rect1);
+	TRect rect2;
+	aMetrics2.GetHorizBounds(rect2);
+	result |= (rect1 == rect2) ? 0 : (1 << 8);
+	aMetrics1.GetVertBounds(rect1);
+	aMetrics2.GetVertBounds(rect2);
+	result |= (rect1 == rect2) ? 0 : (1 << 9);
+	return result;
+	}
+
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0625
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that RFbsGlyphMetricsArray::Get(), and CFont::GetCharacterData() show the same 
+	behaviour when asked for metrics for an invalid glyph code when using a	CFbsFont. 
+	An invalid glyph code is one for which there is no character equivalent, such as 
+	0.
+
+@SYMTestActions
+	i. Call CFont::GetCharacterData() for an invalid glyph code.
+	ii. Call RFbsGlyphMetricsArray::Get() for the same invalid glyph code, and either 
+		compare the metrics if i. was successful, or check an error code was returned
+	
+@SYMTestExpectedResults
+	If GetCharacterData() is successful, the metrics received from
+	RFbsGlyphMetricsArray::Get() and CFont::GetCharacterData()	are the same, otherwise
+	RFbsGlyphMetricsArray::Get() should return an error code.
+*/
+
+void CTFbsGlyphData::TestInvalidGlyphCode()
+	{
+	INFO_PRINTF1(_L("Test behaviour of RFbsGlyphMetricsArray::Get() with invalid glyph code is consistent with GetCharacterData"));
+	
+	__UHEAP_MARK;
+	TInt arrayErr = KErrNone;
+	RFbsGlyphMetricsArray glyphMetricsArray;
+	TOpenFontCharMetrics charMetrics;
+	TSize bitmapSize;
+	const TUint8* bitmapData = NULL;
+	
+	CFont::TCharacterDataAvailability availability = iFont->GetCharacterData(KDejaVuInvalidGlyphCode | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
+	if (availability == CFont::ENoCharacterData)
+		{
+		// Some rasterizers fail to return any data for KDejaVuInvalidGlyphCode, therefore
+		// rather than compare metrics, make sure RFbsGlyphDataIterator returns an error code.
+		WARN_PRINTF1(_L("Rasterizer failed to return data for invalid glyph code; not comparing glyph metrics"));
+		arrayErr = glyphMetricsArray.Get(*iFont, &KDejaVuInvalidGlyphCode, 1);
+		TESTE(arrayErr != KErrNone, arrayErr);
+		}
+	else
+		{
+		TESTNOERROR(arrayErr = glyphMetricsArray.Get(*iFont, &KDejaVuInvalidGlyphCode, 1));
+		if (KErrNone == arrayErr)
+			{
+			iFont->GetCharacterData(KDejaVuInvalidGlyphCode | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
+			TUint comparisonResult = CompareMetrics(charMetrics, glyphMetricsArray[0]);
+			TESTNOERROR( comparisonResult );
+			}
+		}
+	glyphMetricsArray.Close();
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0626
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that RFbsGlyphMetricsArray::Get() returns with the correct error code when passed
+	various combinations of parameters, and preserves the state of the array.
+
+@SYMTestActions
+	Populate the array with a single metrics entry.
+	Call RFbsGlyphMetricsArray::Get with the following parameter combinations:
+		1. A negative count
+		2. A positive count and null glyph code array pointer
+		3. A zero count and non-null glyph code array pointer
+		4. A zero count and null glyph code array pointer
+
+@SYMTestExpectedResults
+	The following return codes are expected for each call:
+		1. KErrArgument
+		2. KErrArgument
+		3. KErrArgument
+		4. KErrArgument	
+	For each case the glyph metrics array remains unchanged.
+*/
+void CTFbsGlyphData::TestGlyphMetricsArrayParameters()
+	{
+	INFO_PRINTF1(_L("Test the return values of GetGlyphMetrics with different parameters"));
+	__UHEAP_MARK;
+	TInt arrayErr = KErrNone;
+	TOpenFontCharMetrics dummyMetrics;
+	
+	RFbsGlyphMetricsArray glyphMetricsArray;
+	arrayErr = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, 1);
+	TESTNOERROR(arrayErr);
+	TEST(1 == glyphMetricsArray.Count());
+	
+	// 1. Negative Count
+	arrayErr = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, -1);
+	TESTE(KErrArgument == arrayErr, arrayErr);
+	TEST(1 == glyphMetricsArray.Count());
+	
+	// 2. Positive Count and NULL Array Pointer
+	arrayErr = glyphMetricsArray.Get(*iFont, NULL, 1);
+	TESTE(KErrArgument == arrayErr, arrayErr);
+	TEST(1 == glyphMetricsArray.Count());
+
+	// 3. Zero Count & Valid Array Pointer
+	arrayErr = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, 0);
+	TESTE(KErrArgument == arrayErr, arrayErr);
+
+	// 4. Zero Count & NULL Array Pointer
+	arrayErr = glyphMetricsArray.Get(*iFont, NULL, 0);
+	TESTE(KErrArgument == arrayErr, arrayErr);
+
+	glyphMetricsArray.Close();
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0627
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that reusing an RFbsGlyphMetricsArray works correctly.
+	In particular when the array is reused and filled with fewer entries
+	and when the array is reused and filled with more entries than previously.
+	It also shows that when re-using an array that has been populated, memory 
+	is not de-allocated if the new array of glyphs is smaller.
+
+@SYMTestActions
+	i. Call RFbsGlyphMetricsArray::Get() for a set of 10 glyph codes.
+	ii. Check that the RFbsGlyphMetricsArray has 10 entries.
+	iii. Find the size of the heap-cell allocated to the array.
+	iii. Call RFbsGlyphMetricsArray::Get() for a set of 5 glyph codes.
+	iv. Check that the RFbsGlyphMetricsArray has 5 entries.
+	v. Call RFbsGlyphMetricsArray::Get() for a set of 20 glyph codes.
+	vi. Check that the RFbsGlyphMetricsArray has 20 entries.
+	vii. Call RFbsGlyphMetricsArray::Get() for a set of 0 glyph codes.
+	viii. Check that the RFbsGlyphMetricsArray has 0 entries.
+	ix. Call RFbsGlyphMetricsArray::Get() for 1 glyph code.
+	x. Check that the RFbsGlyphMetricsArray has 1 entries.
+	xi. Close the RFbsGlyphMetricsArray.
+	xii. Check that the RFbsGlyphMetricsArray has 0 entries.
+	During the test check that the size of the heap cell allocated to the array
+	does not shrink.
+
+@SYMTestExpectedResults
+	After each call to RFbsGlyphMetricsArray::Get(), the array has the expected number of entries.
+*/
+void CTFbsGlyphData::TestGlyphMetricsArrayReuse()
+	{
+	INFO_PRINTF1(_L("Test reuse of array with RFbsGlyphMetricsArray"));
+	__UHEAP_MARK;
+	
+	RFbsGlyphMetricsArray glyphMetricsArray;
+
+	// Retrieve list of metrics for 10 glyph codes
+	TESTNOERROR(glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, 10));
+	TEST(10 == glyphMetricsArray.Count());
+	
+	// Find the size of the heap cell allocated for the array.
+	TInt arrayHeapCellSize = User::Heap().AllocLen(&glyphMetricsArray[0]);
+	
+	// Retrieve list of metrics for 5 glyph codes.
+	// To ensure that different metrics are returned, use different glyph codes
+	TESTNOERROR(glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[10], 5));
+	TEST(5 == glyphMetricsArray.Count());
+	// Check that memory has not been de-allocated for a smaller array.
+	TEST(User::Heap().AllocLen(&glyphMetricsArray[0]) == arrayHeapCellSize);
+
+	// Retrieve list of metrics for 20 glyph codes.
+	// To ensure that different metrics are returned, use different glyph codes
+	TESTNOERROR(glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[15], 20));
+	TEST(20 == glyphMetricsArray.Count());
+	arrayHeapCellSize = User::Heap().AllocLen(&glyphMetricsArray[0]);
+		
+	// Retrieve list of metrics for 0 glyph codes.
+	TEST(KErrArgument == glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[35], 0));
+	// We can't check whether memory has been de-allocated as glyphMetricsArray[0]
+	// is null, therefore dereferencing it causes a panic.
+
+	// Retrieve list of metrics for 1 glyph code.
+	// To ensure that different metrics are returned, use different glyph code
+	TESTNOERROR(glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[35], 1));
+	TEST(1 == glyphMetricsArray.Count());
+	TEST(User::Heap().AllocLen(&glyphMetricsArray[0]) == arrayHeapCellSize);
+	
+	// Test that after closing a non-empty array, the array has 0 size.
+	glyphMetricsArray.Close();
+	TEST(0 == glyphMetricsArray.Count());
+	
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0628
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Validates the behaviour of RFbsGlyphDataIterator::Close() in the following use cases:
+		1. When called on an iterator instance which has not been opened, has no effect.
+		2. When called on an open iterator closes the iterator 
+
+@SYMTestActions
+	Use case 1:
+		i. Create an RFbsGlyphDataIterator instance but do not open.
+		ii. Call RFbsGlyphDataIterator::Close().
+		
+	Use case 2:
+		i. Create an RFbsGlyphDataIterator instance and call RFbsGlyphDataIterator::Open().
+		ii. Call RFbsGlyphDataIterator::Next() to prove the iterator is open.
+		iii. Call RFbsGlyphDataIterator::Close().
+		iv. Check that RFbsGlyphDataIterator::IsOpen() returns false.
+	
+@SYMTestExpectedResults
+	Each call to RFbsGlyphDataIterator::IsOpen() returns the expected value.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorClose()
+	{
+	INFO_PRINTF1(_L("Test closing an RFbsGlyphDataIterator"));
+	__UHEAP_MARK;
+
+	// Use case 1
+	RFbsGlyphDataIterator iter1;
+	iter1.Close();
+
+	// Use case 2
+	RFbsGlyphDataIterator iter2;
+	TESTNOERROR(iter2.Open(*iFont, iGlyphCodesLatin, 1));
+	TInt iterErr = iter2.Next();
+	TESTE(KErrNotFound == iterErr, iterErr);
+	iter2.Close();
+	
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0629
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Show that the sequence of iterations when calling RFbsGlyphDataIterator::Next()
+	matches the order of the array of glyph codes.
+
+@SYMTestActions
+	i. Create an RFbsGlyphDataIterator instance and call RFbsGlyphDataIterator::Open()
+		with an array of different glyph codes.
+	ii. Iterate through all the glyph data.
+		For each iteration check that the glyph code returned from 
+		RFbsGlyphDataIterator::GlyphCode() matches the corresponding glyph code
+		passed into Open().
+
+@SYMTestExpectedResults
+	Each comparison of glyph code should match.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorSequence()
+	{
+	INFO_PRINTF1(_L("Test the iterator sequence of RFbsGlyphDataIterator"));
+	__UHEAP_MARK;
+	
+	TBool matches = ETrue;
+	TInt index = 0;
+
+	RFbsGlyphDataIterator iter;
+	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+	TESTNOERROR(iterErr);
+	for (; index < KNumGlyphCodesLatin && matches && (iterErr == KErrNone); iterErr = iter.Next(), index++)
+		{
+		if (iter.GlyphCode() != iGlyphCodesLatin[index])
+			{
+			ERR_PRINTF4(_L("Failed at iteration %d: wanted %d, got %d"), index, iGlyphCodesLatin[index], iter.GlyphCode());
+			matches = EFalse;
+			}
+		}
+	iter.Close();
+	TESTE(iterErr == KErrNotFound, iterErr);
+	TEST(matches);
+	TEST(index == KNumGlyphCodesLatin);
+	iter.Close();
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0632
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Ensure it is possible to reuse a closed iterator on another CFbsFont.
+	
+@SYMTestActions
+	i. Open an RFbsGlyphDataIterator with sample data.
+	ii. Iterate through until the end of the iterator has been reached by calling 
+		Next() on the final element.
+	iii. Re-open the same RFbsGlyphDataIterator with sample data on a different CFbsFont.
+	iv. Iterate through a second time until the end has been reached by calling Next()
+		on the final element.
+	v. Close the iterator.
+	vi. During both iterations the bitmap data returned and metrics are compared with
+		the equivalent from GetCharacterData().
+
+@SYMTestExpectedResults
+	The iterator should be opened successfully for both fonts and the data returned
+	should match the data from GetCharacterData().
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorMultipleUsesOnMultipleFonts()
+	{
+	INFO_PRINTF1(_L("Reuse a closed iterator on a second CFbsFont"));
+	__UHEAP_MARK;
+	
+	const TUint8* bitmapData;
+	TSize bitmapSize;
+	TOpenFontCharMetrics charMetrics;
+	RFbsGlyphDataIterator iter;
+	
+	// Array of fonts to iterate through.
+	CFbsFont* font[2] = {iFont, iFont2};
+	
+	for (TInt fontId = 0; fontId < 2; fontId++)
+		{
+		// On the first iteration, open and use a font until all glyphs have been iterated through.
+		// On second iteration, use the same iterator on a different font and repeat.
+        CFbsFont* currentFont = font[fontId];
+
+		//Open the iterator on the first font and compare the returned bitmaps against GetCharacterData
+		TInt iterErr = iter.Open(*currentFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+		TESTNOERROR(iterErr);
+		TFontSpec fontSpec = currentFont->FontSpecInTwips();
+		
+		TInt index = 0;
+		for (; (iterErr == KErrNone) && (index < KNumGlyphCodesLatin); iterErr = iter.Next(), ++index)
+			{
+			currentFont->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
+			
+			TESTNOERROR(CompareMetrics(charMetrics, iter.Metrics()));
+			if (bitmapSize == TSize(0, 0))
+				{
+				TEST(bitmapSize == iter.Rect().Size());
+				}
+			else
+				{
+				// Compare images.
+				TBool match = EFalse;
+				RSgImage characterDataImage;
+				TInt err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage);
+				if (err == KErrNone)
+					{
+					err = CompareSgImages(iEGL, iter.Image(), iter.Rect(), characterDataImage, TRect(bitmapSize), match);
+					}
+				characterDataImage.Close();
+				if (err != KErrNone)
+					{
+					TESTNOERROR(err);
+					break;
+					}
+				TEST(match);
+				}		
+			}
+		iter.Close();
+		TESTE(iterErr == KErrNotFound, iterErr);
+		TEST(index == KNumGlyphCodesLatin);
+		}
+	
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0633
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Check that for various Latin fonts, the images of the glyphs stored on the 
+	RSgImage matches those provided by GetCharacterData().
+
+@SYMTestActions
+	Create a selection of fonts, using various typefaces, sizes and bitmap types.
+	For each font:
+	i. Open the RFbsGlyphDataIterator and iterate each glyph.
+	ii. For each glyph, call GetCharacterData() with the expected glyph code.
+	iii. Convert the character data to an RSgImage.
+	iv. Perform a comparison between the character RSgImage and the iterator 
+		image. 
+	v. After all iterations, close the iterator and check all expected glyphs
+		were iterated through.
+
+@SYMTestExpectedResults
+	All glyph images should match.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorImageValidity()
+	{
+	INFO_PRINTF1(_L("Test the glyph images of the iterator match GetCharacterData()"));
+	__UHEAP_MARK;
+	
+	const TInt KNumFonts = 20;
+	
+	// Create a new typeface store for this test so that heap checking will not
+	// be affected by cached CFbsFonts.
+	CFbsTypefaceStore* typefaceStore = NULL;
+	TRAPD(err, typefaceStore = CFbsTypefaceStore::NewL(NULL));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Failed to construct typeface store. Test aborted."));
+		__UHEAP_RESET;
+		iStep->SetTestStepResult(EFail);
+		return;
+		}
+	
+	for (TInt font = 0; font < KNumFonts; ++font)
+		{
+		// Use either a pre-created bitmap-font TFontSpec, or generate a Deja-vu one.
+		TFontSpec fontSpec = GenerateDejaVuFontSpec(font);
+		CFbsFont* latinFont = NULL;
+		TESTNOERROR(typefaceStore->GetNearestFontToDesignHeightInPixels((CFont*&)latinFont, fontSpec));	
+		
+		fontSpec = latinFont->FontSpecInTwips();
+		InfoPrintFontSpec(*latinFont);
+				
+		RFbsGlyphDataIterator iter;
+		TInt iterErr = iter.Open(*latinFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+		TESTNOERROR(iterErr);
+
+		err = KErrNone;
+		TInt index = 0;
+		TInt numMismatches = 0;
+		// For each iteration, get the character data of the expected glyph.
+		// Create RSgImage from character data, and compare iter image with constructed image.
+		for (; (iterErr == KErrNone) && (err == KErrNone) && (index < KNumGlyphCodesLatin); (iterErr = iter.Next()), ++index)
+			{
+			TBool glyphMatches = ETrue;
+			const RSgImage& iteratorImage = iter.Image();
+
+			const TUint8* bitmapData = NULL;
+			TSize bitmapSize;
+			TOpenFontCharMetrics metrics;
+			TInt characterDataAvailability = latinFont->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
+			if (bitmapSize == TSize(0, 0))
+				{
+				glyphMatches = (bitmapSize == iter.Rect().Size());
+				}
+			else
+				{
+				RSgImage characterDataImage;
+				TESTNOERROR(CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage));
+				err = CompareSgImages(iEGL, iteratorImage, iter.Rect(), characterDataImage, TRect(bitmapSize), glyphMatches);
+				characterDataImage.Close();
+				}
+			if (err == KErrNone && !glyphMatches)
+				{
+				ERR_PRINTF2(_L("Glyphcode %i : Image mismatch"), iGlyphCodesLatin[index]);
+				++numMismatches;
+				}
+			}
+		iter.Close();
+		TESTNOERROR(err);
+		TESTE(iterErr == KErrNotFound, iterErr);
+		TEST(index == KNumGlyphCodesLatin);	
+		TEST(numMismatches == 0);
+		typefaceStore->ReleaseFont(latinFont);
+		}
+	delete typefaceStore;
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0634
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that if the glyph image iterator has a current invalid 
+	character code, the SgImage returned by the iterator will match 
+	to the image obtained from the GetCharacterData() function
+@SYMTestActions
+	i. Retrieve bitmap data and metrics by using GetCharacterData().
+	ii. Open a glyph data iterator passing an invalid character code.
+	iii. If i. was unsuccessful, check that opening the iterator returned
+		an error code and skip to ix.
+	iv. Create SgImage from bitmap data.
+	v. Get SgImage from the glyph data iterator.
+	vi. Compare SgImages obtained on iv and v steps.
+	vii. Get font metrics from the glyph data iterator.
+	viii. Compare metrics obtained on i and vii steps.
+	vii. Close the iterator.
+
+@SYMTestExpectedResults
+	If the request to get the character data failed, the return value of 
+	RFbsGlyphDataIterator::Open() must not be KErrNone.
+	Otherwise, images obtained from the iterator and GetCharacterData() should
+	match.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorOpenInvalidCode()
+	{
+	INFO_PRINTF1(_L("Ensure that the image returned by the iterator will \
+match to the image obtained from GetCharacterData() if character code is invalid"));
+	__UHEAP_MARK;
+
+	const TUint8* bitmapData = NULL;
+	TSize bitmapSize;
+	TOpenFontCharMetrics metrics;
+	const TFontSpec fontSpec = iFont->FontSpecInTwips();
+	CFont::TCharacterDataAvailability availability = iFont->GetCharacterData(KDejaVuInvalidGlyphCode | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
+
+	RFbsGlyphDataIterator iter;
+	TInt err = iter.Open(*iFont, &KDejaVuInvalidGlyphCode, 1);
+	if (availability == CFont::ENoCharacterData)
+		{
+		// Some rasterizers fail to return any data for KDejaVuInvalidGlyphCode, therefore
+		// rather than compare image contents, make sure RFbsGlyphDataIterator returns an error code.
+		WARN_PRINTF1(_L("Rasterizer failed to return data for invalid glyph code; not comparing image contents"));
+		TESTE(err != KErrNone, err);
+		}
+	else
+		{
+		TESTNOERROR(err);
+		if (err == KErrNone)
+			{
+			TBool glyphMatches = EFalse;
+			if (bitmapSize == TSize(0, 0))
+				{
+				glyphMatches = (bitmapSize == iter.Rect().Size());
+				}
+			else
+				{
+				RSgImage characterDataImage;
+				TESTNOERROR(CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage));
+				TESTNOERROR(CompareSgImages(iEGL, iter.Image(), iter.Rect(), characterDataImage, TRect(bitmapSize), glyphMatches));
+				characterDataImage.Close();
+				}
+			TESTNOERROR(CompareMetrics(metrics, iter.Metrics()));
+			TEST(glyphMatches);
+			}
+		}
+	iter.Close();
+
+	__UHEAP_MARKEND;
+	}
+
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0636
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that opening the glyph data iterator which has already been opened with the same font
+	has no effect on the state of the iterator.
+@SYMTestActions
+	i. Open glyph data iterator on 2 glyph codes.
+	ii. Try to open the glyph data iterator again on the same font.
+	iii. Call RFbsGlyphDataIterator::Next() on the iterator and check error code, making the last
+		glyph code the current iteration.
+	iv. Call RFbsGlyphDataIterator::Next() again.
+@SYMTestExpectedResults
+	The second attempt to open the glyph data iterator will result an error with code KErrInUse.
+	The last two calls to RFbsGlyphDataIterator::Next() should return KErrNone and KErrNotFound
+	respectively, showing the iterator was not modified when the call to Open() failed.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorOpenTwice()
+	{
+	INFO_PRINTF1(_L("Ensure that opening the glyph data iterator which has already been opened with the same font has no effect"));
+	__UHEAP_MARK;
+
+	RFbsGlyphDataIterator iter;
+	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, 2);
+	TESTNOERROR(iterErr);
+	
+	iterErr = iter.Open(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+	TESTE(iterErr == KErrInUse, iterErr);
+	iterErr = iter.Next();
+	TESTNOERROR(iterErr);
+	iterErr = iter.Next();
+	TESTE(iterErr == KErrNotFound, iterErr);
+	iter.Close();
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0637
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that opening the glyph data iterator which has already been opened with different font
+	has no effect on the state of the iterator.
+@SYMTestActions
+	i. Open glyph data iterator on an 2 glyph codes
+	ii. Try to open the glyph data iterator again with a different font.
+	iii. Call RFbsGlyphDataIterator::Next() on the iterator and check error code, making the last
+		glyph code the current iteration.
+	iv. Call RFbsGlyphDataIterator::Next() again.
+@SYMTestExpectedResults
+	The second attempt to open the glyph data iterator will result an error with code KErrInUse.
+	The Next() call after this should return KErrNone, signifying the iterator is still open.
+	The last Next() call should return KErrNotFound, signifying the iterator has iterated 
+	through the two original glyph codes.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorOpenTwiceWithDifferentFonts()
+	{
+	INFO_PRINTF1(_L("Ensure that opening the glyph data iterator which has already been opened with different font has no effect"));
+	__UHEAP_MARK;
+
+	RFbsGlyphDataIterator iter;
+	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, 2);
+	TESTNOERROR(iterErr);
+
+	iterErr = iter.Open(*iFont2, iGlyphCodesLatin, 2);
+	TESTE(iterErr == KErrInUse, iterErr);
+	iterErr = iter.Next();
+	TESTNOERROR(iterErr);
+	iterErr = iter.Next();
+	TESTE(iterErr == KErrNotFound, iterErr);
+	iter.Close();
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0638
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that opening of glyph data iterator with the font greater than 
+	2048 by 2048 will not be supported 
+@SYMTestActions
+	i. Create font with the height greater than 2048
+	ii. Try to open the glyph data iterator with the font created on previous step
+	iii Release the font
+@SYMTestExpectedResults
+	Must fail with error code KErrTooBig
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorOpenTooBigFont()
+	{
+	INFO_PRINTF1(_L("To ensure that opening of glyph data iterator with the font greater than 2048X2048 will not be supported"));
+	__UHEAP_MARK;
+
+	CFbsFont* bigFont;
+	const TInt maxHeight = 2048;
+	const TInt maxHeightLimit = maxHeight + 20; //max size after we stop trying to create the font
+	// the loop below will guarantee that if the font with the size greater than 2048 is available it will be created
+	for(TInt height = maxHeight + 1; height < maxHeightLimit; height++)
+		{
+		TESTNOERROR(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)bigFont, TFontSpec(KTypefaceName, height)));
+		TInt realHeight = bigFont->FontMaxHeight();
+		if(realHeight > maxHeight)
+			{
+			break;
+			}
+		iTs->ReleaseFont(bigFont);
+		bigFont = NULL;
+		}
+
+	if (bigFont)
+		{
+		RFbsGlyphDataIterator iter;
+		TInt iterErr = iter.Open(*bigFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+		TESTE(iterErr == KErrTooBig, iterErr);
+		iTs->ReleaseFont(bigFont); 
+		}
+	else
+		{
+		//It is legitimate to fail to create the font, as there are no requirements for the rasterizer here to support such big font. 
+		//In this case we will skip the test.
+		WARN_PRINTF1(_L("Failed to create font with height greater than 2048"));
+		}
+
+	__UHEAP_MARKEND;
+	}
+
+
+
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0640
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that the glyph data iterator processes wrong arguments correctly
+@SYMTestActions
+	i. Try to open the glyph data iterator with the negative count passed in
+	ii. Try to open the glyph data iterator with the positive count and NULL 
+	glyph code array pointer passed in
+	iii. Try to open the glyph data iterator with a valid glyph code array and 
+	count equal to zero
+@SYMTestExpectedResults
+	At all steps the returned value is set to KErrArgument.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorOpenWithWrongArgument()
+	{
+	INFO_PRINTF1(_L("To ensure that the glyph data iterator processes wrong arguments correctly"));
+	__UHEAP_MARK;
+
+	RFbsGlyphDataIterator iter;
+	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, -1);
+	TESTE(iterErr == KErrArgument, iterErr);
+	
+	iterErr = iter.Open(*iFont, NULL, 1);
+	TESTE(iterErr == KErrArgument, iterErr);
+	
+	iterErr = iter.Open(*iFont, iGlyphCodesLatin, 0);
+	TESTE(iterErr == KErrArgument, iterErr);
+	
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0641
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that all allocated RSgImages were released after the
+	glyph data iterator has been opened and closed multiple times.
+
+@SYMTestActions
+	i. Retrieve MSgDriver_Test interface from the SgDriver
+	ii. Mark alloc start and obtain resorce count from the interface
+	iii. Iterate through glyph data by calling RFbsGlyphDataIterator::Next() 
+	iv. Retrieve SgImage from the glyph data iterator instance
+	v. Repeate steps iii and iv multiple times
+	vi. Release font
+	vii.  Mark alloc end and obtain resorce count from the interface
+
+@SYMTestExpectedResults
+	Resorce count at the end matches resorce count at the beginning. 
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorImageMemoryLeak()
+	{
+	__UHEAP_MARK;
+	
+	MSgDriver_Test* sgDriverTestInterface = NULL; 
+	TInt err = iSgDriver.GetInterface(sgDriverTestInterface);
+	if(err != KErrNone)
+		{
+		__UHEAP_MARKEND;
+		WARN_PRINTF2(_L("Failed to obtain MSgDriver_Test interface with error code: %d, the test will be skipped"), err);
+		return;
+		}
+
+	TEST(sgDriverTestInterface != NULL);
+	sgDriverTestInterface->AllocMarkStart();
+
+	MSgDriver_Profiling* sgDriverProfilInterface = NULL;
+	err = iSgDriver.GetInterface(sgDriverProfilInterface);
+	if(err != KErrNone)
+		{
+		sgDriverTestInterface->AllocMarkEnd(0);
+		__UHEAP_MARKEND;
+		WARN_PRINTF2(_L("Failed to obtain MSgDriver_Profiling interface with error code: %d, the test will be skipped"), err);
+		return;
+		}
+	const TInt resCount = sgDriverProfilInterface->LocalResourceCount();
+
+	CFbsFont* font = NULL;
+	err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KTypefaceName, 15));
+	TESTNOERROR(err);
+	if(err != KErrNone)
+		{
+		__UHEAP_MARKEND;
+		return;
+		}
+
+	for (TInt ii = 0; ii < 10; ii++)
+		{
+		TInt index = 0;
+		RFbsGlyphDataIterator iter;
+		TInt iterErr = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+		TESTNOERROR(iterErr);
+		for (; (iterErr == KErrNone) && (index < KNumGlyphCodesLatin); iterErr = iter.Next(), ++index)
+			{
+			const RSgImage& image = iter.Image();
+			}
+		iter.Close();
+		TEST(index == KNumGlyphCodesLatin);
+		TESTE(iterErr == KErrNotFound, iterErr);
+		}
+	iTs->ReleaseFont(font);
+	const TInt resCountEnd = sgDriverProfilInterface->LocalResourceCount();
+	TEST(resCountEnd == resCount);
+	sgDriverTestInterface->AllocMarkEnd(0);
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0659
+@SYMTestPriority    Med
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	Uses the RFbsGlyphDataIterator to render a large amount of unique glyphs, at a very large 
+	size, to ensure that if graphics memory runs out while the iterator is in use, eviction 
+	takes place and does not corrupt the glyph images in any way.
+
+@SYMTestActions
+	i. Create a large CFbsFont from the typeface store (size 100+)
+	ii. Simulate a low graphics-memory situation by creating enough RSgImages to fill the memory,
+		releasing one image in order to allow some small amount for the test.
+	iii. Open a RFbsGlyphDataIterator on the font, using a large array of unique glyph codes.
+	iv. Iterate through the glyphs, comparing each returned SgImage against the system-memory
+		representation of the glyph as returned by CFont::GetCharacterData().
+	v. Check for errors and mismatches, and release all images created by ii.
+	
+@SYMTestExpectedResults
+	At each iteration, each glyph should match in size and contents. 
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorLargeFontStress()
+	{
+	INFO_PRINTF1(_L("Stress test using a RFbsGlyphDataIterator with a large font"));
+#ifdef __WINS__
+	// Cannot run test on emulator reliably - this is because on emulator
+	// system-memory is used for RSgImages, so using up RSgImage memory may 
+	// cause heap-allocation failures unrelated to the area being tested. 
+	// This test is specifically testing the behaviour when running out of
+	// RSgImage-based memory (i.e. graphics memory), but on emulator this 
+	// will cause a failed allocation anywhere.
+	INFO_PRINTF1(_L("Skipping test on emulator..."));
+#else
+	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM"));
+	TEST(EFalse);
+/*	__UHEAP_MARK;
+
+	const TInt KFontSize = 128;
+
+	CFbsFont* font;
+	TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KMonoTypefaceName, KFontSize));
+	TESTNOERROR(err);
+	// Output the actual fontspec used in the test.
+	InfoPrintFontSpec(*font);
+	
+	// Create 2 buffers for use in comparing SgImages so that we don't run out 
+	// of system memory through allocating memory in the test
+	TInt maxFontWidth = font->MaxCharWidthInPixels();
+	TInt maxFontHeight = font->HeightInPixels();
+	iTempBuf1 = (TUint8*) User::AllocZ(maxFontWidth * maxFontHeight);
+	iTempBuf2 = (TUint8*) User::AllocZ(maxFontWidth * maxFontHeight);
+
+	// In order for the image comparisons to have enough memory to perform, keep 
+	// one large RSgImage which is created before the rest of the graphics memory 
+	// is filled.  This image can then be closed before doing the image comparison 
+	// and recreated after the image comparison to ensure that the graphics 
+	// memory is full.  Without this image, the image comparison could fail with 
+	// out of memory and the test would fail. 
+	RSgImage tempImage;
+	TESTNOERROR(tempImage.Create(TSgImageInfo(TSize(1000, 1000), ESgPixelFormatA_8, ESgUsageBitOpenVgImage)));
+
+	TFontSpec actualFontSpec;
+	actualFontSpec = font->FontSpecInTwips();
+	
+	// Create RSgImages from character data independently from using iterator.
+	// These will be used for comparing with RSgImages retrieved from iterator.
+	RArray <RSgImage> sgImageFromCharDataArray;
+	TInt index = 0;
+	for(; (index < KNumGlyphCodesLatin) && (err == KErrNone); ++index)
+		{
+		RSgImage characterDataSgImage;
+		TInt err = KErrNone;
+		const TUint8* bitmapData = NULL;
+		TSize bitmapSize;
+		TOpenFontCharMetrics metrics;
+		font->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
+
+		if (bitmapSize != TSize(0, 0))
+			{
+			err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, actualFontSpec.iFontStyle.BitmapType(), characterDataSgImage, iTempBuf1, iTempBuf2);
+			}
+		if (KErrNone == err)
+			{
+			err = sgImageFromCharDataArray.Append(characterDataSgImage);
+			}
+		}
+	TESTNOERROR(err);
+	TEST(index == KNumGlyphCodesLatin);
+
+	// Simulate low OOGM situation by creating many RSgImages until out of memory.
+	RArray <RSgImage> sgImageArray;
+	if (err == KErrNone)
+		{
+		TESTNOERROR(NearlyFillGraphicsMemoryWithImages(TSize(256, 256), sgImageArray));
+		}
+	
+	// Open Iterator on long string of data...
+	RFbsGlyphDataIterator iter;
+	TInt iterErr = KErrNone;
+	if (err == KErrNone)
+		{
+		iterErr = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+		TESTNOERROR(iterErr);
+		}
+
+	// For each glyph, compare it to the system-memory version from GetCharacterData().
+	TInt numMismatches = 0;
+	for(index = 0; (iterErr == KErrNone) && (index < sgImageFromCharDataArray.Count()) && (err == KErrNone); iterErr = iter.Next(), ++index)
+		{
+		const TUint8* bitmapData = NULL;
+		TSize bitmapSize;
+		TOpenFontCharMetrics metrics;
+		font->GetCharacterData(iter.GlyphCode() | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
+
+		if (iter.Rect().Size() == TSize(0, 0))
+			{
+			numMismatches += (bitmapSize != TSize(0, 0)) ? 1 : 0;
+			}
+		else
+			{
+			// Free up memory so that the image compariso succeeds
+			// Release all the images used to simulate OOGM.
+			for (TInt i = sgImageArray.Count() - 1; i >= 0; --i)
+				{
+				sgImageArray[i].Close();
+				sgImageArray.Remove(i);
+				}
+			
+			TBool match = ETrue;
+			err = CompareSgImages(iEGL, sgImageFromCharDataArray[index], TRect(bitmapSize), iTempBuf1, iter.Image(), iter.Rect(), iTempBuf2, match);
+			if (err == KErrNone && !match)
+				{
+				++numMismatches;
+				}
+			TInt result = FillGraphicsMemoryWithImages(TSize(256, 256), sgImageArray);
+			TESTE(result == KErrNoMemory || result == KErrNoGraphicsMemory, result);
+			}
+		}
+	iter.Close();
+
+	// Release all images created from character data.
+	for (TInt i = sgImageFromCharDataArray.Count()-1; i >= 0; --i)
+		{
+		sgImageFromCharDataArray[i].Close();
+		}
+	sgImageFromCharDataArray.Close();
+
+	// Release all the images used to simulate OOGM.
+	for (TInt i = sgImageArray.Count() - 1; i >= 0; --i)
+		{
+		sgImageArray[i].Close();
+		}
+	sgImageArray.Close();
+	tempImage.Close();
+	iTs->ReleaseFont(font);
+	User::Free(iTempBuf1);
+	User::Free(iTempBuf2);
+	iTempBuf1 = NULL;
+	iTempBuf2 = NULL;
+
+	// Log any errors only after memory is freed - this ensures there is enough
+	// memory for the logger.
+	TESTNOERROR(err);
+	TESTE(iterErr == KErrNotFound, iterErr);
+	TEST(index == KNumGlyphCodesLatin);
+	TEST(numMismatches == 0);
+
+	__UHEAP_MARKEND;*/
+#endif
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0660
+@SYMTestPriority    Med
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	Opens an RFbsGlyphDataIterator on many different fonts of different sizes and typefaces
+	and uses many fonts, in order to test that the iterator can cope with being used on many
+	fonts with many glyphs.
+
+@SYMTestActions
+	i. Perform test of 100 iterations, where:
+		1. A new Latin font is created every iteration in order to force the Typeface Store
+			to create a brand-new server-side font at each iteration. 
+		2. For this font, open an RFbsGlyphDataIterator and cycle through all Latin glyphs.
+		3. For each glyph, compare against the glyph image returned by CFont::GetCharacterData().
+		4. Keep a record of the number of mismatches, and carry on to next font.
+	ii. Perform i. again, but using the existing fonts.
+	iii. Check that there are no mismatches, all glyphs and fonts were successfully checked, 
+		and no error codes returned during the test.
+	iv. Clean up all resources.
+	
+@SYMTestExpectedResults
+	The glyphs provided by the iterator should match that returned by GetCharacterData()
+	for every font and every iteration. 
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorManyFontsStressL()
+	{
+	INFO_PRINTF1(_L("Stress test using a RFbsGlyphDataIterator with hundreds of fonts"));
+	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM"));
+	TEST(EFalse);
+	/*__UHEAP_MARK;
+
+	const TInt KNumFonts = 100;
+	const TInt KNumRepeatsPerFont = 2;
+	TInt err = KErrNone;
+	TInt numGlyphMismatches = 0;
+
+	CFbsFont** font = new (ELeave) CFbsFont*[KNumFonts];
+	Mem::FillZ(font, sizeof(CFbsFont*) * KNumFonts);
+
+	// Do the whole thing KNumRepeatsPerFont times. The second+ repeats will 
+	// re-use the fonts created in the first repeat, to ensure that fonts that 
+	// may have been evicted are able to be re-used with the iterator.
+	for (TInt rep = 0; (rep < KNumRepeatsPerFont) && (err == KErrNone); ++rep)
+		{
+		// Iterate through all the font variants:
+		// Iterate all font styles, for all latin typefaces, at increasing sizes.
+		TInt i = 0;
+		for (; (i < KNumFonts) && (err == KErrNone); ++i)
+			{
+			// Only create this font if this font isn't already valid (i.e. when this is the 
+			// first rep) otherwise re-use it.
+			if (!font[i])
+				{
+				TFontSpec requestedFontSpec = GenerateDejaVuFontSpec(i);
+				err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font[i], requestedFontSpec);
+				}
+			if (err == KErrNone)
+				{
+				RFbsGlyphDataIterator iter;
+				TInt iterErr = iter.Open(*(font[i]), iGlyphCodesLatin, KNumGlyphCodesLatin);
+				if (iterErr != KErrNone)
+					{
+					ERR_PRINTF2(_L("Failed to open RFbsGlyphDataIterator [err=%d]"), iterErr);
+					InfoPrintFontSpec(*(font[i]));
+					iStep->SetTestStepResult(EFail);
+					}
+				else
+					{
+					TInt index = 0;
+					for(; (iterErr == KErrNone) && (index < KNumGlyphCodesLatin) && (err == KErrNone) ; iterErr = iter.Next(), index++)
+						{
+						const TUint8* bitmapData = NULL;
+						TSize bitmapSize;
+						TOpenFontCharMetrics metrics;
+						font[i]->GetCharacterData(iter.GlyphCode() | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
+						if (iter.Rect().Size() == TSize(0, 0))
+							{
+							numGlyphMismatches += (bitmapSize != TSize(0, 0)) ? 1 : 0;
+							}
+						else
+							{
+							TBool match = EFalse;
+							const TFontSpec fontSpec = font[i]->FontSpecInTwips();							
+							// Compare to system-memory version of glyph
+							RSgImage characterDataImage;
+							err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage);
+							if (err == KErrNone) 
+								{
+								err = CompareSgImages(iEGL, iter.Image(), iter.Rect(), characterDataImage, TRect(bitmapSize), match);
+								}
+							if (err == KErrNone && !match)
+								{
+								++numGlyphMismatches;
+								}
+							characterDataImage.Close();
+							}					
+						}
+					iter.Close();
+					TESTE(iterErr == KErrNotFound, iterErr);
+					TEST(index == KNumGlyphCodesLatin);					
+					}
+				}
+			}
+		// Check all the fonts were iterated through.
+		TEST(i == KNumFonts);
+		}
+	TESTNOERROR(err);
+	TEST(numGlyphMismatches == 0);
+
+	// Cleanup
+	for (TInt ii = 0; ii < KNumFonts; ii++)
+		{
+		iTs->ReleaseFont(font[ii]);
+		}
+	delete [] font;
+	__UHEAP_MARKEND;*/
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0662
+@SYMTestPriority    Low
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	Uses a RFbsGlyphDataIterator when there is no graphics memory available in the system.
+	It shows that when under low graphics memory, Next() returns the correct error code
+	as per the API (either KErrNoMemory or KErrNoGraphicsMemory, depending on the implementation 
+	of Graphics Resource being used).
+
+@SYMTestActions
+	i. Create a CFbsFont from the typeface store.
+	ii. Simulate a low graphics-memory situation by creating enough RSgImages to fill the memory,
+	iii. Open a RFbsGlyphDataIterator on the font.
+	iv. Attempt to use the iterator, calling Next(), checking the returned code.
+	v. Close the iterator and release all graphics memory from ii.
+
+@SYMTestExpectedResults
+	Next() should return either KErrNoMemory or KErrNoGraphicsMemory depending on the implmentation
+	of Graphics Resource used. It should return the same error as is returned when filling
+	the graphics memory reaches the limit.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorNoGraphicsMemory()
+	{
+	INFO_PRINTF1(_L("Test that when there is no GPU memory available, Next() returns correct error"));
+	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM"));
+	TEST(EFalse);
+	/*__UHEAP_MARK;
+	
+	const TInt KFontSize = 128;
+	CFbsFont* font = NULL;
+	RFbsGlyphDataIterator iter;
+	
+	TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KMonoTypefaceName, KFontSize));
+	TESTNOERROR(err);
+	
+	// Simulate low OOGM situation by creating many RSgImages until out of memory.
+	if (err == KErrNone)
+		{
+		InfoPrintFontSpec(*font);
+		RArray <RSgImage> sgImageArray;
+		TInt iterErr = KErrNone;
+		TInt gfxMemErr = FillGraphicsMemoryWithImages(TSize(KFontSize, KFontSize), sgImageArray);
+		TESTE(gfxMemErr == KErrNoMemory || gfxMemErr == KErrNoGraphicsMemory, gfxMemErr);
+		if (gfxMemErr == KErrNoMemory || gfxMemErr == KErrNoGraphicsMemory)
+			{
+			// Next() could either fail with KErrNoMemory or KErrNoGraphicsMemory, but should
+			// be the same error code as the last attempted creation of an SgImage, done in 
+			// FillGraphicsMemoryWithImages() so compare against that code.
+			iterErr = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+			for (; iterErr == KErrNone; iterErr = iter.Next())
+				{
+				// no operation
+				}
+			iter.Close();
+			}
+	
+		// Release all the images used to simulate OOGM.
+		for (TInt i = sgImageArray.Count() - 1; i >= 0; --i)
+			{
+			sgImageArray[i].Close();
+			}
+		sgImageArray.Close();
+		
+		// Log any errors only after memory is freed - this ensures there is enough
+		// memory for the logger.
+		TESTE(iterErr == gfxMemErr, iterErr);
+		}
+
+	iTs->ReleaseFont(font);
+	
+	__UHEAP_MARKEND;*/
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0666
+@SYMTestPriority    Low
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	Uses a RFbsGlyphDataIterator after Next() returns an error, in order to show that 
+	an error does not invalidate the state of the iterator and it is still usable. 
+
+@SYMTestActions
+	i. Open the RFbsGlyphDataIterator on 1 glyph code.
+	ii. Store the data of the iterator and call Next() to reach the end of the iterator
+	iii. Access the glyph data repeatedly and check that the iterator members
+		 still match those in ii.
+
+@SYMTestExpectedResults
+	The calls to Next() should cause KErrNotFound since it is past the final glyph.
+	The iterator data should match at all times since the iterator is never moved.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorNextIsAtomic()
+	{
+	INFO_PRINTF1(_L("To ensure that Next() is atomic, if it returns an error it is still useable"));
+	__UHEAP_MARK;
+
+	RFbsGlyphDataIterator iter;
+	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, 1);
+	TESTNOERROR(iterErr);
+	
+	TSgDrawableId id = iter.Image().Id();
+	TOpenFontCharMetrics metrics = iter.Metrics();
+	TUint glyphCode = iter.GlyphCode();
+	TRect rect = iter.Rect();
+	
+	for (TInt i = 0; i < 2; i++)
+		{
+		iterErr = iter.Next();
+		TESTE(iterErr == KErrNotFound, iterErr);
+		
+		TEST(id == iter.Image().Id());
+		TEST(glyphCode == iter.GlyphCode());
+		TEST(rect == iter.Rect());
+		TEST(CompareMetrics(metrics, iter.Metrics()) == 0);
+		}
+	iter.Close();
+		
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0665
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	Glyph Atlas white-box test.
+	To ensure that the same RSgImage is used for repeated requests for the 
+	same glyph in the same call to RFbsGlyphDataIterator:Open().
+@SYMTestActions
+	i Open the glyph data iterator with a list of glyph codes which are all the same
+	ii Retrieve the drawable id of each iteration 
+	iii Check that the same drawable id is retrieved in each iteration  
+@SYMTestExpectedResults
+	Each iteration returns the same drawable id. 
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorSameGlyphCodes()
+	{
+	INFO_PRINTF1(_L("White box test - Ensure that the same RSgImage is used for repeated requests for the same glyph in the same call to Open()"));
+	__UHEAP_MARK;
+
+	const TUint KSameRepeatedGlyphCode = iGlyphCodesLatin['A' - 0x20];
+	const TInt KNumGlyphs = 10;
+	TUint* sameRepeatedGlyphCodes = new TUint[KNumGlyphs];
+	for (TInt ii = 0; ii < KNumGlyphs; ++ii)
+		{
+		sameRepeatedGlyphCodes[ii] = KSameRepeatedGlyphCode;
+		}
+	RFbsGlyphDataIterator iter;
+	TInt err = iter.Open(*iFont, sameRepeatedGlyphCodes, KNumGlyphs);
+	
+	TESTNOERROR(err);
+	if (KErrNone == err)
+		{
+		// get the drawable id of the first glyph and check that the id is valid
+		TSgDrawableId referenceId = iter.Image().Id();
+		RSgImage image;
+		TESTNOERROR(image.Open(referenceId));
+		image.Close();
+		TESTNOERROR(iter.Next());
+
+		for (;KErrNone == err; err = iter.Next())
+			{
+			TEST(referenceId == iter.Image().Id());
+			}
+		TESTE(KErrNotFound == err, err);
+		}
+
+	iter.Close();
+	delete[] sameRepeatedGlyphCodes;
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0668
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that the iterator can successfully be opened on an array
+	of glyph codes of various array sizes. 
+@SYMTestActions
+	Perform many iterations of opening an array and cycling through the glyphs,
+	increasing the size of the array after each iteration. Some simple sanity-checking
+	of the glyphs is performed.
+@SYMTestExpectedResults
+	KErrNone should be returned at all times. 
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorManyArraySizes()
+	{
+	INFO_PRINTF1(_L("Ensure that the RFbsGlyphDataIterator successfully opens glyph code arrays of many sizes"));
+	__UHEAP_MARK;
+	
+	RFbsGlyphMetricsArray glyphMetricsArray;
+	
+	TESTNOERROR(glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin));
+	TInt iterErr = KErrNone;
+	
+	for (TInt arraySize = 1; (arraySize < KNumGlyphCodesLatin) && (iterErr == KErrNone); ++arraySize)
+		{
+		RFbsGlyphDataIterator iter;
+		TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, arraySize);
+		TESTNOERROR(iterErr);
+		
+		for (TInt index = 0; iterErr == KErrNone; iterErr = iter.Next(), ++index)
+			{
+			// sanity checking...
+			if (iter.GlyphCode() != iGlyphCodesLatin[index])
+				{
+				ERR_PRINTF4(_L("Test failed at array size %d - Wanted glyphcode %d, got %d"), arraySize, iGlyphCodesLatin[index], iter.GlyphCode());
+				iStep->SetTestStepResult(EFail);
+				}
+			if (CompareMetrics(iter.Metrics(), glyphMetricsArray[index]) != 0)
+				{
+				ERR_PRINTF3(_L("Test failed at array size %d, metrics check failed at glyphcode %d"), arraySize, iGlyphCodesLatin[index]);
+				iStep->SetTestStepResult(EFail);
+				}			
+			}
+		iter.Close();
+		}
+
+	glyphMetricsArray.Close();
+	TESTNOERROR(iterErr);
+
+	__UHEAP_MARKEND;
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0669
+@SYMTestPriority    Low
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	Negative test case to show that RFbsGlyphDataIterator and RFbsGlyphMetricsArray
+	do not support bitmap fonts.
+@SYMTestActions
+	i. Load a bitmap font.
+	ii. Attempt to open an RFbsGlyphDataIterator and RFbsGlyphMetricsArray with the font.
+@SYMTestExpectedResults
+	KErrNotSupported should be returned in both instances. 
+*/
+ void CTFbsGlyphData::TestBitmapFontSupport()
+	{
+	INFO_PRINTF1(_L("Test bitmap font not supported"));
+	__UHEAP_MARK;
+	
+	CFbsFont* bitmapFont = NULL;
+	TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)bitmapFont, TFontSpec(_L("Digital"), 14));
+	TESTNOERROR(err);
+	TEST(!bitmapFont->IsOpenFont());
+	
+	RFbsGlyphDataIterator iter;
+	err = iter.Open(*bitmapFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+	TEST(err == KErrNotSupported);
+	iter.Close();
+	
+	RFbsGlyphMetricsArray array;
+	err = array.Get(*bitmapFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
+	TEST(err == KErrNotSupported);
+	array.Close();
+	
+	iTs->ReleaseFont(bitmapFont);
+	__UHEAP_MARKEND;
+	}
+ 
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0671
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that different threads (and therefore RFbsSessions) using fonts with the same
+	TFontSpec share the same glyphs	in the atlas and do not create duplicate entries
+	in the Glyph Atlas, and that releasing a font clears all associated glyphs in the
+	atlas.
+
+@SYMTestActions
+	i. Create a handle to a test font in the current process.
+	ii. Spawn a test thread and wait for it to complete. Within the thread :
+		1. Create a font with the same fontspec as the parent process.
+		2. Use the RFbsGlyphDataIterator API to force rasterization into the glyph atlas.
+		3. Release the iterator.
+	iii. Check there were no leaves from the thread.
+	iv. Repeat ii. and iii. several times. Before using RFbsGlyphDataIterator,
+		the thread checks that the glyphs are still in the atlas from the first thread.
+	v. Check that the number of fonts in the atlas has increased by one only.
+	vi. Check that the number of glyphs in the atlas has increased by the size of the 
+		glyph code array.
+	vii. Release the font in the parent process, thereby releasing the font and glyphs
+		in the glyph atlas, and check that the state of the atlas is the same as before
+		the test is run.
+
+@SYMTestExpectedResults
+	All threads should return no errors or leaves or panics.
+	After all threads have finished:
+		The glyph count should have increased by the size of the glyph code array used
+		in the RFbsGlyphDataIterator, showing that	glyphs are only being added to the atlas
+		once. The number of fonts in the atlas should have increased by one, showing
+		that only the single underlying font object is being added to the atlas, despite
+		different RFbsSessions and CFbsFont instances used.
+	After the test font is released in the main process:
+		The glyph count and font count return to the pre-test value, showing that when
+		the last handle to a TFontSpec is released, the atlas frees its associated data.
+*/
+void CTFbsGlyphData::TestMultithreadShareSingleFont()
+	{
+	INFO_PRINTF1(_L("Test glyphs shared between RFbsSessions/threads/processes"));
+#ifndef _DEBUG
+	// Test relies on debug-only FBS messages EFbsMessAtlasGlyphCount and EFbsMessAtlasFontCount
+	INFO_PRINTF1(_L("Skipping test in release mode"));
+#else	
+	__UHEAP_MARK;
+
+	_LIT(KThreadName, "GlyphDataTestThread");
+	const TInt KNumTestThreads = 5;
+	const TFontSpec KTestFontSpec(KTypefaceName, 50);	
+	const TInt atlasFontCountStart = iFbs->SendCommand(EFbsMessAtlasFontCount);
+	const TInt atlasGlyphCountStart = iFbs->SendCommand(EFbsMessAtlasGlyphCount);
+
+	CFbsFont* testFont;
+	TInt err = iTs->GetNearestFontToDesignHeightInPixels( (CFont*&)testFont, KTestFontSpec);
+	if (err != KErrNone)
+		{
+		ERR_PRINTF2(_L("Could not load font, err = %d"), err);
+		iStep->SetTestStepResult(EFail);
+		return;
+		}
+	
+	// Check there are no glyphs belonging to the test font before the test starts.
+	TInt atlasFontGlyphCount = iFbs->SendCommand(EFbsMessAtlasGlyphCount, testFont->Handle());
+	TEST(atlasFontGlyphCount == 0);
+
+	TGlyphDataMultithreadParams params = {KTestFontSpec, iGlyphCodesLatin, KNumGlyphCodesLatin, NULL};
+
+	// Run the test threads sequentially, and check its exit status.
+	RThread testThread;
+	TInt numThreadsPassed = 0;
+	for (TInt i = 0; i < KNumTestThreads; i++)
+		{
+		TBool threadPassed = ETrue;
+		TGlyphDataThreadInfo info = {EGlyphDataMultiSessionTestShareGlyphs, params, i, iStep};
+		err = testThread.Create(KThreadName, CTFbsGlyphData::ThreadFunction, KDefaultStackSize, KTestThreadMinHeapSize, KTestThreadMaxHeapSize, &info);
+		TESTNOERROR(err);
+
+		TRequestStatus statusThread;
+		testThread.Logon(statusThread);
+		testThread.Resume();
+		
+		User::WaitForRequest(statusThread);
+		TInt threadResult = testThread.ExitReason();
+		if (threadResult != KErrNone)
+			{
+			ERR_PRINTF3(_L("Thread %i: Terminated with reason %d"), i, threadResult);
+			threadPassed = EFalse; 
+			}
+		TExitCategoryName exitCategory = testThread.ExitCategory();
+		if (exitCategory.Compare(_L("Kill")) != 0)
+			{
+			ERR_PRINTF3(_L("Thread %i: Terminated with reason category '%S'"), i, &exitCategory);
+			threadPassed = EFalse;
+			}
+		testThread.Close();
+		numThreadsPassed += (threadPassed) ? 1 : 0;
+		}
+	TEST(numThreadsPassed == KNumTestThreads);
+
+	// Check that the atlas still contains the glyphs and the font created by the threads
+	// after they have died, since the font is still open in this process.
+	atlasFontGlyphCount = iFbs->SendCommand(EFbsMessAtlasGlyphCount, testFont->Handle());
+	TEST(atlasFontGlyphCount == params.iGlyphCodesCount);
+	TInt atlasFontCount = iFbs->SendCommand(EFbsMessAtlasFontCount);
+	TEST(atlasFontCount == (atlasFontCountStart + 1));
+
+	iTs->ReleaseFont(testFont);
+	testFont = NULL;
+
+	// Check the atlas state is now the same as it was before the test started,
+	// now that the last remaining handle to the font used in the threads is released.
+	TInt atlasGlyphCountEnd = iFbs->SendCommand(EFbsMessAtlasGlyphCount);
+	TEST(atlasGlyphCountStart == atlasGlyphCountEnd);
+	TInt atlasFontCountEnd = iFbs->SendCommand(EFbsMessAtlasFontCount);
+	TEST(atlasFontCountStart == atlasFontCountEnd);
+	__UHEAP_MARKEND;
+#endif
+	}
+
+/**
+Worker thread for TestMultithreadShareSingleFont().
+The thread uses RFbsGlyphDataIterator on a CFbsFont of the given TFontSpec.
+Once complete the atlas is queried for the number of associated glyphs.
+ */
+void CTFbsGlyphData::ThreadShareGlyphsL(TInt aThreadNum, TGlyphDataMultithreadParams& aParam, CTestStep* aStep)
+	{
+	User::LeaveIfError(RFbsSession::Connect());
+	CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL);
+	CleanupStack::PushL(ts);
+	RFbsSession* fbs = RFbsSession::GetSession();
+
+	CFbsFont* font;
+	TInt err = ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, aParam.iFontSpec);
+	User::LeaveIfError(err);
+
+	if (aThreadNum > 0)
+		{
+		// If this is not the first thread, it means the first thread has already executed and 
+		// populated the glyph atlas with the glyphs. The font created by this thread 
+		// should already have its glyphs in the atlas.
+		TInt fontGlyphCount = fbs->SendCommand(EFbsMessAtlasGlyphCount, font->Handle());
+		if (fontGlyphCount != aParam.iGlyphCodesCount)
+			{
+			aStep->ERR_PRINTF4(_L("Thread %d: Only %d glyphs in atlas before first iteration, expected %d"), aThreadNum, fontGlyphCount, aParam.iGlyphCodesCount);
+			aStep->SetTestStepResult(EFail);
+			}
+		}
+
+	RFbsGlyphDataIterator iter;
+	for (err = iter.Open(*font, aParam.iGlyphCodes, aParam.iGlyphCodesCount); err == KErrNone; err = iter.Next())
+		{
+		// no-op
+		}
+	iter.Close();
+
+	// Check that the glyphs of this font have been added to the atlas
+	TInt fontGlyphCount = fbs->SendCommand(EFbsMessAtlasGlyphCount, font->Handle());
+	if (fontGlyphCount != aParam.iGlyphCodesCount)
+		{
+		aStep->ERR_PRINTF5(_L("Thread %d: Only %d glyphs in atlas after last iteration, expected %d (err=%d)"), aThreadNum, fontGlyphCount, aParam.iGlyphCodesCount, err);
+		aStep->SetTestStepResult(EFail);
+		}
+	if (err != KErrNotFound)
+		{
+		aStep->ERR_PRINTF3(_L("Thread %d: Error during test = %d"), aThreadNum, err);
+		aStep->SetTestStepResult(EFail);
+		}
+
+	ts->ReleaseFont(font);
+	CleanupStack::PopAndDestroy(1); // ts
+	RFbsSession::Disconnect();
+	}
+
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0672
+@SYMTestPriority	Medium
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Tests that with many concurrent sessions connected to Fbserv, the atlas successfully
+	returns the correct glyph images even if the atlas becomes full and has to evict glyphs.
+
+@SYMTestActions
+	i. Create 25 threads, each a unique session with Fbserv.
+	ii. Launch the threads simultaneously. In each thread:
+		1. Create a FBS typeface store and create a font which is unique in the process.
+		2. Use RFbsGlyphDataIterator to iterate through the latin glyph codes.
+		3. Check the image is correct for each glyph against the image returned by 
+			CFont::GetCharacterData().
+		4. Close the iterator.
+		5. Release the font and close the typeface store. 
+	iii. Once all threads have finished, check the exit status of each thread
+
+@SYMTestExpectedResults
+	Every glyph for every thread should match the image returned by GetCharacterData()
+	All threads should exit normally with no Leave code.
+*/
+_LIT(KTestMultithreadStressFinishSemaphore, "TestMultithreadStressAtlasFinish");
+
+void CTFbsGlyphData::TestMultithreadStressAtlas()
+	{
+	INFO_PRINTF1(_L("Stress test glyph atlas with multiple RFbsSessions"));
+	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85NEFT - TB10.1 eglCreateImageKHR hangs during multithreading"));
+	TEST(EFalse);
+	/*__UHEAP_MARK;
+
+	TInt err = KErrNone;
+	const TInt KNumTestThreads = 25;
+	_LIT(KThreadNameFormat, "GlyphDataTestThread%i");
+
+	// Create a semaphore that is signalled by each test thread when it has finished.
+	RSemaphore threadFinishSemaphore;
+	err = threadFinishSemaphore.CreateGlobal(KTestMultithreadStressFinishSemaphore, 0, EOwnerThread);
+	TESTNOERROR(err);
+
+	// Prepare the testdata for the threads
+	// Each thread will have a TFontSpec which will cause unique CFbsFonts
+	// to be created in the server, and therefore the atlas.
+	RThread testThread[KNumTestThreads];
+	TGlyphDataThreadInfo testInfo[KNumTestThreads];	
+	for (TInt i = 0; i < KNumTestThreads; ++i)
+		{
+		testInfo[i].iStep = iStep;
+		testInfo[i].iTest = EGlyphDataMultiSessionTestStressAtlas;
+		testInfo[i].iParams.iFontSpec = GenerateDejaVuFontSpec(i);
+		testInfo[i].iParams.iGlyphCodes = iGlyphCodesLatin;
+		testInfo[i].iParams.iGlyphCodesCount = KNumGlyphCodesLatin;
+		testInfo[i].iParams.iEGL = iEGL;
+		testInfo[i].iThreadNum = i;	
+		TBuf<128> threadName;
+		threadName.AppendFormat(KThreadNameFormat, i);
+		err = testThread[i].Create(threadName, CTFbsGlyphData::ThreadFunction, KDefaultStackSize, KTestThreadMinHeapSize, KTestThreadMaxHeapSize, &testInfo[i]);
+		TESTNOERROR(err);
+		}
+
+	// All threads are created, start them simultaneously.
+	for (TInt i = 0; i < KNumTestThreads; ++i)
+		{
+		testThread[i].Resume();
+		}
+	// Wait for all threads to finish.
+	for (TInt i = 0; i < KNumTestThreads; ++i)
+		{
+		threadFinishSemaphore.Wait();
+		}
+	// Allow some time for remaining threads to finish tidy-up.
+	User::After(100000);
+	threadFinishSemaphore.Close();
+
+	TInt numThreadsPassed = 0;
+	for (TInt i = 0; i < KNumTestThreads; ++i)
+		{
+		TBool threadPassed = ETrue;
+		TInt threadResult = testThread[i].ExitReason();
+		if (threadResult != KErrNone)
+			{
+			ERR_PRINTF3(_L("Thread %i: Terminated with reason %d"), i, threadResult);
+			threadPassed = EFalse; 
+			}
+		TExitCategoryName exitCategory = testThread[i].ExitCategory();
+		if (exitCategory.Compare(_L("Kill")) != 0)
+			{
+			ERR_PRINTF3(_L("Thread %i: Terminated with reason category '%S'"), i, &exitCategory);
+			threadPassed = EFalse;
+			}
+		testThread[i].Close();
+		numThreadsPassed += (threadPassed) ? 1 : 0;
+		}
+	TEST(numThreadsPassed == KNumTestThreads);
+
+	__UHEAP_MARKEND;*/
+	}
+/**
+Worker thread for TestMultithreadStressAtlas().
+The thread uses RFbsGlyphDataIterator on a CFbsFont of the given TFontSpec.
+For each glyph, the image returned by the iterator is compared to the image 
+returned from CFont::GetCharacterData().
+Once complete, the semaphore is signalled to tell the parent process it has
+finished.
+ */
+void CleanupFinishSemaphore(TAny* aItem)
+    {
+    RSemaphore* semaphore = reinterpret_cast<RSemaphore*>(aItem);
+    semaphore->Signal();
+    semaphore->Close();
+    }
+void CTFbsGlyphData::ThreadStressAtlasL(TInt aThreadNum, TGlyphDataMultithreadParams& aParam, CTestStep* aStep)
+	{
+	TOpenFontCharMetrics charMetrics;
+	const TUint8* bitmapData;
+	TSize bitmapSize;
+	RSgImage charDataImage;
+
+	RSemaphore threadFinishSemaphore;
+	User::LeaveIfError(threadFinishSemaphore.OpenGlobal(KTestMultithreadStressFinishSemaphore));
+	CleanupStack::PushL(TCleanupItem(CleanupFinishSemaphore, &threadFinishSemaphore));
+
+	User::LeaveIfError(RFbsSession::Connect());
+	CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL);
+	CleanupStack::PushL(ts);
+	
+	CFbsFont* font;
+	User::LeaveIfError(ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, aParam.iFontSpec));
+
+	TInt numGlyphMatches = 0;
+	TInt index = 0;
+	TInt err = KErrNone;
+	RFbsGlyphDataIterator iter;
+	for (err = iter.Open(*font, aParam.iGlyphCodes, aParam.iGlyphCodesCount); err == KErrNone; err = iter.Next(), ++index)
+		{
+		TBool glyphMatch = EFalse;
+		font->GetCharacterData(aParam.iGlyphCodes[index] | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
+		if (bitmapSize == TSize(0, 0))
+			{
+			glyphMatch = (bitmapSize == iter.Rect().Size());
+			}
+		else
+			{
+			err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, font->FontSpecInTwips().iFontStyle.BitmapType(), charDataImage);
+			if (err == KErrNone)
+				{
+				err = CompareSgImages(aParam.iEGL, iter.Image(), iter.Rect(), charDataImage, TRect(bitmapSize), glyphMatch);
+				}
+			charDataImage.Close();
+			}
+		if (err != KErrNone)
+			{
+			break;
+			}
+		numGlyphMatches += (glyphMatch) ? 1 : 0;
+		}
+	iter.Close();
+	
+	if (index != aParam.iGlyphCodesCount)
+		{
+		aStep->ERR_PRINTF5(_L("Thread %d: Iterator terminated early - %d out of %d glyphs (err=%d)"), aThreadNum, index, aParam.iGlyphCodesCount, err);
+		aStep->SetTestStepResult(EFail);
+		}
+	if (index != numGlyphMatches)
+		{
+		aStep->ERR_PRINTF4(_L("Thread %d: Matched %d out of %d glyphs"), aThreadNum, numGlyphMatches, aParam.iGlyphCodesCount);
+		aStep->SetTestStepResult(EFail);
+		}
+
+	ts->ReleaseFont(font);
+	CleanupStack::PopAndDestroy(2); // ts, threadFinishSemaphore
+	RFbsSession::Disconnect();
+	}
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0673
+@SYMTestPriority    Medium
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+    Tests the robustness of using RFbsGlyphMetricsArray when the client heap and the
+    FbServ private heap experience failures allocating memory, causing no panics 
+    or leaves.
+
+@SYMTestActions
+    i. Set the default heap failure for the next heap allocation.
+    ii. Create a new CFbsFont using a TFontSpec not already in the glyph atlas.
+    iii. Call RFbsGlyphMetricsArray::Get(), and close the array.
+    iv. Release the font so that nothing is left in the cache as a result of
+        attempting to use it, and reset the heap failure state.
+    v. While iii returns KErrNoMemory, increment the failure count and repeat
+        step ii.
+    vi. Using a separate font so that the test is not affected by the earlier
+        run, repeat ii. to v., but rather than setting the default heap to 
+        fail, the FbServ private heap is set to fail, via IPC messages to Fbs.
+
+@SYMTestExpectedResults
+    If no errors occur, KErrNone should be returned after a certain number of
+    repetitions. Any other error code denotes a problem handling low-memory 
+    situtations.
+*/
+void CTFbsGlyphData::TestGlyphMetricsArrayHeapOOML()
+    {
+    INFO_PRINTF1(_L("Test RFbsGlyphMetricsArray during heap alloc failure"));
+    __UHEAP_MARK;
+
+    // Create a font that wont be in the cache already...
+    TInt rep = 0;
+    TInt err = KErrNoMemory;
+    CFbsFont* font = NULL;
+    
+    while (err == KErrNoMemory)
+        {
+        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(10)));
+        __UHEAP_FAILNEXT(rep);
+        RFbsGlyphMetricsArray array;
+        err = array.Get(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+        array.Close();
+        __UHEAP_RESET;
+        iTs->ReleaseFont(font);
+        font = NULL;
+        ++rep;
+        }
+
+	TESTE(err == KErrNone, err);
+    if (err == KErrNone)
+        {
+        INFO_PRINTF2(_L("Client Heap OOM : Test passed after rep %d"), rep);
+        }
+    else
+        {
+        ERR_PRINTF3(_L("Client Heap OOM : Test failed with err=%d, after rep %d"), err, rep);
+        }
+
+    // Now test when the server-side FbServ heap fails...
+    rep = 0;
+    err = KErrNoMemory;
+    
+    while (err == KErrNoMemory)
+        {
+        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(11)));
+        iFbs->SendCommand(EFbsMessSetHeapFail, RFbsSession::EHeapFailTypeServerMemory, rep);
+        RFbsGlyphMetricsArray array;
+        err = array.Get(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+        array.Close();
+        iFbs->SendCommand(EFbsMessSetHeapReset, RFbsSession::EHeapFailTypeServerMemory);
+        iTs->ReleaseFont(font);
+        font = NULL;
+        ++rep;
+        }
+
+	TESTE(err == KErrNone, err);
+    if (err == KErrNone)
+        {
+        INFO_PRINTF2(_L("FBServ Heap OOM : Test passed after rep %d"), rep);
+        }
+    else
+        {
+        ERR_PRINTF3(_L("FBServ Heap OOM : Test failed with err=%d, after rep %d"), err, rep);      
+        }
+    __UHEAP_MARKEND;
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0674
+@SYMTestPriority    Medium
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+    Tests the robustness of using RFbsGlyphDataIterator when the client heap and the
+    FbServ private heap experience failures allocating memory, causing no panics 
+    or leaves.
+
+@SYMTestActions
+    i. Set the default heap failure for the next heap allocation.
+    ii. Create a new CFbsFont using a TFontSpec not already in the glyph atlas.
+    iii. Call RFbsGlyphDataIterator::Open(), and close the array.
+    iv. Release the font so that nothing is left in the cache as a result of
+        attempting to use it, and reset the heap failure state.
+    v. While iii returns KErrNoMemory, increment the failure count and repeat
+        step ii.
+    vi. Using a separate font so that the test is not affected by the earlier
+        run, repeat ii. to v., but rather than setting the default heap to 
+        fail, the FbServ private heap is set to fail, via IPC messages to Fbs.
+
+@SYMTestExpectedResults
+    If no errors occur, KErrNone should be returned after a certain number of
+    repetitions. Any other error code denotes a problem handling low-memory 
+    situtations.
+*/
+void CTFbsGlyphData::TestGlyphDataIteratorHeapOOML()
+    {
+    INFO_PRINTF1(_L("Test RFbsGlyphDataIterator during heap alloc failure"));    
+    __UHEAP_MARK;
+
+    // Create a font that wont be in the cache already...
+    TInt rep = 0;
+    TInt err = KErrNoMemory;
+    CFbsFont* font = NULL;
+    
+    while (err == KErrNoMemory)
+        {
+        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(10)));
+        __UHEAP_FAILNEXT(rep);
+        RFbsGlyphDataIterator iter;
+        err = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+        if (err == KErrNone)
+            {
+            while (err == KErrNone) 
+               {
+               err = iter.Next();
+               }
+            err = (err == KErrNotFound) ? KErrNone : err;
+            }
+        iter.Close();
+        __UHEAP_RESET;
+        iTs->ReleaseFont(font);
+        font = NULL;
+        ++rep;
+        }
+
+	TESTE(err == KErrNone, err);
+    if (err == KErrNone)
+        {
+        INFO_PRINTF2(_L("Client Heap OOM : Test passed after rep %d"), rep);
+        }
+    else
+        {
+        ERR_PRINTF3(_L("Client Heap OOM : Test failed with err=%d, after rep %d"), err, rep);
+        }
+
+    // Now test when the server-side FbServ heap fails...
+    rep = 0;
+    err = KErrNoMemory;
+    
+    while (err == KErrNoMemory)
+        {
+        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(11)));
+        iFbs->SendCommand(EFbsMessSetHeapFail, RFbsSession::EHeapFailTypeServerMemory, rep);
+        RFbsGlyphDataIterator iter;
+        err = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
+        if (err == KErrNone)
+            {
+            while (err == KErrNone) 
+               {
+               err = iter.Next();
+               }
+            err = (err == KErrNotFound) ? KErrNone : err;
+            }
+        iter.Close();
+        iFbs->SendCommand(EFbsMessSetHeapReset, RFbsSession::EHeapFailTypeServerMemory);
+        iTs->ReleaseFont(font);
+        font = NULL;
+        ++rep;
+        }
+
+	TESTE(err == KErrNone, err);
+    if (err == KErrNone)
+        {
+        INFO_PRINTF2(_L("FBServ Heap OOM : Test passed after rep %d"), rep);
+        }
+    else
+        {
+        ERR_PRINTF3(_L("FBServ Heap OOM : Test failed with err=%d, after rep %d"), err, rep);
+        }
+    __UHEAP_MARKEND;
+    }
+
+/**
+Utility function. Prints out a description of the font's fontspec to the log.
+ */
+void CTFbsGlyphData::InfoPrintFontSpec(const CFont& aFont)
+	{
+	_LIT(KMonochromeBitmap, "Mono");
+	_LIT(KAntiAliasedBitmap, "AA");
+	_LIT(KStyleItalic, "Italic");
+	_LIT(KStyleBold, "Bold");
+	_LIT(KStyleNormal, "Normal");
+	_LIT(KUnknown, "Unknown");
+	TBufC<9> bitmapType;
+	TBuf<12> fontStyle;
+	TFontSpec fontSpec = aFont.FontSpecInTwips();
+	switch(fontSpec.iFontStyle.BitmapType())
+		{
+		case EMonochromeGlyphBitmap:
+			bitmapType = KMonochromeBitmap;
+			break;
+		case EAntiAliasedGlyphBitmap:
+			bitmapType = KAntiAliasedBitmap;
+			break;
+		default:
+			bitmapType = KUnknown;
+		}
+
+	if (fontSpec.iFontStyle.StrokeWeight() == EStrokeWeightBold)
+		{
+		fontStyle.Append(KStyleBold);
+		}
+	if (fontSpec.iFontStyle.Posture() == EPostureItalic)
+		{
+		fontStyle.Append(KStyleItalic);
+		}
+	if (fontStyle.Length() == 0)
+		{
+		fontStyle = KStyleNormal;
+		}
+
+	INFO_PRINTF5(_L("Font: name=%S size=%dtw type=%S style=%S"), &(fontSpec.iTypeface.iName), fontSpec.iHeight, &bitmapType, &fontStyle);
+	}
+
+
+/**
+Static utility function. Performs a per-pixel comparison of two open RSgImages.
+To do this requires access to the binary data of the images, only accessable
+via EGL and Khronos APIs. This function will bind the RSgImages to VGImages 
+and uses OpenVG to retrieve the image data in 8bpp.
+@param aEGL An EGL Helper to read the SgImages into system memory.
+@param aImageA The first image to compare.
+@param aRectA A rectangular portion in pixels of the first image to compare.
+@param aImageB The second image to compare.
+@param aRectB A rectangular portion in pixels fo the second image to compare.
+@param aMatch A boolean value, which on return tells the caller whether the two
+	images were deemed to match.
+@return KErrNone, if the comparison took place, otherwise one of the system-wide
+	error codes.
+*/
+TInt CTFbsGlyphData::CompareSgImages(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, const RSgImage& aImageB, const TRect& aRectB, TBool& aMatch)
+	{
+	return CTFbsGlyphData::CompareSgImages(aEGL, aImageA, aRectA, NULL, aImageB, aRectB, NULL, aMatch);
+	}
+
+/**
+Static utility function. Performs a per-pixel comparison of two open RSgImages.
+To do this requires access to the binary data of the images, only accessable
+via EGL and Khronos APIs. This function will bind the RSgImages to VGImages 
+and uses OpenVG to retrieve the image data in 8bpp.
+This version allows pre-created memory to be used in the comparison, to avoid
+allocation failure in low memory testing.
+@param aEGL An EGL Helper to read the SgImages into system memory buffers.
+@param aImageA The first image to compare.
+@param aRectA A rectangular portion in pixels of the first image to compare.
+@param aBufferA If non-NULL, specifies a memory buffer to read the data of
+	aImageA into, otherwise a buffer is dynamically allocated.
+@param aImageB The second image to compare.
+@param aRectB A rectangular portion in pixels fo the second image to compare.
+@param aBufferB If non-NULL, specifies a memory buffer to read the data of
+	aImageB into, otherwise a buffer is dynamically allocated.
+@param aMatch A boolean value, which on return tells the caller whether the two
+	images were deemed to match.
+@return KErrNone, if the comparison took place, otherwise one of the system-wide
+	error codes.
+*/
+TInt CTFbsGlyphData::CompareSgImages(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, TUint8* aBufferA, const RSgImage& aImageB, const TRect& aRectB, TUint8* aBufferB, TBool& aMatch)
+	{
+	// By default, assume they do not match.
+	aMatch = EFalse;
+	
+#ifdef SAVEGLYPHSTOMBMDURINGCOMPARISON
+	
+	static TInt countToAppend = 0;
+	
+	CFbsBitmap* bitmap = NULL;
+	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageA, aRectA, bitmap))
+		{
+		TBuf<KMaxFileName> buf;
+		buf.AppendNum( countToAppend );
+		TPtrC nameAppend( buf );
+		
+		SaveBmp(bitmap, &nameAppend, EFalse);
+		}
+	delete bitmap;	
+	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageB, aRectB, bitmap))
+		{
+		TBuf<KMaxFileName> buf;
+		buf.AppendNum( countToAppend );
+		TPtrC nameAppend( buf );
+	
+		SaveBmp(bitmap, &nameAppend, ETrue);
+		}
+	delete bitmap;
+	
+	countToAppend++;
+	
+#endif // SAVEGLYPHSTOMBMDURINGCOMPARISON
+	
+	TSgImageInfo imageInfoA;
+	TSgImageInfo imageInfoB;
+	if (aImageA.GetInfo(imageInfoA) != KErrNone ||
+		aImageB.GetInfo(imageInfoB) != KErrNone)
+		{
+		return KErrBadHandle;
+		}
+		
+	// Check the sizes of the images match, and the rects reside on the images.
+	if (aRectA.Size() != aRectB.Size() ||
+		!TRect(imageInfoA.iSizeInPixels).Intersects(aRectA) ||
+		!TRect(imageInfoB.iSizeInPixels).Intersects(aRectB))
+		{
+		return KErrNone;		
+		}
+	const TSize KBufferSize = aRectA.Size();
+	const TInt KDataStride = KBufferSize.iWidth;
+
+	TBool freeTempBufA = EFalse;
+	TBool freeTempBufB = EFalse;
+	if (!aBufferA)
+		{
+		aBufferA = (TUint8*) User::AllocZ(KDataStride * KBufferSize.iHeight);
+		freeTempBufA = ETrue;
+		}
+	if (!aBufferA)
+		{
+		return KErrNoMemory;
+		}
+	TInt err = aEGL->GetSgImageData(aImageA, aRectA, aBufferA);
+	if (err != KErrNone)
+		{
+		if (freeTempBufA)
+			{
+			User::Free(aBufferA);
+			aBufferA = NULL;
+			}
+		return err;
+		}
+	if (!aBufferB)
+		{
+		aBufferB = (TUint8*) User::AllocZ(KDataStride * KBufferSize.iHeight);
+		freeTempBufB = ETrue;
+		}
+	if (!aBufferB)
+		{
+		if (freeTempBufA)
+			{
+			User::Free(aBufferA);
+			aBufferA = NULL;
+			}
+		return KErrNoMemory;
+		}
+	err = aEGL->GetSgImageData(aImageB, aRectB, aBufferB);
+	if (err != KErrNone)
+		{
+		if (freeTempBufA)
+			{
+			User::Free(aBufferA);
+			aBufferA = NULL;
+			}
+		if (freeTempBufB)
+			{
+			User::Free(aBufferB);
+			aBufferB = NULL;
+			}
+		return err;
+		}	
+
+	// Perform a per-pixel comparison, scanline by scanline.
+	// The loop will break as soon as a mismatch is detected.
+	aMatch = ETrue;
+	for (TInt scanline = 0; (scanline < KBufferSize.iHeight) && aMatch; ++scanline)
+		{
+		TUint8* scanlineImageA = aBufferA + (scanline * KDataStride);
+		TUint8* scanlineImageB = aBufferB + (scanline * KDataStride);
+		aMatch = (Mem::Compare(scanlineImageA, KBufferSize.iWidth, scanlineImageB, KBufferSize.iWidth) == 0);
+		}
+
+	if (freeTempBufA)
+		{
+		User::Free(aBufferA);
+		aBufferA = NULL;
+		}
+	if (freeTempBufB)
+		{
+		User::Free(aBufferB);
+		aBufferB = NULL;
+		}
+	
+	return KErrNone;
+	}
+
+/**
+Second thread entry function for multi-threaded tests.
+*/
+TInt CTFbsGlyphData::ThreadFunction(TAny* aParam)
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+	if (!cleanupStack)
+		{
+		return KErrNoMemory;
+		}
+
+	TGlyphDataThreadInfo* info = static_cast<TGlyphDataThreadInfo*>(aParam);
+	TRAPD(result,
+	switch(info->iTest)
+		{
+		case EGlyphDataMultiSessionTestShareGlyphs:
+			CTFbsGlyphData::ThreadShareGlyphsL(info->iThreadNum, info->iParams, info->iStep);
+			break;
+		case EGlyphDataMultiSessionTestStressAtlas:
+			CTFbsGlyphData::ThreadStressAtlasL(info->iThreadNum, info->iParams, info->iStep);
+			break;
+		default:
+			User::Leave(KErrArgument);
+		}
+	);
+
+	delete cleanupStack;
+	__UHEAP_MARKEND;
+	return result;
+	}
+
+
+
+/*
+	-----------------------------------------
+	Static utility Methods used by the tests.
+	-----------------------------------------
+*/
+
+
+
+/**
+Utility method that fills the RSgImage memory with RSgImages until either KErrNoMemory
+or KErrNoGraphicsMemory is returned.
+
+@param aSize The size of the image used to fill the graphics memory - a form of granularity
+@param aImages Returns the array of the images used to fill the graphics memory.
+@return KErrNoGraphicsMemory or KErrNoMemory if successful, otherwise one of the system
+	wide error codes.
+ */
+/*static TInt FillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages)
+	{
+	TInt err = KErrNone;
+	while (KErrNone == err)
+		{
+		RSgImage sgImage;
+		err = sgImage.Create(TSgImageInfo(aSize, ESgPixelFormatA_8, ESgUsageBitOpenVgImage));
+		if (KErrNone == err)
+			{
+			err = aImages.Append(sgImage);
+			}
+		}
+	return err;
+	}*/
+
+/**
+Utility method that fills the RSgImage memory with RSgImages until either KErrNoMemory
+or KErrNoGraphicsMemory is returned and then closes one RSgImage to free up some memory.
+
+@param aSize The size of the image used to fill the graphics memory - a form of granularity
+@param aImages Returns the array of the images used to fill the graphics memory.
+@return KErrNone if successful, otherwise one of the system	wide error codes.
+ */
+/*static TInt NearlyFillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages)
+	{
+	TInt err = FillGraphicsMemoryWithImages(aSize, aImages);
+	if (err == KErrNoMemory || err == KErrNoGraphicsMemory)
+		{
+		if (aImages.Count() > 0)
+			{
+			// Remove an image to free up some memory.
+			TInt lastIndex = aImages.Count() - 1;
+			aImages[lastIndex].Close();
+			aImages.Remove(lastIndex);
+			}
+		err = KErrNone;
+		}
+	return err;
+	}*/
+
+/**
+Static utility function. Creates an 8bpp RSgImage from 1bpp or 8bpp character
+data, with VGImage usage flag set.
+@param aData The character image data. Either in 8bpp or 1bpp RLE format.
+@param aSize The size of the character image in pixels.
+@param aType The type of glyph - Monochrome or Antialiased. 
+@param aSgImage A closed image which will be populated with 8bpp image data.
+*/
+static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage)
+	{
+	return CreateSgImageFromCharacterData(aData, aSize, aType, aImage, NULL, NULL);
+	}
+
+/**
+Static utility function. Creates an 8bpp RSgImage from 1bpp or 8bpp character
+data, with VGImage usage flag set. 
+This overload allows the memory for the buffers to be pre-created to avoid
+memory allocation failure during low-memory testing.
+@param aData The character image data. Either in 8bpp or 1bpp RLE format.
+@param aSize The size of the character image in pixels.
+@param aType The type of glyph - Monochrome or Antialiased. 
+@param aSgImage A closed image which will be populated with 8bpp image data.
+@param aBuffer1 If non-NULL, used as a memory buffer for reading the decoded 
+	image data into for monochrome images.
+@param aBuffer2 If non-NULL, used as a memory buffer for the decoded image
+	data for monochrome images.
+*/
+static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage, TUint8* aBuffer1, TUint8* aBuffer2)
+	{
+	TInt err = KErrNone;	
+	if (aSize == TSize(0, 0))
+		{
+		return KErrArgument;
+		}
+	TUint8* dataBuf = NULL;
+	TInt dataStride = 0;
+	TBool freeDataBuf = EFalse;
+	if (aType == EAntiAliasedGlyphBitmap)
+		{
+		dataBuf = const_cast<TUint8*>(aData);
+		dataStride = aSize.iWidth;
+		}
+	else if (aType == EMonochromeGlyphBitmap)
+		{
+		TUint8* binaryData = NULL;
+		TUint8* tempBuf = NULL;
+		TInt binaryDataStride = ((aSize.iWidth + 31) / 32) << 2;
+		TInt binaryDataSize = binaryDataStride * aSize.iHeight;
+		if (aBuffer1 && User::AllocLen(aBuffer1) >= binaryDataSize)
+			{
+			binaryData = aBuffer1;
+			}
+		else
+			{
+			tempBuf = (TUint8*) User::AllocZ(binaryDataSize);
+			if (!tempBuf)
+				{
+				return KErrNoMemory;
+				}
+			binaryData = tempBuf;
+			}
+		// Unpack the run length encoded data into 1bpp
+		DecodeBinaryData(aSize, aData, binaryDataStride, reinterpret_cast<TUint32*&>(binaryData));
+		dataStride = aSize.iWidth;
+		TInt byteDataSize = dataStride * aSize.iHeight;
+		TUint8* byteData = NULL;
+		// If aByteBuf supplied, use that instead of allocating a new buffer here.
+		if (aBuffer2 && User::AllocLen(aBuffer2) >= byteDataSize)
+			{
+			byteData = aBuffer2;
+			}
+		else
+			{
+			byteData = (TUint8*) User::AllocZ(byteDataSize);
+			if (!byteData)
+				{
+				User::Free(tempBuf);
+				return KErrNoMemory;
+				}
+			freeDataBuf = ETrue;
+			}
+		dataBuf = byteData;
+		for (TInt scanline = 0; scanline < aSize.iHeight; ++scanline)
+			{
+			TUint8* srcByte = binaryData;
+			for (TInt pixel = 0; pixel < aSize.iWidth; pixel++)
+				{
+				*(byteData+pixel) = ((*srcByte & (1 << (pixel % 8))) == 0) ? 0 : 0xFF;
+				if (((pixel + 1) % 8) == 0) srcByte++;
+				}
+			byteData += dataStride;
+			binaryData += binaryDataStride;
+			}
+		User::Free(tempBuf);
+		}
+	else
+		{
+		return KErrArgument;
+		}
+
+	// Create RSgImage from CFbsBitmap.
+	TSgImageInfo sgImageInfo(aSize, ESgPixelFormatA_8, ESgUsageBitOpenVgImage);
+	err = aImage.Create(sgImageInfo, dataBuf, dataStride);
+	if (freeDataBuf)
+		{
+		User::Free(dataBuf);
+		}
+	return err;
+	}
+
+
+/**
+Static utility function, Copies image data line(s) to a destination.
+@param aBinaryDataPtr pointer to a destination buffer.
+@param aBufferWords Stride of the image.
+@param aData Pointer to a source buffer.
+@param aBitShift Number of bits, binary data will be shifted. 
+@param aCharWidth Width of the image.
+@param aRepeatCount Number of lines to copy.
+*/
+static void CopyCharLine(TUint32*& aBinaryDataPtr,TInt aBufferWords,const TUint8* aData,TInt aBitShift,TInt aCharWidth, TInt16 aRepeatCount)
+	{
+	aBitShift&=7;
+	TInt wordstocopy=(aCharWidth+31)>>5;
+	if(wordstocopy>aBufferWords) wordstocopy=aBufferWords;
+	TUint32* ptrlimit=aBinaryDataPtr+wordstocopy;
+	TUint32* dataword=(TUint32*)(TInt(aData)&~3);
+	aBitShift+=(TInt(aData)-TInt(dataword))<<3;
+	
+	TUint32* startBinaryDataPtr = aBinaryDataPtr;
+	while(aBinaryDataPtr<ptrlimit)
+		{
+		*aBinaryDataPtr=*dataword++;
+		*aBinaryDataPtr>>=aBitShift;
+		if(aBitShift) *aBinaryDataPtr|=(*dataword<<(32-aBitShift));
+		aBinaryDataPtr++;
+		}
+	
+	TUint32* curStartBinaryDataPtr = aBinaryDataPtr;
+	TInt byteToCopy = wordstocopy << 2;
+	while(aRepeatCount > 1)
+		{
+		Mem::Copy(curStartBinaryDataPtr, startBinaryDataPtr, byteToCopy);
+		curStartBinaryDataPtr += wordstocopy;
+		
+		aRepeatCount--;
+		}
+	aBinaryDataPtr = curStartBinaryDataPtr;
+	}
+
+/**
+Static utility function. Decodes a monochrome glyph whose data is run length encoded, 
+into a 1bpp bitmap.
+@param aDataSize Image size in pixels.
+@param aData Pointer to a source buffer.
+@param aStride Image data stride.
+@param aBinaryData Pointer to a destination buffer. This buffer must be allocated 
+	by the caller.
+*/
+static void DecodeBinaryData(const TSize& aDataSize, const TUint8* aData, TInt aStride,
+											TUint32* aBinaryData)
+	{
+	const TInt datalength = aDataSize.iWidth;
+	const TInt dataheight = aDataSize.iHeight;
+	TInt bitindex=0;
+	TInt16 repeatcount=0;
+	TUint32* slbuffer=aBinaryData;
+	const TInt slwords=aStride;
+
+	for(TInt charline=0;charline<dataheight;charline+=repeatcount) // for lines in the character...
+		{
+		repeatcount=CFbsBitGc::Load16(aData+(bitindex>>3));
+		repeatcount>>=bitindex&7;
+		const TInt multilineflag=repeatcount&1;
+		repeatcount>>=1;
+		repeatcount&=0xf;
+		bitindex+=5;
+		if(multilineflag)
+			{
+			for(TInt currentline=0;currentline<repeatcount;currentline++)
+				{
+				CopyCharLine(slbuffer,slwords,aData+(bitindex>>3),bitindex&7,datalength, 1);
+				bitindex+=datalength;
+				}
+			}
+		else
+			{
+			CopyCharLine(slbuffer,slwords,aData+(bitindex>>3),bitindex&7,datalength, repeatcount);
+			bitindex+=datalength;
+			}
+		}
+	}
+//--------------
+__CONSTRUCT_STEP__(FbsGlyphData)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsglyphdata.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,199 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TFBSGLYPHDATA_H
+#define TFBSGLYPHDATA_H
+
+#include <EGL/eglext.h>
+#include <VG/openvg.h>
+#include <sgresource/sgresource.h>
+#include "test/TGraphicsHarness.h"
+class RSgImage;
+class CEGLHelper;
+
+//#define SAVEGLYPHSTOMBMDURINGCOMPARISON // Enable saving of glyphs in the CompareSgImages()function
+//#define SAVEGLYPHSTOMBMDEBUGFUNCTION //  Enable compilation of the member function SaveRSgImagesAsMbms(). Occasionally useful.
+
+typedef EGLBoolean (*TvgCreateEGLImageTargetKHRTypefPtr) (VGeglImageKHR image);
+
+/**
+Multi-thread test enum.
+ */
+enum EGlyphDataMultithreadTest
+	{
+	EGlyphDataMultiSessionTestShareGlyphs,
+	EGlyphDataMultiSessionTestStressAtlas
+	};
+
+/**
+Struct passed to multi-thread test functions.
+ */
+struct TGlyphDataMultithreadParams
+	{
+	TFontSpec iFontSpec;
+	TUint* iGlyphCodes;
+	TInt iGlyphCodesCount;
+	CEGLHelper* iEGL;
+	};
+
+/**
+Struct used to define the mutlithreaded test to run when launching a new thread.
+ */
+struct TGlyphDataThreadInfo
+	{
+	EGlyphDataMultithreadTest iTest;
+	TGlyphDataMultithreadParams iParams;
+	TInt iThreadNum;
+	CTestStep* iStep;
+	};
+
+
+/**
+ *
+ * Class to provide a dummy font for test purposes
+ * See CTFbsGlyphData::TestGlyphDataIteratorNotSupportedFontL()
+ */
+class CTestFont : public CFont
+	{
+public:
+	TUid DoTypeUid() const {return TUid::Uid(12345);}
+	TInt DoHeightInPixels() const {return 12;}
+	TInt DoAscentInPixels() const {return 10;}
+	TInt DoCharWidthInPixels(TChar /*aChar*/) const  {return 0;}
+	TInt DoTextWidthInPixels(const TDesC& /*aText*/) const {return 0;}
+	TInt DoBaselineOffsetInPixels() const {return 0;}
+	TInt DoTextCount(const TDesC& /*aText*/,TInt /*aWidthInPixels*/) const {return 0;}
+	TInt DoTextCount(const TDesC& /*aText*/,TInt /*aWidthInPixels*/,TInt& /*aExcessWidthInPixels*/) const {return 0;}
+	TInt DoMaxCharWidthInPixels() const  {return 0;}
+	TInt DoMaxNormalCharWidthInPixels() const  {return 0;}
+	TFontSpec DoFontSpecInTwips() const  {return TFontSpec();}
+	};
+
+/**
+Created by each process/thread that needs to do RSgImage image comparison.
+The class can be shared in a process between threads and handles synchronisation
+with EGL itself.
+ */
+class CEGLHelper : public CBase
+	{
+public:
+	~CEGLHelper();
+	static CEGLHelper* NewL();
+		
+	TInt GetSgImageData(const RSgImage& aSgImage, const TRect& aRect, TUint8*& aBuf);
+	
+private:
+	CEGLHelper();
+	void ConstructL();
+
+private:
+	RMutex iMutex;
+	RSgDriver iSgDriver;
+	EGLDisplay iDisplay;
+	EGLContext iContext;
+	EGLSurface iSurface;
+	// Function pointer for creation and destruction of EGLImages, and the creation
+	// of VGImages from EGLImages.
+	TvgCreateEGLImageTargetKHRTypefPtr vgCreateImageTargetKHR;
+	PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
+	PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
+	};
+
+/**
+Test class for the glyph data extensions RFbsGlyphDataIterator and 
+RFbsGlyphMetricsArray. Positive and negative tests
+*/
+class CTFbsGlyphData : public CTGraphicsBase
+	{
+public:
+	CTFbsGlyphData(CTestStep* aStep);
+	~CTFbsGlyphData();
+protected:
+//from 	CTGraphicsBase
+	virtual void RunTestCaseL(TInt aCurTestCase);
+	void ConstructL();
+	
+private:
+	// Test Cases
+	void TestConsistencyWithGetCharacterData();
+	void TestInvalidGlyphCode();
+	void TestGlyphMetricsArrayParameters();
+	void TestGlyphMetricsArrayReuse();
+	void TestGlyphDataIteratorClose();
+	void TestGlyphDataIteratorSequence();
+	void TestGlyphDataIteratorMultipleUsesOnMultipleFonts();
+	void TestGlyphDataIteratorImageValidity();
+	void TestGlyphDataIteratorOpenInvalidCode();
+	void TestGlyphDataIteratorOpenTwice();
+	void TestGlyphDataIteratorOpenTwiceWithDifferentFonts();
+	void TestGlyphDataIteratorOpenTooBigFont();
+	void TestGlyphDataIteratorOpenWithWrongArgument();
+	void TestGlyphDataIteratorImageMemoryLeak();
+	void TestGlyphDataIteratorLargeFontStress();
+	void TestGlyphDataIteratorManyFontsStressL();
+	void TestGlyphDataIteratorNoGraphicsMemory();
+	void TestGlyphDataIteratorNextIsAtomic();
+	void TestGlyphDataIteratorManyArraySizes();
+	void TestBitmapFontSupport();
+	// White-Box Test Cases
+	void TestGlyphDataIteratorSameGlyphCodes();
+	void TestMultithreadShareSingleFont();
+	void TestMultithreadStressAtlas();
+	// Out-of-system-memory tests
+	void TestGlyphMetricsArrayHeapOOML();
+	void TestGlyphDataIteratorHeapOOML();
+	// Multithread funtions
+	static void ThreadShareGlyphsL(TInt aThreadNum, TGlyphDataMultithreadParams& aParam, CTestStep* aStep);
+	static void ThreadStressAtlasL(TInt aThreadNum, TGlyphDataMultithreadParams& aParam, CTestStep* aStep);	
+
+	// Utility functions for the test cases.
+	static TInt ThreadFunction(TAny* aParam); 
+	TInt GetImageDataFromSgImage(const RSgImage& aSgImage, const TRect& aRect, TUint8*& aBuf);
+	TUint32 CompareMetrics(const TOpenFontCharMetrics& aMetrics1, const TOpenFontCharMetrics& aMetrics2);
+	static TInt CompareSgImages(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, const RSgImage& aImageB, const TRect& aRectB, TBool& aMatch);
+	static TInt CompareSgImages(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, TUint8* aBufferA, const RSgImage& aImageB, const TRect& aRectB, TUint8* aBufferB, TBool& aMatch);
+#ifdef SAVEGLYPHSTOMBMDEBUGFUNCTION
+	void SaveRSgImagesAsMbms( CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, const RSgImage& aImageB, const TRect& aRectB );
+#endif // SAVEGLYPHSTOMBMDEBUGFUNCTION
+	void InfoPrintFontSpec(const CFont& aFont);
+	void SetupEglL();
+	
+private:
+	RFbsSession* iFbs;
+	CFbsTypefaceStore* iTs;
+	TUint* iGlyphCodesLatin;
+	
+	CFbsFont* iFont;
+	CFbsFont* iFont2;
+
+	TUint8* iTempBuf1;
+	TUint8* iTempBuf2;
+	RSgDriver iSgDriver;
+	CEGLHelper* iEGL;
+	};
+
+
+class CTFbsGlyphDataStep : public CTGraphicsStep
+	{
+public:
+	CTFbsGlyphDataStep();
+protected:	
+	//from CTGraphicsStep
+	virtual CTGraphicsBase* CreateTestL();
+	};
+
+_LIT(KTFbsGlyphDataStep,"TFbsGlyphData");
+
+#endif /* TFBSGLYPHDATA_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsglyphdataoutlineshadow.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,93 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <graphics/fbsglyphdataiterator.h>
+#include <sgresource/sgimage.h>
+
+#include "tfbsglyphdataoutlineshadow.h"
+
+_LIT(KTypefaceName, "DejaVu Sans Condensed");
+
+//Note: This test must be run with a rasterizer which supports EFourColourBlendGlyphBitmap (e.g. iType)
+//otherwise the test will fail.
+CTFbsGlyphDataOutlineAndShadow::CTFbsGlyphDataOutlineAndShadow(CTestStep* aStep) :
+    CTGraphicsBase(aStep)
+    {
+    }
+
+CTFbsGlyphDataOutlineAndShadow::~CTFbsGlyphDataOutlineAndShadow()
+    {
+    if (iTs)
+       {
+       iTs->ReleaseFont(iFont);
+       delete iTs;
+       }
+    }
+
+void CTFbsGlyphDataOutlineAndShadow::ConstructL()
+    {
+    iTs = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL);
+    TFontSpec fontSpec;
+    fontSpec.iTypeface.iName = KTypefaceName;
+    fontSpec.iHeight = 15;
+    fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
+    fontSpec.iFontStyle.SetEffects(FontEffect::EDropShadow, EDropShadowOn);
+    fontSpec.iFontStyle.SetEffects(FontEffect::EOutline, EOutlineOn);
+    User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont, fontSpec));
+    //now check if the font is what we requested
+    if(iFont->FontSpecInTwips().iFontStyle.BitmapType()!=EFourColourBlendGlyphBitmap)
+        {
+        WARN_PRINTF1(_L("Monotype font is not installed, run iType\\binaries\\ityperast.cmd to install it"));
+        User::Leave(KErrNotSupported);
+        }
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0646
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+    To ensure that glyph iterator doesn't support outline-and-shadow font
+@SYMTestActions
+    i. Call RFbsGlyphDataIterator::Open() with an outline-and-shadow font.
+
+@SYMTestExpectedResults
+    RFbsGlyphDataIterator::Open() returns KErrNotSupported.
+*/
+void CTFbsGlyphDataOutlineAndShadow::RunTestCaseL(TInt /*aCurTestCase*/)
+    {
+    INFO_PRINTF1(_L("Ensure that glyph iterator doesn't support outline-and-shadow font"));
+    ((CTFbsGlyphDataOutlineAndShadowStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0646"));
+    RFbsGlyphDataIterator iter;
+    const TUint glyphCode = 50;
+    TInt err = iter.Open(*iFont, &glyphCode, 1);
+    TESTE(err == KErrNotSupported, err);
+    iter.Close();
+
+    ((CTFbsGlyphDataOutlineAndShadowStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);//_L("GRAPHICS-FBSERV-0645"));
+    ((CTFbsGlyphDataOutlineAndShadowStep*)iStep)->CloseTMSGraphicsStep();
+    TestComplete();     
+    ((CTFbsGlyphDataOutlineAndShadowStep*)iStep)->RecordTestResultL();
+    }
+
+__CONSTRUCT_STEP__(FbsGlyphDataOutlineAndShadow)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsglyphdataoutlineshadow.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,69 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TFBSGLYPHDATAOUTLINESHADOW_H
+#define TFBSGLYPHDATAOUTLINESHADOW_H
+
+#include "test/TGraphicsHarness.h"
+
+
+/** 
+Enumeration for the attributes to be set in fontspec and gc.
+See CTFbsGlyphDataOutlineAndShadow::ConstructL()
+*/
+enum TFontEffectsFlags
+    {
+    EDropShadowOn = 0x1,
+    EOutlineOn = 0x2,
+    };
+
+/**
+Test class which checks that glyph data extensions 
+RFbsGlyphDataIterator processes and returns correct error if outline-and-shadow
+font is supplied. 
+
+This test must be run with a rasterizer which supports EFourColourBlendGlyphBitmap (e.g. iType)
+otherwise the test will fail.
+
+Negative test
+*/
+class CTFbsGlyphDataOutlineAndShadow : public CTGraphicsBase
+    {
+public:
+    CTFbsGlyphDataOutlineAndShadow(CTestStep* aStep);
+    ~CTFbsGlyphDataOutlineAndShadow();
+protected:
+//from  CTGraphicsBase
+    virtual void RunTestCaseL(TInt aCurTestCase);
+    void ConstructL();
+    
+private:
+    CFbsTypefaceStore* iTs;
+    CFbsFont* iFont;
+   };
+
+class CTFbsGlyphDataOutlineAndShadowStep : public CTGraphicsStep
+    {
+public:
+    CTFbsGlyphDataOutlineAndShadowStep();
+protected:  
+    //from CTGraphicsStep
+    virtual CTGraphicsBase* CreateTestL();
+    };
+
+_LIT(KTFbsGlyphDataOutlineAndShadowStep,"TFbsGlyphDataOutlineAndShadow");
+
+
+#endif /* TFBSGLYPHDATAOUTLINESHADOW_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsglyphdatapanic.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,470 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <test/graphicsfontutils.h>
+#include <graphics/fbsglyphmetricsarray.h> 
+#include <graphics/fbsglyphdataiterator.h>
+#include "tfbsglyphdatapanic.h"
+
+_LIT(KTypefaceName, "DejaVu Sans Condensed");
+const TInt KNumGlyphCodes = 96;
+
+CTFbsGlyphDataPanic::CTFbsGlyphDataPanic(CTestStep* aStep):
+    CTGraphicsBase(aStep)
+    {
+    }
+
+CTFbsGlyphDataPanic::~CTFbsGlyphDataPanic()
+    {
+    iSgDriver.Close();
+    if (iTs)
+         {
+         iTs->ReleaseFont(iFont);
+         delete iTs;
+         }
+    }
+
+void CTFbsGlyphDataPanic::ConstructL()
+    {
+    User::LeaveIfNull(iFbs = RFbsSession::GetSession());
+    User::LeaveIfNull(iTs = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL));
+    User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont, TFontSpec(KTypefaceName, 15)));
+    User::LeaveIfError(iSgDriver.Open());
+    
+    //initialize the array with ASCII characters from 0020 to 007F
+    CCharCodeConverter* converter = CCharCodeConverter::NewLC();
+    converter->UseFontL(iFont);
+    iGlyphCodes = new(ELeave) TUint[KNumGlyphCodes];
+    for (TInt i = 0; i < KNumGlyphCodes; ++i)
+        {
+        TUint asciiCode = i + 0x20; 
+        iGlyphCodes[i] = converter->GlyphCodeL(asciiCode);
+        }
+    CleanupStack::PopAndDestroy(1); // converter
+    }
+
+void CTFbsGlyphDataPanic::RunTestCaseL(TInt /*aCurTestCase*/)
+    {
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+    TInt testCase = -1;
+    _LIT(KCaseNumber, "CaseNumber");
+    TEST(iStep->GetIntFromConfig(iStep->ConfigSection(), KCaseNumber, testCase));
+    
+    switch(testCase)
+        {
+    case 1:
+        TestGlyphDataIteratorNotInitializedNext();
+        break;
+    case 2:
+        TestGlyphDataIteratorNotInitializedImage();
+        break;
+    case 3:
+        TestGlyphDataIteratorNotInitializedMetrics();
+        break;
+    case 4:
+        TestGlyphDataIteratorNotInitializedGlyphCode();
+        break;
+    case 5:
+        TestGlyphDataIteratorClosedNext();
+        break;
+    case 6:
+        TestGlyphDataIteratorClosedImage();
+        break;
+    case 7:
+        TestGlyphDataIteratorClosedMetrics();
+        break;
+    case 8:
+        TestGlyphDataIteratorClosedGlyphCode();
+        break;
+    case 9:
+        TestGlyphDataIteratorDiscardUsedFont();
+        break;
+    case 10:
+        TestGlyphMetricsArrayIndexNegative();
+        break;
+    case 11:
+    	TestGlyphMetricsArrayIndexTooHigh();
+        break;
+    case 12:
+    	TestGlyphDataIteratorOpenFailed();
+    	break;
+    default:
+        break;
+        }
+    TEST(EFalse); // shouldn't reach this point as the test will panic at the end of each test case function
+    
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+    ((CTFbsGlyphDataPanicStep*)iStep)->CloseTMSGraphicsStep();
+    TestComplete();     
+    ((CTFbsGlyphDataPanicStep*)iStep)->RecordTestResultL();
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0651
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that calling Next() on an unopened iterator will panic.
+
+@SYMTestActions
+	Call Next() on an RFbsGlyphDataIterator instance without opening it.
+
+@SYMTestExpectedResults
+	The call to Next() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorNotInitializedNext()
+    {
+    INFO_PRINTF1(_L("Ensure that Next() operation applied on null iterator will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0651"));
+    RFbsGlyphDataIterator iter;
+    iter.Next(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0652
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that Image() function applied on an unopened iterator will panic.
+
+@SYMTestActions
+	Call Image() on an RFbsGlyphDataIterator instance without opening it.
+
+@SYMTestExpectedResults
+	The call to Image() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorNotInitializedImage()
+    {
+    INFO_PRINTF1(_L("Ensure that Image() operation applied on null iterator will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0652"));
+    RFbsGlyphDataIterator iter;
+    iter.Image(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0653
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that Metrics() function applied on null iterator will panic.
+
+@SYMTestActions
+	Call Metrics() on an RFbsGlyphDataIterator instance without opening it.
+
+@SYMTestExpectedResults
+	The call to Metrics() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorNotInitializedMetrics()
+    {
+    INFO_PRINTF1(_L("Ensure that Metrics() operation applied on null iterator will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0653"));
+    RFbsGlyphDataIterator iter;
+    iter.Metrics(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0654
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that calling GlyphCode() on an unopened iterator will panic.
+
+@SYMTestActions
+	Call GlyphCode() on an RFbsGlyphDataIterator instance without opening it.
+
+@SYMTestExpectedResults
+	The call to GlyphCode() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorNotInitializedGlyphCode()
+    {
+    INFO_PRINTF1(_L("Ensure that GlyphCode() operation applied on null iterator will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0654"));
+    RFbsGlyphDataIterator iter;
+    iter.GlyphCode(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0655
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that calling Next() on an iterator which has been closed will panic.
+
+@SYMTestActions
+	i. Open the glyph data iterator with 1 glyph code.
+	ii. Call Next() to attempt to move the iterator past the end of the array of glyph codes.
+	iii. Call Close() and repeat ii.
+
+@SYMTestExpectedResults
+	The call to Next() should fail with KErrNotFound, signifying the iterator is still open.
+	The final call to Next() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorClosedNext()
+    {
+    INFO_PRINTF1(_L("Ensure that Next() operation applied on iterator which has been closed will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0655"));
+    RFbsGlyphDataIterator iter;
+    TESTNOERROR(iter.Open(*iFont, iGlyphCodes, 1));
+    TInt iterErr = iter.Next();
+    TESTE(iterErr == KErrNotFound, iterErr);
+    iter.Close();
+    iter.Next(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0656
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that calling Image() on an iterator which has been closed will panic.
+
+@SYMTestActions
+	i. Open the glyph data iterator.
+	ii. Close the glyph data iterator.
+	iii. Call Image() on an RFbsGlyphDataIterator instance which has been closed.
+
+@SYMTestExpectedResults
+	The call to Image() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorClosedImage()
+    {
+    INFO_PRINTF1(_L("Ensure that Image() operation applied on iterator which has been closed will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0656"));
+    RFbsGlyphDataIterator iter;
+    OpenAndCloseIterator(iter);
+    iter.Image(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0657
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that calling Metrics() on an iterator which has been closed will panic.
+
+@SYMTestActions
+	i. Open the glyph data iterator.
+	ii. Close the glyph data iterator.
+	iii. Call Metrics() on an RFbsGlyphDataIterator instance which has been closed.
+
+@SYMTestExpectedResults
+	The call to Metrics() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorClosedMetrics()
+    {
+    INFO_PRINTF1(_L("Ensure that Metrics()operation applied on iterator which has been closed will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0657"));
+    RFbsGlyphDataIterator iter;
+    OpenAndCloseIterator(iter);
+    iter.Metrics(); //expect to panic here
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0658
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      In development
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that calling GlyphCode() on an iterator which has been closed will panic.
+
+@SYMTestActions
+	i. Open the glyph data iterator.
+	ii. Close the glyph data iterator.
+	iii. Call GlyphCode() on an RFbsGlyphDataIterator instance which has been closed.
+
+@SYMTestExpectedResults
+	The call to GlyphCode() should panic with FBSCLI 31.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorClosedGlyphCode()
+    {
+    INFO_PRINTF1(_L("Ensure that GlyphCode() operation applied on iterator which has been closed will panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0658"));
+    RFbsGlyphDataIterator iter;
+    OpenAndCloseIterator(iter);
+    iter.GlyphCode(); //expect to panic here
+    }
+
+// the function opens and then closes an iterator
+void CTFbsGlyphDataPanic::OpenAndCloseIterator(RFbsGlyphDataIterator& aIterator) 
+    {
+    TESTNOERROR(aIterator.Open(*iFont, iGlyphCodes, 1));
+    aIterator.Close();
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0647
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that attempting to use an invalid Font handle will cause a panic when iterating through an RFbsGlyphDataIterator. 
+
+@SYMTestActions
+	i. Open the glyph data iterator.
+	ii. Release the font associated with the iterator.
+	iii. Attempt to use invalid Font handle by iterating through the iterator.
+
+@SYMTestExpectedResults
+	The call to Next() after the associated Font has been released should cause panic FBSERV -8 when the invalid Font handle is passed to FBServ.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorDiscardUsedFont()
+    {
+    INFO_PRINTF1(_L("Ensure that attempting to use an invalid Font handle will cause a panic when iterating through an RFbsGlyphDataIterator"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0647"));
+    
+    RFbsGlyphDataIterator iter;
+    TESTNOERROR(iter.Open(*iFont, iGlyphCodes, KNumGlyphCodes));
+    iTs->ReleaseFont(iFont);
+    
+    for (TInt i = 0; i < KNumGlyphCodes; i++)
+        {
+        //should panic when attempt is made to use invalid Font handle
+        iter.Next();
+        }
+
+    iter.Close(); //shouldn't reach this line. If for some reason the code doesn't panic test should fail.
+    TEST(EFalse);  
+    }
+    
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0648
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that accessing the glyph metrics entry with negative index will cause a panic.
+
+@SYMTestActions
+	i. Retrieve glyph metrics array.
+	ii. Try to access glyph metrics entry with a negative index.
+
+@SYMTestExpectedResults
+	Should panic with FBSCLI 32.
+*/
+void CTFbsGlyphDataPanic::TestGlyphMetricsArrayIndexNegative()
+    {
+    INFO_PRINTF1(_L("Ensure that accessing the glyph metrics entry with negative index will cause a panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0648"));
+    RFbsGlyphMetricsArray glyphMetricsArray;
+
+    // Retrieve list of metrics
+    TESTNOERROR(glyphMetricsArray.Get(*iFont, iGlyphCodes, 2));
+    TEST(2 == glyphMetricsArray.Count());
+    glyphMetricsArray[-1];
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0649
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that accessing the glyph metrics entry with an index greater than number
+	of elements in array will cause a panic.
+
+@SYMTestActions
+	i. Retrieve a glyph metrics array with total number of elements equals 2 
+	ii. Try to access glyph metrics entry with index equals 2.
+
+@SYMTestExpectedResults
+	Should panic with FBSCLI 32.
+*/
+void CTFbsGlyphDataPanic::TestGlyphMetricsArrayIndexTooHigh()
+    {
+    INFO_PRINTF1(_L("Ensure that accessing the glyph metrics entry with index greater than number of elemnets in array will cause a panic"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0649"));
+    RFbsGlyphMetricsArray glyphMetricsArray;
+
+    // Retrieve list of metrics
+    TESTNOERROR(glyphMetricsArray.Get(*iFont, iGlyphCodes, 2));
+    TEST(2 == glyphMetricsArray.Count());
+    glyphMetricsArray[2]; //expect to panic here as index varies 0..1
+    }
+
+/**
+@SYMTestCaseID      GRAPHICS-FBSERV-0667
+@SYMTestPriority    High
+@SYMTestType        UT
+@SYMTestStatus      Implemented
+@SYMPREQ            PREQ2678
+
+@SYMTestCaseDesc
+	To ensure that if RFbsGlyphDataIterator::Open() fails, it is still in the closed state
+	and cannot be used.
+
+@SYMTestActions
+	i. Open an RFbsGlyphDataIterator on a font.  
+	ii. Attempt to open a second RFbsGlyphDataIterator on the same font.
+	ii. Attempt to use the properties of the iterator.
+
+@SYMTestExpectedResults
+	The call to GlyphCode() should panic with FBSCLI 31 since the iterator should be in a closed state.
+*/
+void CTFbsGlyphDataPanic::TestGlyphDataIteratorOpenFailed()
+	{
+    INFO_PRINTF1(_L("Ensure that if RFbsGlyphDataIterator::Open() fails, it is still in the closed state and cannot be used"));
+    ((CTFbsGlyphDataPanicStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0667"));
+   
+    CFbsFont* bitmapFont = NULL;
+    TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)bitmapFont, TFontSpec(_L("Digital"), 14));
+    TESTNOERROR(err);
+    TEST(!bitmapFont->IsOpenFont());
+    
+    RFbsGlyphDataIterator iter;
+    err = iter.Open(*bitmapFont, iGlyphCodes, 2);
+    TEST(err == KErrNotSupported);
+        
+    iter.GlyphCode(); // Should panic here as iter should be closed.
+    TEST(EFalse);     //shouldn't reach this line. If for some reason the code doesn't panic test should fail.
+    
+	}
+//--------------
+__CONSTRUCT_STEP__(FbsGlyphDataPanic)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsglyphdatapanic.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,74 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TFBSGLYPHDATAPANIC_H
+#define TFBSGLYPHDATAPANIC_H
+
+#include <sgresource/sgresource.h>
+#include "test/TGraphicsHarness.h"
+class RFbsGlyphDataIterator;
+
+/**
+Test class which exercises all panics for the glyph data extensions 
+RFbsGlyphDataIterator and RFbsGlyphMetricsArray. 
+Negative tests
+*/
+class CTFbsGlyphDataPanic : public CTGraphicsBase
+    {
+public:
+    CTFbsGlyphDataPanic(CTestStep* aStep);
+    ~CTFbsGlyphDataPanic();
+protected:
+//from  CTGraphicsBase
+    virtual void RunTestCaseL(TInt aCurTestCase);
+    void ConstructL();
+    
+//test cases
+    void TestGlyphDataIteratorNotInitializedNext();
+    void TestGlyphDataIteratorNotInitializedImage();
+    void TestGlyphDataIteratorNotInitializedMetrics();
+    void TestGlyphDataIteratorNotInitializedGlyphCode();
+    void TestGlyphDataIteratorClosedNext();
+    void TestGlyphDataIteratorClosedImage();
+    void TestGlyphDataIteratorClosedMetrics();
+    void TestGlyphDataIteratorClosedGlyphCode();
+    void TestGlyphDataIteratorDiscardUsedFont();
+    void TestGlyphMetricsArrayIndexNegative();
+    void TestGlyphMetricsArrayIndexTooHigh();
+    void TestGlyphDataIteratorOpenFailed();
+
+    //helper function
+    void OpenAndCloseIterator(RFbsGlyphDataIterator& aIterator); // the function opens and then closes an iterator
+private:
+    RFbsSession* iFbs;
+    CFbsTypefaceStore* iTs;
+    CFbsFont* iFont;
+    RSgDriver iSgDriver;
+    TUint* iGlyphCodes;
+   };
+
+class CTFbsGlyphDataPanicStep : public CTGraphicsStep
+    {
+public:
+    CTFbsGlyphDataPanicStep();
+protected:  
+    //from CTGraphicsStep
+    virtual CTGraphicsBase* CreateTestL();
+    };
+
+_LIT(KTFbsGlyphDataPanicStep,"TFbsGlyphDataPanic");
+
+
+#endif /* TFBSGLYPHDATAPANIC_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsmultithread.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,36 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TFBSMULTITHREAD_H
+#define TFBSMULTITHREAD_H
+
+/**
+* Enums for passing between the test thread and the second thead used in testing,
+* used to define which test should be run on the second thread.
+*/
+enum TFbsMultiThreadTestCase
+	{
+	EFbsSecondThreadInvalidHandleInIpcCall,
+	};
+
+/**
+ * Class for passing test info to other threads.
+ */	
+struct TFbsTestThreadInfo 
+	{
+	TFbsMultiThreadTestCase iTestCase;
+	};
+
+#endif // TFBSMULTITHREAD_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsoogm.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,370 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: Test the operation of the Font and Bitmap Server's GOoM plug-in
+//
+
+
+#include <gdi.h>
+#include "tfbsoogm.h"
+
+
+
+const TInt KTFbsOogmFrameworkPause = 500000; // How long does this need to be in order to be reliable?
+const TInt KTFbsOogmImageSizeX = 2048;
+const TInt KTFbsOogmImageSizeY = 2048;
+
+
+void CTFbsOogm::RunTestCaseL( TInt aCurTestCase )
+    {
+    ( (CTFbsOogmStep*)iStep )->SetTestStepID( KUnknownSYMTestCaseIDName );
+
+    switch( aCurTestCase )
+        {
+    case 1:
+        ( (CTFbsOogmStep*)iStep )->SetTestStepID( _L("GRAPHICS-FBSERV-0675") );
+
+        CacheClearanceAndLimitAdjustments();
+        break;
+
+    default:
+        ( (CTFbsOogmStep*)iStep )->SetTestStepID( KNotATestSYMTestCaseIDName );
+        ( (CTFbsOogmStep*)iStep )->CloseTMSGraphicsStep();
+        TestComplete();
+
+        break;
+        }
+
+    ( (CTFbsOogmStep*)iStep )->RecordTestResultL();
+
+    }
+
+
+
+/**
+ 	@SYMTestCaseID
+	GRAPHICS-FBSERV-0675
+
+	@SYMTestCaseDesc
+	Tests the operation of Font and Bitmap server's  Out-Of-Graphics-Memory plugin.
+	ie Ensure that the hardware glyph cache is cleared in response to a low graphics 
+	memory notification, and that the cache's maximum size limit is reduced.
+
+
+	@SYMTestActions
+	Acquire the glyph cache's usage and other metrics.
+	
+	Populate the glyph-cache.
+
+	Acquire the glyph-cache's usage and other metrics.
+
+	Precipitate an Out-of-Graphics-Memory condition, triggering the GOOM monitor.
+
+	Acquire the glyph cache's usage and other metrics.
+
+	Ensure the glyph-cache has been cleared and its maximum limit reduced.
+
+	Precipitate a MemoryGood() call from the GOoM framework.
+
+	Establish that the cache-size limit has been reinstated.
+
+	@SYMTestExpectedResults
+    The glyph-cache should be cleared in response to OoGM condition and its upper limit reduced.
+
+    The Glyph-cache's upper limit should be reinstated in response to a memory-good notification.
+ */
+void CTFbsOogm::CacheClearanceAndLimitAdjustments()
+    {
+    __UHEAP_MARK;
+
+    RArray <RSgImage> sgImageArray;
+    RSgDriver sgDriver;
+    TInt err = sgDriver.Open();
+
+    if( KErrNone != err )
+        {
+		TEST( KErrNone == err );
+		INFO_PRINTF2( _L("SgDriver Open() returned error %d"), err );
+
+        return;
+        }
+
+    if( (NULL == RFbsSession::GetSession()) )
+         {
+        if( KErrNone != RFbsSession::Connect() )
+            {
+ 			TEST( -1 );
+			INFO_PRINTF1(_L("Failed to connect to FbServ"));
+
+            goto CleanupAndGo;
+            }
+         }
+
+
+	// Establish the initial condition of the glyph-cache.
+    TGlyphCacheMetrics initialGlyphCacheMetrics;
+    err = RFbsSession::GetSession()->GetGlyphCacheMetrics( initialGlyphCacheMetrics );
+    if( KErrNone != err )
+        {
+		TEST( KErrNone == err );
+		INFO_PRINTF2( _L("GetGlyphCacheMetrics() returned error %d"), err );
+
+        goto CleanupAndGo;
+        }
+
+	// Check that initial conditions are as expected.
+    // There was a test here for a cache-size of zero, but this was felt to be a hazardous assumption.
+	TEST( initialGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+    INFO_PRINTF4( _L("Initial iMaxCacheSizeInBytes %d iCacheSizeInBytes %d iGpuCacheSizeLimitIsMax %d "),
+                      initialGlyphCacheMetrics.iMaxCacheSizeInBytes,
+                      initialGlyphCacheMetrics.iCacheSizeInBytes,
+                      initialGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+
+
+    TRAP( err, UseGpuL() ); // Populate the glyph cache then acquire its usage metrics.
+    if( KErrNone != err )
+        {
+        TEST( KErrNone == err );
+        INFO_PRINTF2( _L("UseGpuL() left with %d"), err );
+
+        goto CleanupAndGo;
+        }
+
+
+    TGlyphCacheMetrics usageGlyphCacheMetrics;
+    err = RFbsSession::GetSession()->GetGlyphCacheMetrics( usageGlyphCacheMetrics );
+    if( KErrNone != err )
+        {
+		TEST( KErrNone == err );
+		INFO_PRINTF2( _L("GetGlyphCacheMetrics() returned %d"), err );
+
+        goto CleanupAndGo;
+        }
+
+    // Check that the glyph cache has been populated
+    TEST( usageGlyphCacheMetrics.iCacheSizeInBytes > initialGlyphCacheMetrics.iCacheSizeInBytes);
+    TEST( usageGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+    INFO_PRINTF4( _L("Usage iMaxCacheSizeInBytes %d iCacheSizeInBytes %d iGpuCacheSizeLimitIsMax %d "),
+                       usageGlyphCacheMetrics.iMaxCacheSizeInBytes,
+                       usageGlyphCacheMetrics.iCacheSizeInBytes,
+                       usageGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+
+
+
+    // Precipitate the GOoM framework's call into the Plug-in's FreeRam() method.
+    err = FillGraphicsMemoryWithImages( TSize(KTFbsOogmImageSizeX, KTFbsOogmImageSizeY), sgImageArray );
+    if( KErrNoGraphicsMemory != err )
+        {
+		TEST( KErrNoGraphicsMemory == err );
+		INFO_PRINTF2( _L("FillGraphicsMemoryWithImages() returned %d"), err );
+
+        goto CleanupAndGo;
+        }
+
+	// Await the GOOM framework's call into FbServ's OoGM plugin,
+    // then establish the cache's usage and other metrics.
+    User::After( KTFbsOogmFrameworkPause );
+    TGlyphCacheMetrics postOogmGlyphCacheMetrics;
+    err = RFbsSession::GetSession()->GetGlyphCacheMetrics( postOogmGlyphCacheMetrics );
+
+    if( KErrNone != err )
+        {
+		TEST( KErrNone == err );
+		INFO_PRINTF2( _L("GetGlyphCacheMetrics() returned %d"), err );
+
+        goto CleanupAndGo;
+        }
+
+    // The cache should have been cleared and the maximum size limit reduced.
+    TEST( 0 == postOogmGlyphCacheMetrics.iCacheSizeInBytes );
+    TEST( !postOogmGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+    INFO_PRINTF4( _L("Post-Oogm iMaxCacheSizeInBytes %d iCacheSizeInBytes %d iGpuCacheSizeLimitIsMax %d "),
+                        postOogmGlyphCacheMetrics.iMaxCacheSizeInBytes,
+                        postOogmGlyphCacheMetrics.iCacheSizeInBytes,
+                        postOogmGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+
+
+
+   // Remove the images. This should provoke a GOoM monitor call into the plug-in's MemoryGood().
+    for ( TInt i = sgImageArray.Count()-1; i >= 0; --i )
+        {
+        sgImageArray[i].Close();
+        }
+    sgImageArray.Reset();
+
+    // Await activity from the GOoM monitor
+    User::After( KTFbsOogmFrameworkPause );
+    TGlyphCacheMetrics reinstatedGlyphCacheMetrics;
+    err = RFbsSession::GetSession()->GetGlyphCacheMetrics( reinstatedGlyphCacheMetrics );
+    if( KErrNone != err )
+        {
+        TEST( KErrNone == err );
+        INFO_PRINTF2( _L("GetGlyphCacheMetrics() returned error %d"), err );
+
+        goto CleanupAndGo;
+        }
+
+    // Cache size limit should have been increased
+    TEST( reinstatedGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+    INFO_PRINTF4( _L("After Mem Clear iMaxCacheSizeInBytes %d iCacheSizeInBytes %d iGpuCacheSizeLimitIsMax %d "),
+                      reinstatedGlyphCacheMetrics.iMaxCacheSizeInBytes,
+                      reinstatedGlyphCacheMetrics.iCacheSizeInBytes,
+                      reinstatedGlyphCacheMetrics.iGpuCacheSizeLimitIsMax );
+
+
+
+  CleanupAndGo:
+    // Release any images before closing the array.
+    // If the test was successful this should already be empty.
+    for (TInt i = sgImageArray.Count()-1; i >= 0; --i)
+        {
+        sgImageArray[i].Close();
+        }
+
+    // Allow GOoM to make any pending adjustments before proceeding with any further tests.
+    User::After( KTFbsOogmFrameworkPause );
+    sgImageArray.Close();
+    sgDriver.Close();
+
+    __UHEAP_MARKEND;
+    }
+
+
+
+CTFbsOogm::CTFbsOogm( CTestStep* aStep )
+: CTGraphicsBase(aStep)
+    {
+    }
+
+
+
+const TInt KNumGlyphCodesLatin = 96;
+/*
+ Lookup table to convert from ascii code to
+glyph code for the Deja Vu family of fonts.
+ */
+const TUint DejaVuASCIIToGlyphCode[] =
+    {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 3, 4, 5, 6, 7, 8, 9, 10,
+    11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+    31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+    41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+    51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+    61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+    71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+    81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+    91, 92, 93, 94, 95, 96, 97, 98,
+    };
+
+
+
+void CTFbsOogm::ConstructL()
+    {
+    }
+
+
+CTFbsOogm::~CTFbsOogm()
+    {
+    RFbsSession::Disconnect();
+    }
+
+
+
+/**
+ Utility function to fill the GPU memory.
+ */
+TInt CTFbsOogm::FillGraphicsMemoryWithImages( const TSize& aSize, RArray<RSgImage>& aImages )
+    {
+    TInt err = KErrNone;
+
+    // Loop should terminate with KErrNoGraphicsMemory
+    while( KErrNone == err )
+        {
+        RSgImage sgImage;
+        err = sgImage.Create( TSgImageInfo(aSize, ESgPixelFormatA_8, ESgUsageBitOpenVgImage) );
+        if( KErrNone == err )
+            {
+            err = aImages.Append( sgImage );
+            }
+        }
+
+    INFO_PRINTF2( _L("Images created %d"), aImages.Count() );
+    return err;
+    }
+
+
+
+/**
+ Utility function to populate the GPU with typeface glyphs.
+ */
+void CTFbsOogm::UseGpuL()
+    {
+    _LIT( KTKASTypefaceName, "DejaVu Sans Condensed" );
+
+    // Need to open one of these "in the context" of this process in order
+    // to manipulate RSgImages. Even though we are only calling 'Open', 'Next' and 'Close' on
+    // RFbsGlyphDataIterator
+    RSgDriver sgDriver;
+    User::LeaveIfError( sgDriver.Open() );
+
+    // CFbsTypefaceStore seems to need an fbserv session open.
+    if( (NULL == RFbsSession::GetSession()) )
+     {
+     User::LeaveIfError( RFbsSession::Connect() );
+     }
+
+    TUint* glyphCodesLatin = new(ELeave) TUint[ KNumGlyphCodesLatin ];
+
+    for ( TInt ii = 0; ii < KNumGlyphCodesLatin; ++ii )
+        {
+        TUint asciiCode = ii+0x20; // ASCII characters from 0020 to 007F
+        glyphCodesLatin[ii] = DejaVuASCIIToGlyphCode[asciiCode];
+        }
+
+    iTs = ( CFbsTypefaceStore* )CFbsTypefaceStore::NewL( NULL );
+    User::LeaveIfError( iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont, TFontSpec(KTKASTypefaceName, 15)) );
+
+    TInt iterErr = KErrNone;
+    TInt iterNextErr = KErrNone;
+
+    for( TInt arraySize = 1; (arraySize < KNumGlyphCodesLatin) && (iterErr == KErrNone); ++arraySize )
+        {
+        RFbsGlyphDataIterator iter;
+        iterErr = iter.Open( *iFont, glyphCodesLatin, arraySize );
+
+        if( KErrNone != iterErr )
+            {
+            continue;
+            }
+
+          for ( TInt index = 0; KErrNone == iterNextErr; iterNextErr = iter.Next(), ++index )
+              {
+              // Iterating through the glyphs should introduce them into the cache
+             if(iter.GlyphCode() != glyphCodesLatin[index])
+                {
+                 INFO_PRINTF4( _L("Wanted glyphcode %d, got %d"), arraySize, glyphCodesLatin[index], iter.GlyphCode() );
+                }
+              }
+
+        iterNextErr = KErrNone;
+        iter.Close();
+        }
+
+    sgDriver.Close();
+    }
+
+
+__CONSTRUCT_STEP__( FbsOogm )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tfbsoogm.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,75 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TFBSOOGM_H
+#define TFBSOOGM_H
+#include <EGL/egl.h>
+
+#include <e32cmn.h>
+#include <EGL/eglext.h>
+#include <VG/openvg.h>
+#include <sgresource/sgresource.h>
+#include <sgresource/sgimage.h>
+#include <graphics/fbsglyphdataiterator.h>
+#include "FbsMessage.h"
+
+#include "test/TGraphicsHarness.h"
+
+
+/**
+Test class for the GPU 'Out of Graphics Memory' (OoGM) plug-in
+
+Hardware only as the GoomMonitor framework does not operate under WINSCW
+*/
+class CTFbsOogm : public CTGraphicsBase
+    {
+public:
+    CTFbsOogm( CTestStep* aStep );
+    ~CTFbsOogm();
+protected:
+    //from  CTGraphicsBase
+    virtual void RunTestCaseL( TInt aCurTestCase );
+    void ConstructL();
+
+private:
+    // Test Cases
+    void CacheClearanceAndLimitAdjustments();
+
+private:
+    void UseGpuL();
+    TInt FillGraphicsMemoryWithImages( const TSize& aSize, RArray<RSgImage>& aImages );
+
+private:
+    CFbsFont* iFont;
+    CFbsTypefaceStore* iTs;
+    };
+
+
+
+class CTFbsOogmStep : public CTGraphicsStep
+    {
+public:
+    CTFbsOogmStep();
+
+protected:
+    //from CTGraphicsStep
+    virtual CTGraphicsBase* CreateTestL();
+    };
+
+_LIT( KTFbsOogmStep,"TFbsOogm" );
+
+
+
+#endif // TFBSOOGM_H
--- a/fbs/fontandbitmapserver/tfbs/tfonttableandglyph.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/tfonttableandglyph.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define TFONTTABLEANDGLYPH_H_
 
 #include <gdi.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTFontAndGlyphStep : public CTGraphicsStep
     {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tglyphatlas.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,284 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "tglyphatlas.h"
+#include "TFBS.H"
+#include "glyphatlastestwrapper.h"
+
+_LIT(KTypefaceName, "DejaVu Sans Condensed");
+_LIT(KMonoTypefaceName, "DejaVu Sans Mono");
+const TInt KNumGlyphCodesLatin = 96;
+
+
+CTGlyphAtlas::CTGlyphAtlas(CTestStep* aStep):
+	CTGraphicsBase(aStep),
+	iFbs(NULL),
+	iTs(NULL),
+	iGlyphCodesLatin(NULL),
+	iFont(NULL)
+	{
+	}
+
+void CTGlyphAtlas::ConstructL()
+	{
+	iFbs = RFbsSession::GetSession();
+	iTs = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL);
+	User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont, TFontSpec(KTypefaceName, 15)));
+	User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont2, TFontSpec(KMonoTypefaceName, 8)));
+	
+	iGlyphCodesLatin = new(ELeave) TUint[KNumGlyphCodesLatin];
+	for (TInt ii = 0; ii < KNumGlyphCodesLatin; ++ii)
+		{
+		iGlyphCodesLatin[ii] = ii+32; // ASCII characters from 0020 to 007F
+		}
+
+	INFO_PRINTF1(_L("FBSERV Glyph Atlas Testing"));
+	}
+
+CTGlyphAtlas::~CTGlyphAtlas()
+	{
+	if (iTs)
+		{
+		iTs->ReleaseFont(iFont);
+		}
+	delete iTs;
+	delete[] iGlyphCodesLatin;
+	}
+
+void CTGlyphAtlas::RunTestCaseL(TInt aCurTestCase)
+	{
+	((CTGlyphAtlasStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+	case 1:
+		((CTGlyphAtlasStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0663"));
+		TestFullCache();
+		break;
+	case 2:
+		((CTGlyphAtlasStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0664"));
+		TestFontReleased();
+		break;
+	default:
+		((CTGlyphAtlasStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTGlyphAtlasStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();		
+		break;
+		}
+	((CTGlyphAtlasStep*)iStep)->RecordTestResultL();
+	}
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0663
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that when the glyph atlas reaches its memory limit, any new added 
+	glyphs will cause the eviction of the least recently used glyphs.
+	The new glyph will be added successfully.
+
+@SYMTestActions
+	i. Create a glyph atlas with a memory limit of 1000 bytes.
+	ii. Add glyphs to the atlas such that its memory consumption reaches the limit.
+	iii. Add one more glyph.
+	iv. Call CGlyphAtlas::GetGlyph() for the last glyph added.
+	v. Call CGlyphAtlas::GetGlyph() for the least recently used glyphs to check 
+		that it has been evicted.
+	vi. Delete glyph atlas
+
+@SYMTestExpectedResults
+	Each glyph is added successfully.
+	CGlyphAtlas::GetGlyph() returns KErrNone for the last glyph added.
+	CGlyphAtlas::GetGlyph() returns KErrNotFound for the least recently used glyph.
+*/
+void CTGlyphAtlas::TestFullCache()
+	{
+	INFO_PRINTF1(_L("Test full cache eviction"));
+
+	__UHEAP_MARK;
+	// Fill cache up using expected size of glyph using AddGlyph.
+	const TInt KMaxAtlasSizeInBytes = 1000;
+	CGlyphAtlasTestWrapper* atlas = NULL;
+	TRAPD(ret, atlas = CGlyphAtlasTestWrapper::NewL(KMaxAtlasSizeInBytes));
+	TESTNOERROR(ret);
+	if (KErrNone != ret)
+		{
+		return;
+		}
+	TOpenFontCharMetrics charMetrics;
+	TGlyphImageInfo imageInfo;
+	TSize bitmapSize;
+	const TUint8* bitmapData = NULL;
+	TInt glyphIndex = 0;
+	TBool atlasFull = EFalse;
+	CBitmapFont* bmFont = CTFbsFont::FontAddress(iFont);
+	// Fill up atlas by adding glyphs.
+	// Next glyph shold tip the atlas over the memory limit.
+	// Glyphs are added in ascending glyph code order.
+	// Leave at least one glyph so that we can guarantee that we can add one more unique glyph.
+	while (glyphIndex < KNumGlyphCodesLatin-1 && !atlasFull)
+		{
+		iFont->GetCharacterData(iGlyphCodesLatin[glyphIndex], charMetrics, bitmapData, bitmapSize);
+		TInt sizeInBytes = charMetrics.Height() * charMetrics.Width();
+		if (atlas->SizeInBytes() + sizeInBytes <= KMaxAtlasSizeInBytes)
+			{
+			CGlyphAtlas::TAddGlyphArgs args(bitmapData, iGlyphCodesLatin[glyphIndex++], charMetrics);
+			TESTNOERROR(atlas->AddGlyph(*bmFont, args, imageInfo));
+			}
+		else
+			{
+			atlasFull = ETrue;
+			}
+		}
+	TEST(atlasFull);
+
+	// check least recently used page contains the first glyph in glyph codes
+	TUint leastUsedGlyphCode = iGlyphCodesLatin[0];
+	TEST(atlas->LruPageContainsGlyph(leastUsedGlyphCode));
+
+	// To ensure that the test does not pass if a FIFO eviction policy occurs,
+	// get the least recently used glyph so that it is moved internally.
+	TESTNOERROR(atlas->GetGlyph(*bmFont, leastUsedGlyphCode, imageInfo));
+
+	// glyphIndex, bitmapData and charMetrics now current for next glyph which 
+	// will take the atlas over the cache limit.
+	CGlyphAtlas::TAddGlyphArgs args(bitmapData, iGlyphCodesLatin[glyphIndex], charMetrics);
+	TESTNOERROR(atlas->AddGlyph(*bmFont, args, imageInfo));
+
+	// check that searching for most recently added glyph is successful
+	TGlyphImageInfo newInfo;
+	TESTNOERROR(atlas->GetGlyph(*bmFont, iGlyphCodesLatin[glyphIndex], newInfo));
+
+	// check atlas size is still under the limit
+	TEST(atlas->SizeInBytes() <= KMaxAtlasSizeInBytes);
+
+	// check that the pages which were evicted contained the least used glyphs
+	// i.e. searching for these returns KErrNotFound
+	TInt err = KErrNotFound;
+	TInt index = 1;
+	for (; KErrNotFound == err && index <= glyphIndex; ++index)
+		{
+		err = atlas->GetGlyph(*bmFont, iGlyphCodesLatin[index], newInfo);
+		}
+	TESTNOERROR(err);
+	// first found glyph should be greater than glyph at index 1
+	TEST(index-1 > 1);
+	
+	// check that the remaining pages contained the least used glyphs
+	for (; index <= glyphIndex; ++index)
+		{
+		TESTNOERROR(atlas->GetGlyph(*bmFont, iGlyphCodesLatin[index], newInfo));
+		}
+
+	delete atlas;
+	__UHEAP_MARKEND;
+	}
+
+
+/**
+@SYMTestCaseID		GRAPHICS-FBSERV-0664
+@SYMTestPriority	High
+@SYMTestType		UT
+@SYMTestStatus		Implemented
+@SYMPREQ			PREQ2678
+
+@SYMTestCaseDesc
+	Shows that CGlyphAtlas::FontReleased() does actually delete all the glyphs 
+	associated with the released font and leaves glyphs associated with other 
+	fonts untouched.
+
+@SYMTestActions
+	i. Create a glyph atlas with no memory limit.
+	ii. Add glyphs for two different fonts to the atlas.
+	iii. Check all glyphs for both fonts were successfully added.
+	iv. Call CGlyphAtlas::ReleaseFont for one of the fonts.
+	v. Check that there are no glyphs associated with the released font.
+	vi. Call CGlyphAtlas::ReleaseFont for the remaining font.
+	vii Check that there are no glyphs associated with the released font and 
+		that the atlas is empty.
+	viii Delete the glyph atlas.
+	
+@SYMTestExpectedResults
+	After each font is released, there are no glyphs associated with that font 
+	left in the atlas.
+*/
+void CTGlyphAtlas::TestFontReleased()
+	{
+	INFO_PRINTF1(_L("Test behaviour of CGlyphAtlas::FontReleased()"));
+
+	__UHEAP_MARK;
+	CGlyphAtlasTestWrapper* atlas = NULL;
+	TRAPD(ret, atlas = CGlyphAtlasTestWrapper::NewL(KGlyphAtlasNoCacheLimit));
+	TESTNOERROR(ret);
+	if (KErrNone != ret)
+		{
+		return;
+		}
+	TOpenFontCharMetrics charMetrics;
+	TGlyphImageInfo imageInfo;
+	TSize bitmapSize;
+	const TUint8* bitmapData = NULL;
+	CBitmapFont* bmFont = CTFbsFont::FontAddress(iFont);
+	CBitmapFont* bmFont2 = CTFbsFont::FontAddress(iFont2);
+	for (TInt glyphIndex = 0; glyphIndex < KNumGlyphCodesLatin; ++glyphIndex)
+		{
+		iFont->GetCharacterData(iGlyphCodesLatin[glyphIndex], charMetrics, bitmapData, bitmapSize);
+		CGlyphAtlas::TAddGlyphArgs args(bitmapData, iGlyphCodesLatin[glyphIndex], charMetrics);
+		TESTNOERROR(atlas->AddGlyph(*bmFont, args, imageInfo));
+
+		iFont2->GetCharacterData(iGlyphCodesLatin[KNumGlyphCodesLatin-1-glyphIndex], charMetrics, bitmapData, bitmapSize);
+		CGlyphAtlas::TAddGlyphArgs args2(bitmapData, iGlyphCodesLatin[glyphIndex], charMetrics);
+		TESTNOERROR(atlas->AddGlyph(*bmFont2, args2, imageInfo));
+		}
+	// check there are font entries for these 2 fonts
+	TEST(2 == atlas->FontCount());
+
+	// check actual number of glyphs in atlas for each font is as expected
+	TEST(KNumGlyphCodesLatin == atlas->GlyphCountByFont(bmFont));
+	TEST(KNumGlyphCodesLatin == atlas->GlyphCountByFont(bmFont2));
+	TEST(2*KNumGlyphCodesLatin == atlas->GlyphCount());
+
+	// release one font and check number of glyphs in atlas for each font 
+	// is as expected
+	atlas->FontReleased(*bmFont);
+	TEST(1 == atlas->FontCount());
+	TEST(0 == atlas->GlyphCountByFont(bmFont));
+	TEST(KNumGlyphCodesLatin == atlas->GlyphCountByFont(bmFont2));
+	TEST(KNumGlyphCodesLatin == atlas->GlyphCount());
+
+	// release one font and check number of glyphs in atlas for each font 
+	// is as expected
+	atlas->FontReleased(*bmFont2);
+	TEST(0 == atlas->FontCount());
+	TEST(0 == atlas->GlyphCountByFont(bmFont));
+	TEST(0 == atlas->GlyphCountByFont(bmFont2));
+	TEST(0 == atlas->GlyphCount());
+
+	delete atlas;
+
+	__UHEAP_MARKEND;
+	}
+
+
+
+//--------------
+__CONSTRUCT_STEP__(GlyphAtlas)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/tglyphatlas.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,60 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TGLYPHATLAS_H
+#define TGLYPHATLAS_H
+
+#include "test/TGraphicsHarness.h"
+
+/**
+Test class for the glyph data extensions RFbsGlyphDataIterator and 
+RFbsGlyphMetricsArray. Positive and negative tests
+*/
+class CTGlyphAtlas : public CTGraphicsBase
+	{
+public:
+	CTGlyphAtlas(CTestStep* aStep);
+	~CTGlyphAtlas();
+protected:
+//from 	CTGraphicsBase
+	virtual void RunTestCaseL(TInt aCurTestCase);
+	void ConstructL();
+	
+private:
+	// Test Cases
+	void TestFullCache();
+	void TestFontReleased();
+	
+private:
+	RFbsSession* iFbs;
+	CFbsTypefaceStore* iTs;
+	TUint* iGlyphCodesLatin;
+	CFbsFont* iFont;
+	CFbsFont* iFont2;
+	};
+
+
+class CTGlyphAtlasStep : public CTGraphicsStep
+	{
+public:
+	CTGlyphAtlasStep();
+protected:	
+	//from CTGraphicsStep
+	virtual CTGraphicsBase* CreateTestL();
+	};
+
+_LIT(KTGlyphAtlasStep,"TGlyphAtlas");
+
+#endif /* TGLYPHATLAS_H */
--- a/fbs/fontandbitmapserver/tfbs/tipctest.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/tipctest.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -13,10 +13,10 @@
 // Description:
 //
 
-#include "fbsmessage.h"
 #include "../sfbs/UTILS.H"
 #include "tipctest.h"
 #include "fbsdefs.h"
+#include "fbsmessage.h"
 
 // Invalid parameters to be passed in SendCommand() calls.
 const TInt KInvalidParam1 = 963955448;
@@ -75,59 +75,6 @@
 	
 	}
 
-/**
-	@SYMTestCaseID
-	GRAPHICS-FBSERV-0603
-
-	@SYMTestCaseDesc
-	Tests the sending of commands to a FbsSession 
-	server thru Inter Process Communication. Sends
-	both valid and invalid commands.
-
-	@SYMTestActions
-	Commands sent to the server:
-	1. EFbsMessShutdown
-	2. EFbsMessFontHeightInTwips
-	3. EFbsMessFontHeightInTwips
-	4. EFbsMessFontHeightInPixels
-	5. EFbsMessFontHeightInPixels
-	6. EFbsMessAddFontStoreFile
-	7. EFbsMessAddFontStoreFile
-	8. EFbsMessInstallFontStoreFile
-	9. EFbsMessInstallFontStoreFile
-	10. EFbsMessInstallFontStoreFile
-	11. EFbsMessBitmapCreate
-	12. EFbsMessRasterize
-	13. EFbsMessFaceAttrib
-	14. EFbsMessHasCharacter
-	15. EFbsMessFontNameAlias
-	16. EFbsMessGetNearestFontToDesignHeightInTwips
-	17. EFbsMessGetNearestFontToMaxHeightInTwips
-	18. EFbsMessGetNearestFontToDesignHeightInPixels
-	19. EFbsMessGetNearestFontToMaxHeightInPixels
-	20. EFbsMessShapeText
-	21. EFbsMessShapeDelete
-	22. EFbsMessSetTwipsHeight
-	23. EFbsMessGetTwipsHeight	
-	@SYMTestExpectedResults
-    Test should pass
-
-    @SYMTestCaseID
-    TI18N-GDI-CIT-4086
-
-    @SYMTestCaseDesc
-    Test if FBS can handle invalid messages correctly
-    and panic the client as needed.
-
-    @SYMTestActions
-	24. EFbsMessGetFontTable
-	25. EFbsMessReleaseFontTable
-	26. EFbsMessGetGlyphOutline
-	27.EFbsMessReleaseGlyphOutline
-	
-	@SYMTestExpectedResults
-	Test should pass
-*/
 void CTIPCTest::RunTestCaseL(TInt aCurTestCase)
 	{
 	_LIT(KCaseNumber, "CaseNumber");
@@ -141,172 +88,254 @@
 		
 	switch(aCurTestCase)
 		{
+	/**
+		@SYMTestCaseID
+		GRAPHICS-FBSERV-0603
+
+		@SYMTestCaseDesc
+		Tests the sending of commands to a FbsSession 
+		server thru Inter Process Communication. Sends
+		both valid and invalid commands.
+
+		@SYMTestActions
+		Commands sent to the server:
+		1. EFbsMessShutdown
+		2. EFbsMessFontHeightInTwips
+		3. EFbsMessFontHeightInTwips
+		4. EFbsMessFontHeightInPixels
+		5. EFbsMessFontHeightInPixels
+		6. EFbsMessAddFontStoreFile
+		7. EFbsMessAddFontStoreFile
+		8. EFbsMessInstallFontStoreFile
+		9. EFbsMessInstallFontStoreFile
+		10. EFbsMessInstallFontStoreFile
+		11. EFbsMessBitmapCreate
+		12. EFbsMessRasterize
+		13. EFbsMessFaceAttrib
+		14. EFbsMessHasCharacter
+		15. EFbsMessFontNameAlias
+		16. EFbsMessGetNearestFontToDesignHeightInTwips
+		17. EFbsMessGetNearestFontToMaxHeightInTwips
+		18. EFbsMessGetNearestFontToDesignHeightInPixels
+		19. EFbsMessGetNearestFontToMaxHeightInPixels
+		20. EFbsMessShapeText
+		21. EFbsMessShapeDelete
+		22. EFbsMessSetTwipsHeight
+		23. EFbsMessGetTwipsHeight
+		
+		@SYMTestExpectedResults
+		Test should pass
+	*/
 	case 1:
-		INFO_PRINTF1(_L("Shutdown\r\n"));
+		INFO_PRINTF1(_L("Shutdown"));
 		iFbs->SendCommand(EFbsMessShutdown);
 		TestComplete();
 		break;
 	case 2:
-		INFO_PRINTF1(_L("Height in twips with negative typeface index\r\n"));
+		INFO_PRINTF1(_L("Height in twips with negative typeface index"));
 		iFbs->SendCommand(EFbsMessFontHeightInTwips, -1);	
 		TEST(EFalse); // Previous line should have paniced 
 		TestComplete();
 		break;	
 	case 3:
-		INFO_PRINTF1(_L("Height in twips with invalid size\r\n"));
+		INFO_PRINTF1(_L("Height in twips with invalid size"));
 		iClient.SendInvalidSize(EFbsMessFontHeightInTwips);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 4:
-		INFO_PRINTF1(_L("Height in pixels with negative typeface index\r\n"));
+		INFO_PRINTF1(_L("Height in pixels with negative typeface index"));
 		iFbs->SendCommand(EFbsMessFontHeightInPixels, -1);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 5:
-		INFO_PRINTF1(_L("Height in pixels with invalid size\r\n"));
+		INFO_PRINTF1(_L("Height in pixels with invalid size"));
 		iClient.SendInvalidSize(EFbsMessFontHeightInPixels);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 6:
-		INFO_PRINTF1(_L("Add font store file with negative length\r\n"));
+		INFO_PRINTF1(_L("Add font store file with negative length"));
 		iFbs->SendCommand(EFbsMessAddFontStoreFile, 0, -1);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 7:
-		INFO_PRINTF1(_L("Add font store file with huge length\r\n"));
+		INFO_PRINTF1(_L("Add font store file with huge length"));
 		iFbs->SendCommand(EFbsMessAddFontStoreFile, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 8:
-		INFO_PRINTF1(_L("Install font store file with negative length\r\n"));
+		INFO_PRINTF1(_L("Install font store file with negative length"));
 		iFbs->SendCommand(EFbsMessInstallFontStoreFile, 0, -1);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 9:
-		INFO_PRINTF1(_L("Install font store file with huge length\r\n"));
+		INFO_PRINTF1(_L("Install font store file with huge length"));
 		iFbs->SendCommand(EFbsMessInstallFontStoreFile, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 10:
-		INFO_PRINTF1(_L("Remove font store file with active references\r\n"));
+		INFO_PRINTF1(_L("Remove font store file with active references"));
 		iFbs->SendCommand(EFbsMessRemoveFontStoreFile, 11);
 		// With PDEF121246 (INC120690) fix in place, this test will always pass. Without the fix there will be a KERN 4 panic.
 		TEST(ETrue); 
 		TestComplete();
 		break;
 	case 11:
-		INFO_PRINTF1(_L("Bitmap create with invalid display mode\r\n"));
+		INFO_PRINTF1(_L("Bitmap create with invalid display mode"));
 		iClient.SendInvalidDisplayMode(EFbsMessBitmapCreate);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 12:
-		INFO_PRINTF1(_L("Rasterize with invalid bitmap handle\r\n"));
+		INFO_PRINTF1(_L("Rasterize with invalid bitmap handle"));
 		iFbs->SendCommand(EFbsMessRasterize, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 13:
-		INFO_PRINTF1(_L("Face Attribute with invalid bitmap handle\r\n"));
+		INFO_PRINTF1(_L("Face Attribute with invalid bitmap handle"));
 		iFbs->SendCommand(EFbsMessFaceAttrib, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 14:
-		INFO_PRINTF1(_L("Has Character with invalid bitmap handle\r\n"));
+		INFO_PRINTF1(_L("Has Character with invalid bitmap handle"));
 		iFbs->SendCommand(EFbsMessHasCharacter, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 15:
-		INFO_PRINTF1(_L("Name Alias with huge alias name length\r\n"));
+		INFO_PRINTF1(_L("Name Alias with huge alias name length"));
 		iFbs->SendCommand(EFbsMessFontNameAlias, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 16:
-		INFO_PRINTF1(_L("Get nearest font to design height in twips with invalid typeface name length\r\n"));
+		INFO_PRINTF1(_L("Get nearest font to design height in twips with invalid typeface name length"));
 		iClient.SendInvalidNameLength(EFbsMessGetNearestFontToDesignHeightInTwips);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 17:
-		INFO_PRINTF1(_L("Get nearest font to max height in twips with invalid typeface name length\r\n"));
+		INFO_PRINTF1(_L("Get nearest font to max height in twips with invalid typeface name length"));
 		iClient.SendInvalidNameLength(EFbsMessGetNearestFontToMaxHeightInTwips);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 18:
-		INFO_PRINTF1(_L("Get nearest font to design height in pixels with invalid typeface name length\r\n"));
+		INFO_PRINTF1(_L("Get nearest font to design height in pixels with invalid typeface name length"));
 		iClient.SendInvalidNameLength(EFbsMessGetNearestFontToDesignHeightInPixels);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 19:
-		INFO_PRINTF1(_L("Get nearest font to max height in pixels with invalid typeface name length\r\n"));
+		INFO_PRINTF1(_L("Get nearest font to max height in pixels with invalid typeface name length"));
 		iClient.SendInvalidNameLength(EFbsMessGetNearestFontToMaxHeightInPixels);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 20:
-		INFO_PRINTF1(_L("Shape text with invalid bitmap font handle\r\n"));
+		INFO_PRINTF1(_L("Shape text with invalid bitmap font handle"));
 		iFbs->SendCommand(EFbsMessShapeText, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 21:
-		INFO_PRINTF1(_L("Shape delete with invalid bitmap font handle\r\n"));
+		INFO_PRINTF1(_L("Shape delete with invalid bitmap font handle"));
 		iFbs->SendCommand(EFbsMessShapeDelete, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 22:
-		INFO_PRINTF1(_L("Set twips height with invalid font handle\r\n"));
+		INFO_PRINTF1(_L("Set twips height with invalid font handle"));
 		iFbs->SendCommand(EFbsMessSetTwipsHeight, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;
 	case 23:
-		INFO_PRINTF1(_L("Get twips height with invalid font handle\r\n"));
-		((CTIPCTestStep*)iStep)->SetOverallTestStepID(_L("GRAPHICS-FBSERV-0603"));
-		((CTIPCTestStep*)iStep)->RecordTestResultL();
-		((CTIPCTestStep*)iStep)->CloseTMSGraphicsStep();
+		INFO_PRINTF1(_L("Get twips height with invalid font handle"));
 		iFbs->SendCommand(EFbsMessGetTwipsHeight, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse);
 		TestComplete();
 		break;	
 	case 24:
-		INFO_PRINTF1(_L("Get Font Table with wrong msg\r\n"));
-		iFbs->SendCommand(EFbsMessGetFontTable, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);   
-		TEST(EFalse); 
+		/**
+			@SYMTestCaseID	GRAPHICS-FBSERV-0630
+
+			@SYMTestCaseDesc
+			Tests that invalid font handle to EFbsMessGetGlyphs causes panic
+
+			@SYMTestExpectedResults
+			Client should panic with FBSERV -8
+		*/
+		INFO_PRINTF1(_L("Get glyphs from glyph atlas with invalid font handle"));
+		iFbs->SendCommand(EFbsMessGetGlyphs, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
+		TEST(EFalse);
 		TestComplete();
 		break;
 	case 25:
-		INFO_PRINTF1(_L("Release Font Table with wrong msg\r\n"));
-		iFbs->SendCommand(EFbsMessReleaseFontTable, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);   
-		TEST(EFalse); 
+		/**
+			@SYMTestCaseID	GRAPHICS-FBSERV-0670
+
+			@SYMTestCaseDesc
+			Tests that invalid font handle to EFbsMessGetGlyphMetrics causes panic
+
+			@SYMTestExpectedResults
+			Client should panic with FBSERV -8
+		*/
+		INFO_PRINTF1(_L("Get glyph metrics with invalid font handle"));
+		iFbs->SendCommand(EFbsMessGetGlyphMetrics, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
+		TEST(EFalse);
 		TestComplete();
-		break;    
+		break;
+	/**
+		@SYMTestCaseID
+		TI18N-GDI-CIT-4086
+
+		@SYMTestCaseDesc
+		Test if FBS can handle invalid messages correctly
+		and panic the client as needed.
+
+		@SYMTestActions
+		26. EFbsMessGetFontTable
+		27. EFbsMessReleaseFontTable
+		28. EFbsMessGetGlyphOutline
+		29. EFbsMessReleaseGlyphOutline
+	
+		@SYMTestExpectedResults
+		Test should pass
+	*/
 	case 26:
-		INFO_PRINTF1(_L("Get Glyph outline with wrong msg\r\n"));
-		iFbs->SendCommand(EFbsMessGetGlyphOutline,KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);   
+		INFO_PRINTF1(_L("Get Font Table with wrong msg"));
+		iFbs->SendCommand(EFbsMessGetFontTable, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse); 
 		TestComplete();
 		break;
 	case 27:
-		INFO_PRINTF1(_L("Release Glyph outline with wrong msg\r\n"));
-		iFbs->SendCommand(EFbsMessReleaseGlyphOutline, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);   
+		INFO_PRINTF1(_L("Release Font Table with wrong msg"));
+		iFbs->SendCommand(EFbsMessReleaseFontTable, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
 		TEST(EFalse); 
 		TestComplete();
 		break;
 	case 28:
+		INFO_PRINTF1(_L("Get Glyph outline with wrong msg"));
+		iFbs->SendCommand(EFbsMessGetGlyphOutline,KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
+		TEST(EFalse); 
+		TestComplete();
+		break;
+	case 29:
+		INFO_PRINTF1(_L("Release Glyph outline with wrong msg"));
+		iFbs->SendCommand(EFbsMessReleaseGlyphOutline, KInvalidParam1, KInvalidParam2, KInvalidParam3, KInvalidParam4);
+		TEST(EFalse); 
+		TestComplete();
+		break;
+	case 30:
 		TestComplete();
 		break;
 		}
--- a/fbs/fontandbitmapserver/tfbs/tipctest.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/tipctest.h	Wed Aug 18 11:05:09 2010 +0300
@@ -17,7 +17,7 @@
 #define __TIPCTest_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class RIPCTestFbservClient : public RSessionBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/trfile.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/trfile.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -20,7 +20,7 @@
 
 #include <fbs.h>
 #include <bitstd.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTFile : public CTGraphicsBase
 	{
--- a/fbs/fontandbitmapserver/tfbs/twdp.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/fbs/fontandbitmapserver/tfbs/twdp.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -17,7 +17,7 @@
 #define __TWDP_H__
 
 #include <fbs.h>
-#include "TGraphicsHarness.h"
+#include "test/TGraphicsHarness.h"
 
 class CTWDP : public CTGraphicsBase
 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/traces/OstTraceDefinitions.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,7 @@
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+//#define OST_TRACE_COMPILER_IN_USE
+#include <opensystemtrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/traces/fixed_id.definitions	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,18 @@
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_NORMAL=0x86
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_ADDGLYPH=0x4
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_ADDGLYPH_END1=0x7
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_ADDGLYPH_END2=0x5
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_ADDGLYPH_END3=0x6
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_DELETELEASTRECENTLYUSEDPAGE=0xb
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_DELETELEASTRECENTLYUSEDPAGE_END=0xc
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_FONTRELEASED=0x8
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_FONTRELEASED_END2=0x9
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_FONTRELEASED_END3=0xa
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_GETGLYPH=0x1
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_GETGLYPH_END1=0x3
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_GETGLYPH_END2=0x2
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_INSTATEGPUMEMORY=0x16
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_INSTATEGPUMEMORY_EXIT=0x17
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_RELEASEGPUMEMORY=0x14
+[TRACE]TRACE_NORMAL[0x86]_CGLYPHATLAS_RELEASEGPUMEMORY_EXIT=0x15
--- a/graphicsaccelaration/vgi/group/libvgi.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsaccelaration/vgi/group/libvgi.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -34,6 +34,8 @@
 
 OPTION_REPLACE ARMCC --cpu 5TE -O3 -Otime
 
+MACRO GRAPHICS_LIBVGI_DLL
+
 SOURCEPATH 		../src
 SOURCE			vgi.cpp
 
--- a/graphicsaccelaration/vgi/inc/vg/vgcontext.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsaccelaration/vgi/inc/vg/vgcontext.h	Wed Aug 18 11:05:09 2010 +0300
@@ -53,7 +53,11 @@
    VGI_COPY_TRANSPARENT_PIXELS,
 } VGICopyToTargetHint;
 
-#define VGI_API_CALL		__declspec(dllexport)
+#ifdef GRAPHICS_LIBVGI_DLL
+	#define VGI_API_CALL		__declspec(dllexport)
+#else
+	#define VGI_API_CALL		__declspec(dllimport)
+#endif
 
 #ifdef __cplusplus
 extern "C" {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displaychannel/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,32 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// bld.inf file for building OpenWF Display Channel
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../group/openwfc_ri_displaychannel.iby						/epoc32/rom/include/openwfc_ri_displaychannel.iby
+
+PRJ_MMPFILES
+../group/openwfc_ri_displaychannel.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displaychannel/group/graphics_openwfc_ri_displaychannel.mrp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,9 @@
+component	graphics_openwfc_ri_displaychannel
+
+source	\sf\os\graphics\graphicscomposition\openwfc_ri_displaychannel
+binary	\sf\os\graphics\graphicscomposition\openwfc_ri_displaychannel\group		all
+exports	\sf\os\graphics\graphicscomposition\openwfc_ri_displaychannel\group
+notes_source	\component_defs\release.src
+
+ipr O
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displaychannel/group/openwfc_ri_displaychannel.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,29 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+
+#ifndef __OPENWFC_RI_DISPLAYCHANNEL_IBY__
+#define __OPENWFC_RI_DISPLAYCHANNEL_IBY__
+
+REM openwfc_ri_display for Display Channel
+file=ABI_DIR\BUILD_DIR\openwfc_ri_displaychannel.dll				\sys\bin\openwfc_ri_display.dll
+
+#endif // __OPENWFC_RI_DISPLAYCHANNEL_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displaychannel/group/openwfc_ri_displaychannel.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,53 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// mmp file for display channel
+
+#ifdef WINS
+// Emulator cannot rename DLL, so it has to match the import library name
+TARGET			openwfc_ri_display.dll
+#else
+TARGET			openwfc_ri_displaychannel.dll
+#endif
+
+TARGETTYPE		dll
+UID				0x2002BC57 0x2002BC59
+// same capabilities as OpenWF-C RI
+CAPABILITY		PowerMgmt ReadDeviceData WriteDeviceData ProtServ		
+NOEXPORTLIBRARY
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+USERINCLUDE		../inc
+
+LIBRARY			euser.lib
+LIBRARY			WFCinterop.lib
+
+SOURCEPATH		../src
+SOURCE openwfc_ri_displaychannel.cpp
+
+#ifdef WINS
+deffile SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(def/win32/openwfc_ri_display.def)
+#else
+deffile SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(def/eabi/openwfc_ri_display.def)
+#endif
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displaychannel/inc/openwfc_ri_displaychannel.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,69 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// Display Screen Interface implementation for Display Channel
+// 
+//
+
+#ifndef OPENWFC_RI_DISPLAYCHANNEL_H
+#define OPENWFC_RI_DISPLAYCHANNEL_H
+
+#include <WF/openwfc_ri_display.h>
+#include <dispchannel.h>
+
+NONSHARABLE_CLASS(COpenWFC_RI_DisplayChannel) : public COpenWFC_RI_Display
+    {
+public:
+    ~COpenWFC_RI_DisplayChannel();
+    static COpenWFC_RI_DisplayChannel* NewL(TUint aScreen);
+public:
+    TInt GetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize);
+    TInt SetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize);
+    TInt CommitAttribute();
+    TInt SetLayerSurface(TInt aLayer, SymbianStreamType aStream,TInt* aNonTrivialAttribs);
+    TInt UpdateDisplay();
+    TInt SetTopLayerSurface(SymbianStreamType aStream,TInt* aNonTrivialAttribs);
+    
+private:    
+    COpenWFC_RI_DisplayChannel(TUint aScreen);
+    void ConstructL();
+private:
+    struct TBufferAddress
+        {
+        RChunk  iChunk;
+        TInt    iOffset;
+        TUint8* iAddress;
+        };
+private:
+    TUint iScreenNumber;
+    TInt iRotationOffset;
+    RDisplayChannel::TDisplayRotation iDefaultRotation;
+    TScreenGeometryAttribute iScreenInfo;
+    RArray <TBufferAddress*> iCompositionBuffer;
+    RDisplayChannel iDispChan;
+    TScreenRotation iNewRotation;
+    SymbianStreamType iCurrentSceneStream;
+public:
+    static const TInt32 KImplementationVersion = 0x00000001;
+    };
+
+#endif // OPENWFC_RI_DISPLAYCHANNEL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displaychannel/src/openwfc_ri_displaychannel.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,466 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// Display Adaptation Interface Implementation for Display channel
+// 
+//
+
+#include "openwfc_ri_displaychannel.h"
+#include <e32debug.h>
+#include <hal.h>
+
+_LIT(KDisplayChannelLdd, "display0.ldd");
+const TUint32 KDefaultScreenNumber = 0;
+
+#ifdef _DEBUG
+void Panic(TInt aPanic)
+    {
+    _LIT(KPanic, "DA-DC");
+    User::Panic(KPanic, aPanic);
+    }
+#endif
+
+EXPORT_C COpenWFC_RI_Display* COpenWFC_RI_Display::NewL(TUint aScreen)
+    {
+    return COpenWFC_RI_DisplayChannel::NewL(aScreen);
+    }
+
+EXPORT_C TUint32 COpenWFC_RI_Display::DefaultScreenNumber()
+    {
+    return KDefaultScreenNumber;
+    }
+    
+COpenWFC_RI_DisplayChannel::COpenWFC_RI_DisplayChannel(TUint aScreen):
+iScreenNumber(aScreen),
+iCurrentSceneStream(SYMBIAN_INVALID_HANDLE)
+    {
+    }
+
+COpenWFC_RI_DisplayChannel* COpenWFC_RI_DisplayChannel::NewL(TUint aScreen)
+    {
+    COpenWFC_RI_DisplayChannel* screenContext = new(ELeave) COpenWFC_RI_DisplayChannel(aScreen);
+    CleanupStack::PushL(screenContext);
+    screenContext->ConstructL();
+    CleanupStack::Pop(screenContext);
+    return screenContext;
+    }
+
+COpenWFC_RI_DisplayChannel::~COpenWFC_RI_DisplayChannel()
+    {
+    TInt count = iCompositionBuffer.Count();
+    for(TInt ii = 0; ii < count; ++ii)
+        {
+        TBufferAddress* addr = iCompositionBuffer[ii];
+        if (addr)
+            {
+            addr->iChunk.Close();
+            delete addr;
+            }
+        }
+    iCompositionBuffer.Close();
+    // We do not need to use this boolean
+    TBool unused;
+    // Reset the initial rotation for next time.
+    iDispChan.SetRotation(iDefaultRotation, unused);
+    iDispChan.Close();
+    }
+
+void COpenWFC_RI_DisplayChannel::ConstructL()
+    {
+    TInt err = User::LoadLogicalDevice(KDisplayChannelLdd);
+    if (err != KErrNone && err != KErrAlreadyExists)
+        {
+        User::Leave(err);
+        }
+    
+    User::LeaveIfError(iDispChan.Open(iScreenNumber));
+#ifdef __WINS__
+    iScreenInfo.iDefaultRotation = EScreenRotate0;
+    iDefaultRotation = RDisplayChannel::ERotationNormal;
+    iRotationOffset = 0;
+#else
+    iScreenInfo.iDefaultRotation = EScreenRotate270;
+    iDefaultRotation = RDisplayChannel::ERotation270CW;
+    iRotationOffset = 3;
+#endif
+    RDisplayChannel::TDisplayRotation rotation = iDispChan.CurrentRotation();
+    switch (rotation)
+        {
+        case RDisplayChannel::ERotationNormal:
+            iScreenInfo.iCurrentRotation = EScreenRotate0;
+            break;
+        case RDisplayChannel::ERotation90CW:
+            iScreenInfo.iCurrentRotation = EScreenRotate90;
+            break;
+        case RDisplayChannel::ERotation180:
+            iScreenInfo.iCurrentRotation = EScreenRotate180;
+            break;
+        case RDisplayChannel::ERotation270CW:
+            iScreenInfo.iCurrentRotation = EScreenRotate270;
+            break;
+        default:
+            RDebug::Printf("COpenWFC_RI_DisplayChannel::ConstructL() unsupported rotation %d", rotation);
+            User::Leave(KErrNotSupported);
+        }
+    
+    iNewRotation = iScreenInfo.iCurrentRotation;
+    TPckgBuf<RDisplayChannel::TDisplayInfo> pkgInfo;
+    iDispChan.GetDisplayInfo(pkgInfo);
+    RDisplayChannel::TDisplayInfo info = pkgInfo();
+    /* Note that in theory other formats could be supported for composition 
+     * (eg  EUidPixelFormatARGB_8888 | EUidPixelFormatARGB_8888_PRE )
+     * So long as the background colour is opaque then the final composed image should end up opaque,
+     * so compatible with alpha modes.
+     * However, it would give problems for fastpathing, where alpha byte should be ignored,
+     * probably fastpath would need to be disabled.
+     * At present we only care about PlatSim, 
+     * and it is unlikely that any platform will NOT support xrgb32,
+     * so it is better to assert the capabilities match than think about this hypothetical case too hard.  
+     */
+    if (info.iPixelFormat != EUidPixelFormatXRGB_8888)
+        {
+        RDebug::Printf("COpenWFC_RI_DisplayChannel::ConstructL() unsupported pixel format 0x%08.8x", info.iPixelFormat);
+        User::Leave(KErrNotSupported);
+        }
+
+    iScreenInfo.iPixelFormat = EUidPixelFormatXRGB_8888;
+    iScreenInfo.iSupportedRotations = info.iAvailableRotations;
+    
+    TInt bytesPerPixel = 4;
+    if((info.iBitsPerPixel != 24) && (info.iBitsPerPixel != 32))
+        {
+        RDebug::Printf("COpenWFC_RI_DisplayChannel::ConstructL()unexpected bpp value %d", info.iBitsPerPixel);
+        }
+    
+    iScreenInfo.iBytesPerPixel = bytesPerPixel;
+    
+    if (iRotationOffset & 1)
+        {
+        // Either 90 or 270 degree rotation, so reverse the normal and flipped
+        // sizes (which relate to zero degrees rotation).
+        iScreenInfo.iNormalWidth = info.iFlipped.iWidth;
+        iScreenInfo.iNormalHeight = info.iFlipped.iHeight;
+        iScreenInfo.iNormalStride = info.iFlipped.iOffsetBetweenLines;
+        iScreenInfo.iFlippedWidth = info.iNormal.iWidth;
+        iScreenInfo.iFlippedHeight = info.iNormal.iHeight;
+        iScreenInfo.iFlippedStride = info.iNormal.iOffsetBetweenLines;
+        }
+    else
+        {
+        iScreenInfo.iNormalWidth = info.iNormal.iWidth;
+        iScreenInfo.iNormalHeight = info.iNormal.iHeight;
+        iScreenInfo.iNormalStride = info.iNormal.iOffsetBetweenLines;
+        iScreenInfo.iFlippedWidth = info.iFlipped.iWidth;
+        iScreenInfo.iFlippedHeight = info.iFlipped.iHeight;
+        iScreenInfo.iFlippedStride = info.iFlipped.iOffsetBetweenLines;
+        }
+        
+    if (iScreenInfo.iNormalStride < 0)
+        {
+        iScreenInfo.iNormalStride = bytesPerPixel * iScreenInfo.iNormalWidth;
+        }
+    if (iScreenInfo.iFlippedStride < 0)
+        {
+        iScreenInfo.iFlippedStride = bytesPerPixel * iScreenInfo.iFlippedWidth;
+        }
+    
+    for(TInt i = 0; i < info.iNumCompositionBuffers; ++i)
+        {
+        iCompositionBuffer.AppendL(NULL);
+        TBufferAddress* address = new(ELeave) TBufferAddress;
+        iCompositionBuffer[i] = address;
+        User::LeaveIfError(iDispChan.GetCompositionBufferInfo(i, address->iChunk, address->iOffset));
+        address->iAddress = address->iChunk.Base() + address->iOffset;
+        }
+    }
+
+TInt COpenWFC_RI_Display::GetAttributeSize(TUint aAttributeId)
+    {
+    switch (aAttributeId)
+        {
+        case EScreenAttributeImplementationVersion:
+        case EScreenAttributePixelFormat:
+        case EScreenAttributeBytesPerPixel:
+        case EScreenAttributeSupportedRotation:
+        case EScreenAttributeNormalWidth:
+        case EScreenAttributeNormalHeight:
+        case EScreenAttributeNormalStride:
+        case EScreenAttributeFlippedWidth:
+        case EScreenAttributeFlippedHeight:
+        case EScreenAttributeFlippedStride:
+        case EScreenAttributeDefaultRotation:
+        case EScreenAttributeCurrentRotation:
+            return sizeof(TUint32);
+         
+        case EScreenAttributeScreenGeometry:
+            return sizeof(TScreenGeometryAttribute);
+            
+        default:
+            return 0;
+        }
+    }
+
+TInt COpenWFC_RI_DisplayChannel::GetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize)
+    {
+    TInt parameterSize = GetAttributeSize(aAttributeId);
+
+    if (aAttribute == NULL)
+        {
+        return KErrArgument;
+        }
+    
+    if (parameterSize == 0) 
+        {
+        return KErrNotSupported;
+        }
+    
+    if (aAttributeSize != parameterSize)
+        {
+        return KErrArgument;
+        }
+    
+    switch (aAttributeId)
+        {
+        case EScreenAttributeImplementationVersion:
+            *((TUint32*)aAttribute) = KImplementationVersion;
+            break;
+        case EScreenAttributePixelFormat:
+            *((TUint32*)aAttribute) = iScreenInfo.iPixelFormat;
+            break;            
+        case EScreenAttributeBytesPerPixel:
+            *((TUint32*)aAttribute) = iScreenInfo.iBytesPerPixel;
+            break;
+        case EScreenAttributeSupportedRotation:
+            *((TUint32*)aAttribute) = iScreenInfo.iSupportedRotations;
+            break;
+        case EScreenAttributeNormalWidth:
+            *((TUint32*)aAttribute) = iScreenInfo.iNormalWidth;
+            break;
+        case EScreenAttributeNormalHeight:
+            *((TUint32*)aAttribute) = iScreenInfo.iNormalHeight;
+            break;
+        case EScreenAttributeNormalStride:
+            *((TUint32*)aAttribute) = iScreenInfo.iNormalStride;
+            break;
+        case EScreenAttributeFlippedWidth:
+            *((TUint32*)aAttribute) = iScreenInfo.iFlippedWidth;
+            break;
+        case EScreenAttributeFlippedHeight:
+            *((TUint32*)aAttribute) = iScreenInfo.iFlippedHeight;
+            break;
+        case EScreenAttributeFlippedStride:
+            *((TUint32*)aAttribute) = iScreenInfo.iFlippedStride;
+            break;
+        case EScreenAttributeDefaultRotation:
+            *((TUint32*)aAttribute) = iScreenInfo.iDefaultRotation;
+            break;
+        case EScreenAttributeCurrentRotation:
+            *((TUint32*)aAttribute) = iScreenInfo.iCurrentRotation;
+            break;
+        case EScreenAttributeScreenGeometry:
+            *((TScreenGeometryAttribute*)aAttribute) = iScreenInfo;
+            break;
+        default:
+            return KErrNotSupported;
+        }
+    
+    return KErrNone;
+    }
+
+
+TInt COpenWFC_RI_DisplayChannel::SetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize)
+    {
+    // the only parameter we can modify is the current rotation
+    TInt parameterSize = GetAttributeSize(aAttributeId);
+
+    if (aAttributeSize != parameterSize || aAttribute == NULL)
+        {
+        return KErrArgument;
+        }
+    
+    switch (aAttributeId)
+        {
+        case EScreenAttributeCurrentRotation:
+            iNewRotation = static_cast<TScreenRotation>(*((TUint32*)aAttribute));
+            break;
+        default:
+            return KErrNotSupported;
+        }
+    return KErrNone;
+    }
+
+
+TInt COpenWFC_RI_DisplayChannel::CommitAttribute()
+    {
+    // For DisplayChannel the new screen attributes must be applied
+    // at the same time with the composition.
+    if (iScreenInfo.iCurrentRotation != iNewRotation)
+        {
+        TInt totalRotation;
+        RDisplayChannel::TDisplayRotation dcRotation;
+
+        // Change the rotation to a numeric index from zero
+        switch (iNewRotation)
+            {
+            case EScreenRotate90:
+                totalRotation = 1;
+                break;
+            case EScreenRotate180:
+                totalRotation = 2;
+                break;
+            case EScreenRotate270:
+                totalRotation = 3;
+                break;
+            case EScreenRotate0:
+            default:
+                __ASSERT_DEBUG(iNewRotation == EScreenRotate0, Panic(__LINE__));
+                totalRotation = 0;
+                break;
+            }
+
+        // Add the initial rotation of the device and wrap to get final one.
+        totalRotation = (totalRotation + iRotationOffset) % 4;
+
+        // Now change the final rotation to the display channel rotation
+        switch (totalRotation)
+            {
+            case 1:
+                dcRotation = RDisplayChannel::ERotation90CW;
+                break;
+            case 2:
+                dcRotation = RDisplayChannel::ERotation180;
+                break;
+            case 3:
+                dcRotation = RDisplayChannel::ERotation270CW;
+                break;
+            case 0:
+            default:
+                __ASSERT_DEBUG(totalRotation == 0, Panic(__LINE__));
+                dcRotation = RDisplayChannel::ERotationNormal;
+                break;
+            }
+
+        if (!(iScreenInfo.iSupportedRotations & dcRotation))
+            {
+            return KErrNotSupported;
+            }
+        
+        // We do not need to use this boolean
+        TBool displayConfigChanged;
+        TInt err = iDispChan.SetRotation(dcRotation, displayConfigChanged);
+        __ASSERT_DEBUG(err == KErrNone, Panic(__LINE__));
+        if (err == KErrNone)
+            {
+            iScreenInfo.iCurrentRotation = iNewRotation;
+            }
+        else
+            {
+            return err;
+            }
+        }
+    return KErrNone;
+    }
+
+TInt COpenWFC_RI_DisplayChannel::SetLayerSurface(TInt aLayer, SymbianStreamType aStream,TInt* aNonTrivialAttribs)
+    {
+    // display channel interface can be seen as mono-layered
+    if (aLayer != 0)
+        {
+        return KErrArgument;
+        }
+    if (aNonTrivialAttribs && *aNonTrivialAttribs)
+        {
+        return KErrNotSupported;
+        }
+    TBool acceptable=ETrue;
+    khronos_int32_t format,pixSize;
+    SymbianStreamGetHeader(aStream,NULL,NULL,NULL,&format,&pixSize);
+    if (format!=EUidPixelFormatARGB_8888 && format!=EUidPixelFormatARGB_8888_PRE && format!=EUidPixelFormatXRGB_8888)
+        {
+        acceptable=EFalse;
+        }
+            
+    if (!acceptable)
+        {
+        return KErrNotSupported;
+        }
+    
+    iCurrentSceneStream = aStream;
+    return KErrNone;
+    }
+
+TInt COpenWFC_RI_DisplayChannel::SetTopLayerSurface(SymbianStreamType aStream,TInt* aNonTrivialAttribs)
+    {
+    return SetLayerSurface(KTopMostLayer, aStream,aNonTrivialAttribs);
+    }
+
+TInt COpenWFC_RI_DisplayChannel::UpdateDisplay()
+    {
+    // The solution is suboptimal because a blit is used insteat of posting a user buffer
+    // The solution is more simpler and because the emulator is to be phased-out soon,
+    // there is no much incentive in complicating the code
+    TInt err;
+    
+    TUint bufferIndex;
+    TRequestStatus status;
+    iDispChan.GetCompositionBuffer(bufferIndex, status);
+    User::WaitForRequest(status);
+    
+    err = status.Int();
+    if (err != KErrNone || bufferIndex >= iCompositionBuffer.Count()) 
+        {
+        return KErrGeneral;
+        }
+    
+    TUint8* firstPixelAddr = iCompositionBuffer[bufferIndex]->iAddress;
+    
+    // Only 32 or 16bpp supported and assume stride == width * pixel size
+    TInt size = 0;
+    if (iNewRotation == EScreenRotate0 || iNewRotation == EScreenRotate180)
+        {
+        size = iScreenInfo.iNormalHeight * iScreenInfo.iNormalStride; 
+        }
+    else
+        {
+        size = iScreenInfo.iFlippedHeight * iScreenInfo.iFlippedStride; 
+        }
+    SymbianStreamBuffer frontBuffer;
+    SymbianStreamAcquireReadBuffer(iCurrentSceneStream, &frontBuffer);
+    void* pixelDataPtr = NULL;
+    SymbianStreamGetBufferPointer(iCurrentSceneStream, frontBuffer,&pixelDataPtr);
+    Mem::Move(firstPixelAddr, pixelDataPtr, size);
+    RDisplayChannel::TPostCount postCount;
+    err = iDispChan.PostCompositionBuffer(NULL, postCount);
+    if (err == KErrNone)
+        {
+        // This will throttle composition more than necessary,
+        // since it will wait until buffer is being displayed
+        iDispChan.WaitForPost(postCount, status);
+        User::WaitForRequest(status);
+        err = status.Int();
+        }
+    
+    SymbianStreamReleaseReadBuffer(iCurrentSceneStream, frontBuffer);
+
+    return err;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displayupdater/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,32 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// bld.inf file for building OpenWF Display Updater
+
+PRJ_PLATFORMS
+ARMV5 ARMV5SMP
+
+PRJ_EXPORTS
+../group/openwfc_ri_displayupdater.iby						/epoc32/rom/include/openwfc_ri_displayupdater.iby
+
+PRJ_MMPFILES
+../group/openwfc_ri_displayupdater.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displayupdater/group/graphics_openwfc_ri_displayupdater.mrp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,8 @@
+component	graphics_openwfc_ri_displayupdater
+
+source	\sf\os\graphics\graphicscomposition\openwfc_ri_displayupdater
+binary	\sf\os\graphics\graphicscomposition\openwfc_ri_displayupdater\group		all
+exports	\sf\os\graphics\graphicscomposition\openwfc_ri_displayupdater\group
+notes_source	\component_defs\release.src
+
+ipr O
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displayupdater/group/openwfc_ri_displayupdater.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,29 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+
+#ifndef __OPENWFC_RI_DISPLAYUPDATER_IBY__
+#define __OPENWFC_RI_DISPLAYUPDATER_IBY__
+
+REM openwfc_ri_display
+file=ABI_DIR\BUILD_DIR\openwfc_ri_displayupdater.dll				\sys\bin\openwfc_ri_display.dll
+
+#endif // __OPENWFC_RI_DISPLAYUPDATER_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displayupdater/group/openwfc_ri_displayupdater.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,55 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// mmp file for display updater
+
+#include <non_foundation_paths.hrh>
+
+//MACRO ENABLE_LOGGING
+
+TARGET			openwfc_ri_displayupdater.dll
+
+TARGETTYPE		dll
+UID				0x2002BC57 0x2002BC5A
+
+// same capabilities as OpenWF-C RI
+CAPABILITY		PowerMgmt ReadDeviceData WriteDeviceData ProtServ		
+NOEXPORTLIBRARY
+
+OS_LAYER_SYSTEMINCLUDE
+NON_FOUNDATION_ADAPT_LAYER_SYSTEMINCLUDE
+
+USERINCLUDE		../inc
+
+LIBRARY			euser.lib
+LIBRARY			hal.lib
+LIBRARY			WFCinterop.lib
+LIBRARY			display_updater.lib
+LIBRARY			surfacemanager.lib
+
+SOURCEPATH		../src
+SOURCE openwfc_ri_displayupdater.cpp
+
+deffile SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(def/eabi/openwfc_ri_display.def)
+
+SMPSAFE
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displayupdater/inc/openwfc_ri_displayupdater.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,69 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// Display Interface implementation for Display Updater
+// 
+//
+
+#ifndef OPENWFC_RI_DISPLAYUPDATER_H
+#define OPENWFC_RI_DISPLAYUPDATER_H
+
+#include <WF/openwfc_ri_display.h>
+#include <internal/display_updater.h>
+#include <graphics/surfacemanager.h>
+
+NONSHARABLE_CLASS(COpenWFC_RI_DisplayUpdater) : public COpenWFC_RI_Display
+    {
+public:
+    ~COpenWFC_RI_DisplayUpdater();
+    static COpenWFC_RI_DisplayUpdater* NewL(TUint aScreen);
+public:
+    TInt GetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize);
+    TInt SetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize);
+    TInt CommitAttribute();
+    TInt SetLayerSurface(TInt aLayer, SymbianStreamType aStream,TInt* aNonTrivialAttribs);
+    TInt UpdateDisplay();
+    TInt SetTopLayerSurface(SymbianStreamType aStream,TInt* aNonTrivialAttribs);
+    
+private:    
+    COpenWFC_RI_DisplayUpdater(TUint aScreen);
+    void ConstructL();
+private:
+    TUint iScreenNumber;
+    TInt iRotationOffset;
+    TDispRotation iDefaultRotation;
+    TDispRotation iCurrentRotation;
+    TScreenGeometryAttribute iScreenInfo;
+    CDisplayUpdater* iDisplayUpdater;
+    TScreenRotation iNewRotation;
+    SymbianStreamType iCurrentSceneStream;
+    SymbianStreamBuffer iCurrentReadBuffer;
+    SymbianStreamType iNextSceneStream;
+    SymbianStreamBuffer iNextReadBuffer;
+    RSurfaceManager iSurfaceManager;
+public:
+    static const TInt32 KImplementationVersion = 0x00000001;
+private:
+    const static TUint32 KTopMostLayer = 0;
+    };
+
+#endif // OPENWFC_RI_DISPLAYUPDATER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfc_ri_displayupdater/src/openwfc_ri_displayupdater.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,527 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
+// Description:
+// Display Adaptation Interface Implementation for Display Updater
+// 
+//
+
+#include "openwfc_ri_displayupdater.h"
+#include <e32debug.h>
+#include <hal.h>
+
+#if defined(ENABLE_LOGGING)
+#define LOG(X)  RDebug::Printf X
+#else
+#define LOG(X)
+#endif
+
+// #define LOG_DISPLAY_PROPERTIES
+
+const TUint32 KDefaultScreenNumber = 0;
+
+#ifdef _DEBUG
+void Panic(TInt aPanic)
+    {
+    _LIT(KPanic, "DA-DU");
+    User::Panic(KPanic, aPanic);
+    }
+#endif
+
+EXPORT_C COpenWFC_RI_Display* COpenWFC_RI_Display::NewL(TUint aScreen)
+    {
+    return COpenWFC_RI_DisplayUpdater::NewL(aScreen);
+    }
+
+EXPORT_C TUint32 COpenWFC_RI_Display::DefaultScreenNumber()
+    {
+    return KDefaultScreenNumber;
+    }
+    
+COpenWFC_RI_DisplayUpdater::COpenWFC_RI_DisplayUpdater(TUint aScreen):
+iScreenNumber(aScreen),
+iDisplayUpdater(NULL),
+iCurrentSceneStream(SYMBIAN_INVALID_HANDLE),
+iCurrentReadBuffer(SYMBIAN_INVALID_HANDLE),
+iNextSceneStream(SYMBIAN_INVALID_HANDLE),
+iNextReadBuffer(SYMBIAN_INVALID_HANDLE)
+    {
+    }
+
+COpenWFC_RI_DisplayUpdater* COpenWFC_RI_DisplayUpdater::NewL(TUint aScreen)
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::NewL(%d)", aScreen));
+    COpenWFC_RI_DisplayUpdater* screenContext = new(ELeave) COpenWFC_RI_DisplayUpdater(aScreen);
+    CleanupStack::PushL(screenContext);
+    screenContext->ConstructL();
+    CleanupStack::Pop(screenContext);
+    LOG((" --- COpenWFC_RI_DisplayUpdater::NewL(%d) : 0x%X", aScreen, screenContext));
+    return screenContext;
+    }
+
+COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater()
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater(%d)", iScreenNumber));
+    if (iDisplayUpdater)
+        {
+        TDisplayViewSettings viewSettings;  // DEFAULT
+        TBufferInfo bufferInfo; // DEFAULT
+        TInt err = KErrNone;
+
+        // Set to default view to release layer
+        err = iDisplayUpdater->SetView(KTopMostLayer, viewSettings, bufferInfo);
+        if (err != KErrNone)
+            {
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater()ERROR: Display update set view failed %d", err));
+            }
+
+        TRequestStatus completedWhenReady = KRequestPending;
+        LOG(("\n  +++ COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater() FLUSHING *******\n"));
+        iDisplayUpdater->Flush(completedWhenReady);
+        LOG(("\n  +++ COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater() AFTER FLUSHING ******* 2\n"));
+        User::WaitForRequest(completedWhenReady);
+        LOG(("\n  +++ COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater() FLUSHING:REQUEST COMPLETED %d*******\n", completedWhenReady.Int()));
+
+        if (iCurrentSceneStream != SYMBIAN_INVALID_HANDLE && iCurrentReadBuffer != SYMBIAN_INVALID_HANDLE)
+            {
+            SymbianStreamReleaseReadBuffer(iCurrentSceneStream, iCurrentReadBuffer);
+            }
+        if (iNextSceneStream != SYMBIAN_INVALID_HANDLE && iNextReadBuffer != SYMBIAN_INVALID_HANDLE)
+            {
+            SymbianStreamReleaseReadBuffer(iNextSceneStream, iNextReadBuffer);
+            }
+        }
+    delete iDisplayUpdater;
+    iSurfaceManager.Close();
+    LOG((" --- COpenWFC_RI_DisplayUpdater::~COpenWFC_RI_DisplayUpdater() completed"));    
+    }
+
+void COpenWFC_RI_DisplayUpdater::ConstructL()
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::ConstructL"));
+    User::LeaveIfError(iSurfaceManager.Open());
+    iDisplayUpdater = CDisplayUpdater::NewL(iScreenNumber);
+    iScreenInfo.iDefaultRotation = EScreenRotate0;
+    iDefaultRotation = ERotate0Deg;
+    iCurrentRotation = ERotate0Deg;
+    iRotationOffset = 0;
+    iScreenInfo.iCurrentRotation = EScreenRotate0;
+    iNewRotation = iScreenInfo.iCurrentRotation;
+    
+    TDisplayDrvInfo displayInfo;
+    iDisplayUpdater->GetDisplayProperties(displayInfo);
+
+#if defined(LOG_DISPLAY_PROPERTIES)
+    LOG((" ??? Display resolution (%d,%d)", displayInfo.iPanelResolution.iWidth, displayInfo.iPanelResolution.iHeight));
+    LOG((" ??? Display twips (%d,%d)", displayInfo.iPanelTwips.iWidth, displayInfo.iPanelTwips.iHeight));
+    LOG((" ??? Display refresh rate %dHz", displayInfo.iPanelRefreshRateHz));
+    LOG((" ??? Display %d internal composition buffers", (TInt)displayInfo.iNumberOfBuffers));
+    LOG((" ??? Display pixel formats: 0x%08.8X", (TInt)displayInfo.iSupportedFormats));
+    LOG((" ??? Display pixel aspect ratio %d/%d", (TInt)displayInfo.iPixelAspectRNumerator, (TInt)displayInfo.iPixelAspectRDenominator));
+    LOG((" ??? Display supported per-layer rotations: 0x%08.8X", (TInt)displayInfo.iSupportedPerLayerRotations));
+    LOG((" ??? Display rotation works with: 0x%08.8X", (TInt)displayInfo.iRotationWorksWithTheseFeatures));
+    LOG((" ??? Display scaling works with: 0x%08.8X", (TInt)displayInfo.iScalingWorksWithTheseFeatures));
+    LOG((" ??? Display minimum scaling: 100/%d", (TInt)displayInfo.iScalingMinDenominator));
+    LOG((" ??? Display maximum scaling: %d/100", (TInt)displayInfo.iScalingMaxNumerator));
+    LOG((" ??? Display maximum overlays: %d", (TInt)displayInfo.iNumberOfOverlays));
+    LOG((" ??? Display colour space: 0x%08.8X", (TInt)displayInfo.iDestinationColorSpace));
+    LOG((" ??? Display colour coords: (%d,%d)R (%d,%d)G (%d,%d)B (%d,%d)W",
+            displayInfo.iDestinationColorCoordinates.iRed.iX, displayInfo.iDestinationColorCoordinates.iRed.iY,
+            displayInfo.iDestinationColorCoordinates.iGreen.iX, displayInfo.iDestinationColorCoordinates.iGreen.iY,
+            displayInfo.iDestinationColorCoordinates.iBlue.iX, displayInfo.iDestinationColorCoordinates.iBlue.iY,
+            displayInfo.iDestinationColorCoordinates.iWhite.iX, displayInfo.iDestinationColorCoordinates.iWhite.iY));
+    LOG((" ??? Display direct buffer display: %d", (TInt)displayInfo.iGivenBufferWorksAsFrameBuffer));
+    LOG((" ??? Display variable resolution: %d", (TInt)displayInfo.iVariableResolution));
+    LOG((" ??? Display draw overscan: %d", (TInt)displayInfo.iOverscanToBeDrawn));
+    LOG((" ??? Display is on: %d", (TInt)displayInfo.iDisplayOn));
+#endif
+
+    TInt supportedFormats = displayInfo.iSupportedFormats;
+    /* Note that in theory other formats could be supported for composition 
+     * (eg  EPixelFormatARgb8888Le | EPixelFormatARgb8888LeP )
+     * So long as the background colour is opaque then the final compiosed image should end up opaque,
+     * so compatible with alpha modes.
+     * However, it would give problems for fastpathing, where alpha byte should be ignored,
+     * probably fastpath would need to be disabled.
+     * At present we only care about PlatSim, 
+     * and it is unlikely that any platform will NOT support xrgb32,
+     * so it is better to assert the capabilities match than think about this hypothetical case too hard.  
+     */
+    if (supportedFormats & (EPixelFormatXRgb8888Le ))
+        {
+        iScreenInfo.iPixelFormat = EUidPixelFormatXRGB_8888;
+        iScreenInfo.iBytesPerPixel = 4;
+        }
+    else
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::ConstructL() unsupported pixel formats 0x%08.8x", supportedFormats));
+        User::Leave(KErrNotSupported);
+        }
+
+    iScreenInfo.iPixelFormat = EUidPixelFormatXRGB_8888;
+    if (displayInfo.iRotationWorksWithTheseFeatures & EFeatureExternalBuf)
+        {
+        iScreenInfo.iSupportedRotations = displayInfo.iSupportedPerLayerRotations & 0x0f;
+        }
+    else
+        {
+        LOG((" +++ COpenWFC_RI_DisplayUpdater::ConstructL() fixed output rotation"));
+        iScreenInfo.iSupportedRotations = (TInt32)ERotate0Deg;
+        }
+    
+    iScreenInfo.iNormalWidth = displayInfo.iPanelResolution.iWidth;
+    iScreenInfo.iNormalHeight = displayInfo.iPanelResolution.iHeight;
+    iScreenInfo.iFlippedWidth = iScreenInfo.iNormalHeight;
+    iScreenInfo.iFlippedHeight = iScreenInfo.iNormalWidth;
+        
+    iScreenInfo.iNormalStride = iScreenInfo.iBytesPerPixel * iScreenInfo.iNormalWidth;
+    iScreenInfo.iFlippedStride = iScreenInfo.iBytesPerPixel * iScreenInfo.iFlippedWidth;
+    LOG((" --- COpenWFC_RI_DisplayUpdater::ConstructL"));
+    }
+
+TInt COpenWFC_RI_Display::GetAttributeSize(TUint aAttributeId)
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::GetAttributeSize(%d)", aAttributeId));
+    switch (aAttributeId)
+        {
+        case EScreenAttributeImplementationVersion:
+        case EScreenAttributePixelFormat:
+        case EScreenAttributeBytesPerPixel:
+        case EScreenAttributeSupportedRotation:
+        case EScreenAttributeNormalWidth:
+        case EScreenAttributeNormalHeight:
+        case EScreenAttributeNormalStride:
+        case EScreenAttributeFlippedWidth:
+        case EScreenAttributeFlippedHeight:
+        case EScreenAttributeFlippedStride:
+        case EScreenAttributeDefaultRotation:
+        case EScreenAttributeCurrentRotation:
+            LOG((" --- COpenWFC_RI_DisplayUpdater::GetAttributeSize(%d) = 4", aAttributeId));
+            return sizeof(TUint32);
+         
+        case EScreenAttributeScreenGeometry:
+            LOG((" --- COpenWFC_RI_DisplayUpdater::GetAttributeSize(%d) = %d", aAttributeId, sizeof(TScreenGeometryAttribute)));
+            return sizeof(TScreenGeometryAttribute);
+            
+        default:
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::GetAttributeSize(%d) UNKNOWN", aAttributeId));
+            return 0;
+        }
+    }
+
+TInt COpenWFC_RI_DisplayUpdater::GetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize)
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::GetAttribute(%d, 0x%X, %d)", aAttributeId, aAttribute, aAttributeSize));
+    TInt parameterSize = GetAttributeSize(aAttributeId);
+
+    if (aAttribute == NULL)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::GetAttribute() aAttribute NULL ptr"));
+        return KErrArgument;
+        }
+    
+    if (parameterSize == 0)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::GetAttribute() Not Supported parameter aAttributeId"));
+        return KErrNotSupported;
+        }
+    
+    if (aAttributeSize != parameterSize)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::GetAttribute() aAttributeSize wrong size"));
+        return KErrArgument;
+        }
+    
+    switch (aAttributeId)
+        {
+        case EScreenAttributeImplementationVersion:
+            *((TUint32*)aAttribute) = KImplementationVersion;
+            break;
+        case EScreenAttributePixelFormat:
+            *((TUint32*)aAttribute) = iScreenInfo.iPixelFormat;
+            break;
+        case EScreenAttributeBytesPerPixel:
+            *((TUint32*)aAttribute) = iScreenInfo.iBytesPerPixel;
+            break;
+        case EScreenAttributeSupportedRotation:
+            *((TUint32*)aAttribute) = iScreenInfo.iSupportedRotations;
+            break;
+        case EScreenAttributeNormalWidth:
+            *((TUint32*)aAttribute) = iScreenInfo.iNormalWidth;
+            break;
+        case EScreenAttributeNormalHeight:
+            *((TUint32*)aAttribute) = iScreenInfo.iNormalHeight;
+            break;
+        case EScreenAttributeNormalStride:
+            *((TUint32*)aAttribute) = iScreenInfo.iNormalStride;
+            break;
+        case EScreenAttributeFlippedWidth:
+            *((TUint32*)aAttribute) = iScreenInfo.iFlippedWidth;
+            break;
+        case EScreenAttributeFlippedHeight:
+            *((TUint32*)aAttribute) = iScreenInfo.iFlippedHeight;
+            break;
+        case EScreenAttributeFlippedStride:
+            *((TUint32*)aAttribute) = iScreenInfo.iFlippedStride;
+            break;
+        case EScreenAttributeDefaultRotation:
+            *((TUint32*)aAttribute) = iScreenInfo.iDefaultRotation;
+            break;
+        case EScreenAttributeCurrentRotation:
+            *((TUint32*)aAttribute) = iScreenInfo.iCurrentRotation;
+            break;
+        case EScreenAttributeScreenGeometry:
+            *((TScreenGeometryAttribute*)aAttribute) = iScreenInfo;
+            break;
+        default:
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::GetAttribute() attribute unrecognised"));
+            return KErrNotSupported;
+        }
+    
+    LOG((" --- COpenWFC_RI_DisplayUpdater::GetAttribute() = %d", *((TUint32*)aAttribute)));
+    return KErrNone;
+    }
+
+
+TInt COpenWFC_RI_DisplayUpdater::SetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize)
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::SetAttribute(%d, 0x%X, %d)", aAttributeId, aAttribute, aAttributeSize));
+    // the only parameter we can modify is the current rotation
+    TInt parameterSize = GetAttributeSize(aAttributeId);
+
+    if (aAttributeSize != parameterSize || aAttribute == NULL)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::SetAttribute() Invalid parameter"));
+        return KErrArgument;
+        }
+    
+    switch (aAttributeId)
+        {
+        case EScreenAttributeCurrentRotation:
+            iNewRotation = static_cast<TScreenRotation>(*((TUint32*)aAttribute));
+            LOG((" +++ COpenWFC_RI_DisplayUpdater::SetAttribute(CurrentRotation, %d)", (TInt)iNewRotation));
+            break;
+        default:
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::SetAttribute() Invalid attribute"));
+            return KErrNotSupported;
+        }
+    LOG((" --- COpenWFC_RI_DisplayUpdater::SetAttribute()"));
+    return KErrNone;
+    }
+
+
+TInt COpenWFC_RI_DisplayUpdater::CommitAttribute()
+    {
+    LOG((" +++ COpenWFC_RI_DisplayUpdater::CommitAttribute"));
+    // Hardware rotation is not demonstrated on PlatSim
+    __ASSERT_DEBUG(iScreenInfo.iCurrentRotation == iNewRotation, Panic(__LINE__));
+    return KErrNone;
+    }
+
+TInt COpenWFC_RI_DisplayUpdater::SetLayerSurface(TInt aLayer, SymbianStreamType aStream, TInt* aNonTrivialAttribs)
+    {
+    // display channel interface can be seen as mono-layered
+    if (aLayer != 0)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : non-zero layer not supported"));
+        return KErrArgument;
+        }
+    
+    if (aNonTrivialAttribs && *aNonTrivialAttribs)
+        { 
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Non-trivial attributes not accepted."));
+        return KErrNotSupported;
+        }
+    
+    if (aStream!=iNextSceneStream)
+        {   //If, in future non-trivial attributes are supported then this condition is inadequate
+         SymbianStreamBuffer nextReadBuffer=NULL;
+        //Scene stream has changed - re-validate and set up for new info
+        TInt err=SymbianStreamAcquireReadBuffer(aStream,&nextReadBuffer);
+        if (err<KErrNone)
+            {
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Falied to access stream properties"));
+            return err;
+            }
+        const TSurfaceId* surfaceId;
+        khronos_int32_t index;
+        err= SymbianStreamGetBufferId(aStream,nextReadBuffer,&index,&surfaceId);
+        if (err<KErrNone)
+            {
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Falied to access stream properties"));
+            SymbianStreamReleaseReadBuffer(aStream, nextReadBuffer);
+            return err;
+            }
+        RSurfaceManager::TInfoBuf surfaceInfo;
+        iSurfaceManager.SurfaceInfo(*surfaceId,surfaceInfo);
+        TBool acceptable=ETrue;
+        if (!surfaceInfo().iContiguous)
+            {
+            acceptable=EFalse;
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Stream 0x%08x iContiguous not accepted ",aStream));
+            }
+        khronos_int32_t format=surfaceInfo().iPixelFormat;
+        if (format!=EUidPixelFormatARGB_8888 && format!=EUidPixelFormatARGB_8888_PRE && format!=EUidPixelFormatXRGB_8888)
+            {
+            acceptable=EFalse;
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Stream 0x%08x iPixelFormat 0x%08x not accepted ",aStream,surfaceInfo().iPixelFormat));
+            }
+                
+        if (!acceptable)
+            {
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Stream 0x%08x properties not accepted ",aStream));
+            SymbianStreamReleaseReadBuffer(aStream, nextReadBuffer);
+            return KErrNotSupported;
+            }
+        
+        //Note that if we early-return before this point the previous top stream should still be locked for use.
+        
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Stream changed 0x%08x --> 0x%08x ",iNextSceneStream,aStream));
+        if (iNextSceneStream != SYMBIAN_INVALID_HANDLE && iNextReadBuffer != SYMBIAN_INVALID_HANDLE)
+             {
+             LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : double-call to SetLayerSurface. First discarded."));
+             SymbianStreamReleaseReadBuffer(iNextSceneStream, iNextReadBuffer);
+             }
+        iNextReadBuffer=nextReadBuffer;
+        iNextSceneStream=aStream;
+        }
+    else
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::SetLayerSurface : Stream still 0x%08x",aStream));
+        }
+    return KErrNone;
+    }
+
+TInt COpenWFC_RI_DisplayUpdater::SetTopLayerSurface(SymbianStreamType aStream, TInt* aNonTrivialAttribs)
+    {
+    return SetLayerSurface(KTopMostLayer, aStream, aNonTrivialAttribs);
+    }
+
+TInt COpenWFC_RI_DisplayUpdater::UpdateDisplay()
+    {
+    TInt err = KErrNone;
+
+    SymbianStreamBuffer readBuffer = iNextReadBuffer;
+    iNextReadBuffer = SYMBIAN_INVALID_HANDLE;
+    if (!iNextSceneStream)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::UpdateDisplay() ASSERT: No top layer has been set!"));
+        return KErrNotReady;
+        }
+    if (readBuffer == SYMBIAN_INVALID_HANDLE)
+        {
+        if ((err = SymbianStreamAcquireReadBuffer(iNextSceneStream, &readBuffer)) != KErrNone)
+            {   //AcquireReadBuffer "Can't fail" in theory, but just incase....
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::UpdateDisplay() Acquire failed: %d", err));
+            return err;
+            }
+        }
+    TBufferInfo bufferInfo;
+    khronos_int32_t width, height, stride;
+    SymbianStreamGetHeader(iNextSceneStream, &width, &height, &stride, NULL, NULL);
+    bufferInfo.iBufferWidth = (TInt16)width;
+    bufferInfo.iBufferHeight = (TInt16)height;
+    bufferInfo.iStride = (TInt16)stride;
+    bufferInfo.iBufferFormat = EPixelFormatXRgb8888Le;
+    bufferInfo.iLinearAddress = 0;
+    err = SymbianStreamGetBufferPointer(iNextSceneStream, readBuffer,&bufferInfo.iLinearAddress);
+    if (err == KErrNone)
+        {
+        err = SymbianStreamGetChunkHandle(iNextSceneStream, &bufferInfo.iBufferRChunkHandle);
+        }
+
+    if (err != KErrNone)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::UpdateDisplay() error %d getting stream data", err));
+        SymbianStreamReleaseReadBuffer(iNextSceneStream, readBuffer);
+        return err;
+        }
+
+    TRect displayRect;
+    displayRect.SetRect(TPoint(0, 0), TSize(bufferInfo.iBufferWidth, bufferInfo.iBufferHeight ));
+    
+    TDisplayViewSettings viewSettings; // Default
+    viewSettings.iSourceScissor         = displayRect;
+    viewSettings.iDestinationScaledRect = displayRect;
+    viewSettings.iLayerRotation         = ERotate0Deg;
+    viewSettings.iUsageHint             = EPurposeUi;
+    viewSettings.iTearingFree           = ETrue;
+      
+    LOG((" $$$*** bufferInfo.iBufferWidth %d", bufferInfo.iBufferWidth));
+    LOG((" $$$*** bufferInfo.iBufferHeight %d", bufferInfo.iBufferHeight));
+    LOG((" $$$*** bufferInfo.iStride %d", bufferInfo.iStride));
+    LOG((" $$$*** bufferInfo.iBufferFormat %d", bufferInfo.iBufferFormat));
+    LOG((" $$$*** bufferInfo.iLinearAddress %08x", bufferInfo.iLinearAddress));
+    LOG((" $$$*** bufferInfo.iBufferRChunkHandle %d", bufferInfo.iBufferRChunkHandle));
+
+    LOG((" $$$*** viewSettings iSourceScissor width %d", viewSettings.iSourceScissor.Width()));
+    LOG((" $$$*** viewSettings iSourceScissor height %d", viewSettings.iSourceScissor.Height()));
+    LOG((" $$$*** viewSettings iDestinationScaledRect width %d", viewSettings.iDestinationScaledRect.Width()));
+    LOG((" $$$*** viewSettings iDestinationScaledRect height %d", viewSettings.iDestinationScaledRect.Height()));
+    LOG((" $$$*** viewSettings iLayerRotation %d", viewSettings.iLayerRotation));
+    LOG((" $$$*** viewSettings iUsageHint %d", viewSettings.iUsageHint));
+    LOG((" $$$*** viewSettings iTearingFree %d", viewSettings.iTearingFree));
+
+    TRequestStatus completedWhenReady = KRequestPending;
+    viewSettings.iLayerRotation = iCurrentRotation;
+
+    err = iDisplayUpdater->SetView(KTopMostLayer, viewSettings, bufferInfo);
+    
+    if (err != KErrNone)
+        {
+        LOG((" !!! COpenWFC_RI_DisplayUpdater::UpdateDisplay()ERROR: Display update set view failed %d", err));
+        }
+    else
+        {
+        err = iDisplayUpdater->SetBuffer(KTopMostLayer, displayRect, bufferInfo );
+        if (err != KErrNone)
+            {
+            LOG((" !!! COpenWFC_RI_DisplayUpdater::UpdateDisplay()ERROR: Display Update set buffer failed %d", err));
+            }
+        }
+
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    iDisplayUpdater->Flush(completedWhenReady);
+    
+    /* The TRequestStatus& aCompletedWhenReady parameter is signalled 
+     * either when the buffer has been copied, 
+     * or it is streaming the first pixel to the display
+     * In either case this indicates that the previous buffer is no longer required.
+     * By waiting here we guarantee that the previous iCurrentReadBuffer is no longer required,
+     * but here are more intelligent ways to wait, I am sure!
+     */
+    User::WaitForRequest(completedWhenReady);
+    if (iCurrentReadBuffer != SYMBIAN_INVALID_HANDLE)
+        {
+        // Release the previous update's read buffer.
+        /* This ensures that a lock is held on the displayed buffer until the next commit/compose
+         * This is correct behaviour for streaming direct to the display, but is actually not
+         * necessary if the display makes its own copy.
+         * However, PlatSim currently supports only the latter, and we think the former is important,
+         * so this implementation allows us to validate that the behaviour is correct in direct streaming.
+         */
+        SymbianStreamReleaseReadBuffer(iCurrentSceneStream, iCurrentReadBuffer);
+        }
+    iCurrentReadBuffer = readBuffer;
+    iCurrentSceneStream = iNextSceneStream;
+    return err;
+    }
+
--- a/graphicscomposition/openwfcinterface/group/openwfc.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcinterface/group/openwfc.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -20,5 +20,4 @@
 
 #include OPENWFCLIB_DRV
 
-
 #endif // __OPENWFC_IBY__
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfdisplaycontext.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfdisplaycontext.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,5 @@
-/* Copyright (c) 2009 The Khronos Group Inc.
- *
+/* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+ * 
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
  * "Materials"), to deal in the Materials without restriction, including
@@ -7,10 +7,10 @@
  * distribute, sublicense, and/or sell copies of the Materials, and to
  * permit persons to whom the Materials are furnished to do so, subject to
  * the following conditions:
- *
+ * 
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Materials.
- *
+ * 
  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
@@ -24,11 +24,13 @@
 #define OWFDISPLAYCONTEXT_H
 
 #include <e32base.h>
+#include <e32cmn.h>
 
 #include <dispchannel.h>
 #include "owfmemory.h"
 #include "owfscreen.h"
 #include "owfdisplaycontextgeneral.h"
+#include <WF\openwfc_ri_display.h>
 
 #define _OWF_DISPLAYCONTEXT(x)          (static_cast<OWFDisplayContext *>(x))
 
@@ -52,51 +54,19 @@
     RArray <TBufferAddress> iBuffers;
     };
 
-class COWFScreenDisplayInfo : public CBase
-    {
-public:
-    ~COWFScreenDisplayInfo();
-    static COWFScreenDisplayInfo* NewL(TInt aScreen);
-    TInt ScreenNumber() const;
-    void GetScreenInfo(OWF_SCREEN *header) const;
-    OWFboolean Blit(void* buffer, OWF_ROTATION rotation);
-    
-private:
-    COWFScreenDisplayInfo(TInt aScreen);
-    void ConstructL();
-private:
-    OWF_SCREEN iScreenInfo;
-    mutable RDisplayChannel iDispChan;
-    TInt iScreenNumber;
-    RArray <TBufferAddress*> iCompositionBuffer;
-    RDisplayChannel::TDisplayRotation iDefaultRotation;
-    TInt iRotationOffset;
-    };
-    
-class COwfcDisplayDevice : public CBase
-    {
-private:
-    static COwfcDisplayDevice* gDisplayDeviceInstancePtr;
-public:
-    static COwfcDisplayDevice* SingletonInstance();
-    TInt OpenScreen(TInt aScreen);
-    TInt CloseScreen(TInt aScreen, OWFboolean *aCanDelete);
-    ~COwfcDisplayDevice();
-public:
-    static TBool ScreenCompare(const TInt* k, COWFScreenDisplayInfo* const & t)
-    {return (*k == t->ScreenNumber());}
-    RArray <COWFScreenDisplayInfo*> iScreenDisplayInfo;
-    };
-
 typedef struct OWFDisplayContext_
     {
 public:
-    COwfcDisplayDevice *iDisplayContext;
+    COpenWFC_RI_Display *iScreenContext;
     COwfScratchBuffers iBuffers;
     WFCint iEventServerUpdate;
     WFCboolean iCompositionOngoing;
     WFCint iPreviousCommit;
     WFCint iSerialNumber;
+    OWF_SEMAPHORE iRendezvous;
+    OWFNativeStreamType fastpathStream;
+    WFCboolean fastpathChecked;
+    WFCboolean iInternalStreamAccessed;
 public:
     virtual ~OWFDisplayContext_();
     } OWFDisplayContext;
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfdisplaycontextgeneral.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfdisplaycontextgeneral.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -22,8 +23,8 @@
 #ifndef OWFDISPLAYCONTEXTGENERAL_H_
 #define OWFDISPLAYCONTEXTGENERAL_H_
 
+#include <WF/wfc.h>
 #include <e32def.h>
-#include <WF/wfc.h>
 #include <KHR/khrplatform.h>
 
 #ifdef __cplusplus
@@ -63,6 +64,86 @@
 */
 void OWF_DisplayContext_SetCompositionOngoing(OWF_DISPCTX dc, WFCboolean val);
 
+/**
+Creates posts the rendezvous semaphore
+@param  dc      The display context
+*/
+void OWF_ComposerThread_Rendezvous(OWF_DISPCTX dc);
+
+/**
+Waits on rendezvous semaphore
+@param  dc      The display context who's composition ongoing flag is to be set
+*/
+void OWF_ComposerThread_RendezvousWait(OWF_DISPCTX dc);
+
+/**
+Destroys on rendezvous semaphore
+@param  dc      The display context
+*/
+void OWF_ComposerThread_RendezvousDestroy(OWF_DISPCTX dc);
+
+/**
+Activates fastpath mechanism and associates the stream output
+@param  dc      The display context
+@param  fastpathStream      Sets the fastpath stream
+*/
+void OWF_DisplayContext_EnableFastpath(OWF_DISPCTX dc, OWFNativeStreamType fastpathStream);
+
+/**
+Disable fastpath stream
+@param  dc      The display context
+*/
+void OWF_DisplayContext_DisableFastpath(OWF_DISPCTX dc);
+
+/**
+Returns fastpath state
+@param  dc      The display context
+@return OWF_TRUE if the current stream is fastpathable, OWF_FALSE otherwise 
+*/
+WFCboolean OWF_DisplayContext_FastpathEnabled(OWF_DISPCTX dc);
+
+/**
+Returns fastpathed stream
+@param  dc      The display context
+@return handle of the fastpathed stream 
+*/
+OWFNativeStreamType OWF_DisplayContext_FastpathStream(OWF_DISPCTX dc);
+
+/**
+Retrieves state of the fastpath
+@param  dc      The display context
+@return OWF_TRUE if the fastpath has been checked, OWF_FALSE otherwise 
+*/
+WFCboolean OWF_DisplayContext_FastpathChecked(OWF_DISPCTX dc);
+/**
+Resets fatpath check
+@param  dc      The display context
+*/
+void OWF_DisplayContext_ResetFastpathCheck(OWF_DISPCTX dc);
+/**
+Sets fatpath check
+@param  dc      The display context
+*/
+void OWF_DisplayContext_SetFastpathChecked(OWF_DISPCTX dc);
+
+/**
+Flags that the internal stream has been made accessible for outside world
+The fast path mechanism is using it in order to fill the internal stream with
+the content of the fastpathed stream
+@param  dc      The display context
+*/
+void OWF_DisplayContext_FlagInternalStreamAccessed(OWF_DISPCTX dc);
+
+/**
+Returns the internal stream accessibilty flag
+@param  dc      The display context
+@return OWF_TRUE if the fastpat has been checked, OWF_FALSE otherwise 
+*/
+WFCboolean OWF_DisplayContext_InternalStreamAccessed(OWF_DISPCTX dc);
+
+OWFboolean OWF_DisplayContext_CopyFastpathedStreamToTargetStream(void* context);
+
+
 #ifdef __cplusplus
 }
 #endif
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfextensions.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfextensions.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,5 @@
-/* Copyright (c) 2009 The Khronos Group Inc.
- *
+/* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * 
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
  * "Materials"), to deal in the Materials without restriction, including
@@ -7,10 +7,10 @@
  * distribute, sublicense, and/or sell copies of the Materials, and to
  * permit persons to whom the Materials are furnished to do so, subject to
  * the following conditions:
- *
+ * 
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Materials.
- *
+ * 
  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfmessagequeue.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfmessagequeue.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -32,6 +33,13 @@
 extern "C" {
 #endif
 
+#define WAIT_FOREVER            -1
+#define MSG_QUEUE_WAIT_MSG_FETCHED      0
+#define MSG_QUEUE_WAIT_MSG_ERR          -1
+#define MSG_QUEUE_WAIT_MSG_TIMEDOUT     -2
+#define MSG_QUEUE_INIT_OK               0
+#define MSG_QUEUE_INIT_ERR              -1
+
 
 typedef struct {
     OWFuint                 id;
@@ -39,8 +47,7 @@
 } OWF_MESSAGE;
 
 typedef struct _MSGQUE {
-    OWFint                  read;
-    OWFint                  write;
+    void*                   queuePtr;
 } OWF_MESSAGE_QUEUE;
 
 /*
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfnativestream.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfnativestream.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -201,48 +202,6 @@
                                   EGLDisplay dpy,
                                   EGLSyncKHR sync);
 
-/*!---------------------------------------------------------------------------
- *  Register stream content observer (append to chain). The observer will
- *  receive buffer modification event from the stream whenever a buffer is
- *  committed.
- *
- *  \param stream           Stream handle
- *  \param observer         Stream observer
- *  \param data             Optional data to pass to observer callback
- *                          function when event is dispatched.
- *----------------------------------------------------------------------------*/
- OWF_PUBLIC OWF_STREAM_ERROR
-owfNativeStreamAddObserver(OWFNativeStreamType stream,
-                           OWFStreamCallback observer,
-                           void* data);
-
-/*!---------------------------------------------------------------------------
- *  Remove stream content observer.
- *
- *  \param stream           Stream handle
- *  \param observer         Observer to remove
- *
- *  \param Zero if the observer was removed successfully, otherwise non-zero
- *  (OWF_STREAM_ERROR_INVALID_STREAM if the stream is invalid;
- *   OWF_STREAM_ERROR_INVALID_OBSERVER if the observer is invalid.)
- *
- *   NOTE (khronos bugzilla #5188): "Because the parameter is the observer
- *   function, it is likely that the wrong context could be removed if
- *   two contexts sharing the same implementation code are observing the
- *   same stream, and then one removes its observer. Ideally, both the
- *   function and the client void* should be passed as parameters
- *   to uniquely identify the observer."
- *
- *   The issue can be fixed by adding sync object handle into the interface
- *   of this function. Sync object must be passed to the static comparison
- *   function (ObserversEqual). Implementator must take into account that
- *   when the stream is destroyed, all observers of that stream must be destroyed.
- *
- *----------------------------------------------------------------------------*/
- OWF_API_CALL OWF_STREAM_ERROR
-owfNativeStreamRemoveObserver(OWFNativeStreamType stream,
-                              OWFStreamCallback observer,
-                              void* data);
 
 /*!---------------------------------------------------------------------------
  *  Enable/disable stream content notifications.
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfnotifications.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfnotifications.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,19 +1,28 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-// Symbian notifications
-// 
-//
+/* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and/or associated documentation files (the
+ * "Materials"), to deal in the Materials without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Materials, and to
+ * permit persons to whom the Materials are furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Materials.
+ * 
+ * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ * 
+ * Description:
+ * Symbian notifications
+ */
+
 
 #ifdef __cplusplus
 extern "C" {
--- a/graphicscomposition/openwfcompositionengine/adaptation/include/owfscreen.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/include/owfscreen.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -67,8 +68,6 @@
     OWF_ORIENTATION_INFO flipped;
 } OWF_SCREEN;
 
-typedef void (*OWF_SCREEN_CALLBACK)(void* obj, OWFint screenNumber, char event);
-
 /*!
  * \brief Get systems's default screen
  *
@@ -80,91 +79,72 @@
 /*!
  * \brief Get screen's dimensions
  *
- * \param screen screen number
+ * \param dc display context
  * \param header returned screen attributes
  *
  * \return OWF_TRUE if screen exists
  * \return OWF_FALSE if screen does not exist
  */
 OWF_API_CALL OWFboolean
-OWF_Screen_GetHeader(OWFint screen, OWF_SCREEN* header);
+OWF_Screen_GetHeader(OWF_DISPCTX dc, OWF_SCREEN* header);
 
-OWF_API_CALL OWFboolean
-OWF_Number_Of_Screens(OWFint *pNumberOfScreens);
-
+/*!
+ * \brief Validate a screen number
+ *
+ * \param screen screen number
+ *
+ * \return OWF_TRUE if screen exists
+ * \return OWF_FALSE if screen does not exist
+ */
 OWF_API_CALL OWFboolean
 OWF_Screen_Valid(OWFint screen);
 
-OWF_API_CALL OWFboolean
-OWF_Screen_Valid_And_Available(OWFint screen);
-
 /*!
  * \brief Checks if the screen rotation support is enabled
  *
- * \param screen screen number
+ * \param dc display context
  *
  * \return OWF_TRUE if the screen rotation is enabled
  * \return OWF_FALSE if the screen rotation is enabled
  */
 OWF_API_CALL OWFboolean
-OWF_Screen_Rotation_Supported(OWFint screen);
+OWF_Screen_Rotation_Supported(OWF_DISPCTX dc);
 
 /*!
  * \brief Create a new screen
  *
- * \param width
- * \param height
+ * \param dc display context
+ * \param screen screen number
  *
- * \return screen number
+ * \return OWF_TRUE if screen exists
+ * \return OWF_FALSE if screen does not exist
  */
-OWF_API_CALL OWFint
-OWF_Screen_Create(OWFint width, OWFint height, OWF_SCREEN_CALLBACK func, void* obj);
+OWF_API_CALL OWFboolean
+OWF_Screen_Create(OWFint screen, OWF_DISPCTX dc);
 
 /*!
  * \brief Destroy a screen
  *
- * \param screen number
+ * \param dc display context
  *
  * \return OWF_TRUE if screen exists
  * \return OWF_FALSE if screen does not exist
  */
 OWF_API_CALL void
-OWF_Screen_Destroy(OWFint screenNumber);
-
-/*!
- * \brief Resize screen
- *
- * \param width
- * \param height
- *
- * \return OWF_TRUE if resize OK
- * \return OWF_FALSE if resize failed.
- */
-OWF_API_CALL OWFboolean
-OWF_Screen_Resize(OWFint screen, OWFint width, OWFint height);
+OWF_Screen_Destroy(OWF_DISPCTX dc);
 
 /*!
  * \brief Blit image to screen
  *
- * \param screen screen number
- * \param rotation the context rotation
+ * \param dc display context
+ * \param dc stream the stream containing the buffer to be displayed
+ * rotation the current context rotation
  *
  * \return OWF_TRUE if screen exists and blitting is  OK
  * \return OWF_FALSE if screen does not exist or blitting is not allowed.
  */
 OWF_API_CALL OWFboolean
-OWF_Screen_Blit(OWFint screen, void* buffer, OWF_ROTATION rotation);
-
-/*!
- * \brief Notify objects
- *
- * Send data to objects associated with screens
- *
- * \param data
- *
- */
-OWF_API_CALL void
-OWF_Screen_Notify(void* data);
+OWF_Screen_Post_Topmost_Layer(OWF_DISPCTX dc, OWFNativeStreamType stream, OWF_ROTATION rotation);
 
 #ifdef __cplusplus
 }
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/owfnativestream.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/owfnativestream.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfdisplaycontext.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfdisplaycontext.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,33 +1,38 @@
-/* Copyright (c) 2009-2010 The Khronos Group Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and/or associated documentation files (the
- * "Materials"), to deal in the Materials without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Materials, and to
- * permit persons to whom the Materials are furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Materials.
- *
- * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
- */
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// 
+// 
+//
+
 
 #include <WF/wfc.h>
 #include <e32debug.h>
+#include <e32std.h>
 
-#include "wfcstructs.h"
 #include "wfcdevice.h"
+#include "owfdisplaycontextgeneral.h"
 #include "owfmutex.h"
 #include "owfdisplaycontext.h"
-#include "owfdisplaycontextgeneral.h"
 #include <graphics/symbianstream.h>
 
 static const TInt updateReceiverPriorityTable[] = {10, 9, 8, 7, 6, 5, 4, 3};
@@ -40,23 +45,29 @@
     TInt priorityTableSize = sizeof(updateReceiverPriorityTable) / sizeof(updateReceiverPriorityTable[0]);
     TInt priority = 0;
     
+    DPRINT(("++ OWF_DisplayContext_Create(screenNum = %d)", screenNum));
     OWFDisplayContext *pDispCtx = new OWFDisplayContext;
     if (!pDispCtx)
         {
-        RDebug::Printf("Not enough memory to create OWFDisplayContext object");
+        DPRINT(("-- Not enough memory to create OWFDisplayContext object"));
         return NULL;
         }
-    
     pDispCtx->iEventServerUpdate  = 0;
     pDispCtx->iCompositionOngoing = WFC_FALSE;
     pDispCtx->iPreviousCommit     = WFC_FALSE;
     pDispCtx->iSerialNumber       = INITIAL_CONTEXT_SERIAL_NUMBER;
+    pDispCtx->fastpathChecked     = WFC_FALSE;
+    pDispCtx->fastpathStream      = OWF_INVALID_HANDLE;
+    pDispCtx->iScreenContext      = NULL;
+    pDispCtx->iInternalStreamAccessed = WFC_FALSE;    
+    
+    OWF_Semaphore_Init(&pDispCtx->iRendezvous, 0);
     
     if (screenNum != OWF_RESERVED_BAD_SCREEN_NUMBER)
         {
         if((screenNum < 0) || (screenNum >= priorityTableSize))
             {
-            RDebug::Printf("Can't retrieve backend priority for the screen number: %d\n", screenNum);
+            DPRINT(("   Can't retrieve backend priority for the screen number: %d\n", screenNum));
             }
         else
             {
@@ -67,61 +78,32 @@
         TInt err = SymbianStreamRegisterScreenNotifications(screenNum, priority, KInternalVersion);
         if (!(err == KErrNone || err == KErrNotReady || err == KErrAlreadyExists))
             {
-            RDebug::Printf("Register with Surface Update Server failed for screen: %d err=%d\n", screenNum, err);
+            DPRINT(("-- Register with Surface Update Server failed for screen: %d err=%d\n", screenNum, err));
             delete pDispCtx;
             return NULL;
             }
         if (err == KErrNotReady)
             {
-            RDebug::Printf("Surface Update Server is not ready for screen: %d\n", screenNum);
+            DPRINT(("   Surface Update Server is not ready for screen: %d\n", screenNum));
             }
         if (err == KErrAlreadyExists)
             {
-            RDebug::Printf("Backend object already exists for screen: %d\n", screenNum);
+            DPRINT(("   Backend object already exists for screen: %d\n", screenNum));
             }
         }
     
-    if (screenNum >= 0)
-        {
-        pDispCtx->iDisplayContext = COwfcDisplayDevice::SingletonInstance();
-        if (!pDispCtx->iDisplayContext)
-            {
-            RDebug::Printf("Failed to initialise display singleton\n");
-            delete pDispCtx;
-            return NULL;
-            }
-
-        TInt err = pDispCtx->iDisplayContext->OpenScreen(screenNum);
-        if (err != KErrNone)
-            {
-            RDebug::Printf("Failed to initialise display driver on screen: %d err=%d\n", screenNum, err);
-            delete pDispCtx;
-            return NULL;
-            }
-        }
-    else
-        {
-        // Off-screen context
-        pDispCtx->iDisplayContext = NULL;
-        }
+    pDispCtx->iScreenContext = NULL;
     
+    DPRINT(("-- OWF_DisplayContext_Create(screenNum = %d) : %p", screenNum, pDispCtx));
     return static_cast<OWF_DISPCTX>(pDispCtx);
     }
 
 void OWF_DisplayContext_Destroy(TInt screenNum, OWF_DISPCTX dc)
     {
+    DPRINT(("++ OWF_DisplayContext_Destroy(screenNum = %d) : %p", screenNum, dc));
     if (dc != OWF_INVALID_HANDLE)
         {
         OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
-        if (screenNum >= 0)
-            {
-            OWFboolean canDelete = OWF_FALSE;
-            pDispCtx->iDisplayContext->CloseScreen(screenNum, &canDelete);
-            if (canDelete == OWF_TRUE)
-                {
-                delete pDispCtx->iDisplayContext;
-                }
-            }
         delete pDispCtx;
         }
     
@@ -130,9 +112,10 @@
         TInt err = SymbianStreamUnregisterScreenNotifications(screenNum);
         if (!(err == KErrNone || err == KErrNotReady))
             {
-            RDebug::Printf("Unregister with Surface Update Server failed for screen: %d\n", screenNum);
+            DPRINT(("!! Unregister with Surface Update Server failed for screen: %d with %d\n", screenNum, err));
             }
         }
+    DPRINT(("-- OWF_DisplayContext_Destroy()"));
     }
 
 OWFDisplayContext_::~OWFDisplayContext_()
@@ -153,7 +136,15 @@
         }    
     buf.iAddress = buf.iChunk.Base();
     buf.iOffset = 0;
-    return ((iBuffers.Append(buf) == KErrNone) ? buf.iAddress : 0);
+    if(iBuffers.Append(buf) == KErrNone)
+        {
+        return buf.iAddress;
+        }
+    else
+        {
+        buf.iChunk.Close();
+        return 0;
+        }
     }
 
 void COwfScratchBuffers::Destroy(void* aAddress)
@@ -188,30 +179,24 @@
 
 void* OWF_DisplayContext_ScratchBuffer_Allocate(OWF_DISPCTX dc, int size)
     {
-    if (!dc)
-        {
-        return NULL;
-        }
+    OWF_ASSERT(dc);
+    
     OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
     return pDispCtx->iBuffers.Allocate(size);
     }
 
 void OWF_DisplayContext_ScratchBuffer_Destroy(OWF_DISPCTX dc, void* buffer)
     {
-    if (!dc)
-        {
-        return;
-        }
+    OWF_ASSERT(dc);
+    
     OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
     pDispCtx->iBuffers.Destroy(buffer);
     }
 
 void OWF_DisplayContext_IncrementSerialNumber(OWF_DISPCTX dc)
     {
-    if (!dc)
-        {
-        return;
-        }
+    OWF_ASSERT(dc);
+    
     OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
     pDispCtx->iSerialNumber++;
     if (pDispCtx->iSerialNumber == INITIAL_CONTEXT_SERIAL_NUMBER)
@@ -222,10 +207,169 @@
 
 void OWF_DisplayContext_SetCompositionOngoing(OWF_DISPCTX dc, WFCboolean val)
     {
-    if (!dc)
-        {
-        return;
-        }
+    OWF_ASSERT(dc);
+    
     OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
     pDispCtx->iCompositionOngoing = val;    
     }
+
+void OWF_ComposerThread_Rendezvous(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    OWF_Semaphore_Post(&pDispCtx->iRendezvous);
+    }
+
+void OWF_ComposerThread_RendezvousWait(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    OWF_Semaphore_Wait(&pDispCtx->iRendezvous);
+    }
+
+void OWF_ComposerThread_RendezvousDestroy(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    OWF_Semaphore_Destroy(&pDispCtx->iRendezvous);
+    }
+
+void OWF_DisplayContext_EnableFastpath(OWF_DISPCTX dc, OWFNativeStreamType fastpathStream)
+    {
+    DPRINT(("++ OWF_DisplayContext_EnableFastpath(%p, %d)", dc, fastpathStream));
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    pDispCtx->fastpathStream = fastpathStream;
+    }
+
+void OWF_DisplayContext_DisableFastpath(OWF_DISPCTX dc)
+    {
+    DPRINT(("++ OWF_DisplayContext_DisableFastpath(%p)", dc));
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    pDispCtx->fastpathStream = OWF_INVALID_HANDLE;
+    }
+
+WFCboolean OWF_DisplayContext_FastpathEnabled(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    DPRINT(("++ OWF_DisplayContext_FastpathEnabled(%p) : %d", dc, (pDispCtx->fastpathStream != OWF_INVALID_HANDLE)));
+    return (pDispCtx->fastpathStream != OWF_INVALID_HANDLE) ? WFC_TRUE : WFC_FALSE;
+    }
+
+OWFNativeStreamType OWF_DisplayContext_FastpathStream(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    DPRINT(("++ OWF_DisplayContext_FastpathStream(%p) : %p", dc, pDispCtx->fastpathStream));
+    return pDispCtx->fastpathStream;
+    }
+
+WFCboolean OWF_DisplayContext_FastpathChecked(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    DPRINT(("++ OWF_DisplayContext_FastpathChecked(%p) : %d", dc, pDispCtx->fastpathChecked));
+    return pDispCtx->fastpathChecked;
+    }
+
+void OWF_DisplayContext_ResetFastpathCheck(OWF_DISPCTX dc)
+    {
+    DPRINT(("++ OWF_DisplayContext_ResetFastpathCheck(%p)", dc));
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    pDispCtx->fastpathChecked = WFC_FALSE;
+    }
+
+void OWF_DisplayContext_SetFastpathChecked(OWF_DISPCTX dc)
+    {
+    DPRINT(("++ OWF_DisplayContext_SetFastpathCheck(%p)", dc));
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    pDispCtx->fastpathChecked = WFC_TRUE;
+    }
+
+void OWF_DisplayContext_FlagInternalStreamAccessed(OWF_DISPCTX dc)
+    {
+    DPRINT(("++ OWF_DisplayContext_FlagInternalStreamAccessed(%p)", dc));
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    pDispCtx->iInternalStreamAccessed = WFC_TRUE;
+    }
+
+WFCboolean OWF_DisplayContext_InternalStreamAccessed(OWF_DISPCTX dc)
+    {
+    OWF_ASSERT(dc);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    DPRINT(("++ OWF_DisplayContext_InternalStreamAccessed(%p) : ", dc, pDispCtx->iInternalStreamAccessed));
+    return pDispCtx->iInternalStreamAccessed;
+    }
+
+OWFboolean OWF_DisplayContext_Check_Fastpathed_Stream(OWF_DISPCTX dc, OWFNativeStreamType fastpathedStream)
+    {
+    if (!dc)
+        {
+        return OWF_FALSE;
+        }
+    
+    khronos_int32_t pixelFormat = 0;
+    SymbianStreamGetHeader((SymbianStreamType)fastpathedStream, NULL, NULL, NULL, &pixelFormat, NULL);
+    
+    return ((EUidPixelFormatARGB_8888_PRE == pixelFormat) || (EUidPixelFormatARGB_8888 == pixelFormat) || (EUidPixelFormatXRGB_8888 == pixelFormat)) ? OWF_TRUE : OWF_FALSE;
+    }
+
+OWFboolean OWF_DisplayContext_CopyFastpathedStreamToTargetStream(void* ctxt)
+    {
+    DPRINT(("++ OWF_DisplayContext_CopyFastpathedStreamToTargetStream(%p)", ctxt));
+    WFC_CONTEXT* context = CONTEXT(ctxt);
+    if (!context || !context->displayContext)
+        {
+        DPRINT(("!! OWF_DisplayContext_CopyFastpathedStreamToTargetStream(%p) invalid", ctxt));
+        return OWF_FALSE;
+        }
+    khronos_int32_t dstStride = context->state.targetImage->stride;
+    TInt height = context->state.targetImage->height;
+    void* dstPtr     = context->state.targetPixels;
+    OWFDisplayContext* pDispCtx = _OWF_DISPLAYCONTEXT(context->displayContext);
+    SymbianStreamType fastpathedStream = (SymbianStreamType)pDispCtx->fastpathStream;
+    if (!OWF_DisplayContext_Check_Fastpathed_Stream(pDispCtx,pDispCtx->fastpathStream))
+        {   //The format does not lend itself to quick copying.
+            //Clients listening for update callbacks will be disappointed.
+        return OWF_FALSE;
+        }
+    void* srcPtr     = NULL;
+    khronos_int32_t srcStride = 0;
+    SymbianStreamBuffer frontBuffer;
+    /* Stride may include unaddressable memory, so only copy valid pixels */
+    khronos_int32_t copyLen = context->state.targetImage->width * context->state.targetImage->pixelSize;
+    
+    SymbianStreamAcquireReadBuffer(fastpathedStream, &frontBuffer);
+    SymbianStreamGetBufferPointer(fastpathedStream, frontBuffer, &srcPtr);
+    
+    SymbianStreamGetHeader(fastpathedStream, NULL, NULL, &srcStride, NULL, NULL);
+    
+    for (TInt i = 0; i < height; i++)
+        {
+        Mem::Copy(dstPtr, srcPtr, copyLen);
+        dstPtr = (khronos_uint8_t*)dstPtr + dstStride;
+        srcPtr = (khronos_uint8_t*)srcPtr + srcStride;
+        }
+    
+    SymbianStreamReleaseReadBuffer(fastpathedStream, frontBuffer);
+    DPRINT(("-- OWF_DisplayContext_CopyFastpathedStreamToTargetStream(%p)", ctxt));
+    return OWF_TRUE;
+    }
+
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfnativestreamstub.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfnativestreamstub.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,14 +1,23 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 //
 // Description:
 // Native Stream Stubs
@@ -18,18 +27,13 @@
 #include <WF/wfc.h>
 #include <graphics/symbianstream.h>
 #include <graphics/surfacemanager.h>
+#include <graphics/streammap.h>
 #include "owfnativestream.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-static RSurfaceManager& SurfaceManagerSingleton()
-        {
-        static RSurfaceManager surfaceManager;
-        static int err=surfaceManager.Open();
-        return surfaceManager;
-        }
 
 static khronos_int32_t max(khronos_int32_t aLhs, khronos_int32_t aRhs)
 {
@@ -39,9 +43,7 @@
     return aRhs;
 }
 
-
-
-static TSurfaceId createSurface(khronos_int32_t width,
+static TSurfaceId createSurface(RSurfaceManager& surface_manager, khronos_int32_t width,
         khronos_int32_t height,
         const OWF_IMAGE_FORMAT*   format,
         khronos_int32_t nbufs)
@@ -63,7 +65,7 @@
             case OWF_IMAGE_RGB565:
                 b.iPixelFormat = EUidPixelFormatRGB_565;
                 bytesPerPixel = 2;
-                b.iAlignment = max(4,format->rowPadding);
+                b.iAlignment = max(format->rowPadding, 4);
                 break;
             case OWF_IMAGE_ARGB8888:
                 {
@@ -82,17 +84,7 @@
             case OWF_IMAGE_XRGB8888 :
                 b.iPixelFormat = EUidPixelFormatXRGB_8888;
                 bytesPerPixel = 4;
-                b.iAlignment = max(4,format->rowPadding);
-                break;
-            case OWF_IMAGE_L8 :
-                b.iPixelFormat = EUidPixelFormatA_8;
-                bytesPerPixel = 1;
-                b.iAlignment = max(4,format->rowPadding);
-                break;
-            case OWF_IMAGE_L1 :
-                b.iPixelFormat = EUidPixelFormatL_1;
-                bytesPerPixel = -8;
-                b.iAlignment = max(4,format->rowPadding);
+                b.iAlignment = max(format->rowPadding,4);
                 break;
             default:
                 return surface;
@@ -110,10 +102,10 @@
             {
             b.iStride = (width-(bytesPerPixel+1)) / (-bytesPerPixel);
             }
-        b.iContiguous = OWF_FALSE;
+        b.iContiguous = OWF_TRUE;
         b.iMappable = OWF_TRUE;
         
-        TInt err=SurfaceManagerSingleton().CreateSurface(bf, surface);
+        TInt err=surface_manager.CreateSurface(bf, surface);
         if (err<0)
             {
             surface=TSurfaceId::CreateNullId();
@@ -157,21 +149,28 @@
                                  const OWF_IMAGE_FORMAT* format,
                                  OWFint nbufs)
         {
+        RSurfaceManager surface_manager;
+        TInt err=surface_manager.Open();
+        if (err<KErrNone)
+            {
+            return WFC_INVALID_HANDLE;
+            }
         TSurfaceId surface;
         
-        surface = createSurface(width, height, format, nbufs);
+        surface = createSurface(surface_manager, width, height, format, nbufs);
         if (surface.IsNull())
             {
             return WFC_INVALID_HANDLE;
             }
-        SymbianStreamType ns=NULL;  //No more error checking required...
+        SymbianStreamType ns=WFC_INVALID_HANDLE;  //No more error checking required...
         SymbianStreamAcquire(&surface,&ns);
         
-        SurfaceManagerSingleton().CloseSurface(surface);
+        surface_manager.CloseSurface(surface);
         if (ns)
             {
             WipeWriteBuffer(ns);
             }
+        surface_manager.Close();
         return (OWFNativeStreamType)ns;
         }
 /*!---------------------------------------------------------------------------
@@ -408,54 +407,6 @@
         }
 
 /*!---------------------------------------------------------------------------
- *  Register stream content observer (append to chain). The observer will
- *  receive buffer modification event from the stream whenever a buffer is
- *  committed.
- *
- *  \param stream           Stream handle
- *  \param observer         Stream observer
- *  \param data             data to pass to observer callback
- *                          function when event is dispatched.
- *----------------------------------------------------------------------------*/
-OWF_API_CALL OWF_STREAM_ERROR
-owfNativeStreamAddObserver(OWFNativeStreamType stream,
-                           OWFStreamCallback observer,
-                           void* data)
-        {
-        int err = SymbianStreamAddObserver((SymbianStreamType)stream,(SymbianStreamCallback)observer,data);
-        switch (err)
-            {
-            case KErrBadHandle:    return OWF_STREAM_ERROR_INVALID_STREAM;
-            case KErrNotFound:     return OWF_STREAM_ERROR_INVALID_OBSERVER;
-            case KErrGeneral:      return OWF_STREAM_ERROR_OUT_OF_MEMORY;
-            default:               return OWF_STREAM_ERROR_NONE;
-            }
-        }
-
-/*!---------------------------------------------------------------------------
- *  Remove stream content observer.
- *
- *  \param stream           Stream handle
- *  \param observer         Observer to remove
- *  \param data             client data supplied for registration
- *
- *  \param Zero if the observer was removed successfully, otherwise non-zero
- *  (OWF_STREAM_ERROR_INVALID_STREAM if the stream is invalid;
- *   OWF_STREAM_ERROR_INVALID_OBSERVER if the observer is invalid.)
- *----------------------------------------------------------------------------*/
-OWF_API_CALL OWF_STREAM_ERROR
-owfNativeStreamRemoveObserver(OWFNativeStreamType stream,
-                              OWFStreamCallback observer,
-                              void* data)
-        {
-        SYMOWF_DEFAULT_EVENT_PARAM eventPar;
-        eventPar.length = sizeof(eventPar);
-        eventPar.event = ESOWF_NoEvent;
-        observer(SYMBIAN_INVALID_HANDLE, ESOWF_ObserverReturnDefaultEvent, NULL, &eventPar);
-        return (OWF_STREAM_ERROR)SymbianStreamRemoveObserver((SymbianStreamType)stream,data,(type_SymbianStreamEventBits)eventPar.event);
-        }
-
-/*!---------------------------------------------------------------------------
  *  Enable/disable stream content notifications.
  *
  *  \param stream           Stream handle
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfnotifications.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfnotifications.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,14 +1,23 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 //
 // Description:
 // Display Channel adaptation for owfscreen
@@ -96,10 +105,10 @@
             
             if (param)
                 {
-                WFC_CONTENT_UPDATED_PARAM* parameter = (WFC_CONTENT_UPDATED_PARAM*) param;
+                SYMOWF_CONTENT_UPDATED_PARAM* parameter = (SYMOWF_CONTENT_UPDATED_PARAM*) param;
                 OWFNativeStreamType owfStream = (OWFNativeStreamType) stream;
                 
-                if ((parameter->length) == sizeof(WFC_CONTENT_UPDATED_PARAM))
+                if ((parameter->length) == sizeof(SYMOWF_CONTENT_UPDATED_PARAM))
                     {
                         switch (parameter->id)
                             {
@@ -184,10 +193,8 @@
     WFC_DEVICE* device = NULL;
     WFCint      i;
     
-    if (!context || !(context->device))
-    {
-        return;
-    }
+    OWF_ASSERT(context && (context->device));
+
     device = context->device;
     
     for (i = 0; i < device->providers.length; i++)
@@ -208,10 +215,8 @@
     WFC_DEVICE* device = NULL;
     WFCint      i;
     
-    if (!context || !(context->device))
-    {
-        return;
-    }
+    OWF_ASSERT(context && (context->device));
+
     device = context->device;
     
     for (i = 0; i < device->providers.length; i++)
@@ -399,10 +404,8 @@
     WFC_IMAGE_PROVIDER* source = NULL;
     OWFNativeStreamType stream = OWF_INVALID_HANDLE;
     
-    if (!context || !element || !(context->device) || !(element->source))
-    {
-        return OWF_FALSE;
-    }
+    OWF_ASSERT(context && element && (context->device) && (element->source));
+    
     source = IMAGE_PROVIDER(element->source);
     
     if (source->type != WFC_IMAGE_SOURCE)
@@ -438,10 +441,8 @@
     WFC_DEVICE* device = NULL;
     WFCint      i;
     
-    if (!context || !(context->device))
-    {
-        return;
-    }
+    OWF_ASSERT(context && (context->device));
+
     device = context->device;
     
     OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(context->displayContext);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfscreen.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,193 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// Display Channel adaptation for owfscreen
+// 
+//
+
+#include <WF/openwfc_ri_display.h>
+#include <hal.h>
+#include "owfscreen.h"
+#include "owfdebug.h"
+#include "owfdisplaycontext.h"
+
+#include <assert.h>
+
+static OWFboolean OWF_Number_Of_Screens(OWFint *pNumberOfScreens)
+    {
+    TInt screens = 0;
+    TInt err = HAL::Get(HAL::EDisplayNumberOfScreens, screens);   
+    if (err != KErrNone)
+        {
+        DPRINT(("Cannot get number of screens from HAL, error: %d", err));
+        return OWF_FALSE;
+        }
+    *pNumberOfScreens = (OWFint)screens;
+    return OWF_TRUE;
+    }
+
+OWF_ROTATION ConvertRotation(TUint32 rotation)
+    {
+    switch(rotation)
+        {
+            case COpenWFC_RI_Display::EScreenRotate0:
+                return OWF_ROTATION_0;
+            case COpenWFC_RI_Display::EScreenRotate90:
+                return OWF_ROTATION_90;
+            case COpenWFC_RI_Display::EScreenRotate180:
+                return OWF_ROTATION_180;
+            default:
+                OWF_ASSERT(rotation == COpenWFC_RI_Display::EScreenRotate270);
+                return OWF_ROTATION_270;
+        }
+    }
+
+OWF_API_CALL OWFint OWF_Screen_GetDefaultNumber()
+    {
+    return COpenWFC_RI_Display::DefaultScreenNumber();
+    }
+
+OWF_API_CALL OWFboolean OWF_Screen_Valid(OWFint screen)
+    {
+    OWFint numberOfScreens = 0;
+    if (!OWF_Number_Of_Screens(&numberOfScreens))
+        {
+        return OWF_FALSE;
+        }
+    if (screen < 0 || screen >= numberOfScreens)
+        {
+        return OWF_FALSE;
+        }
+    return OWF_TRUE;
+    }
+
+
+OWF_API_CALL OWFboolean OWF_Screen_GetHeader(OWF_DISPCTX dc, OWF_SCREEN* header)
+    {
+    OWF_ASSERT(dc && header);
+    
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    
+    OWF_ASSERT(pDispCtx->iScreenContext);
+    
+    COpenWFC_RI_Display::TScreenGeometryAttribute info;
+    if (KErrNone != pDispCtx->iScreenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry,
+                                           &info,
+                                           sizeof(info)))
+        {
+        return OWF_FALSE;
+        }
+    
+    header->currentRotation = ConvertRotation(info.iCurrentRotation);
+    header->initialRotation = ConvertRotation(info.iDefaultRotation);
+    if (info.iPixelFormat != EUidPixelFormatXRGB_8888)
+        {
+        return OWF_FALSE;
+        }
+    header->pixelFormat = OWF_IMAGE_XRGB8888;
+    header->normal.height = info.iNormalHeight;
+    header->normal.width = info.iNormalWidth;
+    header->normal.stride = info.iNormalStride;
+    header->flipped.height = info.iFlippedHeight;
+    header->flipped.width = info.iFlippedWidth;
+    header->flipped.stride = info.iFlippedStride;
+    return OWF_TRUE;
+    }
+
+OWF_API_CALL OWFboolean OWF_Screen_Rotation_Supported(OWF_DISPCTX dc)
+    {
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    if (!dc || !pDispCtx->iScreenContext)
+        {
+        return OWF_FALSE;
+        }
+    
+    TUint32 supportedRotations;
+    pDispCtx->iScreenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeSupportedRotation,
+                                           &supportedRotations,
+                                           sizeof(supportedRotations));
+    
+    return ((supportedRotations & 0xF) == 0xF) ? OWF_TRUE : OWF_FALSE;
+    }
+
+OWF_API_CALL OWFboolean OWF_Screen_Post_Topmost_Layer(OWF_DISPCTX dc, 
+                                                      OWFNativeStreamType stream, 
+                                                      OWF_ROTATION rotation)
+    {
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    OWF_ASSERT(dc && stream && pDispCtx->iScreenContext);
+    COpenWFC_RI_Display* screenContext= pDispCtx->iScreenContext;
+
+    // If the display driver cannot handle rotation itself, the buffer will
+    // already have been rotated. 
+    TInt setTopErr=screenContext->SetTopLayerSurface((SymbianStreamType)stream);
+    if (setTopErr)
+        {
+        return OWF_FALSE;
+        }
+
+    if (OWF_Screen_Rotation_Supported(dc))
+        {
+        TUint32 screenRotation;
+        switch(rotation)
+            {
+                case OWF_ROTATION_0:
+                    screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+                    break;
+                case OWF_ROTATION_90:
+                    screenRotation = COpenWFC_RI_Display::EScreenRotate90;
+                    break;
+                case OWF_ROTATION_180:
+                    screenRotation = COpenWFC_RI_Display::EScreenRotate180;
+                    break;
+                default:
+                    OWF_ASSERT(rotation == OWF_ROTATION_270);
+                    screenRotation = COpenWFC_RI_Display::EScreenRotate270;
+            }
+        
+        
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                    &screenRotation,
+                                    sizeof(screenRotation));
+        screenContext->CommitAttribute();
+        }
+    screenContext->UpdateDisplay();
+    return OWF_TRUE;
+    }
+
+OWF_API_CALL OWFboolean OWF_Screen_Create(OWFint screen, OWF_DISPCTX dc)
+    {
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    OWF_ASSERT(dc);
+    
+    TRAPD(err, pDispCtx->iScreenContext = COpenWFC_RI_Display::NewL(screen))
+    
+    return (err == KErrNone) ? OWF_TRUE : OWF_FALSE;
+    }
+
+OWF_API_CALL void OWF_Screen_Destroy(OWF_DISPCTX dc)
+    {
+    OWFDisplayContext *pDispCtx = _OWF_DISPLAYCONTEXT(dc);
+    OWF_ASSERT(dc && pDispCtx->iScreenContext);
+    delete pDispCtx->iScreenContext;
+    pDispCtx->iScreenContext = NULL;
+    }
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/Graphics/symbian/owfscreen_displaychannel.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,458 +0,0 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-// Display Channel adaptation for owfscreen
-// 
-//
-
-#include "owfscreen.h"
-
-#include <assert.h>
-#include <e32base.h>
-#include <e32debug.h>
-#include <pixelformats.h>
-#include <hal.h>
-
-#include "owfimage.h"
-
-#include "owfdisplaycontext.h"
-
-static const int KDefaultScreenNum = 0;
-_LIT(KDisplayChannelLdd, "display0.ldd");
-
-COwfcDisplayDevice* COwfcDisplayDevice::gDisplayDeviceInstancePtr = NULL;
-
-static OWFboolean GetDisplayInfo(OWFint aScreenNumber, COWFScreenDisplayInfo * & aInfo)
-    {
-    if (!OWF_Screen_Valid(aScreenNumber))
-        {
-        return OWF_FALSE;
-        }
-    COwfcDisplayDevice *pInstance = COwfcDisplayDevice::SingletonInstance();
-    if (!pInstance)
-        {
-        return OWF_FALSE;
-        }
-    TInt index = pInstance->iScreenDisplayInfo.Find((TInt)aScreenNumber, COwfcDisplayDevice::ScreenCompare);
-    if (index == KErrNotFound)
-        {
-        return OWF_FALSE;
-        }
-    aInfo = pInstance->iScreenDisplayInfo[index];
-    return OWF_TRUE;
-    }
-
-COwfcDisplayDevice* COwfcDisplayDevice::SingletonInstance()
-    {
-    if (!gDisplayDeviceInstancePtr)
-        {
-        TInt err = User::LoadLogicalDevice(KDisplayChannelLdd);
-        if (err != KErrNone && err != KErrAlreadyExists)
-            {
-            DPRINT(("COwfcDisplayDevice::SingletonInstance: Error in LoadLogicalDevice."));
-            return NULL;
-            }
-        gDisplayDeviceInstancePtr = new COwfcDisplayDevice;
-        if (!gDisplayDeviceInstancePtr)
-            {
-            DPRINT(("Cannot create Display Device singleton instance."));
-            return NULL;
-            }
-        }
-    return gDisplayDeviceInstancePtr;
-    }
-
-TInt COwfcDisplayDevice::CloseScreen(TInt aScreen, OWFboolean *aCanDelete)
-    {
-    TInt index = iScreenDisplayInfo.Find(aScreen, ScreenCompare);
-    if (index == KErrNotFound)
-        {
-        return KErrNotFound;
-        }
-    delete iScreenDisplayInfo[index];
-    iScreenDisplayInfo.Remove(index);
-    if (iScreenDisplayInfo.Count() == 0)
-        {
-        *aCanDelete = OWF_TRUE;
-        }
-    return KErrNone;
-    }
-
-COWFScreenDisplayInfo::COWFScreenDisplayInfo(TInt aScreen):iScreenNumber(aScreen)
-    {
-    }
-
-COWFScreenDisplayInfo::~COWFScreenDisplayInfo()
-    {
-    TInt count = iCompositionBuffer.Count();
-    for(TInt ii = 0; ii < count; ++ii)
-        {
-        TBufferAddress* addr = iCompositionBuffer[ii];
-        if (addr)
-            {
-            addr->iChunk.Close();
-            delete addr;
-            }
-        }
-    iCompositionBuffer.Close();
-    // We do not need to use this boolean
-    TBool unused;
-    // Reset the initial rotation for next time.
-    iDispChan.SetRotation(iDefaultRotation, unused);
-    iDispChan.Close();
-    }
-
-void COWFScreenDisplayInfo::ConstructL()
-    {
-    User::LeaveIfError(iDispChan.Open(iScreenNumber));
-#ifdef __WINS__
-    iDefaultRotation = RDisplayChannel::ERotationNormal;
-#else
-    iDefaultRotation = RDisplayChannel::ERotation270CW;
-#endif
-    
-    switch (iDispChan.CurrentRotation())
-        {
-        case RDisplayChannel::ERotationNormal:
-            iScreenInfo.currentRotation = OWF_ROTATION_0;
-            break;
-        case RDisplayChannel::ERotation90CW:
-            iScreenInfo.currentRotation = OWF_ROTATION_90;
-            break;
-        case RDisplayChannel::ERotation180:
-            iScreenInfo.currentRotation = OWF_ROTATION_180;
-            break;
-        case RDisplayChannel::ERotation270CW:
-            iScreenInfo.currentRotation = OWF_ROTATION_270;
-            break;
-        default:
-            DPRINT(("Unsupported rotation %d", rotation));
-            User::Leave(KErrNotSupported);
-        }
-    
-    TPckgBuf<RDisplayChannel::TDisplayInfo> pkgInfo;
-    iDispChan.GetDisplayInfo(pkgInfo);
-    RDisplayChannel::TDisplayInfo info = pkgInfo();
-    switch(info.iPixelFormat)
-        {
-        case EUidPixelFormatXRGB_8888:
-        case EUidPixelFormatARGB_8888:
-        case EUidPixelFormatARGB_8888_PRE:
-            iScreenInfo.pixelFormat = OWF_IMAGE_XRGB8888;
-            break;
-#ifdef SUPPORT_565_OUTPUT
-        case EUidPixelFormatRGB_565:
-            iScreenInfo.pixelFormat = OWF_IMAGE_RGB565;
-            break;
-#endif
-        default:
-            DPRINT(("Unsupported pixel format 0x%08.8x", info.iPixelFormat));
-            User::Leave(KErrNotSupported);
-        }
-    iScreenInfo.supportedRotations = info.iAvailableRotations;
-    TInt bytesPerPixel = 2;
-    if( info.iBitsPerPixel == 24 || info.iBitsPerPixel == 32)
-        {
-        bytesPerPixel = 4;
-        }
-    
-    switch (iDefaultRotation)
-        {
-        case RDisplayChannel::ERotation90CW:
-            iRotationOffset = 1;
-            break;
-        case RDisplayChannel::ERotation180:
-            iRotationOffset = 2;
-            break;
-        case RDisplayChannel::ERotation270CW:
-            iRotationOffset = 3;
-            break;
-        case RDisplayChannel::ERotationNormal:
-        default:
-            OWF_ASSERT(iDefaultRotation == RDisplayChannel::ERotationNormal);
-            iRotationOffset = 0;
-        }
-    
-    if (iRotationOffset & 1)
-        {
-        // Either 90 or 270 degree rotation, so reverse the normal and flipped
-        // sizes (which relate to zero degrees rotation).
-        iScreenInfo.normal.width = info.iFlipped.iWidth;
-        iScreenInfo.normal.height = info.iFlipped.iHeight;
-        iScreenInfo.normal.stride = info.iFlipped.iOffsetBetweenLines;
-        iScreenInfo.flipped.width = info.iNormal.iWidth;
-        iScreenInfo.flipped.height = info.iNormal.iHeight;
-        iScreenInfo.flipped.stride = info.iNormal.iOffsetBetweenLines;
-        }
-    else
-        {
-        iScreenInfo.normal.width = info.iNormal.iWidth;
-        iScreenInfo.normal.height = info.iNormal.iHeight;
-        iScreenInfo.normal.stride = info.iNormal.iOffsetBetweenLines;
-        iScreenInfo.flipped.width = info.iFlipped.iWidth;
-        iScreenInfo.flipped.height = info.iFlipped.iHeight;
-        iScreenInfo.flipped.stride = info.iFlipped.iOffsetBetweenLines;
-        }
-        
-    if (iScreenInfo.normal.stride < 0)
-        {
-        iScreenInfo.normal.stride = bytesPerPixel * iScreenInfo.normal.width;
-        }
-    if (iScreenInfo.flipped.stride < 0)
-        {
-        iScreenInfo.flipped.stride = bytesPerPixel * iScreenInfo.flipped.width;
-        }
-    
-    for(TInt ii = 0; ii < info.iNumCompositionBuffers; ++ii)
-        {
-        iCompositionBuffer.AppendL(NULL);
-        TBufferAddress* address = new(ELeave) TBufferAddress;
-        iCompositionBuffer[ii] = address;
-        User::LeaveIfError(iDispChan.GetCompositionBufferInfo(ii, address->iChunk, address->iOffset));
-        address->iAddress = address->iChunk.Base() + address->iOffset;
-        }
-    }
-
-COWFScreenDisplayInfo* COWFScreenDisplayInfo::NewL(TInt aScreen)
-    {
-    COWFScreenDisplayInfo* sdi = new(ELeave) COWFScreenDisplayInfo(aScreen);
-    CleanupStack::PushL(sdi);
-    sdi->ConstructL();
-    CleanupStack::Pop(sdi);
-    return sdi;
-    }
-
-COwfcDisplayDevice::~COwfcDisplayDevice()
-    {
-    COwfcDisplayDevice::gDisplayDeviceInstancePtr = NULL;
-    iScreenDisplayInfo.Close();
-    }
-
-TInt COwfcDisplayDevice::OpenScreen(TInt aScreen)
-    {
-    if (!OWF_Screen_Valid(aScreen))
-        {
-        return KErrNotSupported;
-        }
-    TInt err = iScreenDisplayInfo.Find(aScreen, ScreenCompare);
-    if (err != KErrNotFound)
-        {
-        return KErrInUse;
-        }
-    COWFScreenDisplayInfo *info = NULL;
-    TRAP(err, info = COWFScreenDisplayInfo::NewL(aScreen));
-    if (err == KErrNone)
-        {
-        err = iScreenDisplayInfo.Append(info);
-        if (err != KErrNone)
-            {
-            delete info;
-            }
-        }
-    return err;
-    }
-
-OWFboolean COWFScreenDisplayInfo::Blit(void* buffer, OWF_ROTATION rotation)
-    {
-    TInt err;
-    
-    if (iScreenInfo.currentRotation != rotation)
-        {
-        TInt totalRotation;
-        RDisplayChannel::TDisplayRotation dcRotation;
-
-        // Change the rotation to a numeric index from zero
-        switch (rotation)
-            {
-            case OWF_ROTATION_90:
-                totalRotation = 1;
-                break;
-            case OWF_ROTATION_180:
-                totalRotation = 2;
-                break;
-            case OWF_ROTATION_270:
-                totalRotation = 3;
-                break;
-            case OWF_ROTATION_0:
-            default:
-                OWF_ASSERT(rotation == OWF_ROTATION_0);
-                totalRotation = 0;
-                break;
-            }
-
-        // Add the initial rotation of the device and wrap to get final one.
-        totalRotation = (totalRotation + iRotationOffset) % 4;
-
-        // Now change the final rotation to the display channel rotation
-        switch (totalRotation)
-            {
-            case 1:
-                dcRotation = RDisplayChannel::ERotation90CW;
-                break;
-            case 2:
-                dcRotation = RDisplayChannel::ERotation180;
-                break;
-            case 3:
-                dcRotation = RDisplayChannel::ERotation270CW;
-                break;
-            case 0:
-            default:
-                OWF_ASSERT(totalRotation == 0);
-                dcRotation = RDisplayChannel::ERotationNormal;
-                break;
-            }
-
-        if (!(iScreenInfo.supportedRotations & dcRotation))
-            {
-            return OWF_FALSE;
-            }
-        // We do not need to use this boolean
-        TBool displayConfigChanged;
-        err = iDispChan.SetRotation(dcRotation, displayConfigChanged);
-        OWF_ASSERT(err == KErrNone);
-        iScreenInfo.currentRotation = rotation;    
-        }
-    
-    TUint bufferIndex;
-	TRequestStatus status;
-	iDispChan.GetCompositionBuffer(bufferIndex, status);
-	User::WaitForRequest(status);
-	
-	err = status.Int();
-	if (err != KErrNone || bufferIndex >= iCompositionBuffer.Count()) 
-		{
-		return OWF_FALSE;
-		}
-	
-	TUint8* firstPixelAddr = iCompositionBuffer[bufferIndex]->iAddress;
-	
-	// Only 32 or 16bpp supported and assume stride == width * pixel size
-	TInt size = 0;
-	if (rotation == OWF_ROTATION_0 || rotation == OWF_ROTATION_180)
-	    {
-	    size = iScreenInfo.normal.height * iScreenInfo.normal.stride; 
-	    }
-	else
-	    {
-        size = iScreenInfo.flipped.height * iScreenInfo.flipped.stride; 
-	    }
-	Mem::Move(firstPixelAddr, buffer, size);
-	RDisplayChannel::TPostCount postCount;
-	err = iDispChan.PostCompositionBuffer(NULL, postCount);
-	if (err == KErrNone)
-		{
-		// This will throttle composition more than necessary,
-		// since it will wait until buffer is being displayed
-		iDispChan.WaitForPost(postCount, status);
-		User::WaitForRequest(status);
-		err = status.Int();
-		}
-	return (err == KErrNone) ? OWF_TRUE : OWF_FALSE;
-	}
-
-TInt COWFScreenDisplayInfo::ScreenNumber() const
-    {
-    return iScreenNumber;
-    }
-    
-void COWFScreenDisplayInfo::GetScreenInfo(OWF_SCREEN *header) const
-    {
-    *header = iScreenInfo;
-    }
-
-//
-
-OWF_API_CALL OWFint OWF_Screen_GetDefaultNumber()
-    {
-    return KDefaultScreenNum;
-    }
-
-OWF_API_CALL OWFboolean OWF_Number_Of_Screens(OWFint *pNumberOfScreens)
-    {
-    TInt screens = 0;
-    TInt err = HAL::Get(HAL::EDisplayNumberOfScreens, screens);
-    if (err != KErrNone)
-        {
-        DPRINT(("Cannot get number of screens from HAL, error: %d", err));
-        return OWF_FALSE;
-        }
-    *pNumberOfScreens = (OWFint)screens;
-    return OWF_TRUE;
-    }
-
-OWF_API_CALL OWFboolean OWF_Screen_Valid(OWFint screen)
-    {
-    OWFint numberOfScreens = 0;
-    if (!OWF_Number_Of_Screens(&numberOfScreens))
-        {
-        return OWF_FALSE;
-        }
-    if (screen < 0 || screen >= numberOfScreens)
-        {
-        return OWF_FALSE;
-        }
-    return OWF_TRUE;
-    }
-
-OWF_API_CALL OWFboolean OWF_Screen_Valid_And_Available(OWFint screen)
-    {
-    if (!OWF_Screen_Valid(screen))
-        {
-        return OWF_FALSE;
-        }
-    COwfcDisplayDevice *pInstance = COwfcDisplayDevice::SingletonInstance();
-    if (!pInstance)
-        {
-        return OWF_TRUE;
-        }
-    TInt index = pInstance->iScreenDisplayInfo.Find((TInt)screen, COwfcDisplayDevice::ScreenCompare);
-    if (index != KErrNotFound)
-        {
-        return OWF_FALSE; 
-        }
-    return OWF_TRUE;
-    }
-
-OWF_API_CALL OWFboolean OWF_Screen_GetHeader(OWFint screen, OWF_SCREEN* header)
-    {
-    COWFScreenDisplayInfo* info;
-    if (!GetDisplayInfo(screen, info))
-        {
-        return OWF_FALSE;
-        }
-    info->GetScreenInfo(header);
-    return OWF_TRUE;
-    }
-
-OWF_API_CALL OWFboolean OWF_Screen_Blit(OWFint screenNumber, void* buffer, OWF_ROTATION rotation)
-    {
-    COWFScreenDisplayInfo* info;
-    if (!GetDisplayInfo(screenNumber, info))
-        {
-        return OWF_FALSE;
-        }
-    return info->Blit(buffer, rotation);
-    }
-
-OWF_API_CALL OWFboolean
-OWF_Screen_Rotation_Supported(OWFint screen)
-    {
-    COWFScreenDisplayInfo* info;
-    if (!GetDisplayInfo(screen, info))
-        {
-        return OWF_FALSE;
-        }
-    OWF_SCREEN header;
-    info->GetScreenInfo(&header);
-    return (header.supportedRotations & 0xF == 0xF) ? OWF_TRUE : OWF_FALSE;
-    }
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfconsole.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfconsole.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,14 +1,23 @@
 // Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 //
 // Description:
 // Console adaptation for OpenWFC conformance tests
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfextensions.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfextensions.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,14 +1,23 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 //
 // Description:
 // Tables of OpenWF-C strings and extensions, plus access for EGL.
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmessagequeue.c	Tue Jul 06 15:45:57 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,150 +0,0 @@
-/* Copyright (c) 2009 The Khronos Group Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and/or associated documentation files (the
- * "Materials"), to deal in the Materials without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Materials, and to
- * permit persons to whom the Materials are furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Materials.
- *
- * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
- */
-
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <sys/select.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "owfmessagequeue.h"
-#include "owfmutex.h"
-#include "owfsemaphore.h"
-#include "owftypes.h"
-#include "owfmemory.h"
-#include "owfdebug.h"
-
-
-#define LOCK_QUEUE(x)       OWF_Mutex_Lock(&(x->mutex))
-#define UNLOCK_QUEUE(x)     OWF_Mutex_Unlock(&(x->mutex))
-
-#define WAIT_TIL_THE_END_OF_TIME    -1
-
-OWF_API_CALL void
-OWF_MessageQueue_Destroy(OWF_MESSAGE_QUEUE* queue)
-{
-    if (!queue) {
-        return;
-    }
-
-    close(queue->read);
-    close(queue->write);
-}
-
-OWF_API_CALL OWFint
-OWF_MessageQueue_Init(OWF_MESSAGE_QUEUE* queue)
-{
-    OWFint                     err; 
-    int                        handles[2];
-
-    OWF_ASSERT(queue);
-
-    queue->read = queue->write = -1;
-
-    err = pipe(handles);
-    if (err) {
-        return err;
-    }
-
-    queue->read     = handles[0];
-    queue->write    = handles[1];
-    return 0;
-}
-
-OWF_API_CALL void
-OWF_Message_Send(OWF_MESSAGE_QUEUE* queue,
-                 OWFuint msg,
-                 void* data)
-{
-    OWF_MESSAGE             m;
-
-    OWF_ASSERT(queue);
-
-    m.id = msg;
-    m.data = data;
-
-    write(queue->write, &m, sizeof(OWF_MESSAGE));
-}
-
-static OWFint
-OWF_Message_DoFetch(OWF_MESSAGE_QUEUE* queue,
-                    OWF_MESSAGE* msg,
-                    OWFint timeout)
-{
-    /*
-    MUST BE CALLED FROM MUTEX
-    */
-
-    OWF_ASSERT(queue);
-    OWF_ASSERT(msg);
-
-    if (timeout > -1)
-    {
-        OWFint                  r = 0;
-        fd_set                  s;
-        struct timeval          to;
-
-
-        to.tv_sec = 0;
-        to.tv_usec = (suseconds_t) timeout;
-
-        FD_ZERO(&s);
-        FD_SET(queue->read, &s);
-        r = select(FD_SETSIZE, &s, NULL, NULL, &to);
-
-        if (r <  1)
-        {
-            return -1;
-        }
-    }
-    read(queue->read, msg, sizeof(OWF_MESSAGE));
-    return 0;
-}
-
-OWF_API_CALL OWFint
-OWF_Message_Wait(OWF_MESSAGE_QUEUE* queue,
-                 OWF_MESSAGE* msg,
-                 OWFint timeout)
-{
-    OWF_ASSERT(queue);
-    OWF_ASSERT(msg);
-
-    return OWF_Message_DoFetch(queue, msg, timeout);
-}
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmessagequeue.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,211 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// 
+//
+//
+
+#define KInitialIndexValue (-1)
+
+#include "owfmessagequeue.h"
+#include "owfdebug.h"
+#include <e32base.h>
+
+class CMessageQueue: public CBase
+    {
+    public:
+        virtual ~CMessageQueue();
+        static CMessageQueue* NewL();
+        static CMessageQueue* NewLC();
+        void Send(TInt msg, void* data);
+        TInt Fetch(OWF_MESSAGE* msg, TInt timeout);
+        TInt Fetch(OWF_MESSAGE* msg);
+        
+    private:
+        CMessageQueue();
+        void ConstructL();
+        
+    private:
+        const static TInt iQueueSize = 16;
+        OWF_MESSAGE iMessageArray[iQueueSize];
+        RSemaphore iFetchSeamaphore;
+        RSemaphore iSendSemaphore;
+        RFastLock iProtectionMutex;
+        TInt iSendIndex;
+        TInt iFetchIndex;
+    };
+
+CMessageQueue::CMessageQueue():
+iSendIndex(KInitialIndexValue),
+iFetchIndex(KInitialIndexValue)
+    {
+    
+    }
+
+CMessageQueue::~CMessageQueue()
+    {
+    iFetchSeamaphore.Close();
+    iSendSemaphore.Close();
+    iProtectionMutex.Close();
+    }
+
+void CMessageQueue::ConstructL()
+    {
+    User::LeaveIfError(iFetchSeamaphore.CreateLocal(0));
+    User::LeaveIfError(iSendSemaphore.CreateLocal(iQueueSize));
+    User::LeaveIfError(iProtectionMutex.CreateLocal());
+    }
+
+CMessageQueue* CMessageQueue::NewLC()
+    {
+    CMessageQueue* self = new(ELeave) CMessageQueue();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return(self);
+    }
+
+CMessageQueue* CMessageQueue::NewL()
+    {
+    CMessageQueue* self = CMessageQueue::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+void CMessageQueue::Send(TInt msg, void* data)
+    {
+    iSendSemaphore.Wait();
+    iProtectionMutex.Wait();
+    iSendIndex = (iSendIndex + 1) % iQueueSize;
+    iMessageArray[iSendIndex].id = msg;
+    iMessageArray[iSendIndex].data = data;
+    iProtectionMutex.Signal();
+    iFetchSeamaphore.Signal();
+    }
+
+TInt CMessageQueue::Fetch(OWF_MESSAGE* msg, TInt timeout)
+    {
+    TInt ret = KErrNone;
+    if (!msg)
+        {
+        return KErrArgument;
+        }
+    
+    if ((ret = iFetchSeamaphore.Wait(timeout)) == KErrNone)
+        {
+        iProtectionMutex.Wait();
+        if (iSendIndex == iFetchIndex)
+            {
+            iProtectionMutex.Signal();
+            return KErrTimedOut;
+            }
+        else
+            {
+            iFetchIndex = (iFetchIndex + 1) % iQueueSize;
+            *msg = iMessageArray[iFetchIndex];
+            iProtectionMutex.Signal();
+            iSendSemaphore.Signal();
+            return KErrNone;
+            }
+        }
+    return ret;
+    }
+
+TInt CMessageQueue::Fetch(OWF_MESSAGE* msg)
+    {
+    if (!msg)
+        {
+        return KErrArgument;
+        }
+    
+    iFetchSeamaphore.Wait();
+    iProtectionMutex.Wait();
+    iFetchIndex = (iFetchIndex + 1) % iQueueSize;
+    *msg = iMessageArray[iFetchIndex];
+    iProtectionMutex.Signal();
+    iSendSemaphore.Signal();
+    return KErrNone;
+    }
+
+OWF_API_CALL void
+OWF_MessageQueue_Destroy(OWF_MESSAGE_QUEUE* queue)
+{
+    if (!queue) 
+        {
+        return;
+        }
+    delete (CMessageQueue*)queue->queuePtr;
+    queue->queuePtr = NULL;
+}
+
+OWF_API_CALL OWFint
+OWF_MessageQueue_Init(OWF_MESSAGE_QUEUE* queue)
+{
+    if (!queue) 
+        {
+        return MSG_QUEUE_INIT_ERR;
+        }
+    
+    TRAPD(err, queue->queuePtr = CMessageQueue::NewL());
+    return (err || !queue->queuePtr) ? MSG_QUEUE_INIT_ERR : MSG_QUEUE_INIT_OK;
+}
+
+OWF_API_CALL void
+OWF_Message_Send(OWF_MESSAGE_QUEUE* queue,
+                 OWFuint msg,
+                 void* data)
+{
+    OWF_ASSERT(queue);
+    OWF_ASSERT(queue->queuePtr);
+    
+    ((CMessageQueue*)(queue->queuePtr))->Send(msg, data);
+}
+
+OWF_API_CALL OWFint
+OWF_Message_Wait(OWF_MESSAGE_QUEUE* queue,
+                 OWF_MESSAGE* msg,
+                 OWFint timeout)
+{
+    OWF_ASSERT(queue);
+    OWF_ASSERT(queue->queuePtr);
+    OWF_ASSERT(msg);
+    
+    OWFint ret = 0;
+    
+    if (WAIT_FOREVER == timeout)
+        {
+        ret = ((CMessageQueue*)(queue->queuePtr))->Fetch(msg);
+        }
+    else
+        {
+        ret = ((CMessageQueue*)(queue->queuePtr))->Fetch(msg, timeout);
+        }
+    switch (ret)
+        {
+        case KErrNone:
+            return MSG_QUEUE_WAIT_MSG_FETCHED;
+        case KErrTimedOut:
+            return MSG_QUEUE_WAIT_MSG_TIMEDOUT;
+        default:
+            return MSG_QUEUE_WAIT_MSG_ERR;
+        }
+}
+
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmutex.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfmutex.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 The Khronos Group Inc.
+/* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -7,10 +7,10 @@
  * distribute, sublicense, and/or sell copies of the Materials, and to
  * permit persons to whom the Materials are furnished to do so, subject to
  * the following conditions:
- *
+ * 
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Materials.
- *
+ * 
  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
@@ -19,7 +19,7 @@
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
  */
-
+ 
 
 
 #ifdef __cplusplus
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfsemaphore.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfsemaphore.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 The Khronos Group Inc.
+/* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -7,10 +7,10 @@
  * distribute, sublicense, and/or sell copies of the Materials, and to
  * permit persons to whom the Materials are furnished to do so, subject to
  * the following conditions:
- *
+ * 
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Materials.
- *
+ * 
  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--- a/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfthread.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/adaptation/src/Platform/OS/symbian/owfthread.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,5 @@
-/* Copyright (c) 2009 The Khronos Group Inc.
- *
+/* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * 
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
  * "Materials"), to deal in the Materials without restriction, including
@@ -7,10 +7,10 @@
  * distribute, sublicense, and/or sell copies of the Materials, and to
  * permit persons to whom the Materials are furnished to do so, subject to
  * the following conditions:
- *
+ * 
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Materials.
- *
+ * 
  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/bwins/openwfc_ri_displayu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,4 @@
+EXPORTS
+	?NewL@COpenWFC_RI_Display@@SAPAV1@I@Z @ 1  NONAME ; class COpenWFC_RI_Display * COpenWFC_RI_Display::NewL(unsigned int)
+	?DefaultScreenNumber@COpenWFC_RI_Display@@SAKXZ @ 2  NONAME ; unsigned long COpenWFC_RI_Display::DefaultScreenNumber(void)
+
--- a/graphicscomposition/openwfcompositionengine/common/include/owfattributes.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/include/owfattributes.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/common/include/owfdebug.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/include/owfdebug.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/common/include/owfimage.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/include/owfimage.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -195,8 +196,6 @@
 
     OWF_IMAGE*              mask;
     OWFsubpixel             globalAlpha;
-    OWFboolean              destinationFullyOpaque;
-    OWFpixel*               tsColor;
 } OWF_BLEND_INFO;
 
 
--- a/graphicscomposition/openwfcompositionengine/common/include/owflinkedlist.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/include/owflinkedlist.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -131,41 +132,6 @@
 OWF_API_CALL OWF_NODE*
 OWF_List_Clear(OWF_NODE* root);
 
-/*!
- *  Calls given callback function for each node in the list
- *  as long as the callback function returns a non-zero value.
- *  Useful for performing some action on list until some condition
- *  is met.
- *
- *  \param root List root
- *  \param func Callback function
- *  \param data Data to be passed to callback function
- */
-OWF_API_CALL void
-OWF_List_ForEach(OWF_NODE* root, NODEITERFUNC func, void* data);
-
-/*
- *  Returns first node for which given comparison function
- *  returns a non-zero value. Useful for searching the list
- *  for something of intrest. To find all matching nodes
- *  from the list, use the following pattern:
- *
- *  node = OWF_List_Find(list, compareFunc, dada);
- *  while (node) {
- *      processFoundNode(node);
- *      node = OWF_List_Find(node->next, compareFunc, dada);
- *  }
- *
- *  \param root List root
- *  \param func Node equality comparison function
- *  \param data Data to pass to node comparison function.
- *
- *  \return Node that matches in comparison.
- */
-OWF_API_CALL OWF_NODE*
-OWF_List_Find(OWF_NODE* root, NODECMPFUNC func, void* data);
-
-
 #ifdef __cplusplus
 }
 #endif
--- a/graphicscomposition/openwfcompositionengine/common/include/owfmemory.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/include/owfmemory.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/common/include/owftypes.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/include/owftypes.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -119,15 +120,6 @@
 /*!
  *  Events emitted by native streams.
  */
-typedef enum
-{
-    OWF_NO_EVENT                        = 0x00000000,
-    OWF_STREAM_COMPOSED                 = 0x00000001,
-    OWF_STREAM_UPDATED                  = 0x00000010,
-    OWF_ALL_CONTEXT_RELATED_EVENTS      = 0x0000fff0,
-    OWF_ALL_SUS_RELATED_EVENTS          = 0x0000ff00,
-    OWF_OBSERVER_RETURN_DEFAULT_EVENT   = 0x00010000,
-} OWFNativeStreamEvent;
 
 typedef struct{
     TInt32      length;
--- a/graphicscomposition/openwfcompositionengine/common/src/owfattributes.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/src/owfattributes.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/common/src/owfdebug.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/src/owfdebug.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/common/src/owfimage.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/src/owfimage.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,6 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
- *
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
+ * 
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
  * "Materials"), to deal in the Materials without restriction, including
@@ -48,6 +49,8 @@
 OWF_API_CALL void
 OWF_IMAGE_Ctor(void* self)
 {
+    DPRINT(("OWF_IMAGE_Ctor"));
+
     self = self;
 }
 
@@ -57,6 +60,8 @@
 {
     OWF_IMAGE* image;
 
+    DPRINT(("OWF_IMAGE_Dtor"));
+
     image = (OWF_IMAGE*)self;
 
     if (image && image->data)
@@ -102,6 +107,8 @@
     OWFpixel*            ptr;
     OWFint               count;
 
+    DPRINT(("OWF_Image_NonLinearizeData"));
+
     OWF_ASSERT(image != NULL && image->data != NULL);
     OWF_ASSERT(image->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
 
@@ -136,6 +143,8 @@
     OWFpixel*               ptr;
     OWFuint                 count;
 
+    DPRINT(("OWF_Image_LinearizeData"));
+
     OWF_ASSERT(image != NULL && image->data != NULL);
     OWF_ASSERT(image->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
 
@@ -173,6 +182,8 @@
     OWFpixel*            ptr;
     OWFint               count;
 
+    DPRINT(("OWF_Image_Gamma"));
+
     OWF_ASSERT(image != NULL && image->data != NULL);
     OWF_ASSERT(image->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
 
@@ -207,11 +218,13 @@
     OWFuint8*       srcPtr      = NULL;
     OWFuint8*       dstPtr      = NULL;
     
+    DPRINT(("OWF_Image_EdgeReplication"));
+
     OWF_ASSERT(image);
     OWF_ASSERT(image->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
     OWF_ASSERT(image->width >= 3 && image->height >= 3);
     
-    copyStride = image->width * image->pixelSize;    
+    copyStride = OWF_Image_GetStride(image->width, &image->format, 0);
     
     /* top side replication */
     srcPtr = (OWFuint8*) image->data;
@@ -252,11 +265,16 @@
     void*       srcLinePtr;
     OWFpixel*   dstLinePtr;
     OWFboolean  replicateEdges = OWF_FALSE;
-    
+#ifndef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
+    OWFint      widthBytes;
+#endif
+
+    DPRINT(("OWF_Image_SourceFormatConversion"));
 
     OWF_ASSERT(dst != 0 && dst->data != NULL);
     OWF_ASSERT(src != 0 && src->data != NULL);
     OWF_ASSERT(dst->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
+    OWF_ASSERT(dst->stride == OWF_Image_GetStride(dst->width, &dst->format, 0));
     
     srcLinePtr = src->data;
     dstLinePtr = (OWFpixel*) dst->data;    
@@ -285,6 +303,10 @@
         return OWF_FALSE;
     }
 
+#ifndef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
+    widthBytes = OWF_Image_GetStride(src->width, &src->format, 0);
+#endif
+
     for (countY = src->height; countY; countY--)
     {
         OWFint count = src->width;
@@ -294,6 +316,7 @@
         {
             case OWF_IMAGE_ARGB8888:
             {
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
                 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr;
     
                 while (count > 0)
@@ -310,6 +333,9 @@
                     srcPtr ++;
                     count--;
                 }
+#else
+                memcpy(dstLinePtr, srcLinePtr, widthBytes);
+#endif
                 break;
             }
     
@@ -319,6 +345,7 @@
                 
                 while (count > 0)
                 {
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
                     dstPtr->color.alpha = OWF_FULLY_OPAQUE;
                     dstPtr->color.red   = (OWFsubpixel)
                         OWF_RED_MAX_VALUE * ((*srcPtr & ARGB8888_RED_MASK) >> ARGB8888_RED_SHIFT) / OWF_BYTE_MAX_VALUE;
@@ -326,6 +353,9 @@
                         OWF_GREEN_MAX_VALUE * ((*srcPtr & ARGB8888_GREEN_MASK) >> ARGB8888_GREEN_SHIFT) / OWF_BYTE_MAX_VALUE;
                     dstPtr->color.blue  = (OWFsubpixel)
                         OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE;
+#else
+                    *(OWFuint32*)dstPtr = *srcPtr | ARGB8888_ALPHA_MASK;
+#endif
                     dstPtr ++;
                     srcPtr ++;
                     count--;
@@ -388,6 +418,8 @@
     OWFint                  size;
     OWFint                  pixelSize;
 
+    DPRINT(("OWF_Image_GetStride"));
+
     OWF_ASSERT(format);
 
     pixelSize = OWF_Image_GetFormatPixelSize(format->pixelFormat);
@@ -420,6 +452,8 @@
 OWF_API_CALL OWFboolean
 OWF_Image_IsValidDestinationFormat(OWF_IMAGE_FORMAT* format)
 {
+    DPRINT(("OWF_Image_IsValidDestinationFormat"));
+
     switch (format->pixelFormat)
     {
         case OWF_IMAGE_ARGB8888:
@@ -450,10 +484,16 @@
     OWFint                  countY;
     OWFuint32*              dstPtr;
     OWFpixel*               srcPtr;
+#ifndef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
+    OWFint                  widthBytes;
+#endif
+
+    DPRINT(("OWF_Image_DestinationFormatConversion"));
 
     OWF_ASSERT(dst != 0 && dst->data != NULL);
     OWF_ASSERT(src != 0 && src->data != NULL);
     OWF_ASSERT(src->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
+    /* Note: src->stride cannot be relied upon to be correct. Assume lines are contiguous. */
 
     if (src->format.pixelFormat != OWF_IMAGE_ARGB_INTERNAL)
     {
@@ -478,6 +518,10 @@
         OWF_Image_UnpremultiplyAlpha(src);
     }
 
+#ifndef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
+    widthBytes = OWF_Image_GetStride(src->width, &src->format, 0);
+#endif
+
     for (countY = 0; countY < src->height; countY++)
     {   
         OWFuint8* destination = (OWFuint8*) dst->data;
@@ -488,6 +532,7 @@
         {
             case OWF_IMAGE_ARGB8888:
             {
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
                 OWFint countX;
                 OWFuint32 dstPixel = 0;               
                 
@@ -505,6 +550,10 @@
                     dstPtr ++;
                     srcPtr ++;
                 }
+#else
+                memcpy(dstPtr, srcPtr, widthBytes);
+                srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + widthBytes);
+#endif
                 break;
             }
     
@@ -515,6 +564,7 @@
                 
                 for (countX = 0; countX < src->width; countX++)
                 {
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
                     dstPixel  = ARGB8888_ALPHA_MASK;
                     dstPixel |= ((OWFuint8)(roundSubPixel(OWF_BYTE_MAX_VALUE * srcPtr->color.red / OWF_RED_MAX_VALUE))   <<
                                 ARGB8888_RED_SHIFT);
@@ -522,6 +572,9 @@
                                 ARGB8888_GREEN_SHIFT);
                     dstPixel |= ((OWFuint8)(roundSubPixel(OWF_BYTE_MAX_VALUE * srcPtr->color.blue / OWF_BLUE_MAX_VALUE))  <<
                                 ARGB8888_BLUE_SHIFT);
+#else
+                    dstPixel = *(OWFuint32*)srcPtr | ARGB8888_ALPHA_MASK;
+#endif
                     *dstPtr = dstPixel;
                     dstPtr ++;
                     srcPtr ++;
@@ -543,6 +596,8 @@
 OWF_API_CALL void
 OWF_Image_Init(OWF_IMAGE* image)
 {
+    DPRINT(("OWF_Image_Init"));
+
     OWF_ASSERT(NULL != image);
     memset(image, 0, sizeof(OWF_IMAGE));
 }
@@ -558,6 +613,8 @@
 {
     OWF_IMAGE*      image;
 
+    DPRINT(("OWF_Image_Create"));
+
     image = CREATE(OWF_IMAGE);
 
     if (image)
@@ -634,6 +691,8 @@
 {
     OWF_IMAGE* newImage = NULL;
 
+    DPRINT(("OWF_Image_Copy"));
+
     OWF_ASSERT(image);
 
     newImage = CREATE(OWF_IMAGE);
@@ -664,6 +723,8 @@
     OWFint                  size;
     OWFint                  stride;
 
+    DPRINT(("OWF_Image_SetSize"));
+
     OWF_ASSERT(image);
     OWF_ASSERT(image->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL ||
             image->format.pixelFormat==OWF_IMAGE_L32);
@@ -688,6 +749,8 @@
                   OWFboolean premultiply,
                   OWFboolean linear)
     {
+    DPRINT(("OWF_Image_SetFlags"));
+
     OWF_ASSERT(image);
     OWF_ASSERT(image->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL ||
             image->format.pixelFormat==OWF_IMAGE_L32);
@@ -699,6 +762,8 @@
 OWF_API_CALL void
 OWF_Image_SetPixelBuffer(OWF_IMAGE* image,      void* buffer)
     {
+    DPRINT(("OWF_Image_SetPixelBuffer"));
+
     OWF_ASSERT(image);
     OWF_ASSERT(buffer);
     OWF_ASSERT(image->foreign);
@@ -763,6 +828,8 @@
     OWFuint8*               srcPtr      = NULL;
     OWFuint8*               dstPtr      = NULL;
 
+    DPRINT(("OWF_Image_Blit"));
+
     OWF_ASSERT(dst != 0 && dst->data != NULL);
     OWF_ASSERT(src != 0 && src->data != NULL);
     OWF_ASSERT(dst->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
@@ -900,9 +967,10 @@
                                    OWFfloat* srcRect)
 {
     OWFint                  ox = 0, oy = 0;
-    OWFfloat                dx = 0.f, dy = 0.f; 
     OWFint                  x, y;
 
+    DPRINT(("OWF_Image_PointSamplingStretchBlit"));
+
     /* images must be valid */
     if (!((src != NULL) && (src->data != NULL) &&
           (dst != NULL) && (dst->data != NULL)))
@@ -926,35 +994,94 @@
         return OWF_FALSE;
     }
 
-    /* solve scaling ratios for image */
-    dx = (OWFfloat) srcRect[2] / (OWFfloat) dstRect->width;
-    dy = (OWFfloat) srcRect[3] / (OWFfloat) dstRect->height;
-
-    for (y = 0; y < dstRect->height; y++)
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
     {
-        for (x = 0; x < dstRect->width; x++) 
+        OWFfloat                dx = 0.f, dy = 0.f; 
+    
+        /* solve scaling ratios for image */
+        dx = (OWFfloat) srcRect[2] / (OWFfloat) dstRect->width;
+        dy = (OWFfloat) srcRect[3] / (OWFfloat) dstRect->height;
+    
+        for (y = 0; y < dstRect->height; y++)
         {
-            OWFpixel*       pixel;         
-            
-            /* NOTE This code uses pixel center points to calculate distances
-                    and factors. Results can differ slightly when pixel corner
-                    coordinates are used */            
-            
-            /* coordinates of nearest pixel in original image */
-            ox = (int) floor((((OWFfloat) x + 0.5) * dx) + srcRect[0]);
-            oy = (int) floor((((OWFfloat) y + 0.5) * dy) + srcRect[1]);     
-            
-            pixel = OWF_Image_GetPixelPtr(src,
-                                          ox,
-                                          oy);
-            
-            OWF_Image_SetPixel(dst,
-                               dstRect->x + x,
-                               dstRect->y + y,
-                               pixel);
-            
+            for (x = 0; x < dstRect->width; x++) 
+            {
+                OWFpixel*       pixel;         
+                
+                /* NOTE This code uses pixel center points to calculate distances
+                        and factors. Results can differ slightly when pixel corner
+                        coordinates are used */            
+                
+                /* coordinates of nearest pixel in original image */
+                ox = (int) floor((((OWFfloat) x + 0.5) * dx) + srcRect[0]);
+                oy = (int) floor((((OWFfloat) y + 0.5) * dy) + srcRect[1]);     
+                
+                pixel = OWF_Image_GetPixelPtr(src,
+                                              ox,
+                                              oy);
+                
+                OWF_Image_SetPixel(dst,
+                                   dstRect->x + x,
+                                   dstRect->y + y,
+                                   pixel);
+                
+            }
         }
     }
+#else
+    if (srcRect[0] < 0 || (srcRect[0] + srcRect[2]) > src->width ||
+            srcRect[1] < 0 || (srcRect[1] + srcRect[3]) > src->height)
+        {
+        /* Source rectangle out of bounds */
+        return OWF_FALSE;
+        }
+
+    if (dstRect->x < 0 || (dstRect->x + dstRect->width) > dst->width ||
+            dstRect->y < 0 || (dstRect->y + dstRect->height) > dst->height)
+        {
+        /* Destination rectangle out of bounds */
+        return OWF_FALSE;
+        }
+
+    {
+        OWFint dxFix, dyFix;
+        OWFint xFixStart, yFix;
+        OWFuint32 *dstPtr, *srcLinePtr;
+    
+/* Integer <-> 16.16 fixed point conversion macros */
+#define INT_TO_FIXED_PT(X) ((X) << 16)
+#define FIXED_PT_TO_INT(X) ((X) >> 16)
+    
+        /* Calculate scaling factors in fixed point (with rounding). */
+        dxFix = (OWFint)((srcRect[2] * INT_TO_FIXED_PT(1) + (dstRect->width >> 1)) / dstRect->width);
+        dyFix = (OWFint)((srcRect[3] * INT_TO_FIXED_PT(1) + (dstRect->height >> 1)) / dstRect->height);
+    
+        /* Calculate fixed point location in source, with half-pixel offset */
+        xFixStart = (OWFint)(srcRect[0] * INT_TO_FIXED_PT(1) + (dxFix >> 1));
+        yFix = (OWFint)(srcRect[1] * INT_TO_FIXED_PT(1) + (dyFix >> 1));
+    
+        /* Initial target address. */
+        dstPtr = (OWFuint32*)dst->data + dstRect->y * dst->width + dstRect->x;
+    
+        for (y = 0; y < dstRect->height; y++)
+        {
+            OWFint xFix = xFixStart;
+    
+            oy = FIXED_PT_TO_INT(yFix);
+            srcLinePtr = (OWFuint32*)src->data + oy * src->width;
+    
+            for (x = 0; x < dstRect->width; x++) 
+            {
+                ox = FIXED_PT_TO_INT(xFix);
+                dstPtr[x] = srcLinePtr[ox];
+                xFix += dxFix;
+            }
+    
+            dstPtr += dst->width;
+            yFix += dyFix;
+        }
+    }
+#endif
     return OWF_TRUE;
 }
 
@@ -972,6 +1099,8 @@
     OWFpixel*               sample[4];
     OWFpixel*               pixel = NULL;
 
+    DPRINT(("OWF_Image_BilinearStretchBlit"));
+
     /* images must be valid */
     if (!((src != NULL) && (src->data != NULL) &&
           (dst != NULL) && (dst->data != NULL)))
@@ -1117,13 +1246,17 @@
     OWFint                  i, numPixels;
     OWFpixel*                pixels;
 
+    DPRINT(("OWF_Image_Clear"));
+
     OWF_ASSERT(image != 0);
     OWF_ASSERT(image->data != 0);
     OWF_ASSERT(image->format.pixelFormat == OWF_IMAGE_ARGB_INTERNAL);
+    /* Note: image->stride cannot be relied upon to be correct. Assume lines are contiguous. */
 
     numPixels = image->width * image->height;
     pixels = (OWFpixel*) image->data;
 
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
     for (i = 0; i < numPixels; i++)
     {
         pixels[i].color.red   = (OWFsubpixel) red;
@@ -1131,6 +1264,29 @@
         pixels[i].color.blue  = (OWFsubpixel) blue;
         pixels[i].color.alpha = (OWFsubpixel) alpha;
     }
+#else
+    if (alpha == red && alpha == green && alpha == blue)
+        {
+        /* If all four bytes are the same, just use memset */
+        OWFuint32 clearBytes = numPixels * sizeof(OWFuint32);
+
+        memset(pixels, alpha, clearBytes);
+        }
+    else
+        {
+        /* Otherwise assign each pixel the packed value */
+        OWFuint32* pixelPtr = (OWFuint32*)pixels;
+        OWFuint32 pixel;
+    
+        pixel = (alpha << ARGB8888_ALPHA_SHIFT) | (red << ARGB8888_RED_SHIFT) |
+                (green << ARGB8888_GREEN_SHIFT) | (blue << ARGB8888_BLUE_SHIFT);
+
+        for (i = 0; i < numPixels; i++)
+            {
+            pixelPtr[i] = pixel;
+            }
+        }
+#endif
 }
 
 /*----------------------------------------------------------------------------*/
@@ -1139,6 +1295,8 @@
 {
     OWFint       x, y;
 
+    DPRINT(("OWF_Image_PremultiplyAlpha"));
+
     OWF_ASSERT(image != 0);
 
     if (image->format.premultiplied)
@@ -1191,6 +1349,8 @@
     OWFint       count;
     OWFpixel*    pixelPtr;
 
+    DPRINT(("OWF_Image_UnpremultiplyAlpha"));
+
     OWF_ASSERT(image != 0);
 
     if (!image->format.premultiplied)
@@ -1246,6 +1406,8 @@
     OWFint                  xx = 0, xy = 0,
                             yx = 0, yy = 0;
 
+    DPRINT(("OWF_Image_Rotate"));
+
     OWF_ASSERT(src && src->data);
     OWF_ASSERT(dst && dst->data);
     OWF_ASSERT(src->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL);
@@ -1343,6 +1505,8 @@
 {
     OWFint                  x, y;
 
+    DPRINT(("OWF_Image_Flip"));
+
     if (!image)
     {
         return;
@@ -1397,13 +1561,9 @@
     OWFint rowCount = drect.height; \
     while (rowCount > 0) { \
         OWFint colCount = drect.width; \
-        while (colCount > 0) { \
-            if (!(blend->tsColor && COLOR_MATCH(SC, TSC))) \
-            { \
+        while (colCount > 0) {
 
 #define BLENDER_INNER_LOOP_END \
-                DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \
-            } /* end tsColor check */ \
             srcPtr ++; \
             dstPtr ++; \
             maskPtr++; \
@@ -1416,8 +1576,6 @@
     }
 	
 #define BLENDER_INNER_LOOP_END_NO_MASK \
-                DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \
-            } /* end tsColor check */ \
             srcPtr ++; \
             dstPtr ++; \
             --colCount; \
@@ -1427,14 +1585,6 @@
         --rowCount; \
     }
 
-#define TSC blend->tsColor->color
-#define SC srcPtr->color
-
-/* Note: actually would be better to compare integer values
- * for TSC match -> eliminate float arithmetic pitfalls
- */
-#define COLOR_MATCH(x, y) (x.red==y.red && x.green==y.green && x.blue==y.blue)
-
 #define SA srcPtr->color.alpha
 #define SR srcPtr->color.red
 #define SG srcPtr->color.green
@@ -1560,10 +1710,14 @@
             alpha    = 1
             */
             BLENDER_INNER_LOOP_BEGIN;
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
                 DR = SR;
                 DG = SG;
                 DB = SB;
                 DA = OWF_FULLY_OPAQUE;
+#else
+                *(OWFuint32*)dstPtr = *(OWFuint32*)srcPtr | ARGB8888_ALPHA_MASK;
+#endif
             BLENDER_INNER_LOOP_END_NO_MASK;
             break;
         }
@@ -1589,15 +1743,50 @@
 
         case OWF_TRANSPARENCY_SOURCE_ALPHA:
         {
+#ifndef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
+        OWFuint32 redBlueMask = (ARGB8888_RED_MASK | ARGB8888_BLUE_MASK);
+        OWFuint32 alphaGreenMask = (ARGB8888_ALPHA_MASK | ARGB8888_GREEN_MASK);
+        OWFuint32 halfRedBlue = 0x00800080;
+#endif
             /*
             rgb     = src.rgb + dst.rgb * (1 - src.alpha)
             alpha    = src.alpha + dst.alpha * (1 - src.alpha)
             */
             BLENDER_INNER_LOOP_BEGIN;
-                DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
-                DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
-                DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
-                DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
+#ifdef OWF_IMAGE_INTERNAL_PIXEL_IS_FLOAT
+            DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
+            DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
+            DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
+            DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE;
+#else
+            {
+                OWFuint32 srcP = *(OWFuint32*)srcPtr;
+                OWFuint8 srcA = srcP >> ARGB8888_ALPHA_SHIFT;
+
+                if (srcA == OWF_ALPHA_MAX_VALUE)
+                    {
+                    /* Fully opaque source pixel */
+                    *(OWFuint32*)dstPtr = srcP;
+                    }
+                else
+                    {
+                    if (srcA)
+                        {
+                        /* Not fully transparent source pixel. Algorithm after Jim Blinn */
+                        OWFuint32 mask = 0xFF - srcA;
+                        OWFuint32 dstP = *(OWFuint32*)dstPtr;
+                        OWFuint32 blend;
+
+                        blend = mask * (dstP & redBlueMask) + halfRedBlue;
+                        srcP += ((blend + ((blend >> 8) & redBlueMask) >> 8)) & redBlueMask;
+                        blend = mask * ((dstP >> 8) & redBlueMask) + halfRedBlue;
+                        srcP += (blend + ((blend >> 8) & redBlueMask)) & alphaGreenMask;
+
+                        *(OWFuint32*)dstPtr = srcP;
+                        }
+                    }
+            }
+#endif
             BLENDER_INNER_LOOP_END_NO_MASK;
             break;
         }
@@ -1683,6 +1872,8 @@
     OWF_IMAGE_FORMAT        imgf;
     OWFint                  stride;
 
+    DPRINT(("OWF_Image_AllocData"));
+
     /* kludge. GetStride need pixelFormat. */
     imgf.pixelFormat = pixelFormat;
     imgf.rowPadding = OWF_Image_GetFormatPadding(pixelFormat);
@@ -1707,6 +1898,8 @@
 OWF_API_CALL void
 OWF_Image_FreeData(OWF_DISPCTX dc, void** data)
 {
+    DPRINT(("OWF_Image_FreeData"));
+
     if (*data)
     {
     if (dc)
@@ -1725,6 +1918,8 @@
 OWF_API_CALL OWFint
 OWF_Image_GetFormatPixelSize(OWF_PIXEL_FORMAT format)
 {
+    DPRINT(("OWF_Image_GetFormatPixelSize"));
+
     switch (format)
     {
         case OWF_IMAGE_ARGB_INTERNAL:
@@ -1775,6 +1970,8 @@
 {
     OWFint                  padding = 1;
 
+    DPRINT(("OWF_Image_GetFormatPadding"));
+
     switch (format)
     {
         case OWF_IMAGE_ARGB_INTERNAL:
@@ -1834,6 +2031,8 @@
 OWF_API_CALL void
 OWF_Image_SwapWidthAndHeight(OWF_IMAGE* image)
 {
+    DPRINT(("OWF_Image_SwapWidthAndHeight"));
+
     /* swap w & h. Note that original stride is not restored if swap back. */
     image->width ^= image->height;
     image->height ^= image->width;
--- a/graphicscomposition/openwfcompositionengine/common/src/owflinkedlist.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/src/owflinkedlist.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -165,30 +166,6 @@
     return root;
 }
 
-OWF_API_CALL void
-OWF_List_ForEach(OWF_NODE* root, NODEITERFUNC func, void* data)
-{
-    while (root) {
-        if (!func(root->data, data)) {
-            return;
-        }
-        root = root->next;
-    }
-}
-
-OWF_API_CALL OWF_NODE*
-OWF_List_Find(OWF_NODE* root, NODECMPFUNC func, void* data)
-{
-    while (root) {
-        if (func(root->data, data)) {
-            break;
-        }
-        root = root->next;
-    }
-    return root;
-}
-
-
 #ifdef __cplusplus
 }
 #endif
--- a/graphicscomposition/openwfcompositionengine/common/src/owfmemory.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/src/owfmemory.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -35,6 +36,8 @@
 #include "owfmemory.h"
 #include "owfdebug.h"
 
+#ifdef DEBUG
+
 #define MAGIK   0x05EAF00D
 #define FENCE1  0xFACED00D
 #define FENCE2  0xFACE50FF
@@ -52,12 +55,12 @@
 } BLOCK;
 
 
-#ifdef DEBUG
+
 
 static void
 OWF_Memory_Shutdown(void);
 
-#endif
+
 
 static void
 OWF_Memory_LockUnlockManagedBlocks(OWFboolean lock)
@@ -312,6 +315,7 @@
     OWF_Memory_UnlockManagedBlocks();
 }
 #endif
+#endif
 
 #ifdef __cplusplus
 }
--- a/graphicscomposition/openwfcompositionengine/common/src/owfpool.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/common/src/owfpool.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfccontext.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfccontext.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -330,19 +331,6 @@
 
 
 /*!
- *  \brief Stream content notification callback
- *
- *  \param stream Handle of the stream
- *  \param event Stream event type
- *  \param data Context
- */
-OWF_API_CALL void
-WFC_Context_SourceStreamUpdated(OWFNativeStreamType stream,
-                                OWFint event,
-                                void* data,
-                                void* param);
-
-/*!
  *  \brief Check if context is currently activated
  *
  *  \param context
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfcdevice.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfcdevice.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -309,6 +310,9 @@
 WFC_Device_DestroyContextImageProviders(WFC_DEVICE* device,
                                         WFC_CONTEXT* context);
 
+OWF_API_CALL WFCboolean
+WFC_Device_FindScreenNumber(WFCint screenNumber);
+
 #ifdef __cplusplus
 }
 #endif
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfcelement.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfcelement.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfcimageprovider.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfcimageprovider.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfcpipeline.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfcpipeline.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfcscene.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfcscene.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -175,6 +176,15 @@
 OWF_API_CALL WFCElement
 WFC_Scene_LowestElement(WFC_SCENE* scene);
 
+/*!
+ *  \brief Search for the topmost element
+ *
+ *  \param scene            Scene to search
+ *  \return pointer to the topmost element
+ */
+OWF_API_CALL WFC_ELEMENT*
+WFC_Scene_TopMostElement(WFC_SCENE* scene);
+
 #ifdef __cplusplus
 }
 #endif
--- a/graphicscomposition/openwfcompositionengine/composition/include/wfcstructs.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/include/wfcstructs.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -282,14 +283,6 @@
     TFPtrEglPrivateSignalSyncNok    eglPrivateSignalSync;
 } WFC_CONTEXT;
 
-typedef struct WFC_CONTENT_UPDATED_PARAM_ {
-    WFCint      length;
-    WFCint      id;
-    WFCint      par;
-    WFCint      serialNumber;
-    WFCint      immediateAvailable;
-    WFCint      immediateVisibility;
-} WFC_CONTENT_UPDATED_PARAM;
 
 #define IMAGE_PROVIDER(x)   ((WFC_IMAGE_PROVIDER*)(x))
 #define ELEMENT(x)          ((WFC_ELEMENT*)(x))
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfcapi.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfcapi.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -258,17 +259,15 @@
     {
         screenNumber = OWF_Screen_GetDefaultNumber();
     }
-    else
+    
+    /* check screen number validity */
+    if (!OWF_Screen_Valid(screenNumber))
     {
-        /* check screen number validity */
-        if (!OWF_Screen_Valid(screenNumber))
-        {
-            FAIL(WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE);
-        }
+        FAIL(WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE);
     }
 
     /* check that no other context currently uses this screen */
-    if (!OWF_Screen_Valid_And_Available(screenNumber))
+    if (WFC_Device_FindScreenNumber(screenNumber))
     {
         FAIL(WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
     }
@@ -1015,6 +1014,8 @@
 	/* Protect context's target stream from being destroyed by the user
 	 * WFC_CONTEXT_Dtor will reset this flag. */
 	owfNativeStreamSetProtectionFlag(context->stream, OWF_TRUE);
+	
+	OWF_DisplayContext_FlagInternalStreamAccessed(context->displayContext);
 
 	SUCCEED(context->stream);
 }
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfccontext.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfccontext.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -60,8 +61,6 @@
 #define AUTO_COMPOSE_DELAY      15000
 #define FIRST_CONTEXT_HANDLE    2000
 
-#define WAIT_FOREVER            -1
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -112,7 +111,6 @@
     fInt.linear         = fExt.linear;
     fInt.premultiplied  = fExt.premultiplied;
     fInt.rowPadding     = 1;
-    
      
     if (context->type == WFC_CONTEXT_TYPE_ON_SCREEN)
         {
@@ -121,7 +119,7 @@
         /* The rotated version of the target buffer for hardware rotation
          * or a de-rotated version of the internal buffer into another scratch buffer for software rotation
          */ 
-        if (OWF_Screen_Rotation_Supported(context->screenNumber))
+        if (OWF_Screen_Rotation_Supported(context->displayContext))
             {   /* The rotated version of the target buffer for hardware rotation */
             context->state.rotatedTargetImage=OWF_Image_Create(context->targetHeight,context->targetWidth,&fExt,context->scratchBuffer[2],0);
             }
@@ -227,9 +225,13 @@
     DPRINT(("WFC_Context_Shutdown(context = %d)", context->handle));
 
     DPRINT(("Waiting for composer thread termination"));
-    OWF_Message_Send(&context->composerQueue, WFC_MESSAGE_QUIT, 0);
-    OWF_Thread_Join(context->composerThread, NULL);
-    OWF_Thread_Destroy(context->composerThread);
+    if (context->composerThread)
+        {
+        OWF_Message_Send(&context->composerQueue, WFC_MESSAGE_QUIT, 0);
+        OWF_Thread_Join(context->composerThread, NULL);
+        OWF_Thread_Destroy(context->composerThread);
+        }
+    
     context->composerThread = NULL;
 
     if (context->device)
@@ -370,67 +372,86 @@
         return NULL;
         }
 
-     /*the following section of the code could be pushed to adaptation in future*/
-    if (type == WFC_CONTEXT_TYPE_ON_SCREEN)
-    {
-        OWF_IMAGE_FORMAT        imageFormat;
-        OWF_SCREEN              screen;
-        WFCint width = 0;
-        WFCint height = 0;
-        WFCint normalSize = 0;
-        WFCint flippedSize = 0;
-        WFCNativeStreamType stream;
+    err2 =OWF_MessageQueue_Init(&context->composerQueue);
+    if (err2 != 0)
+        {
+        DPRINT(("WFC_Context_Initialize(): Cannot initialise the message queue err(%d)", err2));   
+        return NULL;
+        }
     
-        /* Set up stream for sending data to screen */
-        
-        if (!OWF_Screen_GetHeader(screenNum, &screen))
+    context->composerThread = OWF_Thread_Create(WFC_Context_ComposerThread, context);
+    if (!(context->composerThread))
         {
-            DPRINT(("WFC_Context_Initialize(): Could not retrieve the screen parameters"));
-            return NULL;
+        /* must call these to remove references to context */
+        DPRINT(("WFC_Context_Initialize(): Failed to create thread!"));
+        return NULL;
         }
 
-        /* Set on-screen pixel format */
-        imageFormat.pixelFormat     = OWF_SURFACE_PIXEL_FORMAT;
-        imageFormat.premultiplied   = OWF_SURFACE_PREMULTIPLIED;
-        imageFormat.linear          = OWF_SURFACE_LINEAR;
-        imageFormat.rowPadding      = OWF_SURFACE_ROWPADDING;
-
-        width = screen.normal.width;
-        height = screen.normal.height;
-        
-        normalSize = screen.normal.height * screen.normal.stride;
-        flippedSize = screen.flipped.height * screen.flipped.stride;
-        
-        if (flippedSize > normalSize)
-            {
-            width = screen.flipped.width;
-            height = screen.flipped.height;
-            }
-        
-        stream = owfNativeStreamCreateImageStream(width,
-                                                  height,
-                                                  &imageFormat,
-                                                  1);
-
-        if (stream)
-        {
-            WFC_Context_SetTargetStream(context, stream);
-            
-            /* At this point the stream's refcount is 2 - we must decrement
-             * it by one to ensure that the stream is destroyed when the
-             * context (that "owns" it) is destroyed.
-             */
-            owfNativeStreamRemoveReference(stream);
-        }
-        else
-        {
-            DPRINT(("WFC_Context_Initialize(): cannot create internal target stream"));
-            return NULL;
-        }
+    OWF_ComposerThread_RendezvousWait(context->displayContext);
+    
+    /*the following section of the code could be pushed to adaptation in future*/
+    if (type == WFC_CONTEXT_TYPE_ON_SCREEN)
+    {
+       OWF_IMAGE_FORMAT        imageFormat;
+       OWF_SCREEN              screen;
+       WFCint width = 0;
+       WFCint height = 0;
+       WFCint normalSize = 0;
+       WFCint flippedSize = 0;
+       WFCNativeStreamType stream;
+    
+       /* Set up stream for sending data to screen */
+       
+       if (!OWF_Screen_GetHeader(context->displayContext, &screen))
+       {
+           DPRINT(("WFC_Context_Initialize(): Could not retrieve the screen parameters"));
+           WFC_Context_Shutdown(context);
+           return NULL;
+       }
+    
+       /* Set on-screen pixel format */
+       imageFormat.pixelFormat     = OWF_SURFACE_PIXEL_FORMAT;
+       imageFormat.premultiplied   = OWF_SURFACE_PREMULTIPLIED;
+       imageFormat.linear          = OWF_SURFACE_LINEAR;
+       imageFormat.rowPadding      = OWF_SURFACE_ROWPADDING;
+    
+       width = screen.normal.width;
+       height = screen.normal.height;
+       
+       normalSize = screen.normal.height * screen.normal.stride;
+       flippedSize = screen.flipped.height * screen.flipped.stride;
+       
+       if (flippedSize > normalSize)
+           {
+           width = screen.flipped.width;
+           height = screen.flipped.height;
+           }
+       
+       stream = owfNativeStreamCreateImageStream(width,
+                                                 height,
+                                                 &imageFormat,
+                                                 1);
+    
+       if (stream)
+       {
+           WFC_Context_SetTargetStream(context, stream);
+           
+           /* At this point the stream's refcount is 2 - we must decrement
+            * it by one to ensure that the stream is destroyed when the
+            * context (that "owns" it) is destroyed.
+            */
+           owfNativeStreamRemoveReference(stream);
+       }
+       else
+       {
+           DPRINT(("WFC_Context_Initialize(): cannot create internal target stream"));
+           WFC_Context_Shutdown(context);
+           return NULL;
+       }
     }
     else
     {
-        WFC_Context_SetTargetStream(context, stream);
+       WFC_Context_SetTargetStream(context, stream);
     }
     
     nbufs = SCRATCH_BUFFER_COUNT-1;
@@ -451,17 +472,13 @@
                                          OWF_IMAGE_L32);
     fail = fail || (scratch[nbufs] == NULL);
     
-    err2 = OWF_MessageQueue_Init(&context->composerQueue);
-    fail = fail || (err2 != 0);
-
     if (fail)
     {
-        OWF_MessageQueue_Destroy(&context->composerQueue);
-
         for (ii = 0; ii < SCRATCH_BUFFER_COUNT; ii++)
         {
             OWF_Image_FreeData(context->displayContext, &scratch[ii]);
         }
+        WFC_Context_Shutdown(context);
         return NULL;
     }
 
@@ -469,12 +486,7 @@
     {
         context->scratchBuffer[ii] = scratch[ii];
     }
-
-    if (!WFC_Pipeline_CreateState(context) || !WFC_Context_CreateState(context))
-         {
-         DPRINT(("WFC_Context_Initialize(): Could not create pipeline state object"));
-         return NULL;
-         }
+    
     if (    OWF_Semaphore_Init(&context->compositionSemaphore, 1)
         ||  OWF_Semaphore_Init(&context->commitSemaphore, 1)
         ||  OWF_Mutex_Init(&context->updateFlagMutex)
@@ -483,13 +495,23 @@
         )
         {
         DPRINT(("WFC_Context_Initialize(): Could not create mutexes and semaphores!"));
+        WFC_Context_Shutdown(context);
         return NULL;
         }
 
+    if (!WFC_Pipeline_CreateState(context) || !WFC_Context_CreateState(context))
+         {
+         DPRINT(("WFC_Context_Initialize(): Could not create pipeline state object"));
+         WFC_Context_Shutdown(context);
+         return NULL;
+         }
+    
+
     attribStatus= WFC_Context_InitializeAttributes(context, type);
 
     if (attribStatus!=ATTR_ERROR_NONE)
         {
+        WFC_Context_Shutdown(context);
         return NULL;
         }
     
@@ -503,9 +525,7 @@
     if (!( context->scenePool &&
           context->nodePool && context->elementPool))
     {
-        /* must call these to remove references to context */
-        context->workScene = NULL;
-        context->committedScene = NULL;
+        WFC_Context_Shutdown(context);
         return NULL;
     }
 
@@ -521,27 +541,10 @@
     if (!(context->workScene && context->committedScene &&
           context->nodePool && context->elementPool))
     {
-        /* must call these to remove references to context */
-        WFC_Scene_Destroy(context->workScene);
-        WFC_Scene_Destroy(context->committedScene);
-        context->workScene = NULL;
-        context->committedScene = NULL;
+        WFC_Context_Shutdown(context);
         return NULL;
     }
 
-
-    context->composerThread = OWF_Thread_Create(WFC_Context_ComposerThread,
-                                                context);
-    if (!(context->composerThread))
-        {
-        /* must call these to remove references to context */
-        WFC_Scene_Destroy(context->workScene);
-        WFC_Scene_Destroy(context->committedScene);
-        context->workScene = NULL;
-        context->committedScene = NULL;
-        return NULL;
-        }
-    
     return context;
 }
 
@@ -562,7 +565,7 @@
     WFC_CONTEXT*            context = NULL;
 
     OWF_ASSERT(device);
-   context = CREATE(WFC_CONTEXT);
+    context = CREATE(WFC_CONTEXT);
 
     if (context)
     {
@@ -593,6 +596,182 @@
                              &context->targetWidth, &context->targetHeight,
                              NULL, NULL, NULL);
 }
+
+static OWFboolean
+WFC_FastpathCheckTransparency(WFCbitfield transparencyTypes, WFCfloat globalAlpha, OWF_PIXEL_FORMAT sourceFormat)
+    {
+    if ((transparencyTypes & WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA) && (globalAlpha != 255.0f))
+        {
+        DPRINT(("=== WFC_FastpathCheckTransparency - Failed global alfa(%f) check", globalAlpha));
+        return OWF_FALSE;
+        }
+
+    if ((transparencyTypes & WFC_TRANSPARENCY_SOURCE) && (sourceFormat != OWF_IMAGE_XRGB8888))
+        {
+        DPRINT(("=== WFC_FastpathCheckTransparency - Failed transparency check types=0x%x format=0x%x", 
+                transparencyTypes, sourceFormat));
+        return OWF_FALSE;
+        }
+    
+
+    return OWF_TRUE;
+    }
+
+static OWFboolean
+WFC_FastpathCheckGeometry(WFC_CONTEXT* context, WFC_ELEMENT* element)
+    {
+    OWFint sourceWidth = 0;
+    OWFint sourceHeight = 0;
+    OWFint destWidth = 0;
+    OWFint destHeight = 0;
+    OWFint targetWidth = 0;
+    OWFint targetHeight = 0;
+    
+    OWF_ASSERT(context);
+    OWF_ASSERT(element);
+
+    if ((element->srcRect[0] != 0) || (element->srcRect[1] != 0))
+        {
+        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Source Position Check", context));
+        return OWF_FALSE;
+        }
+    
+    if ((element->dstRect[0] != 0) || (element->dstRect[1] != 0))
+        {
+        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Destination Position Check", context));
+        return OWF_FALSE;
+        }
+    
+    if(element->sourceFlip)
+        {
+        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Source Flip Check", context));
+        return OWF_FALSE;
+        }
+    
+    if(element->sourceRotation == WFC_ROTATION_0)
+        {
+        sourceWidth = element->srcRect[2];
+        sourceHeight = element->srcRect[3];
+        }
+    else
+        {
+        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Source Rotation (0x%x) Check", 
+                context, element->sourceRotation));
+        return OWF_FALSE;
+        }
+    
+    destWidth = element->dstRect[2];
+    destHeight = element->dstRect[3];
+    
+    if ((sourceWidth != destWidth) || (sourceHeight != destHeight))
+       {
+       DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Non-scaling Check", context));
+       return OWF_FALSE;
+       }
+
+    if (context->rotation == WFC_ROTATION_0 || OWF_Screen_Rotation_Supported(context->displayContext))
+        {
+        if (context->rotation == WFC_ROTATION_0 || context->rotation == WFC_ROTATION_180)
+            {
+            targetWidth = context->targetWidth;
+            targetHeight = context->targetHeight;
+            }
+        else
+            {
+            targetWidth = context->targetHeight;
+            targetHeight = context->targetWidth;
+            }
+        
+        if (destWidth == targetWidth && destHeight == targetHeight)
+            {
+            return OWF_TRUE;
+            }
+        else
+            {
+            DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - Failed Dimensions Check", context));
+            }
+        }
+    else
+        {
+        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - Failed Supported Rotations Check", context));
+        }
+    
+    return OWF_FALSE;
+    }
+
+/**
+ * Check if the current scene is candidate for fastpath optimisation.
+ * Fastpath optimisation means the topmost visible layer will be passed direct to the 
+ * lower level for presentation on the display without being composed.
+ * There are two questions:
+ * - Is the scene itself suitable for fastpathing?
+ * - Can the surface selected for fastpathing be presented directly by the display?
+ * This function will check the scene (eg reject if the top stream is non-opaque or smaller than the screen)
+ *
+ * @param context context object containing the scene to be checked.
+ **/
+
+/* [Not in doxygen]
+ * The first time MOpenWFC_RI_Display_Update::SetTopLayerSurface (or SetLayerSurface) is called 
+ * with a different stream handle, it can fail indicating the display cannot accept the stream.
+ * The compositor will then have to immediately compose that frame as normal, and should continue
+ * to perform normal composition until the scene changes to present a different stream as fastpath candidate.  
+ * 
+ * There is a middle ground, e.g. can the hardware handle over-sized images, or do scaling or do rotation?
+ * SetTopLayerSurface accepts an optional list of imperfect attributes to be checked by the adaptation.
+ * By WFC_Context_CheckFastpath only listing the attributes that are considered imperfect,
+ * and SetLayerSurface rejecting fastpath for any attribute IDs that it doesn't recognise,
+ * safe independent extensibility is assured. 
+ */
+static void
+WFC_Context_CheckFastpath(WFC_CONTEXT* context)
+    {
+    WFC_ELEMENT* element = NULL;
+    OWF_ASSERT(context);
+    
+    DPRINT(("WFC_Context_CheckFastpath(context = %p) - Check Fastpath", context));
+    if ((context->type != WFC_CONTEXT_TYPE_ON_SCREEN) ||
+        OWF_DisplayContext_FastpathChecked(context->displayContext))
+        {
+        return;
+        }
+    
+    // Simple case-fast path top most layer
+    // More complex case, fast-path top most VISIBLE, OPAQUE layer.
+    OWF_DisplayContext_DisableFastpath(context->displayContext);
+    OWF_DisplayContext_SetFastpathChecked(context->displayContext);
+    // Find top layer
+    element = WFC_Scene_TopMostElement(context->committedScene);
+    if (element && element->source && element->skipCompose == WFC_FALSE)
+        {
+    
+        if (element->mask)
+            {
+            DPRINT(("=== WFC_Context_CheckFastpath(context = %p) - FAILED elemenent includes mask", context));
+            return;
+            }
+        
+        OWF_ASSERT(element->source->lockedStream.image);
+        
+        OWF_ASSERT(element->source->streamHandle != OWF_INVALID_HANDLE);
+        
+        if (!WFC_FastpathCheckGeometry(context, element))
+            {
+            return;
+            }
+        
+        if (!WFC_FastpathCheckTransparency(element->transparencyTypes, 
+                                           element->globalAlpha, 
+                                           element->source->lockedStream.image->format.pixelFormat))
+            {
+            return;
+            }
+        
+        OWF_DisplayContext_EnableFastpath(context->displayContext, element->source->streamHandle);
+        DPRINT(("=== WFC_Context_CheckFastpath(context = %p) - Fastpath Enabled", context));
+        }
+    }
+
 /*---------------------------------------------------------------------------
  * Checks if the given stream would be valid as an off-screen context target.
  * 
@@ -709,7 +888,7 @@
 /*---------------------------------------------------------------------------
  *
  *----------------------------------------------------------------------------*/
-static void
+static OWFboolean
 WFC_Context_LockTargetForWriting(WFC_CONTEXT* context)
 {
     OWF_ASSERT(context);
@@ -718,12 +897,18 @@
 
     context->state.targetBuffer =
         owfNativeStreamAcquireWriteBuffer(context->stream);
+    
+    if (!context->state.targetBuffer)
+        {
+        DPRINT(("Failed to WFC_Context_LockTargetForWriting owfNativeStreamAcquireWriteBuffer"));
+        return OWF_FALSE;
+        }
     context->state.targetPixels =
         owfNativeStreamGetBufferPtr(context->stream,
                                     context->state.targetBuffer);
 
     if ((WFC_ROTATION_0   == context->rotation || WFC_ROTATION_180 == context->rotation) ||
-        !OWF_Screen_Rotation_Supported(context->screenNumber))
+        !OWF_Screen_Rotation_Supported(context->displayContext))
     {
         /* final target, in target format */
         context->state.targetImage =context->state.unrotatedTargetImage;
@@ -756,16 +941,15 @@
         {
         OWF_ASSERT(WFC_FALSE);
         }
+    return OWF_TRUE;
 }
 
 /*---------------------------------------------------------------------------
  *
  *----------------------------------------------------------------------------*/
 static void
-WFC_Context_UnlockTarget(WFC_CONTEXT* context)
+WFC_Context_UnlockTarget(WFC_CONTEXT* context,OWFboolean aDoPost)
 {
-    OWFNativeStreamBuffer   frontBuffer = OWF_INVALID_HANDLE;
-    void*                   pixelDataPtr = NULL;
     OWF_ROTATION rotation = OWF_ROTATION_0;
 
     OWF_ASSERT(context);
@@ -779,49 +963,42 @@
                                       NULL);
 
     
-    /* Refactor the code that follows so that it is triggered by the above releasewrite */
-    
-    /* Acquire target stream front buffer and blit to SDL screen */
-    frontBuffer = owfNativeStreamAcquireReadBuffer(context->stream);
-    DPRINT(("  Locking target stream=%d, buffer=%d",
-            context->stream, frontBuffer));
-
-    pixelDataPtr = owfNativeStreamGetBufferPtr(context->stream, frontBuffer);
-
-    switch (context->rotation)
+    if (aDoPost)
     {
-        case WFC_ROTATION_0:
+        switch (context->rotation)
         {
-            rotation = OWF_ROTATION_0;
-            break;
-        }
-        case WFC_ROTATION_90:
-        {
-            rotation = OWF_ROTATION_90;
-            break;
+            case WFC_ROTATION_0:
+            {
+                rotation = OWF_ROTATION_0;
+                break;
+            }
+            case WFC_ROTATION_90:
+            {
+                rotation = OWF_ROTATION_90;
+                break;
+            }
+            case WFC_ROTATION_180:
+            {
+                rotation = OWF_ROTATION_180;
+                break;
+            }
+            case WFC_ROTATION_270:
+            {
+                rotation = OWF_ROTATION_270;
+                break;
+            }
+            default:
+            {
+                OWF_ASSERT(0);
+            }
         }
-        case WFC_ROTATION_180:
-        {
-            rotation = OWF_ROTATION_180;
-            break;
-        }
-        case WFC_ROTATION_270:
-        {
-            rotation = OWF_ROTATION_270;
-            break;
-        }
-        default:
-        {
-            OWF_ASSERT(0);
-        }
+        
+        if (!OWF_Screen_Post_Topmost_Layer(context->displayContext, context->stream, rotation))
+            {   //getting a fail here is bad... display did not accept the composition buffer.
+            DPRINT(("WFC_Context_UnlockTarget - OWF_Screen_Post_Topmost_Layer failed for composition stream"));
+           OWF_ASSERT(0);
+            }
     }
-    
-    OWF_Screen_Blit(context->screenNumber, pixelDataPtr, rotation);
-
-    owfNativeStreamReleaseReadBuffer(context->stream, frontBuffer);
-    DPRINT(("  Releasing target stream=%d, buffer=%d",
-            context->stream, frontBuffer));
-
 }
 
 /*---------------------------------------------------------------------------
@@ -857,8 +1034,6 @@
     b = b * a / OWF_ALPHA_MAX_VALUE;
 
     OWF_Image_Clear(context->state.internalTargetImage, r, g, b, a);
-
-    WFC_Scene_LockSourcesAndMasks(context->committedScene);
 }
 
 
@@ -870,13 +1045,11 @@
 WFC_Context_FinishComposition(WFC_CONTEXT* context)
 {
     OWF_ROTATION            rotation = OWF_ROTATION_0;
-    OWFint                  screenNumber;
     OWFboolean              screenRotation;
 
     OWF_ASSERT(context);
 
-    screenNumber = context->screenNumber;
-    screenRotation = OWF_Screen_Rotation_Supported(screenNumber);
+    screenRotation = OWF_Screen_Rotation_Supported(context->displayContext);
     /* re-use scratch buffer 1 for context rotation */
     if (WFC_ROTATION_0   == context->rotation || screenRotation)
     {
@@ -933,8 +1106,7 @@
 
         OWF_Image_DestinationFormatConversion(context->state.targetImage, context->state.rotatedTargetImage);
     }
-    WFC_Context_UnlockTarget(context);
-    WFC_Scene_UnlockSourcesAndMasks(context->committedScene);
+    WFC_Context_UnlockTarget(context,(context->type==WFC_CONTEXT_TYPE_ON_SCREEN)?OWF_TRUE:OWF_FALSE);
 }
 
 /*!---------------------------------------------------------------------------
@@ -959,56 +1131,167 @@
     context->sourceUpdateCount = 0;
     OWF_Mutex_Unlock(&context->updateFlagMutex);
     
-    WFC_Context_PrepareComposition(context);
-
     DPRINT(("WFC_Context_Compose"));
     /* Composition always uses the committed version
      * of the scene.
      */
 
+    WFC_Scene_LockSourcesAndMasks(context->committedScene);
+    
     OWF_Mutex_Lock(&context->sceneMutex);
     
-    scene = context->committedScene;
-    OWF_ASSERT(scene);
-
-    for (node = scene->elements; NULL != node; node = node->next)
-    {
-        
-        WFC_ELEMENT*            element = NULL;
-        WFC_ELEMENT_STATE*      elementState = NULL;
-        element = ELEMENT(node->data);
-
-        if (element->skipCompose)
+    WFC_Context_CheckFastpath(context);
+    if (OWF_DisplayContext_FastpathEnabled(context->displayContext))
         {
-             /* this element is somehow degraded, its source is missing or
-              * something else; skip to next element */
-            DPRINT(("  *** Skipping element %d", element->handle));
-            continue;
-        }
-
-        DPRINT(("  Composing element %d", element->handle));
+        WFCboolean targetStreamAccessed;
+        OWFboolean screenRotation;
+        screenRotation = OWF_Screen_Rotation_Supported(context->displayContext);
+        if (WFC_Context_Active(context))
+            {   //Full fastpath is only supported for autonomous composition 
+            OWFNativeStreamType stream = OWF_INVALID_HANDLE;
+            OWF_ROTATION rotation = OWF_ROTATION_0;
+    
+            DPRINT(("== WFC_Context_DoCompose(context = %p) - Fastpathing", context));
+    
+            stream = OWF_DisplayContext_FastpathStream(context->displayContext);
+            if (screenRotation)
+                {
+                switch (context->rotation)
+                    {
+                    case WFC_ROTATION_0:
+                        {
+                        rotation = OWF_ROTATION_0;
+                        break;
+                        }
+                    case WFC_ROTATION_90:
+                        {
+                        rotation = OWF_ROTATION_90;
+                        break;
+                        }
+                    case WFC_ROTATION_180:
+                        {
+                        rotation = OWF_ROTATION_180;
+                        break;
+                        }
+                    case WFC_ROTATION_270:
+                        {
+                        rotation = OWF_ROTATION_270;
+                        break;
+                        }
+                    default:
+                        {
+                        OWF_ASSERT(0);
+                        rotation = OWF_ROTATION_0;
+                        }
+                    }
+                }
+    
+            if (!OWF_Screen_Post_Topmost_Layer(context->displayContext, stream, rotation))
+                {
+            
+                DPRINT(("WFC_Context_Compose calls OWF_DisplayContext_DisableFastpath because !OWF_Screen_Post_Topmost_Layer()"));
+                OWF_DisplayContext_DisableFastpath(context->displayContext);
+                //If fastpath is disabled here then we need to compose properly this cycle
+                }
+            }
+        targetStreamAccessed = OWF_DisplayContext_InternalStreamAccessed(context->displayContext);
+        if (OWF_DisplayContext_FastpathEnabled(context->displayContext) && ( targetStreamAccessed || !WFC_Context_Active(context) ))
+            {   //Fastpath in non-autonomous composition just does a simple copy and post.
+            DPRINT(("== WFC_Context_DoCompose(context = %p) -   fastpath copy target", context));
+            if (WFC_Context_LockTargetForWriting(context))
+                {
+                OWFboolean copy;
+                if (screenRotation)
+                    {
+                    if (WFC_ROTATION_90 == context->rotation || WFC_ROTATION_270 == context->rotation)
+                        {
+                        owfSetStreamFlipState(context->stream, OWF_TRUE);
+                        }
+                    else
+                        {
+                        owfSetStreamFlipState(context->stream, OWF_FALSE);
+                        }
+                    }
+                copy=OWF_DisplayContext_CopyFastpathedStreamToTargetStream(context);
+                if (!WFC_Context_Active(context))
+                    {
+                    if (!copy)
+                        {
+                        DPRINT(("WFC_Context_Compose calls OWF_DisplayContext_DisableFastpath because !OWF_DisplayContext_CopyFastpathedStreamToTargetStream()"));
+                        OWF_DisplayContext_DisableFastpath(context->displayContext);
+                        //If fastpath is disabled here then we need to compose properly this cycle
+                        }
+                    }
+                else
+                    {
+                    copy=OWF_FALSE;
+                    }
+              
+                WFC_Context_UnlockTarget(context,copy);
+                }
+            else
+                {
+                //If non-autonomous, then the lock target is required.
+                OWF_ASSERT(WFC_Context_Active(context));
+                }
 
-        /* BeginComposition may fail e.g. if the element's destination
-         * rectangle is something bizarre, i.e. causes overflows or
-         * something.
-         */
-        if ((elementState=WFC_Pipeline_BeginComposition(context, element))!=NULL)
+            }
+        if (OWF_DisplayContext_FastpathEnabled(context->displayContext))
+            {
+            WFC_ELEMENT* topmostElement = NULL;
+            topmostElement = WFC_Scene_TopMostElement(context->committedScene);
+            owfSymElementNotifications(context, topmostElement);
+            }
+        }
+    if (!OWF_DisplayContext_FastpathEnabled(context->displayContext))
         {
-            owfSymElementNotifications(context, element);
+        DPRINT(("== WFC_Context_DoCompose(context = %p) -   Composing", context));
+        WFC_Context_PrepareComposition(context);
+
+        scene = context->committedScene;
+        OWF_ASSERT(scene);
+    
+        for (node = scene->elements; NULL != node; node = node->next)
+            {
             
-            WFC_Pipeline_ExecuteSourceConversionStage(context, elementState);
-            WFC_Pipeline_ExecuteCropStage(context, elementState);
-            WFC_Pipeline_ExecuteFlipStage(context, elementState);
-            WFC_Pipeline_ExecuteRotationStage(context, elementState);
-            WFC_Pipeline_ExecuteScalingStage(context, elementState);
-            WFC_Pipeline_ExecuteBlendingStage(context, elementState);
+            WFC_ELEMENT*            element = NULL;
+            WFC_ELEMENT_STATE*      elementState = NULL;
+            element = ELEMENT(node->data);
+    
+            if (element->skipCompose)
+                {
+                 /* this element is somehow degraded, its source is missing or
+                  * something else; skip to next element */
+                DPRINT(("  *** Skipping element %d", element->handle));
+                continue;
+                }
+    
+            DPRINT(("  Composing element %d", element->handle));
+    
+            /* BeginComposition may fail e.g. if the element's destination
+             * rectangle is something bizarre, i.e. causes overflows or
+             * something.
+             */
+            if ((elementState=WFC_Pipeline_BeginComposition(context, element))!=NULL)
+                {
+                owfSymElementNotifications(context, element);
                 
-            WFC_Pipeline_EndComposition(context, element,elementState);
+                WFC_Pipeline_ExecuteSourceConversionStage(context, elementState);
+                WFC_Pipeline_ExecuteCropStage(context, elementState);
+                WFC_Pipeline_ExecuteFlipStage(context, elementState);
+                WFC_Pipeline_ExecuteRotationStage(context, elementState);
+                WFC_Pipeline_ExecuteScalingStage(context, elementState);
+                WFC_Pipeline_ExecuteBlendingStage(context, elementState);
+                    
+                WFC_Pipeline_EndComposition(context, element,elementState);
+                }
+            }
+    
+        WFC_Context_FinishComposition(context);
+        DPRINT(("=== WFC_Context_DoCompose(context = %p) - Diplayed Composition", context));
         }
-    }
-
-    WFC_Context_FinishComposition(context);
     
+    WFC_Scene_UnlockSourcesAndMasks(context->committedScene);
     owfSymProcessAllNotifications(context);
     OWF_Mutex_Unlock(&context->sceneMutex);
     
@@ -1214,7 +1497,6 @@
 WFC_Context_RemoveElement(WFC_CONTEXT* context,
                           WFCElement element)
 {
-    WFCErrorCode            err = WFC_ERROR_BAD_HANDLE;
     WFC_ELEMENT*            elemento = NULL;
 
     OWF_ASSERT(context);
@@ -1229,11 +1511,9 @@
          */
         elemento->shared = WFC_FALSE;
         context->lowestElement = WFC_Scene_LowestElement(context->workScene);
-
-        err = WFC_ERROR_NONE;
     }
 
-    return err;
+    return WFC_ERROR_NONE;
 }
 
 /*!
@@ -1401,6 +1681,10 @@
             {
                result = WFC_ERROR_ILLEGAL_ARGUMENT;
             }
+            else
+            {
+                OWF_DisplayContext_ResetFastpathCheck(context->displayContext);
+            }
             break;
         }
 
@@ -1594,6 +1878,7 @@
 WFC_Context_ComposerThread(void* data)
 {
     WFC_CONTEXT*            context = (WFC_CONTEXT*) data;
+    OWFboolean screenCreated = OWF_TRUE;
     OWF_MESSAGE             msg;
 
 
@@ -1601,8 +1886,17 @@
     DPRINT(("WFC_Context_ComposerThread starting"));
 
     memset(&msg, 0, sizeof(OWF_MESSAGE));
+    
+    if (context->type == WFC_CONTEXT_TYPE_ON_SCREEN)
+        {
+        screenCreated = OWF_Screen_Create(context->screenNumber, context->displayContext);
+        }
+    
+    OWF_ComposerThread_Rendezvous(context->displayContext);
 
-    while (context->device && msg.id != WFC_MESSAGE_QUIT)
+    OWF_ComposerThread_RendezvousDestroy(context->displayContext);
+    
+    while (context->device && msg.id != WFC_MESSAGE_QUIT && screenCreated)
     {
         OWFint              err = -1;
 
@@ -1640,6 +1934,11 @@
                                                           context,
                                                           WFC_FALSE);
                     context->activationState = WFC_CONTEXT_STATE_PASSIVE;
+                    if (OWF_DisplayContext_FastpathEnabled(context->displayContext))
+                        {
+                        DPRINT(("COMMIT: Invoking fastpath recomposition after deactivate"));
+                        WFC_Context_DoCompose(context);
+                        }
                     break;
                 }
 
@@ -1649,7 +1948,7 @@
 
                     DPRINT(("COMMIT: Invoking DoCommit"));
                     WFC_Context_DoCommit(context);
-
+                    OWF_DisplayContext_ResetFastpathCheck(context->displayContext);
                     if (!WFC_Context_Active(context))
                     {
                         DPRINT(("COMMIT: Context is inactive, composition "
@@ -1697,6 +1996,10 @@
         }
     }
 
+    if (context->type == WFC_CONTEXT_TYPE_ON_SCREEN)
+        {
+        OWF_Screen_Destroy(context->displayContext);
+        }
     /* Release any use of EGL by this thread. */
     eglReleaseThread();
 
@@ -1708,55 +2011,6 @@
 /*---------------------------------------------------------------------------
  *
  *----------------------------------------------------------------------------*/
-
-OWF_API_CALL void
-WFC_Context_SourceStreamUpdated(OWFNativeStreamType stream,
-                                OWFint event,
-                                void* data,
-                                void* returnParam)
-{
-    (void)returnParam;
-    OWF_ASSERT(data);
-
-    DPRINT(("WFC_Context_SourceStreamUpdated(%p, %x, %p)",
-            stream, event, data));
-    stream = stream; /* suppress compiler warning */
- 
-    switch (event)
-    {
-        case OWF_OBSERVER_RETURN_DEFAULT_EVENT:
-        if (returnParam)
-        {
-            OWF_DEFAULT_EVENT_PARAM* parameter = (OWF_DEFAULT_EVENT_PARAM*) returnParam;
-            if ((parameter->length) == sizeof(OWF_DEFAULT_EVENT_PARAM))
-                {
-                parameter->event = OWF_STREAM_UPDATED;
-                }
-        }
-        break;
-    
-        case OWF_STREAM_UPDATED:
-            {
-                WFC_CONTEXT*            context = NULL;
-                context = CONTEXT(data);
-                OWF_ASSERT(context);
-                OWF_Mutex_Lock(&context->updateFlagMutex);
-                
-                if (WFC_Context_Active(context))
-                {
-                    ++context->sourceUpdateCount;
-                }
-                OWF_Mutex_Unlock(&context->updateFlagMutex);
-            }
-            break;
-        default:
-            break;
-    }
-}
-
-/*---------------------------------------------------------------------------
- *
- *----------------------------------------------------------------------------*/
 OWF_API_CALL WFCboolean
 WFC_Context_Active(WFC_CONTEXT* context)
 {
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfcdevice.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfcdevice.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -1137,6 +1138,38 @@
     }
 }
 
+OWF_API_CALL WFCboolean
+WFC_Device_FindScreenNumber(WFCint screenNumber)
+{
+    WFCint i, j, deviceArrayLength, contextArrayLength;
+    WFC_DEVICE* pDevice = NULL;
+    ENTER(WFC_Device_DestroyContext);
+
+    DPRINT(("WFC_Device_CheckScreenNumber(screenNumber = %d)", screenNumber));
+
+    deviceArrayLength = gPhyDevice.iDeviceInstanceArray.length;
+    for (i = 0; i < deviceArrayLength; ++i)
+    {
+        pDevice = DEVICE(OWF_Array_GetItemAt(&(gPhyDevice.iDeviceInstanceArray), i));
+        OWF_ASSERT(pDevice);
+        if (pDevice)
+        {
+            contextArrayLength = pDevice->contexts.length;
+            for (j = 0; j < contextArrayLength; j++)
+            {
+                WFC_CONTEXT*    pContext;
+                pContext = CONTEXT(OWF_Array_GetItemAt(&pDevice->contexts, j));
+                OWF_ASSERT(pContext);
+                if (pContext && (pContext->screenNumber == screenNumber))
+                {
+                    return WFC_TRUE;
+                }
+            }
+        }
+    }
+    return WFC_FALSE;
+}
+
 #ifdef __cplusplus
 }
 #endif
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfcelement.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfcelement.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -392,10 +393,7 @@
 
         case WFC_ELEMENT_SOURCE_FLIP:
         {
-            WFCboolean  flip = (WFCboolean) value;
-
-            result = BOOLEAN_TO_ERROR((WFC_TRUE == flip ||
-                                       WFC_FALSE == flip));
+            result = WFC_ERROR_NONE;
             break;
         }
 
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfcimageprovider.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfcimageprovider.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfcpipeline.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfcpipeline.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -103,10 +104,6 @@
     state->blendInfo.mask                  = state->originalMaskImage ? state->maskImage : NULL;
     state->blendInfo.globalAlpha           = state->globalAlpha;
     
-    /* composition does not use these values ever */
-    state->blendInfo.tsColor                = NULL;
-    state->blendInfo.destinationFullyOpaque = OWF_FALSE;    
-    
     DPRINT(("  globalAplha = %f", state->globalAlpha));
     /* no need to check with OWF_ALPHA_MIN_VALUE as it is zero */
     OWF_ASSERT(state->blendInfo.globalAlpha <= OWF_ALPHA_MAX_VALUE);    
@@ -337,7 +334,6 @@
         return NULL;
     }
 
-    
     /* setup temporary images used in composition. since the original
        source data must not be altered, we must copy it to scratch buffer
        and work it there. another scratch buffer is needed for scaling
@@ -352,7 +348,22 @@
     state->globalAlpha = element->globalAlpha;
     state->sourceScaleFilter = element->sourceScaleFilter;
     state->transparencyTypes = element->transparencyTypes;
-    /* replicate the source viewport rectangle and target extent rectangle */
+
+    if (state->transparencyTypes & WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA)
+        {
+        if (state->globalAlpha == OWF_FULLY_TRANSPARENT)
+            {
+            /* Fully transparent element - no contribution. */
+            return NULL;
+            }
+        if (state->globalAlpha == OWF_FULLY_OPAQUE)
+            {
+            /* Fully opaque global alpha - global alpha can be ignored */
+            state->transparencyTypes &= ~WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA;
+            }
+        }
+    
+/* replicate the source viewport rectangle and target extent rectangle */
     for (x = 0; x < 4; x++)
     {
         state->sourceRect[x] = element->srcRect[x];
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfcscene.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfcscene.c	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,5 @@
 /* Copyright (c) 2009-2010 The Khronos Group Inc.
+ * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -450,3 +451,17 @@
     }
     return element;
 }
+
+/*----------------------------------------------------------------------------*/
+OWF_API_CALL WFC_ELEMENT*
+WFC_Scene_TopMostElement(WFC_SCENE* scene)
+{
+    OWF_NODE*               node = NULL;
+
+    for (node = scene->elements; node && node->next; node = node->next)
+    {
+        /* All work done in the for statement, so no body */
+    }
+    
+    return node ? ELEMENT(node->data) : NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/eabi/openwfc_ri_displayu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_ZN19COpenWFC_RI_Display4NewLEj @ 1 NONAME
+	_ZN19COpenWFC_RI_Display19DefaultScreenNumberEv @ 2 NONAME
--- a/graphicscomposition/openwfcompositionengine/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -1,14 +1,23 @@
 // Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 //
 // Description:
 // 
@@ -20,8 +29,13 @@
 
 PRJ_EXPORTS
 ../group/openwfc_ref.iby							/epoc32/rom/include/openwfc_ref.iby
+../inc/openwfc_ri_display.h			    				SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(WF/openwfc_ri_display.h)
+../inc/openwfc_ri_display_update.h		    			SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(WF/openwfc_ri_display_update.h)
+../bwins/openwfc_ri_displayu.def					SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(def/win32/openwfc_ri_displayu.def)
+../eabi/openwfc_ri_displayu.def					SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(def/eabi/openwfc_ri_displayu.def)
 
 PRJ_MMPFILES
+openwfc_ri_displaylib.mmp
 openwfc.mmp
 
 PRJ_TESTEXPORTS
@@ -33,3 +47,5 @@
 ../common/include/owfpool.h																		SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(owfpool.h)
 ../common/include/owfimage.h																	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(owfimage.h)
 ../common/include/owftypes.h																	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(owftypes.h)
+
+#include "../test/group/bld.inf"
--- a/graphicscomposition/openwfcompositionengine/group/graphics_openwfcompositionengine.mrp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/group/graphics_openwfcompositionengine.mrp	Wed Aug 18 11:05:09 2010 +0300
@@ -6,3 +6,4 @@
 notes_source	\component_defs\release.src
 
 ipr O
+ipr T \sf\os\graphics\graphicscomposition\openwfcompositionengine\test
--- a/graphicscomposition/openwfcompositionengine/group/openwfc.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/group/openwfc.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,14 +1,23 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 //
 // Description:
 // libWFC.dll OpenWFC Sample Implementation
@@ -20,7 +29,7 @@
 //macros to enable filtering debug log output.
 //DEBUG_LOG must also be defined to enable logging 
 //(automatic if _DEBUG is defined, and DEBUG_DONOT_LOG is not defined)
-MACRO DEBUG_DONOT_LOG
+//MACRO DEBUG_DONOT_LOG
 //MACRO DEBUG_LOG_FUNCTION=WFC_Element_
 //MACRO DEBUG_LOG_FILE=owfnotifications.c
 
@@ -56,6 +65,7 @@
 LIBRARY			hal.lib
 LIBRARY			wfcinterop.lib
 LIBRARY			surfacemanager.lib
+LIBRARY			openwfc_ri_display.lib
 
 SOURCEPATH	../composition/src
 SOURCE			wfcapi.c 
@@ -79,7 +89,7 @@
 
 SOURCEPATH	../adaptation/src/Platform/OS/symbian
 SOURCE			owfconsole.cpp
-SOURCE			owfmessagequeue.c
+SOURCE			owfmessagequeue.cpp
 SOURCE			owfmutex.c
 SOURCE			owfsemaphore.c
 SOURCE			owfthread.c
@@ -87,9 +97,9 @@
 
 SOURCEPATH ../adaptation/src/Platform/Graphics/symbian
 SOURCE			owfdisplaycontext.cpp
-SOURCE 			owfscreen_displaychannel.cpp
 SOURCE 			owfnativestreamstub.cpp
-SOURCE 			owfnotifications.cpp
+SOURCE 			owfnotifications.cpp 
+SOURCE                  owfscreen.cpp
 
 
 
--- a/graphicscomposition/openwfcompositionengine/group/openwfc_ref.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/group/openwfc_ref.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -1,15 +1,24 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
 //
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
 //
-// Contributors:
-//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+// 
 // Description:
 // OpenWFC sample implementation
 
@@ -22,4 +31,11 @@
 REM OpenWFC SI
 file=ABI_DIR\BUILD_DIR\libWFC.dll				\sys\bin\libWFC.dll
 
+#if !defined(OPENWFC_RI_DISPLAYDRIVERLIB_DRV)
+// Default display driver adaptation is for Display Channel
+#define OPENWFC_RI_DISPLAYDRIVERLIB_DRV <openwfc_ri_displaychannel.iby>
+#endif
+
+#include OPENWFC_RI_DISPLAYDRIVERLIB_DRV
+
 #endif // __OPENWFC_REF_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/group/openwfc_ri_displaylib.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,32 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// openwfc_ri_display.lib Display Driver Adaptation
+// 
+//
+
+TARGET			    openwfc_ri_display.lib
+TARGETTYPE			    IMPLIB
+DEFFILE			    openwfc_ri_display.def
+
+SMPSAFE
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/inc/openwfc_ri_display.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,121 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// Display Adaptation Interface
+// 
+//
+
+#ifndef OPENWFC_RI_DISPLAY_H
+#define OPENWFC_RI_DISPLAY_H
+
+#include <WF/openwfc_ri_display_update.h>
+#include <pixelformats.h>
+
+class COpenWFC_RI_Display: public CBase, public MOpenWFC_RI_Display_Update
+    {
+public:    
+    typedef enum
+        {
+        EScreenInvalid                = 0x0000,    // Initialisation value, don't use
+        EScreenRotate0                = 0x0001,    // No rotation
+        EScreenRotate90               = 0x0002,    // 90 degree
+        EScreenRotate180              = 0x0004,    // 180 degree
+        EScreenRotate270              = 0x0008,    // 270 degree
+        EScreenRotateMirrorVertical   = 0x0010,    // Upside down/flip
+        EScreenRotateMirrorHorizontal = 0x0020,    // Mirrored
+        EScreenRotateAll              = 0x000F
+        } TScreenRotation;
+
+    typedef enum
+        {
+        EScreenAttributeInvalid       = 0,
+        EScreenAttributeImplementationVersion,      // Version implementation   (TUint32)   RO
+        // Currently the only  pixel format support is EUidPixelFormatXRGB_8888
+        EScreenAttributePixelFormat,                // Pixel format             (TUint32)   RO
+        // Curently, the only value supported is "4"
+        EScreenAttributeBytesPerPixel,              // Bytes per pixel          (TUint32)   RO
+        EScreenAttributeSupportedRotation,          // Supported rotation bitmap(TUint32)   RO
+        EScreenAttributeDefaultRotation,            // Default rotation         (TUint32)   RO
+        EScreenAttributeCurrentRotation,            // Current rotation         (TUint32)   RW
+        EScreenAttributeNormalWidth,                // Width - rotaton 0        (TUint32)   RO
+        EScreenAttributeNormalHeight,               // Height - rotaton 0       (TUint32)   RO
+        EScreenAttributeNormalStride,               // Stride - rotaton 0       (TUint32)   RO
+        EScreenAttributeFlippedWidth,               // Width - rotaton 90       (TUint32)   RO
+        EScreenAttributeFlippedHeight,              // Height - rotaton 90      (TUint32)   RO
+        EScreenAttributeFlippedStride,              // Stride - rotaton 90      (TUint32)   RO
+        EScreenAttributeScreenGeometry              // geometry struct                      RO
+        } TScreenAttribute;
+        
+    typedef struct {
+        TInt32 iSupportedRotations;
+        TInt32 iBytesPerPixel;
+        TScreenRotation iDefaultRotation;
+        TScreenRotation iCurrentRotation;
+        TUidPixelFormat iPixelFormat;
+        TInt32 iNormalWidth;
+        TInt32 iNormalHeight;
+        TInt32 iNormalStride;
+        TInt32 iFlippedWidth;
+        TInt32 iFlippedHeight;
+        TInt32 iFlippedStride;
+        } TScreenGeometryAttribute;
+        
+public:
+        /**
+         * API version
+         * 
+         * @return  API version
+         */
+    inline TUint32 APIVersion();
+    
+    /**
+     * Symbian function factory
+     * 
+     * @param   aStream   Screen Id
+     * 
+     * @return  An instance of implemented interface
+     */
+    IMPORT_C static COpenWFC_RI_Display* NewL(TUint aScreen);
+    
+    /**
+     * retrieves the default screen number for an implementation
+     * 
+     * 
+     * @return  Default Screen ID
+     */
+	IMPORT_C static TUint32 DefaultScreenNumber();
+	
+public:
+    static const TInt32 KTopMostLayer = 0;
+    static const TUint32 KAPIVersion  = 0x00000001;
+    
+protected:
+     TInt GetAttributeSize(TUint aAttributeId);
+    };
+
+inline TUint32 COpenWFC_RI_Display::APIVersion()
+    {
+    return KAPIVersion;
+    }
+
+
+#endif // OPENWFC_RI_DISPLAY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/inc/openwfc_ri_display_update.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,133 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// Display Update Abstract Interface
+// 
+//
+
+#ifndef OPENWFC_RI_DISPLAY_UPDATE_H
+#define OPENWFC_RI_DISPLAY_UPDATE_H
+
+#include <e32base.h>
+#include <graphics/symbianstream.h>
+
+/**
+ * \brief   Abstract interface used by OPENWF-C SI in order to display
+ * the composed content
+ *
+ */
+
+class MOpenWFC_RI_Display_Update
+    {
+public:
+    /**
+     * Retrieves one of the display attributes
+     *
+     * @param   aAttributeId   The attribute ID to be retrieved.
+     * @param   aAttribute   Pointer to the attribute to be retrieved
+     * @param   aAttributeSize   Size in bytes of attribute to be retrieved
+     *
+     * @return  KErrNone or a system wide error
+     */
+    virtual TInt GetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize) = 0;
+    
+    /**
+     * Sets one of the display attributes
+     *
+     * @param   aAttributeId   The attribute ID to be retrieved.
+     * @param   aAttribute   Pointer to the attribute to be retrieved
+     * @param   aAttributeSize   Size in bytes of attribute to be retrieved
+     *
+     * @return  KErrNone or a system wide error
+     */
+    virtual TInt SetAttribute(TInt aAttributeId, TAny* aAttribute, TInt aAttributeSize) = 0;
+    
+    /**
+     * Commits the display attribute.
+     *
+     * @return  KErrNone or a system wide error
+     */
+    virtual TInt CommitAttribute() = 0;
+    
+    /**
+     * Associates a stream with the topmost display layer (overlay).
+     * Must have been called successfully before calling UpdateDisplay.
+     * Also used to specify the composed output stream as the display layer.
+     * Note that currently this method is called each composition, 
+     * but it is only necessary to call it when the top stream changes.
+     * 
+     * This method may fail if any attributes of the stream cannot be handled by the display device.
+     * The aNonTrivialAttributes is a zero-terminated list of attribute keys and values 
+     * that do not match the trivial cases for direct composition, but that some devices may support,
+     * representing eg mirror, scale, rotation, offset, or oversize cases. 
+     * The implementation of this method will stop processing the list and fail if it does not recogise
+     * any of the keys or cannot accept the value associated with that key for direct display.
+     * All platforms should accept an empty or NULL list, but some may simply fail if the list is non-empty, 
+     * so the caller should keep the list brief.
+     *  
+     * If the method fails, then the caller must compose the content into a simpler format, 
+     * and call SetTopLayerSurface again before calling UpdateDisplay.
+     * It is expected that there will be at least 1 pre-determined simpler format or stream handle that will always succeed.  
+     * 
+     * @param   aStream   The stream Id to be associated with the topmost layer
+     * @param   aNonTrivialAttributes   Attribute integer pair list of any non-trivial attribute values. 
+     *
+     * @return  KErrNone or a system wide error
+     */
+    virtual TInt SetTopLayerSurface(SymbianStreamType aStream,TInt* aNonTrivialAttributes=NULL) = 0;   
+
+    /**
+     * Associates a stream with a specific layer.
+     * Must have been called successfully before calling UpdateDisplay.
+     * Note that currently this method is called each composition, 
+     * but it is only necessary to call it when the stream stack changes,
+     * when all layers should be re-specified in turn before the next UpdateDisplay call.
+     * 
+     * This method may fail if any attributes of the stream cannot be handled by the display device.
+     * The aNonTrivialAttributes is a zero-terminated list of attribute keys and values 
+     * that do not match the trivial cases for direct composition, but that some devices may support,
+     * representing eg mirror, scale, rotation, offset, undersize or oversize cases,
+     * and could be used to represent multiple layers. 
+     * The implementation of this method will fail if it does not recogise any of the keys 
+     * or cannot accept the value associated with that key for direct display.
+     * All platforms should accept an empty or NULL list, but some may simply fail if the list is non-empty, 
+     * so the caller should keep the list brief.
+     * 
+     * If the method fails, then the caller must compose the content into a simpler format,
+     * and call SetTopLayerSurface (or SetLayerSurface) again before calling UpdateDisplay.
+     * 
+     * @param   aLayer   The layer id. The layer number "0" is the topmost layer.
+     * @param   aStream  The stream Id to be associated with the specified layer, or SYMBIAN_INVALID_HANDLE.
+     * @param   aNonTrivialAttributes   Attribute integer pair list of any non-trivial attribute values. 
+     *
+     * @return  KErrNone or a system wide error
+     */
+    virtual TInt SetLayerSurface(TInt aLayer, SymbianStreamType aStream,TInt* aNonTrivialAttributes=NULL) = 0;
+    
+    /**
+     * Update (flush/post) the screen
+     * 
+     * @return  KErrNone or a system wide error
+     */
+    virtual TInt UpdateDisplay() = 0;
+    };
+#endif // OPENWFC_RI_DISPLAY_UPDATE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,38 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_TESTMMPFILES
+t_screeninterfaceserver.mmp
+
+PRJ_TESTEXPORTS
+../rom/t_screeninterface.iby			/epoc32/rom/include/t_screeninterface.iby
+../scripts/t_screeninterface.script		z:/wfctest/t_screeninterface.script
+../scripts/t_screeninterface_emulator.script	z:/wfctest/t_screeninterface_emulator.script
+../scripts/t_screeninterface.ini		z:/wfctest/t_screeninterface.ini
+../scripts/t_screeninterface_emulator.ini	z:/wfctest/t_screeninterface_emulator.ini
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/group/t_screeninterfaceserver.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,61 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+TARGET			openwfcscreeninterfacetestserver.exe
+TARGETTYPE		exe
+UID 			0x1000007A 0x200315D5
+CAPABILITY      PowerMgmt ReadDeviceData WriteDeviceData ProtServ
+
+EPOCALLOWDLLDATA
+
+SOURCEPATH		../tscreeninterface
+SOURCE			tscreeninterfaceserver.cpp
+SOURCE			tscreeninterface.cpp 
+SOURCE			streamutility.cpp 
+
+USERINCLUDE		. ..\tscreeninterface 
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+OS_LAYER_LIBC_SYSTEMINCLUDE
+OS_LAYER_ESTLIB_SYSTEMINCLUDE
+
+STATICLIBRARY	tefunit.lib
+LIBRARY		euser.lib
+LIBRARY		testexecuteutils.lib
+LIBRARY		testexecutelogclient.lib
+LIBRARY		rfileloggerclient.lib
+LIBRARY		WFCinterop.lib
+LIBRARY		surfacemanager.lib
+LIBRARY		openwfc_ri_display.lib
+LIBRARY		gdi.lib
+library		libpthread.lib
+
+
+SMPSAFE
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/rom/t_screeninterface.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,33 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+#if (!defined __T_SCREEN_INTERFACE_IBY__)
+#define __T_SCREEN_INTERFACE_IBY__
+
+// OWF screen interface test script
+file=ABI_DIR\DEBUG_DIR\openwfcscreeninterfacetestserver.exe              \sys\bin\openwfcscreeninterfacetestserver.exe
+data=DATAZ_\wfctest\t_screeninterface.script															wfctest\t_screeninterface.script
+data=DATAZ_\wfctest\t_screeninterface.ini																	wfctest\t_screeninterface.ini
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,43 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//	Configuration options for the screen interface tests when run on Platsim/Hardware
+
+[ImageInfo]
+// Note: ContiguousFlag, "true" for contiguous, "false" for non-contiguous
+ContiguousFlag = true
+
+FastpathablePixelFormat = 1027549A
+NonFastpathablePixelFormat = 1027549E
+
+// FastpathableWidth 
+// FastpathableHeight
+// Stride       
+// OffsetToFirstBuffer = 0
+// Alignment = 0         
+// Mappable = ETrue
+// MaxBuffers = 2             
+// MinBuffers = 1
+// OffsetBetweenBuffers = 0
+// SurfaceHints = 0
+// Note: CacheAttrib, "true" for CPU cached, "false" for not CPU cached
+// CacheAttrib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,35 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+LOAD_SUITE	openwfcscreeninterfacetestserver
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0100L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0101L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0102L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0103L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0104L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0105L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0106L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0107L t_screeninterface.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0108L t_screeninterface.ini
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface_emulator.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,42 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//	Configuration options for the screen interface tests when run on the emulator
+
+[ImageInfo]
+// Note: On the emulator stream creation succeeds if the Contiguous Flag is set or not set
+
+FastpathablePixelFormat = 1027549A
+NonFastpathablePixelFormat = 1027549E
+
+// FastpathableWidth 
+// FastpathableHeight
+// Stride       
+// OffsetToFirstBuffer = 0
+// Alignment = 0         
+// Mappable = ETrue
+// MaxBuffers = 2             
+// MinBuffers = 1
+// OffsetBetweenBuffers = 0
+// SurfaceHints = 0
+// Note: CacheAttrib, "true" for CPU cached, "false" for not CPU cached
+// CacheAttrib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/scripts/t_screeninterface_emulator.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,35 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description: tscreeninterface emulator tests
+//
+
+LOAD_SUITE	openwfcscreeninterfacetestserver
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0100L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0101L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0102L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0103L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0104L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0105L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0106L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0107L t_screeninterface_emulator.ini
+RUN_TEST_STEP	100	openwfcscreeninterfacetestserver	TEFUnit.CTestScreenInterface.GRAPHICS_OPENWFC_SCREENINTERFACE_0108L t_screeninterface_emulator.ini
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/tscreeninterface/streamutility.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,446 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+/**
+ @file
+*/
+
+#include <e32std.h>
+#include <imageconversion.h>
+#include <graphics/symbianstream.h>
+#include "streamutility.h"
+
+#define WFC_INVALID_HANDLE NULL
+
+CStreamUtility::CStreamUtility()
+	{
+	}
+	
+CStreamUtility* CStreamUtility::NewL()
+	{
+	CStreamUtility* utility = new (ELeave)CStreamUtility();
+	CleanupStack::PushL(utility);
+	utility->ConstructL();
+	CleanupStack::Pop(utility);
+	return utility;
+	}
+	
+void CStreamUtility::ConstructL()
+	{
+	TInt r = iManager.Open();
+	if (r != KErrNone)
+		{
+		LOG(("Surface manager failed to open: %d", r));
+		User::Leave(r);
+		}
+	}
+	
+CStreamUtility::~CStreamUtility()
+	{
+	DestroyAll();
+
+	iStreams.Close();
+
+	iManager.Close();
+	}
+
+TBool CStreamUtility::DestroyAll()
+	{
+	TInt err = 	KErrNone;
+	TInt jj = iStreams.Count() - 1;
+	if (jj<0)
+		return EFalse;
+	for (; jj >= 0; jj--)
+		{
+        //The following lines are just to get the surface ID for verification
+		SymbianStreamBuffer bufferHandle;
+		User::LeaveIfError(SymbianStreamAcquireReadBuffer(iStreams[jj], &bufferHandle));
+		long bufferIndex;
+		const TSurfaceId* pSurfaceId = NULL;
+		
+		User::LeaveIfError(SymbianStreamGetBufferId(iStreams[jj],bufferHandle,&bufferIndex,&pSurfaceId));
+        User::LeaveIfError(SymbianStreamReleaseReadBuffer(iStreams[jj], bufferHandle));
+        
+        const TSurfaceId surfaceId = *pSurfaceId;   //Need to copy my reference to the ID.
+        //Actually release the stream
+        SymbianStreamRemoveReference(iStreams[jj]);
+        
+        //Verify the stream is now not accessible
+        TInt offset;
+		err = iManager.GetBufferOffset(surfaceId,0,offset);
+		if (err==KErrNone)
+			{
+			LOG(("Closing stream via DestoryAll did not destroy surface!"));
+			}
+		}
+	iStreams.Reset();
+	return ETrue;
+	}
+
+/***************************************
+ * The aim of the RHeapStreamArray is to locally switch in the specified heap for any array operation
+ ***************************************/
+
+CStreamUtility::RHeapStreamArray::RHeapStreamArray(RHeapStreamArray* aUseExternalArray)
+	:	iUseArray(aUseExternalArray?aUseExternalArray->iUseArray:&this->iLocalArray),
+	iExternalHeapRef(aUseExternalArray?aUseExternalArray->iExternalHeapRef:User::Heap())
+	{
+	
+	}
+/************************************
+ * The following methods have been used by the streamutility... some require the heap wrapping, and some don't
+ * I actually need three different strategies (count em) for 7 methods...
+ * Some methods only read the existing objects, so don't need a heap swap at all
+ * Leaving methods have to use PopAndDestroy strategy to restore the heap on leaving or success
+ * Non-leaving methods must not call PushL, so directly make SwitchHeap calls!
+ ************************************/
+
+/// PopAndDestroy method to restore the heap
+/*static*/ void	CStreamUtility::RHeapStreamArray::PopHeap(void* aHeapPtr)
+	{
+	RHeap* heapPtr=(RHeap*)aHeapPtr;
+	User::SwitchHeap(heapPtr);
+	}
+
+SymbianStreamType& CStreamUtility::RHeapStreamArray::operator[](TUint aIndex)
+	{
+	return iUseArray->operator[](aIndex);
+	}
+
+/// Close only closes the local array, while Reset resets the active array (may be external)
+void CStreamUtility::RHeapStreamArray::Close()
+	{
+	iLocalArray.Close();
+	}
+
+TInt CStreamUtility::RHeapStreamArray::Count() const
+	{
+	return iUseArray->Count();
+	}
+
+/// Close only closes the local array, while Reset resets the active array (may be external)
+inline void CStreamUtility::RHeapStreamArray::Reset()
+	{
+	iUseArray->Reset();
+	}
+
+void CStreamUtility::RHeapStreamArray::AppendL(const SymbianStreamType &anEntry)
+	{
+	iUseArray->AppendL(anEntry);
+	}
+
+TInt CStreamUtility::RHeapStreamArray::Find(const SymbianStreamType &anEntry) const
+	{
+	return iUseArray->Find(anEntry);
+	}
+
+void CStreamUtility::RHeapStreamArray::Remove(TInt anIndex)
+	{
+	iUseArray->Remove(anIndex);
+	}
+
+/**
+Cleanup stack helper object, holding references to both utility and stream, so
+that the standard Close() semantics can be used.
+*/
+class TStreamCleanup
+	{
+public:
+	TStreamCleanup(CStreamUtility& aUtility, SymbianStreamType& aStream)
+		: iUtility(aUtility), iStream(aStream)
+		{}
+	void Close()
+		{
+		// Removes the stream from the list of streams to clean up, and closes
+		// the stream reference.
+		iUtility.DestroyStream(iStream);
+		}
+private:
+	CStreamUtility& iUtility;
+	SymbianStreamType& iStream;
+	};
+
+/**
+Get the size of a stream.
+
+@param  aStream The stream to get the size for.
+@return The size in pixels, or empty on failure.
+*/
+TSize CStreamUtility::StreamSize(const SymbianStreamType aStream)
+	{
+	khronos_int32_t width;
+	khronos_int32_t height;
+	khronos_int32_t stride;
+	khronos_int32_t format;
+	khronos_int32_t pixelSize;
+		
+	SymbianStreamGetHeader(aStream, &width, &height, &stride, &format, &pixelSize);
+	
+	TSize size = TSize(static_cast<TInt>(width), static_cast<TInt>(height));
+	
+	return size;
+	}
+
+/**
+Create a stream using the surface manager.
+
+Stores the ID for tear down, as well as returning it.
+
+@param aSize            Dimensions of the stream.
+@param aPixelFormat	    UID of the pixel format.
+@param aStride	        Stride value for the stream (usually bytes per pixel * width)
+@param aReturnSurface   Returns TSurfaceId wrapped by the stream
+@param aContiguous      Contiguous flag for creating surfaces
+@param aBuffers         Number of buffers
+@leave May leave due to lack of memory.
+@return New stream's ID.
+*/
+SymbianStreamType CStreamUtility::CreateStreamL(const TSize& aSize, TUidPixelFormat aPixelFormat, 
+                                            TInt aStride, TSurfaceId& aReturnSurface, 
+                                            TBool aContiguous, TInt aBuffers)
+	{
+	RSurfaceManager::TSurfaceCreationAttributesBuf bf;
+	RSurfaceManager::TSurfaceCreationAttributes& b = bf();
+	if (aStride<aSize.iWidth*BytesPerPixelL(aPixelFormat))
+	    {
+	    User::Leave(KErrOverflow);
+	    }
+	b.iSize.iWidth = aSize.iWidth;
+	b.iSize.iHeight = aSize.iHeight;
+	b.iBuffers = aBuffers;				// number of buffers in the surface
+	b.iPixelFormat = aPixelFormat;
+	b.iStride = aStride;		// Number of bytes between start of one line and start of next
+	b.iOffsetToFirstBuffer = 0;	// way of reserving space before the surface pixel data
+	b.iAlignment = 4;			// alignment, 1,2,4,8 byte aligned
+	b.iContiguous = !!aContiguous;
+	b.iMappable = ETrue;
+
+	aReturnSurface = TSurfaceId::CreateNullId();
+
+	User::LeaveIfError(iManager.CreateSurface(bf, aReturnSurface));
+	
+	SymbianStreamType ns;
+	TInt err = SymbianStreamAcquire(&aReturnSurface, &ns);
+    iManager.CloseSurface(aReturnSurface);		//The stream should now own the only reference
+	if (err != KErrNone)
+		{
+		User::Leave(err);	
+		}
+	iStreams.AppendL(ns);
+	return ns;
+	}
+
+/**
+Fill the given stream with a color.
+
+@param aStream	The stream to be filled.
+@param aColor	The color to fill it with.
+*/
+void CStreamUtility::FillStreamL(SymbianStreamType aStream, const TRgb& aColor)
+	{
+	
+	khronos_int32_t width;
+	khronos_int32_t height;
+	khronos_int32_t stride;
+	khronos_int32_t format;
+	khronos_int32_t pixelSize;
+		
+	SymbianStreamGetHeader(aStream, &width, &height, &stride, &format, &pixelSize);
+
+	TUint32 color = 0;
+	TBool use16 = EFalse;
+
+	if (height<0 || width<0 || stride<0)
+		{
+		User::Leave(KErrCorrupt);
+		}
+	if (height==0 || width==0 || stride==0)
+		{
+		User::Leave(KErrNotReady);
+		}
+
+	switch (format)
+		{
+		case EUidPixelFormatXRGB_8888:
+			{
+			color = aColor.Color16MU();
+			break;
+			}
+		case EUidPixelFormatARGB_8888:
+			{
+			color = aColor.Color16MA();
+			break;
+			}
+		case EUidPixelFormatARGB_8888_PRE:
+			{
+			color = aColor.Color16MAP();
+			break;
+			}
+		case EUidPixelFormatXRGB_4444:
+		case EUidPixelFormatARGB_4444:
+			{
+			color = aColor.Color4K();
+			use16 = ETrue;
+			break;
+			}
+		case EUidPixelFormatRGB_565:
+			{
+			color = aColor.Color64K();
+			use16 = ETrue;
+			break;
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);
+			break;
+			}
+		}
+
+    SymbianStreamBuffer bufferHandle;
+    User::LeaveIfError(SymbianStreamAcquireWriteBuffer(aStream, &bufferHandle));
+    long bufferIndex;
+    const TSurfaceId* surfaceId = NULL;
+    User::LeaveIfError(SymbianStreamGetBufferId(aStream,bufferHandle,&bufferIndex,&surfaceId));
+
+	RChunk chunk;
+	User::LeaveIfError(iManager.MapSurface(*surfaceId, chunk));
+	CleanupClosePushL(chunk);
+
+	TInt offsetToFirstBuffer;
+	User::LeaveIfError(iManager.GetBufferOffset(*surfaceId, 0, offsetToFirstBuffer));
+	TUint8* streamPtr = chunk.Base() + offsetToFirstBuffer;
+	TUint8* linePtr = streamPtr;
+
+	if (use16)
+		{
+		if ( width*2>stride)
+			{
+			User::Leave(KErrOverflow);
+			}
+		TUint16* ptr = reinterpret_cast<TUint16*>(streamPtr);
+
+		// Fill first line
+		for (TInt xx = 0; xx < width; xx++)
+			{
+			ptr[xx] = (TUint16)color;
+			}
+		}
+	else
+		{
+		if ( width*4>stride)
+			{
+			User::Leave(KErrOverflow);
+			}
+		TUint32* ptr = reinterpret_cast<TUint32*>(streamPtr);
+
+		// Fill first line
+		for (TInt xx = 0; xx < width; xx++)
+			{
+			ptr[xx] = color;
+			}
+		}
+
+	// Now copy that to the other lines
+	for (TInt yy = 1; yy < height; yy++)
+		{
+		linePtr += stride;
+		Mem::Copy(linePtr, streamPtr, width * BytesPerPixelL(aStream));
+		}
+	User::LeaveIfError(SymbianStreamReleaseWriteBuffer(aStream, bufferHandle));
+	CleanupStack::PopAndDestroy(/* chunk */);
+	}
+
+/**
+Destroy a stream.
+
+As well as destroying the stream, it is removed from the set held for
+destruction during tear down.
+
+@param aStream	The stream to be destroyed.
+*/
+void CStreamUtility::DestroyStream(SymbianStreamType aStream)
+	{
+	TInt index = iStreams.Find(aStream);
+	
+	if (index != KErrNotFound)
+		{
+		iStreams.Remove(index);
+		}
+
+	SymbianStreamRemoveReference(aStream);
+	}
+
+/**
+A helper function that returns the bytes per pixel for a given pixel format uid
+
+@param      aPixelFormat Pixel format UID to convert
+@return     The bytes per pixel
+*/
+TInt CStreamUtility::BytesPerPixelL(TUidPixelFormat aPixelFormat)
+    {
+    TInt bytesPerPixel = 0;
+    switch (aPixelFormat)
+        {
+        case EUidPixelFormatXRGB_8888:
+        case EUidPixelFormatARGB_8888:
+        case EUidPixelFormatARGB_8888_PRE:
+            {
+            bytesPerPixel = 4;
+            break;
+            }
+        case EUidPixelFormatXRGB_4444:
+        case EUidPixelFormatARGB_4444:
+        case EUidPixelFormatRGB_565:
+            {
+            bytesPerPixel = 2;
+            break;
+            }
+        default:
+            {
+            User::Leave(KErrNotSupported);
+            break;
+            }
+        }
+    return bytesPerPixel;
+    }
+
+/**
+A helper function that returns the bytes per pixel for a given stream
+
+@param      aStream The stream which is checked
+@return     The bytes per pixel
+*/
+TInt CStreamUtility::BytesPerPixelL(const SymbianStreamType aStream)
+    {
+    khronos_int32_t width;
+    khronos_int32_t height;
+    khronos_int32_t stride;
+    khronos_int32_t format;
+    khronos_int32_t pixelSize;
+        
+    SymbianStreamGetHeader(aStream, &width, &height, &stride, &format, &pixelSize);
+
+    return static_cast<TInt>(pixelSize);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/tscreeninterface/streamutility.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,99 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+/**
+ @file
+*/
+
+#ifndef __STREAM_UTILITY__
+#define __STREAM_UTILITY__
+
+#include <e32base.h>
+#include <graphics/surface.h>
+#include <graphics/surfacemanager.h>
+#include <graphics/surfaceupdateclient.h>
+#define ENABLE_TEST_LOGGING
+
+#if defined(ENABLE_TEST_LOGGING)
+#define LOG(X)	RDebug::Printf X
+#else
+#define LOG(X)
+#endif
+
+class TRgb;
+class CFbsBitmap;
+
+class CStreamUtility : public CBase
+	{
+public:
+	CStreamUtility();
+	static CStreamUtility* NewL();
+	virtual ~CStreamUtility();
+	TSize StreamSize(const SymbianStreamType aStream);
+	SymbianStreamType CreateStreamL(const TSize& aSize, TUidPixelFormat aPixelFormat, 
+                                    TInt aStride, TSurfaceId& aReturnSurface, TBool aContiguous, TInt aBuffers = 1);
+	TInt BytesPerPixelL(const SymbianStreamType aStream);
+	TInt BytesPerPixelL(TUidPixelFormat aPixelFormat);
+	void FillStreamL(SymbianStreamType aStream, const TRgb& aColor);
+	void DestroyStream(SymbianStreamType aStream);
+	TBool DestroyAll();
+	RSurfaceManager& Manager()	{return iManager;}
+private:
+	CStreamUtility(CStreamUtility* aClone);
+	void ConstructL();
+
+private:
+	RSurfaceManager iManager;
+    TInt    iScreenNum;
+
+	//This local object wraps the array operations in a heap switch
+	//The reason for providing this wrapper is to allow threads to share the surface manager stream ID list.
+	//In particular, the next test can attempt to release the previous test's stream if it paniced. 
+	//Note that the presumption is that the owning thread will be paused, 
+	//so there will be no thread interlock issues with it's heap manager.
+	class RHeapStreamArray
+		{
+		public:
+		typedef RArray<SymbianStreamType>	Array;
+		RHeapStreamArray(RHeapStreamArray* aUseExternalArray=NULL);
+
+		//Emulation of RArray entrypoints. Add more stub methods if required...
+		SymbianStreamType& operator[](TUint aIndex);
+		void Close();
+		TInt Count() const;
+		inline void Reset();
+		void AppendL(const SymbianStreamType &anEntry);
+		TInt Find(const SymbianStreamType &anEntry) const;
+		void Remove(TInt anIndex);
+		
+		private:
+		static void PopHeap(void* mainheap);
+		
+		Array iLocalArray;
+		Array* iUseArray;
+		RHeap &iExternalHeapRef;
+		}	iStreams;
+	};
+
+#endif // __STREAM_UTILITY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/tscreeninterface/tscreeninterface.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,971 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+// Implementation of test class for OpenWF-C RI display driver interface 
+//
+
+#include <WF/openwfc_ri_display.h>
+#include <WF/openwfc_ri_display_update.h>
+#include <test/extendtef.h>
+#include <test/tefunit.h>
+#include <hal.h>
+#include "tscreeninterface.h"
+
+#define KCompositorVersion 0x01023456
+#define KRgbRed         TRgb(0x0000ff)
+#define KRgbGreen       TRgb(0x00ff00)
+#define KRgbYellow      TRgb(0x00ffff)
+#define KRgbBlue        TRgb(0xff0000)
+
+const TInt KDefaultScreenNumber = 0;
+const TTimeIntervalMicroSeconds32 KDelay = 1000000;  //delay in microseconds
+const TTimeIntervalMicroSeconds32 KMinimalDelay = 1000;  //delay in microseconds
+
+_LIT(KImageSectionName, "ImageInfo");
+_LIT(KContiguousFlag, "ContiguousFlag");
+_LIT(KNonFastpathablePixelFormat, "NonFastpathablePixelFormat");
+_LIT(KFastpathablePixelFormat, "FastpathablePixelFormat");
+
+/*
+ * CTestScreenInterface implementation
+ */
+
+CTestScreenInterface::CTestScreenInterface()
+:iContiguous(EFlagNotListed),
+ iFastpathablePixelFormat(EUidPixelFormatARGB_8888_PRE),
+ iNonFastpathablePixelFormat(EUidPixelFormatRGB_565),
+ iMappable(ETrue),
+ iMaxBuffers(2),
+ iMinBuffers(1),
+ iCacheAttrib(ECacheNotlisted)
+	{
+	// No implementation required
+	}
+
+CTestScreenInterface::~CTestScreenInterface()
+	{
+    TearDown();
+	}
+
+void CTestScreenInterface::SetupL()
+	{
+	iUtility = CStreamUtility::NewL();
+	iRed.SetInternal(0xFFFF0000);
+	iGreen.SetInternal(0xFF00FF00);
+	iBlue.SetInternal(0xFF0000FF);
+	ReadIniData();
+    User::After(KDelay); // consider reading delay from ini file
+	}
+
+/**
+ * test Suite furniture 
+ **/
+void CTestScreenInterface::TearDownL()
+	{
+    // Nothing leaves in this function, 
+    // but TearDownL() is needed for the CTestFixture (TEF) interface
+    TearDown();
+	}
+
+void CTestScreenInterface::TearDown()
+    {
+    if(iUtility)
+        {
+        delete iUtility;
+        iUtility = NULL;
+        }
+    }
+
+// Create a suite of all the tests
+CTestSuite* CTestScreenInterface::CreateSuiteL(const TDesC& aName)
+	{
+	SymbianStreamRegisterScreenNotifications(0, 10, KCompositorVersion);
+	SUB_SUITE_OPT(CTestScreenInterface,NULL);
+
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0100L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0101L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0102L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0103L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0104L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0105L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0106L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0107L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0108L);		
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_SCREENINTERFACE_0109L);
+
+        END_SUITE;	
+	
+	}
+
+/// This handles any non-member uses of the extended ASSERT_XXX macros
+void TefUnitFailLeaveL()
+	{
+	User::Leave(KErrTEFUnitFail);
+	}
+
+void CTestScreenInterface::ReadIniData()
+    {
+    TBool contiguousFlag;
+    TBool returnValue = iConfig.GetBool(KImageSectionName, KContiguousFlag, contiguousFlag);
+    if (returnValue)
+        {
+        if(contiguousFlag)
+            {
+            iContiguous = EContiguous;
+            }
+        else
+            {
+            iContiguous = ENonContiguous;
+            }
+        }
+    
+    TInt fastpathablePixelFormat;
+    returnValue = iConfig.GetHex(KImageSectionName, KFastpathablePixelFormat, fastpathablePixelFormat);
+    if(returnValue)
+        {
+        iFastpathablePixelFormat = static_cast<TUidPixelFormat>(fastpathablePixelFormat);
+        }
+    
+    TInt nonFastpathablePixelFormat;
+    returnValue = iConfig.GetHex(KImageSectionName, KNonFastpathablePixelFormat, nonFastpathablePixelFormat);
+    if(returnValue)
+        {
+        iNonFastpathablePixelFormat = static_cast<TUidPixelFormat>(nonFastpathablePixelFormat);
+        }
+    }
+
+TInt CTestScreenInterface::BaseTestContiguousFlag(TBool aContiguous)
+     {
+      COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+      CleanupStack::PushL(screenContext);
+      
+      TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+      screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                  &screenRotation,
+                                  sizeof(screenRotation));
+      screenContext->CommitAttribute();
+
+      COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+      screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                  sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+      
+      TSurfaceId surface = TSurfaceId::CreateNullId();
+      SymbianStreamType ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                                  iFastpathablePixelFormat, attributes.iNormalStride, 
+                                                  surface, aContiguous, 1);
+      ASSERT_FALSE((*ns).IsNull());
+
+      iUtility->FillStreamL(ns, KRgbGreen);
+      
+      TInt err = screenContext->SetTopLayerSurface(ns);
+      Logger().LogExtra(((TText8*)__FILE__), __LINE__, ESevrAll, _L("SetTopLayerSurface() returned %i"),err );
+	  RDebug::Printf("SetTopLayerSurface() returned %i",err);
+      
+	  if (err==KErrNone)
+	      {    //Must successfully SetTopLayerSurface before calling UpdateDisplay. 
+          screenContext->UpdateDisplay();
+	      }
+
+      CleanupStack::PopAndDestroy(screenContext);
+      
+      return err;
+     }
+     
+/**
+@SYMTestCaseID			GRAPHICS_OPENWFC_SCREENINTERFACE_0100
+@SYMTestCaseDesc		Create a screen size stream and display on screen
+@SYMREQ					
+@SYMPREQ				REQ 417-54885
+@SYMTestType            Unit Test			
+@SYMTestPriority        High		
+@SYMTestPurpose			Verify a COpenWFC_RI_Display object can be properly created and a stream can be displayed on screen 
+@SYMTestActions	        
+                        Create a screen context
+                        Set display attributes 
+                        Create a screen size stream based on the display attributes with contigous and non-contiguous flags
+                        Fill the stream
+                        Associates the stream with the topmost display layer
+                        Update the screen
+@SYMTestExpectedResults 
+                        If contiguous flag is set in the ini file, and the stream is created using the flag, 
+                        the stream should be properly displayed on screen. The stream created using the opposit flag from ini value should fail.
+                        If contiguous flag is not set in the ini file, 
+                        the stream should be properly displayed on screen for contiguous and non-contiguous flag.
+ **/		
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0100L()
+	{
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0100L()"));
+    LOG((" *** CTestScreenInterface test 0100L"));
+ 
+    if(iContiguous != EFlagNotListed)
+        {
+
+        // We expect the opposit flag to the one from the ini file to fail
+        if(iContiguous == EContiguous)
+            {
+            ASSERT_TRUE(KErrNotSupported == BaseTestContiguousFlag(ENonContiguous));       
+            }
+        else
+            {
+            ASSERT_TRUE(KErrNotSupported == BaseTestContiguousFlag(EContiguous));       
+            }
+        // The contiguous flag from the ini file should pass
+        ASSERT_TRUE(KErrNone == BaseTestContiguousFlag(iContiguous));
+        // The last run here should be the "good" run so that it can do a Display() call.
+        }
+    else
+        {
+        // Contiguous or Non-contiguous flags should both pass if nothing set in the ini file
+        ASSERT_TRUE(KErrNone == BaseTestContiguousFlag(EContiguous));       
+        ASSERT_TRUE(KErrNone == BaseTestContiguousFlag(ENonContiguous));           
+        }
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0100L() done"));
+    LOG((" *** CTestScreenInterface test 0100L done"));
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS_OPENWFC_SCREENINTERFACE_0101
+@SYMTestCaseDesc		Create a stream, display on screen, then rotate the screen involving scaling
+@SYMREQ					
+@SYMPREQ				REQ 417-54885
+@SYMTestType            Unit Test			
+@SYMTestPriority        Medium		
+@SYMTestPurpose			Verify screen rotation works  
+@SYMTestActions	
+                        Create a screen context
+                        Set display attributes 
+                        Create a screen size stream 
+                        Fill the stream
+                        Associates the stream with the topmost display layer
+                        Update the screen
+                        Rotate the screen 90 degrees, 180 degrees, 270 degrees
+                        Update the screen respectively
+@SYMTestExpectedResults
+                        Methods should complete without error.
+                        The stream should be properly displayed on screen
+ **/
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0101L()
+	{
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0101L()"));
+    LOG((" *** CTestScreenInterface test 0101L"));
+ 
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+
+    if (attributes.iSupportedRotations > 1)
+        {    
+        INFO_PRINTF2(_L("Number of supported rotations: %i "), attributes.iSupportedRotations);
+        TUint32 screenRotation0 = COpenWFC_RI_Display::EScreenRotate0;
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation0,
+                                sizeof(screenRotation0));
+        screenContext->CommitAttribute();
+
+        TSurfaceId surface = TSurfaceId::CreateNullId();
+        SymbianStreamType ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                                iFastpathablePixelFormat, attributes.iNormalStride, 
+                                                surface, iContiguous, 1);
+    
+        ASSERT_FALSE((*ns).IsNull());
+        iUtility->FillStreamL(ns, KRgbRed);
+    
+        TInt err = screenContext->SetTopLayerSurface(ns);
+        ASSERT_TRUE(err == KErrNone);
+
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);
+
+        INFO_PRINTF1(_L("Rotate screen 90 degree"));
+        // Rotate screen 90 degree and test
+        TUint32 screenRotation1 = COpenWFC_RI_Display::EScreenRotate90;
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation1,
+                                sizeof(screenRotation1));
+        screenContext->CommitAttribute();
+
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);    
+
+        if (attributes.iSupportedRotations > 2)
+            {
+            INFO_PRINTF1(_L("Rotate screen 180 degree"));
+            // Rotate screen 180 degree and test
+            TUint32 screenRotation2 = COpenWFC_RI_Display::EScreenRotate180;
+            screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                    &screenRotation2,
+                                    sizeof(screenRotation2));
+            screenContext->CommitAttribute();
+
+            err = screenContext->UpdateDisplay();   
+            ASSERT_TRUE(err == KErrNone);
+            }
+
+        if (attributes.iSupportedRotations > 3)
+            {
+            INFO_PRINTF1(_L("Rotate screen 270 degree"));
+            // Rotate screen 270 degree and test
+            TUint32 screenRotation3 = COpenWFC_RI_Display::EScreenRotate270;
+            screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                    &screenRotation3,
+                                    sizeof(screenRotation3));
+            screenContext->CommitAttribute();
+
+            err = screenContext->UpdateDisplay();   
+            ASSERT_TRUE(err == KErrNone);
+            }
+        
+        // Set screen back to rotation 0 
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                    &screenRotation0,
+                                    sizeof(screenRotation0));
+        screenContext->CommitAttribute();
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);    
+        }
+    else
+        {
+        INFO_PRINTF1(_L("Screen rotation is not supported. Test skipped."));
+        }
+
+    CleanupStack::PopAndDestroy(screenContext);
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS_OPENWFC_SCREENINTERFACE_0102
+@SYMTestCaseDesc        Create a stream, display on screen, then rotate the screen, not involving scaling
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test           
+@SYMTestPriority        Medium      
+@SYMTestPurpose         Verify screen rotation works  
+@SYMTestActions 
+                        Create a screen context
+                        Set display attributes 
+                        Create a stream of the size (screenHeight, screenWidth)
+                        Fill the stream
+                        Associates the stream with the topmost display layer
+                        Update the screen
+                        Rotate the screen 90 degrees
+                        Update the screen
+@SYMTestExpectedResults
+                        Methods should complete without error.
+                        The stream should be properly displayed on screen
+ **/		
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0102L()
+	{
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0102L()"));
+    LOG((" *** CTestScreenInterface test 0102L"));
+ 
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+
+    if (attributes.iSupportedRotations > 1)
+        {    
+        INFO_PRINTF2(_L("Number of supported rotations: %i "), attributes.iSupportedRotations);
+        TUint32 screenRotation0 = COpenWFC_RI_Display::EScreenRotate0;
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation0,
+                                sizeof(screenRotation0));
+        screenContext->CommitAttribute();
+
+        TSurfaceId surface = TSurfaceId::CreateNullId();
+        SymbianStreamType ns=iUtility->CreateStreamL(TSize(attributes.iNormalHeight,attributes.iNormalWidth), 
+                                                iFastpathablePixelFormat, attributes.iNormalStride, 
+                                                surface, iContiguous, 1);
+    
+        ASSERT_FALSE((*ns).IsNull());
+        iUtility->FillStreamL(ns, KRgbRed);
+    
+        TInt err = screenContext->SetTopLayerSurface(ns);
+        ASSERT_TRUE(err == KErrNone);
+
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);
+
+        INFO_PRINTF1(_L("Rotate screen 90 degree"));
+        // Rotate screen 90 degree and test
+        TUint32 screenRotation1 = COpenWFC_RI_Display::EScreenRotate90;
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation1,
+                                sizeof(screenRotation1));
+        screenContext->CommitAttribute();
+
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);    
+        }
+    else
+        {
+        INFO_PRINTF1(_L("Screen rotation is not supported. Test skipped."));
+        }
+
+    CleanupStack::PopAndDestroy(screenContext);
+	}
+
+/**
+@SYMTestCaseID			GRAPHICS_OPENWFC_SCREENINTERFACE_0103
+@SYMTestCaseDesc		Create a stream, fill the stream several times and display on screen
+@SYMREQ					
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test			
+@SYMTestPriority        High				
+@SYMTestPurpose	        Check displaying stream repeatedly	
+@SYMTestActions	
+                        Create a screen context
+                        Set display attributes 
+                        Create a screen size stream 
+                        Fill the stream 
+                        Associates the stream with the topmost display layer
+                        Update the screen
+                        Repeat filling the stream, associate with toplayer and update several times
+                        Destory the screen context                       
+@SYMTestExpectedResults
+                        Methods should complete without error.
+                        Each time, the stream should be properly displayed on screen
+ **/
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0103L()
+	{
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0103L()"));
+    LOG((" *** CTestScreenInterface test 0103L"));
+ 
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+    screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation,
+                                sizeof(screenRotation));
+    screenContext->CommitAttribute();
+
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+    
+    TSurfaceId surface = TSurfaceId::CreateNullId();
+    SymbianStreamType ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                                iFastpathablePixelFormat, attributes.iNormalStride, 
+                                                surface, iContiguous, 1);
+    ASSERT_FALSE((*ns).IsNull());
+
+    iUtility->FillStreamL(ns, KRgbYellow);    
+    TInt err = screenContext->SetTopLayerSurface(ns);
+    ASSERT_TRUE(err == KErrNone);    
+    err = screenContext->UpdateDisplay();    
+    ASSERT_TRUE(err == KErrNone);
+    User::After(KDelay);
+
+    iUtility->FillStreamL(ns, KRgbRed);    
+    err = screenContext->SetTopLayerSurface(ns);
+    ASSERT_TRUE(err == KErrNone);    
+    err = screenContext->UpdateDisplay();    
+    ASSERT_TRUE(err == KErrNone);
+    User::After(KDelay);
+    
+    iUtility->FillStreamL(ns, KRgbGreen);    
+    err = screenContext->SetTopLayerSurface(ns);
+    ASSERT_TRUE(err == KErrNone);    
+    err = screenContext->UpdateDisplay();    
+    ASSERT_TRUE(err == KErrNone);
+    User::After(KDelay);
+    
+    iUtility->FillStreamL(ns, KRgbYellow);    
+    err = screenContext->SetTopLayerSurface(ns);
+    ASSERT_TRUE(err == KErrNone);    
+    err = screenContext->UpdateDisplay();    
+    ASSERT_TRUE(err == KErrNone);
+    User::After(KDelay);
+
+    iUtility->FillStreamL(ns, KRgbRed);    
+    err = screenContext->SetTopLayerSurface(ns);
+    ASSERT_TRUE(err == KErrNone);    
+    err = screenContext->UpdateDisplay();    
+    ASSERT_TRUE(err == KErrNone);
+    User::After(KDelay);
+
+    // Set a non-topmost layer
+    err = screenContext->SetLayerSurface(1, ns);
+    ASSERT_TRUE(err == KErrArgument);    
+    
+    CleanupStack::PopAndDestroy(screenContext);    
+	}
+
+/**
+@SYMTestCaseID          GRAPHICS_OPENWFC_SCREENINTERFACE_0104
+@SYMTestCaseDesc        Display all display attributes
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test
+@SYMTestPriority        High
+@SYMTestPurpose         Check display attributes 
+@SYMTestActions 
+                        Create a screen context
+                        Set display attributes 
+                        Get all display attribtues
+                        Destory the screen context                       
+@SYMTestExpectedResults
+                        Methods should complete without error.
+                        Display attributes should be correct
+ **/
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0104L()
+    {
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0104L()"));
+    LOG((" *** CTestScreenInterface test 0104L"));
+ 
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+ 
+    INFO_PRINTF1(_L("Printing attribute values: "));
+    INFO_PRINTF2(_L("EScreenAttributeSupportedRotation: %i "), attributes.iSupportedRotations);
+    INFO_PRINTF2(_L("EScreenAttributeCurrentRotation: 0x%x "), attributes.iCurrentRotation);
+    INFO_PRINTF2(_L("EScreenAttributeDefaultRotation: 0x%x "), attributes.iDefaultRotation);
+    INFO_PRINTF2(_L("EScreenAttributeBytesPerPixel: %i "), attributes.iBytesPerPixel);
+    INFO_PRINTF2(_L("EScreenAttributeFlippedHeight: %i "), attributes.iFlippedHeight);
+    INFO_PRINTF2(_L("EScreenAttributeFlippedWidth: %i "), attributes.iFlippedWidth);
+    INFO_PRINTF2(_L("EScreenAttributeFlippedStride: %i "), attributes.iFlippedStride);
+    INFO_PRINTF2(_L("EScreenAttributeNormalHeight: %i "), attributes.iNormalHeight);
+    INFO_PRINTF2(_L("EScreenAttributeNormalWidth: %i "), attributes.iNormalWidth);
+    INFO_PRINTF2(_L("EScreenAttributeNormalStride: %i "), attributes.iNormalStride);
+    INFO_PRINTF2(_L("EScreenAttributePixelFormat: 0x%x "), attributes.iPixelFormat);
+    
+    CleanupStack::PopAndDestroy(screenContext);    
+    }
+
+/**
+@SYMTestCaseID          GRAPHICS_OPENWFC_SCREENINTERFACE_0105
+@SYMTestCaseDesc        Create a screen size stream of non-fastpathable pixel format and display on screen
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test - Negative Test        
+@SYMTestPriority        High        
+@SYMTestPurpose         Verify a COpenWFC_RI_Display object can be properly created and a stream can be displayed on screen 
+@SYMTestActions         
+                        Create a screen context
+                        Set display attributes 
+                        Create a screen size stream based on the display attributes with a non-fastpathable pixelformat
+                        Fill the stream
+                        Associate the stream with the topmost display layer
+@SYMTestExpectedResults 
+                        Test should pass.
+                        SetTopLayerSurface should return KErrNotSupported.
+ **/        
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0105L()
+    {
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0105L()"));
+    LOG((" *** CTestScreenInterface test 0105L"));
+    
+    if (!iNonFastpathablePixelFormat)
+        {
+        INFO_PRINTF1(_L("No non-fastpathable format specified - negative test cannot be run."));
+        User::Leave(KErrTEFUnitInconclusive);
+        }
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+     
+    TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+    screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                 &screenRotation,
+                                 sizeof(screenRotation));
+    screenContext->CommitAttribute();
+
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                 sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+     
+    TSurfaceId surface = TSurfaceId::CreateNullId();
+    SymbianStreamType ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                                 iNonFastpathablePixelFormat, attributes.iNormalStride, 
+                                                 surface, iContiguous, 1);
+    ASSERT_FALSE((*ns).IsNull());
+
+    iUtility->FillStreamL(ns, KRgbGreen);
+     
+    ASSERT_TRUE(KErrNotSupported == screenContext->SetTopLayerSurface(ns));
+     
+    CleanupStack::PopAndDestroy(screenContext);
+    }
+
+/**
+@SYMTestCaseID          GRAPHICS_OPENWFC_SCREENINTERFACE_0106
+@SYMTestCaseDesc        Create a stream, display on screen and repeat for a number of times
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test           
+@SYMTestPriority        High        
+@SYMTestPurpose         Check stream display repeatedly
+@SYMTestActions 
+                        Create a screen context
+                        Set display attributes 
+                        Create a stream 
+                        Fill the stream
+                        Associates the stream with the topmost display layer
+                        Update the screen
+                        Destory the screen context
+                        Repeat the above actions for a number of times in a for loop
+@SYMTestExpectedResults
+                        Methods should complete without error.
+                        Each time, the stream should be properly displayed on screen
+ **/        
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0106L()
+    {
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0106L()"));
+    LOG((" *** CTestScreenInterface test 0106L"));
+ 
+    SymbianStreamType ns = NULL;
+    const TInt loopMaxNum = 10;
+    
+    for (TInt i = 0; i < loopMaxNum; ++i)
+        {
+        //INFO_PRINTF2(_L("Create screen context and stream loop: %i"), i);
+
+        COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+        CleanupStack::PushL(screenContext);
+    
+        TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation,
+                                sizeof(screenRotation));
+        screenContext->CommitAttribute();
+
+        COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+        screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+    
+        if(ns == NULL)
+            {
+            TSurfaceId surface = TSurfaceId::CreateNullId();
+            ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                                iFastpathablePixelFormat, attributes.iNormalStride, 
+                                                surface, iContiguous, 1);
+            ASSERT_FALSE((*ns).IsNull());
+            }
+    
+        if(i%3 == 0)
+            {
+            iUtility->FillStreamL(ns, KRgbRed);
+            }
+        else if (i%3 == 1)
+            {
+            iUtility->FillStreamL(ns, KRgbGreen);                
+            }
+            else
+                {
+                iUtility->FillStreamL(ns, KRgbBlue);        
+                }
+    
+        TInt err = screenContext->SetTopLayerSurface(ns);
+        ASSERT_TRUE(err == KErrNone);
+    
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);
+
+        CleanupStack::PopAndDestroy(screenContext);   
+        
+        User::After(KDelay);
+        }
+    }
+
+/**
+@SYMTestCaseID          GRAPHICS_OPENWFC_SCREENINTERFACE_0107
+@SYMTestCaseDesc        Simple Non Trivial Attributes
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test           
+@SYMTestPriority        High        
+@SYMTestPurpose         Check that simple non-trivial attributes are accepted by SetTopLayerSurface.
+                        Note this test does not pass in "real" attributes, so the result is predictable.
+@SYMTestActions 
+                        Create a screen context
+                        Set display attributes 
+                        Create a fastpathable stream 
+                        Fill the stream
+                        Associate the stream with the topmost display layer 
+                            and NULL Non Trivial Atrributes
+                        Update the screen
+                        Associate the stream with the topmost display layer 
+                            and empty Non Trivial Atrributes
+                        Update the screen
+                        Associate the stream with the topmost display layer 
+                            and wrong Non Trivial Atrributes
+                        This should fail
+                        Destory the screen context
+@SYMTestExpectedResults
+                        SetTopLayerSurface should not fail, except for wrong attribute.
+                        SetTopLayerSurface should not crash or panic.
+ **/        
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0107L()
+    {
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0107L()"));
+    LOG((" *** CTestScreenInterface test 0107L"));
+    
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+    screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                             &screenRotation,
+                             sizeof(screenRotation));
+    screenContext->CommitAttribute();
+    
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                             sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+    
+    TSurfaceId surface = TSurfaceId::CreateNullId();
+    SymbianStreamType ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                             iFastpathablePixelFormat, attributes.iNormalStride, 
+                                             surface, iContiguous, 1);
+    ASSERT_FALSE((*ns).IsNull());
+    
+    iUtility->FillStreamL(ns, KRgbGreen);
+    
+    TInt err = screenContext->SetTopLayerSurface(ns,NULL);
+    ASSERT_FALSE(err);
+    screenContext->UpdateDisplay();
+    
+    TInt emptyList=0;
+    err = screenContext->SetTopLayerSurface(ns,&emptyList);
+    ASSERT_FALSE(err);
+    screenContext->UpdateDisplay();
+    
+    TInt wrongList=-1;
+    err = screenContext->SetTopLayerSurface(ns,&wrongList);
+    ASSERT_TRUE(err);
+    
+    //Calling UpdateDisplay should fall-back to the previous setting of top layer surface
+    screenContext->UpdateDisplay();
+   
+    CleanupStack::PopAndDestroy(screenContext);
+   }
+
+/**
+@SYMTestCaseID          GRAPHICS_OPENWFC_SCREENINTERFACE_0108
+@SYMTestCaseDesc        Test getting and setting attributes
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test           
+@SYMTestPriority        High        
+@SYMTestPurpose         Check getting and setting attibutes with good and bad values
+@SYMTestActions 
+                        Create a screen context
+                        Get and set attributes with good and bad values
+                        Destory the screen context
+@SYMTestExpectedResults
+                        GetAttribute should always succeed with all valid TScreenAttribute values 
+                        and appropriate attribute size 
+                        SetAttribute should succeed for modifying the current rotation
+                        Invalid valued for getting and setting attributes should return correct error code
+ **/        
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0108L()
+    {
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0108L()"));
+    LOG((" *** CTestScreenInterface test 0108L"));
+
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+    TInt err;
+    
+    for(TUint ii = COpenWFC_RI_Display::EScreenAttributeInvalid; ii <= COpenWFC_RI_Display::EScreenAttributeScreenGeometry; ++ii)
+        {        
+        if(ii == COpenWFC_RI_Display::EScreenAttributeScreenGeometry)
+            {
+            err = screenContext->GetAttribute(ii, &attributes, 
+                             sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));    
+            }
+        else
+            {
+            err = screenContext->GetAttribute(ii, &attributes, 
+                             sizeof(COpenWFC_RI_Display::TScreenAttribute));
+            }
+        
+        if(ii == COpenWFC_RI_Display::EScreenAttributeInvalid)
+            {
+            ASSERT_TRUE(err == KErrNotSupported);
+            }
+        else
+            {
+            ASSERT_TRUE(err == KErrNone);
+            }        
+        }
+    
+    TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+    err = screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, &screenRotation, 
+                    sizeof(screenRotation));
+    // The only parameter that can be modified is the current rotation
+    ASSERT_TRUE(err == KErrNone);
+
+    err = screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeSupportedRotation, &screenRotation, 
+                    sizeof(screenRotation));
+    ASSERT_TRUE(err == KErrNotSupported);
+
+    // Set attribute to NULL
+    err = screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, NULL, 
+                     sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));    
+    ASSERT_TRUE(err == KErrArgument);
+
+    // Set attribute size to be 0
+    err = screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeBytesPerPixel, &attributes, 0);    
+    ASSERT_TRUE(err == KErrArgument);
+
+    // Set attribute == NULL
+    err = screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeBytesPerPixel, NULL, 
+                     sizeof(COpenWFC_RI_Display::TScreenAttribute));    
+    ASSERT_TRUE(err != KErrNone);
+
+    // Set attribute with wrong size
+    err = screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                     sizeof(COpenWFC_RI_Display::TScreenAttribute));    
+    ASSERT_TRUE(err != KErrNone);
+
+    CleanupStack::PopAndDestroy(screenContext);
+    }
+
+/**
+@SYMTestCaseID          GRAPHICS_OPENWFC_SCREENINTERFACE_0109
+@SYMTestCaseDesc        Create a stream, display on screen and repeat for a number of times
+@SYMREQ                 
+@SYMPREQ                REQ 417-54885
+@SYMTestType            Unit Test           
+@SYMTestPriority        High        
+@SYMTestPurpose         Check stream display repeatedly
+@SYMTestActions 
+                        Create a screen context
+                        Set display attributes 
+                        Repeat the below actions for a number of times in a for loop
+                        Create a stream 
+                        Fill the stream
+                        Associates the stream with the topmost display layer
+                        Update the screen
+                        Finally
+                        Destory the screen context
+                        
+@SYMTestExpectedResults
+                        Methods should complete without error.
+                        Each time, the stream should be properly displayed on screen
+                        The streams should be destroyed in a timely manner after they stop being displayed
+ **/ 
+
+void CTestScreenInterface::GRAPHICS_OPENWFC_SCREENINTERFACE_0109L()
+    {
+    INFO_PRINTF1(_L("GRAPHICS_OPENWFC_SCREENINTERFACE_0109L()"));
+    LOG((" *** CTestScreenInterface test 0106L"));
+    _LIT(KDirectPost, "DirectPost");
+    TBool   directPost; //If DirectPost is not defined then the exact order of buffer releasing cannot be asserted.
+    TBool definedDirectPost = iConfig.GetBool(KImageSectionName, KDirectPost, directPost);
+    TInt offset;
+    TInt error;
+    TSurfaceId surface;
+    SymbianStreamType ns = NULL;
+    TSurfaceId prevsurface = TSurfaceId::CreateNullId();
+
+    COpenWFC_RI_Display* screenContext = COpenWFC_RI_Display::NewL(KDefaultScreenNumber);
+    CleanupStack::PushL(screenContext);
+    
+    for (TInt i = 0; i < 10; ++i)
+        {
+        //INFO_PRINTF2(_L("Create  stream loop: %i"), i);
+    
+        TUint32 screenRotation = COpenWFC_RI_Display::EScreenRotate0;
+        screenContext->SetAttribute(COpenWFC_RI_Display::EScreenAttributeCurrentRotation, 
+                                &screenRotation,
+                                sizeof(screenRotation));
+        screenContext->CommitAttribute();
+
+        COpenWFC_RI_Display::TScreenGeometryAttribute attributes;
+        screenContext->GetAttribute(COpenWFC_RI_Display::EScreenAttributeScreenGeometry, &attributes, 
+                                sizeof(COpenWFC_RI_Display::TScreenGeometryAttribute));
+    
+        surface = TSurfaceId::CreateNullId();
+        ns=iUtility->CreateStreamL(TSize(attributes.iNormalWidth,attributes.iNormalHeight), 
+                                            iFastpathablePixelFormat, attributes.iNormalStride, 
+                                            surface, iContiguous, 2);
+        ASSERT_FALSE((*ns).IsNull());
+    
+        if(i%3 == 0)
+            {
+            iUtility->FillStreamL(ns, KRgbRed);
+            }
+        else if (i%3 == 1)
+            {
+            iUtility->FillStreamL(ns, KRgbGreen);                
+            }
+            else
+                {
+                iUtility->FillStreamL(ns, KRgbBlue);        
+                }
+    
+        
+        if (!prevsurface.IsNull())
+            {
+            error=iUtility->Manager().GetBufferOffset(prevsurface,0,offset);
+            ASSERT_TRUE(definedDirectPost ? error == (directPost?KErrNone:KErrArgument) :1);
+            }
+        TInt err = screenContext->SetTopLayerSurface(ns);
+        ASSERT_TRUE(err == KErrNone);
+        //GetBufferOffset is a safe way to check if the surface is still alive
+        if (!prevsurface.IsNull())
+            {
+            error=iUtility->Manager().GetBufferOffset(prevsurface,0,offset);
+            ASSERT_TRUE(definedDirectPost ? error == (directPost?KErrNone:KErrArgument) :1);
+            }
+    
+        err = screenContext->UpdateDisplay();   
+        ASSERT_TRUE(err == KErrNone);
+
+        User::After(KMinimalDelay);
+        
+        error=iUtility->Manager().GetBufferOffset(surface,0,offset);
+        ASSERT_TRUE(definedDirectPost ? error == (directPost?KErrNone:KErrArgument) :1);
+        
+        if (!prevsurface.IsNull())
+            {
+            error=iUtility->Manager().GetBufferOffset(prevsurface,0,offset);
+            ASSERT_TRUE(error);   //previous surface should definitely be deleted by now
+            }
+        iUtility->DestroyStream(ns);
+        error=iUtility->Manager().GetBufferOffset(surface,0,offset);
+        ASSERT_TRUE(definedDirectPost ? error == (directPost?KErrNone:KErrArgument) :1);
+        prevsurface=surface;
+        
+        User::After(KDelay);
+        }
+    CleanupStack::PopAndDestroy(screenContext);   
+    
+    if (!prevsurface.IsNull())
+        {
+        error=iUtility->Manager().GetBufferOffset(surface,0,offset);
+        ASSERT_TRUE(error);   //previous surface should definitely be deleted by now
+        }
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/tscreeninterface/tscreeninterface.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,103 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+#ifndef TSCREENINTERFACE_H
+#define TSCREENINTERFACE_H
+
+// INCLUDES
+#include <test/tefunit.h>
+#include <w32std.h>
+#include <khronos_types.h>
+#include <graphics/symbianstream.h>
+#include "streamutility.h"
+
+class CTestExecuteLogger;
+class CSurfaceStream;
+/**
+ *  CTestScreenInterface
+ * 
+ */
+class CTestScreenInterface : public CTestFixture
+	{
+public:
+	CTestScreenInterface();
+	~CTestScreenInterface();
+
+	virtual void SetupL();
+	virtual void TearDownL();
+	void TearDown();
+	static CTestSuite* CreateSuiteL(const TDesC& aName);
+	
+    enum TCacheAttribute
+        {
+        /** not CPU cached */
+        ENotCached = 0,
+        /** CPU cached */
+        ECached = 1,
+        /** Not listed */
+        ECacheNotlisted = 2
+        };
+
+    enum TContiguousFlag
+        {
+        ENonContiguous = 0,
+        EContiguous = 1,
+        EFlagNotListed = 2
+        };
+
+private:
+    void ReadIniData();
+    TInt BaseTestContiguousFlag(TBool aContiguous);
+	// Private tests
+	void GRAPHICS_OPENWFC_SCREENINTERFACE_0100L();
+	void GRAPHICS_OPENWFC_SCREENINTERFACE_0101L();
+	void GRAPHICS_OPENWFC_SCREENINTERFACE_0102L();
+	void GRAPHICS_OPENWFC_SCREENINTERFACE_0103L();
+    void GRAPHICS_OPENWFC_SCREENINTERFACE_0104L();
+    void GRAPHICS_OPENWFC_SCREENINTERFACE_0105L();
+    void GRAPHICS_OPENWFC_SCREENINTERFACE_0106L();
+    void GRAPHICS_OPENWFC_SCREENINTERFACE_0107L();
+    void GRAPHICS_OPENWFC_SCREENINTERFACE_0108L();
+    void GRAPHICS_OPENWFC_SCREENINTERFACE_0109L();
+
+private:
+	CStreamUtility* iUtility;
+	TRgb iRed, iGreen, iBlue;
+    TInt iFastpathableWidth;
+    TInt iFastpathableHeight;
+    TInt iStride;        
+    TContiguousFlag iContiguous;
+    TUidPixelFormat iFastpathablePixelFormat;
+    TUidPixelFormat iNonFastpathablePixelFormat;
+    TInt iOffsetToFirstBuffer; 
+    TInt iAlignment;           
+    TBool iMappable;
+    TInt iMaxBuffers;              
+    TInt iMinBuffers;
+    TCacheAttribute iCacheAttrib;
+    TInt iOffsetBetweenBuffers;
+
+	};
+
+#endif // TSCREENINTERFACE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/test/tscreeninterface/tscreeninterfaceserver.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,64 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+//
+// Description:
+//
+
+#include <test/ctefunitserver.h>
+#include "tscreeninterface.h"
+
+_LIT( KServerName, "openwfcscreeninterfacetestserver" );
+
+GLDEF_C const TTestName ServerName()
+/**
+ * ServerName
+ *
+ * @return - The TEF server name
+ */
+	{
+	TTestName serverName(KServerName);
+	return serverName;
+	}
+
+GLDEF_C CTestSuite* CreateTestSuiteL()
+/**
+ * Create the overall test suite.
+ *
+ * @return - The top level suite
+ */
+	{
+	START_SUITE;
+
+	ADD_TEST_SUITE( CTestScreenInterface );
+
+	END_SUITE;
+	}
+
+GLDEF_C CTestStep* CreateTEFTestStep(const TDesC& , CTEFUnitServer& /* aServer */)
+/**
+ * Create individual test steps, outside the suite.
+ */
+	{
+	// Initialise test step object to NULL if no TEF step is found
+	CTestStep* testStep = NULL;
+
+	return testStep;
+	}
--- a/graphicscomposition/openwfsupport/bwins/WFCinteropu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/bwins/WFCinteropu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -22,11 +22,11 @@
 	SymbianStreamSetFlipState @ 21 NONAME
 	SymbianStreamAddExtendedObserver @ 22 NONAME
 	SymbianStreamCheckVisible @ 23 NONAME
-	SymbianStreamProcessAvailableNotifications @ 24 NONAME
-	SymbianStreamProcessDisplayedNotifications @ 25 NONAME
+	reserveEntrypoint25 @ 24 NONAME ABSENT
+	reserveEntrypoint26 @ 25 NONAME ABSENT
 	SymbianStreamProcessNotifications @ 26 NONAME
 	
-	reserveEntrypoint1 @ 27 NONAME ABSENT
+	SymbianStreamGetChunkHandle @ 27 NONAME
 	reserveEntrypoint2 @ 28 NONAME ABSENT
 	reserveEntrypoint3 @ 29 NONAME ABSENT
 	reserveEntrypoint4 @ 30 NONAME ABSENT
@@ -50,9 +50,11 @@
 	reserveEntrypoint22 @ 48 NONAME ABSENT
 	reserveEntrypoint23 @ 49 NONAME ABSENT
 	?GetMainHeap@COpenWfcStreamMap@@QAEPAVRHeap@@XZ @ 50 NONAME ; class RHeap * COpenWfcStreamMap::GetMainHeap(void)
-	?Reserve@COpenWfcStreamMap@@QAEHH@Z @ 51 NONAME ; int COpenWfcStreamMap::Reserve(int)
+	reserveEntrypoint24 @ 51 NONAME ABSENT 
 	?InstanceL@COpenWfcStreamMap@@SAAAV1@XZ @ 52 NONAME ; class COpenWfcStreamMap & COpenWfcStreamMap::InstanceL(void)
 	?XXX_Find@COpenWfcStreamMap@@QAEPAVCSurfaceStream@@ABVTSurfaceId@@@Z @ 53 NONAME ABSENT; class CSurfaceStream * COpenWfcStreamMap::Find(class TSurfaceId const &)
 	?Count@COpenWfcStreamMap@@QAEHXZ @ 54 NONAME ; int COpenWfcStreamMap::Count(void)
 	?XXX_AcquireL@COpenWfcStreamMap@@QAEPAVCSurfaceStream@@ABVTSurfaceId@@@Z @ 55 NONAME ABSENT; class CSurfaceStream * COpenWfcStreamMap::AcquireL(class TSurfaceId const &)
+	?SurfaceManager@COpenWfcStreamMap@@QAEAAVRSurfaceManager@@XZ @ 56 NONAME ; class RSurfaceManager & COpenWfcStreamMap::SurfaceManager(void)
 
+
--- a/graphicscomposition/openwfsupport/eabi/WFCinteropu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/eabi/WFCinteropu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -22,11 +22,11 @@
 	SymbianStreamSetFlipState @ 21 NONAME
 	SymbianStreamAddExtendedObserver @ 22 NONAME
 	SymbianStreamCheckVisible @ 23 NONAME
-	SymbianStreamProcessAvailableNotifications @ 24 NONAME
-	SymbianStreamProcessDisplayedNotifications @ 25 NONAME
+	reserveEntrypoint25 @ 24 NONAME ABSENT
+	reserveEntrypoint26 @ 25 NONAME ABSENT
 	SymbianStreamProcessNotifications @ 26 NONAME
 	
-	reserveEntrypoint1 @ 27 NONAME ABSENT
+	SymbianStreamGetChunkHandle @ 27 NONAME
 	reserveEntrypoint2 @ 28 NONAME ABSENT
 	reserveEntrypoint3 @ 29 NONAME ABSENT
 	reserveEntrypoint4 @ 30 NONAME ABSENT
@@ -50,9 +50,8 @@
 	reserveEntrypoint22 @ 48 NONAME ABSENT
 	reserveEntrypoint23 @ 49 NONAME ABSENT
 	_ZN17COpenWfcStreamMap11GetMainHeapEv @ 50 NONAME
-	_XXX_ZN17COpenWfcStreamMap4FindERK10TSurfaceId @ 51 NONAME ABSENT
-	_ZN17COpenWfcStreamMap5CountEv @ 52 NONAME
-	_ZN17COpenWfcStreamMap7ReserveEi @ 53 NONAME
-	_XXX_ZN17COpenWfcStreamMap8AcquireLERK10TSurfaceId @ 54 NONAME ABSENT 
-	_ZN17COpenWfcStreamMap9InstanceLEv @ 55 NONAME 
+	_ZN17COpenWfcStreamMap5CountEv @ 51 NONAME
+	reserveEntrypoint24 @ 52 NONAME ABSENT
+	_ZN17COpenWfcStreamMap9InstanceLEv @ 53 NONAME
+	_ZN17COpenWfcStreamMap14SurfaceManagerEv @ 54 NONAME
 
--- a/graphicscomposition/openwfsupport/inc/owftestexithelper.inl	Tue Jul 06 15:45:57 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-// A copy of shutdown cleanup functions that should be called  
-// to properly support openWF.
-// These methods are implemented and called from Window Server - WServ, CWsTop
-// but this copy can be called by any low-level unit tests that bypass WServ   
-// but need to provide the same clean-up behaviour.
-// @test
-// @internalTechnology
-// 
-// Currently, three things are cleaned up:
-// 1) Singleton API mutex in OpenWF implementation
-// 2) Singleton Find/Acquire mutext in Native Stream implementation
-// 3) EGL thread status 
-//
-// Note that while these cleanups are only required by OWF-C implementations,
-// the methods called should be harmless if called 
-// when some other composition solution is in action.
-#include <e32property.h>
-#include <EGL/egl.h>
-
-// IDs of p&s properties that optionally contain onexit callbacks
-// that may be used to release singletons owned by libraries at shutdown in order to make 
-// the memory leak tests work.
-// By convention, the ID is the same as the UID3 of the libary.
-static TBool gReleaseSingletonsOnExit = EFalse;
-static const TUid KOpenWfcImplCleanupKey = {0x10286FC4};     
-static const TUid KOpenWfcInteropCleanupKey = {0x10286FC5};
-
-
-static void DefineOwfSingletonKey(const TUid& aSingletonKey)
-/**
- * Defines a new property for a singleton key. WServ must only process 
- * singleton keys that it created to prevent a malicious process with the 
- * WriteDeviceData capability causing arbitrary functions to be executed.
- * 
- * @param   aSingeltonKey   The UID of the singleton key to define.
- */
-    {
-    RThread t;      
-    TUid category = { t.SecureId().iId };
-    RProperty prop;
-    
-    // Write access is restricted to THIS process
-    TInt err = prop.Define( category, aSingletonKey.iUid, 
-            RProperty::EByteArray, TSecurityPolicy( t.SecureId() ), 
-            TSecurityPolicy( t.SecureId() ), sizeof( TCallBack ) );
-    
-    if ( err == KErrNone || err == KErrAlreadyExists)
-        {
-        TCallBack cb( NULL, NULL );
-        TPckgC<TCallBack> cbPckg( cb );
-        
-        // Any error should cause the properties to be ignored
-        err = prop.Set( category, aSingletonKey.iUid, cbPckg );    
-        }      
-    //We presume that if property already exists it was previously set by this test code.
-    if ( err != KErrNone )
-        {
-        // A problem occured / the property already existed so for safety
-        // the release code should be skipped.
-        gReleaseSingletonsOnExit = EFalse;
-        }
-    
-    prop.Close();
-    t.Close();
-    }
-#define DefineOwfSingletonKeys DefineOwfSingletonKeys
-/** Call this method before starting the compositor.    
- * 
- */
-static void DefineOwfSingletonKeys()
-    {
-    // Define properties for singleton callbacks. This must only be done ONCE
-    // to ensure the properties can't be hijacked.
-    gReleaseSingletonsOnExit = ETrue;
-    DefineOwfSingletonKey(KOpenWfcInteropCleanupKey);
-    DefineOwfSingletonKey(KOpenWfcImplCleanupKey);
-    }
-
-static void DeleteOwfSingleton( const TUid& aSingletonKey )
-/**
- * Deletes a singleton object that was created on WServ's main heap.
- * 
- * @pre     The ws plugins have not been unloaded.
- * @param   aSingletonKey   The UID of the singleton which correponds to an
- *                          RProperty within WServ's category.                       
- */
-    {   
-    if ( gReleaseSingletonsOnExit )
-        {
-        RThread t;
-        TPckgBuf<TCallBack> cb;
-        RProperty prop; 
-        TInt err = prop.Get(TUid::Uid(t.SecureId().iId), aSingletonKey.iUid, cb);
-        if (err == KErrNone && cb.Length() == sizeof(TCallBack) && 
-                cb().iFunction && cb().iPtr == &User::Heap())
-            {
-            // Callback is only invoked if the heap for the singleton was the 
-            // WServ heap because the WServ memory leak tests only check this
-            // heap.
-            cb().CallBack();
-            }
-        // Errors are ignored because the purpose of this function is to free
-        // singletons in order top make memory leak checks pass.
-        prop.Close();
-        t.Close();
-        }
-    }
-/** Call this method to destroy OWF-C singletons on shut down
- * 
- */
-#define DeleteOwfSingletons DeleteOwfSingletons
-static void DeleteOwfSingletons()
-    {
-    // Free singletons on WServ heap created by libraries. Must be called
-    // BEFORE iPluginManager is deleted otherwise the library code could have
-    // been unloaded.
-    DeleteOwfSingleton(KOpenWfcImplCleanupKey);
-    DeleteOwfSingleton(KOpenWfcInteropCleanupKey);
-    /* Release any use of EGL by this thread. */
-    eglReleaseThread();
-    }
-
--- a/graphicscomposition/openwfsupport/inc/streammap.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/inc/streammap.h	Wed Aug 18 11:05:09 2010 +0300
@@ -38,16 +38,6 @@
 		 */
 		IMPORT_C static COpenWfcStreamMap& InstanceL();
 		/**
-		 * Expands the array to accommodate a specified number of key-value pairs.
-		 * If the hash map already has enough space for the specified number of elements, no
-		 * action is taken. Any elements already in the map are retained.
-		 * 
-		 * @param	aExpand	The number of key-value pairs for which space should be allocated.
-		 * @return	KErrNone if the operation completed aInternalVersion.
-		 * @return	KErrNoMemory if sufficient memory could not be allocated.
-		 */
-		IMPORT_C TInt Reserve(TInt aExpand);
-		/**
 		 * Look up a specified TSurfaceId key in the associative array and return a pointer to the
 		 * corresponding to a native stream. The reference counter of the native stream is incremented by one.
 		 * 
@@ -106,7 +96,7 @@
 		 * 
 		 * @return	A reference to the local SurfaceManager
 		 */
-		RSurfaceManager& SurfaceManager();
+        IMPORT_C RSurfaceManager& SurfaceManager();
 		
         /**
          * Returns a pointer to the main heap
@@ -156,14 +146,6 @@
 			};
 	private:
 		/**
-		 * Copy constructor
-		 */
-		COpenWfcStreamMap(const COpenWfcStreamMap&);
-		/**
-		 * Assignment operator
-		 */
-		COpenWfcStreamMap& operator= (const COpenWfcStreamMap&);
-		/**
 		 * Symbian constructor used with two stage construction pattern
 		 */
 		void ConstructL();
--- a/graphicscomposition/openwfsupport/inc/surfacestream.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/inc/surfacestream.h	Wed Aug 18 11:05:09 2010 +0300
@@ -499,6 +499,8 @@
                            TRequestStatus* aStatusDispXTimes,
                            TRequestStatus* aStatusConsumed);
     
+    TInt GetChunkHandle();
+    
 private:
     /**
      *   Notifies the composer that the content has been updated.
--- a/graphicscomposition/openwfsupport/inc/symbianstream.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/inc/symbianstream.h	Wed Aug 18 11:05:09 2010 +0300
@@ -660,6 +660,8 @@
   **/
   IMPORT_C void  SymbianStreamSetFlipState(SymbianStreamType aStream, SymOwfBool aFlip);
   
+  IMPORT_C TErrCode SymbianStreamGetChunkHandle(SymbianStreamType aStream, TInt* aHandle);
+  
 #	ifdef __cplusplus
 	}
 #	endif
--- a/graphicscomposition/openwfsupport/src/openwfcstream.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/src/openwfcstream.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -364,46 +364,6 @@
         }
     }
 
-EXPORT_C TInt32
-SymbianStreamProcessDisplayedNotifications(SymbianStreamType aStream, 
-                                           khronos_int32_t aEvent, 
-                                           khronos_int32_t aScreenNumber,
-                                           khronos_int32_t aSerialNumber,
-                                           khronos_int32_t* aReturnMask)
-    {
-    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
-    TInt32 event = aEvent & (ESOWF_EventDisplayed | ESOWF_EventDisplayedX);
-    if (stream && event)
-        {
-        stream->ProcessNotifications(aEvent, 
-                                     aScreenNumber, 
-                                     CSurfaceStream::EDefaultOperation, 
-                                     aSerialNumber, 
-                                     aReturnMask);
-        }
-    return event;
-    }
-
-EXPORT_C TInt32
-SymbianStreamProcessAvailableNotifications(SymbianStreamType aStream, 
-                                           khronos_int32_t aEvent, 
-                                           khronos_int32_t aScreenNumber,
-                                           khronos_int32_t aSerialNumber,
-                                           khronos_int32_t* aReturnMask)
-    {
-    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
-    TInt32 event = aEvent & ESOWF_EventAvailable;
-    if (stream && event)
-        {
-        stream->ProcessNotifications(aEvent, 
-                                     aScreenNumber, 
-                                     CSurfaceStream::EDefaultOperation, 
-                                     aSerialNumber, 
-                                     aReturnMask);
-        }
-    return ESOWF_EventAvailable;
-    }
-
 EXPORT_C TErrCode 
 SymbianStreamAddExtendedObserver(SymbianStreamType aStream, 
                                 SymbianStreamCallback aObserver, 
@@ -447,5 +407,17 @@
         stream->SetFlipState(aFlip);
         }
     }
-}	//extern "C" helps fix and verify linkage
 
+EXPORT_C TErrCode
+SymbianStreamGetChunkHandle(SymbianStreamType aStream, TInt* aHandle)
+    {
+    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
+    if (stream && aHandle)
+        {
+        *aHandle = stream->GetChunkHandle();
+        return KErrNone;
+        }
+    return KErrArgument;
+    }
+
+}   //extern "C" helps fix and verify linkage
--- a/graphicscomposition/openwfsupport/src/streammap.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/src/streammap.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -27,20 +27,6 @@
 
 static const TInt KOpenWfcInteropCleanupKey = 0x10286FC5;
 
-TEMPLATE_SPECIALIZATION class RHashTableBase::Defaults<TSurfaceId, RHashTableBase::EDefaultSpecifier_Normal>
-	{
-public:
-	inline static TGeneralHashFunction32 Hash();
-	inline static TGeneralIdentityRelation Id();
-	};
-
-inline TGeneralHashFunction32 RHashTableBase::Defaults<TSurfaceId, RHashTableBase::EDefaultSpecifier_Normal>::Hash()
-	{return (TGeneralHashFunction32)&DefaultHash::Integer;}
-
-inline TGeneralIdentityRelation RHashTableBase::Defaults<TSurfaceId, RHashTableBase::EDefaultSpecifier_Normal>::Id()
-	{return (TGeneralIdentityRelation)&DefaultIdentity::Integer;}
-
-
 COpenWfcStreamMap* COpenWfcStreamMap::pInstance = NULL;
 
 TUint32 COpenWfcStreamMap::HashFunction(const TSurfaceId& aHashKey)
@@ -66,13 +52,6 @@
 	return *pInstance;
 	}
 
-EXPORT_C TInt COpenWfcStreamMap::Reserve(TInt aExpand)
-	{
-	Guard g(iMutex);
-	TInt ret = iMap.Reserve(aExpand);
-	return ret;
-	}
-
 CSurfaceStream* COpenWfcStreamMap::Find(const TSurfaceId& aSurfaceId)
 	{
 	Guard g(iMutex);
@@ -118,7 +97,7 @@
 	return count;
 	}
 
-RSurfaceManager& COpenWfcStreamMap::SurfaceManager()
+EXPORT_C RSurfaceManager& COpenWfcStreamMap::SurfaceManager()
 	{
     WFCI_ASSERT_DEBUG(iSurfaceManager, EOwfPanicInvalidHasMap);
 	return *iSurfaceManager;
@@ -196,7 +175,7 @@
         CSurfaceStream* const* ns = NULL;
         while (nextKey)
             {
-            ns = iter.NextValue();
+            ns = iter.CurrentValue();
             if (ns && *ns)
                 {
                 delete (*ns);
@@ -220,7 +199,7 @@
         CExtensionContainer* const* extensionContainer = NULL;
         while (nextKey)
             {
-            extensionContainer = iter.NextValue();
+            extensionContainer = iter.CurrentValue();
             if (extensionContainer && *extensionContainer)
                 {
                 delete (*extensionContainer);
@@ -231,17 +210,6 @@
 	iRegisteredUpdaters.Close();
 	}
 
-COpenWfcStreamMap::COpenWfcStreamMap(const COpenWfcStreamMap&)
-	{
-	Panic(EOwfPanicInvalidCallStreamMap);
-	}
-
-COpenWfcStreamMap& COpenWfcStreamMap::operator= (const COpenWfcStreamMap&)
-	{
-	Panic(EOwfPanicInvalidCallStreamMap);
-	return *this;
-	}
-
 void COpenWfcStreamMap::ConstructL()
 	{
 	User::LeaveIfError(iMutex.CreateLocal());
--- a/graphicscomposition/openwfsupport/src/surfacestream.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/src/surfacestream.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -670,15 +670,18 @@
              if (iBufferChunk.Handle() == 0)
                  {
                  RChunk threadChunk;
-                 User::LeaveIfError(GetSingletonL().SurfaceManager().MapSurface(iSurfaceId, threadChunk));
-				 CleanupClosePushL(threadChunk);
-
+                 RSurfaceManager sm;
+                 sm.Open();
+                 TInt err = sm.MapSurface(iSurfaceId, threadChunk);
+                 sm.Close();
+                 CleanupClosePushL(threadChunk);
+                 				 			
 				 RChunk duplicateChunk;
 				 duplicateChunk.SetHandle(threadChunk.Handle());
-				 User::LeaveIfError(duplicateChunk.Duplicate(RThread(), EOwnerProcess));
-
+                 User::LeaveIfError(duplicateChunk.Duplicate(RThread(), EOwnerProcess));
+ 
                  iBufferChunk.SetHandle(duplicateChunk.Handle());
-				 CleanupStack::PopAndDestroy(&threadChunk);
+                 CleanupStack::PopAndDestroy(&threadChunk);
                  }
              break;
              }
@@ -1367,10 +1370,10 @@
     serialNumber = param.serialNumber;
     
     
-    // we take, initially in consideration "availble" even if we might not have received a consumed request status
+    // we take, initially in consideration "available" even if we might not have received a consumed request status
     eventsToProcess = 0;
     
-    // we try to figure out which are the vents we have to process and to get hold of their position
+    // we try to figure out which are the events we have to process and to get hold of their position
     // in the observers array, in order to avoid traversing it again
     TInt idx = iCallBacks.Count();
     //we will intend to mark the visited events, as an optimisation
@@ -2134,3 +2137,8 @@
         iNewFlip = EFlippedTargetNormal;
         }
     }
+
+TInt CSurfaceStream::GetChunkHandle()
+    {
+    return iBufferChunk.Handle();
+    }
--- a/graphicscomposition/openwfsupport/test/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/test/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -36,4 +36,3 @@
 PRJ_TESTEXPORTS
 ../scripts/tstreamoperation.script z:/wfctest/tstreamoperation.script
 ../scripts/tmultidisplay.script	   z:/wfctest/tmultidisplay.script
-../../inc/owftestexithelper.inl			SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(graphics/owftestexithelper.inl)
--- a/graphicscomposition/openwfsupport/test/group/tstreamoperation.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/test/group/tstreamoperation.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -33,7 +33,6 @@
 
 STATICLIBRARY	tefunit.lib
 LIBRARY		euser.lib
-LIBRARY		estlib.lib 
 LIBRARY		testexecuteutils.lib
 LIBRARY		testexecutelogclient.lib
 LIBRARY		rfileloggerclient.lib
@@ -41,9 +40,6 @@
 LIBRARY		surfacemanager.lib
 LIBRARY		surfaceupdateclient.lib
 LIBRARY		gdi.lib
-LIBRARY		bitgdi.lib
-LIBRARY		fbscli.lib
-LIBRARY		imageconversion.lib
 LIBRARY		efsrv.lib
 LIBRARY		libEGL.lib
 LIBRARY		hal.lib
--- a/graphicscomposition/openwfsupport/test/scripts/tstreamoperation.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/test/scripts/tstreamoperation.script	Wed Aug 18 11:05:09 2010 +0300
@@ -89,3 +89,5 @@
 RUN_TEST_STEP 100 openwfcstreamoptestserver TEFUnit.CTestNativeStream.GRAPHICS_OPENWFC_NATIVESTREAM_0140L
 RUN_TEST_STEP 100 openwfcstreamoptestserver TEFUnit.CTestNativeStream.GRAPHICS_OPENWFC_NATIVESTREAM_0141L
 RUN_TEST_STEP 100 openwfcstreamoptestserver TEFUnit.CTestNativeStream.GRAPHICS_OPENWFC_NATIVESTREAM_0142L
+//RUN_TEST_STEP 100 openwfcstreamoptestserver TEFUnit.CTestNativeStream.GRAPHICS_OPENWFC_NATIVESTREAM_0143L
+RUN_TEST_STEP !PanicCode=1000008 !PanicString=WF-INTEROP 100 openwfcstreamoptestserver TEFUnit.CTestNativeStream.GRAPHICS_OPENWFC_NATIVESTREAM_0144L
--- a/graphicscomposition/openwfsupport/test/tstreamoperation/tnativestream.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/test/tstreamoperation/tnativestream.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -23,9 +23,14 @@
 #include <test/extendtef.h>
 #include <dispchannel.h>
 #include <hal.h>
+#include <test/singletontestexithelper.inl>
 #include "tnativestream.h"
 #include "surfaceutility.h"
-#include "owftestexithelper.inl"
+
+#ifdef EGLSYNCHELPER_INCLUDED
+    #include <EGL/egl.h>
+    #include "eglsynchelper.h"
+#endif
 
 #define BUFFER_READ_HANDLE_BASE  0x100
 #define BUFFER_WRITE_HANDLE_BASE 0x200
@@ -243,6 +248,7 @@
 	}
 
 RSemaphore      gSemaphore;
+RSemaphore      gSemaphore2;
 
 TGlobalNativeStreamVar	gVarInstance={0};
 const TGlobalNativeStreamVar& TGlobalNativeStreamVar::Instance()
@@ -462,6 +468,8 @@
 		ADD_TEST_STEP_PARAM_RANGE(GRAPHICS_OPENWFC_NATIVESTREAM_0140L,1,4);
 		ADD_TEST_STEP_PARAM_RANGE(GRAPHICS_OPENWFC_NATIVESTREAM_0141L,1,4);
 		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_NATIVESTREAM_0142L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_NATIVESTREAM_0143L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_NATIVESTREAM_0144L);
 
 	END_SUITE;	
 	
@@ -541,6 +549,8 @@
 	gVarInstance.SetSurfaceID(*checkId);
     gSemaphore.CreateLocal(1);
     gSemaphore.Wait(); 
+    gSemaphore2.CreateLocal(1);
+    gSemaphore2.Wait(); 
     CleanupStack::PopAndDestroy(); // switch the heap back to current thread's one
 	}
 
@@ -550,6 +560,7 @@
 	
 	CleanupStack::PushL(TCleanupItem(PopHeap, User::SwitchHeap(COpenWfcStreamMap::InstanceL().GetMainHeap())));
 	
+    gSemaphore2.Close();
 	gSemaphore.Close();
 	TSurfaceId id = gVarInstance.SurfaceID();
 	SymbianStreamType ns;
@@ -656,8 +667,11 @@
     const TSurfaceId* getId = NULL;
     err = SymbianStreamGetBufferId(ns,bufferHandle,&bufferIndex,&getId);
     ASSERT_TRUE(err == KErrNone);
+    TInt ChunkHandle = 100;
+    err = SymbianStreamGetChunkHandle(ns, &ChunkHandle);
+    ASSERT_TRUE(err == KErrNone);    
     err = SymbianStreamReleaseReadBuffer(ns,bufferHandle);
-    ASSERT_TRUE(err == KErrNone);
+    ASSERT_TRUE(err == KErrNone);    
 	ASSERT_EQUALS(*getId,surface);
 	CleanupStack::PopAndDestroy(); // switch the heap back to current thread's one
 	
@@ -669,7 +683,7 @@
 	err = SymbianStreamAcquire(&surface2,&ns2);
 	ASSERT_TRUE(err == KErrNone);
 	ASSERT_TRUE(ns2);
-	ASSERT_NOT_EQUALS(ns,ns2);
+	ASSERT_FALSE(SymbianStreamSame(ns, ns2));
 	ASSERT_EQUALS((COpenWfcStreamMap::InstanceL().Count()), count + 2);
 	err = SymbianStreamAcquireReadBuffer(ns2,&bufferHandle);
 	ASSERT_TRUE(err == KErrNone);
@@ -1343,7 +1357,8 @@
 	
 	gSemaphore.Signal(2); // Thread 2 and 3 ready to run
 	
-	gSemaphore.Wait();
+	gSemaphore2.Wait();
+    gSemaphore2.Wait();     // Wait for both threads to signal
 	err = SymbianStreamReleaseWriteBuffer(ns,writeBuffer1);
 	ASSERT_TRUE(err == KErrNone);
 	SymbianStreamRemoveReference(ns);
@@ -1375,7 +1390,7 @@
 	ASSERT_FALSE(writeBuffer1);
 	INFO_PRINTF1(_L("Thread 2 - Write buffer already in use by Thread 1!"));
     
-	gSemaphore.Signal();
+	gSemaphore2.Signal();
 	
 	gSemaphore.Wait();
 	
@@ -1418,6 +1433,8 @@
 	ASSERT_FALSE(writeBuffer1);
 	INFO_PRINTF1(_L("Thread 3 - Write buffer already in use by Thread 1!"));
 
+    gSemaphore2.Signal();
+
     SymbianStreamRemoveReference(ns);
     CleanupStack::PopAndDestroy(); // switch the heap back to current thread's one    
 	}
@@ -4660,7 +4677,10 @@
 
     err = User::LoadLogicalDevice(KDisplayChannelLdd);
     RDisplayChannel testChannel;
-    User::LeaveIfError(testChannel.Open(0));
+    if (err == KErrNone || err == KErrAlreadyExists)
+        {
+        User::LeaveIfError(testChannel.Open(0));
+        }
     
     TSurfaceId testId;
     SymbianStreamType ns;
@@ -4765,3 +4785,78 @@
     testChannel.Close();
     CleanupStack::PopAndDestroy(); // switch the heap back to current thread's one
     }
+
+/*
+@SYMTestCaseID          GFX_OPENWFC_NATIVESTREAM_0143
+@SYMTestCaseDesc        Call eglsync helper functions
+@SYMREQ                 
+@SYMPREQ                
+@SYMTestType            
+@SYMTestPriority        Low
+@SYMTestPurpose         Make calls of eglsync helper functions for coverage results                     
+@SYMTestActions 
+        Make calls of eglsync helper functions 
+@SYMTestExpectedResults
+        Test should pass without errors
+ */
+void CTestNativeStream::GRAPHICS_OPENWFC_NATIVESTREAM_0143L()
+    {
+    // This test is commented out because it won't build for Bullseye.
+#ifdef EGLSYNCHELPER_INCLUDED
+    INFO_PRINTF1(_L("Test of egl sync helper functions"));
+
+    RHeap* mainHeap = COpenWfcStreamMap::InstanceL().GetMainHeap();
+    TRAPD(err, GrowCleanupStackL());
+    ASSERT_TRUE(err == KErrNone);
+    
+    CleanupStack::PushL(TCleanupItem(PopHeap, User::SwitchHeap(mainHeap)));
+
+    EGLDisplay eglDisplay;
+    eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    ASSERT_FALSE(eglDisplay == EGL_NO_DISPLAY);
+    ASSERT_FALSE(eglDisplay == EGL_BAD_ALLOC);
+    ASSERT_EQUALS(eglGetError(),EGL_SUCCESS);
+    eglInitialize(eglDisplay, NULL, NULL);
+    ASSERT_EQUALS(eglGetError(),EGL_SUCCESS);
+
+    EGLint attrib_list[1] = {EGL_NONE};
+    EGLSyncKHR sync;
+    sync = eglCreateSyncKHR(eglDisplay,EGL_SYNC_REUSABLE_KHR, attrib_list);
+    ASSERT_NOT_EQUALS(sync,EGL_NO_SYNC_KHR);
+    ASSERT_EQUALS(eglGetError(),EGL_SUCCESS);
+
+    eglSignalSyncKHR(eglDisplay, sync, EGL_SIGNALED_KHR);
+    eglGetSyncAttribKHR(eglDisplay, sync, NULL, NULL);
+    eglClientWaitSyncKHR(eglDisplay, sync, 0, 0);
+    
+    EGLBoolean eglSyncError = eglDestroySyncKHR(eglDisplay, sync);
+    sync = EGL_NO_SYNC_KHR;
+    if (eglSyncError != EGL_TRUE)
+        {
+        INFO_PRINTF2(_L("TearDown: eglSyncError line %d"),__LINE__);
+        }
+    CleanupStack::PopAndDestroy(); // switch the heap back to current thread's one
+#endif
+    }
+
+/*
+@SYMTestCaseID          GFX_OPENWFC_NATIVESTREAM_0144
+@SYMTestCaseDesc        Panic test
+@SYMREQ                 
+@SYMPREQ                
+@SYMTestType            
+@SYMTestPriority        Low
+@SYMTestPurpose         Test that will cause a panic.               
+@SYMTestActions 
+        Aquire a symbian stream by passing in a NULL ns
+@SYMTestExpectedResults
+        Test should panic with the expected panic code 1000008
+*/
+void CTestNativeStream::GRAPHICS_OPENWFC_NATIVESTREAM_0144L()
+    {
+    INFO_PRINTF1(_L("Panic test. The expected panic code is 1000008"));
+    
+    SymbianStreamBuffer bufferHandle;
+    // Pass in a NULL ns will cause panic EOwfSymbianStreamBadArgument (1000008)
+    SymbianStreamAcquireReadBuffer(NULL, &bufferHandle);
+    }
--- a/graphicscomposition/openwfsupport/test/tstreamoperation/tnativestream.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicscomposition/openwfsupport/test/tstreamoperation/tnativestream.h	Wed Aug 18 11:05:09 2010 +0300
@@ -197,6 +197,8 @@
 	void GRAPHICS_OPENWFC_NATIVESTREAM_0140L(TInt aNumBuffers);
 	void GRAPHICS_OPENWFC_NATIVESTREAM_0141L(TInt aNumBuffers);
 	void GRAPHICS_OPENWFC_NATIVESTREAM_0142L();
+    void GRAPHICS_OPENWFC_NATIVESTREAM_0143L();
+    void GRAPHICS_OPENWFC_NATIVESTREAM_0144L();
 	
 private:
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,41 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// OpenWFTEST
+//
+/**
+@file
+
+@SYMPurpose OpenWFC Test
+*/
+
+PRJ_PLATFORMS
+
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+openwftest.mmp
+
+PRJ_TESTEXPORTS
+../rom/openwftest.iby				/epoc32/rom/include/openwftest.iby
+
+../scripts/openwftest.script		z:/openwftest/openwftest.script
+
+../scripts/openwftest_automatic_c_save.ini		z:/openwftest/openwftest.ini
+../scripts/openwftest_automatic_e_save.ini		z:/openwftest/openwftest_automatic_e_save.ini
+../scripts/openwftest_automatic_nosave.ini		z:/openwftest/openwftest_automatic_nosave.ini
+../scripts/openwftest_manual.ini				z:/openwftest/openwftest_manual.ini
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/group/graphics_openwftest.mrp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,8 @@
+component	graphics_openwftest
+
+source	\sf\os\graphics\graphicscomposition\openwftest
+binary	\sf\os\graphics\graphicscomposition\openwftest\group		all
+exports	\sf\os\graphics\graphicscomposition\openwftest\group
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/group/openwftest.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,55 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// OpenWFTEST
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+TARGET			openwftestserver.exe
+TARGETTYPE		exe
+UID				268435596 268450592  // same as wserv UID
+CAPABILITY      PowerMgmt ReadDeviceData WriteDeviceData ProtServ
+
+
+EPOCALLOWDLLDATA
+
+SOURCEPATH		../src
+SOURCE			openwftestserver.cpp 
+SOURCE			surfaceutility.cpp
+SOURCE			openwftest.cpp
+SOURCE			eglsynchelper.c
+
+USERINCLUDE		. ..\inc 
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+OS_LAYER_ESTLIB_SYSTEMINCLUDE
+
+LIBRARY		euser.lib
+LIBRARY		testexecuteutils.lib
+LIBRARY		testexecutelogclient.lib
+LIBRARY		rfileloggerclient.lib
+LIBRARY		WFCinterop.lib
+LIBRARY		libWFC.lib
+LIBRARY		surfacemanager.lib
+LIBRARY		surfaceupdateclient.lib
+LIBRARY		gdi.lib
+LIBRARY		libEGL.lib
+LIBRARY		estor.lib
+LIBRARY		efsrv.lib
+STATICLIBRARY	tefunit.lib
+
+SMPSAFE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/inc/eglsynchelper.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,154 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// eglsynchelper.c
+//
+
+#ifndef __eglsynchelper_h_
+#define __eglsynchelper_h_
+
+#include <EGL/eglext.h>
+#include <EGL/egl.h>
+#include "KHR/khrplatform.h"
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EGL_EGLEXT_PROTOTYPES
+
+/*
+ * EGLSyncKHR is an opaque handle to an EGL sync object
+ */
+typedef void* EGLSyncKHR;
+
+
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+
+/* API functions */
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Create a sync object for the specified display.
+ * \ingroup api
+ * \param   dpy     Identifier of the display which will own the sync object
+ * \param   type    Type of the sync object. EGL_SYNC_REUSABLE_KHR is only supported
+ * \param   attrib_list Attribute-value list specifying attributes of the sync 
+ * object, terminated by an attribute entry EGL_NONE
+ * \return  Handle for the created sync object if successful, EGL_NO_SYNC_KHR otherwise
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_ATTRIBUTE if <attrib_list> is neither NULL nor empty (containing only EGL_NONE) or 
+ * if <type> is not a supported type of sync object;
+ * EGL_BAD_ALLOC if the memory allocation related to sync object is not successful
+ * \note    If <type> is EGL_SYNC_REUSABLE_KHR, a reusable sync object is created. 
+ * In this case <attrib_list> must be NULL or empty (containing only EGL_NONE).
+ *  *//*-------------------------------------------------------------------*/
+EGLSyncKHR eglCreateSyncKHR( EGLDisplay dpy,
+                       EGLenum condition,
+                       const EGLint *attrib_list );
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Destroy a sync object and free memory associated with it
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object
+ * \param   sync    Sync object handle. 
+ * \return  EGL_TRUE if deletion was successful and EGL_FALSE otherwise
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_PARAMETER if <sync> is not a valid sync object for <dpy>
+ * \note    If any eglClientWaitSyncKHR commands are blocking on <sync> when 
+ * eglDestroySyncKHR is called, they will be woken up, as if <sync> were signaled. 
+ * If no errors are generated, <sync> will no longer be the handle of a valid sync object.
+ *//*-------------------------------------------------------------------*/
+EGLBoolean eglDestroySyncKHR( EGLDisplay dpy, EGLSyncKHR sync );
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Blocks the calling thread until the specified sync object 
+ * is signaled, or until <timeout> nanoseconds have passed.  
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object.
+ * \param   sync    Sync object handle. 
+ * \param   flags   If the EGL_FLUSH_COMMANDS_BIT_KHR bit is set in <flags>
+ * and <sync> is unsignaled when the function is called, then the equivalent
+ * of Flush() will be performed for the current API context.   
+ * \param   timeout The thread will be unblocked when <timeout> is expired.
+ * If the <timeout> is to zero, the function just test the current status 
+ * of the sync object. If the <timeout> is set to EGL_FOREVER_KHR, then the 
+ * function does not time out. For all other values, <timeout> is adjusted to 
+ * the closest value which may be substantially longer than one nanosecond. 
+ * \return  EGL_CONDITION_SATISFIED if <sync> was signaled before
+ * the timeout expired, which includes the case when <sync> was already 
+ * signaled when eglClientWaitSyncKHR was called; EGL_TIMEOUT_EXPIRED_KHR if the 
+ * specified timeout period expired before <sync> was signaled; 
+ * EGL_FALSE if an error occurs.
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_PARAMETER if <sync> is not a valid sync object for <dpy> or 
+ * if <flags> does not equal to 0 or EGL_SYNC_FLUSH_COMMAND_BIT_KHR
+ * Note\    More than one eglClientWaitSyncKHR may be outstanding on the same <sync> at any given time. 
+ * When there are multiple threads blocked on the same <sync> and the sync object is signaled, 
+ * all such threads are released, but the order in which they are released is not defined.
+ * If a sync object is destroyed while an eglClientWaitSyncKHR is blocking on that object, 
+ * eglClientWaitSyncKHR will unblock and return immediately, just as if the sync object 
+ * had been signaled prior to being destroyed.
+ *//*-------------------------------------------------------------------*/
+EGLint eglClientWaitSyncKHR( EGLDisplay dpy,
+                      EGLSyncKHR sync,
+                      EGLint flags,
+                      EGLTimeKHR timeout );
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Signals or unsignals the reusable sync object.  
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object.
+ * \param   sync    Sync object handle. 
+ * \param   mode    Status of the sync object. There are two possible states: 
+ *  EGL_SIGNALED_KHR and EGL_UNSIGNALED_KHR. 
+ * \return  EGL_TRUE if an operation was successful and EGL_FALSE otherwise.
+ * \note    The error code returned from eglSignalSyncImpl() will be generated
+ *//*-------------------------------------------------------------------*/
+EGLBoolean eglSignalSyncKHR( EGLDisplay dpy,
+                  EGLSyncKHR sync,
+                  EGLenum mode );
+
+
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Query an attribute of the sync object  
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object
+ * \param   sync    Sync object handle. 
+ * \param   attribute   An attribute to be retrieved. 
+ * \param   value   Pointer to the value for the requested attribute which will be filled on function return. 
+ * \return  EGL_TRUE if an operation was successful and EGL_FALSE otherwise
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_PARAMETER if <sync> is not a valid sync object for <dpy> or if <value> is not 
+ * a valid pointer; EGL_BAD_ATTRIBUTE if <attribute>  does not lie within expected range;
+ * EGL_BAD_MATCH if <attribute> is not supported for the type of sync object passed in <sync>
+ *//*-------------------------------------------------------------------*/
+EGLBoolean eglGetSyncAttribKHR( EGLDisplay dpy,
+                     EGLSyncKHR sync,
+                     EGLint attribute,
+                     EGLint *value );
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __eglsynchelper_h_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/inc/openwftest.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,212 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef OPENWFTEST_H
+#define OPENWFTEST_H
+
+// INCLUDES
+#include <test/tefunit.h>
+#include <w32std.h>
+#include <graphics/symbianstream.h>
+#include <graphics/surfacemanager.h>
+#include <graphics/streammap.h>
+#include <EGL/egl.h>
+#include <graphics/eglsynchelper.h>
+#include <WF/wfc.h>
+#include "surfaceutility.h"
+
+class CTestExecuteLogger;
+class CSurfaceStream;
+
+/* Color defines for openwf test.*/
+#define KDarkRed		TRgb(127,0,0,255)
+#define KRed			TRgb(255,0,0,255)
+#define KGreen			TRgb(0,255,0,255)
+#define KBlue			TRgb(0,0,255,255)
+#define KCyan			TRgb(0,255,255,255)
+#define KMagenta		TRgb(255,0,255,255)
+#define KYellow			TRgb(255,255,0,255)
+#define KBrown			TRgb(150,75,0,255)
+#define KBlack			TRgb(0,0,0,255)
+#define KBlackAlpha0	TRgb(0,0,0,0)
+#define KWhite			TRgb(255,255,255,255)
+#define KWhiteAlpha0	TRgb(255,255,255,0)
+#define KGray			TRgb(127,127,127,255)
+#define KGrayHalfAlpha	TRgb(127,127,127,127)
+
+#define KMaxImagePathLength 100
+#define KMaxTestNameLength 20
+
+class CActiveNotification : public CActive
+	{
+public:
+	static CActiveNotification* NewL(RSurfaceUpdateSession& aSurfaceUpdateSession,TBool aActivate);
+	~CActiveNotification();
+	void Activate();
+	// From CActive:
+	void RunL();
+	void DoCancel();
+	TInt RunError(TInt aError);
+protected:
+	CActiveNotification();
+	void ConstructL(RSurfaceUpdateSession& aSurfaceUpdateSession);
+private:
+	RSurfaceUpdateSession iSurfaceUpdateSession;
+	};
+
+//Use instead of User::After
+class CActiveWaiter : public CActive
+	{
+public:
+	static CActiveWaiter* NewL();
+	~CActiveWaiter();
+	TInt Wait(TTimeIntervalMicroSeconds32 aDelay);
+	void StartWait(TTimeIntervalMicroSeconds32 aDelay);
+	// From CActive:
+	void RunL();
+	void DoCancel();
+	TInt RunError(TInt aError);
+protected:
+	CActiveWaiter();
+	void ConstructL();
+public:
+	TBool iRun;
+protected:
+	RTimer iTimer;
+	};
+
+/**
+ *  COpenwfTest
+ * 
+ */
+class COpenwfTest : public CTestFixture
+	{
+public:
+	COpenwfTest();
+	~COpenwfTest();
+
+	virtual void SetupL();
+	virtual void TearDownL();
+	static CTestSuite* CreateSuiteL(const TDesC& aName);
+	
+    enum TCacheAttribute
+        {
+	    /** not CPU cached */
+	    ENotCached = 0,
+	    /** CPU cached */
+	    ECached = 1,
+	    /** Not listed */
+	    ECacheNotlisted = 2
+	    };
+
+    enum TContiguousFlag
+        {
+        ENonContiguous = 0,
+        EContiguous = 1,
+        EFlagNotListed = 2
+        };
+    
+    enum TTestMode
+        {
+        EAutomatic = 0,
+        EManual = 1
+        };
+    
+private:
+    TBool AcquireOnScreenStream();
+    void ReleaseOnScreenStream();
+    TBool CheckOnScreenStreamRect(TRect aRect, const TRgb& aExpectedColor, TInt aTolerance);
+    TBool CheckRect(const TSurfaceId& aSurface, TInt aNumOfBuffer, TRect aRect, 
+    		const TRgb& aExpectedColor, TInt aTolerance);
+    TBool CheckOnScreenReferenceImage();
+    TBool SaveImage(const TSurfaceId& aSurfaceId, TInt aNumOfBuffer);
+    TInt WaitL(TTimeIntervalMicroSeconds32 aDelay);	//aDelay in microseconds
+    TBool WaitForNotifications(TTimeIntervalMicroSeconds32 aMaxDelay,TInt aNotificatons);
+    void ReadIniData();
+    void TearDown();
+    void SetupEmptySceneL(TBool aAutonomous = ETrue);
+    
+	// Fastpath positive tests
+	void GRAPHICS_OPENWFC_FASTPATH_0000L();
+	void GRAPHICS_OPENWFC_FASTPATH_0001L();
+	void GRAPHICS_OPENWFC_FASTPATH_0002L();
+	void GRAPHICS_OPENWFC_FASTPATH_0003L();
+    void GRAPHICS_OPENWFC_FASTPATH_0004L();
+    void GRAPHICS_OPENWFC_FASTPATH_0005L();
+    void GRAPHICS_OPENWFC_FASTPATH_0006L();
+    void GRAPHICS_OPENWFC_FASTPATH_0007L();
+	
+	// Fastpath with notification tests
+    void FastpathNotificationsTestL(TBool aAutonomous);
+	void GRAPHICS_OPENWFC_FASTPATH_0010L();
+	void GRAPHICS_OPENWFC_FASTPATH_0011L();
+	void FastpathDispXNotificationsTestL(TBool aAutonomous);
+	void GRAPHICS_OPENWFC_FASTPATH_0012L();
+	void GRAPHICS_OPENWFC_FASTPATH_0013L();
+	
+	// Fastpath negative tests
+	void GRAPHICS_OPENWFC_FASTPATH_0020L();
+	void GRAPHICS_OPENWFC_FASTPATH_0021L();
+	void GRAPHICS_OPENWFC_FASTPATH_0022L();
+	void GRAPHICS_OPENWFC_FASTPATH_0023L();
+	void GRAPHICS_OPENWFC_FASTPATH_0024L();
+	void GRAPHICS_OPENWFC_FASTPATH_0025L();
+	void GRAPHICS_OPENWFC_FASTPATH_0026L();
+    void GRAPHICS_OPENWFC_FASTPATH_0027L();
+			
+private:
+    TInt iFastpathableWidth;
+    TInt iFastpathableHeight;
+    TInt iStride;        
+    TContiguousFlag iContiguous;
+    TUidPixelFormat iFastpathablePixelFormat;
+    TUidPixelFormat iNonFastpathablePixelFormat;
+    TInt iOffsetToFirstBuffer; 
+    TInt iAlignment;           
+    TBool iMappable;
+    TInt iMaxBuffers;              
+    TInt iMinBuffers;
+    TCacheAttribute iCacheAttrib;
+    TInt iOffsetBetweenBuffers;
+    TInt iTestMode;
+    TBool iSaveImage;
+    TTimeIntervalMicroSeconds32 iCompositionPause;	//delay in microseconds
+    TTimeIntervalMicroSeconds32 iManualPause;	//delay for manual checking in microseconds
+    TBool iAllowManualPause;  //some tests may not allow manual pauses
+    TInt iTolerance;
+    WFCint iDeviceId;
+    EGLSyncKHR iSync;
+    WFCDevice iDevice;
+    WFCContext iContext;
+
+    TRect iFullScreenTRect;
+    WFCint iFullScreenRect[4];
+    TRect iCenterTRect;
+    WFCint iCenterRect[4];
+    WFCint iHalfSizeRect[4];
+    
+    CActiveScheduler* iScheduler;
+    EGLDisplay iEGLDisplay;
+    CSurfaceUtility* iUtility;
+    //TPtrC iDir;
+    TPtrC iImageDirectory;
+    TBufC<KMaxTestNameLength> iTestName;
+	TBuf<KMaxImagePathLength> iImageAddress;
+    TInt iImageCounter;
+    SymbianStreamType iOnScreenStream;
+    SymbianStreamBuffer iOnScreenBuffer;
+	};
+
+#endif // OPENWFTEST_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/inc/surfaceutility.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,106 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+*/
+
+#ifndef __SURFACE_UTILITY__
+#define __SURFACE_UTILITY__
+
+#include <e32base.h>
+#include <graphics/surface.h>
+#include <graphics/surfacemanager.h>
+#include <graphics/surfaceupdateclient.h>
+#include <graphics/symbianstream.h>
+#include <WF/wfc.h>
+
+//#define ENABLE_TEST_LOGGING
+#if defined(ENABLE_TEST_LOGGING)
+#define LOG(X)	RDebug::Printf X
+#define LOGL(X)	RDebug::Print X
+#else
+#define LOG(X)
+#define LOGL(X)
+#endif
+
+class TRgb;
+class CFbsBitmap;
+
+class CSurfaceUtility : public CBase
+	{
+public:
+    CSurfaceUtility();
+	static CSurfaceUtility* NewL();
+	virtual ~CSurfaceUtility();
+	TSize SurfaceSize(const TSurfaceId& aSurface);
+	TSurfaceId CreateSurfaceL(const TSize& aSize, TUidPixelFormat aPixelFormat, TInt aStride, TBool aContiguous, TInt aBuffers);
+	TInt BytesPerPixelL(TUidPixelFormat aPixelFormat);
+	void FillSurfaceL(TSurfaceId& aSurface, const TRgb& aColor);
+	void FillSurfaceL(TSurfaceId& aSurface, TInt aBuffer, const TRgb& aColor);
+	void DestroySurface(TSurfaceId& aSurface);
+	TBool DestroyAll();
+    TBool CheckRectColor(const TSurfaceId& aSurface, TRect& aRect, TInt aNumOfBuffer, const TRgb& aExpectedColor, TInt aTolerance);
+    TBool SaveResultImageTGAL(const TSurfaceId& aOnscreenSurface, TInt aBufferNumber, TDesC& aDestination);
+    TInt SubmitUpdate(const TSurfaceId& aSurface, TInt aBufferNumber, const TRegion* aRegion = NULL);
+    void NotifyWhenDisplayed(TRequestStatus& aStatusDisplayed, TTimeStamp& aTimeStamp);
+    void NotifyWhenDisplayedXTimes(TInt aCount, TRequestStatus& aStatusDisplayedX);
+    void NotifyWhenAvailable(TRequestStatus& aStatusAvailable);	
+	RSurfaceManager& Manager()	{return iManager;}
+	RSurfaceUpdateSession& Session()	{return iSurfaceUpdateSession;}
+	SymbianStreamType GetOnScreenStream(WFCDevice aDev, WFCContext aContext);
+	TBool CreateImagePath(TDesC& aDir);
+
+private:
+	void ConstructL();
+    TInt GetHeader(const TSurfaceId& aSurface, RSurfaceManager::TInfoBuf& aInfo);
+    TUint8* GetBufferPointerL(const TSurfaceId& aSurface, TInt aNumOfBuffer, RChunk& aChunk);
+    TRgb GetPixelL(RSurfaceManager::TInfoBuf& aInfo, TAny* aPixelData, TPoint aPosition);
+
+private:
+	RSurfaceManager iManager;
+	RSurfaceUpdateSession iSurfaceUpdateSession;
+
+	//This local object wraps the array operations in a heap switch
+	//The reason for providing this wrapper is to allow threads to share the surface manager surface ID list.
+	//In particular, the next test can attempt to release the previous test's surfaces if it paniced. 
+	//Note that the presumption is that the owning thread will be paused, 
+	//so there will be no thread interlock issues with it's heap manager.
+	class RHeapSurfaceArray
+		{
+		public:
+		typedef RArray<TSurfaceId>	Array;
+		RHeapSurfaceArray(RHeapSurfaceArray* aUseExternalArray=NULL);
+
+		//Emulation of RArray entrypoints. Add more stub methods if required...
+		TSurfaceId& operator[](TUint aIndex);
+		void Close();
+		TInt Count() const;
+		inline void Reset();
+		void AppendL(const TSurfaceId &anEntry);
+		TInt Find(const TSurfaceId &anEntry) const;
+		void Remove(TInt anIndex);
+		
+		private:
+		static void PopHeap(void* mainheap);
+		
+		Array iLocalArray;
+		Array* iUseArray;
+		RHeap &iExternalHeapRef;
+		}	iSurfaces;
+	};
+
+#endif // __SURFACE_UTILITY__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/rom/openwftest.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,30 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Includes the required openwftest files.
+
+#if !defined (__OPENWFTEST_IBY__)
+#define __OPENWFTEST_IBY__
+
+// OWF test exe and script
+file=ABI_DIR\DEBUG_DIR\openwftestserver.exe		\sys\bin\openwftestserver.exe
+data=DATAZ_\openwftest\openwftest.script		openwftest\openwftest.script
+
+// if OPENWFTEST_INI is not defined, use the default
+#if !defined (OPENWFTEST_INI)
+#define OPENWFTEST_INI 							openwftest.ini
+#endif //OPENWFTEST_INI
+
+data=DATAZ_\openwftest\OPENWFTEST_INI			openwftest\openwftest.ini
+
+#endif //__OPENWFTEST_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/scripts/openwftest.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,44 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Runs every test with the openwftest.ini from the same folder
+
+// important to load in shared data mode
+LOAD_SUITE	openwftestserver -SharedData
+
+//positive fastpath tests
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0000L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0001L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0002L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0003L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0004L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0005L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0006L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0007L openwftest.ini
+
+//notificiation during fastpath tests
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0010L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0011L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0012L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0013L openwftest.ini
+
+//negative fastpath tests
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0020L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0021L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0022L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0023L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0024L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0025L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0026L openwftest.ini
+RUN_TEST_STEP	100	openwftestserver	TEFUnit.COpenwfTest.GRAPHICS_OPENWFC_FASTPATH_0027L openwftest.ini
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/scripts/openwftest_automatic_c_save.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,48 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This automaic mode ini is pre set to run in automatic mode with an adequate composition pause
+// This ini is preset to save images to the C drive
+
+[TestInfo]
+// Note: 0 for automatic mode, 1 for manual interactive mode
+TestMode = 0
+// Note: SaveImage, "true" for saving images, "false" for not saving images. This option ONLY applies when the above mode is automatic.
+SaveImage = true
+// Note: Directory to place saved images
+Dir = c:\openwftest\img\
+// Note: Delay length in microseconds to allow compositions to complete
+CompositionPause = 500000
+// Note: Delay length in microseconds to allow user to compare images in manual interactive mode-max 34000000(34 seconds)
+ManualPause = 3000000
+
+[ImageInfo]
+// Note: ContiguousFlag, "true" for contiguous, "false" for non-contiguous
+ContiguousFlag = true
+
+Tolerance = 0
+
+// FastpathableWidth 
+// FastpathableHeight
+// Stride       
+// FastpathablePixelFormat = 1027549A
+// NonFastpathablePixelFormat = 1027549E
+// OffsetToFirstBuffer = 0
+// Alignment = 0         
+// Mappable = ETrue
+// MaxBuffers = 2             
+// MinBuffers = 1
+// OffsetBetweenBuffers = 0
+// SurfaceHints = 0
+// Note: CacheAttrib, "true" for CPU cached, "false" for not CPU cached
+// CacheAttrib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/scripts/openwftest_automatic_e_save.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,48 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This automaic mode ini is pre set to run in automatic mode with an adequate composition pause
+// This ini is preset to save images to the C drive
+
+[TestInfo]
+// Note: 0 for automatic mode, 1 for manual interactive mode
+TestMode = 0
+// Note: SaveImage, "true" for saving images, "false" for not saving images. This option ONLY applies when the above mode is automatic.
+SaveImage = true
+// Note: Directory to place saved images
+Dir = e:\openwftest\img\
+// Note: Delay length in microseconds to allow compositions to complete
+CompositionPause = 500000
+// Note: Delay length in microseconds to allow user to compare images in manual interactive mode-max 34000000(34 seconds)
+ManualPause = 3000000
+
+[ImageInfo]
+// Note: ContiguousFlag, "true" for contiguous, "false" for non-contiguous
+ContiguousFlag = true
+
+Tolerance = 0
+
+// FastpathableWidth 
+// FastpathableHeight
+// Stride       
+// FastpathablePixelFormat = 1027549A
+// NonFastpathablePixelFormat = 1027549E
+// OffsetToFirstBuffer = 0
+// Alignment = 0         
+// Mappable = ETrue
+// MaxBuffers = 2             
+// MinBuffers = 1
+// OffsetBetweenBuffers = 0
+// SurfaceHints = 0
+// Note: CacheAttrib, "true" for CPU cached, "false" for not CPU cached
+// CacheAttrib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/scripts/openwftest_automatic_nosave.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,48 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This automaic mode ini is pre set to run in automatic mode with an adequate composition pause
+// This ini is preset to save images to the C drive
+
+[TestInfo]
+// Note: 0 for automatic mode, 1 for manual interactive mode
+TestMode = 0
+// Note: SaveImage, "true" for saving images, "false" for not saving images. This option ONLY applies when the above mode is automatic.
+SaveImage = false
+// Note: Directory to place saved images
+//Dir = c:\openwftest\img\
+// Note: Delay length in microseconds to allow compositions to complete
+CompositionPause = 500000
+// Note: Delay length in microseconds to allow user to compare images in manual interactive mode-max 34000000(34 seconds)
+ManualPause = 3000000
+
+[ImageInfo]
+// Note: ContiguousFlag, "true" for contiguous, "false" for non-contiguous
+ContiguousFlag = true
+
+Tolerance = 0
+
+// FastpathableWidth 
+// FastpathableHeight
+// Stride       
+// FastpathablePixelFormat = 1027549A
+// NonFastpathablePixelFormat = 1027549E
+// OffsetToFirstBuffer = 0
+// Alignment = 0         
+// Mappable = ETrue
+// MaxBuffers = 2             
+// MinBuffers = 1
+// OffsetBetweenBuffers = 0
+// SurfaceHints = 0
+// Note: CacheAttrib, "true" for CPU cached, "false" for not CPU cached
+// CacheAttrib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/scripts/openwftest_manual.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,48 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This manual mode ini is pre set to run in manual mode with a 10 second pause for image checks
+// In manual mode it does not save images
+
+[TestInfo]
+// Note: 0 for automatic mode, 1 for manual interactive mode
+TestMode = 1
+// Note: SaveImage, "true" for saving images, "false" for not saving images. This option ONLY applies when the above mode is automatic.
+//SaveImage = false
+// Note: Directory to place saved images
+//Dir = c:\openwftest\img\
+// Note: Delay length in microseconds to allow compositions to complete
+CompositionPause = 500000
+// Note: Delay length in microseconds to allow user to compare images in manual interactive mode-max 34000000(34 seconds)
+ManualPause = 3000000
+
+[ImageInfo]
+// Note: ContiguousFlag, "true" for contiguous, "false" for non-contiguous
+ContiguousFlag = true
+
+Tolerance = 0
+
+// FastpathableWidth 
+// FastpathableHeight
+// Stride       
+// FastpathablePixelFormat = 1027549A
+// NonFastpathablePixelFormat = 1027549E
+// OffsetToFirstBuffer = 0
+// Alignment = 0         
+// Mappable = ETrue
+// MaxBuffers = 2             
+// MinBuffers = 1
+// OffsetBetweenBuffers = 0
+// SurfaceHints = 0
+// Note: CacheAttrib, "true" for CPU cached, "false" for not CPU cached
+// CacheAttrib 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/src/eglsynchelper.c	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,202 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// eglsynchelper.c
+//
+
+#include "eglsynchelper.h"
+#include "EGL/egltypes.h"
+
+#ifndef EGL_EGLEXT_PROTOTYPES
+
+#define EGLSYNC_TYPE 0xE5
+
+/* sync object data type for POSIX thread implementation*/
+
+typedef struct CondVarSync_* NativeSyncType;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Create a sync object for the specified display.
+ * \ingroup api
+ * \param   dpy     Identifier of the display which will own the sync object
+ * \param   type    Type of the sync object. EGL_SYNC_REUSABLE_KHR is only supported
+ * \param   attrib_list Attribute-value list specifying attributes of the sync 
+ * object, terminated by an attribute entry EGL_NONE
+ * \return  Handle for the created sync object if successful, EGL_NO_SYNC_KHR otherwise
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_ATTRIBUTE if <attrib_list> is neither NULL nor empty (containing only EGL_NONE) or 
+ * if <type> is not a supported type of sync object;
+ * EGL_BAD_ALLOC if the memory allocation related to sync object is not successful
+ * \note    If <type> is EGL_SYNC_REUSABLE_KHR, a reusable sync object is created. 
+ * In this case <attrib_list> must be NULL or empty (containing only EGL_NONE).
+ *  *//*-------------------------------------------------------------------*/
+EGLSyncKHR eglCreateSyncKHR( EGLDisplay dpy,
+                       EGLenum condition,
+                       const EGLint *attrib_list )
+{
+    PFNEGLCREATESYNCKHRPROC createPointer = (PFNEGLCREATESYNCKHRPROC) eglGetProcAddress("eglCreateSyncKHR");
+
+	if (createPointer == NULL)
+		{
+		return EGL_NO_SYNC_KHR;
+		}
+	else
+		{
+		return createPointer(dpy, condition, attrib_list);
+		}
+}
+
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Destroy a sync object and free memory associated with it
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object
+ * \param   sync    Sync object handle. 
+ * \return  EGL_TRUE if deletion was successful and EGL_FALSE otherwise
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_PARAMETER if <sync> is not a valid sync object for <dpy>
+ * \note    If any eglClientWaitSyncKHR commands are blocking on <sync> when 
+ * eglDestroySyncKHR is called, they will be woken up, as if <sync> were signaled. 
+ * If no errors are generated, <sync> will no longer be the handle of a valid sync object.
+ *//*-------------------------------------------------------------------*/
+EGLBoolean eglDestroySyncKHR( EGLDisplay dpy, EGLSyncKHR sync )
+{
+    PFNEGLDESTROYSYNCKHRPROC destroyPointer = (PFNEGLDESTROYSYNCKHRPROC) eglGetProcAddress("eglDestroySyncKHR");
+
+	if (destroyPointer == NULL)
+		{
+		return EGL_FALSE;
+		}
+	else
+		{
+		return destroyPointer(dpy, sync);
+		}
+}
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Blocks the calling thread until the specified sync object 
+ * is signaled, or until <timeout> nanoseconds have passed.  
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object.
+ * \param   sync    Sync object handle. 
+ * \param   flags   If the EGL_FLUSH_COMMANDS_BIT_KHR bit is set in <flags>
+ * and <sync> is unsignaled when the function is called, then the equivalent
+ * of Flush() will be performed for the current API context.   
+ * \param   timeout The thread will be unblocked when <timeout> is expired.
+ * If the <timeout> is to zero, the function just test the current status 
+ * of the sync object. If the <timeout> is set to EGL_FOREVER_KHR, then the 
+ * function does not time out. For all other values, <timeout> is adjusted to 
+ * the closest value which may be substantially longer than one nanosecond. 
+ * \return  EGL_CONDITION_SATISFIED if <sync> was signaled before
+ * the timeout expired, which includes the case when <sync> was already 
+ * signaled when eglClientWaitSyncKHR was called; EGL_TIMEOUT_EXPIRED_KHR if the 
+ * specified timeout period expired before <sync> was signaled; 
+ * EGL_FALSE if an error occurs.
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_PARAMETER if <sync> is not a valid sync object for <dpy> or 
+ * if <flags> does not equal to 0 or EGL_SYNC_FLUSH_COMMAND_BIT_KHR
+ * Note\    More than one eglClientWaitSyncKHR may be outstanding on the same <sync> at any given time. 
+ * When there are multiple threads blocked on the same <sync> and the sync object is signaled, 
+ * all such threads are released, but the order in which they are released is not defined.
+ * If a sync object is destroyed while an eglClientWaitSyncKHR is blocking on that object, 
+ * eglClientWaitSyncKHR will unblock and return immediately, just as if the sync object 
+ * had been signaled prior to being destroyed.
+ *//*-------------------------------------------------------------------*/
+EGLint eglClientWaitSyncKHR( EGLDisplay dpy,
+                             EGLSyncKHR sync,
+                             EGLint flags,
+                             EGLTimeKHR timeout )
+{
+    PFNEGLCLIENTWAITSYNCKHRPROC clientWaitPointer = (PFNEGLCLIENTWAITSYNCKHRPROC) eglGetProcAddress("eglClientWaitSyncKHR");
+
+	if (clientWaitPointer == NULL)
+		{
+		return EGL_FALSE;
+		}
+	else
+		{
+		return clientWaitPointer(dpy, sync, flags, timeout);
+		}
+}
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Signals or unsignals the reusable sync object.  
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object.
+ * \param   sync    Sync object handle. 
+ * \param   mode    Status of the sync object. There are two possible states: 
+ *  EGL_SIGNALED_KHR and EGL_UNSIGNALED_KHR. 
+ * \return  EGL_TRUE if an operation was successful and EGL_FALSE otherwise.
+ * \note    The error code returned from eglSignalSyncImpl() will be generated
+ *//*-------------------------------------------------------------------*/
+EGLBoolean eglSignalSyncKHR( EGLDisplay dpy,
+                             EGLSyncKHR sync,
+                             EGLenum mode )
+{
+    PFNEGLSIGNALSYNCKHRPROC signalPointer = (PFNEGLSIGNALSYNCKHRPROC) eglGetProcAddress("eglSignalSyncKHR");
+	
+   if (signalPointer == NULL)
+	   {
+	   return EGL_FALSE;
+       }
+   else
+	   {
+	   return signalPointer(dpy, sync, mode);
+	   }
+}
+
+
+/*-------------------------------------------------------------------*//*!
+ * \brief   Query an attribute of the sync object  
+ * \ingroup api
+ * \param   dpy     Identifier of the display which owns the sync object
+ * \param   sync    Sync object handle. 
+ * \param   attribute   An attribute to be retrieved. 
+ * \param   value   Pointer to the value for the requested attribute which will be filled on function return. 
+ * \return  EGL_TRUE if an operation was successful and EGL_FALSE otherwise
+ * \error   EGL_BAD_DISPLAY if <dpy> is not a name of a valid EGLDisplay;
+ * EGL_NOT_INITIALIZED if the display object associated with the <dpy> has not been initialized;
+ * EGL_BAD_PARAMETER if <sync> is not a valid sync object for <dpy> or if <value> is not 
+ * a valid pointer; EGL_BAD_ATTRIBUTE if <attribute>  does not lie within expected range;
+ * EGL_BAD_MATCH if <attribute> is not supported for the type of sync object passed in <sync>
+ *//*-------------------------------------------------------------------*/
+EGLBoolean eglGetSyncAttribKHR( EGLDisplay dpy,
+                                EGLSyncKHR sync,
+                                EGLint attribute,
+                                EGLint *value )
+{
+    PFNEGLGETSYNCATTRIBKHRPROC getAttribPointer = (PFNEGLGETSYNCATTRIBKHRPROC) eglGetProcAddress("eglGetSyncAttribKHR");
+
+	if (getAttribPointer == NULL)
+		{
+		return EGL_FALSE;
+		}
+	else
+		{
+		return getAttribPointer(dpy, sync, attribute, value);
+		}
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/src/openwftest.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,2763 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// OpenWF tests
+//
+#include <test/extendtef.h>
+#include <hal.h>
+#include "openwftest.h"
+
+#define KCompositorVersion	0x01023456
+#define KGrowCleanupStack	12
+#define KMaxNotificationDelay   5000000 //5 seconds
+#define KNotificationWarning    100000  //100 ms
+
+_LIT(KTestSectionName, "TestInfo");
+_LIT(KImageSectionName, "ImageInfo");
+_LIT(KContiguousFlag, "ContiguousFlag");
+_LIT(KTolerance, "Tolerance");
+_LIT(KTestMode, "TestMode");
+_LIT(KSaveImage, "SaveImage");
+_LIT(KDir, "Dir");
+_LIT(KDefaultDir, "c:\\openwftest\\img\\");
+_LIT(KCompositionPause, "CompositionPause");
+_LIT(KManualPause, "ManualPause");
+
+//Uncomment this and rebuild if you wish to test if fastpath is enabled using breakpoints
+//#define BREAKPOINT_FASTPATH
+
+/*
+ * COpenwfTest implementation
+ */
+COpenwfTest::COpenwfTest()
+:iFastpathablePixelFormat(EUidPixelFormatXRGB_8888),
+ iNonFastpathablePixelFormat(EUidPixelFormatRGB_565),
+ iMappable(ETrue),
+ iMaxBuffers(2),
+ iMinBuffers(1),
+ iCacheAttrib(ECacheNotlisted),
+ iDeviceId(WFC_INVALID_HANDLE),
+ iSync(EGL_NO_SYNC_KHR),
+ iDevice(WFC_INVALID_HANDLE),
+ iContext(WFC_INVALID_HANDLE)
+	{
+	}
+
+COpenwfTest::~COpenwfTest()
+	{
+    TearDown();
+	}
+
+void COpenwfTest::SetupL()
+    {    
+    iScheduler = new(ELeave) CActiveScheduler;
+    CActiveScheduler::Install(iScheduler);
+
+    ReadIniData();
+    
+    iEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    ASSERT_FALSE(iEGLDisplay == EGL_NO_DISPLAY);
+    ASSERT_FALSE(iEGLDisplay == EGL_BAD_ALLOC);
+    ASSERT_EQUALS(eglGetError(),EGL_SUCCESS);
+    eglInitialize(iEGLDisplay, NULL, NULL);
+    ASSERT_EQUALS(eglGetError(),EGL_SUCCESS);
+    
+    WFCint filterList[] = { WFC_DEVICE_FILTER_SCREEN_NUMBER, WFC_DEFAULT_SCREEN_NUMBER, WFC_NONE};
+    ASSERT_TRUE(wfcEnumerateDevices(&iDeviceId, 1, filterList) == 1);
+    ASSERT_TRUE(iDeviceId != WFC_INVALID_HANDLE);    
+
+    iDevice = wfcCreateDevice(iDeviceId, NULL);
+    ASSERT_TRUE(iDevice != WFC_INVALID_HANDLE);  
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    iContext = wfcCreateOnScreenContext(iDevice, WFC_DEFAULT_SCREEN_NUMBER, NULL);
+    ASSERT_TRUE(iContext != WFC_INVALID_HANDLE);  
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+
+    iFastpathableHeight = wfcGetContextAttribi(iDevice, iContext, WFC_CONTEXT_TARGET_HEIGHT);
+    iFastpathableWidth = wfcGetContextAttribi(iDevice, iContext, WFC_CONTEXT_TARGET_WIDTH);
+    iStride = iFastpathableWidth * 4;
+
+    iFullScreenTRect = TRect(0,0,iFastpathableWidth,iFastpathableHeight);
+    iFullScreenRect[0] = 0;
+    iFullScreenRect[1] = 0;
+    iFullScreenRect[2] = iFullScreenTRect.Width();
+    iFullScreenRect[3] = iFullScreenTRect.Height();
+    
+    iCenterTRect = TRect(iFastpathableWidth/4,iFastpathableHeight/4,
+            3*iFastpathableWidth/4,3*iFastpathableHeight/4);
+    iCenterRect[0] = iCenterTRect.iTl.iX;
+    iCenterRect[1] = iCenterTRect.iTl.iY;
+    iCenterRect[2] = iCenterTRect.Width();
+    iCenterRect[3] = iCenterTRect.Height();
+    
+    iHalfSizeRect[0] = 0;
+    iHalfSizeRect[1] = 0;
+    iHalfSizeRect[2] = iFastpathableWidth/2;
+    iHalfSizeRect[3] = iFastpathableHeight/2;
+    
+    iUtility = CSurfaceUtility::NewL();
+
+    if((iTestMode == EAutomatic) || iSaveImage)
+        {
+        // Need to initialise the on screen stream before composition
+        // to ensure the content is available later 
+        iUtility->GetOnScreenStream(iDevice, iContext);
+        }
+    if (iSaveImage)
+        {   // Create a directory to save images
+        iUtility->CreateImagePath(iImageDirectory);                
+        }
+    iAllowManualPause = ETrue; //tests can stop it (eg dispXtimes tests) 
+    
+    EGLint attrib_list[1] = {EGL_NONE};
+    iSync = eglCreateSyncKHR(iEGLDisplay,EGL_SYNC_REUSABLE_KHR, attrib_list);
+    ASSERT_NOT_EQUALS(iSync,EGL_NO_SYNC_KHR);
+    ASSERT_EQUALS(eglGetError(),EGL_SUCCESS);
+    }
+
+/**
+ * test Suite furniture 
+ **/
+void COpenwfTest::TearDownL()
+    {
+    // Nothing leaves in this function, 
+    // but TearDownL() is needed for the CTestFixture (TEF) interface
+    TearDown();
+    }
+
+void COpenwfTest::TearDown()
+    {
+    WFCErrorCode wfcError;
+    if (iDevice != WFC_INVALID_HANDLE)
+        {
+        wfcError = wfcGetError(iDevice);
+        if (wfcError != WFC_ERROR_NONE)
+            {
+            INFO_PRINTF2(_L("TearDown: There was a failure in the test. error=%d"),wfcError);
+            }
+        }
+    if (iOnScreenStream != WFC_INVALID_HANDLE)
+        {
+        (void)SymbianStreamReleaseReadBuffer(iOnScreenStream, iOnScreenBuffer); //ignore the error
+        iOnScreenStream = WFC_INVALID_HANDLE;
+        }
+    delete iUtility;
+    iUtility = NULL;
+    if (iContext != WFC_INVALID_HANDLE)
+        {
+        wfcDestroyContext(iDevice, iContext);
+        iContext = WFC_INVALID_HANDLE;
+        WFCErrorCode wfcError = wfcGetError(iDevice);
+        if (wfcError != WFC_ERROR_NONE)
+            {
+            INFO_PRINTF2(_L("TearDown: wfcDestroyContext error=%d"),wfcError);
+            }
+        }
+    if (iDevice != WFC_INVALID_HANDLE)
+        {
+        WFCErrorCode deviceError = wfcDestroyDevice(iDevice);
+        iDevice = WFC_INVALID_HANDLE;
+        if (deviceError != WFC_ERROR_NONE)
+            {
+            INFO_PRINTF2(_L("TearDown: wfcDestroyDevice error=%d"),deviceError);
+            }
+        }
+    if (iSync != EGL_NO_SYNC_KHR)
+        {
+        EGLBoolean eglSyncError = eglDestroySyncKHR(iEGLDisplay, iSync);
+        iSync = EGL_NO_SYNC_KHR;
+        if (eglSyncError != EGL_TRUE)
+            {
+            INFO_PRINTF2(_L("TearDown: eglSyncError line %d"),__LINE__);
+            }
+        }
+    if (iEGLDisplay != EGL_NO_DISPLAY)
+        {
+        EGLBoolean eglTerminateError = eglTerminate(iEGLDisplay);
+        iEGLDisplay = EGL_NO_DISPLAY;
+        if (eglTerminateError != EGL_TRUE)
+            {
+            INFO_PRINTF2(_L("TearDown: eglTerminateError line %d"),__LINE__);
+            }
+        }
+    delete iScheduler;
+    iScheduler = NULL;
+    }
+
+/**
+ * To be called at the beginning of tests
+ * aActivate default is ON
+ */
+void COpenwfTest::SetupEmptySceneL(TBool aActivate)
+    {
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcSetContextAttribi(iDevice, iContext, WFC_CONTEXT_ROTATION, WFC_ROTATION_0);
+    wfcSetContextAttribi(iDevice, iContext, WFC_CONTEXT_BG_COLOR, 0xFFFFFFFF);
+    if (aActivate)
+        {
+        LOG(("OpenWFTest: Running in autonomous composition mode"));
+        wfcActivate(iDevice,iContext);
+        }
+    else
+        {
+        LOG(("OpenWFTest: Running in non autonomous composition mode"));
+        wfcDeactivate(iDevice,iContext);
+        }
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);   // Compose the scene
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    LOG(("OpenWFTest: Fastpath - setting up scene - fastpath now off"));
+    }
+
+void COpenwfTest::ReadIniData()
+    {
+	//test mode
+    TBool returnValue = iConfig.GetInt(KTestSectionName, KTestMode, iTestMode);
+    ASSERT_TRUE(returnValue);
+    
+    //save images
+	iSaveImage=EFalse;
+    if (iTestMode == EAutomatic)
+        {
+        returnValue = iConfig.GetBool(KTestSectionName, KSaveImage, iSaveImage);
+        }
+    
+    // Get path for the images to be saved to
+    TPtrC dir;
+    returnValue = iConfig.GetString(KTestSectionName, KDir, dir);
+    if (returnValue)
+        {
+		iImageDirectory.Set(dir);
+        }
+    else
+        {
+		iImageDirectory.Set(KDefaultDir);
+        }
+    
+    // Composition pause in microseconds
+    TInt compositionPause;
+    returnValue = iConfig.GetInt(KTestSectionName, KCompositionPause, compositionPause);
+    ASSERT_TRUE(returnValue);
+    iCompositionPause = compositionPause;
+    
+    // Manual pause in microseconds
+    iManualPause = 0;
+    if (iTestMode != EAutomatic)
+        {
+		TInt manualPause;
+		returnValue = iConfig.GetInt(KTestSectionName, KManualPause, manualPause);
+		ASSERT_TRUE(returnValue);
+		iManualPause = manualPause;
+        }
+    
+    // Force contiguous
+    TBool contiguousFlag;
+    returnValue = iConfig.GetBool(KImageSectionName, KContiguousFlag, contiguousFlag);
+    if (returnValue && contiguousFlag)
+        {
+        iContiguous = EContiguous;
+        }
+    
+    // Test tolerance
+    TInt tolerance;
+    returnValue = iConfig.GetInt(KImageSectionName, KTolerance, tolerance);
+    if (returnValue)
+        {
+        iTolerance = tolerance;
+        }
+    }
+
+/**
+ * Acquires the on screen stream and buffer number
+ * NOTE: this function should be paired with a ReleaseOnScreenStream call
+ * Returns ETrue on success
+ */
+TBool COpenwfTest::AcquireOnScreenStream()
+	{
+	TInt error = KErrNone;
+	ASSERT_TRUE(iOnScreenStream == WFC_INVALID_HANDLE);
+    if(iTestMode == EAutomatic)
+    	{	//need to get the on screen stream
+		iOnScreenStream = iUtility->GetOnScreenStream(iDevice, iContext);
+		if(iOnScreenStream == WFC_INVALID_HANDLE)
+			{
+			INFO_PRINTF1(_L("Failed getting on screen stream"));
+			LOG(("OpenWFTest: *** Failed getting on screen stream"));
+			return EFalse;
+			}
+		error = SymbianStreamAcquireReadBuffer(iOnScreenStream, &iOnScreenBuffer);
+		if (error != KErrNone)
+			{
+			LOG(("OpenWFTest: *** Unable to acquire read buffer. error = %d",error));
+			INFO_PRINTF2(_L("Unable to acquire read buffer. error = %d"),error);
+			}
+		return (error == KErrNone);
+    	}
+	else
+		{
+		INFO_PRINTF1(_L("No need to get the on screen stream, probably manual checking mode"));
+		LOG(("OpenWFTest: *** No need to get the on screen stream, probably manual checking mode"));
+		return ETrue;
+		}
+	}
+
+/**
+ * Releases the on screen stream
+ */
+void COpenwfTest::ReleaseOnScreenStream()
+	{
+	if (iOnScreenStream != WFC_INVALID_HANDLE)
+		{
+		(void)SymbianStreamReleaseReadBuffer(iOnScreenStream, iOnScreenBuffer);	//ignore the error
+		iOnScreenStream = WFC_INVALID_HANDLE;
+		}
+	if(iTestMode != EAutomatic && iAllowManualPause)
+		{
+		INFO_PRINTF1(_L("Performing manual wait"));
+		LOG(("OpenWFTest: *** Performing manual wait"));
+		TRAP_IGNORE(WaitL(iManualPause));
+		}
+	if(iTestMode != EAutomatic && !iAllowManualPause)
+	    {
+        INFO_PRINTF1(_L("Test not allowing a manual wait"));
+        LOG(("OpenWFTest: *** Test not allowing a manual wait"));
+	    }
+	}
+
+/**
+ * Checks the rect of the on screen stream
+ * Returns ETrue on success
+ */
+TBool COpenwfTest::CheckOnScreenStreamRect(TRect aRect, const TRgb& aExpectedColor, TInt aTolerance)
+	{
+    if(iTestMode == EAutomatic)
+    	{
+		if (iOnScreenStream == WFC_INVALID_HANDLE)
+			{
+			LOG(("OpenWFTest: *** We don't have access to the on screen stream"));
+			INFO_PRINTF1(_L("We don't have access to the on screen stream"));
+			return EFalse;
+			}
+		const TSurfaceId* surfaceId = NULL;
+		long bufferIndex;
+		TInt error = SymbianStreamGetBufferId(iOnScreenStream,iOnScreenBuffer,&bufferIndex,&surfaceId);
+		if (error == KErrNone)
+			{
+			return CheckRect(*surfaceId,bufferIndex,aRect,aExpectedColor,aTolerance);
+			}
+		else
+			{
+			LOG(("OpenWFTest: *** Unable to get stream buffer id. error = %d",error));
+			INFO_PRINTF2(_L("Unable to get stream buffer id. error = %d"),error);
+			return EFalse;
+			}
+    	}
+    else
+    	{	//print out what we're hoping to see for manual testing
+		LOG(("OpenWFTest: For rect %d %d %d %d",aRect.iTl.iX,aRect.iTl.iY,aRect.iBr.iX,aRect.iBr.iY));
+		LOG(("OpenWFTest: The expected color is r=%d g=%d b=%d",aExpectedColor.Red(),aExpectedColor.Green(),
+				aExpectedColor.Blue()));
+		INFO_PRINTF5(_L("For rect %d %d %d %d"),aRect.iTl.iX,aRect.iTl.iY,aRect.iBr.iX,aRect.iBr.iY);
+		INFO_PRINTF4(_L("The expected color is r=%d g=%d b=%d"),aExpectedColor.Red(),aExpectedColor.Green(),
+				aExpectedColor.Blue());
+		return ETrue;
+    	}
+	}
+
+/**
+ * checks the color within the given rectangle of the given surface
+ * returns ETrue on success
+ */
+TBool COpenwfTest::CheckRect(const TSurfaceId& aSurface, TInt aBuffer,  TRect aRect,
+		const TRgb& aExpectedColor, TInt aTolerance)
+	{
+	INFO_PRINTF1(_L("Starting pixel checking"));
+	LOG(("OpenWFTest: *** Starting pixel checking"));
+	// Check pixel data
+	
+	TBool success = iUtility->CheckRectColor(aSurface, aRect, aBuffer, aExpectedColor, aTolerance);
+	if (success)
+		{
+		INFO_PRINTF1(_L("Finished pixel checking - pass"));
+		LOG(("OpenWFTest: *** Finished pixel checking - pass"));
+		}
+	else
+		{
+		INFO_PRINTF1(_L("Finished pixel checking - fail"));
+		LOG(("OpenWFTest: *** Finished pixel checking - fail"));
+		}
+    return success;
+	}
+
+/**
+ * If in automatic mode it will save a TGA image of the on screen stream.
+ * It will also print the name of the reference image.
+ * Returns ETrue on success
+ */
+TBool COpenwfTest::CheckOnScreenReferenceImage()
+	{
+	TInt error = KErrNone;
+	//Create image file name
+	_LIT(KSeparator, "_");
+	_LIT(KTGAImgFormat, ".tga");
+	iImageAddress.Zero();
+	iImageAddress.Append(iTestName);
+	iImageAddress.Append(KSeparator);
+	iImageAddress.AppendNum(iImageCounter);
+	iImageAddress.Append(KTGAImgFormat);
+    
+	LOGL((_L("Reference Image:%S"),&iImageAddress));
+	INFO_PRINTF2(_L("Reference Image:%S"),&iImageAddress);
+	//Add file path
+	iImageAddress.Insert(0,iImageDirectory);
+	iImageCounter++;
+	
+    if(iTestMode == EAutomatic && iSaveImage)
+    	{
+		if (iOnScreenStream == WFC_INVALID_HANDLE)
+			{
+			LOG(("OpenWFTest: *** We don't have access to the on screen stream",error));
+			INFO_PRINTF1(_L("We don't have access to the on screen stream"));
+			return EFalse;
+			}
+		const TSurfaceId* surfaceId = NULL;
+		long bufferIndex;
+		error = SymbianStreamGetBufferId(iOnScreenStream,iOnScreenBuffer,&bufferIndex,&surfaceId);
+		if (error == KErrNone)
+			{
+			return SaveImage(*surfaceId,bufferIndex);
+			}
+		else
+			{
+			LOG(("OpenWFTest: *** Unable to get stream buffer id. error = %d",error));
+			INFO_PRINTF2(_L("Unable to get stream buffer id. error = %d"),error);
+			return EFalse;
+			}
+    	}
+    return ETrue;
+	}
+
+/**
+ *  helper function for saving images to files
+ *  returns ETrue on success
+ */
+TBool COpenwfTest::SaveImage(const TSurfaceId& aSurface, TInt aNumOfBuffer)
+    {
+	if(iTestMode == EAutomatic && iSaveImage)
+		{
+		INFO_PRINTF1(_L("Start to save image"));
+		LOG(("OpenWFTest: *** Start to save image"));
+		TBool success = EFalse;
+		TRAPD(error, success = iUtility->SaveResultImageTGAL(aSurface, aNumOfBuffer, iImageAddress));
+		if(error != KErrNone || !success)
+			{
+			INFO_PRINTF1(_L("Failed saving image"));
+			LOG(("OpenWFTest: *** Failed saving image"));
+			return EFalse;
+			}
+		INFO_PRINTF1(_L("Saved image"));
+		LOG(("OpenWFTest: *** Saved image"));
+		}
+    return ETrue;
+    }
+
+/**
+ * Basic wait function call. Return amount of other active objects that stopped the scheduler
+*/
+TInt COpenwfTest::WaitL(TTimeIntervalMicroSeconds32 aDelay)	//aDelay in microseconds
+	{
+	CActiveWaiter* waiter = NULL;
+	waiter = CActiveWaiter::NewL();
+    TInt counter = waiter->Wait(aDelay);
+	delete waiter;
+	return counter;
+	}
+
+/**
+ * aMaxDelay    The maximum time we are willing to wait in microseconds
+ * aNotifications   The amount of notifications we expect to complete, must be >0
+ * Returns ETrue on success
+*/
+TBool COpenwfTest::WaitForNotifications(TTimeIntervalMicroSeconds32 aMaxDelay,TInt aNotificatons)
+    {
+    if (aNotificatons == 0)
+        {   //use WaitL if no notifications are expected
+        return EFalse;
+        }
+    TTime before;
+    TTime after;
+    before.UniversalTime();
+    TTimeIntervalMicroSeconds diff;
+    TInt counter = aNotificatons;
+    CActiveWaiter* waiter = NULL;
+    TRAP_IGNORE(waiter = CActiveWaiter::NewL());
+    if (!waiter)
+        {
+        INFO_PRINTF1(_L("Failed creating CActiveWaiter"));
+        LOG(("OpenWFTest: *** Failed creating CActiveWaiter"));
+        return EFalse;
+        }
+    waiter->StartWait(aMaxDelay);
+    CActiveScheduler::Start();
+    while(!waiter->iRun)
+        {
+        after.UniversalTime();
+        diff = after.MicroSecondsFrom(before);
+        if (diff > KNotificationWarning)
+            {
+            INFO_PRINTF2(_L("note: Notification took a long time to complete: %ld microseconds"),diff.Int64());
+            LOG(("OpenWFTest: *** note: Notification took a long time to complete: %ld microseconds",diff.Int64()));
+            }
+        counter--;
+        if (counter == 0)
+            {   //all expected notifications were completed
+            delete waiter;
+            return ETrue;
+            }
+        CActiveScheduler::Start();
+        }
+    INFO_PRINTF2(_L("Not all notifications completed, counter=%d"),counter);
+    LOG(("OpenWFTest: *** Not all notifications completed, counter=%d",counter));
+    delete waiter;
+    //the notifications didn't complete in time
+    return EFalse;
+    }
+
+// Create a suite of all the tests
+CTestSuite* COpenwfTest::CreateSuiteL(const TDesC& aName)
+	{
+	SUB_SUITE_OPT(COpenwfTest,NULL);
+		//positive fastpath tests
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0000L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0001L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0002L);
+		ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0003L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0004L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0005L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0006L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0007L);
+        //fastpath with notification tests
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0010L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0011L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0012L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0013L);
+        //negative fastpath tests
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0020L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0021L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0022L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0023L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0024L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0025L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0026L);
+        ADD_THIS_TEST_STEP(GRAPHICS_OPENWFC_FASTPATH_0027L);
+		
+	END_SUITE;
+	}
+
+void TefUnitFailLeaveL()
+	{
+	User::Leave(KErrTEFUnitFail);
+	}
+
+CActiveNotification* CActiveNotification::NewL(RSurfaceUpdateSession& aSurfaceUpdateSession,TBool aActivate)
+	{
+	CActiveNotification* self = new (ELeave) CActiveNotification;
+	CleanupStack::PushL(self);
+	self->ConstructL(aSurfaceUpdateSession);
+	CleanupStack::Pop(self);
+	if (aActivate)
+		{
+		self->SetActive();
+		}
+	return self;
+	}
+
+void CActiveNotification::ConstructL(RSurfaceUpdateSession& aSurfaceUpdateSession)
+	{
+	CActiveScheduler::Add(this);
+	iSurfaceUpdateSession = aSurfaceUpdateSession;
+	}
+	
+CActiveNotification::CActiveNotification() : CActive(EPriorityNormal)
+	{}
+
+CActiveNotification::~CActiveNotification()
+	{
+	Cancel();
+	}
+
+void CActiveNotification::DoCancel()
+	{  //we need to cancel all notifications - this will impact other notifications in this sus session!
+    iSurfaceUpdateSession.CancelAllUpdateNotifications();
+	}
+
+void CActiveNotification::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+	
+TInt CActiveNotification::RunError(TInt aError)
+	{
+	return aError; // exists so a break point can be placed on it.
+	}
+
+void CActiveNotification::Activate()
+	{
+	SetActive();
+	}
+
+CActiveWaiter* CActiveWaiter::NewL()
+    {
+	CActiveWaiter* self = new (ELeave) CActiveWaiter;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+    
+void CActiveWaiter::ConstructL()
+    {
+    User::LeaveIfError(iTimer.CreateLocal());
+    CActiveScheduler::Add(this);
+    }
+    
+CActiveWaiter::CActiveWaiter() : CActive(CActive::EPriorityStandard)
+    {}
+
+CActiveWaiter::~CActiveWaiter()
+    {
+    Cancel();
+    iTimer.Close();
+    }
+
+void CActiveWaiter::DoCancel()
+    {
+    iTimer.Cancel();
+    }
+
+void CActiveWaiter::RunL()
+    {
+	iRun = ETrue;
+    CActiveScheduler::Stop();
+    }
+    
+TInt CActiveWaiter::RunError(TInt aError)
+    {
+    return aError; // exists so a break point can be placed on it.
+    }
+
+/**
+ * Waits the set amount of time. Returns the amount of times the active scheduler 
+ * was stopped (not including its own active scheduler stop)
+ */
+TInt CActiveWaiter::Wait(TTimeIntervalMicroSeconds32 aDelay)   //microseconds
+    {
+	TInt counter = 0;
+    SetActive();
+    iTimer.After(iStatus, aDelay);
+    iRun = EFalse;
+    CActiveScheduler::Start();
+    while (!iRun)
+    	{//may be another object that stops the scheduler running in these tests.
+		counter++;
+		CActiveScheduler::Start();
+    	}
+    return counter;
+    }
+
+/**
+ * Starts an AO with the given delay. Remember the RunL will stop the active scheduler.
+ */
+void CActiveWaiter::StartWait(TTimeIntervalMicroSeconds32 aDelay)   //microseconds
+    {
+    SetActive();
+    iTimer.After(iStatus, aDelay);
+    }
+
+/*
+@SYMTestCaseID          GRAPHICS-OPENWFC-FASTPATH-0000
+@SYMTestCaseDesc        Positive testing - Fastpath one-element scene
+@SYMREQ                 
+@SYMPREQ                PREQ417-54885
+@SYMTestType            Unit Test
+@SYMTestPriority        High
+@SYMTestPurpose         Check a scene meeting fastpath criteria can be fastpathed
+@SYMTestActions         
+    All compositions are autonomous:
+    Compose an empty scene
+    Create a scene containing a screen sized element with no scaling, no alpha, no mask, no rotation
+    Compose the scene
+@SYMTestExpectedResults
+    The final scene should be fastpathed    
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0000L()
+	{
+    iTestName = _L("FASTPATH_0000");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - Now ON"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0001
+@SYMTestCaseDesc		Positive testing - Fastpath one-element scene  
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High	
+@SYMTestPurpose			Check a scene including a full screen element with global alpha at opaque level 
+										can be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	Create a scene containing a screen sized element with 2 buffers
+	Enable WFC_TRANPARENCY_GLOBAL_ALPHA 
+	Set WFC_ELEMENT_GLOBAL_ALPHA to be 255 (opaque)
+	Compose the scene
+@SYMTestExpectedResults
+	The final scene should be fastpathed
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0001L()
+	{
+    iTestName = _L("FASTPATH_0001");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    //set element global alpha
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA);
+    wfcSetElementAttribf(iDevice, fpElement, WFC_ELEMENT_GLOBAL_ALPHA, 1.0f);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit - using element alpha"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now ON - using element alpha"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);	
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0002
+@SYMTestCaseDesc		Positive testing - Fastpath one-element scene  
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check a scene including a full screen element with source alpha flagged but an 
+										opaque data format can be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	Create a scene containing a screen sized element 
+	Enable WFC_TRANSPARENCY_SOURCE, but the source format has no alpha value 
+	Compose the scene
+@SYMTestExpectedResults
+	The final scene should be fastpathed
+*/	
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0002L()
+	{
+    iTestName = _L("FASTPATH_0002");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												EUidPixelFormatXRGB_8888,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    //set pixel alpha on XRGB element
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_SOURCE);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit - using pixel alpha"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now ON - using pixel alpha"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0003
+@SYMTestCaseDesc		Positive testing - Fastpath scene with a double buffered element
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check if a scene is fastpathed using the second buffer
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	A) Create a scene containing an element with 2 buffers
+	Set the element screen size
+	Set destination and source rectangle to screen size
+	Compose the scene
+	B) Send an update to buffer 1 with change of colour
+	Wait for notification
+@SYMTestExpectedResults
+	The scene should be fastpathed for A and B
+	Screen colour should change after B
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0003L()
+	{
+    iTestName = _L("FASTPATH_0003");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now ON"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);	
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+    
+    //Fill surface is blue
+    iUtility->FillSurfaceL(surface, 1, KBlue);
+	//Do content update for surface buff1
+    CActiveNotification* buff1disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(buff1disp);
+    TTimeStamp buff1time;
+    iUtility->NotifyWhenDisplayed(buff1disp->iStatus,buff1time);
+    
+    LOG(("OpenWFTest: Fastpath - staying ON..."));
+    err = iUtility->SubmitUpdate(surface, 1, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,1));	//1 AO should have completed
+    
+    //create ref image/check on screen content
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KBlue,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);
+    CleanupStack::PopAndDestroy(buff1disp);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0004
+@SYMTestCaseDesc		Positive testing - Fastpath two-element scene 
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		Medium
+@SYMTestPurpose			Check a scene including a full screen opaque element as the top layer can be 
+										fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	A) Create a scene containing a screen sized element with WFC_TRANSPARENCY_NONE enabled
+	Compose the scene
+  B) Create a small rectangle behind the first element
+	Compose the scene
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0004L()
+	{
+    iTestName = _L("FASTPATH_0004");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+	
+	TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												iFastpathablePixelFormat,
+												iStride, iContiguous, iMaxBuffers);
+	ASSERT_FALSE(surface.IsNull());
+
+	WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+	TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);	
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+	
+    TSurfaceId surfaceB = iUtility->CreateSurfaceL(TSize(iFastpathableWidth/2,iFastpathableHeight/2),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceB.IsNull());
+    WFCSource sourceB = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceB), NULL);
+    err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementB = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementB, WFC_ELEMENT_SOURCE, sourceB);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iHalfSizeRect);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iCenterRect);
+	
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	LOG(("OpenWFTest: Fastpath - now ON"));
+	
+	iUtility->FillSurfaceL(surface, 0, KGreen);
+	err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+	
+    LOG(("OpenWFTest: Fastpath - staying ON..."));
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, elementB, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	
+	iUtility->FillSurfaceL(surfaceB, 0, KBlue);
+	err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+	wfcDestroySource(iDevice, fpSource);
+	wfcDestroySource(iDevice, sourceB);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0005
+@SYMTestCaseDesc		Positive testing - Fastpath two-element scene 
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		Medium	
+@SYMTestPurpose			Check a scene including a full screen element with global alpha as the top layer 
+										can be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	A) Create a scene containing a screen sized element 
+	Enable WFC_TRANPARENCY_GLOBAL_ALPHA and set WFC_ELEMENT_GLOBAL_ALPHA to be 255 (opaque)
+	Compose the scene
+	B) Create a smaller element behind the first element
+	Compose the scene
+@SYMTestExpectedResults
+	Both compositions should trigger fastpathing.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0005L()
+	{
+    iTestName = _L("FASTPATH_0005");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+	
+	TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												iFastpathablePixelFormat,
+												iStride, iContiguous, iMaxBuffers);
+	ASSERT_FALSE(surface.IsNull());
+
+	WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+	TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);	
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+//set element global alpha
+	wfcSetElementAttribf(iDevice, fpElement, WFC_ELEMENT_GLOBAL_ALPHA, 1.0f);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA);
+	
+    TSurfaceId surfaceB = iUtility->CreateSurfaceL(TSize(iFastpathableWidth/2,iFastpathableHeight/2),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceB.IsNull());
+    WFCSource sourceB = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceB), NULL);
+    err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementB = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementB, WFC_ELEMENT_SOURCE, sourceB);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iHalfSizeRect);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iCenterRect);
+	
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit - using element global alpha"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	LOG(("OpenWFTest: Fastpath - now ON... - using element global alpha"));
+	
+	iUtility->FillSurfaceL(surface, 0, KGreen);
+	ASSERT_EQUALS(iUtility->SubmitUpdate(surface, 0, NULL),KErrNone);
+	WaitL(iCompositionPause);
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+	
+
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, elementB, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit - using element global alpha"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	
+	iUtility->FillSurfaceL(surfaceB, 0, KBlue);
+	err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);	
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+	wfcDestroySource(iDevice, fpSource);
+	wfcDestroySource(iDevice, sourceB);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0006
+@SYMTestCaseDesc		Positive testing - Fastpath two-element scene 
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		Low
+@SYMTestPurpose			Check a scene including a full screen opaque element behind a transparent element 
+										can be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	A) Create a scene containing an element of any size 
+	Enable WFC_TRANPARENCY_GLOBAL_ALPHA and set WFC_ELEMENT_GLOBAL_ALPHA to 0 (transparent)
+	Compose the scene
+	B) Create another screen sized opaque element behind the frist 
+	Compose the scene
+@SYMTestExpectedResults
+	The final scene should fastpath for B), not for A)	
+	(The current implementation does not support this fastpath behaviour. This test can be ignored at 
+	the moment.)
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0006L()
+	{
+    iTestName = _L("FASTPATH_0006");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+	
+	TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth/2,iFastpathableHeight/2),
+												iFastpathablePixelFormat,
+												iStride, iContiguous, iMaxBuffers);
+	ASSERT_FALSE(surface.IsNull());
+
+	WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+	TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);	
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iHalfSizeRect);
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iCenterRect);
+	//set element global alpha fully transparent
+	wfcSetElementAttribf(iDevice, fpElement, WFC_ELEMENT_GLOBAL_ALPHA, 0.0f);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA);
+	
+    TSurfaceId surfaceB = iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+													iFastpathablePixelFormat,
+													iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceB.IsNull());
+    WFCSource sourceB = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceB), NULL);
+    err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementB = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementB, WFC_ELEMENT_SOURCE, sourceB);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+	
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit -single fully transparent element using global alpha"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	LOG(("OpenWFTest: Fastpath - now ON - single fully transparent element using global alpha"));
+	
+	iUtility->FillSurfaceL(surface, 0, KGreen);
+	err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);	
+ 
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, elementB, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit -fullscreen opaque element behind fully transparent element"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	LOG(("OpenWFTest: Fastpath - now ON - fullscreen opaque element behind transparent element"));
+	
+	iUtility->FillSurfaceL(surfaceB, 0, KBlue);
+	err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);	
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KBlue,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+	wfcDestroySource(iDevice, fpSource);
+	wfcDestroySource(iDevice, sourceB);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0007
+@SYMTestCaseDesc		Positive testing - Fastpath one-element scene  
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check a scene including destination rectangle changes can trigger fastpath on and off
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	Create a scene containing a screen sized element 
+	Compose scene
+	Set the destination rectangle smaller than screen size
+	Compose the scene
+	Set the destination rectangle back to screen size
+	Compose the scene
+@SYMTestExpectedResults
+	The scenes with the element of full screen destination rectangle should be fastpathed	
+	The scene with the element of smaller destination rectangle should not be fastpathed
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0007L()
+	{
+    iTestName = _L("FASTPATH_0007");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+	
+	TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												iFastpathablePixelFormat,
+												iStride, iContiguous, iMaxBuffers);
+	ASSERT_FALSE(surface.IsNull());
+
+	WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+	TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);	
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+	//NOT full screen destination
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iCenterRect);
+	
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+	wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	LOG(("OpenWFTest: Fastpath - still OFF"));
+	
+	iUtility->FillSurfaceL(surface, 0, KGreen);
+	err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);	
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iCenterTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+	
+	//NOW set full screen
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+	
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	WaitL(iCompositionPause);
+ 
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+	wfcDestroySource(iDevice, fpSource);  
+	}
+
+//NOTIFICATION TESTS
+void COpenwfTest::FastpathNotificationsTestL(TBool aAutonomous)
+	{
+    SetupEmptySceneL(aAutonomous);
+
+    //Create 3 elements A+C fastpathable, B centered
+    TSurfaceId surfaceA = iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceA.IsNull());
+    WFCSource sourceA = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceA), NULL);
+    TInt err = iUtility->SubmitUpdate(surfaceA, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementA = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementA, WFC_ELEMENT_SOURCE, sourceA);
+    wfcSetElementAttribiv(iDevice, elementA, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, elementA, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+    TSurfaceId surfaceB = iUtility->CreateSurfaceL(TSize(iFastpathableWidth/2,iFastpathableHeight/2),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceB.IsNull());
+    WFCSource sourceB = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceB), NULL);
+    err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementB = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementB, WFC_ELEMENT_SOURCE, sourceB);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iHalfSizeRect);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iCenterRect);
+    
+    TSurfaceId surfaceC = iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceC.IsNull());
+    WFCSource sourceC = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceC), NULL);
+    err = iUtility->SubmitUpdate(surfaceC, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementC = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementC, WFC_ELEMENT_SOURCE, sourceC);
+    wfcSetElementAttribiv(iDevice, elementC, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, elementC, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+
+    //**********STARTING ACTUAL TEST!**********
+    //**********SURFACE A FASTPATHABLE**********
+	//Add A to scene
+    wfcInsertElement(iDevice, elementA, WFC_INVALID_HANDLE);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now ON"));
+	//Set A buffer0 red
+    iUtility->FillSurfaceL(surfaceA, 0, KRed);
+	//Do content update Abuff0 idisp iavail
+    CActiveNotification* surfAbuff0disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfAbuff0disp);
+    TTimeStamp surfAbuff0time;
+    CActiveNotification* surfAbuff0avail = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfAbuff0avail);
+    //iUtility->NotifyWhenDisplayed(surfAbuff0disp,surfAbuff0time);
+    iUtility->NotifyWhenDisplayed(surfAbuff0disp->iStatus,surfAbuff0time);
+    iUtility->NotifyWhenAvailable(surfAbuff0avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceA, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check A buff0 iDisp doesnt complete
+		ASSERT_EQUALS(surfAbuff0disp->iStatus.Int(),KRequestPending);
+		//Check A buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,1));
+	
+	//Check A buff0 iDisp completes
+    ASSERT_EQUALS(surfAbuff0disp->iStatus.Int(),KErrNone);
+	//Check A buff0 iAvail doesnt complete
+    ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KRed,iTolerance));
+    ReleaseOnScreenStream();
+
+	//Set A buffer1 Yellow
+    iUtility->FillSurfaceL(surfaceA, 1, KYellow);
+	
+	//Check A buff0 iavail doesnt complete
+    ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KRed,iTolerance));
+	ReleaseOnScreenStream();
+	
+	//Do content update Abuff1 idisp iavail
+    CActiveNotification* surfAbuff1disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfAbuff1disp);
+    TTimeStamp surfAbuff1time;
+    CActiveNotification* surfAbuff1avail = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfAbuff1avail);
+    iUtility->NotifyWhenDisplayed(surfAbuff1disp->iStatus,surfAbuff1time);
+    iUtility->NotifyWhenAvailable(surfAbuff1avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceA, 1, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check A buff1 iDisp doesnt complete
+		ASSERT_EQUALS(surfAbuff1disp->iStatus.Int(),KRequestPending);
+		//Check A buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+		//Check A buff0 iAvail doesnt complete
+	    ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,2));
+	
+	//Check A buff1 idisp completes
+    ASSERT_EQUALS(surfAbuff1disp->iStatus.Int(),KErrNone);
+	//Check A buff0 iAvail completes
+    ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KErrNone);
+	//Check A buff1 iAvail doesnt complete
+    ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KYellow,iTolerance));
+	ReleaseOnScreenStream();
+	
+	//**********SURFACE B NOT VISIBLE**********
+	//Add surfaceB to scene behind surfaceA
+    wfcInsertElement(iDevice, elementB, WFC_INVALID_HANDLE);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - still ON"));
+	//Set B buffer0 green
+    iUtility->FillSurfaceL(surfaceB, 0, KGreen);
+	//Do content update idisp iavail
+    CActiveNotification* surfBbuff0disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfBbuff0disp);
+    TTimeStamp surfBbuff0time;
+    CActiveNotification* surfBbuff0avail = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfBbuff0avail);
+    iUtility->NotifyWhenDisplayed(surfBbuff0disp->iStatus,surfBbuff0time);
+    iUtility->NotifyWhenAvailable(surfBbuff0avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check B buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff0avail->iStatus.Int(),KRequestPending);
+		//Check B buff0 iDisp doesnt complete
+		ASSERT_EQUALS(surfBbuff0disp->iStatus.Int(),KRequestPending);
+		//Check A buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,1));
+    
+	//Check B buff0 idisp completes - could be no error or not visible
+    ASSERT_TRUE((surfBbuff0disp->iStatus.Int()==KErrNotVisible)||(surfBbuff0disp->iStatus.Int()==KErrNone));
+	//Check B buff0 iavail doesnt complete
+    ASSERT_EQUALS(surfBbuff0avail->iStatus.Int(),KRequestPending);
+	//Check A buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+	
+	//Set B buffer1 blue
+	iUtility->FillSurfaceL(surfaceB, 1, KBlue);
+	//Do content update idisp iavail
+    CActiveNotification* surfBbuff1disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfBbuff1disp);
+    TTimeStamp surfBbuff1time;
+    CActiveNotification* surfBbuff1avail = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfBbuff1avail);
+    iUtility->NotifyWhenDisplayed(surfBbuff1disp->iStatus,surfBbuff1time);
+    iUtility->NotifyWhenAvailable(surfBbuff1avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceB, 1, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check B buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+		//Check B buff1 iDisp doesnt complete
+		ASSERT_EQUALS(surfBbuff1disp->iStatus.Int(),KRequestPending);
+		//Check B buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff0avail->iStatus.Int(),KRequestPending);
+		//Check A buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,2));
+    
+    //Check B buff1 idisp completes - could be no error or not visible
+    ASSERT_TRUE((surfBbuff1disp->iStatus.Int()==KErrNotVisible)||(surfBbuff1disp->iStatus.Int()==KErrNone));
+	//Check B buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+	//Check B buff0 iavail completes - could be no error or not visible
+    ASSERT_TRUE((surfBbuff0avail->iStatus.Int()==KErrNotVisible)||(surfBbuff0avail->iStatus.Int()==KErrNone));
+	//Check A buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KYellow,iTolerance));
+	ReleaseOnScreenStream();
+	
+	//**********SURFACE C ALSO FASTPATHABLE**********
+	//Add C to scene in front of surfaceA
+    wfcInsertElement(iDevice, elementC, elementA);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - still ON"));
+	//Set C to brown
+    iUtility->FillSurfaceL(surfaceC, 0, KBrown);
+	//Do content update Cbuff0 idisp iavail
+    CActiveNotification* surfCbuff0disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfCbuff0disp);
+    TTimeStamp surfCbuff0time;
+    CActiveNotification* surfCbuff0avail = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfCbuff0avail);
+    iUtility->NotifyWhenDisplayed(surfCbuff0disp->iStatus,surfCbuff0time);
+    iUtility->NotifyWhenAvailable(surfCbuff0avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceC, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check C buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfCbuff0avail->iStatus.Int(),KRequestPending);
+		//Check C buff0 iDisp doesnt complete
+		ASSERT_EQUALS(surfCbuff0disp->iStatus.Int(),KRequestPending);
+		//Check B buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+		//Check A buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,1));
+    
+	//Check C buff0 idisp completes
+    ASSERT_EQUALS(surfCbuff0disp->iStatus.Int(),KErrNone);
+	//Check C buff0 iavail does not complete
+    ASSERT_EQUALS(surfCbuff0avail->iStatus.Int(),KRequestPending);
+	//Check B buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+	//Check A buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KBrown,iTolerance));
+	ReleaseOnScreenStream();
+	
+	//Set C buffer1 grey
+    iUtility->FillSurfaceL(surfaceC, 1, KGray);
+	//Do content update Cbuff1 idisp iavail
+    CActiveNotification* surfCbuff1disp = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfCbuff1disp);
+    TTimeStamp surfCbuff1time;
+    CActiveNotification* surfCbuff1avail = CActiveNotification::NewL(iUtility->Session(),ETrue);
+    CleanupStack::PushL(surfCbuff1avail);
+    iUtility->NotifyWhenDisplayed(surfCbuff1disp->iStatus,surfCbuff1time);
+    iUtility->NotifyWhenAvailable(surfCbuff1avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceC, 1, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check C buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfCbuff1avail->iStatus.Int(),KRequestPending);
+		//Check C buff1 iDisp doesnt complete
+		ASSERT_EQUALS(surfCbuff1disp->iStatus.Int(),KRequestPending);
+		//Check C buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfCbuff0avail->iStatus.Int(),KRequestPending);
+		//Check B buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+		//Check A buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,2));
+    
+	//Check C buff1 idisp completes
+    ASSERT_EQUALS(surfCbuff1disp->iStatus.Int(),KErrNone);
+	//Check C buff1 iavail does not complete
+    ASSERT_EQUALS(surfCbuff1avail->iStatus.Int(),KRequestPending);
+	//Check C buff0 iavail completes
+    ASSERT_EQUALS(surfCbuff0avail->iStatus.Int(),KErrNone);
+	//Check B buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+	//Check A buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGray,iTolerance));
+	ReleaseOnScreenStream();
+	
+    //**********SURFACE A BACK TO FRONT**********
+	//Move A to the front
+    wfcInsertElement(iDevice, elementA, elementC);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - still ON"));
+	//Set A buffer0 magenta
+    iUtility->FillSurfaceL(surfaceA, 0, KMagenta);
+	//Do content update Abuff0 idisp iavail
+    surfAbuff0disp->Activate();
+    surfAbuff0avail->Activate();
+    iUtility->NotifyWhenDisplayed(surfAbuff0disp->iStatus,surfAbuff0time);
+    iUtility->NotifyWhenAvailable(surfAbuff0avail->iStatus); 
+    err = iUtility->SubmitUpdate(surfaceA, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check A buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+		//Check A buff0 iDisp doesnt complete
+		ASSERT_EQUALS(surfAbuff0disp->iStatus.Int(),KRequestPending);
+		//Check C buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfCbuff1avail->iStatus.Int(),KRequestPending);
+		//Check B buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+		//Check A buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,2));
+    
+	//Check A buff0 idisp completes
+    ASSERT_EQUALS(surfAbuff0disp->iStatus.Int(),KErrNone);
+	//Check A buff0 iavail does not complete
+    ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+	//Check A buff1 iavail does complete
+    ASSERT_EQUALS(surfAbuff1avail->iStatus.Int(),KErrNone);
+	//Check C buff1 iavail does not complete
+    ASSERT_EQUALS(surfCbuff1avail->iStatus.Int(),KRequestPending);
+	//Check B buff1 iavail doesnt complete
+    ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KMagenta,iTolerance));
+	ReleaseOnScreenStream();
+    
+    //**********SURFACE B TO FRONT - STOPS FASTPATH HAPPENING**********
+    //Move B to the front
+	wfcInsertElement(iDevice, elementB, elementA);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now OFF..."));
+	//Set B buffer0 dark red
+	iUtility->FillSurfaceL(surfaceB, 0, KDarkRed);
+	//Do content update Abuff0 idisp iavail
+	surfBbuff0disp->Activate();
+	surfBbuff0avail->Activate();
+	iUtility->NotifyWhenDisplayed(surfBbuff0disp->iStatus,surfBbuff0time);
+	iUtility->NotifyWhenAvailable(surfBbuff0avail->iStatus); 
+	err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	
+    if(!aAutonomous)
+    	{
+        WaitL(iCompositionPause);
+		//Check B buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff0avail->iStatus.Int(),KRequestPending);
+		//Check B buff0 iDisp doesnt complete
+		ASSERT_EQUALS(surfBbuff0disp->iStatus.Int(),KRequestPending);
+		//Check A buff0 iAvail doesnt complete
+		ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+		//Check C buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfCbuff1avail->iStatus.Int(),KRequestPending);
+		//Check B buff1 iAvail doesnt complete
+		ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KRequestPending);
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    ASSERT_TRUE(WaitForNotifications(KMaxNotificationDelay,2));
+	
+	//Check B buff0 iAvail doesnt complete
+	ASSERT_EQUALS(surfBbuff0avail->iStatus.Int(),KRequestPending);
+	//Check B buff0 iDisp completes
+	ASSERT_EQUALS(surfBbuff0disp->iStatus.Int(),KErrNone);
+	//Check A buff0 iAvail doesnt complete
+	ASSERT_EQUALS(surfAbuff0avail->iStatus.Int(),KRequestPending);
+	//Check C buff1 iAvail doesnt complete
+	ASSERT_EQUALS(surfCbuff1avail->iStatus.Int(),KRequestPending);
+	//Check B buff1 iAvail completes
+	ASSERT_EQUALS(surfBbuff1avail->iStatus.Int(),KErrNone);
+	
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	//Check dark red center of screen
+	ASSERT_TRUE(CheckOnScreenStreamRect(iCenterTRect,KDarkRed,iTolerance));
+	//Check magenta around the borders
+	ASSERT_TRUE(CheckOnScreenStreamRect(TRect(0,0,iCenterTRect.iTl.iX,iCenterTRect.iTl.iY),KMagenta,iTolerance));
+	ASSERT_TRUE(CheckOnScreenStreamRect(TRect(iCenterTRect.iBr.iX+1,iCenterTRect.iBr.iY+1,
+			iFastpathableWidth,iFastpathableHeight),KMagenta,iTolerance));
+	ReleaseOnScreenStream();
+	
+	ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    
+    wfcDestroySource(iDevice, sourceA);
+    wfcDestroySource(iDevice, sourceB);
+    wfcDestroySource(iDevice, sourceC);
+    
+	CleanupStack::PopAndDestroy(12,surfAbuff0disp);
+	}
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0010
+@SYMTestCaseDesc		Positive testing - Fastpath with notification checking for autonomous composition
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Integration Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check fastpath does not cause any problem to notifications
+@SYMTestActions			
+	Autonomous composition
+	All elements created are double buffered and opaque:
+	Compose an empty scene
+	
+	A) Create a scene containing a screen sized element A
+	Fill buffer 0 of element A with red colour 
+	Submit the scene
+	Do content update of buffer 0 for available (iAvailable) and display time (iDisplayed)
+	Compose the scene, iDisplayed for buffer 0 should complete
+	
+	Fill buffer 1 of element A with yellow colour
+	Do content update of buffer 1 
+	Compose the scene, iDisplayed for buffer 1 should complete
+	Wait for iAvailable of buffer 0 to complete	
+	(iAvailable of buffer 1 will not complete until further content update)	
+	
+	B) Add a new element B of smaller non fastpathable size behind element A
+	Fill buffer 0 of element B with green colour
+	Submit the scene
+	Do content update of buffer 0 of element B 
+	Compose the scene, iDisplayed for buffer 0 of element B should not complete
+	iAvailable for buffer 1 of element A should not complete
+		
+	Fill buffer 1 of element B with blue colour
+	Do content update of buffer 1 of element B 
+	Wait for iDisplay to complete (possibly with KErrNotVisible)
+	Wait for iAvailable for buffer 0 of element B to complete (possibly with KErrNotVisible)
+	
+	C) Add a new screen size element C in front of A and B
+	Fill buffer 0 of element C to be brown
+	Do content update of buffer 0 of element C 
+	Compose the scene, iDisplayed of buffer 0 of element C should complete
+	iAvailable of buffer 1 of element B should not complete
+	
+	Fill buffer 1 of element C with grey colour
+	Do content update of buffer 1 of element C 
+	Compose the scene, iDisplayed of buffer 1 of element C should complete
+	Wait for iAvailable of buffer 0 of element C to complete
+		
+	D) Move element A to the front
+	Fill buffer 0 of element A with magenta colour
+	Do content update of buffer 0 of element A 
+	Compose the scene, iDisplayed for buffer 0 of element A should complete
+	Wait for iAvailable of buffer 1 of element A to complete
+	iAvailable of buffer 1 of element C should not complete
+	
+	E) Move element B to the front *NOW NOT FASTPATHING*
+	Fill buffer 0 of element B with dark red colour
+	Do content update of buffer 0 of element B
+	Compose the scene, iDisplayed for buffer 0 of element B should complete
+	Wait for iAvailable of buffer 1 of element B to complete
+	iAvailable of buffer 1 of element C should not complete
+	iAvailable of buffer 0 of element A should not complete
+		
+@SYMTestExpectedResults
+	All composition should trigger fastpath 
+	Request status checks iAvailable and iDisplayed should be set to KErrNone every time.	
+	Screen colour should change in the sequence of red, yellow, brown, grey, magenta
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0010L()
+	{
+    iTestName = _L("FASTPATH_0010");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    FastpathNotificationsTestL(ETrue);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0011
+@SYMTestCaseDesc		Positive testing - Fastpath with notification checking for non-autonomous composition
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Integration Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check fastpath does not cause any problem to notifications
+@SYMTestActions			
+	A repeat of GRAPHICS-OPENWFC-FASTPATH-0010 but with non autonomous composition
+	
+	Where possible TRequestStatuses are additionally checked after submit updates and before
+	explicit wfcCompose calls are made.
+	
+@SYMTestExpectedResults
+	Just commit should not trigger any changes to the scene or notifications to complete
+	Just content updates should not trigger any changes to the scene or notifications to complete
+	Only after Commit, Content update and Force compose should things happen.
+	Request status checks iAvailable and iDisplayed should be completed.
+	Screen colour should change in the sequence of red, yellow, green, blue, brown and grey
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0011L()
+	{
+    iTestName = _L("FASTPATH_0011");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    FastpathNotificationsTestL(EFalse);
+	}
+
+//NOTIFICATION TESTS
+void COpenwfTest::FastpathDispXNotificationsTestL(TBool aAutonomous)
+	{
+    SetupEmptySceneL(aAutonomous);
+    if (aAutonomous)
+        {   //if we have manual pauses the test will complete early
+        iAllowManualPause = EFalse;
+        }
+	
+	//Create 2 fastpathable elements
+    TSurfaceId surfaceA = iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+
+    ASSERT_FALSE(surfaceA.IsNull());
+    WFCSource sourceA = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceA), NULL);
+    TInt err = iUtility->SubmitUpdate(surfaceA, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementA = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementA, WFC_ELEMENT_SOURCE, sourceA);
+    wfcSetElementAttribiv(iDevice, elementA, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, elementA, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+    TSurfaceId surfaceB = iUtility->CreateSurfaceL(TSize(iFastpathableWidth/2,iFastpathableHeight/2),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceB.IsNull());
+    WFCSource sourceB = wfcCreateSourceFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceB), NULL);
+    err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement elementB = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, elementB, WFC_ELEMENT_SOURCE, sourceB);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iHalfSizeRect);
+    wfcSetElementAttribiv(iDevice, elementB, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iCenterRect);
+	
+	//**********STARTING ACTUAL TEST!**********
+	//Add A to scene
+	wfcInsertElement(iDevice, elementA, WFC_INVALID_HANDLE);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now ON"));
+	//Set A buffer0 red
+	iUtility->FillSurfaceL(surfaceA, 0, KRed);
+	err = iUtility->SubmitUpdate(surfaceA, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+    if(!aAutonomous)
+    	{
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KRed,iTolerance));
+	ReleaseOnScreenStream();
+	
+	//Add surfaceB to scene infront of surfaceA
+	wfcInsertElement(iDevice, elementB, elementA);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now OFF"));
+	//Set B buffer0 green
+	iUtility->FillSurfaceL(surfaceB, 0, KBlue);
+	err = iUtility->SubmitUpdate(surfaceB, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+    if(!aAutonomous)
+    	{
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	//Check blue center of screen
+    ASSERT_TRUE(CheckOnScreenStreamRect(iCenterTRect,KBlue,iTolerance));
+	//Check red around the borders
+	ASSERT_TRUE(CheckOnScreenStreamRect(TRect(0,0,iCenterTRect.iTl.iX,iCenterTRect.iTl.iY),KRed,iTolerance));
+	ASSERT_TRUE(CheckOnScreenStreamRect(TRect(iCenterTRect.iBr.iX+1,iCenterTRect.iBr.iY+1,
+			iFastpathableWidth,iFastpathableHeight),KRed,iTolerance));
+	ReleaseOnScreenStream();
+	
+	//Set A buffer1 yellow
+	iUtility->FillSurfaceL(surfaceA, 1, KYellow);
+	//Set B buffer1 KGreen
+	iUtility->FillSurfaceL(surfaceB, 1, KGreen);
+	
+	//Do content updated surfaceA dispXtimes 10
+	CActiveNotification* surfAbuff1dispX = CActiveNotification::NewL(iUtility->Session(),ETrue);
+	CleanupStack::PushL(surfAbuff1dispX);
+	iUtility->NotifyWhenDisplayedXTimes(10,surfAbuff1dispX->iStatus);
+	err = iUtility->SubmitUpdate(surfaceA, 1, NULL);
+	//Do content updated surfaceB dispXtimes 5
+	CActiveNotification* surfBbuff1dispX = CActiveNotification::NewL(iUtility->Session(),ETrue);
+	CleanupStack::PushL(surfBbuff1dispX);
+	iUtility->NotifyWhenDisplayedXTimes(5,surfBbuff1dispX->iStatus);
+	err = iUtility->SubmitUpdate(surfaceB, 1, NULL);
+	
+    if(!aAutonomous)
+    	{
+		for(TInt i=0;i<4;i++)
+			{
+			wfcCompose(iDevice, iContext, WFC_TRUE);
+		    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+		    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+		    WaitL(iCompositionPause);
+			//Check A has not completed yet
+			ASSERT_EQUALS(surfAbuff1dispX->iStatus.Int(),KRequestPending);
+			//Check B has not completed yet
+			ASSERT_EQUALS(surfBbuff1dispX->iStatus.Int(),KRequestPending);
+			}
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    	}
+	//surfBbuff1dispX should complete, and its RunL will stop the scheduler
+    CActiveScheduler::Start();
+	//Check B has completed
+    ASSERT_EQUALS(surfBbuff1dispX->iStatus.Int(),KErrNone);
+	//Check A has not completed yet
+	ASSERT_EQUALS(surfAbuff1dispX->iStatus.Int(),KRequestPending);
+	
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	//Check green center of screen
+    ASSERT_TRUE(CheckOnScreenStreamRect(iCenterTRect,KGreen,iTolerance));
+	//Check yellow around the borders
+	ASSERT_TRUE(CheckOnScreenStreamRect(TRect(0,0,iCenterTRect.iTl.iX,iCenterTRect.iTl.iY),KYellow,iTolerance));
+	ASSERT_TRUE(CheckOnScreenStreamRect(TRect(iCenterTRect.iBr.iX+1,iCenterTRect.iBr.iY+1,
+			iFastpathableWidth,iFastpathableHeight),KYellow,iTolerance));
+	ReleaseOnScreenStream();
+	
+    //check it hasn't completed unexpectedly early while using on screen stream
+    ASSERT_EQUALS(surfAbuff1dispX->iStatus.Int(),KRequestPending);
+    
+	//Remove surfaceB from the scene
+	wfcRemoveElement(iDevice, elementB);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+    if(!aAutonomous)
+    	{
+		for(TInt i=0;i<4;i++)
+			{
+			wfcCompose(iDevice, iContext, WFC_TRUE);
+		    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+		    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+		    LOG(("OpenWFTest: Fastpath - now ON"));
+		    WaitL(iCompositionPause);
+			//Check A has not completed yet
+			ASSERT_EQUALS(surfAbuff1dispX->iStatus.Int(),KRequestPending);
+			}
+		wfcCompose(iDevice, iContext, WFC_TRUE);
+    	}
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+
+	//surfAbuff1dispX should complete, and its RunL will stop the scheduler
+    CActiveScheduler::Start();
+    ASSERT_EQUALS(surfAbuff1dispX->iStatus.Int(),KErrNone);
+
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KYellow,iTolerance));
+	ReleaseOnScreenStream();
+	
+	ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+	//Shutdown
+    wfcDestroySource(iDevice, sourceA);
+    wfcDestroySource(iDevice, sourceB);
+    
+	CleanupStack::PopAndDestroy(2,surfAbuff1dispX);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0012
+@SYMTestCaseDesc		Positive testing - Fastpath with notification checking DisplayXTime
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Integration Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check fastpath does not cause any problem to notifications
+@SYMTestActions			
+	All compositions are autonomous:
+	Compose an empty scene
+	A) Create a scene containing a screen sized opaque element A
+	Commit the scene
+	Make a content update for available (iAvailable) and display time (aDisplayed)
+	Wait for the request status objects to complete
+	
+	B) Add a small element B in front of A
+	Compose the scene
+	Content update for both A and B, set display 10 times to A, set display 5 times to B 
+	Wait for the 5 times
+	
+	C) Remove element B
+	Commit the scene
+	Compose the scene
+	Wait for the 10 times
+@SYMTestExpectedResults
+	Composition should fastpath in sections A and C
+	Elements A's 10 times should not complete before element B's 5 times
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0012L()
+	{
+    iTestName = _L("FASTPATH_0012");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+	FastpathDispXNotificationsTestL(ETrue);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0013
+@SYMTestCaseDesc		Positive testing - Fastpath with notification checking DisplayXTime
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Integration Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check fastpath does not cause any problem to notifications
+@SYMTestActions			
+	Repeats GRAPHICS-OPENWFC-FASTPATH-0013 in non autonomous mode.
+	This allows gives the added benefit of accurate counting of wfcCompose calls, checking the displayXtimes
+	notifications only complete after the correct number of composes.
+@SYMTestExpectedResults
+	Composition should fastpath in sections A and C
+	Both should complete after their expect amount of compose calls with no errors
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0013L()
+	{
+    iTestName = _L("FASTPATH_0013");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    FastpathDispXNotificationsTestL(EFalse);
+	}
+
+/*
+ *	NEGATIVE TESTING
+ * */
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0020
+@SYMTestCaseDesc		Negative testing - Fastpath one-element scene
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check a scene including a full screen element with source alpha cannot be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Create a scene containing a screen sized element 
+	Enable WFC_TRANSPARENCY_SOURCE  
+	Set the value of WFC_ELEMENT_SOURCE between 0 and 255 (non-inclusive).
+	Compose the scene
+@SYMTestExpectedResults
+	The scene cannot be fastpathed.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0020L()
+	{
+    iTestName = _L("FASTPATH_0020");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												EUidPixelFormatARGB_8888,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    //set per pixel alpha
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_SOURCE);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using source alpha"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    
+    for (TInt i=0;i<=256;i+=64)
+    	{
+		i=(i==256)?255:i;
+		iUtility->FillSurfaceL(surface, 0, TRgb(0,255,0,i));
+		err = iUtility->SubmitUpdate(surface, 0, NULL);
+		ASSERT_EQUALS(err,KErrNone);
+		WaitL(iCompositionPause);
+    	}
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0021
+@SYMTestCaseDesc		Negative testing - Fastpath one-element scene
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High	
+@SYMTestPurpose			Check a scene including a full screen element with global alpha cannot be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Create a scene containing a screen sized element 
+	Enable WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA
+	Set the value of WFC_ELEMENT_GLOBAL_ALPHA between 0 and 255 (non-inclusive)
+	Compose the scene
+@SYMTestExpectedResults
+	The scene cannot be fastpathed.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0021L()
+	{
+    iTestName = _L("FASTPATH_0021");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												EUidPixelFormatXRGB_8888,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    //set element global alpha
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA);
+	wfcSetElementAttribf(iDevice, fpElement, WFC_ELEMENT_GLOBAL_ALPHA, 0.0f);
+	
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+	iUtility->FillSurfaceL(surface, 0, KGreen);
+	err = iUtility->SubmitUpdate(surface, 0, NULL);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using element global alpha not fully opaque"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    
+    for (TInt i=0;i<=256;i+=64)
+    	{
+		i=(i==256)?255:i;
+		wfcSetElementAttribf(iDevice, fpElement, WFC_ELEMENT_GLOBAL_ALPHA, (TReal32)i/255);
+		if(i == 255)
+			{
+#ifdef BREAKPOINT_FASTPATH
+			__BREAKPOINT();
+#endif
+			}
+        if(i == 255)
+            {
+            LOG(("OpenWFTest: Expecting FASTPATH after next commit - using element global alpha fully opaque"));
+            }
+        else
+            {
+            LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using element global alpha not fully opaque"));
+            }
+	    wfcCommit(iDevice, iContext, WFC_TRUE);
+	    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+		WaitL(iCompositionPause);
+    	}
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0022
+@SYMTestCaseDesc		Negative testing - Fastpath one-element scene
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High	
+@SYMTestPurpose			Check a scene with RGB 565 format cannot be fastpathed
+@SYMTestActions			
+	Create a scene containing a screen sized element with an unsupported source format, such as 565
+	Compose the scene
+@SYMTestExpectedResults
+	The scene cannot be fastpathed.	
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0022L()
+	{
+    iTestName = _L("FASTPATH_0022");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    //NON fastpathable pixel format
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												iNonFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using non fastpathable pixel format"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+	ReleaseOnScreenStream();
+
+	ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0023
+@SYMTestCaseDesc		Negative testing - Fastpath one-element scene
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check a scene with mask settings cannot be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Create a scene containing a screen sized element A
+	Enable WFC_TRANSPARENCY_MASK
+	Set a value to WFC_ELEMENT_MASK
+	Create a mask element, set the size to be the same as element A's desitnation rectangle 
+	Compose the scene
+@SYMTestExpectedResults
+	The scene cannot be fastpathed.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0023L()
+	{
+    iTestName = _L("FASTPATH_0023");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+    TSurfaceId surfaceMask = iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceMask.IsNull());
+    WFCMask mask = wfcCreateMaskFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceMask), NULL);
+    err = iUtility->SubmitUpdate(surfaceMask, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    
+    //set the mask to fpElement
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, WFC_TRANSPARENCY_MASK);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_MASK, mask);
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using a mask"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest:Fastpath - still off - using a mask"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    iUtility->FillSurfaceL(surfaceMask, 0, KBlack);
+    err = iUtility->SubmitUpdate(surfaceMask, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);	
+ 
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0024
+@SYMTestCaseDesc		Negative testing - Fastpath one-element scene
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High
+@SYMTestPurpose			Check a scene with alpha and mask settings cannot be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Create a scene containing a screen sized element A
+	Enable WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA
+	Set the value of WFC_ELEMENT_GLOBAL_ALPHA to be 255 
+	Enable WFC_TRANSPARENCY_MASK
+	Set a value to WFC_ELEMENT_MASK 	
+	Create a mask element, set it the same size of element A's destination rectangle
+	Compose the scene
+@SYMTestExpectedResults
+	The scene cannot be fastpathed.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0024L()
+	{
+    iTestName = _L("FASTPATH_0024");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+												iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+    TSurfaceId surfaceMask = iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surfaceMask.IsNull());
+    WFCMask mask = wfcCreateMaskFromStream(iDevice, iContext, reinterpret_cast<WFCNativeStreamType>(&surfaceMask), NULL);
+    err = iUtility->SubmitUpdate(surfaceMask, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    
+    //set the mask and global alpha for use with fpElement
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_MASK, mask);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_TRANSPARENCY_TYPES, 
+    		WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA|WFC_TRANSPARENCY_MASK);
+    //set global alpha to fully opaque
+    wfcSetElementAttribf(iDevice, fpElement, WFC_ELEMENT_GLOBAL_ALPHA, 1.0f);
+    
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using a mask and global alpha"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - still off - using a mask and global alpha"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    iUtility->FillSurfaceL(surfaceMask, 0, KBlack);
+    err = iUtility->SubmitUpdate(surfaceMask, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);	
+ 
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0025
+@SYMTestCaseDesc		Negative testing - Fastpath a scene with scaling element
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High	
+@SYMTestPurpose			Check a scene with scaling cannot be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Create an element containing source size smaller than full screen destination size
+	Add to scene and compose
+@SYMTestExpectedResults
+	The scene cannot be fastpathed.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0025L()
+	{
+    iTestName = _L("FASTPATH_0025");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+	
+	//create half screen size surface
+	TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth/2,iFastpathableHeight/2),
+												iFastpathablePixelFormat,
+												iStride, iContiguous, iMaxBuffers);
+	ASSERT_FALSE(surface.IsNull());
+
+	WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+	TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+	wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+	
+	//note the source is only half the size of the screen
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iHalfSizeRect);
+	//set destination to fullscreen, causing it to stretch
+	wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit - using a mask and global alpha"));
+	wfcCommit(iDevice, iContext, WFC_TRUE);
+	wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+	ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+	LOG(("OpenWFTest: Fastpath - still off... - source not equal to destination"));
+	
+	iUtility->FillSurfaceL(surface, 0, KGreen);
+	err = iUtility->SubmitUpdate(surface, 0, NULL);
+	ASSERT_EQUALS(err,KErrNone);
+	WaitL(iCompositionPause);
+	
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KGreen,iTolerance));
+	ReleaseOnScreenStream();
+
+	ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+	wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID			GRAPHICS-OPENWFC-FASTPATH-0026
+@SYMTestCaseDesc		Negative testing - Fastpath a scene with rotation
+@SYMREQ					
+@SYMPREQ						PREQ417-54885
+@SYMTestType				Unit Test
+@SYMTestPriority		High	
+@SYMTestPurpose			Check a scene with rotation cannot be fastpathed
+@SYMTestActions			
+	All compositions are autonomous:
+	Create a scene containing a screen size element 
+	Compose the scene
+	Rotate the element with 90, 180 and 270 degrees
+	Compose the scene
+@SYMTestExpectedResults
+	The scene can be fastpathed only for the first scene commited composition.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0026L()
+	{
+    iTestName = _L("FASTPATH_0026");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    SetupEmptySceneL();
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(iDevice, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    TInt err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WFCElement fpElement = wfcCreateElement(iDevice, iContext, NULL);
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE_RECTANGLE, 4, iFullScreenRect);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_DESTINATION_RECTANGLE, 4, iFullScreenRect);
+    
+    wfcInsertElement(iDevice, fpElement, WFC_INVALID_HANDLE);
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now ON"));
+    
+    iUtility->FillSurfaceL(surface, 0, KGreen);
+    err = iUtility->SubmitUpdate(surface, 0, NULL);
+    ASSERT_EQUALS(err,KErrNone);
+    WaitL(iCompositionPause);	
+ 
+    //Set 90 degree rotation
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE_ROTATION, WFC_ROTATION_90);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    iUtility->FillSurfaceL(surface, 0, KBlue);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now OFF"));
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+	ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KBlue,iTolerance));
+	ReleaseOnScreenStream();
+
+	
+    //Set 180 degree rotation
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE_ROTATION, WFC_ROTATION_180);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    iUtility->FillSurfaceL(surface, 0, KMagenta);
+    LOG(("OpenWFTest: Expecting FASTPATH after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now OFF"));
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KMagenta,iTolerance));
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ReleaseOnScreenStream();
+
+    //Set 270 degree rotation
+    wfcSetElementAttribi(iDevice, fpElement, WFC_ELEMENT_SOURCE_ROTATION, WFC_ROTATION_270);
+    
+#ifdef BREAKPOINT_FASTPATH
+    __BREAKPOINT();
+#endif
+    iUtility->FillSurfaceL(surface, 0, KBrown);
+    LOG(("OpenWFTest: Expecting COMPOSITION after next commit"));
+    wfcCommit(iDevice, iContext, WFC_TRUE);
+    wfcFence(iDevice, iContext, iEGLDisplay, iSync);
+    ASSERT_EQUALS(eglClientWaitSyncKHR(iEGLDisplay,iSync,0,(EGLTimeKHR)EGL_FOREVER_KHR),EGL_CONDITION_SATISFIED_KHR);
+    LOG(("OpenWFTest: Fastpath - now OFF"));
+    WaitL(iCompositionPause);
+    
+    ASSERT_TRUE(AcquireOnScreenStream());
+    ASSERT_TRUE(CheckOnScreenStreamRect(iFullScreenTRect,KBrown,iTolerance));
+    ASSERT_TRUE(CheckOnScreenReferenceImage());
+    ReleaseOnScreenStream();
+
+    ASSERT_EQUALS(wfcGetError(iDevice),WFC_ERROR_NONE);
+    wfcDestroySource(iDevice, fpSource);  
+	}
+
+/*
+@SYMTestCaseID          GRAPHICS-OPENWFC-FASTPATH-0027
+@SYMTestCaseDesc        Negative testing - Pass in bad parameter values 
+@SYMREQ                 
+@SYMPREQ                PREQ417-54885
+@SYMTestType            Unit Test
+@SYMTestPriority        High    
+@SYMTestPurpose         Check invalid parameter values passed in OWF APIs
+@SYMTestActions 
+    Use invalid values to call OWF APIs
+@SYMTestExpectedResults
+    Test should pass without panic.
+*/
+void COpenwfTest::GRAPHICS_OPENWFC_FASTPATH_0027L()
+    {
+    iTestName = _L("FASTPATH_0027");
+    INFO_PRINTF2(_L("GRAPHICS_OPENWFC_%SL()"),&iTestName);
+    LOGL((_L("OpenWFTest: GRAPHICS_OPENWFC_%SL()"),&iTestName));
+    
+    WFCint deviceId;
+    WFCint filterList[] = { WFC_DEVICE_FILTER_SCREEN_NUMBER, WFC_DEFAULT_SCREEN_NUMBER, WFC_NONE};
+    ASSERT_TRUE(wfcEnumerateDevices(&deviceId, 1, filterList) == 1);
+
+    WFCint attribList = 1;
+    WFCDevice device = wfcCreateDevice(deviceId, &attribList);
+    WFCContext onScreenContext = wfcCreateOnScreenContext(NULL, WFC_DEFAULT_SCREEN_NUMBER, NULL);
+    WFCContext offScreenContext = wfcCreateOffScreenContext(NULL, WFC_DEFAULT_SCREEN_NUMBER, NULL);
+
+    WFCfloat value = 1.0;
+    wfcGetContextAttribi(NULL, iContext, WFC_CONTEXT_TARGET_HEIGHT);
+    wfcSetContextAttribi(NULL, iContext, WFC_CONTEXT_ROTATION, WFC_ROTATION_0);
+    wfcGetContextAttribfv(NULL, iContext, WFC_CONTEXT_ROTATION, NULL, &value);
+    wfcSetContextAttribfv(NULL, iContext, WFC_CONTEXT_ROTATION, NULL, &value);
+    
+    TSurfaceId surface=iUtility->CreateSurfaceL(TSize(iFastpathableWidth,iFastpathableHeight),
+                                                iFastpathablePixelFormat,
+                                                iStride, iContiguous, iMaxBuffers);
+    ASSERT_FALSE(surface.IsNull());
+
+    WFCSource fpSource = wfcCreateSourceFromStream(NULL, iContext,reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    wfcCreateMaskFromStream(NULL, iContext, reinterpret_cast<WFCNativeStreamType>(&surface), NULL);
+    WFCElement fpElement = wfcCreateElement(NULL, iContext, NULL);
+    wfcSetElementAttribi(NULL, fpElement, WFC_ELEMENT_SOURCE, fpSource);
+    wfcSetElementAttribf(NULL, fpElement, WFC_ELEMENT_SOURCE, NULL);
+    wfcSetElementAttribiv(NULL, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    wfcSetElementAttribfv(NULL, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    wfcSetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    wfcSetElementAttribfv(iDevice, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    
+    wfcGetElementAttribi(NULL, fpElement, WFC_ELEMENT_SOURCE);
+    wfcGetElementAttribf(NULL, fpElement, WFC_ELEMENT_SOURCE);
+    wfcGetElementAttribiv(NULL, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    wfcGetElementAttribiv(iDevice, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    wfcGetElementAttribfv(NULL, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    wfcGetElementAttribfv(iDevice, fpElement, WFC_ELEMENT_SOURCE, NULL, NULL);
+    
+    wfcInsertElement(NULL, fpElement, NULL);
+    wfcGetElementAbove(NULL, fpElement);
+    wfcGetElementBelow(NULL, fpElement);
+        
+    WFCDeviceAttrib devAttrib = WFC_DEVICE_ID;
+    wfcGetDeviceAttribi(NULL, devAttrib);
+
+    wfcActivate(NULL, iContext);
+    wfcActivate(iDevice, NULL);
+    wfcDeactivate(NULL, iContext);
+    wfcDeactivate(iDevice, NULL);
+    wfcCompose(NULL, iContext, WFC_TRUE);
+    wfcCompose(iDevice, NULL, WFC_TRUE);
+    wfcCommit(NULL, iContext, WFC_TRUE);
+    wfcCommit(iDevice, NULL, WFC_TRUE);
+    wfcFence(NULL, iContext, iEGLDisplay, iSync);
+    wfcFence(iDevice, NULL, iEGLDisplay, iSync);
+
+    WFCMask mask = WFC_INVALID_HANDLE;
+    wfcDestroyMask(NULL, mask);
+    wfcRemoveElement(NULL, fpElement);
+    wfcDestroyElement(NULL, fpElement);
+    wfcDestroySource(NULL, fpSource);  
+    wfcDestroyContext(NULL, onScreenContext);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/src/openwftestserver.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,59 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+*/
+
+#include <test/ctefunitserver.h>
+#include "openwftest.h"
+
+_LIT( KServerName, "openwftestserver" );
+
+GLDEF_C const TTestName ServerName()
+/**
+ * ServerName
+ *
+ * @return - The TEF server name
+ */
+    {
+    TTestName serverName(KServerName);
+    return serverName;
+    }
+
+GLDEF_C CTestSuite* CreateTestSuiteL()
+/**
+ * Create the overall test suite.
+ *
+ * @return - The top level suite
+ */
+    {
+    START_SUITE;
+
+    ADD_TEST_SUITE( COpenwfTest );
+
+    END_SUITE;
+    }
+
+GLDEF_C CTestStep* CreateTEFTestStep(const TDesC& , CTEFUnitServer& /* aServer */)
+/**
+ * Create individual test steps, outside the suite.
+ */
+    {
+    // Initialise test step object to NULL if no TEF step is found
+    CTestStep* testStep = NULL;
+
+    return testStep;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwftest/src/surfaceutility.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,669 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+*/
+
+#include <e32std.h>
+#include <imageconversion.h>
+#include <stdlib.h>
+#include <s32file.h> 
+#include "surfaceutility.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+WFC_API_CALL WFCNativeStreamType WFC_APIENTRY
+extwfcGetOnScreenStream(WFCDevice dev, WFCContext context) WFC_APIEXIT;
+
+#ifdef __cplusplus
+}
+#endif
+
+CSurfaceUtility::CSurfaceUtility()
+: iSurfaces(NULL)
+	{
+	}
+	
+CSurfaceUtility* CSurfaceUtility::NewL()
+	{
+	CSurfaceUtility* utility = new (ELeave)CSurfaceUtility();
+	CleanupStack::PushL(utility);
+	utility->ConstructL();
+	CleanupStack::Pop(utility);
+	return utility;
+	}
+	
+void CSurfaceUtility::ConstructL()
+	{
+	TInt r = iManager.Open();
+	if (r != KErrNone)
+		{
+		LOG(("Surface manager failed to open: %d", r));
+		User::Leave(r);
+		}
+	
+	r = iSurfaceUpdateSession.Connect();
+	if (r != KErrNone)
+		{
+		LOG(("Failed to connect to update server: %d", r));
+		User::Leave(r);
+		}	
+	}
+
+CSurfaceUtility::~CSurfaceUtility()
+	{
+	DestroyAll();
+
+	iSurfaces.Close();
+
+	iManager.Close();
+
+	iSurfaceUpdateSession.Close();	
+	}
+
+TBool CSurfaceUtility::DestroyAll()
+	{
+	TInt err = 	KErrNone;
+	TInt jj = iSurfaces.Count() - 1;
+	if (jj<0)
+		return EFalse;
+	for (; jj >= 0; jj--)
+		{
+		err = iManager.CloseSurface(iSurfaces[jj]);
+		if (err!=KErrNone)
+			{
+			LOG(("Error closing surface: 0x%X\n", err));
+			}
+		TInt offset;
+		err = iManager.GetBufferOffset(iSurfaces[jj],0,offset);
+		if (err==KErrNone)
+		    {
+            LOG(("Error: closed surface still accessible: index %i surface %08X %08X %08X %08X\n", jj, iSurfaces[jj]));
+		    }
+		}
+	iSurfaces.Reset();
+	return ETrue;
+	}
+
+/***************************************
+ * The aim of the THeapSurfaceArray is to locally switch in the specified heap for any array operation
+ ***************************************/
+
+CSurfaceUtility::RHeapSurfaceArray::RHeapSurfaceArray(RHeapSurfaceArray* aUseExternalArray)
+	:	iUseArray(aUseExternalArray?aUseExternalArray->iUseArray:&this->iLocalArray),
+	iExternalHeapRef(aUseExternalArray?aUseExternalArray->iExternalHeapRef:User::Heap())
+	{
+	
+	}
+/************************************
+ * The following methods have been used by the surfaceutility... some require the heap wrapping, and some don't
+ * Three strategies are needed for 7 methods...
+ * Some methods only read the existing objects, so don't need a heap swap at all
+ * Leaving methods have to use PopAndDestroy strategy to restore the heap on leaving or success
+ * Non-leaving methods must not call PushL, so directly make SwitchHeap calls!
+ ************************************/
+
+// PopAndDestroy method to restore the heap
+/*static*/ void	CSurfaceUtility::RHeapSurfaceArray::PopHeap(void* aHeapPtr)
+	{
+	RHeap* heapPtr=(RHeap*)aHeapPtr;
+	User::SwitchHeap(heapPtr);
+	}
+
+TSurfaceId& CSurfaceUtility::RHeapSurfaceArray::operator[](TUint aIndex)
+	{
+	return iUseArray->operator[](aIndex);
+	}
+
+// Close only closes the local array, while Reset resets the active array (may be external)
+void CSurfaceUtility::RHeapSurfaceArray::Close()
+	{
+	iLocalArray.Close();
+	}
+
+TInt CSurfaceUtility::RHeapSurfaceArray::Count() const
+	{
+	return iUseArray->Count();
+	}
+
+// Close only closes the local array, while Reset resets the active array (may be external)
+inline void CSurfaceUtility::RHeapSurfaceArray::Reset()
+	{
+	iUseArray->Reset();
+	}
+
+void CSurfaceUtility::RHeapSurfaceArray::AppendL(const TSurfaceId &anEntry)
+	{
+	iUseArray->AppendL(anEntry);
+	}
+
+TInt CSurfaceUtility::RHeapSurfaceArray::Find(const TSurfaceId &anEntry) const
+	{
+	return iUseArray->Find(anEntry);
+	}
+
+void CSurfaceUtility::RHeapSurfaceArray::Remove(TInt anIndex)
+	{
+	iUseArray->Remove(anIndex);
+	}
+
+/**
+Cleanup stack helper object, holding references to both utility and surface, so
+that the standard Close() semantics can be used.
+*/
+class TSurfaceCleanup
+	{
+public:
+	TSurfaceCleanup(CSurfaceUtility& aUtility, TSurfaceId& aSurface)
+		: iUtility(aUtility), iSurface(aSurface)
+		{}
+	void Close()
+		{
+		// Removes the surface from the list of surfaces to clean up, and closes
+		// the surface reference.
+		iUtility.DestroySurface(iSurface);
+		}
+private:
+	CSurfaceUtility& iUtility;
+	TSurfaceId& iSurface;
+	};
+
+/**
+Get the size of a surface.
+
+@param aSurface The surface to get the size for.
+@return The size in pixels, or empty on failure.
+*/
+TSize CSurfaceUtility::SurfaceSize(const TSurfaceId& aSurface)
+	{
+	RSurfaceManager::TInfoBuf infoBuf;
+	RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
+
+	if (iManager.SurfaceInfo(aSurface, infoBuf) == KErrNone)
+		{
+		return info.iSize;
+		}
+
+	return TSize();
+	}
+
+/**
+Create a surface using the surface manager.
+
+Stores the ID for tear down, as well as returning it.
+
+@param aSize Dimensions of the surface.
+@param aPixelFormat	UID of the pixel format.
+@param aStride	Stride value for the surface (usually bytes per pixel * width)
+@param aContiguous  Contiguous flag for creating surfaces
+@param aBuffers Number of buffers in the surface
+@leave May leave due to lack of memory.
+@return New surface's ID.
+*/
+TSurfaceId CSurfaceUtility::CreateSurfaceL(const TSize& aSize, TUidPixelFormat aPixelFormat, TInt aStride, TBool aContiguous, TInt aBuffers)
+	{
+	RSurfaceManager::TSurfaceCreationAttributesBuf bf;
+	RSurfaceManager::TSurfaceCreationAttributes& b = bf();
+	if (aStride<aSize.iWidth*BytesPerPixelL(aPixelFormat))
+	    {
+	    User::Leave(KErrOverflow);
+	    }
+	b.iSize.iWidth = aSize.iWidth;
+	b.iSize.iHeight = aSize.iHeight;
+	b.iBuffers = aBuffers;				// number of buffers in the surface
+	b.iPixelFormat = aPixelFormat;
+	b.iStride = aStride;		// Number of bytes between start of one line and start of next
+	b.iOffsetToFirstBuffer = 0;	// way of reserving space before the surface pixel data
+	b.iAlignment = 4;			// alignment, 1,2,4,8 byte aligned
+	b.iContiguous = aContiguous;
+	b.iMappable = ETrue;
+
+	TSurfaceId surface = TSurfaceId::CreateNullId();
+
+	User::LeaveIfError(iManager.CreateSurface(bf, surface));
+	iSurfaces.AppendL(surface);
+	return surface;
+	}
+
+/**
+A helper function that returns the bytes per pixel for a given pixel format uid
+
+@param aPixelFormat Pixel format UID to convert
+@return The bytes per pixel
+*/
+TInt CSurfaceUtility::BytesPerPixelL(TUidPixelFormat aPixelFormat)
+	{
+	TInt bytesPerPixel = 0;
+	switch (aPixelFormat)
+		{
+		case EUidPixelFormatXRGB_8888:
+		case EUidPixelFormatARGB_8888:
+		case EUidPixelFormatARGB_8888_PRE:
+			{
+			bytesPerPixel = 4;
+			break;
+			}
+		case EUidPixelFormatXRGB_4444:
+		case EUidPixelFormatARGB_4444:
+		case EUidPixelFormatRGB_565:
+			{
+			bytesPerPixel = 2;
+			break;
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);
+			break;
+			}
+		}
+	return bytesPerPixel;
+	}
+
+/**
+Fill buffer 0 of the given surface with a color.
+
+@param aSurface	The surface to be filled.
+@param aColor	The color to fill it with.
+*/
+void CSurfaceUtility::FillSurfaceL(TSurfaceId& aSurface, const TRgb& aColor)
+	{
+    FillSurfaceL(aSurface, 0, aColor);
+	}
+
+/**
+Fill a specified buffer number of the given surface with a color.
+
+@param aSurface	The surface to be filled.
+@param aBuffer 	The buffer to fill.
+@param aColor	The color to fill it with.
+*/
+void CSurfaceUtility::FillSurfaceL(TSurfaceId& aSurface, TInt aBuffer, const TRgb& aColor)
+	{
+	RSurfaceManager::TInfoBuf infoBuf;
+	RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
+
+	User::LeaveIfError(iManager.SurfaceInfo(aSurface, infoBuf));
+	TUint32 color = 0;
+	TBool use16 = EFalse;
+	TInt numBuffers = info.iBuffers;
+	if (aBuffer < 0 || aBuffer >= numBuffers)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	if (info.iSize.iHeight<0 || info.iSize.iWidth<0 || info.iStride<0)
+		{
+		User::Leave(KErrCorrupt);
+		}
+	if (info.iSize.iHeight==0 || info.iSize.iWidth==0 || info.iStride==0)
+		{
+		User::Leave(KErrNotReady);
+		}
+
+	switch (info.iPixelFormat)
+		{
+		case EUidPixelFormatXRGB_8888:
+			{
+			color = aColor.Color16MU();
+			break;
+			}
+		case EUidPixelFormatARGB_8888:
+			{
+			color = aColor.Color16MA();
+			break;
+			}
+		case EUidPixelFormatARGB_8888_PRE:
+			{
+			color = aColor.Color16MAP();
+			break;
+			}
+		case EUidPixelFormatXRGB_4444:
+		case EUidPixelFormatARGB_4444:
+			{
+			color = aColor.Color4K();
+			use16 = ETrue;
+			break;
+			}
+		case EUidPixelFormatRGB_565:
+			{
+			color = aColor.Color64K();
+			use16 = ETrue;
+			break;
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);
+			break;
+			}
+		}
+
+	RChunk chunk;
+	User::LeaveIfError(iManager.MapSurface(aSurface, chunk));
+	CleanupClosePushL(chunk);
+
+	TInt offsetToBuffer;
+	User::LeaveIfError(iManager.GetBufferOffset(aSurface, aBuffer, offsetToBuffer));
+	TUint8* surfacePtr = chunk.Base() + offsetToBuffer;
+	TUint8* linePtr = surfacePtr;
+
+	if (use16)
+		{
+		if ( info.iSize.iWidth*2>info.iStride)
+			{
+			User::Leave(KErrOverflow);
+			}
+		TUint16* ptr = reinterpret_cast<TUint16*>(surfacePtr);
+
+		// Fill first line
+		for (TInt xx = 0; xx < info.iSize.iWidth; xx++)
+			{
+			ptr[xx] = (TUint16)color;
+			}
+		}
+	else
+		{
+		if ( info.iSize.iWidth*4>info.iStride)
+			{
+			User::Leave(KErrOverflow);
+			}
+		TUint32* ptr = reinterpret_cast<TUint32*>(surfacePtr);
+
+		// Fill first line
+		for (TInt xx = 0; xx < info.iSize.iWidth; xx++)
+			{
+			ptr[xx] = color;
+			}
+		}
+
+	// Now copy that to the other lines
+	for (TInt yy = 1; yy < info.iSize.iHeight; yy++)
+		{
+		linePtr += info.iStride;
+		Mem::Copy(linePtr, surfacePtr, info.iSize.iWidth * BytesPerPixelL(info.iPixelFormat));
+		}
+	
+	CleanupStack::PopAndDestroy(/* chunk */);
+	}
+
+/**
+Destroy a surface.
+
+As well as destroying the surface, it is removed from the set held for
+destruction during tear down.
+
+@param aSurface	The surface to be destroyed.
+*/
+void CSurfaceUtility::DestroySurface(TSurfaceId& aSurface)
+	{
+	TInt index = iSurfaces.Find(aSurface);
+	
+	if (index != KErrNotFound)
+		{
+		iSurfaces.Remove(index);
+		}
+
+	TInt err = iManager.CloseSurface(aSurface);
+	if (err!=KErrNone)
+		LOG(("Error closing surfaces: 0x%X\n", err));
+	}
+
+/**
+Get surface header information
+
+@param aSurface A surface to get the header info from.
+@param aInfo Returned package info of the surface header.
+
+@return KErrNone if successful, KErrArgument if the surface ID does not refer to a surface,
+KErrAccessDenied if the surface is not open in the current process, otherwise a system wide
+error code.
+ */
+TInt CSurfaceUtility::GetHeader(const TSurfaceId& aSurface, RSurfaceManager::TInfoBuf& aInfo) 
+    {
+    return iManager.SurfaceInfo(aSurface, aInfo);
+    }
+
+/**
+Get buffer pointer to a surface
+
+@param aSurface Surface of the buffer pointer.
+@param aNumOfBuffer A number of buffer.
+@param aChunk A chunk of memory.
+
+@return A buffer pointer of the surface.
+ */
+TUint8* CSurfaceUtility::GetBufferPointerL(const TSurfaceId& aSurface, TInt aNumOfBuffer, RChunk& aChunk) 
+    {
+    TInt offsetToBuffer;
+    User::LeaveIfError(iManager.MapSurface(aSurface, aChunk));
+    User::LeaveIfError(iManager.GetBufferOffset(aSurface, aNumOfBuffer, offsetToBuffer));
+    TUint8* surfacePtr = aChunk.Base() + offsetToBuffer;
+    return surfacePtr;
+    }
+
+/**
+Get pixel color at a position.
+
+@param aInfo Package info of a surface.
+@param aPixelData Surface buffer pointer.
+@param aPosition Position of the pixel.
+
+@return Color of the pixel position.
+*/
+TRgb CSurfaceUtility::GetPixelL(RSurfaceManager::TInfoBuf& aInfo, TAny* aPixelData, TPoint aPosition) 
+    {
+    RSurfaceManager::TSurfaceInfoV01& info = aInfo();
+    TInt stride = info.iStride;
+    TUidPixelFormat pixelFormat = info.iPixelFormat;
+    TInt bytesPerPixel = BytesPerPixelL(pixelFormat);
+    TInt pixelStride = stride / bytesPerPixel;
+    TUint pixel = aPosition.iY * pixelStride + aPosition.iX;
+    TUint* pixels = reinterpret_cast< TUint* >( aPixelData );
+    TRgb colour;
+    colour.SetInternal(pixels[ pixel ]);
+    return colour;
+    }
+
+/**
+Check pixel color within a rectangle is as expected.
+It checks every color channel of every pixel within the rectangle.
+
+@param aSurface The surface to be checked.
+@param aRect The rectangle for pixel checking.
+@param aNumOfBuffer Number of buffer.
+@param aExpectedColor The expected color.
+@param aTolerance A tolerance value.
+
+@return EFalse if a color channel of a pixel is outside the tolerance range. 
+        ETrue if all pixel colors are within the tolerance range.
+*/
+TBool CSurfaceUtility::CheckRectColor(const TSurfaceId& aSurface, TRect& aRect, TInt aNumOfBuffer, const TRgb& aExpectedColor, TInt aTolerance) 
+    {
+    RSurfaceManager::TInfoBuf infoBuf;
+    RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
+    TInt error = GetHeader(aSurface, infoBuf);
+    if (error != KErrNone)
+    	{
+		RDebug::Printf("Line %d GetHeader failed",__LINE__);
+		return EFalse;
+    	}
+
+    RChunk chunk;
+    TUint8* surfacePtr = NULL;
+    TRAP_IGNORE(surfacePtr = GetBufferPointerL(aSurface, aNumOfBuffer, chunk));
+    if (!surfacePtr)
+    	{
+		RDebug::Printf("Line %d GetBufferPointerL failed",__LINE__);
+		return EFalse;
+    	}
+    
+    TRgb color;
+    // Check every colour channel of every pixel is within the tolerance
+    for (TInt ii = aRect.iTl.iX; ii < aRect.iBr.iX; ++ii)
+        {
+        for (TInt jj = aRect.iTl.iY; jj < aRect.iBr.iY; ++jj)
+            {
+            color = GetPixelL(infoBuf, surfacePtr, TPoint(ii, jj));      
+            TBool checkR = (color.Red() <= (aExpectedColor.Red() + aTolerance) && color.Red() >= (aExpectedColor.Red() - aTolerance));
+            TBool checkG = (color.Green() <= (aExpectedColor.Green() + aTolerance) && color.Green() >= (aExpectedColor.Green() - aTolerance));
+            TBool checkB = (color.Blue() <= (aExpectedColor.Blue() + aTolerance) && color.Blue() >= (aExpectedColor.Blue() - aTolerance));
+            if (!checkR || !checkG || !checkB)
+                {
+                RDebug::Printf("At x=%d y=%d CheckRectColor has failed:",ii,jj);
+                RDebug::Printf("Expected Red %d - Actual Red %d",aExpectedColor.Red(),color.Red());
+                RDebug::Printf("Expected Green %d - Actual Green %d",aExpectedColor.Green(),color.Green());
+                RDebug::Printf("Expected Blue %d - Actual Blue %d",aExpectedColor.Blue(),color.Blue());
+                return EFalse;            
+                }               
+            }
+        }
+    return ETrue;
+    }
+
+/**
+Save on screen image to a .tga file
+
+@param aSurface A surface to be saved
+@param aBufferNumber The surface's buffer number
+@param aDestination The path and name of the tga to save eg c:\\test\\img\\image1.tga
+@return ETrue on successful calls
+        Fails if GetBufferPointerL returns NULL pointer
+ */
+TBool CSurfaceUtility::SaveResultImageTGAL(const TSurfaceId& aSurface, TInt aBufferNumber, TDesC& aDestination)
+    {
+    RSurfaceManager::TInfoBuf infoBuf;
+    RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
+    User::LeaveIfError(GetHeader(aSurface, infoBuf));
+    TInt stride = info.iStride;
+    TSize surfaceSize = info.iSize;
+    TUidPixelFormat pixelFormat = info.iPixelFormat;
+    TInt bytesPerPixel = BytesPerPixelL(pixelFormat);
+    TInt widthInBytes = surfaceSize.iWidth * bytesPerPixel;
+    
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs); 
+        
+    // Create image file
+    RFileWriteStream fstream;
+    User::LeaveIfError(fstream.Replace(fs, aDestination, EFileShareAny|EFileWrite));
+    CleanupClosePushL(fstream); 
+    
+    // Write header
+    fstream.WriteUint8L(0);                 // ID Length
+    fstream.WriteUint8L(0);                 // Color map type
+    fstream.WriteUint8L(2);                 // Image type - Uncompressed, True-color Image
+    fstream.WriteUint32L(0);                // Color map specification 5 bytes
+    fstream.WriteUint8L(0);                 // Color map specification
+    fstream.WriteUint32L(0);                // Image specification - origin of image
+    fstream.WriteUint16L(static_cast<TUint16>(surfaceSize.iWidth));      // Image specification - Image width
+    fstream.WriteUint16L(static_cast<TUint16>(surfaceSize.iHeight));     // Image specification - Image height
+    fstream.WriteUint8L(32);                // Image specification - Pixel Depth (bits per pixel)
+    fstream.WriteUint8L(1 << 5);            // Image specification - Image Descriptor, Screen destination of first pixel is top left 
+
+    RChunk chunk;
+    TUint8* surfacePtr = GetBufferPointerL(aSurface, aBufferNumber, chunk);
+    if(surfacePtr == NULL)
+        {
+        CleanupStack::PopAndDestroy(2); 
+        return EFalse;
+        }
+    
+    // Write image line by line
+    for(TInt ii = 0; ii < surfaceSize.iHeight; ++ii)
+        {
+        fstream.WriteL(surfacePtr, widthInBytes); 
+        surfacePtr += stride;
+        }
+
+    fstream.CommitL();
+    chunk.Close();
+    CleanupStack::PopAndDestroy(2); 
+    
+    return ETrue;
+    }
+
+/**
+Create directory for images to be saved
+
+@param aDir Directory for images to be saved
+@return ETrue on success
+ */
+TBool CSurfaceUtility::CreateImagePath(TDesC& aDir)
+    {
+    RFs fs;
+    TInt err = fs.Connect();
+    if (err == KErrNone)
+        {
+        err = fs.MkDirAll(aDir);
+        if (err == KErrAlreadyExists)
+            {
+            err = KErrNone;
+            }
+        fs.Close();
+        }
+    return (err == KErrNone);
+    }
+    
+/**
+Submit an update to a surface to the update server.
+
+@param aSurface	The surface which has been updated.
+@param aRegion	The area of the surface affected, or NULL for all of it.
+*/
+TInt CSurfaceUtility::SubmitUpdate(const TSurfaceId& aSurface,TInt aBufferNumber, const TRegion* aRegion)
+	{
+	if (!iSurfaceUpdateSession.Handle())
+	    {
+	    iSurfaceUpdateSession.Connect();
+	    }
+    if (!iSurfaceUpdateSession.Handle())
+        {
+        LOG(("Error - SUS client not started!"));
+        return KErrNotReady;
+        }
+    else
+        {
+        TInt err =iSurfaceUpdateSession.SubmitUpdate(KAllScreens, aSurface, aBufferNumber, aRegion); 
+        if (err!=KErrNone)
+            LOG(("Error submitting update: 0x%X\n", err));
+        return err;
+        }
+	}
+
+void CSurfaceUtility::NotifyWhenDisplayed(TRequestStatus& aStatusDisplayed, TTimeStamp& aTimeStamp)
+    {
+    iSurfaceUpdateSession.NotifyWhenDisplayed(aStatusDisplayed, aTimeStamp);
+    }
+
+void CSurfaceUtility::NotifyWhenDisplayedXTimes(TInt aCount, TRequestStatus& aStatusDisplayedX)
+    {
+    iSurfaceUpdateSession.NotifyWhenDisplayedXTimes(aCount, aStatusDisplayedX);
+    }
+
+void CSurfaceUtility::NotifyWhenAvailable(TRequestStatus& aStatusAvailable)
+    {
+    iSurfaceUpdateSession.NotifyWhenAvailable(aStatusAvailable);
+    }
+
+SymbianStreamType CSurfaceUtility::GetOnScreenStream(WFCDevice aDev, WFCContext aContext)
+    {
+    return reinterpret_cast<SymbianStreamType>(wfcGetOnScreenStream(aDev, aContext));
+    }
+
+
+
--- a/graphicsdeviceinterface/bitgdi/group/BLD.INF	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/group/BLD.INF	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -92,6 +92,7 @@
 ../tbit/scripts/bitgditest_t_outlineandshadowfonts.script	z:/bitgditest/bitgditest_t_outlineandshadowfonts.script
 ../tbit/scripts/toutlineandshadow.ini				z:/bitgditest/toutlineandshadow.ini
 ../tbit/scripts/bitgditest_t_extendedbitmap.script	z:/bitgditest/bitgditest_t_extendedbitmap.script
+../tbit/scripts/bitgditest_t_multiplescreens.script	z:/bitgditest/bitgditest_t_multiplescreens.script
 
 //exporting mbm files to epoc32
 ../tbit/mbmfiles/16romc.mbm			z:/system/data/16romc.mbm
--- a/graphicsdeviceinterface/bitgdi/group/BitgdiTest.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/group/BitgdiTest.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -41,6 +41,7 @@
 data=DATAZ_\bitgdiTest\bitgdiTest_T_Switch.script			\bitgdiTest\bitgdiTest_T_Switch.script
 data=DATAZ_\bitgdiTest\bitgditest_t_extendedbitmap.script	\bitgditest\bitgditest_t_extendedbitmap.script
 data=DATAZ_\bitgdiTest\bitgditest_t_outlineandshadowfonts.script	\bitgdiTest\bitgditest_t_outlineandshadowfonts.script
+data=DATAZ_\bitgdiTest\bitgditest_t_multiplescreens.script	\bitgdiTest\bitgditest_t_multiplescreens.script
 
 data=DATAZ_\bitgdiTest\toutlineandshadow.ini	\bitgdiTest\toutlineandshadow.ini
 
--- a/graphicsdeviceinterface/bitgdi/group/TBitgdiServer.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/group/TBitgdiServer.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -53,6 +53,7 @@
 SOURCE		TFONT.CPP
 SOURCE		toutlineandshadowfonts.cpp
 SOURCE		textendedbitmap.cpp
+SOURCE		tmultiplescreens.cpp
 
 
 LIBRARY			euser.lib
--- a/graphicsdeviceinterface/bitgdi/group/bitgditest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/group/bitgditest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -50,4 +50,6 @@
 "\epoc32\data\z\bitgditest\bitgdiTest_T_Switch.script"-"c:\bitgdiTest\bitgdiTest_T_Switch.script"
 "\epoc32\data\z\bitgditest\bitgditest_t_extendedbitmap.script"-"c:\bitgditest\bitgditest_t_extendedbitmap.script"
 "\epoc32\data\z\bitgditest\bitgditest_t_outlineandshadowfonts.script"-"c:\bitgditest\bitgditest_t_outlineandshadowfonts.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\bitgditest\bitgditest_t_multiplescreens.script"-"c:\bitgditest\bitgditest_t_multiplescreens.script"
 
--- a/graphicsdeviceinterface/bitgdi/sbit/FONTBMP.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/sbit/FONTBMP.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -65,7 +65,9 @@
 EXPORT_C void CFbsBitGcFont::Reset()
 	{
 	if (!iCopy)
+		{
 		CFbsFont::Reset();
+		}
 	else
 		{
 		iAddressPointer = NULL;
--- a/graphicsdeviceinterface/bitgdi/sbit/MAIN.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/sbit/MAIN.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -23,7 +23,6 @@
 #include <shapeinfo.h>
 #include "bitgcextradata.h"
 
-
 #define KDefaultShadowColor KRgbGray
 
 //CFbsBitGc streams - version numbers.
--- a/graphicsdeviceinterface/bitgdi/tbit/TBitgdiServer.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/TBitgdiServer.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -35,6 +35,7 @@
 #include "TFont.h"
 #include "toutlineandshadowfonts.h"
 #include "textendedbitmap.h"
+#include "tmultiplescreens.h"
 
  
 
@@ -164,6 +165,10 @@
 		{
 		testStep = new CTExtendedBitmapNegativeStep();
 		}
+	else if(aStepName == KTMultipleScreensStep)
+		{
+		testStep = new CTMultipleScreensStep();
+		}
 	TBuf<64> log;
 	_LIT(KBitgdi,"BITGDI Test %S ");
 	_LIT(KSucess,"created sucessfully.");
--- a/graphicsdeviceinterface/bitgdi/tbit/TDefect2.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/TDefect2.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -16,7 +16,6 @@
 #include <random.h>
 #include <s32file.h>
 #include <e32math.h>
-#include <hal.h>
 #include <s32mem.h>
 #include <graphics/gdi/gdiconsts.h>
 #include <e32cmn.h>
@@ -111,7 +110,6 @@
 	_LIT(KTest4,"SubTest %d: CFbsBitmap::GetPixel() performance");
 	_LIT(KTest5,"SubTest %d: Rotate/Move text");
 	_LIT(KTest6,"SubTest %d: SwapWidthAndHeight");
-	_LIT(KTest7,"SubTest %d: Create multiple screens");
 	_LIT(KTest8,"SubTest %d: Clear with non-zero origin");
 	_LIT(KTest9,"SubTest %d: DEF115395: DrawBitmap & DrawBitmapMasked with a sourceRect out of the Bitmap bounds");
 	_LIT(KTest10,"SubTest %d: INC119063: General test CopyRect rewrite for low color depth (8,4,2, pixels per byte)");
@@ -155,9 +153,7 @@
 		SwapWidthAndHeightL();
 		break;
 	case 7:
-		((CTDefect2Step*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0072"));
-		INFO_PRINTF2(KTest7,aCurTestCase);
-		CreateScreenDeviceL();
+		// Test case moved to tmultiscreens.cpp
 		break;
 	case 8:
 		((CTDefect2Step*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0073"));
@@ -2070,40 +2066,6 @@
 		}//end of - for(TInt ii=0;ii<TInt(sizeof(testMode)/sizeof(testMode[0]));ii++)
 	}
 
-/**
-  @SYMTestCaseID GRAPHICS-BITGDI-0072
- 
-  @SYMDEF             
-
-  @SYMTestCaseDesc Multiple screen test
-   
-  @SYMTestPriority High
-
-  @SYMTestStatus Implemented
-
-  @SYMTestActions creates some screens in different modes then writes some rotated text to them and test.
- 
-  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
-*/	
-void CTDefect2::CreateScreenDeviceL()
-	{
-	TDisplayMode testMode[] =  {EColor4K, EColor64K, EColor16M, EColor16MU, EColor256, EColor16MA, EColor16MAP};//tested display modes
-	for(TInt ii=0;ii<TInt(sizeof(testMode)/sizeof(testMode[0]));ii++)
-		{
-		TInt screenCnt = 0;
-		TEST(HAL::Get(0, HALData::EDisplayNumberOfScreens, screenCnt) == KErrNone);
-		for(TInt screenNo=0;screenNo<screenCnt;++screenNo)
-			{
-			TInt err = CreateScrDevAndContext(screenNo, testMode[ii]);
-			if(err == KErrNone)
-				{
-				DoRotateMoveTextL();
-				}
-			DeleteGraphicsContext();
-			DeleteScreenDevice();
-			}
-		}
-	}
 
 void CTDefect2::CreateScrDevAndContextL()
 	{
@@ -2125,13 +2087,18 @@
 	DeleteGraphicsContext();
 	DeleteScreenDevice();
 	TRAPD(err, iScrDev = CFbsScreenDevice::NewL(aScreenNo, aDisplayMode));
-	if(err == KErrNotSupported)
+	if ( !iScrDev )
 		{
+		TESTE( err == KErrNotSupported, err );
 		return err;
 		}
 	TEST(err == KErrNone);
 	TEST(iScrDev->ScreenNo() == aScreenNo);
 	err = iScrDev->CreateContext((CGraphicsContext*&)iGc);
+	if ( !iGc )
+		{
+		return err;
+		}
 	TEST(err == KErrNone);
 	iGc->SetUserDisplayMode(aDisplayMode);
 	iScrDev->ChangeScreenDevice(NULL);
@@ -2408,6 +2375,7 @@
 	TInt cWsScreenDeviceResult = 1;
 	TReal32 percentDifference = 0.0;
 	CreateScrDevAndContextL();
+	TBool testResult = EFalse;
 
 	RWsSession wsSession;
 	if (KErrNone == wsSession.Connect())
@@ -2420,28 +2388,54 @@
 		cFbsScreenDeviceResult = iScrDev->HorizontalPixelsToTwips(KHorizontalTestPixels);
 		cWsScreenDeviceResult = wsScrDev->HorizontalPixelsToTwips(KHorizontalTestPixels);
 		percentDifference = Abs((TReal32)(cFbsScreenDeviceResult - cWsScreenDeviceResult)/cFbsScreenDeviceResult*100.0);
-		TEST(percentDifference < KTolerance);
+		testResult = (percentDifference < KTolerance);
+		if ( !testResult )
+			{
+			_LIT(KHorizPixelsToTwipsDesc, "%d horizontal pixels converted to twips by screen device: FBS=%d, WS=%d");
+			WARN_PRINTF4(KHorizPixelsToTwipsDesc, KHorizontalTestPixels, cFbsScreenDeviceResult, cWsScreenDeviceResult);
+			}
+		TEST( testResult );
 		
 		// convert the CWsScreenDevice result back again using each class's HorizontalTwipsToPixels
 		// and pass the test if these results are within tolerance
-		cFbsScreenDeviceResult = iScrDev->HorizontalTwipsToPixels(cWsScreenDeviceResult);
-		cWsScreenDeviceResult = wsScrDev->HorizontalTwipsToPixels(cWsScreenDeviceResult);
+		TInt numTwipsToTest = cWsScreenDeviceResult;
+		cFbsScreenDeviceResult = iScrDev->HorizontalTwipsToPixels(numTwipsToTest);
+		cWsScreenDeviceResult = wsScrDev->HorizontalTwipsToPixels(numTwipsToTest);
 		percentDifference = Abs((TReal32)(cFbsScreenDeviceResult - cWsScreenDeviceResult)/cFbsScreenDeviceResult*100.0);
-		TEST(percentDifference < KTolerance);
+        testResult = (percentDifference < KTolerance);
+        if ( !testResult )
+			{
+			_LIT(KHorizTwipsToPixelsDesc, "%d horizontal twips converted to pixels by screen device: FBS=%d, WS=%d");
+			WARN_PRINTF4(KHorizTwipsToPixelsDesc, numTwipsToTest, cFbsScreenDeviceResult, cWsScreenDeviceResult);
+            }
+        TEST( testResult );
 
 		// next compare results of the two class's VerticalPixelsToTwips and pass the test
 		// if they are within tolerance
 		cFbsScreenDeviceResult = iScrDev->VerticalPixelsToTwips(KVerticalTestPixels);
 		cWsScreenDeviceResult= wsScrDev->VerticalPixelsToTwips(KVerticalTestPixels);
 		percentDifference = Abs((TReal32)(cFbsScreenDeviceResult - cWsScreenDeviceResult)/cFbsScreenDeviceResult*100.0);
-		TEST(percentDifference < KTolerance);
+        testResult = (percentDifference < KTolerance);
+        if ( !testResult )
+            {
+            _LIT(KVertPixelsToTwipsDesc, "%d vertical pixels converted to twips by screen device: FBS=%d, WS=%d");
+            WARN_PRINTF4(KVertPixelsToTwipsDesc, KVerticalTestPixels, cFbsScreenDeviceResult, cWsScreenDeviceResult);
+            }
+        TEST( testResult );
 		
 		// convert the CWsScreenDevice result back again using each class's VerticalTwipsToPixels
 		// and pass the test if these results are within tolerance
-		cFbsScreenDeviceResult = iScrDev->VerticalTwipsToPixels(cWsScreenDeviceResult);
-		cWsScreenDeviceResult = wsScrDev->VerticalTwipsToPixels(cWsScreenDeviceResult);
+		numTwipsToTest = cWsScreenDeviceResult;
+		cFbsScreenDeviceResult = iScrDev->VerticalTwipsToPixels(numTwipsToTest);
+		cWsScreenDeviceResult = wsScrDev->VerticalTwipsToPixels(numTwipsToTest);
 		percentDifference = Abs((TReal32)(cFbsScreenDeviceResult - cWsScreenDeviceResult)/cFbsScreenDeviceResult*100.0);
-		TEST(percentDifference < KTolerance);
+        testResult = (percentDifference < KTolerance);
+        if ( !testResult )
+            {
+            _LIT(KVertTwipsToPixelsDesc, "%d vertical twips converted to pixels by screen device: FBS=%d, WS=%d");
+            WARN_PRINTF4(KVertTwipsToPixelsDesc, numTwipsToTest, cFbsScreenDeviceResult, cWsScreenDeviceResult);
+            }
+        TEST( testResult );
 		
 		delete wsScrDev;
 		wsSession.Close();
--- a/graphicsdeviceinterface/bitgdi/tbit/TDefect2.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/TDefect2.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -42,7 +42,6 @@
 	void GetPixelPerformance1L();
 	void RotateMoveTextL();
 	void SwapWidthAndHeightL();
-	void CreateScreenDeviceL();
 
 	void DoRotateMoveTextL();
 	void CreateScrDevAndContextL();
--- a/graphicsdeviceinterface/bitgdi/tbit/TFONT.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/TFONT.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -233,6 +233,9 @@
 	TInt top=0;
 	TInt bottom=0;
 
+	// Maximum height of font allowed by iType rasteriser
+	const TInt KMaxITypeHeightInPixels = 256;
+
 	for (TInt count = 0; count < typefaces; count++)
 		{
 		iDev->TypefaceSupport(info,count);
@@ -240,11 +243,34 @@
 		for (TInt index = 0; index < info.iNumHeights; index++)
 			{
 			TInt height = iDev->FontHeightInPixels(count,index);
+			if (height > KMaxITypeHeightInPixels)
+				{
+				continue;
+				}
 			fs.iTypeface = info.iTypeface;
 			fs.iHeight = height;
 
 			User::LeaveIfError(GetNearestFontToDesignHeightInPixels(iFont,fs));
-			TEST(iFont->HeightInPixels() == height);
+			TInt heightInPixels = iFont->HeightInPixels();
+			if ( heightInPixels == height )
+				{
+				TEST( ETrue );
+				}
+			else
+				{
+				TOpenFontFaceAttrib attrib;
+				if( iFont->GetFaceAttrib( attrib ) )
+					{
+					_LIT(KErrorMessageWithFontName, "Font: %S, pixel height requested: %d, pixel height of font: %d");
+					INFO_PRINTF4(KErrorMessageWithFontName, &attrib.FullName(), height, heightInPixels);
+					}
+				else
+					{
+					_LIT(KErrorMessage, "Pixel height requested: %d, pixel height of font: %d");
+					INFO_PRINTF3(KErrorMessage, height, heightInPixels);
+					}
+				TEST( EFalse );
+				}
 
 			if (height >= 5)
 				{
--- a/graphicsdeviceinterface/bitgdi/tbit/TFontSelect.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/TFontSelect.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -121,6 +121,11 @@
 	_LIT(KIgnoreFont2, "LinkedFont3TT"); //LinkedFont3/4TT both cause test failure on Freetype
 	_LIT(KIgnoreFont3, "LinkedFont4TT"); //They are test files with incorrect metrics
 
+	// Maximum height of font allowed by iType rasteriser
+	const TInt KMaxITypeHeightInPixels = 256;
+	_LIT(KErrorMessageWithFontName, "Font: %S, pixel height requested: %d, pixel height of font: %d");
+	_LIT(KErrorMessage, "Pixel height requested: %d, pixel height of font: %d");
+
 	for (TInt count = 0; count < typefaces; count++)
 		{
 		iDevice->TypefaceSupport( info, count );
@@ -128,18 +133,56 @@
 		for (TInt index = 0; index < info.iNumHeights; index++)
 			{
 			TInt height = iDevice->FontHeightInPixels( count, index );
+			if (height > KMaxITypeHeightInPixels)
+				{
+				continue;
+				}
 			fs.iTypeface = info.iTypeface;
 			fs.iHeight = height;
 
 			INFO_PRINTF1(_L("Test GetNearestFontInPixels"));
 			User::LeaveIfError( iDevice->GetNearestFontInPixels( (CFont*&)iFont1 ,fs ) );
-			TEST(iFont1->HeightInPixels() == height);
+			TInt heightInPixels = iFont1->HeightInPixels();
+			if ( heightInPixels == height )
+				{
+				TEST( ETrue );
+				}
+			else
+				{
+				TOpenFontFaceAttrib attrib;
+				if( iFont1->GetFaceAttrib( attrib ) )
+					{
+					INFO_PRINTF4(KErrorMessageWithFontName, &attrib.FullName(), height, heightInPixels);
+					}
+				else
+					{
+					INFO_PRINTF3(KErrorMessage, height, heightInPixels);
+					}
+				TEST( EFalse );
+				}
 
 			INFO_PRINTF1(_L("Test GetNearestFontToDesignHeightInPixels"));
 			User::LeaveIfError( iDevice->GetNearestFontToDesignHeightInPixels( (CFont*&)iFont2, fs ) );
-			TEST(iFont2->HeightInPixels() == height);
+			heightInPixels = iFont2->HeightInPixels();
+			if ( heightInPixels == height )
+				{
+				TEST( ETrue );
+				}
+			else
+				{
+				TOpenFontFaceAttrib attrib;
+				if( iFont2->GetFaceAttrib( attrib ) )
+					{
+					INFO_PRINTF4(KErrorMessageWithFontName, &attrib.FullName(), height, heightInPixels);
+					}
+				else
+					{
+					INFO_PRINTF3(KErrorMessage, height, heightInPixels);
+					}
+				TEST( EFalse );
+				}
 			iDevice->ReleaseFont( iFont2 );
-			iDevice->ReleaseFont(iFont1);
+			iDevice->ReleaseFont( iFont1 );
 			}
 			
 		INFO_PRINTF1(_L("Test GetNearestFontToMaxHeightInPixels"));
@@ -179,7 +222,7 @@
 				// as it could be down to the hinting rounding error that can very occasionally occur
 				// We can't make this test reliably with bitmap fonts
 				INFO_PRINTF1(_L("Font is scalable"));
-				TEST(iFont3->FontMaxHeight() <= maxHeight);
+				TEST(iFont3->FontMaxHeight() <= maxHeight+1);
 				}
 
 			INFO_PRINTF1(_L("Test font level metrics"));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/bitgdi/tbit/scripts/bitgditest_t_multiplescreens.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,19 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRINT Run TMultipleScreens BitGDI test 
+//
+LOAD_SUITE TBitgdiServer
+RUN_TEST_STEP 200 TBitgdiServer TMultipleScreens
--- a/graphicsdeviceinterface/bitgdi/tbit/scripts/toutlineandshadow.ini	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/scripts/toutlineandshadow.ini	Wed Aug 18 11:05:09 2010 +0300
@@ -17,6149 +17,6149 @@
 
 [HashForAllTests]
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_0 = 00d400d0009900b000cb0044004d0095002d008f003d00e40024005b00ca007d
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_0 = 008a002a001600af001f00b600400045008400c300fa0081007700580022002d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_0 = 006800b8005900ea002d0065007a009900990092001f005b0020006f0055003b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_0 = 0013000e00400060000d002a00ee00ba008b00ef00c3001c001a0088004100d2
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_0 = 008300060024000300f000d3000700fb004a0010005f0015002d0088004400c0
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_0 = 00b000f3005a0004006800fc00a60004009a00220047001200610078005200a2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_0 = 0034000e00f90058008300db0063000b005f000600c700c10089005000000029
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_0 = 00e800cd009300af00f600a3007b00ce00cc00060016005e00ac000c000b00f5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_0 = 00f500c800f1009f004b00dc002b0093009f006c00e50024008f000b001200c6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_0 = 007c004b003e00a700b000e1008b00f300e200fd00f000b300f1001900c4009f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_0 = 00ee00b90005006700b8000400ae000e00fa00df00e70023003a000c00bf003c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_0 = 00c400f400d30065002c00e8004400cf000a00db00e40034006700c500a30039
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_0 = 0060000e00c500b7008800e8000b00bb006b000f009c00ad00df00ae003f0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_0 = 002c00e100f1002700110021004100dc00ef00a3001b006d0060006200f400e6
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_0 = 00370025005e003d00e200000013001d00e3007800df00b9007b00e800100032
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_0 = 00b7001d007800580010001f0018001100a8006e00ca00fa004e00e80070008c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_0 = 004e0025000300ae007c004000d500cf00ed005b004c008f00fc006600e7000d
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_0 = 000600510008007100b50073008c00530055007d00f5007100890005006a00b9
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_0 = 00cf0089002a00b3009f00a100f7004a00200068003f008400d8006c00f0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_0 = 00b8006d002a006700af00b80031005000ea0096001d00c5003800b100980041
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_0 = 00250047001200e6009100b300ad005a0081003000b3000c0081003c002200b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_0 = 00ac00920021004f006c009c00a50004000a0020008700830072005100060026
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_0 = 007300e600cb00bd004700b100470085004f004e00eb007600810033004800f3
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_0 = 003000cf00db003700aa00be001f00e80044008600f600bc004a005000fc000c
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_0 = 00ff000a0042006200ca001900e8001e00ed00930062000900a2004800c00021
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_0 = 00d1008200a50030000d00f9009f009b00f50011001d00a100a20038008a0070
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_0 = 007a002f006100de00910014008300f800f000490025000700fc00a0006f005e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_0 = 00d3006100f900a6001600de001700cd0024001700fe00970056009100f000da
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_0 = 001300ac0072009d001f00ff00a500b0006d00f100f500a8008e00f500110013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_0 = 007a006200e000830092000d0000000b00f90021004500c4008c004a004400d9
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_0 = 00ad00fe00b500c800bc00810064003e003b006f00af000800a6001c00150093
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_0 = 00e800f20004000b006e001500380057008b00800099006c00530026003500e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_0 = 001e00db0094004b0022005c00bf00c300a60069006800e200b3005400c10010
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_0 = 00400000008b00dd00790035002f008300cb00030036003a00b100fb00c10045
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_0 = 008900bf00c500d10029004a009400a500fd003b001c004d00f0007000de0025
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_0 = 000c001300990038008b007b00cc00d1005f00e5005f00a000c2009a00bd0061
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray2_0 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray2_0 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_0 = 006f00ce00d700e7008600a700ea003000fa000700e4006a0033008b006f00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_0 = 002100a5006200f400a100a40063004100ca006d00ae00d400f4002e00dc006c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_0 = 0093009500a700af00da0085005700c400ed00420013007c000500a400ef0007
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_0 = 00a60060000600530028000b0073002700db00ca003100b1007f003700010067
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_0 = 0051000400de009800160001002c006c00dc0052000c00d10049005e004f00a5
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_0 = 007a0084008e00b7007300be00ff000a007900d5009900db007100da00bd00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_0 = 005700d8005c00b8001300c0007c00bf00b20014008100170041001f00560049
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_0 = 00610082008f008f00b500c3002d00a80056005400440008004d0093009700bf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_0 = 00ce008f000a00d300100003008800bb00c4004e0037002300b000b00093005e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_0 = 0036004d004c000800c900a400d600c2009c00ed005f00610043009f008d000a
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_0 = 0065004100c700b900960030003700410046006e0027002300460038001d00cc
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_0 = 00a1007d006c004d00da00f400ae002900b90057009a00f20033006b00940036
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_0 = 003b002000a700ad002f0049006e0006006b0059003c006d00f90064000600f4
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_0 = 007100a0000e00b500b8001f009900790074006800aa009600e5006200b30093
 
 OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray2_0 = 0047002100e0001400f7007400c90050000300b1003c00020068007800e9008a
 
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_0 = 00300098002e001300690088009600800035007f007200f5003e0030008200a1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_0 = 00aa00aa005200a5007400ae0019006300bf008300cc005e007a005f006000b1
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_0 = 00e0000800eb002f009f00ab008200b300ae00b4008300520067002900b20068
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_0 = 00ba00ef0095006f00c800c3003500fb007e0055009300e30013004c00fe004d
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_0 = 00b2007600d300110099009b004b000d007f00e5001000e20018009000cd001e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_0 = 007f008c0042009600a30007006700e700c3000a00c500e5005e006200680088
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_0 = 009800ed00e0005000c7009d0055008400d0003e00390093003b00d600bc008c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_0 = 0066008100c30045009400e6000e0082007500a7006900d1002b00fb005700fc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_0 = 0089009800fb00f600940005005300c5007c008e00f4003e008a00e5002b00f3
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_0 = 007e00d2008e001f002d003800f400dc00fc002c0073008000da0055006900c9
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_0 = 006800150038008a004e00b300830086000c0026009f00c700de003200ae00e4
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_0 = 004e00b200ff000e00c3005c002b00bb00e9001f0055007c006100c20078002f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_0 = 005100f8009b00ea0049009d007100cb00370068007c0070007d00ff00db0048
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_0 = 0061006500f90099003a0004005100f500a600c7000700e700d400e00012003f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_0 = 0008007a00670038004100e60001006300c7000a00240076008700f200480097
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_0 = 004d00430042005a00f50021001400e3003800aa005d00e20058003f007e00e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_0 = 00f900b500e400910058005d00c5005a008000e8008c00ba00b300ad00330022
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_0 = 00380055009400e000ae00ad005d00eb001100470068006a00de00d500530086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_0 = 004a009900790097002c00a4003100890092001d007300840041008d002a0049
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_0 = 00cc000500830024003900ea005d00a6004800d500fe000f006100cd005900a7
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_0 = 00ae00d300ca00bf00730020005700c000f800e200c000f200cd0043006500c0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_0 = 002300ed0059005700b7005a00a100060099003700e6007600c60066008c002b
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray2_0 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray2_0 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_0 = 00c200ca00fd00e90000003a00760023008f00af002700c7008f002c007b0084
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_0 = 008f0020005200c2009700c600b700d9008a00f60080007e00a500800089003a
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_0 = 000700dd0052007900d4000200910041007100cb0079007d008b0037009a00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_0 = 00f500d3001c00b7005c00be002e002d008600370036008d00fc00ed0028002c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_0 = 0063000500e00067007a00ec0073007f00bb0002002c006600f40006001f00fc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_0 = 0006000700c900db0012000300a5009e0024004b0069005c00b2007600740055
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_0 = 008100e700ac00300011006d006500c600dc00b900a8008d0071009a00e3002a
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_0 = 006b00850066003200b900a100e3007900f7006c00d100d5001c004300110036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_0 = 0022001d006d0064008c0018003f003e00ec00610062006e00b800a5005e0031
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_0 = 001f00da00090044006a0084001500c9007f0040003e0059000800a2006e002f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_0 = 000300640069000a00ef00b6006e00d700800006002300c900860024002d0040
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_0 = 0001009d004800d600ca00ce009800db008f00920005002a005c00c5009e00a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_0 = 00a4002f004c000000cc00860099002400d400d800b7008400fe00f400d600ad
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_0 = 001b0025009e006600b5002a006c0032005300fc00f00012007e001100860083
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_0 = 008e008a00a200d3000b00bd005700a7006400f800c200f800c300d500de00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_0 = 008e009c00f800140029003800d100b4002a005e007400780057005400320046
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_0 = 00ca002f0004003100ce00ac006a0097007e0009002700e800fc0057007000e2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_0 = 00fb00e8007d0021002900240089006800f700ab00fa009f003100c200830056
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_0 = 0034008000b4003d0003009e005b008d006f00ca0080003c007b001800cc0018
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_0 = 000e0056001800bd007100b900490046001e00db0024000a0097003300f3009b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_0 = 004e009f00170036007b00e800a1005c00ca00a90008005f0057009100970004
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_0 = 00920026005b0016005400f2007900b300b400610022008b000600eb00ac00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_0 = 00ea001700790014004e0009003200330062001b0001001000bb00b800e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_0 = 00ea001e002100f3005400cc00e900d90068004d008300ac002b0020007400b0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_0 = 001700f1009d00ec0019006b0051007700c900430069009000c2009000a8001a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_0 = 00cc0088004d005b00c400f100f90013003b007500f1008300c000eb0099003f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_0 = 00260034006200c0004d00f600ed00a300b200da00f200f10025007500a900ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_0 = 00e70054009b006300e700f5008500cf00bf007200c1002900e0005c002a008f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_0 = 0066001c001000fd0011001a003700df005b0048005a002800ce006b009c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_0 = 004200f400ae0059004200cb0001000a002e009b00b6007500e100a900f30062
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_0 = 000b002c008f00de002a0057002400d100d700fb0074006e00d6002900930013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_0 = 005300430078004d002a007c00fe00a1008d00e800c1006e00250018004a0006
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_0 = 00fd0025001c0065005a0018005f00fc006a00a6009200f6004200ad001200ec
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_0 = 000c00f5000900ce008700c70082005e001700630002007600da004200900044
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_0 = 007d004900a9002b00fa00f200e1003700ae007b005000d2006400b700ae00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_0 = 005800a000fe00e30021006600fb004a0097002000a2006a00ad00ed00a70025
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_0 = 003200f900a300b60031003b006e0066006600f100cb00f300d700cc001f00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_0 = 009d005500580055004000ff008d00da0046002800590088006600ba002e0071
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray2_0 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray2_0 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_0 = 004400910050007f0075002f00a800f40038007600ae00ed005f001900f700ef
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_1 = 00d400d0009900b000cb0044004d0095002d008f003d00e40024005b00ca007d
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_1 = 008a002a001600af001f00b600400045008400c300fa0081007700580022002d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_1 = 006800b8005900ea002d0065007a009900990092001f005b0020006f0055003b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_1 = 0013000e00400060000d002a00ee00ba008b00ef00c3001c001a0088004100d2
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_1 = 008300060024000300f000d3000700fb004a0010005f0015002d0088004400c0
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_1 = 00b000f3005a0004006800fc00a60004009a00220047001200610078005200a2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_1 = 0034000e00f90058008300db0063000b005f000600c700c10089005000000029
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_1 = 00e800cd009300af00f600a3007b00ce00cc00060016005e00ac000c000b00f5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_1 = 00f500c800f1009f004b00dc002b0093009f006c00e50024008f000b001200c6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_1 = 007c004b003e00a700b000e1008b00f300e200fd00f000b300f1001900c4009f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_1 = 00ee00b90005006700b8000400ae000e00fa00df00e70023003a000c00bf003c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_1 = 00c400f400d30065002c00e8004400cf000a00db00e40034006700c500a30039
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_1 = 0060000e00c500b7008800e8000b00bb006b000f009c00ad00df00ae003f0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_1 = 002c00e100f1002700110021004100dc00ef00a3001b006d0060006200f400e6
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_1 = 00370025005e003d00e200000013001d00e3007800df00b9007b00e800100032
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_1 = 00b7001d007800580010001f0018001100a8006e00ca00fa004e00e80070008c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_1 = 004e0025000300ae007c004000d500cf00ed005b004c008f00fc006600e7000d
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_1 = 000600510008007100b50073008c00530055007d00f5007100890005006a00b9
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_0 = 00c7003600a700850053004700e6002f00fd003f0019000f004b00650040001b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_1 = 00cf0089002a00b3009f00a100f7004a00200068003f008400d8006c00f0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_1 = 00b8006d002a006700af00b80031005000ea0096001d00c5003800b100980041
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_1 = 00250047001200e6009100b300ad005a0081003000b3000c0081003c002200b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_1 = 00ac00920021004f006c009c00a50004000a0020008700830072005100060026
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_1 = 007300e600cb00bd004700b100470085004f004e00eb007600810033004800f3
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_1 = 003000cf00db003700aa00be001f00e80044008600f600bc004a005000fc000c
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_1 = 00ff000a0042006200ca001900e8001e00ed00930062000900a2004800c00021
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_1 = 00d1008200a50030000d00f9009f009b00f50011001d00a100a20038008a0070
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_1 = 007a002f006100de00910014008300f800f000490025000700fc00a0006f005e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_1 = 00d3006100f900a6001600de001700cd0024001700fe00970056009100f000da
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_1 = 001300ac0072009d001f00ff00a500b0006d00f100f500a8008e00f500110013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_1 = 007a006200e000830092000d0000000b00f90021004500c4008c004a004400d9
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_1 = 00ad00fe00b500c800bc00810064003e003b006f00af000800a6001c00150093
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_1 = 00e800f20004000b006e001500380057008b00800099006c00530026003500e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_1 = 001e00db0094004b0022005c00bf00c300a60069006800e200b3005400c10010
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_1 = 00400000008b00dd00790035002f008300cb00030036003a00b100fb00c10045
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_1 = 008900bf00c500d10029004a009400a500fd003b001c004d00f0007000de0025
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_1 = 000c001300990038008b007b00cc00d1005f00e5005f00a000c2009a00bd0061
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray2_1 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray2_1 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_1 = 006f00ce00d700e7008600a700ea003000fa000700e4006a0033008b006f00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_1 = 002100a5006200f400a100a40063004100ca006d00ae00d400f4002e00dc006c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_1 = 0093009500a700af00da0085005700c400ed00420013007c000500a400ef0007
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_1 = 00a60060000600530028000b0073002700db00ca003100b1007f003700010067
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_1 = 0051000400de009800160001002c006c00dc0052000c00d10049005e004f00a5
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_1 = 007a0084008e00b7007300be00ff000a007900d5009900db007100da00bd00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_1 = 005700d8005c00b8001300c0007c00bf00b20014008100170041001f00560049
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_1 = 00610082008f008f00b500c3002d00a80056005400440008004d0093009700bf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_1 = 00ce008f000a00d300100003008800bb00c4004e0037002300b000b00093005e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_1 = 0036004d004c000800c900a400d600c2009c00ed005f00610043009f008d000a
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_1 = 0065004100c700b900960030003700410046006e0027002300460038001d00cc
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_1 = 00a1007d006c004d00da00f400ae002900b90057009a00f20033006b00940036
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_1 = 003b002000a700ad002f0049006e0006006b0059003c006d00f90064000600f4
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_1 = 007100a0000e00b500b8001f009900790074006800aa009600e5006200b30093
 
 OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray2_1 = 0047002100e0001400f7007400c90050000300b1003c00020068007800e9008a
 
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_1 = 00300098002e001300690088009600800035007f007200f5003e0030008200a1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_1 = 00aa00aa005200a5007400ae0019006300bf008300cc005e007a005f006000b1
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_1 = 00e0000800eb002f009f00ab008200b300ae00b4008300520067002900b20068
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_1 = 00ba00ef0095006f00c800c3003500fb007e0055009300e30013004c00fe004d
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_1 = 00b2007600d300110099009b004b000d007f00e5001000e20018009000cd001e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_1 = 007f008c0042009600a30007006700e700c3000a00c500e5005e006200680088
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_1 = 009800ed00e0005000c7009d0055008400d0003e00390093003b00d600bc008c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_1 = 0066008100c30045009400e6000e0082007500a7006900d1002b00fb005700fc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_1 = 0089009800fb00f600940005005300c5007c008e00f4003e008a00e5002b00f3
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_1 = 007e00d2008e001f002d003800f400dc00fc002c0073008000da0055006900c9
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_1 = 006800150038008a004e00b300830086000c0026009f00c700de003200ae00e4
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_1 = 004e00b200ff000e00c3005c002b00bb00e9001f0055007c006100c20078002f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_1 = 005100f8009b00ea0049009d007100cb00370068007c0070007d00ff00db0048
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_1 = 0061006500f90099003a0004005100f500a600c7000700e700d400e00012003f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_1 = 0008007a00670038004100e60001006300c7000a00240076008700f200480097
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_1 = 004d00430042005a00f50021001400e3003800aa005d00e20058003f007e00e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_1 = 00f900b500e400910058005d00c5005a008000e8008c00ba00b300ad00330022
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_1 = 00380055009400e000ae00ad005d00eb001100470068006a00de00d500530086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_1 = 004a009900790097002c00a4003100890092001d007300840041008d002a0049
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_1 = 00cc000500830024003900ea005d00a6004800d500fe000f006100cd005900a7
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_1 = 00ae00d300ca00bf00730020005700c000f800e200c000f200cd0043006500c0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_1 = 002300ed0059005700b7005a00a100060099003700e6007600c60066008c002b
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray2_1 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray2_1 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_1 = 00c200ca00fd00e90000003a00760023008f00af002700c7008f002c007b0084
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_1 = 008f0020005200c2009700c600b700d9008a00f60080007e00a500800089003a
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_1 = 000700dd0052007900d4000200910041007100cb0079007d008b0037009a00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_1 = 00f500d3001c00b7005c00be002e002d008600370036008d00fc00ed0028002c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_1 = 0063000500e00067007a00ec0073007f00bb0002002c006600f40006001f00fc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_1 = 0006000700c900db0012000300a5009e0024004b0069005c00b2007600740055
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_1 = 008100e700ac00300011006d006500c600dc00b900a8008d0071009a00e3002a
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_1 = 006b00850066003200b900a100e3007900f7006c00d100d5001c004300110036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_1 = 0022001d006d0064008c0018003f003e00ec00610062006e00b800a5005e0031
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_1 = 001f00da00090044006a0084001500c9007f0040003e0059000800a2006e002f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_1 = 000300640069000a00ef00b6006e00d700800006002300c900860024002d0040
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_1 = 0001009d004800d600ca00ce009800db008f00920005002a005c00c5009e00a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_1 = 00a4002f004c000000cc00860099002400d400d800b7008400fe00f400d600ad
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_1 = 001b0025009e006600b5002a006c0032005300fc00f00012007e001100860083
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_1 = 008e008a00a200d3000b00bd005700a7006400f800c200f800c300d500de00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_1 = 008e009c00f800140029003800d100b4002a005e007400780057005400320046
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_1 = 00ca002f0004003100ce00ac006a0097007e0009002700e800fc0057007000e2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_1 = 00fb00e8007d0021002900240089006800f700ab00fa009f003100c200830056
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_1 = 0034008000b4003d0003009e005b008d006f00ca0080003c007b001800cc0018
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_1 = 000e0056001800bd007100b900490046001e00db0024000a0097003300f3009b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_1 = 004e009f00170036007b00e800a1005c00ca00a90008005f0057009100970004
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_1 = 00920026005b0016005400f2007900b300b400610022008b000600eb00ac00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_1 = 00ea001700790014004e0009003200330062001b0001001000bb00b800e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_1 = 00ea001e002100f3005400cc00e900d90068004d008300ac002b0020007400b0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_1 = 001700f1009d00ec0019006b0051007700c900430069009000c2009000a8001a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_1 = 00cc0088004d005b00c400f100f90013003b007500f1008300c000eb0099003f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_1 = 00260034006200c0004d00f600ed00a300b200da00f200f10025007500a900ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_1 = 00e70054009b006300e700f5008500cf00bf007200c1002900e0005c002a008f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_1 = 0066001c001000fd0011001a003700df005b0048005a002800ce006b009c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_1 = 004200f400ae0059004200cb0001000a002e009b00b6007500e100a900f30062
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_1 = 000b002c008f00de002a0057002400d100d700fb0074006e00d6002900930013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_1 = 005300430078004d002a007c00fe00a1008d00e800c1006e00250018004a0006
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_1 = 00fd0025001c0065005a0018005f00fc006a00a6009200f6004200ad001200ec
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_1 = 000c00f5000900ce008700c70082005e001700630002007600da004200900044
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_1 = 007d004900a9002b00fa00f200e1003700ae007b005000d2006400b700ae00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_1 = 005800a000fe00e30021006600fb004a0097002000a2006a00ad00ed00a70025
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_1 = 003200f900a300b60031003b006e0066006600f100cb00f300d700cc001f00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_1 = 009d005500580055004000ff008d00da0046002800590088006600ba002e0071
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray2_1 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray2_1 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_1 = 004400910050007f0075002f00a800f40038007600ae00ed005f001900f700ef
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_2 = 00d400d0009900b000cb0044004d0095002d008f003d00e40024005b00ca007d
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_2 = 008a002a001600af001f00b600400045008400c300fa0081007700580022002d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_2 = 006800b8005900ea002d0065007a009900990092001f005b0020006f0055003b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_2 = 0013000e00400060000d002a00ee00ba008b00ef00c3001c001a0088004100d2
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_2 = 008300060024000300f000d3000700fb004a0010005f0015002d0088004400c0
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_2 = 00b000f3005a0004006800fc00a60004009a00220047001200610078005200a2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_2 = 0034000e00f90058008300db0063000b005f000600c700c10089005000000029
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_2 = 00e800cd009300af00f600a3007b00ce00cc00060016005e00ac000c000b00f5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_2 = 00f500c800f1009f004b00dc002b0093009f006c00e50024008f000b001200c6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_2 = 007c004b003e00a700b000e1008b00f300e200fd00f000b300f1001900c4009f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_2 = 00ee00b90005006700b8000400ae000e00fa00df00e70023003a000c00bf003c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_2 = 00c400f400d30065002c00e8004400cf000a00db00e40034006700c500a30039
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_2 = 0060000e00c500b7008800e8000b00bb006b000f009c00ad00df00ae003f0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_2 = 002c00e100f1002700110021004100dc00ef00a3001b006d0060006200f400e6
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_2 = 00370025005e003d00e200000013001d00e3007800df00b9007b00e800100032
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_2 = 00b7001d007800580010001f0018001100a8006e00ca00fa004e00e80070008c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_2 = 004e0025000300ae007c004000d500cf00ed005b004c008f00fc006600e7000d
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_2 = 000600510008007100b50073008c00530055007d00f5007100890005006a00b9
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_1 = 00c7003600a700850053004700e6002f00fd003f0019000f004b00650040001b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_2 = 00cf0089002a00b3009f00a100f7004a00200068003f008400d8006c00f0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_2 = 00b8006d002a006700af00b80031005000ea0096001d00c5003800b100980041
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_2 = 00250047001200e6009100b300ad005a0081003000b3000c0081003c002200b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_2 = 00ac00920021004f006c009c00a50004000a0020008700830072005100060026
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_2 = 007300e600cb00bd004700b100470085004f004e00eb007600810033004800f3
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_2 = 003000cf00db003700aa00be001f00e80044008600f600bc004a005000fc000c
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_2 = 00ff000a0042006200ca001900e8001e00ed00930062000900a2004800c00021
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_2 = 00d1008200a50030000d00f9009f009b00f50011001d00a100a20038008a0070
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_2 = 007a002f006100de00910014008300f800f000490025000700fc00a0006f005e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_2 = 00d3006100f900a6001600de001700cd0024001700fe00970056009100f000da
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_2 = 001300ac0072009d001f00ff00a500b0006d00f100f500a8008e00f500110013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_2 = 007a006200e000830092000d0000000b00f90021004500c4008c004a004400d9
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_2 = 00ad00fe00b500c800bc00810064003e003b006f00af000800a6001c00150093
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_2 = 00e800f20004000b006e001500380057008b00800099006c00530026003500e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_2 = 001e00db0094004b0022005c00bf00c300a60069006800e200b3005400c10010
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_2 = 00400000008b00dd00790035002f008300cb00030036003a00b100fb00c10045
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_2 = 008900bf00c500d10029004a009400a500fd003b001c004d00f0007000de0025
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_2 = 000c001300990038008b007b00cc00d1005f00e5005f00a000c2009a00bd0061
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray2_2 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray2_2 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_2 = 006f00ce00d700e7008600a700ea003000fa000700e4006a0033008b006f00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_2 = 002100a5006200f400a100a40063004100ca006d00ae00d400f4002e00dc006c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_2 = 0093009500a700af00da0085005700c400ed00420013007c000500a400ef0007
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_2 = 00a60060000600530028000b0073002700db00ca003100b1007f003700010067
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_2 = 0051000400de009800160001002c006c00dc0052000c00d10049005e004f00a5
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_2 = 007a0084008e00b7007300be00ff000a007900d5009900db007100da00bd00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_2 = 005700d8005c00b8001300c0007c00bf00b20014008100170041001f00560049
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_2 = 00610082008f008f00b500c3002d00a80056005400440008004d0093009700bf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_2 = 00ce008f000a00d300100003008800bb00c4004e0037002300b000b00093005e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_2 = 0036004d004c000800c900a400d600c2009c00ed005f00610043009f008d000a
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_2 = 0065004100c700b900960030003700410046006e0027002300460038001d00cc
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_2 = 00a1007d006c004d00da00f400ae002900b90057009a00f20033006b00940036
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_2 = 003b002000a700ad002f0049006e0006006b0059003c006d00f90064000600f4
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_2 = 007100a0000e00b500b8001f009900790074006800aa009600e5006200b30093
 
 OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray2_2 = 0047002100e0001400f7007400c90050000300b1003c00020068007800e9008a
 
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_2 = 00300098002e001300690088009600800035007f007200f5003e0030008200a1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_2 = 00aa00aa005200a5007400ae0019006300bf008300cc005e007a005f006000b1
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_2 = 00e0000800eb002f009f00ab008200b300ae00b4008300520067002900b20068
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_2 = 00ba00ef0095006f00c800c3003500fb007e0055009300e30013004c00fe004d
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_2 = 00b2007600d300110099009b004b000d007f00e5001000e20018009000cd001e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_2 = 007f008c0042009600a30007006700e700c3000a00c500e5005e006200680088
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_2 = 009800ed00e0005000c7009d0055008400d0003e00390093003b00d600bc008c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_2 = 0066008100c30045009400e6000e0082007500a7006900d1002b00fb005700fc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_2 = 0089009800fb00f600940005005300c5007c008e00f4003e008a00e5002b00f3
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_2 = 007e00d2008e001f002d003800f400dc00fc002c0073008000da0055006900c9
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_2 = 006800150038008a004e00b300830086000c0026009f00c700de003200ae00e4
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_2 = 004e00b200ff000e00c3005c002b00bb00e9001f0055007c006100c20078002f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_2 = 005100f8009b00ea0049009d007100cb00370068007c0070007d00ff00db0048
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_2 = 0061006500f90099003a0004005100f500a600c7000700e700d400e00012003f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_2 = 0008007a00670038004100e60001006300c7000a00240076008700f200480097
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_2 = 004d00430042005a00f50021001400e3003800aa005d00e20058003f007e00e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_2 = 00f900b500e400910058005d00c5005a008000e8008c00ba00b300ad00330022
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_2 = 00380055009400e000ae00ad005d00eb001100470068006a00de00d500530086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_2 = 004a009900790097002c00a4003100890092001d007300840041008d002a0049
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_2 = 00cc000500830024003900ea005d00a6004800d500fe000f006100cd005900a7
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_2 = 00ae00d300ca00bf00730020005700c000f800e200c000f200cd0043006500c0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_2 = 002300ed0059005700b7005a00a100060099003700e6007600c60066008c002b
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray2_2 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray2_2 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_2 = 00c200ca00fd00e90000003a00760023008f00af002700c7008f002c007b0084
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_2 = 008f0020005200c2009700c600b700d9008a00f60080007e00a500800089003a
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_2 = 000700dd0052007900d4000200910041007100cb0079007d008b0037009a00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_2 = 00f500d3001c00b7005c00be002e002d008600370036008d00fc00ed0028002c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_2 = 0063000500e00067007a00ec0073007f00bb0002002c006600f40006001f00fc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_2 = 0006000700c900db0012000300a5009e0024004b0069005c00b2007600740055
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_2 = 008100e700ac00300011006d006500c600dc00b900a8008d0071009a00e3002a
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_2 = 006b00850066003200b900a100e3007900f7006c00d100d5001c004300110036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_2 = 0022001d006d0064008c0018003f003e00ec00610062006e00b800a5005e0031
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_2 = 001f00da00090044006a0084001500c9007f0040003e0059000800a2006e002f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_2 = 000300640069000a00ef00b6006e00d700800006002300c900860024002d0040
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_2 = 0001009d004800d600ca00ce009800db008f00920005002a005c00c5009e00a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_2 = 00a4002f004c000000cc00860099002400d400d800b7008400fe00f400d600ad
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_2 = 001b0025009e006600b5002a006c0032005300fc00f00012007e001100860083
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_2 = 008e008a00a200d3000b00bd005700a7006400f800c200f800c300d500de00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_2 = 008e009c00f800140029003800d100b4002a005e007400780057005400320046
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_2 = 00ca002f0004003100ce00ac006a0097007e0009002700e800fc0057007000e2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_2 = 00fb00e8007d0021002900240089006800f700ab00fa009f003100c200830056
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_2 = 0034008000b4003d0003009e005b008d006f00ca0080003c007b001800cc0018
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_2 = 000e0056001800bd007100b900490046001e00db0024000a0097003300f3009b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_2 = 004e009f00170036007b00e800a1005c00ca00a90008005f0057009100970004
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_2 = 00920026005b0016005400f2007900b300b400610022008b000600eb00ac00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_2 = 00ea001700790014004e0009003200330062001b0001001000bb00b800e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_2 = 00ea001e002100f3005400cc00e900d90068004d008300ac002b0020007400b0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_2 = 001700f1009d00ec0019006b0051007700c900430069009000c2009000a8001a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_2 = 00cc0088004d005b00c400f100f90013003b007500f1008300c000eb0099003f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_2 = 00260034006200c0004d00f600ed00a300b200da00f200f10025007500a900ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_2 = 00e70054009b006300e700f5008500cf00bf007200c1002900e0005c002a008f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_2 = 0066001c001000fd0011001a003700df005b0048005a002800ce006b009c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_2 = 004200f400ae0059004200cb0001000a002e009b00b6007500e100a900f30062
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_2 = 000b002c008f00de002a0057002400d100d700fb0074006e00d6002900930013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_2 = 005300430078004d002a007c00fe00a1008d00e800c1006e00250018004a0006
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_2 = 00fd0025001c0065005a0018005f00fc006a00a6009200f6004200ad001200ec
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_2 = 000c00f5000900ce008700c70082005e001700630002007600da004200900044
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_2 = 007d004900a9002b00fa00f200e1003700ae007b005000d2006400b700ae00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_2 = 005800a000fe00e30021006600fb004a0097002000a2006a00ad00ed00a70025
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_2 = 003200f900a300b60031003b006e0066006600f100cb00f300d700cc001f00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_2 = 009d005500580055004000ff008d00da0046002800590088006600ba002e0071
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray2_2 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray2_2 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_2 = 004400910050007f0075002f00a800f40038007600ae00ed005f001900f700ef
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_3 = 00d400d0009900b000cb0044004d0095002d008f003d00e40024005b00ca007d
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_3 = 008a002a001600af001f00b600400045008400c300fa0081007700580022002d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_3 = 006800b8005900ea002d0065007a009900990092001f005b0020006f0055003b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_3 = 0013000e00400060000d002a00ee00ba008b00ef00c3001c001a0088004100d2
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_3 = 008300060024000300f000d3000700fb004a0010005f0015002d0088004400c0
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_3 = 00b000f3005a0004006800fc00a60004009a00220047001200610078005200a2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_3 = 0034000e00f90058008300db0063000b005f000600c700c10089005000000029
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_3 = 00e800cd009300af00f600a3007b00ce00cc00060016005e00ac000c000b00f5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_3 = 00f500c800f1009f004b00dc002b0093009f006c00e50024008f000b001200c6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_3 = 007c004b003e00a700b000e1008b00f300e200fd00f000b300f1001900c4009f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_3 = 00ee00b90005006700b8000400ae000e00fa00df00e70023003a000c00bf003c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_3 = 00c400f400d30065002c00e8004400cf000a00db00e40034006700c500a30039
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_3 = 0060000e00c500b7008800e8000b00bb006b000f009c00ad00df00ae003f0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_3 = 002c00e100f1002700110021004100dc00ef00a3001b006d0060006200f400e6
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_3 = 00370025005e003d00e200000013001d00e3007800df00b9007b00e800100032
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_3 = 00b7001d007800580010001f0018001100a8006e00ca00fa004e00e80070008c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_3 = 004e0025000300ae007c004000d500cf00ed005b004c008f00fc006600e7000d
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_3 = 000600510008007100b50073008c00530055007d00f5007100890005006a00b9
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_2 = 00c7003600a700850053004700e6002f00fd003f0019000f004b00650040001b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray2_3 = 00cf0089002a00b3009f00a100f7004a00200068003f008400d8006c00f0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray2_3 = 00b8006d002a006700af00b80031005000ea0096001d00c5003800b100980041
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray2_3 = 00250047001200e6009100b300ad005a0081003000b3000c0081003c002200b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray2_3 = 00ac00920021004f006c009c00a50004000a0020008700830072005100060026
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray2_3 = 007300e600cb00bd004700b100470085004f004e00eb007600810033004800f3
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray2_3 = 003000cf00db003700aa00be001f00e80044008600f600bc004a005000fc000c
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray2_3 = 00ff000a0042006200ca001900e8001e00ed00930062000900a2004800c00021
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray2_3 = 00d1008200a50030000d00f9009f009b00f50011001d00a100a20038008a0070
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray2_3 = 007a002f006100de00910014008300f800f000490025000700fc00a0006f005e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray2_3 = 00d3006100f900a6001600de001700cd0024001700fe00970056009100f000da
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray2_3 = 001300ac0072009d001f00ff00a500b0006d00f100f500a8008e00f500110013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray2_3 = 007a006200e000830092000d0000000b00f90021004500c4008c004a004400d9
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray2_3 = 00ad00fe00b500c800bc00810064003e003b006f00af000800a6001c00150093
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray2_3 = 00e800f20004000b006e001500380057008b00800099006c00530026003500e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray2_3 = 001e00db0094004b0022005c00bf00c300a60069006800e200b3005400c10010
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray2_3 = 00400000008b00dd00790035002f008300cb00030036003a00b100fb00c10045
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray2_3 = 008900bf00c500d10029004a009400a500fd003b001c004d00f0007000de0025
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray2_3 = 000c001300990038008b007b00cc00d1005f00e5005f00a000c2009a00bd0061
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray2_3 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray2_3 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_3 = 006f00ce00d700e7008600a700ea003000fa000700e4006a0033008b006f00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_3 = 002100a5006200f400a100a40063004100ca006d00ae00d400f4002e00dc006c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_3 = 0093009500a700af00da0085005700c400ed00420013007c000500a400ef0007
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_3 = 00a60060000600530028000b0073002700db00ca003100b1007f003700010067
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_3 = 0051000400de009800160001002c006c00dc0052000c00d10049005e004f00a5
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_3 = 007a0084008e00b7007300be00ff000a007900d5009900db007100da00bd00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_3 = 005700d8005c00b8001300c0007c00bf00b20014008100170041001f00560049
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray2_3 = 00610082008f008f00b500c3002d00a80056005400440008004d0093009700bf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray2_3 = 00ce008f000a00d300100003008800bb00c4004e0037002300b000b00093005e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray2_3 = 0036004d004c000800c900a400d600c2009c00ed005f00610043009f008d000a
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray2_3 = 0065004100c700b900960030003700410046006e0027002300460038001d00cc
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray2_3 = 00a1007d006c004d00da00f400ae002900b90057009a00f20033006b00940036
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray2_3 = 003b002000a700ad002f0049006e0006006b0059003c006d00f90064000600f4
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray2_3 = 007100a0000e00b500b8001f009900790074006800aa009600e5006200b30093
 
 OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray2_3 = 0047002100e0001400f7007400c90050000300b1003c00020068007800e9008a
 
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_3 = 00300098002e001300690088009600800035007f007200f5003e0030008200a1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_3 = 00aa00aa005200a5007400ae0019006300bf008300cc005e007a005f006000b1
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_3 = 00e0000800eb002f009f00ab008200b300ae00b4008300520067002900b20068
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_3 = 00ba00ef0095006f00c800c3003500fb007e0055009300e30013004c00fe004d
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_3 = 00b2007600d300110099009b004b000d007f00e5001000e20018009000cd001e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_3 = 007f008c0042009600a30007006700e700c3000a00c500e5005e006200680088
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_3 = 009800ed00e0005000c7009d0055008400d0003e00390093003b00d600bc008c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_3 = 0066008100c30045009400e6000e0082007500a7006900d1002b00fb005700fc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_3 = 0089009800fb00f600940005005300c5007c008e00f4003e008a00e5002b00f3
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_3 = 007e00d2008e001f002d003800f400dc00fc002c0073008000da0055006900c9
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_3 = 006800150038008a004e00b300830086000c0026009f00c700de003200ae00e4
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray2_3 = 004e00b200ff000e00c3005c002b00bb00e9001f0055007c006100c20078002f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray2_3 = 005100f8009b00ea0049009d007100cb00370068007c0070007d00ff00db0048
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray2_3 = 0061006500f90099003a0004005100f500a600c7000700e700d400e00012003f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray2_3 = 0008007a00670038004100e60001006300c7000a00240076008700f200480097
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray2_3 = 004d00430042005a00f50021001400e3003800aa005d00e20058003f007e00e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray2_3 = 00f900b500e400910058005d00c5005a008000e8008c00ba00b300ad00330022
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray2_3 = 00380055009400e000ae00ad005d00eb001100470068006a00de00d500530086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray2_3 = 004a009900790097002c00a4003100890092001d007300840041008d002a0049
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray2_3 = 00cc000500830024003900ea005d00a6004800d500fe000f006100cd005900a7
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray2_3 = 00ae00d300ca00bf00730020005700c000f800e200c000f200cd0043006500c0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray2_3 = 002300ed0059005700b7005a00a100060099003700e6007600c60066008c002b
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray2_3 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray2_3 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_3 = 00c200ca00fd00e90000003a00760023008f00af002700c7008f002c007b0084
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_3 = 008f0020005200c2009700c600b700d9008a00f60080007e00a500800089003a
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_3 = 000700dd0052007900d4000200910041007100cb0079007d008b0037009a00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_3 = 00f500d3001c00b7005c00be002e002d008600370036008d00fc00ed0028002c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_3 = 0063000500e00067007a00ec0073007f00bb0002002c006600f40006001f00fc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_3 = 0006000700c900db0012000300a5009e0024004b0069005c00b2007600740055
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_3 = 008100e700ac00300011006d006500c600dc00b900a8008d0071009a00e3002a
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_3 = 006b00850066003200b900a100e3007900f7006c00d100d5001c004300110036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_3 = 0022001d006d0064008c0018003f003e00ec00610062006e00b800a5005e0031
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_3 = 001f00da00090044006a0084001500c9007f0040003e0059000800a2006e002f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_3 = 000300640069000a00ef00b6006e00d700800006002300c900860024002d0040
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_3 = 0001009d004800d600ca00ce009800db008f00920005002a005c00c5009e00a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_3 = 00a4002f004c000000cc00860099002400d400d800b7008400fe00f400d600ad
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_3 = 001b0025009e006600b5002a006c0032005300fc00f00012007e001100860083
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_3 = 008e008a00a200d3000b00bd005700a7006400f800c200f800c300d500de00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_3 = 008e009c00f800140029003800d100b4002a005e007400780057005400320046
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_3 = 00ca002f0004003100ce00ac006a0097007e0009002700e800fc0057007000e2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_3 = 00fb00e8007d0021002900240089006800f700ab00fa009f003100c200830056
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_3 = 0034008000b4003d0003009e005b008d006f00ca0080003c007b001800cc0018
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray2_3 = 000e0056001800bd007100b900490046001e00db0024000a0097003300f3009b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray2_3 = 004e009f00170036007b00e800a1005c00ca00a90008005f0057009100970004
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray2_3 = 00920026005b0016005400f2007900b300b400610022008b000600eb00ac00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray2_3 = 00ea001700790014004e0009003200330062001b0001001000bb00b800e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray2_3 = 00ea001e002100f3005400cc00e900d90068004d008300ac002b0020007400b0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray2_3 = 001700f1009d00ec0019006b0051007700c900430069009000c2009000a8001a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray2_3 = 00cc0088004d005b00c400f100f90013003b007500f1008300c000eb0099003f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray2_3 = 00260034006200c0004d00f600ed00a300b200da00f200f10025007500a900ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray2_3 = 00e70054009b006300e700f5008500cf00bf007200c1002900e0005c002a008f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray2_3 = 0066001c001000fd0011001a003700df005b0048005a002800ce006b009c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray2_3 = 004200f400ae0059004200cb0001000a002e009b00b6007500e100a900f30062
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray2_3 = 000b002c008f00de002a0057002400d100d700fb0074006e00d6002900930013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray2_3 = 005300430078004d002a007c00fe00a1008d00e800c1006e00250018004a0006
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray2_3 = 00fd0025001c0065005a0018005f00fc006a00a6009200f6004200ad001200ec
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray2_3 = 000c00f5000900ce008700c70082005e001700630002007600da004200900044
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray2_3 = 007d004900a9002b00fa00f200e1003700ae007b005000d2006400b700ae00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray2_3 = 005800a000fe00e30021006600fb004a0097002000a2006a00ad00ed00a70025
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray2_3 = 003200f900a300b60031003b006e0066006600f100cb00f300d700cc001f00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray2_3 = 009d005500580055004000ff008d00da0046002800590088006600ba002e0071
 
 OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray2_3 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
 OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray2_3 = 007200b300b60096004f0074002700b900400035003a003b0068006d00ba009e
 
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_3 = 004400910050007f0075002f00a800f40038007600ae00ed005f001900f700ef
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_0 = 004d007e00fb002c001800bf003e003a009e00f500c00057005b00c800480030
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_0 = 00fe00220053005f008800d20020001200e50020000c009e0000005100bb00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_0 = 00a200ba000400b500ea005400e700dc000600b1007500e80051009900d200b8
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_0 = 008c0071005f0084009100d9004d0056000900c60005009a00bc00e600f10082
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_0 = 009b006e00a500fa00e300df0019005e0052004c000b00d8009b00dc005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_0 = 0095004a004000f90042009200f700a0005400ac00a600a40019006100a80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_0 = 003f009a009d00fe0027002800ad006c0099008300cb0046003d005300f100e1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_0 = 009800e30056006d0052002f0072003f00a2000b00dd008000ca00a500670005
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_0 = 00a1006100a70009006c005600be00d200a100ad00fa00a500050068008a0071
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_0 = 0040002d0063008200250070005c007e00e4000400de00e6008400d3005100c6
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_0 = 006d00dd009c003100f8006a009f001e00f9001900de00a800cc00b800610077
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_0 = 001e00db00d30023009e008c00d500270046006600d3004d0040004f00ea004d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_0 = 00d400da0088003000200046000100eb00020080004a00520068003c00d6009a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_0 = 005b00db008e007c008c002500a000b50000002700d0007900e3007400b40017
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_0 = 00e800170020004c002900bc00a3002d001f002d005d00b1001500bf00b400f0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_0 = 001500f20009005200270046009c00a9002000a00080006400ad00f800fb00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_0 = 0014009600de003a006500930048009200e20083000900ba006b0042004e0007
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_0 = 008e00ea009f002800e4004300ca000a005a00a1009d005000ec009e00110016
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_0 = 00ac00d300e3001900cc005f00cc003700be005800960047008700a6003c00c0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_0 = 0044003b00b900fa001500b3002e004f006100d5007a002b00020025009000c5
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_0 = 00d3002b001000020086002c005500220052006d00ce00b6006b00cb00d0003d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_0 = 006800c3009e0079002e00f9009c005800f6002f001100c100a8002100fe0097
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_0 = 00b7005800e30028009e001a00b3009d0034005300db00f3001c002a006e0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_0 = 00a800980074003c000500bd0027008900cd002d001f00a8002b003b004a0078
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_0 = 00c6003b005e009a005f000b003e00cf00ce00ab00d400f1004b004f005e0011
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_0 = 0074005d000d00e500550030008a0089009d00a80084001c001b001a00e2006d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_0 = 00240072007600dc0064004200f400860027005100d700010068002b00e400b2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_0 = 00d500910033002300e500b600a800df009a0090000900d3000e0068001f00ef
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_0 = 00000021001d00cb00af00ce004f00be00ff003d004f00f4001000df005b0041
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_0 = 001500c1004000c1008b003d0081005700d1006c00d60081007d00de001900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_0 = 00b600b90079004c00390081008a004d0033007500d10047002a0018000f0010
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_0 = 00de005300b000ed008c00a5001100aa0082001000a80064009f00af00bd00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_0 = 0011004900210007007700b5005400c9005100420066004300af008200510042
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_0 = 00690006000d000900b7002600de00070091006400f00036002500e600d600bc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_0 = 00ea00b900b200ae003a00cb00630008003800cc00d0005400dc00e500e70008
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_0 = 00a500fa0076008e0084007d00b000cf007c005a005900d80098006b00f100db
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_0 = 000200ff00d50085003c002b003500e000f1002700e70095005b005900fd0004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_0 = 0030004d005500640021003c00f20006001a00be003900fc00300050001b00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_0 = 005a00d800f7006500c1009200fb00e300dc00d5001200ee004c00a200570096
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_0 = 00c5002c00b7002d00e300ac0074004300200001007c003c003b007d00c400f4
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_0 = 0092009b00e600870074005000a3004500de005400b20087004a00fc00130015
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_0 = 0040004a009200ce00a500de00ba006900260013001a00a300a800ed00e7008f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_0 = 00480024001100d700b200b3008100d00036009500b3005e006100d6002f00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_0 = 00d20057002a00ad00cf008c008d003100520080009000e700b900bc00780058
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_0 = 003600cb008c009d003b000800af003f000000bc00970054003c007400190032
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_0 = 006300520038009e00f9009c000a006300c600d5007e00b0001b006d00ea003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_0 = 0032006c007f0058008e00ec00b300c000f40064005300130060004f004900fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_0 = 00f6000c00ff00ca006f00c2001500e00042008700b500930015002200860075
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_0 = 0037003800de00bc006700da00f9000500a700380099009300df009e00da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_0 = 007100830007008100700037007200b400b000f100440073005f00d4009900ac
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_0 = 00ae00dd003f001c00d2000100280026008c00fb0084004c00c900de006600da
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_0 = 006300cf005700dc0020000500d800f700f80050007800a5006600e800af0028
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_0 = 006a00b00090008600fa00ee00a300660038004600ab003100bf004a0071005b
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_0 = 002a003400d2009900c900560000000900a4002700ac00ce00bc001d00770015
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_0 = 00c8004a00b800e000390022005200e300b3007b00bf0077007d006700b4003a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_0 = 009800ad007100ee002200a90010003000b500c10087005d000e004c000400d9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_0 = 009d002f00c900c200560038005c007900e70049004c00600095001600f000e0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_0 = 00d4004100c7002100de0037008200ba00d600e900f5006d000100ec007d0003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_0 = 004e00cc008d001b00ac003c002900da002300a80034008b00e000d20016009f
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_0 = 001e004d000e0040005c00fa00bf00ff00f90008009800f30079000300fb0047
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_0 = 000500c700a7007f003800a800ee003800d6001e00b200d700f2001100220019
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_0 = 0021006e000400ca006100f100fd002200d300350012004a00f20052006f005c
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_0 = 00cc00e400e6004c00bf0071001a008f00bb00f7003300fa00d7002c00da00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_1 = 004d007e00fb002c001800bf003e003a009e00f500c00057005b00c800480030
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_1 = 00fe00220053005f008800d20020001200e50020000c009e0000005100bb00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_1 = 00a200ba000400b500ea005400e700dc000600b1007500e80051009900d200b8
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_1 = 008c0071005f0084009100d9004d0056000900c60005009a00bc00e600f10082
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_1 = 009b006e00a500fa00e300df0019005e0052004c000b00d8009b00dc005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_1 = 0095004a004000f90042009200f700a0005400ac00a600a40019006100a80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_1 = 003f009a009d00fe0027002800ad006c0099008300cb0046003d005300f100e1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_1 = 009800e30056006d0052002f0072003f00a2000b00dd008000ca00a500670005
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_1 = 00a1006100a70009006c005600be00d200a100ad00fa00a500050068008a0071
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_1 = 0040002d0063008200250070005c007e00e4000400de00e6008400d3005100c6
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_1 = 006d00dd009c003100f8006a009f001e00f9001900de00a800cc00b800610077
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_1 = 001e00db00d30023009e008c00d500270046006600d3004d0040004f00ea004d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_1 = 00d400da0088003000200046000100eb00020080004a00520068003c00d6009a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_1 = 005b00db008e007c008c002500a000b50000002700d0007900e3007400b40017
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_1 = 00e800170020004c002900bc00a3002d001f002d005d00b1001500bf00b400f0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_1 = 001500f20009005200270046009c00a9002000a00080006400ad00f800fb00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_1 = 0014009600de003a006500930048009200e20083000900ba006b0042004e0007
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_1 = 008e00ea009f002800e4004300ca000a005a00a1009d005000ec009e00110016
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_1 = 00ac00d300e3001900cc005f00cc003700be005800960047008700a6003c00c0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_1 = 0044003b00b900fa001500b3002e004f006100d5007a002b00020025009000c5
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_1 = 00d3002b001000020086002c005500220052006d00ce00b6006b00cb00d0003d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_1 = 006800c3009e0079002e00f9009c005800f6002f001100c100a8002100fe0097
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_1 = 00b7005800e30028009e001a00b3009d0034005300db00f3001c002a006e0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_1 = 00a800980074003c000500bd0027008900cd002d001f00a8002b003b004a0078
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_1 = 00c6003b005e009a005f000b003e00cf00ce00ab00d400f1004b004f005e0011
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_1 = 0074005d000d00e500550030008a0089009d00a80084001c001b001a00e2006d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_1 = 00240072007600dc0064004200f400860027005100d700010068002b00e400b2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_1 = 00d500910033002300e500b600a800df009a0090000900d3000e0068001f00ef
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_1 = 00000021001d00cb00af00ce004f00be00ff003d004f00f4001000df005b0041
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_1 = 001500c1004000c1008b003d0081005700d1006c00d60081007d00de001900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_1 = 00b600b90079004c00390081008a004d0033007500d10047002a0018000f0010
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_1 = 00de005300b000ed008c00a5001100aa0082001000a80064009f00af00bd00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_1 = 0011004900210007007700b5005400c9005100420066004300af008200510042
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_1 = 00690006000d000900b7002600de00070091006400f00036002500e600d600bc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_1 = 00ea00b900b200ae003a00cb00630008003800cc00d0005400dc00e500e70008
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_1 = 00a500fa0076008e0084007d00b000cf007c005a005900d80098006b00f100db
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_1 = 000200ff00d50085003c002b003500e000f1002700e70095005b005900fd0004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_1 = 0030004d005500640021003c00f20006001a00be003900fc00300050001b00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_1 = 005a00d800f7006500c1009200fb00e300dc00d5001200ee004c00a200570096
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_1 = 00c5002c00b7002d00e300ac0074004300200001007c003c003b007d00c400f4
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_1 = 0092009b00e600870074005000a3004500de005400b20087004a00fc00130015
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_1 = 0040004a009200ce00a500de00ba006900260013001a00a300a800ed00e7008f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_1 = 00480024001100d700b200b3008100d00036009500b3005e006100d6002f00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_1 = 00d20057002a00ad00cf008c008d003100520080009000e700b900bc00780058
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_1 = 003600cb008c009d003b000800af003f000000bc00970054003c007400190032
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_1 = 006300520038009e00f9009c000a006300c600d5007e00b0001b006d00ea003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_1 = 0032006c007f0058008e00ec00b300c000f40064005300130060004f004900fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_1 = 00f6000c00ff00ca006f00c2001500e00042008700b500930015002200860075
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_1 = 0037003800de00bc006700da00f9000500a700380099009300df009e00da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_1 = 007100830007008100700037007200b400b000f100440073005f00d4009900ac
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_1 = 00ae00dd003f001c00d2000100280026008c00fb0084004c00c900de006600da
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_1 = 006300cf005700dc0020000500d800f700f80050007800a5006600e800af0028
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_1 = 006a00b00090008600fa00ee00a300660038004600ab003100bf004a0071005b
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_1 = 002a003400d2009900c900560000000900a4002700ac00ce00bc001d00770015
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_1 = 00c8004a00b800e000390022005200e300b3007b00bf0077007d006700b4003a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_1 = 009800ad007100ee002200a90010003000b500c10087005d000e004c000400d9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_1 = 009d002f00c900c200560038005c007900e70049004c00600095001600f000e0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_1 = 00d4004100c7002100de0037008200ba00d600e900f5006d000100ec007d0003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_1 = 004e00cc008d001b00ac003c002900da002300a80034008b00e000d20016009f
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_1 = 001e004d000e0040005c00fa00bf00ff00f90008009800f30079000300fb0047
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_1 = 000500c700a7007f003800a800ee003800d6001e00b200d700f2001100220019
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_1 = 0021006e000400ca006100f100fd002200d300350012004a00f20052006f005c
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_1 = 00cc00e400e6004c00bf0071001a008f00bb00f7003300fa00d7002c00da00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_2 = 004d007e00fb002c001800bf003e003a009e00f500c00057005b00c800480030
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_2 = 00fe00220053005f008800d20020001200e50020000c009e0000005100bb00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_2 = 00a200ba000400b500ea005400e700dc000600b1007500e80051009900d200b8
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_2 = 008c0071005f0084009100d9004d0056000900c60005009a00bc00e600f10082
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_2 = 009b006e00a500fa00e300df0019005e0052004c000b00d8009b00dc005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_2 = 0095004a004000f90042009200f700a0005400ac00a600a40019006100a80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_2 = 003f009a009d00fe0027002800ad006c0099008300cb0046003d005300f100e1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_2 = 009800e30056006d0052002f0072003f00a2000b00dd008000ca00a500670005
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_2 = 00a1006100a70009006c005600be00d200a100ad00fa00a500050068008a0071
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_2 = 0040002d0063008200250070005c007e00e4000400de00e6008400d3005100c6
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_2 = 006d00dd009c003100f8006a009f001e00f9001900de00a800cc00b800610077
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_2 = 001e00db00d30023009e008c00d500270046006600d3004d0040004f00ea004d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_2 = 00d400da0088003000200046000100eb00020080004a00520068003c00d6009a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_2 = 005b00db008e007c008c002500a000b50000002700d0007900e3007400b40017
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_2 = 00e800170020004c002900bc00a3002d001f002d005d00b1001500bf00b400f0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_2 = 001500f20009005200270046009c00a9002000a00080006400ad00f800fb00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_2 = 0014009600de003a006500930048009200e20083000900ba006b0042004e0007
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_2 = 008e00ea009f002800e4004300ca000a005a00a1009d005000ec009e00110016
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_2 = 00ac00d300e3001900cc005f00cc003700be005800960047008700a6003c00c0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_2 = 0044003b00b900fa001500b3002e004f006100d5007a002b00020025009000c5
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_2 = 00d3002b001000020086002c005500220052006d00ce00b6006b00cb00d0003d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_2 = 006800c3009e0079002e00f9009c005800f6002f001100c100a8002100fe0097
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_2 = 00b7005800e30028009e001a00b3009d0034005300db00f3001c002a006e0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_2 = 00a800980074003c000500bd0027008900cd002d001f00a8002b003b004a0078
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_2 = 00c6003b005e009a005f000b003e00cf00ce00ab00d400f1004b004f005e0011
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_2 = 0074005d000d00e500550030008a0089009d00a80084001c001b001a00e2006d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_2 = 00240072007600dc0064004200f400860027005100d700010068002b00e400b2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_2 = 00d500910033002300e500b600a800df009a0090000900d3000e0068001f00ef
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_2 = 00000021001d00cb00af00ce004f00be00ff003d004f00f4001000df005b0041
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_2 = 001500c1004000c1008b003d0081005700d1006c00d60081007d00de001900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_2 = 00b600b90079004c00390081008a004d0033007500d10047002a0018000f0010
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_2 = 00de005300b000ed008c00a5001100aa0082001000a80064009f00af00bd00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_2 = 0011004900210007007700b5005400c9005100420066004300af008200510042
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_2 = 00690006000d000900b7002600de00070091006400f00036002500e600d600bc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_2 = 00ea00b900b200ae003a00cb00630008003800cc00d0005400dc00e500e70008
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_2 = 00a500fa0076008e0084007d00b000cf007c005a005900d80098006b00f100db
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_2 = 000200ff00d50085003c002b003500e000f1002700e70095005b005900fd0004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_2 = 0030004d005500640021003c00f20006001a00be003900fc00300050001b00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_2 = 005a00d800f7006500c1009200fb00e300dc00d5001200ee004c00a200570096
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_2 = 00c5002c00b7002d00e300ac0074004300200001007c003c003b007d00c400f4
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_2 = 0092009b00e600870074005000a3004500de005400b20087004a00fc00130015
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_2 = 0040004a009200ce00a500de00ba006900260013001a00a300a800ed00e7008f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_2 = 00480024001100d700b200b3008100d00036009500b3005e006100d6002f00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_2 = 00d20057002a00ad00cf008c008d003100520080009000e700b900bc00780058
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_2 = 003600cb008c009d003b000800af003f000000bc00970054003c007400190032
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_2 = 006300520038009e00f9009c000a006300c600d5007e00b0001b006d00ea003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_2 = 0032006c007f0058008e00ec00b300c000f40064005300130060004f004900fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_2 = 00f6000c00ff00ca006f00c2001500e00042008700b500930015002200860075
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_2 = 0037003800de00bc006700da00f9000500a700380099009300df009e00da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_2 = 007100830007008100700037007200b400b000f100440073005f00d4009900ac
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_2 = 00ae00dd003f001c00d2000100280026008c00fb0084004c00c900de006600da
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_2 = 006300cf005700dc0020000500d800f700f80050007800a5006600e800af0028
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_2 = 006a00b00090008600fa00ee00a300660038004600ab003100bf004a0071005b
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_2 = 002a003400d2009900c900560000000900a4002700ac00ce00bc001d00770015
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_2 = 00c8004a00b800e000390022005200e300b3007b00bf0077007d006700b4003a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_2 = 009800ad007100ee002200a90010003000b500c10087005d000e004c000400d9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_2 = 009d002f00c900c200560038005c007900e70049004c00600095001600f000e0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_2 = 00d4004100c7002100de0037008200ba00d600e900f5006d000100ec007d0003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_2 = 004e00cc008d001b00ac003c002900da002300a80034008b00e000d20016009f
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_2 = 001e004d000e0040005c00fa00bf00ff00f90008009800f30079000300fb0047
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_2 = 000500c700a7007f003800a800ee003800d6001e00b200d700f2001100220019
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_2 = 0021006e000400ca006100f100fd002200d300350012004a00f20052006f005c
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_2 = 00cc00e400e6004c00bf0071001a008f00bb00f7003300fa00d7002c00da00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_3 = 004d007e00fb002c001800bf003e003a009e00f500c00057005b00c800480030
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_3 = 00fe00220053005f008800d20020001200e50020000c009e0000005100bb00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_3 = 00a200ba000400b500ea005400e700dc000600b1007500e80051009900d200b8
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_3 = 008c0071005f0084009100d9004d0056000900c60005009a00bc00e600f10082
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_3 = 009b006e00a500fa00e300df0019005e0052004c000b00d8009b00dc005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_3 = 0095004a004000f90042009200f700a0005400ac00a600a40019006100a80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_3 = 003f009a009d00fe0027002800ad006c0099008300cb0046003d005300f100e1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_3 = 009800e30056006d0052002f0072003f00a2000b00dd008000ca00a500670005
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_3 = 00a1006100a70009006c005600be00d200a100ad00fa00a500050068008a0071
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_3 = 0040002d0063008200250070005c007e00e4000400de00e6008400d3005100c6
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_3 = 006d00dd009c003100f8006a009f001e00f9001900de00a800cc00b800610077
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_3 = 001e00db00d30023009e008c00d500270046006600d3004d0040004f00ea004d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_3 = 00d400da0088003000200046000100eb00020080004a00520068003c00d6009a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_3 = 005b00db008e007c008c002500a000b50000002700d0007900e3007400b40017
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_3 = 00e800170020004c002900bc00a3002d001f002d005d00b1001500bf00b400f0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_3 = 001500f20009005200270046009c00a9002000a00080006400ad00f800fb00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_3 = 0014009600de003a006500930048009200e20083000900ba006b0042004e0007
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_3 = 008e00ea009f002800e4004300ca000a005a00a1009d005000ec009e00110016
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_3 = 00ac00d300e3001900cc005f00cc003700be005800960047008700a6003c00c0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_3 = 0044003b00b900fa001500b3002e004f006100d5007a002b00020025009000c5
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_3 = 00d3002b001000020086002c005500220052006d00ce00b6006b00cb00d0003d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_3 = 006800c3009e0079002e00f9009c005800f6002f001100c100a8002100fe0097
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_3 = 00b7005800e30028009e001a00b3009d0034005300db00f3001c002a006e0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_3 = 00a800980074003c000500bd0027008900cd002d001f00a8002b003b004a0078
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_3 = 00c6003b005e009a005f000b003e00cf00ce00ab00d400f1004b004f005e0011
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_3 = 0074005d000d00e500550030008a0089009d00a80084001c001b001a00e2006d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_3 = 00240072007600dc0064004200f400860027005100d700010068002b00e400b2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_3 = 00d500910033002300e500b600a800df009a0090000900d3000e0068001f00ef
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_3 = 00000021001d00cb00af00ce004f00be00ff003d004f00f4001000df005b0041
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_3 = 001500c1004000c1008b003d0081005700d1006c00d60081007d00de001900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_3 = 00b600b90079004c00390081008a004d0033007500d10047002a0018000f0010
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_3 = 00de005300b000ed008c00a5001100aa0082001000a80064009f00af00bd00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_3 = 0011004900210007007700b5005400c9005100420066004300af008200510042
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_3 = 00690006000d000900b7002600de00070091006400f00036002500e600d600bc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_3 = 00ea00b900b200ae003a00cb00630008003800cc00d0005400dc00e500e70008
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_3 = 00a500fa0076008e0084007d00b000cf007c005a005900d80098006b00f100db
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_3 = 000200ff00d50085003c002b003500e000f1002700e70095005b005900fd0004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_3 = 0030004d005500640021003c00f20006001a00be003900fc00300050001b00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_3 = 005a00d800f7006500c1009200fb00e300dc00d5001200ee004c00a200570096
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_3 = 00c5002c00b7002d00e300ac0074004300200001007c003c003b007d00c400f4
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_3 = 0092009b00e600870074005000a3004500de005400b20087004a00fc00130015
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_3 = 0040004a009200ce00a500de00ba006900260013001a00a300a800ed00e7008f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_3 = 00480024001100d700b200b3008100d00036009500b3005e006100d6002f00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_3 = 00d20057002a00ad00cf008c008d003100520080009000e700b900bc00780058
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_3 = 003600cb008c009d003b000800af003f000000bc00970054003c007400190032
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_3 = 006300520038009e00f9009c000a006300c600d5007e00b0001b006d00ea003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_3 = 0032006c007f0058008e00ec00b300c000f40064005300130060004f004900fd
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_3 = 00f6000c00ff00ca006f00c2001500e00042008700b500930015002200860075
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_3 = 0037003800de00bc006700da00f9000500a700380099009300df009e00da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_3 = 007100830007008100700037007200b400b000f100440073005f00d4009900ac
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_3 = 00ae00dd003f001c00d2000100280026008c00fb0084004c00c900de006600da
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_3 = 006300cf005700dc0020000500d800f700f80050007800a5006600e800af0028
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_3 = 006a00b00090008600fa00ee00a300660038004600ab003100bf004a0071005b
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_3 = 002a003400d2009900c900560000000900a4002700ac00ce00bc001d00770015
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_3 = 00c8004a00b800e000390022005200e300b3007b00bf0077007d006700b4003a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_3 = 009800ad007100ee002200a90010003000b500c10087005d000e004c000400d9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_3 = 009d002f00c900c200560038005c007900e70049004c00600095001600f000e0
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_3 = 00d4004100c7002100de0037008200ba00d600e900f5006d000100ec007d0003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_3 = 004e00cc008d001b00ac003c002900da002300a80034008b00e000d20016009f
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_3 = 001e004d000e0040005c00fa00bf00ff00f90008009800f30079000300fb0047
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_3 = 000500c700a7007f003800a800ee003800d6001e00b200d700f2001100220019
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_3 = 0021006e000400ca006100f100fd002200d300350012004a00f20052006f005c
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_3 = 00cc00e400e6004c00bf0071001a008f00bb00f7003300fa00d7002c00da00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_0 = 00d700f0002c007f00ae0046009d003c00a200bf004f0092009600be00570000
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_0 = 00050076005d0090008900cb00ef00aa007c0063000b00d4002e003500af00ed
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_0 = 008600280099004400730016009f002100a2002400d90007006f00af00b7000c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_0 = 00ff00a400d100f500020039003d00b200d800e700bb0041001b007300da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_0 = 008600d8004f0069003400d40079000000aa00e4007f00dc0087005d009200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_0 = 00db009f003900c100d1002500ba00c2002800ce00df004900aa002a002f0020
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_0 = 00a0006400d200f700b50018009a0050002f00d5006b000d007700340058009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_0 = 00ae00d70025003400270054002b001f000b00a800f800ca002f00f600ec00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_0 = 0052004e000c00c600e400cf004100840099007d008600d800d80084001f00be
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_0 = 007900e800da00c200ff00c400e3006800d700de009a007d009c0035005600eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_0 = 002f00af000000dc00b1001a009200d9001600730070007c00e900b2003d00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_0 = 00a60040006c00f80053005d009a002600e800eb0021009800c700780023007a
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_0 = 000000ae009700c100f70050005200ac0093001400aa0005003c000b000a0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_0 = 001600c800050015007600b400a500f200a0007e005a007e0089009800e80099
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_0 = 0014009e006f0007001000340029007100de00a6007200680084002100d7009c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_0 = 004e00790032007600ea00a200ee00eb008a00ef002600a300d700c80069005c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_0 = 00ec00e80088001300e2002800e500f800e500900042005a005400e500b700f5
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_0 = 00740083001d00d600bc000700ab0046002000d3003000dd00f2007a00470013
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_0 = 00bc008b007a00a900890034001a00fc00a3000200ad0059009a008c008900d0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_0 = 00af0090005c00020052003f00670027006b0050008d002e008300a4004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_0 = 008300e100b7005300e2006a004d009200ba0024005b00b8008e009100e90035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_0 = 00ca008900ea00c500fa002400b100fe00ee00180080009c009300cf00d600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_0 = 00ff00b300b0004500b5007b00c300b4008a005000cf002900fd00d400a100b1
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_0 = 00220055006e00d2001b001e00ef00a8007900490032002600b500a100a2008a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_0 = 002200600039002900be00d300f2007a00aa00560044009f00a30023000a0086
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_0 = 000c006100cb005c009b00c800080007002600ee0051007900400058000600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_0 = 00db0070001800dd00cc00f2004400550065002200e6001c00b800a7002a008e
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_0 = 007500c500c6005c00b700f6001800e6007c0082004e007500d5006500f500bc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_0 = 009800ef00360036009c003300cd0076003000b000910078007d004900de006a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_0 = 007d000100ed00c700ea00d3001100b1004600b600eb006100f300f2000a0026
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_0 = 00a90031001e008400db00ee00b4001c0085009300940020006e00b30081003a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_0 = 007d00de0001006c000f00a200c50030004800730033003500a20029009d00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_0 = 00390014007d00a1006a00c80003005300050046000600cc004c001600070019
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_0 = 002500560045004300b100960078006c00770074003200b5009a00cb0042009d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_0 = 00bf00df0025001d0011006400f7007600e800cc00fa00c7002c00e900b100e9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_0 = 00c00092007100b100680059002e0069000c00c7003900ae00a200c0003e00f7
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_0 = 00ef009300ee00f70035003f009400a0002b004000490007000a0059001d005b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_0 = 00ba001e002e001300b100af00460099008f006900c000d200600035002c00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_0 = 007f009f00f0001e00b600d500db00e500bd0094009200b900a900fd005c00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_0 = 00c700d1004000af0056009900b000a6006500a400aa009600f50004003f007e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_0 = 00a700c300290008004b00d300c300e10081006100710037001d00b200f3006a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_0 = 00c8005f0060007f00a700b30044009d00b5002a0048008200230088006400e5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_0 = 0093004a00db00bc005d005c00a00025005d000200230004006a006c00dd0026
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_0 = 00a3002f00fb008400b1004800ba00f200f7004b000d006700840042000c00d3
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_0 = 00830022009100c000de003d0008003b0060001400ee00c000ba00da00640060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_0 = 0032001e005100a100620023007c0021009e002300490062006600b300d40026
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_0 = 00950080009d00a20028003d009300be00a0002f00b600f600a7002400630086
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_0 = 001f007e0004001a0049007b00f90072008b00cd006600b8006500fa009300e2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_0 = 00560030007600e100a200d500780072001200d4006a001d00b2008000dc0038
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_0 = 007a007f0074005b00d000fb002700fd000f00980082001300e2002a00d900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_0 = 00750037003700d300380026002200e300f0000e00b000f100fe004b00030041
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_0 = 00dc003300c400f000d300d100e2006f009e005a00f700cd00590076008b0016
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_0 = 003b00070045003f00fe002d00e300aa002600b80004006f00e400f700340092
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_0 = 004b008500660067006700ae00fc00a10020006500c0000900bb000100ca0014
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_0 = 008b0069005300b000b8009300a40061004000b300c5007600bc003f00f50074
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_0 = 00f4001d000e00e2004e00f8009c0057003c000900c7007700fa003a001300ff
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_0 = 00a3005b0025001100f900f50037006b0015007000e30078004f00b9000400ec
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_0 = 00c1000100240093001e004f00eb00db005300b900620083009700f500b90063
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_0 = 009600eb002100180043008f00eb000100e200690087003d006e00560008008c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_0 = 00bf006a005200f700df00600036009600d300c6009200b200f900b400cc005e
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_0 = 00eb00ef0089000a00520042006d000500b600a2009100e40043000800e900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_0 = 00c20032002e00db0040001e008f00a5004d005f00ff00d2003e003d00310046
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_0 = 0036008900b3000c008800d300b400ef0070008b0029006400f400b50067008b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_1 = 00d700f0002c007f00ae0046009d003c00a200bf004f0092009600be00570000
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_1 = 00050076005d0090008900cb00ef00aa007c0063000b00d4002e003500af00ed
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_1 = 008600280099004400730016009f002100a2002400d90007006f00af00b7000c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_1 = 00ff00a400d100f500020039003d00b200d800e700bb0041001b007300da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_1 = 008600d8004f0069003400d40079000000aa00e4007f00dc0087005d009200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_1 = 00db009f003900c100d1002500ba00c2002800ce00df004900aa002a002f0020
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_1 = 00a0006400d200f700b50018009a0050002f00d5006b000d007700340058009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_1 = 00ae00d70025003400270054002b001f000b00a800f800ca002f00f600ec00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_1 = 0052004e000c00c600e400cf004100840099007d008600d800d80084001f00be
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_1 = 007900e800da00c200ff00c400e3006800d700de009a007d009c0035005600eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_1 = 002f00af000000dc00b1001a009200d9001600730070007c00e900b2003d00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_1 = 00a60040006c00f80053005d009a002600e800eb0021009800c700780023007a
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_1 = 000000ae009700c100f70050005200ac0093001400aa0005003c000b000a0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_1 = 001600c800050015007600b400a500f200a0007e005a007e0089009800e80099
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_1 = 0014009e006f0007001000340029007100de00a6007200680084002100d7009c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_1 = 004e00790032007600ea00a200ee00eb008a00ef002600a300d700c80069005c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_1 = 00ec00e80088001300e2002800e500f800e500900042005a005400e500b700f5
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_1 = 00740083001d00d600bc000700ab0046002000d3003000dd00f2007a00470013
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_1 = 00bc008b007a00a900890034001a00fc00a3000200ad0059009a008c008900d0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_1 = 00af0090005c00020052003f00670027006b0050008d002e008300a4004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_1 = 008300e100b7005300e2006a004d009200ba0024005b00b8008e009100e90035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_1 = 00ca008900ea00c500fa002400b100fe00ee00180080009c009300cf00d600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_1 = 00ff00b300b0004500b5007b00c300b4008a005000cf002900fd00d400a100b1
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_1 = 00220055006e00d2001b001e00ef00a8007900490032002600b500a100a2008a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_1 = 002200600039002900be00d300f2007a00aa00560044009f00a30023000a0086
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_1 = 000c006100cb005c009b00c800080007002600ee0051007900400058000600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_1 = 00db0070001800dd00cc00f2004400550065002200e6001c00b800a7002a008e
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_1 = 007500c500c6005c00b700f6001800e6007c0082004e007500d5006500f500bc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_1 = 009800ef00360036009c003300cd0076003000b000910078007d004900de006a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_1 = 007d000100ed00c700ea00d3001100b1004600b600eb006100f300f2000a0026
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_1 = 00a90031001e008400db00ee00b4001c0085009300940020006e00b30081003a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_1 = 007d00de0001006c000f00a200c50030004800730033003500a20029009d00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_1 = 00390014007d00a1006a00c80003005300050046000600cc004c001600070019
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_1 = 002500560045004300b100960078006c00770074003200b5009a00cb0042009d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_1 = 00bf00df0025001d0011006400f7007600e800cc00fa00c7002c00e900b100e9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_1 = 00c00092007100b100680059002e0069000c00c7003900ae00a200c0003e00f7
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_1 = 00ef009300ee00f70035003f009400a0002b004000490007000a0059001d005b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_1 = 00ba001e002e001300b100af00460099008f006900c000d200600035002c00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_1 = 007f009f00f0001e00b600d500db00e500bd0094009200b900a900fd005c00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_1 = 00c700d1004000af0056009900b000a6006500a400aa009600f50004003f007e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_1 = 00a700c300290008004b00d300c300e10081006100710037001d00b200f3006a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_1 = 00c8005f0060007f00a700b30044009d00b5002a0048008200230088006400e5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_1 = 0093004a00db00bc005d005c00a00025005d000200230004006a006c00dd0026
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_1 = 00a3002f00fb008400b1004800ba00f200f7004b000d006700840042000c00d3
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_1 = 00830022009100c000de003d0008003b0060001400ee00c000ba00da00640060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_1 = 0032001e005100a100620023007c0021009e002300490062006600b300d40026
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_1 = 00950080009d00a20028003d009300be00a0002f00b600f600a7002400630086
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_1 = 001f007e0004001a0049007b00f90072008b00cd006600b8006500fa009300e2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_1 = 00560030007600e100a200d500780072001200d4006a001d00b2008000dc0038
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_1 = 007a007f0074005b00d000fb002700fd000f00980082001300e2002a00d900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_1 = 00750037003700d300380026002200e300f0000e00b000f100fe004b00030041
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_1 = 00dc003300c400f000d300d100e2006f009e005a00f700cd00590076008b0016
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_1 = 003b00070045003f00fe002d00e300aa002600b80004006f00e400f700340092
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_1 = 004b008500660067006700ae00fc00a10020006500c0000900bb000100ca0014
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_1 = 008b0069005300b000b8009300a40061004000b300c5007600bc003f00f50074
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_1 = 00f4001d000e00e2004e00f8009c0057003c000900c7007700fa003a001300ff
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_1 = 00a3005b0025001100f900f50037006b0015007000e30078004f00b9000400ec
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_1 = 00c1000100240093001e004f00eb00db005300b900620083009700f500b90063
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_1 = 009600eb002100180043008f00eb000100e200690087003d006e00560008008c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_1 = 00bf006a005200f700df00600036009600d300c6009200b200f900b400cc005e
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_1 = 00eb00ef0089000a00520042006d000500b600a2009100e40043000800e900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_1 = 00c20032002e00db0040001e008f00a5004d005f00ff00d2003e003d00310046
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_1 = 0036008900b3000c008800d300b400ef0070008b0029006400f400b50067008b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_2 = 00d700f0002c007f00ae0046009d003c00a200bf004f0092009600be00570000
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_2 = 00050076005d0090008900cb00ef00aa007c0063000b00d4002e003500af00ed
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_2 = 008600280099004400730016009f002100a2002400d90007006f00af00b7000c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_2 = 00ff00a400d100f500020039003d00b200d800e700bb0041001b007300da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_2 = 008600d8004f0069003400d40079000000aa00e4007f00dc0087005d009200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_2 = 00db009f003900c100d1002500ba00c2002800ce00df004900aa002a002f0020
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_2 = 00a0006400d200f700b50018009a0050002f00d5006b000d007700340058009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_2 = 00ae00d70025003400270054002b001f000b00a800f800ca002f00f600ec00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_2 = 0052004e000c00c600e400cf004100840099007d008600d800d80084001f00be
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_2 = 007900e800da00c200ff00c400e3006800d700de009a007d009c0035005600eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_2 = 002f00af000000dc00b1001a009200d9001600730070007c00e900b2003d00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_2 = 00a60040006c00f80053005d009a002600e800eb0021009800c700780023007a
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_2 = 000000ae009700c100f70050005200ac0093001400aa0005003c000b000a0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_2 = 001600c800050015007600b400a500f200a0007e005a007e0089009800e80099
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_2 = 0014009e006f0007001000340029007100de00a6007200680084002100d7009c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_2 = 004e00790032007600ea00a200ee00eb008a00ef002600a300d700c80069005c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_2 = 00ec00e80088001300e2002800e500f800e500900042005a005400e500b700f5
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_2 = 00740083001d00d600bc000700ab0046002000d3003000dd00f2007a00470013
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_2 = 00bc008b007a00a900890034001a00fc00a3000200ad0059009a008c008900d0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_2 = 00af0090005c00020052003f00670027006b0050008d002e008300a4004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_2 = 008300e100b7005300e2006a004d009200ba0024005b00b8008e009100e90035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_2 = 00ca008900ea00c500fa002400b100fe00ee00180080009c009300cf00d600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_2 = 00ff00b300b0004500b5007b00c300b4008a005000cf002900fd00d400a100b1
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_2 = 00220055006e00d2001b001e00ef00a8007900490032002600b500a100a2008a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_2 = 002200600039002900be00d300f2007a00aa00560044009f00a30023000a0086
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_2 = 000c006100cb005c009b00c800080007002600ee0051007900400058000600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_2 = 00db0070001800dd00cc00f2004400550065002200e6001c00b800a7002a008e
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_2 = 007500c500c6005c00b700f6001800e6007c0082004e007500d5006500f500bc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_2 = 009800ef00360036009c003300cd0076003000b000910078007d004900de006a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_2 = 007d000100ed00c700ea00d3001100b1004600b600eb006100f300f2000a0026
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_2 = 00a90031001e008400db00ee00b4001c0085009300940020006e00b30081003a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_2 = 007d00de0001006c000f00a200c50030004800730033003500a20029009d00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_2 = 00390014007d00a1006a00c80003005300050046000600cc004c001600070019
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_2 = 002500560045004300b100960078006c00770074003200b5009a00cb0042009d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_2 = 00bf00df0025001d0011006400f7007600e800cc00fa00c7002c00e900b100e9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_2 = 00c00092007100b100680059002e0069000c00c7003900ae00a200c0003e00f7
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_2 = 00ef009300ee00f70035003f009400a0002b004000490007000a0059001d005b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_2 = 00ba001e002e001300b100af00460099008f006900c000d200600035002c00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_2 = 007f009f00f0001e00b600d500db00e500bd0094009200b900a900fd005c00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_2 = 00c700d1004000af0056009900b000a6006500a400aa009600f50004003f007e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_2 = 00a700c300290008004b00d300c300e10081006100710037001d00b200f3006a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_2 = 00c8005f0060007f00a700b30044009d00b5002a0048008200230088006400e5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_2 = 0093004a00db00bc005d005c00a00025005d000200230004006a006c00dd0026
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_2 = 00a3002f00fb008400b1004800ba00f200f7004b000d006700840042000c00d3
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_2 = 00830022009100c000de003d0008003b0060001400ee00c000ba00da00640060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_2 = 0032001e005100a100620023007c0021009e002300490062006600b300d40026
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_2 = 00950080009d00a20028003d009300be00a0002f00b600f600a7002400630086
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_2 = 001f007e0004001a0049007b00f90072008b00cd006600b8006500fa009300e2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_2 = 00560030007600e100a200d500780072001200d4006a001d00b2008000dc0038
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_2 = 007a007f0074005b00d000fb002700fd000f00980082001300e2002a00d900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_2 = 00750037003700d300380026002200e300f0000e00b000f100fe004b00030041
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_2 = 00dc003300c400f000d300d100e2006f009e005a00f700cd00590076008b0016
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_2 = 003b00070045003f00fe002d00e300aa002600b80004006f00e400f700340092
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_2 = 004b008500660067006700ae00fc00a10020006500c0000900bb000100ca0014
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_2 = 008b0069005300b000b8009300a40061004000b300c5007600bc003f00f50074
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_2 = 00f4001d000e00e2004e00f8009c0057003c000900c7007700fa003a001300ff
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_2 = 00a3005b0025001100f900f50037006b0015007000e30078004f00b9000400ec
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_2 = 00c1000100240093001e004f00eb00db005300b900620083009700f500b90063
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_2 = 009600eb002100180043008f00eb000100e200690087003d006e00560008008c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_2 = 00bf006a005200f700df00600036009600d300c6009200b200f900b400cc005e
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_2 = 00eb00ef0089000a00520042006d000500b600a2009100e40043000800e900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_2 = 00c20032002e00db0040001e008f00a5004d005f00ff00d2003e003d00310046
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_2 = 0036008900b3000c008800d300b400ef0070008b0029006400f400b50067008b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_3 = 00d700f0002c007f00ae0046009d003c00a200bf004f0092009600be00570000
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_3 = 00050076005d0090008900cb00ef00aa007c0063000b00d4002e003500af00ed
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_3 = 008600280099004400730016009f002100a2002400d90007006f00af00b7000c
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_3 = 00ff00a400d100f500020039003d00b200d800e700bb0041001b007300da00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_3 = 008600d8004f0069003400d40079000000aa00e4007f00dc0087005d009200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_3 = 00db009f003900c100d1002500ba00c2002800ce00df004900aa002a002f0020
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_3 = 00a0006400d200f700b50018009a0050002f00d5006b000d007700340058009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_3 = 00ae00d70025003400270054002b001f000b00a800f800ca002f00f600ec00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_3 = 0052004e000c00c600e400cf004100840099007d008600d800d80084001f00be
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_3 = 007900e800da00c200ff00c400e3006800d700de009a007d009c0035005600eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_3 = 002f00af000000dc00b1001a009200d9001600730070007c00e900b2003d00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_3 = 00a60040006c00f80053005d009a002600e800eb0021009800c700780023007a
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_3 = 000000ae009700c100f70050005200ac0093001400aa0005003c000b000a0063
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_3 = 001600c800050015007600b400a500f200a0007e005a007e0089009800e80099
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_3 = 0014009e006f0007001000340029007100de00a6007200680084002100d7009c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_3 = 004e00790032007600ea00a200ee00eb008a00ef002600a300d700c80069005c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_3 = 00ec00e80088001300e2002800e500f800e500900042005a005400e500b700f5
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_3 = 00740083001d00d600bc000700ab0046002000d3003000dd00f2007a00470013
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_3 = 00bc008b007a00a900890034001a00fc00a3000200ad0059009a008c008900d0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_3 = 00af0090005c00020052003f00670027006b0050008d002e008300a4004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_3 = 008300e100b7005300e2006a004d009200ba0024005b00b8008e009100e90035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_3 = 00ca008900ea00c500fa002400b100fe00ee00180080009c009300cf00d600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_3 = 00ff00b300b0004500b5007b00c300b4008a005000cf002900fd00d400a100b1
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_3 = 00220055006e00d2001b001e00ef00a8007900490032002600b500a100a2008a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_3 = 002200600039002900be00d300f2007a00aa00560044009f00a30023000a0086
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_3 = 000c006100cb005c009b00c800080007002600ee0051007900400058000600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_3 = 00db0070001800dd00cc00f2004400550065002200e6001c00b800a7002a008e
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_3 = 007500c500c6005c00b700f6001800e6007c0082004e007500d5006500f500bc
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_3 = 009800ef00360036009c003300cd0076003000b000910078007d004900de006a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_3 = 007d000100ed00c700ea00d3001100b1004600b600eb006100f300f2000a0026
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_3 = 00a90031001e008400db00ee00b4001c0085009300940020006e00b30081003a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_3 = 007d00de0001006c000f00a200c50030004800730033003500a20029009d00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_3 = 00390014007d00a1006a00c80003005300050046000600cc004c001600070019
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_3 = 002500560045004300b100960078006c00770074003200b5009a00cb0042009d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_3 = 00bf00df0025001d0011006400f7007600e800cc00fa00c7002c00e900b100e9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_3 = 00c00092007100b100680059002e0069000c00c7003900ae00a200c0003e00f7
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_3 = 00ef009300ee00f70035003f009400a0002b004000490007000a0059001d005b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_3 = 00ba001e002e001300b100af00460099008f006900c000d200600035002c00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_3 = 007f009f00f0001e00b600d500db00e500bd0094009200b900a900fd005c00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_3 = 00c700d1004000af0056009900b000a6006500a400aa009600f50004003f007e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_3 = 00a700c300290008004b00d300c300e10081006100710037001d00b200f3006a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_3 = 00c8005f0060007f00a700b30044009d00b5002a0048008200230088006400e5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_3 = 0093004a00db00bc005d005c00a00025005d000200230004006a006c00dd0026
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_3 = 00a3002f00fb008400b1004800ba00f200f7004b000d006700840042000c00d3
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_3 = 00830022009100c000de003d0008003b0060001400ee00c000ba00da00640060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_3 = 0032001e005100a100620023007c0021009e002300490062006600b300d40026
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_3 = 00950080009d00a20028003d009300be00a0002f00b600f600a7002400630086
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_3 = 001f007e0004001a0049007b00f90072008b00cd006600b8006500fa009300e2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_3 = 00560030007600e100a200d500780072001200d4006a001d00b2008000dc0038
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_3 = 007a007f0074005b00d000fb002700fd000f00980082001300e2002a00d900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_3 = 00750037003700d300380026002200e300f0000e00b000f100fe004b00030041
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_3 = 00dc003300c400f000d300d100e2006f009e005a00f700cd00590076008b0016
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_3 = 003b00070045003f00fe002d00e300aa002600b80004006f00e400f700340092
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_3 = 004b008500660067006700ae00fc00a10020006500c0000900bb000100ca0014
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_3 = 008b0069005300b000b8009300a40061004000b300c5007600bc003f00f50074
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_3 = 00f4001d000e00e2004e00f8009c0057003c000900c7007700fa003a001300ff
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_3 = 00a3005b0025001100f900f50037006b0015007000e30078004f00b9000400ec
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_3 = 00c1000100240093001e004f00eb00db005300b900620083009700f500b90063
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_3 = 009600eb002100180043008f00eb000100e200690087003d006e00560008008c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_3 = 00bf006a005200f700df00600036009600d300c6009200b200f900b400cc005e
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_3 = 00eb00ef0089000a00520042006d000500b600a2009100e40043000800e900ea
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_3 = 00c20032002e00db0040001e008f00a5004d005f00ff00d2003e003d00310046
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_3 = 0036008900b3000c008800d300b400ef0070008b0029006400f400b50067008b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_0 = 00a2008500b300990035003400f700600039002800c400d10078008400a600f6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_0 = 0013003900f50073008700e300560089006b003c006c00f100b700fa004a006d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_0 = 00e7006f007b005d00dd00ab00e200b0009400e3003e006c006600140073003a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_0 = 0021006900a5003400de002b0000007b004d00aa006200d900fc008c005600b0
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_0 = 00ed008e002000cd001b00770087007c00c300b6004600ec00a7004400ba0040
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_0 = 008300ef009f005e00bf00710033002f00330015006f0034004a00bf00d30005
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_0 = 000c00fe00af00ae00a700e60025006b001700d40078008500b500110040003a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_0 = 007100d200340090005000c2006e00d600d600b800d9003e005c0031009300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_0 = 0093005a00ce008100d0006d001f0041009e00a00068007c002800fa00260097
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_0 = 0071003000c700df000c00ea007e005a008e000200eb00b5007b009a00a800a8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_0 = 009100af0091004400da000000110082007000fe00cc003f006f00e200470043
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_0 = 00a600060001001d00880040000f005b00b90029006f00c5001a00ac004900ed
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_0 = 001500c00044005200d00039008a008f00bc006b00a000a70038009c0025007c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_0 = 002d00d50078007d00c5005900e20085003e0053000a005e00c3003800970002
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_0 = 008600350071009a00f500e000cf00b30018006d0067001800e100df003300e4
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_0 = 0038001c008d007a00e100910026001700850010008600bb00b7005300fc00a0
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_0 = 00e8009300a800b600a6003300af001e00c2004300ef007f00a9001f00030034
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_0 = 003100f20011001e00c400750032003900870005000f00bd00020009005f00ba
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_0 = 00720086009d009700e600ec004600aa0068003000c300d6005b001e000600a9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_0 = 00f70072000b0073007300b800eb000e00d0002f00a200d9000b00fc006900b7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_0 = 00bb0089006600c400d30033003e007f004900c3003a009c009b005500ee00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_0 = 001700e80074000e003500d6006800a30076008a0075009b009b006f00f30074
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_0 = 00f7005b003e00b3005b00d000a400f1002b006100b0008200f400ec00eb00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_0 = 00ad00e3007600a600a200700060004f000100ef001200d400e6006e0027000b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_0 = 00dc000400fc00c8001700a2009300770004009a003d00c4004100c7001a001b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_0 = 00a9007100b6003b0094009d001300e500da0071003d0019006d001b00ff00bb
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_0 = 003200d10087001c0093009d0046001000e200c9000b0003009e00cc00c90059
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_0 = 003e00bd00a000e600ae007e006a00b1004200c6008000e900dd00e400f70022
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_0 = 007c00ab0030000d0002004600580026002c00a2006b007d000200f000f1005a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_0 = 00c7004e00e3004200d900fc0098009c000200da00d400d600a9008e008c00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_0 = 00c9006d005f0059000e004500e0009d006600e2002f00a1004f003000b5002a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_0 = 005900e700ed00070063002300f70079007100df00050026006400af00800019
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_0 = 007c00dd00a1000e00fc00e700b800a9000b005600b800b600f5006d00380096
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_0 = 006100ed006200620039006d001e00970053005900e900d6007e00f60010005d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_0 = 002d002e00d000b3008b002000ee00cd005500f9006c004700d300c9000e0026
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_0 = 0096007400ad00800052005700e4008f00c2000f0022003d005f00e900b400de
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_0 = 00c300a600d3008400b7008300cf000a0050004200690010003400a60074008e
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_0 = 0093003f002a005800e400210078004d0090005e0018009d006600070080001c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_0 = 00360031005800200082009d004b00660063004a00c40046005b009b00390044
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_0 = 00b400650084007e00b3006c00560028000d009900b0009700b80040001300e0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_0 = 00d0001f006c002300dc00e8004900fd005e009e00e600fb00b5001a002200fb
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_0 = 006a00b100f500820012004d00ce002d0089005d00e300b60061006600d80054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_0 = 0059001800f8004b000b000c0010009400eb009a00150081006900b3008200f1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_0 = 007e006e004100b4004a00af007b0031000600ef003900f200e4002b000a000a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_0 = 003500be00e8001c00c1009e00aa00f30031002c004a004500f2006e00bf00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_0 = 003a006100f70012005a00f000bb00d200280074001f0069000d00ab004d00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_0 = 00ee00c1003f000900ce002c005f00e200f3008b00f100a200fc002600ff006e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_0 = 00b3009200de00720090002a00ad000500fd005c0010009700ff0016008f0057
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_0 = 0043007100400018002600d500120061006300530032005d009a00930002006b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_0 = 007a007a000a00ef007200f000e80054003800d9003a000f008400c000550007
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_0 = 00e800fa0047006200bd009c001400d1000d00aa00e100fb007e0063006400f3
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_0 = 00fb00c70056000f004900ab001d00ba003900da00a7007b0075003300e50039
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_0 = 008e00d0007e00d100570074001f00da009c007d00b00001003b001a00bc0035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_0 = 003e00ee004c008400d200ee0034004900a500a90076008d0018001100bd005b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_0 = 0042006e00da0093005400f300e900d80023008400570078006900ea001c0071
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_0 = 00e60053001000d600f200750034008e00f30016006800430033000700d3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_0 = 00fe001a000100260072009000ca003a00a700fa002a006100aa009300a9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_0 = 00ae001900d300d400b200aa00d800de00c20044001800f600f80024009400b9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_0 = 00ec00e30005008b0032009a00ad00b500c300d4009000e40025008700ea007c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_0 = 007000d500ce003a000d00640001009f009c00f1000200e90062007000a30083
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_0 = 00a3005f00a600fb00760035000b009a00b00030005300000098007300720066
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_0 = 007e00a1005d00b30014002b00db001f00c300ac000f008c009f001c005d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_0 = 007e00e6007a009900030047001d00220048001800d3000200980091007e0093
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_1 = 00a2008500b300990035003400f700600039002800c400d10078008400a600f6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_1 = 0013003900f50073008700e300560089006b003c006c00f100b700fa004a006d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_1 = 00e7006f007b005d00dd00ab00e200b0009400e3003e006c006600140073003a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_1 = 0021006900a5003400de002b0000007b004d00aa006200d900fc008c005600b0
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_1 = 00ed008e002000cd001b00770087007c00c300b6004600ec00a7004400ba0040
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_1 = 008300ef009f005e00bf00710033002f00330015006f0034004a00bf00d30005
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_1 = 000c00fe00af00ae00a700e60025006b001700d40078008500b500110040003a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_1 = 007100d200340090005000c2006e00d600d600b800d9003e005c0031009300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_1 = 0093005a00ce008100d0006d001f0041009e00a00068007c002800fa00260097
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_1 = 0071003000c700df000c00ea007e005a008e000200eb00b5007b009a00a800a8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_1 = 009100af0091004400da000000110082007000fe00cc003f006f00e200470043
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_1 = 00a600060001001d00880040000f005b00b90029006f00c5001a00ac004900ed
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_1 = 001500c00044005200d00039008a008f00bc006b00a000a70038009c0025007c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_1 = 002d00d50078007d00c5005900e20085003e0053000a005e00c3003800970002
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_1 = 008600350071009a00f500e000cf00b30018006d0067001800e100df003300e4
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_1 = 0038001c008d007a00e100910026001700850010008600bb00b7005300fc00a0
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_1 = 00e8009300a800b600a6003300af001e00c2004300ef007f00a9001f00030034
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_1 = 003100f20011001e00c400750032003900870005000f00bd00020009005f00ba
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_1 = 00720086009d009700e600ec004600aa0068003000c300d6005b001e000600a9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_1 = 00f70072000b0073007300b800eb000e00d0002f00a200d9000b00fc006900b7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_1 = 00bb0089006600c400d30033003e007f004900c3003a009c009b005500ee00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_1 = 001700e80074000e003500d6006800a30076008a0075009b009b006f00f30074
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_1 = 00f7005b003e00b3005b00d000a400f1002b006100b0008200f400ec00eb00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_1 = 00ad00e3007600a600a200700060004f000100ef001200d400e6006e0027000b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_1 = 00dc000400fc00c8001700a2009300770004009a003d00c4004100c7001a001b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_1 = 00a9007100b6003b0094009d001300e500da0071003d0019006d001b00ff00bb
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_1 = 003200d10087001c0093009d0046001000e200c9000b0003009e00cc00c90059
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_1 = 003e00bd00a000e600ae007e006a00b1004200c6008000e900dd00e400f70022
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_1 = 007c00ab0030000d0002004600580026002c00a2006b007d000200f000f1005a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_1 = 00c7004e00e3004200d900fc0098009c000200da00d400d600a9008e008c00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_1 = 00c9006d005f0059000e004500e0009d006600e2002f00a1004f003000b5002a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_1 = 005900e700ed00070063002300f70079007100df00050026006400af00800019
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_1 = 007c00dd00a1000e00fc00e700b800a9000b005600b800b600f5006d00380096
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_1 = 006100ed006200620039006d001e00970053005900e900d6007e00f60010005d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_1 = 002d002e00d000b3008b002000ee00cd005500f9006c004700d300c9000e0026
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_1 = 0096007400ad00800052005700e4008f00c2000f0022003d005f00e900b400de
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_1 = 00c300a600d3008400b7008300cf000a0050004200690010003400a60074008e
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_1 = 0093003f002a005800e400210078004d0090005e0018009d006600070080001c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_1 = 00360031005800200082009d004b00660063004a00c40046005b009b00390044
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_1 = 00b400650084007e00b3006c00560028000d009900b0009700b80040001300e0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_1 = 00d0001f006c002300dc00e8004900fd005e009e00e600fb00b5001a002200fb
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_1 = 006a00b100f500820012004d00ce002d0089005d00e300b60061006600d80054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_1 = 0059001800f8004b000b000c0010009400eb009a00150081006900b3008200f1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_1 = 007e006e004100b4004a00af007b0031000600ef003900f200e4002b000a000a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_1 = 003500be00e8001c00c1009e00aa00f30031002c004a004500f2006e00bf00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_1 = 003a006100f70012005a00f000bb00d200280074001f0069000d00ab004d00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_1 = 00ee00c1003f000900ce002c005f00e200f3008b00f100a200fc002600ff006e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_1 = 00b3009200de00720090002a00ad000500fd005c0010009700ff0016008f0057
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_1 = 0043007100400018002600d500120061006300530032005d009a00930002006b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_1 = 007a007a000a00ef007200f000e80054003800d9003a000f008400c000550007
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_1 = 00e800fa0047006200bd009c001400d1000d00aa00e100fb007e0063006400f3
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_1 = 00fb00c70056000f004900ab001d00ba003900da00a7007b0075003300e50039
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_1 = 008e00d0007e00d100570074001f00da009c007d00b00001003b001a00bc0035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_1 = 003e00ee004c008400d200ee0034004900a500a90076008d0018001100bd005b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_1 = 0042006e00da0093005400f300e900d80023008400570078006900ea001c0071
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_1 = 00e60053001000d600f200750034008e00f30016006800430033000700d3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_1 = 00fe001a000100260072009000ca003a00a700fa002a006100aa009300a9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_1 = 00ae001900d300d400b200aa00d800de00c20044001800f600f80024009400b9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_1 = 00ec00e30005008b0032009a00ad00b500c300d4009000e40025008700ea007c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_1 = 007000d500ce003a000d00640001009f009c00f1000200e90062007000a30083
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_1 = 00a3005f00a600fb00760035000b009a00b00030005300000098007300720066
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_1 = 007e00a1005d00b30014002b00db001f00c300ac000f008c009f001c005d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_1 = 007e00e6007a009900030047001d00220048001800d3000200980091007e0093
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_2 = 00a2008500b300990035003400f700600039002800c400d10078008400a600f6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_2 = 0013003900f50073008700e300560089006b003c006c00f100b700fa004a006d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_2 = 00e7006f007b005d00dd00ab00e200b0009400e3003e006c006600140073003a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_2 = 0021006900a5003400de002b0000007b004d00aa006200d900fc008c005600b0
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_2 = 00ed008e002000cd001b00770087007c00c300b6004600ec00a7004400ba0040
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_2 = 008300ef009f005e00bf00710033002f00330015006f0034004a00bf00d30005
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_2 = 000c00fe00af00ae00a700e60025006b001700d40078008500b500110040003a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_2 = 007100d200340090005000c2006e00d600d600b800d9003e005c0031009300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_2 = 0093005a00ce008100d0006d001f0041009e00a00068007c002800fa00260097
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_2 = 0071003000c700df000c00ea007e005a008e000200eb00b5007b009a00a800a8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_2 = 009100af0091004400da000000110082007000fe00cc003f006f00e200470043
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_2 = 00a600060001001d00880040000f005b00b90029006f00c5001a00ac004900ed
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_2 = 001500c00044005200d00039008a008f00bc006b00a000a70038009c0025007c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_2 = 002d00d50078007d00c5005900e20085003e0053000a005e00c3003800970002
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_2 = 008600350071009a00f500e000cf00b30018006d0067001800e100df003300e4
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_2 = 0038001c008d007a00e100910026001700850010008600bb00b7005300fc00a0
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_2 = 00e8009300a800b600a6003300af001e00c2004300ef007f00a9001f00030034
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_2 = 003100f20011001e00c400750032003900870005000f00bd00020009005f00ba
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_2 = 00720086009d009700e600ec004600aa0068003000c300d6005b001e000600a9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_2 = 00f70072000b0073007300b800eb000e00d0002f00a200d9000b00fc006900b7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_2 = 00bb0089006600c400d30033003e007f004900c3003a009c009b005500ee00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_2 = 001700e80074000e003500d6006800a30076008a0075009b009b006f00f30074
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_2 = 00f7005b003e00b3005b00d000a400f1002b006100b0008200f400ec00eb00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_2 = 00ad00e3007600a600a200700060004f000100ef001200d400e6006e0027000b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_2 = 00dc000400fc00c8001700a2009300770004009a003d00c4004100c7001a001b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_2 = 00a9007100b6003b0094009d001300e500da0071003d0019006d001b00ff00bb
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_2 = 003200d10087001c0093009d0046001000e200c9000b0003009e00cc00c90059
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_2 = 003e00bd00a000e600ae007e006a00b1004200c6008000e900dd00e400f70022
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_2 = 007c00ab0030000d0002004600580026002c00a2006b007d000200f000f1005a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_2 = 00c7004e00e3004200d900fc0098009c000200da00d400d600a9008e008c00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_2 = 00c9006d005f0059000e004500e0009d006600e2002f00a1004f003000b5002a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_2 = 005900e700ed00070063002300f70079007100df00050026006400af00800019
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_2 = 007c00dd00a1000e00fc00e700b800a9000b005600b800b600f5006d00380096
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_2 = 006100ed006200620039006d001e00970053005900e900d6007e00f60010005d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_2 = 002d002e00d000b3008b002000ee00cd005500f9006c004700d300c9000e0026
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_2 = 0096007400ad00800052005700e4008f00c2000f0022003d005f00e900b400de
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_2 = 00c300a600d3008400b7008300cf000a0050004200690010003400a60074008e
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_2 = 0093003f002a005800e400210078004d0090005e0018009d006600070080001c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_2 = 00360031005800200082009d004b00660063004a00c40046005b009b00390044
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_2 = 00b400650084007e00b3006c00560028000d009900b0009700b80040001300e0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_2 = 00d0001f006c002300dc00e8004900fd005e009e00e600fb00b5001a002200fb
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_2 = 006a00b100f500820012004d00ce002d0089005d00e300b60061006600d80054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_2 = 0059001800f8004b000b000c0010009400eb009a00150081006900b3008200f1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_2 = 007e006e004100b4004a00af007b0031000600ef003900f200e4002b000a000a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_2 = 003500be00e8001c00c1009e00aa00f30031002c004a004500f2006e00bf00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_2 = 003a006100f70012005a00f000bb00d200280074001f0069000d00ab004d00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_2 = 00ee00c1003f000900ce002c005f00e200f3008b00f100a200fc002600ff006e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_2 = 00b3009200de00720090002a00ad000500fd005c0010009700ff0016008f0057
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_2 = 0043007100400018002600d500120061006300530032005d009a00930002006b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_2 = 007a007a000a00ef007200f000e80054003800d9003a000f008400c000550007
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_2 = 00e800fa0047006200bd009c001400d1000d00aa00e100fb007e0063006400f3
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_2 = 00fb00c70056000f004900ab001d00ba003900da00a7007b0075003300e50039
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_2 = 008e00d0007e00d100570074001f00da009c007d00b00001003b001a00bc0035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_2 = 003e00ee004c008400d200ee0034004900a500a90076008d0018001100bd005b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_2 = 0042006e00da0093005400f300e900d80023008400570078006900ea001c0071
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_2 = 00e60053001000d600f200750034008e00f30016006800430033000700d3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_2 = 00fe001a000100260072009000ca003a00a700fa002a006100aa009300a9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_2 = 00ae001900d300d400b200aa00d800de00c20044001800f600f80024009400b9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_2 = 00ec00e30005008b0032009a00ad00b500c300d4009000e40025008700ea007c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_2 = 007000d500ce003a000d00640001009f009c00f1000200e90062007000a30083
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_2 = 00a3005f00a600fb00760035000b009a00b00030005300000098007300720066
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_2 = 007e00a1005d00b30014002b00db001f00c300ac000f008c009f001c005d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_2 = 007e00e6007a009900030047001d00220048001800d3000200980091007e0093
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_3 = 00a2008500b300990035003400f700600039002800c400d10078008400a600f6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_3 = 0013003900f50073008700e300560089006b003c006c00f100b700fa004a006d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_3 = 00e7006f007b005d00dd00ab00e200b0009400e3003e006c006600140073003a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_3 = 0021006900a5003400de002b0000007b004d00aa006200d900fc008c005600b0
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_3 = 00ed008e002000cd001b00770087007c00c300b6004600ec00a7004400ba0040
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_3 = 008300ef009f005e00bf00710033002f00330015006f0034004a00bf00d30005
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_3 = 000c00fe00af00ae00a700e60025006b001700d40078008500b500110040003a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_3 = 007100d200340090005000c2006e00d600d600b800d9003e005c0031009300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_3 = 0093005a00ce008100d0006d001f0041009e00a00068007c002800fa00260097
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_3 = 0071003000c700df000c00ea007e005a008e000200eb00b5007b009a00a800a8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_3 = 009100af0091004400da000000110082007000fe00cc003f006f00e200470043
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_3 = 00a600060001001d00880040000f005b00b90029006f00c5001a00ac004900ed
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_3 = 001500c00044005200d00039008a008f00bc006b00a000a70038009c0025007c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_3 = 002d00d50078007d00c5005900e20085003e0053000a005e00c3003800970002
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_3 = 008600350071009a00f500e000cf00b30018006d0067001800e100df003300e4
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_3 = 0038001c008d007a00e100910026001700850010008600bb00b7005300fc00a0
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_3 = 00e8009300a800b600a6003300af001e00c2004300ef007f00a9001f00030034
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_3 = 003100f20011001e00c400750032003900870005000f00bd00020009005f00ba
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_3 = 00720086009d009700e600ec004600aa0068003000c300d6005b001e000600a9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_3 = 00f70072000b0073007300b800eb000e00d0002f00a200d9000b00fc006900b7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_3 = 00bb0089006600c400d30033003e007f004900c3003a009c009b005500ee00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_3 = 001700e80074000e003500d6006800a30076008a0075009b009b006f00f30074
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_3 = 00f7005b003e00b3005b00d000a400f1002b006100b0008200f400ec00eb00c4
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_3 = 00ad00e3007600a600a200700060004f000100ef001200d400e6006e0027000b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_3 = 00dc000400fc00c8001700a2009300770004009a003d00c4004100c7001a001b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_3 = 00a9007100b6003b0094009d001300e500da0071003d0019006d001b00ff00bb
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_3 = 003200d10087001c0093009d0046001000e200c9000b0003009e00cc00c90059
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_3 = 003e00bd00a000e600ae007e006a00b1004200c6008000e900dd00e400f70022
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_3 = 007c00ab0030000d0002004600580026002c00a2006b007d000200f000f1005a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_3 = 00c7004e00e3004200d900fc0098009c000200da00d400d600a9008e008c00d7
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_3 = 00c9006d005f0059000e004500e0009d006600e2002f00a1004f003000b5002a
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_3 = 005900e700ed00070063002300f70079007100df00050026006400af00800019
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_3 = 007c00dd00a1000e00fc00e700b800a9000b005600b800b600f5006d00380096
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_3 = 006100ed006200620039006d001e00970053005900e900d6007e00f60010005d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_3 = 002d002e00d000b3008b002000ee00cd005500f9006c004700d300c9000e0026
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_3 = 0096007400ad00800052005700e4008f00c2000f0022003d005f00e900b400de
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_3 = 00c300a600d3008400b7008300cf000a0050004200690010003400a60074008e
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_3 = 0093003f002a005800e400210078004d0090005e0018009d006600070080001c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_3 = 00360031005800200082009d004b00660063004a00c40046005b009b00390044
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_3 = 00b400650084007e00b3006c00560028000d009900b0009700b80040001300e0
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_3 = 00d0001f006c002300dc00e8004900fd005e009e00e600fb00b5001a002200fb
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_3 = 006a00b100f500820012004d00ce002d0089005d00e300b60061006600d80054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_3 = 0059001800f8004b000b000c0010009400eb009a00150081006900b3008200f1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_3 = 007e006e004100b4004a00af007b0031000600ef003900f200e4002b000a000a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_3 = 003500be00e8001c00c1009e00aa00f30031002c004a004500f2006e00bf00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_3 = 003a006100f70012005a00f000bb00d200280074001f0069000d00ab004d00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_3 = 00ee00c1003f000900ce002c005f00e200f3008b00f100a200fc002600ff006e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_3 = 00b3009200de00720090002a00ad000500fd005c0010009700ff0016008f0057
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_3 = 0043007100400018002600d500120061006300530032005d009a00930002006b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_3 = 007a007a000a00ef007200f000e80054003800d9003a000f008400c000550007
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_3 = 00e800fa0047006200bd009c001400d1000d00aa00e100fb007e0063006400f3
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_3 = 00fb00c70056000f004900ab001d00ba003900da00a7007b0075003300e50039
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_3 = 008e00d0007e00d100570074001f00da009c007d00b00001003b001a00bc0035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_3 = 003e00ee004c008400d200ee0034004900a500a90076008d0018001100bd005b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_3 = 0042006e00da0093005400f300e900d80023008400570078006900ea001c0071
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_3 = 00e60053001000d600f200750034008e00f30016006800430033000700d3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_3 = 00fe001a000100260072009000ca003a00a700fa002a006100aa009300a9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_3 = 00ae001900d300d400b200aa00d800de00c20044001800f600f80024009400b9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_3 = 00ec00e30005008b0032009a00ad00b500c300d4009000e40025008700ea007c
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_3 = 007000d500ce003a000d00640001009f009c00f1000200e90062007000a30083
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_3 = 00a3005f00a600fb00760035000b009a00b00030005300000098007300720066
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_3 = 007e00a1005d00b30014002b00db001f00c300ac000f008c009f001c005d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_3 = 007e00e6007a009900030047001d00220048001800d3000200980091007e0093
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_0 = 00a2004f0051005f00db003f00410093004c00c3006b003c00380093006f00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_0 = 00c6000c00e6007c00d800a70011007e0025009900ff000c009700cc00f500df
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_0 = 0072008d005400db00ce009900d000fa007100ab0000000a000e009700b700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_0 = 00fc005700bf009700c200a20041006d002c006100140046000200f7009c007d
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_0 = 0067001c0038007b00b80036003e006800e200e3001000ec00200025005400f1
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_0 = 009f00df000d0045007a00c6000a00ca0036003d005400b5009a0041009100b0
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_0 = 0000006100210021008c00230063007c00a100b200e20095007a003f00f3005f
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_0 = 00a5007900e700d8003100160009005900d60021001200f60064005900e5004c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_0 = 00ac009f00e20069006d006c0010007e006400e50057001700f20060007f0072
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_0 = 002f000700f500c5004d001b00de00b9009b00c0005a00db009a000500b7002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_0 = 005c00fc00cf006d002c00df000a005800de007d00360045009a0039003300fe
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_0 = 00d8001c00e400d000d60080008100d6006c00060008000c005d00c1004a001d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_0 = 005c00ab006d00b100b700c500eb00a0005400610064001300f4000a00150023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_0 = 0001006500fa00e4008100b800ca002500c700360002001b00200053004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_0 = 0034003b0097000d00fb004200cc009100660025001b00ea00a9004700600090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_0 = 00c7007600e8007700390099009b00bb008b008b00e300d9005100a800f7006b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_0 = 005600180050003c006600ef009300aa008000ff00d800c600270062006d0059
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_0 = 00cc00a400cb00b6005e006800aa000400d1004700f900a600d900e8000400df
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_0 = 007f005d0054008d00ca00ce00ab00be004d00c20074000e00d8004900d500b1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_0 = 0058008800e600830091004400460080008400ed009f002000b900e500c700ff
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_0 = 008e00d100d70094000f00ef008b0026001e003a00da001900ab009500c00054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_0 = 0030000b0020003a00f700e30086009400a2006300f800ce0020006a00dd00ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_0 = 00cb00b000cd004700370073002b00110063009a004a00340067008d006200b9
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_0 = 00c30047001f00b300c100ec0042007800db00a30078001b00770084001b00bc
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_0 = 001400d1004e006300d8009900a1000100550080008c009900c800cd007500a6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_0 = 0059008f00e4003200eb00b1009800f20065005a0023004100a1006700760099
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_0 = 00a70055003d008800ee0039007700530083005300e500f00080000700f300c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_0 = 00e60053003b003500d4000d008d00d900350006000500ff0024003400d80070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_0 = 0019001800b4006a003e0099008500b8000d005a00320003003f00db000c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_0 = 008c00a60070000e0034002d00ec000f0028002f00b70061009b00fa0073007f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_0 = 00d8006c008100cf003100cc004100e7006d00cd003300e900c5005400e800e0
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_0 = 00ca00bf0079000600100094007900ff000100c000b40019001c00b400d00047
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_0 = 00ef00860062005700f000dc0076006e00df0090009900530066009c00a2009d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_0 = 0055005d00c900b700eb000b00d100b600f400f9004b003600e60058002200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_0 = 00a200c80024009800140050003c0003006100b700f0000d008a009000ec0086
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_0 = 009f007a003e00cd0026004a00b100d4009300130038004b005f0091001900c3
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_0 = 00ca003200a9006e003700dc004b005600f20064009100b30009009700390087
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_0 = 0037006500de00a8004b0001008e009f00bb00bc00ae00610025006400fd0057
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_0 = 009500e500fa0001008e009b0068003300a5005800dd000b003000a1009f005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_0 = 00c000d30059001800b500d100ce00f80073004b002700e4007300a4009a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_0 = 005800c8005c0006003900e0007300b50097003b002400790022008700ad00e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_0 = 00c0003800f100c5006d0094006300a4006300db002f00a3002c001d00ca0095
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_0 = 00ad00020063006e009e00bc0037005600f300b8007c00e700c70089001e00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_0 = 009200ca00f1005c001c00bb006300d30022004d004d00e100d40035009200ff
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_0 = 001e008e000900b8002f0036008c00c900c500a700bb00ce00c6007a00c60089
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_0 = 00e200c5008800460038006c00f300d000fe00be001d0096005c00be003f00e3
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_0 = 0010003700b7005000b000cf00e00082009900fd00a000ce007500e4007a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_0 = 00f6003b00c60028007900ac00cb0013002400c000c7004d00a500550020009b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_0 = 005c00ee008b00ab004c00a40011007600930062007b007f007c0062002100dd
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_0 = 008c000b00d300dd001c00db00c3003d000800ad0016008c00150059004700ae
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_0 = 0000003c00c20084001b00a8003000d6005900d2008600fc00cb00b400d100ff
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_0 = 004d001e001c0076006500c8002e0029005b0097008700ad0030002c0019004f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_0 = 008700a500a00006002600a600c20060000f00ae002c00a5004e004500fc00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_0 = 0019003e004c000700df0036008b00110002006d005500950053002400a00051
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_0 = 006100c60077002a00f4008b002c00e6000f0052001f00c0005e00a8006e00cc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_0 = 002b00e8000b009100de006200dd00ad001e005900b0002f0050006500630023
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_0 = 002d00f300c00084001000e4006f003200c300d60003005500c80081002e0074
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_0 = 00ed00ad00df00d000ba00d900ea00f30085004f00a700e500f200c500740025
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_0 = 003700fa008c008100a7005000ec002b001400680096009300240060009e001b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_0 = 00da003000f8006700c1002200a300eb005100bb00480029000100ea00fe00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_0 = 007a001b001b00f6002800fd002600a8007b00a800ed007600dc001b000c008f
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_0 = 00c900b1002c00fc009f000000c000aa003800bc00f70049007e00b400060088
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_0 = 00a9005900e700cd00be0002002a00aa000300da004c0015001200c300a30087
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_1 = 00a2004f0051005f00db003f00410093004c00c3006b003c00380093006f00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_1 = 00c6000c00e6007c00d800a70011007e0025009900ff000c009700cc00f500df
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_1 = 0072008d005400db00ce009900d000fa007100ab0000000a000e009700b700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_1 = 00fc005700bf009700c200a20041006d002c006100140046000200f7009c007d
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_1 = 0067001c0038007b00b80036003e006800e200e3001000ec00200025005400f1
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_1 = 009f00df000d0045007a00c6000a00ca0036003d005400b5009a0041009100b0
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_1 = 0000006100210021008c00230063007c00a100b200e20095007a003f00f3005f
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_1 = 00a5007900e700d8003100160009005900d60021001200f60064005900e5004c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_1 = 00ac009f00e20069006d006c0010007e006400e50057001700f20060007f0072
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_1 = 002f000700f500c5004d001b00de00b9009b00c0005a00db009a000500b7002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_1 = 005c00fc00cf006d002c00df000a005800de007d00360045009a0039003300fe
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_1 = 00d8001c00e400d000d60080008100d6006c00060008000c005d00c1004a001d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_1 = 005c00ab006d00b100b700c500eb00a0005400610064001300f4000a00150023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_1 = 0001006500fa00e4008100b800ca002500c700360002001b00200053004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_1 = 0034003b0097000d00fb004200cc009100660025001b00ea00a9004700600090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_1 = 00c7007600e8007700390099009b00bb008b008b00e300d9005100a800f7006b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_1 = 005600180050003c006600ef009300aa008000ff00d800c600270062006d0059
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_1 = 00cc00a400cb00b6005e006800aa000400d1004700f900a600d900e8000400df
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_1 = 007f005d0054008d00ca00ce00ab00be004d00c20074000e00d8004900d500b1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_1 = 0058008800e600830091004400460080008400ed009f002000b900e500c700ff
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_1 = 008e00d100d70094000f00ef008b0026001e003a00da001900ab009500c00054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_1 = 0030000b0020003a00f700e30086009400a2006300f800ce0020006a00dd00ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_1 = 00cb00b000cd004700370073002b00110063009a004a00340067008d006200b9
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_1 = 00c30047001f00b300c100ec0042007800db00a30078001b00770084001b00bc
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_1 = 001400d1004e006300d8009900a1000100550080008c009900c800cd007500a6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_1 = 0059008f00e4003200eb00b1009800f20065005a0023004100a1006700760099
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_1 = 00a70055003d008800ee0039007700530083005300e500f00080000700f300c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_1 = 00e60053003b003500d4000d008d00d900350006000500ff0024003400d80070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_1 = 0019001800b4006a003e0099008500b8000d005a00320003003f00db000c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_1 = 008c00a60070000e0034002d00ec000f0028002f00b70061009b00fa0073007f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_1 = 00d8006c008100cf003100cc004100e7006d00cd003300e900c5005400e800e0
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_1 = 00ca00bf0079000600100094007900ff000100c000b40019001c00b400d00047
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_1 = 00ef00860062005700f000dc0076006e00df0090009900530066009c00a2009d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_1 = 0055005d00c900b700eb000b00d100b600f400f9004b003600e60058002200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_1 = 00a200c80024009800140050003c0003006100b700f0000d008a009000ec0086
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_1 = 009f007a003e00cd0026004a00b100d4009300130038004b005f0091001900c3
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_1 = 00ca003200a9006e003700dc004b005600f20064009100b30009009700390087
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_1 = 0037006500de00a8004b0001008e009f00bb00bc00ae00610025006400fd0057
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_1 = 009500e500fa0001008e009b0068003300a5005800dd000b003000a1009f005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_1 = 00c000d30059001800b500d100ce00f80073004b002700e4007300a4009a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_1 = 005800c8005c0006003900e0007300b50097003b002400790022008700ad00e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_1 = 00c0003800f100c5006d0094006300a4006300db002f00a3002c001d00ca0095
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_1 = 00ad00020063006e009e00bc0037005600f300b8007c00e700c70089001e00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_1 = 009200ca00f1005c001c00bb006300d30022004d004d00e100d40035009200ff
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_1 = 001e008e000900b8002f0036008c00c900c500a700bb00ce00c6007a00c60089
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_1 = 00e200c5008800460038006c00f300d000fe00be001d0096005c00be003f00e3
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_1 = 0010003700b7005000b000cf00e00082009900fd00a000ce007500e4007a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_1 = 00f6003b00c60028007900ac00cb0013002400c000c7004d00a500550020009b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_1 = 005c00ee008b00ab004c00a40011007600930062007b007f007c0062002100dd
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_1 = 008c000b00d300dd001c00db00c3003d000800ad0016008c00150059004700ae
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_1 = 0000003c00c20084001b00a8003000d6005900d2008600fc00cb00b400d100ff
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_1 = 004d001e001c0076006500c8002e0029005b0097008700ad0030002c0019004f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_1 = 008700a500a00006002600a600c20060000f00ae002c00a5004e004500fc00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_1 = 0019003e004c000700df0036008b00110002006d005500950053002400a00051
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_1 = 006100c60077002a00f4008b002c00e6000f0052001f00c0005e00a8006e00cc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_1 = 002b00e8000b009100de006200dd00ad001e005900b0002f0050006500630023
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_1 = 002d00f300c00084001000e4006f003200c300d60003005500c80081002e0074
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_1 = 00ed00ad00df00d000ba00d900ea00f30085004f00a700e500f200c500740025
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_1 = 003700fa008c008100a7005000ec002b001400680096009300240060009e001b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_1 = 00da003000f8006700c1002200a300eb005100bb00480029000100ea00fe00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_1 = 007a001b001b00f6002800fd002600a8007b00a800ed007600dc001b000c008f
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_1 = 00c900b1002c00fc009f000000c000aa003800bc00f70049007e00b400060088
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_1 = 00a9005900e700cd00be0002002a00aa000300da004c0015001200c300a30087
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_2 = 00a2004f0051005f00db003f00410093004c00c3006b003c00380093006f00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_2 = 00c6000c00e6007c00d800a70011007e0025009900ff000c009700cc00f500df
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_2 = 0072008d005400db00ce009900d000fa007100ab0000000a000e009700b700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_2 = 00fc005700bf009700c200a20041006d002c006100140046000200f7009c007d
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_2 = 0067001c0038007b00b80036003e006800e200e3001000ec00200025005400f1
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_2 = 009f00df000d0045007a00c6000a00ca0036003d005400b5009a0041009100b0
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_2 = 0000006100210021008c00230063007c00a100b200e20095007a003f00f3005f
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_2 = 00a5007900e700d8003100160009005900d60021001200f60064005900e5004c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_2 = 00ac009f00e20069006d006c0010007e006400e50057001700f20060007f0072
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_2 = 002f000700f500c5004d001b00de00b9009b00c0005a00db009a000500b7002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_2 = 005c00fc00cf006d002c00df000a005800de007d00360045009a0039003300fe
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_2 = 00d8001c00e400d000d60080008100d6006c00060008000c005d00c1004a001d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_2 = 005c00ab006d00b100b700c500eb00a0005400610064001300f4000a00150023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_2 = 0001006500fa00e4008100b800ca002500c700360002001b00200053004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_2 = 0034003b0097000d00fb004200cc009100660025001b00ea00a9004700600090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_2 = 00c7007600e8007700390099009b00bb008b008b00e300d9005100a800f7006b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_2 = 005600180050003c006600ef009300aa008000ff00d800c600270062006d0059
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_2 = 00cc00a400cb00b6005e006800aa000400d1004700f900a600d900e8000400df
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_2 = 007f005d0054008d00ca00ce00ab00be004d00c20074000e00d8004900d500b1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_2 = 0058008800e600830091004400460080008400ed009f002000b900e500c700ff
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_2 = 008e00d100d70094000f00ef008b0026001e003a00da001900ab009500c00054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_2 = 0030000b0020003a00f700e30086009400a2006300f800ce0020006a00dd00ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_2 = 00cb00b000cd004700370073002b00110063009a004a00340067008d006200b9
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_2 = 00c30047001f00b300c100ec0042007800db00a30078001b00770084001b00bc
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_2 = 001400d1004e006300d8009900a1000100550080008c009900c800cd007500a6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_2 = 0059008f00e4003200eb00b1009800f20065005a0023004100a1006700760099
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_2 = 00a70055003d008800ee0039007700530083005300e500f00080000700f300c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_2 = 00e60053003b003500d4000d008d00d900350006000500ff0024003400d80070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_2 = 0019001800b4006a003e0099008500b8000d005a00320003003f00db000c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_2 = 008c00a60070000e0034002d00ec000f0028002f00b70061009b00fa0073007f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_2 = 00d8006c008100cf003100cc004100e7006d00cd003300e900c5005400e800e0
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_2 = 00ca00bf0079000600100094007900ff000100c000b40019001c00b400d00047
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_2 = 00ef00860062005700f000dc0076006e00df0090009900530066009c00a2009d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_2 = 0055005d00c900b700eb000b00d100b600f400f9004b003600e60058002200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_2 = 00a200c80024009800140050003c0003006100b700f0000d008a009000ec0086
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_2 = 009f007a003e00cd0026004a00b100d4009300130038004b005f0091001900c3
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_2 = 00ca003200a9006e003700dc004b005600f20064009100b30009009700390087
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_2 = 0037006500de00a8004b0001008e009f00bb00bc00ae00610025006400fd0057
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_2 = 009500e500fa0001008e009b0068003300a5005800dd000b003000a1009f005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_2 = 00c000d30059001800b500d100ce00f80073004b002700e4007300a4009a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_2 = 005800c8005c0006003900e0007300b50097003b002400790022008700ad00e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_2 = 00c0003800f100c5006d0094006300a4006300db002f00a3002c001d00ca0095
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_2 = 00ad00020063006e009e00bc0037005600f300b8007c00e700c70089001e00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_2 = 009200ca00f1005c001c00bb006300d30022004d004d00e100d40035009200ff
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_2 = 001e008e000900b8002f0036008c00c900c500a700bb00ce00c6007a00c60089
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_2 = 00e200c5008800460038006c00f300d000fe00be001d0096005c00be003f00e3
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_2 = 0010003700b7005000b000cf00e00082009900fd00a000ce007500e4007a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_2 = 00f6003b00c60028007900ac00cb0013002400c000c7004d00a500550020009b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_2 = 005c00ee008b00ab004c00a40011007600930062007b007f007c0062002100dd
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_2 = 008c000b00d300dd001c00db00c3003d000800ad0016008c00150059004700ae
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_2 = 0000003c00c20084001b00a8003000d6005900d2008600fc00cb00b400d100ff
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_2 = 004d001e001c0076006500c8002e0029005b0097008700ad0030002c0019004f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_2 = 008700a500a00006002600a600c20060000f00ae002c00a5004e004500fc00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_2 = 0019003e004c000700df0036008b00110002006d005500950053002400a00051
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_2 = 006100c60077002a00f4008b002c00e6000f0052001f00c0005e00a8006e00cc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_2 = 002b00e8000b009100de006200dd00ad001e005900b0002f0050006500630023
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_2 = 002d00f300c00084001000e4006f003200c300d60003005500c80081002e0074
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_2 = 00ed00ad00df00d000ba00d900ea00f30085004f00a700e500f200c500740025
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_2 = 003700fa008c008100a7005000ec002b001400680096009300240060009e001b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_2 = 00da003000f8006700c1002200a300eb005100bb00480029000100ea00fe00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_2 = 007a001b001b00f6002800fd002600a8007b00a800ed007600dc001b000c008f
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_2 = 00c900b1002c00fc009f000000c000aa003800bc00f70049007e00b400060088
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_2 = 00a9005900e700cd00be0002002a00aa000300da004c0015001200c300a30087
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_3 = 00a2004f0051005f00db003f00410093004c00c3006b003c00380093006f00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_3 = 00c6000c00e6007c00d800a70011007e0025009900ff000c009700cc00f500df
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_3 = 0072008d005400db00ce009900d000fa007100ab0000000a000e009700b700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_3 = 00fc005700bf009700c200a20041006d002c006100140046000200f7009c007d
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_3 = 0067001c0038007b00b80036003e006800e200e3001000ec00200025005400f1
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_3 = 009f00df000d0045007a00c6000a00ca0036003d005400b5009a0041009100b0
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_3 = 0000006100210021008c00230063007c00a100b200e20095007a003f00f3005f
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_3 = 00a5007900e700d8003100160009005900d60021001200f60064005900e5004c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_3 = 00ac009f00e20069006d006c0010007e006400e50057001700f20060007f0072
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_3 = 002f000700f500c5004d001b00de00b9009b00c0005a00db009a000500b7002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_3 = 005c00fc00cf006d002c00df000a005800de007d00360045009a0039003300fe
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_3 = 00d8001c00e400d000d60080008100d6006c00060008000c005d00c1004a001d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_3 = 005c00ab006d00b100b700c500eb00a0005400610064001300f4000a00150023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_3 = 0001006500fa00e4008100b800ca002500c700360002001b00200053004200dd
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_3 = 0034003b0097000d00fb004200cc009100660025001b00ea00a9004700600090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_3 = 00c7007600e8007700390099009b00bb008b008b00e300d9005100a800f7006b
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_3 = 005600180050003c006600ef009300aa008000ff00d800c600270062006d0059
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_3 = 00cc00a400cb00b6005e006800aa000400d1004700f900a600d900e8000400df
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_3 = 007f005d0054008d00ca00ce00ab00be004d00c20074000e00d8004900d500b1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_3 = 0058008800e600830091004400460080008400ed009f002000b900e500c700ff
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_3 = 008e00d100d70094000f00ef008b0026001e003a00da001900ab009500c00054
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_3 = 0030000b0020003a00f700e30086009400a2006300f800ce0020006a00dd00ac
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_3 = 00cb00b000cd004700370073002b00110063009a004a00340067008d006200b9
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_3 = 00c30047001f00b300c100ec0042007800db00a30078001b00770084001b00bc
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_3 = 001400d1004e006300d8009900a1000100550080008c009900c800cd007500a6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_3 = 0059008f00e4003200eb00b1009800f20065005a0023004100a1006700760099
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_3 = 00a70055003d008800ee0039007700530083005300e500f00080000700f300c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_3 = 00e60053003b003500d4000d008d00d900350006000500ff0024003400d80070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_3 = 0019001800b4006a003e0099008500b8000d005a00320003003f00db000c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_3 = 008c00a60070000e0034002d00ec000f0028002f00b70061009b00fa0073007f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_3 = 00d8006c008100cf003100cc004100e7006d00cd003300e900c5005400e800e0
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_3 = 00ca00bf0079000600100094007900ff000100c000b40019001c00b400d00047
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_3 = 00ef00860062005700f000dc0076006e00df0090009900530066009c00a2009d
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_3 = 0055005d00c900b700eb000b00d100b600f400f9004b003600e60058002200fa
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_3 = 00a200c80024009800140050003c0003006100b700f0000d008a009000ec0086
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_3 = 009f007a003e00cd0026004a00b100d4009300130038004b005f0091001900c3
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_3 = 00ca003200a9006e003700dc004b005600f20064009100b30009009700390087
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_3 = 0037006500de00a8004b0001008e009f00bb00bc00ae00610025006400fd0057
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_3 = 009500e500fa0001008e009b0068003300a5005800dd000b003000a1009f005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_3 = 00c000d30059001800b500d100ce00f80073004b002700e4007300a4009a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_3 = 005800c8005c0006003900e0007300b50097003b002400790022008700ad00e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_3 = 00c0003800f100c5006d0094006300a4006300db002f00a3002c001d00ca0095
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_3 = 00ad00020063006e009e00bc0037005600f300b8007c00e700c70089001e00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_3 = 009200ca00f1005c001c00bb006300d30022004d004d00e100d40035009200ff
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_3 = 001e008e000900b8002f0036008c00c900c500a700bb00ce00c6007a00c60089
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_3 = 00e200c5008800460038006c00f300d000fe00be001d0096005c00be003f00e3
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_3 = 0010003700b7005000b000cf00e00082009900fd00a000ce007500e4007a003a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_3 = 00f6003b00c60028007900ac00cb0013002400c000c7004d00a500550020009b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_3 = 005c00ee008b00ab004c00a40011007600930062007b007f007c0062002100dd
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_3 = 008c000b00d300dd001c00db00c3003d000800ad0016008c00150059004700ae
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_3 = 0000003c00c20084001b00a8003000d6005900d2008600fc00cb00b400d100ff
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_3 = 004d001e001c0076006500c8002e0029005b0097008700ad0030002c0019004f
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_3 = 008700a500a00006002600a600c20060000f00ae002c00a5004e004500fc00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_3 = 0019003e004c000700df0036008b00110002006d005500950053002400a00051
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_3 = 006100c60077002a00f4008b002c00e6000f0052001f00c0005e00a8006e00cc
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_3 = 002b00e8000b009100de006200dd00ad001e005900b0002f0050006500630023
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_3 = 002d00f300c00084001000e4006f003200c300d60003005500c80081002e0074
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_3 = 00ed00ad00df00d000ba00d900ea00f30085004f00a700e500f200c500740025
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_3 = 003700fa008c008100a7005000ec002b001400680096009300240060009e001b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_3 = 00da003000f8006700c1002200a300eb005100bb00480029000100ea00fe00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_3 = 007a001b001b00f6002800fd002600a8007b00a800ed007600dc001b000c008f
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_3 = 00c900b1002c00fc009f000000c000aa003800bc00f70049007e00b400060088
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_3 = 00a9005900e700cd00be0002002a00aa000300da004c0015001200c300a30087
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_0 = 003f004b00ef00cb00e9000400b100b6009800f900a600c500fe009e00c60009
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_0 = 005800500070000f00ea005e00f300ef00d500b500d8002700d2004d00be0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_0 = 00d000d90078000c00ab00500099007f00b7001f002c0042008c00ad007f0071
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_0 = 00ed004b004e0031000a00fe00e7009b000c0033005400180014008a00d20071
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_0 = 00e500af004200040069006b00170025009d00ff0034006a00780082000a0039
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_0 = 008400220087003600e500010037009e00af00e8001100b1008f0001004c00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_0 = 00cb0054006e000600fe00ec002400bd008e0097009b00da00e900b9007c0069
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_0 = 00d300e000cc00a000c200dd004e00fe00540015005c001000f5000100b500d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_0 = 0066003000d7002c0008008b00990066006800f1009b004a0074001f00cb004b
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_0 = 00d900c90047004e00d50095006b00550001008c0008003c00f20068007b00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_0 = 004500f000070085008b00690057006f00330027001900c60030005600a300fa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_0 = 002e00de00d800a500bc00b3009500f00035009a00be00cc0054004600100099
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_0 = 005e00b7008c00d900a700aa00b900b700ef0045004800f600fe00a900990045
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_0 = 0072005d00b200a800cd00e00038004e009b0037001c00ae000e00aa0014003b
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_0 = 00b000f400be00ed00ba00e10048006800a600e20024002b00c0007100190072
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_0 = 001c00d300db00b0001200e00097001900fd002b000000d60072006300610033
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_0 = 008a003400c000a1001c0061008a00ca00da00da00bf0080007c006c00fc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_0 = 0014003e00e5009000a3001800d00094002200fe00ff00a7002b0051000e0025
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_0 = 002f00d200680009004c00e700200005000800ba00c700b4005700d900c900e1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_0 = 002a008600a8001500a6000a00d800b400f80099005f002800fa0070001c00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_0 = 0066002000f900080093007e005f00e600d9004900cc00840046001f00b80035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_0 = 00490008003000f800a200a800af009100040017005f0070005300cb00bb005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_0 = 00fd0030005600b6009200dd008e00b600d600c400c70024005400110029008a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_0 = 003200c400f900d6009300a6003900cf000000c800b0009b00df00ad004e005a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_0 = 00f600420083006a0025009f00e100b600990068002f00e8001200a100ad002f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_0 = 00bf006a00d50069009e00e50023001e00890077001500a6006a00cb00fc0098
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_0 = 00be007900340031008200820039008100e2000d000d003c005c00ee00f80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_0 = 00dc00770024001a00aa008e0000002700a30041002c008d005c00b4006c0036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_0 = 006e006300aa009c001d00c400d700780056001500e600810032007a00b1000a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_0 = 005700be00a4001300f6008a00b600750043001d000900c100ae007e00050037
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_0 = 002d001d007500790036008200c4002a0007008c002c009700f7004d009e003e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_0 = 00c7005800c8001700d200ef006200210001003a0046008200b1004f00d20072
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_0 = 005900f50089005200ae009a00340016004a007500bc00d10089001e00820070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_0 = 009c005c00e300050056009b00780054008a00be00d8005600c90006009c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_0 = 004f00490070005a00be003900dd00a6009e00a40012006500d900ba000c0004
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_0 = 008b00bb0097005a00140065004e00260062006900a6002b004a0006009000ce
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_0 = 0017001c00df00a600b2008c0000000400ea00bb00c800f400ec0019008500f2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_0 = 00a100bd000400ea002b00f300ff00f700dc00210052000900fa002000b60044
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_0 = 00d90086002b00070015004000a500ff009c0068007a000900eb004e007e00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_0 = 000e002f00d3005600a3001e0034002f00f7005e009600a700bb009c00250020
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_0 = 004c0010004400910093000600b60013005100bf008e003300de00b1001c0031
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_0 = 0078009d003d002b004000b500de001d00d8001e006f00f00068000000f9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_0 = 00ea0070003000550009007e0037005b00a300ba006800fd00db004700b5008b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_0 = 007000f1003000ff00c000c100cb00ee00e000db005200da008a006f002a004f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_0 = 0067004400c00095007a00d500ef007d00e3000b005a00cb004300e500e30083
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_0 = 0076001e005600540057005700dc00f20031006100f4009000f6001e001e0069
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_0 = 007c00ef00a200c400bd0016005a008f0024003400ab007e00be00f70053005a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_0 = 003400fc003a002b002700da001900650069005b003500e3006e004c00e400c1
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_0 = 009d0009003b0089007d003d0008009d009400d700e5000b009500fb00d2003c
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_0 = 008b008800ba0080004500fb004f00d7005c007f0050000700ef00ff002000f3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_0 = 00d200670061007f005900ab00cf004500630018000e002400920039006d0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_0 = 00da009400fc007e0091001c00b5000900de006d00e4007000d2005e009e0047
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_0 = 004b0008001500cf00090095000b00b6008800aa004600f9000a00b900d900aa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_0 = 005700d400d3008b00f5000b0006009700b2000b005d007500b2003d00350082
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_0 = 0095000300100042006e00ad00ef005900830058001800190018004c00e4001e
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_0 = 004d0097001300e9004500160080007300c4009f00820076000a00e9000400ee
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_0 = 00b9008200a80074009800cf00b400ff007c00220035001c000600a9006c006d
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_0 = 00d700a30006004a00f800c100f000cc000d007c0054003b00420005006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_0 = 00040049002b00da0095009600d70023002700b2001a002600690058001c0049
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_0 = 004600cd00eb00090051008000e1006000d6007000d500e00014006e005c0008
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_0 = 0060004e00c000b600090012000e00f0007400ed00de00ea000000ed007b0021
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_0 = 0078005900e300db009a00930067002f00bd00ba00b300f400b6001500d900e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_0 = 001100ed0006001b00f300bc00d8002500b800f500c200b900df006000c80034
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_1 = 003f004b00ef00cb00e9000400b100b6009800f900a600c500fe009e00c60009
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_1 = 005800500070000f00ea005e00f300ef00d500b500d8002700d2004d00be0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_1 = 00d000d90078000c00ab00500099007f00b7001f002c0042008c00ad007f0071
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_1 = 00ed004b004e0031000a00fe00e7009b000c0033005400180014008a00d20071
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_1 = 00e500af004200040069006b00170025009d00ff0034006a00780082000a0039
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_1 = 008400220087003600e500010037009e00af00e8001100b1008f0001004c00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_1 = 00cb0054006e000600fe00ec002400bd008e0097009b00da00e900b9007c0069
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_1 = 00d300e000cc00a000c200dd004e00fe00540015005c001000f5000100b500d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_1 = 0066003000d7002c0008008b00990066006800f1009b004a0074001f00cb004b
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_1 = 00d900c90047004e00d50095006b00550001008c0008003c00f20068007b00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_1 = 004500f000070085008b00690057006f00330027001900c60030005600a300fa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_1 = 002e00de00d800a500bc00b3009500f00035009a00be00cc0054004600100099
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_1 = 005e00b7008c00d900a700aa00b900b700ef0045004800f600fe00a900990045
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_1 = 0072005d00b200a800cd00e00038004e009b0037001c00ae000e00aa0014003b
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_1 = 00b000f400be00ed00ba00e10048006800a600e20024002b00c0007100190072
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_1 = 001c00d300db00b0001200e00097001900fd002b000000d60072006300610033
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_1 = 008a003400c000a1001c0061008a00ca00da00da00bf0080007c006c00fc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_1 = 0014003e00e5009000a3001800d00094002200fe00ff00a7002b0051000e0025
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_1 = 002f00d200680009004c00e700200005000800ba00c700b4005700d900c900e1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_1 = 002a008600a8001500a6000a00d800b400f80099005f002800fa0070001c00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_1 = 0066002000f900080093007e005f00e600d9004900cc00840046001f00b80035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_1 = 00490008003000f800a200a800af009100040017005f0070005300cb00bb005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_1 = 00fd0030005600b6009200dd008e00b600d600c400c70024005400110029008a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_1 = 003200c400f900d6009300a6003900cf000000c800b0009b00df00ad004e005a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_1 = 00f600420083006a0025009f00e100b600990068002f00e8001200a100ad002f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_1 = 00bf006a00d50069009e00e50023001e00890077001500a6006a00cb00fc0098
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_1 = 00be007900340031008200820039008100e2000d000d003c005c00ee00f80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_1 = 00dc00770024001a00aa008e0000002700a30041002c008d005c00b4006c0036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_1 = 006e006300aa009c001d00c400d700780056001500e600810032007a00b1000a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_1 = 005700be00a4001300f6008a00b600750043001d000900c100ae007e00050037
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_1 = 002d001d007500790036008200c4002a0007008c002c009700f7004d009e003e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_1 = 00c7005800c8001700d200ef006200210001003a0046008200b1004f00d20072
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_1 = 005900f50089005200ae009a00340016004a007500bc00d10089001e00820070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_1 = 009c005c00e300050056009b00780054008a00be00d8005600c90006009c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_1 = 004f00490070005a00be003900dd00a6009e00a40012006500d900ba000c0004
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_1 = 008b00bb0097005a00140065004e00260062006900a6002b004a0006009000ce
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_1 = 0017001c00df00a600b2008c0000000400ea00bb00c800f400ec0019008500f2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_1 = 00a100bd000400ea002b00f300ff00f700dc00210052000900fa002000b60044
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_1 = 00d90086002b00070015004000a500ff009c0068007a000900eb004e007e00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_1 = 000e002f00d3005600a3001e0034002f00f7005e009600a700bb009c00250020
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_1 = 004c0010004400910093000600b60013005100bf008e003300de00b1001c0031
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_1 = 0078009d003d002b004000b500de001d00d8001e006f00f00068000000f9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_1 = 00ea0070003000550009007e0037005b00a300ba006800fd00db004700b5008b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_1 = 007000f1003000ff00c000c100cb00ee00e000db005200da008a006f002a004f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_1 = 0067004400c00095007a00d500ef007d00e3000b005a00cb004300e500e30083
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_1 = 0076001e005600540057005700dc00f20031006100f4009000f6001e001e0069
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_1 = 007c00ef00a200c400bd0016005a008f0024003400ab007e00be00f70053005a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_1 = 003400fc003a002b002700da001900650069005b003500e3006e004c00e400c1
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_1 = 009d0009003b0089007d003d0008009d009400d700e5000b009500fb00d2003c
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_1 = 008b008800ba0080004500fb004f00d7005c007f0050000700ef00ff002000f3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_1 = 00d200670061007f005900ab00cf004500630018000e002400920039006d0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_1 = 00da009400fc007e0091001c00b5000900de006d00e4007000d2005e009e0047
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_1 = 004b0008001500cf00090095000b00b6008800aa004600f9000a00b900d900aa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_1 = 005700d400d3008b00f5000b0006009700b2000b005d007500b2003d00350082
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_1 = 0095000300100042006e00ad00ef005900830058001800190018004c00e4001e
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_1 = 004d0097001300e9004500160080007300c4009f00820076000a00e9000400ee
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_1 = 00b9008200a80074009800cf00b400ff007c00220035001c000600a9006c006d
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_1 = 00d700a30006004a00f800c100f000cc000d007c0054003b00420005006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_1 = 00040049002b00da0095009600d70023002700b2001a002600690058001c0049
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_1 = 004600cd00eb00090051008000e1006000d6007000d500e00014006e005c0008
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_1 = 0060004e00c000b600090012000e00f0007400ed00de00ea000000ed007b0021
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_1 = 0078005900e300db009a00930067002f00bd00ba00b300f400b6001500d900e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_1 = 001100ed0006001b00f300bc00d8002500b800f500c200b900df006000c80034
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_2 = 003f004b00ef00cb00e9000400b100b6009800f900a600c500fe009e00c60009
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_2 = 005800500070000f00ea005e00f300ef00d500b500d8002700d2004d00be0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_2 = 00d000d90078000c00ab00500099007f00b7001f002c0042008c00ad007f0071
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_2 = 00ed004b004e0031000a00fe00e7009b000c0033005400180014008a00d20071
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_2 = 00e500af004200040069006b00170025009d00ff0034006a00780082000a0039
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_2 = 008400220087003600e500010037009e00af00e8001100b1008f0001004c00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_2 = 00cb0054006e000600fe00ec002400bd008e0097009b00da00e900b9007c0069
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_2 = 00d300e000cc00a000c200dd004e00fe00540015005c001000f5000100b500d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_2 = 0066003000d7002c0008008b00990066006800f1009b004a0074001f00cb004b
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_2 = 00d900c90047004e00d50095006b00550001008c0008003c00f20068007b00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_2 = 004500f000070085008b00690057006f00330027001900c60030005600a300fa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_2 = 002e00de00d800a500bc00b3009500f00035009a00be00cc0054004600100099
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_2 = 005e00b7008c00d900a700aa00b900b700ef0045004800f600fe00a900990045
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_2 = 0072005d00b200a800cd00e00038004e009b0037001c00ae000e00aa0014003b
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_2 = 00b000f400be00ed00ba00e10048006800a600e20024002b00c0007100190072
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_2 = 001c00d300db00b0001200e00097001900fd002b000000d60072006300610033
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_2 = 008a003400c000a1001c0061008a00ca00da00da00bf0080007c006c00fc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_2 = 0014003e00e5009000a3001800d00094002200fe00ff00a7002b0051000e0025
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_2 = 002f00d200680009004c00e700200005000800ba00c700b4005700d900c900e1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_2 = 002a008600a8001500a6000a00d800b400f80099005f002800fa0070001c00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_2 = 0066002000f900080093007e005f00e600d9004900cc00840046001f00b80035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_2 = 00490008003000f800a200a800af009100040017005f0070005300cb00bb005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_2 = 00fd0030005600b6009200dd008e00b600d600c400c70024005400110029008a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_2 = 003200c400f900d6009300a6003900cf000000c800b0009b00df00ad004e005a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_2 = 00f600420083006a0025009f00e100b600990068002f00e8001200a100ad002f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_2 = 00bf006a00d50069009e00e50023001e00890077001500a6006a00cb00fc0098
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_2 = 00be007900340031008200820039008100e2000d000d003c005c00ee00f80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_2 = 00dc00770024001a00aa008e0000002700a30041002c008d005c00b4006c0036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_2 = 006e006300aa009c001d00c400d700780056001500e600810032007a00b1000a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_2 = 005700be00a4001300f6008a00b600750043001d000900c100ae007e00050037
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_2 = 002d001d007500790036008200c4002a0007008c002c009700f7004d009e003e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_2 = 00c7005800c8001700d200ef006200210001003a0046008200b1004f00d20072
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_2 = 005900f50089005200ae009a00340016004a007500bc00d10089001e00820070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_2 = 009c005c00e300050056009b00780054008a00be00d8005600c90006009c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_2 = 004f00490070005a00be003900dd00a6009e00a40012006500d900ba000c0004
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_2 = 008b00bb0097005a00140065004e00260062006900a6002b004a0006009000ce
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_2 = 0017001c00df00a600b2008c0000000400ea00bb00c800f400ec0019008500f2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_2 = 00a100bd000400ea002b00f300ff00f700dc00210052000900fa002000b60044
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_2 = 00d90086002b00070015004000a500ff009c0068007a000900eb004e007e00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_2 = 000e002f00d3005600a3001e0034002f00f7005e009600a700bb009c00250020
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_2 = 004c0010004400910093000600b60013005100bf008e003300de00b1001c0031
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_2 = 0078009d003d002b004000b500de001d00d8001e006f00f00068000000f9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_2 = 00ea0070003000550009007e0037005b00a300ba006800fd00db004700b5008b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_2 = 007000f1003000ff00c000c100cb00ee00e000db005200da008a006f002a004f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_2 = 0067004400c00095007a00d500ef007d00e3000b005a00cb004300e500e30083
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_2 = 0076001e005600540057005700dc00f20031006100f4009000f6001e001e0069
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_2 = 007c00ef00a200c400bd0016005a008f0024003400ab007e00be00f70053005a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_2 = 003400fc003a002b002700da001900650069005b003500e3006e004c00e400c1
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_2 = 009d0009003b0089007d003d0008009d009400d700e5000b009500fb00d2003c
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_2 = 008b008800ba0080004500fb004f00d7005c007f0050000700ef00ff002000f3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_2 = 00d200670061007f005900ab00cf004500630018000e002400920039006d0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_2 = 00da009400fc007e0091001c00b5000900de006d00e4007000d2005e009e0047
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_2 = 004b0008001500cf00090095000b00b6008800aa004600f9000a00b900d900aa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_2 = 005700d400d3008b00f5000b0006009700b2000b005d007500b2003d00350082
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_2 = 0095000300100042006e00ad00ef005900830058001800190018004c00e4001e
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_2 = 004d0097001300e9004500160080007300c4009f00820076000a00e9000400ee
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_2 = 00b9008200a80074009800cf00b400ff007c00220035001c000600a9006c006d
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_2 = 00d700a30006004a00f800c100f000cc000d007c0054003b00420005006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_2 = 00040049002b00da0095009600d70023002700b2001a002600690058001c0049
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_2 = 004600cd00eb00090051008000e1006000d6007000d500e00014006e005c0008
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_2 = 0060004e00c000b600090012000e00f0007400ed00de00ea000000ed007b0021
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_2 = 0078005900e300db009a00930067002f00bd00ba00b300f400b6001500d900e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_2 = 001100ed0006001b00f300bc00d8002500b800f500c200b900df006000c80034
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_3 = 003f004b00ef00cb00e9000400b100b6009800f900a600c500fe009e00c60009
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_3 = 005800500070000f00ea005e00f300ef00d500b500d8002700d2004d00be0010
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_3 = 00d000d90078000c00ab00500099007f00b7001f002c0042008c00ad007f0071
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_3 = 00ed004b004e0031000a00fe00e7009b000c0033005400180014008a00d20071
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_3 = 00e500af004200040069006b00170025009d00ff0034006a00780082000a0039
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_3 = 008400220087003600e500010037009e00af00e8001100b1008f0001004c00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_3 = 00cb0054006e000600fe00ec002400bd008e0097009b00da00e900b9007c0069
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_3 = 00d300e000cc00a000c200dd004e00fe00540015005c001000f5000100b500d3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_3 = 0066003000d7002c0008008b00990066006800f1009b004a0074001f00cb004b
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_3 = 00d900c90047004e00d50095006b00550001008c0008003c00f20068007b00b8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_3 = 004500f000070085008b00690057006f00330027001900c60030005600a300fa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_3 = 002e00de00d800a500bc00b3009500f00035009a00be00cc0054004600100099
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_3 = 005e00b7008c00d900a700aa00b900b700ef0045004800f600fe00a900990045
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_3 = 0072005d00b200a800cd00e00038004e009b0037001c00ae000e00aa0014003b
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_3 = 00b000f400be00ed00ba00e10048006800a600e20024002b00c0007100190072
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_3 = 001c00d300db00b0001200e00097001900fd002b000000d60072006300610033
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_3 = 008a003400c000a1001c0061008a00ca00da00da00bf0080007c006c00fc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_3 = 0014003e00e5009000a3001800d00094002200fe00ff00a7002b0051000e0025
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_3 = 002f00d200680009004c00e700200005000800ba00c700b4005700d900c900e1
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_3 = 002a008600a8001500a6000a00d800b400f80099005f002800fa0070001c00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_3 = 0066002000f900080093007e005f00e600d9004900cc00840046001f00b80035
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_3 = 00490008003000f800a200a800af009100040017005f0070005300cb00bb005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_3 = 00fd0030005600b6009200dd008e00b600d600c400c70024005400110029008a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_3 = 003200c400f900d6009300a6003900cf000000c800b0009b00df00ad004e005a
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_3 = 00f600420083006a0025009f00e100b600990068002f00e8001200a100ad002f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_3 = 00bf006a00d50069009e00e50023001e00890077001500a6006a00cb00fc0098
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_3 = 00be007900340031008200820039008100e2000d000d003c005c00ee00f80093
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_3 = 00dc00770024001a00aa008e0000002700a30041002c008d005c00b4006c0036
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_3 = 006e006300aa009c001d00c400d700780056001500e600810032007a00b1000a
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_3 = 005700be00a4001300f6008a00b600750043001d000900c100ae007e00050037
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_3 = 002d001d007500790036008200c4002a0007008c002c009700f7004d009e003e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_3 = 00c7005800c8001700d200ef006200210001003a0046008200b1004f00d20072
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_3 = 005900f50089005200ae009a00340016004a007500bc00d10089001e00820070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_3 = 009c005c00e300050056009b00780054008a00be00d8005600c90006009c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_3 = 004f00490070005a00be003900dd00a6009e00a40012006500d900ba000c0004
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_3 = 008b00bb0097005a00140065004e00260062006900a6002b004a0006009000ce
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_3 = 0017001c00df00a600b2008c0000000400ea00bb00c800f400ec0019008500f2
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_3 = 00a100bd000400ea002b00f300ff00f700dc00210052000900fa002000b60044
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_3 = 00d90086002b00070015004000a500ff009c0068007a000900eb004e007e00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_3 = 000e002f00d3005600a3001e0034002f00f7005e009600a700bb009c00250020
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_3 = 004c0010004400910093000600b60013005100bf008e003300de00b1001c0031
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_3 = 0078009d003d002b004000b500de001d00d8001e006f00f00068000000f9000f
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_3 = 00ea0070003000550009007e0037005b00a300ba006800fd00db004700b5008b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_3 = 007000f1003000ff00c000c100cb00ee00e000db005200da008a006f002a004f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_3 = 0067004400c00095007a00d500ef007d00e3000b005a00cb004300e500e30083
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_3 = 0076001e005600540057005700dc00f20031006100f4009000f6001e001e0069
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_3 = 007c00ef00a200c400bd0016005a008f0024003400ab007e00be00f70053005a
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_3 = 003400fc003a002b002700da001900650069005b003500e3006e004c00e400c1
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_3 = 009d0009003b0089007d003d0008009d009400d700e5000b009500fb00d2003c
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_3 = 008b008800ba0080004500fb004f00d7005c007f0050000700ef00ff002000f3
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_3 = 00d200670061007f005900ab00cf004500630018000e002400920039006d0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_3 = 00da009400fc007e0091001c00b5000900de006d00e4007000d2005e009e0047
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_3 = 004b0008001500cf00090095000b00b6008800aa004600f9000a00b900d900aa
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_3 = 005700d400d3008b00f5000b0006009700b2000b005d007500b2003d00350082
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_3 = 0095000300100042006e00ad00ef005900830058001800190018004c00e4001e
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_3 = 004d0097001300e9004500160080007300c4009f00820076000a00e9000400ee
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_3 = 00b9008200a80074009800cf00b400ff007c00220035001c000600a9006c006d
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_3 = 00d700a30006004a00f800c100f000cc000d007c0054003b00420005006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_3 = 00040049002b00da0095009600d70023002700b2001a002600690058001c0049
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_3 = 004600cd00eb00090051008000e1006000d6007000d500e00014006e005c0008
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_3 = 0060004e00c000b600090012000e00f0007400ed00de00ea000000ed007b0021
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_3 = 0078005900e300db009a00930067002f00bd00ba00b300f400b6001500d900e7
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_3 = 001100ed0006001b00f300bc00d8002500b800f500c200b900df006000c80034
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_0 = 003e0014000b003c007b00ba00ae00e3005c0079006d00c300e400e5008400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_0 = 007e004100d700a100e00026001e008e00a2000e00de0085002700ce00ef007b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_0 = 00fb00ab004d00c300b3006200a700a4005f009c001300dc00b8003100ed00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_0 = 000e009700520069007e007000f600ad003f00570037001e002c00b7007b003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_0 = 00e5000200e900ed005900a2003e0089007d001e00d3004c00be00d800b500f5
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_0 = 008900c7007200bf00a800b900670031000300980025003f00fc00b800220094
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_0 = 001400d7004200b6003d004f00cf00c100d5000700d000e700e600d600390020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_0 = 00bc00f600d10041008f00f6005d007a00c400a5001e001700210075002c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_0 = 00be00270021005c004f00a2000c001b00d4006c0026002700d9009a00df003d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_0 = 007600480096005b00b5008b005600df00c80087000c009b003700c700c6002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_0 = 00ca00b700d100f4009b00cc002600ce00c9009d00a3007c009800c500030035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_0 = 007e00e50066000b00fe002000da00ef008c00ac00a60097007e006300ad00e2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_0 = 00b000590018004c009e0057002600a40037001f002d000c00490045004a0073
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_0 = 008400c900290018005300e3004d007f0027005a005c00fc00bb000600c600a7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_0 = 00a0004b00cc006300ac007a00920018003900ff000800350039007e003300bc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_0 = 00a60074005900bd00b8008d0072000700c90015000800f300880015000b0028
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_0 = 00d2000600be0058000800b800a400da0001000c00530009004b003700750041
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_0 = 00950044000a0073007700a0009600f2007d007200670040000e007300510053
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_0 = 0011007c0067004200bd004e005f009700d5009200c200e700c700f800f000cc
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_0 = 00790089009200aa0063002d005f008900ed0021005e006300e20020008700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_0 = 004f007a0065004a0084005d0065007f00ee000a00b900c600f800b2008d004a
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_0 = 00ba00ad00ed0014009e00df005d00e20011001a0034003e003300610049006d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_0 = 00990046001b000e0091008600d5001a005f002b006000a20035005c00fb009f
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_0 = 0033003b00ad005e00150036006a00b500ae0056006800350039005000cb00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_0 = 008b001c008100be008400cc00d2001d003b002c00f900b3005e0091009400b4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_0 = 00b10067006b004200eb00cd00b000ff009e0017003c002c00bd00ee007c00b5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_0 = 002d0054000000720030002900d000d200c300cd0043001e0013001c0075005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_0 = 005a00ce006f00ab008100e30024006d008800b70056007e00d500ea009b00a8
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_0 = 0095005d00f100c4001c005a00770014005600f9000700be002400af002d00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_0 = 0021005200de00a600fd00e000260062007500ed006a008e0003004f001f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_0 = 00dc00de00f700d6009900050093004400f400000031004800c500550072005e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_0 = 00a700ea008a00c7003700a1001e001200df003a009e007900be009a00ee00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_0 = 0071005f0020000400f100c1002900de0053007000a9000f00fa00b900430096
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_0 = 003400d100d3001a00b90019005f005200e7006300bc004400df000500310058
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_0 = 0047008700b500940066005c007100f600f5000b00a300c600f20098003b002a
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_0 = 00cb00a600ad00c1004f00e9006200d3005c0085004e00fb009c005500d50023
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_0 = 00e600bb00e9009200c300bf0037009400ef00650081009500d00070007300ab
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_0 = 0075004c005500c7008e00a800bd009300fc00d4008d00ce0036002d00340037
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_0 = 005d004f005d009f00e100f5002600ee00f7001b0072009e0043002e00e3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_0 = 007a007100d90086008300c300b6004b00670039008c000d00d300d400220060
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_0 = 00e700c00074006d0013009d0092004c00ed002b00db00a700040069004c0052
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_0 = 00ce002e00d400bf004c00ef006c0000002d001d0087006200e0002e00900078
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_0 = 00b6009600e6003c00f7003600460065004300540053009700cf004e002a00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_0 = 000c009500940062002e00c200f10047003000290078005b00b000f500b80006
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_0 = 001700bf008300320007003800ca000b004a00ac004b00e8001c00ce00620029
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_0 = 002300b2003a00e9009300b100a900d90080008e001d007d008f006a00ed00de
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_0 = 003500a9004e002400630071005300f70028002e0069006400e3003400ab0064
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_0 = 005900c9000200f800ae0098009a0060002f005c00ee0065000a00f200b80046
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_0 = 00190008000b009f00310083001300de001c005a00a300f3001e00a800ca0063
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_0 = 00f100050022002900d1004600ac003900d7007800b2009a00ec00ab002400db
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_0 = 0001008300ef009300e60074004c006200380014006d006f00cd0012000d00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_0 = 00fb0002006f008700c0004d008300d9005a009c00c40094008e00a6002f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_0 = 002a001e007000650003001b00d5004200bd00ad00e40055005a000000f000ad
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_0 = 00c4002000d0004b00890086001600f600df00b200710091004c00c00092006f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_0 = 00ec001f00c80037003a007c009900d100b5001a003a005300cc00fb0022000f
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_0 = 00e9005d0057002c005b00e600a700df001400700095005d00d7009f002600fb
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_0 = 001c00e800be003f00bd00aa00f00070006d003b0021002b0084003c00670069
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_0 = 001d001400ec00be00b1009e004300ac002a005f007b00d0001c00b200e600e7
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_0 = 009200e90019009600f600cf00cb00b0008d006700d00041004300d700ba003d
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_0 = 00cc00590084006d0068005400190032000b005500400053002b00e700660044
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_0 = 00a20009008e0088007d009e0092005400470093007b00ca009c004a00790068
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_0 = 00c600e2009000fe006f0030009000df005300a1009c0038002700820026004b
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_0 = 003b004800cf005000af00bb00050006009600f4002c002200fc00a10038006c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_0 = 00ed008500890075003300f400df009100950012008e00110048006d00e500ac
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_0 = 00900039007800030070006500a2009f0088006700a800a6006700b6006e0029
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_0 = 006d00f900730088005300fb00cc00d700cf00e90075006c00d40027009e0064
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_0 = 000e00c2002300c200a600430040003f00de005200b8006500040010000f0041
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_0 = 00dc007f00c9003900e9001b002900cc00e200630034005600db004a00290004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_0 = 00b800a9002100bb0097002900a000db009200e0001300050087008600e400fb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_0 = 00cd00d7007f007100230027000a0014004f0070002d00b300cf00560082007f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_0 = 00120049000d00cf00ed006400f90037009a00ec00c5002f002700ce000a002e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_0 = 00b6001600a3004f0032000f00bc005f008f007600b4004900b10049005b00c3
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_0 = 00a20067000d006a005d00d0002c00020076008a00ae00bd000b000d00d90003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_0 = 000c004d00ac006a00850079001e00a900f100a40034006000dd003c0004001d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_0 = 003e00ad007600e1003700c2002500f600b7008a00f800ae002300fa00480014
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_0 = 0035007f00000008002a002c00d000c700dc006700ef0006003300d7002f0069
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_0 = 0073007200c600ad007a00ac00e4006e00e500c3005d00d300680095009500ca
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_0 = 005100010034004200e200bd00c0006a003400120049008700e80012000c00fa
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_1 = 003e0014000b003c007b00ba00ae00e3005c0079006d00c300e400e5008400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_1 = 007e004100d700a100e00026001e008e00a2000e00de0085002700ce00ef007b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_1 = 00fb00ab004d00c300b3006200a700a4005f009c001300dc00b8003100ed00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_1 = 000e009700520069007e007000f600ad003f00570037001e002c00b7007b003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_1 = 00e5000200e900ed005900a2003e0089007d001e00d3004c00be00d800b500f5
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_1 = 008900c7007200bf00a800b900670031000300980025003f00fc00b800220094
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_1 = 001400d7004200b6003d004f00cf00c100d5000700d000e700e600d600390020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_1 = 00bc00f600d10041008f00f6005d007a00c400a5001e001700210075002c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_1 = 00be00270021005c004f00a2000c001b00d4006c0026002700d9009a00df003d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_1 = 007600480096005b00b5008b005600df00c80087000c009b003700c700c6002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_1 = 00ca00b700d100f4009b00cc002600ce00c9009d00a3007c009800c500030035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_1 = 007e00e50066000b00fe002000da00ef008c00ac00a60097007e006300ad00e2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_1 = 00b000590018004c009e0057002600a40037001f002d000c00490045004a0073
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_1 = 008400c900290018005300e3004d007f0027005a005c00fc00bb000600c600a7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_1 = 00a0004b00cc006300ac007a00920018003900ff000800350039007e003300bc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_1 = 00a60074005900bd00b8008d0072000700c90015000800f300880015000b0028
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_1 = 00d2000600be0058000800b800a400da0001000c00530009004b003700750041
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_1 = 00950044000a0073007700a0009600f2007d007200670040000e007300510053
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_1 = 0011007c0067004200bd004e005f009700d5009200c200e700c700f800f000cc
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_1 = 00790089009200aa0063002d005f008900ed0021005e006300e20020008700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_1 = 004f007a0065004a0084005d0065007f00ee000a00b900c600f800b2008d004a
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_1 = 00ba00ad00ed0014009e00df005d00e20011001a0034003e003300610049006d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_1 = 00990046001b000e0091008600d5001a005f002b006000a20035005c00fb009f
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_1 = 0033003b00ad005e00150036006a00b500ae0056006800350039005000cb00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_1 = 008b001c008100be008400cc00d2001d003b002c00f900b3005e0091009400b4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_1 = 00b10067006b004200eb00cd00b000ff009e0017003c002c00bd00ee007c00b5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_1 = 002d0054000000720030002900d000d200c300cd0043001e0013001c0075005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_1 = 005a00ce006f00ab008100e30024006d008800b70056007e00d500ea009b00a8
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_1 = 0095005d00f100c4001c005a00770014005600f9000700be002400af002d00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_1 = 0021005200de00a600fd00e000260062007500ed006a008e0003004f001f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_1 = 00dc00de00f700d6009900050093004400f400000031004800c500550072005e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_1 = 00a700ea008a00c7003700a1001e001200df003a009e007900be009a00ee00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_1 = 0071005f0020000400f100c1002900de0053007000a9000f00fa00b900430096
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_1 = 003400d100d3001a00b90019005f005200e7006300bc004400df000500310058
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_1 = 0047008700b500940066005c007100f600f5000b00a300c600f20098003b002a
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_1 = 00cb00a600ad00c1004f00e9006200d3005c0085004e00fb009c005500d50023
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_1 = 00e600bb00e9009200c300bf0037009400ef00650081009500d00070007300ab
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_1 = 0075004c005500c7008e00a800bd009300fc00d4008d00ce0036002d00340037
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_1 = 005d004f005d009f00e100f5002600ee00f7001b0072009e0043002e00e3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_1 = 007a007100d90086008300c300b6004b00670039008c000d00d300d400220060
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_1 = 00e700c00074006d0013009d0092004c00ed002b00db00a700040069004c0052
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_1 = 00ce002e00d400bf004c00ef006c0000002d001d0087006200e0002e00900078
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_1 = 00b6009600e6003c00f7003600460065004300540053009700cf004e002a00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_1 = 000c009500940062002e00c200f10047003000290078005b00b000f500b80006
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_1 = 001700bf008300320007003800ca000b004a00ac004b00e8001c00ce00620029
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_1 = 002300b2003a00e9009300b100a900d90080008e001d007d008f006a00ed00de
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_1 = 003500a9004e002400630071005300f70028002e0069006400e3003400ab0064
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_1 = 005900c9000200f800ae0098009a0060002f005c00ee0065000a00f200b80046
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_1 = 00190008000b009f00310083001300de001c005a00a300f3001e00a800ca0063
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_1 = 00f100050022002900d1004600ac003900d7007800b2009a00ec00ab002400db
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_1 = 0001008300ef009300e60074004c006200380014006d006f00cd0012000d00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_1 = 00fb0002006f008700c0004d008300d9005a009c00c40094008e00a6002f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_1 = 002a001e007000650003001b00d5004200bd00ad00e40055005a000000f000ad
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_1 = 00c4002000d0004b00890086001600f600df00b200710091004c00c00092006f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_1 = 00ec001f00c80037003a007c009900d100b5001a003a005300cc00fb0022000f
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_1 = 00e9005d0057002c005b00e600a700df001400700095005d00d7009f002600fb
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_1 = 001c00e800be003f00bd00aa00f00070006d003b0021002b0084003c00670069
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_1 = 001d001400ec00be00b1009e004300ac002a005f007b00d0001c00b200e600e7
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_1 = 009200e90019009600f600cf00cb00b0008d006700d00041004300d700ba003d
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_1 = 00cc00590084006d0068005400190032000b005500400053002b00e700660044
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_1 = 00a20009008e0088007d009e0092005400470093007b00ca009c004a00790068
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_1 = 00c600e2009000fe006f0030009000df005300a1009c0038002700820026004b
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_1 = 003b004800cf005000af00bb00050006009600f4002c002200fc00a10038006c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_1 = 00ed008500890075003300f400df009100950012008e00110048006d00e500ac
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_1 = 00900039007800030070006500a2009f0088006700a800a6006700b6006e0029
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_1 = 006d00f900730088005300fb00cc00d700cf00e90075006c00d40027009e0064
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_1 = 000e00c2002300c200a600430040003f00de005200b8006500040010000f0041
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_1 = 00dc007f00c9003900e9001b002900cc00e200630034005600db004a00290004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_1 = 00b800a9002100bb0097002900a000db009200e0001300050087008600e400fb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_1 = 00cd00d7007f007100230027000a0014004f0070002d00b300cf00560082007f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_1 = 00120049000d00cf00ed006400f90037009a00ec00c5002f002700ce000a002e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_1 = 00b6001600a3004f0032000f00bc005f008f007600b4004900b10049005b00c3
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_1 = 00a20067000d006a005d00d0002c00020076008a00ae00bd000b000d00d90003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_1 = 000c004d00ac006a00850079001e00a900f100a40034006000dd003c0004001d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_1 = 003e00ad007600e1003700c2002500f600b7008a00f800ae002300fa00480014
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_1 = 0035007f00000008002a002c00d000c700dc006700ef0006003300d7002f0069
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_1 = 0073007200c600ad007a00ac00e4006e00e500c3005d00d300680095009500ca
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_1 = 005100010034004200e200bd00c0006a003400120049008700e80012000c00fa
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_2 = 003e0014000b003c007b00ba00ae00e3005c0079006d00c300e400e5008400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_2 = 007e004100d700a100e00026001e008e00a2000e00de0085002700ce00ef007b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_2 = 00fb00ab004d00c300b3006200a700a4005f009c001300dc00b8003100ed00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_2 = 000e009700520069007e007000f600ad003f00570037001e002c00b7007b003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_2 = 00e5000200e900ed005900a2003e0089007d001e00d3004c00be00d800b500f5
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_2 = 008900c7007200bf00a800b900670031000300980025003f00fc00b800220094
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_2 = 001400d7004200b6003d004f00cf00c100d5000700d000e700e600d600390020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_2 = 00bc00f600d10041008f00f6005d007a00c400a5001e001700210075002c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_2 = 00be00270021005c004f00a2000c001b00d4006c0026002700d9009a00df003d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_2 = 007600480096005b00b5008b005600df00c80087000c009b003700c700c6002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_2 = 00ca00b700d100f4009b00cc002600ce00c9009d00a3007c009800c500030035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_2 = 007e00e50066000b00fe002000da00ef008c00ac00a60097007e006300ad00e2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_2 = 00b000590018004c009e0057002600a40037001f002d000c00490045004a0073
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_2 = 008400c900290018005300e3004d007f0027005a005c00fc00bb000600c600a7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_2 = 00a0004b00cc006300ac007a00920018003900ff000800350039007e003300bc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_2 = 00a60074005900bd00b8008d0072000700c90015000800f300880015000b0028
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_2 = 00d2000600be0058000800b800a400da0001000c00530009004b003700750041
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_2 = 00950044000a0073007700a0009600f2007d007200670040000e007300510053
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_2 = 0011007c0067004200bd004e005f009700d5009200c200e700c700f800f000cc
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_2 = 00790089009200aa0063002d005f008900ed0021005e006300e20020008700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_2 = 004f007a0065004a0084005d0065007f00ee000a00b900c600f800b2008d004a
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_2 = 00ba00ad00ed0014009e00df005d00e20011001a0034003e003300610049006d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_2 = 00990046001b000e0091008600d5001a005f002b006000a20035005c00fb009f
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_2 = 0033003b00ad005e00150036006a00b500ae0056006800350039005000cb00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_2 = 008b001c008100be008400cc00d2001d003b002c00f900b3005e0091009400b4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_2 = 00b10067006b004200eb00cd00b000ff009e0017003c002c00bd00ee007c00b5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_2 = 002d0054000000720030002900d000d200c300cd0043001e0013001c0075005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_2 = 005a00ce006f00ab008100e30024006d008800b70056007e00d500ea009b00a8
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_2 = 0095005d00f100c4001c005a00770014005600f9000700be002400af002d00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_2 = 0021005200de00a600fd00e000260062007500ed006a008e0003004f001f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_2 = 00dc00de00f700d6009900050093004400f400000031004800c500550072005e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_2 = 00a700ea008a00c7003700a1001e001200df003a009e007900be009a00ee00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_2 = 0071005f0020000400f100c1002900de0053007000a9000f00fa00b900430096
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_2 = 003400d100d3001a00b90019005f005200e7006300bc004400df000500310058
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_2 = 0047008700b500940066005c007100f600f5000b00a300c600f20098003b002a
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_2 = 00cb00a600ad00c1004f00e9006200d3005c0085004e00fb009c005500d50023
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_2 = 00e600bb00e9009200c300bf0037009400ef00650081009500d00070007300ab
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_2 = 0075004c005500c7008e00a800bd009300fc00d4008d00ce0036002d00340037
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_2 = 005d004f005d009f00e100f5002600ee00f7001b0072009e0043002e00e3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_2 = 007a007100d90086008300c300b6004b00670039008c000d00d300d400220060
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_2 = 00e700c00074006d0013009d0092004c00ed002b00db00a700040069004c0052
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_2 = 00ce002e00d400bf004c00ef006c0000002d001d0087006200e0002e00900078
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_2 = 00b6009600e6003c00f7003600460065004300540053009700cf004e002a00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_2 = 000c009500940062002e00c200f10047003000290078005b00b000f500b80006
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_2 = 001700bf008300320007003800ca000b004a00ac004b00e8001c00ce00620029
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_2 = 002300b2003a00e9009300b100a900d90080008e001d007d008f006a00ed00de
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_2 = 003500a9004e002400630071005300f70028002e0069006400e3003400ab0064
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_2 = 005900c9000200f800ae0098009a0060002f005c00ee0065000a00f200b80046
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_2 = 00190008000b009f00310083001300de001c005a00a300f3001e00a800ca0063
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_2 = 00f100050022002900d1004600ac003900d7007800b2009a00ec00ab002400db
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_2 = 0001008300ef009300e60074004c006200380014006d006f00cd0012000d00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_2 = 00fb0002006f008700c0004d008300d9005a009c00c40094008e00a6002f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_2 = 002a001e007000650003001b00d5004200bd00ad00e40055005a000000f000ad
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_2 = 00c4002000d0004b00890086001600f600df00b200710091004c00c00092006f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_2 = 00ec001f00c80037003a007c009900d100b5001a003a005300cc00fb0022000f
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_2 = 00e9005d0057002c005b00e600a700df001400700095005d00d7009f002600fb
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_2 = 001c00e800be003f00bd00aa00f00070006d003b0021002b0084003c00670069
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_2 = 001d001400ec00be00b1009e004300ac002a005f007b00d0001c00b200e600e7
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_2 = 009200e90019009600f600cf00cb00b0008d006700d00041004300d700ba003d
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_2 = 00cc00590084006d0068005400190032000b005500400053002b00e700660044
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_2 = 00a20009008e0088007d009e0092005400470093007b00ca009c004a00790068
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_2 = 00c600e2009000fe006f0030009000df005300a1009c0038002700820026004b
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_2 = 003b004800cf005000af00bb00050006009600f4002c002200fc00a10038006c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_2 = 00ed008500890075003300f400df009100950012008e00110048006d00e500ac
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_2 = 00900039007800030070006500a2009f0088006700a800a6006700b6006e0029
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_2 = 006d00f900730088005300fb00cc00d700cf00e90075006c00d40027009e0064
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_2 = 000e00c2002300c200a600430040003f00de005200b8006500040010000f0041
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_2 = 00dc007f00c9003900e9001b002900cc00e200630034005600db004a00290004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_2 = 00b800a9002100bb0097002900a000db009200e0001300050087008600e400fb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_2 = 00cd00d7007f007100230027000a0014004f0070002d00b300cf00560082007f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_2 = 00120049000d00cf00ed006400f90037009a00ec00c5002f002700ce000a002e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_2 = 00b6001600a3004f0032000f00bc005f008f007600b4004900b10049005b00c3
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_2 = 00a20067000d006a005d00d0002c00020076008a00ae00bd000b000d00d90003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_2 = 000c004d00ac006a00850079001e00a900f100a40034006000dd003c0004001d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_2 = 003e00ad007600e1003700c2002500f600b7008a00f800ae002300fa00480014
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_2 = 0035007f00000008002a002c00d000c700dc006700ef0006003300d7002f0069
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_2 = 0073007200c600ad007a00ac00e4006e00e500c3005d00d300680095009500ca
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_2 = 005100010034004200e200bd00c0006a003400120049008700e80012000c00fa
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_3 = 003e0014000b003c007b00ba00ae00e3005c0079006d00c300e400e5008400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_3 = 007e004100d700a100e00026001e008e00a2000e00de0085002700ce00ef007b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_3 = 00fb00ab004d00c300b3006200a700a4005f009c001300dc00b8003100ed00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_3 = 000e009700520069007e007000f600ad003f00570037001e002c00b7007b003b
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_3 = 00e5000200e900ed005900a2003e0089007d001e00d3004c00be00d800b500f5
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_3 = 008900c7007200bf00a800b900670031000300980025003f00fc00b800220094
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_3 = 001400d7004200b6003d004f00cf00c100d5000700d000e700e600d600390020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_3 = 00bc00f600d10041008f00f6005d007a00c400a5001e001700210075002c0048
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_3 = 00be00270021005c004f00a2000c001b00d4006c0026002700d9009a00df003d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_3 = 007600480096005b00b5008b005600df00c80087000c009b003700c700c6002e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_3 = 00ca00b700d100f4009b00cc002600ce00c9009d00a3007c009800c500030035
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_3 = 007e00e50066000b00fe002000da00ef008c00ac00a60097007e006300ad00e2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_3 = 00b000590018004c009e0057002600a40037001f002d000c00490045004a0073
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_3 = 008400c900290018005300e3004d007f0027005a005c00fc00bb000600c600a7
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_3 = 00a0004b00cc006300ac007a00920018003900ff000800350039007e003300bc
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_3 = 00a60074005900bd00b8008d0072000700c90015000800f300880015000b0028
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_3 = 00d2000600be0058000800b800a400da0001000c00530009004b003700750041
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_3 = 00950044000a0073007700a0009600f2007d007200670040000e007300510053
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_3 = 0011007c0067004200bd004e005f009700d5009200c200e700c700f800f000cc
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_3 = 00790089009200aa0063002d005f008900ed0021005e006300e20020008700fe
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_3 = 004f007a0065004a0084005d0065007f00ee000a00b900c600f800b2008d004a
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_3 = 00ba00ad00ed0014009e00df005d00e20011001a0034003e003300610049006d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_3 = 00990046001b000e0091008600d5001a005f002b006000a20035005c00fb009f
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_3 = 0033003b00ad005e00150036006a00b500ae0056006800350039005000cb00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_3 = 008b001c008100be008400cc00d2001d003b002c00f900b3005e0091009400b4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_3 = 00b10067006b004200eb00cd00b000ff009e0017003c002c00bd00ee007c00b5
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_3 = 002d0054000000720030002900d000d200c300cd0043001e0013001c0075005c
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_3 = 005a00ce006f00ab008100e30024006d008800b70056007e00d500ea009b00a8
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_3 = 0095005d00f100c4001c005a00770014005600f9000700be002400af002d00a6
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_3 = 0021005200de00a600fd00e000260062007500ed006a008e0003004f001f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_3 = 00dc00de00f700d6009900050093004400f400000031004800c500550072005e
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_3 = 00a700ea008a00c7003700a1001e001200df003a009e007900be009a00ee00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_3 = 0071005f0020000400f100c1002900de0053007000a9000f00fa00b900430096
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_3 = 003400d100d3001a00b90019005f005200e7006300bc004400df000500310058
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_3 = 0047008700b500940066005c007100f600f5000b00a300c600f20098003b002a
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_3 = 00cb00a600ad00c1004f00e9006200d3005c0085004e00fb009c005500d50023
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_3 = 00e600bb00e9009200c300bf0037009400ef00650081009500d00070007300ab
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_3 = 0075004c005500c7008e00a800bd009300fc00d4008d00ce0036002d00340037
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_3 = 005d004f005d009f00e100f5002600ee00f7001b0072009e0043002e00e3003c
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_3 = 007a007100d90086008300c300b6004b00670039008c000d00d300d400220060
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_3 = 00e700c00074006d0013009d0092004c00ed002b00db00a700040069004c0052
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_3 = 00ce002e00d400bf004c00ef006c0000002d001d0087006200e0002e00900078
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_3 = 00b6009600e6003c00f7003600460065004300540053009700cf004e002a00d4
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_3 = 000c009500940062002e00c200f10047003000290078005b00b000f500b80006
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_3 = 001700bf008300320007003800ca000b004a00ac004b00e8001c00ce00620029
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_3 = 002300b2003a00e9009300b100a900d90080008e001d007d008f006a00ed00de
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_3 = 003500a9004e002400630071005300f70028002e0069006400e3003400ab0064
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_3 = 005900c9000200f800ae0098009a0060002f005c00ee0065000a00f200b80046
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_3 = 00190008000b009f00310083001300de001c005a00a300f3001e00a800ca0063
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_3 = 00f100050022002900d1004600ac003900d7007800b2009a00ec00ab002400db
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_3 = 0001008300ef009300e60074004c006200380014006d006f00cd0012000d00ee
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_3 = 00fb0002006f008700c0004d008300d9005a009c00c40094008e00a6002f00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_3 = 002a001e007000650003001b00d5004200bd00ad00e40055005a000000f000ad
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_3 = 00c4002000d0004b00890086001600f600df00b200710091004c00c00092006f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_3 = 00ec001f00c80037003a007c009900d100b5001a003a005300cc00fb0022000f
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_3 = 00e9005d0057002c005b00e600a700df001400700095005d00d7009f002600fb
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_3 = 001c00e800be003f00bd00aa00f00070006d003b0021002b0084003c00670069
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_3 = 001d001400ec00be00b1009e004300ac002a005f007b00d0001c00b200e600e7
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_3 = 009200e90019009600f600cf00cb00b0008d006700d00041004300d700ba003d
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_3 = 00cc00590084006d0068005400190032000b005500400053002b00e700660044
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_3 = 00a20009008e0088007d009e0092005400470093007b00ca009c004a00790068
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_3 = 00c600e2009000fe006f0030009000df005300a1009c0038002700820026004b
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_3 = 003b004800cf005000af00bb00050006009600f4002c002200fc00a10038006c
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_3 = 00ed008500890075003300f400df009100950012008e00110048006d00e500ac
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_3 = 00900039007800030070006500a2009f0088006700a800a6006700b6006e0029
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_3 = 006d00f900730088005300fb00cc00d700cf00e90075006c00d40027009e0064
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_3 = 000e00c2002300c200a600430040003f00de005200b8006500040010000f0041
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_3 = 00dc007f00c9003900e9001b002900cc00e200630034005600db004a00290004
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_3 = 00b800a9002100bb0097002900a000db009200e0001300050087008600e400fb
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_3 = 00cd00d7007f007100230027000a0014004f0070002d00b300cf00560082007f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_3 = 00120049000d00cf00ed006400f90037009a00ec00c5002f002700ce000a002e
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_3 = 00b6001600a3004f0032000f00bc005f008f007600b4004900b10049005b00c3
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_3 = 00a20067000d006a005d00d0002c00020076008a00ae00bd000b000d00d90003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_3 = 000c004d00ac006a00850079001e00a900f100a40034006000dd003c0004001d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_3 = 003e00ad007600e1003700c2002500f600b7008a00f800ae002300fa00480014
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_3 = 0035007f00000008002a002c00d000c700dc006700ef0006003300d7002f0069
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_3 = 0073007200c600ad007a00ac00e4006e00e500c3005d00d300680095009500ca
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_3 = 005100010034004200e200bd00c0006a003400120049008700e80012000c00fa
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_0 = 00dd008a00ab001f0013000900a400bf00d7003a000e001f005c000800440018
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_0 = 00ef00cf00ac006f00ca001d00be008c00820090009c005b00660053005400f2
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_0 = 006c00380067006c009e00d3008800ec00af00fa008f008a00a800b6008400bf
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_0 = 00dd007700ca00b600cc00d800c300ac001600d600b60070007a00ba006c0024
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_0 = 005300b800f9009b001800f600e1005f0020002700da00e3000b00360085001f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_0 = 001f003e001700a3003d005200d700c9007100ef007e004c00e9006900b10054
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_0 = 00ff00080096009800460077009200e6009500d000d900fa00b500a600ca00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_0 = 005c0040004000a8000500d5002e00eb009b00b9005d002b006900670080008c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_0 = 00e900be004e00110068009e00f60078003100d8000b006d00bc00f6003300ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_0 = 002400ff005f009600a200890004007f00e300740088000100f10040001f0096
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_0 = 001000c9004c0078000e00e2007600ff0031008500d2005d00ff0013003a0034
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_0 = 00a20025009000590041006400b900ff00d30091003d005900e4001d003b0076
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_0 = 0016004600ca0098001c00b5004c00c4000900c100e1009a00f000ed00950057
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_0 = 003c001500b600bd00a400e000da00d10000003e00e900a8007f004d005a000d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_0 = 0021003900dd000a0088001600d000d6006d0008009000b400ac009e001d00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_0 = 003b00b4007600a60064008e0030008500a6008000da009e0099000d007f0024
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_0 = 00ac00460091003d0087008f00c300bf00ca00e0002c004a00b1000200d30076
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_0 = 002c0062006700f90002004300b1008300bb00e500ed00bb000400bd00b600d1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_0 = 00d000a100ea007b0072008e002100a200ae003800cf001400d00056007a00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_0 = 00ec0054000200bf00d800b7008300ab00b900c900ad002700ba009600de00f1
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray2_3 = 00c7003600a700850053004700e6002f00fd003f0019000f004b00650040001b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_0 = 0021005a00b3007a0061007c000e00c6001d00f0003200ee00ef000900b3007f
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_0 = 00080099009f00cd004100da00fe0080002f007a00e800480016004d00020087
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_0 = 0088006000cc008700990057004900ba00c3005e009a00d0005d00d70027008a
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_0 = 004500f7006a00eb000d002a004e00ee00c7004100450098002c0057009d006d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_0 = 0086005a00c400dd0013001400e7001300780035000b008b00ea00bf00ee0020
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_0 = 004c00e200d1008b00a5007000cd00e10007004b0041007200ae007900620027
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_0 = 00f500d800c400850004004900bb0009001100f200260018004c0022001b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_0 = 001b002900ea001f00da0074009800220066003a001000c80094004600230025
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_0 = 00c2000600ee001400c10037008200b600a3009100d700ac00b70006002e001d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_0 = 005600e900bc002b00a3002b00f3002c00a00066009300eb0083005c0040009f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_0 = 00af00cb00df00e200550044000d00f600c6002800af008b0089001f004d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_0 = 00170080004000e200e100f300590044003500950014003c00aa00830071001e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_0 = 004300a500d3004c00f10081007100d000b000a300ec00b4009f00fe008d0020
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_0 = 007b009f00c400af00ff00070094009100e200f700cc0043004800e9007b00ef
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_0 = 0004005800ca00c600fc00ed007700c9001100ba006200a9002200f600a7003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_0 = 000b008500e100b90055002a0069001c005300470035009d002700f300fd0094
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_0 = 0082002800cf00660014001200f700dc004b005e0023003700b500fe0009005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_0 = 00460002000d000b0074006a00c10038007e00aa00c3002400da0099001a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_0 = 003d007d00ab000a008700dd0081002c00fb00e0005c002c006e000100c20065
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_0 = 00ea0045004400db0070002d006a00dc003300d800f3008c00ee00ef0090005b
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_0 = 006500a3001300b800620076005d001f00c3003e0092005d00e8002200870079
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_0 = 001d00d1003f008d00c9005300b100d50051001500120035000f00c6003e0059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_0 = 00cb0077005200d1007e00f9008c00fd00c000e7003000b200bb006c00c500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_0 = 00d600ce00a300d50071004a00ce003e008300fe005e00830037006100b100bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_0 = 005c00cc004c0095002c00320085005400e5005d00f200a600120027004a00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_0 = 001800c3009d0058002600be0070002a00ec00ee00230023007100fc00ec00fd
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_0 = 007e00d6009f007b005c0076008f0063007d00ad00d9003e001d009b002600fa
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_0 = 003800d300a000c000cf00670001006b003c003f003c0078003800dc00f600ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_0 = 001d00a500f900780019007c00e500e700f3007400e3008400fe008200bd001f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_0 = 00af008a00b9005600bc001b00a000500074006d00a500b5005d003700f000c5
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_0 = 00b000240017009b007e003a00e600b6002200f800d4005a00c8005d00cc00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_0 = 008d007700ce003a00c500ba0055007d003d00af00c500cf00ca008a00810047
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_0 = 00eb004b0004001b006600e700ff002400ba008800ee007600e800820092002e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_0 = 001600e20039002d00ad0007006700c20032001a00ee000f00df00f900b500b8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_0 = 00e1008d00f400350031002900d7009d00040002003b00c7006a004400ac00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_0 = 002f00ba00d9008900bd003a00f800d2009400d50078000a002100ed00a9009e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_0 = 002800de006a00bc0062002600ed00d100ae003f003e00fb0098001700f80008
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_0 = 004c005d004200c400bf00a6005700a2000c0036002a00eb000b00ad002600db
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_0 = 00ca0097004600a400de003a00700011003800dd007700b100320019001a0023
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_0 = 00ab0061007400b70093008100ee008500a3006c00a300590038001200cd0072
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_0 = 00ac004c00ad00650082009f005600d400cd00a0009a0040000300ef00310073
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_0 = 00ac00880094009d0090008a00e5005900ee009d001000fa002b005600ed00d4
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_0 = 00db00b300e500a7005b008f000700a60011006e0016009000d400c7003400b1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_0 = 006100f9005100f800ec0022005800a10031006f002b0024005c000300dd0057
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_0 = 00ca008300fa003600c900c3002100c900d80046008400ad00b400d0002d00df
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_0 = 00fc00120046007a007000730088004b000b00d3007100660064002f00ae00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_0 = 00590076001d00000083000c008d004500d6006e00c6008300890076008800fa
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_0 = 003a003200bb00f9005d00a500bf0026006000240074007c00a900c000670097
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_0 = 009a00f500a100ee007c00de00b100dd0052009600d700410091004800bc0037
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_0 = 00bb00f2003e00dc0049002600fb00890091002300fd00c000e7000d00510041
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_0 = 00f2002300ce00dc006d00c6008900ff00a1008e0024006c00c300c6009900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_0 = 00260065004400b40063006a009f008600d9004f00aa00a7008400530087003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_0 = 003e007f00140099003b005e00640077000900910057003b008700e5007a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_0 = 0012002200dd00e3006f00b800810084002e00e5000e002900ed0031006e0042
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_0 = 00490048003b0092001800bf004c00d700e90043001c009900c0006e000900c6
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_0 = 005100c9002d00210070001700230069003400f80093007400cc00cb00b000e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_0 = 00eb001200f6001c00b50046004c00a100000059006400ea00f200bc000400f4
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_0 = 00390071007f00dd0075005500a0002500e20015008f00c9008f008500960014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_0 = 0072008d00450007007c00eb00e4009200a1009a00d0002e0085005600260015
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_0 = 00e5007a008800fa00f90057005d00f6004c0063009f00940092001100fb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_0 = 009e00d0003700b80069005c00bf00ec0007009900a5000d008500f5003f00c8
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_0 = 0059003e007b00be006a003f00d4004900ab00e7004b009c003d004900bb00bb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_0 = 00ff0099007800e2008900400002003d000d001000ac00d80011003800ae008f
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_1 = 0021005a00b3007a0061007c000e00c6001d00f0003200ee00ef000900b3007f
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_1 = 00080099009f00cd004100da00fe0080002f007a00e800480016004d00020087
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_1 = 0088006000cc008700990057004900ba00c3005e009a00d0005d00d70027008a
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_1 = 004500f7006a00eb000d002a004e00ee00c7004100450098002c0057009d006d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_1 = 0086005a00c400dd0013001400e7001300780035000b008b00ea00bf00ee0020
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_1 = 004c00e200d1008b00a5007000cd00e10007004b0041007200ae007900620027
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_1 = 00f500d800c400850004004900bb0009001100f200260018004c0022001b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_1 = 001b002900ea001f00da0074009800220066003a001000c80094004600230025
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_1 = 00c2000600ee001400c10037008200b600a3009100d700ac00b70006002e001d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_1 = 005600e900bc002b00a3002b00f3002c00a00066009300eb0083005c0040009f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_1 = 00af00cb00df00e200550044000d00f600c6002800af008b0089001f004d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_1 = 00170080004000e200e100f300590044003500950014003c00aa00830071001e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_1 = 004300a500d3004c00f10081007100d000b000a300ec00b4009f00fe008d0020
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_1 = 007b009f00c400af00ff00070094009100e200f700cc0043004800e9007b00ef
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_1 = 0004005800ca00c600fc00ed007700c9001100ba006200a9002200f600a7003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_1 = 000b008500e100b90055002a0069001c005300470035009d002700f300fd0094
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_1 = 0082002800cf00660014001200f700dc004b005e0023003700b500fe0009005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_1 = 00460002000d000b0074006a00c10038007e00aa00c3002400da0099001a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_1 = 003d007d00ab000a008700dd0081002c00fb00e0005c002c006e000100c20065
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_1 = 00ea0045004400db0070002d006a00dc003300d800f3008c00ee00ef0090005b
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_1 = 006500a3001300b800620076005d001f00c3003e0092005d00e8002200870079
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_1 = 001d00d1003f008d00c9005300b100d50051001500120035000f00c6003e0059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_1 = 00cb0077005200d1007e00f9008c00fd00c000e7003000b200bb006c00c500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_1 = 00d600ce00a300d50071004a00ce003e008300fe005e00830037006100b100bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_1 = 005c00cc004c0095002c00320085005400e5005d00f200a600120027004a00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_1 = 001800c3009d0058002600be0070002a00ec00ee00230023007100fc00ec00fd
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_1 = 007e00d6009f007b005c0076008f0063007d00ad00d9003e001d009b002600fa
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_1 = 003800d300a000c000cf00670001006b003c003f003c0078003800dc00f600ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_1 = 001d00a500f900780019007c00e500e700f3007400e3008400fe008200bd001f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_1 = 00af008a00b9005600bc001b00a000500074006d00a500b5005d003700f000c5
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_1 = 00b000240017009b007e003a00e600b6002200f800d4005a00c8005d00cc00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_1 = 008d007700ce003a00c500ba0055007d003d00af00c500cf00ca008a00810047
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_1 = 00eb004b0004001b006600e700ff002400ba008800ee007600e800820092002e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_1 = 001600e20039002d00ad0007006700c20032001a00ee000f00df00f900b500b8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_1 = 00e1008d00f400350031002900d7009d00040002003b00c7006a004400ac00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_1 = 002f00ba00d9008900bd003a00f800d2009400d50078000a002100ed00a9009e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_1 = 002800de006a00bc0062002600ed00d100ae003f003e00fb0098001700f80008
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_1 = 004c005d004200c400bf00a6005700a2000c0036002a00eb000b00ad002600db
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_1 = 00ca0097004600a400de003a00700011003800dd007700b100320019001a0023
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_1 = 00ab0061007400b70093008100ee008500a3006c00a300590038001200cd0072
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_1 = 00ac004c00ad00650082009f005600d400cd00a0009a0040000300ef00310073
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_1 = 00ac00880094009d0090008a00e5005900ee009d001000fa002b005600ed00d4
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_1 = 00db00b300e500a7005b008f000700a60011006e0016009000d400c7003400b1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_1 = 006100f9005100f800ec0022005800a10031006f002b0024005c000300dd0057
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_1 = 00ca008300fa003600c900c3002100c900d80046008400ad00b400d0002d00df
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_1 = 00fc00120046007a007000730088004b000b00d3007100660064002f00ae00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_1 = 00590076001d00000083000c008d004500d6006e00c6008300890076008800fa
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_1 = 003a003200bb00f9005d00a500bf0026006000240074007c00a900c000670097
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_1 = 009a00f500a100ee007c00de00b100dd0052009600d700410091004800bc0037
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_1 = 00bb00f2003e00dc0049002600fb00890091002300fd00c000e7000d00510041
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_1 = 00f2002300ce00dc006d00c6008900ff00a1008e0024006c00c300c6009900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_1 = 00260065004400b40063006a009f008600d9004f00aa00a7008400530087003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_1 = 003e007f00140099003b005e00640077000900910057003b008700e5007a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_1 = 0012002200dd00e3006f00b800810084002e00e5000e002900ed0031006e0042
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_1 = 00490048003b0092001800bf004c00d700e90043001c009900c0006e000900c6
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_1 = 005100c9002d00210070001700230069003400f80093007400cc00cb00b000e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_1 = 00eb001200f6001c00b50046004c00a100000059006400ea00f200bc000400f4
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_1 = 00390071007f00dd0075005500a0002500e20015008f00c9008f008500960014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_1 = 0072008d00450007007c00eb00e4009200a1009a00d0002e0085005600260015
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_1 = 00e5007a008800fa00f90057005d00f6004c0063009f00940092001100fb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_1 = 009e00d0003700b80069005c00bf00ec0007009900a5000d008500f5003f00c8
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_1 = 0059003e007b00be006a003f00d4004900ab00e7004b009c003d004900bb00bb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_1 = 00ff0099007800e2008900400002003d000d001000ac00d80011003800ae008f
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_2 = 0021005a00b3007a0061007c000e00c6001d00f0003200ee00ef000900b3007f
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_2 = 00080099009f00cd004100da00fe0080002f007a00e800480016004d00020087
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_2 = 0088006000cc008700990057004900ba00c3005e009a00d0005d00d70027008a
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_2 = 004500f7006a00eb000d002a004e00ee00c7004100450098002c0057009d006d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_2 = 0086005a00c400dd0013001400e7001300780035000b008b00ea00bf00ee0020
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_2 = 004c00e200d1008b00a5007000cd00e10007004b0041007200ae007900620027
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_2 = 00f500d800c400850004004900bb0009001100f200260018004c0022001b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_2 = 001b002900ea001f00da0074009800220066003a001000c80094004600230025
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_2 = 00c2000600ee001400c10037008200b600a3009100d700ac00b70006002e001d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_2 = 005600e900bc002b00a3002b00f3002c00a00066009300eb0083005c0040009f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_2 = 00af00cb00df00e200550044000d00f600c6002800af008b0089001f004d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_2 = 00170080004000e200e100f300590044003500950014003c00aa00830071001e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_2 = 004300a500d3004c00f10081007100d000b000a300ec00b4009f00fe008d0020
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_2 = 007b009f00c400af00ff00070094009100e200f700cc0043004800e9007b00ef
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_2 = 0004005800ca00c600fc00ed007700c9001100ba006200a9002200f600a7003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_2 = 000b008500e100b90055002a0069001c005300470035009d002700f300fd0094
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_2 = 0082002800cf00660014001200f700dc004b005e0023003700b500fe0009005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_2 = 00460002000d000b0074006a00c10038007e00aa00c3002400da0099001a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_2 = 003d007d00ab000a008700dd0081002c00fb00e0005c002c006e000100c20065
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_2 = 00ea0045004400db0070002d006a00dc003300d800f3008c00ee00ef0090005b
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_2 = 006500a3001300b800620076005d001f00c3003e0092005d00e8002200870079
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_2 = 001d00d1003f008d00c9005300b100d50051001500120035000f00c6003e0059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_2 = 00cb0077005200d1007e00f9008c00fd00c000e7003000b200bb006c00c500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_2 = 00d600ce00a300d50071004a00ce003e008300fe005e00830037006100b100bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_2 = 005c00cc004c0095002c00320085005400e5005d00f200a600120027004a00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_2 = 001800c3009d0058002600be0070002a00ec00ee00230023007100fc00ec00fd
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_2 = 007e00d6009f007b005c0076008f0063007d00ad00d9003e001d009b002600fa
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_2 = 003800d300a000c000cf00670001006b003c003f003c0078003800dc00f600ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_2 = 001d00a500f900780019007c00e500e700f3007400e3008400fe008200bd001f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_2 = 00af008a00b9005600bc001b00a000500074006d00a500b5005d003700f000c5
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_2 = 00b000240017009b007e003a00e600b6002200f800d4005a00c8005d00cc00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_2 = 008d007700ce003a00c500ba0055007d003d00af00c500cf00ca008a00810047
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_2 = 00eb004b0004001b006600e700ff002400ba008800ee007600e800820092002e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_2 = 001600e20039002d00ad0007006700c20032001a00ee000f00df00f900b500b8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_2 = 00e1008d00f400350031002900d7009d00040002003b00c7006a004400ac00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_2 = 002f00ba00d9008900bd003a00f800d2009400d50078000a002100ed00a9009e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_2 = 002800de006a00bc0062002600ed00d100ae003f003e00fb0098001700f80008
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_2 = 004c005d004200c400bf00a6005700a2000c0036002a00eb000b00ad002600db
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_2 = 00ca0097004600a400de003a00700011003800dd007700b100320019001a0023
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_2 = 00ab0061007400b70093008100ee008500a3006c00a300590038001200cd0072
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_2 = 00ac004c00ad00650082009f005600d400cd00a0009a0040000300ef00310073
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_2 = 00ac00880094009d0090008a00e5005900ee009d001000fa002b005600ed00d4
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_2 = 00db00b300e500a7005b008f000700a60011006e0016009000d400c7003400b1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_2 = 006100f9005100f800ec0022005800a10031006f002b0024005c000300dd0057
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_2 = 00ca008300fa003600c900c3002100c900d80046008400ad00b400d0002d00df
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_2 = 00fc00120046007a007000730088004b000b00d3007100660064002f00ae00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_2 = 00590076001d00000083000c008d004500d6006e00c6008300890076008800fa
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_2 = 003a003200bb00f9005d00a500bf0026006000240074007c00a900c000670097
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_2 = 009a00f500a100ee007c00de00b100dd0052009600d700410091004800bc0037
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_2 = 00bb00f2003e00dc0049002600fb00890091002300fd00c000e7000d00510041
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_2 = 00f2002300ce00dc006d00c6008900ff00a1008e0024006c00c300c6009900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_2 = 00260065004400b40063006a009f008600d9004f00aa00a7008400530087003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_2 = 003e007f00140099003b005e00640077000900910057003b008700e5007a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_2 = 0012002200dd00e3006f00b800810084002e00e5000e002900ed0031006e0042
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_2 = 00490048003b0092001800bf004c00d700e90043001c009900c0006e000900c6
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_2 = 005100c9002d00210070001700230069003400f80093007400cc00cb00b000e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_2 = 00eb001200f6001c00b50046004c00a100000059006400ea00f200bc000400f4
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_2 = 00390071007f00dd0075005500a0002500e20015008f00c9008f008500960014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_2 = 0072008d00450007007c00eb00e4009200a1009a00d0002e0085005600260015
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_2 = 00e5007a008800fa00f90057005d00f6004c0063009f00940092001100fb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_2 = 009e00d0003700b80069005c00bf00ec0007009900a5000d008500f5003f00c8
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_2 = 0059003e007b00be006a003f00d4004900ab00e7004b009c003d004900bb00bb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_2 = 00ff0099007800e2008900400002003d000d001000ac00d80011003800ae008f
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray4_3 = 0021005a00b3007a0061007c000e00c6001d00f0003200ee00ef000900b3007f
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray4_3 = 00080099009f00cd004100da00fe0080002f007a00e800480016004d00020087
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray4_3 = 0088006000cc008700990057004900ba00c3005e009a00d0005d00d70027008a
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray4_3 = 004500f7006a00eb000d002a004e00ee00c7004100450098002c0057009d006d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray4_3 = 0086005a00c400dd0013001400e7001300780035000b008b00ea00bf00ee0020
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray4_3 = 004c00e200d1008b00a5007000cd00e10007004b0041007200ae007900620027
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray4_3 = 00f500d800c400850004004900bb0009001100f200260018004c0022001b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray4_3 = 001b002900ea001f00da0074009800220066003a001000c80094004600230025
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray4_3 = 00c2000600ee001400c10037008200b600a3009100d700ac00b70006002e001d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray4_3 = 005600e900bc002b00a3002b00f3002c00a00066009300eb0083005c0040009f
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray4_3 = 00af00cb00df00e200550044000d00f600c6002800af008b0089001f004d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray4_3 = 00170080004000e200e100f300590044003500950014003c00aa00830071001e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray4_3 = 004300a500d3004c00f10081007100d000b000a300ec00b4009f00fe008d0020
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray4_3 = 007b009f00c400af00ff00070094009100e200f700cc0043004800e9007b00ef
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray4_3 = 0004005800ca00c600fc00ed007700c9001100ba006200a9002200f600a7003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray4_3 = 000b008500e100b90055002a0069001c005300470035009d002700f300fd0094
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray4_3 = 0082002800cf00660014001200f700dc004b005e0023003700b500fe0009005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray4_3 = 00460002000d000b0074006a00c10038007e00aa00c3002400da0099001a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray4_3 = 003d007d00ab000a008700dd0081002c00fb00e0005c002c006e000100c20065
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray4_3 = 00ea0045004400db0070002d006a00dc003300d800f3008c00ee00ef0090005b
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray4_3 = 006500a3001300b800620076005d001f00c3003e0092005d00e8002200870079
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray4_3 = 001d00d1003f008d00c9005300b100d50051001500120035000f00c6003e0059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray4_3 = 00cb0077005200d1007e00f9008c00fd00c000e7003000b200bb006c00c500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray4_3 = 00d600ce00a300d50071004a00ce003e008300fe005e00830037006100b100bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray4_3 = 005c00cc004c0095002c00320085005400e5005d00f200a600120027004a00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray4_3 = 001800c3009d0058002600be0070002a00ec00ee00230023007100fc00ec00fd
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray4_3 = 007e00d6009f007b005c0076008f0063007d00ad00d9003e001d009b002600fa
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray4_3 = 003800d300a000c000cf00670001006b003c003f003c0078003800dc00f600ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray4_3 = 001d00a500f900780019007c00e500e700f3007400e3008400fe008200bd001f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray4_3 = 00af008a00b9005600bc001b00a000500074006d00a500b5005d003700f000c5
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray4_3 = 00b000240017009b007e003a00e600b6002200f800d4005a00c8005d00cc00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray4_3 = 008d007700ce003a00c500ba0055007d003d00af00c500cf00ca008a00810047
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray4_3 = 00eb004b0004001b006600e700ff002400ba008800ee007600e800820092002e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray4_3 = 001600e20039002d00ad0007006700c20032001a00ee000f00df00f900b500b8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray4_3 = 00e1008d00f400350031002900d7009d00040002003b00c7006a004400ac00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray4_3 = 002f00ba00d9008900bd003a00f800d2009400d50078000a002100ed00a9009e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray4_3 = 002800de006a00bc0062002600ed00d100ae003f003e00fb0098001700f80008
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray4_3 = 004c005d004200c400bf00a6005700a2000c0036002a00eb000b00ad002600db
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray4_3 = 00ca0097004600a400de003a00700011003800dd007700b100320019001a0023
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray4_3 = 00ab0061007400b70093008100ee008500a3006c00a300590038001200cd0072
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray4_3 = 00ac004c00ad00650082009f005600d400cd00a0009a0040000300ef00310073
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray4_3 = 00ac00880094009d0090008a00e5005900ee009d001000fa002b005600ed00d4
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray4_3 = 00db00b300e500a7005b008f000700a60011006e0016009000d400c7003400b1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray4_3 = 006100f9005100f800ec0022005800a10031006f002b0024005c000300dd0057
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray4_3 = 00ca008300fa003600c900c3002100c900d80046008400ad00b400d0002d00df
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray4_3 = 00fc00120046007a007000730088004b000b00d3007100660064002f00ae00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray4_3 = 00590076001d00000083000c008d004500d6006e00c6008300890076008800fa
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray4_3 = 003a003200bb00f9005d00a500bf0026006000240074007c00a900c000670097
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray4_3 = 009a00f500a100ee007c00de00b100dd0052009600d700410091004800bc0037
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray4_3 = 00bb00f2003e00dc0049002600fb00890091002300fd00c000e7000d00510041
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray4_3 = 00f2002300ce00dc006d00c6008900ff00a1008e0024006c00c300c6009900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray4_3 = 00260065004400b40063006a009f008600d9004f00aa00a7008400530087003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray4_3 = 003e007f00140099003b005e00640077000900910057003b008700e5007a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray4_3 = 0012002200dd00e3006f00b800810084002e00e5000e002900ed0031006e0042
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray4_3 = 00490048003b0092001800bf004c00d700e90043001c009900c0006e000900c6
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray4_3 = 005100c9002d00210070001700230069003400f80093007400cc00cb00b000e6
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray4_3 = 00eb001200f6001c00b50046004c00a100000059006400ea00f200bc000400f4
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray4_3 = 00390071007f00dd0075005500a0002500e20015008f00c9008f008500960014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray4_3 = 0072008d00450007007c00eb00e4009200a1009a00d0002e0085005600260015
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray4_3 = 00e5007a008800fa00f90057005d00f6004c0063009f00940092001100fb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray4_3 = 009e00d0003700b80069005c00bf00ec0007009900a5000d008500f5003f00c8
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray4_3 = 0059003e007b00be006a003f00d4004900ab00e7004b009c003d004900bb00bb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray4_3 = 00ff0099007800e2008900400002003d000d001000ac00d80011003800ae008f
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_0 = 0025002900820045001e008b0079003100b0008d006f005500db00fb00bd0085
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_0 = 00ce00a600230029006d009d00fe003b00d90003000f00bb001a001800fc0049
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_0 = 00bd008000e600f7000300f5001300ca001900d000a9002f00a70031006900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_0 = 00f2001e0075003700c30028004200f000ca0071003500cc007b00e2002a00b1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_0 = 00b1006400fb009700ab005c000700e1004500bd008d000e00d7001d00660086
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_0 = 00e2009300ed00b40050000b00d2002d006f00e9008400f5006300e000e100c8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_0 = 00be00400092009700c900b000eb00e100ed00d8006900f50097007500f20063
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_0 = 00270041008100a800f50075008500640051005e00b7005e007400ce005500fe
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_0 = 001f003d00cd000400e800d3004c00c900a100b100b1009c00b800c500ca00ff
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_0 = 0035007a003500460029005300b5003e00d400b300f500f50070008c004d0041
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_0 = 00ca005b005d00d7005f007b0003002c001800fc009800a50091007600050032
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_0 = 0083008d005100a5006d007b001c00d8001100a8005a007a00b8000300d60092
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_0 = 00d700b900dc00370085008800f3004500d3008b000500560044008b00b300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_0 = 00ae00c500f700c60071005000ea00c700bf004000df00e2008e000f005a003d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_0 = 00790074001c00b600a500f9001000c7005000550025006d00df00cd00720034
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_0 = 003c005c007d008200c000f800e900b800b500e700bd00be003a00740069002e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_0 = 00ee005c00090025001800b5007400f500cd0026005700780020005a00fe0006
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_0 = 00c600a5009600a10092007800b4001c007a00cf00c700e1002b00c800290089
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_0 = 0041003a0061001f00a30071006e002b002f004900f400c9004c00d9006f0098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_0 = 000d008300b3007d002e00a1006d002800e0003e00ec0000005e009d00550039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_0 = 000f009200d200e000b700ca00c000b600b40074009c0066007800c9007800c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_0 = 002f008600e400570089002400ff00c6008f009200c2003300c20001003d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_0 = 00df0038009700a80008004000b000c8008000f500c500e40077000e00e6006f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_0 = 00c6004500c300d00090005200d100a800e9008e006700e3003e00ac00620017
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_0 = 00a800af000f008d000a00b600360058008d0059003500770039004b008300d1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_0 = 0033008c002600e400e20032007000a200690006002600d100f9006f00fd00d1
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_0 = 00f200af0092005000ec008900d4001a004d00fd007900b300ff00b700190078
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_0 = 00f600450015005900b6009e007100a300c5002900d0002200bd006100f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_0 = 00c0001600e0001c0077000b00f800c300d300c7005100b200990024001300da
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_0 = 00e500ff00a30034007a00e800fd00f0006200ce0050007600ca006f007a00ee
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_0 = 006700670037008100f600fd005b0061004c008c003700e000f600330091002d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_0 = 005400130094006900e8000100e70065002000ad00440045007d000b00f0006a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_0 = 0036002d00dd00d5006d000800fc007200e00064005c000f00620093002a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_0 = 003b00eb000000df0043006c007400b10033009000ca00c40023005b006c0032
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_0 = 00250039004b001d004100e4003400af00cb006900ad00570058005300120047
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_0 = 005a00a800f200ca00af003f008a0092009c00ef0083001d0012000900f30092
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_0 = 00dd006c007a008500c6005f0039002600bc007100e10036004600a000fb0099
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_0 = 00090063005d006a00e0007f007300c800f3001400d80099000900d000bb00e4
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_0 = 0034002a00410098003a00f9003e006f000b00130094008600b9002e003300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_0 = 00f100c400fa00cd0099001800fd001e00a00084008d00db004000dd00ad00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_0 = 004100dd0057006e006800f4006200c7001e001100d2008c00b900c1008d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_0 = 00300050007c00de00d3004f006e008d002600db00c500fa00b300e900580047
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_0 = 00620058007f00ee00b000f0006e00d4001a00cf00dd003a004f00c600d90009
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_0 = 003b005600a30070008300e100e400c90048000600ee00ed0043009e00fa007e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_0 = 00d2005a006d00ee00d6002a00740099009a009600bd006900e800d700be0051
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_0 = 005e00ce00a600aa00d4002200cd003c001c00120064005c006a00cc004000d5
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_0 = 009300e30057004f00d600c200a1000500e8002a00ba00ae003c002100b80074
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_0 = 00b8008e00e4002800d50051000400db00c3004e00b300e0003c007600c7008f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_0 = 00a6006f00600033001800fb009800a40031005500a8000a00450007002f00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_0 = 00fc00c700f8004600b900ea001b007f00b7002300a0000400430010005b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_0 = 00dd0017007a00e000d90086003a007c00bc000500ea00d800a600a60068002e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_0 = 000300e40021008a00ff008d00f8000e00d8004100a8005f005c003300550048
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_0 = 00fb0040001b00a50045009f00ef002f008e006100b900df006c00f2006600ef
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_0 = 0012007b00da00fa00ec005500400042008600d7004e003a002600b200430016
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_0 = 0043007400260099000f0012002700d4000700c700d300a6001f0028002d007f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_0 = 000700db0085000b00dd006200b1004d004c001c00f7002a00670032001a0034
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_0 = 00a1000e00a9000000c6001b00c900fd00e100d800980092005d008b001d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_0 = 00ef001a00d600fc0028009500d200ba00db00d3004a00ea004500e2004f00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_0 = 0099007a003d00a900a5006b00b500e900010023006d00cd004200f6004f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_0 = 00c1006000ad00af00360052003f005600b30049001900ab000a008200b6006e
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_0 = 001000ef00a600f000e500b90068005200b500e40050004500d000960007004f
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_0 = 00bd00b40001005200de00ab00cf00530013006d00940063007800a800e20055
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_0 = 00ce004e003400fa0051008900d900390083008300f500800076001000a100cc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_1 = 0025002900820045001e008b0079003100b0008d006f005500db00fb00bd0085
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_1 = 00ce00a600230029006d009d00fe003b00d90003000f00bb001a001800fc0049
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_1 = 00bd008000e600f7000300f5001300ca001900d000a9002f00a70031006900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_1 = 00f2001e0075003700c30028004200f000ca0071003500cc007b00e2002a00b1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_1 = 00b1006400fb009700ab005c000700e1004500bd008d000e00d7001d00660086
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_1 = 00e2009300ed00b40050000b00d2002d006f00e9008400f5006300e000e100c8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_1 = 00be00400092009700c900b000eb00e100ed00d8006900f50097007500f20063
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_1 = 00270041008100a800f50075008500640051005e00b7005e007400ce005500fe
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_1 = 001f003d00cd000400e800d3004c00c900a100b100b1009c00b800c500ca00ff
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_1 = 0035007a003500460029005300b5003e00d400b300f500f50070008c004d0041
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_1 = 00ca005b005d00d7005f007b0003002c001800fc009800a50091007600050032
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_1 = 0083008d005100a5006d007b001c00d8001100a8005a007a00b8000300d60092
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_1 = 00d700b900dc00370085008800f3004500d3008b000500560044008b00b300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_1 = 00ae00c500f700c60071005000ea00c700bf004000df00e2008e000f005a003d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_1 = 00790074001c00b600a500f9001000c7005000550025006d00df00cd00720034
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_1 = 003c005c007d008200c000f800e900b800b500e700bd00be003a00740069002e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_1 = 00ee005c00090025001800b5007400f500cd0026005700780020005a00fe0006
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_1 = 00c600a5009600a10092007800b4001c007a00cf00c700e1002b00c800290089
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_1 = 0041003a0061001f00a30071006e002b002f004900f400c9004c00d9006f0098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_1 = 000d008300b3007d002e00a1006d002800e0003e00ec0000005e009d00550039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_1 = 000f009200d200e000b700ca00c000b600b40074009c0066007800c9007800c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_1 = 002f008600e400570089002400ff00c6008f009200c2003300c20001003d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_1 = 00df0038009700a80008004000b000c8008000f500c500e40077000e00e6006f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_1 = 00c6004500c300d00090005200d100a800e9008e006700e3003e00ac00620017
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_1 = 00a800af000f008d000a00b600360058008d0059003500770039004b008300d1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_1 = 0033008c002600e400e20032007000a200690006002600d100f9006f00fd00d1
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_1 = 00f200af0092005000ec008900d4001a004d00fd007900b300ff00b700190078
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_1 = 00f600450015005900b6009e007100a300c5002900d0002200bd006100f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_1 = 00c0001600e0001c0077000b00f800c300d300c7005100b200990024001300da
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_1 = 00e500ff00a30034007a00e800fd00f0006200ce0050007600ca006f007a00ee
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_1 = 006700670037008100f600fd005b0061004c008c003700e000f600330091002d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_1 = 005400130094006900e8000100e70065002000ad00440045007d000b00f0006a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_1 = 0036002d00dd00d5006d000800fc007200e00064005c000f00620093002a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_1 = 003b00eb000000df0043006c007400b10033009000ca00c40023005b006c0032
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_1 = 00250039004b001d004100e4003400af00cb006900ad00570058005300120047
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_1 = 005a00a800f200ca00af003f008a0092009c00ef0083001d0012000900f30092
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_1 = 00dd006c007a008500c6005f0039002600bc007100e10036004600a000fb0099
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_1 = 00090063005d006a00e0007f007300c800f3001400d80099000900d000bb00e4
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_1 = 0034002a00410098003a00f9003e006f000b00130094008600b9002e003300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_1 = 00f100c400fa00cd0099001800fd001e00a00084008d00db004000dd00ad00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_1 = 004100dd0057006e006800f4006200c7001e001100d2008c00b900c1008d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_1 = 00300050007c00de00d3004f006e008d002600db00c500fa00b300e900580047
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_1 = 00620058007f00ee00b000f0006e00d4001a00cf00dd003a004f00c600d90009
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_1 = 003b005600a30070008300e100e400c90048000600ee00ed0043009e00fa007e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_1 = 00d2005a006d00ee00d6002a00740099009a009600bd006900e800d700be0051
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_1 = 005e00ce00a600aa00d4002200cd003c001c00120064005c006a00cc004000d5
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_1 = 009300e30057004f00d600c200a1000500e8002a00ba00ae003c002100b80074
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_1 = 00b8008e00e4002800d50051000400db00c3004e00b300e0003c007600c7008f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_1 = 00a6006f00600033001800fb009800a40031005500a8000a00450007002f00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_1 = 00fc00c700f8004600b900ea001b007f00b7002300a0000400430010005b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_1 = 00dd0017007a00e000d90086003a007c00bc000500ea00d800a600a60068002e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_1 = 000300e40021008a00ff008d00f8000e00d8004100a8005f005c003300550048
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_1 = 00fb0040001b00a50045009f00ef002f008e006100b900df006c00f2006600ef
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_1 = 0012007b00da00fa00ec005500400042008600d7004e003a002600b200430016
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_1 = 0043007400260099000f0012002700d4000700c700d300a6001f0028002d007f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_1 = 000700db0085000b00dd006200b1004d004c001c00f7002a00670032001a0034
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_1 = 00a1000e00a9000000c6001b00c900fd00e100d800980092005d008b001d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_1 = 00ef001a00d600fc0028009500d200ba00db00d3004a00ea004500e2004f00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_1 = 0099007a003d00a900a5006b00b500e900010023006d00cd004200f6004f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_1 = 00c1006000ad00af00360052003f005600b30049001900ab000a008200b6006e
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_1 = 001000ef00a600f000e500b90068005200b500e40050004500d000960007004f
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_1 = 00bd00b40001005200de00ab00cf00530013006d00940063007800a800e20055
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_1 = 00ce004e003400fa0051008900d900390083008300f500800076001000a100cc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_2 = 0025002900820045001e008b0079003100b0008d006f005500db00fb00bd0085
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_2 = 00ce00a600230029006d009d00fe003b00d90003000f00bb001a001800fc0049
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_2 = 00bd008000e600f7000300f5001300ca001900d000a9002f00a70031006900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_2 = 00f2001e0075003700c30028004200f000ca0071003500cc007b00e2002a00b1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_2 = 00b1006400fb009700ab005c000700e1004500bd008d000e00d7001d00660086
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_2 = 00e2009300ed00b40050000b00d2002d006f00e9008400f5006300e000e100c8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_2 = 00be00400092009700c900b000eb00e100ed00d8006900f50097007500f20063
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_2 = 00270041008100a800f50075008500640051005e00b7005e007400ce005500fe
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_2 = 001f003d00cd000400e800d3004c00c900a100b100b1009c00b800c500ca00ff
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_2 = 0035007a003500460029005300b5003e00d400b300f500f50070008c004d0041
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_2 = 00ca005b005d00d7005f007b0003002c001800fc009800a50091007600050032
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_2 = 0083008d005100a5006d007b001c00d8001100a8005a007a00b8000300d60092
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_2 = 00d700b900dc00370085008800f3004500d3008b000500560044008b00b300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_2 = 00ae00c500f700c60071005000ea00c700bf004000df00e2008e000f005a003d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_2 = 00790074001c00b600a500f9001000c7005000550025006d00df00cd00720034
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_2 = 003c005c007d008200c000f800e900b800b500e700bd00be003a00740069002e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_2 = 00ee005c00090025001800b5007400f500cd0026005700780020005a00fe0006
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_2 = 00c600a5009600a10092007800b4001c007a00cf00c700e1002b00c800290089
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_2 = 0041003a0061001f00a30071006e002b002f004900f400c9004c00d9006f0098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_2 = 000d008300b3007d002e00a1006d002800e0003e00ec0000005e009d00550039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_2 = 000f009200d200e000b700ca00c000b600b40074009c0066007800c9007800c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_2 = 002f008600e400570089002400ff00c6008f009200c2003300c20001003d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_2 = 00df0038009700a80008004000b000c8008000f500c500e40077000e00e6006f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_2 = 00c6004500c300d00090005200d100a800e9008e006700e3003e00ac00620017
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_2 = 00a800af000f008d000a00b600360058008d0059003500770039004b008300d1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_2 = 0033008c002600e400e20032007000a200690006002600d100f9006f00fd00d1
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_2 = 00f200af0092005000ec008900d4001a004d00fd007900b300ff00b700190078
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_2 = 00f600450015005900b6009e007100a300c5002900d0002200bd006100f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_2 = 00c0001600e0001c0077000b00f800c300d300c7005100b200990024001300da
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_2 = 00e500ff00a30034007a00e800fd00f0006200ce0050007600ca006f007a00ee
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_2 = 006700670037008100f600fd005b0061004c008c003700e000f600330091002d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_2 = 005400130094006900e8000100e70065002000ad00440045007d000b00f0006a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_2 = 0036002d00dd00d5006d000800fc007200e00064005c000f00620093002a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_2 = 003b00eb000000df0043006c007400b10033009000ca00c40023005b006c0032
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_2 = 00250039004b001d004100e4003400af00cb006900ad00570058005300120047
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_2 = 005a00a800f200ca00af003f008a0092009c00ef0083001d0012000900f30092
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_2 = 00dd006c007a008500c6005f0039002600bc007100e10036004600a000fb0099
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_2 = 00090063005d006a00e0007f007300c800f3001400d80099000900d000bb00e4
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_2 = 0034002a00410098003a00f9003e006f000b00130094008600b9002e003300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_2 = 00f100c400fa00cd0099001800fd001e00a00084008d00db004000dd00ad00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_2 = 004100dd0057006e006800f4006200c7001e001100d2008c00b900c1008d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_2 = 00300050007c00de00d3004f006e008d002600db00c500fa00b300e900580047
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_2 = 00620058007f00ee00b000f0006e00d4001a00cf00dd003a004f00c600d90009
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_2 = 003b005600a30070008300e100e400c90048000600ee00ed0043009e00fa007e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_2 = 00d2005a006d00ee00d6002a00740099009a009600bd006900e800d700be0051
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_2 = 005e00ce00a600aa00d4002200cd003c001c00120064005c006a00cc004000d5
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_2 = 009300e30057004f00d600c200a1000500e8002a00ba00ae003c002100b80074
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_2 = 00b8008e00e4002800d50051000400db00c3004e00b300e0003c007600c7008f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_2 = 00a6006f00600033001800fb009800a40031005500a8000a00450007002f00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_2 = 00fc00c700f8004600b900ea001b007f00b7002300a0000400430010005b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_2 = 00dd0017007a00e000d90086003a007c00bc000500ea00d800a600a60068002e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_2 = 000300e40021008a00ff008d00f8000e00d8004100a8005f005c003300550048
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_2 = 00fb0040001b00a50045009f00ef002f008e006100b900df006c00f2006600ef
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_2 = 0012007b00da00fa00ec005500400042008600d7004e003a002600b200430016
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_2 = 0043007400260099000f0012002700d4000700c700d300a6001f0028002d007f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_2 = 000700db0085000b00dd006200b1004d004c001c00f7002a00670032001a0034
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_2 = 00a1000e00a9000000c6001b00c900fd00e100d800980092005d008b001d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_2 = 00ef001a00d600fc0028009500d200ba00db00d3004a00ea004500e2004f00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_2 = 0099007a003d00a900a5006b00b500e900010023006d00cd004200f6004f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_2 = 00c1006000ad00af00360052003f005600b30049001900ab000a008200b6006e
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_2 = 001000ef00a600f000e500b90068005200b500e40050004500d000960007004f
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_2 = 00bd00b40001005200de00ab00cf00530013006d00940063007800a800e20055
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_2 = 00ce004e003400fa0051008900d900390083008300f500800076001000a100cc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray16_3 = 0025002900820045001e008b0079003100b0008d006f005500db00fb00bd0085
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray16_3 = 00ce00a600230029006d009d00fe003b00d90003000f00bb001a001800fc0049
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray16_3 = 00bd008000e600f7000300f5001300ca001900d000a9002f00a70031006900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray16_3 = 00f2001e0075003700c30028004200f000ca0071003500cc007b00e2002a00b1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray16_3 = 00b1006400fb009700ab005c000700e1004500bd008d000e00d7001d00660086
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray16_3 = 00e2009300ed00b40050000b00d2002d006f00e9008400f5006300e000e100c8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray16_3 = 00be00400092009700c900b000eb00e100ed00d8006900f50097007500f20063
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray16_3 = 00270041008100a800f50075008500640051005e00b7005e007400ce005500fe
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray16_3 = 001f003d00cd000400e800d3004c00c900a100b100b1009c00b800c500ca00ff
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray16_3 = 0035007a003500460029005300b5003e00d400b300f500f50070008c004d0041
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray16_3 = 00ca005b005d00d7005f007b0003002c001800fc009800a50091007600050032
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray16_3 = 0083008d005100a5006d007b001c00d8001100a8005a007a00b8000300d60092
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray16_3 = 00d700b900dc00370085008800f3004500d3008b000500560044008b00b300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray16_3 = 00ae00c500f700c60071005000ea00c700bf004000df00e2008e000f005a003d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray16_3 = 00790074001c00b600a500f9001000c7005000550025006d00df00cd00720034
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray16_3 = 003c005c007d008200c000f800e900b800b500e700bd00be003a00740069002e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray16_3 = 00ee005c00090025001800b5007400f500cd0026005700780020005a00fe0006
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray16_3 = 00c600a5009600a10092007800b4001c007a00cf00c700e1002b00c800290089
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray16_3 = 0041003a0061001f00a30071006e002b002f004900f400c9004c00d9006f0098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray16_3 = 000d008300b3007d002e00a1006d002800e0003e00ec0000005e009d00550039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray16_3 = 000f009200d200e000b700ca00c000b600b40074009c0066007800c9007800c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray16_3 = 002f008600e400570089002400ff00c6008f009200c2003300c20001003d0042
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray16_3 = 00df0038009700a80008004000b000c8008000f500c500e40077000e00e6006f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray16_3 = 00c6004500c300d00090005200d100a800e9008e006700e3003e00ac00620017
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray16_3 = 00a800af000f008d000a00b600360058008d0059003500770039004b008300d1
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray16_3 = 0033008c002600e400e20032007000a200690006002600d100f9006f00fd00d1
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray16_3 = 00f200af0092005000ec008900d4001a004d00fd007900b300ff00b700190078
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray16_3 = 00f600450015005900b6009e007100a300c5002900d0002200bd006100f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray16_3 = 00c0001600e0001c0077000b00f800c300d300c7005100b200990024001300da
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray16_3 = 00e500ff00a30034007a00e800fd00f0006200ce0050007600ca006f007a00ee
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray16_3 = 006700670037008100f600fd005b0061004c008c003700e000f600330091002d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray16_3 = 005400130094006900e8000100e70065002000ad00440045007d000b00f0006a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray16_3 = 0036002d00dd00d5006d000800fc007200e00064005c000f00620093002a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray16_3 = 003b00eb000000df0043006c007400b10033009000ca00c40023005b006c0032
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray16_3 = 00250039004b001d004100e4003400af00cb006900ad00570058005300120047
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray16_3 = 005a00a800f200ca00af003f008a0092009c00ef0083001d0012000900f30092
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray16_3 = 00dd006c007a008500c6005f0039002600bc007100e10036004600a000fb0099
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray16_3 = 00090063005d006a00e0007f007300c800f3001400d80099000900d000bb00e4
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray16_3 = 0034002a00410098003a00f9003e006f000b00130094008600b9002e003300c8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray16_3 = 00f100c400fa00cd0099001800fd001e00a00084008d00db004000dd00ad00f3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray16_3 = 004100dd0057006e006800f4006200c7001e001100d2008c00b900c1008d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray16_3 = 00300050007c00de00d3004f006e008d002600db00c500fa00b300e900580047
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray16_3 = 00620058007f00ee00b000f0006e00d4001a00cf00dd003a004f00c600d90009
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray16_3 = 003b005600a30070008300e100e400c90048000600ee00ed0043009e00fa007e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray16_3 = 00d2005a006d00ee00d6002a00740099009a009600bd006900e800d700be0051
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray16_3 = 005e00ce00a600aa00d4002200cd003c001c00120064005c006a00cc004000d5
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray16_3 = 009300e30057004f00d600c200a1000500e8002a00ba00ae003c002100b80074
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray16_3 = 00b8008e00e4002800d50051000400db00c3004e00b300e0003c007600c7008f
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray16_3 = 00a6006f00600033001800fb009800a40031005500a8000a00450007002f00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray16_3 = 00fc00c700f8004600b900ea001b007f00b7002300a0000400430010005b00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray16_3 = 00dd0017007a00e000d90086003a007c00bc000500ea00d800a600a60068002e
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray16_3 = 000300e40021008a00ff008d00f8000e00d8004100a8005f005c003300550048
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray16_3 = 00fb0040001b00a50045009f00ef002f008e006100b900df006c00f2006600ef
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray16_3 = 0012007b00da00fa00ec005500400042008600d7004e003a002600b200430016
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray16_3 = 0043007400260099000f0012002700d4000700c700d300a6001f0028002d007f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray16_3 = 000700db0085000b00dd006200b1004d004c001c00f7002a00670032001a0034
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray16_3 = 00a1000e00a9000000c6001b00c900fd00e100d800980092005d008b001d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray16_3 = 00ef001a00d600fc0028009500d200ba00db00d3004a00ea004500e2004f00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray16_3 = 0099007a003d00a900a5006b00b500e900010023006d00cd004200f6004f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray16_3 = 00c1006000ad00af00360052003f005600b30049001900ab000a008200b6006e
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray16_3 = 001000ef00a600f000e500b90068005200b500e40050004500d000960007004f
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray16_3 = 00bd00b40001005200de00ab00cf00530013006d00940063007800a800e20055
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray16_3 = 00ce004e003400fa0051008900d900390083008300f500800076001000a100cc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_0 = 00cd001800e400ff00c900a100b0003300690079009b00a10012006c00e800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_0 = 003a00eb009200600030001d00500083006c0090002f00cc00770095001600f7
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_0 = 007b0040004e00c0003e002700980056009a00d90005002600040041005d0085
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_0 = 0070003d00ae002b003f00b400b0006e001d00e700a4004b00c300b700e60079
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_0 = 004300ec002300690040008000ca004100d90026008300a1006300d000f9008b
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_0 = 00690062003b00eb0088005500cf006c00fb009d008b0061009e00440095004a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_0 = 00ab00e000c90027008300d9004f004d0010003400b1006d00f500fc000800a5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_0 = 0077001400f500bd0041009200240058005a00fd004700c00031007d008f0034
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_0 = 005100f70001008a00ed001d00630099008300c600db00e60095002800b300f4
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_0 = 008d00d100a20089002300830049002e0097003000c1004200cc00e2001b0032
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_0 = 00dd004f002a00d2006f00af00f300150057004000bb008d00250027007d006f
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_0 = 003800bb007b0048000c00270054009d0045004e00d6004600350015006d00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_0 = 003500ac009e008f009500ce00d70031006f007c004900c400400023001d0027
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_0 = 00990060000100d400eb00a5008b00c700fc0095002000cc002700ae000d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_0 = 00b400fe000a007600e1006c00770022006b001d0099003c0089005b00780073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_0 = 00dd00bf00ee00ab005100fe003e00f800d500fa002300a100ad00b6005c0062
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_0 = 00aa002d003a004400c200b9009300bc00c400bb00a20082001e00ac00da0050
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_0 = 000600d5001e00b80027004900a40013002f00d000db004700d700d800ce0070
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_0 = 00310072008d008900cf00c800b10070008600000025007b0099008100700098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_0 = 001b00a300e000a4000a00f40072007a00b600fa003e00b40015003f00d70085
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_0 = 001c00cc003200d3007b009f00d600a4008b00ec004d006f004100e4005d00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_0 = 009f00790029007b000600db00da00a700570074009600480098007300c90065
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_0 = 00a100c900be006500de009b00e1004000ba000b0036001d001200a500e20016
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_0 = 00c600c900fa00f900bc00f10030004c00b8000300fb005100b500030019005c
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_0 = 00f9007700ae00ae003c00a60009002500a0008d00ef00cb00e00073007b005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_0 = 002300770096000700c600bd00d1001400a5001c00d200ed000f00fb004b0035
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_0 = 00e80033003e00ef004700fc00dd00e200fd00ac009100ae0062008c00810098
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_0 = 004e00ac00db00250047004f00ae00fd00930005001b008500fd009c008100c1
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_0 = 0077003700df004300e7003e00920082009900e300d5009500c100ef00e30072
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_0 = 000000a0008100f300220003009e005e00a400c800800040003900d000080039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_0 = 00890091004600fc0081003c001d0060000f00db005100f300e900820082009d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_0 = 00c8000e00bd008600fa009b0047007c004c005700a900e3006700f5004c001d
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_0 = 00ae007f00cb00c50058000b000200da003a00d10030009d00a300c1003c005b
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_0 = 0049005700260086001f00e70088006600b7002e002800b3001e007e00a3003f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_0 = 00270086005c0090009a00ed000d00a200a3004e00910032002e00c4000400da
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_0 = 00d900b70099009a00bd00db008b00fd0084004a002b00d8003600bc000a005b
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_0 = 0063007d006b00d200ce00e800c9008d00d800e500260044005a00ee00920044
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_0 = 0083003100d600a000c0006000350097009700a400a3006b009d003e000700a5
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_0 = 00c000f8005400fa008e000a001700d6007400ec00f6003b008600c100d400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_0 = 008700d50028006f00c400da00a70013007900670079007000b4001f00f9009b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_0 = 00ba00f7006a00c400a900d300db00ce008400cc00aa004e0032008b00cf00c9
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_0 = 00f500bc000400ca0036009a008c007a0057001f002900880091005200e9002d
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_0 = 009b0097008700ad00b600e200aa0041005a008a004400ea00fc002200ff0099
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_0 = 009d001300d7005a00080022008600a100ad00ef002e005700d2008f00f800fc
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_0 = 009b00fd004e008500c2006e00f00046005000f700f400f000060006009100b2
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_0 = 0033001700a6006c002d005f006200df008a002300f40026000900000094004a
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_0 = 00af00040087009d00e500780004000c00d900eb00e300b10031005f00a0002f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_0 = 003e0087007a004a00dc00540089004c004100d9000600ca0095001100c600f9
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_0 = 000d000500d00094009500fc00990069006a006900fd00ee004900460013003c
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_0 = 003f0096009c00bd005f002900ac009e00050024004800bd000c001c009600c4
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_0 = 003c009500eb002d003b0071003200d700db008d004600ed006c005d00f00009
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_0 = 00a3002200b500ad00a300ea002900b20015006b00ba0065001c0057002e0015
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_0 = 0051007f00fb003c0030001400a200dc003500e200d1001c00a600d3007800ff
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_0 = 003a009e00a2000300d100e10011007e006a00860089004700de00ca00a500bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_0 = 000400a500c600b2008400d3008800bd001900ed00ab0022008d0085001900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_0 = 008e00ff00d8006c004d00f500a800b000dc006700f000fd005d003d008c0020
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_0 = 0015005400a5006b0057000300c1002e006100f6002b004f00ce006e00ef00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_0 = 002300b5002f00c3005500c300af00c1006f0008002e00ed0069000200370000
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_0 = 00c600cb007d00120055008b004100c000c80022002d005b008e0025001500fb
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_0 = 00cd00a70037006600eb00b800c40017003b00bc004b001b000c000300520004
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_0 = 00030003007100c1004600ab0008001f00e40013004400b700a8009900360068
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_0 = 009900ec00c10042004700f900c90003005a00da005c00fd0070002900b90087
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_0 = 00cc0063008200ef007200140016006300d8008100a90022008d001c0069000b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_1 = 00cd001800e400ff00c900a100b0003300690079009b00a10012006c00e800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_1 = 003a00eb009200600030001d00500083006c0090002f00cc00770095001600f7
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_1 = 007b0040004e00c0003e002700980056009a00d90005002600040041005d0085
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_1 = 0070003d00ae002b003f00b400b0006e001d00e700a4004b00c300b700e60079
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_1 = 004300ec002300690040008000ca004100d90026008300a1006300d000f9008b
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_1 = 00690062003b00eb0088005500cf006c00fb009d008b0061009e00440095004a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_1 = 00ab00e000c90027008300d9004f004d0010003400b1006d00f500fc000800a5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_1 = 0077001400f500bd0041009200240058005a00fd004700c00031007d008f0034
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_1 = 005100f70001008a00ed001d00630099008300c600db00e60095002800b300f4
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_1 = 008d00d100a20089002300830049002e0097003000c1004200cc00e2001b0032
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_1 = 00dd004f002a00d2006f00af00f300150057004000bb008d00250027007d006f
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_1 = 003800bb007b0048000c00270054009d0045004e00d6004600350015006d00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_1 = 003500ac009e008f009500ce00d70031006f007c004900c400400023001d0027
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_1 = 00990060000100d400eb00a5008b00c700fc0095002000cc002700ae000d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_1 = 00b400fe000a007600e1006c00770022006b001d0099003c0089005b00780073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_1 = 00dd00bf00ee00ab005100fe003e00f800d500fa002300a100ad00b6005c0062
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_1 = 00aa002d003a004400c200b9009300bc00c400bb00a20082001e00ac00da0050
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_1 = 000600d5001e00b80027004900a40013002f00d000db004700d700d800ce0070
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_1 = 00310072008d008900cf00c800b10070008600000025007b0099008100700098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_1 = 001b00a300e000a4000a00f40072007a00b600fa003e00b40015003f00d70085
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_1 = 001c00cc003200d3007b009f00d600a4008b00ec004d006f004100e4005d00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_1 = 009f00790029007b000600db00da00a700570074009600480098007300c90065
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_1 = 00a100c900be006500de009b00e1004000ba000b0036001d001200a500e20016
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_1 = 00c600c900fa00f900bc00f10030004c00b8000300fb005100b500030019005c
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_1 = 00f9007700ae00ae003c00a60009002500a0008d00ef00cb00e00073007b005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_1 = 002300770096000700c600bd00d1001400a5001c00d200ed000f00fb004b0035
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_1 = 00e80033003e00ef004700fc00dd00e200fd00ac009100ae0062008c00810098
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_1 = 004e00ac00db00250047004f00ae00fd00930005001b008500fd009c008100c1
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_1 = 0077003700df004300e7003e00920082009900e300d5009500c100ef00e30072
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_1 = 000000a0008100f300220003009e005e00a400c800800040003900d000080039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_1 = 00890091004600fc0081003c001d0060000f00db005100f300e900820082009d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_1 = 00c8000e00bd008600fa009b0047007c004c005700a900e3006700f5004c001d
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_1 = 00ae007f00cb00c50058000b000200da003a00d10030009d00a300c1003c005b
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_1 = 0049005700260086001f00e70088006600b7002e002800b3001e007e00a3003f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_1 = 00270086005c0090009a00ed000d00a200a3004e00910032002e00c4000400da
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_1 = 00d900b70099009a00bd00db008b00fd0084004a002b00d8003600bc000a005b
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_1 = 0063007d006b00d200ce00e800c9008d00d800e500260044005a00ee00920044
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_1 = 0083003100d600a000c0006000350097009700a400a3006b009d003e000700a5
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_1 = 00c000f8005400fa008e000a001700d6007400ec00f6003b008600c100d400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_1 = 008700d50028006f00c400da00a70013007900670079007000b4001f00f9009b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_1 = 00ba00f7006a00c400a900d300db00ce008400cc00aa004e0032008b00cf00c9
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_1 = 00f500bc000400ca0036009a008c007a0057001f002900880091005200e9002d
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_1 = 009b0097008700ad00b600e200aa0041005a008a004400ea00fc002200ff0099
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_1 = 009d001300d7005a00080022008600a100ad00ef002e005700d2008f00f800fc
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_1 = 009b00fd004e008500c2006e00f00046005000f700f400f000060006009100b2
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_1 = 0033001700a6006c002d005f006200df008a002300f40026000900000094004a
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_1 = 00af00040087009d00e500780004000c00d900eb00e300b10031005f00a0002f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_1 = 003e0087007a004a00dc00540089004c004100d9000600ca0095001100c600f9
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_1 = 000d000500d00094009500fc00990069006a006900fd00ee004900460013003c
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_1 = 003f0096009c00bd005f002900ac009e00050024004800bd000c001c009600c4
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_1 = 003c009500eb002d003b0071003200d700db008d004600ed006c005d00f00009
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_1 = 00a3002200b500ad00a300ea002900b20015006b00ba0065001c0057002e0015
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_1 = 0051007f00fb003c0030001400a200dc003500e200d1001c00a600d3007800ff
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_1 = 003a009e00a2000300d100e10011007e006a00860089004700de00ca00a500bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_1 = 000400a500c600b2008400d3008800bd001900ed00ab0022008d0085001900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_1 = 008e00ff00d8006c004d00f500a800b000dc006700f000fd005d003d008c0020
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_1 = 0015005400a5006b0057000300c1002e006100f6002b004f00ce006e00ef00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_1 = 002300b5002f00c3005500c300af00c1006f0008002e00ed0069000200370000
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_1 = 00c600cb007d00120055008b004100c000c80022002d005b008e0025001500fb
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_1 = 00cd00a70037006600eb00b800c40017003b00bc004b001b000c000300520004
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_1 = 00030003007100c1004600ab0008001f00e40013004400b700a8009900360068
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_1 = 009900ec00c10042004700f900c90003005a00da005c00fd0070002900b90087
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_1 = 00cc0063008200ef007200140016006300d8008100a90022008d001c0069000b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_2 = 00cd001800e400ff00c900a100b0003300690079009b00a10012006c00e800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_2 = 003a00eb009200600030001d00500083006c0090002f00cc00770095001600f7
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_2 = 007b0040004e00c0003e002700980056009a00d90005002600040041005d0085
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_2 = 0070003d00ae002b003f00b400b0006e001d00e700a4004b00c300b700e60079
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_2 = 004300ec002300690040008000ca004100d90026008300a1006300d000f9008b
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_2 = 00690062003b00eb0088005500cf006c00fb009d008b0061009e00440095004a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_2 = 00ab00e000c90027008300d9004f004d0010003400b1006d00f500fc000800a5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_2 = 0077001400f500bd0041009200240058005a00fd004700c00031007d008f0034
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_2 = 005100f70001008a00ed001d00630099008300c600db00e60095002800b300f4
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_2 = 008d00d100a20089002300830049002e0097003000c1004200cc00e2001b0032
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_2 = 00dd004f002a00d2006f00af00f300150057004000bb008d00250027007d006f
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_2 = 003800bb007b0048000c00270054009d0045004e00d6004600350015006d00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_2 = 003500ac009e008f009500ce00d70031006f007c004900c400400023001d0027
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_2 = 00990060000100d400eb00a5008b00c700fc0095002000cc002700ae000d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_2 = 00b400fe000a007600e1006c00770022006b001d0099003c0089005b00780073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_2 = 00dd00bf00ee00ab005100fe003e00f800d500fa002300a100ad00b6005c0062
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_2 = 00aa002d003a004400c200b9009300bc00c400bb00a20082001e00ac00da0050
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_2 = 000600d5001e00b80027004900a40013002f00d000db004700d700d800ce0070
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_2 = 00310072008d008900cf00c800b10070008600000025007b0099008100700098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_2 = 001b00a300e000a4000a00f40072007a00b600fa003e00b40015003f00d70085
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_2 = 001c00cc003200d3007b009f00d600a4008b00ec004d006f004100e4005d00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_2 = 009f00790029007b000600db00da00a700570074009600480098007300c90065
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_2 = 00a100c900be006500de009b00e1004000ba000b0036001d001200a500e20016
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_2 = 00c600c900fa00f900bc00f10030004c00b8000300fb005100b500030019005c
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_2 = 00f9007700ae00ae003c00a60009002500a0008d00ef00cb00e00073007b005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_2 = 002300770096000700c600bd00d1001400a5001c00d200ed000f00fb004b0035
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_2 = 00e80033003e00ef004700fc00dd00e200fd00ac009100ae0062008c00810098
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_2 = 004e00ac00db00250047004f00ae00fd00930005001b008500fd009c008100c1
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_2 = 0077003700df004300e7003e00920082009900e300d5009500c100ef00e30072
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_2 = 000000a0008100f300220003009e005e00a400c800800040003900d000080039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_2 = 00890091004600fc0081003c001d0060000f00db005100f300e900820082009d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_2 = 00c8000e00bd008600fa009b0047007c004c005700a900e3006700f5004c001d
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_2 = 00ae007f00cb00c50058000b000200da003a00d10030009d00a300c1003c005b
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_2 = 0049005700260086001f00e70088006600b7002e002800b3001e007e00a3003f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_2 = 00270086005c0090009a00ed000d00a200a3004e00910032002e00c4000400da
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_2 = 00d900b70099009a00bd00db008b00fd0084004a002b00d8003600bc000a005b
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_2 = 0063007d006b00d200ce00e800c9008d00d800e500260044005a00ee00920044
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_2 = 0083003100d600a000c0006000350097009700a400a3006b009d003e000700a5
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_2 = 00c000f8005400fa008e000a001700d6007400ec00f6003b008600c100d400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_2 = 008700d50028006f00c400da00a70013007900670079007000b4001f00f9009b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_2 = 00ba00f7006a00c400a900d300db00ce008400cc00aa004e0032008b00cf00c9
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_2 = 00f500bc000400ca0036009a008c007a0057001f002900880091005200e9002d
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_2 = 009b0097008700ad00b600e200aa0041005a008a004400ea00fc002200ff0099
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_2 = 009d001300d7005a00080022008600a100ad00ef002e005700d2008f00f800fc
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_2 = 009b00fd004e008500c2006e00f00046005000f700f400f000060006009100b2
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_2 = 0033001700a6006c002d005f006200df008a002300f40026000900000094004a
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_2 = 00af00040087009d00e500780004000c00d900eb00e300b10031005f00a0002f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_2 = 003e0087007a004a00dc00540089004c004100d9000600ca0095001100c600f9
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_2 = 000d000500d00094009500fc00990069006a006900fd00ee004900460013003c
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_2 = 003f0096009c00bd005f002900ac009e00050024004800bd000c001c009600c4
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_2 = 003c009500eb002d003b0071003200d700db008d004600ed006c005d00f00009
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_2 = 00a3002200b500ad00a300ea002900b20015006b00ba0065001c0057002e0015
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_2 = 0051007f00fb003c0030001400a200dc003500e200d1001c00a600d3007800ff
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_2 = 003a009e00a2000300d100e10011007e006a00860089004700de00ca00a500bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_2 = 000400a500c600b2008400d3008800bd001900ed00ab0022008d0085001900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_2 = 008e00ff00d8006c004d00f500a800b000dc006700f000fd005d003d008c0020
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_2 = 0015005400a5006b0057000300c1002e006100f6002b004f00ce006e00ef00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_2 = 002300b5002f00c3005500c300af00c1006f0008002e00ed0069000200370000
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_2 = 00c600cb007d00120055008b004100c000c80022002d005b008e0025001500fb
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_2 = 00cd00a70037006600eb00b800c40017003b00bc004b001b000c000300520004
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_2 = 00030003007100c1004600ab0008001f00e40013004400b700a8009900360068
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_2 = 009900ec00c10042004700f900c90003005a00da005c00fd0070002900b90087
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_2 = 00cc0063008200ef007200140016006300d8008100a90022008d001c0069000b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EGray256_3 = 00cd001800e400ff00c900a100b0003300690079009b00a10012006c00e800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EGray256_3 = 003a00eb009200600030001d00500083006c0090002f00cc00770095001600f7
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EGray256_3 = 007b0040004e00c0003e002700980056009a00d90005002600040041005d0085
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EGray256_3 = 0070003d00ae002b003f00b400b0006e001d00e700a4004b00c300b700e60079
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EGray256_3 = 004300ec002300690040008000ca004100d90026008300a1006300d000f9008b
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EGray256_3 = 00690062003b00eb0088005500cf006c00fb009d008b0061009e00440095004a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EGray256_3 = 00ab00e000c90027008300d9004f004d0010003400b1006d00f500fc000800a5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EGray256_3 = 0077001400f500bd0041009200240058005a00fd004700c00031007d008f0034
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EGray256_3 = 005100f70001008a00ed001d00630099008300c600db00e60095002800b300f4
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EGray256_3 = 008d00d100a20089002300830049002e0097003000c1004200cc00e2001b0032
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EGray256_3 = 00dd004f002a00d2006f00af00f300150057004000bb008d00250027007d006f
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EGray256_3 = 003800bb007b0048000c00270054009d0045004e00d6004600350015006d00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EGray256_3 = 003500ac009e008f009500ce00d70031006f007c004900c400400023001d0027
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EGray256_3 = 00990060000100d400eb00a5008b00c700fc0095002000cc002700ae000d00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EGray256_3 = 00b400fe000a007600e1006c00770022006b001d0099003c0089005b00780073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EGray256_3 = 00dd00bf00ee00ab005100fe003e00f800d500fa002300a100ad00b6005c0062
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EGray256_3 = 00aa002d003a004400c200b9009300bc00c400bb00a20082001e00ac00da0050
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EGray256_3 = 000600d5001e00b80027004900a40013002f00d000db004700d700d800ce0070
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EGray256_3 = 00310072008d008900cf00c800b10070008600000025007b0099008100700098
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EGray256_3 = 001b00a300e000a4000a00f40072007a00b600fa003e00b40015003f00d70085
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EGray256_3 = 001c00cc003200d3007b009f00d600a4008b00ec004d006f004100e4005d00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EGray256_3 = 009f00790029007b000600db00da00a700570074009600480098007300c90065
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EGray256_3 = 00a100c900be006500de009b00e1004000ba000b0036001d001200a500e20016
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EGray256_3 = 00c600c900fa00f900bc00f10030004c00b8000300fb005100b500030019005c
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EGray256_3 = 00f9007700ae00ae003c00a60009002500a0008d00ef00cb00e00073007b005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EGray256_3 = 002300770096000700c600bd00d1001400a5001c00d200ed000f00fb004b0035
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EGray256_3 = 00e80033003e00ef004700fc00dd00e200fd00ac009100ae0062008c00810098
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EGray256_3 = 004e00ac00db00250047004f00ae00fd00930005001b008500fd009c008100c1
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EGray256_3 = 0077003700df004300e7003e00920082009900e300d5009500c100ef00e30072
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EGray256_3 = 000000a0008100f300220003009e005e00a400c800800040003900d000080039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EGray256_3 = 00890091004600fc0081003c001d0060000f00db005100f300e900820082009d
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EGray256_3 = 00c8000e00bd008600fa009b0047007c004c005700a900e3006700f5004c001d
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EGray256_3 = 00ae007f00cb00c50058000b000200da003a00d10030009d00a300c1003c005b
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EGray256_3 = 0049005700260086001f00e70088006600b7002e002800b3001e007e00a3003f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EGray256_3 = 00270086005c0090009a00ed000d00a200a3004e00910032002e00c4000400da
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EGray256_3 = 00d900b70099009a00bd00db008b00fd0084004a002b00d8003600bc000a005b
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EGray256_3 = 0063007d006b00d200ce00e800c9008d00d800e500260044005a00ee00920044
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EGray256_3 = 0083003100d600a000c0006000350097009700a400a3006b009d003e000700a5
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EGray256_3 = 00c000f8005400fa008e000a001700d6007400ec00f6003b008600c100d400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EGray256_3 = 008700d50028006f00c400da00a70013007900670079007000b4001f00f9009b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EGray256_3 = 00ba00f7006a00c400a900d300db00ce008400cc00aa004e0032008b00cf00c9
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EGray256_3 = 00f500bc000400ca0036009a008c007a0057001f002900880091005200e9002d
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EGray256_3 = 009b0097008700ad00b600e200aa0041005a008a004400ea00fc002200ff0099
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EGray256_3 = 009d001300d7005a00080022008600a100ad00ef002e005700d2008f00f800fc
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EGray256_3 = 009b00fd004e008500c2006e00f00046005000f700f400f000060006009100b2
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EGray256_3 = 0033001700a6006c002d005f006200df008a002300f40026000900000094004a
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EGray256_3 = 00af00040087009d00e500780004000c00d900eb00e300b10031005f00a0002f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EGray256_3 = 003e0087007a004a00dc00540089004c004100d9000600ca0095001100c600f9
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EGray256_3 = 000d000500d00094009500fc00990069006a006900fd00ee004900460013003c
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EGray256_3 = 003f0096009c00bd005f002900ac009e00050024004800bd000c001c009600c4
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EGray256_3 = 003c009500eb002d003b0071003200d700db008d004600ed006c005d00f00009
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EGray256_3 = 00a3002200b500ad00a300ea002900b20015006b00ba0065001c0057002e0015
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EGray256_3 = 0051007f00fb003c0030001400a200dc003500e200d1001c00a600d3007800ff
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EGray256_3 = 003a009e00a2000300d100e10011007e006a00860089004700de00ca00a500bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EGray256_3 = 000400a500c600b2008400d3008800bd001900ed00ab0022008d0085001900fa
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EGray256_3 = 008e00ff00d8006c004d00f500a800b000dc006700f000fd005d003d008c0020
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EGray256_3 = 0015005400a5006b0057000300c1002e006100f6002b004f00ce006e00ef00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EGray256_3 = 002300b5002f00c3005500c300af00c1006f0008002e00ed0069000200370000
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EGray256_3 = 00c600cb007d00120055008b004100c000c80022002d005b008e0025001500fb
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EGray256_3 = 00cd00a70037006600eb00b800c40017003b00bc004b001b000c000300520004
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EGray256_3 = 00030003007100c1004600ab0008001f00e40013004400b700a8009900360068
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EGray256_3 = 009900ec00c10042004700f900c90003005a00da005c00fd0070002900b90087
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EGray256_3 = 00cc0063008200ef007200140016006300d8008100a90022008d001c0069000b
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_0 = 0044006b0014004500e000de000700330097003400be0034005300ea003b006d
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_0 = 004a004200f500bb002f008600ab005f009c008d005900bc00120063000100ed
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_0 = 00f2003000b700f800d4009a00ee008200e5007e00bf008d00f5007e004000a5
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_0 = 001a0018008c00c400b500c7006100f1005600fc00cc00ae00510055001d00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_0 = 009700cf00c1004700610084008d000100b3004c00c10089005f00f200240059
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_0 = 005c00840012002c00830059004b008c004f001d00be00f10069000900640017
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_0 = 001400230074005c009b00c500c0002f00ed00fd00d100ed00bb00e000ca0090
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_0 = 004700db003e0080009e003c00b500750061001d00a900a5005b0074007700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_0 = 00a4004000db005d0038009400c400eb00ee005000d4004a00ce008d00b90039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_0 = 002000da002600f6000d00af00f7009f0019003000c900b300bb008300490066
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_0 = 007f0061006600460099004900be002700c2000500c300cb009600d9008a00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_0 = 00f3004000e3002c003e007a006b002c0068001f00ca0040007a00f1000d003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_0 = 008d00400025009100dd006a00cd0050005a003e00180093005c0099008b00e0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_0 = 0013006e00f6001100d2002a0098006e00fb00730039002d008d006c00fb00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_0 = 0085007d009200de001b0044009a00f800b4000a008f00700043006600870033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_0 = 00ca008b00530011002e0035001900950050009e00ab001d001200b600800014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_0 = 00ee0053000600c500a9009b009b002800e3007a00bc00e70025006300da00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_0 = 0062002a00a7006b00bd00e400f400f500af007000fd006c001d00bd00300068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_0 = 00aa009d0090002d00aa001800da0095002200bf007f007d00f600a70083007d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_0 = 002f00c0009000aa00980063001100c5009f00ec0071009600da00cc00fd006d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_0 = 009400f10009003b00a700cd007c0029000000bc00a000600025000f009200af
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_0 = 00eb0078006900df001e00f7001400e8003d00dc00c400a400c10091008400b7
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_0 = 00b7009a00b900fc0047000600e70000000200cc00e9003b004b00c100db0058
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_0 = 00c6001f004c00a200f4007900e800de00d200d2008f007c0008005000b10012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_0 = 000800f500f0006f0041006c002300e4001d000c000000e300870047001400ae
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_0 = 00ec009100a600b900570020009000f800610097007d001f00650016006e005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_0 = 00f7002e0056007100b200fe000200ef00a3004b004d00b20025000d006800c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_0 = 00ad00cc0024000d00ac00ce00c100de00b3005700370054003600ba004b001e
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_0 = 00ed00090086004200fd004f00e50056009200f700ad0081001100c80022007c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_0 = 00ac004b00cc00eb006d004e006f0085002e002d0060007b001600790014007d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_0 = 007d00da00d6007d0007005300db008000fd00ce004700ab00300030003f008b
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_0 = 009f00a3001800a500180064004500ed00f30016008200bc001c009400b500c7
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_0 = 005200ab002a00ba00d9004800e300530098006a00c7004f000900f600390013
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_0 = 004a0056004200dc003d00be0032005100d5002c00a200f0005800aa005500ae
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_0 = 0070004700ef00de00db005800da0072004a00cb003f005e00ee00ca00600086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_0 = 00ec006f00df003e00ae009100a10004002600c1008d006f006f007e002a009a
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_0 = 00a80033006a0069004b009900440015007a001e005600c100fc007100d900fd
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_0 = 00f60052004700f7004900ea00e2007f007500370045004e003d001f001c001c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_0 = 00a600bb00f100bf00f3003700dc003300bd0092006a00e300da00e6000300d6
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_0 = 007b003c000b001e003f006b00c800a8003b00c8000800380076001d007b00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_0 = 00b90015009a0032004f0065000800bd001f008c001a00a200a500bf0067002d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_0 = 00ab007100e3000100f8002c0033007d002f0013002400b1008100d0002700c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_0 = 000100a0006400f0004b007f00b8002b008f00180064002700be00e300e100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_0 = 00230067003700130050006900d000a500d100a20092007100750034009300b6
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_0 = 0084004600e500a900d300780073007e006d005e00a200ac004e003400c7001f
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_0 = 00a1004f00be004e00e100bc00ef0013006b00d30053002e00a3001d00a4008c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_0 = 00ff00820016001200df008100be00e500e70089000000a3000400c500a5001d
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_0 = 0095007c00420080003c00f8002e007100f90002002900130070005400e500e0
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_0 = 009a0038006c0044009900a6005a009400b300aa0053004d00b0005d00ba0058
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_0 = 00d8009700d1004d0001008200620048002b00a900cd000a0061004f008000ea
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_0 = 0094005500fe00a60020007900a200b900b200780081002d005200fa00410034
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_0 = 0016001100ca00d900850066000000ea005400aa00cf00e100050011006e00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_0 = 00ae00330063006e00e900a1003300f100fa005000c90011004e00450039001b
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_0 = 00fa00c600cc003d008100960021001a002200bc005b00c70039008e0013003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_0 = 007b000c00e0002d007e00d70059000400fe0086004c003a003e00e800b4003c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_0 = 00d700fd00840088008800f8002a000400f300230000002200c0003800c1001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_0 = 00840088005b00d5002c0059003a0013008200460089008c00b0007b008f0077
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_0 = 00e000a700e300e800c3001200ab0085004800eb003d00cb001e00e80001008f
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_0 = 007b00860096005000fe00170021000400a400b400a600f100f6005a000400c8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_0 = 00aa00ed000f006f00270096007d000300f3002000db001e0014009700d90051
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_0 = 00120011008e007700fa00bd00cc007e00740046002300e4008c003300a9006b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_0 = 00d0000e004300bf00e00070007300a000730031000d0017008b004a00f900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_0 = 00010063000a00be0075006f009600e8002b00b8004a00e500b500bd00ea00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_1 = 0044006b0014004500e000de000700330097003400be0034005300ea003b006d
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_1 = 004a004200f500bb002f008600ab005f009c008d005900bc00120063000100ed
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_1 = 00f2003000b700f800d4009a00ee008200e5007e00bf008d00f5007e004000a5
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_1 = 001a0018008c00c400b500c7006100f1005600fc00cc00ae00510055001d00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_1 = 009700cf00c1004700610084008d000100b3004c00c10089005f00f200240059
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_1 = 005c00840012002c00830059004b008c004f001d00be00f10069000900640017
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_1 = 001400230074005c009b00c500c0002f00ed00fd00d100ed00bb00e000ca0090
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_1 = 004700db003e0080009e003c00b500750061001d00a900a5005b0074007700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_1 = 00a4004000db005d0038009400c400eb00ee005000d4004a00ce008d00b90039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_1 = 002000da002600f6000d00af00f7009f0019003000c900b300bb008300490066
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_1 = 007f0061006600460099004900be002700c2000500c300cb009600d9008a00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_1 = 00f3004000e3002c003e007a006b002c0068001f00ca0040007a00f1000d003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_1 = 008d00400025009100dd006a00cd0050005a003e00180093005c0099008b00e0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_1 = 0013006e00f6001100d2002a0098006e00fb00730039002d008d006c00fb00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_1 = 0085007d009200de001b0044009a00f800b4000a008f00700043006600870033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_1 = 00ca008b00530011002e0035001900950050009e00ab001d001200b600800014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_1 = 00ee0053000600c500a9009b009b002800e3007a00bc00e70025006300da00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_1 = 0062002a00a7006b00bd00e400f400f500af007000fd006c001d00bd00300068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_1 = 00aa009d0090002d00aa001800da0095002200bf007f007d00f600a70083007d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_1 = 002f00c0009000aa00980063001100c5009f00ec0071009600da00cc00fd006d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_1 = 009400f10009003b00a700cd007c0029000000bc00a000600025000f009200af
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_1 = 00eb0078006900df001e00f7001400e8003d00dc00c400a400c10091008400b7
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_1 = 00b7009a00b900fc0047000600e70000000200cc00e9003b004b00c100db0058
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_1 = 00c6001f004c00a200f4007900e800de00d200d2008f007c0008005000b10012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_1 = 000800f500f0006f0041006c002300e4001d000c000000e300870047001400ae
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_1 = 00ec009100a600b900570020009000f800610097007d001f00650016006e005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_1 = 00f7002e0056007100b200fe000200ef00a3004b004d00b20025000d006800c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_1 = 00ad00cc0024000d00ac00ce00c100de00b3005700370054003600ba004b001e
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_1 = 00ed00090086004200fd004f00e50056009200f700ad0081001100c80022007c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_1 = 00ac004b00cc00eb006d004e006f0085002e002d0060007b001600790014007d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_1 = 007d00da00d6007d0007005300db008000fd00ce004700ab00300030003f008b
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_1 = 009f00a3001800a500180064004500ed00f30016008200bc001c009400b500c7
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_1 = 005200ab002a00ba00d9004800e300530098006a00c7004f000900f600390013
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_1 = 004a0056004200dc003d00be0032005100d5002c00a200f0005800aa005500ae
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_1 = 0070004700ef00de00db005800da0072004a00cb003f005e00ee00ca00600086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_1 = 00ec006f00df003e00ae009100a10004002600c1008d006f006f007e002a009a
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_1 = 00a80033006a0069004b009900440015007a001e005600c100fc007100d900fd
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_1 = 00f60052004700f7004900ea00e2007f007500370045004e003d001f001c001c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_1 = 00a600bb00f100bf00f3003700dc003300bd0092006a00e300da00e6000300d6
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_1 = 007b003c000b001e003f006b00c800a8003b00c8000800380076001d007b00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_1 = 00b90015009a0032004f0065000800bd001f008c001a00a200a500bf0067002d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_1 = 00ab007100e3000100f8002c0033007d002f0013002400b1008100d0002700c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_1 = 000100a0006400f0004b007f00b8002b008f00180064002700be00e300e100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_1 = 00230067003700130050006900d000a500d100a20092007100750034009300b6
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_1 = 0084004600e500a900d300780073007e006d005e00a200ac004e003400c7001f
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_1 = 00a1004f00be004e00e100bc00ef0013006b00d30053002e00a3001d00a4008c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_1 = 00ff00820016001200df008100be00e500e70089000000a3000400c500a5001d
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_1 = 0095007c00420080003c00f8002e007100f90002002900130070005400e500e0
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_1 = 009a0038006c0044009900a6005a009400b300aa0053004d00b0005d00ba0058
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_1 = 00d8009700d1004d0001008200620048002b00a900cd000a0061004f008000ea
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_1 = 0094005500fe00a60020007900a200b900b200780081002d005200fa00410034
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_1 = 0016001100ca00d900850066000000ea005400aa00cf00e100050011006e00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_1 = 00ae00330063006e00e900a1003300f100fa005000c90011004e00450039001b
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_1 = 00fa00c600cc003d008100960021001a002200bc005b00c70039008e0013003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_1 = 007b000c00e0002d007e00d70059000400fe0086004c003a003e00e800b4003c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_1 = 00d700fd00840088008800f8002a000400f300230000002200c0003800c1001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_1 = 00840088005b00d5002c0059003a0013008200460089008c00b0007b008f0077
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_1 = 00e000a700e300e800c3001200ab0085004800eb003d00cb001e00e80001008f
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_1 = 007b00860096005000fe00170021000400a400b400a600f100f6005a000400c8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_1 = 00aa00ed000f006f00270096007d000300f3002000db001e0014009700d90051
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_1 = 00120011008e007700fa00bd00cc007e00740046002300e4008c003300a9006b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_1 = 00d0000e004300bf00e00070007300a000730031000d0017008b004a00f900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_1 = 00010063000a00be0075006f009600e8002b00b8004a00e500b500bd00ea00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_2 = 0044006b0014004500e000de000700330097003400be0034005300ea003b006d
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_2 = 004a004200f500bb002f008600ab005f009c008d005900bc00120063000100ed
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_2 = 00f2003000b700f800d4009a00ee008200e5007e00bf008d00f5007e004000a5
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_2 = 001a0018008c00c400b500c7006100f1005600fc00cc00ae00510055001d00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_2 = 009700cf00c1004700610084008d000100b3004c00c10089005f00f200240059
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_2 = 005c00840012002c00830059004b008c004f001d00be00f10069000900640017
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_2 = 001400230074005c009b00c500c0002f00ed00fd00d100ed00bb00e000ca0090
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_2 = 004700db003e0080009e003c00b500750061001d00a900a5005b0074007700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_2 = 00a4004000db005d0038009400c400eb00ee005000d4004a00ce008d00b90039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_2 = 002000da002600f6000d00af00f7009f0019003000c900b300bb008300490066
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_2 = 007f0061006600460099004900be002700c2000500c300cb009600d9008a00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_2 = 00f3004000e3002c003e007a006b002c0068001f00ca0040007a00f1000d003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_2 = 008d00400025009100dd006a00cd0050005a003e00180093005c0099008b00e0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_2 = 0013006e00f6001100d2002a0098006e00fb00730039002d008d006c00fb00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_2 = 0085007d009200de001b0044009a00f800b4000a008f00700043006600870033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_2 = 00ca008b00530011002e0035001900950050009e00ab001d001200b600800014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_2 = 00ee0053000600c500a9009b009b002800e3007a00bc00e70025006300da00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_2 = 0062002a00a7006b00bd00e400f400f500af007000fd006c001d00bd00300068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_2 = 00aa009d0090002d00aa001800da0095002200bf007f007d00f600a70083007d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_2 = 002f00c0009000aa00980063001100c5009f00ec0071009600da00cc00fd006d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_2 = 009400f10009003b00a700cd007c0029000000bc00a000600025000f009200af
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_2 = 00eb0078006900df001e00f7001400e8003d00dc00c400a400c10091008400b7
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_2 = 00b7009a00b900fc0047000600e70000000200cc00e9003b004b00c100db0058
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_2 = 00c6001f004c00a200f4007900e800de00d200d2008f007c0008005000b10012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_2 = 000800f500f0006f0041006c002300e4001d000c000000e300870047001400ae
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_2 = 00ec009100a600b900570020009000f800610097007d001f00650016006e005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_2 = 00f7002e0056007100b200fe000200ef00a3004b004d00b20025000d006800c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_2 = 00ad00cc0024000d00ac00ce00c100de00b3005700370054003600ba004b001e
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_2 = 00ed00090086004200fd004f00e50056009200f700ad0081001100c80022007c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_2 = 00ac004b00cc00eb006d004e006f0085002e002d0060007b001600790014007d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_2 = 007d00da00d6007d0007005300db008000fd00ce004700ab00300030003f008b
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_2 = 009f00a3001800a500180064004500ed00f30016008200bc001c009400b500c7
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_2 = 005200ab002a00ba00d9004800e300530098006a00c7004f000900f600390013
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_2 = 004a0056004200dc003d00be0032005100d5002c00a200f0005800aa005500ae
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_2 = 0070004700ef00de00db005800da0072004a00cb003f005e00ee00ca00600086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_2 = 00ec006f00df003e00ae009100a10004002600c1008d006f006f007e002a009a
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_2 = 00a80033006a0069004b009900440015007a001e005600c100fc007100d900fd
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_2 = 00f60052004700f7004900ea00e2007f007500370045004e003d001f001c001c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_2 = 00a600bb00f100bf00f3003700dc003300bd0092006a00e300da00e6000300d6
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_2 = 007b003c000b001e003f006b00c800a8003b00c8000800380076001d007b00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_2 = 00b90015009a0032004f0065000800bd001f008c001a00a200a500bf0067002d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_2 = 00ab007100e3000100f8002c0033007d002f0013002400b1008100d0002700c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_2 = 000100a0006400f0004b007f00b8002b008f00180064002700be00e300e100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_2 = 00230067003700130050006900d000a500d100a20092007100750034009300b6
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_2 = 0084004600e500a900d300780073007e006d005e00a200ac004e003400c7001f
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_2 = 00a1004f00be004e00e100bc00ef0013006b00d30053002e00a3001d00a4008c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_2 = 00ff00820016001200df008100be00e500e70089000000a3000400c500a5001d
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_2 = 0095007c00420080003c00f8002e007100f90002002900130070005400e500e0
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_2 = 009a0038006c0044009900a6005a009400b300aa0053004d00b0005d00ba0058
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_2 = 00d8009700d1004d0001008200620048002b00a900cd000a0061004f008000ea
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_2 = 0094005500fe00a60020007900a200b900b200780081002d005200fa00410034
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_2 = 0016001100ca00d900850066000000ea005400aa00cf00e100050011006e00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_2 = 00ae00330063006e00e900a1003300f100fa005000c90011004e00450039001b
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_2 = 00fa00c600cc003d008100960021001a002200bc005b00c70039008e0013003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_2 = 007b000c00e0002d007e00d70059000400fe0086004c003a003e00e800b4003c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_2 = 00d700fd00840088008800f8002a000400f300230000002200c0003800c1001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_2 = 00840088005b00d5002c0059003a0013008200460089008c00b0007b008f0077
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_2 = 00e000a700e300e800c3001200ab0085004800eb003d00cb001e00e80001008f
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_2 = 007b00860096005000fe00170021000400a400b400a600f100f6005a000400c8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_2 = 00aa00ed000f006f00270096007d000300f3002000db001e0014009700d90051
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_2 = 00120011008e007700fa00bd00cc007e00740046002300e4008c003300a9006b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_2 = 00d0000e004300bf00e00070007300a000730031000d0017008b004a00f900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_2 = 00010063000a00be0075006f009600e8002b00b8004a00e500b500bd00ea00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16_3 = 0044006b0014004500e000de000700330097003400be0034005300ea003b006d
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16_3 = 004a004200f500bb002f008600ab005f009c008d005900bc00120063000100ed
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16_3 = 00f2003000b700f800d4009a00ee008200e5007e00bf008d00f5007e004000a5
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16_3 = 001a0018008c00c400b500c7006100f1005600fc00cc00ae00510055001d00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16_3 = 009700cf00c1004700610084008d000100b3004c00c10089005f00f200240059
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16_3 = 005c00840012002c00830059004b008c004f001d00be00f10069000900640017
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16_3 = 001400230074005c009b00c500c0002f00ed00fd00d100ed00bb00e000ca0090
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16_3 = 004700db003e0080009e003c00b500750061001d00a900a5005b0074007700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16_3 = 00a4004000db005d0038009400c400eb00ee005000d4004a00ce008d00b90039
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16_3 = 002000da002600f6000d00af00f7009f0019003000c900b300bb008300490066
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16_3 = 007f0061006600460099004900be002700c2000500c300cb009600d9008a00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16_3 = 00f3004000e3002c003e007a006b002c0068001f00ca0040007a00f1000d003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16_3 = 008d00400025009100dd006a00cd0050005a003e00180093005c0099008b00e0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16_3 = 0013006e00f6001100d2002a0098006e00fb00730039002d008d006c00fb00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16_3 = 0085007d009200de001b0044009a00f800b4000a008f00700043006600870033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16_3 = 00ca008b00530011002e0035001900950050009e00ab001d001200b600800014
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16_3 = 00ee0053000600c500a9009b009b002800e3007a00bc00e70025006300da00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16_3 = 0062002a00a7006b00bd00e400f400f500af007000fd006c001d00bd00300068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16_3 = 00aa009d0090002d00aa001800da0095002200bf007f007d00f600a70083007d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16_3 = 002f00c0009000aa00980063001100c5009f00ec0071009600da00cc00fd006d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16_3 = 009400f10009003b00a700cd007c0029000000bc00a000600025000f009200af
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16_3 = 00eb0078006900df001e00f7001400e8003d00dc00c400a400c10091008400b7
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16_3 = 00b7009a00b900fc0047000600e70000000200cc00e9003b004b00c100db0058
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16_3 = 00c6001f004c00a200f4007900e800de00d200d2008f007c0008005000b10012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16_3 = 000800f500f0006f0041006c002300e4001d000c000000e300870047001400ae
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16_3 = 00ec009100a600b900570020009000f800610097007d001f00650016006e005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16_3 = 00f7002e0056007100b200fe000200ef00a3004b004d00b20025000d006800c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16_3 = 00ad00cc0024000d00ac00ce00c100de00b3005700370054003600ba004b001e
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16_3 = 00ed00090086004200fd004f00e50056009200f700ad0081001100c80022007c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16_3 = 00ac004b00cc00eb006d004e006f0085002e002d0060007b001600790014007d
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16_3 = 007d00da00d6007d0007005300db008000fd00ce004700ab00300030003f008b
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16_3 = 009f00a3001800a500180064004500ed00f30016008200bc001c009400b500c7
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16_3 = 005200ab002a00ba00d9004800e300530098006a00c7004f000900f600390013
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16_3 = 004a0056004200dc003d00be0032005100d5002c00a200f0005800aa005500ae
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16_3 = 0070004700ef00de00db005800da0072004a00cb003f005e00ee00ca00600086
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16_3 = 00ec006f00df003e00ae009100a10004002600c1008d006f006f007e002a009a
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16_3 = 00a80033006a0069004b009900440015007a001e005600c100fc007100d900fd
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16_3 = 00f60052004700f7004900ea00e2007f007500370045004e003d001f001c001c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16_3 = 00a600bb00f100bf00f3003700dc003300bd0092006a00e300da00e6000300d6
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16_3 = 007b003c000b001e003f006b00c800a8003b00c8000800380076001d007b00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16_3 = 00b90015009a0032004f0065000800bd001f008c001a00a200a500bf0067002d
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16_3 = 00ab007100e3000100f8002c0033007d002f0013002400b1008100d0002700c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16_3 = 000100a0006400f0004b007f00b8002b008f00180064002700be00e300e100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16_3 = 00230067003700130050006900d000a500d100a20092007100750034009300b6
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16_3 = 0084004600e500a900d300780073007e006d005e00a200ac004e003400c7001f
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16_3 = 00a1004f00be004e00e100bc00ef0013006b00d30053002e00a3001d00a4008c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16_3 = 00ff00820016001200df008100be00e500e70089000000a3000400c500a5001d
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16_3 = 0095007c00420080003c00f8002e007100f90002002900130070005400e500e0
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16_3 = 009a0038006c0044009900a6005a009400b300aa0053004d00b0005d00ba0058
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16_3 = 00d8009700d1004d0001008200620048002b00a900cd000a0061004f008000ea
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16_3 = 0094005500fe00a60020007900a200b900b200780081002d005200fa00410034
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16_3 = 0016001100ca00d900850066000000ea005400aa00cf00e100050011006e00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16_3 = 00ae00330063006e00e900a1003300f100fa005000c90011004e00450039001b
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16_3 = 00fa00c600cc003d008100960021001a002200bc005b00c70039008e0013003e
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16_3 = 007b000c00e0002d007e00d70059000400fe0086004c003a003e00e800b4003c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16_3 = 00d700fd00840088008800f8002a000400f300230000002200c0003800c1001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16_3 = 00840088005b00d5002c0059003a0013008200460089008c00b0007b008f0077
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16_3 = 00e000a700e300e800c3001200ab0085004800eb003d00cb001e00e80001008f
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16_3 = 007b00860096005000fe00170021000400a400b400a600f100f6005a000400c8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16_3 = 00aa00ed000f006f00270096007d000300f3002000db001e0014009700d90051
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16_3 = 00120011008e007700fa00bd00cc007e00740046002300e4008c003300a9006b
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16_3 = 00d0000e004300bf00e00070007300a000730031000d0017008b004a00f900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16_3 = 00010063000a00be0075006f009600e8002b00b8004a00e500b500bd00ea00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_0 = 006400a30025003c00ff00c3009000880097005f006b00fc002e00ae00a300f3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_0 = 0040005800de001b00130090006c002800da00ba00a2006b00f7003500d40020
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_0 = 006d00d10099003000f6005d004b00da0052001200b300fc008200f7001600bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_0 = 000c00fb002f005800e300de0069009100290097002f00b10031008b008700d4
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_0 = 00cb005200ff0082003a002e0014007d00eb000300a20061009300d5008800de
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_0 = 00b600bf0047000f001b005f0091001f00cd0080008000b1007c004800cd0002
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_0 = 00fb00d500b5009100eb00f9002600d60080000800630017008000de00950098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_0 = 0084006800570070002e0035006f00ec00c300d40011007000c6000300b50021
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_0 = 0089004600e000df004a00d2007b00c9000d004d009000f6001a0049001100a9
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_0 = 00f9004700e3005b006e00ec00110043005d008d00b10099005b009c007400a8
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_0 = 00990060001d00df00fe00c50077007d005a0092006b002100da00d100670092
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_0 = 005d006a006e0023007700e800d400f500a7003900cf005d0040009500cd005d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_0 = 0012001f001d009000530023005400e80093008f0037006f00a2004000f200c0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_0 = 0081003e0024006e003700d2001c007e00d70089008100ad008d002000a20098
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_0 = 008d009b00500034004700e50090006200ae00b7009a000000d4001e007d00f9
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_0 = 008e005600d900d4003d00bd00da00890076008500630040004000f500b5002d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_0 = 00180094003d0017002c0085002700dd0081006e0003009b002500e50065007f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_0 = 00b000c600de0095007a00120093005f00d9003f00aa0011001d009c00a200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_0 = 0057000a006a002a00b400260041004000ab00ea00e6000e009300a800f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_0 = 00770053004f00b100850024008100e200b200af00c7000800e8000000cb0038
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_0 = 00f100ca007800a8009a009e009200f200cd00ed00ba00da009a00e000fc00c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_0 = 00f000bd0063004f008800b7007a00a000e700e300c500ba003a004f00730041
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_0 = 004d009800390073001e00e400ec009a005400a4008800ea004100a80031003f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_0 = 00fd00ac004c00e70057000c00c6005400c50024005e003900e900cb00d100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_0 = 001f00dc00be002b005500c70044006c001600e80056009900a9009c0088002c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_0 = 00e1007d00cc0087008e007300f200180005008700a600800088001000de0036
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_0 = 00e6000c00bd008d00ce002500e800e00027009d002b00bc001a008c004d00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_0 = 007f000a00ba0003007500a90044008a009600dc00df000d002700cf004800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_0 = 006a000400eb00b8008e006300d800e50047002c009b00b2005800a3000900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_0 = 009d002900ab000300cb009b002f00e60078001900e200f4001b003300af0016
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_0 = 00e8007f00cf00ff0034005600ff00e4002e00e400f1006b00810059009a0039
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_0 = 008900d9003e002300a5001c003500de0045009d00ec00b20011005d001e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_0 = 0000005e00830022008400f9003100510017001500aa007b00600079008700b7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_0 = 009900db008800ce00e90035003b00b4008500f600a000210019003600fc00db
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_0 = 000c000f00b7008500c7003f00bc00c00001003a00fd0088009200b200be0000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_0 = 008400260098001300d000f40031001c003900bf00ad008e00df007600a00033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_0 = 00c3002600ee0043001300a300eb0011006300eb004e002f00ae00fc0032000d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_0 = 006f00bc003300f20025001b00fd0070005d00de004d004100cc004f001b008e
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_0 = 00f200a300820020000700ff00b900fd00dc00bf003200ba00e10034003900de
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_0 = 004a004e00450007000e00e100c900200008007e006b0025002e00df000400e2
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_0 = 0035000b00dc008b00f90061008600c40054007600fd00cc00ec00cb0058002f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_0 = 00c200eb00230057002d004f007900b0007300fb005a002500e2008800fb0049
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_0 = 003800e4003b006200df00d600cd0074009d00d500e7001a0068009400f80047
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_0 = 00ca002c002100ed004a0092008600cb009000c8003100f4003e004f005d0003
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_0 = 009300ca007f001300bf009700e6006d00e100d7000d0088004f00a200a90083
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_0 = 00c4008100b700d4007500e7002500b500df0075006a00380063003e00840078
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_0 = 00a4006800590097003a00a600cf002900ed00cc00a500bc00e4003b005a0087
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_0 = 0073009000fc006d003100a5003d00de00c9005e003600e500a200e6009c0010
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_0 = 00340034002a00de0068008d00d4008a00e8009b00e6008300510087006a007d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_0 = 0032003c00d200fa00b20092005400ce00b4004f0025006b0007005c00f300af
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_0 = 00f8006b001b005b00c500800064004c009d0019005000bd007400800040000b
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_0 = 008f004b008500480032000e0051004e00f000ac000e00d200e6006c00ea0037
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_0 = 005f00560035000500a700a40011002000be00c6000b00e6005a007f00be0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_0 = 00d100f0008f00b100fe006b00ae00e200c300d5007c001900e8002d006b00eb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_0 = 000100f900a4008b0053006200d800b800c8002500620097009e00f100c300e2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_0 = 00a4009e00a1004700f600a000b700b900cd00d400130083003d00870058005b
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_0 = 003300d70044007b00b4004a00ed006b00e000c20042009e00600033005e00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_0 = 005a007c00bc008600d500df00ba000200c500860043004f00000063006e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_0 = 00af00f700290085009700d7006b00c0000800d200ef00d800aa004300680094
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_0 = 0030002c00aa003b007e007800a1001300af00b20067007e00f1002900d60035
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_0 = 00d90077007a002f008e001800e4002800d700a600ff00be00bd00c2001f007c
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_0 = 00a400d60077008800ef0021006c008c002d00eb00c9006f00000024007d002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_0 = 0073001800a4003d002300aa00680060009600f900b3002600b8005600940035
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_1 = 006400a30025003c00ff00c3009000880097005f006b00fc002e00ae00a300f3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_1 = 0040005800de001b00130090006c002800da00ba00a2006b00f7003500d40020
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_1 = 006d00d10099003000f6005d004b00da0052001200b300fc008200f7001600bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_1 = 000c00fb002f005800e300de0069009100290097002f00b10031008b008700d4
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_1 = 00cb005200ff0082003a002e0014007d00eb000300a20061009300d5008800de
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_1 = 00b600bf0047000f001b005f0091001f00cd0080008000b1007c004800cd0002
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_1 = 00fb00d500b5009100eb00f9002600d60080000800630017008000de00950098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_1 = 0084006800570070002e0035006f00ec00c300d40011007000c6000300b50021
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_1 = 0089004600e000df004a00d2007b00c9000d004d009000f6001a0049001100a9
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_1 = 00f9004700e3005b006e00ec00110043005d008d00b10099005b009c007400a8
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_1 = 00990060001d00df00fe00c50077007d005a0092006b002100da00d100670092
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_1 = 005d006a006e0023007700e800d400f500a7003900cf005d0040009500cd005d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_1 = 0012001f001d009000530023005400e80093008f0037006f00a2004000f200c0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_1 = 0081003e0024006e003700d2001c007e00d70089008100ad008d002000a20098
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_1 = 008d009b00500034004700e50090006200ae00b7009a000000d4001e007d00f9
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_1 = 008e005600d900d4003d00bd00da00890076008500630040004000f500b5002d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_1 = 00180094003d0017002c0085002700dd0081006e0003009b002500e50065007f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_1 = 00b000c600de0095007a00120093005f00d9003f00aa0011001d009c00a200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_1 = 0057000a006a002a00b400260041004000ab00ea00e6000e009300a800f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_1 = 00770053004f00b100850024008100e200b200af00c7000800e8000000cb0038
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_1 = 00f100ca007800a8009a009e009200f200cd00ed00ba00da009a00e000fc00c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_1 = 00f000bd0063004f008800b7007a00a000e700e300c500ba003a004f00730041
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_1 = 004d009800390073001e00e400ec009a005400a4008800ea004100a80031003f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_1 = 00fd00ac004c00e70057000c00c6005400c50024005e003900e900cb00d100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_1 = 001f00dc00be002b005500c70044006c001600e80056009900a9009c0088002c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_1 = 00e1007d00cc0087008e007300f200180005008700a600800088001000de0036
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_1 = 00e6000c00bd008d00ce002500e800e00027009d002b00bc001a008c004d00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_1 = 007f000a00ba0003007500a90044008a009600dc00df000d002700cf004800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_1 = 006a000400eb00b8008e006300d800e50047002c009b00b2005800a3000900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_1 = 009d002900ab000300cb009b002f00e60078001900e200f4001b003300af0016
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_1 = 00e8007f00cf00ff0034005600ff00e4002e00e400f1006b00810059009a0039
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_1 = 008900d9003e002300a5001c003500de0045009d00ec00b20011005d001e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_1 = 0000005e00830022008400f9003100510017001500aa007b00600079008700b7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_1 = 009900db008800ce00e90035003b00b4008500f600a000210019003600fc00db
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_1 = 000c000f00b7008500c7003f00bc00c00001003a00fd0088009200b200be0000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_1 = 008400260098001300d000f40031001c003900bf00ad008e00df007600a00033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_1 = 00c3002600ee0043001300a300eb0011006300eb004e002f00ae00fc0032000d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_1 = 006f00bc003300f20025001b00fd0070005d00de004d004100cc004f001b008e
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_1 = 00f200a300820020000700ff00b900fd00dc00bf003200ba00e10034003900de
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_1 = 004a004e00450007000e00e100c900200008007e006b0025002e00df000400e2
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_1 = 0035000b00dc008b00f90061008600c40054007600fd00cc00ec00cb0058002f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_1 = 00c200eb00230057002d004f007900b0007300fb005a002500e2008800fb0049
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_1 = 003800e4003b006200df00d600cd0074009d00d500e7001a0068009400f80047
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_1 = 00ca002c002100ed004a0092008600cb009000c8003100f4003e004f005d0003
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_1 = 009300ca007f001300bf009700e6006d00e100d7000d0088004f00a200a90083
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_1 = 00c4008100b700d4007500e7002500b500df0075006a00380063003e00840078
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_1 = 00a4006800590097003a00a600cf002900ed00cc00a500bc00e4003b005a0087
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_1 = 0073009000fc006d003100a5003d00de00c9005e003600e500a200e6009c0010
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_1 = 00340034002a00de0068008d00d4008a00e8009b00e6008300510087006a007d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_1 = 0032003c00d200fa00b20092005400ce00b4004f0025006b0007005c00f300af
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_1 = 00f8006b001b005b00c500800064004c009d0019005000bd007400800040000b
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_1 = 008f004b008500480032000e0051004e00f000ac000e00d200e6006c00ea0037
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_1 = 005f00560035000500a700a40011002000be00c6000b00e6005a007f00be0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_1 = 00d100f0008f00b100fe006b00ae00e200c300d5007c001900e8002d006b00eb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_1 = 000100f900a4008b0053006200d800b800c8002500620097009e00f100c300e2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_1 = 00a4009e00a1004700f600a000b700b900cd00d400130083003d00870058005b
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_1 = 003300d70044007b00b4004a00ed006b00e000c20042009e00600033005e00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_1 = 005a007c00bc008600d500df00ba000200c500860043004f00000063006e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_1 = 00af00f700290085009700d7006b00c0000800d200ef00d800aa004300680094
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_1 = 0030002c00aa003b007e007800a1001300af00b20067007e00f1002900d60035
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_1 = 00d90077007a002f008e001800e4002800d700a600ff00be00bd00c2001f007c
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_1 = 00a400d60077008800ef0021006c008c002d00eb00c9006f00000024007d002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_1 = 0073001800a4003d002300aa00680060009600f900b3002600b8005600940035
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_2 = 006400a30025003c00ff00c3009000880097005f006b00fc002e00ae00a300f3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_2 = 0040005800de001b00130090006c002800da00ba00a2006b00f7003500d40020
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_2 = 006d00d10099003000f6005d004b00da0052001200b300fc008200f7001600bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_2 = 000c00fb002f005800e300de0069009100290097002f00b10031008b008700d4
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_2 = 00cb005200ff0082003a002e0014007d00eb000300a20061009300d5008800de
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_2 = 00b600bf0047000f001b005f0091001f00cd0080008000b1007c004800cd0002
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_2 = 00fb00d500b5009100eb00f9002600d60080000800630017008000de00950098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_2 = 0084006800570070002e0035006f00ec00c300d40011007000c6000300b50021
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_2 = 0089004600e000df004a00d2007b00c9000d004d009000f6001a0049001100a9
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_2 = 00f9004700e3005b006e00ec00110043005d008d00b10099005b009c007400a8
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_2 = 00990060001d00df00fe00c50077007d005a0092006b002100da00d100670092
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_2 = 005d006a006e0023007700e800d400f500a7003900cf005d0040009500cd005d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_2 = 0012001f001d009000530023005400e80093008f0037006f00a2004000f200c0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_2 = 0081003e0024006e003700d2001c007e00d70089008100ad008d002000a20098
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_2 = 008d009b00500034004700e50090006200ae00b7009a000000d4001e007d00f9
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_2 = 008e005600d900d4003d00bd00da00890076008500630040004000f500b5002d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_2 = 00180094003d0017002c0085002700dd0081006e0003009b002500e50065007f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_2 = 00b000c600de0095007a00120093005f00d9003f00aa0011001d009c00a200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_2 = 0057000a006a002a00b400260041004000ab00ea00e6000e009300a800f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_2 = 00770053004f00b100850024008100e200b200af00c7000800e8000000cb0038
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_2 = 00f100ca007800a8009a009e009200f200cd00ed00ba00da009a00e000fc00c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_2 = 00f000bd0063004f008800b7007a00a000e700e300c500ba003a004f00730041
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_2 = 004d009800390073001e00e400ec009a005400a4008800ea004100a80031003f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_2 = 00fd00ac004c00e70057000c00c6005400c50024005e003900e900cb00d100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_2 = 001f00dc00be002b005500c70044006c001600e80056009900a9009c0088002c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_2 = 00e1007d00cc0087008e007300f200180005008700a600800088001000de0036
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_2 = 00e6000c00bd008d00ce002500e800e00027009d002b00bc001a008c004d00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_2 = 007f000a00ba0003007500a90044008a009600dc00df000d002700cf004800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_2 = 006a000400eb00b8008e006300d800e50047002c009b00b2005800a3000900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_2 = 009d002900ab000300cb009b002f00e60078001900e200f4001b003300af0016
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_2 = 00e8007f00cf00ff0034005600ff00e4002e00e400f1006b00810059009a0039
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_2 = 008900d9003e002300a5001c003500de0045009d00ec00b20011005d001e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_2 = 0000005e00830022008400f9003100510017001500aa007b00600079008700b7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_2 = 009900db008800ce00e90035003b00b4008500f600a000210019003600fc00db
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_2 = 000c000f00b7008500c7003f00bc00c00001003a00fd0088009200b200be0000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_2 = 008400260098001300d000f40031001c003900bf00ad008e00df007600a00033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_2 = 00c3002600ee0043001300a300eb0011006300eb004e002f00ae00fc0032000d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_2 = 006f00bc003300f20025001b00fd0070005d00de004d004100cc004f001b008e
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_2 = 00f200a300820020000700ff00b900fd00dc00bf003200ba00e10034003900de
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_2 = 004a004e00450007000e00e100c900200008007e006b0025002e00df000400e2
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_2 = 0035000b00dc008b00f90061008600c40054007600fd00cc00ec00cb0058002f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_2 = 00c200eb00230057002d004f007900b0007300fb005a002500e2008800fb0049
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_2 = 003800e4003b006200df00d600cd0074009d00d500e7001a0068009400f80047
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_2 = 00ca002c002100ed004a0092008600cb009000c8003100f4003e004f005d0003
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_2 = 009300ca007f001300bf009700e6006d00e100d7000d0088004f00a200a90083
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_2 = 00c4008100b700d4007500e7002500b500df0075006a00380063003e00840078
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_2 = 00a4006800590097003a00a600cf002900ed00cc00a500bc00e4003b005a0087
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_2 = 0073009000fc006d003100a5003d00de00c9005e003600e500a200e6009c0010
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_2 = 00340034002a00de0068008d00d4008a00e8009b00e6008300510087006a007d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_2 = 0032003c00d200fa00b20092005400ce00b4004f0025006b0007005c00f300af
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_2 = 00f8006b001b005b00c500800064004c009d0019005000bd007400800040000b
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_2 = 008f004b008500480032000e0051004e00f000ac000e00d200e6006c00ea0037
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_2 = 005f00560035000500a700a40011002000be00c6000b00e6005a007f00be0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_2 = 00d100f0008f00b100fe006b00ae00e200c300d5007c001900e8002d006b00eb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_2 = 000100f900a4008b0053006200d800b800c8002500620097009e00f100c300e2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_2 = 00a4009e00a1004700f600a000b700b900cd00d400130083003d00870058005b
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_2 = 003300d70044007b00b4004a00ed006b00e000c20042009e00600033005e00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_2 = 005a007c00bc008600d500df00ba000200c500860043004f00000063006e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_2 = 00af00f700290085009700d7006b00c0000800d200ef00d800aa004300680094
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_2 = 0030002c00aa003b007e007800a1001300af00b20067007e00f1002900d60035
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_2 = 00d90077007a002f008e001800e4002800d700a600ff00be00bd00c2001f007c
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_2 = 00a400d60077008800ef0021006c008c002d00eb00c9006f00000024007d002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_2 = 0073001800a4003d002300aa00680060009600f900b3002600b8005600940035
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor256_3 = 006400a30025003c00ff00c3009000880097005f006b00fc002e00ae00a300f3
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor256_3 = 0040005800de001b00130090006c002800da00ba00a2006b00f7003500d40020
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor256_3 = 006d00d10099003000f6005d004b00da0052001200b300fc008200f7001600bd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor256_3 = 000c00fb002f005800e300de0069009100290097002f00b10031008b008700d4
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor256_3 = 00cb005200ff0082003a002e0014007d00eb000300a20061009300d5008800de
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor256_3 = 00b600bf0047000f001b005f0091001f00cd0080008000b1007c004800cd0002
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor256_3 = 00fb00d500b5009100eb00f9002600d60080000800630017008000de00950098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor256_3 = 0084006800570070002e0035006f00ec00c300d40011007000c6000300b50021
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor256_3 = 0089004600e000df004a00d2007b00c9000d004d009000f6001a0049001100a9
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor256_3 = 00f9004700e3005b006e00ec00110043005d008d00b10099005b009c007400a8
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor256_3 = 00990060001d00df00fe00c50077007d005a0092006b002100da00d100670092
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor256_3 = 005d006a006e0023007700e800d400f500a7003900cf005d0040009500cd005d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor256_3 = 0012001f001d009000530023005400e80093008f0037006f00a2004000f200c0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor256_3 = 0081003e0024006e003700d2001c007e00d70089008100ad008d002000a20098
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor256_3 = 008d009b00500034004700e50090006200ae00b7009a000000d4001e007d00f9
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor256_3 = 008e005600d900d4003d00bd00da00890076008500630040004000f500b5002d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor256_3 = 00180094003d0017002c0085002700dd0081006e0003009b002500e50065007f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor256_3 = 00b000c600de0095007a00120093005f00d9003f00aa0011001d009c00a200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor256_3 = 0057000a006a002a00b400260041004000ab00ea00e6000e009300a800f500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor256_3 = 00770053004f00b100850024008100e200b200af00c7000800e8000000cb0038
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor256_3 = 00f100ca007800a8009a009e009200f200cd00ed00ba00da009a00e000fc00c7
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor256_3 = 00f000bd0063004f008800b7007a00a000e700e300c500ba003a004f00730041
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor256_3 = 004d009800390073001e00e400ec009a005400a4008800ea004100a80031003f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor256_3 = 00fd00ac004c00e70057000c00c6005400c50024005e003900e900cb00d100b4
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor256_3 = 001f00dc00be002b005500c70044006c001600e80056009900a9009c0088002c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor256_3 = 00e1007d00cc0087008e007300f200180005008700a600800088001000de0036
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor256_3 = 00e6000c00bd008d00ce002500e800e00027009d002b00bc001a008c004d00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor256_3 = 007f000a00ba0003007500a90044008a009600dc00df000d002700cf004800d3
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor256_3 = 006a000400eb00b8008e006300d800e50047002c009b00b2005800a3000900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor256_3 = 009d002900ab000300cb009b002f00e60078001900e200f4001b003300af0016
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor256_3 = 00e8007f00cf00ff0034005600ff00e4002e00e400f1006b00810059009a0039
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor256_3 = 008900d9003e002300a5001c003500de0045009d00ec00b20011005d001e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor256_3 = 0000005e00830022008400f9003100510017001500aa007b00600079008700b7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor256_3 = 009900db008800ce00e90035003b00b4008500f600a000210019003600fc00db
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor256_3 = 000c000f00b7008500c7003f00bc00c00001003a00fd0088009200b200be0000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor256_3 = 008400260098001300d000f40031001c003900bf00ad008e00df007600a00033
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor256_3 = 00c3002600ee0043001300a300eb0011006300eb004e002f00ae00fc0032000d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor256_3 = 006f00bc003300f20025001b00fd0070005d00de004d004100cc004f001b008e
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor256_3 = 00f200a300820020000700ff00b900fd00dc00bf003200ba00e10034003900de
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor256_3 = 004a004e00450007000e00e100c900200008007e006b0025002e00df000400e2
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor256_3 = 0035000b00dc008b00f90061008600c40054007600fd00cc00ec00cb0058002f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor256_3 = 00c200eb00230057002d004f007900b0007300fb005a002500e2008800fb0049
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor256_3 = 003800e4003b006200df00d600cd0074009d00d500e7001a0068009400f80047
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor256_3 = 00ca002c002100ed004a0092008600cb009000c8003100f4003e004f005d0003
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor256_3 = 009300ca007f001300bf009700e6006d00e100d7000d0088004f00a200a90083
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor256_3 = 00c4008100b700d4007500e7002500b500df0075006a00380063003e00840078
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor256_3 = 00a4006800590097003a00a600cf002900ed00cc00a500bc00e4003b005a0087
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor256_3 = 0073009000fc006d003100a5003d00de00c9005e003600e500a200e6009c0010
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor256_3 = 00340034002a00de0068008d00d4008a00e8009b00e6008300510087006a007d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor256_3 = 0032003c00d200fa00b20092005400ce00b4004f0025006b0007005c00f300af
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor256_3 = 00f8006b001b005b00c500800064004c009d0019005000bd007400800040000b
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor256_3 = 008f004b008500480032000e0051004e00f000ac000e00d200e6006c00ea0037
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor256_3 = 005f00560035000500a700a40011002000be00c6000b00e6005a007f00be0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor256_3 = 00d100f0008f00b100fe006b00ae00e200c300d5007c001900e8002d006b00eb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor256_3 = 000100f900a4008b0053006200d800b800c8002500620097009e00f100c300e2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor256_3 = 00a4009e00a1004700f600a000b700b900cd00d400130083003d00870058005b
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor256_3 = 003300d70044007b00b4004a00ed006b00e000c20042009e00600033005e00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor256_3 = 005a007c00bc008600d500df00ba000200c500860043004f00000063006e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor256_3 = 00af00f700290085009700d7006b00c0000800d200ef00d800aa004300680094
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor256_3 = 0030002c00aa003b007e007800a1001300af00b20067007e00f1002900d60035
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor256_3 = 00d90077007a002f008e001800e4002800d700a600ff00be00bd00c2001f007c
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor256_3 = 00a400d60077008800ef0021006c008c002d00eb00c9006f00000024007d002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor256_3 = 0073001800a4003d002300aa00680060009600f900b3002600b8005600940035
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_0 = 002400ad00370092008300b8005b005c00a500690090004b001100a800e200d2
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_0 = 00f700f7005300030010003d004300bd005400d3000c00e4003a003c002a0088
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_0 = 002100d900540053009700ed00710051000c00f4004f005f0050002000a20075
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_0 = 00cb00b900a3004a00e1008600a600c500a4009300ed008d00f5003b00e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_0 = 0056004e00c90069007100f500d5002e00260065009d008f00d300d4005200ed
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_0 = 005300de00d700150097009600dc0074004b00e000b200f300120036006f0000
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_0 = 0008006a007400d5002300f200ca003e0045009b006b00e800d5007f00b10016
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_0 = 0003003700c3000300ff006700ea00e400cf00880000004b0022001900730038
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_0 = 007600c5004e00e9006d000a007000fd004f004600e8007c0074006a00690038
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_0 = 0062006d004c004300ce000600ca00d8000500e200ab005c0076004d006900a5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_0 = 002a005a002000aa00350007007c00ef001b006b00070076006c002900c4004e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_0 = 00b5004e004800fd00af003f00dc0093003a009b00b700a800a900f400b900bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_0 = 007300f000b0004a00f50022004d00e80099006c00b100730007002600d400df
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_0 = 0075007a001900d4000d007e0028003a00370032001e003000f2005b00f500b7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_0 = 00fa0029009f00e6006400a9003700ef005500bf00f600060096004200ec00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_0 = 0021003900d8008000be00ca0094003b0023007e001700c300c700fb006d000c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_0 = 007f00fc002300440044003f00680075007c00cc00100085006300b5005200f0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_0 = 0068006c001400b9009000400036001000b500820092008b0013005c000800a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_0 = 00b200cc005600590064009400ce0074009c00900001008700c4003d007a00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_0 = 0088009e002800e2009b0055008100e4004f00e600ea00a2001500d4006d0053
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_0 = 00ea005200a10014009a00ff00b600be008600dc00e4000900a300b0005d00da
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_0 = 007d002900bc0052000f001300bf00ee0032005a008400ee0043000400fa00f1
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_0 = 000a00d000c900cb00a0007000cb00d0002800610039002400000098009500ad
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_0 = 0032005c0055007a00fe008600c7003400d00047003a00e400710058003d00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_0 = 00d900a800f80038001f00bc00e700fc00b6004e008500ad00970089003600ce
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_0 = 000e000400ae0060002200c3006b001b001f00040073009c00ee0047000200ea
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_0 = 0010008d00ba0061006e00f4007e006e00c3000d0044007400be009b00c3004a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_0 = 00c1004600d9001a00d300e50015006b00e200d30020009d005c00f700170001
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_0 = 007f009d00d400a100ba00ec00e30069005f00a3006200f800c400d9008b00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_0 = 00d800dc00560066002f00aa008d00410075008b006f003400a1006a001c00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_0 = 003b00ce00ed00970044009d00ea00b900e40084002e009200110084007800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_0 = 00290060007000050038009f0089008b00e4000600610022007100fa000700c1
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_0 = 00e4001e00f7009800cc0053002a00f800cf00e800d300c0008b0002002d004d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_0 = 0063005b00da00ed00c6008500dc00b400f2002900aa0036005500a40095009c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_0 = 001f004100e5004600b000b700df0071007b0005007f00e3008e00c800be0037
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_0 = 003a0001009d006000890030000f005000d500b2008e0040008d007c00fc008c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_0 = 00990061001900b000d10009007d0076008700950066008d00ea000c00640063
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_0 = 00a300ea004e006a0084007a0031007a00f8004e00160028003d00ad00a20079
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_0 = 006a00e400e8004d00ac00c20013007f00dd00f1009b00b800d400f3003c00d9
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_0 = 00d0001200ba000f0049003e000b0058004c00dc001a00d0009700e2000b0004
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_0 = 00a700ef00b200e900310006006c00d1007800e9005b00820016006800f400f7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_0 = 0042000a000c007000fb00ea0034007f0099002800190037000c002800f300b1
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_0 = 00ee007b00c9008c000600b9001b00180027009100f90088006100a1004c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_0 = 006f005100f600ba00fc00c3008100cf00c800eb00930098000100da003c002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_0 = 0090001b0048007d0020002b007100c80048005100b400f700f1004f000200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_0 = 00470014009d00cd004d004c005c008300f000e900850036001300d600d900db
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_0 = 00cb008800090061007200ab00e200b000ab00ce006d00940023002d007000a9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_0 = 00e600ea008e000e00c3003a00f9005100840068006000000006006700d10010
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_0 = 004600d6002600df0077008e000c002c00720014004b009400f000cd005c0002
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_0 = 00b100430008003d001e00ca00ab00ad0008005f004f008300720025006b0033
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_0 = 001600e900d9001d0007009e004a00a500b500be003900cb004a002500950060
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_0 = 004c005f008d00270098005f00ad009b00d6008a00b600e9009a007d00f100cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_0 = 00b700a50086004700da00f2007d00f400b700210092005f00b80087007a0089
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_0 = 00ce0003005b00eb00290046007d008b007e00bc0092000200ec00fc00e5007b
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_0 = 003b009100e5004e002c0047002a00fd00a000da007b009b001c00b8000d0016
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_0 = 002400e600b40081007600d700e1000e00e900be007c009d00f4006b00bb00de
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_0 = 00b20020005300610073002800a200ff003900b2002a003a00b000f300f60027
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_0 = 005f0036008400840066000b00be001d0037007200fc000900a5009d004e0092
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_0 = 008f00b800d9002a000700c10096009400f8003c002a00fe00670060006700e8
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_0 = 0051003300d4004b00e50086000100ca008f001f007800770070007600e10040
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_0 = 00ca00d900f500da002b000d003900420018009300cb00e900500065004a0061
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_0 = 00c5003100200015008c00a500ee002100b2006f0082004200c4001e00760073
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_0 = 00d70006007300a400b100c40007009200ba003e008800410052003b006c0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_0 = 0019006800c4001300b8002200fc00310094000900fa009a00a20017005100da
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_0 = 00d000d30072008f00500046009b00b6005400eb00d40087005600bd00dc009b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_0 = 000700a000e400de00f600b900f600c900a50002008700960071009b00f200c3
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_0 = 006b0050007600a60033006000b100c0004d009400ea002600760055005a0018
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_0 = 00aa009c00b600ff0013007600650023004100b90019007c00670075001e00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_0 = 00de001500c8000a00fd000b002e00ba004b00d700b200fe00d7004f00d100da
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_0 = 00a400d60099007b00fe0008007900b5006a00ec00a500bb00c700ef00e7006d
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_0 = 0012004a00b9006800280073000700870012001b009600d500f800cf00ec0001
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_0 = 00f000ce007e003100cf00f50002002100b500d400dd0013006b00fc00410087
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_0 = 0084005d00a900bd00d8003c00a7002000a200f2009a000e009a00f0000d0009
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_0 = 0042002a00750002007100880053003200c7001a000a0064003d006e007e0085
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_0 = 006b00ef00b5004e006d005600ef0092000a0080002800c80089003a00c200a1
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_0 = 001c007a000200e500dc005b0076000a007a00f9000500c800d700ec00e200f2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_0 = 006b00ac00fc00c800a800fd006e00760018004500710082009d006e00dc000a
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_0 = 005b00a40045004700f4000500a9008e0064002c005c000000f4007e00d10042
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_1 = 002400ad00370092008300b8005b005c00a500690090004b001100a800e200d2
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_1 = 00f700f7005300030010003d004300bd005400d3000c00e4003a003c002a0088
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_1 = 002100d900540053009700ed00710051000c00f4004f005f0050002000a20075
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_1 = 00cb00b900a3004a00e1008600a600c500a4009300ed008d00f5003b00e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_1 = 0056004e00c90069007100f500d5002e00260065009d008f00d300d4005200ed
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_1 = 005300de00d700150097009600dc0074004b00e000b200f300120036006f0000
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_1 = 0008006a007400d5002300f200ca003e0045009b006b00e800d5007f00b10016
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_1 = 0003003700c3000300ff006700ea00e400cf00880000004b0022001900730038
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_1 = 007600c5004e00e9006d000a007000fd004f004600e8007c0074006a00690038
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_1 = 0062006d004c004300ce000600ca00d8000500e200ab005c0076004d006900a5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_1 = 002a005a002000aa00350007007c00ef001b006b00070076006c002900c4004e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_1 = 00b5004e004800fd00af003f00dc0093003a009b00b700a800a900f400b900bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_1 = 007300f000b0004a00f50022004d00e80099006c00b100730007002600d400df
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_1 = 0075007a001900d4000d007e0028003a00370032001e003000f2005b00f500b7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_1 = 00fa0029009f00e6006400a9003700ef005500bf00f600060096004200ec00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_1 = 0021003900d8008000be00ca0094003b0023007e001700c300c700fb006d000c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_1 = 007f00fc002300440044003f00680075007c00cc00100085006300b5005200f0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_1 = 0068006c001400b9009000400036001000b500820092008b0013005c000800a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_1 = 00b200cc005600590064009400ce0074009c00900001008700c4003d007a00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_1 = 0088009e002800e2009b0055008100e4004f00e600ea00a2001500d4006d0053
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_1 = 00ea005200a10014009a00ff00b600be008600dc00e4000900a300b0005d00da
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_1 = 007d002900bc0052000f001300bf00ee0032005a008400ee0043000400fa00f1
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_1 = 000a00d000c900cb00a0007000cb00d0002800610039002400000098009500ad
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_1 = 0032005c0055007a00fe008600c7003400d00047003a00e400710058003d00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_1 = 00d900a800f80038001f00bc00e700fc00b6004e008500ad00970089003600ce
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_1 = 000e000400ae0060002200c3006b001b001f00040073009c00ee0047000200ea
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_1 = 0010008d00ba0061006e00f4007e006e00c3000d0044007400be009b00c3004a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_1 = 00c1004600d9001a00d300e50015006b00e200d30020009d005c00f700170001
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_1 = 007f009d00d400a100ba00ec00e30069005f00a3006200f800c400d9008b00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_1 = 00d800dc00560066002f00aa008d00410075008b006f003400a1006a001c00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_1 = 003b00ce00ed00970044009d00ea00b900e40084002e009200110084007800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_1 = 00290060007000050038009f0089008b00e4000600610022007100fa000700c1
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_1 = 00e4001e00f7009800cc0053002a00f800cf00e800d300c0008b0002002d004d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_1 = 0063005b00da00ed00c6008500dc00b400f2002900aa0036005500a40095009c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_1 = 001f004100e5004600b000b700df0071007b0005007f00e3008e00c800be0037
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_1 = 003a0001009d006000890030000f005000d500b2008e0040008d007c00fc008c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_1 = 00990061001900b000d10009007d0076008700950066008d00ea000c00640063
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_1 = 00a300ea004e006a0084007a0031007a00f8004e00160028003d00ad00a20079
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_1 = 006a00e400e8004d00ac00c20013007f00dd00f1009b00b800d400f3003c00d9
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_1 = 00d0001200ba000f0049003e000b0058004c00dc001a00d0009700e2000b0004
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_1 = 00a700ef00b200e900310006006c00d1007800e9005b00820016006800f400f7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_1 = 0042000a000c007000fb00ea0034007f0099002800190037000c002800f300b1
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_1 = 00ee007b00c9008c000600b9001b00180027009100f90088006100a1004c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_1 = 006f005100f600ba00fc00c3008100cf00c800eb00930098000100da003c002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_1 = 0090001b0048007d0020002b007100c80048005100b400f700f1004f000200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_1 = 00470014009d00cd004d004c005c008300f000e900850036001300d600d900db
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_1 = 00cb008800090061007200ab00e200b000ab00ce006d00940023002d007000a9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_1 = 00e600ea008e000e00c3003a00f9005100840068006000000006006700d10010
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_1 = 004600d6002600df0077008e000c002c00720014004b009400f000cd005c0002
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_1 = 00b100430008003d001e00ca00ab00ad0008005f004f008300720025006b0033
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_1 = 001600e900d9001d0007009e004a00a500b500be003900cb004a002500950060
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_1 = 004c005f008d00270098005f00ad009b00d6008a00b600e9009a007d00f100cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_1 = 00b700a50086004700da00f2007d00f400b700210092005f00b80087007a0089
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_1 = 00ce0003005b00eb00290046007d008b007e00bc0092000200ec00fc00e5007b
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_1 = 003b009100e5004e002c0047002a00fd00a000da007b009b001c00b8000d0016
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_1 = 002400e600b40081007600d700e1000e00e900be007c009d00f4006b00bb00de
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_1 = 00b20020005300610073002800a200ff003900b2002a003a00b000f300f60027
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_1 = 005f0036008400840066000b00be001d0037007200fc000900a5009d004e0092
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_1 = 008f00b800d9002a000700c10096009400f8003c002a00fe00670060006700e8
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_1 = 0051003300d4004b00e50086000100ca008f001f007800770070007600e10040
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_1 = 00ca00d900f500da002b000d003900420018009300cb00e900500065004a0061
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_1 = 00c5003100200015008c00a500ee002100b2006f0082004200c4001e00760073
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_1 = 00d70006007300a400b100c40007009200ba003e008800410052003b006c0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_1 = 0019006800c4001300b8002200fc00310094000900fa009a00a20017005100da
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_1 = 00d000d30072008f00500046009b00b6005400eb00d40087005600bd00dc009b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_1 = 000700a000e400de00f600b900f600c900a50002008700960071009b00f200c3
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_1 = 006b0050007600a60033006000b100c0004d009400ea002600760055005a0018
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_1 = 00aa009c00b600ff0013007600650023004100b90019007c00670075001e00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_1 = 00de001500c8000a00fd000b002e00ba004b00d700b200fe00d7004f00d100da
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_1 = 00a400d60099007b00fe0008007900b5006a00ec00a500bb00c700ef00e7006d
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_1 = 0012004a00b9006800280073000700870012001b009600d500f800cf00ec0001
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_1 = 00f000ce007e003100cf00f50002002100b500d400dd0013006b00fc00410087
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_1 = 0084005d00a900bd00d8003c00a7002000a200f2009a000e009a00f0000d0009
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_1 = 0042002a00750002007100880053003200c7001a000a0064003d006e007e0085
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_1 = 006b00ef00b5004e006d005600ef0092000a0080002800c80089003a00c200a1
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_1 = 001c007a000200e500dc005b0076000a007a00f9000500c800d700ec00e200f2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_1 = 006b00ac00fc00c800a800fd006e00760018004500710082009d006e00dc000a
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_1 = 005b00a40045004700f4000500a9008e0064002c005c000000f4007e00d10042
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_2 = 002400ad00370092008300b8005b005c00a500690090004b001100a800e200d2
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_2 = 00f700f7005300030010003d004300bd005400d3000c00e4003a003c002a0088
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_2 = 002100d900540053009700ed00710051000c00f4004f005f0050002000a20075
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_2 = 00cb00b900a3004a00e1008600a600c500a4009300ed008d00f5003b00e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_2 = 0056004e00c90069007100f500d5002e00260065009d008f00d300d4005200ed
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_2 = 005300de00d700150097009600dc0074004b00e000b200f300120036006f0000
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_2 = 0008006a007400d5002300f200ca003e0045009b006b00e800d5007f00b10016
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_2 = 0003003700c3000300ff006700ea00e400cf00880000004b0022001900730038
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_2 = 007600c5004e00e9006d000a007000fd004f004600e8007c0074006a00690038
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_2 = 0062006d004c004300ce000600ca00d8000500e200ab005c0076004d006900a5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_2 = 002a005a002000aa00350007007c00ef001b006b00070076006c002900c4004e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_2 = 00b5004e004800fd00af003f00dc0093003a009b00b700a800a900f400b900bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_2 = 007300f000b0004a00f50022004d00e80099006c00b100730007002600d400df
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_2 = 0075007a001900d4000d007e0028003a00370032001e003000f2005b00f500b7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_2 = 00fa0029009f00e6006400a9003700ef005500bf00f600060096004200ec00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_2 = 0021003900d8008000be00ca0094003b0023007e001700c300c700fb006d000c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_2 = 007f00fc002300440044003f00680075007c00cc00100085006300b5005200f0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_2 = 0068006c001400b9009000400036001000b500820092008b0013005c000800a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_2 = 00b200cc005600590064009400ce0074009c00900001008700c4003d007a00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_2 = 0088009e002800e2009b0055008100e4004f00e600ea00a2001500d4006d0053
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_2 = 00ea005200a10014009a00ff00b600be008600dc00e4000900a300b0005d00da
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_2 = 007d002900bc0052000f001300bf00ee0032005a008400ee0043000400fa00f1
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_2 = 000a00d000c900cb00a0007000cb00d0002800610039002400000098009500ad
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_2 = 0032005c0055007a00fe008600c7003400d00047003a00e400710058003d00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_2 = 00d900a800f80038001f00bc00e700fc00b6004e008500ad00970089003600ce
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_2 = 000e000400ae0060002200c3006b001b001f00040073009c00ee0047000200ea
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_2 = 0010008d00ba0061006e00f4007e006e00c3000d0044007400be009b00c3004a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_2 = 00c1004600d9001a00d300e50015006b00e200d30020009d005c00f700170001
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_2 = 007f009d00d400a100ba00ec00e30069005f00a3006200f800c400d9008b00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_2 = 00d800dc00560066002f00aa008d00410075008b006f003400a1006a001c00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_2 = 003b00ce00ed00970044009d00ea00b900e40084002e009200110084007800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_2 = 00290060007000050038009f0089008b00e4000600610022007100fa000700c1
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_2 = 00e4001e00f7009800cc0053002a00f800cf00e800d300c0008b0002002d004d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_2 = 0063005b00da00ed00c6008500dc00b400f2002900aa0036005500a40095009c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_2 = 001f004100e5004600b000b700df0071007b0005007f00e3008e00c800be0037
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_2 = 003a0001009d006000890030000f005000d500b2008e0040008d007c00fc008c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_2 = 00990061001900b000d10009007d0076008700950066008d00ea000c00640063
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_2 = 00a300ea004e006a0084007a0031007a00f8004e00160028003d00ad00a20079
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_2 = 006a00e400e8004d00ac00c20013007f00dd00f1009b00b800d400f3003c00d9
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_2 = 00d0001200ba000f0049003e000b0058004c00dc001a00d0009700e2000b0004
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_2 = 00a700ef00b200e900310006006c00d1007800e9005b00820016006800f400f7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_2 = 0042000a000c007000fb00ea0034007f0099002800190037000c002800f300b1
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_2 = 00ee007b00c9008c000600b9001b00180027009100f90088006100a1004c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_2 = 006f005100f600ba00fc00c3008100cf00c800eb00930098000100da003c002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_2 = 0090001b0048007d0020002b007100c80048005100b400f700f1004f000200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_2 = 00470014009d00cd004d004c005c008300f000e900850036001300d600d900db
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_2 = 00cb008800090061007200ab00e200b000ab00ce006d00940023002d007000a9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_2 = 00e600ea008e000e00c3003a00f9005100840068006000000006006700d10010
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_2 = 004600d6002600df0077008e000c002c00720014004b009400f000cd005c0002
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_2 = 00b100430008003d001e00ca00ab00ad0008005f004f008300720025006b0033
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_2 = 001600e900d9001d0007009e004a00a500b500be003900cb004a002500950060
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_2 = 004c005f008d00270098005f00ad009b00d6008a00b600e9009a007d00f100cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_2 = 00b700a50086004700da00f2007d00f400b700210092005f00b80087007a0089
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_2 = 00ce0003005b00eb00290046007d008b007e00bc0092000200ec00fc00e5007b
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_2 = 003b009100e5004e002c0047002a00fd00a000da007b009b001c00b8000d0016
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_2 = 002400e600b40081007600d700e1000e00e900be007c009d00f4006b00bb00de
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_2 = 00b20020005300610073002800a200ff003900b2002a003a00b000f300f60027
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_2 = 005f0036008400840066000b00be001d0037007200fc000900a5009d004e0092
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_2 = 008f00b800d9002a000700c10096009400f8003c002a00fe00670060006700e8
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_2 = 0051003300d4004b00e50086000100ca008f001f007800770070007600e10040
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_2 = 00ca00d900f500da002b000d003900420018009300cb00e900500065004a0061
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_2 = 00c5003100200015008c00a500ee002100b2006f0082004200c4001e00760073
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_2 = 00d70006007300a400b100c40007009200ba003e008800410052003b006c0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_2 = 0019006800c4001300b8002200fc00310094000900fa009a00a20017005100da
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_2 = 00d000d30072008f00500046009b00b6005400eb00d40087005600bd00dc009b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_2 = 000700a000e400de00f600b900f600c900a50002008700960071009b00f200c3
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_2 = 006b0050007600a60033006000b100c0004d009400ea002600760055005a0018
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_2 = 00aa009c00b600ff0013007600650023004100b90019007c00670075001e00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_2 = 00de001500c8000a00fd000b002e00ba004b00d700b200fe00d7004f00d100da
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_2 = 00a400d60099007b00fe0008007900b5006a00ec00a500bb00c700ef00e7006d
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_2 = 0012004a00b9006800280073000700870012001b009600d500f800cf00ec0001
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_2 = 00f000ce007e003100cf00f50002002100b500d400dd0013006b00fc00410087
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_2 = 0084005d00a900bd00d8003c00a7002000a200f2009a000e009a00f0000d0009
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_2 = 0042002a00750002007100880053003200c7001a000a0064003d006e007e0085
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_2 = 006b00ef00b5004e006d005600ef0092000a0080002800c80089003a00c200a1
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_2 = 001c007a000200e500dc005b0076000a007a00f9000500c800d700ec00e200f2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_2 = 006b00ac00fc00c800a800fd006e00760018004500710082009d006e00dc000a
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_2 = 005b00a40045004700f4000500a9008e0064002c005c000000f4007e00d10042
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor64K_3 = 002400ad00370092008300b8005b005c00a500690090004b001100a800e200d2
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor64K_3 = 00f700f7005300030010003d004300bd005400d3000c00e4003a003c002a0088
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor64K_3 = 002100d900540053009700ed00710051000c00f4004f005f0050002000a20075
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor64K_3 = 00cb00b900a3004a00e1008600a600c500a4009300ed008d00f5003b00e8005d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor64K_3 = 0056004e00c90069007100f500d5002e00260065009d008f00d300d4005200ed
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor64K_3 = 005300de00d700150097009600dc0074004b00e000b200f300120036006f0000
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor64K_3 = 0008006a007400d5002300f200ca003e0045009b006b00e800d5007f00b10016
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor64K_3 = 0003003700c3000300ff006700ea00e400cf00880000004b0022001900730038
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor64K_3 = 007600c5004e00e9006d000a007000fd004f004600e8007c0074006a00690038
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor64K_3 = 0062006d004c004300ce000600ca00d8000500e200ab005c0076004d006900a5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor64K_3 = 002a005a002000aa00350007007c00ef001b006b00070076006c002900c4004e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor64K_3 = 00b5004e004800fd00af003f00dc0093003a009b00b700a800a900f400b900bb
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor64K_3 = 007300f000b0004a00f50022004d00e80099006c00b100730007002600d400df
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor64K_3 = 0075007a001900d4000d007e0028003a00370032001e003000f2005b00f500b7
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor64K_3 = 00fa0029009f00e6006400a9003700ef005500bf00f600060096004200ec00ab
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor64K_3 = 0021003900d8008000be00ca0094003b0023007e001700c300c700fb006d000c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor64K_3 = 007f00fc002300440044003f00680075007c00cc00100085006300b5005200f0
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor64K_3 = 0068006c001400b9009000400036001000b500820092008b0013005c000800a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor64K_3 = 00b200cc005600590064009400ce0074009c00900001008700c4003d007a00e9
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor64K_3 = 0088009e002800e2009b0055008100e4004f00e600ea00a2001500d4006d0053
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor64K_3 = 00ea005200a10014009a00ff00b600be008600dc00e4000900a300b0005d00da
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor64K_3 = 007d002900bc0052000f001300bf00ee0032005a008400ee0043000400fa00f1
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor64K_3 = 000a00d000c900cb00a0007000cb00d0002800610039002400000098009500ad
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor64K_3 = 0032005c0055007a00fe008600c7003400d00047003a00e400710058003d00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor64K_3 = 00d900a800f80038001f00bc00e700fc00b6004e008500ad00970089003600ce
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor64K_3 = 000e000400ae0060002200c3006b001b001f00040073009c00ee0047000200ea
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor64K_3 = 0010008d00ba0061006e00f4007e006e00c3000d0044007400be009b00c3004a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor64K_3 = 00c1004600d9001a00d300e50015006b00e200d30020009d005c00f700170001
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor64K_3 = 007f009d00d400a100ba00ec00e30069005f00a3006200f800c400d9008b00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor64K_3 = 00d800dc00560066002f00aa008d00410075008b006f003400a1006a001c00a7
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor64K_3 = 003b00ce00ed00970044009d00ea00b900e40084002e009200110084007800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor64K_3 = 00290060007000050038009f0089008b00e4000600610022007100fa000700c1
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor64K_3 = 00e4001e00f7009800cc0053002a00f800cf00e800d300c0008b0002002d004d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor64K_3 = 0063005b00da00ed00c6008500dc00b400f2002900aa0036005500a40095009c
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor64K_3 = 001f004100e5004600b000b700df0071007b0005007f00e3008e00c800be0037
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor64K_3 = 003a0001009d006000890030000f005000d500b2008e0040008d007c00fc008c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor64K_3 = 00990061001900b000d10009007d0076008700950066008d00ea000c00640063
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor64K_3 = 00a300ea004e006a0084007a0031007a00f8004e00160028003d00ad00a20079
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor64K_3 = 006a00e400e8004d00ac00c20013007f00dd00f1009b00b800d400f3003c00d9
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor64K_3 = 00d0001200ba000f0049003e000b0058004c00dc001a00d0009700e2000b0004
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor64K_3 = 00a700ef00b200e900310006006c00d1007800e9005b00820016006800f400f7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor64K_3 = 0042000a000c007000fb00ea0034007f0099002800190037000c002800f300b1
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor64K_3 = 00ee007b00c9008c000600b9001b00180027009100f90088006100a1004c006c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor64K_3 = 006f005100f600ba00fc00c3008100cf00c800eb00930098000100da003c002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor64K_3 = 0090001b0048007d0020002b007100c80048005100b400f700f1004f000200b0
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor64K_3 = 00470014009d00cd004d004c005c008300f000e900850036001300d600d900db
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor64K_3 = 00cb008800090061007200ab00e200b000ab00ce006d00940023002d007000a9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor64K_3 = 00e600ea008e000e00c3003a00f9005100840068006000000006006700d10010
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor64K_3 = 004600d6002600df0077008e000c002c00720014004b009400f000cd005c0002
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor64K_3 = 00b100430008003d001e00ca00ab00ad0008005f004f008300720025006b0033
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor64K_3 = 001600e900d9001d0007009e004a00a500b500be003900cb004a002500950060
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor64K_3 = 004c005f008d00270098005f00ad009b00d6008a00b600e9009a007d00f100cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor64K_3 = 00b700a50086004700da00f2007d00f400b700210092005f00b80087007a0089
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor64K_3 = 00ce0003005b00eb00290046007d008b007e00bc0092000200ec00fc00e5007b
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor64K_3 = 003b009100e5004e002c0047002a00fd00a000da007b009b001c00b8000d0016
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor64K_3 = 002400e600b40081007600d700e1000e00e900be007c009d00f4006b00bb00de
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor64K_3 = 00b20020005300610073002800a200ff003900b2002a003a00b000f300f60027
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor64K_3 = 005f0036008400840066000b00be001d0037007200fc000900a5009d004e0092
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor64K_3 = 008f00b800d9002a000700c10096009400f8003c002a00fe00670060006700e8
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor64K_3 = 0051003300d4004b00e50086000100ca008f001f007800770070007600e10040
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor64K_3 = 00ca00d900f500da002b000d003900420018009300cb00e900500065004a0061
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor64K_3 = 00c5003100200015008c00a500ee002100b2006f0082004200c4001e00760073
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor64K_3 = 00d70006007300a400b100c40007009200ba003e008800410052003b006c0038
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor64K_3 = 0019006800c4001300b8002200fc00310094000900fa009a00a20017005100da
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor64K_3 = 00d000d30072008f00500046009b00b6005400eb00d40087005600bd00dc009b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor64K_3 = 000700a000e400de00f600b900f600c900a50002008700960071009b00f200c3
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor64K_3 = 006b0050007600a60033006000b100c0004d009400ea002600760055005a0018
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor64K_3 = 00aa009c00b600ff0013007600650023004100b90019007c00670075001e00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor64K_3 = 00de001500c8000a00fd000b002e00ba004b00d700b200fe00d7004f00d100da
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor64K_3 = 00a400d60099007b00fe0008007900b5006a00ec00a500bb00c700ef00e7006d
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor64K_3 = 0012004a00b9006800280073000700870012001b009600d500f800cf00ec0001
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor64K_3 = 00f000ce007e003100cf00f50002002100b500d400dd0013006b00fc00410087
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor64K_3 = 0084005d00a900bd00d8003c00a7002000a200f2009a000e009a00f0000d0009
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor64K_3 = 0042002a00750002007100880053003200c7001a000a0064003d006e007e0085
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor64K_3 = 006b00ef00b5004e006d005600ef0092000a0080002800c80089003a00c200a1
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor64K_3 = 001c007a000200e500dc005b0076000a007a00f9000500c800d700ec00e200f2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor64K_3 = 006b00ac00fc00c800a800fd006e00760018004500710082009d006e00dc000a
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor64K_3 = 005b00a40045004700f4000500a9008e0064002c005c000000f4007e00d10042
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_0 = 004900f500c80046005200600077009b00e40077006b004b00fd003600b7006c
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_0 = 0069006200e60047005e00c0002d00d40091009200db00bf00b3004d008200aa
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_0 = 00e0000e00d2005f008c00bb00c500280015004800ce00b00019003f008000b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_0 = 003c000800ec00520008000d005700f900fd00dd009d00f20045005800c9005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_0 = 000a00da008b00f9007e00c600be000d0067009800fd004b0028003300fd00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_0 = 0091004c00e6001e009900c4000b002f009100ea00b6004e0087009900bf0069
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_0 = 007d008f005b00a9001c005a00cc00ec008700f2007200df004e008f008f00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_0 = 003400de00d800a70059005e00990001002c00d600f30023004d004500e50052
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_0 = 009500510002000700f4008e00b50056009c0025002a008f00e700f7008c0056
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_0 = 007c00a200a0009e001e005500df00c4002200ab00cc003600d000b0002e00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_0 = 00c300700021007a000d005e002a0021002a00cf002500ec007400d2007f0058
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_0 = 00060066000900cd001a0068008300a0007300fb0045009d00ec00a500fe00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_0 = 003c00730041002500e700c700c800c700250021009800bb004000f2004e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_0 = 001d00bf006700a900a900a600f600600078007800210061007e0086003900af
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_0 = 0093000600ee00b500ae0062003f000900c200230055002f008a00450088003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_0 = 002d005f002f0074009200b6006000f500820030008e00050071006f005300c9
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_0 = 0062002b00ee004b002c00b40013001d00e100df003e00870031000500620076
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_0 = 00d0000300ed005a00060051005200740020003c002a00d0005400f1006d0052
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_0 = 00a00078009500fb00980061006900cc003500eb005100c6001a00eb006300a3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_0 = 00780037008800c900e6004e004f00e5003f00dd009b002b000c003800de00d8
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16M_0 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_0 = 009200dd00ac0021006f008f004b0025004300b400e600a8005b00b40080007d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_0 = 008a00c8004100fa00c500cd00c600060079006d007a00b100610031000000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_0 = 000b00dc00d7000d000900d600b300b300f8005300be00d0006400c000e6005e
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_0 = 0043003b007f00a9006d00f400a30063002300880049004e009500e2003500c9
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_0 = 009000fe00880077004c007900f30079003e00b600b1003c00ab009f00650037
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_0 = 00f200f400a50024006c0018005d00dd00a2005f005f009800cd00bf00df00b4
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_0 = 00c4002a00890059004c005600e000ab0082009f00840094002d00f100f0004c
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_0 = 005400ef00c100b6001900920004006800de007500f00004004100fb00dd009b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_0 = 003100a700f700ed001800c4005e006500ad009f00a2002600020084008a0014
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_0 = 00f900da00300014001f004300f7001f005f000f007500fe00c200f4005400c7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_0 = 0035004c007f009f00200096005a00ec00ce00f30093001f004300a4006a007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_0 = 0022009e0028002100f0002b003500d6003d000f00d8007e00a500d500e80001
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_0 = 008300b9007800cf0040006b00ae000700fc00b700dd00e90096005c001100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_0 = 004100d500a9001c0029009100150076000000c100c5001c001f0098008d0065
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_0 = 002a00ff00b00071000f0068009300330091000900ef007c007800e6006e0037
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_0 = 005a004c003f00af003900a40039009c002b00780058002b000300c8007400a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_0 = 00430091006100c30098005f00d900a000b10047007200cf0003000300bc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_0 = 00e9006c00670035008e00ec006a00ae00920086005400bc009f006800b6008b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_0 = 006f00ad002400680014003400c2006f0036002900e700c500a2001e008100ed
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_0 = 002200f600960039001100ea002600a4005200b7009d0018007b00f5009400f9
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_0 = 000800e00022009c00fa00d2007d00e200b7008b00f200a80016001b00d40031
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_0 = 00f500e800f70058008f00ff007d00cc00fc000800bc007100d7001200a40005
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_0 = 008a006c00da001700150009007d002500770030002d00b200ab00e100f30085
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_0 = 00f5003200e90056009200f300e500da004000a700710036009300820031003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_0 = 005900b5004b0076003100be00580067009e009000fb00f400740046002100ce
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_0 = 005d005200aa00bb00ab004700770074003d00ee008100b3007800800095006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_0 = 00230086005c005300bf008b005000740093002800fc00b500830086004c00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_0 = 00200012004e001f00080058004c0010001500e5007800be00c4000f00f4009c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_0 = 0083003d006e0010001600180097006900eb0030007e0015008e00c100ce00ca
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_0 = 00ae00c900fe007a003400e5007e0060004c006900aa00c4009e001000b0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_0 = 002600d900f500d3005b0016001f00fe00390045002b00cf00df00a1005c007b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_0 = 007600cc001600fc0064001700e0007b00c8007700380001009700930022002f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_0 = 00950020000e00020067009000790022001500b300f9003b008d00c800c30097
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_0 = 00090011001800c7000600de003000c200140074006f00c600b900e6001900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_0 = 00cb009d004b00cb003800b500fc0080006300e800fa004400da000300d30021
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_0 = 00e000dd00ce00fe00fe00ef007100fe00f7002700fa00cf00d1007e0026006a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_0 = 00610083004e002f00e80006008500dc005c00d0001a00ac00a0009800750098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_0 = 008f00610016009e00880057006800fa000e002f007d00a6005c0080009a00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_0 = 00c10022004b00f400f9007a002b0029005a000d001f0073003f000500540092
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_0 = 00ff002100f9000000d7008900be00e2006d001100ed00f100df00c900d5000c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_0 = 008600a7003900a400600086005b00a6001b001c00f700d000db0061002900ec
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_0 = 0093001200220071009b000d00e500ef0090003b0075000e00190097000b00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_0 = 0041003400b9004d00d600d4003200dd009600b900c1002c002600f300560057
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_0 = 003c00bd00a400c0007600c400dc004e0095008f003d003700fb0036009800e2
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_0 = 00b6004000b600e500db008f00ef0013002200ff006f00ea006700660073007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_0 = 001c00cd004300c000c100b500fe001900df00dd00e300030076004600370068
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_0 = 00bf002a0073005500c300ee00370016004400ea008000f000ed00ac009500ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_0 = 005d00d100bb00ec007500440091002100a000a400b4001500d00026004d00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_0 = 005300f000d6007500ba00e8002a003700bc008a00ea002d00b8005b002f0032
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_0 = 00fb0084000800cd00bc00e500e100400027008300a9009000f700ae009800d9
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16M_0 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_0 = 00df00a300c3006b00c8001600a0006a0083000400e800f6002500a6009200f6
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_0 = 00a600cd00b300b9009300fc0006005800ab0087006c00b500ed006a0093001a
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_0 = 00ea008f00b600c80076009b001c0077003900df002100c700fe005700b90034
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_0 = 00b600b500990085000e002700b000d900ed00ff008e00d300e2006400a800fe
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_0 = 00150098000600ca00fe00e000070030000a00b800c100f000e400a70090008d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_0 = 00f7005a00b80086006000bf008e00030075002a009f0028008d00dc000700bf
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_0 = 0001000200ad0013000d00ed00db00a4009000b100970005005c009c0019006b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_0 = 0084003400c300d6008500a9005800f3005a00cd009f00cf00fb008b00590094
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_0 = 001700a6006d004500a5003c000300b5000a004d00b200ab0061002000b80072
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_0 = 00da00fb007e0053005200fe00b400f8000400d70045000c00b1007d003e003f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_0 = 00ae005a00d200e1005d000100930005007100df0040001800b90086005e00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_0 = 00cf000400b500890037009700e2000a00450014002700d000cf007f00c20070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_0 = 00ce00a1002f001400ce00aa002b00ae00ed0079007800fa00d200ed00fd00f1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_0 = 000400b2005a001100960044006a00b900e100b4001b00da000600f800ee0007
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_0 = 0069008e005a0026008c00b9004d00f8000d004c00f100ed00cd00aa003500da
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_0 = 002000ab00a8004d001f00f7004900800020006f00870026003a00e100dd00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_0 = 00e0004f005f001100f900c80012006f003e0086000700860003008a00c6009b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_0 = 006a0032008e00150040007500a900320063003f008c00d50004001d0056002a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_0 = 0056006800e800c700c200ae0027005f007c00cc00d600eb005800410048002e
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_0 = 004a009100d8000f005700ec004b00dd007c00a600b6004600e400d0004000c8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_0 = 00c4002000c40045008200a6005900eb003e006000db00010003000900df00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_0 = 00ee00de006100ad00a2006000fe00ef001300eb0027008500d500f100a500ec
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_0 = 0011003800fc00a700560089004c00d500a9004a003e0016001200f1004600ae
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_0 = 006d00220062005600f5008d008600ca00060008003c008a008100f6005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_0 = 005a00dc000a00a800590009001f003c00cb0021009c0087004b00b300890013
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_0 = 002a00100066009e008c005400a1001100fd00f30099000d003400f600ea00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_0 = 0089005d00d900c100fd00e90042005100c500bb0003003b002a002800db0014
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_0 = 00d000e000df0087004a001800a700cd004c003200b5005d00e2009c00e50039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_0 = 0096008a00bd00f100c100610049004c005b00d4008a00dd001d00a8005300f7
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_0 = 00a000c7008500e400a20075008d001d009900cc000400560090004700ca000a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_0 = 00ea0092004f00cd00ba0000007c003e0056004c007200a4009900dc00280067
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_0 = 00550090005f004c005e007600ab008700a70033004b004a003e00740043003e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_0 = 00e900cc002a00fb006c0054008300b8007500b7005a00ff00be008f006f0081
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_0 = 00de002b0087002c0000009500bb009e003c001a001a00100066006a0093006c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_0 = 00c1009000ac007d000b00fa004f004200b300e5003000b30061008a008b0065
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_0 = 008a004d001b0081008d00990000007400130097001a003200e500d900600090
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_0 = 006a00a9001600b400bd0001001a00be00fc001f00c500e300a400a5008500f5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_0 = 002b0089002f005c0014001a0045009900920093007300b000bb00d400840084
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_0 = 004e002b0020006c002a0016000100cf0031008c008100d8007600b8006800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_0 = 0086000d00fb006d000f005400590078009d00f40004003400ce00bc00df003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_0 = 00d000330001005f002b00ca005300b70020004f00de007e003000a600990087
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_0 = 00c800f5004500160035001300e800fc0051006800a30017008900e1002100be
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_0 = 00cd00840011002c00a900f000010081003b00580097004e00b100990018001f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_0 = 0033006c00a000c200cf005f00070042008d004f0012005b00f2003e00360071
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_0 = 005b00d80000004d0064008300c000d0009e0059008200cc00f4000c00110025
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_0 = 009100b8006b00a100fe000e003100f80069009b00c100f5006100d900e700b2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_0 = 00b500cd00c7005e005d0093000500b9004c008f007600b6000400900022001b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_0 = 002100a900a00030006c007b00b800bc00270074007300a1009000d200cf00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_0 = 002d005d00e4002e0083008800a9006e005c00760027006300210078009c00c4
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_0 = 00f30060006600840009006800f200ab00e700ff00c8003e00500033004100fe
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16M_0 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_0 = 00c9009f002200af00290084009900c6005d00fa00cc009400840050009100f8
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_0 = 00eb006f00fd004300a000de0037004600d300e80007002600aa00b000b60091
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_0 = 00530011000600a400ee0004003b00cd0075009b00da00e100ed003000e7002f
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_0 = 001900a200120089008000c4008100ba004e003f004600290055005c00ac0037
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_0 = 00c500e700b1004700ab00a90016006100b9007800c800cd00b900c5002300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_1 = 00dd008a00ab001f0013000900a400bf00d7003a000e001f005c000800440018
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_1 = 00ef00cf00ac006f00ca001d00be008c00820090009c005b00660053005400f2
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_1 = 006c00380067006c009e00d3008800ec00af00fa008f008a00a800b6008400bf
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_1 = 00dd007700ca00b600cc00d800c300ac001600d600b60070007a00ba006c0024
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_1 = 005300b800f9009b001800f600e1005f0020002700da00e3000b00360085001f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_1 = 001f003e001700a3003d005200d700c9007100ef007e004c00e9006900b10054
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_1 = 00ff00080096009800460077009200e6009500d000d900fa00b500a600ca00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_1 = 005c0040004000a8000500d5002e00eb009b00b9005d002b006900670080008c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_1 = 00e900be004e00110068009e00f60078003100d8000b006d00bc00f6003300ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_1 = 002400ff005f009600a200890004007f00e300740088000100f10040001f0096
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_1 = 001000c9004c0078000e00e2007600ff0031008500d2005d00ff0013003a0034
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_1 = 00a20025009000590041006400b900ff00d30091003d005900e4001d003b0076
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_1 = 0016004600ca0098001c00b5004c00c4000900c100e1009a00f000ed00950057
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_1 = 003c001500b600bd00a400e000da00d10000003e00e900a8007f004d005a000d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_1 = 0021003900dd000a0088001600d000d6006d0008009000b400ac009e001d00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_1 = 003b00b4007600a60064008e0030008500a6008000da009e0099000d007f0024
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_1 = 00ac00460091003d0087008f00c300bf00ca00e0002c004a00b1000200d30076
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_1 = 002c0062006700f90002004300b1008300bb00e500ed00bb000400bd00b600d1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_1 = 00d000a100ea007b0072008e002100a200ae003800cf001400d00056007a00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_1 = 00ec0054000200bf00d800b7008300ab00b900c900ad002700ba009600de00f1
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_0 = 008f00ce004300dd003500a9004700ea00b200ef00c5008b003e00c4001900e0
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_0 = 00d900c700ef008a00e500b800f5003900a900ae000200d7005d00740069001b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_0 = 008a00d00087004800ff009600e2007300590084005100b900b400c400b000cd
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_0 = 0076009500710087000a005100cd00f100f700d00036006600ff001f00ba00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_0 = 007700eb004d009a005b00af008c00d100bd005700f6008b009a00ce003800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_1 = 004900f500c80046005200600077009b00e40077006b004b00fd003600b7006c
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_1 = 0069006200e60047005e00c0002d00d40091009200db00bf00b3004d008200aa
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_1 = 00e0000e00d2005f008c00bb00c500280015004800ce00b00019003f008000b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_1 = 003c000800ec00520008000d005700f900fd00dd009d00f20045005800c9005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_1 = 000a00da008b00f9007e00c600be000d0067009800fd004b0028003300fd00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_1 = 0091004c00e6001e009900c4000b002f009100ea00b6004e0087009900bf0069
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_1 = 007d008f005b00a9001c005a00cc00ec008700f2007200df004e008f008f00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_1 = 003400de00d800a70059005e00990001002c00d600f30023004d004500e50052
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_1 = 009500510002000700f4008e00b50056009c0025002a008f00e700f7008c0056
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_1 = 007c00a200a0009e001e005500df00c4002200ab00cc003600d000b0002e00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_1 = 00c300700021007a000d005e002a0021002a00cf002500ec007400d2007f0058
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_1 = 00060066000900cd001a0068008300a0007300fb0045009d00ec00a500fe00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_1 = 003c00730041002500e700c700c800c700250021009800bb004000f2004e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_1 = 001d00bf006700a900a900a600f600600078007800210061007e0086003900af
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_1 = 0093000600ee00b500ae0062003f000900c200230055002f008a00450088003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_1 = 002d005f002f0074009200b6006000f500820030008e00050071006f005300c9
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_1 = 0062002b00ee004b002c00b40013001d00e100df003e00870031000500620076
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_1 = 00d0000300ed005a00060051005200740020003c002a00d0005400f1006d0052
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_1 = 00a00078009500fb00980061006900cc003500eb005100c6001a00eb006300a3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_1 = 00780037008800c900e6004e004f00e5003f00dd009b002b000c003800de00d8
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16M_1 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_1 = 009200dd00ac0021006f008f004b0025004300b400e600a8005b00b40080007d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_1 = 008a00c8004100fa00c500cd00c600060079006d007a00b100610031000000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_1 = 000b00dc00d7000d000900d600b300b300f8005300be00d0006400c000e6005e
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_1 = 0043003b007f00a9006d00f400a30063002300880049004e009500e2003500c9
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_1 = 009000fe00880077004c007900f30079003e00b600b1003c00ab009f00650037
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_1 = 00f200f400a50024006c0018005d00dd00a2005f005f009800cd00bf00df00b4
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_1 = 00c4002a00890059004c005600e000ab0082009f00840094002d00f100f0004c
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_1 = 005400ef00c100b6001900920004006800de007500f00004004100fb00dd009b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_1 = 003100a700f700ed001800c4005e006500ad009f00a2002600020084008a0014
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_1 = 00f900da00300014001f004300f7001f005f000f007500fe00c200f4005400c7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_1 = 0035004c007f009f00200096005a00ec00ce00f30093001f004300a4006a007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_1 = 0022009e0028002100f0002b003500d6003d000f00d8007e00a500d500e80001
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_1 = 008300b9007800cf0040006b00ae000700fc00b700dd00e90096005c001100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_1 = 004100d500a9001c0029009100150076000000c100c5001c001f0098008d0065
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_1 = 002a00ff00b00071000f0068009300330091000900ef007c007800e6006e0037
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_1 = 005a004c003f00af003900a40039009c002b00780058002b000300c8007400a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_1 = 00430091006100c30098005f00d900a000b10047007200cf0003000300bc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_1 = 00e9006c00670035008e00ec006a00ae00920086005400bc009f006800b6008b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_1 = 006f00ad002400680014003400c2006f0036002900e700c500a2001e008100ed
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_1 = 002200f600960039001100ea002600a4005200b7009d0018007b00f5009400f9
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_1 = 000800e00022009c00fa00d2007d00e200b7008b00f200a80016001b00d40031
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_1 = 00f500e800f70058008f00ff007d00cc00fc000800bc007100d7001200a40005
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_1 = 008a006c00da001700150009007d002500770030002d00b200ab00e100f30085
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_1 = 00f5003200e90056009200f300e500da004000a700710036009300820031003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_1 = 005900b5004b0076003100be00580067009e009000fb00f400740046002100ce
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_1 = 005d005200aa00bb00ab004700770074003d00ee008100b3007800800095006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_1 = 00230086005c005300bf008b005000740093002800fc00b500830086004c00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_1 = 00200012004e001f00080058004c0010001500e5007800be00c4000f00f4009c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_1 = 0083003d006e0010001600180097006900eb0030007e0015008e00c100ce00ca
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_1 = 00ae00c900fe007a003400e5007e0060004c006900aa00c4009e001000b0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_1 = 002600d900f500d3005b0016001f00fe00390045002b00cf00df00a1005c007b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_1 = 007600cc001600fc0064001700e0007b00c8007700380001009700930022002f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_1 = 00950020000e00020067009000790022001500b300f9003b008d00c800c30097
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_1 = 00090011001800c7000600de003000c200140074006f00c600b900e6001900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_1 = 00cb009d004b00cb003800b500fc0080006300e800fa004400da000300d30021
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_1 = 00e000dd00ce00fe00fe00ef007100fe00f7002700fa00cf00d1007e0026006a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_1 = 00610083004e002f00e80006008500dc005c00d0001a00ac00a0009800750098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_1 = 008f00610016009e00880057006800fa000e002f007d00a6005c0080009a00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_1 = 00c10022004b00f400f9007a002b0029005a000d001f0073003f000500540092
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_1 = 00ff002100f9000000d7008900be00e2006d001100ed00f100df00c900d5000c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_1 = 008600a7003900a400600086005b00a6001b001c00f700d000db0061002900ec
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_1 = 0093001200220071009b000d00e500ef0090003b0075000e00190097000b00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_1 = 0041003400b9004d00d600d4003200dd009600b900c1002c002600f300560057
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_1 = 003c00bd00a400c0007600c400dc004e0095008f003d003700fb0036009800e2
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_1 = 00b6004000b600e500db008f00ef0013002200ff006f00ea006700660073007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_1 = 001c00cd004300c000c100b500fe001900df00dd00e300030076004600370068
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_1 = 00bf002a0073005500c300ee00370016004400ea008000f000ed00ac009500ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_1 = 005d00d100bb00ec007500440091002100a000a400b4001500d00026004d00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_1 = 005300f000d6007500ba00e8002a003700bc008a00ea002d00b8005b002f0032
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_1 = 00fb0084000800cd00bc00e500e100400027008300a9009000f700ae009800d9
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16M_1 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_1 = 00df00a300c3006b00c8001600a0006a0083000400e800f6002500a6009200f6
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_1 = 00a600cd00b300b9009300fc0006005800ab0087006c00b500ed006a0093001a
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_1 = 00ea008f00b600c80076009b001c0077003900df002100c700fe005700b90034
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_1 = 00b600b500990085000e002700b000d900ed00ff008e00d300e2006400a800fe
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_1 = 00150098000600ca00fe00e000070030000a00b800c100f000e400a70090008d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_1 = 00f7005a00b80086006000bf008e00030075002a009f0028008d00dc000700bf
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_1 = 0001000200ad0013000d00ed00db00a4009000b100970005005c009c0019006b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_1 = 0084003400c300d6008500a9005800f3005a00cd009f00cf00fb008b00590094
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_1 = 001700a6006d004500a5003c000300b5000a004d00b200ab0061002000b80072
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_1 = 00da00fb007e0053005200fe00b400f8000400d70045000c00b1007d003e003f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_1 = 00ae005a00d200e1005d000100930005007100df0040001800b90086005e00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_1 = 00cf000400b500890037009700e2000a00450014002700d000cf007f00c20070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_1 = 00ce00a1002f001400ce00aa002b00ae00ed0079007800fa00d200ed00fd00f1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_1 = 000400b2005a001100960044006a00b900e100b4001b00da000600f800ee0007
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_1 = 0069008e005a0026008c00b9004d00f8000d004c00f100ed00cd00aa003500da
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_1 = 002000ab00a8004d001f00f7004900800020006f00870026003a00e100dd00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_1 = 00e0004f005f001100f900c80012006f003e0086000700860003008a00c6009b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_1 = 006a0032008e00150040007500a900320063003f008c00d50004001d0056002a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_1 = 0056006800e800c700c200ae0027005f007c00cc00d600eb005800410048002e
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_1 = 004a009100d8000f005700ec004b00dd007c00a600b6004600e400d0004000c8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_1 = 00c4002000c40045008200a6005900eb003e006000db00010003000900df00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_1 = 00ee00de006100ad00a2006000fe00ef001300eb0027008500d500f100a500ec
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_1 = 0011003800fc00a700560089004c00d500a9004a003e0016001200f1004600ae
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_1 = 006d00220062005600f5008d008600ca00060008003c008a008100f6005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_1 = 005a00dc000a00a800590009001f003c00cb0021009c0087004b00b300890013
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_1 = 002a00100066009e008c005400a1001100fd00f30099000d003400f600ea00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_1 = 0089005d00d900c100fd00e90042005100c500bb0003003b002a002800db0014
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_1 = 00d000e000df0087004a001800a700cd004c003200b5005d00e2009c00e50039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_1 = 0096008a00bd00f100c100610049004c005b00d4008a00dd001d00a8005300f7
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_1 = 00a000c7008500e400a20075008d001d009900cc000400560090004700ca000a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_1 = 00ea0092004f00cd00ba0000007c003e0056004c007200a4009900dc00280067
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_1 = 00550090005f004c005e007600ab008700a70033004b004a003e00740043003e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_1 = 00e900cc002a00fb006c0054008300b8007500b7005a00ff00be008f006f0081
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_1 = 00de002b0087002c0000009500bb009e003c001a001a00100066006a0093006c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_1 = 00c1009000ac007d000b00fa004f004200b300e5003000b30061008a008b0065
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_1 = 008a004d001b0081008d00990000007400130097001a003200e500d900600090
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_1 = 006a00a9001600b400bd0001001a00be00fc001f00c500e300a400a5008500f5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_1 = 002b0089002f005c0014001a0045009900920093007300b000bb00d400840084
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_1 = 004e002b0020006c002a0016000100cf0031008c008100d8007600b8006800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_1 = 0086000d00fb006d000f005400590078009d00f40004003400ce00bc00df003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_1 = 00d000330001005f002b00ca005300b70020004f00de007e003000a600990087
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_1 = 00c800f5004500160035001300e800fc0051006800a30017008900e1002100be
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_1 = 00cd00840011002c00a900f000010081003b00580097004e00b100990018001f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_1 = 0033006c00a000c200cf005f00070042008d004f0012005b00f2003e00360071
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_1 = 005b00d80000004d0064008300c000d0009e0059008200cc00f4000c00110025
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_1 = 009100b8006b00a100fe000e003100f80069009b00c100f5006100d900e700b2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_1 = 00b500cd00c7005e005d0093000500b9004c008f007600b6000400900022001b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_1 = 002100a900a00030006c007b00b800bc00270074007300a1009000d200cf00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_1 = 002d005d00e4002e0083008800a9006e005c00760027006300210078009c00c4
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_1 = 00f30060006600840009006800f200ab00e700ff00c8003e00500033004100fe
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16M_1 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_1 = 00c9009f002200af00290084009900c6005d00fa00cc009400840050009100f8
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_1 = 00eb006f00fd004300a000de0037004600d300e80007002600aa00b000b60091
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_1 = 00530011000600a400ee0004003b00cd0075009b00da00e100ed003000e7002f
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_1 = 001900a200120089008000c4008100ba004e003f004600290055005c00ac0037
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_1 = 00c500e700b1004700ab00a90016006100b9007800c800cd00b900c5002300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_2 = 00dd008a00ab001f0013000900a400bf00d7003a000e001f005c000800440018
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_2 = 00ef00cf00ac006f00ca001d00be008c00820090009c005b00660053005400f2
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_2 = 006c00380067006c009e00d3008800ec00af00fa008f008a00a800b6008400bf
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_2 = 00dd007700ca00b600cc00d800c300ac001600d600b60070007a00ba006c0024
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_2 = 005300b800f9009b001800f600e1005f0020002700da00e3000b00360085001f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_2 = 001f003e001700a3003d005200d700c9007100ef007e004c00e9006900b10054
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_2 = 00ff00080096009800460077009200e6009500d000d900fa00b500a600ca00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_2 = 005c0040004000a8000500d5002e00eb009b00b9005d002b006900670080008c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_2 = 00e900be004e00110068009e00f60078003100d8000b006d00bc00f6003300ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_2 = 002400ff005f009600a200890004007f00e300740088000100f10040001f0096
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_2 = 001000c9004c0078000e00e2007600ff0031008500d2005d00ff0013003a0034
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_2 = 00a20025009000590041006400b900ff00d30091003d005900e4001d003b0076
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_2 = 0016004600ca0098001c00b5004c00c4000900c100e1009a00f000ed00950057
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_2 = 003c001500b600bd00a400e000da00d10000003e00e900a8007f004d005a000d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_2 = 0021003900dd000a0088001600d000d6006d0008009000b400ac009e001d00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_2 = 003b00b4007600a60064008e0030008500a6008000da009e0099000d007f0024
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_2 = 00ac00460091003d0087008f00c300bf00ca00e0002c004a00b1000200d30076
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_2 = 002c0062006700f90002004300b1008300bb00e500ed00bb000400bd00b600d1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_2 = 00d000a100ea007b0072008e002100a200ae003800cf001400d00056007a00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_2 = 00ec0054000200bf00d800b7008300ab00b900c900ad002700ba009600de00f1
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_1 = 008f00ce004300dd003500a9004700ea00b200ef00c5008b003e00c4001900e0
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_1 = 00d900c700ef008a00e500b800f5003900a900ae000200d7005d00740069001b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_1 = 008a00d00087004800ff009600e2007300590084005100b900b400c400b000cd
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_1 = 0076009500710087000a005100cd00f100f700d00036006600ff001f00ba00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_1 = 007700eb004d009a005b00af008c00d100bd005700f6008b009a00ce003800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_2 = 004900f500c80046005200600077009b00e40077006b004b00fd003600b7006c
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_2 = 0069006200e60047005e00c0002d00d40091009200db00bf00b3004d008200aa
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_2 = 00e0000e00d2005f008c00bb00c500280015004800ce00b00019003f008000b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_2 = 003c000800ec00520008000d005700f900fd00dd009d00f20045005800c9005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_2 = 000a00da008b00f9007e00c600be000d0067009800fd004b0028003300fd00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_2 = 0091004c00e6001e009900c4000b002f009100ea00b6004e0087009900bf0069
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_2 = 007d008f005b00a9001c005a00cc00ec008700f2007200df004e008f008f00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_2 = 003400de00d800a70059005e00990001002c00d600f30023004d004500e50052
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_2 = 009500510002000700f4008e00b50056009c0025002a008f00e700f7008c0056
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_2 = 007c00a200a0009e001e005500df00c4002200ab00cc003600d000b0002e00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_2 = 00c300700021007a000d005e002a0021002a00cf002500ec007400d2007f0058
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_2 = 00060066000900cd001a0068008300a0007300fb0045009d00ec00a500fe00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_2 = 003c00730041002500e700c700c800c700250021009800bb004000f2004e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_2 = 001d00bf006700a900a900a600f600600078007800210061007e0086003900af
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_2 = 0093000600ee00b500ae0062003f000900c200230055002f008a00450088003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_2 = 002d005f002f0074009200b6006000f500820030008e00050071006f005300c9
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_2 = 0062002b00ee004b002c00b40013001d00e100df003e00870031000500620076
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_2 = 00d0000300ed005a00060051005200740020003c002a00d0005400f1006d0052
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_2 = 00a00078009500fb00980061006900cc003500eb005100c6001a00eb006300a3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_2 = 00780037008800c900e6004e004f00e5003f00dd009b002b000c003800de00d8
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16M_2 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_2 = 009200dd00ac0021006f008f004b0025004300b400e600a8005b00b40080007d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_2 = 008a00c8004100fa00c500cd00c600060079006d007a00b100610031000000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_2 = 000b00dc00d7000d000900d600b300b300f8005300be00d0006400c000e6005e
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_2 = 0043003b007f00a9006d00f400a30063002300880049004e009500e2003500c9
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_2 = 009000fe00880077004c007900f30079003e00b600b1003c00ab009f00650037
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_2 = 00f200f400a50024006c0018005d00dd00a2005f005f009800cd00bf00df00b4
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_2 = 00c4002a00890059004c005600e000ab0082009f00840094002d00f100f0004c
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_2 = 005400ef00c100b6001900920004006800de007500f00004004100fb00dd009b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_2 = 003100a700f700ed001800c4005e006500ad009f00a2002600020084008a0014
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_2 = 00f900da00300014001f004300f7001f005f000f007500fe00c200f4005400c7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_2 = 0035004c007f009f00200096005a00ec00ce00f30093001f004300a4006a007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_2 = 0022009e0028002100f0002b003500d6003d000f00d8007e00a500d500e80001
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_2 = 008300b9007800cf0040006b00ae000700fc00b700dd00e90096005c001100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_2 = 004100d500a9001c0029009100150076000000c100c5001c001f0098008d0065
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_2 = 002a00ff00b00071000f0068009300330091000900ef007c007800e6006e0037
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_2 = 005a004c003f00af003900a40039009c002b00780058002b000300c8007400a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_2 = 00430091006100c30098005f00d900a000b10047007200cf0003000300bc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_2 = 00e9006c00670035008e00ec006a00ae00920086005400bc009f006800b6008b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_2 = 006f00ad002400680014003400c2006f0036002900e700c500a2001e008100ed
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_2 = 002200f600960039001100ea002600a4005200b7009d0018007b00f5009400f9
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_2 = 000800e00022009c00fa00d2007d00e200b7008b00f200a80016001b00d40031
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_2 = 00f500e800f70058008f00ff007d00cc00fc000800bc007100d7001200a40005
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_2 = 008a006c00da001700150009007d002500770030002d00b200ab00e100f30085
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_2 = 00f5003200e90056009200f300e500da004000a700710036009300820031003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_2 = 005900b5004b0076003100be00580067009e009000fb00f400740046002100ce
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_2 = 005d005200aa00bb00ab004700770074003d00ee008100b3007800800095006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_2 = 00230086005c005300bf008b005000740093002800fc00b500830086004c00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_2 = 00200012004e001f00080058004c0010001500e5007800be00c4000f00f4009c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_2 = 0083003d006e0010001600180097006900eb0030007e0015008e00c100ce00ca
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_2 = 00ae00c900fe007a003400e5007e0060004c006900aa00c4009e001000b0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_2 = 002600d900f500d3005b0016001f00fe00390045002b00cf00df00a1005c007b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_2 = 007600cc001600fc0064001700e0007b00c8007700380001009700930022002f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_2 = 00950020000e00020067009000790022001500b300f9003b008d00c800c30097
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_2 = 00090011001800c7000600de003000c200140074006f00c600b900e6001900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_2 = 00cb009d004b00cb003800b500fc0080006300e800fa004400da000300d30021
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_2 = 00e000dd00ce00fe00fe00ef007100fe00f7002700fa00cf00d1007e0026006a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_2 = 00610083004e002f00e80006008500dc005c00d0001a00ac00a0009800750098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_2 = 008f00610016009e00880057006800fa000e002f007d00a6005c0080009a00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_2 = 00c10022004b00f400f9007a002b0029005a000d001f0073003f000500540092
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_2 = 00ff002100f9000000d7008900be00e2006d001100ed00f100df00c900d5000c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_2 = 008600a7003900a400600086005b00a6001b001c00f700d000db0061002900ec
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_2 = 0093001200220071009b000d00e500ef0090003b0075000e00190097000b00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_2 = 0041003400b9004d00d600d4003200dd009600b900c1002c002600f300560057
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_2 = 003c00bd00a400c0007600c400dc004e0095008f003d003700fb0036009800e2
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_2 = 00b6004000b600e500db008f00ef0013002200ff006f00ea006700660073007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_2 = 001c00cd004300c000c100b500fe001900df00dd00e300030076004600370068
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_2 = 00bf002a0073005500c300ee00370016004400ea008000f000ed00ac009500ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_2 = 005d00d100bb00ec007500440091002100a000a400b4001500d00026004d00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_2 = 005300f000d6007500ba00e8002a003700bc008a00ea002d00b8005b002f0032
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_2 = 00fb0084000800cd00bc00e500e100400027008300a9009000f700ae009800d9
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16M_2 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_2 = 00df00a300c3006b00c8001600a0006a0083000400e800f6002500a6009200f6
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_2 = 00a600cd00b300b9009300fc0006005800ab0087006c00b500ed006a0093001a
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_2 = 00ea008f00b600c80076009b001c0077003900df002100c700fe005700b90034
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_2 = 00b600b500990085000e002700b000d900ed00ff008e00d300e2006400a800fe
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_2 = 00150098000600ca00fe00e000070030000a00b800c100f000e400a70090008d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_2 = 00f7005a00b80086006000bf008e00030075002a009f0028008d00dc000700bf
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_2 = 0001000200ad0013000d00ed00db00a4009000b100970005005c009c0019006b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_2 = 0084003400c300d6008500a9005800f3005a00cd009f00cf00fb008b00590094
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_2 = 001700a6006d004500a5003c000300b5000a004d00b200ab0061002000b80072
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_2 = 00da00fb007e0053005200fe00b400f8000400d70045000c00b1007d003e003f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_2 = 00ae005a00d200e1005d000100930005007100df0040001800b90086005e00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_2 = 00cf000400b500890037009700e2000a00450014002700d000cf007f00c20070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_2 = 00ce00a1002f001400ce00aa002b00ae00ed0079007800fa00d200ed00fd00f1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_2 = 000400b2005a001100960044006a00b900e100b4001b00da000600f800ee0007
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_2 = 0069008e005a0026008c00b9004d00f8000d004c00f100ed00cd00aa003500da
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_2 = 002000ab00a8004d001f00f7004900800020006f00870026003a00e100dd00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_2 = 00e0004f005f001100f900c80012006f003e0086000700860003008a00c6009b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_2 = 006a0032008e00150040007500a900320063003f008c00d50004001d0056002a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_2 = 0056006800e800c700c200ae0027005f007c00cc00d600eb005800410048002e
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_2 = 004a009100d8000f005700ec004b00dd007c00a600b6004600e400d0004000c8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_2 = 00c4002000c40045008200a6005900eb003e006000db00010003000900df00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_2 = 00ee00de006100ad00a2006000fe00ef001300eb0027008500d500f100a500ec
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_2 = 0011003800fc00a700560089004c00d500a9004a003e0016001200f1004600ae
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_2 = 006d00220062005600f5008d008600ca00060008003c008a008100f6005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_2 = 005a00dc000a00a800590009001f003c00cb0021009c0087004b00b300890013
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_2 = 002a00100066009e008c005400a1001100fd00f30099000d003400f600ea00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_2 = 0089005d00d900c100fd00e90042005100c500bb0003003b002a002800db0014
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_2 = 00d000e000df0087004a001800a700cd004c003200b5005d00e2009c00e50039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_2 = 0096008a00bd00f100c100610049004c005b00d4008a00dd001d00a8005300f7
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_2 = 00a000c7008500e400a20075008d001d009900cc000400560090004700ca000a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_2 = 00ea0092004f00cd00ba0000007c003e0056004c007200a4009900dc00280067
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_2 = 00550090005f004c005e007600ab008700a70033004b004a003e00740043003e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_2 = 00e900cc002a00fb006c0054008300b8007500b7005a00ff00be008f006f0081
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_2 = 00de002b0087002c0000009500bb009e003c001a001a00100066006a0093006c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_2 = 00c1009000ac007d000b00fa004f004200b300e5003000b30061008a008b0065
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_2 = 008a004d001b0081008d00990000007400130097001a003200e500d900600090
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_2 = 006a00a9001600b400bd0001001a00be00fc001f00c500e300a400a5008500f5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_2 = 002b0089002f005c0014001a0045009900920093007300b000bb00d400840084
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_2 = 004e002b0020006c002a0016000100cf0031008c008100d8007600b8006800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_2 = 0086000d00fb006d000f005400590078009d00f40004003400ce00bc00df003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_2 = 00d000330001005f002b00ca005300b70020004f00de007e003000a600990087
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_2 = 00c800f5004500160035001300e800fc0051006800a30017008900e1002100be
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_2 = 00cd00840011002c00a900f000010081003b00580097004e00b100990018001f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_2 = 0033006c00a000c200cf005f00070042008d004f0012005b00f2003e00360071
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_2 = 005b00d80000004d0064008300c000d0009e0059008200cc00f4000c00110025
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_2 = 009100b8006b00a100fe000e003100f80069009b00c100f5006100d900e700b2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_2 = 00b500cd00c7005e005d0093000500b9004c008f007600b6000400900022001b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_2 = 002100a900a00030006c007b00b800bc00270074007300a1009000d200cf00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_2 = 002d005d00e4002e0083008800a9006e005c00760027006300210078009c00c4
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_2 = 00f30060006600840009006800f200ab00e700ff00c8003e00500033004100fe
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16M_2 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_2 = 00c9009f002200af00290084009900c6005d00fa00cc009400840050009100f8
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_2 = 00eb006f00fd004300a000de0037004600d300e80007002600aa00b000b60091
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_2 = 00530011000600a400ee0004003b00cd0075009b00da00e100ed003000e7002f
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_2 = 001900a200120089008000c4008100ba004e003f004600290055005c00ac0037
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_2 = 00c500e700b1004700ab00a90016006100b9007800c800cd00b900c5002300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_3 = 00dd008a00ab001f0013000900a400bf00d7003a000e001f005c000800440018
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_3 = 00ef00cf00ac006f00ca001d00be008c00820090009c005b00660053005400f2
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_3 = 006c00380067006c009e00d3008800ec00af00fa008f008a00a800b6008400bf
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_3 = 00dd007700ca00b600cc00d800c300ac001600d600b60070007a00ba006c0024
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_3 = 005300b800f9009b001800f600e1005f0020002700da00e3000b00360085001f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_3 = 001f003e001700a3003d005200d700c9007100ef007e004c00e9006900b10054
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_3 = 00ff00080096009800460077009200e6009500d000d900fa00b500a600ca00e5
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_3 = 005c0040004000a8000500d5002e00eb009b00b9005d002b006900670080008c
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_3 = 00e900be004e00110068009e00f60078003100d8000b006d00bc00f6003300ea
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_3 = 002400ff005f009600a200890004007f00e300740088000100f10040001f0096
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_3 = 001000c9004c0078000e00e2007600ff0031008500d2005d00ff0013003a0034
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_3 = 00a20025009000590041006400b900ff00d30091003d005900e4001d003b0076
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_3 = 0016004600ca0098001c00b5004c00c4000900c100e1009a00f000ed00950057
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_3 = 003c001500b600bd00a400e000da00d10000003e00e900a8007f004d005a000d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_3 = 0021003900dd000a0088001600d000d6006d0008009000b400ac009e001d00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_3 = 003b00b4007600a60064008e0030008500a6008000da009e0099000d007f0024
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_3 = 00ac00460091003d0087008f00c300bf00ca00e0002c004a00b1000200d30076
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_3 = 002c0062006700f90002004300b1008300bb00e500ed00bb000400bd00b600d1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_3 = 00d000a100ea007b0072008e002100a200ae003800cf001400d00056007a00d5
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_3 = 00ec0054000200bf00d800b7008300ab00b900c900ad002700ba009600de00f1
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_2 = 008f00ce004300dd003500a9004700ea00b200ef00c5008b003e00c4001900e0
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_2 = 00d900c700ef008a00e500b800f5003900a900ae000200d7005d00740069001b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_2 = 008a00d00087004800ff009600e2007300590084005100b900b400c400b000cd
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_2 = 0076009500710087000a005100cd00f100f700d00036006600ff001f00ba00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_2 = 007700eb004d009a005b00af008c00d100bd005700f6008b009a00ce003800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16M_3 = 004900f500c80046005200600077009b00e40077006b004b00fd003600b7006c
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16M_3 = 0069006200e60047005e00c0002d00d40091009200db00bf00b3004d008200aa
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16M_3 = 00e0000e00d2005f008c00bb00c500280015004800ce00b00019003f008000b1
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16M_3 = 003c000800ec00520008000d005700f900fd00dd009d00f20045005800c9005f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16M_3 = 000a00da008b00f9007e00c600be000d0067009800fd004b0028003300fd00f2
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16M_3 = 0091004c00e6001e009900c4000b002f009100ea00b6004e0087009900bf0069
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16M_3 = 007d008f005b00a9001c005a00cc00ec008700f2007200df004e008f008f00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16M_3 = 003400de00d800a70059005e00990001002c00d600f30023004d004500e50052
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16M_3 = 009500510002000700f4008e00b50056009c0025002a008f00e700f7008c0056
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16M_3 = 007c00a200a0009e001e005500df00c4002200ab00cc003600d000b0002e00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16M_3 = 00c300700021007a000d005e002a0021002a00cf002500ec007400d2007f0058
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16M_3 = 00060066000900cd001a0068008300a0007300fb0045009d00ec00a500fe00c5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16M_3 = 003c00730041002500e700c700c800c700250021009800bb004000f2004e006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16M_3 = 001d00bf006700a900a900a600f600600078007800210061007e0086003900af
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16M_3 = 0093000600ee00b500ae0062003f000900c200230055002f008a00450088003c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16M_3 = 002d005f002f0074009200b6006000f500820030008e00050071006f005300c9
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16M_3 = 0062002b00ee004b002c00b40013001d00e100df003e00870031000500620076
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16M_3 = 00d0000300ed005a00060051005200740020003c002a00d0005400f1006d0052
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16M_3 = 00a00078009500fb00980061006900cc003500eb005100c6001a00eb006300a3
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16M_3 = 00780037008800c900e6004e004f00e5003f00dd009b002b000c003800de00d8
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16M_3 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_3 = 009200dd00ac0021006f008f004b0025004300b400e600a8005b00b40080007d
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_3 = 008a00c8004100fa00c500cd00c600060079006d007a00b100610031000000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_3 = 000b00dc00d7000d000900d600b300b300f8005300be00d0006400c000e6005e
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_3 = 0043003b007f00a9006d00f400a30063002300880049004e009500e2003500c9
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_3 = 009000fe00880077004c007900f30079003e00b600b1003c00ab009f00650037
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_3 = 00f200f400a50024006c0018005d00dd00a2005f005f009800cd00bf00df00b4
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_3 = 00c4002a00890059004c005600e000ab0082009f00840094002d00f100f0004c
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_3 = 005400ef00c100b6001900920004006800de007500f00004004100fb00dd009b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_3 = 003100a700f700ed001800c4005e006500ad009f00a2002600020084008a0014
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_3 = 00f900da00300014001f004300f7001f005f000f007500fe00c200f4005400c7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_3 = 0035004c007f009f00200096005a00ec00ce00f30093001f004300a4006a007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_3 = 0022009e0028002100f0002b003500d6003d000f00d8007e00a500d500e80001
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_3 = 008300b9007800cf0040006b00ae000700fc00b700dd00e90096005c001100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_3 = 004100d500a9001c0029009100150076000000c100c5001c001f0098008d0065
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_3 = 002a00ff00b00071000f0068009300330091000900ef007c007800e6006e0037
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_3 = 005a004c003f00af003900a40039009c002b00780058002b000300c8007400a3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_3 = 00430091006100c30098005f00d900a000b10047007200cf0003000300bc0016
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_3 = 00e9006c00670035008e00ec006a00ae00920086005400bc009f006800b6008b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_3 = 006f00ad002400680014003400c2006f0036002900e700c500a2001e008100ed
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_3 = 002200f600960039001100ea002600a4005200b7009d0018007b00f5009400f9
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_3 = 000800e00022009c00fa00d2007d00e200b7008b00f200a80016001b00d40031
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_3 = 00f500e800f70058008f00ff007d00cc00fc000800bc007100d7001200a40005
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_3 = 008a006c00da001700150009007d002500770030002d00b200ab00e100f30085
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_3 = 00f5003200e90056009200f300e500da004000a700710036009300820031003a
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_3 = 005900b5004b0076003100be00580067009e009000fb00f400740046002100ce
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16M_3 = 005d005200aa00bb00ab004700770074003d00ee008100b3007800800095006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16M_3 = 00230086005c005300bf008b005000740093002800fc00b500830086004c00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16M_3 = 00200012004e001f00080058004c0010001500e5007800be00c4000f00f4009c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16M_3 = 0083003d006e0010001600180097006900eb0030007e0015008e00c100ce00ca
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16M_3 = 00ae00c900fe007a003400e5007e0060004c006900aa00c4009e001000b0003a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16M_3 = 002600d900f500d3005b0016001f00fe00390045002b00cf00df00a1005c007b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16M_3 = 007600cc001600fc0064001700e0007b00c8007700380001009700930022002f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16M_3 = 00950020000e00020067009000790022001500b300f9003b008d00c800c30097
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16M_3 = 00090011001800c7000600de003000c200140074006f00c600b900e6001900a0
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16M_3 = 00cb009d004b00cb003800b500fc0080006300e800fa004400da000300d30021
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16M_3 = 00e000dd00ce00fe00fe00ef007100fe00f7002700fa00cf00d1007e0026006a
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16M_3 = 00610083004e002f00e80006008500dc005c00d0001a00ac00a0009800750098
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16M_3 = 008f00610016009e00880057006800fa000e002f007d00a6005c0080009a00e1
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16M_3 = 00c10022004b00f400f9007a002b0029005a000d001f0073003f000500540092
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16M_3 = 00ff002100f9000000d7008900be00e2006d001100ed00f100df00c900d5000c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16M_3 = 008600a7003900a400600086005b00a6001b001c00f700d000db0061002900ec
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16M_3 = 0093001200220071009b000d00e500ef0090003b0075000e00190097000b00e6
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16M_3 = 0041003400b9004d00d600d4003200dd009600b900c1002c002600f300560057
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16M_3 = 003c00bd00a400c0007600c400dc004e0095008f003d003700fb0036009800e2
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16M_3 = 00b6004000b600e500db008f00ef0013002200ff006f00ea006700660073007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16M_3 = 001c00cd004300c000c100b500fe001900df00dd00e300030076004600370068
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16M_3 = 00bf002a0073005500c300ee00370016004400ea008000f000ed00ac009500ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16M_3 = 005d00d100bb00ec007500440091002100a000a400b4001500d00026004d00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16M_3 = 005300f000d6007500ba00e8002a003700bc008a00ea002d00b8005b002f0032
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16M_3 = 00fb0084000800cd00bc00e500e100400027008300a9009000f700ae009800d9
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16M_3 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_3 = 00df00a300c3006b00c8001600a0006a0083000400e800f6002500a6009200f6
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_3 = 00a600cd00b300b9009300fc0006005800ab0087006c00b500ed006a0093001a
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_3 = 00ea008f00b600c80076009b001c0077003900df002100c700fe005700b90034
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_3 = 00b600b500990085000e002700b000d900ed00ff008e00d300e2006400a800fe
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_3 = 00150098000600ca00fe00e000070030000a00b800c100f000e400a70090008d
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_3 = 00f7005a00b80086006000bf008e00030075002a009f0028008d00dc000700bf
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_3 = 0001000200ad0013000d00ed00db00a4009000b100970005005c009c0019006b
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_3 = 0084003400c300d6008500a9005800f3005a00cd009f00cf00fb008b00590094
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_3 = 001700a6006d004500a5003c000300b5000a004d00b200ab0061002000b80072
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_3 = 00da00fb007e0053005200fe00b400f8000400d70045000c00b1007d003e003f
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_3 = 00ae005a00d200e1005d000100930005007100df0040001800b90086005e00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_3 = 00cf000400b500890037009700e2000a00450014002700d000cf007f00c20070
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_3 = 00ce00a1002f001400ce00aa002b00ae00ed0079007800fa00d200ed00fd00f1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_3 = 000400b2005a001100960044006a00b900e100b4001b00da000600f800ee0007
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_3 = 0069008e005a0026008c00b9004d00f8000d004c00f100ed00cd00aa003500da
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_3 = 002000ab00a8004d001f00f7004900800020006f00870026003a00e100dd00b6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_3 = 00e0004f005f001100f900c80012006f003e0086000700860003008a00c6009b
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_3 = 006a0032008e00150040007500a900320063003f008c00d50004001d0056002a
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_3 = 0056006800e800c700c200ae0027005f007c00cc00d600eb005800410048002e
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_3 = 004a009100d8000f005700ec004b00dd007c00a600b6004600e400d0004000c8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_3 = 00c4002000c40045008200a6005900eb003e006000db00010003000900df00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_3 = 00ee00de006100ad00a2006000fe00ef001300eb0027008500d500f100a500ec
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_3 = 0011003800fc00a700560089004c00d500a9004a003e0016001200f1004600ae
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_3 = 006d00220062005600f5008d008600ca00060008003c008a008100f6005000e6
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_3 = 005a00dc000a00a800590009001f003c00cb0021009c0087004b00b300890013
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16M_3 = 002a00100066009e008c005400a1001100fd00f30099000d003400f600ea00cd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16M_3 = 0089005d00d900c100fd00e90042005100c500bb0003003b002a002800db0014
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16M_3 = 00d000e000df0087004a001800a700cd004c003200b5005d00e2009c00e50039
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16M_3 = 0096008a00bd00f100c100610049004c005b00d4008a00dd001d00a8005300f7
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16M_3 = 00a000c7008500e400a20075008d001d009900cc000400560090004700ca000a
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16M_3 = 00ea0092004f00cd00ba0000007c003e0056004c007200a4009900dc00280067
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16M_3 = 00550090005f004c005e007600ab008700a70033004b004a003e00740043003e
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16M_3 = 00e900cc002a00fb006c0054008300b8007500b7005a00ff00be008f006f0081
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16M_3 = 00de002b0087002c0000009500bb009e003c001a001a00100066006a0093006c
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16M_3 = 00c1009000ac007d000b00fa004f004200b300e5003000b30061008a008b0065
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16M_3 = 008a004d001b0081008d00990000007400130097001a003200e500d900600090
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16M_3 = 006a00a9001600b400bd0001001a00be00fc001f00c500e300a400a5008500f5
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16M_3 = 002b0089002f005c0014001a0045009900920093007300b000bb00d400840084
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16M_3 = 004e002b0020006c002a0016000100cf0031008c008100d8007600b8006800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16M_3 = 0086000d00fb006d000f005400590078009d00f40004003400ce00bc00df003c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16M_3 = 00d000330001005f002b00ca005300b70020004f00de007e003000a600990087
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16M_3 = 00c800f5004500160035001300e800fc0051006800a30017008900e1002100be
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16M_3 = 00cd00840011002c00a900f000010081003b00580097004e00b100990018001f
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16M_3 = 0033006c00a000c200cf005f00070042008d004f0012005b00f2003e00360071
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16M_3 = 005b00d80000004d0064008300c000d0009e0059008200cc00f4000c00110025
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16M_3 = 009100b8006b00a100fe000e003100f80069009b00c100f5006100d900e700b2
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16M_3 = 00b500cd00c7005e005d0093000500b9004c008f007600b6000400900022001b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16M_3 = 002100a900a00030006c007b00b800bc00270074007300a1009000d200cf00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16M_3 = 002d005d00e4002e0083008800a9006e005c00760027006300210078009c00c4
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16M_3 = 00f30060006600840009006800f200ab00e700ff00c8003e00500033004100fe
 
 OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16M_3 = 00ef009a00500067003f004b008c000400bf001700fd0015008400a900b700b1
 
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_3 = 00c9009f002200af00290084009900c6005d00fa00cc009400840050009100f8
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_3 = 00eb006f00fd004300a000de0037004600d300e80007002600aa00b000b60091
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_3 = 00530011000600a400ee0004003b00cd0075009b00da00e100ed003000e7002f
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_3 = 001900a200120089008000c4008100ba004e003f004600290055005c00ac0037
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_3 = 00c500e700b1004700ab00a90016006100b9007800c800cd00b900c5002300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_0 = 00b50006009300290010006d006100ab00b000e000c500580007004800ad0024
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_0 = 0002003a00f9006700f200c3000c00a700bd00a8006400ec008900ff00d800f7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_0 = 0013009c00f90078002a004f00c0004400ad008c006600fe00740064002400a5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_0 = 00000057006b00f500c100e000f400eb00ee00a70060001d009400b100130043
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_0 = 004600b30004006300ca008600120001003600d4009d00dc00d200670046008c
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_0 = 004d003e00aa003b0063000d00d4001900c000f500b300b200b9006800e8007d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_0 = 00ea0076007a001800f10032006700c9005f00a400bc001600be00c100cc000b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_0 = 00d400bf003800e600580032000c00b6001700ff002400e000760082004b0017
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_0 = 004c008600e30024009e00b9005700dd002b006600ab003e00ec00ee00580058
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_0 = 00d2005c009500bb000b006c001700ba003b00c900ce006900dc00f50059005e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_0 = 00b100e200dd00d000a90097002900c000a1000e0016004c00ef001c0089008f
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_0 = 008000d7005c00bf0014003e001a003b00c00057008e001500f5001200010032
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_0 = 00b200be004200b70067004500e6005600a9008c00a700f5008500270090007d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_0 = 007f00ca0088001f001100d600d300ee00050082004d00f3002b00a3003a00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_0 = 00a700d20046006c0011008e001f00980068003b0095009000c0005300a700e1
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_0 = 00ae0009009c005d0083005f0074005c00d1001300ff00d30024003a0008000c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_0 = 006600e0005c004e0075003100940091006c0066008d0051006b009700b2005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_0 = 00da00f500b70014000500b700010012006d00910024001500010039002e00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_0 = 001f00f0007e007f00af0025009900f40057006c00b8005f00ac001b009f0009
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_0 = 006800ad00ba009b00c10019002000d9002c005f00920090006a0023001c0095
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_0 = 008e003100ff008c00e50061007b005700b5005500f600710053009800b5001e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_0 = 00e10049009f00400075006d0057009c000a002700030071007200c000e40074
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_0 = 0091007c002d007100cb000c002c007100e600a200c9002c006800b700f7004b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_0 = 00d600c20015007700ce0090003500bc00fd000600f3007500bf00e7002d0086
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_0 = 000d00dc0059001400fa00f600c500ec003c00b900be00b7003b0033000000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_0 = 0060005400930067001d000a00c300b500d100a200e300cd001c00e3000b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_0 = 00b000fc005100ea00430022002700260034002400de0003005a0031009000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_0 = 00ff00f7009900ae00e100ab00d900f100c100330069009000b500670009004a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_0 = 0089009a0085007700f1005b0052008c004d005600b400d100ce001400e600a3
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_0 = 0089006c00d900e400cc004700bf00df007900b300d100f500300079004f0060
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_0 = 0033003f00de008f002b00b4009c002a00ab00b600ed0039008a004d00ea00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_0 = 0024000c008f001d008900130086009b00ec00ca002b00c400f20071007c00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_0 = 00a20058006900bd00ea009700d8005c00e600020075007a00de000e00c60016
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_0 = 006d00de004c00a8008000cf001a00bc005400c9008a009d00b6006c009b00b9
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_0 = 001d003900b5004a00c900b90070009c002900d8000700820086007600ba0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_0 = 00f400aa00a500bc00ed00bb00c400a0005100e20083006f000b00cf00e000ee
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_0 = 00f000ae007900eb00f60087005100ab0085009000e50042005a009900c30001
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_0 = 005500b600f7002e003400c300c3005000eb000a008b00b9009c006b0090001f
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_0 = 00b5001d001100e200ee002800b900d700f4000600c60031003100c600390032
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_0 = 002900ac001800a40085000800520000002a00f700b5009d00d6008800b100eb
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_0 = 00d000140016006800ec00af00bf00cb003c00e700a300010038004400b90003
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_0 = 00ec001600ca000c0073001100ea00330000009600df00380070007900ac00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_0 = 003d00f400e400d000fd0021005c000d00a3004e00f600c2004c001c001a000b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_0 = 000d002f008d00ce000100b0007c00c80017001400a30047009900e200c600ff
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_0 = 00b000e9004000b90034007b001b00390095008b001800f8009800e300590078
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_0 = 001700a900470095005f001a00f600eb004e00070032004a00e4007c006b0053
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_0 = 00fa00040080000100a800fe0041005c00c500aa00cb00d600ba00f2006a007e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_0 = 009f00ce00b700da008d0066008900df0044007c0098001e00b50042009100a0
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_0 = 00370051001600300035002700ca006a00ef005700e7000e006c0066002900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_0 = 00ba00ed005800fe00c20025006e002b005a00fa00ef00cd0009008b00ea0023
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_0 = 007e003900dd002b005f00160052002400e6006300fd00660024002900030002
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_0 = 005500a700da009b00540008005d0025001e000200690006006d004e00870099
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_0 = 0033004b00c9008b00f300e8000c00c300dc00d4002a0075000a00bd0071004b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_0 = 00bd006800d2001600db00db0000001a003300ab00f1003e005e005500ae008d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_0 = 00e8008f000d00d000130016005100d90091006e00b70096008800c3003b0075
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_0 = 004800bd000100d2006d0095002e0037003d008b00f700ee007b008c001c00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_0 = 0051001a00330084005a000f00e800a500cd008500f100a900860042006300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_0 = 0093008b00dc009100d700e400d9003700840064002500a90031005c00c6006d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_0 = 004a00fe00b700f10067004e00e0009500b7009b005100570068000c00d30018
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_0 = 006e007d00470026006f008100e800fa0089001800a8003c00e2003800b90046
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_0 = 002b007a001900160014005c002d001500b9009e00c700ed008b00a00033004c
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_0 = 006b00b200a7002e001a00ef00c9003600750018006f009a008a00f200a70097
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_0 = 00c9005000f50064002100950040004600a70073009e00610046008200a90097
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_0 = 00ee00d50047009600b0003800ee00e3000d00d3000f0015007300c5003500e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_0 = 00d700ca0010008000790057008e002a00e100ba0063009b0083000300540023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_0 = 002b003f0045006700a6004200be00e600fd007500a500c80094000b004e0039
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_0 = 0096009b003b00d1008c00e0004300d0003900c700ab0093003100f4002700a8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_0 = 00f600790070009b006200ef002d00fa00b300e20062003600fd0087001a009f
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_0 = 00690048008000ac0010002e0016004a005c00af0043007a00e20090001c004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_0 = 0013004c005e00e0006e002f00db001d00e6009500ce00e000ab00950018005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_0 = 004a00b8004f000b00c600a400a1000e00a1009c00a7009000e0005700bc004b
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_0 = 0004004c002a002b004a003a009000d2004b00f100d3008800960066007000c9
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_0 = 00b40057000c00b0006f006c009d002400b9001a00e000ac0098008f006b0045
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_0 = 0030002400c1003900d70025000700fd006400ed008a008900e500750031006c
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_0 = 0075004d0034003b007e00890024009d0076004f002b009400e100ab008b00db
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_0 = 003a005400fb0095007200aa00c8007b0039007e00b600e800d800f60075007a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_0 = 00a6000500a800ab00800024004000bd003000b00098004a00f2004a002200e4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_0 = 004600ee003f00ea002c000c00520077004e00de00160060009200c600110080
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_1 = 00b50006009300290010006d006100ab00b000e000c500580007004800ad0024
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_1 = 0002003a00f9006700f200c3000c00a700bd00a8006400ec008900ff00d800f7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_1 = 0013009c00f90078002a004f00c0004400ad008c006600fe00740064002400a5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_1 = 00000057006b00f500c100e000f400eb00ee00a70060001d009400b100130043
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_1 = 004600b30004006300ca008600120001003600d4009d00dc00d200670046008c
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_1 = 004d003e00aa003b0063000d00d4001900c000f500b300b200b9006800e8007d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_1 = 00ea0076007a001800f10032006700c9005f00a400bc001600be00c100cc000b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_1 = 00d400bf003800e600580032000c00b6001700ff002400e000760082004b0017
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_1 = 004c008600e30024009e00b9005700dd002b006600ab003e00ec00ee00580058
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_1 = 00d2005c009500bb000b006c001700ba003b00c900ce006900dc00f50059005e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_1 = 00b100e200dd00d000a90097002900c000a1000e0016004c00ef001c0089008f
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_1 = 008000d7005c00bf0014003e001a003b00c00057008e001500f5001200010032
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_1 = 00b200be004200b70067004500e6005600a9008c00a700f5008500270090007d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_1 = 007f00ca0088001f001100d600d300ee00050082004d00f3002b00a3003a00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_1 = 00a700d20046006c0011008e001f00980068003b0095009000c0005300a700e1
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_1 = 00ae0009009c005d0083005f0074005c00d1001300ff00d30024003a0008000c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_1 = 006600e0005c004e0075003100940091006c0066008d0051006b009700b2005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_1 = 00da00f500b70014000500b700010012006d00910024001500010039002e00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_1 = 001f00f0007e007f00af0025009900f40057006c00b8005f00ac001b009f0009
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_1 = 006800ad00ba009b00c10019002000d9002c005f00920090006a0023001c0095
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_1 = 008e003100ff008c00e50061007b005700b5005500f600710053009800b5001e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_1 = 00e10049009f00400075006d0057009c000a002700030071007200c000e40074
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_1 = 0091007c002d007100cb000c002c007100e600a200c9002c006800b700f7004b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_1 = 00d600c20015007700ce0090003500bc00fd000600f3007500bf00e7002d0086
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_1 = 000d00dc0059001400fa00f600c500ec003c00b900be00b7003b0033000000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_1 = 0060005400930067001d000a00c300b500d100a200e300cd001c00e3000b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_1 = 00b000fc005100ea00430022002700260034002400de0003005a0031009000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_1 = 00ff00f7009900ae00e100ab00d900f100c100330069009000b500670009004a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_1 = 0089009a0085007700f1005b0052008c004d005600b400d100ce001400e600a3
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_1 = 0089006c00d900e400cc004700bf00df007900b300d100f500300079004f0060
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_1 = 0033003f00de008f002b00b4009c002a00ab00b600ed0039008a004d00ea00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_1 = 0024000c008f001d008900130086009b00ec00ca002b00c400f20071007c00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_1 = 00a20058006900bd00ea009700d8005c00e600020075007a00de000e00c60016
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_1 = 006d00de004c00a8008000cf001a00bc005400c9008a009d00b6006c009b00b9
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_1 = 001d003900b5004a00c900b90070009c002900d8000700820086007600ba0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_1 = 00f400aa00a500bc00ed00bb00c400a0005100e20083006f000b00cf00e000ee
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_1 = 00f000ae007900eb00f60087005100ab0085009000e50042005a009900c30001
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_1 = 005500b600f7002e003400c300c3005000eb000a008b00b9009c006b0090001f
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_1 = 00b5001d001100e200ee002800b900d700f4000600c60031003100c600390032
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_1 = 002900ac001800a40085000800520000002a00f700b5009d00d6008800b100eb
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_1 = 00d000140016006800ec00af00bf00cb003c00e700a300010038004400b90003
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_1 = 00ec001600ca000c0073001100ea00330000009600df00380070007900ac00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_1 = 003d00f400e400d000fd0021005c000d00a3004e00f600c2004c001c001a000b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_1 = 000d002f008d00ce000100b0007c00c80017001400a30047009900e200c600ff
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_1 = 00b000e9004000b90034007b001b00390095008b001800f8009800e300590078
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_1 = 001700a900470095005f001a00f600eb004e00070032004a00e4007c006b0053
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_1 = 00fa00040080000100a800fe0041005c00c500aa00cb00d600ba00f2006a007e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_1 = 009f00ce00b700da008d0066008900df0044007c0098001e00b50042009100a0
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_1 = 00370051001600300035002700ca006a00ef005700e7000e006c0066002900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_1 = 00ba00ed005800fe00c20025006e002b005a00fa00ef00cd0009008b00ea0023
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_1 = 007e003900dd002b005f00160052002400e6006300fd00660024002900030002
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_1 = 005500a700da009b00540008005d0025001e000200690006006d004e00870099
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_1 = 0033004b00c9008b00f300e8000c00c300dc00d4002a0075000a00bd0071004b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_1 = 00bd006800d2001600db00db0000001a003300ab00f1003e005e005500ae008d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_1 = 00e8008f000d00d000130016005100d90091006e00b70096008800c3003b0075
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_1 = 004800bd000100d2006d0095002e0037003d008b00f700ee007b008c001c00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_1 = 0051001a00330084005a000f00e800a500cd008500f100a900860042006300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_1 = 0093008b00dc009100d700e400d9003700840064002500a90031005c00c6006d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_1 = 004a00fe00b700f10067004e00e0009500b7009b005100570068000c00d30018
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_1 = 006e007d00470026006f008100e800fa0089001800a8003c00e2003800b90046
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_1 = 002b007a001900160014005c002d001500b9009e00c700ed008b00a00033004c
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_1 = 006b00b200a7002e001a00ef00c9003600750018006f009a008a00f200a70097
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_1 = 00c9005000f50064002100950040004600a70073009e00610046008200a90097
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_1 = 00ee00d50047009600b0003800ee00e3000d00d3000f0015007300c5003500e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_1 = 00d700ca0010008000790057008e002a00e100ba0063009b0083000300540023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_1 = 002b003f0045006700a6004200be00e600fd007500a500c80094000b004e0039
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_1 = 0096009b003b00d1008c00e0004300d0003900c700ab0093003100f4002700a8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_1 = 00f600790070009b006200ef002d00fa00b300e20062003600fd0087001a009f
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_1 = 00690048008000ac0010002e0016004a005c00af0043007a00e20090001c004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_1 = 0013004c005e00e0006e002f00db001d00e6009500ce00e000ab00950018005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_1 = 004a00b8004f000b00c600a400a1000e00a1009c00a7009000e0005700bc004b
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_1 = 0004004c002a002b004a003a009000d2004b00f100d3008800960066007000c9
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_1 = 00b40057000c00b0006f006c009d002400b9001a00e000ac0098008f006b0045
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_1 = 0030002400c1003900d70025000700fd006400ed008a008900e500750031006c
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_1 = 0075004d0034003b007e00890024009d0076004f002b009400e100ab008b00db
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_1 = 003a005400fb0095007200aa00c8007b0039007e00b600e800d800f60075007a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_1 = 00a6000500a800ab00800024004000bd003000b00098004a00f2004a002200e4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_1 = 004600ee003f00ea002c000c00520077004e00de00160060009200c600110080
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_2 = 00b50006009300290010006d006100ab00b000e000c500580007004800ad0024
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_2 = 0002003a00f9006700f200c3000c00a700bd00a8006400ec008900ff00d800f7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_2 = 0013009c00f90078002a004f00c0004400ad008c006600fe00740064002400a5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_2 = 00000057006b00f500c100e000f400eb00ee00a70060001d009400b100130043
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_2 = 004600b30004006300ca008600120001003600d4009d00dc00d200670046008c
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_2 = 004d003e00aa003b0063000d00d4001900c000f500b300b200b9006800e8007d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_2 = 00ea0076007a001800f10032006700c9005f00a400bc001600be00c100cc000b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_2 = 00d400bf003800e600580032000c00b6001700ff002400e000760082004b0017
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_2 = 004c008600e30024009e00b9005700dd002b006600ab003e00ec00ee00580058
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_2 = 00d2005c009500bb000b006c001700ba003b00c900ce006900dc00f50059005e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_2 = 00b100e200dd00d000a90097002900c000a1000e0016004c00ef001c0089008f
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_2 = 008000d7005c00bf0014003e001a003b00c00057008e001500f5001200010032
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_2 = 00b200be004200b70067004500e6005600a9008c00a700f5008500270090007d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_2 = 007f00ca0088001f001100d600d300ee00050082004d00f3002b00a3003a00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_2 = 00a700d20046006c0011008e001f00980068003b0095009000c0005300a700e1
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_2 = 00ae0009009c005d0083005f0074005c00d1001300ff00d30024003a0008000c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_2 = 006600e0005c004e0075003100940091006c0066008d0051006b009700b2005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_2 = 00da00f500b70014000500b700010012006d00910024001500010039002e00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_2 = 001f00f0007e007f00af0025009900f40057006c00b8005f00ac001b009f0009
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_2 = 006800ad00ba009b00c10019002000d9002c005f00920090006a0023001c0095
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_2 = 008e003100ff008c00e50061007b005700b5005500f600710053009800b5001e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_2 = 00e10049009f00400075006d0057009c000a002700030071007200c000e40074
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_2 = 0091007c002d007100cb000c002c007100e600a200c9002c006800b700f7004b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_2 = 00d600c20015007700ce0090003500bc00fd000600f3007500bf00e7002d0086
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_2 = 000d00dc0059001400fa00f600c500ec003c00b900be00b7003b0033000000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_2 = 0060005400930067001d000a00c300b500d100a200e300cd001c00e3000b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_2 = 00b000fc005100ea00430022002700260034002400de0003005a0031009000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_2 = 00ff00f7009900ae00e100ab00d900f100c100330069009000b500670009004a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_2 = 0089009a0085007700f1005b0052008c004d005600b400d100ce001400e600a3
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_2 = 0089006c00d900e400cc004700bf00df007900b300d100f500300079004f0060
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_2 = 0033003f00de008f002b00b4009c002a00ab00b600ed0039008a004d00ea00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_2 = 0024000c008f001d008900130086009b00ec00ca002b00c400f20071007c00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_2 = 00a20058006900bd00ea009700d8005c00e600020075007a00de000e00c60016
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_2 = 006d00de004c00a8008000cf001a00bc005400c9008a009d00b6006c009b00b9
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_2 = 001d003900b5004a00c900b90070009c002900d8000700820086007600ba0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_2 = 00f400aa00a500bc00ed00bb00c400a0005100e20083006f000b00cf00e000ee
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_2 = 00f000ae007900eb00f60087005100ab0085009000e50042005a009900c30001
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_2 = 005500b600f7002e003400c300c3005000eb000a008b00b9009c006b0090001f
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_2 = 00b5001d001100e200ee002800b900d700f4000600c60031003100c600390032
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_2 = 002900ac001800a40085000800520000002a00f700b5009d00d6008800b100eb
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_2 = 00d000140016006800ec00af00bf00cb003c00e700a300010038004400b90003
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_2 = 00ec001600ca000c0073001100ea00330000009600df00380070007900ac00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_2 = 003d00f400e400d000fd0021005c000d00a3004e00f600c2004c001c001a000b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_2 = 000d002f008d00ce000100b0007c00c80017001400a30047009900e200c600ff
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_2 = 00b000e9004000b90034007b001b00390095008b001800f8009800e300590078
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_2 = 001700a900470095005f001a00f600eb004e00070032004a00e4007c006b0053
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_2 = 00fa00040080000100a800fe0041005c00c500aa00cb00d600ba00f2006a007e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_2 = 009f00ce00b700da008d0066008900df0044007c0098001e00b50042009100a0
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_2 = 00370051001600300035002700ca006a00ef005700e7000e006c0066002900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_2 = 00ba00ed005800fe00c20025006e002b005a00fa00ef00cd0009008b00ea0023
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_2 = 007e003900dd002b005f00160052002400e6006300fd00660024002900030002
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_2 = 005500a700da009b00540008005d0025001e000200690006006d004e00870099
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_2 = 0033004b00c9008b00f300e8000c00c300dc00d4002a0075000a00bd0071004b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_2 = 00bd006800d2001600db00db0000001a003300ab00f1003e005e005500ae008d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_2 = 00e8008f000d00d000130016005100d90091006e00b70096008800c3003b0075
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_2 = 004800bd000100d2006d0095002e0037003d008b00f700ee007b008c001c00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_2 = 0051001a00330084005a000f00e800a500cd008500f100a900860042006300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_2 = 0093008b00dc009100d700e400d9003700840064002500a90031005c00c6006d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_2 = 004a00fe00b700f10067004e00e0009500b7009b005100570068000c00d30018
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_2 = 006e007d00470026006f008100e800fa0089001800a8003c00e2003800b90046
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_2 = 002b007a001900160014005c002d001500b9009e00c700ed008b00a00033004c
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_2 = 006b00b200a7002e001a00ef00c9003600750018006f009a008a00f200a70097
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_2 = 00c9005000f50064002100950040004600a70073009e00610046008200a90097
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_2 = 00ee00d50047009600b0003800ee00e3000d00d3000f0015007300c5003500e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_2 = 00d700ca0010008000790057008e002a00e100ba0063009b0083000300540023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_2 = 002b003f0045006700a6004200be00e600fd007500a500c80094000b004e0039
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_2 = 0096009b003b00d1008c00e0004300d0003900c700ab0093003100f4002700a8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_2 = 00f600790070009b006200ef002d00fa00b300e20062003600fd0087001a009f
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_2 = 00690048008000ac0010002e0016004a005c00af0043007a00e20090001c004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_2 = 0013004c005e00e0006e002f00db001d00e6009500ce00e000ab00950018005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_2 = 004a00b8004f000b00c600a400a1000e00a1009c00a7009000e0005700bc004b
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_2 = 0004004c002a002b004a003a009000d2004b00f100d3008800960066007000c9
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_2 = 00b40057000c00b0006f006c009d002400b9001a00e000ac0098008f006b0045
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_2 = 0030002400c1003900d70025000700fd006400ed008a008900e500750031006c
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_2 = 0075004d0034003b007e00890024009d0076004f002b009400e100ab008b00db
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_2 = 003a005400fb0095007200aa00c8007b0039007e00b600e800d800f60075007a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_2 = 00a6000500a800ab00800024004000bd003000b00098004a00f2004a002200e4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_2 = 004600ee003f00ea002c000c00520077004e00de00160060009200c600110080
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_3 = 00b50006009300290010006d006100ab00b000e000c500580007004800ad0024
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_3 = 0002003a00f9006700f200c3000c00a700bd00a8006400ec008900ff00d800f7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_3 = 0013009c00f90078002a004f00c0004400ad008c006600fe00740064002400a5
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_3 = 00000057006b00f500c100e000f400eb00ee00a70060001d009400b100130043
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_3 = 004600b30004006300ca008600120001003600d4009d00dc00d200670046008c
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_3 = 004d003e00aa003b0063000d00d4001900c000f500b300b200b9006800e8007d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_3 = 00ea0076007a001800f10032006700c9005f00a400bc001600be00c100cc000b
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_3 = 00d400bf003800e600580032000c00b6001700ff002400e000760082004b0017
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_3 = 004c008600e30024009e00b9005700dd002b006600ab003e00ec00ee00580058
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_3 = 00d2005c009500bb000b006c001700ba003b00c900ce006900dc00f50059005e
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_3 = 00b100e200dd00d000a90097002900c000a1000e0016004c00ef001c0089008f
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_3 = 008000d7005c00bf0014003e001a003b00c00057008e001500f5001200010032
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_3 = 00b200be004200b70067004500e6005600a9008c00a700f5008500270090007d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_3 = 007f00ca0088001f001100d600d300ee00050082004d00f3002b00a3003a00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_3 = 00a700d20046006c0011008e001f00980068003b0095009000c0005300a700e1
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_3 = 00ae0009009c005d0083005f0074005c00d1001300ff00d30024003a0008000c
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_3 = 006600e0005c004e0075003100940091006c0066008d0051006b009700b2005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_3 = 00da00f500b70014000500b700010012006d00910024001500010039002e00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_3 = 001f00f0007e007f00af0025009900f40057006c00b8005f00ac001b009f0009
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_3 = 006800ad00ba009b00c10019002000d9002c005f00920090006a0023001c0095
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_3 = 008e003100ff008c00e50061007b005700b5005500f600710053009800b5001e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_3 = 00e10049009f00400075006d0057009c000a002700030071007200c000e40074
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_3 = 0091007c002d007100cb000c002c007100e600a200c9002c006800b700f7004b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_3 = 00d600c20015007700ce0090003500bc00fd000600f3007500bf00e7002d0086
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_3 = 000d00dc0059001400fa00f600c500ec003c00b900be00b7003b0033000000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_3 = 0060005400930067001d000a00c300b500d100a200e300cd001c00e3000b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_3 = 00b000fc005100ea00430022002700260034002400de0003005a0031009000f2
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_3 = 00ff00f7009900ae00e100ab00d900f100c100330069009000b500670009004a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_3 = 0089009a0085007700f1005b0052008c004d005600b400d100ce001400e600a3
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_3 = 0089006c00d900e400cc004700bf00df007900b300d100f500300079004f0060
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_3 = 0033003f00de008f002b00b4009c002a00ab00b600ed0039008a004d00ea00a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_3 = 0024000c008f001d008900130086009b00ec00ca002b00c400f20071007c00d6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_3 = 00a20058006900bd00ea009700d8005c00e600020075007a00de000e00c60016
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_3 = 006d00de004c00a8008000cf001a00bc005400c9008a009d00b6006c009b00b9
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_3 = 001d003900b5004a00c900b90070009c002900d8000700820086007600ba0054
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_3 = 00f400aa00a500bc00ed00bb00c400a0005100e20083006f000b00cf00e000ee
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_3 = 00f000ae007900eb00f60087005100ab0085009000e50042005a009900c30001
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_3 = 005500b600f7002e003400c300c3005000eb000a008b00b9009c006b0090001f
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_3 = 00b5001d001100e200ee002800b900d700f4000600c60031003100c600390032
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_3 = 002900ac001800a40085000800520000002a00f700b5009d00d6008800b100eb
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_3 = 00d000140016006800ec00af00bf00cb003c00e700a300010038004400b90003
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_3 = 00ec001600ca000c0073001100ea00330000009600df00380070007900ac00ab
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_3 = 003d00f400e400d000fd0021005c000d00a3004e00f600c2004c001c001a000b
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_3 = 000d002f008d00ce000100b0007c00c80017001400a30047009900e200c600ff
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_3 = 00b000e9004000b90034007b001b00390095008b001800f8009800e300590078
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_3 = 001700a900470095005f001a00f600eb004e00070032004a00e4007c006b0053
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_3 = 00fa00040080000100a800fe0041005c00c500aa00cb00d600ba00f2006a007e
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_3 = 009f00ce00b700da008d0066008900df0044007c0098001e00b50042009100a0
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_3 = 00370051001600300035002700ca006a00ef005700e7000e006c0066002900d3
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_3 = 00ba00ed005800fe00c20025006e002b005a00fa00ef00cd0009008b00ea0023
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_3 = 007e003900dd002b005f00160052002400e6006300fd00660024002900030002
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_3 = 005500a700da009b00540008005d0025001e000200690006006d004e00870099
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_3 = 0033004b00c9008b00f300e8000c00c300dc00d4002a0075000a00bd0071004b
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_3 = 00bd006800d2001600db00db0000001a003300ab00f1003e005e005500ae008d
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_3 = 00e8008f000d00d000130016005100d90091006e00b70096008800c3003b0075
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_3 = 004800bd000100d2006d0095002e0037003d008b00f700ee007b008c001c00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_3 = 0051001a00330084005a000f00e800a500cd008500f100a900860042006300f3
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_3 = 0093008b00dc009100d700e400d9003700840064002500a90031005c00c6006d
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_3 = 004a00fe00b700f10067004e00e0009500b7009b005100570068000c00d30018
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_3 = 006e007d00470026006f008100e800fa0089001800a8003c00e2003800b90046
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_3 = 002b007a001900160014005c002d001500b9009e00c700ed008b00a00033004c
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_3 = 006b00b200a7002e001a00ef00c9003600750018006f009a008a00f200a70097
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_3 = 00c9005000f50064002100950040004600a70073009e00610046008200a90097
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_3 = 00ee00d50047009600b0003800ee00e3000d00d3000f0015007300c5003500e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_3 = 00d700ca0010008000790057008e002a00e100ba0063009b0083000300540023
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_3 = 002b003f0045006700a6004200be00e600fd007500a500c80094000b004e0039
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_3 = 0096009b003b00d1008c00e0004300d0003900c700ab0093003100f4002700a8
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_3 = 00f600790070009b006200ef002d00fa00b300e20062003600fd0087001a009f
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_3 = 00690048008000ac0010002e0016004a005c00af0043007a00e20090001c004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_3 = 0013004c005e00e0006e002f00db001d00e6009500ce00e000ab00950018005d
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_3 = 004a00b8004f000b00c600a400a1000e00a1009c00a7009000e0005700bc004b
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_3 = 0004004c002a002b004a003a009000d2004b00f100d3008800960066007000c9
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_3 = 00b40057000c00b0006f006c009d002400b9001a00e000ac0098008f006b0045
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_3 = 0030002400c1003900d70025000700fd006400ed008a008900e500750031006c
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_3 = 0075004d0034003b007e00890024009d0076004f002b009400e100ab008b00db
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_3 = 003a005400fb0095007200aa00c8007b0039007e00b600e800d800f60075007a
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_3 = 00a6000500a800ab00800024004000bd003000b00098004a00f2004a002200e4
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_3 = 004600ee003f00ea002c000c00520077004e00de00160060009200c600110080
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_0 = 002a00f70002006400b800c3002200480082001c001700e800bc002500fa00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_0 = 00e4005a00d100f300920063002b005e005f003400d9002b00fc0036005f00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_0 = 000600d600ab00200038009200a600a500aa00cb001d00b3007500f900340026
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_0 = 00a20042008a00f00071009500610000007d00f2000f0071007200ea003d001f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_0 = 006800cc00b3006700d2002800f6001d00310007004000c700aa001300450082
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_0 = 000800c4002d009b009b00bb00190059006000250040001000cc0009001e00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_0 = 003f00fb0043008600fa00ec00e3004300cd00a30017003b00a90003008a0076
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_0 = 00a800f0003900f500940084002c0094005f000c001700d900b400a200230052
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_0 = 00d700820013004b00d800f00065003b0001000f00eb006600e400800087007d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_0 = 002800bf00c40041007e008f00c900ff00850079001b0004000400ea00350069
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_0 = 0023007600b500cb007200c2006700db003800dc00a9002200c10034001c00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_0 = 0086009b0006009f006c00e9007f000b000800b300830090006f007800a80066
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_0 = 00ef001f00c700cc0078006d0051002b003d00bd00100098000d00cc002500ea
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_0 = 001e005700f100630040005500cb00f900ca009d008c00ae00800012002b002d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_0 = 001d00cd008200240090007e00b700e0007d004a0062007900ad00bc0056002c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_0 = 00e200f800660016001a0050001e0034007700b400f50054004e0087003a0041
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_0 = 00ab001b009c00a6008f002100fe00e000fe007500510075004700480059009e
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_0 = 00e700ad00f0000c003600c3007b00f2006300e0009300d1005100d1005500c1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_0 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_0 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_0 = 00a6001900bc00dd00460076000900c9008a00ae00ed00db008b00d000570003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_0 = 00b900ce0075006900f6001f00d600f900a600ce001b000f0041001f006200da
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_0 = 003e00ca00e000ba002f00bc002300a800d2009a00d7005f0037007f00880003
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_0 = 009600a200bd004c001c00bd00c100b500cd007a00d4003f003d00c3003000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_0 = 00490072007d0082004600b6001d00d30019002900e0004e00700033003b004b
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_0 = 007c00c500c100b0004a00f500f900bd0020009b003700d400ea00b2009a00bf
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_0 = 00e1005a009a00c200d100670069007900a2003a0091007b00b60083006d0098
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_0 = 009d00de003d002b001000dd00a4005900da00f6009e00c0005a0059004b00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_0 = 003700a300cb00db0036006f00f0005b003400b3008b009900c200fd009a0017
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_0 = 00c9004100ff00e30023003600f40047003a00d2000c0076003800a200b4003f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_0 = 00d40018001c00bf00a0003e0066002e0097001f00fb00f60030001d000f00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_0 = 0091001b0019006500a2003f00cd0066008500f50013008f002900cb00d20025
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_0 = 00c90019008b008200ad004100e2005a00a1003000b0007e0071004c00fd00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_0 = 000b00bf00d500120030003c0035007500ba001f00240034009c006200b80092
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_0 = 00ef004500b200a700e00081000b00bc002200ce0065001900f900dc0035005f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_0 = 006200680007005a00e700570031004d00440022005100c9004f006600eb0045
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_0 = 00f8002f00e500010051001c00c50099003900770041000b00d7003a005300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_0 = 0034007800d4006200e80064008800ea001500e500cd00d0005b00b100b200fd
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_0 = 00a300b9002e007c001e001b0012006600e2009c0017003d00c100b6004b003f
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_0 = 0004000a00df006800dc008100d600ad004f00e800d100c800b5006200840021
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_0 = 00ea003700750080008b00b100eb00f00022009200a000ed0094009c00f60022
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_0 = 002900cb008c003700a500dc00b5007c00df00ef002a002900b600d700820035
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_0 = 00a8002f00d2003d003b00ec0092002600410030006400cf00bc0077008e0009
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_0 = 00c400d100bc004f00660023005200790010004e0002004d00f300c0004800bb
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_0 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_0 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_0 = 007e00b1002a000b0094008900690043004400ca001100190010008f009f0016
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_0 = 002d005f000d00e10055002c0081009400e0002000c3003800390012007300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_0 = 005a00fe0038005100c40033005300a4003c003a00ff0004008a0043003200c4
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_0 = 0070005500ba005f00300082001500e300bc004300c200290038002700c600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_0 = 00a400b50084005e002f006900f400e600f000c900ea000f0056007a008b009a
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_0 = 00ac006b007700700038001b00700043007000eb002800aa00a20080002f001b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_0 = 009f007000d600c000d70069009c00dd001c00b000c8008e0064003e0040003e
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_0 = 004f00f4007600c200eb00b80013001b00d800c900b900c5003b007900ef00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_0 = 000f00df00fd003f009f00e100a900f3005100cd0063003b000c006d00a7008b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_0 = 00b60090002000ae00c7006d001500d600f0003d00c600f40020002500180035
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_0 = 00ce005c0097004900ed00a4000600790038009300cd0047008600be0033005d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_0 = 003900b9001a00c3007000a200b400df0035003700ce00080045005300e80006
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_0 = 00f600000037008e009400ad00b10073004400c5002f00a2009a00c7007b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_0 = 00610033009300d60038009a009d0071006c00dc008100ee005a004700fa00e1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_0 = 008a0093001300c300c1006300f400a100a1008c00680005007500fc00d10096
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_0 = 0044003b0011006a00cf00d500ef001b0022004c004a001600850053009700eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_0 = 008500b000b400d200060072000a001c00c3009c001d0017008400a600290086
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_0 = 000e0011005c00b100f30089006e00dc0099000e004c0071005e009d00c60047
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_0 = 000800870080005d00ab002e005200a300d8005a0055006c0046009600140035
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_0 = 00540083005e00a20055006f000400ab00d600bc0042005d001400750050001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_0 = 00b9009d00ac00e3007e009d00bb00f300ba009f00e6007f005f008d004e00c6
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_0 = 00fe0051000a00ff00c10079007c0050001c0092005a00cf00dc0004006b006a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_0 = 000a00aa002a004400d0004c005c009b008000a1007a008a00b100f800010024
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_0 = 008e00bf00550029001f0055003b00cb006b004000c60088001c00180074000c
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_0 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_0 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_0 = 000000c20069004a00c4008f00f3005b0031009e008a00eb00fe00eb00fc00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_0 = 000e0036003d0084006800730007009700ef00e800a40010006a0006000d009b
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_0 = 005f0057009600ec00bd00f80056006400c7002b00e900110073007300490072
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_0 = 008b00ef00e6008800880036000200f800e3007700bf002b00a000020067004b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_0 = 002e005100d400c400cc00ef00fb009b00470003003500e50001007d000300e6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_0 = 0037005b0081000800ff00c2000f00c0004000470072000e007d00d800a70022
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_1 = 002a00f70002006400b800c3002200480082001c001700e800bc002500fa00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_1 = 00e4005a00d100f300920063002b005e005f003400d9002b00fc0036005f00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_1 = 000600d600ab00200038009200a600a500aa00cb001d00b3007500f900340026
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_1 = 00a20042008a00f00071009500610000007d00f2000f0071007200ea003d001f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_1 = 006800cc00b3006700d2002800f6001d00310007004000c700aa001300450082
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_1 = 000800c4002d009b009b00bb00190059006000250040001000cc0009001e00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_1 = 003f00fb0043008600fa00ec00e3004300cd00a30017003b00a90003008a0076
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_1 = 00a800f0003900f500940084002c0094005f000c001700d900b400a200230052
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_1 = 00d700820013004b00d800f00065003b0001000f00eb006600e400800087007d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_1 = 002800bf00c40041007e008f00c900ff00850079001b0004000400ea00350069
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_1 = 0023007600b500cb007200c2006700db003800dc00a9002200c10034001c00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_1 = 0086009b0006009f006c00e9007f000b000800b300830090006f007800a80066
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_1 = 00ef001f00c700cc0078006d0051002b003d00bd00100098000d00cc002500ea
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_1 = 001e005700f100630040005500cb00f900ca009d008c00ae00800012002b002d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_1 = 001d00cd008200240090007e00b700e0007d004a0062007900ad00bc0056002c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_1 = 00e200f800660016001a0050001e0034007700b400f50054004e0087003a0041
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_1 = 00ab001b009c00a6008f002100fe00e000fe007500510075004700480059009e
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_1 = 00e700ad00f0000c003600c3007b00f2006300e0009300d1005100d1005500c1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_1 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_1 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_1 = 00a6001900bc00dd00460076000900c9008a00ae00ed00db008b00d000570003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_1 = 00b900ce0075006900f6001f00d600f900a600ce001b000f0041001f006200da
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_1 = 003e00ca00e000ba002f00bc002300a800d2009a00d7005f0037007f00880003
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_1 = 009600a200bd004c001c00bd00c100b500cd007a00d4003f003d00c3003000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_1 = 00490072007d0082004600b6001d00d30019002900e0004e00700033003b004b
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_1 = 007c00c500c100b0004a00f500f900bd0020009b003700d400ea00b2009a00bf
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_1 = 00e1005a009a00c200d100670069007900a2003a0091007b00b60083006d0098
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_1 = 009d00de003d002b001000dd00a4005900da00f6009e00c0005a0059004b00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_1 = 003700a300cb00db0036006f00f0005b003400b3008b009900c200fd009a0017
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_1 = 00c9004100ff00e30023003600f40047003a00d2000c0076003800a200b4003f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_1 = 00d40018001c00bf00a0003e0066002e0097001f00fb00f60030001d000f00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_1 = 0091001b0019006500a2003f00cd0066008500f50013008f002900cb00d20025
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_1 = 00c90019008b008200ad004100e2005a00a1003000b0007e0071004c00fd00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_1 = 000b00bf00d500120030003c0035007500ba001f00240034009c006200b80092
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_1 = 00ef004500b200a700e00081000b00bc002200ce0065001900f900dc0035005f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_1 = 006200680007005a00e700570031004d00440022005100c9004f006600eb0045
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_1 = 00f8002f00e500010051001c00c50099003900770041000b00d7003a005300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_1 = 0034007800d4006200e80064008800ea001500e500cd00d0005b00b100b200fd
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_1 = 00a300b9002e007c001e001b0012006600e2009c0017003d00c100b6004b003f
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_1 = 0004000a00df006800dc008100d600ad004f00e800d100c800b5006200840021
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_1 = 00ea003700750080008b00b100eb00f00022009200a000ed0094009c00f60022
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_1 = 002900cb008c003700a500dc00b5007c00df00ef002a002900b600d700820035
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_1 = 00a8002f00d2003d003b00ec0092002600410030006400cf00bc0077008e0009
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_1 = 00c400d100bc004f00660023005200790010004e0002004d00f300c0004800bb
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_1 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_1 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_1 = 007e00b1002a000b0094008900690043004400ca001100190010008f009f0016
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_1 = 002d005f000d00e10055002c0081009400e0002000c3003800390012007300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_1 = 005a00fe0038005100c40033005300a4003c003a00ff0004008a0043003200c4
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_1 = 0070005500ba005f00300082001500e300bc004300c200290038002700c600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_1 = 00a400b50084005e002f006900f400e600f000c900ea000f0056007a008b009a
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_1 = 00ac006b007700700038001b00700043007000eb002800aa00a20080002f001b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_1 = 009f007000d600c000d70069009c00dd001c00b000c8008e0064003e0040003e
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_1 = 004f00f4007600c200eb00b80013001b00d800c900b900c5003b007900ef00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_1 = 000f00df00fd003f009f00e100a900f3005100cd0063003b000c006d00a7008b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_1 = 00b60090002000ae00c7006d001500d600f0003d00c600f40020002500180035
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_1 = 00ce005c0097004900ed00a4000600790038009300cd0047008600be0033005d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_1 = 003900b9001a00c3007000a200b400df0035003700ce00080045005300e80006
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_1 = 00f600000037008e009400ad00b10073004400c5002f00a2009a00c7007b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_1 = 00610033009300d60038009a009d0071006c00dc008100ee005a004700fa00e1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_1 = 008a0093001300c300c1006300f400a100a1008c00680005007500fc00d10096
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_1 = 0044003b0011006a00cf00d500ef001b0022004c004a001600850053009700eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_1 = 008500b000b400d200060072000a001c00c3009c001d0017008400a600290086
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_1 = 000e0011005c00b100f30089006e00dc0099000e004c0071005e009d00c60047
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_1 = 000800870080005d00ab002e005200a300d8005a0055006c0046009600140035
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_1 = 00540083005e00a20055006f000400ab00d600bc0042005d001400750050001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_1 = 00b9009d00ac00e3007e009d00bb00f300ba009f00e6007f005f008d004e00c6
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_1 = 00fe0051000a00ff00c10079007c0050001c0092005a00cf00dc0004006b006a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_1 = 000a00aa002a004400d0004c005c009b008000a1007a008a00b100f800010024
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_1 = 008e00bf00550029001f0055003b00cb006b004000c60088001c00180074000c
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_1 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_1 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_1 = 000000c20069004a00c4008f00f3005b0031009e008a00eb00fe00eb00fc00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_1 = 000e0036003d0084006800730007009700ef00e800a40010006a0006000d009b
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_1 = 005f0057009600ec00bd00f80056006400c7002b00e900110073007300490072
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_1 = 008b00ef00e6008800880036000200f800e3007700bf002b00a000020067004b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_1 = 002e005100d400c400cc00ef00fb009b00470003003500e50001007d000300e6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_1 = 0037005b0081000800ff00c2000f00c0004000470072000e007d00d800a70022
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_2 = 002a00f70002006400b800c3002200480082001c001700e800bc002500fa00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_2 = 00e4005a00d100f300920063002b005e005f003400d9002b00fc0036005f00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_2 = 000600d600ab00200038009200a600a500aa00cb001d00b3007500f900340026
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_2 = 00a20042008a00f00071009500610000007d00f2000f0071007200ea003d001f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_2 = 006800cc00b3006700d2002800f6001d00310007004000c700aa001300450082
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_2 = 000800c4002d009b009b00bb00190059006000250040001000cc0009001e00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_2 = 003f00fb0043008600fa00ec00e3004300cd00a30017003b00a90003008a0076
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_2 = 00a800f0003900f500940084002c0094005f000c001700d900b400a200230052
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_2 = 00d700820013004b00d800f00065003b0001000f00eb006600e400800087007d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_2 = 002800bf00c40041007e008f00c900ff00850079001b0004000400ea00350069
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_2 = 0023007600b500cb007200c2006700db003800dc00a9002200c10034001c00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_2 = 0086009b0006009f006c00e9007f000b000800b300830090006f007800a80066
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_2 = 00ef001f00c700cc0078006d0051002b003d00bd00100098000d00cc002500ea
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_2 = 001e005700f100630040005500cb00f900ca009d008c00ae00800012002b002d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_2 = 001d00cd008200240090007e00b700e0007d004a0062007900ad00bc0056002c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_2 = 00e200f800660016001a0050001e0034007700b400f50054004e0087003a0041
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_2 = 00ab001b009c00a6008f002100fe00e000fe007500510075004700480059009e
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_2 = 00e700ad00f0000c003600c3007b00f2006300e0009300d1005100d1005500c1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_2 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_2 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_2 = 00a6001900bc00dd00460076000900c9008a00ae00ed00db008b00d000570003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_2 = 00b900ce0075006900f6001f00d600f900a600ce001b000f0041001f006200da
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_2 = 003e00ca00e000ba002f00bc002300a800d2009a00d7005f0037007f00880003
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_2 = 009600a200bd004c001c00bd00c100b500cd007a00d4003f003d00c3003000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_2 = 00490072007d0082004600b6001d00d30019002900e0004e00700033003b004b
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_2 = 007c00c500c100b0004a00f500f900bd0020009b003700d400ea00b2009a00bf
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_2 = 00e1005a009a00c200d100670069007900a2003a0091007b00b60083006d0098
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_2 = 009d00de003d002b001000dd00a4005900da00f6009e00c0005a0059004b00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_2 = 003700a300cb00db0036006f00f0005b003400b3008b009900c200fd009a0017
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_2 = 00c9004100ff00e30023003600f40047003a00d2000c0076003800a200b4003f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_2 = 00d40018001c00bf00a0003e0066002e0097001f00fb00f60030001d000f00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_2 = 0091001b0019006500a2003f00cd0066008500f50013008f002900cb00d20025
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_2 = 00c90019008b008200ad004100e2005a00a1003000b0007e0071004c00fd00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_2 = 000b00bf00d500120030003c0035007500ba001f00240034009c006200b80092
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_2 = 00ef004500b200a700e00081000b00bc002200ce0065001900f900dc0035005f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_2 = 006200680007005a00e700570031004d00440022005100c9004f006600eb0045
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_2 = 00f8002f00e500010051001c00c50099003900770041000b00d7003a005300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_2 = 0034007800d4006200e80064008800ea001500e500cd00d0005b00b100b200fd
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_2 = 00a300b9002e007c001e001b0012006600e2009c0017003d00c100b6004b003f
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_2 = 0004000a00df006800dc008100d600ad004f00e800d100c800b5006200840021
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_2 = 00ea003700750080008b00b100eb00f00022009200a000ed0094009c00f60022
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_2 = 002900cb008c003700a500dc00b5007c00df00ef002a002900b600d700820035
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_2 = 00a8002f00d2003d003b00ec0092002600410030006400cf00bc0077008e0009
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_2 = 00c400d100bc004f00660023005200790010004e0002004d00f300c0004800bb
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_2 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_2 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_2 = 007e00b1002a000b0094008900690043004400ca001100190010008f009f0016
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_2 = 002d005f000d00e10055002c0081009400e0002000c3003800390012007300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_2 = 005a00fe0038005100c40033005300a4003c003a00ff0004008a0043003200c4
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_2 = 0070005500ba005f00300082001500e300bc004300c200290038002700c600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_2 = 00a400b50084005e002f006900f400e600f000c900ea000f0056007a008b009a
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_2 = 00ac006b007700700038001b00700043007000eb002800aa00a20080002f001b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_2 = 009f007000d600c000d70069009c00dd001c00b000c8008e0064003e0040003e
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_2 = 004f00f4007600c200eb00b80013001b00d800c900b900c5003b007900ef00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_2 = 000f00df00fd003f009f00e100a900f3005100cd0063003b000c006d00a7008b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_2 = 00b60090002000ae00c7006d001500d600f0003d00c600f40020002500180035
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_2 = 00ce005c0097004900ed00a4000600790038009300cd0047008600be0033005d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_2 = 003900b9001a00c3007000a200b400df0035003700ce00080045005300e80006
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_2 = 00f600000037008e009400ad00b10073004400c5002f00a2009a00c7007b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_2 = 00610033009300d60038009a009d0071006c00dc008100ee005a004700fa00e1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_2 = 008a0093001300c300c1006300f400a100a1008c00680005007500fc00d10096
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_2 = 0044003b0011006a00cf00d500ef001b0022004c004a001600850053009700eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_2 = 008500b000b400d200060072000a001c00c3009c001d0017008400a600290086
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_2 = 000e0011005c00b100f30089006e00dc0099000e004c0071005e009d00c60047
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_2 = 000800870080005d00ab002e005200a300d8005a0055006c0046009600140035
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_2 = 00540083005e00a20055006f000400ab00d600bc0042005d001400750050001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_2 = 00b9009d00ac00e3007e009d00bb00f300ba009f00e6007f005f008d004e00c6
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_2 = 00fe0051000a00ff00c10079007c0050001c0092005a00cf00dc0004006b006a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_2 = 000a00aa002a004400d0004c005c009b008000a1007a008a00b100f800010024
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_2 = 008e00bf00550029001f0055003b00cb006b004000c60088001c00180074000c
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_2 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_2 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_2 = 000000c20069004a00c4008f00f3005b0031009e008a00eb00fe00eb00fc00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_2 = 000e0036003d0084006800730007009700ef00e800a40010006a0006000d009b
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_2 = 005f0057009600ec00bd00f80056006400c7002b00e900110073007300490072
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_2 = 008b00ef00e6008800880036000200f800e3007700bf002b00a000020067004b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_2 = 002e005100d400c400cc00ef00fb009b00470003003500e50001007d000300e6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_2 = 0037005b0081000800ff00c2000f00c0004000470072000e007d00d800a70022
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_3 = 002a00f70002006400b800c3002200480082001c001700e800bc002500fa00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_3 = 00e4005a00d100f300920063002b005e005f003400d9002b00fc0036005f00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_3 = 000600d600ab00200038009200a600a500aa00cb001d00b3007500f900340026
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_3 = 00a20042008a00f00071009500610000007d00f2000f0071007200ea003d001f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_3 = 006800cc00b3006700d2002800f6001d00310007004000c700aa001300450082
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_3 = 000800c4002d009b009b00bb00190059006000250040001000cc0009001e00f2
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_3 = 003f00fb0043008600fa00ec00e3004300cd00a30017003b00a90003008a0076
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_3 = 00a800f0003900f500940084002c0094005f000c001700d900b400a200230052
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_3 = 00d700820013004b00d800f00065003b0001000f00eb006600e400800087007d
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_3 = 002800bf00c40041007e008f00c900ff00850079001b0004000400ea00350069
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_3 = 0023007600b500cb007200c2006700db003800dc00a9002200c10034001c00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_3 = 0086009b0006009f006c00e9007f000b000800b300830090006f007800a80066
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_3 = 00ef001f00c700cc0078006d0051002b003d00bd00100098000d00cc002500ea
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_3 = 001e005700f100630040005500cb00f900ca009d008c00ae00800012002b002d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_3 = 001d00cd008200240090007e00b700e0007d004a0062007900ad00bc0056002c
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_3 = 00e200f800660016001a0050001e0034007700b400f50054004e0087003a0041
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_3 = 00ab001b009c00a6008f002100fe00e000fe007500510075004700480059009e
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_3 = 00e700ad00f0000c003600c3007b00f2006300e0009300d1005100d1005500c1
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_3 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_3 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_3 = 00a6001900bc00dd00460076000900c9008a00ae00ed00db008b00d000570003
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_3 = 00b900ce0075006900f6001f00d600f900a600ce001b000f0041001f006200da
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_3 = 003e00ca00e000ba002f00bc002300a800d2009a00d7005f0037007f00880003
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_3 = 009600a200bd004c001c00bd00c100b500cd007a00d4003f003d00c3003000b0
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_3 = 00490072007d0082004600b6001d00d30019002900e0004e00700033003b004b
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_3 = 007c00c500c100b0004a00f500f900bd0020009b003700d400ea00b2009a00bf
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_3 = 00e1005a009a00c200d100670069007900a2003a0091007b00b60083006d0098
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_3 = 009d00de003d002b001000dd00a4005900da00f6009e00c0005a0059004b00c7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_3 = 003700a300cb00db0036006f00f0005b003400b3008b009900c200fd009a0017
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_3 = 00c9004100ff00e30023003600f40047003a00d2000c0076003800a200b4003f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_3 = 00d40018001c00bf00a0003e0066002e0097001f00fb00f60030001d000f00fe
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_3 = 0091001b0019006500a2003f00cd0066008500f50013008f002900cb00d20025
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_3 = 00c90019008b008200ad004100e2005a00a1003000b0007e0071004c00fd00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_3 = 000b00bf00d500120030003c0035007500ba001f00240034009c006200b80092
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_3 = 00ef004500b200a700e00081000b00bc002200ce0065001900f900dc0035005f
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_3 = 006200680007005a00e700570031004d00440022005100c9004f006600eb0045
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_3 = 00f8002f00e500010051001c00c50099003900770041000b00d7003a005300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_3 = 0034007800d4006200e80064008800ea001500e500cd00d0005b00b100b200fd
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_3 = 00a300b9002e007c001e001b0012006600e2009c0017003d00c100b6004b003f
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_3 = 0004000a00df006800dc008100d600ad004f00e800d100c800b5006200840021
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_3 = 00ea003700750080008b00b100eb00f00022009200a000ed0094009c00f60022
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_3 = 002900cb008c003700a500dc00b5007c00df00ef002a002900b600d700820035
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_3 = 00a8002f00d2003d003b00ec0092002600410030006400cf00bc0077008e0009
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_3 = 00c400d100bc004f00660023005200790010004e0002004d00f300c0004800bb
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_3 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_3 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_3 = 007e00b1002a000b0094008900690043004400ca001100190010008f009f0016
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_3 = 002d005f000d00e10055002c0081009400e0002000c3003800390012007300c7
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_3 = 005a00fe0038005100c40033005300a4003c003a00ff0004008a0043003200c4
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_3 = 0070005500ba005f00300082001500e300bc004300c200290038002700c600ac
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_3 = 00a400b50084005e002f006900f400e600f000c900ea000f0056007a008b009a
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_3 = 00ac006b007700700038001b00700043007000eb002800aa00a20080002f001b
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_3 = 009f007000d600c000d70069009c00dd001c00b000c8008e0064003e0040003e
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_3 = 004f00f4007600c200eb00b80013001b00d800c900b900c5003b007900ef00f6
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_3 = 000f00df00fd003f009f00e100a900f3005100cd0063003b000c006d00a7008b
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_3 = 00b60090002000ae00c7006d001500d600f0003d00c600f40020002500180035
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_3 = 00ce005c0097004900ed00a4000600790038009300cd0047008600be0033005d
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_3 = 003900b9001a00c3007000a200b400df0035003700ce00080045005300e80006
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_3 = 00f600000037008e009400ad00b10073004400c5002f00a2009a00c7007b00c1
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_3 = 00610033009300d60038009a009d0071006c00dc008100ee005a004700fa00e1
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_3 = 008a0093001300c300c1006300f400a100a1008c00680005007500fc00d10096
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_3 = 0044003b0011006a00cf00d500ef001b0022004c004a001600850053009700eb
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_3 = 008500b000b400d200060072000a001c00c3009c001d0017008400a600290086
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_3 = 000e0011005c00b100f30089006e00dc0099000e004c0071005e009d00c60047
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_3 = 000800870080005d00ab002e005200a300d8005a0055006c0046009600140035
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_3 = 00540083005e00a20055006f000400ab00d600bc0042005d001400750050001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_3 = 00b9009d00ac00e3007e009d00bb00f300ba009f00e6007f005f008d004e00c6
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_3 = 00fe0051000a00ff00c10079007c0050001c0092005a00cf00dc0004006b006a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_3 = 000a00aa002a004400d0004c005c009b008000a1007a008a00b100f800010024
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_3 = 008e00bf00550029001f0055003b00cb006b004000c60088001c00180074000c
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_3 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_3 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_3 = 000000c20069004a00c4008f00f3005b0031009e008a00eb00fe00eb00fc00dc
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_3 = 000e0036003d0084006800730007009700ef00e800a40010006a0006000d009b
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_3 = 005f0057009600ec00bd00f80056006400c7002b00e900110073007300490072
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_3 = 008b00ef00e6008800880036000200f800e3007700bf002b00a000020067004b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_3 = 002e005100d400c400cc00ef00fb009b00470003003500e50001007d000300e6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_3 = 0037005b0081000800ff00c2000f00c0004000470072000e007d00d800a70022
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_0 = 0017001d00be00db00a70009001000df00d10078005500f1004000100052002f
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_0 = 0010002e008800c0000c00e50028002e002a006800a700df009900ed000200dc
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_0 = 004a00c7004d00c90021008600f60044001b00cd00ca0018008c001b00840049
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_0 = 002300a30069006300100077008800bc0067009d000100ba005600cf006c001a
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_0 = 00d6006c005600b9006300fa00d500cc008700a5008900900028007500f700d7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_0 = 009200d500fc002200c700ab006c00bc00ed0059000d007000b90097000a00e6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_0 = 007800fe004600f1005b00bf00c900f3007000fe00f400ff008400fa00a0001a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_0 = 00b300a500aa00fb00d9006a00b1002500c000ec001800a10049003a00260021
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_0 = 0085003800ac000c00360018002f00bf0011005100810053003d008b00df00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_0 = 00290035004f009a0039001900a00022007300210048007000fa00f7002a00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_0 = 00e1003200ab00ed0006008700760073001c00e400c700e8003d00e3002200a4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_0 = 0070002100c200fe008c00cc00030054001b00e000b80071002000fd001b00e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_0 = 000b0062001400a3002b00fa0085004a000f00ff000c005a00be0032004e0095
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_0 = 0093008e00c200ad00c200bb00cc008f008d00f40022002300280050006400dc
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_0 = 00c80058008c00f60088001f008a0082009000f2005c00b100e8009e002d0080
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_0 = 005800de00fb009d00f70021004a00bc00bb00c1006600a3004a001100ac0065
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_0 = 004c00e6003400a8001600ee00720058008e003d0048003b00eb00430099004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_0 = 003b00c2009a002f00980075003f00bf004c00270051009200250085004a0018
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_0 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_0 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_0 = 004000c800c5000a0068006800c200c6009b00c4003d00d3008900cc006f002f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_0 = 00200028008b00b2000800bd0042005700f300b9009f009a00e300d300a9009a
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_0 = 000a000800a9004b008b009d0037009a000000d000e800de00fb002200e0001b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_0 = 005700a6006d0004000c009d004600c0006c00bd00f6002a00a4004c00d90093
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_0 = 0063004900c000fd004d00ac00e100280068009400e100df001c002600d60006
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_0 = 00920038004400fd002700b400d300cc00c000170033005b0072005b001700be
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_0 = 002d00ec0000008600d300b3001e003a007d00e5007400e2004d00bd00ff0070
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_0 = 006c00c0005b002f001b00d8004400ba00f10010000e00a8005f0060007e00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_0 = 005c00e2004400d30013002600b6006f008f0095003100c8004c00b2006d00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_0 = 0042002200e000e5001900cd002e008e005800bd006e00af00df00e100c40088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_0 = 00f6004300bf00a300cf00a1005e00f200c70010008800280026009f00f300de
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_0 = 006f005f001e00cd00cb00cb0001002500bc004a008d006800710010006100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_0 = 00c40007000800dd000f006700e900b700d8006b006c00cb007e0045005e00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_0 = 00ab00340090003a0057002500ca00b1004400d40075009e00b2006f00090047
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_0 = 004e00e40028009900650092006c00e200ff002200bc00ed0039005900b40050
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_0 = 00b700ca00c9009d00ad004100c6005e00f60032007000c0003400e200a000af
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_0 = 00590076003700f500310076005900650021005c001700bb0044005900b20074
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_0 = 000600150083005b009900f600cb00c200bb004700a200fb00c30064003600de
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_0 = 00ee00c1006d00b400c7006100d8007f000400e7002100400006008e008d006b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_0 = 004f004300db0009008b007b001e004d00e5008700e300ae0056001800d10075
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_0 = 00c7002f00a800810015005200ca00cd0014005900a700250048002700f9004f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_0 = 00f900350037001b00ef000700f0005b0054002300e0001f009500ee00d30003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_0 = 00eb002500e8009e009300a600250034002c00bb00f60061008100dd00180006
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_0 = 00a500c600bc0037007d00d900e7006800db002100cb0018001200a500c20090
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_0 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_0 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_0 = 008f0020004f00a000ba008e00bd0037002800e400e8002400a800db0075001f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_0 = 0074002d00970098001200c00036005900b6009f0095001f008f0074006500a5
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_0 = 000f0039007d008400e500fe008c0085001f008a008f002d0041005400270027
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_0 = 00ff00ed00680060009f0075004f008300d40080000f00ca003500db00aa0002
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_0 = 0041008c003c009800190031006100f3001800dd00d200c800ce00b1002f001d
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_0 = 002b00b1000800f1001d0056009c00d9008400a200a900c1003b0024003f0017
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_0 = 005200b800ac00f400a3009c009c004b006000e5005d00a80050009700bc0013
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_0 = 00d7006500f900a9000c00b60041006f009c0012003a009d002b002e00d9009f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_0 = 0097006600e6007700a7006f000400e3002a00230054003100b600ec00d40060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_0 = 006a00c3005f00ce00b900230072009d0021006d007b00970001000f00230088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_0 = 001c00d900c4002e0091003b003a0046008400da009500000099002900590056
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_0 = 00d000ce007600c100e80065003c0036001f00ed00ba003b0089005d00400024
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_0 = 008800ac00a800350074007700ee00f6009a00330003007c0058007d000e009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_0 = 006b005d00c0003900cd00e800db008500d10008000a008300b300a5005d00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_0 = 00b8006300940025000300fc0060002500c10032008b009400de0099004700f6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_0 = 004500b7001900510086009b0072003b0044004b00680008001800eb002300d8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_0 = 0037007600ce00ca00c2006500ef001000d9009900a7003f005500ee001f00b1
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_0 = 00890055002900b400800058002e00c600a400ae002800a200f100fc002400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_0 = 00a300350051000d006f00fd004800cb0022000f00fd00c0002300a4007a00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_0 = 0092005100d70060007a00dd00ad005d0061001800f0004600cc00ff00a6001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_0 = 00a6008200ea00dc000f0037006b005d00e3006a00f7004800cb009000ba005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_0 = 00a3009e00ea005300e600c800ea00ef0049000d005300cc00dd00ed000b00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_0 = 008c008e00c0001c006300d6007500a900bf00cf003100e8004c005b00130094
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_0 = 0069009f009f0034004600a1007c00da00f700d1006400f8003500bd00b400ed
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_0 = 002200f8003700db002f003700c2003e002d00c800b1009200f60006002300ce
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_0 = 004a008e007000160096004a003d0069009f00f900c6004c00c50050005c00d1
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_0 = 000e00e70028008f0006003e00ec00dc00a100ad004f0041002700fb00a8004c
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_0 = 005200fc00cb009100a900f300b800c60085004d00cc00b70061003500110044
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_0 = 005c007c002d005d007e00d2006900a5004700a9003700be0014005800f800ca
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_0 = 003500f500cd0051006600cf0068009f00d300d000e00006003f003a00e9006b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_0 = 003a00c500f700f900af001a00f70012003400be00d90053009b00e6009400f6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_0 = 0050001100e70002009600a600430096002000ee00760014005a005a000a004e
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_1 = 0017001d00be00db00a70009001000df00d10078005500f1004000100052002f
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_1 = 0010002e008800c0000c00e50028002e002a006800a700df009900ed000200dc
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_1 = 004a00c7004d00c90021008600f60044001b00cd00ca0018008c001b00840049
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_1 = 002300a30069006300100077008800bc0067009d000100ba005600cf006c001a
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_1 = 00d6006c005600b9006300fa00d500cc008700a5008900900028007500f700d7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_1 = 009200d500fc002200c700ab006c00bc00ed0059000d007000b90097000a00e6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_1 = 007800fe004600f1005b00bf00c900f3007000fe00f400ff008400fa00a0001a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_1 = 00b300a500aa00fb00d9006a00b1002500c000ec001800a10049003a00260021
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_1 = 0085003800ac000c00360018002f00bf0011005100810053003d008b00df00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_1 = 00290035004f009a0039001900a00022007300210048007000fa00f7002a00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_1 = 00e1003200ab00ed0006008700760073001c00e400c700e8003d00e3002200a4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_1 = 0070002100c200fe008c00cc00030054001b00e000b80071002000fd001b00e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_1 = 000b0062001400a3002b00fa0085004a000f00ff000c005a00be0032004e0095
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_1 = 0093008e00c200ad00c200bb00cc008f008d00f40022002300280050006400dc
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_1 = 00c80058008c00f60088001f008a0082009000f2005c00b100e8009e002d0080
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_1 = 005800de00fb009d00f70021004a00bc00bb00c1006600a3004a001100ac0065
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_1 = 004c00e6003400a8001600ee00720058008e003d0048003b00eb00430099004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_1 = 003b00c2009a002f00980075003f00bf004c00270051009200250085004a0018
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_1 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_1 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_1 = 004000c800c5000a0068006800c200c6009b00c4003d00d3008900cc006f002f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_1 = 00200028008b00b2000800bd0042005700f300b9009f009a00e300d300a9009a
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_1 = 000a000800a9004b008b009d0037009a000000d000e800de00fb002200e0001b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_1 = 005700a6006d0004000c009d004600c0006c00bd00f6002a00a4004c00d90093
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_1 = 0063004900c000fd004d00ac00e100280068009400e100df001c002600d60006
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_1 = 00920038004400fd002700b400d300cc00c000170033005b0072005b001700be
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_1 = 002d00ec0000008600d300b3001e003a007d00e5007400e2004d00bd00ff0070
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_1 = 006c00c0005b002f001b00d8004400ba00f10010000e00a8005f0060007e00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_1 = 005c00e2004400d30013002600b6006f008f0095003100c8004c00b2006d00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_1 = 0042002200e000e5001900cd002e008e005800bd006e00af00df00e100c40088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_1 = 00f6004300bf00a300cf00a1005e00f200c70010008800280026009f00f300de
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_1 = 006f005f001e00cd00cb00cb0001002500bc004a008d006800710010006100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_1 = 00c40007000800dd000f006700e900b700d8006b006c00cb007e0045005e00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_1 = 00ab00340090003a0057002500ca00b1004400d40075009e00b2006f00090047
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_1 = 004e00e40028009900650092006c00e200ff002200bc00ed0039005900b40050
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_1 = 00b700ca00c9009d00ad004100c6005e00f60032007000c0003400e200a000af
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_1 = 00590076003700f500310076005900650021005c001700bb0044005900b20074
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_1 = 000600150083005b009900f600cb00c200bb004700a200fb00c30064003600de
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_1 = 00ee00c1006d00b400c7006100d8007f000400e7002100400006008e008d006b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_1 = 004f004300db0009008b007b001e004d00e5008700e300ae0056001800d10075
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_1 = 00c7002f00a800810015005200ca00cd0014005900a700250048002700f9004f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_1 = 00f900350037001b00ef000700f0005b0054002300e0001f009500ee00d30003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_1 = 00eb002500e8009e009300a600250034002c00bb00f60061008100dd00180006
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_1 = 00a500c600bc0037007d00d900e7006800db002100cb0018001200a500c20090
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_1 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_1 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_1 = 008f0020004f00a000ba008e00bd0037002800e400e8002400a800db0075001f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_1 = 0074002d00970098001200c00036005900b6009f0095001f008f0074006500a5
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_1 = 000f0039007d008400e500fe008c0085001f008a008f002d0041005400270027
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_1 = 00ff00ed00680060009f0075004f008300d40080000f00ca003500db00aa0002
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_1 = 0041008c003c009800190031006100f3001800dd00d200c800ce00b1002f001d
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_1 = 002b00b1000800f1001d0056009c00d9008400a200a900c1003b0024003f0017
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_1 = 005200b800ac00f400a3009c009c004b006000e5005d00a80050009700bc0013
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_1 = 00d7006500f900a9000c00b60041006f009c0012003a009d002b002e00d9009f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_1 = 0097006600e6007700a7006f000400e3002a00230054003100b600ec00d40060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_1 = 006a00c3005f00ce00b900230072009d0021006d007b00970001000f00230088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_1 = 001c00d900c4002e0091003b003a0046008400da009500000099002900590056
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_1 = 00d000ce007600c100e80065003c0036001f00ed00ba003b0089005d00400024
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_1 = 008800ac00a800350074007700ee00f6009a00330003007c0058007d000e009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_1 = 006b005d00c0003900cd00e800db008500d10008000a008300b300a5005d00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_1 = 00b8006300940025000300fc0060002500c10032008b009400de0099004700f6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_1 = 004500b7001900510086009b0072003b0044004b00680008001800eb002300d8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_1 = 0037007600ce00ca00c2006500ef001000d9009900a7003f005500ee001f00b1
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_1 = 00890055002900b400800058002e00c600a400ae002800a200f100fc002400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_1 = 00a300350051000d006f00fd004800cb0022000f00fd00c0002300a4007a00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_1 = 0092005100d70060007a00dd00ad005d0061001800f0004600cc00ff00a6001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_1 = 00a6008200ea00dc000f0037006b005d00e3006a00f7004800cb009000ba005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_1 = 00a3009e00ea005300e600c800ea00ef0049000d005300cc00dd00ed000b00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_1 = 008c008e00c0001c006300d6007500a900bf00cf003100e8004c005b00130094
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_1 = 0069009f009f0034004600a1007c00da00f700d1006400f8003500bd00b400ed
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_1 = 002200f8003700db002f003700c2003e002d00c800b1009200f60006002300ce
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_1 = 004a008e007000160096004a003d0069009f00f900c6004c00c50050005c00d1
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_1 = 000e00e70028008f0006003e00ec00dc00a100ad004f0041002700fb00a8004c
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_1 = 005200fc00cb009100a900f300b800c60085004d00cc00b70061003500110044
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_1 = 005c007c002d005d007e00d2006900a5004700a9003700be0014005800f800ca
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_1 = 003500f500cd0051006600cf0068009f00d300d000e00006003f003a00e9006b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_1 = 003a00c500f700f900af001a00f70012003400be00d90053009b00e6009400f6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_1 = 0050001100e70002009600a600430096002000ee00760014005a005a000a004e
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_2 = 0017001d00be00db00a70009001000df00d10078005500f1004000100052002f
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_2 = 0010002e008800c0000c00e50028002e002a006800a700df009900ed000200dc
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_2 = 004a00c7004d00c90021008600f60044001b00cd00ca0018008c001b00840049
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_2 = 002300a30069006300100077008800bc0067009d000100ba005600cf006c001a
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_2 = 00d6006c005600b9006300fa00d500cc008700a5008900900028007500f700d7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_2 = 009200d500fc002200c700ab006c00bc00ed0059000d007000b90097000a00e6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_2 = 007800fe004600f1005b00bf00c900f3007000fe00f400ff008400fa00a0001a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_2 = 00b300a500aa00fb00d9006a00b1002500c000ec001800a10049003a00260021
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_2 = 0085003800ac000c00360018002f00bf0011005100810053003d008b00df00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_2 = 00290035004f009a0039001900a00022007300210048007000fa00f7002a00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_2 = 00e1003200ab00ed0006008700760073001c00e400c700e8003d00e3002200a4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_2 = 0070002100c200fe008c00cc00030054001b00e000b80071002000fd001b00e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_2 = 000b0062001400a3002b00fa0085004a000f00ff000c005a00be0032004e0095
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_2 = 0093008e00c200ad00c200bb00cc008f008d00f40022002300280050006400dc
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_2 = 00c80058008c00f60088001f008a0082009000f2005c00b100e8009e002d0080
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_2 = 005800de00fb009d00f70021004a00bc00bb00c1006600a3004a001100ac0065
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_2 = 004c00e6003400a8001600ee00720058008e003d0048003b00eb00430099004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_2 = 003b00c2009a002f00980075003f00bf004c00270051009200250085004a0018
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_2 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_2 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_2 = 004000c800c5000a0068006800c200c6009b00c4003d00d3008900cc006f002f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_2 = 00200028008b00b2000800bd0042005700f300b9009f009a00e300d300a9009a
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_2 = 000a000800a9004b008b009d0037009a000000d000e800de00fb002200e0001b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_2 = 005700a6006d0004000c009d004600c0006c00bd00f6002a00a4004c00d90093
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_2 = 0063004900c000fd004d00ac00e100280068009400e100df001c002600d60006
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_2 = 00920038004400fd002700b400d300cc00c000170033005b0072005b001700be
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_2 = 002d00ec0000008600d300b3001e003a007d00e5007400e2004d00bd00ff0070
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_2 = 006c00c0005b002f001b00d8004400ba00f10010000e00a8005f0060007e00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_2 = 005c00e2004400d30013002600b6006f008f0095003100c8004c00b2006d00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_2 = 0042002200e000e5001900cd002e008e005800bd006e00af00df00e100c40088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_2 = 00f6004300bf00a300cf00a1005e00f200c70010008800280026009f00f300de
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_2 = 006f005f001e00cd00cb00cb0001002500bc004a008d006800710010006100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_2 = 00c40007000800dd000f006700e900b700d8006b006c00cb007e0045005e00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_2 = 00ab00340090003a0057002500ca00b1004400d40075009e00b2006f00090047
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_2 = 004e00e40028009900650092006c00e200ff002200bc00ed0039005900b40050
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_2 = 00b700ca00c9009d00ad004100c6005e00f60032007000c0003400e200a000af
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_2 = 00590076003700f500310076005900650021005c001700bb0044005900b20074
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_2 = 000600150083005b009900f600cb00c200bb004700a200fb00c30064003600de
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_2 = 00ee00c1006d00b400c7006100d8007f000400e7002100400006008e008d006b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_2 = 004f004300db0009008b007b001e004d00e5008700e300ae0056001800d10075
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_2 = 00c7002f00a800810015005200ca00cd0014005900a700250048002700f9004f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_2 = 00f900350037001b00ef000700f0005b0054002300e0001f009500ee00d30003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_2 = 00eb002500e8009e009300a600250034002c00bb00f60061008100dd00180006
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_2 = 00a500c600bc0037007d00d900e7006800db002100cb0018001200a500c20090
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_2 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_2 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_2 = 008f0020004f00a000ba008e00bd0037002800e400e8002400a800db0075001f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_2 = 0074002d00970098001200c00036005900b6009f0095001f008f0074006500a5
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_2 = 000f0039007d008400e500fe008c0085001f008a008f002d0041005400270027
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_2 = 00ff00ed00680060009f0075004f008300d40080000f00ca003500db00aa0002
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_2 = 0041008c003c009800190031006100f3001800dd00d200c800ce00b1002f001d
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_2 = 002b00b1000800f1001d0056009c00d9008400a200a900c1003b0024003f0017
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_2 = 005200b800ac00f400a3009c009c004b006000e5005d00a80050009700bc0013
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_2 = 00d7006500f900a9000c00b60041006f009c0012003a009d002b002e00d9009f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_2 = 0097006600e6007700a7006f000400e3002a00230054003100b600ec00d40060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_2 = 006a00c3005f00ce00b900230072009d0021006d007b00970001000f00230088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_2 = 001c00d900c4002e0091003b003a0046008400da009500000099002900590056
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_2 = 00d000ce007600c100e80065003c0036001f00ed00ba003b0089005d00400024
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_2 = 008800ac00a800350074007700ee00f6009a00330003007c0058007d000e009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_2 = 006b005d00c0003900cd00e800db008500d10008000a008300b300a5005d00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_2 = 00b8006300940025000300fc0060002500c10032008b009400de0099004700f6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_2 = 004500b7001900510086009b0072003b0044004b00680008001800eb002300d8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_2 = 0037007600ce00ca00c2006500ef001000d9009900a7003f005500ee001f00b1
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_2 = 00890055002900b400800058002e00c600a400ae002800a200f100fc002400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_2 = 00a300350051000d006f00fd004800cb0022000f00fd00c0002300a4007a00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_2 = 0092005100d70060007a00dd00ad005d0061001800f0004600cc00ff00a6001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_2 = 00a6008200ea00dc000f0037006b005d00e3006a00f7004800cb009000ba005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_2 = 00a3009e00ea005300e600c800ea00ef0049000d005300cc00dd00ed000b00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_2 = 008c008e00c0001c006300d6007500a900bf00cf003100e8004c005b00130094
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_2 = 0069009f009f0034004600a1007c00da00f700d1006400f8003500bd00b400ed
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_2 = 002200f8003700db002f003700c2003e002d00c800b1009200f60006002300ce
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_2 = 004a008e007000160096004a003d0069009f00f900c6004c00c50050005c00d1
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_2 = 000e00e70028008f0006003e00ec00dc00a100ad004f0041002700fb00a8004c
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_2 = 005200fc00cb009100a900f300b800c60085004d00cc00b70061003500110044
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_2 = 005c007c002d005d007e00d2006900a5004700a9003700be0014005800f800ca
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_2 = 003500f500cd0051006600cf0068009f00d300d000e00006003f003a00e9006b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_2 = 003a00c500f700f900af001a00f70012003400be00d90053009b00e6009400f6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_2 = 0050001100e70002009600a600430096002000ee00760014005a005a000a004e
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_3 = 0017001d00be00db00a70009001000df00d10078005500f1004000100052002f
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_3 = 0010002e008800c0000c00e50028002e002a006800a700df009900ed000200dc
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_3 = 004a00c7004d00c90021008600f60044001b00cd00ca0018008c001b00840049
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_3 = 002300a30069006300100077008800bc0067009d000100ba005600cf006c001a
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_3 = 00d6006c005600b9006300fa00d500cc008700a5008900900028007500f700d7
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_3 = 009200d500fc002200c700ab006c00bc00ed0059000d007000b90097000a00e6
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_3 = 007800fe004600f1005b00bf00c900f3007000fe00f400ff008400fa00a0001a
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_3 = 00b300a500aa00fb00d9006a00b1002500c000ec001800a10049003a00260021
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_3 = 0085003800ac000c00360018002f00bf0011005100810053003d008b00df00ca
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_3 = 00290035004f009a0039001900a00022007300210048007000fa00f7002a00ec
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_3 = 00e1003200ab00ed0006008700760073001c00e400c700e8003d00e3002200a4
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_3 = 0070002100c200fe008c00cc00030054001b00e000b80071002000fd001b00e0
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_3 = 000b0062001400a3002b00fa0085004a000f00ff000c005a00be0032004e0095
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_3 = 0093008e00c200ad00c200bb00cc008f008d00f40022002300280050006400dc
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_3 = 00c80058008c00f60088001f008a0082009000f2005c00b100e8009e002d0080
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_3 = 005800de00fb009d00f70021004a00bc00bb00c1006600a3004a001100ac0065
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_3 = 004c00e6003400a8001600ee00720058008e003d0048003b00eb00430099004a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_3 = 003b00c2009a002f00980075003f00bf004c00270051009200250085004a0018
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_3 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_3 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_3 = 004000c800c5000a0068006800c200c6009b00c4003d00d3008900cc006f002f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_3 = 00200028008b00b2000800bd0042005700f300b9009f009a00e300d300a9009a
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_3 = 000a000800a9004b008b009d0037009a000000d000e800de00fb002200e0001b
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_3 = 005700a6006d0004000c009d004600c0006c00bd00f6002a00a4004c00d90093
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_3 = 0063004900c000fd004d00ac00e100280068009400e100df001c002600d60006
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_3 = 00920038004400fd002700b400d300cc00c000170033005b0072005b001700be
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_3 = 002d00ec0000008600d300b3001e003a007d00e5007400e2004d00bd00ff0070
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_3 = 006c00c0005b002f001b00d8004400ba00f10010000e00a8005f0060007e00cb
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_3 = 005c00e2004400d30013002600b6006f008f0095003100c8004c00b2006d00ea
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_3 = 0042002200e000e5001900cd002e008e005800bd006e00af00df00e100c40088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_3 = 00f6004300bf00a300cf00a1005e00f200c70010008800280026009f00f300de
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_3 = 006f005f001e00cd00cb00cb0001002500bc004a008d006800710010006100fe
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_3 = 00c40007000800dd000f006700e900b700d8006b006c00cb007e0045005e00d2
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_3 = 00ab00340090003a0057002500ca00b1004400d40075009e00b2006f00090047
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_3 = 004e00e40028009900650092006c00e200ff002200bc00ed0039005900b40050
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_3 = 00b700ca00c9009d00ad004100c6005e00f60032007000c0003400e200a000af
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_3 = 00590076003700f500310076005900650021005c001700bb0044005900b20074
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_3 = 000600150083005b009900f600cb00c200bb004700a200fb00c30064003600de
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_3 = 00ee00c1006d00b400c7006100d8007f000400e7002100400006008e008d006b
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_3 = 004f004300db0009008b007b001e004d00e5008700e300ae0056001800d10075
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_3 = 00c7002f00a800810015005200ca00cd0014005900a700250048002700f9004f
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_3 = 00f900350037001b00ef000700f0005b0054002300e0001f009500ee00d30003
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_3 = 00eb002500e8009e009300a600250034002c00bb00f60061008100dd00180006
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_3 = 00a500c600bc0037007d00d900e7006800db002100cb0018001200a500c20090
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_3 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_3 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_3 = 008f0020004f00a000ba008e00bd0037002800e400e8002400a800db0075001f
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_3 = 0074002d00970098001200c00036005900b6009f0095001f008f0074006500a5
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_3 = 000f0039007d008400e500fe008c0085001f008a008f002d0041005400270027
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_3 = 00ff00ed00680060009f0075004f008300d40080000f00ca003500db00aa0002
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_3 = 0041008c003c009800190031006100f3001800dd00d200c800ce00b1002f001d
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_3 = 002b00b1000800f1001d0056009c00d9008400a200a900c1003b0024003f0017
-
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_3 = 005200b800ac00f400a3009c009c004b006000e5005d00a80050009700bc0013
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_3 = 00d7006500f900a9000c00b60041006f009c0012003a009d002b002e00d9009f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_3 = 0097006600e6007700a7006f000400e3002a00230054003100b600ec00d40060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_3 = 006a00c3005f00ce00b900230072009d0021006d007b00970001000f00230088
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_3 = 001c00d900c4002e0091003b003a0046008400da009500000099002900590056
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_3 = 00d000ce007600c100e80065003c0036001f00ed00ba003b0089005d00400024
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_3 = 008800ac00a800350074007700ee00f6009a00330003007c0058007d000e009e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_3 = 006b005d00c0003900cd00e800db008500d10008000a008300b300a5005d00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_3 = 00b8006300940025000300fc0060002500c10032008b009400de0099004700f6
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_3 = 004500b7001900510086009b0072003b0044004b00680008001800eb002300d8
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_3 = 0037007600ce00ca00c2006500ef001000d9009900a7003f005500ee001f00b1
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_3 = 00890055002900b400800058002e00c600a400ae002800a200f100fc002400e8
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_3 = 00a300350051000d006f00fd004800cb0022000f00fd00c0002300a4007a00c5
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_3 = 0092005100d70060007a00dd00ad005d0061001800f0004600cc00ff00a6001d
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_3 = 00a6008200ea00dc000f0037006b005d00e3006a00f7004800cb009000ba005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_3 = 00a3009e00ea005300e600c800ea00ef0049000d005300cc00dd00ed000b00d9
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_3 = 008c008e00c0001c006300d6007500a900bf00cf003100e8004c005b00130094
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_3 = 0069009f009f0034004600a1007c00da00f700d1006400f8003500bd00b400ed
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_3 = 002200f8003700db002f003700c2003e002d00c800b1009200f60006002300ce
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_3 = 004a008e007000160096004a003d0069009f00f900c6004c00c50050005c00d1
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_3 = 000e00e70028008f0006003e00ec00dc00a100ad004f0041002700fb00a8004c
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_3 = 005200fc00cb009100a900f300b800c60085004d00cc00b70061003500110044
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_3 = 005c007c002d005d007e00d2006900a5004700a9003700be0014005800f800ca
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_3 = 003500f500cd0051006600cf0068009f00d300d000e00006003f003a00e9006b
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_3 = 003a00c500f700f900af001a00f70012003400be00d90053009b00e6009400f6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_3 = 0050001100e70002009600a600430096002000ee00760014005a005a000a004e
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16M_3 = 008f00ce004300dd003500a9004700ea00b200ef00c5008b003e00c4001900e0
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16M_3 = 00d900c700ef008a00e500b800f5003900a900ae000200d7005d00740069001b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16M_3 = 008a00d00087004800ff009600e2007300590084005100b900b400c400b000cd
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16M_3 = 0076009500710087000a005100cd00f100f700d00036006600ff001f00ba00ed
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16M_3 = 007700eb004d009a005b00af008c00d100bd005700f6008b009a00ce003800bc
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_0 = 0078005a00a600710049007c00ab00cc00c40035002d0070009000b2000200c4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_0 = 00c6009700b700b200d400890056008e007f00fe00f300a900140041003b007f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_0 = 002a008500de0002000f005f00140047003b00d700ae00b9006e00fa008d0045
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_0 = 0061004300da001f001a002900680077007e00cf000800b4002100bb00ca0013
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_0 = 003d0055006d0082009a009000de003e00ff00df006a00b10031007f006500f8
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_0 = 00c5002b005a008d00c7001c00a1003e002700e5001b00f400d4002b00e80085
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_0 = 000300a9004a00b70044002f00a2003800bf008e00ec00e400d40063001f0075
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_0 = 0072001c0085004b0040006d0090005e008e00cd00b40044005900df00ae00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_0 = 00e6008600f2002600690050002a005b000f00e400f20059005e001a0077009f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_0 = 00c2005a007400dd003b0095009500390006003200fc004300c20026009500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_0 = 0077005b0017002400a90097008700d100460075007d00ee00c6004e001b00e8
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_0 = 006000e7006400ce00c200e40076005e008500bf00d000300093006a00540053
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_0 = 000300f9000c0055009c00cc004e00560039004200990072008a006c006400a2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_0 = 008600b700ca0091004100510059006c00f30070004d0021006300e1005f001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_0 = 00d8004b003e0032009b0092004f0010008400340061006c003a00c000a00093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_0 = 00dc00f6009f00c4008500d900e30018005a002400de007a00e90049006f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_0 = 00310095006d007500e8007300f100080077002b004500f0005c008300c7006f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_0 = 00bf006400ce002600ef00cd008800df00f9002a00b900b700230087003e00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_0 = 00e1003d009100920011002a00fd00770099004c004d00df009c001f00f20074
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_0 = 00ae00e200c8004e002f009100ac00b0008500ae00ec004500a3009300990070
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_0 = 00f100b500200004002a007a00d6000300d50039006b0007009e0007007a001a
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_0 = 006600970024009e001d001e00cf000400a30083007400fe007400a1006000bd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_0 = 003c000700e100c300bc000800f6008a001300fd003a00db00c60032004e0073
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_0 = 002d0075002a007d00b900d500f0007500b20053000400b0000d001600390031
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_0 = 005f00ca0071003500fd007000ea00b90008008f00b800f90065004b0005001f
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_0 = 00c4003f00e6007200ae004000690077000000e800980018005000fd0098001e
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_0 = 0032002a00ea0024003c00a400cd00af003600e600f70059000600a1000e00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_0 = 009e002b00c70023008700a7005200f700860065009b00c1005f00f300ea00ad
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_0 = 007e00f0008800600004002800240068009400a900f900c10058007000730060
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_0 = 006d00060051009e00ac00eb00c400ac00a1006300c00069007f00f300e5007f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_0 = 00a500a3001600f900310011005800f000c50026004d003000320018006700af
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_0 = 008e0014000b00b300c30052006100b8009a00d400c4005000ad006200c40062
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_0 = 008600a9006600ee001600ef008a0039001c00f90017002c0067001b006b0084
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_0 = 00a1006d00400047008f005a00b100fd007b007200cd009c007500d500f2003f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_0 = 00fd00a800db002000c60071001a0017009a0069005400bd00dc00e1000f00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_0 = 000d00e400da00c90021002d0034003e00fb005e00ae00e500010036005f005c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_0 = 005b001c0012006b00b9001b00ca00bc009f00c8002e00b7002d00ee006f0067
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_0 = 00db005b006a0081008f000a00a4001200c80069009b000c003b00ca00e90022
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_0 = 009b0043003a00d900ee00110019005300f000fc00a70058003400350033002b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_0 = 004f008600fd003c00e200b80019005600d2002900bd0098001500dc007100d8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_0 = 000f005200a80092002f00ec00630057003d00b6006500b100ea00ba0037007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_0 = 00520033008e00ea0048009b005c007300e60054009a000900fb00a0002300ef
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_0 = 00e6006400f500b6008900d60035006d00ce00100046002b00f100ca0069005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_0 = 00d300f800c30083009900c00067009000e90049006000240075003d002a002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_0 = 0021009e00ff000600c60048002e004a00000019003d00d600350070009600bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_0 = 0013009a0013007400d100d9006f00f20013007400e7006b005900930041008d
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_0 = 003900e000020026008800ec007b008500bd00e60088005b003800ad00de0089
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_0 = 00e700d5000e009d005200e6007100d600a800fc001500d500f50099006500b9
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_0 = 004100e000aa0043002e008d00a100c000ac001700de00cf00b0001800020022
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_0 = 007800a9001000cf004100b800aa00fb008000ae00790037003c00ed00a0007e
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_0 = 00b800a5008a00cb00bf000d00a300b8004800db003d00e1002f00c2000800b8
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_0 = 007500ce00cf00c900a700e600a200050018009100a4006500e7003900d00023
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_0 = 001a006900ca007300ee00b700c7008300dc005d0021001800f500730032000e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_0 = 008a008300c700e4009e009600d2004e003900e500690087004b004300fa0039
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_0 = 008f00dc001f000000a100ba00fa009e00c500ae00530099001e005300d20041
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_0 = 009800b5001e00f200b700560003008a0002000500c200b50014002d00e2002f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_0 = 004300ea00fd00fd008400a900dc000e002b003000ee00760032009800d9005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_0 = 008f0079006900bf005d00ad00d200ba0075009500ca00490040009100c700b8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_0 = 008100720042004b004000ea007a0051005f001a00f30025009900d400370039
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_0 = 00ff005f001100f000ba00e7008500e300b1003700cc005d00e7001d00a2008e
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_0 = 001a009c00b700f40050002a00c600fb004300aa001f005100ee00b600350070
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_0 = 005300b90038001c0048004c000c00c0003900c8008f003b00a7009d001b0044
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_0 = 000700f1008c00b6007b003d005000a50032002200ba00200046003700a4009a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_0 = 00a20022002700bb009b000e006e00c20063008000cd00e200ad009e00dc007d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_0 = 004d00a300cb00d800df0091004d0097006b00370093009e0007007b0088008c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_0 = 001a0020004700f300660012001000b700d200d6008800b000c300b300f70066
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_0 = 00ee00d80006003500c800ef003a00b900ed003d000b00140043004900d500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_0 = 0067005f006c003a009f00e7003100f7007000ae0073005b00430030005a004d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_0 = 00f300e7009e001d00ba00a200a600d80027004600d100db00b9006c00730029
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_0 = 005f001b00e800cb00af001800b20052000d00a9002200520067001300b70036
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_0 = 0067002f00b700530051006a003500b4006900c00084003a00bc0012003a0073
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_0 = 003c005a006f00aa007d00b800b5009f00ec00a00030004100530082007000d2
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_0 = 00ee00ec0072006200e3000c004a002b00c100fb006e005800da00e3002a0057
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_0 = 00d4000f0049002a0062000d008b002f00af00130086000e003d00d2009100e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_0 = 00a900e200cb00f1004e00680039001400d7001b0025009300db00430047009b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_0 = 005d006800b200a6004200a900aa0015007a00f700fa00b600cf009000180034
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_0 = 00930008003d00f20032005300da004000b3006a005200ec00aa00610080002b
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_0 = 009e00f50089007d00cc00d800630057007900780007007d00e600b5006b00db
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_1 = 0078005a00a600710049007c00ab00cc00c40035002d0070009000b2000200c4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_1 = 00c6009700b700b200d400890056008e007f00fe00f300a900140041003b007f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_1 = 002a008500de0002000f005f00140047003b00d700ae00b9006e00fa008d0045
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_1 = 0061004300da001f001a002900680077007e00cf000800b4002100bb00ca0013
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_1 = 003d0055006d0082009a009000de003e00ff00df006a00b10031007f006500f8
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_1 = 00c5002b005a008d00c7001c00a1003e002700e5001b00f400d4002b00e80085
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_1 = 000300a9004a00b70044002f00a2003800bf008e00ec00e400d40063001f0075
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_1 = 0072001c0085004b0040006d0090005e008e00cd00b40044005900df00ae00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_1 = 00e6008600f2002600690050002a005b000f00e400f20059005e001a0077009f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_1 = 00c2005a007400dd003b0095009500390006003200fc004300c20026009500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_1 = 0077005b0017002400a90097008700d100460075007d00ee00c6004e001b00e8
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_1 = 006000e7006400ce00c200e40076005e008500bf00d000300093006a00540053
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_1 = 000300f9000c0055009c00cc004e00560039004200990072008a006c006400a2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_1 = 008600b700ca0091004100510059006c00f30070004d0021006300e1005f001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_1 = 00d8004b003e0032009b0092004f0010008400340061006c003a00c000a00093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_1 = 00dc00f6009f00c4008500d900e30018005a002400de007a00e90049006f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_1 = 00310095006d007500e8007300f100080077002b004500f0005c008300c7006f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_1 = 00bf006400ce002600ef00cd008800df00f9002a00b900b700230087003e00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_1 = 00e1003d009100920011002a00fd00770099004c004d00df009c001f00f20074
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_1 = 00ae00e200c8004e002f009100ac00b0008500ae00ec004500a3009300990070
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_1 = 00f100b500200004002a007a00d6000300d50039006b0007009e0007007a001a
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_1 = 006600970024009e001d001e00cf000400a30083007400fe007400a1006000bd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_1 = 003c000700e100c300bc000800f6008a001300fd003a00db00c60032004e0073
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_1 = 002d0075002a007d00b900d500f0007500b20053000400b0000d001600390031
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_1 = 005f00ca0071003500fd007000ea00b90008008f00b800f90065004b0005001f
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_1 = 00c4003f00e6007200ae004000690077000000e800980018005000fd0098001e
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_1 = 0032002a00ea0024003c00a400cd00af003600e600f70059000600a1000e00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_1 = 009e002b00c70023008700a7005200f700860065009b00c1005f00f300ea00ad
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_1 = 007e00f0008800600004002800240068009400a900f900c10058007000730060
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_1 = 006d00060051009e00ac00eb00c400ac00a1006300c00069007f00f300e5007f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_1 = 00a500a3001600f900310011005800f000c50026004d003000320018006700af
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_1 = 008e0014000b00b300c30052006100b8009a00d400c4005000ad006200c40062
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_1 = 008600a9006600ee001600ef008a0039001c00f90017002c0067001b006b0084
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_1 = 00a1006d00400047008f005a00b100fd007b007200cd009c007500d500f2003f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_1 = 00fd00a800db002000c60071001a0017009a0069005400bd00dc00e1000f00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_1 = 000d00e400da00c90021002d0034003e00fb005e00ae00e500010036005f005c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_1 = 005b001c0012006b00b9001b00ca00bc009f00c8002e00b7002d00ee006f0067
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_1 = 00db005b006a0081008f000a00a4001200c80069009b000c003b00ca00e90022
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_1 = 009b0043003a00d900ee00110019005300f000fc00a70058003400350033002b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_1 = 004f008600fd003c00e200b80019005600d2002900bd0098001500dc007100d8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_1 = 000f005200a80092002f00ec00630057003d00b6006500b100ea00ba0037007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_1 = 00520033008e00ea0048009b005c007300e60054009a000900fb00a0002300ef
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_1 = 00e6006400f500b6008900d60035006d00ce00100046002b00f100ca0069005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_1 = 00d300f800c30083009900c00067009000e90049006000240075003d002a002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_1 = 0021009e00ff000600c60048002e004a00000019003d00d600350070009600bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_1 = 0013009a0013007400d100d9006f00f20013007400e7006b005900930041008d
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_1 = 003900e000020026008800ec007b008500bd00e60088005b003800ad00de0089
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_1 = 00e700d5000e009d005200e6007100d600a800fc001500d500f50099006500b9
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_1 = 004100e000aa0043002e008d00a100c000ac001700de00cf00b0001800020022
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_1 = 007800a9001000cf004100b800aa00fb008000ae00790037003c00ed00a0007e
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_1 = 00b800a5008a00cb00bf000d00a300b8004800db003d00e1002f00c2000800b8
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_1 = 007500ce00cf00c900a700e600a200050018009100a4006500e7003900d00023
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_1 = 001a006900ca007300ee00b700c7008300dc005d0021001800f500730032000e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_1 = 008a008300c700e4009e009600d2004e003900e500690087004b004300fa0039
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_1 = 008f00dc001f000000a100ba00fa009e00c500ae00530099001e005300d20041
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_1 = 009800b5001e00f200b700560003008a0002000500c200b50014002d00e2002f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_1 = 004300ea00fd00fd008400a900dc000e002b003000ee00760032009800d9005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_1 = 008f0079006900bf005d00ad00d200ba0075009500ca00490040009100c700b8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_1 = 008100720042004b004000ea007a0051005f001a00f30025009900d400370039
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_1 = 00ff005f001100f000ba00e7008500e300b1003700cc005d00e7001d00a2008e
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_1 = 001a009c00b700f40050002a00c600fb004300aa001f005100ee00b600350070
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_1 = 005300b90038001c0048004c000c00c0003900c8008f003b00a7009d001b0044
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_1 = 000700f1008c00b6007b003d005000a50032002200ba00200046003700a4009a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_1 = 00a20022002700bb009b000e006e00c20063008000cd00e200ad009e00dc007d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_1 = 004d00a300cb00d800df0091004d0097006b00370093009e0007007b0088008c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_1 = 001a0020004700f300660012001000b700d200d6008800b000c300b300f70066
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_1 = 00ee00d80006003500c800ef003a00b900ed003d000b00140043004900d500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_1 = 0067005f006c003a009f00e7003100f7007000ae0073005b00430030005a004d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_1 = 00f300e7009e001d00ba00a200a600d80027004600d100db00b9006c00730029
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_1 = 005f001b00e800cb00af001800b20052000d00a9002200520067001300b70036
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_1 = 0067002f00b700530051006a003500b4006900c00084003a00bc0012003a0073
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_1 = 003c005a006f00aa007d00b800b5009f00ec00a00030004100530082007000d2
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_1 = 00ee00ec0072006200e3000c004a002b00c100fb006e005800da00e3002a0057
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_1 = 00d4000f0049002a0062000d008b002f00af00130086000e003d00d2009100e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_1 = 00a900e200cb00f1004e00680039001400d7001b0025009300db00430047009b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_1 = 005d006800b200a6004200a900aa0015007a00f700fa00b600cf009000180034
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_1 = 00930008003d00f20032005300da004000b3006a005200ec00aa00610080002b
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_1 = 009e00f50089007d00cc00d800630057007900780007007d00e600b5006b00db
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_2 = 0078005a00a600710049007c00ab00cc00c40035002d0070009000b2000200c4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_2 = 00c6009700b700b200d400890056008e007f00fe00f300a900140041003b007f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_2 = 002a008500de0002000f005f00140047003b00d700ae00b9006e00fa008d0045
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_2 = 0061004300da001f001a002900680077007e00cf000800b4002100bb00ca0013
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_2 = 003d0055006d0082009a009000de003e00ff00df006a00b10031007f006500f8
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_2 = 00c5002b005a008d00c7001c00a1003e002700e5001b00f400d4002b00e80085
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_2 = 000300a9004a00b70044002f00a2003800bf008e00ec00e400d40063001f0075
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_2 = 0072001c0085004b0040006d0090005e008e00cd00b40044005900df00ae00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_2 = 00e6008600f2002600690050002a005b000f00e400f20059005e001a0077009f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_2 = 00c2005a007400dd003b0095009500390006003200fc004300c20026009500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_2 = 0077005b0017002400a90097008700d100460075007d00ee00c6004e001b00e8
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_2 = 006000e7006400ce00c200e40076005e008500bf00d000300093006a00540053
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_2 = 000300f9000c0055009c00cc004e00560039004200990072008a006c006400a2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_2 = 008600b700ca0091004100510059006c00f30070004d0021006300e1005f001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_2 = 00d8004b003e0032009b0092004f0010008400340061006c003a00c000a00093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_2 = 00dc00f6009f00c4008500d900e30018005a002400de007a00e90049006f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_2 = 00310095006d007500e8007300f100080077002b004500f0005c008300c7006f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_2 = 00bf006400ce002600ef00cd008800df00f9002a00b900b700230087003e00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_2 = 00e1003d009100920011002a00fd00770099004c004d00df009c001f00f20074
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_2 = 00ae00e200c8004e002f009100ac00b0008500ae00ec004500a3009300990070
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_2 = 00f100b500200004002a007a00d6000300d50039006b0007009e0007007a001a
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_2 = 006600970024009e001d001e00cf000400a30083007400fe007400a1006000bd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_2 = 003c000700e100c300bc000800f6008a001300fd003a00db00c60032004e0073
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_2 = 002d0075002a007d00b900d500f0007500b20053000400b0000d001600390031
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_2 = 005f00ca0071003500fd007000ea00b90008008f00b800f90065004b0005001f
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_2 = 00c4003f00e6007200ae004000690077000000e800980018005000fd0098001e
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_2 = 0032002a00ea0024003c00a400cd00af003600e600f70059000600a1000e00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_2 = 009e002b00c70023008700a7005200f700860065009b00c1005f00f300ea00ad
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_2 = 007e00f0008800600004002800240068009400a900f900c10058007000730060
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_2 = 006d00060051009e00ac00eb00c400ac00a1006300c00069007f00f300e5007f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_2 = 00a500a3001600f900310011005800f000c50026004d003000320018006700af
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_2 = 008e0014000b00b300c30052006100b8009a00d400c4005000ad006200c40062
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_2 = 008600a9006600ee001600ef008a0039001c00f90017002c0067001b006b0084
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_2 = 00a1006d00400047008f005a00b100fd007b007200cd009c007500d500f2003f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_2 = 00fd00a800db002000c60071001a0017009a0069005400bd00dc00e1000f00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_2 = 000d00e400da00c90021002d0034003e00fb005e00ae00e500010036005f005c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_2 = 005b001c0012006b00b9001b00ca00bc009f00c8002e00b7002d00ee006f0067
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_2 = 00db005b006a0081008f000a00a4001200c80069009b000c003b00ca00e90022
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_2 = 009b0043003a00d900ee00110019005300f000fc00a70058003400350033002b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_2 = 004f008600fd003c00e200b80019005600d2002900bd0098001500dc007100d8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_2 = 000f005200a80092002f00ec00630057003d00b6006500b100ea00ba0037007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_2 = 00520033008e00ea0048009b005c007300e60054009a000900fb00a0002300ef
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_2 = 00e6006400f500b6008900d60035006d00ce00100046002b00f100ca0069005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_2 = 00d300f800c30083009900c00067009000e90049006000240075003d002a002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_2 = 0021009e00ff000600c60048002e004a00000019003d00d600350070009600bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_2 = 0013009a0013007400d100d9006f00f20013007400e7006b005900930041008d
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_2 = 003900e000020026008800ec007b008500bd00e60088005b003800ad00de0089
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_2 = 00e700d5000e009d005200e6007100d600a800fc001500d500f50099006500b9
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_2 = 004100e000aa0043002e008d00a100c000ac001700de00cf00b0001800020022
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_2 = 007800a9001000cf004100b800aa00fb008000ae00790037003c00ed00a0007e
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_2 = 00b800a5008a00cb00bf000d00a300b8004800db003d00e1002f00c2000800b8
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_2 = 007500ce00cf00c900a700e600a200050018009100a4006500e7003900d00023
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_2 = 001a006900ca007300ee00b700c7008300dc005d0021001800f500730032000e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_2 = 008a008300c700e4009e009600d2004e003900e500690087004b004300fa0039
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_2 = 008f00dc001f000000a100ba00fa009e00c500ae00530099001e005300d20041
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_2 = 009800b5001e00f200b700560003008a0002000500c200b50014002d00e2002f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_2 = 004300ea00fd00fd008400a900dc000e002b003000ee00760032009800d9005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_2 = 008f0079006900bf005d00ad00d200ba0075009500ca00490040009100c700b8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_2 = 008100720042004b004000ea007a0051005f001a00f30025009900d400370039
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_2 = 00ff005f001100f000ba00e7008500e300b1003700cc005d00e7001d00a2008e
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_2 = 001a009c00b700f40050002a00c600fb004300aa001f005100ee00b600350070
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_2 = 005300b90038001c0048004c000c00c0003900c8008f003b00a7009d001b0044
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_2 = 000700f1008c00b6007b003d005000a50032002200ba00200046003700a4009a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_2 = 00a20022002700bb009b000e006e00c20063008000cd00e200ad009e00dc007d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_2 = 004d00a300cb00d800df0091004d0097006b00370093009e0007007b0088008c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_2 = 001a0020004700f300660012001000b700d200d6008800b000c300b300f70066
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_2 = 00ee00d80006003500c800ef003a00b900ed003d000b00140043004900d500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_2 = 0067005f006c003a009f00e7003100f7007000ae0073005b00430030005a004d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_2 = 00f300e7009e001d00ba00a200a600d80027004600d100db00b9006c00730029
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_2 = 005f001b00e800cb00af001800b20052000d00a9002200520067001300b70036
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_2 = 0067002f00b700530051006a003500b4006900c00084003a00bc0012003a0073
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_2 = 003c005a006f00aa007d00b800b5009f00ec00a00030004100530082007000d2
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_2 = 00ee00ec0072006200e3000c004a002b00c100fb006e005800da00e3002a0057
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_2 = 00d4000f0049002a0062000d008b002f00af00130086000e003d00d2009100e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_2 = 00a900e200cb00f1004e00680039001400d7001b0025009300db00430047009b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_2 = 005d006800b200a6004200a900aa0015007a00f700fa00b600cf009000180034
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_2 = 00930008003d00f20032005300da004000b3006a005200ec00aa00610080002b
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_2 = 009e00f50089007d00cc00d800630057007900780007007d00e600b5006b00db
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor4K_3 = 0078005a00a600710049007c00ab00cc00c40035002d0070009000b2000200c4
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor4K_3 = 00c6009700b700b200d400890056008e007f00fe00f300a900140041003b007f
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor4K_3 = 002a008500de0002000f005f00140047003b00d700ae00b9006e00fa008d0045
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor4K_3 = 0061004300da001f001a002900680077007e00cf000800b4002100bb00ca0013
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor4K_3 = 003d0055006d0082009a009000de003e00ff00df006a00b10031007f006500f8
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor4K_3 = 00c5002b005a008d00c7001c00a1003e002700e5001b00f400d4002b00e80085
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor4K_3 = 000300a9004a00b70044002f00a2003800bf008e00ec00e400d40063001f0075
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor4K_3 = 0072001c0085004b0040006d0090005e008e00cd00b40044005900df00ae00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor4K_3 = 00e6008600f2002600690050002a005b000f00e400f20059005e001a0077009f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor4K_3 = 00c2005a007400dd003b0095009500390006003200fc004300c20026009500dc
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor4K_3 = 0077005b0017002400a90097008700d100460075007d00ee00c6004e001b00e8
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor4K_3 = 006000e7006400ce00c200e40076005e008500bf00d000300093006a00540053
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor4K_3 = 000300f9000c0055009c00cc004e00560039004200990072008a006c006400a2
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor4K_3 = 008600b700ca0091004100510059006c00f30070004d0021006300e1005f001d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor4K_3 = 00d8004b003e0032009b0092004f0010008400340061006c003a00c000a00093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor4K_3 = 00dc00f6009f00c4008500d900e30018005a002400de007a00e90049006f0011
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor4K_3 = 00310095006d007500e8007300f100080077002b004500f0005c008300c7006f
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor4K_3 = 00bf006400ce002600ef00cd008800df00f9002a00b900b700230087003e00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor4K_3 = 00e1003d009100920011002a00fd00770099004c004d00df009c001f00f20074
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor4K_3 = 00ae00e200c8004e002f009100ac00b0008500ae00ec004500a3009300990070
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor4K_3 = 00f100b500200004002a007a00d6000300d50039006b0007009e0007007a001a
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor4K_3 = 006600970024009e001d001e00cf000400a30083007400fe007400a1006000bd
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor4K_3 = 003c000700e100c300bc000800f6008a001300fd003a00db00c60032004e0073
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor4K_3 = 002d0075002a007d00b900d500f0007500b20053000400b0000d001600390031
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor4K_3 = 005f00ca0071003500fd007000ea00b90008008f00b800f90065004b0005001f
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor4K_3 = 00c4003f00e6007200ae004000690077000000e800980018005000fd0098001e
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor4K_3 = 0032002a00ea0024003c00a400cd00af003600e600f70059000600a1000e00c1
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor4K_3 = 009e002b00c70023008700a7005200f700860065009b00c1005f00f300ea00ad
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor4K_3 = 007e00f0008800600004002800240068009400a900f900c10058007000730060
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor4K_3 = 006d00060051009e00ac00eb00c400ac00a1006300c00069007f00f300e5007f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor4K_3 = 00a500a3001600f900310011005800f000c50026004d003000320018006700af
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor4K_3 = 008e0014000b00b300c30052006100b8009a00d400c4005000ad006200c40062
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor4K_3 = 008600a9006600ee001600ef008a0039001c00f90017002c0067001b006b0084
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor4K_3 = 00a1006d00400047008f005a00b100fd007b007200cd009c007500d500f2003f
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor4K_3 = 00fd00a800db002000c60071001a0017009a0069005400bd00dc00e1000f00fc
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor4K_3 = 000d00e400da00c90021002d0034003e00fb005e00ae00e500010036005f005c
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor4K_3 = 005b001c0012006b00b9001b00ca00bc009f00c8002e00b7002d00ee006f0067
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor4K_3 = 00db005b006a0081008f000a00a4001200c80069009b000c003b00ca00e90022
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor4K_3 = 009b0043003a00d900ee00110019005300f000fc00a70058003400350033002b
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor4K_3 = 004f008600fd003c00e200b80019005600d2002900bd0098001500dc007100d8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor4K_3 = 000f005200a80092002f00ec00630057003d00b6006500b100ea00ba0037007e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor4K_3 = 00520033008e00ea0048009b005c007300e60054009a000900fb00a0002300ef
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor4K_3 = 00e6006400f500b6008900d60035006d00ce00100046002b00f100ca0069005c
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor4K_3 = 00d300f800c30083009900c00067009000e90049006000240075003d002a002b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor4K_3 = 0021009e00ff000600c60048002e004a00000019003d00d600350070009600bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor4K_3 = 0013009a0013007400d100d9006f00f20013007400e7006b005900930041008d
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor4K_3 = 003900e000020026008800ec007b008500bd00e60088005b003800ad00de0089
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor4K_3 = 00e700d5000e009d005200e6007100d600a800fc001500d500f50099006500b9
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor4K_3 = 004100e000aa0043002e008d00a100c000ac001700de00cf00b0001800020022
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor4K_3 = 007800a9001000cf004100b800aa00fb008000ae00790037003c00ed00a0007e
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor4K_3 = 00b800a5008a00cb00bf000d00a300b8004800db003d00e1002f00c2000800b8
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor4K_3 = 007500ce00cf00c900a700e600a200050018009100a4006500e7003900d00023
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor4K_3 = 001a006900ca007300ee00b700c7008300dc005d0021001800f500730032000e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor4K_3 = 008a008300c700e4009e009600d2004e003900e500690087004b004300fa0039
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor4K_3 = 008f00dc001f000000a100ba00fa009e00c500ae00530099001e005300d20041
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor4K_3 = 009800b5001e00f200b700560003008a0002000500c200b50014002d00e2002f
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor4K_3 = 004300ea00fd00fd008400a900dc000e002b003000ee00760032009800d9005e
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor4K_3 = 008f0079006900bf005d00ad00d200ba0075009500ca00490040009100c700b8
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor4K_3 = 008100720042004b004000ea007a0051005f001a00f30025009900d400370039
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor4K_3 = 00ff005f001100f000ba00e7008500e300b1003700cc005d00e7001d00a2008e
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor4K_3 = 001a009c00b700f40050002a00c600fb004300aa001f005100ee00b600350070
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor4K_3 = 005300b90038001c0048004c000c00c0003900c8008f003b00a7009d001b0044
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor4K_3 = 000700f1008c00b6007b003d005000a50032002200ba00200046003700a4009a
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor4K_3 = 00a20022002700bb009b000e006e00c20063008000cd00e200ad009e00dc007d
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor4K_3 = 004d00a300cb00d800df0091004d0097006b00370093009e0007007b0088008c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor4K_3 = 001a0020004700f300660012001000b700d200d6008800b000c300b300f70066
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor4K_3 = 00ee00d80006003500c800ef003a00b900ed003d000b00140043004900d500f3
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor4K_3 = 0067005f006c003a009f00e7003100f7007000ae0073005b00430030005a004d
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor4K_3 = 00f300e7009e001d00ba00a200a600d80027004600d100db00b9006c00730029
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor4K_3 = 005f001b00e800cb00af001800b20052000d00a9002200520067001300b70036
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor4K_3 = 0067002f00b700530051006a003500b4006900c00084003a00bc0012003a0073
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor4K_3 = 003c005a006f00aa007d00b800b5009f00ec00a00030004100530082007000d2
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor4K_3 = 00ee00ec0072006200e3000c004a002b00c100fb006e005800da00e3002a0057
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor4K_3 = 00d4000f0049002a0062000d008b002f00af00130086000e003d00d2009100e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor4K_3 = 00a900e200cb00f1004e00680039001400d7001b0025009300db00430047009b
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor4K_3 = 005d006800b200a6004200a900aa0015007a00f700fa00b600cf009000180034
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor4K_3 = 00930008003d00f20032005300da004000b3006a005200ec00aa00610080002b
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor4K_3 = 009e00f50089007d00cc00d800630057007900780007007d00e600b5006b00db
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_0 = 00ae00940023006300a100e70067006700df0046000200fd00a10082009100dc
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_0 = 0094008600f30020003300c1005a001500e9002e0039006f00ec005e002900df
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_0 = 000b000300c900fa002f0003007c00b400b400c5003d00e30024005a0021009d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_0 = 00090054005c00ad00cc002200c000dd00ae00a800b200820047006600d6009d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_0 = 006200f500e600f9006900ff006300ad008a00dc00070074009a007200a200bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_0 = 001600c800a5006e007900ff000700cf00ea00e90084008e006d004c00f2002d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_0 = 003300a100060041009c00a2008c00c7007d00dc006f005600aa008a004a0079
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_0 = 000d0047005800a400f000c8000c000f0085004f0042003400e800f6000d00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_0 = 008a000f00ad0025001100a400170013008d007b004f00960064001b00840083
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_0 = 008700b000f500a200f7004e00a100be004500a200fb00e3009700db00f500b5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_0 = 0052005e00af008d0004007a006900a6000f00040084004f0068000200ef009e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_0 = 0094001700cd003300f300fd003d0012001c003100ff0027000300ab009a00f7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_0 = 0024004e0045000c00e400ae006d00bd0044009500860013009b002f00110066
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_0 = 00c000ea008a00cd002300d2008e00700007003d001a009900ea00e6000f0003
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_0 = 0059009c009500a800370043009c00260023009a000f0038007b003200370093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_0 = 0076001b0038008600ef00d7004c00af008100d2001b00f000a800fe000c0004
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_0 = 0050009900ec006900e70052005d007000a900ee008800ca00f70022008700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_0 = 009d0053004d0061008500750012000b003100f1003600df0008007200830086
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_0 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_0 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_0 = 00fd008b004100c6009b00dc004000be004d009a005d00e2008d0038004f0093
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_0 = 00f400f7003f0061001f005700ee00d400e700f1001f006100750083008300e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_0 = 00b200ce00df002d00f3006f00f3009d0046001c009600f100e100c0006b0029
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_0 = 0039001c00a500480027001200350064001200800054008900a8003900c4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_0 = 009600e7000f005b00c5003e00af006b00a200870021006a00bb00df00380000
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_0 = 006000c7003a001e001200d1009e003b007d0033005800b0002f007900e4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_0 = 009c007e00bb001a008f008d00f3004a00990072006400cd008d003800a50012
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_0 = 00e5004700bf006b00ae001300dd00df006800c00034002b0075006c00c900cd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_0 = 002900ba005c00fc00c300c500c6006900ec00c500cd006d004900be00460077
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_0 = 0047006a00e10066005d00bc0017005f002d003d006400540067002000f50006
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_0 = 0043008600bf00b20075002e00ce009f000500f200d7006000bf009000770068
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_0 = 00c800e8001000e20036009b0085004700b1000a00f40010000e00760085001d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_0 = 00d20053005000ae00a600bb00c4003b00020063000300d000670034003b00ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_0 = 002f00ee00620055006900470020005100fe00a3006c0097007200dd00170095
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_0 = 009a009800c300ef009a00d700b900b10003005a005b00c9000800fe0082001f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_0 = 00e500980091004e0057000c00b40028008b0038004e009e00480035005f00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_0 = 00ec00fb00b40007001d00c7007f000800e300780038000400200057000b0018
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_0 = 009200f70041002400da00ef00c700ce004700c300c50060001e00a300560037
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_0 = 008e00c2001d005d002700b90098006300fb003c00fc004c00f5001500a000be
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_0 = 001f00a50028003500ce00a100b40094004f00c90076008c007200de00020065
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_0 = 003e0099004e004a002d00e500f3005d00290012000f00c0001400fb00ae002e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_0 = 0054007400b400fa00d6005f006c004c00ee004700fc00c7003b00dc00d40080
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_0 = 007100fc0041000700d100b500de0074000400220002002800e400ad00900068
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_0 = 007b0034007e00ff00b600b00079005900cd002200a400700094005f006100b3
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_0 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_0 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_0 = 007900b3003c0049004100ad0068003f008c0072007c007a001200f000cf00e7
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_0 = 002c0093005a00df00c000cd00c0004a00be00fc002a00d9009e00dc00770034
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_0 = 00ec003b0060001a00f70020002200b2001b0084006e0038004500c800b70062
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_0 = 00c8005900a600af008700e7008500b8002000ab00fc00a3003c0010007900d4
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_0 = 00c600d0003c003a00730080000600ed0015006300b0000a0011008d0081009c
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_0 = 00a600dd003e008100c8000700ac00fa0045002a001b00a90061007b00020057
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_0 = 0013001f00ef00e100ac0071008700e60002004c00fe000a0048001d008a009b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_0 = 00b800e7003d0004008300b900a0005600a10051000b002f0090004f00b50050
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_0 = 00b000b8002600a500fa0087006e002100460056009d00a9008500100003007b
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_0 = 00fb007e00040025000800cc00e3005d00a7007100d3001100c400ba00d9003d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_0 = 00c5009a005b009500f200840058006500710058002200a70021005900240015
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_0 = 0051008d00db0018005600fa001c007f007b0005001e00c3004800fe00bc00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_0 = 00eb007b005e0058008e007700ec003d00900028008000e4008f001a00a1008d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_0 = 008f001b003e00300016002e000e0091002d0041002e00fc007b00a300a40015
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_0 = 009600fc00a4001000f9003600e600d000c600f4002800e3002c00ac000200ac
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_0 = 00ce00be0075005c00060053008900b2003000d8005a00d500f700e800ac0075
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_0 = 000b0036002b004100e4006000cb00ce00c1003500b0004900650099002900ba
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_0 = 004300650009006c00a5007600e30007006f0048009200e60057000900fa000f
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_0 = 00df00950036002e005e0096002a00a90018002200cd00f700f3003100240033
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_0 = 00f4001d001d0005004a009b00f60017002700ce00ca00820013001300000000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_0 = 008400680012002f00f000bf004600b300ae008900b1000700680025001000a7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_0 = 007a00a2009d001500400076009400c5009200ea006a002b004d004400c400b3
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_0 = 0050006400ea00d6007600b7000000df006b0086001500b5007800b300d4004b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_0 = 005200790048009d000e004a0064006f00ad00cf006d00190052006a0065004f
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_0 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_0 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_0 = 00850048004500df00f2004a002a006000a30052002f000e00b000ca00e00040
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_0 = 00fa009d0020000400d00083009400350090008500f6005a002a002b00e4002b
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_0 = 00e600010015000f00cf0083002b00b50053002c00dd00a5006500690068005e
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_0 = 003e00b6004f00790058007700b600a900fd006100b50073005200a6009a0002
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_0 = 008e00ee001a00cd0025007200740072000400f20003004700ac00c5005600e4
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_0 = 00af007f0069001400810020005300c900a6001f00ff00c70076002b001600a1
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_1 = 00ae00940023006300a100e70067006700df0046000200fd00a10082009100dc
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_1 = 0094008600f30020003300c1005a001500e9002e0039006f00ec005e002900df
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_1 = 000b000300c900fa002f0003007c00b400b400c5003d00e30024005a0021009d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_1 = 00090054005c00ad00cc002200c000dd00ae00a800b200820047006600d6009d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_1 = 006200f500e600f9006900ff006300ad008a00dc00070074009a007200a200bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_1 = 001600c800a5006e007900ff000700cf00ea00e90084008e006d004c00f2002d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_1 = 003300a100060041009c00a2008c00c7007d00dc006f005600aa008a004a0079
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_1 = 000d0047005800a400f000c8000c000f0085004f0042003400e800f6000d00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_1 = 008a000f00ad0025001100a400170013008d007b004f00960064001b00840083
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_1 = 008700b000f500a200f7004e00a100be004500a200fb00e3009700db00f500b5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_1 = 0052005e00af008d0004007a006900a6000f00040084004f0068000200ef009e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_1 = 0094001700cd003300f300fd003d0012001c003100ff0027000300ab009a00f7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_1 = 0024004e0045000c00e400ae006d00bd0044009500860013009b002f00110066
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_1 = 00c000ea008a00cd002300d2008e00700007003d001a009900ea00e6000f0003
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_1 = 0059009c009500a800370043009c00260023009a000f0038007b003200370093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_1 = 0076001b0038008600ef00d7004c00af008100d2001b00f000a800fe000c0004
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_1 = 0050009900ec006900e70052005d007000a900ee008800ca00f70022008700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_1 = 009d0053004d0061008500750012000b003100f1003600df0008007200830086
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_1 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_1 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_1 = 00fd008b004100c6009b00dc004000be004d009a005d00e2008d0038004f0093
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_1 = 00f400f7003f0061001f005700ee00d400e700f1001f006100750083008300e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_1 = 00b200ce00df002d00f3006f00f3009d0046001c009600f100e100c0006b0029
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_1 = 0039001c00a500480027001200350064001200800054008900a8003900c4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_1 = 009600e7000f005b00c5003e00af006b00a200870021006a00bb00df00380000
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_1 = 006000c7003a001e001200d1009e003b007d0033005800b0002f007900e4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_1 = 009c007e00bb001a008f008d00f3004a00990072006400cd008d003800a50012
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_1 = 00e5004700bf006b00ae001300dd00df006800c00034002b0075006c00c900cd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_1 = 002900ba005c00fc00c300c500c6006900ec00c500cd006d004900be00460077
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_1 = 0047006a00e10066005d00bc0017005f002d003d006400540067002000f50006
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_1 = 0043008600bf00b20075002e00ce009f000500f200d7006000bf009000770068
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_1 = 00c800e8001000e20036009b0085004700b1000a00f40010000e00760085001d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_1 = 00d20053005000ae00a600bb00c4003b00020063000300d000670034003b00ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_1 = 002f00ee00620055006900470020005100fe00a3006c0097007200dd00170095
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_1 = 009a009800c300ef009a00d700b900b10003005a005b00c9000800fe0082001f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_1 = 00e500980091004e0057000c00b40028008b0038004e009e00480035005f00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_1 = 00ec00fb00b40007001d00c7007f000800e300780038000400200057000b0018
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_1 = 009200f70041002400da00ef00c700ce004700c300c50060001e00a300560037
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_1 = 008e00c2001d005d002700b90098006300fb003c00fc004c00f5001500a000be
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_1 = 001f00a50028003500ce00a100b40094004f00c90076008c007200de00020065
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_1 = 003e0099004e004a002d00e500f3005d00290012000f00c0001400fb00ae002e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_1 = 0054007400b400fa00d6005f006c004c00ee004700fc00c7003b00dc00d40080
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_1 = 007100fc0041000700d100b500de0074000400220002002800e400ad00900068
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_1 = 007b0034007e00ff00b600b00079005900cd002200a400700094005f006100b3
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_1 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_1 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_1 = 007900b3003c0049004100ad0068003f008c0072007c007a001200f000cf00e7
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_1 = 002c0093005a00df00c000cd00c0004a00be00fc002a00d9009e00dc00770034
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_1 = 00ec003b0060001a00f70020002200b2001b0084006e0038004500c800b70062
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_1 = 00c8005900a600af008700e7008500b8002000ab00fc00a3003c0010007900d4
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_1 = 00c600d0003c003a00730080000600ed0015006300b0000a0011008d0081009c
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_1 = 00a600dd003e008100c8000700ac00fa0045002a001b00a90061007b00020057
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_1 = 0013001f00ef00e100ac0071008700e60002004c00fe000a0048001d008a009b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_1 = 00b800e7003d0004008300b900a0005600a10051000b002f0090004f00b50050
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_1 = 00b000b8002600a500fa0087006e002100460056009d00a9008500100003007b
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_1 = 00fb007e00040025000800cc00e3005d00a7007100d3001100c400ba00d9003d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_1 = 00c5009a005b009500f200840058006500710058002200a70021005900240015
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_1 = 0051008d00db0018005600fa001c007f007b0005001e00c3004800fe00bc00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_1 = 00eb007b005e0058008e007700ec003d00900028008000e4008f001a00a1008d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_1 = 008f001b003e00300016002e000e0091002d0041002e00fc007b00a300a40015
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_1 = 009600fc00a4001000f9003600e600d000c600f4002800e3002c00ac000200ac
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_1 = 00ce00be0075005c00060053008900b2003000d8005a00d500f700e800ac0075
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_1 = 000b0036002b004100e4006000cb00ce00c1003500b0004900650099002900ba
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_1 = 004300650009006c00a5007600e30007006f0048009200e60057000900fa000f
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_1 = 00df00950036002e005e0096002a00a90018002200cd00f700f3003100240033
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_1 = 00f4001d001d0005004a009b00f60017002700ce00ca00820013001300000000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_1 = 008400680012002f00f000bf004600b300ae008900b1000700680025001000a7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_1 = 007a00a2009d001500400076009400c5009200ea006a002b004d004400c400b3
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_1 = 0050006400ea00d6007600b7000000df006b0086001500b5007800b300d4004b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_1 = 005200790048009d000e004a0064006f00ad00cf006d00190052006a0065004f
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_1 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_1 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_1 = 00850048004500df00f2004a002a006000a30052002f000e00b000ca00e00040
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_1 = 00fa009d0020000400d00083009400350090008500f6005a002a002b00e4002b
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_1 = 00e600010015000f00cf0083002b00b50053002c00dd00a5006500690068005e
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_1 = 003e00b6004f00790058007700b600a900fd006100b50073005200a6009a0002
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_1 = 008e00ee001a00cd0025007200740072000400f20003004700ac00c5005600e4
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_1 = 00af007f0069001400810020005300c900a6001f00ff00c70076002b001600a1
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_2 = 00ae00940023006300a100e70067006700df0046000200fd00a10082009100dc
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_2 = 0094008600f30020003300c1005a001500e9002e0039006f00ec005e002900df
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_2 = 000b000300c900fa002f0003007c00b400b400c5003d00e30024005a0021009d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_2 = 00090054005c00ad00cc002200c000dd00ae00a800b200820047006600d6009d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_2 = 006200f500e600f9006900ff006300ad008a00dc00070074009a007200a200bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_2 = 001600c800a5006e007900ff000700cf00ea00e90084008e006d004c00f2002d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_2 = 003300a100060041009c00a2008c00c7007d00dc006f005600aa008a004a0079
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_2 = 000d0047005800a400f000c8000c000f0085004f0042003400e800f6000d00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_2 = 008a000f00ad0025001100a400170013008d007b004f00960064001b00840083
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_2 = 008700b000f500a200f7004e00a100be004500a200fb00e3009700db00f500b5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_2 = 0052005e00af008d0004007a006900a6000f00040084004f0068000200ef009e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_2 = 0094001700cd003300f300fd003d0012001c003100ff0027000300ab009a00f7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_2 = 0024004e0045000c00e400ae006d00bd0044009500860013009b002f00110066
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_2 = 00c000ea008a00cd002300d2008e00700007003d001a009900ea00e6000f0003
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_2 = 0059009c009500a800370043009c00260023009a000f0038007b003200370093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_2 = 0076001b0038008600ef00d7004c00af008100d2001b00f000a800fe000c0004
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_2 = 0050009900ec006900e70052005d007000a900ee008800ca00f70022008700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_2 = 009d0053004d0061008500750012000b003100f1003600df0008007200830086
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_2 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_2 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_2 = 00fd008b004100c6009b00dc004000be004d009a005d00e2008d0038004f0093
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_2 = 00f400f7003f0061001f005700ee00d400e700f1001f006100750083008300e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_2 = 00b200ce00df002d00f3006f00f3009d0046001c009600f100e100c0006b0029
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_2 = 0039001c00a500480027001200350064001200800054008900a8003900c4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_2 = 009600e7000f005b00c5003e00af006b00a200870021006a00bb00df00380000
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_2 = 006000c7003a001e001200d1009e003b007d0033005800b0002f007900e4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_2 = 009c007e00bb001a008f008d00f3004a00990072006400cd008d003800a50012
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_2 = 00e5004700bf006b00ae001300dd00df006800c00034002b0075006c00c900cd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_2 = 002900ba005c00fc00c300c500c6006900ec00c500cd006d004900be00460077
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_2 = 0047006a00e10066005d00bc0017005f002d003d006400540067002000f50006
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_2 = 0043008600bf00b20075002e00ce009f000500f200d7006000bf009000770068
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_2 = 00c800e8001000e20036009b0085004700b1000a00f40010000e00760085001d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_2 = 00d20053005000ae00a600bb00c4003b00020063000300d000670034003b00ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_2 = 002f00ee00620055006900470020005100fe00a3006c0097007200dd00170095
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_2 = 009a009800c300ef009a00d700b900b10003005a005b00c9000800fe0082001f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_2 = 00e500980091004e0057000c00b40028008b0038004e009e00480035005f00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_2 = 00ec00fb00b40007001d00c7007f000800e300780038000400200057000b0018
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_2 = 009200f70041002400da00ef00c700ce004700c300c50060001e00a300560037
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_2 = 008e00c2001d005d002700b90098006300fb003c00fc004c00f5001500a000be
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_2 = 001f00a50028003500ce00a100b40094004f00c90076008c007200de00020065
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_2 = 003e0099004e004a002d00e500f3005d00290012000f00c0001400fb00ae002e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_2 = 0054007400b400fa00d6005f006c004c00ee004700fc00c7003b00dc00d40080
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_2 = 007100fc0041000700d100b500de0074000400220002002800e400ad00900068
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_2 = 007b0034007e00ff00b600b00079005900cd002200a400700094005f006100b3
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_2 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_2 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_2 = 007900b3003c0049004100ad0068003f008c0072007c007a001200f000cf00e7
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_2 = 002c0093005a00df00c000cd00c0004a00be00fc002a00d9009e00dc00770034
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_2 = 00ec003b0060001a00f70020002200b2001b0084006e0038004500c800b70062
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_2 = 00c8005900a600af008700e7008500b8002000ab00fc00a3003c0010007900d4
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_2 = 00c600d0003c003a00730080000600ed0015006300b0000a0011008d0081009c
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_2 = 00a600dd003e008100c8000700ac00fa0045002a001b00a90061007b00020057
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_2 = 0013001f00ef00e100ac0071008700e60002004c00fe000a0048001d008a009b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_2 = 00b800e7003d0004008300b900a0005600a10051000b002f0090004f00b50050
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_2 = 00b000b8002600a500fa0087006e002100460056009d00a9008500100003007b
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_2 = 00fb007e00040025000800cc00e3005d00a7007100d3001100c400ba00d9003d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_2 = 00c5009a005b009500f200840058006500710058002200a70021005900240015
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_2 = 0051008d00db0018005600fa001c007f007b0005001e00c3004800fe00bc00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_2 = 00eb007b005e0058008e007700ec003d00900028008000e4008f001a00a1008d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_2 = 008f001b003e00300016002e000e0091002d0041002e00fc007b00a300a40015
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_2 = 009600fc00a4001000f9003600e600d000c600f4002800e3002c00ac000200ac
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_2 = 00ce00be0075005c00060053008900b2003000d8005a00d500f700e800ac0075
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_2 = 000b0036002b004100e4006000cb00ce00c1003500b0004900650099002900ba
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_2 = 004300650009006c00a5007600e30007006f0048009200e60057000900fa000f
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_2 = 00df00950036002e005e0096002a00a90018002200cd00f700f3003100240033
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_2 = 00f4001d001d0005004a009b00f60017002700ce00ca00820013001300000000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_2 = 008400680012002f00f000bf004600b300ae008900b1000700680025001000a7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_2 = 007a00a2009d001500400076009400c5009200ea006a002b004d004400c400b3
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_2 = 0050006400ea00d6007600b7000000df006b0086001500b5007800b300d4004b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_2 = 005200790048009d000e004a0064006f00ad00cf006d00190052006a0065004f
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_2 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_2 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_2 = 00850048004500df00f2004a002a006000a30052002f000e00b000ca00e00040
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_2 = 00fa009d0020000400d00083009400350090008500f6005a002a002b00e4002b
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_2 = 00e600010015000f00cf0083002b00b50053002c00dd00a5006500690068005e
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_2 = 003e00b6004f00790058007700b600a900fd006100b50073005200a6009a0002
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_2 = 008e00ee001a00cd0025007200740072000400f20003004700ac00c5005600e4
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_2 = 00af007f0069001400810020005300c900a6001f00ff00c70076002b001600a1
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MU_3 = 00ae00940023006300a100e70067006700df0046000200fd00a10082009100dc
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MU_3 = 0094008600f30020003300c1005a001500e9002e0039006f00ec005e002900df
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MU_3 = 000b000300c900fa002f0003007c00b400b400c5003d00e30024005a0021009d
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MU_3 = 00090054005c00ad00cc002200c000dd00ae00a800b200820047006600d6009d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MU_3 = 006200f500e600f9006900ff006300ad008a00dc00070074009a007200a200bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MU_3 = 001600c800a5006e007900ff000700cf00ea00e90084008e006d004c00f2002d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MU_3 = 003300a100060041009c00a2008c00c7007d00dc006f005600aa008a004a0079
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MU_3 = 000d0047005800a400f000c8000c000f0085004f0042003400e800f6000d00d2
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MU_3 = 008a000f00ad0025001100a400170013008d007b004f00960064001b00840083
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MU_3 = 008700b000f500a200f7004e00a100be004500a200fb00e3009700db00f500b5
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MU_3 = 0052005e00af008d0004007a006900a6000f00040084004f0068000200ef009e
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MU_3 = 0094001700cd003300f300fd003d0012001c003100ff0027000300ab009a00f7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MU_3 = 0024004e0045000c00e400ae006d00bd0044009500860013009b002f00110066
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MU_3 = 00c000ea008a00cd002300d2008e00700007003d001a009900ea00e6000f0003
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MU_3 = 0059009c009500a800370043009c00260023009a000f0038007b003200370093
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MU_3 = 0076001b0038008600ef00d7004c00af008100d2001b00f000a800fe000c0004
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MU_3 = 0050009900ec006900e70052005d007000a900ee008800ca00f70022008700ef
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MU_3 = 009d0053004d0061008500750012000b003100f1003600df0008007200830086
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MU_3 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MU_3 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MU_3 = 00fd008b004100c6009b00dc004000be004d009a005d00e2008d0038004f0093
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MU_3 = 00f400f7003f0061001f005700ee00d400e700f1001f006100750083008300e5
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MU_3 = 00b200ce00df002d00f3006f00f3009d0046001c009600f100e100c0006b0029
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MU_3 = 0039001c00a500480027001200350064001200800054008900a8003900c4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MU_3 = 009600e7000f005b00c5003e00af006b00a200870021006a00bb00df00380000
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MU_3 = 006000c7003a001e001200d1009e003b007d0033005800b0002f007900e4002c
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MU_3 = 009c007e00bb001a008f008d00f3004a00990072006400cd008d003800a50012
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MU_3 = 00e5004700bf006b00ae001300dd00df006800c00034002b0075006c00c900cd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MU_3 = 002900ba005c00fc00c300c500c6006900ec00c500cd006d004900be00460077
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MU_3 = 0047006a00e10066005d00bc0017005f002d003d006400540067002000f50006
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MU_3 = 0043008600bf00b20075002e00ce009f000500f200d7006000bf009000770068
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MU_3 = 00c800e8001000e20036009b0085004700b1000a00f40010000e00760085001d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MU_3 = 00d20053005000ae00a600bb00c4003b00020063000300d000670034003b00ce
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MU_3 = 002f00ee00620055006900470020005100fe00a3006c0097007200dd00170095
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MU_3 = 009a009800c300ef009a00d700b900b10003005a005b00c9000800fe0082001f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MU_3 = 00e500980091004e0057000c00b40028008b0038004e009e00480035005f00ea
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MU_3 = 00ec00fb00b40007001d00c7007f000800e300780038000400200057000b0018
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MU_3 = 009200f70041002400da00ef00c700ce004700c300c50060001e00a300560037
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MU_3 = 008e00c2001d005d002700b90098006300fb003c00fc004c00f5001500a000be
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MU_3 = 001f00a50028003500ce00a100b40094004f00c90076008c007200de00020065
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MU_3 = 003e0099004e004a002d00e500f3005d00290012000f00c0001400fb00ae002e
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MU_3 = 0054007400b400fa00d6005f006c004c00ee004700fc00c7003b00dc00d40080
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MU_3 = 007100fc0041000700d100b500de0074000400220002002800e400ad00900068
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MU_3 = 007b0034007e00ff00b600b00079005900cd002200a400700094005f006100b3
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MU_3 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MU_3 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MU_3 = 007900b3003c0049004100ad0068003f008c0072007c007a001200f000cf00e7
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MU_3 = 002c0093005a00df00c000cd00c0004a00be00fc002a00d9009e00dc00770034
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MU_3 = 00ec003b0060001a00f70020002200b2001b0084006e0038004500c800b70062
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MU_3 = 00c8005900a600af008700e7008500b8002000ab00fc00a3003c0010007900d4
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MU_3 = 00c600d0003c003a00730080000600ed0015006300b0000a0011008d0081009c
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MU_3 = 00a600dd003e008100c8000700ac00fa0045002a001b00a90061007b00020057
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MU_3 = 0013001f00ef00e100ac0071008700e60002004c00fe000a0048001d008a009b
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MU_3 = 00b800e7003d0004008300b900a0005600a10051000b002f0090004f00b50050
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MU_3 = 00b000b8002600a500fa0087006e002100460056009d00a9008500100003007b
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MU_3 = 00fb007e00040025000800cc00e3005d00a7007100d3001100c400ba00d9003d
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MU_3 = 00c5009a005b009500f200840058006500710058002200a70021005900240015
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MU_3 = 0051008d00db0018005600fa001c007f007b0005001e00c3004800fe00bc00b2
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MU_3 = 00eb007b005e0058008e007700ec003d00900028008000e4008f001a00a1008d
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MU_3 = 008f001b003e00300016002e000e0091002d0041002e00fc007b00a300a40015
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MU_3 = 009600fc00a4001000f9003600e600d000c600f4002800e3002c00ac000200ac
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MU_3 = 00ce00be0075005c00060053008900b2003000d8005a00d500f700e800ac0075
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MU_3 = 000b0036002b004100e4006000cb00ce00c1003500b0004900650099002900ba
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MU_3 = 004300650009006c00a5007600e30007006f0048009200e60057000900fa000f
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MU_3 = 00df00950036002e005e0096002a00a90018002200cd00f700f3003100240033
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MU_3 = 00f4001d001d0005004a009b00f60017002700ce00ca00820013001300000000
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MU_3 = 008400680012002f00f000bf004600b300ae008900b1000700680025001000a7
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MU_3 = 007a00a2009d001500400076009400c5009200ea006a002b004d004400c400b3
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MU_3 = 0050006400ea00d6007600b7000000df006b0086001500b5007800b300d4004b
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MU_3 = 005200790048009d000e004a0064006f00ad00cf006d00190052006a0065004f
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MU_3 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MU_3 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MU_3 = 00850048004500df00f2004a002a006000a30052002f000e00b000ca00e00040
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MU_3 = 00fa009d0020000400d00083009400350090008500f6005a002a002b00e4002b
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MU_3 = 00e600010015000f00cf0083002b00b50053002c00dd00a5006500690068005e
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MU_3 = 003e00b6004f00790058007700b600a900fd006100b50073005200a6009a0002
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MU_3 = 008e00ee001a00cd0025007200740072000400f20003004700ac00c5005600e4
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MU_3 = 00af007f0069001400810020005300c900a6001f00ff00c70076002b001600a1
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_0 = 001b008800dc00ca006f00c9004d0045008e00d00086002000de002f009d0046
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_0 = 00f30046002a005b003900ba003700a40002005e0089003c00d60030004d0064
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_0 = 005100ff00f1006000940059009300b0008b00e3007b00f600e000e900320012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_0 = 006200240023000d00240008002200b1001b004300de004d0008005600b300fc
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_0 = 00e1002a0059008a003a002800e3009b004b0008000b007d00fd009200e5005f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_0 = 008e00e6006c00a2009000bd0076007c00d2000000ea005600bf00dd003c00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_0 = 00e10021003000fc004c005a005c0025006100ed009600ee006f00f8007e0033
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_0 = 00e80036003800eb007400c5008e00fa009b0027009a009000ee0087005e0032
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_0 = 00db002c007c00350011004900dc00460030007800e1002400ff008800cf004c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_0 = 002b00dd008c0064007f006200fe00bd00c9001000c6007d0053003c001d00fe
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_0 = 007100f800d0004c000500350010009f00ff00dd009700d800ea00ab009f00a9
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_0 = 004b00990061009000ca00e400ff005900e60074002500a0007800b3005700df
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_0 = 00150094006c00d200db003a009300e3006000f3001f009300e200c700100009
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_0 = 00c40010005700ae00fd004600fa00db0039009400c200b20010005000eb00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_0 = 001c00bc003a009300ff006e005d006f002d00d9004800a200ca00fa00050051
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_0 = 00d0008d00e800950032003d0037006400d100b600d00016005a0096006300af
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_0 = 0044001900d800b900f800e9000e00f200c90076009d00a700640054007f00ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_0 = 0060008900ef0098005200cb008d00da0023009c00ad009600cd00af00300024
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_0 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_0 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_0 = 00e6000a00d4000c009c00b0006200dd008200fa00a000e900ac00f6004100c9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_0 = 0029001b008400ca00520010009200140009001500f3008c0086007d005400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_0 = 00e2003f002800e600dc0036003900aa005c009a0031003500a3009400c900df
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_0 = 009800060023003500aa004f00d500f9001600ec0053009f005f00bf0060003f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_0 = 0060005c00460023006c0032002e004d003e000a00710044006b00bd00050075
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_0 = 00b000b8009c008500e300ec00b300b8005500c3008a00cb007700b5005400c3
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_0 = 001f0033001800140016002f00fb00f500e100e800d70073008f009500600059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_0 = 006b0084001600dc00fd007a00f100a900a9007d003c008b00db002c009700da
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_0 = 00d500e2008a0072007f007300cb00e3009700b3000e008e00230017008100cd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_0 = 00bd0095002500e900f7005f00e400f1002d00aa00b5005500050018001000b6
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_0 = 0036001700cf004700bb008000ed00ee0064007600d900c400420051003100f9
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_0 = 0035008700e800cf004f003300f000a300fb00d500f800660039008900e700c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_0 = 007f006700c000ef002500ea00a100d400d8005800f0005d00f1009f00eb001f
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_0 = 00ad00a800a700930049009b00a1002e00ae009000d900bf00160094008b00c6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_0 = 002500dc000000ef003d00d400a70089000200df00f8009e007f00d700bc00a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_0 = 000900e600c3005600aa00d900d80085009c009c00250004002d002500830021
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_0 = 0082004d0046009a000b00b8005000c3002c000c004b002900a400fb00e40013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_0 = 00c000d700b1003c004e00a800b40048008e00d90017000500ca00e6001b00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_0 = 00ef001300200026009d002e00d3005a00ea00d8002600aa00d7000200b2006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_0 = 00cf001a00c5002100970055009c00ac0004009000b2006100fc009700cb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_0 = 009b00e200a4003000f40044008c005e00f0002a0007009a00f500cd00f90073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_0 = 002a008e007e00560000005f00c1007f002d001600e800190022005f0071006c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_0 = 0052006a00a100860008006a0021007d00ac00ad0028006f005f00b900b100ba
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_0 = 00dc006100cb00b9008400e700e9002f00e6005e001f00b400f5007500ff0082
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_0 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_0 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_0 = 0074003f00b7008b000d009500b60031007c00ae00a80083008c00bd002b005e
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_0 = 001a00fe00ef002800c4002600b000db00020089003e003f00db00b0000a006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_0 = 00bc0040009700c20006000e001c00ed00fe00a6000b00b60007003700cd006f
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_0 = 008000b700ae005c0013001a00db0087004f008c00140049001700e100990090
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_0 = 004e00c30015008a00a900ae0034009500020085003c001900810028008f0054
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_0 = 002400c2002600d100fc0019006b002d004a0049005b00c8005e00ef003e00cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_0 = 00f500f6008200910072003300d1007b000e00ee0094009000d60032009d0088
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_0 = 004400f4004c00b400de005b00810099000d005600fb00ba0019009b0069008c
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_0 = 00c8008200f200f000ee008d00df004b00bf00ea00f000ea007200ad008300b0
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_0 = 00dc00be004f008400d100a400f500c1002f006b00bc0021000e002000ce0046
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_0 = 00ba006900b500c800090084001200800010009a00a5009f006400110031007a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_0 = 002200b000ee00010051009000b30082004000fb00dd003e008800e500b00015
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_0 = 00c9006700d8005f003300e800d000d400de000f00ab00640021001e007900ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_0 = 00a5004700150076009c00a500f5008d0010007e004a005a005500eb00d000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_0 = 003500f000cf009000ed0003005500ec00bb003c003c006c003d009900e7004f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_0 = 00b000c20094004000f3008d009f002d003d0023004d00df004e005a008f0055
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_0 = 00190000006f00eb00b300df00fd000e001600db003e0000008500cf006a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_0 = 00d100b600d500db006d0045002c009e000800130040000200000037004400c7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_0 = 00c6004300c800150060007f000600090038005600c600e6005200f7003f000c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_0 = 00ab0075007500c20090006400c000a300c000ae000000610033009c00230052
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_0 = 00f400f8000e00cd00f4002000090015000f006d00ee00f4009200fe00c4004c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_0 = 00b80029009b00900040007e007900b900f8001500f7008a0068006700ab008c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_0 = 00ed006b0005008200160046001a0076004d003a0014005200ca008300540022
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_0 = 000700ab003d007c000c007c00cc0082003800cc000e00f2002d00a800730064
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_0 = 00e7006a000c001f00bc00b700c40029006700170048008300ee004000ba004d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_0 = 000c006c00e400870052006800f100e200e4004b001f00b60038008c008f0090
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_0 = 007700fa005600ed002d0013008e00b900c4001d00790092001b005b007d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_0 = 00ca001b00f9004000b400c800b500e00087003a00b500c90005007100420086
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_0 = 009500050049008300e50032005d00a000a900a100bf00d700b40054008900e7
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_0 = 00b0001e00140055009c00190030007d00fc00c7004100a400690000008400fb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_0 = 006400460034007400e7003d000b00f1006300db00eb006a004a007f003600e5
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_0 = 00df002900f900d7009a0051005a00fd006800ca000e004700cb00ce00d60034
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_1 = 001b008800dc00ca006f00c9004d0045008e00d00086002000de002f009d0046
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_1 = 00f30046002a005b003900ba003700a40002005e0089003c00d60030004d0064
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_1 = 005100ff00f1006000940059009300b0008b00e3007b00f600e000e900320012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_1 = 006200240023000d00240008002200b1001b004300de004d0008005600b300fc
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_1 = 00e1002a0059008a003a002800e3009b004b0008000b007d00fd009200e5005f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_1 = 008e00e6006c00a2009000bd0076007c00d2000000ea005600bf00dd003c00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_1 = 00e10021003000fc004c005a005c0025006100ed009600ee006f00f8007e0033
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_1 = 00e80036003800eb007400c5008e00fa009b0027009a009000ee0087005e0032
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_1 = 00db002c007c00350011004900dc00460030007800e1002400ff008800cf004c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_1 = 002b00dd008c0064007f006200fe00bd00c9001000c6007d0053003c001d00fe
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_1 = 007100f800d0004c000500350010009f00ff00dd009700d800ea00ab009f00a9
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_1 = 004b00990061009000ca00e400ff005900e60074002500a0007800b3005700df
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_1 = 00150094006c00d200db003a009300e3006000f3001f009300e200c700100009
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_1 = 00c40010005700ae00fd004600fa00db0039009400c200b20010005000eb00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_1 = 001c00bc003a009300ff006e005d006f002d00d9004800a200ca00fa00050051
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_1 = 00d0008d00e800950032003d0037006400d100b600d00016005a0096006300af
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_1 = 0044001900d800b900f800e9000e00f200c90076009d00a700640054007f00ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_1 = 0060008900ef0098005200cb008d00da0023009c00ad009600cd00af00300024
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_1 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_1 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_1 = 00e6000a00d4000c009c00b0006200dd008200fa00a000e900ac00f6004100c9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_1 = 0029001b008400ca00520010009200140009001500f3008c0086007d005400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_1 = 00e2003f002800e600dc0036003900aa005c009a0031003500a3009400c900df
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_1 = 009800060023003500aa004f00d500f9001600ec0053009f005f00bf0060003f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_1 = 0060005c00460023006c0032002e004d003e000a00710044006b00bd00050075
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_1 = 00b000b8009c008500e300ec00b300b8005500c3008a00cb007700b5005400c3
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_1 = 001f0033001800140016002f00fb00f500e100e800d70073008f009500600059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_1 = 006b0084001600dc00fd007a00f100a900a9007d003c008b00db002c009700da
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_1 = 00d500e2008a0072007f007300cb00e3009700b3000e008e00230017008100cd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_1 = 00bd0095002500e900f7005f00e400f1002d00aa00b5005500050018001000b6
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_1 = 0036001700cf004700bb008000ed00ee0064007600d900c400420051003100f9
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_1 = 0035008700e800cf004f003300f000a300fb00d500f800660039008900e700c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_1 = 007f006700c000ef002500ea00a100d400d8005800f0005d00f1009f00eb001f
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_1 = 00ad00a800a700930049009b00a1002e00ae009000d900bf00160094008b00c6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_1 = 002500dc000000ef003d00d400a70089000200df00f8009e007f00d700bc00a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_1 = 000900e600c3005600aa00d900d80085009c009c00250004002d002500830021
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_1 = 0082004d0046009a000b00b8005000c3002c000c004b002900a400fb00e40013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_1 = 00c000d700b1003c004e00a800b40048008e00d90017000500ca00e6001b00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_1 = 00ef001300200026009d002e00d3005a00ea00d8002600aa00d7000200b2006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_1 = 00cf001a00c5002100970055009c00ac0004009000b2006100fc009700cb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_1 = 009b00e200a4003000f40044008c005e00f0002a0007009a00f500cd00f90073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_1 = 002a008e007e00560000005f00c1007f002d001600e800190022005f0071006c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_1 = 0052006a00a100860008006a0021007d00ac00ad0028006f005f00b900b100ba
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_1 = 00dc006100cb00b9008400e700e9002f00e6005e001f00b400f5007500ff0082
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_1 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_1 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_1 = 0074003f00b7008b000d009500b60031007c00ae00a80083008c00bd002b005e
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_1 = 001a00fe00ef002800c4002600b000db00020089003e003f00db00b0000a006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_1 = 00bc0040009700c20006000e001c00ed00fe00a6000b00b60007003700cd006f
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_1 = 008000b700ae005c0013001a00db0087004f008c00140049001700e100990090
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_1 = 004e00c30015008a00a900ae0034009500020085003c001900810028008f0054
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_1 = 002400c2002600d100fc0019006b002d004a0049005b00c8005e00ef003e00cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_1 = 00f500f6008200910072003300d1007b000e00ee0094009000d60032009d0088
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_1 = 004400f4004c00b400de005b00810099000d005600fb00ba0019009b0069008c
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_1 = 00c8008200f200f000ee008d00df004b00bf00ea00f000ea007200ad008300b0
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_1 = 00dc00be004f008400d100a400f500c1002f006b00bc0021000e002000ce0046
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_1 = 00ba006900b500c800090084001200800010009a00a5009f006400110031007a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_1 = 002200b000ee00010051009000b30082004000fb00dd003e008800e500b00015
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_1 = 00c9006700d8005f003300e800d000d400de000f00ab00640021001e007900ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_1 = 00a5004700150076009c00a500f5008d0010007e004a005a005500eb00d000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_1 = 003500f000cf009000ed0003005500ec00bb003c003c006c003d009900e7004f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_1 = 00b000c20094004000f3008d009f002d003d0023004d00df004e005a008f0055
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_1 = 00190000006f00eb00b300df00fd000e001600db003e0000008500cf006a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_1 = 00d100b600d500db006d0045002c009e000800130040000200000037004400c7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_1 = 00c6004300c800150060007f000600090038005600c600e6005200f7003f000c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_1 = 00ab0075007500c20090006400c000a300c000ae000000610033009c00230052
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_1 = 00f400f8000e00cd00f4002000090015000f006d00ee00f4009200fe00c4004c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_1 = 00b80029009b00900040007e007900b900f8001500f7008a0068006700ab008c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_1 = 00ed006b0005008200160046001a0076004d003a0014005200ca008300540022
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_1 = 000700ab003d007c000c007c00cc0082003800cc000e00f2002d00a800730064
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_1 = 00e7006a000c001f00bc00b700c40029006700170048008300ee004000ba004d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_1 = 000c006c00e400870052006800f100e200e4004b001f00b60038008c008f0090
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_1 = 007700fa005600ed002d0013008e00b900c4001d00790092001b005b007d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_1 = 00ca001b00f9004000b400c800b500e00087003a00b500c90005007100420086
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_1 = 009500050049008300e50032005d00a000a900a100bf00d700b40054008900e7
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_1 = 00b0001e00140055009c00190030007d00fc00c7004100a400690000008400fb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_1 = 006400460034007400e7003d000b00f1006300db00eb006a004a007f003600e5
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_1 = 00df002900f900d7009a0051005a00fd006800ca000e004700cb00ce00d60034
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_2 = 001b008800dc00ca006f00c9004d0045008e00d00086002000de002f009d0046
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_2 = 00f30046002a005b003900ba003700a40002005e0089003c00d60030004d0064
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_2 = 005100ff00f1006000940059009300b0008b00e3007b00f600e000e900320012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_2 = 006200240023000d00240008002200b1001b004300de004d0008005600b300fc
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_2 = 00e1002a0059008a003a002800e3009b004b0008000b007d00fd009200e5005f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_2 = 008e00e6006c00a2009000bd0076007c00d2000000ea005600bf00dd003c00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_2 = 00e10021003000fc004c005a005c0025006100ed009600ee006f00f8007e0033
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_2 = 00e80036003800eb007400c5008e00fa009b0027009a009000ee0087005e0032
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_2 = 00db002c007c00350011004900dc00460030007800e1002400ff008800cf004c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_2 = 002b00dd008c0064007f006200fe00bd00c9001000c6007d0053003c001d00fe
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_2 = 007100f800d0004c000500350010009f00ff00dd009700d800ea00ab009f00a9
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_2 = 004b00990061009000ca00e400ff005900e60074002500a0007800b3005700df
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_2 = 00150094006c00d200db003a009300e3006000f3001f009300e200c700100009
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_2 = 00c40010005700ae00fd004600fa00db0039009400c200b20010005000eb00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_2 = 001c00bc003a009300ff006e005d006f002d00d9004800a200ca00fa00050051
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_2 = 00d0008d00e800950032003d0037006400d100b600d00016005a0096006300af
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_2 = 0044001900d800b900f800e9000e00f200c90076009d00a700640054007f00ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_2 = 0060008900ef0098005200cb008d00da0023009c00ad009600cd00af00300024
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_2 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_2 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_2 = 00e6000a00d4000c009c00b0006200dd008200fa00a000e900ac00f6004100c9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_2 = 0029001b008400ca00520010009200140009001500f3008c0086007d005400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_2 = 00e2003f002800e600dc0036003900aa005c009a0031003500a3009400c900df
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_2 = 009800060023003500aa004f00d500f9001600ec0053009f005f00bf0060003f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_2 = 0060005c00460023006c0032002e004d003e000a00710044006b00bd00050075
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_2 = 00b000b8009c008500e300ec00b300b8005500c3008a00cb007700b5005400c3
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_2 = 001f0033001800140016002f00fb00f500e100e800d70073008f009500600059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_2 = 006b0084001600dc00fd007a00f100a900a9007d003c008b00db002c009700da
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_2 = 00d500e2008a0072007f007300cb00e3009700b3000e008e00230017008100cd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_2 = 00bd0095002500e900f7005f00e400f1002d00aa00b5005500050018001000b6
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_2 = 0036001700cf004700bb008000ed00ee0064007600d900c400420051003100f9
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_2 = 0035008700e800cf004f003300f000a300fb00d500f800660039008900e700c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_2 = 007f006700c000ef002500ea00a100d400d8005800f0005d00f1009f00eb001f
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_2 = 00ad00a800a700930049009b00a1002e00ae009000d900bf00160094008b00c6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_2 = 002500dc000000ef003d00d400a70089000200df00f8009e007f00d700bc00a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_2 = 000900e600c3005600aa00d900d80085009c009c00250004002d002500830021
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_2 = 0082004d0046009a000b00b8005000c3002c000c004b002900a400fb00e40013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_2 = 00c000d700b1003c004e00a800b40048008e00d90017000500ca00e6001b00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_2 = 00ef001300200026009d002e00d3005a00ea00d8002600aa00d7000200b2006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_2 = 00cf001a00c5002100970055009c00ac0004009000b2006100fc009700cb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_2 = 009b00e200a4003000f40044008c005e00f0002a0007009a00f500cd00f90073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_2 = 002a008e007e00560000005f00c1007f002d001600e800190022005f0071006c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_2 = 0052006a00a100860008006a0021007d00ac00ad0028006f005f00b900b100ba
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_2 = 00dc006100cb00b9008400e700e9002f00e6005e001f00b400f5007500ff0082
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_2 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_2 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_2 = 0074003f00b7008b000d009500b60031007c00ae00a80083008c00bd002b005e
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_2 = 001a00fe00ef002800c4002600b000db00020089003e003f00db00b0000a006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_2 = 00bc0040009700c20006000e001c00ed00fe00a6000b00b60007003700cd006f
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_2 = 008000b700ae005c0013001a00db0087004f008c00140049001700e100990090
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_2 = 004e00c30015008a00a900ae0034009500020085003c001900810028008f0054
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_2 = 002400c2002600d100fc0019006b002d004a0049005b00c8005e00ef003e00cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_2 = 00f500f6008200910072003300d1007b000e00ee0094009000d60032009d0088
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_2 = 004400f4004c00b400de005b00810099000d005600fb00ba0019009b0069008c
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_2 = 00c8008200f200f000ee008d00df004b00bf00ea00f000ea007200ad008300b0
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_2 = 00dc00be004f008400d100a400f500c1002f006b00bc0021000e002000ce0046
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_2 = 00ba006900b500c800090084001200800010009a00a5009f006400110031007a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_2 = 002200b000ee00010051009000b30082004000fb00dd003e008800e500b00015
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_2 = 00c9006700d8005f003300e800d000d400de000f00ab00640021001e007900ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_2 = 00a5004700150076009c00a500f5008d0010007e004a005a005500eb00d000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_2 = 003500f000cf009000ed0003005500ec00bb003c003c006c003d009900e7004f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_2 = 00b000c20094004000f3008d009f002d003d0023004d00df004e005a008f0055
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_2 = 00190000006f00eb00b300df00fd000e001600db003e0000008500cf006a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_2 = 00d100b600d500db006d0045002c009e000800130040000200000037004400c7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_2 = 00c6004300c800150060007f000600090038005600c600e6005200f7003f000c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_2 = 00ab0075007500c20090006400c000a300c000ae000000610033009c00230052
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_2 = 00f400f8000e00cd00f4002000090015000f006d00ee00f4009200fe00c4004c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_2 = 00b80029009b00900040007e007900b900f8001500f7008a0068006700ab008c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_2 = 00ed006b0005008200160046001a0076004d003a0014005200ca008300540022
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_2 = 000700ab003d007c000c007c00cc0082003800cc000e00f2002d00a800730064
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_2 = 00e7006a000c001f00bc00b700c40029006700170048008300ee004000ba004d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_2 = 000c006c00e400870052006800f100e200e4004b001f00b60038008c008f0090
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_2 = 007700fa005600ed002d0013008e00b900c4001d00790092001b005b007d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_2 = 00ca001b00f9004000b400c800b500e00087003a00b500c90005007100420086
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_2 = 009500050049008300e50032005d00a000a900a100bf00d700b40054008900e7
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_2 = 00b0001e00140055009c00190030007d00fc00c7004100a400690000008400fb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_2 = 006400460034007400e7003d000b00f1006300db00eb006a004a007f003600e5
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_2 = 00df002900f900d7009a0051005a00fd006800ca000e004700cb00ce00d60034
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MA_3 = 001b008800dc00ca006f00c9004d0045008e00d00086002000de002f009d0046
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MA_3 = 00f30046002a005b003900ba003700a40002005e0089003c00d60030004d0064
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MA_3 = 005100ff00f1006000940059009300b0008b00e3007b00f600e000e900320012
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MA_3 = 006200240023000d00240008002200b1001b004300de004d0008005600b300fc
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MA_3 = 00e1002a0059008a003a002800e3009b004b0008000b007d00fd009200e5005f
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MA_3 = 008e00e6006c00a2009000bd0076007c00d2000000ea005600bf00dd003c00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MA_3 = 00e10021003000fc004c005a005c0025006100ed009600ee006f00f8007e0033
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MA_3 = 00e80036003800eb007400c5008e00fa009b0027009a009000ee0087005e0032
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MA_3 = 00db002c007c00350011004900dc00460030007800e1002400ff008800cf004c
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MA_3 = 002b00dd008c0064007f006200fe00bd00c9001000c6007d0053003c001d00fe
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MA_3 = 007100f800d0004c000500350010009f00ff00dd009700d800ea00ab009f00a9
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MA_3 = 004b00990061009000ca00e400ff005900e60074002500a0007800b3005700df
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MA_3 = 00150094006c00d200db003a009300e3006000f3001f009300e200c700100009
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MA_3 = 00c40010005700ae00fd004600fa00db0039009400c200b20010005000eb00a8
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MA_3 = 001c00bc003a009300ff006e005d006f002d00d9004800a200ca00fa00050051
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MA_3 = 00d0008d00e800950032003d0037006400d100b600d00016005a0096006300af
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MA_3 = 0044001900d800b900f800e9000e00f200c90076009d00a700640054007f00ec
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MA_3 = 0060008900ef0098005200cb008d00da0023009c00ad009600cd00af00300024
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MA_3 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MA_3 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MA_3 = 00e6000a00d4000c009c00b0006200dd008200fa00a000e900ac00f6004100c9
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MA_3 = 0029001b008400ca00520010009200140009001500f3008c0086007d005400d7
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MA_3 = 00e2003f002800e600dc0036003900aa005c009a0031003500a3009400c900df
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MA_3 = 009800060023003500aa004f00d500f9001600ec0053009f005f00bf0060003f
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MA_3 = 0060005c00460023006c0032002e004d003e000a00710044006b00bd00050075
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MA_3 = 00b000b8009c008500e300ec00b300b8005500c3008a00cb007700b5005400c3
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MA_3 = 001f0033001800140016002f00fb00f500e100e800d70073008f009500600059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MA_3 = 006b0084001600dc00fd007a00f100a900a9007d003c008b00db002c009700da
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MA_3 = 00d500e2008a0072007f007300cb00e3009700b3000e008e00230017008100cd
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MA_3 = 00bd0095002500e900f7005f00e400f1002d00aa00b5005500050018001000b6
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MA_3 = 0036001700cf004700bb008000ed00ee0064007600d900c400420051003100f9
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MA_3 = 0035008700e800cf004f003300f000a300fb00d500f800660039008900e700c6
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MA_3 = 007f006700c000ef002500ea00a100d400d8005800f0005d00f1009f00eb001f
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MA_3 = 00ad00a800a700930049009b00a1002e00ae009000d900bf00160094008b00c6
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MA_3 = 002500dc000000ef003d00d400a70089000200df00f8009e007f00d700bc00a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MA_3 = 000900e600c3005600aa00d900d80085009c009c00250004002d002500830021
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MA_3 = 0082004d0046009a000b00b8005000c3002c000c004b002900a400fb00e40013
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MA_3 = 00c000d700b1003c004e00a800b40048008e00d90017000500ca00e6001b00ac
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MA_3 = 00ef001300200026009d002e00d3005a00ea00d8002600aa00d7000200b2006e
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MA_3 = 00cf001a00c5002100970055009c00ac0004009000b2006100fc009700cb0037
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MA_3 = 009b00e200a4003000f40044008c005e00f0002a0007009a00f500cd00f90073
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MA_3 = 002a008e007e00560000005f00c1007f002d001600e800190022005f0071006c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MA_3 = 0052006a00a100860008006a0021007d00ac00ad0028006f005f00b900b100ba
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MA_3 = 00dc006100cb00b9008400e700e9002f00e6005e001f00b400f5007500ff0082
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MA_3 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MA_3 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MA_3 = 0074003f00b7008b000d009500b60031007c00ae00a80083008c00bd002b005e
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MA_3 = 001a00fe00ef002800c4002600b000db00020089003e003f00db00b0000a006a
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MA_3 = 00bc0040009700c20006000e001c00ed00fe00a6000b00b60007003700cd006f
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MA_3 = 008000b700ae005c0013001a00db0087004f008c00140049001700e100990090
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MA_3 = 004e00c30015008a00a900ae0034009500020085003c001900810028008f0054
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MA_3 = 002400c2002600d100fc0019006b002d004a0049005b00c8005e00ef003e00cf
+
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MA_3 = 00f500f6008200910072003300d1007b000e00ee0094009000d60032009d0088
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MA_3 = 004400f4004c00b400de005b00810099000d005600fb00ba0019009b0069008c
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MA_3 = 00c8008200f200f000ee008d00df004b00bf00ea00f000ea007200ad008300b0
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MA_3 = 00dc00be004f008400d100a400f500c1002f006b00bc0021000e002000ce0046
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MA_3 = 00ba006900b500c800090084001200800010009a00a5009f006400110031007a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MA_3 = 002200b000ee00010051009000b30082004000fb00dd003e008800e500b00015
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MA_3 = 00c9006700d8005f003300e800d000d400de000f00ab00640021001e007900ca
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MA_3 = 00a5004700150076009c00a500f5008d0010007e004a005a005500eb00d000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MA_3 = 003500f000cf009000ed0003005500ec00bb003c003c006c003d009900e7004f
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MA_3 = 00b000c20094004000f3008d009f002d003d0023004d00df004e005a008f0055
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MA_3 = 00190000006f00eb00b300df00fd000e001600db003e0000008500cf006a0019
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MA_3 = 00d100b600d500db006d0045002c009e000800130040000200000037004400c7
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MA_3 = 00c6004300c800150060007f000600090038005600c600e6005200f7003f000c
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MA_3 = 00ab0075007500c20090006400c000a300c000ae000000610033009c00230052
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MA_3 = 00f400f8000e00cd00f4002000090015000f006d00ee00f4009200fe00c4004c
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MA_3 = 00b80029009b00900040007e007900b900f8001500f7008a0068006700ab008c
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MA_3 = 00ed006b0005008200160046001a0076004d003a0014005200ca008300540022
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MA_3 = 000700ab003d007c000c007c00cc0082003800cc000e00f2002d00a800730064
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MA_3 = 00e7006a000c001f00bc00b700c40029006700170048008300ee004000ba004d
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MA_3 = 000c006c00e400870052006800f100e200e4004b001f00b60038008c008f0090
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MA_3 = 007700fa005600ed002d0013008e00b900c4001d00790092001b005b007d0024
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MA_3 = 00ca001b00f9004000b400c800b500e00087003a00b500c90005007100420086
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MA_3 = 009500050049008300e50032005d00a000a900a100bf00d700b40054008900e7
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MA_3 = 00b0001e00140055009c00190030007d00fc00c7004100a400690000008400fb
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MA_3 = 006400460034007400e7003d000b00f1006300db00eb006a004a007f003600e5
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MA_3 = 00df002900f900d7009a0051005a00fd006800ca000e004700cb00ce00d60034
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSans_EColor16MAP_0 = 003b00560048009a0025002400bb006b008000c5003f005200cf004400c300d8
 
@@ -6179,57 +6179,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSans_EColor16MAP_0 = 008400dc002d007f00970069007500b70044001000c200fd009000ad00150080
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_0 = 002e0065005e0057007e00ab00aa005f005d006400c300050044008700ed00e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_0 = 002700a700680064006900500025007d00ee00b100b100b50023008000a400e7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_0 = 004100be003c00b80043000a0039008300f4005300a400fc0072000d00120060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_0 = 00f200ab003a00d0000d001e006500f500f8004700db0054008a002b0043000f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_0 = 004500b500cc00fd00770051007000ea00f80028008d00b000930043002000a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_0 = 004400e9009200b600300037000e003f0072009200bf00e300a000c000f4007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_0 = 00880091000700b900a600b5002500160031000c00a500e50021009a006c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_0 = 00e100cd000700a10086003600a4007c00b4007100ab00f00030003a00df00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_0 = 000b009300c500930006007300bb00e5002a009500f30088000600a100490080
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_0 = 009000ee009b007800bb005e007300100052007b0050003700e200f200cb00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_0 = 009900e700f500f800de003f00460066001b0052006c002300ff0060006800c6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_0 = 00700097002f00e4002a00b100540057009400cb002400b700f100c70023004e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_0 = 00f700380084005a006c00ff002b00ae00410030003000bc001a00a900f5001d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_0 = 00b40035004b002000b300cf00f7003100dc00cb0011001600ef00e900e3001a
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_0 = 00eb00a2006900a500470087002f00a100b1009900e800f70016000a00cf00cf
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_0 = 008b00be0003007b0071007a00e6003a002500100013003500de009d008f004a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_0 = 002100a1008c00ad00810042002d004700eb00ae00f700c700ef000900b20022
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_0 = 0094000700d2003400d500a100cd0011009e003a00b000ce004f000c0035003f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_0 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_0 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_0 = 004d003100c90091009d00cc00de00ff009b009b001200670061008c00980022
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_0 = 0072000b004e005800c2009c006100f0008f00750022009f001d0018001900c4
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_0 = 00ca00af007500c100aa009a00c00088004f000800220039006c00e100a20002
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_0 = 004100eb00c60035003300df00220021005c00fe00ad008f00af00e300560091
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_0 = 00cf00be0011009c001d004000de00f000880099004900c000440037002600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_0 = 00ef0069006b00ba00b1009e004d000800f6008f008f00d700aa00c100d30018
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_0 = 005000c400f6004000f900e1000300ec006000d9005100c70005006200920059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_0 = 001d0082001000d2001a005e00c4006900dd00f2007000f8006000c200b00067
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_0 = 00410053000300f200160060005c0004000b001c005600c10092007d005a0056
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_0 = 005800eb002600c100bc0073007d00560035009c005600600046003800af00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_0 = 00d100a80036008a002f008e000500f1001e00a5008b00ba005000d4008a008a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_0 = 00eb0036008000520008000b003a00150025008f008400620029008e0085007d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_0 = 0090008900c70097000d00b0002b00670003008e00450050006f001e003e00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_0 = 004800ea0016000a002200e800cf00d200e900c6002400ae00d600ac00100082
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_0 = 00db00a600bc0042009200de0044000d001a00ba00d70065008200c2008e0008
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_0 = 00d300fa0033008200e800b200c300b3001200e90084006d00990026004f002e
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_0 = 0086002a00dd00b300ce007b000300d20000008c008b007d00bb00af005800aa
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_0 = 006600ae0019001c000800fa00650056006b00a50076000500e900d4002000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_0 = 00b1006500cc002c007500180088001200ed005e00e400dc005400ad009a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_0 = 009a000300a300a000a100cf004100af00a7002e003e005a00be00ee00a4009d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_0 = 009100ef00b400f8002c008000c200d0007f00ad0052001a0010005700870064
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_0 = 0002009e001a0069001c00a400cc009d005300b0001300440021007500bb00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_0 = 00010018004e002f0019007600730070007800b0009f005c0061001d00da00b8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_0 = 0023001a0089009700c700fa00d7009f000100ea007600e40047005e0058003b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_0 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_0 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_0 = 006a00a10080007a006c00a7007a0000002d00950037000f00b6003a008600f6
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_0 = 0036007700cb005200f4005e0075007b00d4005900b300f70084004400090061
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_0 = 008c00cb000a00860014007100dc004b00fd00bf00b7009e00140060002c00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_0 = 00a1009300e9005c00d400ab009a00330087003100ee0045002d00b3009f0070
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_0 = 0003007b00ea0060005300e3005f00e50013009c000a00db0092009800a4009e
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_0 = 007c00ca00c600de00dc00f000f200d40023009100b100eb00ae005f00a60018
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVMono_EColor16MAP_0 = 00bd00400004000200df007e003800db00a70097008500f700da00cc00f60023
 
@@ -6249,57 +6249,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVMono_EColor16MAP_0 = 005d00cf002100b1007200b6001a00ee007a00dd003c0038000c004400c800cc
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_0 = 00160044008800f0001c009f00af003200b00099000300b00019001a00d500c0
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_0 = 0078004b0049001a00e7000e0081002f00db0009000000c1007d00b7009d008f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_0 = 00f8008000eb00150061007c0011008b006700d2004b00b100620006008d00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_0 = 004f000a001f00e300c10007005e000900ed0056006300e400c7008d00f60067
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_0 = 000000900065008600a700a7000e000f009400c1000700870000001c00330054
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_0 = 000a00b4002800bf00f000b500e00025005100b2006e0023001000ba00d60043
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_0 = 001c003d00a900e7006600ac007400f500f500b0008300cc00ce000e00230014
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_0 = 009c00ca0033005500cb00e700f9004c00360080004f00da008f005e006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_0 = 00de009000d1009700cd00f100f200c20053005b0081006c004700fe00760069
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_0 = 008900830090008000fe0099005300e4007c00fe00d800e1006b008c004300b9
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_0 = 0063004a00e7001100d50087002600b400b8007400cc00b800fb008b00e80052
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_0 = 00a3005600c800b0004e005d00bf003800e500b300c200de00e4002700b200f2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_0 = 007900bc00390089005300dd0026006400160004006e00d9008900a3008800fb
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_0 = 004d0070001c004900ec000d00ec003e00a40007000700ae00bc00c100960020
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_0 = 004e00da00fd00fe00a400bb003300f7000a00f40050007d00680038001e005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_0 = 00590077005c005500dd000700b4000000ba007300d8002a00fa00f800d60077
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_0 = 00d90028007f0027003400d9007200e5006000ca00460023003c00ef00e50017
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_0 = 0082003700da0003003900ff001d000a000000430015006800a9000500ce0038
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_0 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_0 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_0 = 007b00f4004b00cd004a00d4004d0061007d00dc00dd003600be00a900110092
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_0 = 00e100ad0017001000e900230083008900da002600d6005a002a00ca004200be
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_0 = 003800c1007e00db00d4009d00f0002000210005001200fa006800540076003c
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_0 = 005400340010000100de007e0050004500a7002b009c004f006a00a4000b0064
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_0 = 006100ab001900f2002d00e1000100860096007e0098009d0051007a00bf0098
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_0 = 0044008500ac006c00ff009a005e009c0075002d0027003e00e6006d00b3006e
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_0 = 00e80022000500da00f8006c00a300c5004d00cb00b900c30027005c007e008e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_0 = 004000e0009900e600bd003e006400cc00fa0007004b00e80046000c007b00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_0 = 0095000b00fd004900ec00180064006800b100e4005a00a9004000ab00ec00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_0 = 00bc001300b600ea000e000e00e1008c001f0052003c005a00c2009800060067
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_0 = 00be002c00cc00b700350080003a00c100a800bd006c0014003d001300440076
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_0 = 001900d100dd00f00016007700020035007b00d6003b0025007f005a00e10030
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_0 = 002d006b00dd00730047006d0066001900d30020006200c90006003c00790008
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_0 = 0042006f000a001f00910008007b003000ec009a00c7009900b1001b001200dc
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_0 = 00e0000e00d900dd0048005600fc007b00c6007400a100a300a60050004900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_0 = 00bb000c0015008b002d005e00a8005a00b000b1004900b3006e006e006800de
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_0 = 0052006700010041005d000c00a900df006500c4009400dd005d0072001400f6
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_0 = 00a9005e00aa00c000e500ab00a900cb00d0005800bc007500b000ff00980004
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_0 = 00230055006200ed00c900dd000b001c00d100ee00cc00b1004d007c007f0001
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_0 = 00ff0083009100e2002d00d5009e00db002a00cf00c300af005e00c700b2007f
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_0 = 004100c5006c0078006c00a000cc005e00ed008500410024008f00a9001600ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_0 = 007a00ab001300ed004f00b9003100d0004e0059007b00fe008d003100fc0083
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_0 = 009b00ca00fb009f00da002800d500c9003900f0007d00fc003700e3001700be
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_0 = 00ad00a7004000a80052006000ed00d30002003000af007100dd00b1002000c1
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_0 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_0 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_0 = 00f1000d00b90049003700f7003a0044009d00ca00d700c9009c006300350003
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_0 = 0069009900830073001500bf007a0003005600ea00e100df0050001500a300b3
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_0 = 00c200e0003500e6003b00b0002d0009002b004800bc00bf004200c300e000b0
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_0 = 00ad003f005600d3005400dd001b001d0028001c0047004200710007005c008a
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_0 = 008f00b50041001f00e9005c003000740025005700a1008800e200a600650052
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_0 = 00d700a4005600d3008000cc002a0068008800960008005f000600ce00190089
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSerif_EColor16MAP_0 = 00e3009e00b6005b009a00c000b300e200f00075006b00cf002c00d1003a0087
 
@@ -6319,57 +6319,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSerif_EColor16MAP_0 = 00fb00b3003f004c00e7001c005900e400b6008c0015003500b000c1003d0072
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_0 = 0031002300f700c1001e00e1002200ea006f000700c800a50095007e00c500e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_0 = 00eb0044003a007f007000ea00ad00aa00b20015007100dc00b6002f0044009a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_0 = 00af00be00d20061001c0073007a00c10056008b00fd00a10099006f002200a0
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_0 = 001500c9000e00ef00f900e6000d002d00730050006f00a30000006700a30000
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_0 = 00f3000b00360025003f00f0001f000600ff00b200b500b500b800dd00700062
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_0 = 0089007700fe00bc00c90097009e002b00d700a400af00cc00c800eb00eb00c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_0 = 008d00c40090003700d4006500df000c006800b100e5008a00fd00c8001b001e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_0 = 005b000f006800800002005d005b006b00cf002800ed003000df008b00a300a4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_0 = 00a6001e00e30020004e002900a400c6004800b000ed006f0020006d009700b5
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_0 = 001a00ec005500ac002f0083009900980025006b00850060002b009c00e50067
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_0 = 00b6001300930077006000be00e700ea002800ab003e00fd006100fa006100f3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_0 = 00ef00fa004c00b700e800a6006b00d0008800ca000b005c004e009c00ee0070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_0 = 007e0078009600eb005400de006400f9002e00b700f400ba002100a900810061
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_0 = 006d008f006300f30020008000ea002e00530037009800180096000300c100df
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_0 = 00bd00dc009b0039004b00ba008400e2006300a200570069009100a700ae0090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_0 = 006900db00ba009100180049006500fe00c200b0008b004800ff00fd000600c5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_0 = 0004004c004e00c000bc00d700b700e0006c002c003d00c900f900cf0018005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_0 = 004400650000005300fd0025009b0080002900e90099008d004e001d00a300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_0 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_0 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_0 = 00af00c20037006400c700c50020008a00450090000e008800ac00b600b80068
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_0 = 00d900cb00ee00f1004a0013001b00e8000100b0001f00d2008f007f002400d3
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_0 = 0053001f00c400db00ae0069008300270088005500e100a100b70043000300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_0 = 0042003200710026005400bb0008003200cc006800c600e4000e00ec007500cf
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_0 = 00c7004000f5006d008300fc00a900590098007f007c0051000900a900d20005
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_0 = 0086001e00e90059004a004a00200035004a009300190062009400cc00340069
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_0 = 002600b100220013002e00c300f7008a00b500d00014007900720010008e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_0 = 00c800d300e400b50030006c009f00bf002800ab008b00e300f70091000100fd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_0 = 00b000cb0034002500ef00be0043001b009400bc00a5001700f3005c00380023
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_0 = 0080003900b100b500dd00e300ca00fa0006000c00b000f5003400ca00420057
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_0 = 00fa00e1005200330019006100f3000b002a001c00a2005e006e00d5003900bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_0 = 007c00af006c00a1000c0016003900c600ea008700130003003d00ac00bd00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_0 = 008f006e003300900096000900c400ee004200f3006800cd00d3005300cf0056
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_0 = 008e0008005a0050005e0032009d005000220065002100e00088008400ae00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_0 = 004f000d00ef003d00810001001000970030007700ae008600e300eb005d0073
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_0 = 003c00cc00860090002800f200b400010006007500aa009600ea008d003000fb
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_0 = 001100ec008100f3009000b3007900280084006c0067007a0002002e007f00af
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_0 = 001a00620049008700ad00be007e009c004700e800a9001300d100e000130097
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_0 = 0064006a003300b200b9003a00b4006c00eb006d00ec006a0083007100680012
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_0 = 009e007e00f600180099007200c800ea000600b0004b001100f9005e00530087
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_0 = 002d0021002e00a0000000f900df0001006f007b005300cc008d0013006f00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_0 = 00e500b7007f007500c100ac0001007f00880089005600d4002100bb00370035
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_0 = 0048009c00bc00b1008c00be005800b4004800c400ed005900f9004400de0056
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_0 = 008400f100420049002600230018002000cf000300e400e30020006100130068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_0 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_0 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_0 = 00bb00a50066009900b3006d00630081004d00c6001000f500b40074006800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_0 = 001700d30045003d002100c60079003500fe000d007e00c8001000b900770017
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_0 = 00fc00f7002a00c000f8009600c3003900ac001200c7009f002500780049003d
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_0 = 006300fe00f6000000ae00680069004a002300d70019005000d5001300cc00e2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_0 = 008e00a100650013002200af00ce007a00fb00cf0015005900dc00bb009c0027
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_0 = 0089006500e6005100f900af000b008c005c0045007200b000e100b6001500a4
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSans_EColor16MAP_1 = 003b00560048009a0025002400bb006b008000c5003f005200cf004400c300d8
 
@@ -6389,57 +6389,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSans_EColor16MAP_1 = 008400dc002d007f00970069007500b70044001000c200fd009000ad00150080
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_1 = 002e0065005e0057007e00ab00aa005f005d006400c300050044008700ed00e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_1 = 002700a700680064006900500025007d00ee00b100b100b50023008000a400e7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_1 = 004100be003c00b80043000a0039008300f4005300a400fc0072000d00120060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_1 = 00f200ab003a00d0000d001e006500f500f8004700db0054008a002b0043000f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_1 = 004500b500cc00fd00770051007000ea00f80028008d00b000930043002000a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_1 = 004400e9009200b600300037000e003f0072009200bf00e300a000c000f4007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_1 = 00880091000700b900a600b5002500160031000c00a500e50021009a006c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_1 = 00e100cd000700a10086003600a4007c00b4007100ab00f00030003a00df00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_1 = 000b009300c500930006007300bb00e5002a009500f30088000600a100490080
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_1 = 009000ee009b007800bb005e007300100052007b0050003700e200f200cb00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_1 = 009900e700f500f800de003f00460066001b0052006c002300ff0060006800c6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_1 = 00700097002f00e4002a00b100540057009400cb002400b700f100c70023004e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_1 = 00f700380084005a006c00ff002b00ae00410030003000bc001a00a900f5001d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_1 = 00b40035004b002000b300cf00f7003100dc00cb0011001600ef00e900e3001a
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_1 = 00eb00a2006900a500470087002f00a100b1009900e800f70016000a00cf00cf
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_1 = 008b00be0003007b0071007a00e6003a002500100013003500de009d008f004a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_1 = 002100a1008c00ad00810042002d004700eb00ae00f700c700ef000900b20022
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_1 = 0094000700d2003400d500a100cd0011009e003a00b000ce004f000c0035003f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_1 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_1 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_1 = 004d003100c90091009d00cc00de00ff009b009b001200670061008c00980022
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_1 = 0072000b004e005800c2009c006100f0008f00750022009f001d0018001900c4
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_1 = 00ca00af007500c100aa009a00c00088004f000800220039006c00e100a20002
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_1 = 004100eb00c60035003300df00220021005c00fe00ad008f00af00e300560091
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_1 = 00cf00be0011009c001d004000de00f000880099004900c000440037002600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_1 = 00ef0069006b00ba00b1009e004d000800f6008f008f00d700aa00c100d30018
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_1 = 005000c400f6004000f900e1000300ec006000d9005100c70005006200920059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_1 = 001d0082001000d2001a005e00c4006900dd00f2007000f8006000c200b00067
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_1 = 00410053000300f200160060005c0004000b001c005600c10092007d005a0056
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_1 = 005800eb002600c100bc0073007d00560035009c005600600046003800af00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_1 = 00d100a80036008a002f008e000500f1001e00a5008b00ba005000d4008a008a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_1 = 00eb0036008000520008000b003a00150025008f008400620029008e0085007d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_1 = 0090008900c70097000d00b0002b00670003008e00450050006f001e003e00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_1 = 004800ea0016000a002200e800cf00d200e900c6002400ae00d600ac00100082
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_1 = 00db00a600bc0042009200de0044000d001a00ba00d70065008200c2008e0008
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_1 = 00d300fa0033008200e800b200c300b3001200e90084006d00990026004f002e
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_1 = 0086002a00dd00b300ce007b000300d20000008c008b007d00bb00af005800aa
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_1 = 006600ae0019001c000800fa00650056006b00a50076000500e900d4002000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_1 = 00b1006500cc002c007500180088001200ed005e00e400dc005400ad009a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_1 = 009a000300a300a000a100cf004100af00a7002e003e005a00be00ee00a4009d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_1 = 009100ef00b400f8002c008000c200d0007f00ad0052001a0010005700870064
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_1 = 0002009e001a0069001c00a400cc009d005300b0001300440021007500bb00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_1 = 00010018004e002f0019007600730070007800b0009f005c0061001d00da00b8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_1 = 0023001a0089009700c700fa00d7009f000100ea007600e40047005e0058003b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_1 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_1 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_1 = 006a00a10080007a006c00a7007a0000002d00950037000f00b6003a008600f6
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_1 = 0036007700cb005200f4005e0075007b00d4005900b300f70084004400090061
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_1 = 008c00cb000a00860014007100dc004b00fd00bf00b7009e00140060002c00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_1 = 00a1009300e9005c00d400ab009a00330087003100ee0045002d00b3009f0070
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_1 = 0003007b00ea0060005300e3005f00e50013009c000a00db0092009800a4009e
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_1 = 007c00ca00c600de00dc00f000f200d40023009100b100eb00ae005f00a60018
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVMono_EColor16MAP_1 = 00bd00400004000200df007e003800db00a70097008500f700da00cc00f60023
 
@@ -6459,57 +6459,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVMono_EColor16MAP_1 = 005d00cf002100b1007200b6001a00ee007a00dd003c0038000c004400c800cc
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_1 = 00160044008800f0001c009f00af003200b00099000300b00019001a00d500c0
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_1 = 0078004b0049001a00e7000e0081002f00db0009000000c1007d00b7009d008f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_1 = 00f8008000eb00150061007c0011008b006700d2004b00b100620006008d00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_1 = 004f000a001f00e300c10007005e000900ed0056006300e400c7008d00f60067
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_1 = 000000900065008600a700a7000e000f009400c1000700870000001c00330054
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_1 = 000a00b4002800bf00f000b500e00025005100b2006e0023001000ba00d60043
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_1 = 001c003d00a900e7006600ac007400f500f500b0008300cc00ce000e00230014
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_1 = 009c00ca0033005500cb00e700f9004c00360080004f00da008f005e006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_1 = 00de009000d1009700cd00f100f200c20053005b0081006c004700fe00760069
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_1 = 008900830090008000fe0099005300e4007c00fe00d800e1006b008c004300b9
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_1 = 0063004a00e7001100d50087002600b400b8007400cc00b800fb008b00e80052
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_1 = 00a3005600c800b0004e005d00bf003800e500b300c200de00e4002700b200f2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_1 = 007900bc00390089005300dd0026006400160004006e00d9008900a3008800fb
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_1 = 004d0070001c004900ec000d00ec003e00a40007000700ae00bc00c100960020
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_1 = 004e00da00fd00fe00a400bb003300f7000a00f40050007d00680038001e005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_1 = 00590077005c005500dd000700b4000000ba007300d8002a00fa00f800d60077
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_1 = 00d90028007f0027003400d9007200e5006000ca00460023003c00ef00e50017
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_1 = 0082003700da0003003900ff001d000a000000430015006800a9000500ce0038
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_1 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_1 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_1 = 007b00f4004b00cd004a00d4004d0061007d00dc00dd003600be00a900110092
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_1 = 00e100ad0017001000e900230083008900da002600d6005a002a00ca004200be
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_1 = 003800c1007e00db00d4009d00f0002000210005001200fa006800540076003c
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_1 = 005400340010000100de007e0050004500a7002b009c004f006a00a4000b0064
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_1 = 006100ab001900f2002d00e1000100860096007e0098009d0051007a00bf0098
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_1 = 0044008500ac006c00ff009a005e009c0075002d0027003e00e6006d00b3006e
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_1 = 00e80022000500da00f8006c00a300c5004d00cb00b900c30027005c007e008e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_1 = 004000e0009900e600bd003e006400cc00fa0007004b00e80046000c007b00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_1 = 0095000b00fd004900ec00180064006800b100e4005a00a9004000ab00ec00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_1 = 00bc001300b600ea000e000e00e1008c001f0052003c005a00c2009800060067
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_1 = 00be002c00cc00b700350080003a00c100a800bd006c0014003d001300440076
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_1 = 001900d100dd00f00016007700020035007b00d6003b0025007f005a00e10030
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_1 = 002d006b00dd00730047006d0066001900d30020006200c90006003c00790008
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_1 = 0042006f000a001f00910008007b003000ec009a00c7009900b1001b001200dc
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_1 = 00e0000e00d900dd0048005600fc007b00c6007400a100a300a60050004900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_1 = 00bb000c0015008b002d005e00a8005a00b000b1004900b3006e006e006800de
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_1 = 0052006700010041005d000c00a900df006500c4009400dd005d0072001400f6
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_1 = 00a9005e00aa00c000e500ab00a900cb00d0005800bc007500b000ff00980004
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_1 = 00230055006200ed00c900dd000b001c00d100ee00cc00b1004d007c007f0001
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_1 = 00ff0083009100e2002d00d5009e00db002a00cf00c300af005e00c700b2007f
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_1 = 004100c5006c0078006c00a000cc005e00ed008500410024008f00a9001600ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_1 = 007a00ab001300ed004f00b9003100d0004e0059007b00fe008d003100fc0083
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_1 = 009b00ca00fb009f00da002800d500c9003900f0007d00fc003700e3001700be
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_1 = 00ad00a7004000a80052006000ed00d30002003000af007100dd00b1002000c1
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_1 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_1 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_1 = 00f1000d00b90049003700f7003a0044009d00ca00d700c9009c006300350003
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_1 = 0069009900830073001500bf007a0003005600ea00e100df0050001500a300b3
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_1 = 00c200e0003500e6003b00b0002d0009002b004800bc00bf004200c300e000b0
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_1 = 00ad003f005600d3005400dd001b001d0028001c0047004200710007005c008a
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_1 = 008f00b50041001f00e9005c003000740025005700a1008800e200a600650052
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_1 = 00d700a4005600d3008000cc002a0068008800960008005f000600ce00190089
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSerif_EColor16MAP_1 = 00e3009e00b6005b009a00c000b300e200f00075006b00cf002c00d1003a0087
 
@@ -6529,57 +6529,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSerif_EColor16MAP_1 = 00fb00b3003f004c00e7001c005900e400b6008c0015003500b000c1003d0072
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_1 = 0031002300f700c1001e00e1002200ea006f000700c800a50095007e00c500e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_1 = 00eb0044003a007f007000ea00ad00aa00b20015007100dc00b6002f0044009a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_1 = 00af00be00d20061001c0073007a00c10056008b00fd00a10099006f002200a0
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_1 = 001500c9000e00ef00f900e6000d002d00730050006f00a30000006700a30000
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_1 = 00f3000b00360025003f00f0001f000600ff00b200b500b500b800dd00700062
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_1 = 0089007700fe00bc00c90097009e002b00d700a400af00cc00c800eb00eb00c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_1 = 008d00c40090003700d4006500df000c006800b100e5008a00fd00c8001b001e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_1 = 005b000f006800800002005d005b006b00cf002800ed003000df008b00a300a4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_1 = 00a6001e00e30020004e002900a400c6004800b000ed006f0020006d009700b5
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_1 = 001a00ec005500ac002f0083009900980025006b00850060002b009c00e50067
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_1 = 00b6001300930077006000be00e700ea002800ab003e00fd006100fa006100f3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_1 = 00ef00fa004c00b700e800a6006b00d0008800ca000b005c004e009c00ee0070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_1 = 007e0078009600eb005400de006400f9002e00b700f400ba002100a900810061
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_1 = 006d008f006300f30020008000ea002e00530037009800180096000300c100df
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_1 = 00bd00dc009b0039004b00ba008400e2006300a200570069009100a700ae0090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_1 = 006900db00ba009100180049006500fe00c200b0008b004800ff00fd000600c5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_1 = 0004004c004e00c000bc00d700b700e0006c002c003d00c900f900cf0018005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_1 = 004400650000005300fd0025009b0080002900e90099008d004e001d00a300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_1 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_1 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_1 = 00af00c20037006400c700c50020008a00450090000e008800ac00b600b80068
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_1 = 00d900cb00ee00f1004a0013001b00e8000100b0001f00d2008f007f002400d3
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_1 = 0053001f00c400db00ae0069008300270088005500e100a100b70043000300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_1 = 0042003200710026005400bb0008003200cc006800c600e4000e00ec007500cf
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_1 = 00c7004000f5006d008300fc00a900590098007f007c0051000900a900d20005
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_1 = 0086001e00e90059004a004a00200035004a009300190062009400cc00340069
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_1 = 002600b100220013002e00c300f7008a00b500d00014007900720010008e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_1 = 00c800d300e400b50030006c009f00bf002800ab008b00e300f70091000100fd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_1 = 00b000cb0034002500ef00be0043001b009400bc00a5001700f3005c00380023
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_1 = 0080003900b100b500dd00e300ca00fa0006000c00b000f5003400ca00420057
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_1 = 00fa00e1005200330019006100f3000b002a001c00a2005e006e00d5003900bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_1 = 007c00af006c00a1000c0016003900c600ea008700130003003d00ac00bd00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_1 = 008f006e003300900096000900c400ee004200f3006800cd00d3005300cf0056
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_1 = 008e0008005a0050005e0032009d005000220065002100e00088008400ae00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_1 = 004f000d00ef003d00810001001000970030007700ae008600e300eb005d0073
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_1 = 003c00cc00860090002800f200b400010006007500aa009600ea008d003000fb
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_1 = 001100ec008100f3009000b3007900280084006c0067007a0002002e007f00af
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_1 = 001a00620049008700ad00be007e009c004700e800a9001300d100e000130097
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_1 = 0064006a003300b200b9003a00b4006c00eb006d00ec006a0083007100680012
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_1 = 009e007e00f600180099007200c800ea000600b0004b001100f9005e00530087
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_1 = 002d0021002e00a0000000f900df0001006f007b005300cc008d0013006f00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_1 = 00e500b7007f007500c100ac0001007f00880089005600d4002100bb00370035
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_1 = 0048009c00bc00b1008c00be005800b4004800c400ed005900f9004400de0056
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_1 = 008400f100420049002600230018002000cf000300e400e30020006100130068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_1 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_1 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_1 = 00bb00a50066009900b3006d00630081004d00c6001000f500b40074006800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_1 = 001700d30045003d002100c60079003500fe000d007e00c8001000b900770017
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_1 = 00fc00f7002a00c000f8009600c3003900ac001200c7009f002500780049003d
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_1 = 006300fe00f6000000ae00680069004a002300d70019005000d5001300cc00e2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_1 = 008e00a100650013002200af00ce007a00fb00cf0015005900dc00bb009c0027
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_1 = 0089006500e6005100f900af000b008c005c0045007200b000e100b6001500a4
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSans_EColor16MAP_2 = 003b00560048009a0025002400bb006b008000c5003f005200cf004400c300d8
 
@@ -6599,57 +6599,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSans_EColor16MAP_2 = 008400dc002d007f00970069007500b70044001000c200fd009000ad00150080
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_2 = 002e0065005e0057007e00ab00aa005f005d006400c300050044008700ed00e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_2 = 002700a700680064006900500025007d00ee00b100b100b50023008000a400e7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_2 = 004100be003c00b80043000a0039008300f4005300a400fc0072000d00120060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_2 = 00f200ab003a00d0000d001e006500f500f8004700db0054008a002b0043000f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_2 = 004500b500cc00fd00770051007000ea00f80028008d00b000930043002000a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_2 = 004400e9009200b600300037000e003f0072009200bf00e300a000c000f4007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_2 = 00880091000700b900a600b5002500160031000c00a500e50021009a006c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_2 = 00e100cd000700a10086003600a4007c00b4007100ab00f00030003a00df00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_2 = 000b009300c500930006007300bb00e5002a009500f30088000600a100490080
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_2 = 009000ee009b007800bb005e007300100052007b0050003700e200f200cb00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_2 = 009900e700f500f800de003f00460066001b0052006c002300ff0060006800c6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_2 = 00700097002f00e4002a00b100540057009400cb002400b700f100c70023004e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_2 = 00f700380084005a006c00ff002b00ae00410030003000bc001a00a900f5001d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_2 = 00b40035004b002000b300cf00f7003100dc00cb0011001600ef00e900e3001a
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_2 = 00eb00a2006900a500470087002f00a100b1009900e800f70016000a00cf00cf
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_2 = 008b00be0003007b0071007a00e6003a002500100013003500de009d008f004a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_2 = 002100a1008c00ad00810042002d004700eb00ae00f700c700ef000900b20022
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_2 = 0094000700d2003400d500a100cd0011009e003a00b000ce004f000c0035003f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_2 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_2 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_2 = 004d003100c90091009d00cc00de00ff009b009b001200670061008c00980022
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_2 = 0072000b004e005800c2009c006100f0008f00750022009f001d0018001900c4
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_2 = 00ca00af007500c100aa009a00c00088004f000800220039006c00e100a20002
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_2 = 004100eb00c60035003300df00220021005c00fe00ad008f00af00e300560091
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_2 = 00cf00be0011009c001d004000de00f000880099004900c000440037002600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_2 = 00ef0069006b00ba00b1009e004d000800f6008f008f00d700aa00c100d30018
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_2 = 005000c400f6004000f900e1000300ec006000d9005100c70005006200920059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_2 = 001d0082001000d2001a005e00c4006900dd00f2007000f8006000c200b00067
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_2 = 00410053000300f200160060005c0004000b001c005600c10092007d005a0056
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_2 = 005800eb002600c100bc0073007d00560035009c005600600046003800af00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_2 = 00d100a80036008a002f008e000500f1001e00a5008b00ba005000d4008a008a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_2 = 00eb0036008000520008000b003a00150025008f008400620029008e0085007d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_2 = 0090008900c70097000d00b0002b00670003008e00450050006f001e003e00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_2 = 004800ea0016000a002200e800cf00d200e900c6002400ae00d600ac00100082
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_2 = 00db00a600bc0042009200de0044000d001a00ba00d70065008200c2008e0008
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_2 = 00d300fa0033008200e800b200c300b3001200e90084006d00990026004f002e
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_2 = 0086002a00dd00b300ce007b000300d20000008c008b007d00bb00af005800aa
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_2 = 006600ae0019001c000800fa00650056006b00a50076000500e900d4002000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_2 = 00b1006500cc002c007500180088001200ed005e00e400dc005400ad009a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_2 = 009a000300a300a000a100cf004100af00a7002e003e005a00be00ee00a4009d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_2 = 009100ef00b400f8002c008000c200d0007f00ad0052001a0010005700870064
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_2 = 0002009e001a0069001c00a400cc009d005300b0001300440021007500bb00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_2 = 00010018004e002f0019007600730070007800b0009f005c0061001d00da00b8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_2 = 0023001a0089009700c700fa00d7009f000100ea007600e40047005e0058003b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_2 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_2 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_2 = 006a00a10080007a006c00a7007a0000002d00950037000f00b6003a008600f6
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_2 = 0036007700cb005200f4005e0075007b00d4005900b300f70084004400090061
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_2 = 008c00cb000a00860014007100dc004b00fd00bf00b7009e00140060002c00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_2 = 00a1009300e9005c00d400ab009a00330087003100ee0045002d00b3009f0070
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_2 = 0003007b00ea0060005300e3005f00e50013009c000a00db0092009800a4009e
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_2 = 007c00ca00c600de00dc00f000f200d40023009100b100eb00ae005f00a60018
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVMono_EColor16MAP_2 = 00bd00400004000200df007e003800db00a70097008500f700da00cc00f60023
 
@@ -6669,57 +6669,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVMono_EColor16MAP_2 = 005d00cf002100b1007200b6001a00ee007a00dd003c0038000c004400c800cc
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_2 = 00160044008800f0001c009f00af003200b00099000300b00019001a00d500c0
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_2 = 0078004b0049001a00e7000e0081002f00db0009000000c1007d00b7009d008f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_2 = 00f8008000eb00150061007c0011008b006700d2004b00b100620006008d00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_2 = 004f000a001f00e300c10007005e000900ed0056006300e400c7008d00f60067
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_2 = 000000900065008600a700a7000e000f009400c1000700870000001c00330054
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_2 = 000a00b4002800bf00f000b500e00025005100b2006e0023001000ba00d60043
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_2 = 001c003d00a900e7006600ac007400f500f500b0008300cc00ce000e00230014
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_2 = 009c00ca0033005500cb00e700f9004c00360080004f00da008f005e006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_2 = 00de009000d1009700cd00f100f200c20053005b0081006c004700fe00760069
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_2 = 008900830090008000fe0099005300e4007c00fe00d800e1006b008c004300b9
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_2 = 0063004a00e7001100d50087002600b400b8007400cc00b800fb008b00e80052
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_2 = 00a3005600c800b0004e005d00bf003800e500b300c200de00e4002700b200f2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_2 = 007900bc00390089005300dd0026006400160004006e00d9008900a3008800fb
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_2 = 004d0070001c004900ec000d00ec003e00a40007000700ae00bc00c100960020
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_2 = 004e00da00fd00fe00a400bb003300f7000a00f40050007d00680038001e005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_2 = 00590077005c005500dd000700b4000000ba007300d8002a00fa00f800d60077
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_2 = 00d90028007f0027003400d9007200e5006000ca00460023003c00ef00e50017
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_2 = 0082003700da0003003900ff001d000a000000430015006800a9000500ce0038
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_2 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_2 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_2 = 007b00f4004b00cd004a00d4004d0061007d00dc00dd003600be00a900110092
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_2 = 00e100ad0017001000e900230083008900da002600d6005a002a00ca004200be
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_2 = 003800c1007e00db00d4009d00f0002000210005001200fa006800540076003c
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_2 = 005400340010000100de007e0050004500a7002b009c004f006a00a4000b0064
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_2 = 006100ab001900f2002d00e1000100860096007e0098009d0051007a00bf0098
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_2 = 0044008500ac006c00ff009a005e009c0075002d0027003e00e6006d00b3006e
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_2 = 00e80022000500da00f8006c00a300c5004d00cb00b900c30027005c007e008e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_2 = 004000e0009900e600bd003e006400cc00fa0007004b00e80046000c007b00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_2 = 0095000b00fd004900ec00180064006800b100e4005a00a9004000ab00ec00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_2 = 00bc001300b600ea000e000e00e1008c001f0052003c005a00c2009800060067
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_2 = 00be002c00cc00b700350080003a00c100a800bd006c0014003d001300440076
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_2 = 001900d100dd00f00016007700020035007b00d6003b0025007f005a00e10030
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_2 = 002d006b00dd00730047006d0066001900d30020006200c90006003c00790008
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_2 = 0042006f000a001f00910008007b003000ec009a00c7009900b1001b001200dc
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_2 = 00e0000e00d900dd0048005600fc007b00c6007400a100a300a60050004900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_2 = 00bb000c0015008b002d005e00a8005a00b000b1004900b3006e006e006800de
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_2 = 0052006700010041005d000c00a900df006500c4009400dd005d0072001400f6
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_2 = 00a9005e00aa00c000e500ab00a900cb00d0005800bc007500b000ff00980004
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_2 = 00230055006200ed00c900dd000b001c00d100ee00cc00b1004d007c007f0001
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_2 = 00ff0083009100e2002d00d5009e00db002a00cf00c300af005e00c700b2007f
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_2 = 004100c5006c0078006c00a000cc005e00ed008500410024008f00a9001600ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_2 = 007a00ab001300ed004f00b9003100d0004e0059007b00fe008d003100fc0083
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_2 = 009b00ca00fb009f00da002800d500c9003900f0007d00fc003700e3001700be
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_2 = 00ad00a7004000a80052006000ed00d30002003000af007100dd00b1002000c1
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_2 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_2 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_2 = 00f1000d00b90049003700f7003a0044009d00ca00d700c9009c006300350003
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_2 = 0069009900830073001500bf007a0003005600ea00e100df0050001500a300b3
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_2 = 00c200e0003500e6003b00b0002d0009002b004800bc00bf004200c300e000b0
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_2 = 00ad003f005600d3005400dd001b001d0028001c0047004200710007005c008a
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_2 = 008f00b50041001f00e9005c003000740025005700a1008800e200a600650052
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_2 = 00d700a4005600d3008000cc002a0068008800960008005f000600ce00190089
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSerif_EColor16MAP_2 = 00e3009e00b6005b009a00c000b300e200f00075006b00cf002c00d1003a0087
 
@@ -6739,57 +6739,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSerif_EColor16MAP_2 = 00fb00b3003f004c00e7001c005900e400b6008c0015003500b000c1003d0072
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_2 = 0031002300f700c1001e00e1002200ea006f000700c800a50095007e00c500e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_2 = 00eb0044003a007f007000ea00ad00aa00b20015007100dc00b6002f0044009a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_2 = 00af00be00d20061001c0073007a00c10056008b00fd00a10099006f002200a0
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_2 = 001500c9000e00ef00f900e6000d002d00730050006f00a30000006700a30000
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_2 = 00f3000b00360025003f00f0001f000600ff00b200b500b500b800dd00700062
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_2 = 0089007700fe00bc00c90097009e002b00d700a400af00cc00c800eb00eb00c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_2 = 008d00c40090003700d4006500df000c006800b100e5008a00fd00c8001b001e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_2 = 005b000f006800800002005d005b006b00cf002800ed003000df008b00a300a4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_2 = 00a6001e00e30020004e002900a400c6004800b000ed006f0020006d009700b5
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_2 = 001a00ec005500ac002f0083009900980025006b00850060002b009c00e50067
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_2 = 00b6001300930077006000be00e700ea002800ab003e00fd006100fa006100f3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_2 = 00ef00fa004c00b700e800a6006b00d0008800ca000b005c004e009c00ee0070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_2 = 007e0078009600eb005400de006400f9002e00b700f400ba002100a900810061
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_2 = 006d008f006300f30020008000ea002e00530037009800180096000300c100df
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_2 = 00bd00dc009b0039004b00ba008400e2006300a200570069009100a700ae0090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_2 = 006900db00ba009100180049006500fe00c200b0008b004800ff00fd000600c5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_2 = 0004004c004e00c000bc00d700b700e0006c002c003d00c900f900cf0018005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_2 = 004400650000005300fd0025009b0080002900e90099008d004e001d00a300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_2 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_2 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_2 = 00af00c20037006400c700c50020008a00450090000e008800ac00b600b80068
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_2 = 00d900cb00ee00f1004a0013001b00e8000100b0001f00d2008f007f002400d3
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_2 = 0053001f00c400db00ae0069008300270088005500e100a100b70043000300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_2 = 0042003200710026005400bb0008003200cc006800c600e4000e00ec007500cf
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_2 = 00c7004000f5006d008300fc00a900590098007f007c0051000900a900d20005
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_2 = 0086001e00e90059004a004a00200035004a009300190062009400cc00340069
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_2 = 002600b100220013002e00c300f7008a00b500d00014007900720010008e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_2 = 00c800d300e400b50030006c009f00bf002800ab008b00e300f70091000100fd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_2 = 00b000cb0034002500ef00be0043001b009400bc00a5001700f3005c00380023
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_2 = 0080003900b100b500dd00e300ca00fa0006000c00b000f5003400ca00420057
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_2 = 00fa00e1005200330019006100f3000b002a001c00a2005e006e00d5003900bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_2 = 007c00af006c00a1000c0016003900c600ea008700130003003d00ac00bd00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_2 = 008f006e003300900096000900c400ee004200f3006800cd00d3005300cf0056
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_2 = 008e0008005a0050005e0032009d005000220065002100e00088008400ae00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_2 = 004f000d00ef003d00810001001000970030007700ae008600e300eb005d0073
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_2 = 003c00cc00860090002800f200b400010006007500aa009600ea008d003000fb
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_2 = 001100ec008100f3009000b3007900280084006c0067007a0002002e007f00af
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_2 = 001a00620049008700ad00be007e009c004700e800a9001300d100e000130097
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_2 = 0064006a003300b200b9003a00b4006c00eb006d00ec006a0083007100680012
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_2 = 009e007e00f600180099007200c800ea000600b0004b001100f9005e00530087
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_2 = 002d0021002e00a0000000f900df0001006f007b005300cc008d0013006f00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_2 = 00e500b7007f007500c100ac0001007f00880089005600d4002100bb00370035
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_2 = 0048009c00bc00b1008c00be005800b4004800c400ed005900f9004400de0056
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_2 = 008400f100420049002600230018002000cf000300e400e30020006100130068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_2 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_2 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_2 = 00bb00a50066009900b3006d00630081004d00c6001000f500b40074006800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_2 = 001700d30045003d002100c60079003500fe000d007e00c8001000b900770017
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_2 = 00fc00f7002a00c000f8009600c3003900ac001200c7009f002500780049003d
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_2 = 006300fe00f6000000ae00680069004a002300d70019005000d5001300cc00e2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_2 = 008e00a100650013002200af00ce007a00fb00cf0015005900dc00bb009c0027
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_2 = 0089006500e6005100f900af000b008c005c0045007200b000e100b6001500a4
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSans_EColor16MAP_3 = 003b00560048009a0025002400bb006b008000c5003f005200cf004400c300d8
 
@@ -6809,57 +6809,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSans_EColor16MAP_3 = 008400dc002d007f00970069007500b70044001000c200fd009000ad00150080
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_3 = 002e0065005e0057007e00ab00aa005f005d006400c300050044008700ed00e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_3 = 002700a700680064006900500025007d00ee00b100b100b50023008000a400e7
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_3 = 004100be003c00b80043000a0039008300f4005300a400fc0072000d00120060
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_3 = 00f200ab003a00d0000d001e006500f500f8004700db0054008a002b0043000f
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_3 = 004500b500cc00fd00770051007000ea00f80028008d00b000930043002000a9
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_3 = 004400e9009200b600300037000e003f0072009200bf00e300a000c000f4007b
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_3 = 00880091000700b900a600b5002500160031000c00a500e50021009a006c0020
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_3 = 00e100cd000700a10086003600a4007c00b4007100ab00f00030003a00df00f8
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_3 = 000b009300c500930006007300bb00e5002a009500f30088000600a100490080
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_3 = 009000ee009b007800bb005e007300100052007b0050003700e200f200cb00dd
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_3 = 009900e700f500f800de003f00460066001b0052006c002300ff0060006800c6
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_3 = 00700097002f00e4002a00b100540057009400cb002400b700f100c70023004e
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_3 = 00f700380084005a006c00ff002b00ae00410030003000bc001a00a900f5001d
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_3 = 00b40035004b002000b300cf00f7003100dc00cb0011001600ef00e900e3001a
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_3 = 00eb00a2006900a500470087002f00a100b1009900e800f70016000a00cf00cf
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_3 = 008b00be0003007b0071007a00e6003a002500100013003500de009d008f004a
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_3 = 002100a1008c00ad00810042002d004700eb00ae00f700c700ef000900b20022
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_3 = 0094000700d2003400d500a100cd0011009e003a00b000ce004f000c0035003f
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_3 = 0043006700e900d800d6008700da00be009b001a004800420097002d007800d9
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_3 = 0079005900a40086003900ba0071008f006d0005006b0007009e00c800fa0080
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_3 = 004d003100c90091009d00cc00de00ff009b009b001200670061008c00980022
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_3 = 0072000b004e005800c2009c006100f0008f00750022009f001d0018001900c4
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_3 = 00ca00af007500c100aa009a00c00088004f000800220039006c00e100a20002
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_3 = 004100eb00c60035003300df00220021005c00fe00ad008f00af00e300560091
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_3 = 00cf00be0011009c001d004000de00f000880099004900c000440037002600c6
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_3 = 00ef0069006b00ba00b1009e004d000800f6008f008f00d700aa00c100d30018
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSans_EColor16MAP_3 = 005000c400f6004000f900e1000300ec006000d9005100c70005006200920059
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSans_EColor16MAP_3 = 001d0082001000d2001a005e00c4006900dd00f2007000f8006000c200b00067
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSans_EColor16MAP_3 = 00410053000300f200160060005c0004000b001c005600c10092007d005a0056
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSans_EColor16MAP_3 = 005800eb002600c100bc0073007d00560035009c005600600046003800af00c2
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSans_EColor16MAP_3 = 00d100a80036008a002f008e000500f1001e00a5008b00ba005000d4008a008a
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSans_EColor16MAP_3 = 00eb0036008000520008000b003a00150025008f008400620029008e0085007d
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSans_EColor16MAP_3 = 0090008900c70097000d00b0002b00670003008e00450050006f001e003e00a2
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSans_EColor16MAP_3 = 004800ea0016000a002200e800cf00d200e900c6002400ae00d600ac00100082
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSans_EColor16MAP_3 = 00db00a600bc0042009200de0044000d001a00ba00d70065008200c2008e0008
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSans_EColor16MAP_3 = 00d300fa0033008200e800b200c300b3001200e90084006d00990026004f002e
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSans_EColor16MAP_3 = 0086002a00dd00b300ce007b000300d20000008c008b007d00bb00af005800aa
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSans_EColor16MAP_3 = 006600ae0019001c000800fa00650056006b00a50076000500e900d4002000e5
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSans_EColor16MAP_3 = 00b1006500cc002c007500180088001200ed005e00e400dc005400ad009a00b0
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSans_EColor16MAP_3 = 009a000300a300a000a100cf004100af00a7002e003e005a00be00ee00a4009d
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSans_EColor16MAP_3 = 009100ef00b400f8002c008000c200d0007f00ad0052001a0010005700870064
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSans_EColor16MAP_3 = 0002009e001a0069001c00a400cc009d005300b0001300440021007500bb00ae
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSans_EColor16MAP_3 = 00010018004e002f0019007600730070007800b0009f005c0061001d00da00b8
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSans_EColor16MAP_3 = 0023001a0089009700c700fa00d7009f000100ea007600e40047005e0058003b
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSans_EColor16MAP_3 = 00b9002800a200ea00d6001a00950043008600e8006d00f400190075006b00bc
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSans_EColor16MAP_3 = 00cc00d0006700ad00f9001d00e4006800d900d600d4006a00ea006900c800f9
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSans_EColor16MAP_3 = 006a00a10080007a006c00a7007a0000002d00950037000f00b6003a008600f6
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSans_EColor16MAP_3 = 0036007700cb005200f4005e0075007b00d4005900b300f70084004400090061
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSans_EColor16MAP_3 = 008c00cb000a00860014007100dc004b00fd00bf00b7009e00140060002c00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSans_EColor16MAP_3 = 00a1009300e9005c00d400ab009a00330087003100ee0045002d00b3009f0070
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSans_EColor16MAP_3 = 0003007b00ea0060005300e3005f00e50013009c000a00db0092009800a4009e
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSans_EColor16MAP_3 = 007c00ca00c600de00dc00f000f200d40023009100b100eb00ae005f00a60018
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVMono_EColor16MAP_3 = 00bd00400004000200df007e003800db00a70097008500f700da00cc00f60023
 
@@ -6879,57 +6879,57 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVMono_EColor16MAP_3 = 005d00cf002100b1007200b6001a00ee007a00dd003c0038000c004400c800cc
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_3 = 00160044008800f0001c009f00af003200b00099000300b00019001a00d500c0
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_3 = 0078004b0049001a00e7000e0081002f00db0009000000c1007d00b7009d008f
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_3 = 00f8008000eb00150061007c0011008b006700d2004b00b100620006008d00a7
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_3 = 004f000a001f00e300c10007005e000900ed0056006300e400c7008d00f60067
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_3 = 000000900065008600a700a7000e000f009400c1000700870000001c00330054
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_3 = 000a00b4002800bf00f000b500e00025005100b2006e0023001000ba00d60043
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_3 = 001c003d00a900e7006600ac007400f500f500b0008300cc00ce000e00230014
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_3 = 009c00ca0033005500cb00e700f9004c00360080004f00da008f005e006e0008
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_3 = 00de009000d1009700cd00f100f200c20053005b0081006c004700fe00760069
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_3 = 008900830090008000fe0099005300e4007c00fe00d800e1006b008c004300b9
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_3 = 0063004a00e7001100d50087002600b400b8007400cc00b800fb008b00e80052
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_3 = 00a3005600c800b0004e005d00bf003800e500b300c200de00e4002700b200f2
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_3 = 007900bc00390089005300dd0026006400160004006e00d9008900a3008800fb
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_3 = 004d0070001c004900ec000d00ec003e00a40007000700ae00bc00c100960020
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_3 = 004e00da00fd00fe00a400bb003300f7000a00f40050007d00680038001e005e
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_3 = 00590077005c005500dd000700b4000000ba007300d8002a00fa00f800d60077
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_3 = 00d90028007f0027003400d9007200e5006000ca00460023003c00ef00e50017
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_3 = 0082003700da0003003900ff001d000a000000430015006800a9000500ce0038
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_3 = 0090009d00a500ff009f0042007100c100d900e1004800ef0035008100ef00fd
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_3 = 0017001500af001d0073003600d6003100140088009500b4002a0091001d00f4
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_3 = 007b00f4004b00cd004a00d4004d0061007d00dc00dd003600be00a900110092
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_3 = 00e100ad0017001000e900230083008900da002600d6005a002a00ca004200be
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_3 = 003800c1007e00db00d4009d00f0002000210005001200fa006800540076003c
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_3 = 005400340010000100de007e0050004500a7002b009c004f006a00a4000b0064
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_3 = 006100ab001900f2002d00e1000100860096007e0098009d0051007a00bf0098
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_3 = 0044008500ac006c00ff009a005e009c0075002d0027003e00e6006d00b3006e
+OutlineShadowWithDrawTextNormalAndVertical_9_DVMono_EColor16MAP_3 = 00e80022000500da00f8006c00a300c5004d00cb00b900c30027005c007e008e
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVMono_EColor16MAP_3 = 004000e0009900e600bd003e006400cc00fa0007004b00e80046000c007b00bd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVMono_EColor16MAP_3 = 0095000b00fd004900ec00180064006800b100e4005a00a9004000ab00ec00f8
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVMono_EColor16MAP_3 = 00bc001300b600ea000e000e00e1008c001f0052003c005a00c2009800060067
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVMono_EColor16MAP_3 = 00be002c00cc00b700350080003a00c100a800bd006c0014003d001300440076
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVMono_EColor16MAP_3 = 001900d100dd00f00016007700020035007b00d6003b0025007f005a00e10030
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVMono_EColor16MAP_3 = 002d006b00dd00730047006d0066001900d30020006200c90006003c00790008
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVMono_EColor16MAP_3 = 0042006f000a001f00910008007b003000ec009a00c7009900b1001b001200dc
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVMono_EColor16MAP_3 = 00e0000e00d900dd0048005600fc007b00c6007400a100a300a60050004900a6
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVMono_EColor16MAP_3 = 00bb000c0015008b002d005e00a8005a00b000b1004900b3006e006e006800de
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVMono_EColor16MAP_3 = 0052006700010041005d000c00a900df006500c4009400dd005d0072001400f6
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVMono_EColor16MAP_3 = 00a9005e00aa00c000e500ab00a900cb00d0005800bc007500b000ff00980004
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVMono_EColor16MAP_3 = 00230055006200ed00c900dd000b001c00d100ee00cc00b1004d007c007f0001
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVMono_EColor16MAP_3 = 00ff0083009100e2002d00d5009e00db002a00cf00c300af005e00c700b2007f
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVMono_EColor16MAP_3 = 004100c5006c0078006c00a000cc005e00ed008500410024008f00a9001600ac
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVMono_EColor16MAP_3 = 007a00ab001300ed004f00b9003100d0004e0059007b00fe008d003100fc0083
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVMono_EColor16MAP_3 = 009b00ca00fb009f00da002800d500c9003900f0007d00fc003700e3001700be
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVMono_EColor16MAP_3 = 00ad00a7004000a80052006000ed00d30002003000af007100dd00b1002000c1
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVMono_EColor16MAP_3 = 004700c7009900fa00f700f6009000ad00530019000a00ec00cb002800c20062
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVMono_EColor16MAP_3 = 00dc002f00e000a80025008c0064001a004f008d009f000300650065001a0005
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVMono_EColor16MAP_3 = 00f1000d00b90049003700f7003a0044009d00ca00d700c9009c006300350003
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVMono_EColor16MAP_3 = 0069009900830073001500bf007a0003005600ea00e100df0050001500a300b3
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVMono_EColor16MAP_3 = 00c200e0003500e6003b00b0002d0009002b004800bc00bf004200c300e000b0
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVMono_EColor16MAP_3 = 00ad003f005600d3005400dd001b001d0028001c0047004200710007005c008a
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVMono_EColor16MAP_3 = 008f00b50041001f00e9005c003000740025005700a1008800e200a600650052
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVMono_EColor16MAP_3 = 00d700a4005600d3008000cc002a0068008800960008005f000600ce00190089
 
 OutlineShadowWithDrawTextNormalAndVertical_0_DVSerif_EColor16MAP_3 = 00e3009e00b6005b009a00c000b300e200f00075006b00cf002c00d1003a0087
 
@@ -6949,150 +6949,150 @@
 
 OutlineShadowWithDrawTextNormalAndVertical_8_DVSerif_EColor16MAP_3 = 00fb00b3003f004c00e7001c005900e400b6008c0015003500b000c1003d0072
 
-OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_3 = 0031002300f700c1001e00e1002200ea006f000700c800a50095007e00c500e8
-
-OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_3 = 00eb0044003a007f007000ea00ad00aa00b20015007100dc00b6002f0044009a
-
-OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_3 = 00af00be00d20061001c0073007a00c10056008b00fd00a10099006f002200a0
-
-OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_3 = 001500c9000e00ef00f900e6000d002d00730050006f00a30000006700a30000
-
-OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_3 = 00f3000b00360025003f00f0001f000600ff00b200b500b500b800dd00700062
-
-OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_3 = 0089007700fe00bc00c90097009e002b00d700a400af00cc00c800eb00eb00c8
-
-OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_3 = 008d00c40090003700d4006500df000c006800b100e5008a00fd00c8001b001e
-
-OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_3 = 005b000f006800800002005d005b006b00cf002800ed003000df008b00a300a4
-
-OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_3 = 00a6001e00e30020004e002900a400c6004800b000ed006f0020006d009700b5
-
-OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_3 = 001a00ec005500ac002f0083009900980025006b00850060002b009c00e50067
-
-OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_3 = 00b6001300930077006000be00e700ea002800ab003e00fd006100fa006100f3
-
-OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_3 = 00ef00fa004c00b700e800a6006b00d0008800ca000b005c004e009c00ee0070
-
-OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_3 = 007e0078009600eb005400de006400f9002e00b700f400ba002100a900810061
-
-OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_3 = 006d008f006300f30020008000ea002e00530037009800180096000300c100df
-
-OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_3 = 00bd00dc009b0039004b00ba008400e2006300a200570069009100a700ae0090
-
-OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_3 = 006900db00ba009100180049006500fe00c200b0008b004800ff00fd000600c5
-
-OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_3 = 0004004c004e00c000bc00d700b700e0006c002c003d00c900f900cf0018005a
-
-OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_3 = 004400650000005300fd0025009b0080002900e90099008d004e001d00a300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_3 = 00ca008d007600fc00b800630065008d00b300c200c2009e0086005000330034
-
-OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_3 = 00920028001200f4002d009900e1006000070008009b00eb007400e00066007f
-
-OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_3 = 00af00c20037006400c700c50020008a00450090000e008800ac00b600b80068
-
-OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_3 = 00d900cb00ee00f1004a0013001b00e8000100b0001f00d2008f007f002400d3
-
-OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_3 = 0053001f00c400db00ae0069008300270088005500e100a100b70043000300e7
-
-OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_3 = 0042003200710026005400bb0008003200cc006800c600e4000e00ec007500cf
-
-OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_3 = 00c7004000f5006d008300fc00a900590098007f007c0051000900a900d20005
-
-OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_3 = 0086001e00e90059004a004a00200035004a009300190062009400cc00340069
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray2_0 = 00a5000a000c00b1000400de002500c600d5000d008b00df003b00ea009f0079
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray2_0 = 000d00bd00ee00d0003a00cb00d000b0000b0057005d00ca00920099008e0053
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray2_0 = 0097002700c4001a009b00a5005700d3000c007a006500ce006800f100d1005e
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray2_0 = 00a400a300bf009500e600d900b700fc0017009100ca005f004400be00b90035
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray4_0 = 00580043006f00f70053004a004c009a000c009500c20019005d00a500c6001d
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray4_0 = 00bb008700c2000e00a500a9007c0015003d008b00df005300a3008000e80011
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray4_0 = 0006004d00cc009d00b500ba00670076009b00b900ea008c008800e100a0005a
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray4_0 = 00c5009500b4005f009600bf00a50001004400c300bd008b0019001500b00016
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray16_0 = 00b800de008d001d00cd0033000600910009006b007b0077000f00b300b6007c
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray16_0 = 0089001600fd00b0002500300053009000b600d100db00af006a0037009d0081
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray16_0 = 00eb005800d3009100cf00d900db00ef00dc004b00fb003a00fb007c00550043
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray16_0 = 007300940038006b008000610051007c00fd00e8003500670067003e00540082
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray256_0 = 008200db001f007900c70048008400fa006e00b8001200370029005200d90010
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray256_0 = 008c00d50028000b00c800bb0043001400ad00be009a006c0001003500e4002c
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray256_0 = 006200b2004600b100da00de00390059002c00dc006800030036007400d40008
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray256_0 = 008d0009007100ce00f400c7003300d7004400fd005e0016004e003d00df002d
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16_0 = 006b0074003400a300f300d90039002400b5002e000900db004d00ac00e50031
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16_0 = 003e003d00e000d800ea00be009d0003007b006100ed004800ee0089009300ac
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16_0 = 00180002008000c000350060003b000d00f000f9003400d1000000bc008a0052
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16_0 = 005000b40062001400b400300046002d006500bd001f0063001f0008000a0015
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor256_0 = 008d00670064006600d300b60026007300c900a9004d000200a000f1000e002d
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor256_0 = 00ce00e1004a0096009e00fa0011003100d700f70094008b005c008e00d20072
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor256_0 = 0009005a007b00d3005800ff000d002f005c00ca003c00b200ca00be00b500d3
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor256_0 = 005f000b00b7007c0019008000850047003a00ce00a60086002e000e0031009d
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor64K_0 = 00d900cd00b6003f00fe0033007f00f300c40082007d00690017001c004300f9
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor64K_0 = 00ca00ba000300b8006f0025000c00e2005400f300eb00a800e500c900d100f9
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor64K_0 = 00840062009f006e00b9006e0089008700df00e5005b000b00b3007100b3001b
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor64K_0 = 00a900b700bd001d00f10081002900f500b7008e004e00d800fb0085005000f8
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16M_0 = 000c007200cc00e800f2006e00ef005e00e2001b00a10092004d007f00c100bb
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16M_0 = 000a00b500e500bd009900a500980049002a00c9007e001e00ca00ee00a20056
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16M_0 = 007500f600c7004c00f2005c005c00f00041005500c3000f00b8005c0097004f
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16M_0 = 00c6007600bf00be0014002f001e00d4009b00900041001d006c001500600047
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor4K_0 = 00da00c6005e00370052009000c800ab00a3004d005000fe00ef0074009500a4
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor4K_0 = 008e00700091002a001b0038008000c9005000c50072002f009d006900ed00fd
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor4K_0 = 00550099002600c5003000da000700b90022007e00970024005200820045002d
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor4K_0 = 00ca007f004c00a200ae00f500d3000e006400b90034000300ba0050000a0056
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16MU_0 = 00fd00c8004100b60014005e005400f6003600f0009700a2002a008f000a0038
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16MU_0 = 006600ce002d00800047006100420035002800bb00b400240064001600210074
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16MU_0 = 000700f400ae0090005400b900cd00f500c60057001e003d00dd008e00700017
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16MU_0 = 006b00a90039003700a2001f004b00fc00b8000400df009d002200f000fe0048
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16MA_0 = 001d0071007d0045005a009c0029004800c200d400dd004d00a300fc00f40035
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16MA_0 = 00cc001300de00f30045005f00cb00c5000c000300ec006c008f00e7006e0096
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16MA_0 = 000700f400ae0090005400b900cd00f500c60057001e003d00dd008e00700017
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16MA_0 = 006b00a90039003700a2001f004b00fc00b8000400df009d002200f000fe0048
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16MAP_0 = 0052008600050042004b008c00ef009300cb005c00ac00b300c3003e00dd00f1
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16MAP_0 = 00f7003f003d00800021009a005c00ea00c500d900e0006200d1005200f0005e
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16MAP_0 = 000700f400ae0090005400b900cd00f500c60057001e003d00dd008e00700017
-
-OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16MAP_0 = 006b00a90039003700a2001f004b00fc00b8000400df009d002200f000fe0048
+OutlineShadowWithDrawTextNormalAndVertical_9_DVSerif_EColor16MAP_3 = 002600b100220013002e00c300f7008a00b500d00014007900720010008e003a
+
+OutlineShadowWithDrawTextNormalAndVertical_10_DVSerif_EColor16MAP_3 = 00c800d300e400b50030006c009f00bf002800ab008b00e300f70091000100fd
+
+OutlineShadowWithDrawTextNormalAndVertical_11_DVSerif_EColor16MAP_3 = 00b000cb0034002500ef00be0043001b009400bc00a5001700f3005c00380023
+
+OutlineShadowWithDrawTextNormalAndVertical_12_DVSerif_EColor16MAP_3 = 0080003900b100b500dd00e300ca00fa0006000c00b000f5003400ca00420057
+
+OutlineShadowWithDrawTextNormalAndVertical_13_DVSerif_EColor16MAP_3 = 00fa00e1005200330019006100f3000b002a001c00a2005e006e00d5003900bf
+
+OutlineShadowWithDrawTextNormalAndVertical_14_DVSerif_EColor16MAP_3 = 007c00af006c00a1000c0016003900c600ea008700130003003d00ac00bd00b7
+
+OutlineShadowWithDrawTextNormalAndVertical_15_DVSerif_EColor16MAP_3 = 008f006e003300900096000900c400ee004200f3006800cd00d3005300cf0056
+
+OutlineShadowWithDrawTextNormalAndVertical_16_DVSerif_EColor16MAP_3 = 008e0008005a0050005e0032009d005000220065002100e00088008400ae00b9
+
+OutlineShadowWithDrawTextNormalAndVertical_17_DVSerif_EColor16MAP_3 = 004f000d00ef003d00810001001000970030007700ae008600e300eb005d0073
+
+OutlineShadowWithDrawTextNormalAndVertical_18_DVSerif_EColor16MAP_3 = 003c00cc00860090002800f200b400010006007500aa009600ea008d003000fb
+
+OutlineShadowWithDrawTextNormalAndVertical_19_DVSerif_EColor16MAP_3 = 001100ec008100f3009000b3007900280084006c0067007a0002002e007f00af
+
+OutlineShadowWithDrawTextNormalAndVertical_20_DVSerif_EColor16MAP_3 = 001a00620049008700ad00be007e009c004700e800a9001300d100e000130097
+
+OutlineShadowWithDrawTextNormalAndVertical_21_DVSerif_EColor16MAP_3 = 0064006a003300b200b9003a00b4006c00eb006d00ec006a0083007100680012
+
+OutlineShadowWithDrawTextNormalAndVertical_22_DVSerif_EColor16MAP_3 = 009e007e00f600180099007200c800ea000600b0004b001100f9005e00530087
+
+OutlineShadowWithDrawTextNormalAndVertical_23_DVSerif_EColor16MAP_3 = 002d0021002e00a0000000f900df0001006f007b005300cc008d0013006f00dd
+
+OutlineShadowWithDrawTextNormalAndVertical_24_DVSerif_EColor16MAP_3 = 00e500b7007f007500c100ac0001007f00880089005600d4002100bb00370035
+
+OutlineShadowWithDrawTextNormalAndVertical_25_DVSerif_EColor16MAP_3 = 0048009c00bc00b1008c00be005800b4004800c400ed005900f9004400de0056
+
+OutlineShadowWithDrawTextNormalAndVertical_26_DVSerif_EColor16MAP_3 = 008400f100420049002600230018002000cf000300e400e30020006100130068
+
+OutlineShadowWithDrawTextNormalAndVertical_27_DVSerif_EColor16MAP_3 = 00ee0043008300da00a5006c000100c200ef003000bf001c00f60048007800d1
+
+OutlineShadowWithDrawTextNormalAndVertical_28_DVSerif_EColor16MAP_3 = 0043008700b2004c007000e9006e00ab00b3000c00d50008005500fd009600ee
+
+OutlineShadowWithDrawTextNormalAndVertical_29_DVSerif_EColor16MAP_3 = 00bb00a50066009900b3006d00630081004d00c6001000f500b40074006800bf
+
+OutlineShadowWithDrawTextNormalAndVertical_30_DVSerif_EColor16MAP_3 = 001700d30045003d002100c60079003500fe000d007e00c8001000b900770017
+
+OutlineShadowWithDrawTextNormalAndVertical_31_DVSerif_EColor16MAP_3 = 00fc00f7002a00c000f8009600c3003900ac001200c7009f002500780049003d
+
+OutlineShadowWithDrawTextNormalAndVertical_32_DVSerif_EColor16MAP_3 = 006300fe00f6000000ae00680069004a002300d70019005000d5001300cc00e2
+
+OutlineShadowWithDrawTextNormalAndVertical_33_DVSerif_EColor16MAP_3 = 008e00a100650013002200af00ce007a00fb00cf0015005900dc00bb009c0027
+
+OutlineShadowWithDrawTextNormalAndVertical_34_DVSerif_EColor16MAP_3 = 0089006500e6005100f900af000b008c005c0045007200b000e100b6001500a4
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray2_0 = 00a800a3008f004000be008c00bc006a0059000600d600c6008800d200f40008
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray2_0 = 00d000710022006a0043008500a6000e00bc00b8004000a600e6005500d00003
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray2_0 = 00bd00030040002b00e1001500f900af0002000000d700a1003d00dc008e004a
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray2_0 = 00cd005500e300cd00380091003700c8006700fb00bc002c00a500d900c300dc
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray4_0 = 00e200180054000d00b600a500bb003700f200f1007a00ab00f400c100ea003f
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray4_0 = 000400a4008100c100300053001900ec00040073005900ac00a2002d0038004c
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray4_0 = 00e2005800c200cf00fb007a00190054003f003700da00c000d500c80092001b
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray4_0 = 00e100e600a400a8004200e30015002a009200ab00fe00ce009d00630017000c
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray16_0 = 0057008e00830057002a006a008000e20003006d00dc00e700b4009d00c400cc
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray16_0 = 008e009f000a003300c0000900ba004e00500026001400d9003b00fd008d0022
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray16_0 = 00e500c600f200720051002400380075001c00d200cc001400ec00e8007500aa
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray16_0 = 00cb00ee002f00fd007900120098005b00110048007300ec0074002700760076
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EGray256_0 = 0077003500e7006c003e007c006300dc00b300d500c200a10003002700570007
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EGray256_0 = 00fb0085003d006600ec00c8000500b900b2005700370050002100bc00d8006b
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EGray256_0 = 001d006900ea00c6000b004700be00ee00210044005600f9002a00c700bd0091
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EGray256_0 = 006c0044002b003400e7008e0082007100790035002e0007001100e6003a00be
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16_0 = 0010009e001f005a00eb00ff0059007f00e400bf00bb00c900220077009d00ee
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16_0 = 002d00260065001e003a004e0098008000b200b8000a003b00e5009e007a0068
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16_0 = 009f00f0003b005900a3004900a700c0005d006e0024009f00470057003700d5
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16_0 = 002200810007002d00c600c70008009f00030054007e004e007f00a800420088
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor256_0 = 0014003e0062001200360061003700950029007e00c60078005800ec004d00d2
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor256_0 = 003a0012008500b60008009a00a1001300ab00fb00f700d70050000e005700d4
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor256_0 = 0039003200550059005b00520045007b00cf0062007b00e100b400eb00fe007b
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor256_0 = 00d7006000f70052000d00c6000100f100c4006b00f200d400e5002400ad006d
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor64K_0 = 000b00c600c300220076007c00ca0016002800c6004b004200670012007a00fc
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor64K_0 = 000f00ec0086006a00d300bb0031008c005d008200cf003800e7005600b50045
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor64K_0 = 004300ac0007009c002700340064003600b3004f0092007e00cc007d00b40042
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor64K_0 = 0086002e004c0001005700da0095006d0085005800a4004900e70095006f007d
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16M_0 = 0004005300fd002e006f00c000040039006a005c00e0003800660081000100d6
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16M_0 = 005d006800400040006f007f00a300cd00cf00b4000100d700c90009008e00c8
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16M_0 = 008200d700b0009b004e00fd006d0002003c009200a3000a007300d6002300a2
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16M_0 = 002c005a008b0069008100e0007d00ec00bf00d900be00ea001c0014000f0027
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor4K_0 = 00d600c000ac001c00e7006400bd00cc009300d50083004e00bb00ba003a00ec
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor4K_0 = 00df00e0002500ec008300d5008d0055004f002f004c005100cd008d0049004f
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor4K_0 = 00e7005f0011004400b90000000b00d600c6008600ed000a005500a8008a0003
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor4K_0 = 00ac00ca0098006400840078008300a000df0032001900cb0018001a00390078
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16MU_0 = 0021002b00e50050004a00cc000d008d00d2001c009900760091000b006a0091
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16MU_0 = 004200b000fa000e009d0027009600d900d80072002600c600b700df004b0045
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16MU_0 = 002700e8003a00a20071001d00d800da000500e0002f004500a4005200a1003d
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16MU_0 = 00af003a00d9005b008f0098001500b500c10038008d0064005000f9001a00d1
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16MA_0 = 0096008100d8002500eb00ac00a300770015004600ea007500c1003600c80003
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16MA_0 = 00eb007d007400c200f20058000000a9003b007700a200b9001e00b600720034
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16MA_0 = 002700e8003a00a20071001d00d800da000500e0002f004500a4005200a1003d
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16MA_0 = 00af003a00d9005b008f0098001500b500c10038008d0064005000f9001a00d1
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_0_DejaVu Sans Condensed_EColor16MAP_0 = 00f9000e00aa00b200a5000b00ba00c50013002700c3007000f10086004b00ef
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_1_DejaVu Sans Condensed_EColor16MAP_0 = 001500d300e30091005d00a70001003d00460037003a00ea00a9006d00da004b
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_2_DejaVu Sans Condensed_EColor16MAP_0 = 002700e8003a00a20071001d00d800da000500e0002f004500a4005200a1003d
+
+OutlineShadowWithStrikeThroughBoldAndUnderline_3_DejaVu Sans Condensed_EColor16MAP_0 = 00af003a00d9005b008f0098001500b500c10038008d0064005000f9001a00d1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/bitgdi/tbit/tmultiplescreens.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,210 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <hal.h>
+#include <graphics/gdi/gdiconsts.h>
+#include "tmultiplescreens.h"
+
+CTMultipleScreens::CTMultipleScreens(CTestStep* aStep):
+	CTGraphicsBase(aStep),
+	iScrDev(NULL),
+	iGc(NULL)
+	{
+	}
+
+CTMultipleScreens::~CTMultipleScreens()
+	{
+	DestroyFont();
+	DeleteGraphicsContext();
+	DeleteScreenDevice();
+	}
+
+void CTMultipleScreens::ConstructL()
+	{
+	}
+
+void CTMultipleScreens::RunTestCaseL(TInt aCurTestCase)
+	{
+	((CTMultipleScreensStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	_LIT(KTest1,"SubTest %d: Create multiple screens");
+	switch(aCurTestCase)
+		{
+	case 1:
+		((CTMultipleScreensStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0072"));
+		INFO_PRINTF2(KTest1,aCurTestCase);
+		CreateScreenDeviceL();
+		break;
+	case 2:
+		((CTMultipleScreensStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTMultipleScreensStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+		}
+	((CTMultipleScreensStep*)iStep)->RecordTestResultL();
+	}
+
+
+/**
+  @SYMTestCaseID GRAPHICS-BITGDI-0072
+ 
+  @SYMDEF             
+
+  @SYMTestCaseDesc Multiple screen test
+   
+  @SYMTestPriority High
+
+  @SYMTestStatus Implemented
+
+  @SYMTestActions creates some screens in different modes then writes some rotated text to them and test.
+ 
+  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
+*/	
+void CTMultipleScreens::CreateScreenDeviceL()
+	{
+	TDisplayMode testMode[] =  {EColor4K, EColor64K, EColor16M, EColor16MU, EColor256, EColor16MA, EColor16MAP};//tested display modes
+	for(TInt ii=0;ii<TInt(sizeof(testMode)/sizeof(testMode[0]));ii++)
+		{
+		TInt screenCnt = 0;
+		TEST(HAL::Get(0, HALData::EDisplayNumberOfScreens, screenCnt) == KErrNone);
+		for(TInt screenNo=0;screenNo<screenCnt;++screenNo)
+			{
+			TInt err = CreateScrDevAndContext(screenNo, testMode[ii]);
+			if(err == KErrNone)
+				{
+				DoRotateMoveTextL();
+				}
+			DeleteGraphicsContext();
+			DeleteScreenDevice();
+			}
+		}
+	}
+
+void CTMultipleScreens::DoRotateMoveTextL()
+	{
+	__ASSERT_ALWAYS(iScrDev, User::Invariant());
+	__ASSERT_ALWAYS(iGc, User::Invariant());
+	
+	CreateFontL();
+
+	const CFbsBitGc::TGraphicsOrientation KOrientation[] = 
+		{
+		CFbsBitGc::EGraphicsOrientationNormal,
+		CFbsBitGc::EGraphicsOrientationRotated90,
+		CFbsBitGc::EGraphicsOrientationRotated180,
+		CFbsBitGc::EGraphicsOrientationRotated270
+		};
+
+	for(TInt ii=0;ii<TInt(sizeof(KOrientation)/sizeof(KOrientation[0]));++ii)
+		{
+		if(!iGc->SetOrientation(KOrientation[ii]))
+			{
+			continue;
+			}
+		_LIT(KRotation,"===EOrientation%S===");
+		INFO_PRINTF2(KRotation,&RotationName(KOrientation[ii]));
+
+		TSize size = iScrDev->SizeInPixels();
+		RDebug::Print(_L("Size: %d, %d\r\n"), size.iWidth, size.iHeight);
+		for(TInt x=-40;x<(size.iWidth+30);x+=27)
+			{
+			for(TInt y=-40;y<(size.iHeight+30);y+=23)
+				{
+				iGc->Clear();
+				iGc->SetPenStyle(CGraphicsContext::ESolidPen);
+				iGc->SetPenColor(TRgb(0x00, 0x00, 0x00));
+				iGc->SetPenSize(TSize(1, 1));
+				
+				iGc->DrawText(_L("Test text"), TPoint(x, y));
+				
+				iScrDev->Update();
+				}
+			}
+		}
+	iGc->SetOrientation(CFbsBitGc::EGraphicsOrientationNormal);
+	DestroyFont();
+	}
+
+
+TInt CTMultipleScreens::CreateScrDevAndContext(TInt aScreenNo, TDisplayMode aDisplayMode)
+	{
+	DeleteGraphicsContext();
+	DeleteScreenDevice();
+	TRAPD(err, iScrDev = CFbsScreenDevice::NewL(aScreenNo, aDisplayMode));
+	if ( !iScrDev )
+		{
+		TESTE( err == KErrNotSupported, err );
+		return err;
+		}
+	TEST(err == KErrNone);
+	TEST(iScrDev->ScreenNo() == aScreenNo);
+	err = iScrDev->CreateContext((CGraphicsContext*&)iGc);
+	if ( !iGc )
+		{
+		return err;
+		}
+	TEST(err == KErrNone);
+	iGc->SetUserDisplayMode(aDisplayMode);
+	iScrDev->ChangeScreenDevice(NULL);
+	iScrDev->SetAutoUpdate(EFalse);
+	return err;
+	}
+
+TInt CTMultipleScreens::CreateScrDevAndContext(TDisplayMode aDisplayMode)
+	{
+	return CreateScrDevAndContext(KDefaultScreenNo,aDisplayMode);
+	}
+
+void CTMultipleScreens::DeleteScreenDevice()
+	{
+	delete iScrDev;
+	iScrDev = NULL;
+	}
+
+void CTMultipleScreens::DeleteGraphicsContext()
+	{
+	delete iGc;
+	iGc = NULL;
+	}
+
+void CTMultipleScreens::CreateFontL()
+	{
+	CFbsFont* font = NULL;
+	TFontSpec fs(_L("Swiss"), 12);
+	User::LeaveIfError(iScrDev->GetNearestFontToDesignHeightInPixels(font, fs));
+	iGc->UseFont(font);
+	}
+
+void CTMultipleScreens::DestroyFont()
+	{
+	if(iGc)
+		{
+		iGc->DiscardFont();
+		}
+	}
+
+
+//
+
+
+//--------------
+__CONSTRUCT_STEP__(MultipleScreens)
+
+void CTMultipleScreensStep::TestSetupL()
+	{
+	}
+	
+void CTMultipleScreensStep::TestClose()
+	{
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/bitgdi/tbit/tmultiplescreens.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,65 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef TMULTIPLESCREENS_H
+#define TMULTIPLESCREENS_H
+
+#include <bitdev.h>
+#include "TGraphicsHarness.h"
+
+//
+//
+//The main test class. Add your test methods here.
+class CTMultipleScreens : public CTGraphicsBase
+	{
+public:
+	CTMultipleScreens(CTestStep* aStep);
+	~CTMultipleScreens();
+	void TestL();
+protected:
+//from 	CTGraphicsStep
+	virtual void RunTestCaseL(TInt aCurTestCase);
+	void ConstructL();
+private:
+	
+	void CreateScreenDeviceL();
+
+	void DoRotateMoveTextL();
+	TInt CreateScrDevAndContext(TDisplayMode aDisplayMode);
+	TInt CreateScrDevAndContext(TInt aScreenNo, TDisplayMode aDisplayMode);
+	void DeleteScreenDevice();
+	void DeleteGraphicsContext();
+	void CreateFontL();
+	void DestroyFont();
+
+private:
+	CFbsScreenDevice* iScrDev;
+	CFbsBitGc* iGc;
+	};
+
+class CTMultipleScreensStep : public CTGraphicsStep
+	{
+public:
+	CTMultipleScreensStep();
+protected:	
+	//from CTGraphicsStep
+	virtual CTGraphicsBase* CreateTestL();
+	virtual void TestSetupL();
+	virtual void TestClose();
+	};
+
+_LIT(KTMultipleScreensStep,"TMultipleScreens");
+
+#endif //TMULTIPLESCREENS_H
--- a/graphicsdeviceinterface/bitgdi/tbit/toutlineandshadowfonts.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/bitgdi/tbit/toutlineandshadowfonts.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -916,7 +916,15 @@
 	User::LeaveIfError(iBitmapDevice->GetNearestFontToDesignHeightInPixels((CFont*&)refFont,refFontSpec));
 	iGc->UseFont(refFont);
 	iGc->DrawText(KTestString, rightMidPoint);
-	TEST(iBitmapDevice->RectCompare(TRect(0,0,KScreenWidth>>1,KScreenHeight), *iBitmapDevice, TRect(KScreenWidth>>1,0,KScreenWidth,KScreenHeight)));
+	TBool testPassed = iBitmapDevice->RectCompare(TRect(0,0,KScreenWidth>>1,KScreenHeight), *iBitmapDevice, TRect(KScreenWidth>>1,0,KScreenWidth,KScreenHeight));
+	TEST(testPassed);
+	if (!testPassed)
+		{
+		TFontSpec fontSpec = testFont->FontSpecInTwips();
+		INFO_PRINTF3(_L("Test font: %S, height in twips = %d"), &fontSpec.iTypeface.Name(), fontSpec.iHeight);
+		fontSpec = refFont->FontSpecInTwips();
+		INFO_PRINTF3(_L("Ref font: %S, height in twips = %d"), &fontSpec.iTypeface.Name(), fontSpec.iHeight);
+		}
 	iBitmapDevice->ReleaseFont(testFont);
 	iBitmapDevice->ReleaseFont(refFont);
 	
@@ -931,7 +939,15 @@
 	User::LeaveIfError(iBitmapDevice->GetNearestFontToDesignHeightInPixels((CFont*&)refFont,refFontSpec));
 	iGc->UseFont(refFont);
 	iGc->DrawText(KTestString, rightMidPoint);
-	TEST(iBitmapDevice->RectCompare(TRect(0,0,KScreenWidth>>1,KScreenHeight), *iBitmapDevice, TRect(KScreenWidth>>1,0,KScreenWidth,KScreenHeight)));
+	testPassed = iBitmapDevice->RectCompare(TRect(0,0,KScreenWidth>>1,KScreenHeight), *iBitmapDevice, TRect(KScreenWidth>>1,0,KScreenWidth,KScreenHeight));
+	TEST(testPassed);
+	if (!testPassed)
+		{
+		TFontSpec fontSpec = testFont->FontSpecInTwips();
+		INFO_PRINTF3(_L("Test font: %S, height in twips = %d"), &fontSpec.iTypeface.Name(), fontSpec.iHeight);
+		fontSpec = refFont->FontSpecInTwips();
+		INFO_PRINTF3(_L("Ref font: %S, height in twips = %d"), &fontSpec.iTypeface.Name(), fontSpec.iHeight);
+		}
 	iBitmapDevice->ReleaseFont(testFont);
 	iBitmapDevice->ReleaseFont(refFont);
 	
@@ -946,7 +962,15 @@
 	User::LeaveIfError(iBitmapDevice->GetNearestFontToDesignHeightInPixels((CFont*&)refFont,refFontSpec));
 	iGc->UseFont(refFont);
 	iGc->DrawText(KTestString, rightMidPoint);
-	TEST(iBitmapDevice->RectCompare(TRect(0,0,KScreenWidth>>1,KScreenHeight), *iBitmapDevice, TRect(KScreenWidth>>1,0,KScreenWidth,KScreenHeight)));
+	testPassed = iBitmapDevice->RectCompare(TRect(0,0,KScreenWidth>>1,KScreenHeight), *iBitmapDevice, TRect(KScreenWidth>>1,0,KScreenWidth,KScreenHeight));
+	TEST(testPassed);
+	if (!testPassed)
+		{
+		TFontSpec fontSpec = testFont->FontSpecInTwips();
+		INFO_PRINTF3(_L("Test font: %S, height in twips = %d"), &fontSpec.iTypeface.Name(), fontSpec.iHeight);
+		fontSpec = refFont->FontSpecInTwips();
+		INFO_PRINTF3(_L("Ref font: %S, height in twips = %d"), &fontSpec.iTypeface.Name(), fontSpec.iHeight);
+		}
 	iBitmapDevice->ReleaseFont(testFont);
 	iBitmapDevice->ReleaseFont(refFont);
 	}
--- a/graphicsdeviceinterface/gdi/bwins/GDI2U.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/gdi/bwins/GDI2U.def	Wed Aug 18 11:05:09 2010 +0300
@@ -301,19 +301,19 @@
 	??0RGlyphOutlineIterator@@QAE@XZ @ 300 NONAME ; RGlyphOutlineIterator::RGlyphOutlineIterator(void)
 	?Open@RGlyphOutlineIterator@@QAEHAAVCFont@@PBIHH@Z @ 301 NONAME ; int RGlyphOutlineIterator::Open(class CFont &, unsigned int const *, int, int)
 	??0RFontTable@@QAE@XZ @ 302 NONAME ; RFontTable::RFontTable(void)
-	?Image@RGlyphDataIterator@@QBEABVRSgImage@@XZ @ 303 NONAME ABSENT ; class RSgImage const & RGlyphDataIterator::Image(void) const
-	??0RGlyphMetricsArray@@QAE@XZ @ 304 NONAME ABSENT ; RGlyphMetricsArray::RGlyphMetricsArray(void)
-	?Count@RGlyphMetricsArray@@QBEHXZ @ 305 NONAME ABSENT ; int RGlyphMetricsArray::Count(void) const
-	?Metrics@RGlyphDataIterator@@QBEABVTOpenFontCharMetrics@@XZ @ 306 NONAME ABSENT ; class TOpenFontCharMetrics const & RGlyphDataIterator::Metrics(void) const
-	??0RGlyphDataIterator@@QAE@XZ @ 307 NONAME ABSENT ; RGlyphDataIterator::RGlyphDataIterator(void)
-	??ARGlyphMetricsArray@@QBEABVTOpenFontCharMetrics@@H@Z @ 308 NONAME ABSENT ; class TOpenFontCharMetrics const & RGlyphMetricsArray::operator[](int) const
-	?GlyphCode@RGlyphDataIterator@@QBEIXZ @ 309 NONAME ABSENT ; unsigned int RGlyphDataIterator::GlyphCode(void) const
-	?Rect@RGlyphDataIterator@@QBEABVTRect@@XZ @ 310 NONAME ABSENT ; class TRect const & RGlyphDataIterator::Rect(void) const
-	?Next@RGlyphDataIterator@@QAEHXZ @ 311 NONAME ABSENT ; int RGlyphDataIterator::Next(void)
-	?Close@RGlyphMetricsArray@@QAEXXZ @ 312 NONAME ABSENT ; void RGlyphMetricsArray::Close(void)
-	?Get@RGlyphMetricsArray@@QAEHAAVCFont@@PBIH@Z @ 313 NONAME ABSENT ; int RGlyphMetricsArray::Get(class CFont &, unsigned int const *, int)
-	?Close@RGlyphDataIterator@@QAEXXZ @ 314 NONAME ABSENT ; void RGlyphDataIterator::Close(void)
-	?Open@RGlyphDataIterator@@QAEHAAVCFont@@PBIH@Z @ 315 NONAME ABSENT ; int RGlyphDataIterator::Open(class CFont &, unsigned int const *, int)
+	?Image@RGlyphDataIterator@@QBEABVRSgImage@@XZ @ 303 NONAME ABSENT
+	??0RGlyphMetricsArray@@QAE@XZ @ 304 NONAME ABSENT
+	?Count@RGlyphMetricsArray@@QBEHXZ @ 305 NONAME ABSENT
+	?Metrics@RGlyphDataIterator@@QBEABVTOpenFontCharMetrics@@XZ @ 306 NONAME ABSENT
+	??0RGlyphDataIterator@@QAE@XZ @ 307 NONAME ABSENT
+	??ARGlyphMetricsArray@@QBEABVTOpenFontCharMetrics@@H@Z @ 308 NONAME ABSENT
+	?GlyphCode@RGlyphDataIterator@@QBEIXZ @ 309 NONAME ABSENT
+	?Rect@RGlyphDataIterator@@QBEABVTRect@@XZ @ 310 NONAME ABSENT
+	?Next@RGlyphDataIterator@@QAEHXZ @ 311 NONAME ABSENT
+	?Close@RGlyphMetricsArray@@QAEXXZ @ 312 NONAME ABSENT
+	?Get@RGlyphMetricsArray@@QAEHAAVCFont@@PBIH@Z @ 313 NONAME ABSENT
+	?Close@RGlyphDataIterator@@QAEXXZ @ 314 NONAME ABSENT
+	?Open@RGlyphDataIterator@@QAEHAAVCFont@@PBIH@Z @ 315 NONAME ABSENT
 	?SetName@TTypeface@@QAEXABVTDesC16@@@Z @ 316 NONAME ; void TTypeface::SetName(class TDesC16 const &)
 	?Name@TTypeface@@QBEABVTDesC16@@XZ @ 317 NONAME ; class TDesC16 const & TTypeface::Name(void) const
 	?At@RHexTreeBase@@IBEPAXI@Z @ 318 NONAME ; void * RHexTreeBase::At(unsigned int) const
--- a/graphicsdeviceinterface/gdi/inc/GDI.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/gdi/inc/GDI.H	Wed Aug 18 11:05:09 2010 +0300
@@ -141,9 +141,9 @@
 	EGdiPanic_OutOfText				= 2,
 	/** Internal failure. */
 	EGdiPanic_Invariant				= 3,
-	/** Reserved panic codes. Not to be used. */
-	EGdiPanic_Reserved1				= 4,
-	EGdiPanic_Reserved2				= 5,
+	/** Unused panic codes. Can be reused if needed. */
+	EGdiPanic_Unused1				= 4,
+	EGdiPanic_Unused2				= 5,
 	/** Setting a typeface name that is too long */
 	EGdiPanic_TypefaceNameOverflow	= 6,
 	};
--- a/graphicsdeviceinterface/gdi/inc/gdiconsts.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/gdi/inc/gdiconsts.h	Wed Aug 18 11:05:09 2010 +0300
@@ -38,5 +38,4 @@
 const TUid KUidIsFbsBitmapGc = {0x10285BBE};
 
 
-
 #endif /* GDICONSTS_H */
--- a/graphicsdeviceinterface/gdi/inc/gdiplatapi.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/gdi/inc/gdiplatapi.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
--- a/graphicsdeviceinterface/screendriver/group/scdvtest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/screendriver/group/scdvtest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -37,7 +37,8 @@
 "\epoc32\data\z\scdvtest\scdvtest_t_LowLevel1.script"-"c:\scdvtest\scdvtest_t_LowLevel1.script"
 "\epoc32\data\z\scdvtest\scdvtest_t_RWindows.script"-"c:\scdvtest\scdvtest_t_RWindows.script"
 "\epoc32\data\z\scdvtest\scdvtest_t_Scaling.script"-"c:\scdvtest\scdvtest_t_Scaling.script"
-"\epoc32\data\z\scdvtest\scdvtest_t_Scdv.script"-"c:\scdvtest\scdvtest_t_Scdv.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\scdvtest\scdvtest_t_Scdv.script"-"c:\scdvtest\scdvtest_t_Scdv.script"
 "\epoc32\data\z\scdvtest\scdvtest_t_devorientation.script"-"c:\scdvtest\scdvtest_t_devorientation.script"
 "\epoc32\data\z\scdvtest\scdvtest_t_directscreenbitmap.script"-"c:\scdvtest\scdvtest_t_directscreenbitmap.script"
 
--- a/graphicsdeviceinterface/screendriver/sbit/Cdsb.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/screendriver/sbit/Cdsb.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -348,9 +348,9 @@
 		case 24:
 		case 32:
 			iBitmapInfo.iPixelShift = 5;
-			iBitmapInfo.iDisplayMode = EColor16MAP;
+			iBitmapInfo.iDisplayMode = EColor16MA;
 #ifdef SYMBIAN_GRAPHICS_GCE
-			iPixelFormat = EUidPixelFormatARGB_8888_PRE;
+			iPixelFormat = EUidPixelFormatARGB_8888;
 			iBytesPerPixel = 4;
 #endif
 			break;
--- a/graphicsdeviceinterface/screendriver/sgeneric/scdraw.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/screendriver/sgeneric/scdraw.h	Wed Aug 18 11:05:09 2010 +0300
@@ -63,7 +63,6 @@
 	void Update();
 	void Update(TRequestStatus& aStatus);
 
-	void Update(const TRegion& aRegion);
 	void UpdateRegion(const TRect& aRect);
 	void ResetUpdateRegion();
 	void NotifyWhenAvailable(TRequestStatus& aStatus);
--- a/graphicsdeviceinterface/screendriver/sgeneric/scdraw.inl	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/screendriver/sgeneric/scdraw.inl	Wed Aug 18 11:05:09 2010 +0300
@@ -98,13 +98,30 @@
 
 template <class T> void CGenericScreenDevice<T>::Update(const TRegion& aRegion)
 	{
-	iHelper.Update(aRegion);
+    if(!aRegion.IsEmpty() && !aRegion.CheckError())
+        {
+        if (aRegion.Count()>KMaxUpdateRegionRectangles)
+            {
+            UpdateRegion(aRegion.BoundingRect());
+            }
+        else
+            {
+            TInt rcCnt = aRegion.Count();
+            for (TInt ii=0; ii < rcCnt; ++ii)
+                {  
+                UpdateRegion(aRegion[ii]);  //Applies deorientate (offset, scale, rotate)
+                }
+            }
+        }
+    Update();
 	}
 
 template <class T> void CGenericScreenDevice<T>::UpdateRegion(const TRect& aRect)
-	{
-	iHelper.UpdateRegion(aRect);
-	}
+    {
+    const TRect rect = CDrawXxxBppBitmap::DeOrientate(aRect);//rect - physical coordinates
+    
+    iHelper.UpdateRegion(rect);
+    }
 
 template <class T> TInt CGenericScreenDevice<T>::GetInterface(TInt aInterfaceId, TAny*& aInterface)
 	{
--- a/graphicsdeviceinterface/screendriver/sgeneric/scnew.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsdeviceinterface/screendriver/sgeneric/scnew.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -276,7 +276,7 @@
 */
 EXPORT_C TDisplayMode CFbsDrawDevice::DisplayMode16M()
 	{
-	return EColor16MAP;
+	return EColor16MA;
 	}
 
 
@@ -372,24 +372,6 @@
 		}
 	}
 
-/**
-Implementation of corresponding function in CDrawDevice, utilizing a tracked
-update region. Adds the given region to the update region and updates the
-screen.
-@param aRegion	Additional region to be updated.
-*/
-void CScreenDeviceHelper::Update(const TRegion& aRegion)
-	{
-	if(!aRegion.IsEmpty() && !aRegion.CheckError())
-		{
-		TInt rcCnt = aRegion.Count();
-		for (TInt ii=0; ii < rcCnt; ++ii)
-			{
-			UpdateRegion(aRegion[ii]);
-			}
-		}
-	Update();
-	}
 
 /**
 Implementation of corresponding function in CDrawDevice, utilizing a tracked
--- a/graphicshwdrivers/surfacemgr/inc/surface_hints.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicshwdrivers/surfacemgr/inc/surface_hints.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -47,6 +47,12 @@
 */
 const TInt KSurfaceProtection = 0x3;
 
+/** Hint about the surface’s characteristics or properties,
+   For example if a surface can be persisted by the effects engine.
+   @see TSurfaceCharacteristics for possible values.
+*/
+const TInt KSurfaceCharacteristics = 0x4;
+
 
 /** Values used for the KSurfaceContent key */
 enum TSurfaceContent
@@ -120,6 +126,17 @@
     };
 
 
+/** Values used for the KSurfaceCharacteristics key. The values are bitmasks and can be combined.
+*/
+enum TSurfaceCharacteristics
+    {
+    /**
+    * Surface cannot be persisted once it has been closed by the creator
+    */
+    ENotPersistable = 1,
+    };
+
+
 class TSurfaceUpdate
     {
     /** Constructor.
@@ -185,7 +202,7 @@
     return ( iValue & 0x80000000 ) ? ETrue : EFalse;
     }
 
-}; //namespace surfaceHints
+} //namespace surfaceHints
 
 #endif //__SURFACE_HINTS_H__
 
--- a/graphicshwdrivers/surfacemgr/test/group/surfacemanagertest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicshwdrivers/surfacemgr/test/group/surfacemanagertest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -34,7 +34,8 @@
 ;*Files To Copy...<src> <destination>
 
 ;//script files
-"\epoc32\data\z\surfacemgtest\surfacemgtest_T_auto.script"-"c:\surfacemgtest\surfacemgtest_T_auto.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\surfacemgtest\surfacemgtest_T_auto.script"-"c:\surfacemgtest\surfacemgtest_T_auto.script"
 "\epoc32\data\z\surfacemgtest\surfacemgtest_T_multiprocess.script"-"c:\surfacemgtest\surfacemgtest_T_multiprocess.script"
 "\epoc32\data\z\surfacemgtest\surfacemgtest_T_multithread.script"-"c:\surfacemgtest\surfacemgtest_T_multithread.script"
 
--- a/graphicshwdrivers/surfacemgr/test/src/tsurfacemanager.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicshwdrivers/surfacemgr/test/src/tsurfacemanager.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -21,6 +21,7 @@
  @internalComponent - Internal Symbian test code
 */
 
+
 #include "tsurfacemanager.h"
 #include <e32base.h>
 #include <e32cons.h>
@@ -29,6 +30,9 @@
 #include <e32cmn.h>	  
 #include <hal.h>
 #include <e32def_private.h>
+#include <graphics/surface_hints.h>
+
+using namespace surfaceHints;
 
 const TInt KCountLimit = 10000;
 
@@ -3188,36 +3192,32 @@
 	
 	//Add HintPair1
 	RSurfaceManager::THintPair hintPair1;
-	hintPair1.iKey.iUid = 0x123257;
-	hintPair1.iValue = 300;
-	hintPair1.iMutable = ETrue;
+	hintPair1.Set(TUid::Uid(KSurfaceContent), EStillImage, ETrue);
 	TEST(KErrNone == iSurfaceManager.AddSurfaceHint(surfaceId, hintPair1));
 	
 	RSurfaceManager::THintPair hintPairCheck1;
-	hintPairCheck1.iKey.iUid = 0x123257;
+	hintPairCheck1.iKey.iUid = KSurfaceContent;
 	CheckHintPair(surfaceId, hintPairCheck1, hintPair1);
 	
 	//Add HintPair2
 	RSurfaceManager::THintPair hintPair2;
-	hintPair2.iKey.iUid = 0x123267;
-	hintPair2.iValue = 100;
+	hintPair2.iKey.iUid = KSurfaceProtection;
+	hintPair2.iValue = EAllowAnalog | EAllowDigital;
 	hintPair2.iMutable = EFalse;
 	TEST(KErrNone == iSurfaceManager.AddSurfaceHint(surfaceId, hintPair2));
 		
 	RSurfaceManager::THintPair hintPairCheck2;
-	hintPairCheck2.iKey.iUid = 0x123267;
+	hintPairCheck2.iKey.iUid = KSurfaceProtection;
 	CheckHintPair(surfaceId, hintPairCheck2, hintPair2);
 	CheckHintPair(surfaceId, hintPairCheck1, hintPair1);
 
 	//Add HintPair3
 	RSurfaceManager::THintPair hintPair3;
-	hintPair3.iKey.iUid = 0x123324;
-	hintPair3.iValue = 500;
-	hintPair3.iMutable = ETrue;
+	hintPair3.Set(TUid::Uid(KSurfaceCharacteristics), ENotPersistable, EFalse);
 	TEST(KErrNone == iSurfaceManager.AddSurfaceHint(surfaceId, hintPair3));
 	
 	RSurfaceManager::THintPair hintPairCheck3;
-	hintPairCheck3.iKey.iUid = 0x123324;
+	hintPairCheck3.iKey.iUid = KSurfaceCharacteristics;
 	CheckHintPair(surfaceId, hintPairCheck3, hintPair3);
 	CheckHintPair(surfaceId, hintPairCheck2, hintPair2);
 	CheckHintPair(surfaceId, hintPairCheck1, hintPair1);
@@ -4439,3 +4439,4 @@
     if(!aCondition)
         User::Leave(TEST_ERROR_CODE);   // leave with standard error code
     }
+
--- a/graphicsresourceservices/graphicsresourceimplementation/test/group/sgresourcetest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsresourceservices/graphicsresourceimplementation/test/group/sgresourcetest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -35,6 +35,7 @@
 
 ;//script file
 "\epoc32\data\z\sgresourcetest\sgresourcetest_t_generic.script"-"c:\sgresourcetest\sgresourcetest_t_generic.script"
-"\epoc32\data\z\sgresourcetest\sgresourcetest_t_internal.script"-"c:\sgresourcetest\sgresourcetest_t_internal.script"
-"\epoc32\data\z\sgresourcetest\sgresourcetest_t_stress_auto.script"-"c:\sgresourcetest\sgresourcetest_t_stress_auto.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\sgresourcetest\sgresourcetest_t_internal.script"-"c:\sgresourcetest\sgresourcetest_t_internal.script"
+;"\epoc32\data\z\sgresourcetest\sgresourcetest_t_stress_auto.script"-"c:\sgresourcetest\sgresourcetest_t_stress_auto.script"
 
--- a/graphicsresourceservices/graphicsresourceimplementation/test/scripts/sgresourcetest_t_internal.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsresourceservices/graphicsresourceimplementation/test/scripts/sgresourcetest_t_internal.script	Wed Aug 18 11:05:09 2010 +0300
@@ -16,4 +16,6 @@
 PRINT Run Graphics Resource Internal Tests
 //
 LOAD_SUITE tgraphicsresourceinternal2
-RUN_TEST_STEP 100 tgraphicsresourceinternal2 TGraphicsResourceInternal
+
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 100 tgraphicsresourceinternal2 TGraphicsResourceInternal
--- a/graphicsresourceservices/graphicsresourceimplementation/test/scripts/sgresourcetest_t_stress_auto.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsresourceservices/graphicsresourceimplementation/test/scripts/sgresourcetest_t_stress_auto.script	Wed Aug 18 11:05:09 2010 +0300
@@ -16,4 +16,5 @@
 PRINT Run Graphics Resource Automated Stress Tests
 //
 LOAD_SUITE tgraphicsresource2
-RUN_TEST_STEP 1000 tgraphicsresource2 TSgGenericManual z:\sgresourcetest\sgresourcetest_t_stress_auto.ini
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 1000 tgraphicsresource2 TSgGenericManual z:\sgresourcetest\sgresourcetest_t_stress_auto.ini
--- a/graphicstest/graphicstestharness/automation/graphicssystemgui.sysdef.xml	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/graphicssystemgui.sysdef.xml	Wed Aug 18 11:05:09 2010 +0300
@@ -146,6 +146,12 @@
 					<component name="OpenWF Composition Engine">
 						<unit bldFile="sf\os\graphics\graphicscomposition\openwfcompositionengine\group" mrp="sf\os\graphics\graphicscomposition\openwfcompositionengine\group\graphics_openwfcompositionengine.mrp"/>
 					</component>
+					<component name="OpenWF Composition Display Driver Adaptation for Display Channel">
+						<unit bldFile="sf\os\graphics\graphicscomposition\openwfc_ri_displaychannel\group" mrp="sf\os\graphics\graphicscomposition\openwfc_ri_displaychannel\group\graphics_openwfc_ri_displaychannel.mrp"/>
+					</component>            		
+					<component name="OpenWF Tests">
+						<unit bldFile="sf\os\graphics\graphicscomposition\openwftest\group" mrp="sf\os\graphics\graphicscomposition\openwftest\group\graphics_openwftest.mrp"/>
+					</component>            		
 				</collection>
 				<collection name="Graphics Device Interface">
 					<component name="BitGDI">
@@ -266,5 +272,12 @@
 				</collection>
 			</block>
 		</layer>
+		<layer name="Additional Tools">
+			<collection name="ONB Tools">
+				<component name="Thindump" class="test">
+					<unit bldFile="thindump\group" />
+				</component>
+			</collection>
+		</layer>
 	</systemModel>
 </SystemDefinition>
--- a/graphicstest/graphicstestharness/automation/h4/roms.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h4/roms.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -1,32 +1,32 @@
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics0a_armv5_dpdef','Graphics Test ROM (0a) DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_00a.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby outlineshadow.iby FntStoreRebootTests.iby','-D__MMC -DGRAPHICS_MISTRAL_ROM  -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DGRAPHICS_EXCLUDE_FREETYPE','h4hrp_graphics0b_armv5_dpdef','Graphics Test ROM (0b) - Outline Shadow DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_00b.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_graphics0c_armv5_dpdef','Graphics Test ROM (0c) - Example Rasterizer Included DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_00c.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test1.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics1_armv5_dpdef','Graphics Test ROM (1) DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_01.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test1.iby fbsrasterizertests.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_graphics1a_armv5_dpdef','Graphics Test ROM (1a) - FbsRasterizer DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_01a.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test2.iby internaltestfonts.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics2_armv5_dpdef','Graphics Test ROM (2) DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_02.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby openvgtest.iby',' -D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics3_armv5_dpdef','Graphics Test ROM (3) - OpenVG DP Default','\epoc32\data\z\graphics\wsini_integ.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_03.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby supplieropenvgtest.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics3a_armv5_dpdef','Graphics Test ROM (3a) - OpenVG tests requiring USB/Memory Card support DP Default','\epoc32\data\z\graphics\wsini_integ.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_03a.txt' ,'')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec wserv.oby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics4_armv5_dpdef','Graphics Test ROM (4) - WServ DP Default','\epoc32\data\z\system\data\ws_test.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_04.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec wserv.oby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics4ct_armv5_dpdef','Graphics Test ROM (4ct) - WServ Change Tracking DP Default','\epoc32\data\z\system\data\ws_test_changetracking.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_04ct.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby te_uibench.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_graphics5a_armv5_dpdef','Graphics Test ROM (5a) - UIBench DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_05a.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby internaltestfonts.iby te_outlineshadow.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DGRAPHICS_EXCLUDE_FREETYPE','h4hrp_graphics5b_armv5_dpdef','Graphics Test ROM (5b) - UIBench - Outline Shadow DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_05b.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby te_uibench_s60.iby egl.iby opengles.iby openvg.iby internaltestfonts.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_uibench_s60_armv5_dpdef','Graphics Test ROM UIBench S60 DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_uibench_s60.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test2.iby wservtest.iby csc_plugin.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics7_armv5_dpdef','Graphics Test ROM (7) DP Default','\epoc32\data\z\graphics\wsini_integ_color64k.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_07.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec t_wservinteg.iby opengles.iby graphics_testharness.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics8_armv5_dpdef','Graphics Test ROM (8) - WServ Integ DP Default','\epoc32\data\z\graphics\wsini_integ.ini,\epoc32\data\z\system\data\wsini.ini;\epoc32\data\z\system\data\testexecute_modified.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_08.txt','')
-RomAndAutoRom('armv5','h4hrp pagedrom textshell platsec surfacemanagertest.iby wservtest.iby gce_tests.iby tdisplaychannel.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics9_armv5_dpdef','Graphics Test ROM (9) - Hybrid GCE DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_09.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test2.iby wservtest.iby csc_plugin.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics12_armv5_dpdef','Graphics Test ROM (12) DP Default','\epoc32\data\z\graphics\wsini_integ_color16ma.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_12.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_wservgenericplugin.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics13_armv5_dpdef','Graphics Test ROM (13) - Generic Plugin DP Default','\epoc32\data\z\wstest\genericplugin\wsini_nga.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_13.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby twservstresstest.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics15_armv5_dpdef','Graphics Test ROM (15) - Stress DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_15.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_extendedbitmaprenderstage.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics16_armv5_dpdef','Graphics Test ROM (16) - Extended Bitmap Render Stage DP Default','\epoc32\data\z\wstest\textendedbitmap\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_16.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_ratelimiter.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics17_armv5_dpdef','Graphics Test ROM (17) - Rate Limiter DP Default','\epoc32\data\z\wstest\ratelimiter\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_17.txt','')
-RomAndAutoRom('armv5','h4hrp pagedrom minigui platsec graphics_testharness.iby csc_plugin.iby tcsc.iby openvgtest.iby surfaceupdatetest_integ.iby t_gcenotification.iby graphics_test2.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics18_armv5_dpdef','Graphics Test ROM (18) - Composited Screen Capture DP Default','\epoc32\data\z\wstest\wsini_csc_nga_qvga.ini,\epoc32\data\z\wsini_minigui.ini;\epoc32\data\z\graphicstest\testexecute_minigui.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_18.txt','')
-RomAndAutoRom('armv5','h4hrp pagedrom minigui platsec graphics_testharness.iby csc_plugin.iby tcsc.iby egltesthybrid.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphicseglhybrid_armv5_dpdef','Graphics Test ROM (eglhybrid) - EGL Hybrid Graphics Implementation DP Default','\epoc32\data\z\wstest\wsini_csc_nga_qvga.ini,\epoc32\data\z\wsini_minigui.ini;\epoc32\data\z\graphicstest\testexecute_minigui.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_eglhybrid.txt','')
-RomAndAutoRom('armv5','h4hrp pagedrom minigui platsec graphics_testharness.iby csc_plugin.iby tcsc.iby egltestref.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_USE_EGL_REF','h4hrp_graphicseglref_armv5_dpdef','Graphics Test ROM (eglref) - EGL Reference Graphics Implementation DP Default','\epoc32\data\z\wstest\wsini_csc_nga_qvga.ini,\epoc32\data\z\wsini_minigui.ini;\epoc32\data\z\graphicstest\testexecute_minigui.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_eglref.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby talf.iby','-D__MMC -DUSE_SDIO_SD_MMC -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics23_armv5_dpdef','Graphics Test ROM (23) - ALF/ChangeTracking DP Default','\epoc32\data\z\talf\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_23.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_eventchecker.iby t_bitgdirenderstage.iby wserv.oby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DRVT','h4hrp_graphics24_armv5_dpdef','Graphics Test ROM (24) - BitGDI Renderstage DP Default','\epoc32\data\z\wstest\tbitgdirenderstage\arm\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_24.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec wserv.oby graphics_testharness.iby talf.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics25_armv5_dpdef','Graphics Test ROM (25) - ALF/ChangeTracking per screen DP Default','\epoc32\data\z\talf\wsini_ct_per_screen.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_25.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby tlayercompositiontest.iby csc_plugin.iby tcsc.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics29a_armv5_dpdef','Graphics Test ROM (29a) - Layer Composition DP Default','\epoc32\data\z\tlayercomposition\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_29a.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby tlayercompositiontest.iby csc_plugin.iby tcsc.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics29b_armv5_dpdef','Graphics Test ROM (29b) - Layer Composition, No Autoclear DP Default','\epoc32\data\z\tlayercomposition\wsini_noautoclear.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_29b.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec appfwk_test.iby','-D__MMC -DUSE_SDIO_SD_MMC -DUSE_24UBPP_DISPLAY_VARIANT_TV -D_DEBUG','h4hrp_uiframeworks_armv5_dpdef','UI Frameworks DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_uif.txt','')
-RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby sgresourcetest.iby opengles.iby','-D__MMC -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphicsresource_armv5_dpdef','Graphics Test ROM (GRI) - Graphics Resource DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_gri.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics0a_armv5_dpdef','Graphics Test ROM (0a) DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_00a.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby outlineshadow.iby FntStoreRebootTests.iby','-D__MMC -DGRAPHICS_MISTRAL_ROM -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DGRAPHICS_EXCLUDE_FREETYPE','h4hrp_graphics0b_armv5_dpdef','Graphics Test ROM (0b) - Outline Shadow DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_00b.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_graphics0c_armv5_dpdef','Graphics Test ROM (0c) - Example Rasterizer Included DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_00c.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test1.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics1_armv5_dpdef','Graphics Test ROM (1) DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_01.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test1.iby fbsrasterizertests.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_graphics1a_armv5_dpdef','Graphics Test ROM (1a) - FbsRasterizer DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_01a.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test2.iby internaltestfonts.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics2_armv5_dpdef','Graphics Test ROM (2) DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_02.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby openvgtest.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics3_armv5_dpdef','Graphics Test ROM (3) - OpenVG DP Default','\epoc32\data\z\graphics\wsini_integ.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_03.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby supplieropenvgtest.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics3a_armv5_dpdef','Graphics Test ROM (3a) - OpenVG tests requiring USB/Memory Card support DP Default','\epoc32\data\z\graphics\wsini_integ.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_03a.txt' ,'')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec wserv.oby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics4_armv5_dpdef','Graphics Test ROM (4) - WServ DP Default','\epoc32\data\z\system\data\ws_test.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_04.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec wserv.oby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics4ct_armv5_dpdef','Graphics Test ROM (4ct) - WServ Change Tracking DP Default','\epoc32\data\z\system\data\ws_test_changetracking.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_04ct.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby te_uibench.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_graphics5a_armv5_dpdef','Graphics Test ROM (5a) - UIBench DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_05a.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby internaltestfonts.iby te_outlineshadow.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DGRAPHICS_EXCLUDE_FREETYPE','h4hrp_graphics5b_armv5_dpdef','Graphics Test ROM (5b) - UIBench - Outline Shadow DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_05b.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby te_uibench_s60.iby egl.iby opengles.iby openvg.iby internaltestfonts.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW -DFBSRASTERIZER_DRV="^<"fbsrasterizer_test.iby"^>"','h4hrp_uibench_s60_armv5_dpdef','Graphics Test ROM UIBench S60 DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_uibench_s60.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test2.iby wservtest.iby csc_plugin.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics7_armv5_dpdef','Graphics Test ROM (7) DP Default','\epoc32\data\z\graphics\wsini_integ_color64k.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_07.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec t_wservinteg.iby opengles.iby graphics_testharness.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics8_armv5_dpdef','Graphics Test ROM (8) - WServ Integ DP Default','\epoc32\data\z\graphics\wsini_integ.ini,\epoc32\data\z\system\data\wsini.ini;\epoc32\data\z\system\data\testexecute_modified.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_08.txt','')
+RomAndAutoRom('armv5','h4hrp pagedrom textshell platsec surfacemanagertest.iby wservtest.iby gce_tests.iby tdisplaychannel.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics9_armv5_dpdef','Graphics Test ROM (9) - Hybrid GCE DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_09.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_test2.iby wservtest.iby csc_plugin.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics12_armv5_dpdef','Graphics Test ROM (12) DP Default','\epoc32\data\z\graphics\wsini_integ_color16ma.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_12.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_wservgenericplugin.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics13_armv5_dpdef','Graphics Test ROM (13) - Generic Plugin DP Default','\epoc32\data\z\wstest\genericplugin\wsini_nga.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_13.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby twservstresstest.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics15_armv5_dpdef','Graphics Test ROM (15) - Stress DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_15.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_extendedbitmaprenderstage.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics16_armv5_dpdef','Graphics Test ROM (16) - Extended Bitmap Render Stage DP Default','\epoc32\data\z\wstest\textendedbitmap\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_16.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_ratelimiter.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics17_armv5_dpdef','Graphics Test ROM (17) - Rate Limiter DP Default','\epoc32\data\z\wstest\ratelimiter\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_17.txt','')
+RomAndAutoRom('armv5','h4hrp pagedrom minigui platsec graphics_testharness.iby csc_plugin.iby tcsc.iby openvgtest.iby surfaceupdatetest_integ.iby t_gcenotification.iby graphics_test2.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics18_armv5_dpdef','Graphics Test ROM (18) - Composited Screen Capture DP Default','\epoc32\data\z\wstest\wsini_csc_nga_qvga.ini,\epoc32\data\z\wsini_minigui.ini;\epoc32\data\z\graphicstest\testexecute_minigui.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_18.txt','')
+RomAndAutoRom('armv5','h4hrp pagedrom minigui platsec graphics_testharness.iby csc_plugin.iby tcsc.iby egltesthybrid.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphicseglhybrid_armv5_dpdef','Graphics Test ROM (eglhybrid) - EGL Hybrid Graphics Implementation DP Default','\epoc32\data\z\wstest\wsini_csc_nga_qvga.ini,\epoc32\data\z\wsini_minigui.ini;\epoc32\data\z\graphicstest\testexecute_minigui.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_eglhybrid.txt','')
+RomAndAutoRom('armv5','h4hrp pagedrom minigui platsec graphics_testharness.iby csc_plugin.iby tcsc.iby egltestref.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_USE_EGL_REF','h4hrp_graphicseglref_armv5_dpdef','Graphics Test ROM (eglref) - EGL Reference Graphics Implementation DP Default','\epoc32\data\z\wstest\wsini_csc_nga_qvga.ini,\epoc32\data\z\wsini_minigui.ini;\epoc32\data\z\graphicstest\testexecute_minigui.ini,\epoc32\data\z\system\data\testexecute.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_eglref.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby talf.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE','h4hrp_graphics23_armv5_dpdef','Graphics Test ROM (23) - ALF/ChangeTracking DP Default','\epoc32\data\z\talf\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_23.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby t_eventchecker.iby t_bitgdirenderstage.iby wserv.oby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DRVT','h4hrp_graphics24_armv5_dpdef','Graphics Test ROM (24) - BitGDI Renderstage DP Default','\epoc32\data\z\wstest\tbitgdirenderstage\arm\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_24.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec wserv.oby graphics_testharness.iby talf.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics25_armv5_dpdef','Graphics Test ROM (25) - ALF/ChangeTracking per screen DP Default','\epoc32\data\z\talf\wsini_ct_per_screen.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_25.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby tlayercompositiontest.iby csc_plugin.iby tcsc.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics29a_armv5_dpdef','Graphics Test ROM (29a) - Layer Composition DP Default','\epoc32\data\z\tlayercomposition\wsini.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_29a.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby tlayercompositiontest.iby csc_plugin.iby tcsc.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphics29b_armv5_dpdef','Graphics Test ROM (29b) - Layer Composition, No Autoclear DP Default','\epoc32\data\z\tlayercomposition\wsini_noautoclear.ini,\epoc32\data\z\system\data\wsini.ini','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_29b.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec appfwk_test.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -D_DEBUG','h4hrp_uiframeworks_armv5_dpdef','UI Frameworks DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_uif.txt','')
+RomAndAutoRom('armv5','h4hrp minigui pagedrom platsec graphics_testharness.iby sgresourcetest.iby opengles.iby','-D__MMC -D_NAND2 -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -DSYMBIAN_BASE_USE_GCE -DSYMBIAN_GRAPHICS_USE_GCE -DSYMBIAN_GRAPHICS_ADAPTATION=SGA_SW','h4hrp_graphicsresource_armv5_dpdef','Graphics Test ROM (GRI) - Graphics Resource DP Default','','..\sf\os\graphics\graphicstest\graphicstestharness\automation\h4\tests_gri.txt','')
 Rom('armv5', 'h4hrp minigui', '-nosymbols -D__MMC -DUSE_SDIO_SD_MMC', 'h4hrp_minigui', 'MiniGUI ROM', '' )
--- a/graphicstest/graphicstestharness/automation/h4/tests_00b.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h4/tests_00b.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -20,4 +20,6 @@
 TESTEXECUTE, \logs\testexecute\fntstoretest_T_LinkedFontUpdateStage2.htm,	, z:\fntstoretest\fntstoretest_T_LinkedFontUpdateStage2.script, 600
 
 # PREQ1543 bitgdi
-TESTEXECUTE, \logs\testexecute\bitgdiTest_T_outlineandshadowfonts.htm,		, z:\bitgdiTest\bitgdiTest_T_outlineandshadowfonts.script,	2000
\ No newline at end of file
+TESTEXECUTE, \logs\testexecute\bitgdiTest_T_outlineandshadowfonts.htm,		, z:\bitgdiTest\bitgdiTest_T_outlineandshadowfonts.script,	2000
+
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script,	600
--- a/graphicstest/graphicstestharness/automation/h4/tests_01.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h4/tests_01.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -32,6 +32,9 @@
 TESTEXECUTE, \logs\testexecute\fbstest_T_StreamIdCache.htm,				, z:\fbstest\fbstest_T_StreamIdCache.script, 800
 TESTEXECUTE, \logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script, 1200
 TESTEXECUTE, \logs\testexecute\fbstest_t_fonttable.htm,			        , z:\fbstest\fbstest_t_fonttable.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdata.htm,					, z:\fbstest\fbstest_t_glyphdata.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 800, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
+
 
 # See also tests_95_hw00.txt
 # See also tests_95_hw02.txt
--- a/graphicstest/graphicstestharness/automation/h4/tests_01a.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h4/tests_01a.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -32,6 +32,8 @@
 TESTEXECUTE, \logs\testexecute\fbstest_T_StreamIdCache.htm,				, z:\fbstest\fbstest_T_StreamIdCache.script, 800
 TESTEXECUTE, \logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script, 1200
 TESTEXECUTE, \logs\testexecute\fbstest_t_fonttable.htm,			        , z:\fbstest\fbstest_t_fonttable.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdata.htm,					, z:\fbstest\fbstest_t_glyphdata.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 800, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
 
 # See also tests_95_hw00.txt
 # See also tests_95_hw02.txt
--- a/graphicstest/graphicstestharness/automation/h4/tests_eglhybrid.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h4/tests_eglhybrid.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -45,4 +45,5 @@
 TESTEXECUTE, \logs\testexecute\egltest_t_vgimagetosurfaces.htm,                 , z:\egltest\egltest_t_vgimagetosurfaces.script, 600
 TESTEXECUTE, \logs\testexecute\egltest_t_benchmark_sgimage.htm,                 , z:\egltest\egltest_t_benchmark_sgimage.script, 600
 TESTEXECUTE, \logs\testexecute\egltest_t_oom_sgimage.htm,                       , z:\egltest\egltest_t_oom_sgimage.script, 600
-TESTEXECUTE, \logs\testexecute\egltest_t_stress_sgimage.htm,                    , z:\egltest\egltest_t_stress_sgimage.script, 1800
\ No newline at end of file
+TESTEXECUTE, \logs\testexecute\egltest_t_stress_sgimage.htm,                    , z:\egltest\egltest_t_stress_sgimage.script, 1800
+TESTEXECUTE, \logs\testexecute\egltest_t_surfacescaling.htm,                    , z:\egltest\egltest_t_surfacescaling.script, 600
\ No newline at end of file
--- a/graphicstest/graphicstestharness/automation/h6/tests_00b.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h6/tests_00b.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -21,3 +21,5 @@
 
 # PREQ1543 bitgdi
 TESTEXECUTE, \logs\testexecute\bitgdiTest_T_outlineandshadowfonts.htm,		, z:\bitgdiTest\bitgdiTest_T_outlineandshadowfonts.script,	2000
+
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script,	600
--- a/graphicstest/graphicstestharness/automation/h6/tests_01.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h6/tests_01.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -33,6 +33,8 @@
 TESTEXECUTE, \logs\testexecute\fbstest_T_StreamIdCache.htm,				, z:\fbstest\fbstest_T_StreamIdCache.script, 800
 TESTEXECUTE, \logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script, 1200
 TESTEXECUTE, \logs\testexecute\fbstest_t_fonttable.htm,			        , z:\fbstest\fbstest_t_fonttable.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdata.htm,					, z:\fbstest\fbstest_t_glyphdata.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 800, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
 
 # See also tests_95_hw00.txt
 # See also tests_95_hw02.txt
--- a/graphicstest/graphicstestharness/automation/h6/tests_01a.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h6/tests_01a.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -33,6 +33,8 @@
 TESTEXECUTE, \logs\testexecute\fbstest_T_StreamIdCache.htm,				, z:\fbstest\fbstest_T_StreamIdCache.script, 800
 TESTEXECUTE, \logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script, 1200
 TESTEXECUTE, \logs\testexecute\fbstest_t_fonttable.htm,			        , z:\fbstest\fbstest_t_fonttable.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdata.htm,					, z:\fbstest\fbstest_t_glyphdata.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 800, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
 
 # See also tests_95_hw00.txt
 # See also tests_95_hw02.txt
--- a/graphicstest/graphicstestharness/automation/h6/tests_eglhybrid.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/h6/tests_eglhybrid.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -46,3 +46,4 @@
 TESTEXECUTE, \logs\testexecute\egltest_t_benchmark_sgimage.htm,                 , z:\egltest\egltest_t_benchmark_sgimage.script, 600
 TESTEXECUTE, \logs\testexecute\egltest_t_oom_sgimage.htm,                       , z:\egltest\egltest_t_oom_sgimage.script, 600
 TESTEXECUTE, \logs\testexecute\egltest_t_stress_sgimage.htm,                    , z:\egltest\egltest_t_stress_sgimage.script, 1200
+TESTEXECUTE, \logs\testexecute\egltest_t_surfacescaling.htm,                    , z:\egltest\egltest_t_surfacescaling.script, 600
--- a/graphicstest/graphicstestharness/automation/ne1/tests_01.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/ne1/tests_01.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -32,6 +32,8 @@
 TESTEXECUTE, \logs\testexecute\fbstest_T_StreamIdCache.htm,				, z:\fbstest\fbstest_T_StreamIdCache.script, 800
 TESTEXECUTE, \logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script, 1200
 TESTEXECUTE, \logs\testexecute\fbstest_t_fonttable.htm,			        , z:\fbstest\fbstest_t_fonttable.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdata.htm,					, z:\fbstest\fbstest_t_glyphdata.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 800, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
 
 # See also tests_95_hw00.txt
 # See also tests_95_hw02.txt
--- a/graphicstest/graphicstestharness/automation/ne1/tests_01a.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/ne1/tests_01a.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -32,6 +32,8 @@
 TESTEXECUTE, \logs\testexecute\fbstest_T_StreamIdCache.htm,				, z:\fbstest\fbstest_T_StreamIdCache.script, 800
 TESTEXECUTE, \logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script, 1200
 TESTEXECUTE, \logs\testexecute\fbstest_t_fonttable.htm,			        , z:\fbstest\fbstest_t_fonttable.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdata.htm,					, z:\fbstest\fbstest_t_glyphdata.script, 800
+TESTEXECUTE, \logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 800, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
 
 # See also tests_95_hw00.txt
 # See also tests_95_hw02.txt
--- a/graphicstest/graphicstestharness/automation/ne1/tests_eglhybrid.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/ne1/tests_eglhybrid.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -44,6 +44,7 @@
 
 TESTEXECUTE, \logs\testexecute\egltest_t_oom_sgimage.htm,                       , z:\egltest\egltest_t_oom_sgimage.script, 600
 TESTEXECUTE, \logs\testexecute\egltest_t_stress_sgimage.htm,                    , z:\egltest\egltest_t_stress_sgimage.script, 1200
+TESTEXECUTE, \logs\testexecute\egltest_t_surfacescaling.htm,                    , z:\egltest\egltest_t_surfacescaling.script, 600
 
 # EGL - tests which intermittently freeze and abort with timeout.
 TESTEXECUTE, \logs\testexecute\egltest_t_unittest.htm,                          , z:\egltest\egltest_t_unittest.script, 600
--- a/graphicstest/graphicstestharness/automation/winscw/tests.txt	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/automation/winscw/tests.txt	Wed Aug 18 11:05:09 2010 +0300
@@ -155,6 +155,8 @@
 TESTEXECUTE, C:\logs\testexecute\fbstest_T_Secure.htm,					, z:\fbstest\fbstest_T_Secure.script, 600
 TESTEXECUTE, C:\logs\testexecute\fbstest_T_StreamIdCache.htm,			, z:\fbstest\fbstest_T_StreamIdCache.script, 600
 TESTEXECUTE, C:\logs\testexecute\fbstest_T_FontTable.htm,			, z:\fbstest\fbstest_T_FontTable.script, 600
+TESTEXECUTE, C:\logs\testexecute\fbstest_t_glyphdata.htm,			, z:\fbstest\fbstest_t_glyphdata.script, 600, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
+TESTEXECUTE, C:\logs\testexecute\fbstest_t_glyphdataoutlineshadow.htm,		, z:\fbstest\fbstest_t_glyphdataoutlineshadow.script, 600, ,z\ityperast_config.cmd install, z\ityperast_config.cmd uninstall
 
 # without extended bitmap example rasterizer
 TESTEXECUTE, C:\logs\testexecute\fbstest_t_extendedbitmap.htm,			, z:\fbstest\fbstest_t_extendedbitmap.script,		1200
@@ -267,6 +269,7 @@
 TESTEXECUTE, C:\logs\testexecute\egltest_t_benchmark_sgimage.htm,        	, z:\egltest\egltest_t_benchmark_sgimage.script, 			300, , z\graphics\t_graphics_config_inifiles.bat install, z\graphics\t_graphics_config_inifiles.bat uninstall
 TESTEXECUTE, C:\logs\testexecute\egltest_t_oom_sgimage.htm,                 	, z:\egltest\egltest_t_oom_sgimage.script, 				600, , z\graphics\t_graphics_config_inifiles.bat install, z\graphics\t_graphics_config_inifiles.bat uninstall
 TESTEXECUTE, C:\logs\testexecute\egltest_t_stress_sgimage.htm,			, z:\egltest\egltest_t_stress_sgimage.script, 				600, , z\graphics\t_graphics_config_inifiles.bat install, z\graphics\t_graphics_config_inifiles.bat uninstall
+TESTEXECUTE, C:\logs\testexecute\egltest_t_surfacescaling.htm,			, z:\egltest\egltest_t_surfacescaling.script, 			  600, , z\graphicstest\minigui.cmd z\graphics\t_graphics_config_inifiles.bat install csc_nga, z\graphicstest\unminigui.cmd z\graphicstest\retain_files.cmd logs\testexecute\screencomparison screencomparison z\graphics\t_graphics_config_inifiles.bat uninstall
 
 # GCE
 TESTEXECUTE, C:\logs\testexecute\functionaltest_mandatory.htm,	, z:\gcetest\functionaltest_mandatory.script,  600, , z\gcetest\gcetest_setup_emu.bat install dabs, z\gcetest\gcetest_setup_emu.bat uninstall dabs
@@ -496,7 +499,14 @@
 # UIBENCH S60
 TESTEXECUTE, C:\logs\testexecute\te_uibench_s60_techview_emulator.htm,	, c:\uibench_s60\te_uibench_s60_techview_emulator.script, 900
 
+# OpenWF Fastpath (REQ417.54885)
+TESTEXECUTE, C:\logs\testexecute\openwftest.htm,				, z:\openwftest\openwftest.script, 600, , z\gcetest\gcetest_setup_emu.bat install dabs, z\graphicstest\retain_files.cmd openwftest\img openwftest\img z\gcetest\gcetest_setup_emu.bat uninstall dabs 
+TESTEXECUTE, C:\logs\testexecute\t_screeninterface_emulator.htm,				, z:\wfctest\t_screeninterface_emulator.script, 600
+
+# GCE tests using OpenWF instead of GCE
+TESTEXECUTE, C:\logs\testexecute\owf_functionaltest_mandatory.htm,	, z:\gcetest\owf_functionaltest_mandatory.script, 600, , z\gcetest\gcetest_setup_emu.bat install dabs_owf, z\gcetest\gcetest_setup_emu.bat uninstall dabs
+
 # OpenWF Conformance Tests run under testexecute
 TESTEXECUTE, C:\logs\testexecute\ct_api.htm,	, z:\wfctest\ct_api.script,  600, , z\gcetest\gcetest_setup_emu.bat install dabs, z\gcetest\gcetest_setup_emu.bat uninstall dabs
 TESTEXECUTE, C:\logs\testexecute\ct_offscreen.htm,	, z:\wfctest\ct_offscreen.script,  600, , z\gcetest\gcetest_setup_emu.bat install dabs, z\graphicstest\retain_files.cmd results ct\results z\gcetest\gcetest_setup_emu.bat uninstall dabs
-TESTEXECUTE, C:\logs\testexecute\ct_onscreen.htm,	, z:\wfctest\ct_onscreen.script,  600, , z\gcetest\gcetest_setup_emu.bat install dabs, z\graphicstest\retain_files.cmd results ct\results z\gcetest\gcetest_setup_emu.bat uninstall dabs
\ No newline at end of file
+TESTEXECUTE, C:\logs\testexecute\ct_onscreen.htm,	, z:\wfctest\ct_onscreen.script,  600, , z\gcetest\gcetest_setup_emu.bat install dabs, z\graphicstest\retain_files.cmd results ct\results z\gcetest\gcetest_setup_emu.bat uninstall dabs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/bwins/tgraphicsfontutilsu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,7 @@
+EXPORTS
+	??1CCharCodeConverter@@UAE@XZ @ 1 NONAME ; CCharCodeConverter::~CCharCodeConverter(void)
+	?NewL@CCharCodeConverter@@SAPAV1@XZ @ 2 NONAME ; class CCharCodeConverter * CCharCodeConverter::NewL(void)
+	?GlyphCodeL@CCharCodeConverter@@QBEHH@Z @ 3 NONAME ; int CCharCodeConverter::GlyphCodeL(int) const
+	?UseFontL@CCharCodeConverter@@QAEXPAVCFbsFont@@@Z @ 4 NONAME ; void CCharCodeConverter::UseFontL(class CFbsFont *)
+	?NewLC@CCharCodeConverter@@SAPAV1@XZ @ 5 NONAME ; class CCharCodeConverter * CCharCodeConverter::NewLC(void)
+
--- a/graphicstest/graphicstestharness/bwins/tprofileru.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/bwins/tprofileru.def	Wed Aug 18 11:05:09 2010 +0300
@@ -23,4 +23,4 @@
 	?SetStoreResultInTimingOrder@CTProfiler@@QAEXH@Z @ 22 NONAME ; void CTProfiler::SetStoreResultInTimingOrder(int)
 	?ShowResultArrayInTimingOrder@CTProfiler@@QAEXXZ @ 23 NONAME ; void CTProfiler::ShowResultArrayInTimingOrder(void)
 	?SqlInsert@CTProfiler@@QAEXPBVTDesC16@@00J@Z @ 24 NONAME ; void CTProfiler::SqlInsert(class TDesC16 const *, class TDesC16 const *, class TDesC16 const *, long)
-
+	?ResultsAnalysisGlyphRate@CTProfiler@@QAEXABVTDesC16@@HHHHH@Z @ 25 NONAME ; void CTProfiler::ResultsAnalysisGlyphRate(class TDesC16 const &, int, int, int, int, int)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/eabi/tgraphicsfontutilsu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,11 @@
+EXPORTS
+	_ZN18CCharCodeConverter4NewLEv @ 1 NONAME
+	_ZN18CCharCodeConverter8UseFontLEP8CFbsFont @ 2 NONAME
+	_ZN18CCharCodeConverterD0Ev @ 3 NONAME
+	_ZN18CCharCodeConverterD1Ev @ 4 NONAME
+	_ZN18CCharCodeConverterD2Ev @ 5 NONAME
+	_ZNK18CCharCodeConverter10GlyphCodeLEi @ 6 NONAME
+	_ZTI18CCharCodeConverter @ 7 NONAME
+	_ZTV18CCharCodeConverter @ 8 NONAME
+	_ZN18CCharCodeConverter5NewLCEv @ 9 NONAME
+
--- a/graphicstest/graphicstestharness/eabi/tprofileru.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/eabi/tprofileru.def	Wed Aug 18 11:05:09 2010 +0300
@@ -27,4 +27,4 @@
 	_ZN10CTProfiler27SetStoreResultInTimingOrderEi @ 26 NONAME
 	_ZN10CTProfiler28ShowResultArrayInTimingOrderEv @ 27 NONAME
 	_ZN10CTProfiler9SqlInsertEPK7TDesC16S2_S2_l @ 28 NONAME
-
+	_ZN10CTProfiler24ResultsAnalysisGlyphRateERK7TDesC16iiiii @ 29 NONAME
--- a/graphicstest/graphicstestharness/group/BLD.INF	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/group/BLD.INF	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -39,11 +39,15 @@
 ../rom/graphics_imagecomparison.iby	/epoc32/rom/include/graphics_imagecomparison.iby  
 ../rom/graphics_tprofiler.iby  		/epoc32/rom/include/graphics_tprofiler.iby
 ../rom/graphics_simload.iby  		/epoc32/rom/include/graphics_simload.iby
-
+../rom/graphics_testfontutils.iby  	/epoc32/rom/include/graphics_testfontutils.iby
+../rom/minigui_chassis_bats.oby  		/epoc32/rom/include/minigui_chassis_bats.oby
+../rom/minigui_naviengine_smp.oby  		/epoc32/rom/include/minigui_naviengine_smp.oby
 // WSINI
 ../rom/graphics_sirocco_wsini.hby  		/epoc32/rom/include/graphics_sirocco_wsini.hby
 ../rom/graphics_sirocco_wsini.iby  		/epoc32/rom/include/graphics_sirocco_wsini.iby
+../rom/graphics_sirocco_ne_wsini.iby  	/epoc32/rom/include/graphics_sirocco_ne_wsini.iby
 ../wsini/wsini_vasco.ini		/epoc32/data/test_wsini/wsini_vasco.ini
+../wsini/wsini_naviengine.ini		/epoc32/data/test_wsini/wsini_naviengine.ini
 
 // ONB batch files
 ../batch/retain_files.cmd z:\graphicstest\retain_files.cmd
@@ -63,6 +67,7 @@
 ../inc/graphicsimagecomparison.h OS_LAYER_PLATFORM_EXPORT_PATH(test/graphicsimagecomparison.h)
 ../inc/tprofiler.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(test/tprofiler.h)
 ../inc/t_simload.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(test/t_simload.h)
+../inc/singletontestexithelper.inl OS_LAYER_PLATFORM_EXPORT_PATH(test/singletontestexithelper.inl)
 
 //Data files for reboot test harness
 ../rom/graphics_rebootharnesslog.htm /epoc32/data/Z/reboot/dummylog.htm
@@ -75,6 +80,9 @@
 // Headers for FontInjector DLL
 ../fontinjector/fontinjector.h OS_LAYER_PLATFORM_EXPORT_PATH(test/fontinjector.h)
 
+// Headers for font utilities
+../inc/graphicsfontutils.h OS_LAYER_PLATFORM_EXPORT_PATH(test/graphicsfontutils.h)
+
 PRJ_TESTMMPFILES
 ../group/TGraphicsHarness.mmp
 ../group/GraphicsTestUtils.mmp
@@ -90,6 +98,7 @@
 ../group/t_simloadapp1.mmp
 ../group/t_simloadapp2.mmp
 ../group/t_simloadapp3.mmp
+../group/tgraphicsfontutils.mmp
 
 #if defined(WINS)
 ../group/fontinjector.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/group/tgraphicsfontutils.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,36 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Collection of font utilities for test purposes
+
+TARGET			tgraphicsfontutils.dll
+TARGETTYPE		dll
+
+UID 0x1000008d 0x2002B639
+VENDORID 0x70000001
+
+CAPABILITY 		All -Tcb
+
+SOURCEPATH	../src
+SOURCE		graphicsfontutils.cpp
+
+USERINCLUDE	../inc
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY		euser.lib
+LIBRARY		fbscli.lib
+LIBRARY		gdi.lib
+LIBRARY		fntstr.lib
+LIBRARY		ecom.lib
+
+SMPSAFE
--- a/graphicstest/graphicstestharness/inc/TGraphicsHarness.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/inc/TGraphicsHarness.h	Wed Aug 18 11:05:09 2010 +0300
@@ -122,7 +122,17 @@
 CTGraphicsBase* CT##a##Step::CreateTestL() \
 	{ \
 	return new (ELeave) CT##a (this); \
-	} 
+	}
+
+// Macros to automatically test error condition and report when test fails.
+// Essentially same as TESTE(a,b) MACRO that CTestStep uses, except error to
+// check is also error that is reported.
+#define TESTNOERROR(a) \
+	{\
+	TInt b = a;\
+	TBool c = (b == KErrNone);\
+	testBooleanTrueWithErrorCode((c), (b), (TText8*)__FILE__, __LINE__);\
+	}
 	
 inline void CTGraphicsBase::testBooleanTrue(TBool aCondition, const TText8* aFile, TInt aLine) 
 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/inc/graphicsfontutils.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,58 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Contains utility classes/functions which are
+// shared across multiple test steps.
+
+#ifndef GRAPHICSFONTUTILS_H
+#define GRAPHICSFONTUTILS_H
+
+#include <e32base.h>
+class CFontStore;
+class CFbsFont;
+class MOpenFontShapingExtension;
+class CBitmapFont;
+
+/**
+Helper class that converts a character code to a glyph code. 
+To do this requires calling into a font rasterizer from this
+process, therefore the rasterizer must be loaded in this 
+process - to do this it must create its own fontstore and load
+its own instance of a font rasterizer. This class performs 
+no shaping of characters.
+
+@note This class and/or its implementation should not be 
+    copied or used as refernce code - the proper implementation
+    would not create a new fontstore, but instead either parse the
+    font table of the associated font itself, or use the
+    FBS server-side fontstore. 
+ */
+class CCharCodeConverter : public CBase
+    {
+public:
+    IMPORT_C static CCharCodeConverter* NewL();
+    IMPORT_C static CCharCodeConverter* NewLC();
+    IMPORT_C ~CCharCodeConverter();    
+    IMPORT_C void UseFontL(CFbsFont* aFont);
+    IMPORT_C TInt GlyphCodeL(TInt aCharCode) const;
+private:
+    CCharCodeConverter();
+    void ConstructL();
+    void LoadOpenFontLibraries(CFontStore* aFontStore);    
+private:
+    CFontStore* iFontStore;
+    CBitmapFont* iFont;
+    MOpenFontShapingExtension* iGlyphIndexExt;
+    };
+
+#endif // GRAPHICSFONTUTILS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/inc/singletontestexithelper.inl	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,136 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Test shutdown cleanup functions that should be called to destroy singletons
+// before the heap is destroyed, in particular when using TEF steps.
+// These methods are implemented and called from Window Server - WServ, CWsTop
+// but this copy can be called by any low-level unit tests that bypass WServ   
+// but need to provide the same clean-up behaviour.
+// @test
+// @internalTechnology
+// 
+// Currently, three things are cleaned up:
+// 1) Singleton API mutex in OpenWF implementation
+// 2) Singleton Find/Acquire mutext in Native Stream implementation
+// 3) EGL thread status 
+//
+// Note that while these cleanups are only required by OWF-C implementations,
+// the methods called should be harmless if called 
+// when some other composition solution is in action.
+
+#include <e32property.h>
+#include <EGL/egl.h>
+
+// IDs of p&s properties that optionally contain onexit callbacks
+// that may be used to release singletons owned by libraries at shutdown in order to make 
+// the memory leak tests work.
+// By convention, the ID is the same as the UID3 of the libary.
+static TBool gReleaseSingletonsOnExit = EFalse;
+static const TUid KOpenWfcImplCleanupKey = {0x10286FC4};     
+static const TUid KOpenWfcInteropCleanupKey = {0x10286FC5};
+
+
+static void DefineOwfSingletonKey(const TUid& aSingletonKey)
+/**
+ * Defines a new property for a singleton key. WServ must only process 
+ * singleton keys that it created to prevent a malicious process with the 
+ * WriteDeviceData capability causing arbitrary functions to be executed.
+ * 
+ * @param   aSingeltonKey   The UID of the singleton key to define.
+ */
+    {
+    RThread t;      
+    TUid category = { t.SecureId().iId };
+    RProperty prop;
+    
+    // Write access is restricted to THIS process
+    TInt err = prop.Define( category, aSingletonKey.iUid, 
+            RProperty::EByteArray, TSecurityPolicy( t.SecureId() ), 
+            TSecurityPolicy( t.SecureId() ), sizeof( TCallBack ) );
+    
+    if ( err == KErrNone || err == KErrAlreadyExists)
+        {
+        TCallBack cb( NULL, NULL );
+        TPckgC<TCallBack> cbPckg( cb );
+        
+        // Any error should cause the properties to be ignored
+        err = prop.Set( category, aSingletonKey.iUid, cbPckg );    
+        }      
+    //We presume that if property already exists it was previously set by this test code.
+    if ( err != KErrNone )
+        {
+        // A problem occured / the property already existed so for safety
+        // the release code should be skipped.
+        gReleaseSingletonsOnExit = EFalse;
+        }
+    
+    prop.Close();
+    t.Close();
+    }
+#define DefineOwfSingletonKeys DefineOwfSingletonKeys
+/** Call this method before starting the compositor.    
+ * 
+ */
+static void DefineOwfSingletonKeys()
+    {
+    // Define properties for singleton callbacks. This must only be done ONCE
+    // to ensure the properties can't be hijacked.
+    gReleaseSingletonsOnExit = ETrue;
+    DefineOwfSingletonKey(KOpenWfcInteropCleanupKey);
+    DefineOwfSingletonKey(KOpenWfcImplCleanupKey);
+    }
+
+static void DeleteOwfSingleton( const TUid& aSingletonKey )
+/**
+ * Deletes a singleton object that was created on WServ's main heap.
+ * 
+ * @pre     The ws plugins have not been unloaded.
+ * @param   aSingletonKey   The UID of the singleton which correponds to an
+ *                          RProperty within WServ's category.                       
+ */
+    {   
+    if ( gReleaseSingletonsOnExit )
+        {
+        RThread t;
+        TPckgBuf<TCallBack> cb;
+        RProperty prop; 
+        TInt err = prop.Get(TUid::Uid(t.SecureId().iId), aSingletonKey.iUid, cb);
+        if (err == KErrNone && cb.Length() == sizeof(TCallBack) && 
+                cb().iFunction && cb().iPtr == &User::Heap())
+            {
+            // Callback is only invoked if the heap for the singleton was the 
+            // WServ heap because the WServ memory leak tests only check this
+            // heap.
+            cb().CallBack();
+            }
+        // Errors are ignored because the purpose of this function is to free
+        // singletons in order top make memory leak checks pass.
+        prop.Close();
+        t.Close();
+        }
+    }
+/** Call this method to destroy OWF-C singletons on shut down
+ * 
+ */
+#define DeleteOwfSingletons DeleteOwfSingletons
+static void DeleteOwfSingletons()
+    {
+    // Free singletons on WServ heap created by libraries. Must be called
+    // BEFORE iPluginManager is deleted otherwise the library code could have
+    // been unloaded.
+    DeleteOwfSingleton(KOpenWfcImplCleanupKey);
+    DeleteOwfSingleton(KOpenWfcInteropCleanupKey);
+    /* Release any use of EGL by this thread. */
+    eglReleaseThread();
+    }
+
--- a/graphicstest/graphicstestharness/inc/tprofiler.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/inc/tprofiler.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -33,6 +33,7 @@
 _LIT(KPixelsPerSecond,  "pixels/second");
 _LIT(KFrameRate,        "frames/second");
 _LIT(KCharacterRate,    "characters/second");
+_LIT(KGlyphRate,        "glyphs/second");
 _LIT(KVariation,        "Rot_%i_SrcMode_%i_DestMode_%i_Iters_%i");
 _LIT(KVariationPPI,     "Rot_%i_SrcMode_%i_DestMode_%i_Iters_%i_PPI_%i");
 _LIT(KVariationZOrder,  "ZOrd_%i_SrcMode_%i_DestMode_%i_Iters_%i_PPI_%i");
@@ -69,7 +70,7 @@
 	IMPORT_C void ShowResultArrayInTimingOrder();
 	IMPORT_C void SetStoreResultInTimingOrder(TBool aStoreResultInTimingOrder);
 	IMPORT_C void SqlInsert(const TDesC* aTestName, const TDesC* aTestAttribute, const TDesC* aTestUnit, TInt32 aTestResultValue);
-
+	IMPORT_C void ResultsAnalysisGlyphRate(const TDesC & aTestName, TInt aRotation, TInt aSrcScreenMode, TInt aDstScreenMode, TInt aIters, TInt aNumPixels);
 
 private:
     CTProfiler(CTestStep& aTestStep);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/rom/graphics_sirocco_ne_wsini.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,37 @@
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: Config for wsini.ini on NAVIENGINE
+//
+
+#ifndef __GRAPHICS_SIROCCO_NE_WSINI_IBY__
+#define __GRAPHICS_SIROCCO_NE_WSINI_IBY__
+
+#include <graphics_sirocco_wsini.hby>
+
+#if WSERV_TEST_WSINI == WSERV_TEST_WSINI_ALF
+	data=DATAZ_\talf\wsini_naviengine_alf.ini \system\data\wsini.ini
+#elif WSERV_TEST_WSINI == WSERV_TEST_WSINI_BITGDIRENDERSTAGE
+	data=DATAZ_\wstest\tbitgdirenderstage\arm\wsini_bitgdirenderstage_naviengine.ini \system\data\wsini.ini
+#elif WSERV_TEST_WSINI == WSERV_TEST_WSINI_CSC
+	data=DATAZ_\wstest\wsini_csc_nga_naviengine.ini \system\data\wsini.ini
+#elif WSERV_TEST_WSINI == WSERV_TEST_WSINI_GENERICPLUGIN
+	data=DATAZ_\wstest\genericplugin\wsini_naviengine_genericplugin.ini \system\data\wsini.ini
+#elif WSERV_TEST_WSINI == WSERV_TEST_WSINI_LAYERCOMPOSITION
+	data=DATAZ_\tlayercomposition\wsini_naviengine_layercomposition.ini \system\data\wsini.ini
+#elif WSERV_TEST_WSINI == WSERV_TEST_WSINI_RATELIMITER
+	data=DATAZ_\wstest\ratelimiter\wsini_naviengine_ratelimiter.ini \system\data\wsini.ini
+#else
+	data=EPOCROOT##epoc32\data\test_wsini\wsini_naviengine.ini \system\data\wsini.ini
+#endif
+
+#endif	// __GRAPHICS_SIROCCO_NE_WSINI_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/rom/graphics_testfontutils.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifndef __GRAPHICS_TESTFONTUTILS_IBY__
+#define __GRAPHICS_TESTFONTUTILS_IBY__
+
+file=ABI_DIR\DEBUG_DIR\tgraphicsfontutils.dll		Sys\bin\tgraphicsfontutils.dll
+
+
+#endif	// __GRAPHICS_TESTFONTUTILS_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/rom/minigui_chassis_bats.oby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,190 @@
+#ifndef __MINIGUI_OBY__
+#define __MINIGUI_OBY__
+
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This OBY File is used to build Mini-Gui ROM Images.
+// 
+// Use the following buildrom command line, or similar:
+//	buildrom -orombld.img -DUSE_SDIO_SD_MMC -DWITH_TVOUT -DUSE_24UBPP_DISPLAY_VARIANT_TV -D_INTERNAL_MMC -DUSE_DATA_PAGING h4hrp minigui pagedrom platsec
+// Note there is no need to specify -D_NAND2 
+
+define OBEYFILE minigui
+define ROMDATE	##TODAY##
+
+// We used to define _NAND2 on the commandline to buildrom.  However, it
+// does not make rombuild create a rofs image.  Instead it needs to be
+// specified in the oby file itself.
+//#define _NAND2
+
+// Undefine things in global System Include that stops the NCP rom from working.
+#undef USE_CUSTOM_MMC_PARTITION
+#undef SYMBIAN_EXCLUDE_SCDV
+#undef SYMBIAN_GRAPHICS_USE_GCE 
+#undef SYMBIAN_GRAPHICS_ADAPTATION
+#undef SGA_SW_NO_GRAPHICSRESOURCE 
+#undef SYMBIAN_EXCLUDE_KEYMAP  
+
+
+
+#define NO_METROTRK_APP // don't want metrotrk application
+#define HAS_ETHERNET	// include etherDrv, ether802, DHCP
+#define SYMBIAN_EXCLUDE_FAX
+#undef __IPSEC
+#define SYMBIAN_EXCLUDE_OBEX
+
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+#define _SSMSTARTUPMODE 8	//for ssma boot up.
+#else
+#define _STARTUPMODE8		// for sysstart.iby
+#endif
+
+// Various workarounds to avoid dependencies on UIKON
+
+#define __TLS_IBY__			// exclude TLS
+#define __TLSPROVIDER_IBY__		// exclude TLSPROVIDER 
+#define __OBEXPROTOCOL_IBY__	// exclude obex.dll etc
+#define __WLANEAPMETHODS_IBY__	// exclude eap_tls.msy & friends
+// 
+
+#ifndef SYMBIAN_BASE_USE_GCE
+#define SYMBIAN_BASE_USE_GCE
+#endif
+#ifndef SYMBIAN_GRAPHICS_USE_GCE
+#define SYMBIAN_GRAPHICS_USE_GCE
+#endif
+#include <header.iby>				/* ROM header definitions */
+#include <base.iby>					/* The lowest-level of the operating system */
+
+#include <core/os/platformenv.iby>
+#include <core/os/ssmmapperutility.iby>
+
+#include <graphics_adaptation.hby>
+
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+#include <ssma.iby>			/*System State Management Architecture*/
+#include <ssplugins.iby>		/*System State Management Plugins*/
+
+//Include SSM optional components to enable teams to build a plain textshell rom (on the lines of DEF128306), 
+//following removal of h4_textshell_rom.oby.
+#include <amastart.iby>
+
+#include <shma.iby>
+#include <ssrefplugins.iby>
+#else
+#include <sysstart.iby>
+#include <sysstartconfig.iby>
+#endif // SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+#include <debug.iby>
+
+#include <eshell.iby>
+
+#include <centralrepository.iby>
+	file=ABI_DIR\BUILD_DIR\abclient.dll			sys\bin\abclient.dll
+
+#include <crypto.iby>
+
+#include <c32.iby>
+#include <ecuart.iby>
+#include <irda.iby>
+#include <stdlib.iby>
+#include <gdi.iby>
+#include <fntstore.iby>
+#include <fbserv.iby>
+#include <bitgdi.iby>
+#include <iculayoutengine.iby>
+#include <freetype.iby>
+#include <directgdi.iby>
+#include <wserv.iby>
+#include <econs_wserv.iby>
+//data=DATAZ_\wsini_minigui.ini	\system\data\wsini.ini
+
+#include <printers.iby>
+
+
+
+#include <traces.iby>
+
+#include <inetprotutil.iby>		/* needed for mmfcontrollerframework.dll */
+#include <sysagent.iby>
+#include <network.iby>	
+#include <dial.iby>		// needed by commsdat
+#include <etel.iby>
+#include <smsstack.iby>
+#include <etelmm.iby>
+#include <etelpckt.iby>
+#include <mmtsy.iby>
+#include <etelsat.iby>
+#include <sysawatcher.iby>
+#include <bafl.iby>
+#include <ecom.iby>
+#include <store.iby>
+#include <dbms.iby>
+#include <pwrcli.iby>
+#include <xml.iby>
+#include <ups.iby>
+#include <securitycommonutils.iby>
+
+/* Feature Management run-time */
+#ifdef SYMBIAN_FEATURE_MANAGER
+
+// Include both old and new components when Feature Manager enabled
+#include <featmgr.iby>
+#include <featreg.iby>
+
+#else 
+
+// Include only the original Feature Registry otherwise
+#include <featreg.iby>
+#ifndef ROM_FEATURE_MANAGEMENT
+/* Provide a default configuration file for the feature registry */ 
+data=EPOCROOT##epoc32\data\config\featreg_default.cfg    private\102744CA\featreg.cfg
+#endif
+#endif
+
+// The following section are all indirect dependencies arising from TEF testexecute depending
+// on apparc
+#include <mmcommon.iby>
+#include <ezlib.iby>
+file=ABI_DIR\BUILD_DIR\Http.dll                 System\Libs\Http.dll
+file=ABI_DIR\BUILD_DIR\httputils.dll			System\Libs\httputils.dll
+#include <asnpkcs.iby>
+#include <filetokens.iby>
+#include <imageconversion.iby>
+#include <ocsp.iby>
+#include <certman.iby>
+#include <swi.iby>
+#include <bluetooth.iby>
+#include <openenv.iby>
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include <scr.iby>
+#include <sts.iby>
+#include <sif.iby>
+#endif
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include <scr.iby>
+#include <sts.iby>
+#include <sif.iby>
+#endif
+#include <caf.iby>
+#include <apparc.iby>		/* Application architecture DLLs */
+#include <emime.iby>		/* Mime recognition */
+// This is the end of the indirect dependencies arising from TEF testexecute
+// depending on apparc
+
+#include <testexecute.iby>		// TEF
+
+#endif /* __MINIGUI_OBY__ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/rom/minigui_naviengine_smp.oby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,21 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This OBY File is used to build Minigui NaviEngine SMP ROM Images.
+// 
+//
+
+#define SMP
+#include <naviengine.oby>
+#include <minigui_chassis_bats.oby>
+#include <platsec.oby>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/src/graphicsfontutils.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,175 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Contains utility classes/functions which are
+// shared across multiple tests.
+
+#include <gdi.h>
+#include <fbs.h>
+#include <fntstore.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <graphics/openfontconstants.h>
+#include <graphics/openfontrasterizer.h>
+#include <test/graphicsfontutils.h>
+
+// The width of 1000 pixels, in twips
+const TInt KDefaultWidthInTwips = 11860;
+const TInt KDefaultHeightInTwips = 11860;
+
+/* 
+Used for cleanup of RImplInfoArray implementationArray 
+in CCharCodeConverter::LoadOpenFontLibraries().
+*/
+void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
+    {
+    RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
+    array->ResetAndDestroy();
+    }
+
+
+CCharCodeConverter::CCharCodeConverter()
+    {
+    }
+
+EXPORT_C CCharCodeConverter::~CCharCodeConverter()
+    {
+    if (iFont)
+        {
+        iFontStore->ReleaseFont(iFont);  
+        }
+    delete iFontStore;
+    REComSession::FinalClose();
+    }
+
+EXPORT_C CCharCodeConverter* CCharCodeConverter::NewL()
+    {
+    CCharCodeConverter* self = new(ELeave) CCharCodeConverter();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(1); // self;
+    return self;
+    }
+
+EXPORT_C CCharCodeConverter* CCharCodeConverter::NewLC()
+    {
+    CCharCodeConverter* self = new(ELeave) CCharCodeConverter();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+void CCharCodeConverter::ConstructL()
+    {
+    // Setup fontstore...
+    iFontStore = CFontStore::NewL(&User::Heap());
+    iFontStore->iKPixelWidthInTwips = KDefaultWidthInTwips;
+    iFontStore->iKPixelHeightInTwips = KDefaultHeightInTwips;
+    //load all ecom implemented rasterizer dlls. installs the rasterizer.
+    LoadOpenFontLibraries(iFontStore);
+    //add any required font files
+    iFontStore->LoadFontsAtStartupL();  
+    }
+
+void CCharCodeConverter::LoadOpenFontLibraries(CFontStore* aFontStore)
+     {
+     RImplInfoPtrArray implementationArray;
+     TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
+     CleanupStack::PushL(cleanup);
+     TInt error;
+     TInt ecomerror;
+     TInt ecomnotready;
+     TUid uid = {KUidOpenFontRasterizerPlunginInterface};
+ 
+     // Making sure that no race situation arises
+     // If ECom is not ready, give it another chance and try again. if it still doesn't work 
+     // after the third try, then it just carries on quietly and fails... 
+     for (ecomnotready = 0; ecomnotready < 3; ecomnotready++)
+         {
+         TRAP(ecomerror,REComSession::ListImplementationsL(uid, implementationArray));
+         if (ecomerror == KErrNone)
+             {
+             break;
+             }
+         else
+             {
+             ecomerror = KErrNone;
+             User::After(0);
+             }
+         }
+ 
+     const TInt availCount = implementationArray.Count();
+     for (TInt count = 0; count < availCount; ++count)
+         {
+         const CImplementationInformation* info = implementationArray[count];
+         TUid rasterizerUid = info->ImplementationUid();
+         // Create a rasterizer
+         COpenFontRasterizer* rasterizer = 0;
+         TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid));
+         if (!error)
+             {
+             // Install it in the font store.
+             TRAP(error,aFontStore->InstallRasterizerL(rasterizer));
+             if (error)
+                 {
+                 delete rasterizer;
+                 }
+             }
+         }
+     CleanupStack::PopAndDestroy(&implementationArray);  
+     }
+
+/**
+Tells the converter which font object is to be used when 
+converting character codes to glyph codes.
+@param aFont The font to use for conversion of codes
+ */
+EXPORT_C void CCharCodeConverter::UseFontL(CFbsFont* aFont)
+    {
+    User::LeaveIfNull(iFontStore);
+    if (iFont)
+        {
+        iFontStore->ReleaseFont(iFont);
+        iFont = NULL;
+        iGlyphIndexExt = NULL;
+        }
+    // Setup font interface...
+    TFontSpec testFontSpec(aFont->FontSpecInTwips().iTypeface.Name(), aFont->HeightInPixels()); 
+    CFont* cfont = 0;
+    iFontStore->GetNearestFontToDesignHeightInPixels(*&cfont, testFontSpec);    
+    iFont = (CBitmapFont*)cfont;
+    User::LeaveIfNull(iFont);
+    TAny* ext = 0;
+    // This is the interface used to get the glyph code index from the rasterizer..
+    iFont->OpenFont()->ExtendedInterface(KUidOpenFontShapingExtension, ext);
+    iGlyphIndexExt = reinterpret_cast<MOpenFontShapingExtension*>(ext);
+    User::LeaveIfNull(ext);
+    }
+
+/**
+Returns the glyph code for the given character code, for the 
+font that this object was constructed with. No shaping of
+the characters is performed by this function.
+@param aCharCode The character code to request the glyph code for.
+@return The glyph code
+ */
+EXPORT_C TInt CCharCodeConverter::GlyphCodeL(TInt aCharCode) const
+    {
+    // If a leave occurs, it's because UseFontL() has
+    // not been successfully called.
+    User::LeaveIfNull(iGlyphIndexExt);
+    TInt glyphCode = iGlyphIndexExt->GlyphIndex(aCharCode);
+    return glyphCode;
+    }
+
+
--- a/graphicstest/graphicstestharness/src/tprofiler.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/graphicstestharness/src/tprofiler.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -133,19 +133,12 @@
 */
 EXPORT_C void CTProfiler::MarkResultSetL()
     {   
-    TUint32 res = (TUint32)StopTimer();
-    iResults.InsertInUnsignedKeyOrderAllowRepeatsL(res);
-    if(iStoreResultInTimingOrder)
-        {
-        iResultsTimingOrder.AppendL(res);
-        }
-    iDiff = 0;
-    PROFILER_TEST(iResultsInitalised);
+    MarkResultSetAndSuspendL();
     StartTimer();
     }
 
 /**
-Records set current time. Alike MarkResultSetL() the function doesn't 
+Records set current time. Unlike MarkResultSetL() the function doesn't 
 restart the timer at the end. The following operations will not be 
 included into benchmark mesuarment. To resume the profiling the user must 
 start the timer.
@@ -260,9 +253,9 @@
     TBuf<128> variationTrimmedMean;
     variationTrimmedMean.Format(KTrimmedMean, &variation);
     
-    SqlInsert(&aTestName, &variationTrimmedMean,    &KMicroSeconds,     GetTrimedMean());
-    SqlInsert(&aTestName, &variationMax,            &KPixelsPerSecond,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,            &KPixelsPerSecond,  TimeMin());
+    SqlInsert(&aTestName, &variationTrimmedMean,    &KMicroSeconds,  GetTrimedMean());
+    SqlInsert(&aTestName, &variationMax,            &KMicroSeconds,  TimeMax());
+    SqlInsert(&aTestName, &variationMin,            &KMicroSeconds,  TimeMin());
     
     iResultsInitalised = EFalse;
     }
@@ -293,8 +286,8 @@
     variationMin.Format(KMinTime, &variation);
     
     SqlInsert(&aTestName, &variation,       &KPixelsPerSecond,  pixelRate);
-    SqlInsert(&aTestName, &variationMax,    &KPixelsPerSecond,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,    &KPixelsPerSecond,  TimeMin());
+    SqlInsert(&aTestName, &variationMax,    &KMicroSeconds,     TimeMax());
+    SqlInsert(&aTestName, &variationMin,    &KMicroSeconds,     TimeMin());
     
     iResultsInitalised = EFalse;
     }
@@ -324,8 +317,8 @@
     variationMin.Format(KMinTime, &variation);
     
     SqlInsert(&aTestName, &variation,       &KCharacterRate,  characterRate);
-    SqlInsert(&aTestName, &variationMax,    &KCharacterRate,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,    &KCharacterRate,  TimeMin());
+    SqlInsert(&aTestName, &variationMax,    &KMicroSeconds,   TimeMax());
+    SqlInsert(&aTestName, &variationMin,    &KMicroSeconds,   TimeMin());
     
     iResultsInitalised = EFalse;
     }
@@ -422,8 +415,8 @@
     
     SqlInsert(&aTestName, &variation,       &KPixelsPerSecond,  pixelRate);
     SqlInsert(&aTestName, &variation,       &KFrameRate,        frameRate);
-    SqlInsert(&aTestName, &variationMax,    &KPixelsPerSecond,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,    &KPixelsPerSecond,  TimeMin());
+    SqlInsert(&aTestName, &variationMax,    &KMicroSeconds,     TimeMax());
+    SqlInsert(&aTestName, &variationMin,    &KMicroSeconds,     TimeMin());
 
     iResultsInitalised = EFalse;
     }
@@ -455,8 +448,8 @@
     
     SqlInsert(&aTestName, &variation,       &KPixelsPerSecond,  pixelRate);
     SqlInsert(&aTestName, &variation,       &KFrameRate,        frameRate);
-    SqlInsert(&aTestName, &variationMax,    &KPixelsPerSecond,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,    &KPixelsPerSecond,  TimeMin());
+    SqlInsert(&aTestName, &variationMax,    &KMicroSeconds,     TimeMax());
+    SqlInsert(&aTestName, &variationMin,    &KMicroSeconds,     TimeMin());
     
     iResultsInitalised = EFalse;
     }
@@ -487,8 +480,8 @@
     
     SqlInsert(&aTestName, &variation,       &KPixelsPerSecond,  pixelRate);
     SqlInsert(&aTestName, &variation,       &KFrameRate,        frameRate);
-    SqlInsert(&aTestName, &variationMax,    &KPixelsPerSecond,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,    &KPixelsPerSecond,  TimeMin());
+    SqlInsert(&aTestName, &variationMax,    &KMicroSeconds,     TimeMax());
+    SqlInsert(&aTestName, &variationMin,    &KMicroSeconds,     TimeMin());
     
     iResultsInitalised = EFalse;
     }
@@ -530,9 +523,9 @@
     TBuf<128> variationMin;   
     variationMin.Format(KMinTime, &variation);
  
-    SqlInsert(&aTestName, &variationMean, &KMicroSeconds,     Mean());
-    SqlInsert(&aTestName, &variationMax,  &KPixelsPerSecond,  TimeMax());
-    SqlInsert(&aTestName, &variationMin,  &KPixelsPerSecond,  TimeMin());
+    SqlInsert(&aTestName, &variationMean, &KMicroSeconds,  Mean());
+    SqlInsert(&aTestName, &variationMax,  &KMicroSeconds,  TimeMax());
+    SqlInsert(&aTestName, &variationMin,  &KMicroSeconds,  TimeMin());
     
     iResultsInitalised = EFalse;
     }
@@ -555,3 +548,36 @@
     {
     iStoreResultInTimingOrder = aStoreResultInTimingOrder;
     }
+
+/**
+Reports analysis results for glyph rates
+
+@param aTestName is the name of the test case
+@param aRotation is the screen rotation being used in the test
+@param aSrcScreenMode is the source screen mode being used, 
+i.e. for bitmap display conversion the source and destinations bitmaps maybe different
+@param aDstScreenMode is the destination screen mode (usually the display screen mode)
+@param aIters is the number of iterations used in the test
+@param aNumGlyphs is the number of glyphs used per iteration
+*/
+
+EXPORT_C void CTProfiler::ResultsAnalysisGlyphRate(const TDesC & aTestName, TInt aRotation, TInt aSrcScreenMode, TInt aDstScreenMode, TInt aIters, TInt aNumGlyphsPerIteration)
+    {
+    PROFILER_TEST(iResultsInitalised);
+    TReal time = (iResults.Count() > 0) ? (TReal)iResults[0] / 1000000 : 0;
+    TInt32 glyphRate = aNumGlyphsPerIteration*aIters/time;
+
+    TBuf<128> variation;
+    variation.Format(KVariationCPI, aRotation, aSrcScreenMode, aDstScreenMode, aIters, aNumGlyphsPerIteration);
+    TBuf<128> variationMax;
+    variationMax.Format(KMaxTime, &variation);
+    TBuf<128> variationMin;
+    variationMin.Format(KMinTime, &variation);
+
+    SqlInsert(&aTestName, &variation,       &KGlyphRate,  glyphRate);
+    SqlInsert(&aTestName, &variationMax,    &KMicroSeconds,  TimeMax());
+    SqlInsert(&aTestName, &variationMin,    &KMicroSeconds,  TimeMin());
+
+    iResultsInitalised = EFalse;
+    }
+
Binary file graphicstest/graphicstestharness/wsini/wsini_naviengine.ini has changed
Binary file graphicstest/graphicstestharness/wsini/wsini_vasco.ini has changed
--- a/graphicstest/uibench/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -29,6 +29,7 @@
 
 ../scripts/te_uibench_gce.script		z:/uibench/te_uibench_gce.script
 ../scripts/te_uibench_gce.ini			z:/uibench/te_uibench_gce.ini
+
 ../scripts/mysql.pm						z:/uibench/mysql.pm
 ../scripts/uploadsqlfromtestrun.pl		z:/uibench/uploadsqlfromtestrun.pl
 ../scripts/te_uibench_legacy.bat		z:/uibench/te_uibench_legacy.bat
--- a/graphicstest/uibench/group/te_uibench.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/group/te_uibench.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -19,6 +19,12 @@
 #include <internaltestfonts.iby>
 #include <testexecute.iby>
 #include <graphics_tprofiler.iby>
+#include <graphics_testfontutils.iby>
+
+REM egl and openvg needed for tfbsglyphdata tests
+#include <egl.iby>
+#include <openvg.iby>
+
 #ifndef SMP
 // MCL profiler is not built for SMP
 #include <profiler.iby>
@@ -26,7 +32,6 @@
 #ifdef SYMBIAN_GRAPHICS_USE_GCE
 #include <directgdi.iby>
 #include <directgdiadapter.iby>
-#include <t_halattprovider.iby>
 #endif
 
 file=ABI_DIR\DEBUG_DIR\te_uibench.exe	System\bin\te_uibench.exe
@@ -41,7 +46,6 @@
 #endif
 data=DATAZ_\uibench\te_uibench.ini	uibench\te_uibench.ini
 
-
 data=DATAZ_\uibench\te_uibench_gdi.ini	uibench\te_uibench_gdi.ini
 data=DATAZ_\uibench\te_uibench_gdi.script uibench\te_uibench_gdi.script
 
--- a/graphicstest/uibench/group/te_uibench.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/group/te_uibench.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -42,6 +42,8 @@
 SOURCE  ttranslucent.cpp
 SOURCE	tspriteperf.cpp
 SOURCE	textendedbitmap.cpp
+SOURCE  tfbsglyphdata.cpp
+SOURCE	trenderorientation.cpp
 
 USERINCLUDE   ../src
 USERINCLUDE   ../../../fbs/fontandbitmapserver/inc
@@ -66,6 +68,12 @@
 LIBRARY		estor.lib
 LIBRARY	    	tgraphicsharness.lib
 LIBRARY	    	tprofiler.lib
+LIBRARY		tgraphicsfontutils.lib
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+LIBRARY		sgresource.lib
+LIBRARY		libEGL.lib
+LIBRARY		libOpenVG.lib
+#endif
 
 START BITMAP	16x16icon.mbm
 TARGETPATH		/system/data/
--- a/graphicstest/uibench/group/te_uibench_gce.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/group/te_uibench_gce.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -31,9 +31,9 @@
 SOURCE	tsimpledrawing_directgdi.cpp
 SOURCE	teventhandlingperf.cpp
 SOURCE  tflipframerate.cpp
+SOURCE	trenderorientation.cpp
 
 USERINCLUDE   ../src
-USERINCLUDE   ../../../fbs/fontandbitmapserver/inc
 
 //system includes
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/group/te_uibench_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,38 @@
+; Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of "Eclipse Public License v1.0"
+; which accompanies this distribution, and is available
+; at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;
+; Initial Contributors:
+; Nokia Corporation - initial contribution.
+;
+; Contributors:
+;
+; Description: 
+;
+;File: bitgdi.pkg;
+;
+;*Languages
+&EN
+;
+;*Standard SIS file header. This section specifies the package name,
+;application UID, and version/build numbers. Add the package TYPE here if needed.
+#{"UIBench"},(0x101FB3E8),1,0,1;
+;
+
+;*Unique (Non-Localized) Vendor name
+;This is used in combination with signing to prevent the unauthroized
+;upgrade of a a package by someone other than the rightful vendor.
+:"Nokia"
+
+;*Localized Vendor Name
+;This specifies the localized vendor name(s) corresponding to language(s).
+%{"Nokia Test EN"}
+
+;*Files To Copy...<src> <destination>
+
+"\epoc32\data\z\uibench\te_uibench_gce.script"-"c:\uibench\te_uibench.script"
+"\epoc32\data\z\uibench\te_uibenchoutlineshadow.script"-"c:\uibench\te_uibenchoutlineshadow.script"
+
--- a/graphicstest/uibench/s60/group/te_uibench_s60.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/s60/group/te_uibench_s60.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -121,7 +121,7 @@
 LIBRARY     libGLESv1_CM.lib
 LIBRARY	    libopenvgu.lib
 LIBRARY	    libopenvg.lib
-LIBRARY     egltesthybrid.lib
+// this shouldn't be needed LIBRARY     egltesthybrid.lib
 LIBRARY     surfacemanager.lib
 LIBRARY     tgraphicsharness.lib
 LIBRARY     tprofiler.lib
Binary file graphicstest/uibench/scripts/te_uibench.ini has changed
--- a/graphicstest/uibench/scripts/te_uibench.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/scripts/te_uibench.script	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -21,12 +21,12 @@
 
 RUN_UTILS MkDir c:\uibench_sanity\
 RUN_UTILS MakeReadWrite c:\uibench_sanity\
-RUN_UTILS MkDir e:\uibench_sanity\
-RUN_UTILS MakeReadWrite e:\uibench_sanity\
+RUN_UTILS MkDir f:\uibench_sanity\
+RUN_UTILS MakeReadWrite f:\uibench_sanity\
 RUN_UTILS MkDir c:\Profiles\
 RUN_UTILS MakeReadWrite c:\Profiles\
-RUN_UTILS MkDir e:\Profiles\
-RUN_UTILS MakeReadWrite e:\Profiles\
+RUN_UTILS MkDir f:\Profiles\
+RUN_UTILS MakeReadWrite f:\Profiles\
 
 RUN_TEST_STEP 4000 te_uibench tscaleddrawbitmap	z:\uibench\te_uibench.ini
 RUN_TEST_STEP 100 te_uibench tfbsbitmaphandleperf z:\uibench\te_uibench.ini
@@ -41,11 +41,12 @@
 RUN_TEST_STEP 1000 te_uibench tsimpledrawing z:\uibench\te_uibench.ini
 RUN_TEST_STEP 200 te_uibench TRedrawing z:\uibench\te_uibench.ini
 RUN_TEST_STEP 1000 te_uibench tnonredrawdrawing z:\uibench\te_uibench.ini
-RUN_TEST_STEP 20000 te_uibench tfadeperf z:\uibench\te_uibench.ini
-RUN_TEST_STEP 10000 te_uibench tredrawstoreperf z:\uibench\te_uibench.ini
+//RUN_TEST_STEP 20000 te_uibench tfadeperf z:\uibench\te_uibench.ini - disabled due to massive run time & timeout
+//RUN_TEST_STEP 10000 te_uibench tredrawstoreperf z:\uibench\te_uibench.ini - disabled due to massive run time & timeout
 RUN_TEST_STEP 1000 te_uibench ttranslucent z:\uibench\te_uibench.ini
 RUN_TEST_STEP 200 te_uibench tspriteperf z:\uibench\te_uibench.ini
 RUN_TEST_STEP 1000 te_uibench textendedbitmap z:\uibench\te_uibench.ini
+RUN_TEST_STEP 2000 te_uibench tfbsglyphdata z:\uibench\te_uibench.ini
 
 // Performance tests Script  for Hindi text rendering
 RUN_SCRIPT z:\uibench\te_uibench_gdi.script
Binary file graphicstest/uibench/scripts/te_uibench_gce.ini has changed
--- a/graphicstest/uibench/scripts/te_uibench_gce.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/scripts/te_uibench_gce.script	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -22,12 +22,12 @@
 
 RUN_UTILS MkDir c:\Profiles\
 RUN_UTILS MakeReadWrite c:\Profiles\
-RUN_UTILS MkDir e:\Profiles\
-RUN_UTILS MakeReadWrite e:\Profiles\
+RUN_UTILS MkDir f:\Profiles\
+RUN_UTILS MakeReadWrite f:\Profiles\
 RUN_UTILS MkDir c:\uibench_sanity\
 RUN_UTILS MakeReadWrite c:\uibench_sanity\
-RUN_UTILS MkDir e:\uibench_sanity\
-RUN_UTILS MakeReadWrite e:\uibench_sanity\
+RUN_UTILS MkDir f:\uibench_sanity\
+RUN_UTILS MakeReadWrite f:\uibench_sanity\
 
 RUN_TEST_STEP 4000 te_uibench tscaleddrawbitmap	z:\uibench\te_uibench.ini
 RUN_TEST_STEP 100 te_uibench tfbsbitmaphandleperf z:\uibench\te_uibench.ini
@@ -42,11 +42,12 @@
 RUN_TEST_STEP 1000 te_uibench tsimpledrawing z:\uibench\te_uibench.ini
 RUN_TEST_STEP 100 te_uibench TRedrawing z:\uibench\te_uibench.ini
 RUN_TEST_STEP 1000 te_uibench tnonredrawdrawing z:\uibench\te_uibench.ini
-RUN_TEST_STEP 20000 te_uibench tfadeperf z:\uibench\te_uibench.ini
-RUN_TEST_STEP 10000 te_uibench tredrawstoreperf z:\uibench\te_uibench.ini
+//RUN_TEST_STEP 20000 te_uibench tfadeperf z:\uibench\te_uibench.ini - disabled due to massive run time & timeout
+//RUN_TEST_STEP 10000 te_uibench tredrawstoreperf z:\uibench\te_uibench.ini - disabled due to massive run time & timeout
 RUN_TEST_STEP 1000 te_uibench ttranslucent z:\uibench\te_uibench.ini
 RUN_TEST_STEP 200 te_uibench tspriteperf z:\uibench\te_uibench.ini
 RUN_TEST_STEP 1000 te_uibench textendedbitmap z:\uibench\te_uibench.ini
+RUN_TEST_STEP 2000 te_uibench tfbsglyphdata z:\uibench\te_uibench.ini
 
 // Performance tests Script  for Hindi text rendering
 RUN_SCRIPT z:\uibench\te_uibench_gdi.script
@@ -61,7 +62,8 @@
 RUN_TEST_STEP !Heap=0x400000 4000 te_uibench_gce tbitbltperf_directgdi z:\uibench\te_uibench_gce.ini
 RUN_TEST_STEP 1000 te_uibench_gce TDirectGdiPerfTest z:\uibench\te_uibench_gce.ini
 RUN_TEST_STEP 4000 te_uibench_gce tsimpledrawing_directgdi z:\uibench\te_uibench_gce.ini
-RUN_TEST_STEP 1000 te_uibench_gce teventhandlingperf z:\uibench\te_uibench_gce.ini
+//RUN_TEST_STEP 1000 te_uibench_gce teventhandlingperf z:\uibench\te_uibench_gce.ini - disabled due to timeout - expects manual input
 RUN_TEST_STEP 20000 te_uibench_gce tflipframerate z:\uibench\te_uibench_gce.ini
+RUN_TEST_STEP 4000 te_uibench_gce trenderorientation z:\uibench\te_uibench_gce.ini
 
 PRINT Complete_te_uibench_gce_Tests
--- a/graphicstest/uibench/src/te_graphicsperformanceSuiteDefs.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/src/te_graphicsperformanceSuiteDefs.h	Wed Aug 18 11:05:09 2010 +0300
@@ -54,6 +54,17 @@
 	testBooleanTrueWithErrorCodeL((c), (b), (TText8*)__FILE__, __LINE__);\
 	}
 
+// Redefine TEST/TESTE as TEST1/TESTE1 so that all errors are logged, not
+// just the first error.
+#ifdef TEST
+#undef TEST
+#define TEST(a) TEST1(a, ETrue)
+#endif // TEST
+
+#ifdef TESTE
+#undef TESTE
+#define TESTE(a, b) TESTE1(a, b, ETrue)
+#endif // TESTE
 
 #ifdef _USE_PROFILER
 	#define __PROFILERMEMBERS RProcess iProcess; TInt iPErr; RFs iFSession; TBuf<256> iProfLog; TBuf<256> iProfLoE; CFileMan* iFileMan; 
--- a/graphicstest/uibench/src/te_graphicsperformanceSuiteServer.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/src/te_graphicsperformanceSuiteServer.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -40,6 +40,7 @@
 #include "ttranslucent.h"
 #include "tspriteperf.h"
 #include "textendedbitmap.h"
+#include "tfbsglyphdata.h"
 
 /**
 Same code for Secure and non-secure variants
@@ -158,5 +159,7 @@
 		testStep = new CTSpritePerf();
 	else if(aStepName == KTExtendedBitmap)
 		testStep = new CTExtendedBitmap();
+	else if(aStepName == KTFbsGlyphData)
+		testStep = new CTFbsGlyphData();
 	return testStep;
 	}
--- a/graphicstest/uibench/src/tfbsfonthandleperf.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/src/tfbsfonthandleperf.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -268,7 +268,7 @@
 TVerdict CTFbsFontHandlePerf::doTestStepPreambleL()
 	{
 	CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
-	SetScreenModeL(EColor16MU);
+	SetScreenModeL(EColor16MAP);
 	iDevice = &iScreenDevice->BitmapDevice();
 	return TestStepResult();
 	}
@@ -310,7 +310,7 @@
 		}
 	else
 		{
-		TEST(ret == KErrNone);
+		TEST((ret == KErrNone) || (ret == KErrAlreadyExists));
 
 		_LIT(KLinkedTypefaceHindi,"HindiLinked");
 		typefaceSpec = CLinkedTypefaceSpecification::NewLC(KLinkedTypefaceHindi);
@@ -327,14 +327,15 @@
 		ts = CFbsTypefaceStore::NewL(iDevice);
 		CleanupStack::PushL(ts);
 		ret = ts->RegisterLinkedTypeface(*typefaceSpec);
-		TEST(ret == KErrNone);
+		TEST((ret == KErrNone) || (ret == KErrAlreadyExists));
 		CleanupStack::PopAndDestroy(2, typefaceSpec);
 		
 		//register a linked typeface with four fonts.
         _LIT(KFourLinked,"FourBitmapLinked");
         _LIT(KLinkedTypeFace1, "DejaVu Sans Condensed");
         _LIT(KLinkedTypeFace2, "Devanagari OT Eval");
-        _LIT(KLinkedTypeFace3, "TBKomachiG-R");
+        //_LIT(KLinkedTypeFace3, "TBKomachiG-R"); // This font is not included in uibench roms.
+		_LIT(KLinkedTypeFace3, "DejaVu Sans Mono");
         _LIT(KLinkedTypeFace4, "DejaVu Serif Condensed");
 
 		typefaceSpec = CLinkedTypefaceSpecification::NewLC(KFourLinked);
@@ -343,7 +344,7 @@
 		typefaceSpec->AddLinkedTypefaceGroupL(*group1);
 		CleanupStack::Pop(group1);
 		
-		const TInt KGroup2Id = 4;	
+		const TInt KGroup2Id = 3;	
 		CLinkedTypefaceGroup* group2 = CLinkedTypefaceGroup::NewLC(KGroup2Id);
 		typefaceSpec->AddLinkedTypefaceGroupL(*group2);
 		CleanupStack::Pop(group2);
@@ -373,7 +374,7 @@
 		ts = CFbsTypefaceStore::NewL(iDevice);
 		CleanupStack::PushL(ts);
 		ret = ts->RegisterLinkedTypeface(*typefaceSpec);
-		TEST(ret == KErrNone);
+		TEST((ret == KErrNone) || (ret == KErrAlreadyExists));
 		CleanupStack::PopAndDestroy(2, typefaceSpec);
 		
 		_LIT(KOneLinked,"OneLinked");
@@ -391,9 +392,7 @@
 		ts = CFbsTypefaceStore::NewL(iDevice);
 		CleanupStack::PushL(ts);
 		TRAP(ret, typefaceSpec->RegisterLinkedTypefaceL(*ts));
-		TEST(ret == KErrNone);
-		
-		TEST(typefaceSpec->RemoveTypeface(3) == KErrNone);
+		TEST((ret == KErrNone) || (ret == KErrAlreadyExists));
 		
 		TRAP(ret, typefaceSpec->UpdateLinkedTypefaceL(*ts));
 		
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/tfbsglyphdata.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,996 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code 
+*/
+
+#include <test/graphicsfontutils.h>
+#include <graphics/fbsglyphdataiterator.h>
+#include <graphics/fbsglyphmetricsarray.h>
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#include <sgresource/sgimage.h>
+#include <egl/egl.h>
+#include <vg/openvg.h>
+typedef EGLBoolean (*TvgCreateEGLImageTargetKHRTypefPtr) (VGeglImageKHR image);
+#endif
+#include "tfbsglyphdata.h"
+
+// Size of EGLSurface used for rendering to, in pixels.
+const TSize KEglTargetSize(512, 512);
+
+CTFbsGlyphData::CTFbsGlyphData()
+	{
+	SetTestStepName(KTFbsGlyphData);
+	}
+
+CTFbsGlyphData::~CTFbsGlyphData()
+	{
+	}
+
+TVerdict CTFbsGlyphData::doTestStepPreambleL()
+    {
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+    User::LeaveIfError(iFbs.Connect());
+	User::LeaveIfError(iSgDriver.Open());
+#endif
+	iCharCodeConverter = CCharCodeConverter::NewL();
+    return CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
+    }
+
+TVerdict CTFbsGlyphData::doTestStepPostambleL()
+    {
+    delete iCharCodeConverter;
+    iCharCodeConverter = NULL;
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+    iSgDriver.Close();
+    iFbs.Disconnect();
+#endif
+    return CTe_graphicsperformanceSuiteStepBase::doTestStepPostambleL();
+    }
+
+TVerdict CTFbsGlyphData::doTestStepL()
+	{
+#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+    INFO_PRINTF1(_L("CTFbsGlyphData can only be run with SgImage 'Lite'"));
+    return TestStepResult();
+#else
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0178"));
+	GlyphMetricsArrayL(ETestLanguageLatin, ETrue, 1000);
+	RecordTestResultL();
+
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0179"));
+	GlyphMetricsArrayL(ETestLanguageLatin, EFalse, 50000);
+	RecordTestResultL();
+	
+    // Tests 180 and 181 require a CMap table in order to convert CharacterCodes to GlyphCodes.
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0180"));
+	GlyphMetricsArrayL(ETestLanguageHindi, ETrue, 25);
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0181"));
+	GlyphMetricsArrayL(ETestLanguageHindi, EFalse, 50000);
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0182"));
+	GlyphMetricsQuerySingleGlyphL();
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0183"));
+	GlyphDataIteratorOpenL(ETestLanguageLatin, ETrue, 50);
+	RecordTestResultL();
+
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0184"));
+	GlyphDataIteratorOpenL(ETestLanguageLatin, EFalse, 500);
+	RecordTestResultL();
+	
+    // Tests 185 and 186 require a CMap table in order to convert CharacterCodes to GlyphCodes.
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0185"));
+	GlyphDataIteratorOpenL(ETestLanguageHindi, ETrue, 10);
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0186"));
+	GlyphDataIteratorOpenL(ETestLanguageHindi, EFalse, 5000);
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0187"));
+	GlyphDataIteratorOpenSingleFontL();
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0188"));
+	GlyphMetricsQueryUnrasterizedL();
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0189"));
+	GlyphMetricsQueryPreRasterizedL();
+	RecordTestResultL();
+	
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0190"));
+	GlyphRenderingL();
+	RecordTestResultL();
+
+	return TestStepResult();
+#endif
+    }
+
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0178...0181
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the performance of calling RFbsGlyphMetricsArray::Get() with different sample data.
+The sample data can be a single word, or a very long array of glyphs, in latin or non-latin
+alphabets. At each repetition a different font is used, cycled over nine fonts, to reduce the
+effect of having cached glyphs.
+
+@SYMTestActions
+i. Create some sample fonts to cycle through. 
+ii. Load sample data from config file, specified by aSampleDataKey.
+iii. Create RFbsGlyphMetricsArray, open on sample data.
+iv. For each repetition, call RFbsGlyphMetricsArray::Get(), adjusting font at each repetition.
+v. Measure time from from first to last repetition.
+
+@param aLanguage The language this test will use.
+@param aLongData If ETrue, tells the test to use the long sample data string for the test, EFalse
+	will make the test use the short string data.
+@param aReps The number of times to repeat the test.
+*/
+void CTFbsGlyphData::GlyphMetricsArrayL(TTestLanguage aLanguage, TBool aLongData, TInt aReps)
+	{
+	TBuf<128> KTestName;
+	TPtrC KTestVariant = ConfigKeyNameL(aLanguage, aLongData);
+	KTestName.Format(_L("GlyphMetricsArray %S"), &KTestVariant);
+	
+	// Create some test fonts using the font factory.
+	CTFontFactory* fontFactory = CTFontFactory::NewLC();
+	fontFactory->CreateFontsL(aLanguage, 9);
+
+	// Load the sample string data from the config file.
+	TInt numGlyphCodes = 0;
+	TUint* glyphCodes;
+	LoadConfigSampleDataL(fontFactory->NextFont(), aLanguage, aLongData, glyphCodes, numGlyphCodes);
+
+	// Run the test.
+	TInt err = KErrNone;
+	RFbsGlyphMetricsArray array;
+	CleanupClosePushL(array);
+	iProfiler->InitResults();
+	for (TInt rep = aReps; (rep != 0) && (err == KErrNone); --rep)
+		{
+		err = array.Get(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
+		}
+	iProfiler->MarkResultSetL();
+	TESTE(err == KErrNone, err);
+	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, aReps, numGlyphCodes);
+	
+	CleanupStack::PopAndDestroy(2); // array, fontFactory
+	delete [] glyphCodes;
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0182
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the performance of calling RFbsGlyphDataIterator::Get() with a single glyph,
+versus CFont::GetCharacterData(). Using a single glyph code is a very common use case.
+The glyph and the font is changed at each iteration.
+
+@SYMTestActions
+i. Create some sample fonts to cycle through. 
+ii. Create RFbsGlyphMetricsArray.
+iii. For each repetition, call RFbsGlyphMetricsArray::Get(), adjusting the glyph at 
+	each iteration.
+iv. Measure time from from first to last iteration.
+v. Repeat steps iii. and iv. with CFont::GetCharacterData().
+*/
+void CTFbsGlyphData::GlyphMetricsQuerySingleGlyphL()
+	{
+	_LIT(KTestName, "GlyphMetricsQuerySingleGlyph");
+	const TInt KNumIterations = 50000;
+	TInt err = KErrNone;
+	TBuf<128> KTestNameVariant;
+
+	// Create some test fonts using the font factory.
+	CTFontFactory* fontFactory = CTFontFactory::NewLC();
+	
+	// Run the test for RFbsGlyphMetricsArray, with a different character 
+	// and font for each iteration.
+	KTestNameVariant.Format(_L("%S RFbsGlyphMetricsArray"), &KTestName);
+	fontFactory->CreateFontsL(ETestLanguageLatin, 9);
+	RFbsGlyphMetricsArray array;
+	CleanupClosePushL(array);
+	iProfiler->InitResults();
+	for (TInt rep = KNumIterations; rep != 0 && (err == KErrNone); --rep)
+		{
+		const TUint KGlyphCode = 32 + (rep % 96);
+		err = array.Get(*(fontFactory->NextFont()), &KGlyphCode, 1);
+		}
+	iProfiler->MarkResultSetL();
+	TESTE(err == KErrNone, err);
+	CleanupStack::PopAndDestroy(1); // array
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, 1);
+	fontFactory->ReleaseFonts();
+	
+	// Run the test for GetCharacterData(), with a different character
+	// and font for each iteration.
+	KTestNameVariant.Format(_L("%S GetCharacterData"), &KTestName);
+	fontFactory->CreateFontsL(ETestLanguageLatin, 9);
+	TOpenFontCharMetrics metrics;
+	const TUint8* bitmapData = NULL;
+	TSize bitmapSize;
+	iProfiler->InitResults();
+	for (TInt rep = KNumIterations; rep != 0; --rep)
+		{
+		const TUint KGlyphCode = 32 + (rep % 96);
+		fontFactory->NextFont()->GetCharacterData(KGlyphCode, metrics, bitmapData, bitmapSize);
+		}
+	iProfiler->MarkResultSetL();
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, 1);
+	
+	CleanupStack::PopAndDestroy(1); // fontFactory
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0183...0186
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the performance of calling RFbsGlyphDataIterator::Open() with different 
+sample data, and iterating through the data with RFbsGlyphDataIterator::Next(). 
+The sample data can be a single word, or a very long array of glyphs,
+in various languages. At each repetition a different font is used, cycled
+over nine fonts.
+
+@SYMTestActions
+i. Create some sample fonts to cycle through. 
+ii. Create RFbsGlyphDataIterator.
+iii. For each repetition, call RFbsGlyphDataIterator::Open(), adjusting the glyph at each 
+	iteration. The font is changed at each repetition.
+iv. Measure time from from first to last repetition.
+
+@param aLanguage The language this test will use.
+@param aLongData If ETrue, tells the test to use the long sample data string for the test, EFalse
+	will make the test use the short string data.
+@param aReps The number of times to repeat the test.
+ */
+void CTFbsGlyphData::GlyphDataIteratorOpenL(TTestLanguage aLanguage, TBool aLongData, TInt aReps)
+	{
+	TBuf<128> KTestName;
+	TPtrC KTestVariant = ConfigKeyNameL(aLanguage, aLongData);
+	KTestName.Format(_L("GlyphDataIteratorOpen %S"), &KTestVariant);
+	
+	// Create some test fonts using the font factory.
+	CTFontFactory* fontFactory = CTFontFactory::NewLC();
+	fontFactory->CreateFontsL(aLanguage, 9);
+	
+	// Load the sample string data from the config file.
+	TInt numGlyphCodes = 0;
+	TUint* glyphCodes;
+	LoadConfigSampleDataL(fontFactory->NextFont(), aLanguage, aLongData, glyphCodes, numGlyphCodes);
+
+	// Run the test.
+	TInt err = KErrNotFound;
+	RFbsGlyphDataIterator iter;
+	CleanupClosePushL(iter);
+	iProfiler->InitResults();
+	for (TInt rep = aReps; (rep != 0) && (err == KErrNotFound); --rep)
+		{
+		err = iter.Open(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
+		for (; err == KErrNone; err = iter.Next())
+			{
+			// no operation
+			}
+		iter.Close();
+		}
+	iProfiler->MarkResultSetL();
+	TESTE(err == KErrNotFound, err);
+
+	CleanupStack::PopAndDestroy(2); // iter, fontFactory
+	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, aReps, numGlyphCodes);
+	delete [] glyphCodes;
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0187
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the performance of calling RFbsGlyphDataIterator::Open() with different 
+lengthed arrays but the same font. The sample data is a long array of characters.
+
+@SYMTestActions
+i. Create a single test font 
+ii. Create RFbsGlyphDataIterator.
+iii. Pass an array to RFbsGlyphDataIterator::Open(), starting with a single glyph.
+	For each iteration, increase the length of the array by one until the entire
+	string has been opened.
+iv. Measure the time to perform all the iterations.
+
+@param aSampleDataKey The string key to lookup under the GlyphArraySampleText section of the 
+	config file where the sample data is read.
+@param aReps The number of times to repeat the test.
+ */
+void CTFbsGlyphData::GlyphDataIteratorOpenSingleFontL()
+	{
+	_LIT(KTestName, "GlyphDataIteratorOpenSingleFont");
+	// A cap on the max number of iterations to complete.
+	const TInt KMaxNumIterations = 200;
+    const TTestLanguage KTestLanguage = ETestLanguageHindi;
+	
+	// Create some test fonts using the font factory.
+	CTFontFactory* fontFactory = CTFontFactory::NewLC();
+	fontFactory->CreateFontsL(KTestLanguage, 1);
+	CFbsFont* font = fontFactory->NextFont();
+	
+	// Load the sample string data from the config file.
+	TInt numGlyphCodes = 0;
+	TUint* glyphCodes;
+	LoadConfigSampleDataL(font, KTestLanguage, ETrue, glyphCodes, numGlyphCodes); 
+	
+	const TInt KNumRepetitions = Min<TInt>(numGlyphCodes - 1, KMaxNumIterations);
+	RFbsGlyphDataIterator iter;
+	CleanupClosePushL(iter);
+	TInt iterErr = KErrNone;
+	TInt glyphCount = 0;
+	iProfiler->InitResults();
+	for (glyphCount = 1; (glyphCount < KNumRepetitions); ++glyphCount)
+		{
+		iterErr = iter.Open(*font, glyphCodes, glyphCount);
+		for (; iterErr == KErrNone; iterErr = iter.Next())
+			{
+			// no operation
+			}
+		iter.Close();
+		}
+	iProfiler->MarkResultSetL();
+	TEST(glyphCount == KNumRepetitions);
+	TESTE(iterErr == KErrNotFound, iterErr);
+	
+	const TInt KAvgNumCharsPerIteration = KNumRepetitions/2;
+	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, KNumRepetitions, KAvgNumCharsPerIteration);
+	
+	CleanupStack::PopAndDestroy(2); // iter, fontFactory
+	delete [] glyphCodes;
+	}
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0188
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the performance of querying the TOpenFontCharMetrics using the different
+available APIs. RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData()
+are compared against each other, using the same fonts, and same sample data.
+This test uses glyphs that have not been rasterized before, therefore for certain
+APIs this will mean rasterizing the glyphs.
+
+@SYMTestActions
+i. Load sample text data from config file.
+ii. For each of RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData():
+	1. Create 50 new fonts.
+	2. Run the test, calling the necessary API once per font/loop.
+	3. For GetCharacterData() and RFbsGlyphDataIterator(), cycle through each glyph
+		to ensure all metrics have been retrieved. This is not necessary for 
+		RFbsGlyphMetricsArray.
+	4. Measure time between first and last font/loop.
+	5. Destroy test fonts so that next test has to re-rasterize the glyphs.	
+
+@SYMTestExpectedResults
+Since this test uses non-rasterized fonts, RFbsGlyphMetricsArray should be faster than
+GetCharacterData() and RFbsGlyphDataIterator, which both rasterize the glyphs in order to 
+get their metrics information.
+ */
+void CTFbsGlyphData::GlyphMetricsQueryUnrasterizedL()
+	{
+	_LIT(KTestName, "GlyphMetricsQueryUnrasterized");
+	
+	TBuf<128> KTestNameVariant;
+	// First do the test for the iterator. To ensure fair comparison with
+    // RFbsGlyphMetricsArray, cycle through each iteration to ensure the metrics
+    // for each glyph is found.
+    KTestNameVariant.Format(_L("%S RFbsGlyphDataIterator"), &KTestName);
+    
+	const TInt KNumFonts = 50;
+	const TTestLanguage KTestLanguage = ETestLanguageLatin;
+	
+	// Create some test fonts using the font factory.
+	CTFontFactory* fontFactory = CTFontFactory::NewLC();
+    fontFactory->CreateFontsL(KTestLanguage, KNumFonts);
+	    
+	// Load the sample string data from the config file. Both the iterator and the
+	// array will use this same sample data.
+	TInt numGlyphCodes = 0;
+	TUint* glyphCodes;
+	LoadConfigSampleDataL(fontFactory->NextFont(), KTestLanguage, ETrue, glyphCodes, numGlyphCodes); 
+	
+	RFbsGlyphDataIterator iter;
+	CleanupClosePushL(iter);
+	TInt iterErr = KErrNone;
+	TInt rep = 0;
+	iProfiler->InitResults();
+	for (rep = KNumFonts; (rep != 0); --rep)
+		{
+		iterErr = iter.Open(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
+		for (; iterErr == KErrNone; iterErr = iter.Next())
+			{
+			// no operation
+			}
+		iter.Close();
+		}
+	iProfiler->MarkResultSetL();
+	TEST(rep == 0);
+	TESTE(iterErr == KErrNotFound, iterErr);
+	CleanupStack::PopAndDestroy(1); // iter		
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumFonts, numGlyphCodes);
+	
+	// Second, do the test for the array. This should be faster.
+	// Destroy the fonts and re-create them so that they have to be re-rasterized
+	// for a fair comparison.
+	TInt arrayErr = KErrNone;
+	KTestNameVariant.Format(_L("%S RFbsGlyphMetricsArray"), &KTestName);
+	fontFactory->ReleaseFonts();
+	fontFactory->CreateFontsL(KTestLanguage, KNumFonts);
+	RFbsGlyphMetricsArray array;
+	CleanupClosePushL(array);
+	iProfiler->InitResults();	
+	for (TInt rep = KNumFonts; (rep != 0) && (arrayErr == KErrNone); --rep)
+		{
+		arrayErr = array.Get(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
+		}
+	iProfiler->MarkResultSetL();
+	CleanupStack::PopAndDestroy(1); // array
+	TEST(rep == 0);
+	TESTE(arrayErr == KErrNone, arrayErr);
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumFonts, numGlyphCodes);
+	
+	// Third, do the test using GetCharacterData() to get the metrics.
+	// Destroy the fonts and re-create them so that they have to be re-rasterized
+	// for a fair comparison.
+	KTestNameVariant.Format(_L("%S GetCharacterData"), &KTestName);
+	fontFactory->ReleaseFonts();
+	fontFactory->CreateFontsL(KTestLanguage, KNumFonts);	
+	iProfiler->InitResults();
+	const TUint8* bitmapData = NULL;
+	TSize bitmapSize;
+	TOpenFontCharMetrics metrics;	
+	for (TInt rep = KNumFonts; (rep != 0); --rep)
+		{
+		CFbsFont* font = fontFactory->NextFont(); 
+		for (TInt glyphIndex = 0; glyphIndex < numGlyphCodes; glyphIndex++)
+			{
+			font->GetCharacterData(glyphCodes[glyphIndex], metrics, bitmapData, bitmapSize);
+			}
+		}
+	iProfiler->MarkResultSetL();
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumFonts, numGlyphCodes);
+	
+	CleanupStack::PopAndDestroy(1); // fontFactory
+	delete [] glyphCodes;
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0189
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the performance of querying the TOpenFontCharMetrics using the different
+available APIs. RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData()
+are compared against each other, using the same fonts, and same sample data.
+This test uses glyphs that have already been rasterized, thereby possibly reducing the 
+extra overhead this has.
+
+@SYMTestActions
+i. Load sample text data from config file.
+ii. Create test font.
+iii. Pre-rasterize glyphs using RFbsGlyphDataIterator. This will rasterize the glyphs 
+	and cause them to be cached for use by all the APIs tested here.
+iv. For each of RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData():
+	1. Begin the loop, calling the necessary API once per font/loop.
+	2. For each glyph, request the glyph metrics.
+	3. Measure time between first and last font/loop.
+v. Destroy test font.
+
+@SYMTestExpectedResults
+All results should be improved over GlyphMetricsQueryUnrasterized (GRAPHICS-UI-BENCH-0187).
+since no rasterizing should take place during these tests.
+ */
+void CTFbsGlyphData::GlyphMetricsQueryPreRasterizedL()
+	{
+	_LIT(KTestName, "GlyphMetricsQueryPreRasterized");
+	TBuf<128> KTestNameVariant;
+	const TInt KNumIterations = 500;
+	const TTestLanguage KTestLanguage = ETestLanguageLatin;
+
+	// Create a test font using the font factory.
+    CTFontFactory* fontFactory = CTFontFactory::NewLC();
+    fontFactory->CreateFontsL(ETestLanguageLatin, 1);   
+    CFbsFont* font = fontFactory->NextFont();
+	    
+    TInt numGlyphCodes = 0;
+	TUint* glyphCodes;
+	LoadConfigSampleDataL(font, KTestLanguage, ETrue, glyphCodes, numGlyphCodes); 
+	
+	TInt iterErr = KErrNone;
+	TInt rep = 0;
+	// Rasterize the glyphs first.
+	RFbsGlyphDataIterator iter;
+	CleanupClosePushL(iter);
+	for (rep = KNumIterations; (rep != 0) ; --rep)
+		{
+		iterErr = iter.Open(*font, glyphCodes, numGlyphCodes);
+		for (; iterErr == KErrNone; iterErr = iter.Next())
+			{
+			// no operation
+			}
+		iter.Close();
+		}
+	TEST(rep == 0);
+	TESTE(iterErr == KErrNotFound, iterErr);
+	
+	TOpenFontCharMetrics metrics;
+		
+	// First do the test for the iterator. To ensure fair comparison with
+	// RFbsGlyphMetricsArray, cycle through each iteration to ensure the metrics
+	// for each glyph is found.
+	iterErr = KErrNone;
+	KTestNameVariant.Format(_L("%S RFbsGlyphDataIterator"), &KTestName);
+	iProfiler->InitResults();
+	for (TInt rep = KNumIterations; (rep != 0); --rep)
+		{
+		for (iterErr = iter.Open(*font, glyphCodes, numGlyphCodes); iterErr == KErrNone; iterErr = iter.Next())
+			{
+			metrics = iter.Metrics();
+			}
+		iter.Close();
+		}
+	iProfiler->MarkResultSetL();
+	TESTE(iterErr == KErrNotFound, iterErr);
+	CleanupStack::PopAndDestroy(1); // iter
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, numGlyphCodes);
+	
+	
+	// Second, do the test for the array. This should be faster.
+	TInt arrayErr = KErrNone;
+	KTestNameVariant.Format(_L("%S RFbsGlyphMetricsArray"), &KTestName);
+	RFbsGlyphMetricsArray array;
+	CleanupClosePushL(array);
+	iProfiler->InitResults();
+	for (TInt rep = KNumIterations; (rep != 0) && (arrayErr == KErrNone); --rep)
+		{
+		arrayErr = array.Get(*font, glyphCodes, numGlyphCodes);
+		for (TInt i = 0; i < numGlyphCodes; ++i)
+			{
+			metrics = array[i];
+			}
+		}
+	iProfiler->MarkResultSetL();
+	TESTE(arrayErr == KErrNone, arrayErr);
+	CleanupStack::PopAndDestroy(1); // array
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, numGlyphCodes);
+	
+	
+	// Third, do the test using GetCharacterData() to get the metrics.
+	KTestNameVariant.Format(_L("%S GetCharacterData"), &KTestName);
+	const TUint8* bitmapData;
+	TSize bitmapSize;
+
+	iProfiler->InitResults();
+	for (TInt rep = KNumIterations; (rep != 0); --rep)
+		{
+		for (TInt glyphIndex = 0; glyphIndex < numGlyphCodes; glyphIndex++)
+			{
+			font->GetCharacterData(glyphCodes[glyphIndex], metrics, bitmapData, bitmapSize);
+			}
+		}
+	iProfiler->MarkResultSetL();
+	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, numGlyphCodes);
+	
+	CleanupStack::PopAndDestroy(1); // fontFactory
+	delete [] glyphCodes;
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0190
+
+@SYMTestType UT
+
+@SYMPREQ PREQ2678
+
+@SYMTestCaseDesc 
+Measures the end-to-end performance of using Khronos APIs to render glyphs using the
+RFbsGlyphDataIterator API. Positioning is very basic and is not reflective of a production-
+quality text-rendering algorithm, but serves as a useful benchmark of the overall
+text-rendering performance using this API.
+
+@SYMTestActions
+i. Create a sample font to use. 
+ii. Create a RSgImage to be used as a target for Khronos API rendering.
+iii. Set-up EGL and OpenVG.
+iv. Construct RFbsGlyphDataIterator, and open on sample data. At each iteration:
+	1. Create an EGLImage from the RSgImage.
+	2. Create a VGImage from the EGLImage.
+	3. Render the VGImage using vgDrawImage().
+	4. Destroy VGImage.
+	5. Destroy EGLImage.
+	6. Advance the current rendering position for the next glyph, ensuring that every glyph
+	will be within the bounds of the target surface.
+v. Measure time from from first to last iteration.
+*/
+void CTFbsGlyphData::GlyphRenderingL()
+	{
+	_LIT(KTestName, "GlyphRendering");
+	const TInt KNumIterations = 500;
+    const TTestLanguage KTestLanguage = ETestLanguageHindi;
+	
+	// Create some test fonts using the font factory.
+	CTFontFactory* fontFactory = CTFontFactory::NewLC();
+	fontFactory->CreateFontsL(KTestLanguage, 1, 20);
+	CFbsFont* font = fontFactory->NextFont();
+	const TInt KFontHeightInPixels = font->HeightInPixels();
+
+	// Create RSgImage to be used as OpenVG Pixmap Surface
+
+	RSgImage target;
+	TInt err = target.Create(TSgImageInfo(KEglTargetSize, ESgPixelFormatARGB_8888_PRE, ESgUsageBitOpenVgSurface));
+	TESTL(err == KErrNone);
+	CleanupClosePushL(target);
+	
+	// Initialize EGL/OpenVG for rendering.
+	EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+	if (display == EGL_NO_DISPLAY)
+		{
+		ERR_PRINTF2(_L("Failed to get EGLDisplay. [eglError=%X]"), eglGetError());
+		User::Leave(KErrGeneral);
+		}
+	TESTL(display != EGL_NO_DISPLAY);
+	if (EGL_FALSE == eglInitialize(display, NULL, NULL))
+		{
+		ERR_PRINTF2(_L("Failed to initialize EGLDisplay. [eglError=%X]"), eglGetError());
+		User::Leave(KErrGeneral);
+		}
+	eglBindAPI(EGL_OPENVG_API);
+	
+	EGLint imageAttribs[] =
+	    {
+	    EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, 
+	    EGL_NONE
+	    };
+	EGLint configAttribs[] = 
+		{
+		EGL_MATCH_NATIVE_PIXMAP, (EGLint)&target,
+		EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
+		EGL_SURFACE_TYPE, EGL_PIXMAP_BIT | EGL_VG_ALPHA_FORMAT_PRE_BIT, 
+		EGL_NONE
+		};
+	
+	const EGLint KPixmapAttribsVgAlphaFormatPre[] = 
+	    {
+	    EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE,
+	    EGL_NONE
+	    };
+		
+	EGLint configId = 0;
+	EGLint numConfigs = 0;
+	if (EGL_FALSE == eglChooseConfig(display, configAttribs, &configId, 1, &numConfigs) || numConfigs == 0)
+		{
+		ERR_PRINTF3(_L("Failed to find suitable EGLConfig. [eglError=%X, configs=%d]"), eglGetError(), numConfigs);
+		User::Leave(KErrGeneral);
+		}
+	EGLContext context = eglCreateContext(display, configId, EGL_NO_CONTEXT, NULL);
+	if (context == EGL_NO_CONTEXT)
+		{
+		ERR_PRINTF2(_L("Failed to create EGLContext. [eglError=%X]"), eglGetError());
+		User::Leave(KErrGeneral);
+		}
+	EGLSurface surface = eglCreatePixmapSurface(display, configId, &target, KPixmapAttribsVgAlphaFormatPre);
+	if (EGL_FALSE == eglMakeCurrent(display, surface, surface, context))
+		{
+		ERR_PRINTF2(_L("Failed to create make surface and context current. [eglError=%X]"), eglGetError());
+		eglDestroyContext(display, context);
+		User::Leave(KErrGeneral);
+		}
+	
+	// Load the necessary EGL extensions...
+	TvgCreateEGLImageTargetKHRTypefPtr vgCreateImageTargetKHR;
+	PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
+	PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
+	eglCreateImageKHR = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
+	eglDestroyImageKHR = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
+	vgCreateImageTargetKHR = reinterpret_cast<TvgCreateEGLImageTargetKHRTypefPtr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
+	if (!eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateImageTargetKHR)
+		{
+		ERR_PRINTF1(_L("Failed to get EGL Image extension functions."));
+		User::Leave(KErrNotSupported);
+		}
+	// Now we have an OpenVG window to render to!
+	
+	TInt numGlyphCodes = 0;
+	TUint* glyphCodes;
+	LoadConfigSampleDataL(font, KTestLanguage, EFalse, glyphCodes, numGlyphCodes); 
+
+	// Set up an identity matrix compatible with the Symbian co-ordinate system.
+	vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
+	vgScale(1.f, -1.f);
+	vgTranslate(0, -KFontHeightInPixels);	
+	VGfloat vgIdentityMatrix[16];
+	vgGetMatrix(vgIdentityMatrix);
+	
+	RFbsGlyphDataIterator iter;
+	CleanupClosePushL(iter);
+		
+	// Render some glyphs.
+	TInt iterErr = KErrNone;
+	TInt rep = 0;
+	vgClear(0, 0, KEglTargetSize.iWidth, KEglTargetSize.iHeight);
+	TPoint glyphOrigin(0, 0);
+	iProfiler->InitResults();
+	for (rep = 0; rep < KNumIterations; rep++)
+		{
+		iterErr = iter.Open(*font, glyphCodes, numGlyphCodes);
+		for (;iterErr == KErrNone; iterErr = iter.Next())
+			{
+			const TOpenFontCharMetrics& metrics = iter.Metrics();
+			const RSgImage& glyphSgImage = iter.Image();
+			EGLImageKHR eglImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, 
+					reinterpret_cast<EGLClientBuffer>(&glyphSgImage), imageAttribs);
+			VGImage vgImage = vgCreateImageTargetKHR(eglImage);
+			
+			// wrapped text placement.			
+			TInt horizAdvance = metrics.HorizAdvance();
+			if (glyphOrigin.iX + horizAdvance >= KEglTargetSize.iWidth)
+				{
+				vgLoadMatrix(vgIdentityMatrix);
+				glyphOrigin.iX = 0;
+				glyphOrigin.iY -= KFontHeightInPixels;
+				if (glyphOrigin.iY - KFontHeightInPixels < -KEglTargetSize.iHeight)
+					{
+					glyphOrigin.iY = 0;
+					}
+				vgTranslate(glyphOrigin.iX, glyphOrigin.iY);
+				}
+			
+			vgDrawImage(vgImage);
+			vgDestroyImage(vgImage);
+			eglDestroyImageKHR(display, eglImage);
+				
+			// Move to next glyph position.
+			glyphOrigin.iX += horizAdvance;
+			vgTranslate(horizAdvance, 0);
+			}
+		iter.Close();
+		eglSwapBuffers(display, surface);
+		}
+	iProfiler->MarkResultSetL();
+	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, KNumIterations, numGlyphCodes);
+	TEST(rep == KNumIterations);
+	TESTE(iterErr == KErrNotFound, iterErr);	
+	WriteTargetOutput(KTestName());
+	
+	eglDestroySurface(display, surface);
+	eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+	eglTerminate(display);
+	eglReleaseThread();
+	
+	CleanupStack::PopAndDestroy(3); // iter, target, fontFactory
+	delete [] glyphCodes;
+	}
+#endif
+
+/**
+Captures the EGL Surface (it is assumed to be an OpenVG surface) to a 256-grey CFbsBitmap,
+used when sanity-checking bitmaps are enabled. 
+*/
+CFbsBitmap* CTFbsGlyphData::GetTargetAsBitmapL()
+	{
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+	// For debugging purposes only.
+	// Capture the final state of the EGL Pixmap surface as an mbm.
+	const TInt KDataStride = KEglTargetSize.iWidth;
+
+	TUint8* imageScanline = reinterpret_cast<TUint8*>(User::AllocZL(KDataStride));
+	CleanupStack::PushL(imageScanline);
+	CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
+	CleanupStack::PushL(bitmap);
+	User::LeaveIfError(bitmap->Create(KEglTargetSize, EGray256));
+	bitmap->BeginDataAccess();
+	TUint8* dataAddress = reinterpret_cast<TUint8*>(bitmap->DataAddress());
+	const TInt dataStride = bitmap->DataStride();	
+	for (TInt scanline = 0; scanline < KEglTargetSize.iHeight; scanline++)
+		{
+	    vgReadPixels(imageScanline, KDataStride, VG_A_8, 0, scanline, KEglTargetSize.iWidth, 1);
+		Mem::Copy(dataAddress, imageScanline, KEglTargetSize.iWidth);
+		dataAddress += dataStride;
+		}
+	bitmap->EndDataAccess(EFalse);
+	CleanupStack::Pop(2); // bitmap, imageScanline
+	return bitmap;
+#else
+	return NULL;
+#endif
+	}
+
+/**
+Utility method. Loads sample glyph code data from the config ini file
+into a TUint array.
+@param aFont The font that the glyph codes will be associated with.
+@param aLanguage The language variant to load from the config file as sample data.
+@param aLongData Whether to use the long variant (ETrue) or short variant (EFalse) 
+    of the sample data for the given language.
+@param aGlyphCodes On success, holds an array of glyph codes, to be freed by the caller.
+@param aNumGlyphCodes On success, holds the count of the glyph code array.
+@leave KErrNotFound if the test data cannot be found or is empty in the config file.
+ */
+void CTFbsGlyphData::LoadConfigSampleDataL(CFbsFont* aFont, TTestLanguage aLanguage, TBool aLongData, TUint*& aGlyphCodes, TInt& aNumGlyphCodes)
+	{
+	// The name of the section in the config file to look-up the sample data
+	_LIT(KConfigFileSampleData, "GlyphDataSampleText");
+
+	TBuf<32> keyName = ConfigKeyNameL(aLanguage, aLongData);
+	
+	// Setup the converter to use the passed font.
+	iCharCodeConverter->UseFontL(aFont);
+
+	// Load the sample string data from the config file.
+	TPtrC sampleText;
+	TESTL(GetStringFromConfig(KConfigFileSampleData, keyName, sampleText));
+	aNumGlyphCodes = sampleText.Length();
+	if (aNumGlyphCodes <= 0)
+		{
+		User::Leave(KErrNotFound);
+		}
+	aGlyphCodes = new(ELeave) TUint[aNumGlyphCodes];
+	for (TInt code = 0; code < aNumGlyphCodes; ++code)
+		{
+		aGlyphCodes[code] = iCharCodeConverter->GlyphCodeL(sampleText[code]); 
+		}
+	}
+
+/**
+Creates the name of the key to look for in the config file for the test
+with the specified parameters.
+@param aLanguage The language the test will use.
+@param aLongData Whether to use long or short sample data.
+@return A descriptor value of the language.
+@leave KErrNotSupported if aLanguage is not recognised.
+ */
+TBufC<32> CTFbsGlyphData::ConfigKeyNameL(TTestLanguage aLanguage, TBool aLongData)
+	{
+	if (aLanguage < 0 || aLanguage > 1)
+		{
+		User::Leave(KErrNotSupported);
+		}
+	TBuf<32> langName[2];
+	langName[ETestLanguageLatin].Append(_L("Latin"));
+	langName[ETestLanguageHindi].Append(_L("Hindi"));	
+	langName[aLanguage].Append((aLongData) ? _L("Long") : _L("Short"));
+	return langName[aLanguage];
+	}
+
+/**
+Font factory.
+Utiltiy class for providing fonts for the performance tests.
+*/
+
+CTFontFactory::CTFontFactory()
+	{
+	}
+
+CTFontFactory::~CTFontFactory()
+	{
+	ReleaseFonts();
+	delete iTs;
+	}
+
+/**
+@return A new Font Factory ready to create fonts.
+*/
+CTFontFactory* CTFontFactory::NewLC()
+	{
+	CTFontFactory* fontFactory = new (ELeave) CTFontFactory();
+	CleanupStack::PushL(fontFactory);
+	fontFactory->iTs = static_cast<CFbsTypefaceStore*>(CFbsTypefaceStore::NewL(NULL));
+	return fontFactory;
+	}
+
+/**
+Creates a number of fonts for use by tests. All the fonts are created up-front so 
+that NextFont() can be called as a very lightweight call, so it can be used inside
+tests with minimal impact.
+Once fonts are created, the factory must not be destroyed until the fonts it created
+are finished with.
+@param aLanaugeMask Which language needs to be supported by the returned fonts.
+@param aNumFonts The number of fonts to create
+@param aStartSizeInPixels The lower bound font height of the fonts that are created. All
+	fonts will be at least as big as this value.
+*/
+void CTFontFactory::CreateFontsL(TTestLanguage aLanguageMask, TInt aNumFonts, TInt aStartSizeInPixels)
+	{
+	ReleaseFonts();
+	
+	RArray <TPtrC> typefaceNames;
+	CleanupClosePushL(typefaceNames);
+	switch(aLanguageMask)
+		{
+		case ETestLanguageHindi:	
+			User::LeaveIfError(typefaceNames.Reserve(1));
+			typefaceNames.Append(_L("Devanagari OT Eval"));
+			break;
+		case ETestLanguageLatin:
+			User::LeaveIfError(typefaceNames.Reserve(3));
+			typefaceNames.Append(_L("DejaVu Sans Condensed"));
+			typefaceNames.Append(_L("DejaVu Serif"));
+			typefaceNames.Append(_L("DejaVu Sans Mono"));
+			break;
+		default:
+			User::Leave(KErrNotSupported);
+		}
+	const TInt KNumTypefaces = typefaceNames.Count();
+		
+	iFont = new CFbsFont*[aNumFonts];
+	for (TInt count = 0; count < aNumFonts; ++count)
+		{
+		// After every KNumTypefaces font, increase size by 5.
+		TInt size = aStartSizeInPixels + (5 *(count / KNumTypefaces));
+		TPtrC typefaceName = typefaceNames[count % KNumTypefaces];
+		TFontSpec fontSpec(typefaceName, size);
+		User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont[count], fontSpec));
+		++iNumFonts;
+		}
+	iCurFont = -1;
+	CleanupStack::PopAndDestroy(1); // typefaceNames
+	}
+/**
+Releases all created fonts and frees associated memory.
+*/
+void CTFontFactory::ReleaseFonts()
+	{
+	for (TInt font = 0; font < iNumFonts; ++font)
+		{
+		iTs->ReleaseFont(iFont[font]);
+		}
+	delete [] iFont;
+	iFont = NULL;
+	iNumFonts = 0;
+	}
+
+/**
+@return The next font to be used. If it reaches the last font, the next font will
+	cycle back around to the first font.
+*/
+CFbsFont* CTFontFactory::NextFont()
+	{
+	return iFont[++iCurFont%iNumFonts];
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/tfbsglyphdata.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,100 @@
+// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code 
+*/
+
+#ifndef TFBSGLYPHDATA_H
+#define TFBSGLYPHDATA_H
+
+#include <fbs.h>
+#include <sgresource/sgresource.h>
+#include "te_graphicsperformanceSuiteStepBase.h"
+class CCharCodeConverter;
+
+/**
+Enumeration of languages that are supported for testing in this framework.
+ */
+enum TTestLanguage
+	{
+	ETestLanguageLatin,
+	ETestLanguageHindi
+	};
+
+/**
+Test case to test the performance of RFbsGlyphDataIterator and RFbsGlyphMetricsArray.
+*/
+class CTFbsGlyphData : public CTe_graphicsperformanceSuiteStepBase
+    {
+public:
+	CTFbsGlyphData();
+	~CTFbsGlyphData();
+	
+	// From CTe_graphicsperformanceSuiteStepBase
+	virtual TVerdict doTestStepPreambleL();
+	virtual TVerdict doTestStepPostambleL();
+	virtual TVerdict doTestStepL();
+	virtual CFbsBitmap* GetTargetAsBitmapL();
+    
+private:
+	// Tests
+	void GlyphMetricsArrayL(TTestLanguage aLanguage, TBool aLongData, TInt aReps);
+	void GlyphMetricsQuerySingleGlyphL();
+	void GlyphDataIteratorOpenL(TTestLanguage aLanguage, TBool aLongData, TInt aReps);
+	void GlyphDataIteratorOpenSingleFontL();
+	void GlyphMetricsQueryUnrasterizedL();
+	void GlyphMetricsQueryPreRasterizedL();
+	void GlyphRenderingL();
+	
+	// Utility methods
+	void LoadConfigSampleDataL(CFbsFont* aFont, TTestLanguage aLanguage, TBool aLongData, TUint*& aGlyphCodes, TInt& aNumGlyphCodes);
+	static TBufC<32> ConfigKeyNameL(TTestLanguage aLanguage, TBool aLongData);
+	
+private:
+	RFbsSession iFbs;
+	RSgDriver iSgDriver;
+	CCharCodeConverter* iCharCodeConverter;
+    };
+
+_LIT(KTFbsGlyphData,"tfbsglyphdata");
+
+/**
+Utility class. Provides the tests with a number of different fonts to use.
+Manages their creation and destruction.
+ */
+class CTFontFactory : public CBase
+	{
+public:
+	static CTFontFactory* NewLC();
+	~CTFontFactory();
+	
+	void CreateFontsL(TTestLanguage aLanguageMask, TInt aNumFonts, TInt aStartSizeInPixels = 5);
+	TInt NumFonts() const;
+	CFbsFont* NextFont();
+	void ReleaseFonts();
+private:
+	CTFontFactory();
+private:
+	CFbsFont** iFont;
+	TInt iNumFonts;
+	TInt iCurFont;
+	CFbsTypefaceStore* iTs;
+	};
+
+
+#endif /* TFBSGLYPHDATA_H */
--- a/graphicstest/uibench/src/tgcesuiteserver.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicstest/uibench/src/tgcesuiteserver.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -26,6 +26,7 @@
 #include "tdirectgdiperf.h"
 #include "teventhandlingperf.h"
 #include "tflipframerate.h"
+#include "trenderorientation.h"
 
 /**
 Same code for Secure and non-secure variants
@@ -102,6 +103,7 @@
 CTestStep* CGceSuiteServer::CreateTestStep(const TDesC& aStepName)
 	{
 	CTestStep* testStep = NULL;
+	
 	if(aStepName == KTGraphicsResource)
 		testStep = new CTGraphicsResource();
 	else if(aStepName == KTBitBltPerfDirectGdi)
@@ -113,6 +115,9 @@
 	else if(aStepName == KEventHandlingPerfName)
 		testStep = new CTEventHandlingPerf();
 	else if(aStepName == KTFlipFramerate)
-	    testStep = new CTFlipFramerate;
+	    testStep = new CTFlipFramerate();
+	else if(aStepName == KTRenderOrientation)
+	    testStep = new CTRenderOrientation;
+	
 	return testStep;
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/trenderorientation.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,329 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Nokia test code 
+*/
+
+#include <w32std.h>
+
+#include <wspublishandsubscribedata.h>
+#include "trenderorientation.h"
+
+const TInt KPublishTimeout  = 1000000;  // 1 second in microseconds
+const TInt KNumIterations   = 20;
+
+// Values for the device orientation that we receive via P&S from the Theme Server
+// Must match those in renderorientationtracker.h, and, obviously, those used by the real theme server 
+const TUid  KThemeOrientationCategory   = {0x20022E82}; // == KHbPsHardwareCoarseOrientationCategoryUid 
+const TUint KThemeOrientationKey        = 0x4F726965;   // == KHbPsHardwareCoarseOrientationKey 
+
+void CTWindowSet::ConstructL()
+    {
+    User::LeaveIfError(iWs.Connect());
+    iWs.SetAutoFlush(ETrue);
+    
+    iWindowGroup = RWindowGroup(iWs);
+    User::LeaveIfError(iWindowGroup.Construct(reinterpret_cast<TUint32>(&iWindowGroup)));
+    
+    iChildWindow = RWindow(iWs);
+    User::LeaveIfError(iChildWindow.Construct(iWindowGroup, reinterpret_cast<TUint32>(&iChildWindow)));
+    }
+
+CTWindowSet::~CTWindowSet()
+    {
+    Destroy();
+    }
+
+void CTWindowSet::Destroy()
+    {
+    iChildWindow.Close();
+    iWindowGroup.Close();
+    iWs.Close();    
+    }
+
+CTRenderOrientation::CTRenderOrientation()
+    {
+    // check that these two enums are aligned
+    __ASSERT_COMPILE(EDisplayOrientationAuto == ENumWindowSets);
+    
+    SetTestStepName(KTRenderOrientation);
+    }
+
+CTRenderOrientation::~CTRenderOrientation()
+    {
+    }
+
+/**
+Gets the Render Orientation as published by window server
+
+@return TRenderOrienation that was last publised by window server.
+ */
+TRenderOrientation CTRenderOrientation::GetRenderOrientationL()
+    {    
+    return GetOrientationL(iWsRenderOrientationProperty);    
+    }
+
+/**
+Gets the Theme Orientation as published by theme server
+
+@return TRenderOrienation that was last publised by theme server.
+ */
+TRenderOrientation CTRenderOrientation::GetThemeOrientationL()
+    {    
+    return GetOrientationL(iThemeOrientationProperty);    
+    }
+
+/**
+Gets the orientation as published to the given RProperty
+
+@return TRenderOrienation that was last publised to the given RProperty
+ */
+TRenderOrientation CTRenderOrientation::GetOrientationL(RProperty& aProperty)
+    {
+    TInt orientation=EDisplayOrientationNormal;
+    User::LeaveIfError(aProperty.Get(orientation));
+    
+    TESTL(orientation >= EDisplayOrientationNormal);
+    TESTL(orientation < EDisplayOrientationAuto);    
+    
+    return static_cast<TRenderOrientation>(orientation);    
+    }
+
+/**
+Tests each usable TRenderOrientation KNumIterations times for the given test phase / use case.
+
+@param aStepName - the test step ID to use
+@param aTestPhase - the internal test phase 
+ */
+void CTRenderOrientation::TestOrientationChangeL(const TDesC& aStepName, TTestPhase aTestPhase)
+    {
+    SetTestStepID(aStepName);
+    
+    // more preamble to toggle between timing the wserv render orienation property
+    // and the theme server orientation property
+    RProperty *orientationProperty = NULL;
+    switch(aTestPhase)
+        {          
+        case EThemeOrientationChangeOnly:
+            {
+            // render orientation ignores theme orientation
+            iWindowSet[EFirstWindowSet].Session().IndicateAppOrientation(EDisplayOrientationNormal);
+            // we want to subscribe and wait for the theme orientation published by the theme server
+            orientationProperty = &iThemeOrientationProperty;            
+            break;
+            }
+        case EThemeOrientationChange:
+            {
+            TESTL(EDisplayOrientationNormal == GetThemeOrientationL());
+            iWindowSet[EFirstWindowSet].Session().IndicateAppOrientation(EDisplayOrientationAuto);
+            }
+            // deliberate drop-through
+        default:
+            // we want to subscribe and wait for the render orientation published by WServ            
+            orientationProperty = &iWsRenderOrientationProperty;            
+            break;
+        }    
+    
+    TInt renderOrientation = GetRenderOrientationL();
+    
+    // For consistancy, check that we are starting from the same orientation
+    TESTL(EDisplayOrientationNormal == renderOrientation);    
+    
+    // Set-up the timer
+    iProfiler->InitResults();
+    iTimingsTaken = 0;    
+    
+    // repeat numerous times to get a decent average
+    for(TInt iterations=0; iterations < KNumIterations; ++iterations)
+        {
+        renderOrientation = GetRenderOrientationL();
+        // For consistancy, check that we are starting from the same orientation
+        TESTL(EDisplayOrientationNormal == renderOrientation);           
+        
+        // loop through the orientations, ending up changing back to normal
+        for(++renderOrientation; renderOrientation <= EDisplayOrientationAuto; ++renderOrientation)
+            {
+            // % can be slow, do it outside of the timing
+            TRenderOrientation testOrientation = static_cast<TRenderOrientation>(renderOrientation%EDisplayOrientationAuto);
+            
+            orientationProperty->Subscribe(iOrientationStatus);
+            
+            // start the timeout timer
+            iTimeoutTimer.After(iTimeoutStatus, KPublishTimeout);
+            // start the results timer
+            iProfiler->StartTimer();
+                        
+            switch(aTestPhase)
+                {
+                case EIndicatedOrientationChange:
+                    // Do the indicated orientation Change
+                    iWindowSet[EFirstWindowSet].Session().IndicateAppOrientation(testOrientation);
+                    break;
+                    
+                case EWindowOrdinalChange:
+                    // move the relevant window group to the front
+                    // N.B. this will go wrong if the number of orientations and windows are not equal
+                    iWindowSet[testOrientation].WindowGroup().SetOrdinalPosition(0);
+                    break;
+                    
+                case EThemeOrientationChange:
+                    // Needs the focus window to be in auto mode
+                    // deliberate drop through
+                case EThemeOrientationChangeOnly:                                        
+                    iThemeOrientationProperty.Set(testOrientation);
+                    break;
+                    
+                default:
+                    TESTL(EFalse);
+                }
+        
+            // Wait for the update to have been published ( or time out while waiting )
+            User::WaitForRequest(iOrientationStatus, iTimeoutStatus);
+            
+            iProfiler->MarkResultSetL();
+            ++iTimingsTaken;
+            
+            if(KErrNone != iOrientationStatus.Int())
+                {
+                // timed out
+                iWsRenderOrientationProperty.Cancel();                
+                TESTL(EFalse);
+                }
+            else
+                {
+                // Check that it is actually the expected orientation
+                if(EThemeOrientationChangeOnly == aTestPhase)
+                    TESTL(GetThemeOrientationL() == testOrientation);
+                else
+                    TESTL(GetRenderOrientationL() == testOrientation);                
+                }
+
+            if(KRequestPending == iTimeoutStatus.Int())
+                {
+                // as expected, so cancel the timeout timer
+                iTimeoutTimer.Cancel();
+                }
+            else
+                {
+                // timed out
+                TESTL(EFalse);
+                }
+            }
+        }    
+    
+    // wrap it up    
+    iProfiler->ResultsAnalysis(KTRenderOrientation,KErrNotFound,ENone,ENone,iTimingsTaken);
+    }
+
+TVerdict CTRenderOrientation::doTestStepL()
+    {     
+    INFO_PRINTF1(_L("Testing: Indicated Orientation Change"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0201"), EIndicatedOrientationChange);
+    
+    INFO_PRINTF1(_L("Testing: Window Ordinal Position Change"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0202"), EWindowOrdinalChange);
+    
+    INFO_PRINTF1(_L("Testing: Theme Orientation Change"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0203"), EThemeOrientationChange);
+    
+    INFO_PRINTF1(_L("Testing: Theme Orientation Change Only"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0204"), EThemeOrientationChangeOnly);    
+    
+    return TestStepResult();    
+    }
+
+_LIT(KThemeServerPropertyDefine, "twsthemeserverpropertydefine.exe");
+_LIT(KThemeServerPropertyDefineCmdDefine, "define");
+_LIT(KThemeServerPropertyDefineCmdDelete, "delete");   
+
+/**
+Uses a test executable to define or delete a test version of the theme server rotation RProperty
+ */
+void CTRenderOrientation::ThemeServerProperty(const TDesC& aCmd)
+    {
+    /* This Process called with the argument KThemeServerPropertyDefineCmdDefine defines the
+       theme server RProperty, or with KThemeServerPropertyDefineCmdDelete, deletes 
+       the theme server RProperty.
+       This is because an RProperty with this catagory UID can only be defined and deleted
+       from within a process with the same UID3 as the RProperty catogory you are trying to
+       define/delete */
+    RProcess themeServerPropertyDefine;
+    TInt err = themeServerPropertyDefine.Create(KThemeServerPropertyDefine, aCmd);
+    if (KErrNone != err)
+        {
+        _LIT(KLog, "themeServerPropertyDefine.Create() failed with error: %d");
+        INFO_PRINTF2(KLog, err);
+        TEST(EFalse);        
+        }
+    
+    // wait for themeServerPropertyDefine process to terminate
+    TRequestStatus themeServerPropertyDefineLogonStatus;
+    themeServerPropertyDefine.Logon(themeServerPropertyDefineLogonStatus);
+    themeServerPropertyDefine.Resume();
+    User::WaitForRequest(themeServerPropertyDefineLogonStatus);
+    if (themeServerPropertyDefineLogonStatus != KErrNone)
+        {
+        _LIT(KLog, "themeServerPropertyDefine.Logon() failed with error: %d");
+        INFO_PRINTF2(KLog, themeServerPropertyDefineLogonStatus);
+        TEST(EFalse);        
+        }
+    themeServerPropertyDefine.Close();    
+    }
+
+/*
+Initialise for the testing
+ */
+TVerdict CTRenderOrientation::doTestStepPreambleL()
+    {
+    // Create in reverse order so that windowSet 0 is at the front/foreground
+    for(TInt windowSet = ENumWindowSets - 1; windowSet >= 0 ; --windowSet)
+        {
+        iWindowSet[windowSet].ConstructL();
+        TRenderOrientation orientation = static_cast<TRenderOrientation>(windowSet%EDisplayOrientationAuto);
+        iWindowSet[windowSet].Session().IndicateAppOrientation(orientation);
+        iWindowSet[windowSet].WindowGroup().SetOrdinalPosition(0);
+        }
+    
+    User::LeaveIfError(iWsRenderOrientationProperty.Attach(KRenderOrientationCategory, KRenderOrientationKey));
+    
+    ThemeServerProperty(KThemeServerPropertyDefineCmdDefine);
+    User::LeaveIfError(iThemeOrientationProperty.Attach(KThemeOrientationCategory, KThemeOrientationKey));
+    
+    User::LeaveIfError(iTimeoutTimer.CreateLocal());
+    
+    return CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
+    }
+
+/*
+Tidy up after the testing
+ */
+TVerdict CTRenderOrientation::doTestStepPostambleL()
+    {
+    iTimeoutTimer.Close();
+    
+    iThemeOrientationProperty.Close();
+    ThemeServerProperty(KThemeServerPropertyDefineCmdDelete);    
+    iWsRenderOrientationProperty.Close();
+    
+    for(TInt windowThing = 0; windowThing < ENumWindowSets; ++windowThing)
+        {
+        iWindowSet[windowThing].Destroy();
+        }
+    
+    return CTe_graphicsperformanceSuiteStepBase::doTestStepPostambleL();
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/trenderorientation.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,106 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code 
+*/
+
+#ifndef TRENDERORIENTATION_H
+#define TRENDERORIENTATION_H
+
+#include <e32property.h>
+#include "te_graphicsperformanceSuiteStepBase.h"
+
+/**
+CTWindowSet contains a window server session, a group window and a child window.
+ */
+class CTWindowSet : public CBase
+    {
+public:
+    ~CTWindowSet();
+    void ConstructL();
+    void Destroy();
+
+    inline RWsSession&     Session()
+        {return iWs;};
+    inline RWindowGroup&   WindowGroup()
+        {return iWindowGroup;};
+
+private:
+    RWsSession      iWs;
+    RWindowGroup    iWindowGroup;
+    RWindow         iChildWindow;    
+    };
+
+/**
+Test case to test the performance of various use cases which affect the render orientation RProperty
+*/
+class CTRenderOrientation : public CTe_graphicsperformanceSuiteStepBase
+    {
+public:
+    CTRenderOrientation();
+    ~CTRenderOrientation();
+
+    // From CTestStep
+    virtual TVerdict doTestStepPreambleL();
+    virtual TVerdict doTestStepPostambleL();
+    
+    virtual TVerdict doTestStepL();
+
+private:
+    enum TWindowSet
+        {
+        // One per orientation
+        EFirstWindowSet,
+        ESecondWindowSet,
+        EThirdWindowSet,
+        EFourthWindowSet,
+        
+        ENumWindowSets
+        };
+    
+    enum TTestPhase
+        {
+        EIndicatedOrientationChange,    // window indicates a new render orientation
+        EWindowOrdinalChange,           // window order changed, render orientation dictated by a different window with a different orientation
+        EThemeOrientationChange,        // theme orientation changed, render orienation dictated by this due to relevant window being set to EDisplayOrientationAuto
+        EThemeOrientationChangeOnly,    // theme orientation change only, to compare timings to above
+        
+        ENumTestPhases
+        };    
+    
+    void TestOrientationChangeL(const TDesC& aStepName, TTestPhase aTestPhase);
+    
+    TRenderOrientation  GetRenderOrientationL();
+    TRenderOrientation  GetThemeOrientationL();
+    TRenderOrientation  GetOrientationL(RProperty& aProperty);
+    void                ThemeServerProperty(const TDesC& aCmd);
+    
+private:    
+    CTWindowSet     iWindowSet[ENumWindowSets];
+    RProperty       iWsRenderOrientationProperty;
+    RProperty       iThemeOrientationProperty;
+    
+    RTimer          iTimeoutTimer;
+    TRequestStatus  iTimeoutStatus;
+    TRequestStatus  iOrientationStatus;
+    TInt            iTimingsTaken;
+    };
+
+_LIT(KTRenderOrientation,"trenderorientation");
+
+#endif /* TRENDERORIENTATION_H */
--- a/graphicsutils/commongraphicsheaders/rom/graphics_adaptation.hby	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsutils/commongraphicsheaders/rom/graphics_adaptation.hby	Wed Aug 18 11:05:09 2010 +0300
@@ -128,10 +128,8 @@
 	#	define FBSRASTERIZER_DRV <fbsrasterizer_stub.iby>
 	#endif
 	
-	#ifdef SYMBIAN_GRAPHICS_USE_OPENWF_MIGRATION
-	#   ifndef OPENWFCLIB_DRV
-	#       define OPENWFCLIB_DRV <openwfc_ref.iby>
-	#   endif
+	#ifndef OPENWFCLIB_DRV
+	#	define OPENWFCLIB_DRV <openwfc_ref.iby>
 	#endif
 	
 #elif SYMBIAN_GRAPHICS_ADAPTATION == SGA_MBX
@@ -215,10 +213,8 @@
 	#	define SGRESOURCE_DRV <sgresource_sw.iby>
 	#endif
 	
-	#ifdef SYMBIAN_GRAPHICS_USE_OPENWF_MIGRATION
-	#   ifndef OPENWFCLIB_DRV
-	#       define OPENWFCLIB_DRV <openwfc_ref.iby>
-	#   endif
+	#ifndef OPENWFCLIB_DRV
+	# define OPENWFCLIB_DRV <openwfc_ref.iby>
 	#endif
 	
 #else
@@ -236,6 +232,7 @@
 REM "SURFACEUPDATE DRV"    : SURFACEUPDATE_DRV
 REM "DIRECTGDI DRV"        : DIRECTGDI_DRV 
 REM "FBSRASTERIZER DRV"    : FBSRASTERIZER_DRV 
-REM "SRGREOURCE DRV"       : SGRESOURCE_DRV 
+REM "SRGRESOURCE DRV"      : SGRESOURCE_DRV 
+REM "OPENWFCLIB DRV"       : OPENWFCLIB_DRV 
 
 #endif  // __GRAPHICS_ADAPTATION_HBY__
--- a/graphicsutils/commongraphicsheaders/test/scripts/tdisplayconfiguration.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/graphicsutils/commongraphicsheaders/test/scripts/tdisplayconfiguration.script	Wed Aug 18 11:05:09 2010 +0300
@@ -29,4 +29,5 @@
 RUN_TEST_STEP 100 commonheadertestserver TEFUnit.CTestDisplayConfiguration.GRAPHICS_COMMONHEADER_0011L
 RUN_TEST_STEP !PanicCode=7 !PanicString=DISPLAYCONFIG 100 commonheadertestserver TEFUnit.CTestDisplayConfiguration.GRAPHICS_COMMONHEADER_0012L
 
-RUN_PROGRAM tclosepanicwindow.exe
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_PROGRAM tclosepanicwindow.exe
--- a/m3g/m3gcore11/src/m3g_loader.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/m3g/m3gcore11/src/m3g_loader.c	Wed Aug 18 11:05:09 2010 +0300
@@ -781,9 +781,9 @@
             isCompatible = M3G_FALSE;
             break;
         case M3G_CLASS_MESH:
-            isCompatible = (classID == M3G_CLASS_MESH)
-                || (classID == M3G_CLASS_MORPHING_MESH)
-                || (classID == M3G_CLASS_SKINNED_MESH);
+            isCompatible = (objClassID == M3G_CLASS_MESH)
+                || (objClassID == M3G_CLASS_MORPHING_MESH)
+                || (objClassID == M3G_CLASS_SKINNED_MESH);
             break;
         default:
             isCompatible = (classID == objClassID);
--- a/m3g/m3gcore11/src/m3g_sprite.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/m3g/m3gcore11/src/m3g_sprite.c	Wed Aug 18 11:05:09 2010 +0300
@@ -280,7 +280,9 @@
     }
 #ifndef M3G_USE_NGL_API
     /* Store w after projection */
-    eyeSpace->w = ot.w;
+    if (eyeSpace != NULL) {
+        eyeSpace->w = ot.w;
+    }
 #endif
     m3gScaleVec4(&ot, m3gRcp(ot.w));
     m3gScaleVec4(&x, m3gRcp(x.w));
--- a/m3g/m3gcore11/src/m3g_vertexarray.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/m3g/m3gcore11/src/m3g_vertexarray.c	Wed Aug 18 11:05:09 2010 +0300
@@ -643,18 +643,12 @@
 
         switch (type) {
         case M3G_BYTE:
-        case M3G_UBYTE:
             /* always padded to 4 bytes */
             array->stride = 4;
             break;
         case M3G_SHORT:
-        case M3G_USHORT:
             array->stride = size * sizeof(M3Gshort);
             break;
-        default:
-            m3gFree(m3g, array);
-            m3gRaiseError(m3g, M3G_INVALID_ENUM);
-            return NULL;
         }
 
         /* Alloc and initialize all values to zero */
--- a/m3g/m3gcore11/src/m3g_vertexbuffer.c	Tue Jul 06 15:45:57 2010 +0300
+++ b/m3g/m3gcore11/src/m3g_vertexbuffer.c	Wed Aug 18 11:05:09 2010 +0300
@@ -350,8 +350,7 @@
     if (newArray != NULL) {
     	if (buffer->arrayCount == 0 || (buffer->arrayCount == 1
                                         && change == 0)) {
-    		buffer->vertexCount =
-                (newArray != NULL ? m3gGetArrayVertexCount(newArray) : 0);
+    		buffer->vertexCount = m3gGetArrayVertexCount(newArray);
     	}
     	else if (m3gGetArrayVertexCount(newArray) != buffer->vertexCount) {
             m3gRaiseError(M3G_INTERFACE(buffer), M3G_INVALID_VALUE);
--- a/printingservices/printerdriversupport/group/pdrstoretest_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/printingservices/printerdriversupport/group/pdrstoretest_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -34,7 +34,8 @@
 ;*Files To Copy...<src> <destination>
 
 ;//script file
-"\epoc32\data\z\pdrstoretest\pdrstoretest_T_Pdr.script"-"c:\pdrstoretest\pdrstoretest_T_Pdr.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\pdrstoretest\pdrstoretest_T_Pdr.script"-"c:\pdrstoretest\pdrstoretest_T_Pdr.script"
 "\epoc32\data\z\pdrstoretest\pdrstoretest_T_PdrLst.script"-"c:\pdrstoretest\pdrstoretest_T_PdrLst.script"
 "\epoc32\data\z\pdrstoretest\pdrstoretest_T_PdrMem.script"-"c:\pdrstoretest\pdrstoretest_T_PdrMem.script"
 
--- a/printingservices/printerdriversupport/inc/prnpath.h	Tue Jul 06 15:45:57 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-// Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
-
-#ifndef PRNPATH_H
-#define PRNPATH_H
-
-/**
-@file 
-@internalTechnology
-@released 
-*/
-
-/* This file is copied from middleware to remove dependency on middleware */
-
-_LIT( KDefaultPrinterDriverPath, "\\resource\\printers\\" );
-
-
-#endif // PRNPATH_H
--- a/printingservices/printerdriversupport/tps/T_PDR.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/printingservices/printerdriversupport/tps/T_PDR.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -21,7 +21,6 @@
 
 #include "T_PDR.H"
 #include <graphics/fbsdefs.h>
-#include "prnpath.h"
 
 
 #if defined (__WINS__)
--- a/printingservices/printerdriversupport/tps/T_PDRLST.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/printingservices/printerdriversupport/tps/T_PDRLST.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -14,7 +14,7 @@
 //
 
 #include "T_PDRLST.H"
-#include "prnpath.h"
+
 
 class CTPdrLst : public CTGraphicsBase
 	{
--- a/printingservices/printerdriversupport/tps/T_PDRMEM.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/printingservices/printerdriversupport/tps/T_PDRMEM.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -14,7 +14,6 @@
 //
 
 #include "T_PDRMEM.H"
-#include "prnpath.h"
 
 _LIT( KDriveName, "z:" );
 _LIT( KEpsonFileName, "epson.pdr" );
--- a/windowing/windowserver/SERVER/openwfc/panics.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/SERVER/openwfc/panics.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -162,6 +162,10 @@
 	EWsPanicInvalidRotation = 127,			//Invalid rotation used
 	EWsPanicInvalidPointerOffset = 128,      //The pointer offset value in wsini.ini is invalid.
 	EWsPanicArrayInsertFailed = 129,	//Array insert failed.           
+	EWsPanicAccessBeyondCommandBuf = 130,	//Access beyond wserv command buffer
+	EWsPanicKeyEventRouterBadResult = 131,		// Invalid result code from key event routing plug-in
+	EWsPanicKeyEventRouterBadWindowGroup = 132,	// Invalid destination window group from key event routing plug-in
+	EWsPanicKeyEventRouterLeave = 133,			// Invalid leave from Key event routing plug-in
 	};
 
 void Panic(TWservPanic aPanic);
--- a/windowing/windowserver/SERVER/w32cmd.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/SERVER/w32cmd.h	Wed Aug 18 11:05:09 2010 +0300
@@ -266,6 +266,7 @@
 	EWsClOpUnregisterAllTFXEffect,
 	EWsClOpOverrideEffectBuf,
 	EWsClOpOverrideEffectIPC,
+	EWsClOpIndicateAppOrientation,
 	EWsClOpLastEnumValue //Keep this at the end - used by test code
 	};
 	
@@ -1059,6 +1060,7 @@
 	const TWsClCmdRegisterEffect* RegisterEffect;
 	const TWsClCmdUnRegisterEffect* UnRegisterEffect; 
 	const TWsClCmdOverrideEffect* OverrideEffect;
+	const TRenderOrientation* Orientation;
 	};
 
 // Window command structures
@@ -2126,12 +2128,14 @@
 	EWservPanicWrongScreen=82,                  // Child apps can only be constructed on the same screen as their parent. See RWindowGroup::ConstructChildApp
 	EWservPanicScreenCaptureInvalidRequest=83,  // With Screen Capture disabled, an unexpected invalid request has been received
 	EWservPanicInvalidDisplayConfiguration=84,  // Use of a display configuration without valid members
+	EWservPanicUnableToEnableAdvPointer=85,     // Use when advanced pointers are enabled after an RWindow is activated
 	};
 
 #if defined(__WINS__)
 	// Under WINS character code is passed in as HIWORD of the scan code,
 	// and will need to be removed in some situations
 	#define __REMOVE_WINS_CHARCODE &0x0000FFFF
+	#define __WINS_CHARCODE(c)	((c) & 0xFFFF0000)
 #else
 	#define __REMOVE_WINS_CHARCODE
 #endif
--- a/windowing/windowserver/bwins/WS322U.DEF	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/bwins/WS322U.DEF	Wed Aug 18 11:05:09 2010 +0300
@@ -585,5 +585,5 @@
 	?OverrideEffects@RWsSession@@QAEXHHABV?$TBuf@$0BAA@@@00V?$TBitFlagsT@K@@@Z @ 584 NONAME ; void RWsSession::OverrideEffects(int, int, class TBuf<256> const &, class TBuf<256> const &, class TBuf<256> const &, class TBitFlagsT<unsigned long>)
 	?UnregisterEffect@RWsSession@@QAEXHHI@Z @ 585 NONAME ; void RWsSession::UnregisterEffect(int, int, unsigned int)
 	?UnregisterAllEffects@RWsSession@@QAEXXZ @ 586 NONAME ; void RWsSession::UnregisterAllEffects(void)
+	?IndicateAppOrientation@RWsSession@@QAEXW4TRenderOrientation@@@Z @ 587 NONAME ; void RWsSession::IndicateAppOrientation(enum TRenderOrientation)
 
-
--- a/windowing/windowserver/bwins/ws32switchu.def	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/bwins/ws32switchu.def	Wed Aug 18 11:05:09 2010 +0300
@@ -427,8 +427,8 @@
 	call_vector_426 @ 426 NONAME ; void RBlankWindow::SetColor(void)
 	call_vector_427 @ 427 NONAME ; int RWsSession::SetClientCursorMode(enum TPointerCursorMode)
 	call_vector_428 @ 428 NONAME ; class TRect RDrawableWindow::GetDrawRect(void) const
-	call_vector_429 @ 429 NONAME 
-	call_vector_430 @ 430 NONAME 
+	call_vector_429 @ 429 NONAME
+	call_vector_430 @ 430 NONAME
 	call_vector_431 @ 431 NONAME ; void CWindowGc::Reserved_CWindowGc_3(void)
 	call_vector_432 @ 432 NONAME ; void CWindowGc::Reserved_CWindowGc_4(void)
 	call_vector_433 @ 433 NONAME ; void CWindowGc::Reserved_CWindowGc_5(void)
@@ -512,20 +512,20 @@
 	call_vector_511 @ 511 NONAME ; int RWsSession::DebugInfo(int, int) const
 	call_vector_512 @ 512 NONAME ; unsigned long RWindowTreeNode::ClientHandle(void) const
 	call_vector_513 @ 513 NONAME ; int RWindowBase::SetBackgroundSurface(class TSurfaceId const &)
-	call_vector_514 @ 514 NONAME 
+	call_vector_514 @ 514 NONAME
 	call_vector_515 @ 515 NONAME ; class TRgb RWindowBase::KeyColor(void) const
-	call_vector_516 @ 516 NONAME 
-	call_vector_517 @ 517 NONAME 
-	call_vector_518 @ 518 NONAME 
-	call_vector_519 @ 519 NONAME 
-	call_vector_520 @ 520 NONAME 
+	call_vector_516 @ 516 NONAME
+	call_vector_517 @ 517 NONAME
+	call_vector_518 @ 518 NONAME
+	call_vector_519 @ 519 NONAME
+	call_vector_520 @ 520 NONAME
 	call_vector_521 @ 521 NONAME ; int RWindowBase::GetBackgroundSurface(class TSurfaceConfiguration &) const
-	call_vector_522 @ 522 NONAME 
+	call_vector_522 @ 522 NONAME
 	call_vector_523 @ 523 NONAME ; int RWsSession::PreferredSurfaceConfigurationSize(void) const
 	call_vector_524 @ 524 NONAME ; int RWsSession::RegisterSurface(int, class TSurfaceId const &)
-	call_vector_525 @ 525 NONAME 
+	call_vector_525 @ 525 NONAME
 	call_vector_526 @ 526 NONAME ; void RWindowBase::RemoveBackgroundSurface(int)
-	call_vector_527 @ 527 NONAME 
+	call_vector_527 @ 527 NONAME
 	call_vector_528 @ 528 NONAME ; int RWindowBase::SetBackgroundSurface(class TSurfaceConfiguration const &, int)
 	call_vector_529 @ 529 NONAME ; void RWsSession::UnregisterSurface(int, class TSurfaceId const &)
 	call_vector_530 @ 530 NONAME ; void RWindow::ClearRedrawStore(void)
@@ -585,4 +585,5 @@
 	call_vector_584 @ 584 NONAME ; void RWsSession::OverrideEffects(int, int, class TBuf<256> const &, class TBuf<256> const &, class TBuf<256> const &, class TBitFlagsT<unsigned long>)
 	call_vector_585 @ 585 NONAME ; void RWsSession::UnregisterEffect(int, int, unsigned int)
 	call_vector_586 @ 586 NONAME ; void RWsSession::UnregisterAllEffects(void)
+	call_vector_587 @ 587 NONAME ; void RWsSession::IndicateAppOrientation(enum TRenderOrientation)
 
--- a/windowing/windowserver/debuglog/DECODER.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/debuglog/DECODER.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -834,7 +834,13 @@
 		_LIT(LogGetExitHighPressureThreshold,"EWsClOpGetExitHighPressureThreshold()");
 		aText.AppendFormat(LogGetExitHighPressureThreshold);		
 		}
-		break;	
+		break;
+	case EWsClOpIndicateAppOrientation:
+	    {
+        _LIT(LogIndicateAppOrientation,"EWsClOpIndicateAppOrientation(%d)");
+        aText.AppendFormat(LogIndicateAppOrientation, *pData.Orientation);       	    
+	    }
+	    break;
 	case EWsClOpLastEnumValue:
 		{		
 		_LIT(LogLastEnumValue,"EWsClOpLastEnumValue enum");
--- a/windowing/windowserver/eabi/WS322U.DEF	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/eabi/WS322U.DEF	Wed Aug 18 11:05:09 2010 +0300
@@ -659,5 +659,5 @@
 	_ZN10RWsSession16UnregisterEffectEiij @ 658 NONAME
 	_ZN10RWsSession20UnregisterAllEffectsEv @ 659 NONAME
 	_ZN11RWindowBase15OverrideEffectsEiRK4TBufILi256EES3_S3_10TBitFlagsTImE @ 660 NONAME
+	_ZN10RWsSession22IndicateAppOrientationE18TRenderOrientation @ 661 NONAME
 
-
--- a/windowing/windowserver/group/openwfc/BLD.INF	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/group/openwfc/BLD.INF	Wed Aug 18 11:05:09 2010 +0300
@@ -36,12 +36,14 @@
 ../../inc/advancedpointerevent.h SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(advancedpointerevent.h)
 ../../inc/advancedpointerevent.inl SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(advancedpointerevent.inl)
 ../../inc/textcursor.h SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(textcursor.h)
+../../inc/wspublishandsubscribedata.h  SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(wspublishandsubscribedata.h)
+
 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
 #ifdef SYMBIAN_OLD_EXPORT_LOCATION
-../../inc/Graphics/windowserverconstants.h /epoc32/include/graphics/windowserverconstants.h
+../../inc/graphics/windowserverconstants.h /epoc32/include/graphics/windowserverconstants.h
 #endif
 #endif
-../../inc/Graphics/pointereventdata.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/pointereventdata.h)
+../../inc/graphics/pointereventdata.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/pointereventdata.h)
 ../../inc/W32ADLL.H SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(w32adll.h)
 ../../inc/W32CLICK.H SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(w32click.h)
 ../../inc/W32STDGRAPHIC.H SYMBIAN_OS_LAYER_PUBLIC_EXPORT_PATH(w32stdgraphic.h)
@@ -59,26 +61,27 @@
 ../../eabi/wsclicku.def  /epoc32/include/def/eabi/wsclicku.def
 
 //Graphic Drawer exports for partners
-../../inc/Graphics/WSGRAPHICDRAWER.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicdrawer.h)
-../../inc/Graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicdrawerinterface.h)
-../../inc/Graphics/WSGRAPHICMSGBUF.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicmsgbuf.h)
-../../inc/Graphics/W32STDGRAPHICTEST.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/w32stdgraphictest.h)
+../../inc/graphics/WSGRAPHICDRAWER.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicdrawer.h)
+../../inc/graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicdrawerinterface.h)
+../../inc/graphics/WSGRAPHICMSGBUF.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicmsgbuf.h)
+../../inc/graphics/W32STDGRAPHICTEST.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/w32stdgraphictest.h)
 
 //Plugin exports for partners
-../../inc/Graphics/WSPLUGIN.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsplugin.h)
-../../inc/Graphics/WsRenderStage.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsrenderstage.h)
-../../inc/Graphics/WsRenderStageFactory.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsrenderstagefactory.h)
-../../inc/Graphics/wscursor.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wscursor.h)
-../../inc/Graphics/wsgraphicscontext.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicscontext.h)
-../../inc/Graphics/wsscreendevice.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsscreendevice.h)
-../../inc/Graphics/wsuibuffer.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsuibuffer.h)
-../../inc/Graphics/wsdrawablesourceprovider.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdrawablesourceprovider.h)
-../../inc/Graphics/wsdisplaycontrol.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdisplaycontrol.h)
-../../inc/Graphics/openwfc/wsdisplaymapping.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdisplaymapping.h)
-../../inc/Graphics/wsdisplaypolicy.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdisplaypolicy.h)
-../../inc/Graphics/openwfc/wselement.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wselement.h)
-../../inc/Graphics/openwfc/wsscene.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsscene.h)
-../../inc/Graphics/wscontentreadyforcomposition.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wscontentreadyforcomposition.h)
+../../inc/graphics/WSPLUGIN.H SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsplugin.h)
+../../inc/graphics/WsRenderStage.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsrenderstage.h)
+../../inc/graphics/WsRenderStageFactory.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsrenderstagefactory.h)
+../../inc/graphics/wscursor.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wscursor.h)
+../../inc/graphics/wsgraphicscontext.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsgraphicscontext.h)
+../../inc/graphics/wsscreendevice.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsscreendevice.h)
+../../inc/graphics/wsuibuffer.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsuibuffer.h)
+../../inc/graphics/wsdrawablesourceprovider.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdrawablesourceprovider.h)
+../../inc/graphics/wsdisplaycontrol.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdisplaycontrol.h)
+../../inc/graphics/openwfc/wsdisplaymapping.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdisplaymapping.h)
+../../inc/graphics/wsdisplaypolicy.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdisplaypolicy.h)
+../../inc/graphics/openwfc/wselement.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wselement.h)
+../../inc/graphics/openwfc/wsscene.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsscene.h)
+../../inc/graphics/wskeyrouter.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wskeyrouter.h)
+../../inc/graphics/wscontentreadyforcomposition.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wscontentreadyforcomposition.h)
 
 //RemoteGc exports for partners
 ../../inc/RemoteGc.h		SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/remotegc.h)
@@ -86,21 +89,21 @@
 ../../inc/RemoteGcUtils.h	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/remotegcutils.h)
 
 //Test Screen Capture
-../../inc/Graphics/testscreencapture.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/testscreencapture.h)
-../../inc/Graphics/wsscreendeviceutils.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsscreendeviceutils.h)
-../../inc/Graphics/wstestscreencapture.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wstestscreencapture.h)
+../../inc/graphics/testscreencapture.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/testscreencapture.h)
+../../inc/graphics/wsscreendeviceutils.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsscreendeviceutils.h)
+../../inc/graphics/wstestscreencapture.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wstestscreencapture.h)
 
-../../inc/Graphics/wsdrawresource.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdrawresource.h)
+../../inc/graphics/wsdrawresource.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/wsdrawresource.h)
 
 #ifdef SYMBIAN_BUILD_GCE
 //Surface support
-../../inc/Graphics/surfaceconfiguration.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/surfaceconfiguration.h)
-../../inc/Graphics/openwfc/surfaceconfiguration.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/surfaceconfiguration.inl)
+../../inc/graphics/surfaceconfiguration.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/surfaceconfiguration.h)
+../../inc/graphics/openwfc/surfaceconfiguration.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/surfaceconfiguration.inl)
 //Display Control
-../../inc/Graphics/displaycontrol.h	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/displaycontrol.h)
+../../inc/graphics/displaycontrol.h	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/displaycontrol.h)
 
 //Display Mapping
-../../inc/Graphics/displaymapping.h	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/displaymapping.h)
+../../inc/graphics/displaymapping.h	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/displaymapping.h)
 
 
 #endif // SYMBIAN_BUILD_GCE
@@ -201,6 +204,7 @@
 #ifdef SYMBIAN_BUILD_GCE
 ../../group/AUTODLL_nga.MMP support
 ../../test/TAutoServer/openwfc/TAutoServer_nga.mmp
+../../test/TAutoServer/tevent_captureapp.mmp
 #endif
 
 #ifdef WINS
--- a/windowing/windowserver/group/openwfc/WServ_nga.MMP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/group/openwfc/WServ_nga.MMP	Wed Aug 18 11:05:09 2010 +0300
@@ -74,6 +74,7 @@
 SOURCE            drawresource.cpp
 SOURCE            devicemap.cpp
 SOURCE            wsdisplaychangeao.cpp
+SOURCE            renderorientationtracker.cpp
 
 SOURCEPATH        ../../nga/SERVER/openwfc
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/group/twsthemeserverpropertydefine.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,33 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This .exe is to define an RProperty for simulating the Theme Server.
+// It needs to have the same UID3 as the theme server.
+//
+
+TARGET			twsthemeserverpropertydefine.exe
+CAPABILITY 		WriteDeviceData ReadDeviceData
+TARGETTYPE		EXE
+//The UID3 value should be the same as the actual Theme Server UID3
+UID		0x00000000 0x20022E82 
+VENDORID 0x70000001
+
+SOURCEPATH		../test/tauto
+SOURCE			themeserverpropertydefine.cpp
+
+USERINCLUDE		../inc ../test/tauto
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY			euser.lib ws32.lib bafl.lib
+
+SMPSAFE
\ No newline at end of file
Binary file windowing/windowserver/group/wservu_multiscreen.ini has changed
Binary file windowing/windowserver/group/wservu_multiscreen_changetracking.ini has changed
--- a/windowing/windowserver/inc/Graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/inc/Graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H	Wed Aug 18 11:05:09 2010 +0300
@@ -849,7 +849,11 @@
 		EAlphaChannelTransparencyEnabled,
 		/** True if a clipping rect should be applied when drawing a standard text cursor, false otherwise.
 		The default value is false. */
-		ECursorClipRectSet
+		ECursorClipRectSet,
+		/** Implicitly defaults to true. Will remain true as long as the application's primary screendevice 
+		is in the same orientation as the device. This information is only given for top-windows, 
+		i.e. children of group-windows, and only when wsini.ini is configured with SIZE_MODE > 0. */
+		EScreenDeviceValid
 		};
 	/**
 	 This enum encapsulates the set of non-boolean attribute changes that can be observed
--- a/windowing/windowserver/inc/W32STD.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/inc/W32STD.H	Wed Aug 18 11:05:09 2010 +0300
@@ -33,6 +33,7 @@
 #include <advancedpointerevent.h>
 #include <sizemode.h>
 #include <babitflags.h>
+#include <wspublishandsubscribedata.h>
 
 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
 #include <graphics/windowserverconstants.h>
@@ -1380,6 +1381,7 @@
 		line. */
 		ECustomTextCursorAlignBottom
 		};
+	
 //
 public:
 	IMPORT_C RWsSession();
@@ -1538,6 +1540,9 @@
 	IMPORT_C void UnregisterAllEffects();
 	IMPORT_C void OverrideEffects(TInt aAction, TInt aPurpose, const TFileName& aResourceDir, const TFileName& aFilenameOutgoing, const TFileName& aFilenameIncoming, TBitFlags aFlags=0);
 	
+//Application tells the window server the orientation of rendering it intends to use
+	IMPORT_C void IndicateAppOrientation(TRenderOrientation aOrientation);
+	
 // functions not exported, used by CWsGraphic
 	void GraphicMessageReady(TRequestStatus *aStat);
 	void GetGraphicMessage(TDes8& aData) const;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/inc/graphics/wskeyrouter.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,216 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Key Event Routing Plug-in API
+
+/**
+@file
+@publishedPartner
+@prototype
+*/
+
+#ifndef WSKEYROUTER_H
+#define WSKEYROUTER_H
+
+#include <e32base.h>
+#include <w32std.h>
+
+/**
+Interface Uid
+*/
+const TUid KKeyRouterPluginUid = { 0x102872e1 };
+
+/**
+Key Capture Type
+*/
+enum TKeyCaptureType
+	{
+	ECaptureTypeKey = 0,
+	ECaptureTypeLongKey = 1,
+	ECaptureTypeKeyUpDown = 2
+	};
+
+/**
+Key Capture Request
+*/
+struct TKeyCaptureRequest
+	{
+	/** Capture type */
+	TKeyCaptureType	iType;
+
+	/** Keycode or scancode to be captured */
+	TUint			iInputCode;
+
+	/** Output keycode or scancode. When iInputCode is captured, RouteKey()
+		places iOutputCode in TKeyEventRouterOutput.iKeyEvent */
+	TUint			iOutputCode;
+
+	/** Bitmask of modifier keys of interest. Key events are captured only
+		when the modifier keys specified by iModifierMask are in the states
+		specified by iModifiers */
+	TUint			iModifierMask;
+
+	/** Bitmask of modifier key states */
+	TUint			iModifiers;
+
+	/** Opaque handle for this request */
+	TAny*			iHandle;
+
+	/** Opaque handle to window group through which request was made */
+	TAny*			iWindowGroup;
+
+	/** Identifier of the window group through which request was made */
+	TInt			iWindowGroupId;
+
+	/** UID of application that made the capture request */
+	TUid			iAppUid;
+
+	/** Capture priority for this request. If more than one window group has
+		requested capture for the same key event, the one with the highest
+		priority will capture it (unless overridden by application specific
+		rules). */
+	TInt			iPriority;
+
+	/** Reserved for future use */
+	TInt			iReserved[2];
+	};
+
+/**
+Input parameters for RouteKey()
+*/
+struct TKeyEventRouterInput
+	{
+	inline TKeyEventRouterInput(TKeyCaptureType aType, const TKeyEvent& aKeyEvent, TAny* aFocusWindowGroup, TUid aFocusAppUid);
+
+	/** Capture type */
+	TKeyCaptureType		iType;
+
+	/** Input key event */
+	TKeyEvent			iKeyEvent;
+
+	/** Opaque handle to current focussed window group */
+	TAny*				iFocusWindowGroup;
+
+	/** UID of client application with current focussed window group */
+	TUid				iFocusAppUid;
+
+	/** Reserved for future use */
+	TInt				iReserved[2];
+	};
+
+/**
+Result codes for RouteKey()
+*/
+enum TKeyEventRouterResult
+	{
+	/** Key routed, no capture */
+	ERouted = 0,
+
+	/** Key captured and routed */
+	ECaptured = 1,
+
+	/** Key consumed, do not deliver event */
+	EConsumed = 2
+	};
+
+/**
+Output parameters for RouteKey()
+*/
+struct TKeyEventRouterOutput
+	{
+	/** Result code */
+	TKeyEventRouterResult	iResult;
+
+	/** Output key event as translated by plug-in. Key code may be set by
+		RWindowGroup::CaptureLongKey() via TKeyCaptureRequest.iOutputCode **/
+	TKeyEvent				iKeyEvent;
+
+	/** Opaque handle to destination window group or NULL if captured by WServ
+		(hotkey). Plug-in must set this to either the window group from the
+		matching capture request or to TKeyEventRouterInput.iFocusWindowGroup */
+	TAny*					iWindowGroup;
+
+	/** Opaque handle from matching capture request or NULL if none */
+	TAny*					iCaptureHandle;
+
+	/** Reserved for future use */
+	TInt					iReserved[2];
+	};
+
+/**
+Key Event Router Interface
+
+This class is implemented by a plug-in DLL in order to perform customised
+routing of window server key events.
+
+The Key Event Routing plug-in is a polymorphic DLL that implements the
+CKeyEventRouter interface. Its UID1 and UID2 must be KDynamicLibraryUid and
+KKeyRouterPluginUid respectively. UID3 identifies a particular implementation
+of the plug-in. The first and only exported function should create and return
+an object of the CKeyEventRouter sub-class.
+*/
+class CKeyEventRouter : public CBase
+	{
+public:
+	/**
+	Create and return an instance of CKeyEventRouter
+
+	@return	Pointer to new router instance
+	*/
+	IMPORT_C static CKeyEventRouter* NewL();
+
+	/**
+	Add a new key capture request
+
+	@param	aRequest	Capture request details
+	*/
+	virtual void AddCaptureKeyL(const TKeyCaptureRequest& aRequest) = 0;
+	   
+	/**
+	Update an existing key capture request
+
+	@param	aRequest	Updated capture request details
+	*/
+	virtual void UpdateCaptureKeyL(const TKeyCaptureRequest& aRequest) = 0;
+
+	/**
+	Cancel a key capture request
+
+	@param	aType		Capture type
+	@param	aHandle		Opaque handle of request to be cancelled
+	*/
+	virtual void CancelCaptureKey(TKeyCaptureType aType, TAny* aHandle) = 0;
+
+	/**
+	Route the key event described by aInput and return its destination
+	in iOutput.
+
+	@param	aInput		Input data with key event to be routed
+	@param	aOutput		Output key event and routing results
+	*/
+	virtual void RouteKey(const TKeyEventRouterInput& aInput,
+						  TKeyEventRouterOutput& aOutput) = 0;
+
+	/**
+	Reserved for future use
+	*/
+private:
+	virtual void Reserved1() {};
+	virtual void Reserved2() {};
+	};
+
+inline TKeyEventRouterInput::TKeyEventRouterInput(TKeyCaptureType aType, const TKeyEvent& aKeyEvent, TAny* aFocusWindowGroup, TUid aFocusAppUid) : iType(aType), iKeyEvent(aKeyEvent), iFocusWindowGroup(aFocusWindowGroup), iFocusAppUid(aFocusAppUid)
+	{
+	}
+
+#endif // WSKEYROUTER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/inc/wspublishandsubscribedata.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,47 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Standard window server header file
+// 
+//
+#ifndef WSPUBLISHANDSUBSCRIBEDATA_H
+#define WSPUBLISHANDSUBSCRIBEDATA_H
+
+#include <e32cmn.h>
+
+// Values for the render orientation P&S value that we publish
+// Used when the property is defined, attached to, and deleted
+const TUid  KRenderOrientationCategory  = {268450592};  // WServ UID3
+const TUint KRenderOrientationKey       = 0x102872E5;
+
+/** The orientation of rendering the application intends to use.
+
+@see RWsSession::IndicateAppOrientation(TOrientation aOrientation)*/
+enum TRenderOrientation
+    {
+    /** Fixed default orientation */
+    EDisplayOrientationNormal,
+    /** 90° clockwise */
+    EDisplayOrientation90CW,
+    /** 180° */
+    EDisplayOrientation180,
+    /** 270° clockwise */
+    EDisplayOrientation270CW,
+    /** The orientation is from the P&S Key */
+    EDisplayOrientationAuto,
+    /** use the orientation specified by the next top level window(s) that does not have ignore flag set. 
+    E.g. system dialog on top of foreground app. */
+    EDisplayOrientationIgnore
+    };
+
+#endif // WSPUBLISHANDSUBSCRIBEDATA_H
--- a/windowing/windowserver/nga/CLIENT/RWINDOW.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/CLIENT/RWINDOW.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1363,7 +1363,7 @@
 events from all detected pointers to this window.
 
 This method must be called before the window is activated by calling RWindowBase::Activate().
-Otherwise this will be ignored (release build), or panic (debug build). 
+Otherwise the client is panicked with the code EWservPanicUnableToEnableAdvPointer.
 
 If this method is not called for the window, it is assumed that the window is not
 able to receive events from multiple pointers, and thus only events from a single
@@ -2798,6 +2798,7 @@
 description above. 
 @param aPriority A priority value - if more than one window group has requested 
 capture for the same key event, the one with the highest priority will capture it.
+The value must be greater than KMinTInt.
 @return A handle identifying the capture key, or one of the system-wide error 
 codes (if <0). KErrPermissionDenied indicates that the requested key cannot be 
 captured by this window group, because it has been protected by another window group. 
@@ -2866,6 +2867,7 @@
 aModifierMask need to be set and which need to be unset. 
 @param aPriority A priority value - if more than one window group has requested 
 capture for the same key event, the one with the highest priority will capture it.
+The value must be greater than KMinTInt.
 @return A handle identifying the capture key, or one of the system-wide error 
 codes (if < 0). KErrPermissionDenied indicates that the requested key cannot be captured by this 
 window group, because it has been protected by another window group. For more information, see 
@@ -2937,6 +2939,7 @@
 not set. Modifier key states are defined in TEventModifier. 
 @param aPriority If more than one window group has requested capture for the 
 same long key event, the one with the highest priority will capture the event.
+The value must be greater than KMinTInt.
 @param aFlags Configures the long key capture behaviour. See the TLongCaptureFlags 
 enum.
 @return Identifying value for the long key capture. For use with the CancelCaptureLongKey() 
@@ -2972,6 +2975,7 @@
 not set. Modifier key states are defined in TEventModifier. 
 @param aPriority If more than one window group has requested capture for the 
 same long key event, the one with the highest priority will capture the event.
+The value must be greater than KMinTInt.
 @param aFlags Configures the long key capture behaviour. See the TLongCaptureFlags 
 enum.
 @return Identifying value for the long key capture. For use with the CancelCaptureLongKey() 
--- a/windowing/windowserver/nga/CLIENT/RWS.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/CLIENT/RWS.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -22,6 +22,7 @@
 #include "CLIENT.H"
 #include "graphics/windowserverconstants.h"
 #include "rtfxeffect.h"
+#include <wspublishandsubscribedata.h>
 
 const TInt KMaxWSERVMessagesSlot=-1;
 
@@ -2585,3 +2586,15 @@
 	RTFXEffect tfxEffect(iWsHandle, iBuffer);
 	tfxEffect.OverrideTFXEffect(RTFXEffect::ETFXSession, aAction, aPurpose, aResourceDir, aFilenameOutgoing, aFilenameIncoming, aFlags);
 	}
+
+EXPORT_C void RWsSession::IndicateAppOrientation(TRenderOrientation aOrientation)
+/**
+Application informs window server the orientation of rendering it intends to use
+
+@param aOrientation The orientation the application intends to use
+
+@publishedPartner
+*/
+	{
+	return(WriteInt(aOrientation,EWsClOpIndicateAppOrientation));
+	}
--- a/windowing/windowserver/nga/CLIENT/WSGRAPHIC.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/CLIENT/WSGRAPHIC.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -20,7 +20,7 @@
 #include "w32comm.h"
 #include "CLIENT.H"
 #include <s32mem.h>
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 NONSHARABLE_STRUCT(CWsGraphic::CPimpl): public CBase, public MWsClientClass
 /** @internalComponent @released */
--- a/windowing/windowserver/nga/SERVER/CAPKEY.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/CAPKEY.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -24,9 +24,6 @@
 _LIT(KWsProtectedKey, "PROTECTEDKEY");
 _LIT(KWsProtectedWindowName, "PROTECTEDKEYWINDOWNAME");
 
-TPriQue<CWsCaptureKeyUpsAndDowns> CWsCaptureKeyUpsAndDowns::iCaptureKeysUpsAndDowns(_FOFF(CWsCaptureKeyUpsAndDowns,iLink));
-TPriQue<CWsCaptureLongKey> CWsCaptureLongKey::iCaptureLongKeys(_FOFF(CWsCaptureLongKey,iLink));
-
 
 /*CWsCaptureKey*/
 
@@ -35,20 +32,38 @@
 
 CWsCaptureKey::~CWsCaptureKey()
 	{
-	TWindowServerEvent::CancelCaptureKey((TUint32)this);
+	TWindowServerEvent::CancelCaptureKey(ECaptureTypeKey, this);
 	}
 
-void CWsCaptureKey::CmdToParams(const TWsWinCmdCaptureKey &aCaptureKey, TCaptureKey &aParams)
+/**
+Convert a window server key capture command to a capture request for the
+key routing plug-in.
+
+@param	aCaptureKey		Input capture command
+@param	aRequest		Output capture request
+*/
+void CWsCaptureKey::CmdToRequest(const TWsWinCmdCaptureKey &aCaptureKey, TKeyCaptureRequest &aRequest)
 	{
-	aParams.iModifiers.iMask=aCaptureKey.modifierMask;
-	aParams.iModifiers.iValue=aCaptureKey.modifiers;
-	aParams.iKeyCodePattern.iKeyCode=(TInt16)aCaptureKey.key;
-	aParams.iKeyCodePattern.iPattern=EMatchKey;
-	aParams.iKeyCodePattern.iFiller=STATIC_CAST(TUint8,aCaptureKey.priority);
-	aParams.iApp=(TUint32)iWindowGroup;
-	aParams.iHandle=(TUint32)this;
+	aRequest.iType = ECaptureTypeKey;
+	aRequest.iModifierMask = aCaptureKey.modifierMask;
+	aRequest.iModifiers = aCaptureKey.modifiers;
+	aRequest.iInputCode = aCaptureKey.key;
+	aRequest.iOutputCode = aCaptureKey.key;
+	aRequest.iPriority = aCaptureKey.priority;
+	aRequest.iWindowGroup = iWindowGroup;
+	aRequest.iWindowGroupId = iWindowGroup ? iWindowGroup->Identifier() : 0;
+	aRequest.iAppUid = iWsOwner ? TUid::Uid(iWsOwner->SecureId().iId) : KNullUid;
+	aRequest.iHandle = this;
 	}
 
+/**
+Check for protected key in a capture command
+
+@param	aWindowGroup	Window Group of capture request
+@param	aCaptureKey		Key capture command
+
+@leave KErrPermissionDenied		Capture key is protected
+*/
 void CheckProtectedKeyL(CWsWindowGroup* aWindowGroup,const TWsWinCmdCaptureKey &aCaptureKey)
 	{
 	//The key specified in the WSINI file with the keyword: PROTECTEDKEY can only be captured 
@@ -56,7 +71,7 @@
 	TInt protectedKey;
 	if(WsIniFile->FindVar(KWsProtectedKey,protectedKey))
 		{
-		if (aCaptureKey.key == (TUint)protectedKey)
+		if (aCaptureKey.key == static_cast<TUint>(protectedKey))
 			{
 			if (aWindowGroup->GroupName()==NULL)
 				{
@@ -73,20 +88,36 @@
 		}
 	}
 
+/**
+Construct a capture object for normal key events and make a capture request
+to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from RWindowGroup::CaptureKey(),
+						RWsSession::SetHotKey() or default hot key settings.
+*/
 void CWsCaptureKey::ConstructL(const TWsWinCmdCaptureKey &aCaptureKey)
 	{
 	CheckProtectedKeyL(iWindowGroup, aCaptureKey);
 	NewObjL();
-	TCaptureKey params;
-	CmdToParams(aCaptureKey, params);
-	TWindowServerEvent::AddCaptureKeyL(params);
+
+	TKeyCaptureRequest request;
+	CmdToRequest(aCaptureKey, request);
+	TWindowServerEvent::AddCaptureKeyL(request);
 	}
 
+/**
+Make a capture request update for normal key events to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from CWsHotKey::SetL()
+
+Note: this function is used only to disable hot key capture requests or to
+reset them to their defaults.
+*/
 void CWsCaptureKey::SetL(const TWsWinCmdCaptureKey &aCaptureKey)
 	{
-	TCaptureKey params;
-	CmdToParams(aCaptureKey, params);
-	TWindowServerEvent::SetCaptureKey((TUint32)this, params);
+	TKeyCaptureRequest request;
+	CmdToRequest(aCaptureKey, request);
+	TWindowServerEvent::UpdateCaptureKeyL(request);
 	}
 
 void CWsCaptureKey::CommandL(TInt , const TAny *)
@@ -101,37 +132,39 @@
 
 CWsCaptureKeyUpsAndDowns::~CWsCaptureKeyUpsAndDowns()
 	{
-	iLink.Deque();
+	TWindowServerEvent::CancelCaptureKey(ECaptureTypeKeyUpDown, this);
 	}
 
+/**
+Construct a capture object for up/down key events and make a capture request
+to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from
+						RWindowGroup::CaptureKeyUpAndDowns().
+*/
 void CWsCaptureKeyUpsAndDowns::ConstructL(const TWsWinCmdCaptureKey &aCaptureKey)
 	{
 	CheckProtectedKeyL(iWindowGroup, aCaptureKey);
 	NewObjL();
-	iModifierMask=aCaptureKey.modifierMask;
-	iModifierValue=aCaptureKey.modifiers;
-	iScanCode=aCaptureKey.key;
-	iLink.iPriority=aCaptureKey.priority + 1;
-	iCaptureKeysUpsAndDowns.Add(*this);
-	--iLink.iPriority;
+
+	TKeyCaptureRequest request;
+	request.iType = ECaptureTypeKeyUpDown;
+	request.iInputCode = aCaptureKey.key;
+	request.iOutputCode = aCaptureKey.key;
+	request.iModifiers = aCaptureKey.modifiers;
+	request.iModifierMask = aCaptureKey.modifierMask;
+	request.iPriority = aCaptureKey.priority;
+	request.iWindowGroup = iWindowGroup;
+	request.iWindowGroupId = iWindowGroup ? iWindowGroup->Identifier() : 0;
+	request.iAppUid = iWsOwner ? TUid::Uid(iWsOwner->SecureId().iId) : KNullUid;
+	request.iHandle = this;
+	TWindowServerEvent::AddCaptureKeyL(request);
 	}
 
 void CWsCaptureKeyUpsAndDowns::CommandL(TInt , const TAny *)
 	{
 	}
 
-CWsWindowGroup *CWsCaptureKeyUpsAndDowns::CheckForCapture(TUint aScanCode, TUint aModifiers)
-	{
-	TDblQueIter<CWsCaptureKeyUpsAndDowns> iter(iCaptureKeysUpsAndDowns);
-	CWsCaptureKeyUpsAndDowns* cap;
-	while ((cap=iter++)!=NULL)
-		{
-		if (cap->iScanCode==aScanCode && (aModifiers&cap->iModifierMask)==cap->iModifierValue)
-			return(cap->iWindowGroup);
-		}
-	return NULL;
-	}
-
 
 /*CWsCaptureLongKey*/
 
@@ -141,35 +174,40 @@
 
 CWsCaptureLongKey::~CWsCaptureLongKey()
 	{
-	iLink.Deque();
+	TWindowServerEvent::CancelCaptureKey(ECaptureTypeLongKey, this);
 	}
 
+/**
+Construct a capture object for long key events and make a capture request
+to the key routing plug-in.
+
+@param	aCaptureKey		Key capture command from RWindowGroup::CaptureLongKey()
+*/
 void CWsCaptureLongKey::ConstructL(const TWsWinCmdCaptureLongKey &aCaptureKey)
 	{
 	NewObjL();
-	iData=aCaptureKey;
-	if (iData.delay.Int()<0)
+	iFlags = aCaptureKey.flags;
+	iDelay = aCaptureKey.delay;
+	if (iDelay.Int() < 0)
 		{
 		TTimeIntervalMicroSeconds32 time;
-		CKeyboardRepeat::GetRepeatTime(iData.delay,time);
+		CKeyboardRepeat::GetRepeatTime(iDelay, time);
 		}
-	iLink.iPriority=iData.priority + 1;
-	iCaptureLongKeys.Add(*this);
-	--iLink.iPriority;
+
+	TKeyCaptureRequest request;
+	request.iType = ECaptureTypeLongKey;
+	request.iInputCode = aCaptureKey.inputKey;
+	request.iOutputCode = aCaptureKey.outputKey;
+	request.iModifiers = aCaptureKey.modifiers;
+	request.iModifierMask = aCaptureKey.modifierMask;
+	request.iPriority = aCaptureKey.priority;
+	request.iWindowGroup = iWindowGroup;
+	request.iWindowGroupId = iWindowGroup ? iWindowGroup->Identifier() : 0;
+	request.iAppUid = iWsOwner ? TUid::Uid(iWsOwner->SecureId().iId) : KNullUid;
+	request.iHandle = this;
+	TWindowServerEvent::AddCaptureKeyL(request);
 	}
 
 void CWsCaptureLongKey::CommandL(TInt , const TAny *)
 	{
 	}
-
-CWsCaptureLongKey* CWsCaptureLongKey::CheckForCapture(TUint aKeyCode, TInt aModifiers)
-	{
-	TDblQueIter<CWsCaptureLongKey> iter(iCaptureLongKeys);
-	CWsCaptureLongKey* longCapture;
-	while ((longCapture=iter++)!=NULL)
-		{
-		if (aKeyCode==longCapture->iData.inputKey && (aModifiers&longCapture->iData.modifierMask)==longCapture->iData.modifiers)
-			return longCapture;
-		}
-	return NULL;
-	}
--- a/windowing/windowserver/nga/SERVER/EVENT.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/EVENT.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -18,6 +18,7 @@
 #include "EVENT.H"
 
 #include "W32STD.H"
+#include <e32uid.h>
 #include <hal.h>
 #include <w32adll.h>
 #include "W32CLICK.H"
@@ -32,13 +33,17 @@
 #include "pointer.h"
 #include "debugbar.h"
 #include "advancedpointereventhelper.h"
-#include "Graphics/wsgraphicdrawerinternal.h"
+#include "graphics/wsgraphicdrawerinternal.h"
+#include "debughelper.h"
 
 GLREF_D CDebugLogBase *wsDebugLog;
 
 GLREF_C void StateDump();
 GLREF_C void HeapDump();
 
+_LIT(KDefaultKeyRouterPluginName, "keyrouter.dll");
+_LIT(KWSERVIniFileVarKeyRouterPlugin, "KEYROUTERPLUGIN");
+
 #define IMPOSSIBLE 0xFFFFFFFF
 
 const TWsWinCmdCaptureKey ImpossibleKeyPress=
@@ -161,6 +166,8 @@
 TEventRequestQueue TWindowServerEvent::iScreenDeviceChangedQueue;
 TTime TWindowServerEvent::iPrevOomMessageTime;
 CCaptureKeys *TWindowServerEvent::iCaptureKeys;
+CKeyEventRouter* TWindowServerEvent::iKeyEventRouter;
+RLibrary TWindowServerEvent::iKeyEventRouterLibrary;
 CWsHotKey *TWindowServerEvent::iHotKeys;
 TInt TWindowServerEvent::iModifierState;
 CRawEventReceiver *TWindowServerEvent::iEventReceiver;
@@ -173,12 +180,12 @@
 TInt TWindowServerEvent::iEventHandlerCount=0;
 TRepeatKey CKeyboardRepeat::iCurrentRepeat;
 TRepeatKey CKeyboardRepeat::iAlternateRepeat;
+TRepeatKey CKeyboardRepeat::iLongRepeat;
 TInt CKeyboardRepeat::iRepeatRollover=1;
 CKeyboardRepeat::TRepeatType CKeyboardRepeat::iRepeating=ERepeatNone;
 CKeyboardRepeat *CKeyboardRepeat::iThis=NULL;
 TTimeIntervalMicroSeconds32 CKeyboardRepeat::iInitialTime;
 TTimeIntervalMicroSeconds32 CKeyboardRepeat::iTime;
-CWsWindowGroup *CKeyboardRepeat::iFocus=NULL;
 TBool CKeyboardRepeat::iAlternateRepeatExists=EFalse;
 CWsCaptureLongKey* CKeyboardRepeat::iLongCapture=NULL;
 
@@ -199,6 +206,8 @@
 	{
 	DeleteHotKeys();
 	delete iCaptureKeys;
+	delete iKeyEventRouter;
+	iKeyEventRouterLibrary.Close();
 	CKeyboardRepeat::Destroy();
 	delete iKeyTranslator;
 	delete iEventReceiver;
@@ -232,8 +241,57 @@
 		iKeyTranslator->ChangeKeyData(keyDataDllName);
 		}
 
+	// CCaptureKeys is no longer used but a dummy object is required for
+	// calls to CKeyTranslator::TranslateKey() until capture functionality
+	// has been removed from ektran.dll.
 	iCaptureKeys=new(ELeave) CCaptureKeys;
 	iCaptureKeys->Construct();
+
+	// Load the key event routing plug-in. The DLL name may be overridden
+	// by setting the keyword KEYROUTERPLUGIN in wsini.ini.
+	TPtrC pluginName(KDefaultKeyRouterPluginName);
+	WsIniFile->FindVar(KWSERVIniFileVarKeyRouterPlugin, pluginName);
+	const TUidType uidType(KDynamicLibraryUid, KKeyRouterPluginUid);
+	TInt err = iKeyEventRouterLibrary.Load(pluginName, uidType);
+
+	if (wsDebugLog)
+		{
+		TLogMessageText buf;
+
+		if (err == KErrNone)
+			{
+			_LIT(KLogLoadOk, "Loaded plugin '%S' UID3 0x%x");
+			const TFileName& pluginPathname = iKeyEventRouterLibrary.FileName();
+			const TUid uid3 = iKeyEventRouterLibrary.Type()[2];
+			buf.Format(KLogLoadOk, &pluginPathname, uid3.iUid);
+			}
+		else
+			{
+			_LIT(KLogLoadError, "Failed to load plugin '%S' (error %d)");
+			buf.Format(KLogLoadError, &pluginName, err);
+			}
+
+		wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
+		}
+
+	if (err != KErrNone)
+		{
+#ifdef _DEBUG
+		_LIT(KLoadError, "WServ: failed to load plugin '%S' (error %d)");
+		RDebug::Print(KLoadError, &pluginName, err);
+#endif
+		User::Leave(err);
+		}
+
+	// Create the key event router
+	typedef CKeyEventRouter* (*TCreateFunc)();
+	TCreateFunc newL = reinterpret_cast<TCreateFunc>(iKeyEventRouterLibrary.Lookup(1));
+	if (newL == NULL)
+		{
+		User::Leave(KErrNotFound);
+		}
+	iKeyEventRouter = (*newL)();
+
 	for (TInt index=0;index<TWindowServerEvent::ENumHotKeys;index++)
 		ConstructDefaultHotKeyL(index,DefaultHotKeys[index]);
 	CKeyboardRepeat::NewL();
@@ -313,6 +371,7 @@
 	captureKey.modifiers=aHotKey.modifiers;
 	captureKey.modifierMask=aHotKey.modifierMask;
 	captureKey.key=aHotKey.keycode;
+	captureKey.priority = 0;
 	hotKey->ConstructLD(captureKey);
 //
 	LinkHotKey(hotKey);
@@ -326,6 +385,9 @@
 #else
 	iEventHandlers.AppendL(TRawEventHandler(aEventHandler, aAdvancedPointersEnabled));	//Shouldn't leave
 #endif
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::AddEventHandler Added handler = %d AdvancedPointerEnabled = %d", iEventHandlers.Count(),aAdvancedPointersEnabled);
+#endif
 	}
 
 void TWindowServerEvent::RemoveEventHandler(const MEventHandler *aEventHandler)
@@ -336,6 +398,9 @@
 		{
 		if (iEventHandlers[ii].iEventHandler==aEventHandler)
 			{
+#ifdef LOG_WSERV_EVENTS
+		    RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::RemoveEventHandler Removed handler = %d",ii);
+#endif
 			if (iEventHandlerCount>0)  
 				{
 				iBinaryFlags |= ERemovedEventHandlerWhileProcessingRawEvents;
@@ -653,27 +718,75 @@
 
 void TWindowServerEvent::QueueKeyEvent(CWsWindowGroup *aWin, TWsEvent &aEvent, TWservEventPriorities aPriority)
 	{
+#ifdef LOG_WSERV_EVENTS
+    RDebug::Print(_L("_WSEVENT_KEY: TWindowServerEvent::QueueKeyEvent, Queuing event name %S for application read, window handle: %d"), &WsEventName(aEvent), CWsTop::FocusWindowGroup()->ClientHandle());
+#endif
 	aEvent.SetTimeNow();
 	aWin->EventQueue()->QueueEvent(aEvent, aPriority);
 	}
 
-void TWindowServerEvent::QueueKeyPress(const TKeyData& aKey, TInt aScanCode, CWsWindowGroup* aRepeatFocus, TBool aCheckRepeat,TInt aRepeats)
+/**
+Process a key press event.
+
+This function is called for every input key event and uses the Key Event
+Routing plug-in to check for short and long key capture and determine the
+destination window group for the queued event(s).
+Window server hotkeys are also processed.
+Note that the key repeat timer is started here but the key repeat events
+generated by the timer go directly to QueueKeyPress().
+
+@param	aKeyEvent		Input key event
+@param	aCheckRepeat	Check for key repeat and long key capture
+@param	aRepeats		Repeat count
+*/
+void TWindowServerEvent::ProcessKeyPress(const TKeyEvent& aKeyEvent, TBool aCheckRepeat, TInt aRepeats)
  	{
-	CWsWindowGroup* focusWin=CWsTop::FocusWindowGroup();
-	TWsEvent event;
-	TKeyEvent& keyEvent=*event.Key();
-	keyEvent.iCode=aKey.iKeyCode;
-	keyEvent.iScanCode=aScanCode;
-	keyEvent.iModifiers=aKey.iModifiers;
-	keyEvent.iRepeats=aRepeats;
-	if (!aRepeatFocus && CClick::IsHandler())
-		CClick::KeyEvent(EEventKey,keyEvent);
-	CWsCaptureLongKey* longCapture=NULL;
-	if (aCheckRepeat)
-		longCapture=CWsCaptureLongKey::CheckForCapture(aKey.iKeyCode, aKey.iModifiers);
-	if (aKey.iIsCaptureKey)
+	CWsWindowGroup* focusWin = CWsTop::FocusWindowGroup();
+	TUid focusAppUid = focusWin ? TUid::Uid(focusWin->Client()->SecureId().iId) : KNullUid;
+
+	// Route the key event and check for short key capture.
+	// Note that the Key Routing plugin may translate or block key events.
+	TKeyEventRouterInput input(ECaptureTypeKey, aKeyEvent, focusWin, focusAppUid);
+	TKeyEventRouterOutput output;
+
+#ifdef _DEBUG
+	// RouteKey() must not fail. Check for leaves in case the plug-in
+	// is badly behaved.
+	TRAPD(err, iKeyEventRouter->RouteKey(input, output));
+	WS_ASSERT_DEBUG(err == KErrNone, EWsPanicKeyEventRouterLeave);
+#else
+	iKeyEventRouter->RouteKey(input, output);
+#endif
+
+	WS_ASSERT_DEBUG(output.iResult == ERouted || output.iResult == ECaptured || output.iResult == EConsumed, EWsPanicKeyEventRouterBadResult);
+
+	if (output.iResult == EConsumed)
 		{
-		if (aKey.iApp==NULL)	// Captured by Wserv itself
+		focusWin = NULL;
+		}
+	else
+		{
+		focusWin = static_cast<CWsWindowGroup*>(output.iWindowGroup);
+		}
+	WS_ASSERT_DEBUG((focusWin == NULL || focusWin->Type() == WS_HANDLE_GROUP_WINDOW) && (output.iResult != ERouted || focusWin == CWsTop::FocusWindowGroup()), EWsPanicKeyEventRouterBadWindowGroup);
+
+	// Ensure that short event is not marked with EModifierLongKey
+	output.iKeyEvent.iModifiers &= ~EModifierLongKey;
+
+	// Generate key click unless the event is consumed. This is consistent
+	// with the behaviour when CKeyTranslator::TranslateKey() yields no
+	// translation for a particular scan code. (Click events for key up/down
+	// will still be generated by QueueKeyUpDown()). Note however that a long
+	// key press may still be captured even if the short event is consumed.
+	if (CClick::IsHandler() && output.iResult != EConsumed)
+		{
+		output.iKeyEvent.iRepeats = aRepeats;
+		CClick::KeyEvent(EEventKey, output.iKeyEvent);
+		}
+
+	if (output.iResult == ECaptured)
+		{
+		if (output.iWindowGroup == NULL)	// Captured by Wserv itself
 			{
 			_LIT(KWSERVDebugLogCapturedKey,"WSERV Captured Key");
 			CScreen* focusScreen=CWsTop::CurrentFocusScreen();
@@ -684,7 +797,7 @@
 			CWsHotKey *hotKey=iHotKeys;
 			while(hotKey)
 				{
-				if (hotKey->KeyHandle()==aKey.iHandle)
+				if (hotKey->KeyHandle() == reinterpret_cast<TInt>(output.iCaptureHandle))
 					{
 					switch(hotKey->HotKeyType())
 						{
@@ -769,22 +882,85 @@
 			WS_PANIC_ALWAYS(EWsPanicUnknownCaptureKey);
 			return;
 			}
-		focusWin=((CWsWindowGroup *)aKey.iApp);
+
 		_LIT(KWSERVDebugLogKeyCapturedByApp,"Key captured by app %d");
 		if (wsDebugLog)
 			wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,KWSERVDebugLogKeyCapturedByApp,focusWin->Identifier());
 		if (CWsPassword::PasswordModeActive() && focusWin!=CWsPassword::PasswordWindow()->WinGroup())
 			return;
 		}
-	if (aRepeatFocus && aRepeatFocus!=focusWin)
-		CKeyboardRepeat::CancelRepeat(NULL);		// Repeat is going to different window so cancel it and don't deliver this key
-	else if (focusWin!=NULL && focusWin->CheckForPriorityKey(aKey,aScanCode)==EFalse)
+
+	CWsCaptureLongKey* longCapture = NULL;
+	TKeyEventRouterOutput longOutput;
+	if (aCheckRepeat)
 		{
-		if (longCapture || (aCheckRepeat && !aRepeatFocus && aKey.iModifiers&EModifierAutorepeatable))
+		// Check for long key capture.
+		// Note that a long key event can only result from capture, there is
+		// no default detection or routing of long events.
+		input.iType = ECaptureTypeLongKey;
+#ifdef _DEBUG
+		TRAPD(err, iKeyEventRouter->RouteKey(input, longOutput));
+		WS_ASSERT_DEBUG(err == KErrNone, EWsPanicKeyEventRouterLeave);
+#else
+		iKeyEventRouter->RouteKey(input, longOutput);
+#endif
+
+		if (longOutput.iResult == ECaptured)
+			{
+			longCapture = static_cast<CWsCaptureLongKey*>(longOutput.iCaptureHandle);
+
+			// Mark long key events with EModifierLongKey so that applications
+			// can easily distinguish short and long events.
+			longOutput.iKeyEvent.iModifiers |= EModifierLongKey;
+
+			// Start timer to detect long key press
+			CKeyboardRepeat::StartRepeat(aKeyEvent.iScanCode, output, &longOutput);
+			}
+		else if (output.iResult != EConsumed && output.iKeyEvent.iModifiers & EModifierAutorepeatable)
 			{
-			if (CKeyboardRepeat::StartRepeat(aKey,aScanCode,focusWin,longCapture))
-				return;
+			// Start timer for key repeat
+			CKeyboardRepeat::StartRepeat(aKeyEvent.iScanCode, output, NULL);
 			}
+		}
+
+	// Queue the short event
+	if (!longCapture || longCapture->iFlags & ELongCaptureShortEventImmediately)
+		{
+		QueueKeyPress(output, EFalse, aRepeats);
+		}
+	}
+
+/**
+Queue a key press event.
+
+This function is called for each key event produced by ProcessKeyPress(),
+for every key repeat and long key event generated by the timer and also for
+delayed short key events from KeyUp().
+
+@param	aOutput			Output key event from routing plug-in
+@param	aIsRepeat		Event is due to key repeat
+@param	aRepeats		Repeat count
+*/
+void TWindowServerEvent::QueueKeyPress(const TKeyEventRouterOutput& aOutput, TBool aIsRepeat, TInt aRepeats)
+ 	{
+	if (aOutput.iResult == EConsumed)
+		{
+		// Don't deliver this key
+		return;
+		}
+
+	TWsEvent event;
+	TKeyEvent& keyEvent = *event.Key();
+	keyEvent = aOutput.iKeyEvent;
+	keyEvent.iRepeats = aRepeats;
+
+	CWsWindowGroup* focusWin = static_cast<CWsWindowGroup*>(aOutput.iWindowGroup);
+	WS_ASSERT_DEBUG(focusWin == NULL || focusWin->Type() == WS_HANDLE_GROUP_WINDOW, EWsPanicKeyEventRouterBadWindowGroup);
+
+	if (aIsRepeat && aOutput.iResult != ECaptured && focusWin != CWsTop::FocusWindowGroup())
+		CKeyboardRepeat::CancelRepeat(NULL);		// Repeat is going to different window so cancel it and don't deliver this key
+	else if (focusWin != NULL && focusWin->CheckForPriorityKey(keyEvent) == EFalse)
+		{
 		event.SetType(EEventKey);
 		event.SetHandle(focusWin->ClientHandle());
 		if (aRepeats!=0)
@@ -792,18 +968,15 @@
 			CEventQueue* queue=focusWin->EventQueue();
 			queue->Wait();
 			const TWsEvent* prev=queue->PeekLastEvent();
-			if (prev!=NULL && prev->Type()==EEventKey && prev->Key()->iRepeats>0)
+			if (prev != NULL && prev->Type() == EEventKey && prev->Key()->iRepeats > 0 && prev->Key()->iCode == keyEvent.iCode)
 				{
-				event= *prev;
-				event.Key()->iRepeats+=aRepeats;
-				queue->UpdateLastEvent(event);
+				prev->Key()->iRepeats += aRepeats;
 				queue->Signal();
 				if (CClick::IsHandler())
-					CClick::KeyEvent(EEventKeyRepeat,*event.Key());
+					CClick::KeyEvent(EEventKeyRepeat, *prev->Key());
 				return;
 				}
 			queue->Signal();
-			event.Key()->iRepeats=aRepeats;
 			if (CClick::IsHandler())
 				CClick::KeyEvent(EEventKeyRepeat,keyEvent);
 			}
@@ -811,24 +984,72 @@
 		}
 	}
 
+/**
+Queue a key up/down event.
+
+@param	aRawEvent		Raw event
+*/
 void TWindowServerEvent::QueueKeyUpDown(const TRawEvent &aRawEvent)
  	{
-	CWsWindowGroup *focusWin=CWsCaptureKeyUpsAndDowns::CheckForCapture(aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE, iModifierState);
-	if (!focusWin)	// If not captured
-		focusWin=CWsTop::FocusWindowGroup();
-	TWsEvent event;
-	TEventCode type=aRawEvent.Type()==TRawEvent::EKeyUp ? EEventKeyUp : EEventKeyDown;
-	event.Key()->iCode=0;
+#ifdef LOG_WSERV_EVENTS
+    RDebug::Print(_L("_WSEVENT_KEY: TWindowServerEvent::QueueKeyUpDown, Event Name: %S, Scan code: %d"), &RawEventName(aRawEvent), aRawEvent.ScanCode());
+#endif
+	TEventCode type = aRawEvent.Type() == TRawEvent::EKeyUp ? EEventKeyUp : EEventKeyDown;
+
+	// Check for key up/down capture
+	TKeyEvent keyEvent;
+	keyEvent.iScanCode = aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE;
+#if defined(__WINS__)
+	keyEvent.iCode = __WINS_CHARCODE(aRawEvent.ScanCode());
+#else
+	keyEvent.iCode = 0;
+#endif
+	keyEvent.iModifiers = iModifierState;
+	keyEvent.iRepeats = 0;
+
+	CWsWindowGroup* focusWin = CWsTop::FocusWindowGroup();
+	TUid focusAppUid = focusWin ? TUid::Uid(focusWin->Client()->SecureId().iId) : KNullUid;
+
+	TKeyEventRouterInput input(ECaptureTypeKeyUpDown, keyEvent, focusWin, focusAppUid);
+	TKeyEventRouterOutput output;
+#ifdef _DEBUG
+	TRAPD(err, iKeyEventRouter->RouteKey(input, output));
+	WS_ASSERT_DEBUG(err == KErrNone, EWsPanicKeyEventRouterLeave);
+#else
+	iKeyEventRouter->RouteKey(input, output);
+#endif
+
+	if (output.iResult == EConsumed)
+		{
+		// Don't deliver this key. A key click is still generated for the
+		// input event.
+		if (CClick::IsHandler())
+			{
+			CClick::KeyEvent(type, keyEvent);
+			}
+		return;
+		}
+	WS_ASSERT_DEBUG(output.iResult == ERouted || output.iResult == ECaptured, EWsPanicKeyEventRouterBadResult);
+
+	focusWin = static_cast<CWsWindowGroup*>(output.iWindowGroup);
+	WS_ASSERT_DEBUG((focusWin == NULL || focusWin->Type() == WS_HANDLE_GROUP_WINDOW) && (output.iResult != ERouted || focusWin == CWsTop::FocusWindowGroup()), EWsPanicKeyEventRouterBadWindowGroup);
 #if defined(__WINS__)
 	if (focusWin && !focusWin->WsOwner()->RemoveKeyCode())
-		event.Key()->iScanCode=aRawEvent.ScanCode();
-	else
+		{
+		// Restore WINS character code
+		output.iKeyEvent.iScanCode |= output.iKeyEvent.iCode;
+		}
+	output.iKeyEvent.iCode = 0;
 #endif
-	event.Key()->iScanCode=aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE;
-	event.Key()->iModifiers=iModifierState;
-	event.Key()->iRepeats=0;
+
+	output.iKeyEvent.iRepeats = 0;
 	if (CClick::IsHandler())
-		CClick::KeyEvent(type,*event.Key());
+		{
+		CClick::KeyEvent(type, output.iKeyEvent);
+		}
+
+	TWsEvent event;
+	*event.Key() = output.iKeyEvent;
 	if (focusWin!=NULL)
 		{
 		event.SetType(type);
@@ -937,6 +1158,11 @@
 		}
 	}
 
+/*
+Process a raw event
+
+@param	aRawEvent	Raw event
+*/
 void TWindowServerEvent::ProcessRawEvent(const TRawEvent& aRawEvent)
 //
 // Event has completed.
@@ -946,7 +1172,11 @@
 	TBool isPointerEvent = TWsPointer::IsPointerEventType(eventType);
 	if (isPointerEvent)
 		{
-		TWsPointer::UpdatePrimaryPointer(aRawEvent);
+#ifdef LOG_WSERV_EVENTS
+        RDebug::Print(_L("_WSEVENT_POINTER: TWindowServerEvent::ProcessRawEvent EventName = %S PointerNumber = %d PrimaryPointerNumber = %d Coordinates = ( %d, %d )"), 
+                &RawEventName(aRawEvent),aRawEvent.PointerNumber(),TWsPointer::PrimaryPointer(),aRawEvent.Pos().iX,aRawEvent.Pos().iY); 
+#endif
+        TWsPointer::UpdatePrimaryPointer(aRawEvent);
 		}
 	TInt count=iEventHandlers.Count();
 	TInt ii;
@@ -963,9 +1193,15 @@
 			{
 			if (CClick::IsHandler())
 				{
+#ifdef LOG_WSERV_EVENTS
+				RDebug::Print(_L("_WSEVENT_KEY: Send event %S for Key Click"), &RawEventName(aRawEvent));
+#endif
 				SendEventToKeyClick(aRawEvent);
 				}
 			eventHandled = ETrue;
+#ifdef LOG_WSERV_EVENTS
+            RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::ProcessRawEvent Event Consumed by ANIM.dll Handler No = %d Advanced Pointer Enabled = %d",ii,handler.iAdvancedPointersEnabled);
+#endif
 			break;
 			}
 		}
@@ -982,12 +1218,45 @@
 		}
 	if (eventHandled)
 		{
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Printf("_WSEVENT: Event is already handled by anim dll not by window server");
+		// This is to determine when we press the power button which bring power dialog
+		// whether it is a pointer event or key event
+		// Also when we plugin the charging cable this is to determine whether it is a pointer event or key event
+		RDebug::Print(_L("_WSEVENT: RawEvent Name = %S"), &RawEventName(aRawEvent));
+#endif
 		if (isPointerEvent)
 			{
-			TWsPointer::RollbackPrimaryPointer();
+#ifdef LOG_WSERV_EVENTS
+			RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::ProcessRawEvent Pointer Number= %d  State = %x XY(%d,%d)",TWsPointer::iPointers[0].iNumber,TWsPointer::iPointers[0].iState,TWsPointer::iPointers[0].iPos.iX,TWsPointer::iPointers[0].iPos.iY);
+		    RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::ProcessRawEvent Pointer Number= %d  State = %x XY(%d,%d)",TWsPointer::iPointers[1].iNumber,TWsPointer::iPointers[1].iState,TWsPointer::iPointers[1].iPos.iX,TWsPointer::iPointers[1].iPos.iY);
+#endif
+              //Prevention of the phone pointer event "dead lock". 
+              TPointerEvent::TType type;
+              TBool handled = ETrue;
+              GetPointerEvent(type, aRawEvent, handled);
+              switch(type)
+                  {
+                  case TPointerEvent::EButton1Down:
+                  case TPointerEvent::EButton2Down:
+                  case TPointerEvent::EButton3Down:
+                      TWsPointer::iPointers[aRawEvent.PointerNumber()].iState = TWsPointer::EPointerStateDown;
+                      break;
+                  case TPointerEvent::EButton1Up:
+                  case TPointerEvent::EButton2Up:
+                  case TPointerEvent::EButton3Up:
+                      TWsPointer::iPointers[aRawEvent.PointerNumber()].iState = TWsPointer::EPointerStateUp;
+                      break;
+                  case TPointerEvent::EOutOfRange:
+                      TWsPointer::iPointers[aRawEvent.PointerNumber()].iState = TWsPointer::EPointerStateOutOfRange;
+                      break;
+                      default:
+                      break;
+                  }
 			}
 		return;
 		}
+	
 	switch(eventType)
 		{
 		case TRawEvent::ERedraw:
@@ -1035,6 +1304,9 @@
 			break;
 		case TRawEvent::EKeyDown:
 			{
+#ifdef LOG_WSERV_EVENTS
+			RDebug::Printf("_WSEVENT_KEY: TRawEvent::EKeyDown");
+#endif
 			_LIT(KWSERVDebugLogKeyDownArrival,"Key down arrives %d");
 			CScreen* screen = CWsTop::Screen();
 			WS_ASSERT_ALWAYS(screen, EWsPanicNoScreen);
@@ -1044,15 +1316,26 @@
 				wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,KWSERVDebugLogKeyDownArrival,aRawEvent.ScanCode());
 			CKeyboardRepeat::KeyDown();
 			TKeyData keyData;
+			// Note iCaptureKeys is needed as dummy arg only. Key capture is
+			// now handled in ProcessKeyPress().
 			TBool translated=iKeyTranslator->TranslateKey(aRawEvent.ScanCode(), EFalse,*iCaptureKeys,keyData);
 			ProcessModifierChanges();
 			QueueKeyUpDown(aRawEvent);
 			if (translated)
-				QueueKeyPress(keyData,aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE,NULL,ETrue,0);
+				{
+				TKeyEvent keyEvent;
+				keyEvent.iScanCode = aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE;
+				keyEvent.iCode = keyData.iKeyCode;
+				keyEvent.iModifiers = keyData.iModifiers;
+				ProcessKeyPress(keyEvent, ETrue, 0);
+				}
 			}
 			break;
 		case TRawEvent::EKeyUp:
 			{
+#ifdef LOG_WSERV_EVENTS
+			RDebug::Printf("_WSEVENT_KEY: TRawEvent::EKeyUp");
+#endif
 			_LIT(KWSERVDebugLogKeyUpArrival,"Key up arrives %d");
 			CScreen* screen = CWsTop::Screen();
 			WS_ASSERT_ALWAYS(screen, EWsPanicNoScreen);
@@ -1068,7 +1351,11 @@
 			if (translated)
 				{
 				CKeyboardRepeat::CancelRepeat(NULL);
-				QueueKeyPress(keyData,aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE,NULL,EFalse,0);
+				TKeyEvent keyEvent;
+				keyEvent.iScanCode = aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE;
+				keyEvent.iCode = keyData.iKeyCode;
+				keyEvent.iModifiers = keyData.iModifiers;
+				ProcessKeyPress(keyEvent, EFalse, 0);
 				}
 			}
 			break;
@@ -1099,23 +1386,27 @@
  			_LIT(KWSERVDebugLogRepeatingKeyArrival,"Repeating key arrives %d");
  			if (wsDebugLog)
  				wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,KWSERVDebugLogRepeatingKeyArrival,aRawEvent.ScanCode());
- 			TKeyData keyData;
- 			keyData.iModifiers=iKeyTranslator->GetModifierState();
-			keyData.iApp=0;
-			keyData.iHandle=0;
-			keyData.iIsCaptureKey=EFalse;
-			keyData.iKeyCode=aRawEvent.ScanCode(); 
-			iCaptureKeys->ProcessCaptureKeys(keyData);
-			QueueKeyPress(keyData, aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE,NULL,EFalse,aRawEvent.Repeats());
+			TKeyEvent keyEvent;
+			keyEvent.iScanCode = aRawEvent.ScanCode() __REMOVE_WINS_CHARCODE;
+			keyEvent.iCode = aRawEvent.ScanCode();
+ 			keyEvent.iModifiers = iKeyTranslator->GetModifierState();
+			ProcessKeyPress(keyEvent, EFalse, aRawEvent.Repeats());
  			}
  			break;
 		default:
 			break;
 		}
+#ifdef LOG_WSERV_EVENTS
+    RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::ProcessRawEvent Number= %d  State = %x XY(%d,%d)",TWsPointer::iPointers[0].iNumber,TWsPointer::iPointers[0].iState,TWsPointer::iPointers[0].iPos.iX,TWsPointer::iPointers[0].iPos.iY);
+    RDebug::Printf("_WSEVENT_POINTER: TWindowServerEvent::ProcessRawEvent Number= %d  State = %x XY(%d,%d)",TWsPointer::iPointers[1].iNumber,TWsPointer::iPointers[1].iState,TWsPointer::iPointers[1].iPos.iX,TWsPointer::iPointers[1].iPos.iY);
+#endif
 	}
 
 void TWindowServerEvent::ProcessKeyEvent(const TKeyEvent &aKeyEvent,TInt aRepeats)
 	{
+#ifdef LOG_WSERV_EVENTS
+    RDebug::Printf("_WSEVENT_KEY: TWindowServerEvent::ProcessKeyEvent, key code: %d, repeat: %d", aKeyEvent.iCode, aRepeats);
+#endif
 	TKeyData keyData;
 	keyData.iModifiers=aKeyEvent.iModifiers;
 	keyData.iApp=0;
@@ -1126,23 +1417,22 @@
 		{
 		CKeyboardRepeat::CancelRepeat(NULL);
 		}
-	iCaptureKeys->ProcessCaptureKeys(keyData);
-	QueueKeyPress(keyData,aKeyEvent.iScanCode,NULL,aRepeats==0,aRepeats);
+	ProcessKeyPress(aKeyEvent, aRepeats == 0, aRepeats);
 	}
 
-void TWindowServerEvent::AddCaptureKeyL(const TCaptureKey &aCaptureKey)
+void TWindowServerEvent::AddCaptureKeyL(const TKeyCaptureRequest& aRequest)
 	{
-	iCaptureKeys->AddCaptureKeyL(aCaptureKey,aCaptureKey.iKeyCodePattern.iFiller);
+	iKeyEventRouter->AddCaptureKeyL(aRequest);
 	}
 
-void TWindowServerEvent::SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey)
+void TWindowServerEvent::UpdateCaptureKeyL(const TKeyCaptureRequest& aRequest)
 	{
-	iCaptureKeys->SetCaptureKey(aHandle, aCaptureKey,aCaptureKey.iKeyCodePattern.iFiller);
+	iKeyEventRouter->UpdateCaptureKeyL(aRequest);
 	}
 
-void TWindowServerEvent::CancelCaptureKey(TUint32 aHandle)
+void TWindowServerEvent::CancelCaptureKey(TKeyCaptureType aType, TAny* aHandle)
 	{
-	iCaptureKeys->CancelCaptureKey(aHandle);
+	iKeyEventRouter->CancelCaptureKey(aType, aHandle);
 	}
 
 TInt TWindowServerEvent::GetModifierState()
@@ -1385,6 +1675,9 @@
 
 void CRawEventReceiver::RunL()
 	{
+#ifdef LOG_WSERV_EVENTS
+    RDebug::Printf("_WSEVENT_KEY: CRawEventReceiver::RunL Entry point for event receiver");
+#endif
 //__PROFILE_START(11);
 	if (TWsPointer::PreProcessDriverEvent(iEventBuf.Event()
 #if defined(__WINS__)
@@ -1483,21 +1776,27 @@
 	iTime=aTime;
 	}
 
+/**
+Process timer events.
+
+Called when the key repeat timer expires, this function generates the
+appropriate long key or repeated key event. If the timer was started for
+normal key repeat or if the long key event was captured with the automatic
+repeat option specified then the timer is restarted.
+*/
 void CKeyboardRepeat::RunL()
 	{
 	User::ResetInactivityTime();
-	//WS_ASSERT_DEBUG(iRepeating!=ERepeatNone, EWsPanicTemp);
+	WS_ASSERT_DEBUG(iRepeating != ERepeatNone, EWsPanicKeyRepeat);
 	TBool timer=ETrue;
 	if (iRepeating>=ERepeatLong)
 		{
 		// Defensive programming - iLongCapture should never be NULL if iRepeating >= ERepeatLong
+		WS_ASSERT_DEBUG(iLongCapture != NULL, EWsPanicKeyRepeat);
 		if (iLongCapture)
 			{
-			iCurrentRepeat.iKey.iApp=REINTERPRET_CAST(TUint32,iLongCapture->iWindowGroup);
-			iCurrentRepeat.iKey.iHandle=0;
-			iCurrentRepeat.iKey.iIsCaptureKey=ETrue;
-			iCurrentRepeat.iKey.iKeyCode=iLongCapture->iData.outputKey;
-			timer=iLongCapture->iData.flags&ELongCaptureRepeatEvents;
+			iCurrentRepeat = iLongRepeat;
+			timer = iLongCapture->iFlags & ELongCaptureRepeatEvents;
 			iRepeating=ERepeatLongRepeated;
 			}
 		else
@@ -1511,53 +1810,67 @@
 		After(iTime);
 	else
 		iRepeating=ERepeatNone;
-	TWindowServerEvent::QueueKeyPress(iCurrentRepeat.iKey,iCurrentRepeat.iScanCode,iFocus,EFalse,1);
+
+	TWindowServerEvent::QueueKeyPress(iCurrentRepeat.iOutput, ETrue, 1);
 	}
 
-TBool CKeyboardRepeat::StartRepeat(const TKeyData &aKey, TInt aScanCode, CWsWindowGroup *aRepeatFocus, CWsCaptureLongKey* aLongCapture)
+/**
+Start key repeat and long key press timer
+
+@param	aInputScanCode	Original scan code (before routing)
+@param	aShortEvent		Short key event (routing plug-in output)
+@param	aLongEvent		Pointer to long key event (routing plug-in output)
+						or NULL if none.
+
+Note: When aLongEvent != NULL, iCurrentRepeat reflects the short key event
+until the timer has expired. This is necessary to allow a delayed short key
+event to be delivered by KeyUp(). CancelRepeat() must therefore examine
+iCurrentRepeat or iLongRepeat according to the repeat type in iRepeat.
+*/
+void CKeyboardRepeat::StartRepeat(TInt aInputScanCode, const TKeyEventRouterOutput& aShortEvent, const TKeyEventRouterOutput* aLongEvent)
 	{
 	TTimeIntervalMicroSeconds32 time;
-	TBool ret=EFalse;
-	iCurrentRepeat.iScanCode=aScanCode;
-	iCurrentRepeat.iKey=aKey;
+	iCurrentRepeat.iInputScanCode = aInputScanCode;
+	iCurrentRepeat.iOutput = aShortEvent;
 
-	if (aLongCapture)
+	if (aLongEvent)
 		{
-		iLongCapture=aLongCapture;
-		iRepeating=ERepeatLong;
-		time=aLongCapture->iData.delay;
-		ret=!(aLongCapture->iData.flags&ELongCaptureShortEventImmediately);
-		//need window group from long capture key or even better delete it altogether.
-		iFocus=aLongCapture->WindowGroup();
+		iRepeating = ERepeatLong;
+		iLongRepeat.iInputScanCode = aInputScanCode;
+		iLongRepeat.iOutput = *aLongEvent;
+		iLongCapture = static_cast<CWsCaptureLongKey*>(aLongEvent->iCaptureHandle);
+		time = iLongCapture->iDelay;
 		}
 	else
 		{
-		iFocus=aRepeatFocus;
+		iLongCapture = NULL;
 		iRepeating=ERepeatNormal;
 		time=iInitialTime;
 		}
 	iThis->After(time);
-	return ret;
 	}
 
+/**
+Cancel key repeat processing
+*/
 void CKeyboardRepeat::doCancelRepeat()
 	{
 	iRepeating=ERepeatNone;
 	iThis->Cancel();
 	}
 
+/**
+Cancel any key repeat associated with the specified window group
+
+@param	aRepeatFocus	Destination window group or NULL for all
+*/
 void CKeyboardRepeat::CancelRepeat(CWsWindowGroup *aRepeatFocus)
 	{
-	if (aRepeatFocus==NULL || aRepeatFocus==iFocus)
+	if (iRepeating != ERepeatNone)
 		{
-		if (iRepeating)
-			doCancelRepeat();
-		iAlternateRepeatExists=EFalse;
-		}
-	else if (iRepeating >= ERepeatLong)
-		{
-		// Defensive programming - iLongCapture should never be NULL if iRepeating >= ERepeatLong
-		if (iLongCapture && iLongCapture->iWindowGroup == aRepeatFocus)
+		if (aRepeatFocus == NULL ||
+			(iRepeating == ERepeatNormal) && (aRepeatFocus == iCurrentRepeat.iOutput.iWindowGroup) ||
+			(iRepeating >= ERepeatLong) && (aRepeatFocus == iLongRepeat.iOutput.iWindowGroup))
 			{
 			doCancelRepeat();
 			iAlternateRepeatExists=EFalse;
@@ -1565,36 +1878,38 @@
 		}
 	}
 
-void CKeyboardRepeat::CancelRepeat(CWsWindowGroup *aRepeatFocus,TUint aScanCode,TBool aLongCaptureFlag,TUint aModifiers)
+/**
+Cancel any key repeat associated with the specified capture handle
+
+@param	aCaptureHandle		Handle to capture request
+@param	aLongCaptureFlag	ETrue for long key capture, EFalse for normal key
+*/
+void CKeyboardRepeat::CancelRepeat(const TAny* aCaptureHandle, TBool aLongCaptureFlag)
 	{
 	if (aLongCaptureFlag)
 		{
-		// long capture key is cancelled
-		if (iRepeating >= ERepeatLong && iCurrentRepeat.iScanCode==aScanCode)			
-				{
-				// Defensive programming - iLongCapture should never be NULL if iRepeating >= ERepeatLong
-				if (iLongCapture && aRepeatFocus == iLongCapture->iWindowGroup &&
-					(aModifiers & iLongCapture->iData.modifierMask) == iLongCapture->iData.modifiers)
-					{
-					doCancelRepeat();
-					iAlternateRepeatExists=EFalse;
-					}
-				}
+		// Cancel repeat for long capture key
+		if (iRepeating >= ERepeatLong && aCaptureHandle == iLongRepeat.iOutput.iCaptureHandle)
+			{
+			doCancelRepeat();
+			iAlternateRepeatExists=EFalse;
+			}
 		}
 	else
 		{
-		// normal capture key is cancelled
-		if (aRepeatFocus==iFocus)
+		// Cancel repeat for normal capture key
+		if (iRepeating == ERepeatNormal && aCaptureHandle == iCurrentRepeat.iOutput.iCaptureHandle)
 			{
-			if (iRepeating>=ERepeatNormal && iCurrentRepeat.iScanCode==aScanCode)
-				{
-				doCancelRepeat();
-				}
+			doCancelRepeat();
 			iAlternateRepeatExists=EFalse;
 			}
 		}
 	}
 	
+/**
+Process a key down event during key repeat.
+The current repeat data is saved for possible restoration after rollover.
+*/
 void CKeyboardRepeat::KeyDown()
 	{
 	if (iRepeating!=ERepeatNone)
@@ -1608,18 +1923,26 @@
 		}
 	}
 
+/**
+Process a key up event during key repeat.
+Send delayed short key event if necessary for long key event processing.
+Switch to alternate repeat if rollover key was released.
+
+@param	aScanCode	Scan code
+*/
 void CKeyboardRepeat::KeyUp(TInt aScanCode)
 	{
-	if (iAlternateRepeatExists && iAlternateRepeat.iScanCode==aScanCode)
+	if (iAlternateRepeatExists && iAlternateRepeat.iInputScanCode == aScanCode)
 		iAlternateRepeatExists=EFalse;
-	if (iRepeating!=ERepeatNone && iCurrentRepeat.iScanCode==aScanCode)
+	if (iRepeating != ERepeatNone && iCurrentRepeat.iInputScanCode == aScanCode)
 		{
 		if (iRepeating==ERepeatLong)
 			{
 			// Defensive programming - iLongCapture should never be NULL if iRepeating >= ERepeatLong			
-			if (iLongCapture && !(iLongCapture->iData.flags&ELongCaptureShortEventImmediately))
+			WS_ASSERT_DEBUG(iLongCapture != NULL, EWsPanicKeyRepeat);
+			if (iLongCapture && !(iLongCapture->iFlags & ELongCaptureShortEventImmediately))
 				{
-				TWindowServerEvent::QueueKeyPress(iCurrentRepeat.iKey,iCurrentRepeat.iScanCode,NULL,EFalse,0);	
+				TWindowServerEvent::QueueKeyPress(iCurrentRepeat.iOutput, EFalse, 0);
 				}
 			}			
 		if (iAlternateRepeatExists)
--- a/windowing/windowserver/nga/SERVER/EVENT.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/EVENT.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -27,7 +27,8 @@
 #include "w32cmd.h"
 #include "EVQUEUE.H"
 #include <w32adll.h>
-#include "Graphics/WSGRAPHICDRAWER.H"
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/wskeyrouter.h>
 
 class CWsClient;
 class CWsWindowBase;
@@ -78,8 +79,8 @@
 class TRepeatKey
 	{
 public:
-	TKeyData iKey;
-	TInt iScanCode;
+	TKeyEventRouterOutput iOutput;
+	TInt iInputScanCode;
 	};
 
 class CKeyboardRepeat : public CTimer
@@ -90,9 +91,9 @@
 	static void Destroy();
 	static void KeyDown();
 	static void KeyUp(TInt aScanCode);
-	static TBool StartRepeat(const TKeyData &aKey, TInt aScanCode, CWsWindowGroup *aRepeatFocus, CWsCaptureLongKey* longCapture);
+	static void StartRepeat(TInt aInputScanCode, const TKeyEventRouterOutput& aShortEvent, const TKeyEventRouterOutput* aLongEvent);
 	static void CancelRepeat(CWsWindowGroup *aRepeatFocus);
-	static void CancelRepeat(CWsWindowGroup *aRepeatFocus,TUint aScanCode,TBool aLongCaptureFlag,TUint aModifiers=0);
+	static void CancelRepeat(const TAny* aCaptureHandle, TBool aLongCaptureFlag);
 	static void SetRepeatTime(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime);
 	static void GetRepeatTime(TTimeIntervalMicroSeconds32 &aInitialTime, TTimeIntervalMicroSeconds32 &aTime);
 	static inline TBool IsAreadyActive();
@@ -108,13 +109,13 @@
 	static void doCancelRepeat();
 	void RunL();
 private:
-	static CWsWindowGroup *iFocus;
 	static CKeyboardRepeat *iThis; // Needed as CTimer derived parts can't be static
 	static TTimeIntervalMicroSeconds32 iInitialTime;
 	static TTimeIntervalMicroSeconds32 iTime;
+	static TRepeatType iRepeating;
 	static TRepeatKey iCurrentRepeat;
-	static TRepeatType iRepeating;
 	static TRepeatKey iAlternateRepeat;
+	static TRepeatKey iLongRepeat;
 	static TBool iAlternateRepeatExists;
 	static CWsCaptureLongKey* iLongCapture;
 	static TInt iRepeatRollover;
@@ -174,9 +175,9 @@
 	static CWsHotKey* ClearHotKeysL(TInt aHotKey);
 	static void ResetDefaultHotKeyL(TInt aHotKey);
 	static void SetHotKeyL(const TWsClCmdSetHotKey &aHotKey);
-	static void AddCaptureKeyL(const TCaptureKey &aCaptureKey);
-	static void SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey);
-	static void CancelCaptureKey(TUint32 aHandle);
+	static void AddCaptureKeyL(const TKeyCaptureRequest& aRequest);
+	static void UpdateCaptureKeyL(const TKeyCaptureRequest& aRequest);
+	static void CancelCaptureKey(TKeyCaptureType aType, TAny* aHandle);
 	static void ClientDestroyed(CWsClient *aClient);
 	static inline void AddToSwitchOnEventListL(const CWsWindowBase &aWindow, TEventControl aCircumstances);
 	static inline void RemoveFromSwitchOnEventList(const CWsWindowBase &aWindow);
@@ -207,7 +208,8 @@
 	static void SendScreenDeviceChangedEvent(const CWsWindowBase *aWindow);
 	static TBool ProcessErrorMessages(TWsErrorMessage::TErrorCategory aCategory, TInt aError);
 	static void NotifyOom();
-	static void QueueKeyPress(const TKeyData& aKey, TInt aScanCode, CWsWindowGroup* aRepeatFocus, TBool aCheckRepeat,TInt aRepeats);
+	static void ProcessKeyPress(const TKeyEvent& aKeyEvent, TBool aCheckRepeat,TInt aRepeats);
+	static void QueueKeyPress(const TKeyEventRouterOutput& aOutput, TBool aIsRepeat, TInt aRepeats);
 	static void AddEventHandler(MEventHandler *aEventHandler, TBool aAdvancedPointersEnabled);
 	static void RemoveEventHandler(const MEventHandler *aEventHandler);
 	static void PotentialEventHandlerL(TInt aNum);
@@ -250,6 +252,8 @@
 	static TEventRequestQueue iScreenDeviceChangedQueue;
 	static TTime iPrevOomMessageTime;
 	static CCaptureKeys *iCaptureKeys;
+	static CKeyEventRouter *iKeyEventRouter;
+	static RLibrary iKeyEventRouterLibrary;
 	static CWsHotKey *iHotKeys;
 	static TInt iModifierState;
 	static CRawEventReceiver *iEventReceiver;
--- a/windowing/windowserver/nga/SERVER/EVQUEUE.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/EVQUEUE.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -22,6 +22,7 @@
 #include "panics.h"
 #include "pointer.h"
 #include "advancedpointereventhelper.h"
+#include "debughelper.h"
 
 GLREF_D CDebugLogBase* wsDebugLog;
 
@@ -100,6 +101,9 @@
 	{
 	if ((iEventSignalledState&EEventFlagSignalled && !(iEventSignalledState&EEventFlagCancelled)) || !iEventMsg.IsNull())
 		{
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Printf("_WSEVENT: CEventBase::EventReadyCheck, Event is not ready");
+#endif
 		iWsOwner->PPanic(EWservPanicReadOutstanding);
 		}
 	}
@@ -646,6 +650,9 @@
 			case EEventPointerExit:
 			case EEventDragDrop:
 breakLoopAndRemoveEvent:
+#ifdef LOG_WSERV_EVENTS
+				RDebug::Print(_L("_WSEVENT: CEventQueue::Purge(), The event to be purged is %S"), &WsEventName(*eventToPurge));
+#endif
 				RemoveEvent(indexToPurge);
 				return;
 			case EEventKeyUp:
@@ -950,14 +957,26 @@
 	TBool ret=ETrue;
 	Wait();
 	if (iCount==iQueueSize && !Expand(aPriority))
+		{
 		ret=EFalse;
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Printf("WSEVENT: CEventQueue::QueueEvent(): 0x%X:  Queue Full!!!!!, iCount = %d, iQueueSize = %d", this, iCount, iQueueSize);
+		RDebug::Print(_L("WSEVENT: CEventQueue::QueueEvent(): 0x%X:  Queue Full!!!!! TWsEvent.Type() = %S"), this, &WsEventName(event));
+#endif
+		}
 	else
 		{
 		if (!iEventMsg.IsNull())
 			{
 			SignalEvent();
 			}
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Printf("_WSEVENT: CEventQueue::QueueEvent, Right before adding the event");
+#endif
 		*EventPtr(iCount++)=event;
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Print(_L("_WSEVENT: CEventQueue::QueueEvent, Event %S successfully queued"), &WsEventName(event));
+#endif
 		}
 	Signal();
 	return(ret);
@@ -1057,6 +1076,9 @@
 		{
 		WS_ASSERT_DEBUG((iEventPtr+iHead)->Type()!=EEventMarkInvalid, EWsPanicCheckEventQueue);
 		CEventBase::GetData(iEventPtr+iHead,sizeof(*iEventPtr));
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Printf("_WSEVENT: CEventQueue::GetData(), TWsEvent.Type() = %d", (iEventPtr+iHead)->Type());
+#endif
 		__ZAP_EVENT(iEventPtr+iHead);
 		iHead=(iHead+1)%iQueueSize;
 		iCount--;
@@ -1083,6 +1105,9 @@
 // Remove event 'index' in the queue, this event MUST exist in the queue
 //
 	{
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT: CEventQueue::RemoveEvent(index), Remove event index %d in the queue", index);
+#endif
 	WS_ASSERT_DEBUG(index < iCount, EWsPanicCheckEventQueue);
 	RemoveEvent(EventPtr(index));
 	}
@@ -1092,6 +1117,9 @@
 // Remove event in the queue, this event MUST exist in the queue
 //
 	{
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Print(_L("_WSEVENT: CEventQueue::RemoveEvent(aEvToRemove), Remove event %S in the queue"), &WsEventName(*aEvToRemove));
+#endif
 	iCount--;
 	TWsEvent* last = EventPtr(iCount);
 	TWsEvent* prev;
--- a/windowing/windowserver/nga/SERVER/EVQUEUE.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/EVQUEUE.H	Wed Aug 18 11:05:09 2010 +0300
@@ -20,7 +20,7 @@
 
 #include <e32std.h>
 #include <e32base.h>
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "W32STD.H"
 
 class CWsClient;
--- a/windowing/windowserver/nga/SERVER/POINTER.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/POINTER.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -30,6 +30,7 @@
 #include <hal.h>
 #include "advancedpointereventhelper.h"
 #include "graphics/pointereventdata.h"
+#include "debughelper.h"
 
 TTimeIntervalMicroSeconds32 TWsPointer::iDoubleClickMaxInterval;
 TInt 			   TWsPointer::iDoubleClickMaxDistance;
@@ -110,6 +111,11 @@
 			}
 		}
 	
+	//** Log the number of pointers here i,e iMaxPointers
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: Number of pointers system supports %d", iMaxPointers);
+#endif
+	
 	// Does device support Z coordinate of the pointers?
 	if(HAL::Get(HALData::EPointer3D,iIs3DPointer)!=KErrNone)
 		{
@@ -117,6 +123,10 @@
 		}
 	WS_ASSERT_ALWAYS(!iIs3DPointer || XyInput(), EWsPanicPointer3DInconsistent);
 	
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: Z coordinate supported %d", iIs3DPointer);
+#endif	
+	
 	// Initialize thresholds for EEnterCloseProximity, EExitCloseProximity,
 	// EEnterHighPressure and EExitHightPressure events.
 	if(HAL::Get(HALData::EPointer3DEnterCloseProximityThreshold,
@@ -485,6 +495,9 @@
 		{
 		CEventQueue* queue=aWindow->EventQueue();
 		aEvent.SetHandle(aWindow->ClientHandle());
+#ifdef LOG_WSERV_EVENTS
+		RDebug::Printf("_WSEVENT_POINTER: TWsPointer::QueuePointerEvent with AdvancedPointerEnabled");
+#endif
 		if (aEvent.Handle()!=0)
 			{
  			if(!aWindow->AdvancedPointersEnabled())
@@ -508,12 +521,18 @@
 				case TPointerEvent::EExitHighPressure:
 					if (CheckMatchingEventPurged(aEvent.Pointer()->iType))
 						{
+						#ifdef LOG_WSERV_EVENTS
+						RDebug::Printf("_WSEVENT_POINTER: Check matching event has been purged so no addition of event 01");
+						#endif
 						return ETrue;
 						}
 					if (queue->CheckRoom())
 						{
 						if (CheckMatchingEventPurged(aEvent.Pointer()->iType))
 							{
+							#ifdef LOG_WSERV_EVENTS
+							RDebug::Printf("_WSEVENT_POINTER: Check matching event has been purged so no addition of event 02");
+							#endif
 							return ETrue;
 							}
 						}
@@ -527,6 +546,9 @@
 					break;
 				default:;
 				}
+#ifdef LOG_WSERV_EVENTS
+			RDebug::Printf("_WSEVENT_POINTER: TWsPointer::QueuePointerEvent After adding event to clientqueue Event State %d ", iState);
+#endif
 			queue->QueueEvent(aEvent,priority);
 			}
 		}
@@ -657,6 +679,12 @@
 		return EFalse;
 		}
 	
+	//** Log the type, pointer number, and its coordinates
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: Pointer number = %d RawEvent Type = %d Coordinates [%d, %d]", 
+					aRawEvent.PointerNumber(), type, aRawEvent.Pos().iX, aRawEvent.Pos().iY);
+#endif
+	
 	// check correctness of aRawEvent.PointerNumber()
 	if (iMaxPointers > 1)
 		{
@@ -710,6 +738,11 @@
 		aRawEvent.Set(type, xy.iX, xy.iY, 
 					  iIs3DPointer ? aRawEvent.Pos3D().iZ : 0);
 		}
+	
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: Coordinates after Rotation and shift [%d, %d]", 
+							aRawEvent.Pos().iX, aRawEvent.Pos().iY);
+#endif
 	return ETrue;
 	}
 
@@ -856,6 +889,11 @@
 	ReLogCurrentWindow(pointerEvent.iPosition,parPos,aForceInGroup);
 	pointerEvent.iParentPosition=parPos;
 	
+	
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: TWsPointer::ProcessEvent Event to be sent to this window %U", reinterpret_cast<TUint32>(iCurrentWindow));
+	RDebug::Print(_L("_WSEVENT_POINTER: TWsPointer::ProcessEvent EventName %S and Event State %d "), &WsEventName(aEvent), iState);
+#endif
 	// update state
 	switch(eventType)
 		{
@@ -1007,6 +1045,10 @@
 	{
 	if (iState != EPointerStateOutOfRange)
 		{
+#ifdef LOG_WSERV_EVENTS
+       RDebug::Printf("_WSEVENT_POINTER: TWsPointer::ProcessOutOfRangeEvent Pointer Number = %d, iState =%d ", iNumber, iState); 
+#endif
+
 		// OutOfRange event generated by driver doesn't contain correct coordinates,
 		// we update them from last state in order to deliver event to the proper window.
 		SendEnterExitEvent(EEventPointerExit);
@@ -1078,11 +1120,17 @@
 				}
 			else if (!WsKeyboardEmulator::PointerEvent(type,pos,iCurrentWindow->PointerKeyList()))
 				{
+#ifdef LOG_WSERV_EVENTS
+				RDebug::Printf("_WSEVENT_POINTER: Calling ProcessPointerEvent for primary pointer");
+#endif
 				ProcessPointerEvent(aEvent);
 				}
 			}
 		else if (!iCurrentWindow->UsingPointerBuffer() || (type != TPointerEvent::EMove && type != TPointerEvent::EDrag))
 			{
+#ifdef LOG_WSERV_EVENTS
+			RDebug::Printf("_WSEVENT_POINTER: Calling ProcessPointerEvent for non primary pointer");
+#endif
 			ProcessPointerEvent(aEvent);
 			}
 		}
@@ -1394,7 +1442,15 @@
 	
 	TRawEvent::TType type=aRawEvent.Type();
 	TInt pointerNumber = aRawEvent.PointerNumber();
-
+    
+#ifdef LOG_WSERV_EVENTS
+	RDebug::Printf("_WSEVENT_POINTER: TWsPointer::UpdatePrimaryPointer Current Primary pointer = %d",iPrimaryPointer);
+	for(TInt i=0; i< iMaxPointers; i++)
+		{
+		RDebug::Printf("_WSEVENT_POINTER: TWsPointer::UpdatePrimaryPointer Pointer Number= %d  State = %x XY(%d,%d)",iPointers[i].iNumber,iPointers[i].iState,iPointers[i].iPos.iX,iPointers[i].iPos.iY);
+		}
+#endif
+	
 	// If primary pointer is out of range, then the first pointer that will 
 	// start being detected (come back in range) will become primary.
 	if (iPointers[iPrimaryPointer].iState == EPointerStateOutOfRange)
@@ -1402,6 +1458,9 @@
 		if (type != TRawEvent::EPointer3DOutOfRange && iPointers[pointerNumber].iState == EPointerStateOutOfRange)
 			{
 			iPrimaryPointer = pointerNumber;
+#ifdef LOG_WSERV_EVENTS
+	        RDebug::Printf("_WSEVENT_POINTER: TWsPointer::UpdatePrimaryPointer New Primary pointer(OutRange) = %d",iPrimaryPointer);
+#endif
 			}
 		return;
 		}
@@ -1412,6 +1471,9 @@
 		iPointers[iPrimaryPointer].iState != EPointerStateDown)
 		{
 		iPrimaryPointer = pointerNumber;
+#ifdef LOG_WSERV_EVENTS
+        RDebug::Printf("_WSEVENT_POINTER: TWsPointer::UpdatePrimaryPointer New Primary pointer(ButtonDown) = %d",iPrimaryPointer);
+#endif
 		return;
 		}
 	}
--- a/windowing/windowserver/nga/SERVER/PRIKEY.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/PRIKEY.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -23,7 +23,7 @@
 	__DECLARE_NAME(_S("CPriorityKey"));
 	}
 
-void CPriorityKey::PriorityKey(TInt aHandle, const TKeyData &aKey, TInt aScanCode)
+void CPriorityKey::PriorityKey(TInt aHandle, const TKeyEvent &aKeyEvent)
 //
 // Called when a priority key is pressed
 //
@@ -31,8 +31,7 @@
 	if (!iEventMsg.IsNull())
 		{
 		iPriorityKeyHandle=aHandle;
-		iPriorityKey=aKey;
-		iScanCode=aScanCode;
+		iPriorityKey = aKeyEvent;
 		SignalEvent();
 		}
 	}
@@ -43,11 +42,8 @@
 //
 	{
 	TWsPriorityKeyEvent event;
-	TKeyEvent *key=event.Key();
-	key->iScanCode=iScanCode;
-	key->iCode=iPriorityKey.iKeyCode;
-	key->iModifiers=iPriorityKey.iModifiers;
-	key->iRepeats=0;
+	*event.Key() = iPriorityKey;
+	event.Key()->iRepeats = 0;
 	event.SetHandle(iPriorityKeyHandle);
 	CEventBase::GetData(&event,sizeof(event));
 	iPriorityKeyHandle=0;
@@ -65,7 +61,7 @@
 	return(iKeyCode==aKeycode && iModifierMask==aModifierMask && iModifiers==aModifiers);
 	}
 
-TInt TPriorityKey::KeyMatches(const TKeyData &aKey)
+TInt TPriorityKey::KeyMatches(const TKeyEvent &aKeyEvent)
 	{
-	return(iKeyCode==aKey.iKeyCode && (iModifierMask&aKey.iModifiers)==iModifiers);
+	return(iKeyCode == aKeyEvent.iCode && (iModifierMask & aKeyEvent.iModifiers) == iModifiers);
 	}
--- a/windowing/windowserver/nga/SERVER/PRIKEY.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/PRIKEY.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -37,7 +37,7 @@
 public:
 	TPriorityKey(TUint aKeycode,TUint aModifierMask,TUint aModifiers,TPriorityKey *aPriorityKeys);
 	TInt Equals(TUint aKeycode,TUint aModifierMask,TUint aModifiers);
-	TInt KeyMatches(const TKeyData &aKey);
+	TInt KeyMatches(const TKeyEvent &aKeyEvent);
 public:
 	TPriorityKey *iNext;
 private:
@@ -50,12 +50,11 @@
 	{
 public:
 	CPriorityKey(CWsClient *aOwner);
-	void PriorityKey(TInt aHandle, const TKeyData &aKey, TInt aScanCode);
+	void PriorityKey(TInt aHandle, const TKeyEvent &aKeyEvent);
 	void GetData();
 private:
 	TInt iPriorityKeyHandle;
-	TKeyData iPriorityKey;
-	TInt iScanCode;
+	TKeyEvent iPriorityKey;
 	};
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/debughelper.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,302 @@
+#include "debughelper.h"
+
+const TDesC& RawEventName(const TRawEvent& aEvent) 
+	{
+	switch(aEvent.Type())
+		{	
+		case TRawEvent::ENone:
+			_LIT(ENone,"ENone");
+			return ENone;
+			
+		case TRawEvent::EPointerMove:
+			_LIT(EPointerMove,"EPointerMove");
+			return EPointerMove;	
+			
+		case TRawEvent::EPointerSwitchOn:
+			_LIT(EPointerSwitchOn,"EPointerSwitchOn");
+			return EPointerSwitchOn;	
+			
+		case TRawEvent::EKeyDown:
+			_LIT(EKeyDown,"EKeyDown");
+			return EKeyDown;	
+			
+		case TRawEvent::EKeyUp:
+			_LIT(EKeyUp,"EKeyUp");
+			return EKeyUp;		
+			
+		case TRawEvent::ERedraw:
+			_LIT(ERedraw,"ERedraw");
+			return ERedraw;		
+			
+		case TRawEvent::ESwitchOn:
+			_LIT(ESwitchOn,"ESwitchOn");
+			return ESwitchOn;		
+			
+		case TRawEvent::EActive:
+			_LIT(EActive,"EActive");
+			return EActive;			
+			
+		case TRawEvent::EInactive:
+			_LIT(EInactive,"EInactive");
+		    return EInactive;		    
+		    
+		case TRawEvent::EUpdateModifiers:
+			_LIT(EUpdateModifiers,"EUpdateModifiers");
+			return EUpdateModifiers;		
+			
+		case TRawEvent::EButton1Down:
+			_LIT(EButton1Down,"EButton1Down");
+			return EButton1Down;		
+			
+		case TRawEvent::EButton1Up:
+			_LIT(EButton1Up,"EButton1Up");
+			return EButton1Up;			
+			
+		case TRawEvent::EButton2Down:
+			_LIT(EButton2Down,"EButton2Down");
+			return EButton2Down;		
+			
+		case TRawEvent::EButton2Up:
+			_LIT(EButton2Up,"EButton2Up");
+			return EButton2Up;			
+			
+		case TRawEvent::EButton3Down:
+			_LIT(EButton3Down,"EButton3Down");
+			return EButton3Down;	
+			
+		case TRawEvent::EButton3Up:
+			_LIT(EButton3Up,"EButton3Up");
+			return EButton3Up;		
+			
+		case TRawEvent::ESwitchOff:
+			_LIT(ESwitchOff,"ESwitchOff");
+			return ESwitchOff;		
+			
+		case TRawEvent::EKeyRepeat:
+			_LIT(EKeyRepeat,"EKeyRepeat");
+			return EKeyRepeat;	
+			
+		case TRawEvent::ECaseOpen:
+			_LIT(ECaseOpen,"ECaseOpen");
+			return ECaseOpen;			
+			
+		case TRawEvent::ECaseClose:
+			_LIT(ECaseClose,"ECaseClose");
+			return ECaseClose;		
+			
+		case TRawEvent::EPointer3DInRange:
+			_LIT(EPointer3DInRange,"EPointer3DInRange");
+			return EPointer3DInRange;	
+			
+		case TRawEvent::EPointer3DOutOfRange:
+			_LIT(EPointer3DOutOfRange,"EPointer3DOutOfRange");
+			return EPointer3DOutOfRange;	
+			
+		case TRawEvent::EPointer3DTilt:
+			_LIT(EPointer3DTilt,"EPointer3DTilt");
+			return EPointer3DTilt;	
+			
+		case TRawEvent::EPointer3DRotation:
+			_LIT(EPointer3DRotation,"EPointer3DRotation");
+			return EPointer3DRotation;	
+			
+		case TRawEvent::EPointer3DTiltAndMove:
+			_LIT(EPointer3DTiltAndMove,"EPointer3DTiltAndMove");
+			return EPointer3DTiltAndMove;	
+			
+		case TRawEvent::EButton4Down:
+			_LIT(EButton4Down,"EButton4Down");
+			return EButton4Down;	
+			
+		case TRawEvent::EButton4Up:
+			_LIT(EButton4Up,"EButton4Up");
+			return EButton4Up;		
+			
+		case TRawEvent::EButton5Down:
+			_LIT(EButton5Down,"EButton5Down");
+			return EButton5Down;	
+			
+		case TRawEvent::EButton5Up:
+			_LIT(EButton5Up,"EButton5Up");
+			return EButton5Up;	
+			
+		case TRawEvent::EButton6Down:
+			_LIT(EButton6Down,"EButton6Down");
+			return EButton6Down;	
+			
+		case TRawEvent::EButton6Up:
+			_LIT(EButton6Up,"EButton6Up");
+			return EButton6Up;		
+			
+		case TRawEvent::ERestartSystem:
+			_LIT(ERestartSystem,"ERestartSystem");
+			return ERestartSystem;
+			
+		default:
+			_LIT(KUndef,"User Defined Event");
+			return KUndef;
+		}
+	}
+
+const TDesC& WsEventName(const TWsEvent& aEvent) 
+	{
+	switch(aEvent.Type())
+		{
+		case EEventNull:
+			_LIT(EEventNull,"EEventNull");
+			return EEventNull;
+			
+		case EEventKey:
+			_LIT(EEventKey,"EEventKey");
+			return EEventKey;
+			
+		case EEventKeyUp:
+			_LIT(EEventKeyUp,"EEventKeyUp");
+			return EEventKeyUp;
+			
+		case EEventKeyDown:
+			_LIT(EEventKeyDown,"EEventKeyDown");
+			return EEventKeyDown;
+			
+		case EEventModifiersChanged:
+			_LIT(EEventModifiersChanged,"EEventModifiersChanged");
+			return EEventModifiersChanged;
+			
+		case EEventPointer:
+			_LIT(EEventPointer,"EEventPointer");
+			return EEventPointer;
+			
+		case EEventPointerEnter:
+			_LIT(EEventPointerEnter,"EEventPointerEnter");
+			return EEventPointerEnter;
+			
+		case EEventPointerExit:
+			_LIT(EEventPointerExit,"EEventPointerExit");
+			return EEventPointerExit;
+			
+		case EEventPointerBufferReady:
+			_LIT(EEventPointerBufferReady,"EEventPointerBufferReady");
+			return EEventPointerBufferReady;
+			
+		case EEventDragDrop:
+			_LIT(EEventDragDrop,"EEventDragDrop");
+			return EEventDragDrop;
+			
+		case EEventFocusLost:
+			_LIT(EEventFocusLost,"EEventFocusLost");
+			return EEventFocusLost;
+			
+		case EEventFocusGained:
+			_LIT(EEventFocusGained,"EEventFocusGained");
+			return EEventFocusGained;
+			
+		case EEventSwitchOn:
+			_LIT(EEventSwitchOn,"EEventSwitchOn");
+			return EEventSwitchOn;
+			
+		case EEventPassword:
+			_LIT(EEventPassword,"EEventPassword");
+			return EEventPassword;
+			
+		case EEventWindowGroupsChanged:
+			_LIT(EEventWindowGroupsChanged,"EEventWindowGroupsChanged");
+			return EEventWindowGroupsChanged;
+			
+		case EEventErrorMessage:
+			_LIT(EEventErrorMessage,"EEventErrorMessage");
+			return EEventErrorMessage;
+			
+		case EEventMessageReady:
+			_LIT(EEventMessageReady,"EEventMessageReady");
+			return EEventMessageReady;
+			
+		case EEventMarkInvalid:
+			_LIT(EEventMarkInvalid,"EEventMarkInvalid");
+			return EEventMarkInvalid;
+			
+		case EEventSwitchOff:
+			_LIT(EEventSwitchOff,"EEventSwitchOff");
+			return EEventSwitchOff;
+			
+		case EEventKeySwitchOff:
+			_LIT(EEventKeySwitchOff,"EEventKeySwitchOff");
+			return EEventKeySwitchOff;
+			
+		case EEventScreenDeviceChanged:
+			_LIT(EEventScreenDeviceChanged,"EEventScreenDeviceChanged");
+			return EEventScreenDeviceChanged;
+			
+		case EEventFocusGroupChanged:
+			_LIT(EEventFocusGroupChanged,"EEventFocusGroupChanged");
+			return EEventFocusGroupChanged;
+				
+		case EEventCaseOpened:
+			_LIT(EEventCaseOpened,"EEventCaseOpened");
+			return EEventCaseOpened;
+			
+		case EEventCaseClosed:
+			_LIT(EEventCaseClosed,"EEventCaseClosed");
+			return EEventCaseClosed;
+			
+		case EEventWindowGroupListChanged:
+			_LIT(EEventWindowGroupListChanged,"EEventWindowGroupListChanged");
+			return EEventWindowGroupListChanged;
+			
+		case EEventWindowVisibilityChanged:
+			_LIT(EEventWindowVisibilityChanged,"EEventWindowVisibilityChanged");
+			return EEventWindowVisibilityChanged;
+			
+		case EEventRestartSystem:
+			_LIT(EEventRestartSystem,"EEventRestartSystem");
+			return EEventRestartSystem;
+		case EEventDisplayChanged:
+			_LIT(EEventDisplayChanged,"EEventDisplayChanged");
+			return EEventDisplayChanged;
+			
+		case EEventKeyRepeat:
+			_LIT(EEventKeyRepeat,"EEventKeyRepeat");
+			return EEventKeyRepeat;
+			
+		case EEventGroupWindowOpen:
+			_LIT(EEventGroupWindowOpen,"EEventGroupWindowOpen");
+			return EEventGroupWindowOpen;
+			
+		case EEventGroupWindowClose:
+			_LIT(EEventGroupWindowClose,"EEventGroupWindowClose");
+			return EEventGroupWindowClose;
+			
+		case EEventWindowClose:
+			_LIT(EEventWindowClose,"EEventWindowClose");
+			return EEventWindowClose;
+			
+		case EEventDirectScreenAccessBegin:
+			_LIT(EEventDirectScreenAccessBegin,"EEventDirectScreenAccessBegin");
+			return EEventDirectScreenAccessBegin;
+			
+		case EEventDirectScreenAccessEnd:
+			_LIT(EEventDirectScreenAccessEnd,"EEventDirectScreenAccessEnd");
+			return EEventDirectScreenAccessEnd;
+			
+		case EEventHeartbeatTimerStateChange:
+			_LIT(EEventHeartbeatTimerStateChange,"EEventHeartbeatTimerStateChange");
+			return EEventHeartbeatTimerStateChange;
+			
+		case EEventPowerMgmt:
+			_LIT(EEventPowerMgmt,"EEventPowerMgmt");
+			return EEventPowerMgmt;
+			
+		case EEventReserved:
+			_LIT(EEventReserved,"EEventReserved");
+			return EEventReserved;
+			
+		case EEventUser:
+			_LIT(EEventUser,"EEventUser");
+			return EEventUser;
+
+		default:
+			_LIT(KUndef,"User Defined Event");
+			return KUndef;						
+		}
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/debughelper.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,11 @@
+#ifndef __DEBUGHELPER_H__
+#define __DEBUGHELPER_H__
+
+#include <e32event.h>
+#include <e32base.h>
+#include <w32std.h>
+
+const TDesC& RawEventName(const TRawEvent& aEvent); 
+const TDesC& WsEventName(const TWsEvent& aEvent);
+
+#endif
--- a/windowing/windowserver/nga/SERVER/openwfc/CLIENT.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/CLIENT.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1286,6 +1286,9 @@
 		case EWsClOpCreateDrawableSource:
 			CreateDrawableSourceL(*pData.CreateDrawableSource);
 			break;
+		case EWsClOpIndicateAppOrientation:
+			IndicateAppOrientation(*pData.Orientation);
+			break;
 		default:
 			PPanic(EWservPanicOpcode);
 			break;
@@ -2138,6 +2141,17 @@
 	drawableSource->ConstructL(aDrawableSourceData);
 	CleanupStack::Pop();
 	}
+	
+void CWsClient::IndicateAppOrientation(TRenderOrientation aOrientation)
+	{
+	iIndicatedAppOrientation = aOrientation;
+	CWsTop::CheckRenderOrientation();
+	}
+
+TInt CWsClient::GetIndicatedAppOrientation()
+	{
+	return iIndicatedAppOrientation;
+	}
 
 //
 // class CWsCliObj
--- a/windowing/windowserver/nga/SERVER/openwfc/CLIENT.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/CLIENT.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -18,7 +18,7 @@
 #ifndef __CLIENT_H__
 #define __CLIENT_H__
 
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "WSGRAPHICDRAWERARRAY.H"
 
 #include <e32std.h>
@@ -146,7 +146,7 @@
 	inline void PurgePointerEvents();
 
 	// Key events
-	inline void PriorityKeyPressed(TInt aHandle, const TKeyData &aKey, TInt aScanCode);
+	inline void PriorityKeyPressed(TInt aHandle, const TKeyEvent &aKeyEvent);
 
 	// Notification of misc events
 	void AddNotificationL(TInt aKey, const RMessage2& aClientMsg);
@@ -168,6 +168,9 @@
 	TBool RetryEvent(TEventCode aEventCode);
 
     inline void WgMsgQueueOverflow();// Set flag  window group message queue is overflow and has pending messages
+    
+    //Get orientation value that app indicated
+    TInt GetIndicatedAppOrientation();
 
 private: // from MWsClient
 	TInt SendMessage(const CWsGraphicDrawer* aOnBehalfOf, const TDesC8& aData);
@@ -255,6 +258,10 @@
 	
 	// Misc
 	void SetComputeMode(RWsSession::TComputeMode aComputeMode);
+	
+	//Set orientation that application indicated
+	void IndicateAppOrientation(TRenderOrientation aOrientation);
+	
 public:
 	static TWsCmdHeaderBase iCurrentCommand;
 private:
@@ -293,6 +300,7 @@
 	RMessage2 iClientMessage;
 	RHandleBase* iResponseHandle;
 	TInt iMessageIdSeq;
+	TInt iIndicatedAppOrientation;
 
 	//Members for procerssing command buffer
 	static CWsClient* iCurrentClient;	// Client who's buffer is currently being processed
@@ -363,8 +371,8 @@
 inline void CWsClient::HandleClientRequestForPriorityKeyData()
 	{iPriorityKeyEvent->GetData();}
 
-inline void CWsClient::PriorityKeyPressed(TInt aHandle, const TKeyData &aKey, TInt aScanCode)
-	{iPriorityKeyEvent->PriorityKey(aHandle,aKey,aScanCode);}
+inline void CWsClient::PriorityKeyPressed(TInt aHandle, const TKeyEvent &aKeyEvent)
+	{iPriorityKeyEvent->PriorityKey(aHandle, aKeyEvent);}
 
 inline TInt CWsClient::ObjectHandle(const CWsObject* aThis) const
 	{return(iObjectIndex->At(aThis));}
--- a/windowing/windowserver/nga/SERVER/openwfc/GROUPWIN.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/GROUPWIN.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -515,9 +515,8 @@
 					CWsObject *destroyObj = iWsOwner->HandleToObj(*pData.UInt, WS_HANDLE_CAPTURE_KEY);
 					if (destroyObj)
 						{
-						//Cancel any repeat that is underway for this key
-						const TWsWinCmdCaptureKey& capKey(*pData.CaptureKey);
-						CKeyboardRepeat::CancelRepeat(this,capKey.key,EFalse,capKey.modifierMask);
+						// Cancel any repeat that is underway for this capture
+						CKeyboardRepeat::CancelRepeat(destroyObj, EFalse);
 						delete destroyObj;
 						}
 					else
@@ -535,9 +534,6 @@
 					CWsObject *destroyObj = iWsOwner->HandleToObj(*pData.UInt, WS_HANDLE_CAPTURE_KEY_UPDOWNS);
 					if (destroyObj)
 						{
-						//Cancel any repeat that is underway for this key
-						const TWsWinCmdCaptureKey& capKey(*pData.CaptureKey);
-						CKeyboardRepeat::CancelRepeat(this,capKey.key,EFalse,capKey.modifierMask);
 						delete destroyObj;
 						}
 					else
@@ -555,9 +551,8 @@
 					CWsObject *destroyObj = iWsOwner->HandleToObj(*pData.UInt, WS_HANDLE_CAPTURE_LONG_KEY);
 					if (destroyObj)
 						{
-						//Cancel any repeat that is underway for this key
-						const TWsWinCmdCaptureLongKey& capKey(*pData.CaptureLongKey);
-						CKeyboardRepeat::CancelRepeat(this,capKey.inputKey,ETrue,capKey.modifierMask);
+						// Cancel any repeat that is underway for this capture
+						CKeyboardRepeat::CancelRepeat(destroyObj, ETrue);
 						delete destroyObj;
 						} 
 					else
@@ -906,6 +901,12 @@
 TBool CWsWindowGroup::SetOrdinalPosition(TInt aPos,CWsWindowGroup* aClosingWindow)
 	{
 	TBool ret=ETrue;
+	
+	// Remember if the window group tree is actually changed or not, so that we know whether to 
+	// check the render orientation after the re-ordering is done ( see CWsTop::CheckRenderOrientation()
+	// call at end of this method
+	TBool changed = CheckOrdinalPositionChange(aPos);	
+	
 	if (!iQueue)
 		ret=DoSetOrdinalPosition1(aPos,aClosingWindow);
 	else
@@ -962,6 +963,11 @@
 #endif
 		}
 
+	// If the ordinal positions have changed, check to see if there is a new render orientation
+	// and publish it if so
+	if(changed)
+	    CWsTop::CheckRenderOrientation();
+	
 	return ret;
 	}
 
@@ -1348,13 +1354,13 @@
 		}
 	}
 
-TBool CWsWindowGroup::CheckForPriorityKey(const TKeyData &aKey, TInt aScanCode)
+TBool CWsWindowGroup::CheckForPriorityKey(const TKeyEvent &aKeyEvent)
 	{
 	for(TPriorityKey *pk=iPriorityKeys;pk;pk=pk->iNext)
 		{
-		if (pk->KeyMatches(aKey))
+		if (pk->KeyMatches(aKeyEvent))
 			{	
-			WsOwner()->PriorityKeyPressed(ClientHandle(),aKey, aScanCode);
+			WsOwner()->PriorityKeyPressed(ClientHandle(), aKeyEvent);
 			return(ETrue);
 			}
 		}
--- a/windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -26,9 +26,9 @@
 #include "wstop.h"
 #include "WsMemMgr.h"
 #include "renderstagemanager.h"
-#include "Graphics/WsRenderStageFactory.h"
-#include "Graphics/WsRenderStage.h"
-#include "Graphics/wsgraphicscontext.h"
+#include "graphics/WsRenderStageFactory.h"
+#include "graphics/WsRenderStage.h"
+#include "graphics/wsgraphicscontext.h"
 #include "EVENT.H"
 
 #ifdef USE_DEBUG_FRAME_CAPTURE
--- a/windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.h	Wed Aug 18 11:05:09 2010 +0300
@@ -23,8 +23,8 @@
 #include <gdi.h>
 #include "wstypes.h"
 #include "tcursor.h"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
-#include "Graphics/wsgraphicdrawerinternal.h"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/wsgraphicdrawerinternal.h"
 
 class CScreen;
 class CWsRenderStage;
--- a/windowing/windowserver/nga/SERVER/openwfc/WINBASE.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/WINBASE.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -511,10 +511,18 @@
 				}
 			}
 			break;
-			case EWsWinOpEnableAdvancedPointers:
-				User::LeaveIfError(IsActivated()?KErrInUse:KErrNone);
-				iBaseWinFlags |= EBaseWinAdvancedPointersEnabled;
-				break;
+		case EWsWinOpEnableAdvancedPointers:
+      if(!IsActivated())
+          {
+          // Must call this BEFORE activating the window.
+          iBaseWinFlags |= EBaseWinAdvancedPointersEnabled;
+          }
+      else
+          {                    
+          // Called after activation, so panic the client.                
+          OwnerPanic(EWservPanicUnableToEnableAdvPointer);
+          }
+			break;
 		default:
 			return(EFalse);
 		}
--- a/windowing/windowserver/nga/SERVER/openwfc/WINDOW.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/WINDOW.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -674,6 +674,11 @@
 		aWindowTreeObserver.FlagChanged(*this, MWsWindowTreeObserver::ENonFading, ETrue); 
 		}
 	
+	if(IsTopClientWindow() && (iFlags&EFlagScreenDeviceInvalid) )
+		{
+		aWindowTreeObserver.FlagChanged(*this, MWsWindowTreeObserver::EScreenDeviceValid, EFalse);
+		}
+	
 	if(iAnimList)
 		iAnimList->SendState(aWindowTreeObserver);
 	
--- a/windowing/windowserver/nga/SERVER/openwfc/WSTOP.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/WSTOP.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -32,7 +32,7 @@
 #include "pointer.h"
 #include "WSGRAPHICDRAWERFACTORY.H"
 #include "redrawmsgwindow.h"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "WsMemMgr.h"
 #include "backedupwindow.h"
 #include "wsfont.h"
@@ -46,6 +46,7 @@
 #include "registeredsurfacemap.h"
 #include "windowelementset.h"
 #include "wspluginmanager.h"
+#include "renderorientationtracker.h"
 
 // IDs of p&s properties that optionally contain callbacks that may be used
 // to release singletons owned by libraries at shutdown in order to make 
@@ -209,6 +210,7 @@
 TInt CWsTop::iCheckHeapResult=KErrNotReady;
 TBool CWsTop::iDoHeapCheckAndRestart=EFalse;
 #define RFbsSession_SendCommand_ShutDownMessage 1	// A FBS message that is not published yet and probably never will be.
+CWsRenderOrienationTracker* CWsTop::iRenderOrientationTracker=NULL;
 
 static void DefineSingletonKey(const TUid& aSingletonKey)
 /**
@@ -281,6 +283,8 @@
 void CWsTop::DeleteStaticsL()
 	{
 	iShuttingDown=ETrue;
+	delete iRenderOrientationTracker;	
+	
 	CClick::DeleteStatics();
 	TWsPointer::Stop();
 	CWsClient::DeleteStatics();
@@ -553,6 +557,8 @@
 		StartShell();
 		}
 	UserSvr::WsRegisterSwitchOnScreenHandling(ETrue);
+	
+	iRenderOrientationTracker = CWsRenderOrienationTracker::NewL();	
 	}
 
 
@@ -958,6 +964,18 @@
 	return EFalse;
 	}
 
+/**
+Checks to see if the render orientation has changed, and publishes any new orientaion
+via publish and subscribe
+
+@see KRenderOrientationCategory
+@see KRenderOrientationKey 
+*/
+void CWsTop::CheckRenderOrientation()
+    {
+    iRenderOrientationTracker->CheckRenderOrientation();
+    }
+
 typedef TInt (*ShellEntryPoint)(TAny *);
 
 #if defined(__WINS__)
--- a/windowing/windowserver/nga/SERVER/openwfc/cliwin.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/cliwin.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -33,6 +33,8 @@
 #include "EVENT.H"
 #include "backedupwindow.h"
 #include "redrawmsgwindow.h"
+#include "ANIM.H"
+
 #include "windowelementset.h"
 
 
@@ -552,7 +554,13 @@
 		MWsWindowTreeObserver* windowTreeObserver = Screen()->WindowTreeObserver();
 		if (windowTreeObserver)
 			{
-			windowTreeObserver->NodeExtentChanged(*this, FullRect());
+			TRect rect = FullRect();
+			windowTreeObserver->NodeExtentChanged(*this, rect);
+			
+			for (CWsAnim* anim = iAnimList; anim; anim = anim->Next())
+				{
+				windowTreeObserver->NodeExtentChanged(*anim, rect);
+				}
 			}
 		}
 	}
@@ -1426,6 +1434,13 @@
 			iFlags&=~EFlagScreenDeviceInvalid;
 		else
 			iFlags|=EFlagScreenDeviceInvalid;
+		
+		MWsWindowTreeObserver* windowTreeObserver = iScreen->WindowTreeObserver();
+		if (windowTreeObserver)
+			{
+			windowTreeObserver->FlagChanged(*this, MWsWindowTreeObserver::EScreenDeviceValid, aState);
+			}
+		
 		return ETrue;
 		}
 	return EFalse;
--- a/windowing/windowserver/nga/SERVER/openwfc/gc.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/gc.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -23,7 +23,7 @@
 #include "ScrDev.H"
 #include "wstop.h"
 #include "panics.h"
-#include "Graphics/WSGRAPHICDRAWER.H"
+#include "graphics/WSGRAPHICDRAWER.H"
 #include "wsfont.h"
 
 class TPlacedAttributes;
--- a/windowing/windowserver/nga/SERVER/openwfc/playbackgc.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/playbackgc.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -25,8 +25,8 @@
 #include "windowgroup.h"
 #include "wsfont.h"
 #include "wstop.h"
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include "Graphics/surfaceconfiguration.h"
+#include "graphics/WSGRAPHICDRAWER.H"
+#include "graphics/surfaceconfiguration.h"
 #include "windowelementset.h"
 
 #include <graphics/wsgraphicscontext.h>
--- a/windowing/windowserver/nga/SERVER/openwfc/redrawmsgwindow.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/redrawmsgwindow.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -30,7 +30,7 @@
 #include "rootwin.h"
 #include "EVENT.H"
 #include "wsfont.h"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include <graphics/surface.h>
 #include "windowelementset.h"
 
--- a/windowing/windowserver/nga/SERVER/openwfc/screen.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/screen.h	Wed Aug 18 11:05:09 2010 +0300
@@ -28,7 +28,7 @@
 #include "W32STD.H"
 #include "w32cmd.h"
 #include "wstypes.h"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "panics.h"
 
 #include "wsdisplaychangeao.h"
--- a/windowing/windowserver/nga/SERVER/openwfc/server.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/server.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -27,8 +27,9 @@
 #include "OBJECT.H"
 #include "CLIENT.H"
 #include "ScrDev.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
-#include "Graphics/wsgraphicdrawerinternal.h"
+#include <graphics/wskeyrouter.h>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/wsgraphicdrawerinternal.h"
 #include "WSGRAPHICDRAWERARRAY.H"
 #include "panics.h"
 
@@ -151,7 +152,7 @@
 	inline CWsWindowGroup *WindowGroup();
 	inline const CWsWindowGroup *WindowGroup() const;
 private:
-	void CmdToParams(const TWsWinCmdCaptureKey &aCaptureKey, TCaptureKey &aParams);
+	void CmdToRequest(const TWsWinCmdCaptureKey &aCaptureKey, TKeyCaptureRequest &aParams);
 private:
 	CWsWindowGroup *iWindowGroup;
 	};
@@ -182,21 +183,16 @@
 	~CWsCaptureKeyUpsAndDowns();
 	void ConstructL(const TWsWinCmdCaptureKey &aCaptureKey);
 	void CommandL(TInt aOpcode, const TAny *aCmdData);
-	static CWsWindowGroup *CheckForCapture(TUint aScanCode, TUint aModifiers);
 	inline CWsWindowGroup *WindowGroup();
 	inline const CWsWindowGroup *WindowGroup() const;
 private:
-	TUint iModifierValue;
-	TUint iModifierMask;
-	TUint iScanCode;
-	static TPriQue<CWsCaptureKeyUpsAndDowns> iCaptureKeysUpsAndDowns;
-	TPriQueLink iLink;
 	CWsWindowGroup *iWindowGroup;
 	};
 
 class CWsCaptureLongKey : public CWsObject
 	{
 	friend class CKeyboardRepeat;
+	friend class TWindowServerEvent;
 public:
 	CWsCaptureLongKey(CWsWindowGroup *owner);
 	~CWsCaptureLongKey();
@@ -204,13 +200,10 @@
 	void CommandL(TInt aOpcode, const TAny *aCmdData);
 	inline CWsWindowGroup *WindowGroup();
 	inline const CWsWindowGroup *WindowGroup() const;
-	static CWsCaptureLongKey* CheckForCapture(TUint aKeyCode, TInt aModifiers);
-public:
-	static TPriQue<CWsCaptureLongKey> iCaptureLongKeys;
 private:
-	TPriQueLink iLink;
+	TTimeIntervalMicroSeconds32 iDelay;
+	TUint iFlags;
 	CWsWindowGroup *iWindowGroup;
-	TWsWinCmdCaptureLongKey iData;
 	};
 
 //--------------------------------
--- a/windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -14,7 +14,7 @@
 //
 
 #include "wspluginmanager.h"
-#include "Graphics/WSPLUGIN.H"
+#include "graphics/WSPLUGIN.H"
 #include "inifile.h"
 
 GLREF_D CDebugLogBase* wsDebugLog;
--- a/windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/wspluginmanager.h	Wed Aug 18 11:05:09 2010 +0300
@@ -17,8 +17,8 @@
 #define __WSPLUGINMANAGER_H__
 
 #include <e32base.h>
-#include "Graphics/WSPLUGIN.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSPLUGIN.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 /**
 The window server has a single plugin manager object, which maintains the set
--- a/windowing/windowserver/nga/SERVER/openwfc/wstop.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/openwfc/wstop.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -56,6 +56,7 @@
 #endif
 	};
 
+class CWsRenderOrienationTracker;
 class CWsTop
 	{
 	enum {EShellBootModeReboot=0,EShellBootModeNoReboot=1,EShellBootModeExit=2};
@@ -122,6 +123,7 @@
 	static TBool MultiFocusPolicy();
 	
 	static inline CWsPluginManager *PluginManager();
+	static void CheckRenderOrientation();
 	
 private:
 	static void InitLogging();
@@ -152,6 +154,7 @@
 	static TInt iCheckHeapResult;
 	static TBool iDoHeapCheckAndRestart;
 	static CWsPluginManager *iPluginManager;
+    static CWsRenderOrienationTracker* iRenderOrientationTracker;	
 	};
 	
 NONSHARABLE_CLASS(CWsActiveScheduler): public CActiveScheduler, public MWsActiveSchedulerDebug
--- a/windowing/windowserver/nga/SERVER/pointer.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/pointer.h	Wed Aug 18 11:05:09 2010 +0300
@@ -42,6 +42,7 @@
 
 class TWsPointer : public CWsPointerTimer::MPointerTimerCallback
 	{
+friend class TWindowServerEvent;
 	enum {EPointerUpdateGapInMicroSeconds=50000};
 	enum TPointerState
 		{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/renderorientationtracker.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,570 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This material, including documentation and any related
+// computer programs, is protected by copyright controlled by
+// Nokia. All rights are reserved. Copying, including
+// reproducing, storing, adapting or translating, any
+// or all of this material requires the prior written consent of
+// Nokia. This material also contains confidential
+// information which may not be disclosed to others without the
+// prior written consent of Nokia.
+//
+// Description:
+// Render Orientation Tracking and Publication
+// 
+
+#include <hal.h>
+#include <e32std.h>
+#include "renderorientationtracker.h"
+#include "rootwin.h"
+#include "windowgroup.h"
+#include "wstop.h"
+#include "..\debuglog\DEBUGLOG.H"
+
+extern CDebugLogBase* wsDebugLog;
+
+/** Convert a TRenderOrientation value into a TDigitiserOrientation.
+Note: The algorithm used makes use of the ordering of the values of the respective enums, 
+thus this is checked for (at compile time) at the start of the function.
+@param aWservOrientation A value from the TRenderOrientation enums.
+@return The equivalent value from the TDigitiserOrientation enums.
+*/
+inline HALData::TDigitiserOrientation WservToDigitiser(TRenderOrientation aWservOrientation)
+	{
+	__ASSERT_COMPILE(EDisplayOrientationNormal+1 == EDisplayOrientation90CW);
+	__ASSERT_COMPILE(EDisplayOrientationNormal+2 == EDisplayOrientation180);
+	__ASSERT_COMPILE(EDisplayOrientationNormal+3 == EDisplayOrientation270CW);
+	__ASSERT_COMPILE(HALData::EDigitiserOrientation_000+1 == HALData::EDigitiserOrientation_090);
+	__ASSERT_COMPILE(HALData::EDigitiserOrientation_000+2 == HALData::EDigitiserOrientation_180);
+	__ASSERT_COMPILE(HALData::EDigitiserOrientation_000+3 == HALData::EDigitiserOrientation_270);
+	HALData::TDigitiserOrientation ret=static_cast<HALData::TDigitiserOrientation>
+			(HALData::EDigitiserOrientation_000 + (aWservOrientation - EDisplayOrientationNormal));
+	return ret;
+	}
+
+// Todo remove/undefine this for release
+#define TECHVIEW_TESTMODE
+
+CWsRenderOrienationTracker* CWsRenderOrienationTracker::NewL()
+    {
+    CWsRenderOrienationTracker* self = new(ELeave)CWsRenderOrienationTracker();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+CWsRenderOrienationTracker::CWsRenderOrienationTracker()
+    : CActive(CActive::EPriorityStandard),
+      iRenderOrientationTrackingType(EDisplayOrientationNormal),
+      iPublishedRenderOrientation(EDisplayOrientationNormal)
+    {
+    CActiveScheduler::Add(this);    
+    }
+
+void CWsRenderOrienationTracker::ConstructL()
+    {    
+    const TSecurityPolicy   KRenderOrientationReadSecurityPolicy(ECapability_None);
+    const TSecurityPolicy   KRenderOrientationWriteSecurityPolicy(ECapabilityWriteDeviceData);
+    
+    // Define P&S Property to publish to
+    TInt error = RProperty::Define( KRenderOrientationCategory,
+                                    KRenderOrientationKey,
+                                    RProperty::EInt,
+                                    KRenderOrientationReadSecurityPolicy,
+                                    KRenderOrientationWriteSecurityPolicy);
+
+    // Attach the publisher for real-time publishing
+    if(KErrNone == error)
+        error = iRenderOrientationPublisher.Attach( KRenderOrientationCategory,
+                                                    KRenderOrientationKey);
+
+    // Publish the initial value
+    if(KErrNone == error)    
+        error = DoPublishOrientation(EDisplayOrientationNormal);
+    
+    //Set the initial value to HAL
+    if(KErrNone == error)
+        SetHALOrientation(EDisplayOrientationNormal);
+    
+    if (wsDebugLog && KErrNone!=error)
+        {
+        _LIT(logText,"Orientation Tracker: failed to initialise with error %d");
+        wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,logText,error);
+        }    
+    User::LeaveIfError(error);
+    }
+
+CWsRenderOrienationTracker::~CWsRenderOrienationTracker()
+    {
+    Cancel();
+    iRenderOrientationPublisher.Delete(KRenderOrientationCategory, KRenderOrientationKey);
+    iRenderOrientationPublisher.Close();
+    }
+
+/**
+If the orientation of the given window group is useable updates aOrientationTrackingType with the orientation
+
+@param Input: the window group to check
+@param Output: the window group's orientation if usable ( otherwise unchanged )
+@return KErrNone if the orienation is usable, KErrNotFound if the orientation is not useable, KErrNotSupported if the orientation is unknown
+*/
+TInt CWsRenderOrienationTracker::CheckWindowGroupOrientation(const CWsWindowGroup& aWinGroup, TRenderOrientationTrackingType& aOrientationTrackingType)
+    {
+    TInt error = KErrNone;
+    TRenderOrientationTrackingType tempOrientationTrackingType = static_cast<TRenderOrientationTrackingType>(aWinGroup.WsOwner()->GetIndicatedAppOrientation());
+    switch(tempOrientationTrackingType)
+        {
+        case EDisplayOrientationNormal:
+        case EDisplayOrientation90CW:                
+        case EDisplayOrientation180:
+        case EDisplayOrientation270CW:            
+        case EDisplayOrientationAuto:
+            aOrientationTrackingType = tempOrientationTrackingType;
+            break;
+
+        case EDisplayOrientationIgnore:
+            error = KErrNotFound;
+            if (wsDebugLog)
+                {
+                _LIT(logText,"Orientation Tracker: winGroup %08x orientation is set to be ignored");
+                wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,logText,reinterpret_cast<TInt>(&aWinGroup));
+                }            
+            break;
+
+        default:
+            error = KErrNotSupported;
+            if (wsDebugLog)
+                {
+                _LIT(logText,"Orientation Tracker: winGroup %08x has undefined orientation, Error %d");                
+                TBuf<LogTBufSize> buf;
+                buf.Format(logText, &aWinGroup, error);                
+                wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate,buf);
+                }                          
+            break;             
+        }
+    
+    return error;
+    }
+
+/**
+Checks that the given group window is appropriate for dictating the render orientation
+
+@param Input:  The group window to check
+@return ETrue is the group window is usable, else EFalse  
+*/
+TBool CWsRenderOrienationTracker::UseableGroupWindow(const CWsWindowGroup& aWinGroup) const
+    {
+#ifdef TECHVIEW_TESTMODE
+    // for some reason IsFocusable seems to return 0 and 2, not 0 and 1
+    return NULL!=aWinGroup.Child() &&
+            (aWinGroup.IsFocusable() ? ETrue : EFalse);
+#else    
+    return (NULL!=aWinGroup.Child());     
+#endif
+    }
+
+/**
+Finds the topmost usable windowgroup which has a usable orientation, and outputs that orientation
+
+@param Output: The current render orientation
+@return KErrNone if successful, KErrNotFound if the focus window group is not usable, KErrNotSupported if an invalid orientation is found
+*/
+TInt CWsRenderOrienationTracker::GetFocusWindowOrientation(TRenderOrientationTrackingType& aOrientationTrackingType)
+    {
+    TInt error = KErrNone;
+    CWsWindowGroup* focusWinGroup = CWsTop::FocusWindowGroup();    
+    if(!focusWinGroup)
+        {
+        if(wsDebugLog)
+            {
+            _LIT(logText,"Orientation Tracker: focusWinGroup not found");
+            wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,logText);
+            }
+        error = KErrNotFound;
+        }
+    else
+        {
+        error = CheckWindowGroupOrientation(*focusWinGroup, aOrientationTrackingType);
+        }
+    return error;
+    }
+
+/**
+Finds the topmost usable windowgroup which has a usable orientation, and outputs that orientation
+
+@param Output: The current render orientation
+@return KErrNone if successful, KErrNotSupported if an invalid orientation is found
+*/
+TInt CWsRenderOrienationTracker::FindOrientationFromWindowTree(TRenderOrientationTrackingType& aOrientationTrackingType)
+    {
+    TInt error = KErrNone;
+    TRenderOrientationTrackingType tempOrientationTrackingType = iRenderOrientationTrackingType;
+    CWsRootWindow* rootWin = CWsTop::CurrentFocusScreen()->RootWindow();
+    TBool finished = EFalse;
+    for(CWsWindowGroup* winGroup = rootWin->Child(); !finished && NULL != winGroup; winGroup = winGroup->NextSibling())
+        {
+        if (wsDebugLog)
+            {
+            _LIT(logText,"Orientation Tracker: winGroup %08x has priority %d, Orientation %d, Focusable %d, Child %08x");
+            TBuf<LogTBufSize> buf;
+            buf.Format(logText, winGroup, winGroup->OrdinalPriority(), winGroup->WsOwner()->GetIndicatedAppOrientation(),
+                    winGroup->IsFocusable()?ETrue:EFalse, winGroup->Child());                                
+            wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,buf);
+            }               
+        // winGroup is a higher priority ordinal, so see if it has an orientation that can be used
+        // although we're only interested in window groups with child windows otherwise nothing is visible anyway        
+        if(UseableGroupWindow(*winGroup))
+            {
+            error = CheckWindowGroupOrientation(*winGroup, tempOrientationTrackingType);
+            switch(error)
+                {
+                case KErrNone:
+                    {
+                    // List is in order, so just find the first one
+                    if (wsDebugLog)
+                        {
+                        _LIT(logText,"Orientation Tracker: Found winGroup %08x with Orientation %d");
+                        TBuf<LogTBufSize> buf;
+                        buf.Format(logText, winGroup, winGroup->WsOwner()->GetIndicatedAppOrientation());                    
+                        wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,buf);
+                        }
+                    finished = ETrue;
+                    break;
+                    }
+
+                case KErrNotFound:
+                    // so keep searching
+                    break;                    
+                    
+                case KErrNotSupported:
+                default:
+                    finished = ETrue;
+                    break;
+                    
+                }
+            
+            }
+        }
+    // Safe even in error code as won't have been changed by CheckWindowGroupOrientation
+    aOrientationTrackingType = tempOrientationTrackingType;
+    
+    return error;
+    }
+
+/**
+First checks to see if the focus window group has a usable orientation, if so that is output.
+Otherwise, finds the topmost usable windowgroup which has a usable orientation, and outputs that
+
+@param Output: The current render orientation
+@return KErrNone if successful, KErrNotSupported if an invalid orientation is found 
+ */
+TInt CWsRenderOrienationTracker::GetIndicatedOrientation(TRenderOrientationTrackingType& aOrientationTrackingType)
+    {
+    // First check the focus window group
+    TInt error = GetFocusWindowOrientation(aOrientationTrackingType);
+
+    // Don't look for another window if the focus window is usable
+    // or if an error has occured, then don't change current orientation
+    switch(error)
+        {
+        case KErrNone:
+            {
+            if(wsDebugLog)
+                {
+                _LIT(logText,"Orientation Tracker: Using focus window %08x for orientation");
+                wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,logText,reinterpret_cast<TInt>(CWsTop::FocusWindowGroup()));
+                }
+            break;
+            }
+        
+        case KErrNotFound:
+            {
+            // Can't use focus window group, so find the topmost windowgroup with a valid orientation
+            error = FindOrientationFromWindowTree(aOrientationTrackingType);
+            break;
+            }
+            
+        default:
+            // Unrecoverable error, abort and leave published orientation unchanged
+            break;
+        }
+    
+    return error;
+    }
+
+/**
+Checks to see if the render orientation has changed, and publishes any new orientaion
+via publish and subscribe
+
+@see KRenderOrientationCategory
+@see KRenderOrientationKey 
+*/
+void CWsRenderOrienationTracker::CheckRenderOrientation()
+    {
+    TRenderOrientationTrackingType newOrientationTrackingType = iRenderOrientationTrackingType;    
+    TInt error = GetIndicatedOrientation(newOrientationTrackingType);
+
+    // if the tracking type has changed...
+    if(KErrNone == error && iRenderOrientationTrackingType != newOrientationTrackingType)
+        {
+        if(EDisplayOrientationAuto == iRenderOrientationTrackingType)
+            {
+            // change from auto type, so we need to cancel request for updates from the theme server        
+            Cancel();
+            }    
+        iRenderOrientationTrackingType = newOrientationTrackingType;
+        if(EDisplayOrientationAuto == iRenderOrientationTrackingType)
+            {
+            // Change to auto type, so we need to request updates from the theme server            
+            // Attach to the Theme server to get orientation change updates
+            error = iThemeOrientationProperty.Attach( KThemeOrientationCategory, KThemeOrientationKey );
+            if (wsDebugLog)
+                {
+                if(KErrNone == error)
+                    {
+                    // Information Log
+                    _LIT(logText,"Orientation Tracker: Attached to theme orientation property");
+                    wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,logText);
+                    }
+                else
+                    {
+                    // Error Log
+                    _LIT(logText,"Orientation Tracker: Error %d attaching to theme orientation property");
+                    wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate,logText, error);                
+                    }
+                }              
+            
+            RequestDeviceOrientationNotification();
+            }
+        // See if the  has changed, and publish if it has        
+        error = DoOrientationTracking();
+        }
+
+    if (wsDebugLog && KErrNone != error)
+        {
+        _LIT(logText,"Orientation Tracker: Error %d Checking Render Orientation");
+        wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,logText, error);
+        }  
+    }
+
+/**
+Requests notification of change of the theme server orientation
+
+@Pre iThemeOrientationProperty has had Attach called on it
+*/
+void CWsRenderOrienationTracker::RequestDeviceOrientationNotification()
+    {
+    if(!IsActive())
+        {
+        if (wsDebugLog)
+            {
+            _LIT(logText,"Orientation Tracker: Subscribing to theme orientation property");
+            wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,logText);
+            }          
+        // Request for Theme Server Orientation P&S  
+        iThemeOrientationProperty.Subscribe(iStatus);        
+        SetActive();
+        }
+    }
+
+/**
+Cancels and closes (detaches) from the theme orientation publish and subscribe
+*/
+void CWsRenderOrienationTracker::CancelDeviceOrientationNotification()
+    {
+    // Cancel Request for Theme Server Orientation P&S  
+    iThemeOrientationProperty.Cancel();
+    iThemeOrientationProperty.Close();
+    
+    if (wsDebugLog)
+        {
+        _LIT(logText,"Orientation Tracker: Cancelled/closed theme orientation property");
+        wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything,logText);
+        }      
+    }
+
+/**
+Called when the theme servers orientation has changed.
+Re-requests unless cancelled
+*/
+void CWsRenderOrienationTracker::RunL()
+    {
+    TInt error = iStatus.Int();
+    if(KErrNone == error)
+        {
+        // Re-request
+        RequestDeviceOrientationNotification();
+    
+        TInt error = DoOrientationTracking();
+        if (wsDebugLog && KErrNone != error)
+            {
+            _LIT(logText,"Orientation Tracker: Error %d processing theme orientation property");
+            wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,logText, error);
+            }         
+        }
+    else if (wsDebugLog && KErrCancel != error)
+        {
+        _LIT(logText,"Orientation Tracker: Error %d from theme orientation property, not resubscribed");
+        wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,logText, error);     
+        }
+    }
+
+/**
+Cancels the request for notification for changes to theme orientation
+*/
+void CWsRenderOrienationTracker::DoCancel()
+    {
+    CancelDeviceOrientationNotification();
+    }
+
+/**
+Gets the orientation published from theme server
+
+@param Output: the theme server orientation
+@return KErrNone if successful, KErrNotSupported if the theme server returns an unknown orientation, else any of the system wide error codes 
+*/
+TInt CWsRenderOrienationTracker::GetThemeOrientation(TRenderOrientation& aThemeOrientation)
+    { 
+    TInt themeOrientation=EDisplayOrientationNormal;
+    TInt error = iThemeOrientationProperty.Get(themeOrientation);
+    if(wsDebugLog && KErrNone != error)
+        {
+        _LIT(logText,"Orientation Tracker: Error %d getting theme orientation property");
+        wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate,logText, error);     
+        }
+    
+    if(KErrNone == error)
+        {
+        // Translate the received orientation    
+        switch(themeOrientation)
+            {           
+            case EDisplayOrientationNormal:
+            case EDisplayOrientation90CW:
+            case EDisplayOrientation180:
+            case EDisplayOrientation270CW:
+                // only update if orientation is supported
+                aThemeOrientation = static_cast<TRenderOrientation>(themeOrientation);
+                break;
+            
+            default:
+                error = KErrNotSupported;
+                if (wsDebugLog)
+                    {
+                    _LIT(logText,"Orientation Tracker: Unsupported orientation %d from theme orientation property, Error %d");
+                    TBuf<LogTBufSize> buf;
+                    buf.Format(logText, themeOrientation, error);
+                    wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate,buf);     
+                    }                
+                break;
+            }
+        }
+    return error;  
+    }
+
+/**
+Processes the indicated orientation into an actual orientation
+
+@return KErrNone for success, KErrNotSupported if the orientation is unknown, else any of the system wide error codes
+*/
+TInt CWsRenderOrienationTracker::DoOrientationTracking()
+    {
+    TInt error = KErrNone;
+    TRenderOrientation newDeviceOrientation;
+    switch(iRenderOrientationTrackingType)
+        {
+        case EDisplayOrientationNormal:
+        case EDisplayOrientation90CW:                
+        case EDisplayOrientation180:
+        case EDisplayOrientation270CW:            
+            newDeviceOrientation = iRenderOrientationTrackingType;
+            break;
+            
+        case EDisplayOrientationAuto:
+            error = GetThemeOrientation(newDeviceOrientation);
+            break;
+                      
+        default:
+            error = KErrNotSupported;
+            if (wsDebugLog)
+                {
+                _LIT(logText,"Orientation Tracker: Unsupported orientation tracking type %d, error %d");
+                TBuf<LogTBufSize> buf;
+                buf.Format(logText, iRenderOrientationTrackingType, error);
+                wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate,buf);     
+                }              
+            break;            
+        }    
+
+    if(KErrNone == error)
+        {
+        error = PublishOrientation(newDeviceOrientation);
+        }
+    
+    return error;
+    }
+
+/**
+Publishes the given value
+
+@param The render orientation to publish
+@return KErrNone for success, else any of the system wide erro codes
+*/
+TInt CWsRenderOrienationTracker::DoPublishOrientation(const TRenderOrientation aRenderOrientation)
+    {
+    TInt error = iRenderOrientationPublisher.Set(aRenderOrientation);
+         
+    // if it's published OK, then remember the newly published value
+    if(KErrNone == error)
+        {
+        iPublishedRenderOrientation = aRenderOrientation;
+        if(wsDebugLog)
+            {
+            _LIT(logText,"Orientation Tracker: Published render orientation %d");
+            wsDebugLog->MiscMessage(CDebugLogBase::ELogEverything, logText, aRenderOrientation);
+            }
+        }
+    else if(wsDebugLog)
+        {
+        _LIT(logText,"Orientation Tracker: Error %d setting render orientation property");
+        wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate, logText, error);                   
+        }
+    return error;
+    }
+
+void CWsRenderOrienationTracker::SetHALOrientation(const TRenderOrientation aRenderOrientation)
+    {
+    // If the render orientation is EDisplayOrientationAuto then don't update HAL
+    // The application and HAL should always have the same state for the orientation.
+    if(EDisplayOrientationAuto != aRenderOrientation)
+        {
+        TInt error = HAL::Set(CWsTop::CurrentFocusScreen()->ScreenNumber(), HALData::EDigitiserOrientation, WservToDigitiser(iPublishedRenderOrientation));
+        //Just log the error if there is one.
+        if(wsDebugLog && error != KErrNone)
+            {
+            _LIT(logText,"Orientation Tracker: Error %d setting digitiser orientation");
+            wsDebugLog->MiscMessage(CDebugLogBase::ELogIntermediate, logText, error);           
+            } 
+        }
+    }
+
+/**
+If the current orientation differs from the previously published value then publishes the current value
+
+@param The render orientation to check and publish
+@return KErrNone for success, else any of the system wide erro codes
+*/
+TInt CWsRenderOrienationTracker::PublishOrientation(const TRenderOrientation aRenderOrientation)
+    {
+    TInt error = KErrNone;
+  
+    if(aRenderOrientation != iPublishedRenderOrientation)
+        {
+        // If the device Orientation has changed, publish it
+        error = DoPublishOrientation(aRenderOrientation);
+        if(KErrNone == error)
+            SetHALOrientation(aRenderOrientation);
+        }
+    return error;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/renderorientationtracker.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,71 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This material, including documentation and any related
+// computer programs, is protected by copyright controlled by
+// Nokia. All rights are reserved. Copying, including
+// reproducing, storing, adapting or translating, any
+// or all of this material requires the prior written consent of
+// Nokia. This material also contains confidential
+// information which may not be disclosed to others without the
+// prior written consent of Nokia.
+//
+// Description:
+// Render Orientation Tracking and Publication
+// 
+
+#ifndef renderorientationtracker_h
+#define renderorientationtracker_h
+
+#include <e32std.h>
+#include <e32base.h>
+#include <e32property.h>
+#include <w32std.h>
+#include <wspublishandsubscribedata.h>
+
+// Values for the device orientation that we receive via P&S from the Theme Server
+// Todo FIX THIS Category UID!!!
+const TUid  KThemeOrientationCategory   = {0x20022E82}; // == KHbPsHardwareCoarseOrientationCategoryUid 
+const TUint KThemeOrientationKey        = 0x4F726965; // == KHbPsHardwareCoarseOrientationKey 
+
+typedef TRenderOrientation TRenderOrientationTrackingType; 
+
+class CWsWindowGroup;
+
+class CWsRenderOrienationTracker : public CActive
+    {
+public:  
+    static CWsRenderOrienationTracker* NewL();
+    ~CWsRenderOrienationTracker();
+
+    void CheckRenderOrientation();
+
+private:   
+    CWsRenderOrienationTracker();
+    void ConstructL();
+    
+    void RequestDeviceOrientationNotification();
+    void CancelDeviceOrientationNotification();
+    
+    // CActive
+    void RunL();
+    void DoCancel();
+    
+    TInt DoOrientationTracking();
+    TInt GetThemeOrientation(TRenderOrientation& aThemeOrientation);
+    TInt PublishOrientation(const TRenderOrientation aRenderOrientation);
+    TInt DoPublishOrientation(const TRenderOrientation aRenderOrientation);
+    TInt GetIndicatedOrientation(TRenderOrientationTrackingType& aOrientationTrackingType);
+    TInt CheckWindowGroupOrientation(const CWsWindowGroup& aWinGroup, TRenderOrientationTrackingType& aOrientationTrackingType);
+    TBool UseableGroupWindow(const CWsWindowGroup& aWinGroup) const;
+    TInt GetFocusWindowOrientation(TRenderOrientationTrackingType& aOrientationTrackingType);
+    TInt FindOrientationFromWindowTree(TRenderOrientationTrackingType& aOrientationTrackingType);    
+    void SetHALOrientation(const TRenderOrientation aRenderOrientation);
+    
+private:    
+    TRenderOrientationTrackingType  iRenderOrientationTrackingType;    
+    TRenderOrientation              iPublishedRenderOrientation;
+    RProperty                       iThemeOrientationProperty;
+    RProperty                       iRenderOrientationPublisher;
+    };
+
+#endif
--- a/windowing/windowserver/nga/SERVER/renderstagemanager.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/renderstagemanager.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -21,7 +21,7 @@
 #include "renderstagemanager.h"
 #include "wspluginmanager.h"
 
-#include "Graphics/WsRenderStageFactory.h"
+#include "graphics/WsRenderStageFactory.h"
 
 //  Constants
 
--- a/windowing/windowserver/nga/SERVER/scrdev.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/scrdev.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -33,7 +33,7 @@
 #include <graphics/wsdisplaycontrol.h>
 #include "wsdisplaychangeao.h"
 #include <graphics/wstestscreencapture.h>
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 const TInt KEikSrvsSid=0x10003a4a;
 
--- a/windowing/windowserver/nga/SERVER/windowgroup.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/windowgroup.h	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -82,7 +82,7 @@
 	void AddPriorityKeyL(TUint aKeycode, TUint aModifierMask, TUint aModifiers);
 	void RemovePriorityKey(TUint aKeycode, TUint aModifierMask, TUint aModifiers);
 	void RemoveAllPriorityKeys();
-	TBool CheckForPriorityKey(const TKeyData &aKey, TInt aScanCode);
+	TBool CheckForPriorityKey(const TKeyEvent &aKeyEvent);
 	inline CWsPointerCursor *GroupPointerCursor() const;
 	static CWsWindowGroup *WindowGroupFromIdentifier(TInt aIdentifier);
 	static CWsWindowGroup *WindowGroupFromIdentifierL(TInt aIdentifier);
@@ -110,7 +110,7 @@
 	void SetScreenDevice(DWsScreenDevice *aDevice);
 	static void SetEventQueueTestState(TBool aEventQueState);
 	TBool HasVisibleTranslucentChild();
-	void  ReleasePendedMessage();
+	void  ReleasePendedMessage();	
 private:
 	void SwitchToOwningWindow(CWsWindowGroup *aClosingWindow);
 	void MoveChainedWindows(TDblQueIter<CWsWindowGroup>& aIter,TBool aForward,TInt aPos,CWsWindowGroup* aClosingWindow);
--- a/windowing/windowserver/nga/SERVER/wsdisplaychangeao.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/SERVER/wsdisplaychangeao.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -248,19 +248,19 @@
     TSize resolution(0,0);
     if (aNewConfig.GetResolution(resolution))
         {
-        iLastConfig.SetResolution(resolution);
+        iLastSetConfig.SetResolution(resolution);
         }
     
     TSize resolutionTwips(0,0);
     if (aNewConfig.GetResolutionTwips(resolutionTwips))
         {
-        iLastConfig.SetResolutionTwips(resolutionTwips);   
+        iLastSetConfig.SetResolutionTwips(resolutionTwips);   
         }
     
     TDisplayConfiguration1::TRotation rotation;
     if (aNewConfig.GetRotation(rotation))
         {
-        iLastConfig.SetRotation(rotation);
+        iLastSetConfig.SetRotation(rotation);
         }
     }
 
--- a/windowing/windowserver/nga/graphicdrawer/graphicdrawer.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/graphicdrawer.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -17,8 +17,8 @@
 //
 
 #include "../SERVER/w32cmd.h"
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include <s32mem.h>
 #include "panics.h"
 
--- a/windowing/windowserver/nga/graphicdrawer/graphicdrawerarray.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/graphicdrawerarray.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -14,8 +14,8 @@
 //
 
 #include "WSGRAPHICDRAWERARRAY.H"
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "panics.h"
 
 // CWsGraphicDrawerArray::XRollBackBase \\\\\\\\\\\\\\\\\\\\\\\\
--- a/windowing/windowserver/nga/graphicdrawer/graphicdrawerenvironment.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/graphicdrawerenvironment.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -13,9 +13,9 @@
 // Description:
 //
 
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
-#include "Graphics/wsgraphicdrawerinternal.h"
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/wsgraphicdrawerinternal.h"
 
 // TGraphicDrawerId \\\\\\\\\\\\\\\\\\\\\\\\
 
--- a/windowing/windowserver/nga/graphicdrawer/graphicdrawerfactory.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/graphicdrawerfactory.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -16,8 +16,8 @@
 //
 
 #include "WSGRAPHICDRAWERFACTORY.H"
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "panics.h"
 #include <bitstd.h>
 
--- a/windowing/windowserver/nga/graphicdrawer/graphicmsgbuf.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/graphicmsgbuf.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -13,7 +13,7 @@
 // Description:
 //
 
-#include "Graphics/WSGRAPHICMSGBUF.H"
+#include "graphics/WSGRAPHICMSGBUF.H"
 #include "W32STDGRAPHIC.H"
 
 //so sue us; fixing a very nasty-to-track-down unsigned/signed conversion defect in code below
--- a/windowing/windowserver/nga/graphicdrawer/wsplugin.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/wsplugin.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -17,7 +17,7 @@
 // 
 //
 
-#include "Graphics/WSPLUGIN.H"
+#include "graphics/WSPLUGIN.H"
 #include <s32mem.h>
 
 _LIT(KPluginName, "unnamed");
--- a/windowing/windowserver/nga/graphicdrawer/wsrenderstage.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/graphicdrawer/wsrenderstage.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -15,7 +15,7 @@
 // 
 //
 
-#include "Graphics/WsRenderStage.h"
+#include "graphics/WsRenderStage.h"
 
 // CWsRenderStage::CPimpl \\\\\\\\\\\\\\\\\\\\\\\\
 
--- a/windowing/windowserver/nga/remotegc/CommandBuffer.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/remotegc/CommandBuffer.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -13,7 +13,7 @@
 // Description:
 //
 
-#include "Graphics/WSGRAPHICMSGBUF.H"
+#include "graphics/WSGRAPHICMSGBUF.H"
 #include "DrawSection.h"
 #include "CommandBuffer.h"
 #include "BitmapCache.h"
--- a/windowing/windowserver/nga/remotegc/DrawSection.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nga/remotegc/DrawSection.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -13,7 +13,7 @@
 // Description:
 //
 
-#include "Graphics/WSGRAPHICMSGBUF.H"
+#include "graphics/WSGRAPHICMSGBUF.H"
 #include "DrawSection.h"
 
 const TInt KBufferSize = 1000;
--- a/windowing/windowserver/nonnga/CLIENT/RWS.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nonnga/CLIENT/RWS.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -22,6 +22,7 @@
 #include "CLIENT.H"
 #include "wstraces.h"
 #include "graphics/windowserverconstants.h"
+#include <wspublishandsubscribedata.h>
 
 const TInt KMaxWSERVMessagesSlot=-1;
 
@@ -2422,3 +2423,10 @@
 	{
 	ASSERT(0);
 	}
+
+EXPORT_C void RWsSession::IndicateAppOrientation(TRenderOrientation /*aOrientation*/)
+	/** Dummy implementation in order to preserve compatibility with WSERV NGA.
+	@internalComponent */
+	{
+	ASSERT(0);
+	}
--- a/windowing/windowserver/nonnga/SERVER/WSTOP.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/nonnga/SERVER/WSTOP.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -18,6 +18,7 @@
 #include "wstop.h"
 
 #include <hal.h>
+#include <graphics/fbsdefs.h>
 #include "ANIM.H"
 #include "gc.h"
 #include "playbackgc.h"
--- a/windowing/windowserver/stdgraphic/BITMAPANIMATIONGRAPHICDRAWER.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/stdgraphic/BITMAPANIMATIONGRAPHICDRAWER.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -15,8 +15,8 @@
 
 #include "stdgraphicdrawer.h"
 #include "wsgraphicdrawercontext.h"
-#include "Graphics/WSGRAPHICMSGBUF.H"
-#include "Graphics/W32STDGRAPHICTEST.H"
+#include "graphics/WSGRAPHICMSGBUF.H"
+#include "graphics/W32STDGRAPHICTEST.H"
 #include <s32mem.h>
 #include <fbs.h>
 #include "W32STDGRAPHIC.H"
--- a/windowing/windowserver/stdgraphic/stdgraphicdrawer.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/stdgraphic/stdgraphicdrawer.h	Wed Aug 18 11:05:09 2010 +0300
@@ -16,8 +16,8 @@
 #ifndef __STDGRAPHICDRAWER_H__
 #define __STDGRAPHICDRAWER_H__
 
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include <icl/imagedata.h>
 #include "stdgraphictestdrawer.h"
 
--- a/windowing/windowserver/stdgraphic/stdgraphictest.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/stdgraphic/stdgraphictest.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -13,7 +13,7 @@
 // Description:
 //
 
-#include "Graphics/W32STDGRAPHICTEST.H"
+#include "graphics/W32STDGRAPHICTEST.H"
 
 EXPORT_C TWsGraphicFrameRate::TWsGraphicFrameRate():
 	TWsGraphicMsgFixedBase(TUid::Uid(ETypeId),sizeof(*this))
--- a/windowing/windowserver/stdgraphic/stdgraphictestdrawer.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/stdgraphic/stdgraphictestdrawer.h	Wed Aug 18 11:05:09 2010 +0300
@@ -19,8 +19,8 @@
 #define __STDGRAPHICDRAWERTEST_H__
 
 #include <e32std.h>
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 class MWsGraphicDrawerContext;
 
--- a/windowing/windowserver/test/TAutoServer/TAutoServer.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/TAutoServer/TAutoServer.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -72,6 +72,7 @@
 #include "TMULSCREENS.h"
 #include "TBUFFERSECURITY.H"
 #include "TFLICKERFREE.H"
+#include "tdevicerotation.h"
 #ifdef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
 #include "TFADINGBITMAP.H"
 #endif
@@ -86,6 +87,7 @@
 #include "tdrawresource.h"
 #include "twindowsizecache.h"
 
+
 /* Path to the script
 z:\GraphicsTest\gditest.script
 */
@@ -309,6 +311,8 @@
   		testStep = new CTBufferSecurityStep();
    	else if(aStepName == KTFlickerFreeStep)
   		testStep = new CTFlickerFreeStep();
+    else if(aStepName == KTDeviceRotationStep)
+     testStep = new CTDeviceRotationStep();
 #ifdef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
 	else if(aStepName == KTFadingBitmapStep)
   		testStep = new CTFadingBitmapStep();
--- a/windowing/windowserver/test/TAutoServer/openwfc/TAutoServer_nga.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/TAutoServer/openwfc/TAutoServer_nga.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -99,6 +99,7 @@
 SOURCE	      tmultiptrevent.cpp
 SOURCE	      tdrawresource.cpp
 SOURCE	      twindowsizecache.cpp
+SOURCE        tdevicerotation.cpp
 
 //Required to test CommamdBuffer::Play using MWsGraphicsContext in tgc
 SOURCE        directgdigcwrapper.cpp
--- a/windowing/windowserver/test/TAutoServer/openwfc/TAutoServer_nonnga.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/TAutoServer/openwfc/TAutoServer_nonnga.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -95,6 +95,7 @@
 SOURCE        THeartBeat.CPP
 SOURCE        tgc.cpp
 SOURCE	      TGRAPHICSDRAWER.CPP
+SOURCE        tdevicerotation.cpp
 
 LIBRARY	        bitgdi.lib	efsrv.lib	euser.lib	fbscli.lib
 LIBRARY	        gdi.lib		hal.lib		tlib.lib	ws32.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/TAutoServer/tevent_captureapp.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,29 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Helper application for TEvent test case GRAPHICS-WSERV-417-61800-0004
+//
+
+TARGET		tevent_captureapp.exe
+TARGETTYPE	exe
+UID			0x00000000 0x102872e4
+VENDORID	0x70000001
+CAPABILITY	SwEvent
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+SOURCEPATH	../tauto
+SOURCE		tevent_captureapp.cpp
+
+LIBRARY		euser.lib
+LIBRARY		ws32.lib
--- a/windowing/windowserver/test/scripts/wstest_config.cmd	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/scripts/wstest_config.cmd	Wed Aug 18 11:05:09 2010 +0300
@@ -1,22 +1,22 @@
 @echo off
-rem Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+rem Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
 rem All rights reserved.
 rem This component and the accompanying materials are made available
 rem under the terms of "Eclipse Public License v1.0"
 rem which accompanies this distribution, and is available
 rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
-rem 
+rem
 rem Initial Contributors:
 rem Nokia Corporation - initial contribution.
-rem 
+rem
 rem Contributors:
-rem 
+rem
 rem Description:
 rem @internalComponent - Internal Symbian
 rem 
 rem
 set nonnga=false
-if not defined EPOC_INI set EPOC_INI=\epoc32\data\epoc.ini
+if not defined EPOC_INI set EPOC_INI=%EPOCROOT%epoc32\data\epoc.ini
 if /i "%2"=="nonnga" set nonnga=true
 if /i "%3"=="nonnga" set nonnga=true
 if "%nonnga%"=="true" echo Configuring for Non-NGA
@@ -33,7 +33,7 @@
 	call :doinstall %EMULATOR_DATA_DIR% multiscreen %2 %3
 )
 
-echo If EPOC.INI isn't already backuped then backup EPOC.INI to EPOC.INI.bak
+rem If EPOC.INI isn't already backed up then backup EPOC.INI to EPOC.INI.bak
 if not exist %EPOC_INI%.bak copy /y %EPOC_INI% %EPOC_INI%.bak
 
 echo Editing EPOC.INI to use multiscreen.
@@ -46,7 +46,7 @@
 
 
 :doinstall
-rem If WSINI.INI(s) aren't already backuped then backup WSINI.INI(s)
+rem If WSINI.INI(s) aren't already backed up then backup WSINI.INI(s)
 if not exist %1\z\system\data\wsini.bak   if exist %1\z\system\data\wsini.ini   copy /y %1\z\system\data\wsini.ini   %1\z\system\data\wsini.bak >nul
 if not exist %1\z\resource\data\wsini.bak if exist %1\z\resource\data\wsini.ini copy /y %1\z\resource\data\wsini.ini %1\z\resource\data\wsini.bak >nul
 
@@ -84,7 +84,7 @@
 	call :doinstall_changetracking %EMULATOR_DATA_DIR% multiscreen %2 %3
 )
 
-echo If EPOC.INI isn't already backuped then backup EPOC.INI to EPOC.INI.bak
+rem If EPOC.INI isn't already backed up then backup EPOC.INI to EPOC.INI.bak
 if not exist %EPOC_INI%.bak copy /y %EPOC_INI% %EPOC_INI%.bak >nul
 
 echo Editing EPOC.INI to use multiscreen.
@@ -128,9 +128,9 @@
 	call :douninstall %EMULATOR_DATA_DIR%
 )
 
-echo If EPOC.INI was already backuped then restore EPOC.INI from EPOC.INI.bak
+rem If EPOC.INI was already backed up then restore EPOC.INI from EPOC.INI.bak
 if exist %EPOC_INI%.bak (
-	echo Restore EPOC.INI from backup
+	echo Restoring EPOC.INI from backup
 	copy /y %EPOC_INI%.bak %EPOC_INI% >nul
 	del /f /q %EPOC_INI%.bak >nul
 )
@@ -139,7 +139,7 @@
 
 :douninstall
 
-rem If WSINI.INI(s) were already backuped then restore WSINI.INI
+rem If WSINI.INI(s) were already backed up then restore WSINI.INI
 if exist %1\z\system\data\wsini.bak (
 copy /y %1\z\system\data\wsini.bak   %1\z\system\data\wsini.ini >nul
 del  /f /q %1\z\system\data\wsini.bak >nul
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/scripts/wstest_t_devicerotation_s0_nga.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,31 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: 
+//
+
+PRINT Run WServ NGA device rotation tests on screen 0
+
+LOAD_SUITE tautoserver_nga
+
+//
+// Uncommenting the TMemLeakCheckEnable test will set Wserv into a mode where
+// between each test it effectively shuts itself down, checks for memory leaks,
+// then restarts. This is especially useful when the final TMemLeakCheckOneShot
+// test indicates a memory leak somewhere in the tests.
+// RUN_TEST_STEP 100 tautoserver_nga TMemLeakCheckEnable
+//
+
+RUN_TEST_STEP 100 tautoserver_nga TDeviceRotation
+
+// Run at the end and it will trigger a Wserv memory leak check
+RUN_TEST_STEP 100 tautoserver_nga TMemLeakCheckOneShot
--- a/windowing/windowserver/test/t_gdcoverage/gdcoverage.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_gdcoverage/gdcoverage.h	Wed Aug 18 11:05:09 2010 +0300
@@ -24,8 +24,8 @@
 #ifndef __WSGRAPHICDRAWER_COVERAGE_H__
 #define __WSGRAPHICDRAWER_COVERAGE_H__
 
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 #include "gdcovcommon.h"
 
Binary file windowing/windowserver/test/t_genericplugin/data/ini/wsini_naviengine_genericplugin.ini has changed
--- a/windowing/windowserver/test/t_genericplugin/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_genericplugin/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -35,6 +35,8 @@
 
 ../data/ini/wsini_vasco_genericplugin.ini					z:/wstest/genericplugin/wsini_vasco_genericplugin.ini
 
+../data/ini/wsini_naviengine_genericplugin.ini					z:/wstest/genericplugin/wsini_naviengine_genericplugin.ini
+
 ../data/ini/wsini_nga_onescreen.ini			z:/wstest/genericplugin/wsini_nga_onescreen.ini
 
 ../data/ini/wsini_nonnga.ini					z:/wstest/genericplugin/wsini_nonnga.ini
--- a/windowing/windowserver/test/t_genericplugin/src/t_testrenderstage.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_genericplugin/src/t_testrenderstage.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -20,7 +20,7 @@
 */
 
 #include "t_testrenderstage.h"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "graphics/wsgraphicscontext.h"
 #include "t_logfile.h"
 #include <fbs.h>
--- a/windowing/windowserver/test/t_integ/src/t_wservintegstepsurface.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_integ/src/t_wservintegstepsurface.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -16,7 +16,6 @@
 /**
  @file
  @test
- @internalComponent
 */
 
 #include "t_wservintegstepsurface.h"
@@ -52,7 +51,11 @@
 	CreateSimLoadProcL();
 	ClearConfigData();
 
-	GetConfigDataL(KTApp1Data(), KTApp1DataName());
+	// Semaphore created here to maintain compatibility with DSA test use of t_app1
+	RSemaphore dudSemaphore;
+	User::LeaveIfError(dudSemaphore.CreateGlobal(KWservDsaSemaphoreName(), 0));
+
+    GetConfigDataL(KTApp1Data(), KTApp1DataName());
 	PrintConfigDataL(KWServTApp1ConfigFile());
 	TInt err = CreateTestProcessL(KWServTApp1, EPriorityForeground);
 	TEST(err==KErrNone);
@@ -92,6 +95,7 @@
 	CheckResultsL(KPseudoAppResultData(), KPseudoAppResultDataName(), KWServPseudoAppResultFile());
 	PrintResultsL(KWServPseudoAppResultFile());
 
+	dudSemaphore.Close();
 	CleanUp();
 
 	__UHEAP_MARKEND;
Binary file windowing/windowserver/test/t_ratelimiter/data/wsini_naviengine_ratelimiter.ini has changed
Binary file windowing/windowserver/test/t_ratelimiter/data/wsini_vasco_ratelimiter.ini has changed
--- a/windowing/windowserver/test/t_ratelimiter/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_ratelimiter/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -29,6 +29,7 @@
 
 ../data/wsini.ini					z:/wstest/ratelimiter/wsini.ini
 ../data/wsini_vasco_ratelimiter.ini					z:/wstest/ratelimiter/wsini_vasco_ratelimiter.ini
+../data/wsini_naviengine_ratelimiter.ini					z:/wstest/ratelimiter/wsini_naviengine_ratelimiter.ini
 
 ../data/wsini_changetracking.ini			z:/wstest/ratelimiter/wsini_changetracking.ini
 ../data/wsini_hw_singlescreen.ini			z:/wstest/ratelimiter/wsini_hw_singlescreen.ini
--- a/windowing/windowserver/test/t_ratelimiter/group/t_ratelimiter_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_ratelimiter/group/t_ratelimiter_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -33,5 +33,6 @@
 
 ;*Files To Copy...<src> <destination>
 
-"\epoc32\data\z\wstest\ratelimiter\graphics-wserv-ratelimiter-test.script"-"c:\wstest\ratelimiter\graphics-wserv-ratelimiter-test.script"
+;COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+;"\epoc32\data\z\wstest\ratelimiter\graphics-wserv-ratelimiter-test.script"-"c:\wstest\ratelimiter\graphics-wserv-ratelimiter-test.script"
 
--- a/windowing/windowserver/test/t_ratelimiter/tratelimitdrawer/ratelimitdrawer.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/t_ratelimiter/tratelimitdrawer/ratelimitdrawer.h	Wed Aug 18 11:05:09 2010 +0300
@@ -23,8 +23,8 @@
 #define RATELIMITDRAWER_H_
 
 #include <e32std.h>
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 #include "../inc/constants.h"
 
 /**
--- a/windowing/windowserver/test/tauto/TCapKey.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TCapKey.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -455,16 +455,39 @@
 	TInt retVal;
 	TInt resCount=Client()->iWs.ResourceCount();
 	for(TInt index=0;index<numErrorKeys;index++)
-	{
-		retVal = Client()->iGroup->GroupWin()->CaptureKey(errorKeys[index].keyCode,errorKeys[index].modifier_mask,errorKeys[index].modifiers);
+		{
+		retVal = Client()->iGroup->GroupWin()->CaptureKey(errorKeys[index].keyCode,errorKeys[index].modifier_mask,errorKeys[index].modifiers, errorKeys[index].priority);
 		TEST(retVal==KErrArgument);
 		if (retVal!=KErrArgument)
-			INFO_PRINTF3(_L("Client()->iGroup->GroupWin()->CaptureKey() return value - Expected: %d, Actual: %d"), KErrArgument, retVal);	
-	}
+			{
+			_LIT(KMsg, "CaptureKey() with bad parameter set %d returned %d - expected KErrArgument (%d)");
+			LOG_MESSAGE4(KMsg, index, retVal, KErrArgument);	
+			}
+
+		retVal = Client()->iGroup->GroupWin()->CaptureKeyUpAndDowns(errorKeys[index].keyCode, errorKeys[index].modifier_mask, errorKeys[index].modifiers, errorKeys[index].priority);
+		TEST(retVal == KErrArgument);
+		if (retVal != KErrArgument)
+			{
+			_LIT(KMsg, "CaptureKeyUpAndDowns() with bad parameter set %d returned %d - expected KErrArgument (%d)");
+			LOG_MESSAGE4(KMsg, index, retVal, KErrArgument);	
+			}
+
+		retVal = Client()->iGroup->GroupWin()->CaptureLongKey(errorKeys[index].keyCode, errorKeys[index].keyCode, errorKeys[index].modifier_mask, errorKeys[index].modifiers, errorKeys[index].priority, ELongCaptureNormal);
+		TEST(retVal == KErrArgument);
+		if (retVal != KErrArgument)
+			{
+			_LIT(KMsg, "CaptureLongKey() with bad parameter set %d returned %d - expected KErrArgument (%d)");
+			LOG_MESSAGE4(KMsg, index, retVal, KErrArgument);	
+			}
+		}
+
 	retVal = Client()->iWs.ResourceCount();
 	TEST(retVal==resCount);
 	if (retVal!=resCount)
-		INFO_PRINTF3(_L("Client()->iWs.ResourceCount() return value - Expected: %d, Actual: %d"), resCount, retVal);	
+		{
+		_LIT(KMsg, "Resource count %d - expected %d");
+		LOG_MESSAGE3(KMsg, retVal, resCount);	
+		}
 	}
 
 void CTCaptureKey::SetMode(TTestMode aMode)
@@ -801,8 +824,10 @@
 @SYMTestStatus      Implemented
 
 @SYMTestActions     Memorizes amount of objects that the server has allocated for that client.
-					Tries to register 3 different capture keys with invalid
-					modifiers and modifirs mask pair.
+					Tries to register capture keys with invalid modifiers and
+					modifier mask pairs, using each of the RWindowGroup capture
+					functions CaptureKey(), CaptureKeyUpAndDowns() and
+					CaptureLongKey().
 
 @SYMTestExpectedResults Makes sure that the number of server-side objects for the 
 					session didn't change.
--- a/windowing/windowserver/test/tauto/TCapKey.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TCapKey.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -157,12 +157,21 @@
 	TInt keyCode;
 	TUint modifier_mask;
 	TUint modifiers;
+	TInt priority;
 	};
 
 LOCAL_D SErrorCapKey errorKeys[]={
-	{'a',EModifierFunc|EModifierShift,EModifierFunc|EModifierCtrl},
-	{'1',0,EModifierFunc},
-	{3,EModifierCtrl,EModifierCtrl|EModifierShift},
+	{'a', EModifierFunc|EModifierShift,EModifierFunc|EModifierCtrl, 0},
+	{'1', 0, EModifierFunc, 0},
+	{3, EModifierCtrl,EModifierCtrl|EModifierShift, 0},
+	// @SYMPREQ 417-61800: Check that attempts to capture keys with
+	// EModifierLong in the modifier mask fail with KErrArgument.
+	{'T', EModifierLongKey, 0, 0},
+	{'u', EModifierLongKey|EModifierAlt, EModifierLongKey, 0},
+	{'V', EModifierLongKey|EModifierShift, EModifierLongKey|EModifierShift, 0},
+	// @SYMPREQ 417-61800: Check that attempts to capture keys with a priority
+	// of KMinTInt fail with KErrArgument.
+	{'W', 0, 0, KMinTInt},
 	};
 
 const TInt numCapKeys=sizeof(capKeys)/sizeof(capKeys[0]);
--- a/windowing/windowserver/test/tauto/TEVENT.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TEVENT.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -38,6 +38,7 @@
 
 const TInt EMaxEventQueueSize=32;
 const TInt EMinQueueSize = 2;
+const TUint KModifiersIgnore = 0xffffffff;
 
 
 class CTEventTest;
@@ -263,6 +264,11 @@
 		// Add additional enum values before this line
 		EMaxCancelCaptureKeyApis
 		};
+	enum TLongkeyCapPriorityTests
+		{
+		ELongkeyCaptureSamePriority,
+		ELongkeyCaptureDiffPriority
+		};
 private:
 	void RunTestsL(TBool aNeedChildWindows=EFalse);
 	void RunTestsRestoreAreaL(TBool aNeedChildWindows);
@@ -285,13 +291,17 @@
 	void Password_NextSetOfEvents();
 	void GroupListChanged_NextSetOfEventsL();
 	void VisibilityChanged_NextSetOfEventsL();
+#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA  	
+	void KeyEventTranslation_NextSetOfEventsL();
+	void KeyEventBlocking_NextSetOfEventsL();
+	void KeyEventAppRestriction_NextSetOfEventsL();
+	void KeyEventAppPriority_NextSetOfEventsL();
 #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS	
-#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA  	
 	void SurfaceVisibilityChanged1_NextSetOfEventsL();
 	void SurfaceVisibilityChanged2_NextSetOfEventsL();
 	void SurfaceVisibilityChanged3_NextSetOfEventsL();
+#endif //SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 #endif //TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
-#endif //SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 	void CheckTimeStamp_NextSetOfEventsL();
 	void RepeatableKeysL();
 	void PointerCapture_NextSetOfEventsL();
@@ -311,8 +321,8 @@
 	void EventHandlerRemoval_AddEventHandlerMultipleTimes();
 	void CheckPointerCursorInDifferentScreenMode(TSizeMode aMode,TPoint aOrigin);
 	void SimulateAndCheck(TPoint aOrigin,TSize aScale,TInt aXOffset,TInt aYOffset,TPointerEvent::TType aEventType,TRect aPointerCursorArea);
-	void AddExpectedKey(TInt aEventCode, TInt aScanCode, TInt aCode=0, TInt aRepeats=0, TUint aModifiers=0);
-	void AddExpectedKeyDownUp(TInt aScanCode, TInt aCode=0, TInt aRepeats=0, TUint aModifiers=0);
+	void AddExpectedKey(TInt aEventCode, TInt aScanCode, TInt aCode=0, TInt aRepeats=0, TUint aModifiers=KModifiersIgnore);
+	void AddExpectedKeyDownUp(TInt aScanCode, TInt aCode=0, TInt aRepeats=0, TUint aModifiers=KModifiersIgnore);
 	void AddExpectedEvent(TInt aEventCode, CTWinBase* aWin);
 	void AddExpectedEvent(TInt aEventCode);
 	void AddExpectedEvent(TInt aEventCode,RWindowGroup* aWindow);
@@ -358,6 +368,11 @@
 #endif
 	void TestCaptureAndCancelCapturePair(TCaptureKeyApis aCaptureApi, TCancelCaptureKeyApis aCancelCaptureApi);
 	static TInt GenerateAnEvent(TAny* aEventTest);
+	void CheckLongkeyCaptureWithPriority(TLongkeyCapPriorityTests aTestType);
+	void DelayForRepeatEvents(TInt aNumeratorFracVal, TInt aDenominatorFracVal);
+#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA 	
+	void SpawnCaptureAppL(RProcess& aProcess);
+#endif
 private:
 	CTBlankWindow* iBlankWin;
 	RBlankWindow iBackingWindow;
@@ -390,13 +405,17 @@
 	TBool iIs3DPointer;
 	TBool iPtrPluginLoaded;
 	TInt iYOffset;
+	TTimeIntervalMicroSeconds32 iKeyBoardRepeatInitialDelay;
+	TTimeIntervalMicroSeconds32 iKeyBoardRepeatNextDelay;
+#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA 	
+	RProcess iCaptureApp1;
+	RProcess iCaptureApp2;
 #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS	
-#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA 	
 	TSurfaceId iSurfaceId;
 	RSurfaceManager iSurfaceManager;
 	CPeriodic* iTimeOutCallback;
+#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 #endif // TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
-#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 	};
 
 class CTQueueWindowGroup : public CTWindowGroup
--- a/windowing/windowserver/test/tauto/TEvent.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TEvent.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -37,6 +37,9 @@
 
 _LIT(KKeyClickPluginDll, "click.dll");
 
+const TInt KLongKeyCaptureLowPriority = 1;
+const TInt KLongKeyCaptureHighPriority = 2;
+
 CTQueueClient::CTQueueClient(CTEventTest *aTest) : iTest(aTest)
 	{
 	}
@@ -203,6 +206,7 @@
 		TestL(wsEvent.Type()==expectedEvent.Type() && wsEvent.Handle()==expectedEvent.Handle());
 		}		
 	iLastEventError=(wsEvent.Type()==EEventErrorMessage);
+
 	switch(wsEvent.Type())
 		{
 		case EEventKey:
@@ -212,7 +216,7 @@
 				{
 				_LIT(KKeysDiff,"Count=%d  Key Code Exp=%d (%c)  Act=%d (%c)");
 				buf.Copy(KStartString);
-				buf.AppendFormat(KKeysDiff,iEventCount,iEventCount,eKeyCode,eKeyCode,wsKeyCode,wsKeyCode);
+				buf.AppendFormat(KKeysDiff,iEventCount,eKeyCode,eKeyCode,wsKeyCode,wsKeyCode);
 				iTest->LOG_MESSAGE(buf);
 				}
 			wsKeyRepeat=wsEvent.Key()->iRepeats,eKeyRepeat=expectedEvent.Key()->iRepeats;
@@ -224,10 +228,15 @@
 				iTest->LOG_MESSAGE(buf);
 				}
 		#endif
-			TestL(wsEvent.Key()->iCode==expectedEvent.Key()->iCode && wsEvent.Key()->iRepeats>=expectedEvent.Key()->iRepeats
-								&& (wsEvent.Key()->iRepeats>0)==(expectedEvent.Key()->iRepeats>0));		//Fall Through
+			TestL(wsEvent.Key()->iCode==expectedEvent.Key()->iCode &&
+				wsEvent.Key()->iRepeats>=expectedEvent.Key()->iRepeats &&
+				(wsEvent.Key()->iRepeats>0)==(expectedEvent.Key()->iRepeats>0));
+			// Fall Through
 		case EEventKeyDown:
 		case EEventKeyUp:
+			{
+			TUint wsModifiers = wsEvent.Key()->iModifiers;
+			TUint eModifiers = expectedEvent.Key()->iModifiers;
 		#if defined(FAIL_LOGGING)
 			wsKeyScan=wsEvent.Key()->iScanCode,eKeyScan=expectedEvent.Key()->iScanCode;
 			if (wsKeyScan!=eKeyScan)
@@ -237,8 +246,18 @@
 				buf.AppendFormat(KScanDiff,iEventCount,eKeyScan,eKeyScan,wsKeyScan,wsKeyScan);
 				iTest->LOG_MESSAGE(buf);
 				}
+
+			if (eModifiers != KModifiersIgnore && wsModifiers != eModifiers)
+				{
+				_LIT(KModDiff,"Count=%d  Modifiers Exp=0x%x  Act=0x%x");
+				buf.Copy(KStartString);
+				buf.AppendFormat(KModDiff, iEventCount, eModifiers, wsModifiers);
+				iTest->LOG_MESSAGE(buf);
+				}
 		#endif
-			TestL(wsEvent.Key()->iScanCode==expectedEvent.Key()->iScanCode);
+			TestL(wsEvent.Key()->iScanCode == expectedEvent.Key()->iScanCode &&
+				(eModifiers == KModifiersIgnore || wsModifiers == eModifiers));
+			}
 			break;
 		case EEventModifiersChanged:
 			{
@@ -708,7 +727,8 @@
 		{
 		iIs3DPointer=EFalse;
 		}
-#endif		
+#endif
+	TheClient->iWs.GetKeyboardRepeatRate(iKeyBoardRepeatInitialDelay, iKeyBoardRepeatNextDelay);
 	}
 
 void CTEventTest::Failed()
@@ -820,7 +840,7 @@
 	group.SetOrdinalPosition(position,priority);
 	}
 
-void CTEventTest::AddExpectedKey(TInt aEventCode, TInt aScanCode, TInt aCode/*=0*/, TInt aRepeats/*=0*/, TUint aModifiers/*=0*/)
+void CTEventTest::AddExpectedKey(TInt aEventCode, TInt aScanCode, TInt aCode/*=0*/, TInt aRepeats/*=0*/, TUint aModifiers/*=KModifiersIgnore*/)
 	{
 	TPckgBuf<TWsEvent> evtPkg;
 	TWsEvent& event=evtPkg();
@@ -834,15 +854,27 @@
 	event.Key()->iRepeats=aRepeats;
 	iQueueClient->AddExpectedEvent(event);
 	if (iAddToClick)
+		{
+		if (aModifiers == KModifiersIgnore)
+			{
+			// Key click tests assume zero modifiers in click event by default
+			event.Key()->iModifiers = 0;
+			}
 		iClick.CommandReply(EClickEventAdd,evtPkg);
-	}
-
-void CTEventTest::AddExpectedKeyDownUp(TInt aScanCode, TInt aCode/*=0*/, TInt aRepeats/*=0*/, TUint aModifiers/*=0*/)
+		}
+	}
+
+void CTEventTest::AddExpectedKeyDownUp(TInt aScanCode, TInt aCode/*=0*/, TInt aRepeats/*=0*/, TUint aModifiers/*=KModifiersIgnore*/)
 	{
 	__ASSERT_DEBUG(aScanCode<'a' || aScanCode>'z',AutoPanic(EAutoPanicScanCapital));
-	AddExpectedKey(EEventKeyDown,aScanCode,0,aRepeats,aModifiers);
+	// EModiferAutorepeatable can be present in EEventKey but is never valid
+	// in EEventKeyDown and EEventKeyUp. 
+	TUint modifiersDownUp = (aModifiers == KModifiersIgnore) ?
+		aModifiers : aModifiers & ~EModifierAutorepeatable;
+
+	AddExpectedKey(EEventKeyDown,aScanCode,0,aRepeats,modifiersDownUp);
 	AddExpectedKey(EEventKey,aScanCode,aCode,aRepeats,aModifiers);
-	AddExpectedKey(EEventKeyUp,aScanCode,0,aRepeats,aModifiers);
+	AddExpectedKey(EEventKeyUp,aScanCode,0,aRepeats,modifiersDownUp);
 	}
 
 void CTEventTest::AddExpectedEvent(TInt aEventCode, CTWinBase* aWin)
@@ -1160,20 +1192,32 @@
 	case 27:
 	    RawEventRepeatTest_NextSetOfEventsL();
 	    break;
-	    
-#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS	    
+
 #ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA 	    
     case 28:
-        SurfaceVisibilityChanged1_NextSetOfEventsL();
+        KeyEventTranslation_NextSetOfEventsL();
         break;
     case 29:
-        SurfaceVisibilityChanged2_NextSetOfEventsL();
+        KeyEventBlocking_NextSetOfEventsL();
         break;
     case 30:
+        KeyEventAppRestriction_NextSetOfEventsL();
+        break;
+    case 31:
+        KeyEventAppPriority_NextSetOfEventsL();
+        break;
+#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS	    
+    case 32:
+        SurfaceVisibilityChanged1_NextSetOfEventsL();
+        break;
+    case 33:
+        SurfaceVisibilityChanged2_NextSetOfEventsL();
+        break;
+    case 34:
         SurfaceVisibilityChanged3_NextSetOfEventsL();
         break;
+#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 #endif // TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
-#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
         
 	default:
 		AutoPanic(EAutoPanicWrongTest);
@@ -3545,8 +3589,8 @@
 			break;
 		case 2:
 			AddExpectedKey(EEventKeyDown,EStdKeyRightShift,0,0,EModifierRightShift|EModifierShift);
-			AddExpectedKeyDownUp('B','B',0,EModifierRightShift|EModifierShift);
-			AddExpectedKeyDownUp('W','W',0,EModifierRightShift|EModifierShift);
+			AddExpectedKeyDownUp('B','B',0,EModifierRightShift|EModifierShift|EModifierAutorepeatable);
+			AddExpectedKeyDownUp('W','W',0,EModifierRightShift|EModifierShift|EModifierAutorepeatable);
 			AddExpectedKey(EEventKeyUp,EStdKeyRightShift);
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyRightShift);		//1 event
@@ -3854,11 +3898,9 @@
 
 void CTEventTest::CaptureLong_NextSetOfEventsL()
 	{
-	TTimeIntervalMicroSeconds32 initialTime,time;
-	TheClient->iWs.GetKeyboardRepeatRate(initialTime,time);
 	#if defined(LOGGING)
 		TLogMessageText logMessageText;
-		_LIT(KSet,"CaptureLong SetOfEvents: %d of 14");
+		_LIT(KSet,"CaptureLong SetOfEvents: %d of 23");
 		logMessageText.Format(KSet,iEventSet);
 		INFO_PRINTF1(logMessageText);
 	#endif
@@ -3872,53 +3914,72 @@
 			AddExpectedKeyDownUp('A','a');
 			break;
 		case 1:
-			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureLongKey(' ','a',0,0,2,ELongCaptureNormal);
+			// Test CaptureLongKey() with modifier value EModifierShift and flag value ELongCaptureNormal
+			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureLongKey(' ','a',EModifierShift,EModifierShift,2,ELongCaptureNormal);
 			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftShift);
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+time.Int()/3);
+			DelayForRepeatEvents(1, 3);
 			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
+			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftShift);
+			AddExpectedKey(EEventKeyDown,EStdKeyLeftShift);
 			AddExpectedKey(EEventKeyDown,EStdKeySpace);
-			AddExpectedKey(EEventKey,EStdKeySpace,' ');
-			AddExpectedKey(EEventKey,EStdKeySpace,'a',1);
+			AddExpectedKey(EEventKey,EStdKeySpace,' ',0,EModifierLeftShift|EModifierShift|EModifierAutorepeatable);
+			AddExpectedKey(EEventKey,EStdKeySpace,'a',1,EModifierLongKey|EModifierLeftShift|EModifierShift|EModifierAutorepeatable);
 			AddExpectedKey(EEventKeyUp,EStdKeySpace);
+			AddExpectedKey(EEventKeyUp,EStdKeyLeftShift);
 			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
 			break;
-		case 2:
-			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureLongKey(' ','a',0,0,2,ELongCaptureWaitShort);
+		case 2:	
+			// Test CaptureLongKey() with modifier value EModifierFunc and flag value ELongCaptureWaitShort
+			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureLongKey(EKeyEnter,'a',EModifierFunc,EModifierFunc,2,ELongCaptureWaitShort);
 			iQueueClient->iWs.Flush();
-			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
+			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftFunc);
+			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyEnter);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+time.Int()/3);
-			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
+			DelayForRepeatEvents(1, 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyEnter);
+			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftFunc);
 			iTest->SimulateKeyDownUp(EStdKeySpace);
-			AddExpectedKey(EEventKeyDown,EStdKeySpace);
-			AddExpectedKey(EEventKey,EStdKeySpace,'a',1);
-			AddExpectedKey(EEventKeyUp,EStdKeySpace);
+			AddExpectedKey(EEventKeyDown,EStdKeyLeftFunc);
+			AddExpectedKey(EEventKeyDown,EStdKeyEnter);
+			AddExpectedKey(EEventKey,EStdKeyEnter,'a',1,EModifierLongKey|EModifierLeftFunc|EModifierFunc|EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp,EStdKeyEnter);
+			AddExpectedKey(EEventKeyUp,EStdKeyLeftFunc);
 			AddExpectedKeyDownUp(EStdKeySpace,' ');
 			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
 			break;
 		case 3:
-			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureLongKey(' ','a',0,0,2,ELongCaptureNormal|ELongCaptureRepeatEvents);
+			// Test CaptureLongKey() with modifier values EModifierFunc|EModifierAlt and flag values ELongCaptureNormal|ELongCaptureRepeatEvents)
+			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureLongKey(EKeyEnter,'a',EModifierFunc|EModifierAlt,EModifierFunc|EModifierAlt,2,ELongCaptureNormal|ELongCaptureRepeatEvents);
 			iQueueClient->iWs.Flush();
-			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
+			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftFunc);
+			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyLeftAlt);
+			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeyEnter);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+5*time.Int());
-			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
-			AddExpectedKey(EEventKeyDown,EStdKeySpace);
-			AddExpectedKey(EEventKey,EStdKeySpace,' ');
-			AddExpectedKey(EEventKey,EStdKeySpace,'a',2);
-			AddExpectedKey(EEventKeyUp,EStdKeySpace);
+			DelayForRepeatEvents(5, 1);
+			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyEnter);
+			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftAlt);
+			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeyLeftFunc);
+			AddExpectedKey(EEventKeyDown,EStdKeyLeftFunc);
+			AddExpectedKey(EEventKeyDown,EStdKeyLeftAlt);
+			AddExpectedKey(EEventKeyDown,EStdKeyEnter);
+			AddExpectedKey(EEventKey,EStdKeyEnter,EKeyEnter,0,EModifierLeftFunc|EModifierFunc|EModifierLeftAlt|EModifierAlt|EModifierAutorepeatable);
+			AddExpectedKey(EEventKey,EStdKeyEnter,'a',2,EModifierLongKey|EModifierLeftFunc|EModifierFunc|EModifierLeftAlt|EModifierAlt|EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp,EStdKeyEnter);
+			AddExpectedKey(EEventKeyUp,EStdKeyLeftAlt);
+			AddExpectedKey(EEventKeyUp,EStdKeyLeftFunc);
 			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
 			break;
 		case 4:
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'Z');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+3*time.Int());
+			DelayForRepeatEvents(3, 1);
 			iTest->SimulateKey(TRawEvent::EKeyDown,'Y');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+2*time.Int());
+			DelayForRepeatEvents(2, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'Z');
 			iTest->SimulateKey(TRawEvent::EKeyUp,'Y');
 			AddExpectedKey(EEventKeyDown,'Z');
@@ -3934,13 +3995,13 @@
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'Z');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+3*time.Int());
+			DelayForRepeatEvents(3, 1);
 			iTest->SimulateKey(TRawEvent::EKeyDown,'Y');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+5*time.Int()/2);
+			DelayForRepeatEvents(5, 2);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'Y');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+2*time.Int());
+			DelayForRepeatEvents(2, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'Z');
 			AddExpectedKey(EEventKeyDown,'Z');
 			AddExpectedKey(EEventKey,'Z','z');
@@ -3957,12 +4018,12 @@
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'X');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+3*time.Int());
+			DelayForRepeatEvents(3, 1);
 			iTest->SimulateKeyDownUp(EStdKeySpace);
 			TheClient->iWs.Flush();
 			if(!iTest->IsFullRomL())
 				{
-				User::After(initialTime.Int()+2*time.Int());
+				DelayForRepeatEvents(2, 1);
 				}
 			iTest->SimulateKey(TRawEvent::EKeyUp,'X');
 			AddExpectedKey(EEventKeyDown,'X');
@@ -3983,14 +4044,14 @@
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'X');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+5*time.Int());
+			DelayForRepeatEvents(5, 1);
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+time.Int()/3);
+			DelayForRepeatEvents(1, 3);
 			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
 			TheClient->iWs.Flush();
 			User::ResetInactivityTime();
-			User::After(initialTime.Int()+4*time.Int());
+			DelayForRepeatEvents(4, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'X');
 			AddExpectedKey(EEventKeyDown,'X');
 			AddExpectedKey(EEventKey,'X','x');
@@ -4008,7 +4069,7 @@
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+5*time.Int());
+			DelayForRepeatEvents(5, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
 			AddExpectedKey(EEventKeyDown,EStdKeySpace);
 			AddExpectedKey(EEventKey,EStdKeySpace,'c',1);
@@ -4022,10 +4083,10 @@
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+5*time.Int()/2);
+			DelayForRepeatEvents(5, 2);
 			iTest->SimulateKeyDownUp(EStdKeyEscape);
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+3*time.Int());
+			DelayForRepeatEvents(3, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
 			AddExpectedKey(EEventKeyDown,EStdKeySpace);
 			AddExpectedKey(EEventKey,EStdKeySpace,' ');
@@ -4045,33 +4106,36 @@
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
 			TheClient->iWs.Flush();
 			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
-			User::After(initialTime.Int()+5*time.Int());
+			DelayForRepeatEvents(5, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
 			AddExpectedKey(EEventKeyDown,EStdKeySpace);
 			AddExpectedKey(EEventKey,EStdKeySpace,' ');
 			AddExpectedKey(EEventKeyUp,EStdKeySpace);
 			break;
 		case 11:
-			//Cancel a capture key up and down event whilst a repeat is underway
-			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureKeyUpAndDowns(EStdKeySpace,0,0);
+			// Cancel a key up/down capture whilst a repeat is underway.
+			// This should have no effect since only key press events are
+			// repeated.
+			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureKeyUpAndDowns('X',0,0);
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'X');
 			TheClient->iWs.Flush();
 			iQueueClient->iGroup->GroupWin()->CancelCaptureKeyUpAndDowns(iCaptureKey);
-			User::After(initialTime.Int()+5*time.Int());
+			DelayForRepeatEvents(5, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'X');
 			AddExpectedKey(EEventKeyDown,'X');
 			AddExpectedKey(EEventKey,'X','x');
+			AddExpectedKey(EEventKey,'X','x',2);
 			AddExpectedKey(EEventKeyUp,'X');
 			break;
 		case 12:
 			//Cancel a capture key event whilst a repeat is underway
-			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureKey(EStdKeySpace,0,0);
+			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureKey('y',0,0);
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'Y');
 			TheClient->iWs.Flush();
 			iQueueClient->iGroup->GroupWin()->CancelCaptureKey(iCaptureKey);
-			User::After(initialTime.Int()+5*time.Int());
+			DelayForRepeatEvents(5, 1);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'Y');
 			AddExpectedKey(EEventKeyDown,'Y');
 			AddExpectedKey(EEventKey,'Y','y');
@@ -4079,13 +4143,13 @@
 			break;
 		case 13:
 			//Variation on case 12 i.e. change in the timing of the CancelCaptureKey call
-			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureKey(EStdKeySpace,0,0);
+			iCaptureKey=iQueueClient->iGroup->GroupWin()->CaptureKey('z',0,0);
 			iQueueClient->iWs.Flush();
 			iTest->SimulateKey(TRawEvent::EKeyDown,'Z');
 			TheClient->iWs.Flush();
-			User::After(initialTime.Int()+5*time.Int()/2);
+			DelayForRepeatEvents(5, 2);
 			iQueueClient->iGroup->GroupWin()->CancelCaptureKey(iCaptureKey);
-			User::After(initialTime.Int()+5*time.Int()/2);
+			DelayForRepeatEvents(5, 2);
 			iTest->SimulateKey(TRawEvent::EKeyUp,'Z');
 			AddExpectedKey(EEventKeyDown,'Z');
 			AddExpectedKey(EEventKey,'Z','z');
@@ -4102,7 +4166,7 @@
 			iTest->SimulateKey(TRawEvent::EKeyDown,EStdKeySpace);
 			TheClient->iWs.Flush();
 			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
-			User::After(initialTime.Int()+time.Int()/3);
+			DelayForRepeatEvents(1, 3);
 
 			TheClient->iGroup->GroupWin()->CancelCaptureKey(shortCaptKey);
 			iTest->SimulateKey(TRawEvent::EKeyUp,EStdKeySpace);
@@ -4110,6 +4174,132 @@
 			AddExpectedKey(EEventKeyUp,EStdKeySpace);
 			}
 			break;
+		case 15:
+			// @SYMPREQ 417-61800: Check that long key events are marked with
+			// EModifierLongKey and short events are not.
+			iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureLongKey('m', 'm', 0, 0, 0, ELongCaptureNormal);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, 'M');
+			TheClient->iWs.Flush();
+			DelayForRepeatEvents(1, 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, 'M');
+			AddExpectedKey(EEventKeyDown, 'M', 0, 0, 0);
+			AddExpectedKey(EEventKey, 'M', 'm', 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKey, 'M', 'm', 1, EModifierLongKey | EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, 'M', 0, 0, 0);
+			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
+			break;
+		case 16:
+			CheckLongkeyCaptureWithPriority(ELongkeyCaptureDiffPriority);
+			break;
+		case 17:
+			CheckLongkeyCaptureWithPriority(ELongkeyCaptureSamePriority);
+			break;
+		case 18:
+			// Test CaptureLongKey() with flag value ELongCaptureWaitShort
+			// when key is not held down long enough to generate a long event.
+			// Verify that short event is delivered when the key is released.
+			iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureLongKey('p', 'p', 0, 0, 0, ELongCaptureWaitShort);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, 'P');
+			TheClient->iWs.Flush();
+			User::After(iKeyBoardRepeatInitialDelay.Int() / 2);
+			iTest->SimulateKey(TRawEvent::EKeyUp, 'P');
+			TheClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeySpace);
+			AddExpectedKey(EEventKeyDown, 'P');
+			AddExpectedKey(EEventKey, 'P', 'p', 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, 'P');
+			AddExpectedKeyDownUp(EStdKeySpace, ' ');
+			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
+			break;
+		case 19:
+			{
+			// Cancel a capture key event whilst a repeat is underway for a
+			// different capture. This should not cancel repeating.
+			iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureKey('q', 0, 0);
+			TInt captureKey2 = iQueueClient->iGroup->GroupWin()->CaptureKey('r', 0, 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, 'Q');
+			TheClient->iWs.Flush();
+			iQueueClient->iGroup->GroupWin()->CancelCaptureKey(captureKey2);
+			DelayForRepeatEvents(5, 1);
+			iTest->SimulateKey(TRawEvent::EKeyUp, 'Q');
+			AddExpectedKey(EEventKeyDown, 'Q');
+			AddExpectedKey(EEventKey, 'Q', 'q', 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKey, 'Q', 'q', 2, EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, 'Q');
+			iQueueClient->iGroup->GroupWin()->CancelCaptureKey(iCaptureKey);
+			}
+			break;
+		case 20:
+			{
+			// Cancel a long capture key event whilst a repeat is underway for
+			// a different capture. This should not cancel repeating.
+			iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureLongKey('s', 's', 0, 0, 2, ELongCaptureNormal|ELongCaptureRepeatEvents);
+			TInt captureKey2 = iQueueClient->iGroup->GroupWin()->CaptureLongKey('t', 't', 0, 0, 2, ELongCaptureNormal|ELongCaptureRepeatEvents);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, 'S');
+			TheClient->iWs.Flush();
+			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(captureKey2);
+			DelayForRepeatEvents(5, 1);
+			iTest->SimulateKey(TRawEvent::EKeyUp, 'S');
+			AddExpectedKey(EEventKeyDown, 'S');
+			AddExpectedKey(EEventKey, 'S', 's', 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKey, 'S', 's', 2, EModifierLongKey | EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, 'S');
+			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
+			}
+			break;
+		case 21:
+			{
+			// Test CaptureLongKey() with a user specified initial repeat time.
+			// Simulate holding down the key for a period shorter than the
+			// specified delay. Verify that a long key event is NOT generated.
+			// (Note that the period is longer than the default initial repeat
+			// time, thus proving that CaptureLongKey() has honoured the delay
+			// argument.)
+			TTimeIntervalMicroSeconds32 delay(iKeyBoardRepeatInitialDelay.Int() * 4);
+			iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureLongKey(delay, 'u', 'u', 0, 0, 0, ELongCaptureNormal);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, 'U');
+			TheClient->iWs.Flush();
+			User::After(delay.Int() / 2);
+			iTest->SimulateKey(TRawEvent::EKeyUp, 'U');
+			TheClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeySpace);
+			AddExpectedKey(EEventKeyDown, 'U');
+			AddExpectedKey(EEventKey, 'U', 'u', 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, 'U');
+			AddExpectedKeyDownUp(EStdKeySpace, ' ');
+			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
+			}
+			break;
+		case 22:
+			{
+			// Test CaptureLongKey() with a user specified initial repeat time.
+			// Simulate holding down the key for a period longer than the
+			// specified delay. Verify that a long key event is generated.
+			// (Note that the period is shorter than the default initial repeat
+			// time, thus proving that CaptureLongKey() has honoured the delay
+			// argument.)
+			TTimeIntervalMicroSeconds32 delay(iKeyBoardRepeatInitialDelay.Int() / 4);
+			iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureLongKey(delay, 'v', 'v', 0, 0, 0, ELongCaptureNormal);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, 'V');
+			TheClient->iWs.Flush();
+			User::After(delay.Int() * 2);
+			iTest->SimulateKey(TRawEvent::EKeyUp, 'V');
+			TheClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeySpace);
+			AddExpectedKey(EEventKeyDown, 'V');
+			AddExpectedKey(EEventKey, 'V', 'v', 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKey, 'V', 'v', 1, EModifierLongKey | EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, 'V');
+			AddExpectedKeyDownUp(EStdKeySpace, ' ');
+			iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
+			}
+			break;
 		default:
 			CActiveScheduler::Stop();
 			break;
@@ -4117,6 +4307,485 @@
 	TheClient->iWs.Flush();
 	}
 
+/** Function used for checking CaptureLongKey() works fine with different priorities.
+
+If two window groups have requested capture of the same key with different priorities, 
+then the event should be delivered to the group that specified higher priority 
+(even if it is in the background).
+
+If two window groups have requested capture of the same key with same priorities,
+then the event should be delivered to the group that requested capture most recently.
+
+@param aTestType Enum value specifying test with same priority or with different priority
+*/
+void CTEventTest::CheckLongkeyCaptureWithPriority(TLongkeyCapPriorityTests aTestType)
+	{
+	TInt ordinalPriority = TheClient->iGroup->GroupWin()->OrdinalPriority();
+	TInt ordinalPosition = TheClient->iGroup->GroupWin()->OrdinalPosition();
+	// Bring other window group to foreground and request capture with lower/same priority
+	// And request capture from iQueueClient group window with higher priority
+	TheClient->iGroup->GroupWin()->SetOrdinalPosition(0, 10);
+	TInt capKeyFrontWin = TheClient->iGroup->GroupWin()->CaptureLongKey('m', 'm', 0, 0, (aTestType == ELongkeyCaptureDiffPriority ? KLongKeyCaptureLowPriority : KLongKeyCaptureHighPriority), ELongCaptureNormal);
+	iCaptureKey = iQueueClient->iGroup->GroupWin()->CaptureLongKey('m', 'm', 0, 0, KLongKeyCaptureHighPriority, ELongCaptureNormal);
+	iQueueClient->iWs.Flush();
+	iTest->SimulateKey(TRawEvent::EKeyDown, 'M');
+	TheClient->iWs.Flush();
+	DelayForRepeatEvents(1, 3);
+	iTest->SimulateKey(TRawEvent::EKeyUp, 'M');
+	AddExpectedEvent(EEventFocusLost);
+	//Note: Button down/up events along with immediate key events are not delivered to iQueueCLient's window group
+	//as they are sent to foreground/focused window group
+	AddExpectedKey(EEventKey, 'M', 'm', 1, EModifierLongKey | EModifierAutorepeatable);
+	iQueueClient->iGroup->GroupWin()->CancelCaptureLongKey(iCaptureKey);
+	TheClient->iGroup->GroupWin()->CancelCaptureLongKey(capKeyFrontWin);
+	TheClient->iGroup->GroupWin()->SetOrdinalPosition(ordinalPosition, ordinalPriority);
+	AddExpectedEvent(EEventFocusGained);
+	}
+
+/** Function used for delaying current thread so that repeat events can be generated.
+
+It uses iKeyBoardRepeatInitialDelay and iKeyBoardRepeatNextDelay variables to get the desired delay.
+The idea is to wait for initial delay + some extra value so that first repeat is generated.
+For more than one repeat events, wait will be initial delay + next delay + some extra value, and so on.
+
+The extra value is taken as fraction of iKeyBoardRepeatNextDelay.
+
+@param aNumeratorFracVal Numerator value of the fraction.
+@param aDenominatorFracVal Denominator value of the fraction.
+*/
+void CTEventTest::DelayForRepeatEvents(TInt aNumeratorFracVal, TInt aDenominatorFracVal)
+	{
+	if (!aNumeratorFracVal || !aDenominatorFracVal)
+		return;
+	User::After(iKeyBoardRepeatInitialDelay.Int() + (iKeyBoardRepeatNextDelay.Int()*aNumeratorFracVal/aDenominatorFracVal));
+	}
+
+#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA  	
+void CTEventTest::KeyEventTranslation_NextSetOfEventsL()
+	{
+	TTimeIntervalMicroSeconds32 initialTime;
+	TTimeIntervalMicroSeconds32 time;
+	TheClient->iWs.GetKeyboardRepeatRate(initialTime, time);
+
+	RWindowGroup* wg = iQueueClient->iGroup->GroupWin();
+
+	#if defined(LOGGING)
+		TLogMessageText logMessageText;
+		_LIT(KSet,"KeyEventTranslation SetOfEvents: %d of 5");
+		logMessageText.Format(KSet,iEventSet);
+		INFO_PRINTF1(logMessageText);
+	#endif
+
+	switch (iEventSet++)
+		{
+		case 0:
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKeyDownUp('A');
+			AddExpectedEvent(EEventFocusGained);
+			AddExpectedKeyDownUp('A','a');
+			break;
+		case 1:
+			// Test key event translation using CaptureKey()
+			iCaptureKey = wg->CaptureKey(EKeyDevice0, 0, 0);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeyDevice1);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKeyDown, EStdKeyDevice1, 0, 0);
+			AddExpectedKey(EEventKey, EStdKeyDevice1, EKeyDevice0, 0);
+			AddExpectedKey(EEventKeyUp, EStdKeyDevice1, 0, 0);
+			wg->CancelCaptureKey(iCaptureKey);
+			break;
+		case 2:
+			// Test key event translation using CaptureKeyUpAndDowns()
+			iCaptureKey = wg->CaptureKeyUpAndDowns(EStdKeyDevice0, 0, 0);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeyDevice1);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKeyDown, EStdKeyDevice0, 0, 0);
+			AddExpectedKey(EEventKey, EStdKeyDevice1, EKeyDevice1, 0);
+			AddExpectedKey(EEventKeyUp, EStdKeyDevice0, 0, 0);
+			wg->CancelCaptureKeyUpAndDowns(iCaptureKey);
+			break;
+		case 3:
+			// Test key event translation using CaptureLongKey()
+			iCaptureKey = wg->CaptureLongKey(EKeyDevice0, EKeyDevice0, 0, 0, 0, ELongCaptureNormal);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyDevice1);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyDevice1);
+			TheClient->iWs.Flush();
+
+			AddExpectedKey(EEventKeyDown, EStdKeyDevice1, 0, 0);
+			AddExpectedKey(EEventKey, EStdKeyDevice1, EKeyDevice1, 0, EModifierAutorepeatable);
+			AddExpectedKey(EEventKey, EStdKeyDevice1, EKeyDevice0, 1, EModifierLongKey | EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, EStdKeyDevice1, 0, 0);
+
+			wg->CancelCaptureLongKey(iCaptureKey);
+			break;
+		case 4:
+			// Negative test: check that the capture key code listed in the
+			// translation table of the Key Routing Plug-in is not translated
+			// in the absence of any capture request for the mapped key.
+			iTest->SimulateKeyDownUp(EStdKeyDevice1);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKeyDown, EStdKeyDevice1, 0, 0);
+			AddExpectedKey(EEventKey, EStdKeyDevice1, EKeyDevice1, 0);
+			AddExpectedKey(EEventKeyUp, EStdKeyDevice1, 0, 0);
+			break;
+		default:
+			CActiveScheduler::Stop();
+			break;
+		}
+
+	TheClient->iWs.Flush();
+	}
+
+void CTEventTest::KeyEventBlocking_NextSetOfEventsL()
+	{
+	TTimeIntervalMicroSeconds32 initialTime;
+	TTimeIntervalMicroSeconds32 time;
+	TheClient->iWs.GetKeyboardRepeatRate(initialTime, time);
+
+	RWindowGroup* wg = iQueueClient->iGroup->GroupWin();
+
+	#if defined(LOGGING)
+		TLogMessageText logMessageText;
+		_LIT(KSet,"KeyEventBlocking SetOfEvents: %d of 5");
+		logMessageText.Format(KSet,iEventSet);
+		INFO_PRINTF1(logMessageText);
+	#endif
+
+	switch (iEventSet++)
+		{
+		case 0:
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKeyDownUp('A');
+			AddExpectedEvent(EEventFocusGained);
+			AddExpectedKeyDownUp('A','a');
+			break;
+		case 1:
+			// Simulate pressing a blocked key (Device3) while no
+			// key capture is in effect.
+			iTest->SimulateKeyDownUp(EStdKeyDevice3);
+			iTest->SimulateKeyDownUp('B');
+			TheClient->iWs.Flush();
+			AddExpectedKeyDownUp('B','b');
+			break;
+		case 2:
+			// Use RWindowGroup::CaptureKey() to capture EKeyDevice3
+			// and simulate pressing the blocked key again.
+			iCaptureKey = wg->CaptureKey(EKeyDevice3, 0, 0);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeyDevice3);
+			iTest->SimulateKeyDownUp('B');
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKey, EStdKeyDevice3, EKeyDevice3, 0);
+			AddExpectedKeyDownUp('B','b');
+			wg->CancelCaptureKey(iCaptureKey);
+			break;
+		case 3:
+			// Repeat using CaptureKeyUpAndDowns()
+			iCaptureKey = wg->CaptureKeyUpAndDowns(EStdKeyDevice3, 0, 0);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKeyDownUp(EStdKeyDevice3);
+			iTest->SimulateKeyDownUp('B');
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKeyDown, EStdKeyDevice3, 0, 0);
+			AddExpectedKey(EEventKeyUp, EStdKeyDevice3, 0, 0);
+			AddExpectedKeyDownUp('B','b');
+			wg->CancelCaptureKeyUpAndDowns(iCaptureKey);
+			break;
+		case 4:
+			// Repeat using CaptureLongKey()
+			iCaptureKey = wg->CaptureLongKey(EKeyDevice3, EKeyDevice3, 0, 0, 0, ELongCaptureNormal);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyDevice3);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyDevice3);
+			iTest->SimulateKeyDownUp('B');
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKey, EStdKeyDevice3, EKeyDevice3, 1, EModifierLongKey | EModifierAutorepeatable);
+			AddExpectedKeyDownUp('B','b');
+			wg->CancelCaptureLongKey(iCaptureKey);
+			break;
+		default:
+			CActiveScheduler::Stop();
+			break;
+		}
+
+	TheClient->iWs.Flush();
+	}
+
+void CTEventTest::KeyEventAppRestriction_NextSetOfEventsL()
+	{
+	TTimeIntervalMicroSeconds32 initialTime;
+	TTimeIntervalMicroSeconds32 time;
+	TheClient->iWs.GetKeyboardRepeatRate(initialTime, time);
+
+	RWindowGroup* wg = iQueueClient->iGroup->GroupWin();
+
+	#if defined(LOGGING)
+		TLogMessageText logMessageText;
+		_LIT(KSet,"KeyEventAppRestriction SetOfEvents: %d of 4");
+		logMessageText.Format(KSet,iEventSet);
+		INFO_PRINTF1(logMessageText);
+	#endif
+
+	switch (iEventSet++)
+		{
+		case 0:
+			// Make window group non-focusable so that it receives only
+			// keys that are captured and not those that are default-routed.
+			wg->EnableReceiptOfFocus(EFalse);
+			iQueueClient->iWs.Flush();
+			AddExpectedEvent(EEventFocusGained);
+			AddExpectedEvent(EEventFocusLost);
+			break;
+		case 1:
+			// Using RWindowGroup::CaptureKey(), attempt to capture a key
+			// that is restricted by UID to another application.
+			iCaptureKey = wg->CaptureKey(EKeyF20, 0, 0);
+			TEST(iCaptureKey == KErrPermissionDenied);
+			// Now capture a key that is restricted to the current
+			// application's UID and simulate pressing the restricted key.
+			iCaptureKey = wg->CaptureKey(EKeyF21, 0, 0);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			// Can't use SimulateKeyDownUp() here due to its check that scan
+			// codes are not in the range corresponding to lower case letters
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF21);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF21);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKey, EStdKeyF21, EKeyF21, 0);
+			wg->CancelCaptureKey(iCaptureKey);
+			break;
+		case 2:
+			// Repeat using CaptureKeyUpAndDowns()
+			iCaptureKey = wg->CaptureKeyUpAndDowns(EStdKeyF20, 0, 0);
+			TEST(iCaptureKey == KErrPermissionDenied);
+			iCaptureKey = wg->CaptureKeyUpAndDowns(EStdKeyF21, 0, 0);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF21);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF21);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKeyDown, EStdKeyF21, 0, 0);
+			AddExpectedKey(EEventKeyUp, EStdKeyF21, 0, 0);
+			wg->CancelCaptureKeyUpAndDowns(iCaptureKey);
+			break;
+		case 3:
+			// Repeat using CaptureLongKey()
+			iCaptureKey = wg->CaptureLongKey(EKeyF20, EKeyF20, 0, 0, 0, ELongCaptureNormal);
+			TEST(iCaptureKey == KErrPermissionDenied);
+			iCaptureKey = wg->CaptureLongKey(EKeyF21, EKeyF21, 0, 0, 0, ELongCaptureNormal);
+			TEST(iCaptureKey >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF21);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF21);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKey, EStdKeyF21, EKeyF21, 1, EModifierLongKey | EModifierAutorepeatable);
+			wg->CancelCaptureLongKey(iCaptureKey);
+			break;
+		default:
+			CActiveScheduler::Stop();
+			break;
+		}
+
+	TheClient->iWs.Flush();
+	}
+
+void CTEventTest::KeyEventAppPriority_NextSetOfEventsL()
+	{
+	TTimeIntervalMicroSeconds32 initialTime;
+	TTimeIntervalMicroSeconds32 time;
+	TheClient->iWs.GetKeyboardRepeatRate(initialTime, time);
+
+	RWindowGroup* wg = iQueueClient->iGroup->GroupWin();
+	TInt handle1 = 0;
+	TInt handle2 = 0;
+	TInt handle3 = 0;
+	TInt handle4 = 0;
+	TInt handle5 = 0;
+	TInt handle6 = 0;
+
+	#if defined(LOGGING)
+		TLogMessageText logMessageText;
+		_LIT(KSet,"KeyEventAppPriority SetOfEvents: %d of 5");
+		logMessageText.Format(KSet,iEventSet);
+		INFO_PRINTF1(logMessageText);
+	#endif
+
+	switch (iEventSet++)
+		{
+		case 0:
+			SpawnCaptureAppL(iCaptureApp1);
+			iQueueClient->iWs.Flush();
+			AddExpectedEvent(EEventFocusGained);
+			AddExpectedEvent(EEventFocusLost);
+			break;
+		case 1:
+			// Use RWindowGroup::CaptureKey() to capture EKeyF22
+			// and EKeyF23 with priority 0. Simulate pressing both
+			// keys. Since the current application has precedence by UID
+			// for capture of EKeyF22, it should receive that key
+			// but should not receive EKeyF23.
+			handle1 = wg->CaptureKey(EKeyF22, 0, 0);
+			handle2 = wg->CaptureKey(EKeyF23, 0, 0);
+			TEST(handle1 >= 0);
+			TEST(handle2 >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF22);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF22);
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF23);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF23);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKey, EStdKeyF22, EKeyF22, 0);
+			wg->CancelCaptureKey(handle1);
+			wg->CancelCaptureKey(handle2);
+			break;
+		case 2:
+			// Repeat using CaptureKeyUpAndDowns()
+			handle1 = wg->CaptureKeyUpAndDowns(EStdKeyF22, 0, 0);
+			handle2 = wg->CaptureKeyUpAndDowns(EStdKeyF23, 0, 0);
+			TEST(handle1 >= 0);
+			TEST(handle2 >= 0);
+			iQueueClient->iWs.Flush();
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF22);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF22);
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF23);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF23);
+			TheClient->iWs.Flush();
+			AddExpectedKey(EEventKeyDown, EStdKeyF22, 0, 0);
+			AddExpectedKey(EEventKeyUp, EStdKeyF22, 0, 0);
+			wg->CancelCaptureKeyUpAndDowns(handle1);
+			wg->CancelCaptureKeyUpAndDowns(handle2);
+			break;
+		case 3:
+			// Repeat using CaptureLongKey()
+			handle1 = wg->CaptureLongKey(EKeyF22, EKeyF22, 0, 0, 0, ELongCaptureNormal);
+			handle2 = wg->CaptureLongKey(EKeyF23, EKeyF23, 0, 0, 0, ELongCaptureNormal);
+			TEST(handle1 >= 0);
+			TEST(handle2 >= 0);
+			iQueueClient->iWs.Flush();
+
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF22);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF22);
+
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF23);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF23);
+			TheClient->iWs.Flush();
+
+			AddExpectedKey(EEventKey, EStdKeyF22, EKeyF22, 1, EModifierLongKey | EModifierAutorepeatable);
+			wg->CancelCaptureLongKey(handle1);
+			wg->CancelCaptureLongKey(handle2);
+			break;
+		case 4:
+			// Repeat with additional capture requests for improved code
+			// coverage. (Also verifies that UID-based precedence works even
+			// when another app makes the most recent capture request.)
+			// Spawn a second capture app so that requests occur in the
+			// following order:
+			// 1. CaptureApp1, priority 1 (outstanding)
+			// 2. Current App, priority 0, precedence by UID
+			// 3. CaptureApp2, priority 1
+			// Note that all three capture types are tested together here.
+			handle1 = wg->CaptureKey(EKeyF22, 0, 0);
+			handle2 = wg->CaptureKey(EKeyF23, 0, 0);
+			handle3 = wg->CaptureKeyUpAndDowns(EStdKeyF22, 0, 0);
+			handle4 = wg->CaptureKeyUpAndDowns(EStdKeyF23, 0, 0);
+			handle5 = wg->CaptureLongKey(EKeyF22, EKeyF22, 0, 0, 0, ELongCaptureNormal);
+			handle6 = wg->CaptureLongKey(EKeyF23, EKeyF23, 0, 0, 0, ELongCaptureNormal);
+			TEST(handle1 >= 0);
+			TEST(handle2 >= 0);
+			TEST(handle3 >= 0);
+			TEST(handle4 >= 0);
+			TEST(handle5 >= 0);
+			TEST(handle6 >= 0);
+			iQueueClient->iWs.Flush();
+
+			SpawnCaptureAppL(iCaptureApp2);
+
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF22);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF22);
+
+			iTest->SimulateKey(TRawEvent::EKeyDown, EStdKeyF23);
+			TheClient->iWs.Flush();
+			User::After(initialTime.Int() + time.Int() / 3);
+			iTest->SimulateKey(TRawEvent::EKeyUp, EStdKeyF23);
+			TheClient->iWs.Flush();
+
+			AddExpectedKey(EEventKeyDown, EStdKeyF22, 0, 0);
+			AddExpectedKey(EEventKey, EStdKeyF22, EKeyF22, 0);
+			AddExpectedKey(EEventKey, EStdKeyF22, EKeyF22, 1, EModifierLongKey | EModifierAutorepeatable);
+			AddExpectedKey(EEventKeyUp, EStdKeyF22, 0, 0);
+			wg->CancelCaptureKey(handle1);
+			wg->CancelCaptureKey(handle2);
+			wg->CancelCaptureKeyUpAndDowns(handle3);
+			wg->CancelCaptureKeyUpAndDowns(handle4);
+			wg->CancelCaptureLongKey(handle5);
+			wg->CancelCaptureLongKey(handle6);
+			break;
+		default:
+			iCaptureApp1.Kill(KErrNone);
+			iCaptureApp2.Kill(KErrNone);
+			iCaptureApp1.Close();
+			iCaptureApp2.Close();
+			CActiveScheduler::Stop();
+			break;
+		}
+
+	TheClient->iWs.Flush();
+	}
+
+/**
+Spawn another application that will capture the keys EKeyF22 and
+EKeyF23 with high priority.
+
+@param aProcess		Process to create
+*/
+void CTEventTest::SpawnCaptureAppL(RProcess& aProcess)
+	{
+	_LIT(KCaptureApp, "tevent_captureapp.exe");
+	TInt error = aProcess.Create(KCaptureApp, KNullDesC);
+	if (error != KErrNone)
+		{
+#if defined(LOGGING)
+		TLogMessageText logMessageText;
+		_LIT(KLog, "Cannot create capture app - error %d");
+		logMessageText.Format(KLog, error);
+		INFO_PRINTF1(logMessageText);
+#endif
+		User::Leave(error);
+		}
+
+	// Make rendezvous request to capture app
+	TRequestStatus status;
+	aProcess.Rendezvous(status);
+	aProcess.Resume();
+
+	// Wait for capture app to make its capture requests
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+	}
+#endif // TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA  	
+
 #define PASSWORD_START_OF_DAY 4
 void CTEventTest::Password_NextSetOfEvents()
 	{
@@ -6316,15 +6985,19 @@
 	_LIT(KTest25,"Mismatched Pointer Events");
 	_LIT(KTest26,"Pointer Buffer Purge");
 	_LIT(KTest27,"TRawEvent test for Repeats");
+#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA 
+	_LIT(KTest28,"Translation of key events by routing plug-in");
+	_LIT(KTest29,"Blocking of key events by routing plug-in");
+	_LIT(KTest30,"App UID based restriction of key capture");
+	_LIT(KTest31,"App UID based routing of key events");
 #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS            
-#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA 
-	_LIT(KTest28,"Transparent Surface Visibility Changed Events 1");
-	_LIT(KTest29,"Transparent Surface Visibility Changed Events 2");
-	_LIT(KTest30,"Transparent Surface Visibility Changed Events 3");
+	_LIT(KTest32,"Transparent Surface Visibility Changed Events 1");
+	_LIT(KTest33,"Transparent Surface Visibility Changed Events 2");
+	_LIT(KTest34,"Transparent Surface Visibility Changed Events 3");
+#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
 #endif // TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
-#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
-	_LIT(KTest31A,"Initialize Queue Size without inactive queue");
-	_LIT(KTest31B,"Initialize Queue Size with inactive queue");	
+	_LIT(KTest35A,"Initialize Queue Size without inactive queue");
+	_LIT(KTest35B,"Initialize Queue Size with inactive queue");	
 	
 	if (!TestBase()->ConfigurationSupportsPointerEventTesting())
 	    {
@@ -6644,15 +7317,16 @@
 
 @SYMDEF             DEF081259
 
-@SYMTestCaseDesc    Send events for capturing large areas of text
+@SYMTestCaseDesc    Test RWindowGroup::CaptureLongKey()
 
 @SYMTestPriority    High
 
 @SYMTestStatus      Implemented
 
-@SYMTestActions     Send events for capturing large areas of text
-
-@SYMTestExpectedResults The events are sent to the window without
+@SYMTestActions     Simulate long key presses and check that long key capture
+					and key repeat work as expected.
+
+@SYMTestExpectedResults The correct key events are sent to the window without
 						error
 */
 		case 15:
@@ -6925,8 +7599,118 @@
 		    RunTestsL();
 		    break;
 		    
+#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA            
+/**
+@SYMTestCaseID      GRAPHICS-WSERV-0751, GRAPHICS-WSERV-0752, GRAPHICS-WSERV-0753
+@SYMPREQ			417-61800
+@SYMTestCaseDesc    Test translation of key events by Key Event Routing plug-in
+@SYMTestPriority    High
+@SYMTestStatus      Implemented
+@SYMTestActions     Use RWindowGroup::CaptureKey() to capture pseudo key
+					Device0 (key code EKeyDevice0, scan code EStdKeyDevice0).
+					Simulate pressing key Device1.
+					Repeat using CaptureKeyUpAndDowns().
+					Repeat using CaptureLongKey().
+					Repeat without any capture requests.
+@SYMTestExpectedResults
+					The key event delivered contains the key or scan code for
+					Device0, if captured. When using CaptureKey() and
+					CaptureLongKey(), only the key code is translated. Using
+					CaptureKeyUpAndDowns(), only the scan code is translated.
+
+Note: this test requires an entry in the translation table of the Key Routing
+Plug-in to map Device0 to Device1 at capture request time.
+*/
+		case 28:
+            ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0751"));
+            iTest->LogSubTest(KTest28);
+            RunTestsL();
+            break;
+
+/**
+@SYMTestCaseID      GRAPHICS-WSERV-0760, GRAPHICS-WSERV-0761, GRAPHICS-WSERV-0762
+@SYMPREQ			417-61800
+@SYMTestCaseDesc    Test blocking of key events by Key Event Routing plug-in
+@SYMTestPriority    High
+@SYMTestStatus      Implemented
+@SYMTestActions     Simulate pressing a blocked key (Device3) while no
+					key capture is in effect.
+					Use RWindowGroup::CaptureKey() to capture EKeyDevice3
+					and simulate pressing the blocked key again.
+					Repeat using CaptureKeyUpAndDowns().
+					Repeat using CaptureLongKey().
+@SYMTestExpectedResults
+					The blocked key event is only delivered when captured and
+					is not routed to the focussed window group by default.
+
+Note: this test requires entries in the Blocked Key Table of the Reference
+Key Routing Plug-in for EKeyDevice3 and EStdKeyDevice3.
+*/
+		case 29:
+            ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0760"));
+            iTest->LogSubTest(KTest29);
+            RunTestsL();
+            break;
+
+/**
+@SYMTestCaseID      GRAPHICS-WSERV-0754, GRAPHICS-WSERV-0755, GRAPHICS-WSERV-0756
+@SYMPREQ			417-61800
+@SYMTestCaseDesc    Test application UID-based restriction of key capture by
+					Key Event Routing plug-in.
+@SYMTestPriority    High
+@SYMTestStatus      Implemented
+@SYMTestActions     Attempt to capture a key that is restricted by UID
+					to another application.
+					Use RWindowGroup::CaptureKey() to capture a key that is
+					restricted to the current application's UID.
+					Simulate pressing the second key.
+					Repeat using CaptureKeyUpAndDowns().
+					Repeat using CaptureLongKey().
+@SYMTestExpectedResults
+					Capture of the first key fails with KErrPermissionDenied.
+					Capture of the second key succeeds and the key event is
+					delivered.
+
+Note: this test requires entries in the Restricted Key Table of the Reference
+Key Routing Plug-in for the chosen keys.
+*/
+		case 30:
+            ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0754"));
+            iTest->LogSubTest(KTest30);
+            RunTestsL();
+            break;
+
+/**
+@SYMTestCaseID      GRAPHICS-WSERV-0757, GRAPHICS-WSERV-0758, GRAPHICS-WSERV-0759
+@SYMPREQ			417-61800
+@SYMTestCaseDesc    Test application UID-based routing of key events by
+					Key Event Routing plug-in.
+@SYMTestPriority    High
+@SYMTestStatus      Implemented
+@SYMTestActions     Invoke another application to capture two different keys
+					with high priority using each of RWindowGroup::CaptureKey(),
+					CaptureKeyUpAndDowns() and CaptureLongKey(). One key of
+					each pair has precedence for capture by the current
+					application's UID (i.e. this test).
+					In the current application, use RWindowGroup::CaptureKey()
+					to capture both keys with lower priority.
+					Simulate pressing the keys.
+					Repeat using CaptureKeyUpAndDowns().
+					Repeat using CaptureLongKey().
+@SYMTestExpectedResults
+					The key event with UID-based precedence is delivered to
+					the current application but the other key is not.
+
+Note: this test requires entries in the Priority Application Table of the
+Reference Key Routing Plug-in for the chosen key.
+*/
+		case 31:
+            ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0757"));
+            iTest->LogSubTest(KTest31);
+            RunTestsL();
+            break;
+
 #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS            
-#ifndef TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA            
 /**
 @SYMTestCaseID      GRAPHICS-WSERV-2669-0015
 @SYMREQ             REQ13202: Possibility for external layers to appear above UI layer
@@ -6938,9 +7722,9 @@
 @SYMTestActions     Call SetSurfaceTransparency(ETrue) on win2
 @SYMTestExpectedResults Win1 receives visibility event
 */            
-        case 28:
+        case 32:
             ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-2669-0015"));
-            iTest->LogSubTest(KTest28);
+            iTest->LogSubTest(KTest32);
             RunTestsL();
             break;
 /**
@@ -6955,9 +7739,9 @@
 @SYMTestActions     Delete win3
 @SYMTestExpectedResults Both win1 and win2 receive visibility events
 */            
-        case 29:
+        case 33:
             ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-2669-0016"));
-            iTest->LogSubTest(KTest29);
+            iTest->LogSubTest(KTest33);
             RunTestsL();
             break;
 /**
@@ -6971,13 +7755,13 @@
 @SYMTestActions     Move win2 to overlap win1
 @SYMTestExpectedResults No visibility event is received (win1 is still fully visible)
 */            
-        case 30:
+        case 34:
             ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-2669-0017"));
-            iTest->LogSubTest(KTest30);
+            iTest->LogSubTest(KTest34);
             RunTestsL();
             break;
+#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS  
 #endif // TEST_GRAPHICS_WSERV_TAUTOSERVER_NONNGA
-#endif // SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS  
 
 /**
 @SYMTestCaseID      GRAPHICS-WSERV-0559
@@ -6994,17 +7778,17 @@
 		case 28:
 #else
 #ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
-		case 31:
+		case 35:
 #else
-		case 28:
+		case 32:
 #endif
 #endif
 		    // This test was moved to be the last test in the test suite, because it sometimes leaves events in the event queue, 
 		    //it can affect the results of other tests. This test case should be the last test in the test suite. 
 		    ((CTEventTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0484"));
-		    iTest->LogSubTest(KTest31A);
+		    iTest->LogSubTest(KTest35A);
 		    InitializeQueueSizeTestL(EFalse);
-		    iTest->LogSubTest(KTest31B);
+		    iTest->LogSubTest(KTest35B);
 		    InitializeQueueSizeTestL(ETrue);
 		    break;    
 			
--- a/windowing/windowserver/test/tauto/TGRAPHICSDRAWER.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TGRAPHICSDRAWER.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -22,7 +22,7 @@
 */
 
 #include "TGRAPHICSDRAWER.H"
-#include "Graphics/WSGRAPHICMSGBUF.H"
+#include "graphics/WSGRAPHICMSGBUF.H"
 
 CTGraphicsDrawer::CTGraphicsDrawer(CTestStep* aStep):
 	CTGraphicsBase(aStep)
--- a/windowing/windowserver/test/tauto/TGWHANDLE.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TGWHANDLE.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -19,7 +19,6 @@
 /**
  @file
  @test
- @internalComponent - Internal Symbian test code
 */
 
 #include "TGWHANDLE.H"
@@ -1195,6 +1194,7 @@
 	{
 	RArray<RWsSession::TWindowGroupChainInfo>* windowHandles=new(ELeave) RArray<RWsSession::TWindowGroupChainInfo>;
 	CleanupStack::PushL(windowHandles);
+	CleanupClosePushL(*windowHandles);
 	GetGwListL(0,windowHandles);
 	TInt shellWindow=windowHandles->Count();
 	//Creating chained window groups.
@@ -1282,7 +1282,8 @@
 
 	CleanupStack::PopAndDestroy(ENumChained-3,iChained[ENumChained-4]);
 	windowHandles->Close();
-	CleanupStack::PopAndDestroy(windowHandles);
+	CleanupStack::PopAndDestroy(windowHandles); // causes windowsHandles->Close() called
+	CleanupStack::PopAndDestroy(windowHandles); // causes delete windowsHandles	called
 	}
 
 TInt CTGwHandle::ChainedWindowCount(RArray<RWsSession::TWindowGroupChainInfo>* aWindowHandles)
--- a/windowing/windowserver/test/tauto/TOOM.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TOOM.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -66,6 +66,9 @@
 COomFailBase *CreateOomCaptureKeyUpDown(CTOom *aTest)
 	{return(new(ELeave) COomCaptureKeyUpDown(aTest));}
 
+COomFailBase *CreateOomLongKeyCapture(CTOom *aTest)
+	{return(new(ELeave) COomLongKeyCapture(aTest));}
+
 COomFailBase *CreateOomHotKey(CTOom *aTest)
 	{return(new(ELeave) COomHotKey(aTest));}
 
@@ -113,6 +116,7 @@
 	CreateOomPriorityKey,
 	CreateOomCaptureKey,
 	CreateOomCaptureKeyUpDown,
+	CreateOomLongKeyCapture,
 	CreateOomHotKey,
 	CreateOomGroupName,
 	CreateOomSprite,
@@ -421,7 +425,18 @@
 
 //
 
-COomCaptureKey::COomCaptureKey(CTOom *aTest) : COomSetup(aTest)
+COomCaptureKeyBase::COomCaptureKeyBase(CTOom *aTest) : COomSetup(aTest)
+	{}
+
+COomCaptureKeyBase::~COomCaptureKeyBase()
+	{}
+
+void COomCaptureKeyBase::ConstructL()
+	{
+	COomSetup::ConstructL();
+	}
+
+COomCaptureKey::COomCaptureKey(CTOom *aTest) : COomCaptureKeyBase(aTest)
 	{}
 
 COomCaptureKey::~COomCaptureKey()
@@ -433,11 +448,6 @@
 	return(_L("Capture key"));
 	}
 
-void COomCaptureKey::ConstructL()
-	{
-	COomSetup::ConstructL();
-	}
-
 /** Requests a capture keys for a previously created window group
 */
 TInt COomCaptureKey::Fail()
@@ -460,7 +470,7 @@
 
 //
 
-COomCaptureKeyUpDown::COomCaptureKeyUpDown(CTOom *aTest) : COomSetup(aTest)
+COomCaptureKeyUpDown::COomCaptureKeyUpDown(CTOom *aTest) : COomCaptureKeyBase(aTest)
 	{}
 
 COomCaptureKeyUpDown::~COomCaptureKeyUpDown()
@@ -472,11 +482,6 @@
 	return(_L("Capture up/down keys"));
 	}
 
-void COomCaptureKeyUpDown::ConstructL()
-	{
-	COomSetup::ConstructL();
-	}
-
 /** Requests the capture of key-up and key-down events for a previously created window group
 */
 TInt COomCaptureKeyUpDown::Fail()
@@ -499,6 +504,42 @@
 
 //
 
+COomLongKeyCapture::COomLongKeyCapture(CTOom *aTest) : COomCaptureKeyBase(aTest)
+	{}
+
+COomLongKeyCapture::~COomLongKeyCapture()
+	{
+	}
+
+TOomTestName COomLongKeyCapture::TestName()
+	{
+	_LIT(KLongKeyCapTestName, "Long key capture");
+	return KLongKeyCapTestName();
+	}
+
+/** 
+Requests capture of long key events for a previously created window group
+*/
+TInt COomLongKeyCapture::Fail()
+	{
+	for (iIndex=0; iIndex < KNumCapKeyRequest; iIndex++)
+		{
+		TInt ret=iWinGroup.CaptureLongKey(' ','a',0,0,2,ELongCaptureNormal);
+		if (ret<0)
+			return(ret);
+		iCapKey[iIndex]=ret;
+		}
+	return(KErrNone);
+	}
+
+void COomLongKeyCapture::ClearUpL()
+	{
+	for (TInt index=0;index<iIndex;index++)
+		iWinGroup.CancelCaptureLongKey(iCapKey[index]);
+	}
+
+//
+
 COomHotKey::COomHotKey(CTOom *aTest) : COomSetup(aTest)
 	{}
 
--- a/windowing/windowserver/test/tauto/TOOM.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TOOM.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -33,6 +33,8 @@
 
 class CTOom;
 
+const TInt KNumCapKeyRequest = 20;
+
 
 class COomFailBase : public CBase
 	{
@@ -192,32 +194,45 @@
 	TOomTestName TestName();
 	};
 
-class COomCaptureKey : public COomSetup
+class COomCaptureKeyBase : public COomSetup
+	{
+public:
+	COomCaptureKeyBase(CTOom *aTest);
+	~COomCaptureKeyBase();
+	void ConstructL();
+protected:
+	TInt32 iCapKey[KNumCapKeyRequest];
+	TInt iIndex;	
+	};
+
+class COomCaptureKey : public COomCaptureKeyBase
 	{
 public:
 	COomCaptureKey(CTOom *aTest);
 	~COomCaptureKey();
-	void ConstructL();
 	void ClearUpL();
 	TInt Fail();
 	TOomTestName TestName();
-private:
-	TInt32 iCapKey[20];
-	TInt iIndex;
 	};
 
-class COomCaptureKeyUpDown : public COomSetup
+class COomCaptureKeyUpDown : public COomCaptureKeyBase
 	{
 public:
 	COomCaptureKeyUpDown(CTOom *aTest);
 	~COomCaptureKeyUpDown();
-	void ConstructL();
 	void ClearUpL();
 	TInt Fail();
 	TOomTestName TestName();
-private:
-	TInt32 iCapKey[20];
-	TInt iIndex;
+	};
+
+class COomLongKeyCapture : public COomCaptureKeyBase
+	{
+public:
+	COomLongKeyCapture(CTOom *aTest);
+	~COomLongKeyCapture();
+	void ClearUpL();
+	TInt Fail();
+	TOomTestName TestName();
 	};
 
 class COomHotKey : public COomSetup
--- a/windowing/windowserver/test/tauto/TPANIC.CPP	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TPANIC.CPP	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -1150,6 +1150,27 @@
 	return(EWsExitReasonBad);
 	}
 
+/** Checks that activating a RWindow before calling EnableAdvancedPointers will panic the client.
+*/
+LOCAL_C TInt DoTestAdvancePointerActivatePanicL(TInt /*aTest*/,TAny *aScreenNumber)
+    {
+    RWsSession ws;
+    User::LeaveIfError(ws.Connect());
+
+    CWsScreenDevice *scrdev=new(ELeave) CWsScreenDevice(ws);
+    User::LeaveIfError(scrdev->Construct((TInt)aScreenNumber));
+    
+    RWindowGroup group(ws);
+    User::LeaveIfError(group.Construct(888));
+    RWindow win(ws);
+    User::LeaveIfError(win.Construct(group, 1));
+    win.Activate();
+    win.EnableAdvancedPointers(); // This will panic
+    ws.Flush();
+    return(EWsExitReasonBad);
+    }
+
+
 LOCAL_C TInt DoMoveToGroupPanicTestL(TInt aTest, TAny *aScreenNumber)
 	{
 	RWsSession ws;
@@ -1617,6 +1638,11 @@
 	TEST(iTest->TestWsPanicL(&DoUnInitPanicTest,EWservPanicUninitialisedClient,0,(TAny*)iTest->iScreenNumber));
 	}
 
+void CTPanic::TestEnableAdvancePointerActivatePanicL()
+    {
+    TEST(iTest->TestWsPanicL(&DoTestAdvancePointerActivatePanicL,EWservPanicUnableToEnableAdvPointer, 0, (TAny*)iTest->iScreenNumber));
+    }
+
 void CTPanic::ConstructL()
 	{
 	TheGc->Activate(*BaseWin->Win());
@@ -1874,7 +1900,16 @@
 			_LIT(KPanicTest, "Non-Redraw Drawing inside Redrawer Panic Test");
 			iTest->LogSubTest(KPanicTest);
 			TestNonRedrawRedrawerL();
-			}			
+			}
+			break;
+	  case 18:
+      {
+      _LIT(KPanicTest, "Enable advanced pointer Panic Test");
+      iTest->LogSubTest(KPanicTest);
+      TestEnableAdvancePointerActivatePanicL();
+      }   
+			break;
+						
 #endif			
 		default:
             		((CTPanicStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
--- a/windowing/windowserver/test/tauto/TPANIC.H	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/TPANIC.H	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,5 @@
 
-// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1996-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -88,6 +88,7 @@
 #endif	
 	void TestMismatchedCaptureCancelPanicL();
 	void LogHeapInfo();
+	void TestEnableAdvancePointerActivatePanicL();
 protected:
 //from 	CTGraphicsStep
 	virtual void RunTestCaseL(TInt aCurTestCase);
--- a/windowing/windowserver/test/tauto/talphawin.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/talphawin.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -371,7 +371,8 @@
 
 	theWin.SetExtent(TPoint(0,0), winSize);
 	theWin.SetBackgroundColor(TRgb(127,0,255,127));
-	TInt mode=theWin.SetRequiredDisplayMode(EColor16MA);
+	TDisplayMode mode = EColor16MAP;
+	theWin.SetRequiredDisplayMode(mode);
 	theWin.SetVisible(ETrue);
 	theWin.SetTransparencyAlphaChannel();
 	theWin.Activate();
@@ -447,7 +448,7 @@
 	CFbsBitmap *bitmapOne;
 	bitmapOne = new (ELeave)CFbsBitmap();
 	CleanupStack::PushL(bitmapOne);
-	User::LeaveIfError(bitmapOne->Create(winSize,static_cast<TDisplayMode>(mode)));
+	User::LeaveIfError(bitmapOne->Create(winSize,mode));
 
 	CFbsBitmapDevice *deviceOne=CFbsBitmapDevice::NewL(bitmapOne);
 	CleanupStack::PushL(deviceOne);
@@ -502,7 +503,7 @@
 	User::LeaveIfError(refWin.Construct(*(BaseWin->WinTreeNode()),(TUint32)&refWin));
 
 	refWin.SetExtent(TPoint(0,0), winSize);
-	refWin.SetRequiredDisplayMode(static_cast<TDisplayMode>(mode));
+	refWin.SetRequiredDisplayMode(mode);
 	refWin.SetVisible(ETrue);
 	refWin.SetTransparencyAlphaChannel();
 	refWin.Activate();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/tdevicerotation.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,823 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Set of tests for Tracing Device Rotation. These tests generally test
+// RWsSession::IndicateAppOrientation(...).
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Nokia test code
+*/
+
+#include "tdevicerotation.h"
+#include "themeserverpropertydefine.h"
+#include "..\..\nga\server\renderorientationtracker.h" 
+#include <hal.h>
+#include <hal_data.h>
+#include <w32std.h>
+
+const TInt KPublishTimeout = 1000000; // 1 second in microseconds
+
+//
+// CTDeviceRotation Definition
+//
+
+CTDeviceRotation::CTDeviceRotation(CTestStep* aStep):
+	CTGraphicsBase(aStep), iWaitForPublishOnNextTest(ETrue)
+	{
+	}
+
+CTDeviceRotation::~CTDeviceRotation()
+	{
+    iPublishTimer.Close();
+    
+    iChildWindow.Close();
+    iWindowGroup.Close();
+    iWs.Close();    
+    
+    iSecondChildWindow.Close();
+    iSecondWindowGroup.Close();    
+    iSecondWs.Close();
+   
+    /* This Process called with the argument KThemeServerPropertyDefineCmdDelete, deletes 
+       the theme server RProperty. This is because an RProperty can only be defined and 
+       deleted from within a process with the same UID3 as the RProperty catogory you are 
+       trying to define/delete.*/
+    RProcess themeServerPropertyDefine;
+    TInt err = themeServerPropertyDefine.Create(KThemeServerPropertyDefine,
+            KThemeServerPropertyDefineCmdDelete);
+    if (KErrNone != err)
+        {
+        _LIT(KLog, "themeServerPropertyDefine.Create() failed with error: %d");
+        INFO_PRINTF2(KLog, err);
+        TEST(EFalse);        
+        }
+    //wait for themeServerPropertyDefine process to terminate
+    TRequestStatus themeServerPropertyDefineLogonStatus;
+    themeServerPropertyDefine.Logon(themeServerPropertyDefineLogonStatus);
+    themeServerPropertyDefine.Resume();
+    User::WaitForRequest(themeServerPropertyDefineLogonStatus);
+    if (themeServerPropertyDefineLogonStatus != KErrNone)
+        {
+        _LIT(KLog, "themeServerPropertyDefine.Logon() failed with error: %d");
+        INFO_PRINTF2(KLog, themeServerPropertyDefineLogonStatus);
+        TEST(EFalse);        
+        }
+    themeServerPropertyDefine.Close();
+    
+    iRenderOrientationProperty.Delete(KRenderOrientationCategory, KRenderOrientationKey);
+    iRenderOrientationProperty.Close();
+    iThemeServerOrientationProperty.Close();
+    }
+
+void CTDeviceRotation::ConstructL()
+    {
+    TInt err = iWs.Connect();
+    TESTL(err == KErrNone);
+            
+    err = iSecondWs.Connect();
+    TESTL(KErrNone == err);
+    
+    iWs.SetAutoFlush(ETrue);
+    iSecondWs.SetAutoFlush(ETrue);
+    
+    iWindowGroup = RWindowGroup(iWs);
+    err = iWindowGroup.Construct(iWs.Handle());
+    TESTL(KErrNone == err);
+    iWindowGroup.SetOrdinalPosition(0,1);
+    
+    iChildWindow = RWindow(iWs);
+    err = iChildWindow.Construct(iWindowGroup, reinterpret_cast<TUint32>(&iChildWindow));
+    TESTL(KErrNone == err);    
+
+    iSecondWindowGroup = RWindowGroup(iSecondWs);
+    err = iSecondWindowGroup.Construct(iSecondWs.Handle());
+    TESTL(KErrNone == err);
+    iSecondWindowGroup.SetOrdinalPosition(1,1);
+    
+    iSecondChildWindow = RWindow(iSecondWs);
+    err = iSecondChildWindow.Construct(iSecondWindowGroup, reinterpret_cast<TUint32>(&iSecondChildWindow));
+    TESTL(KErrNone == err);    
+    
+    err= iRenderOrientationProperty.Attach(KRenderOrientationCategory, KRenderOrientationKey, EOwnerThread);
+    TESTL(KErrNone == err);
+    iRenderOrientationProperty.Subscribe(iRenderOrientationStatus);
+    
+    /* This Process called with the argument KThemeServerPropertyDefineCmdDefine, defines
+       the theme server catagory to be the same as the theme servers process ID. This is 
+       because an RProperty can only be defined and deleted from within a process with the 
+       same UID3 as the RProperty catogory you are trying to define/delete.*/
+    RProcess themeServerPropertyDefine;
+    err = themeServerPropertyDefine.Create(KThemeServerPropertyDefine,KThemeServerPropertyDefineCmdDefine);
+    TESTL(KErrNone == err);
+    TRequestStatus themeServerPropertyDefineLogonStatus;
+    themeServerPropertyDefine.Logon(themeServerPropertyDefineLogonStatus);
+    themeServerPropertyDefine.Resume();
+    User::WaitForRequest(themeServerPropertyDefineLogonStatus);
+    TESTL(KErrNone == themeServerPropertyDefineLogonStatus.Int()); 
+    themeServerPropertyDefine.Close(); 
+
+    err = iThemeServerOrientationProperty.Attach(KThemeOrientationCategory, KThemeOrientationKey, EOwnerThread);
+    TESTL(KErrNone == err);
+    
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    
+    iPublishTimer.CreateLocal();
+    }
+
+void CTDeviceRotation::SimulateThemeServerOrientation(TRenderOrientation aOrientation)
+    {
+    _LIT(KFunctionInfo, "SimulateThemeServerOrientation(aOrientation = %d)");
+    INFO_PRINTF2(KFunctionInfo, aOrientation);
+    TInt err = iThemeServerOrientationProperty.Set(aOrientation);
+    if (KErrNone != err)
+        {
+        _LIT(KLog,"iThemeServerOrientationProperty.Set(%d) failed with err %d");
+        INFO_PRINTF3(KLog,aOrientation,err);
+        TEST(EFalse);
+        }
+    switch(aOrientation)
+        {
+        case EDisplayOrientationNormal:
+        case EDisplayOrientation90CW:
+        case EDisplayOrientation180:
+        case EDisplayOrientation270CW:
+            {
+            if(KErrNone == err)
+                {
+                iCurrentThemeServerOrientation = aOrientation;            
+                }                
+            break;
+            }
+        default:
+            _LIT(KLog, "This orientation is not supported by theme server.");
+        	INFO_PRINTF1(KLog);
+        }
+    }
+
+void CTDeviceRotation::IsOrientationCorrect(TRenderOrientation aExpectedOrientation)
+    {
+    // timer to timeout when nothing is published
+    iPublishTimer.After(iPublishTimerStatus, KPublishTimeout);
+    
+    // wait for either
+    User::WaitForRequest(iRenderOrientationStatus, iPublishTimerStatus);
+    
+    // check that the orientation was published or not, as expected
+    if(iWaitForPublishOnNextTest)
+        {
+        // Check that it really has published
+        if(iRenderOrientationStatus.Int()==KErrNone && iPublishTimerStatus.Int()==KRequestPending)
+            {
+            iPublishTimer.Cancel();
+            // re-subscribe
+            iRenderOrientationProperty.Subscribe(iRenderOrientationStatus);            
+            }
+        else
+            {
+            _LIT(KLog,"Timed out (%d) while waiting for render orientation %d to be published");
+            INFO_PRINTF3(KLog,iRenderOrientationStatus.Int(),aExpectedOrientation);        
+            TEST(EFalse);
+            }
+        }
+    else
+        {
+        // Check that it really hasn't published    
+        if(iRenderOrientationStatus.Int()!=KRequestPending)
+            {
+            _LIT(KLog,"Render Orientation %d was published (%d) when not expected (timeout = %d)");
+            INFO_PRINTF4(KLog,aExpectedOrientation, iRenderOrientationStatus.Int(),iPublishTimerStatus.Int());
+            iPublishTimer.Cancel();
+            TEST(EFalse);
+            }
+        else if(iPublishTimerStatus.Int()!=KErrNone)
+            {
+            _LIT(KLog,"Timeout failure %d");
+            INFO_PRINTF2(KLog,iPublishTimerStatus.Int());           
+            TEST(EFalse);        
+            }
+        
+        // reset to default
+        iWaitForPublishOnNextTest = ETrue;
+        }
+    
+    // Retrieve the value.
+    TInt orientation;
+    TInt err = iRenderOrientationProperty.Get(orientation);
+    if(KErrNone != err)
+           {
+           _LIT(KLog,"iThemeServerOrientationProperty.Get(...) failed with err %d");
+           INFO_PRINTF2(KLog,err);
+           TEST(EFalse);
+           }
+    else if(aExpectedOrientation == EDisplayOrientationAuto)
+        {
+        TEST(orientation == iCurrentThemeServerOrientation);
+        CheckHalSetting(iCurrentThemeServerOrientation);
+        }
+    else
+        {
+        TEST(orientation == aExpectedOrientation);
+        CheckHalSetting(static_cast<TRenderOrientation>(orientation));
+        }
+    }
+
+void CTDeviceRotation::CheckHalSetting(TRenderOrientation aOrientation)
+    {
+    HALData::TDigitiserOrientation halOrientationExp = static_cast<HALData::TDigitiserOrientation>
+            (HALData::EDigitiserOrientation_000 + (aOrientation - EDisplayOrientationNormal));
+    TInt halOrientation;
+    TInt err = HAL::Get(iWs.GetFocusScreen(), HALData::EDigitiserOrientation, halOrientation);
+    if (err != KErrNotSupported)
+        {
+        if (err != KErrNone)
+            {
+            _LIT(KLog,"Getting HAL orientation attribute returned error %d when no error expected");
+            INFO_PRINTF2(KLog,err);
+            }
+        TEST(err==KErrNone);
+        if (halOrientationExp != halOrientation)
+            {
+            _LIT(KLog,"HAL orientation is %d when expected to be %d");
+            INFO_PRINTF3(KLog, halOrientation, halOrientationExp);
+            }
+        TEST(halOrientationExp==halOrientation);
+        }
+    else
+        {
+        _LIT(KLog,"HAL-Orientation HALData::EDigitiserOrientation isn't supported by Driver");
+        INFO_PRINTF1(KLog);
+        }
+    }
+
+void CTDeviceRotation::TestIndicateAppOrientation(TRenderOrientation aOrientation)
+	{
+    _LIT(KTestInfo, "TestIndicateAppOrientation(aOrientation = %d)");
+    INFO_PRINTF2(KTestInfo, aOrientation);
+	if (EDisplayOrientationIgnore == aOrientation)
+	    {
+        TEST(EFalse);
+        _LIT(KLog, "TestIndicateAppOrientation(TRenderOrientation aOrientation) cannot be used with EDisplayOrientationIgnore");
+        INFO_PRINTF1(KLog);
+	    }
+	iWs.IndicateAppOrientation(aOrientation);
+	iWindowGroup.SetOrdinalPosition(0);
+	IsOrientationCorrect(aOrientation);
+	}
+
+void CTDeviceRotation::TestIndicateAppOrientation(TRenderOrientation aOrientation, TRenderOrientation aSecondOrientation)
+    {
+    _LIT(KTestInfo, "TestIndicateAppOrientation(aOrientation = %d, aSecondOrientation = %d)");
+    INFO_PRINTF3(KTestInfo, aOrientation, aSecondOrientation);
+    //Inform window serve the orientation status
+    iWs.IndicateAppOrientation(aOrientation);
+    iSecondWs.IndicateAppOrientation(aSecondOrientation);
+    
+    iWindowGroup.SetOrdinalPosition(0,1);
+    iSecondWindowGroup.SetOrdinalPosition(1,1);
+
+    if(aOrientation != EDisplayOrientationIgnore)
+        {
+        IsOrientationCorrect(aOrientation);
+        }
+    else
+        {
+        IsOrientationCorrect(aSecondOrientation);
+        }
+    }
+
+void CTDeviceRotation::TestAppOrientationOnSwap(TRenderOrientation aOrientation, TRenderOrientation aSecondOrientation)
+    {    
+    _LIT(KTestInfo, "TestAppOrientationOnSwap(aOrientation = %d, aSecondOrientation = %d)");
+    INFO_PRINTF3(KTestInfo, aOrientation, aSecondOrientation);
+    
+    iWs.IndicateAppOrientation(aOrientation);
+    iSecondWs.IndicateAppOrientation(aSecondOrientation);
+    
+    iSecondWindowGroup.SetOrdinalPosition(0);
+    if (aSecondOrientation != EDisplayOrientationIgnore)
+        {
+        IsOrientationCorrect(aSecondOrientation);
+        }
+    else
+        {
+        IsOrientationCorrect(aOrientation);
+        }
+    }
+
+void CTDeviceRotation::RunTestCaseL(TInt aCurTestCase)
+	{
+    _LIT(KNewLine, "\n");
+    (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+	    case 1:
+            _LIT(KTestStepID1,"Test Initial Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID1);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID1);
+            TestInitialOrientation();
+            break;
+		case 2:
+    	    _LIT(KTestStepID2,"Test Fixed Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID2);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID2);
+            TestFixedOrientations();
+			break;
+		case 3:
+    	    _LIT(KTestStepID3,"Test Auto Orientation");
+		    (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID3);
+		    INFO_PRINTF1(KNewLine);
+		    INFO_PRINTF1(KTestStepID3);
+		    TestAutoOrientation();
+			break;
+		case 4:
+            _LIT(KTestStepID4,"Test Ignore Orientation");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID4);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID4);
+            TestIgnoreOrientation();
+			break;
+        case 5:
+            _LIT(KTestStepID5,"Test Swap Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID5);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID5);
+            TestFixedOrientationsOnWindowSwap();
+			break;
+        case 6:
+            _LIT(KTestStepID6,"Test Auto Swap Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID6);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID6);
+            TestAutoOrientationOnWindowSwap();
+            break;
+        case 7:
+            _LIT(KTestStepID7,"Test Ignore Swap Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID7);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID7);
+            TestIgnoreOrientationOnWindowSwap();
+			break;
+        case 8:
+            _LIT(KTestStepID8,"Test Auto Swap Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID8);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID8);
+            TestIgnoreAutoOrientationOnWindowSwap();
+            break;
+        case 9:
+            _LIT(KTestStepID9,"Test Invalid App Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID9);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID9);
+            TestInvalidAppOrientation();
+            break;
+        case 10:
+            _LIT(KTestStepID10,"Test Invalid Theme Server Orientations");
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KTestStepID10);
+            INFO_PRINTF1(KNewLine);
+            INFO_PRINTF1(KTestStepID10);
+            TestInvalidThemeServerOrientation();
+            break;
+		default:
+            (reinterpret_cast<CTDeviceRotationStep*>(iStep))->SetTestStepID(KNotATestSYMTestCaseIDName);
+			(reinterpret_cast<CTDeviceRotationStep*>(iStep))->CloseTMSGraphicsStep();
+			TestComplete();
+		}
+	(reinterpret_cast<CTDeviceRotationStep*>(iStep))->RecordTestResultL();
+	}
+
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0001
+ @SYMTestCaseDesc           Test Auto Orientation
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we can return the correct initial orientation value from 
+                            the windwoserver.
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            We have set up an RWindowGroup at the foreground and not altered its
+                            indicated orientation.
+ @SYMTestActions            1) Get the value of the orientation as published by window server.
+
+ @SYMTestExpectedResults    The windowserver should return EDisplayOrientationNormal
+ */
+void CTDeviceRotation::TestInitialOrientation()
+    {
+    iWaitForPublishOnNextTest = EFalse;
+    IsOrientationCorrect(EDisplayOrientationNormal);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0002
+ @SYMTestCaseDesc           Test Fixed Orientations
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we can return the correct orientation value from 
+                            the windwoserver after we indicate the application orientation
+                            as fixed values using RWsSession::IndicateAppOrientation. Any 
+                            theme server orientations should be ignored.
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes. 
+                            We have set up an RWindowGroup in the foreground.
+                            Windowserver orientation currently set to EDisplayOrientationNormal.
+
+ @SYMTestActions            1) Set Theme Server orientation to EDisplayOrientation90CW.
+                            2) Set the RWindowgroup in ordinal position 0 to a fixed orientation.
+                            3) Check the published orinetation value in windowserver.
+                            4) Repeat steps 2) and 3) for all fixed orientations
+                            3) Set Theme Server orientation to EDisplayOrientationNormal.
+                            4) Repeat Steps 2-4).
+
+ @SYMTestExpectedResults    The orientation set in step 2) should always be the same as the 
+                            orientation set in step 2)
+ */
+void CTDeviceRotation::TestFixedOrientations()
+    {
+    iWaitForPublishOnNextTest = EFalse;
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation180);
+    TestIndicateAppOrientation(EDisplayOrientation270CW);
+    
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation180);
+    TestIndicateAppOrientation(EDisplayOrientation270CW);
+    
+    SimulateThemeServerOrientation(EDisplayOrientation180);
+    TestIndicateAppOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation180);
+    TestIndicateAppOrientation(EDisplayOrientation270CW);
+    
+    SimulateThemeServerOrientation(EDisplayOrientation270CW);
+    TestIndicateAppOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation180);
+    TestIndicateAppOrientation(EDisplayOrientation270CW);    
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0003
+ @SYMTestCaseDesc           Test Auto Orientation
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we can return the correct orientation value from 
+                            the windwoserver after we indicate the application orientation
+                            as auto values using RWsSession::IndicateAppOrientation. The wserv
+                            should publish the theme server orientation changes only.
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up an RWindowGroup in the foreground.
+                            WindowServer orinetation is not set to EDisplayOrientation90CW.
+
+ @SYMTestActions            1) Set Theme Server orientation to EDisplayOrientation90CW.
+                            2) Set the RWindowgroup in ordinal position 0 to auto orientation.
+                            3) Check the published orinetation value in windowserver.
+                            4) Set Theme Server orientation to EDisplayOrientationNormal.
+                            5) Check the value of the orientation as published by window server.
+                            6) Repeat 4) and 5) for EDisplayOrientation180 and 
+                               EDisplayOrientation270CW
+                            7) repeat 4) and 5) again for EDisplayOrientation270CW
+
+ @SYMTestExpectedResults    We should get expected notifications where orientations have changed.
+                            The orientation checked in step 3) should be the theme server 
+                            orientation set in step 1).
+                            The orientations checked in step 5) should be the theme server 
+                            orientations set in step 4).
+                            We should recieve no notification for step 7).
+ */
+void CTDeviceRotation::TestAutoOrientation()
+    {
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientationAuto);
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    // Now flip it upside down to ensure that nothing assumes this will only be updated incrementally
+    SimulateThemeServerOrientation(EDisplayOrientation180);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    SimulateThemeServerOrientation(EDisplayOrientation270CW);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    
+    // And check that wserv doesn't publish if the theme server publishes the existing orientation
+    SimulateThemeServerOrientation(EDisplayOrientation270CW);
+    iWaitForPublishOnNextTest = EFalse;    
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0004
+ @SYMTestCaseDesc           Test Ignore Orientation
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we can return the correct orientation value from 
+                            the windwoserver after we indicate the front applications 
+                            orientation as ignore.  
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up two RWindowGroups in the ordinal positions 0 and 1. 
+                            WindowServer orinetation is not set to EDisplayOrientationNormal.
+
+ @SYMTestActions            1) Set Theme Server orientation to EDisplayOrientation90CW.
+                            2) Set the RWindowGroup in ordinal position 0 to a ignore orientation.
+                            3) Set the RWindowgroup in ordinal position 1 to a fixed orientation.
+                            4) Check the published orinetation value in windowserver.
+                            5) Repeat steps 2-4) varying the fixed orientation set in step 2).
+                            6) Set Theme Server orientation to EDisplayOrientation90CW.
+                            7) Set the RWindowGroup in ordinal position 0 to a ignore orientation.
+                            8) Set the RWindowgroup in ordinal position 1 to a fixed orientation.
+                            9) Check the published orinetation value in windowserver.
+                            10) Set Theme Server orientation to EDisplayOrientationNormal.
+                            11) Check the published orinetation value in windowserver.
+
+ @SYMTestExpectedResults    We should get expected notifications where orientations have changed.
+                            All orientations checked in step 4) should be the fixed orientations 
+                            of the windows in ordinal position 1, as set in step 3).
+                            The orientation checked in step 9) should be the theme server 
+                            orientation set in step 6).
+                            The orientation checked in step 11) should be the theme server 
+                            orientation set in step 10).
+ */
+void CTDeviceRotation::TestIgnoreOrientation()
+    {
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientation180);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientation270CW);
+    
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientationAuto);
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0005
+ @SYMTestCaseDesc           Test Fixed Orientations On Swap
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we get notifactation of a change in orientation and can 
+                            return the correct orientation value from the windwoserver after we 
+                            swap windows with varying fixed orienations.  
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            We have set up two RWindowGroups in the ordinal positions 0 and 1. 
+
+ @SYMTestActions            1) Set the RWindowGroup in ordinal position 0 to a fixed orientation.
+                            2) Set the RWindowgroup in ordinal position 1 to a fixed orientation.
+                            3) Check the published orinetation value in windowserver.
+                            4) Move the RWindowGroup ordinal position 1 to the ordinal position 0.
+                            5) Check the published orinetation value in windowserver.
+                            6) Repeat steps 1-5 but vary the values the fixed orientation of the 
+                               RWindows set in steps 1) and 2)
+
+ @SYMTestExpectedResults    We should get expected notifications where orientations have changed.
+                            All orientations checked in step 3) should be the fixed orientations 
+                            of the windows in ordinal position 0, as set in step 1).
+                            The orientations checked in step 5) should be the fixed orientations 
+                            of the windows which was in ordinal position 1 before each swap, as 
+                            set in step 2).
+ */
+void CTDeviceRotation::TestFixedOrientationsOnWindowSwap()
+    {
+    iWaitForPublishOnNextTest = EFalse;
+    TestIndicateAppOrientation(EDisplayOrientationNormal, EDisplayOrientationNormal);
+    iWaitForPublishOnNextTest = EFalse;
+    TestAppOrientationOnSwap(EDisplayOrientationNormal, EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationNormal, EDisplayOrientation90CW);
+    TestAppOrientationOnSwap(EDisplayOrientationNormal, EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation90CW, EDisplayOrientationNormal);
+    TestAppOrientationOnSwap(EDisplayOrientation90CW, EDisplayOrientationNormal);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0006
+ @SYMTestCaseDesc           Test Auto Orientations On Swap
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we get notifactation of a change in orientation and can 
+                            return the correct orientation value from the windwoserver after we 
+                            swap windows with auto orienations.  
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up two RWindowGroups in the ordinal positions 0 and 1.
+                            WindowServer orinetation is not set to EDisplayOrientation270CW. 
+
+ @SYMTestActions            1) Set the theme server orientation.
+                            2) Set the RWindowGroup in ordinal position 0 to a fixed orientation.
+                            3) Set the RWindowGroup in ordinal position 1 to auto orientation.
+                            4) Check the published orinetation value in windowserver.
+                            5) Move the RWindowGroup ordinal position 1 to the ordinal position 0. 
+                            6) Check the published orinetation value in windowserver.
+                            7) Repeat steps 1-6 but vary the values of the theme server 
+                               orientation in step 1) and the fixed orientation of the frontwindow
+                               in 2)
+ @SYMTestExpectedResults    We should get expected notifications where orientations have changed.
+                            All orientations checked in step 4) should be the fixed orientations 
+                            of the front windows, which have been set in step 2).
+                            All orientations checked in step 6) should be the theme server 
+                            orientations set in step 1)
+ */
+void CTDeviceRotation::TestAutoOrientationOnWindowSwap()
+    {
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation270CW, EDisplayOrientationAuto);
+    TestAppOrientationOnSwap(EDisplayOrientation270CW, EDisplayOrientationAuto);
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationAuto, EDisplayOrientation180);
+    TestAppOrientationOnSwap(EDisplayOrientationAuto, EDisplayOrientation180);
+    
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation90CW, EDisplayOrientationAuto);
+    iWaitForPublishOnNextTest = EFalse;
+    TestAppOrientationOnSwap(EDisplayOrientation90CW, EDisplayOrientationAuto);
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationAuto, EDisplayOrientationNormal);
+    iWaitForPublishOnNextTest = EFalse;
+    TestAppOrientationOnSwap(EDisplayOrientationAuto, EDisplayOrientationNormal);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0007
+ @SYMTestCaseDesc           Test Swap Orientations with Ignore Orientation
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we get notifactation of a change in orientation and can 
+                            return the correct orientation value from the windwoserver after we 
+                            swap windows with ignore orienations.  
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up two RWindowGroups in the ordinal positions 0 and 1. 
+
+ @SYMTestActions            1) Set the theme server orientation.
+                            2) Set the RWindowGroup in ordinal position 0 to ignore orientation.
+                            3) Set the RWindowGroup in ordinal position 1 to a fixed orientation.
+                            4) Check the published orinetation value in windowserver.
+                            5) Move the RWindowGroup ordinal position 1 to the ordinal position 0. 
+                            6) Check the published orinetation value in windowserver.
+                            7) Repeat steps 1-6 but vary the values of the theme server 
+                               orientation in step 1) and the fixed orientation of the frontwindow
+                               in 3)
+                            8) Set the theme server orientation.
+                            9) Set the RWindowGroup in ordinal position 0 to a fixedorientation.
+                            10) Set the RWindowGroup in ordinal position 1 to ignore orienation.
+                            11) Repeat steps 4-6) 
+                            12) Repeat steps 8-11) but vary the values of the theme server 
+                               orientation in step 8) and the fixed orientation of the 
+                               RwindowGroup in 9)                            
+                               
+ @SYMTestExpectedResults    We should get expected notifications where orientations have changed.
+                            All orientations checked in step 4) and 6) should be the fixed 
+                            orientations RWindowGroups which have been set in step 3).
+                            All orientations checked in step 11) should be the fixed orientations 
+                            of the front RWindowGroups which have been set in step 9).
+*/
+void CTDeviceRotation::TestIgnoreOrientationOnWindowSwap()
+    {
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientation270CW);
+    TestAppOrientationOnSwap(EDisplayOrientationIgnore, EDisplayOrientation180);
+    
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationIgnore, EDisplayOrientationNormal);
+    TestAppOrientationOnSwap(EDisplayOrientationIgnore, EDisplayOrientation90CW);
+    
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    TestIndicateAppOrientation(EDisplayOrientation270CW, EDisplayOrientationIgnore);
+    TestAppOrientationOnSwap(EDisplayOrientation180, EDisplayOrientationIgnore);    
+    
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationNormal, EDisplayOrientationIgnore);
+    TestAppOrientationOnSwap(EDisplayOrientation90CW, EDisplayOrientationIgnore);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0008
+ @SYMTestCaseDesc           Test Swap Orientations with Auto and Ignore Orientations
+ @SYMPREQ                   460936 Tracking Device Rotation
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that we get notifactation of a change in orientation and can 
+                            return the correct orientation value from the windwoserver after we 
+                            swap windows with auto and ignore orienations.  
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up two RWindowGroups in the ordinal positions 0 and 1. 
+ @SYMTestActions            1) Set the theme server orientation to EDisplayOrientationNormal.
+                            2) Set the RWindowGroup in ordinal position 0 to auto orientation.
+                            3) Set the RWindowGroup in ordinal position 1 to ignore orientation.
+                            4) Check the published orinetation value in windowserver.
+                            5) Set the theme server orientation to EDisplayOrientation90CW.
+                            6) Check the published orinetation value in windowserver.
+                            7) Set the theme server orientation to EDisplayOrientationNormal.
+                            8) Move the RWindowGroup in ordinal position 1 to ordinal position 0.
+                            9) Check the published orinetation value in windowserver.
+                            10) Set the theme server orientation to EDisplayOrientation90CW.
+                            11) Check the published orinetation value in windowserver.
+
+ @SYMTestExpectedResults    We should get expected notifications where orientations have changed.
+                            The orientations checked in step 4), 6), 9) and  11) should all be 
+                            the orientations set to the themeserver in steps 1), 5), 8) and 10)
+                            respecvtively. 
+*/
+void CTDeviceRotation::TestIgnoreAutoOrientationOnWindowSwap()
+    {
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    TestIndicateAppOrientation(EDisplayOrientationAuto, EDisplayOrientationIgnore);
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    
+    SimulateThemeServerOrientation(EDisplayOrientationNormal);
+    iSecondWindowGroup.SetOrdinalPosition(0);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    SimulateThemeServerOrientation(EDisplayOrientation90CW);
+    IsOrientationCorrect(iCurrentThemeServerOrientation);
+    }
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0009
+ @SYMTestCaseDesc           Test Invalid App Orientation
+ @SYMPREQ                   ###TrackingDeviceRotation### TODO replace me
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that an invalid orientation is ignored.
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up an RWindowGroup in ordinal position 0.
+ @SYMTestActions            1) Set the theme server orientation to EDisplayOrientationNormal.
+                            2) Set the RWindowGroup in ordinal position 0 to 
+                               EDisplayOrientation90CW.
+                            4) Check the published orinetation value in windowserver.
+                            5) Set the RWindowGroup in ordinal position 0 to an invalid 
+                               orientation.
+                            6) Check the published orinetation value in windowserver.
+
+ @SYMTestExpectedResults    Wserv should publish an orientation change for 2) but not for 5).
+                            The orientations checked in steps 4) and 6) should both be the 
+                            orientation set in step 2).
+*/
+void CTDeviceRotation::TestInvalidAppOrientation()
+	{
+	SimulateThemeServerOrientation(EDisplayOrientationNormal);
+	TestIndicateAppOrientation(EDisplayOrientation90CW);
+	iWs.IndicateAppOrientation(static_cast<TRenderOrientation>(1000));
+	iWaitForPublishOnNextTest = EFalse;
+	IsOrientationCorrect(EDisplayOrientation90CW);
+	}
+
+/**
+ @SYMTestCaseID             GRAPHICS-WSERV-DEVICEROTATION-0010
+ @SYMTestCaseDesc           Test Invalid Theme Server Orientation
+ @SYMPREQ                   ###TrackingDeviceRotation### TODO replace me
+ @SYMTestPriority           1
+ @SYMTestPurpose            To test that an invalid theme server orientation is ignored when
+                            the app orientation has been set to auto.
+ @SYMPrerequisites          An RProperty is set up to subscribe to notifications of 
+                            windowserver orientation changes.
+                            An RProperty is set up to publish Theme server Orientation changes.
+                            We have set up an RWindowGroup in ordinal position 0.
+ @SYMTestActions            1) Set the theme server orientation to EDisplayOrientationNormal.
+                            2) Set the RWindowGroup in ordinal position 0 to 
+                               EDisplayOrientationAuto.
+                            4) Check the published orinetation value in windowserver.
+                            5) Set the theme server orientation to an invalid orientation.
+                            6) Check the published orinetation value in windowserver.
+
+ @SYMTestExpectedResults    Wserv should publish an orientation change for 2) but not for 5).
+                            The orientations checked in steps 4) and 6) should both be the 
+                            theme server orientation set in step 1).
+*/
+void CTDeviceRotation::TestInvalidThemeServerOrientation()
+	{
+	SimulateThemeServerOrientation(EDisplayOrientationNormal);
+	TestIndicateAppOrientation(EDisplayOrientationAuto);
+	SimulateThemeServerOrientation(static_cast<TRenderOrientation>(5000));
+	iWaitForPublishOnNextTest = EFalse;
+	IsOrientationCorrect(EDisplayOrientationNormal);
+	}
+
+__CONSTRUCT_STEP__(DeviceRotation)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/tdevicerotation.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,110 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Set of tests for Tracing Device Rotation. These tests generally test
+// the RWsSession::IndicateAppOrientation(...) API.
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Nokia test code
+*/
+
+#ifndef __TDEVICERORATION_H__
+#define __TDEVICERORATION_H__
+
+#include <e32std.h>
+#include <w32std.h>
+#include <e32property.h>
+#include <test/testexecutestepbase.h>
+#include "../tlib/testbase.h"
+#include "AUTO.H"
+#include "TGraphicsHarness.h"
+#include <wspublishandsubscribedata.h>
+
+//
+// CTDeviceRotation Definition
+//
+
+class CTDeviceRotation: public CTGraphicsBase
+	{
+public:
+    CTDeviceRotation(CTestStep* aStep);
+	~CTDeviceRotation();
+	/*Sets the windowing environment,*/
+	void ConstructL();
+
+protected:
+	//from 	CTGraphicsStep - Calls the device rotation test.
+	virtual void RunTestCaseL(TInt aCurTestCase);
+private: 
+	//tool functions
+	void SimulateThemeServerOrientation(TRenderOrientation aExpectedaOrientation);
+	void CheckHalSetting(TRenderOrientation aOrientation);
+	void IsOrientationCorrect(TRenderOrientation aOrientation);
+	void TestIndicateAppOrientation(TRenderOrientation aOrientation);
+	void TestIndicateAppOrientation(TRenderOrientation aOrientation, TRenderOrientation aSecondOrientation);
+	void TestIgnoredAppOrientation(TRenderOrientation aSecondOrientation, TInt aThemeServerOrientation, TInt aExpectedOrientation);
+	void TestAppOrientationOnSwap(TRenderOrientation aOrientation, TRenderOrientation aSecondOrientation);
+	//For TESTL
+	inline void testBooleanTrueL(TBool aCondition, const TText8* aFile, TInt aLine) 
+	    {
+	    iStep->testBooleanTrueL(aCondition, aFile, aLine, ETrue);
+	    }
+private:
+	//Test Cases
+	void TestInitialOrientation();
+	void TestFixedOrientations();
+	void TestAutoOrientation();
+	void TestIgnoreOrientation();
+	void TestFixedOrientationsOnWindowSwap();
+	void TestAutoOrientationOnWindowSwap();
+	void TestIgnoreOrientationOnWindowSwap();
+	void TestIgnoreAutoOrientationOnWindowSwap();
+	void TestInvalidAppOrientation();
+	void TestInvalidThemeServerOrientation();
+	
+private:
+	//members
+	// First Session and Window Group
+	RWsSession iWs;
+	RWindowGroup iWindowGroup;
+    RWindow iChildWindow;
+    // Second Session and Window Group
+	RWsSession iSecondWs;
+	RWindowGroup iSecondWindowGroup;
+	RWindow iSecondChildWindow;
+		
+	RProperty iRenderOrientationProperty;
+	RTimer iPublishTimer;
+	TRequestStatus iPublishTimerStatus;
+	TRequestStatus iRenderOrientationStatus;
+	RProperty iThemeServerOrientationProperty;
+
+	TRenderOrientation iCurrentThemeServerOrientation;
+	TBool iWaitForPublishOnNextTest; //Set to EFalse to skip waiting for publish on next test, default ETrue, Resets to ETrue on each Test.
+	};
+
+class CTDeviceRotationStep : public CTGraphicsStep
+	{
+public:
+	CTDeviceRotationStep();
+protected:
+	//from CTGraphicsStep
+	virtual CTGraphicsBase* CreateTestL();
+	};
+
+_LIT(KTDeviceRotationStep,"TDeviceRotation");
+
+#endif //TDEVICERORATION
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/tevent_captureapp.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,67 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Helper application for TEvent test case GRAPHICS-WSERV-0757
+//
+
+#include <e32base.h>
+#include <e32debug.h>
+#include <w32std.h>
+
+const TInt KCapturePriority = 2;
+
+LOCAL_C void MainL()
+	{
+	RWsSession session;
+	User::LeaveIfError(session.Connect());
+	CleanupClosePushL(session);
+	RWindowGroup group(session);
+	User::LeaveIfError(group.Construct(0));
+
+	// Capture keys EKeyF22 and EKeyF23 with raised
+	// priority for each of the three capture types.
+	TInt handle1 = User::LeaveIfError(group.CaptureKey(EKeyF22, 0, 0, KCapturePriority));
+	TInt handle2 = User::LeaveIfError(group.CaptureKeyUpAndDowns(EStdKeyF22, 0, 0, KCapturePriority));
+	TInt handle3 = User::LeaveIfError(group.CaptureLongKey(EKeyF22, EKeyF22, 0, 0, KCapturePriority, ELongCaptureNormal));
+	TInt handle4 = User::LeaveIfError(group.CaptureKey(EKeyF23, 0, 0, KCapturePriority));
+	TInt handle5 = User::LeaveIfError(group.CaptureKeyUpAndDowns(EStdKeyF23, 0, 0, KCapturePriority));
+	TInt handle6 = User::LeaveIfError(group.CaptureLongKey(EKeyF23, EKeyF23, 0, 0, KCapturePriority, ELongCaptureNormal));
+
+	// Complete rendezvous with TEvent. This signals that all the capture
+	// requests have been made.
+	RProcess::Rendezvous(KErrNone);
+
+	// Wait until killed by TEvent
+	User::WaitForAnyRequest();
+
+	group.CancelCaptureKey(handle1);
+	group.CancelCaptureKeyUpAndDowns(handle2);
+	group.CancelCaptureLongKey(handle3);
+	group.CancelCaptureKey(handle4);
+	group.CancelCaptureKeyUpAndDowns(handle5);
+	group.CancelCaptureLongKey(handle6);
+
+	CleanupStack::PopAndDestroy(&session);
+	}
+
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+
+	CTrapCleanup* cleanupStack = CTrapCleanup::New(); 	
+	TRAPD(ret, MainL());	
+	delete cleanupStack;
+	
+	__UHEAP_MARKEND;
+	return ret;
+	}
--- a/windowing/windowserver/test/tauto/tgc.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tauto/tgc.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -1290,7 +1290,11 @@
 	 * that we use matching color depths for our off-screen bitmaps so that accuracy is
 	 * not lost since we compare bitmaps from the screen versus off-screen.
 	 */
-	const TDisplayMode displayMode = device->DisplayMode();
+	TDisplayMode displayMode = device->DisplayMode();
+	if (TDisplayModeUtils::NumDisplayModeBitsPerPixel(displayMode) == 32)
+	    {
+	    displayMode = EColor16MAP;
+	    }
 		
 	_LIT(KText,"RemoteGc & MWsGraphicsContext");
 	TFontSpec fSpec(KTestFontTypefaceName,23);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/themeserverpropertydefine.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,88 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This Process called with the argument KThemeServerPropertyDefineCmdDefine, defines
+// the theme server RProperty catagory to be the same as the theme servers process ID. 
+// Called with the argument KThemeServerPropertyDefineCmdDelete, it will delete the 
+// theme server RProperty. This is because an RProperty can only be defined and deleted 
+// from within a process with the same UID3 as the RProperty catogory you are trying to 
+// define/delete.
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Nokia test code
+ */
+
+#include <BACLINE.H> 
+#include <e32base.h>
+#include <e32property.h>
+#include "..\..\nga\server\renderorientationtracker.h" //for KThemeOrientationCatagory and KThemeOrientationKey
+#include "themeserverpropertydefine.h"
+
+void DefineThemeServerPropertyL()
+    {
+    RProperty themeServerOrientationProperty;
+    const TSecurityPolicy KThemeOrientationReadSecurityPolicy(
+            TSecurityPolicy::EAlwaysPass);
+    const TSecurityPolicy KThemeOrientationWriteSecurityPolicy(
+            TSecurityPolicy::EAlwaysPass);
+    User::LeaveIfError(RProperty::Define(   KThemeOrientationCategory,
+                                            KThemeOrientationKey, 
+                                            RProperty::EInt,
+                                            KThemeOrientationReadSecurityPolicy,
+                                            KThemeOrientationWriteSecurityPolicy));
+    themeServerOrientationProperty.Close();
+    }
+
+void DeleteThemeServerPropertyL()
+    {
+    TInt err = KErrNone;
+    RProperty themeServerOrientationProperty;
+    User::LeaveIfError(themeServerOrientationProperty.Delete(
+            KThemeOrientationCategory, KThemeOrientationKey));
+    themeServerOrientationProperty.Close();
+    }
+
+void MainL()
+    {
+    CCommandLineArguments* args = CCommandLineArguments::NewLC();
+    TPtrC argumentPrt(args->Arg(1));
+    if (argumentPrt == KThemeServerPropertyDefineCmdDefine)
+        {
+        DefineThemeServerPropertyL();
+        }
+    else if (argumentPrt == KThemeServerPropertyDefineCmdDelete)
+        {
+        DeleteThemeServerPropertyL();
+        }
+    else
+        {
+        User::Leave(KErrNotSupported);
+        }
+    CleanupStack::PopAndDestroy(args);
+    }
+
+GLDEF_C TInt E32Main()
+    {
+    CTrapCleanup* cleanUpStack = CTrapCleanup::New();
+    if (cleanUpStack == NULL)
+        {
+        return KErrNoMemory;
+        }
+    TRAPD(err, MainL());
+    delete cleanUpStack;
+    return (err);
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/themeserverpropertydefine.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,29 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Header Defines the EXE name as well as the two possible command line 
+// arguments for twsthemeserverdefine.exe
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Nokia test code
+ */
+#ifndef THEMESERVERSIMULATION_H_
+#define THEMESERVERSIMULATION_H_
+
+_LIT(KThemeServerPropertyDefine, "twsthemeserverpropertydefine.exe");
+_LIT(KThemeServerPropertyDefineCmdDefine, "define");
+_LIT(KThemeServerPropertyDefineCmdDelete, "delete");
+
+#endif /* THEMESERVERSIMULATION_H_ */
--- a/windowing/windowserver/test/tcsc/wscsc.script	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tcsc/wscsc.script	Wed Aug 18 11:05:09 2010 +0300
@@ -22,10 +22,15 @@
 ////////////////
 // CSC NGA tests
 ////////////////
-RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_101L
-RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_102L
+
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_101L
+//RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_102L
+
 RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_103L
 // Negative test cases
 RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_104L
 // Defect test cases
-RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_105L
+
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 500 wsgcecscserver TEFUnit.CWSGceCsc.GRAPHICS_WSERV_CSC_105L
--- a/windowing/windowserver/test/tdynamicres/group/bld.inf	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -33,6 +33,7 @@
 ../scripts/wsdynamicresbasic_isotropic_scaling.script	z:/wstest/dynamicres/wsdynamicresbasic_isotropic_scaling.script
 ../scripts/wsdynamicresbasic_anisotropic_scaling.script	z:/wstest/dynamicres/wsdynamicresbasic_anisotropic_scaling.script
 ../scripts/wsdynamicresbasic_openvg_isotropic.script	z:/wstest/dynamicres/wsdynamicresbasic_openvg_isotropic.script
+../scripts/wsdynamicresbasic_sirocco.script	z:/wstest/dynamicres/wsdynamicresbasic_sirocco.script
 #endif // SYMBIAN_BUILD_GCE
 wstestdynamicres.iby	/epoc32/rom/include/wstestdynamicres.iby
 ../scripts/wsdynamicresclassic.script	z:/wstest/dynamicres/wsdynamicresclassic.script
--- a/windowing/windowserver/test/tdynamicres/group/wstestdynamicres.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/group/wstestdynamicres.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -39,6 +39,7 @@
 data=DATAZ_\wstest\dynamicres\wsdynamicresbasic_isotropic_scaling.script	wstest\dynamicres\wsdynamicresbasic_isotropic_scaling.script
 data=DATAZ_\wstest\dynamicres\wsdynamicresbasic_no_scaling.script	wstest\dynamicres\wsdynamicresbasic_no_scaling.script
 data=DATAZ_\wstest\dynamicres\wsdynamicresbasic_openvg_isotropic.script	wstest\dynamicres\wsdynamicresbasic_openvg_isotropic.script
+data=DATAZ_\wstest\dynamicres\wsdynamicresbasic_sirocco.script	wstest\dynamicres\wsdynamicresbasic_sirocco.script
 #endif
 
 #endif
--- a/windowing/windowserver/test/tdynamicres/group/wstestdynamicres_helium.pkg	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/group/wstestdynamicres_helium.pkg	Wed Aug 18 11:05:09 2010 +0300
@@ -36,11 +36,5 @@
 ;REM Window Server Dynamic Resolution Test Scripts [no plugins]
 
 ;//Please execute only the tests appropriate to your hardware capabilities.
-"\epoc32\data\z\wstest\dynamicres\wsdynamicresclassic.script"-"c:\wstest\dynamicres\wsdynamicresclassic.script"
+"\epoc32\data\z\wstest\dynamicres\wsdynamicresbasic_sirocco.script"-"c:\wstest\dynamicres\wsdynamicresbasic_sirocco.script"
 
-"\epoc32\data\z\wstest\dynamicres\wsdynamicresbasic_anisotropic_scaling.script"-"c:\wstest\dynamicres\wsdynamicresbasic_anisotropic_scaling.script"
-"\epoc32\data\z\wstest\dynamicres\wsdynamicresbasic_integer_scaling.script"-"c:\wstest\dynamicres\wsdynamicresbasic_integer_scaling.script"
-"\epoc32\data\z\wstest\dynamicres\wsdynamicresbasic_isotropic_scaling.script"-"c:\wstest\dynamicres\wsdynamicresbasic_isotropic_scaling.script"
-"\epoc32\data\z\wstest\dynamicres\wsdynamicresbasic_no_scaling.script"-"c:\wstest\dynamicres\wsdynamicresbasic_no_scaling.script"
-"\epoc32\data\z\wstest\dynamicres\wsdynamicresbasic_openvg_isotropic.script"-"c:\wstest\dynamicres\wsdynamicresbasic_openvg_isotropic.script"
-
--- a/windowing/windowserver/test/tdynamicres/inc/wsdynamicresbase.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/inc/wsdynamicresbase.h	Wed Aug 18 11:05:09 2010 +0300
@@ -81,12 +81,7 @@
 	void CommonOverlayWindowSetupL(RWindow& aWindow, const TRgb& aColor);
 	void ResizeTestCommonSetupL(RWindow& aWindow, const TRgb& aColor);
 
-	void MakeTestWindowPairL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor);
 	void LargerTestWindow(TInt aPercentOfBack=80);
-	void DestroyTestWindowPair(TBool aKillTestBack=ETrue,TBool aKillTestFront=ETrue,TBool aKillTestChildren=ETrue);
-	void MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor);
-	void CreateTestWindowQuadL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor);
-	void MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor);
 	void MakeExtraChildWindowL(const RWindowBase& aFromParent,TRect aChildRect,TRgb aChildColor);
 	struct LoopingGcPtr;
 	LoopingGcPtr	LoopBeginActivateWithWipe(const TRegion& aRegion,RWindow& aWin,TRgb aColor);
@@ -121,7 +116,7 @@
 		void				CreateSharedUtilityL()const ;
 		};
 	static const TPostTestCleanup& PostTestCleanupInstance();
-	RWindow	iTestBack;
+	RBlankWindow	iTestBack;
 	RWindow	iTestFront;
 	RWindow	iTestChild;
 	RWindow	iTestSecondChild;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tdynamicres/scripts/wsdynamicresbasic_sirocco.script	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,61 @@
+//
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: 
+//
+
+LOAD_SUITE wsdynamicrestestserver 
+
+RUN_TEST_STEP 100 wsdynamicrestestserver TEFUnit.CGlobalSettings.SetScreenNoL.0
+
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0001L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0002L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0003L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0004L
+// skipped for Sirocco builds
+// RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0005L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0006L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0007L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0008L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0009L
+//0010 skipped
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0011L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0012L
+// skipped for Sirocco builds
+// RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0013L
+//0014 skipped
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0015L
+//0016 0017 skipped
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0018L
+
+//0021 skipped
+
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0031L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0032L
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0033L
+//0034 skipped
+
+//RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0041L.0
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0042L.0
+//RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0041L.1
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0042L.1
+
+// skipped for Sirocco builds
+// RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0051L
+//0052 0053 skipped
+
+RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0101L
+
+//COMMENTED OUT FOR 10T38 ZERO TOLERANCE TEST STRATEGY
+//RUN_TEST_STEP 200 wsdynamicrestestserver TEFUnit.CWsDynamicResBasic.GRAPHICS_WSERV_DYNAMICRES_0102L
+
--- a/windowing/windowserver/test/tdynamicres/src/t_wsdynamicreswinbase.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/src/t_wsdynamicreswinbase.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -526,7 +526,9 @@
 		for (TInt index=0;index<KMaxInfoLines;index++)
 			{
 			if (iTestInfo[index].Length())
+			    {
 				iInfoGc->DrawText(iTestInfo[index],textRect,textRect.Size().iHeight*3/4,iInfoGc->ECenter);
+			    }
 			textRect.Move(0,rowHeight);
 			}
 		iInfoGc->DiscardFont();
--- a/windowing/windowserver/test/tdynamicres/src/wsdynamicresbase.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/src/wsdynamicresbase.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -144,70 +144,6 @@
 	User::After(TTimeIntervalMicroSeconds32(aMilliseconds * 1000));
 	}
 
-/**	Creates the normal scenario used by these tests.
- *  With a large window behind and small window in front.
- *  If the windows already exist then they are just repositioned and redrawn.
- * 	@param	aOuterRect	Position of back window
- * 	@param	aOuterColor	Background colour for back window
- * 	@param	aInnerRect	Position of front window
- * 	@param	aInnerColor	Background colour for front window
- * 
- **/
-void CWsDynamicResBase::MakeTestWindowPairL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor)
-	{
-	if (!iTestBack.WsHandle())
-		{
-		iTestBack=RWindow(iSession);
-		ASSERT_EQUALS_X(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
-#ifdef  FLICKER
-		iTestBack.Activate();
-#endif
-		iTestBack.SetRequiredDisplayMode(iDisplayMode);
-		iTestBack.SetBackgroundColor(aOuterColor);
-		iTestBack.SetExtent(aOuterRect.iTl,aOuterRect.Size());
-#ifndef FLICKER
-		iTestBack.Activate();
-#endif
-		}
-	else
-		{
-		iTestBack.SetRequiredDisplayMode(iDisplayMode);
-		iTestBack.SetBackgroundColor(aOuterColor);
-		iTestBack.SetExtent(aOuterRect.iTl,aOuterRect.Size());
-		}
-	iTestBack.BeginRedraw();
-	ActivateWithWipe(iGc,iTestBack,aOuterColor);
-	iGc->Deactivate();
-	iTestBack.EndRedraw();
-	iTestBack.SetVisible(ETrue);
-	
-	if (!iTestFront.WsHandle())
-		{
-		iTestFront=RWindow(iSession);
-		ASSERT_EQUALS_X(iTestFront.Construct(iGroup, ++iWindowHandle), KErrNone);
-#ifdef FLICKER
-		iTestFront.Activate();
-#endif
-		iTestFront.SetRequiredDisplayMode(iDisplayMode);
-		iTestFront.SetBackgroundColor(aInnerColor);	
-		iTestFront.SetExtent(aInnerRect.iTl,aInnerRect.Size());
-
-#ifndef FLICKER
-		iTestFront.Activate();
-#endif
-		}
-	else
-		{
-		iTestFront.SetRequiredDisplayMode(iDisplayMode);
-		iTestFront.SetBackgroundColor(aInnerColor);
-		iTestFront.SetExtent(aInnerRect.iTl,aInnerRect.Size());
-		}
-	
-	DrawPlainUI(iTestFront,EFalse,aInnerColor);
-	iTestFront.SetVisible(ETrue);
-	
-	}
-
 void CWsDynamicResBase::LargerTestWindow(TInt aPercentOfBack)
 	{
 	TRect newPos=iTestPos;
@@ -221,72 +157,6 @@
 	
 	}
 
-/** Destroys some or all of the test windows so the test can loop (or test the state after destruction.
- *  The windows are destroyed when the test exits normally.
- * 	Child windows are automatically killed when parent window is killed!
- * 
- **/
-void CWsDynamicResBase::DestroyTestWindowPair(TBool aKillTestBack,TBool aKillTestFront,TBool aKillTestChildren)
-	{
-	if (aKillTestBack && iTestBack.WsHandle())
-		{
-		iTestBack.Close();
-		}
-	if (aKillTestFront && iTestFront.WsHandle())
-		{
-		iTestFront.Close();
-		}
-	if (aKillTestChildren)
-		{
-		if (iTestChild.WsHandle())
-			{
-			iTestChild.Close();
-			}
-		if (iTestSecondChild.WsHandle())
-			{
-			iTestSecondChild.Close();
-			}
-		}
-	}
-/**	Creates a child window inside the front window of the usual test scenario
-*  With a large window behind and small window in front.
- *  If the windows already exist then they are just repositioned and redrawn.
- * 	@param	aOuterRect	Position of back window
- * 	@param	aOuterColor	Background colour for back window
- * 	@param	aInnerRect	Position of front window
- * 	@param	aInnerColor	Background colour for front window
- * 	@param	aChildRect	Position of child window
- * 	@param	aChildColor	Background colour for child window
- * 	@param	aSecondChildRect	Position of Second child window
- * 	@param	aSecondChildColor	Background colour for Second child window
- * 
- **/
-void CWsDynamicResBase::MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor)
-	{
-	MakeTestWindowTripleL(aOuterRect,aOuterColor,aInnerRect,aInnerColor,aChildRect,aChildColor);
-
-	MakeExtraChildWindowL(iTestChild,aSecondChildRect,aSecondChildColor);
-	}
-
-/**	Creates a child window inside the front window of the usual test scenario
-*  With a large window behind and small window in front.
- *  If the windows already exist then they are just repositioned and redrawn.
- * 	@param	aOuterRect	Position of back window
- * 	@param	aOuterColor	Background colour for back window
- * 	@param	aInnerRect	Position of front window
- * 	@param	aInnerColor	Background colour for front window
- * 	@param	aChildRect	Position of child window
- * 	@param	aChildColor	Background colour for child window
- *  @param	aSecondChildRect	Position of second child window
- * 	@param	aSecondChildColor	Background colour for second child window
- * 
- **/
-void CWsDynamicResBase::CreateTestWindowQuadL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor)
-	{
-	MakeTestWindowTripleL(aOuterRect,aOuterColor,aInnerRect,aInnerColor,aChildRect,aChildColor);
-	
-	MakeExtraChildWindowL(iTestFront,aSecondChildRect,aSecondChildColor);
-	}
 
 void CWsDynamicResBase::MakeExtraChildWindowL(const RWindowBase& aFromParent,TRect aChildRect,TRgb aChildColor)
 	{
@@ -347,39 +217,6 @@
 	return CWsDynamicResWinBase::BeginActivateWithWipe(aRegion,aWin,aColor);
 	}
 
-/**	Creates a child window inside the front window of the usual test scenario
-*  With a large window behind and small window in front.
- *  If the windows already exist then they are just repositioned and redrawn.
- * 	@param	aOuterRect	Position of back window
- * 	@param	aOuterColor	Background colour for back window
- * 	@param	aInnerRect	Position of front window
- * 	@param	aInnerColor	Background colour for front window
- * 	@param	aChildRect	Position of child window
- * 	@param	aChildColor	Background colour for child window
- * 
- **/
-void CWsDynamicResBase::MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor)
-	{
-	MakeTestWindowPairL(aOuterRect,aOuterColor,aInnerRect,aInnerColor);
-	ASSERT(iTestFront.WsHandle());
-	
-	if (!iTestChild.WsHandle())
-		{
-		iTestChild=RWindow(iSession);
-		ASSERT_EQUALS_X(iTestChild.Construct(iTestFront, ++iWindowHandle), KErrNone);
-		iTestChild.SetRequiredDisplayMode(iDisplayMode);
-		}
-	iTestChild.SetBackgroundColor(aChildColor);
-	iTestChild.SetExtent(aChildRect.iTl,aChildRect.Size());
-	iTestChild.Activate();
-	iTestChild.BeginRedraw();
-	iGc->Activate(iCompare);
-	iGc->SetBrushColor(iBlue);
-	iGc->Clear();
-	iGc->Deactivate();
-	iTestChild.EndRedraw();
-	iTestChild.SetVisible(ETrue);
-	}
 /**	
  * 	Generates a valid surfaceID for the current display mode.
  * 	This is then used in negative testing.
--- a/windowing/windowserver/test/tdynamicres/src/wsdynamicresbasic.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tdynamicres/src/wsdynamicresbasic.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -509,6 +509,7 @@
 	For each, check if event has been received
 @SYMTestExpectedResults	
 	Based on type of change, check event
+	@note Test uses HAL to simulate display disconnection. Not supported on production platforms.
 */
 void	CWsDynamicResBasic::GRAPHICS_WSERV_DYNAMICRES_0005L()
 	{
@@ -683,16 +684,12 @@
 	TInt error;
 	MakeTitleAndCompareWindowsL(_L("GFX_WSERV_DYNAMICRES_0006L"),_L("Change Resolution"));
 
-	iTestBack=RWindow(iSession);
+	iTestBack=RBlankWindow(iSession);
 	ASSERT_EQUALS(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
 	iTestBack.SetRequiredDisplayMode(iDisplayMode);
-	iTestBack.SetBackgroundColor(TRgb(255,0,0));
+	iTestBack.SetColor(TRgb(255,0,0));
 	iTestBack.SetExtent(iTestPos.iTl,iTestPos.Size());
 	iTestBack.Activate();
-	iTestBack.BeginRedraw();
-	ActivateWithWipe(iGc,iTestBack,TRgb(255,0,0));
-	iGc->Deactivate();
-	iTestBack.EndRedraw();
 	iTestBack.SetVisible(ETrue);
 	
 	struct DrawCompare
@@ -902,17 +899,14 @@
 	TInt error;
 	MakeTitleAndCompareWindowsL(_L("GFX_WSERV_DYNAMICRES_0008L"),_L("Change Size Mode"));
 
-	iTestBack=RWindow(iSession);
-	ASSERT_EQUALS(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
-	iTestBack.SetRequiredDisplayMode(iDisplayMode);
-	iTestBack.SetBackgroundColor(TRgb(255,0,0));
-	iTestBack.SetExtent(iTestPos.iTl,iTestPos.Size());
-	iTestBack.Activate();
-	iTestBack.BeginRedraw();
-	ActivateWithWipe(iGc,iTestBack,TRgb(255,0,0));
-	iGc->Deactivate();
-	iTestBack.EndRedraw();
-	iTestBack.SetVisible(ETrue);
+    iTestBack=RBlankWindow(iSession);
+    ASSERT_EQUALS(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
+    iTestBack.SetRequiredDisplayMode(iDisplayMode);
+    iTestBack.SetColor(TRgb(255,0,0));
+    iTestBack.SetExtent(iTestPos.iTl,iTestPos.Size());
+    iTestBack.Activate();
+    iTestBack.SetVisible(ETrue);
+    iSession.Finish(ETrue);
 	
 	
 	if (CWindowGc*	gc=BeginActivateWithWipe(ETrue,iCompare,TRgb(128,128,128)))
@@ -1084,17 +1078,13 @@
 	MakeTitleAndCompareWindowsL(_L("GFX_WSERV_DYNAMICRES_0009L"),_L("Change Size Mode"));
 	iSession.Finish(ETrue);
 
-	iTestBack=RWindow(iSession);
-	ASSERT_EQUALS(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
-	iTestBack.SetRequiredDisplayMode(iDisplayMode);
-	iTestBack.SetBackgroundColor(TRgb(255,0,0));
-	iTestBack.SetExtent(iTestPos.iTl,iTestPos.Size());
-	iTestBack.Activate();
-	iTestBack.BeginRedraw();
-	ActivateWithWipe(iGc,iTestBack,TRgb(255,0,0));
-	iGc->Deactivate();
-	iTestBack.EndRedraw();
-	iTestBack.SetVisible(ETrue);
+    iTestBack=RBlankWindow(iSession);
+    ASSERT_EQUALS(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
+    iTestBack.SetRequiredDisplayMode(iDisplayMode);
+    iTestBack.SetColor(TRgb(255,0,0));
+    iTestBack.SetExtent(iTestPos.iTl,iTestPos.Size());
+    iTestBack.Activate();
+    iTestBack.SetVisible(ETrue);
 	iSession.Finish(ETrue);
 	
 	struct DrawCompare
@@ -1503,8 +1493,7 @@
 
 void CDSATestDrawing::Draw()
 	{
-	iWin->Invalidate();
-	iWin->BeginRedraw();
+	//Should not invalidate the window containing DSA drawing. That's the whole point!
 	CFbsBitGc* gc = iDSA->Gc();
 	gc->SetPenStyle(gc->ESolidPen);
 	gc->SetPenColor(TRgb(255,0,0));
@@ -1512,7 +1501,6 @@
 	iRect.Shrink(1, 1);
 	gc->DrawRect(iRect);
 	iDSA->ScreenDevice()->Update();
-	iWin->EndRedraw();
 	
 	}
 void CDSATestDrawing::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/) 
@@ -1637,8 +1625,6 @@
 			continue;
 			}
 		
-		//if my rectangle's iTl is (0,0) and iBr is (100,100). Why does it gives me the rect width and height
-		//both 100? 0 - 100 is 101 pixels drawn. Or does this indicates iBr is exclusive and iTl is inclusive?
 		//Ruo: Oh I almost believe iBr is exclusive now
 		TDisplayConfiguration dispConfigAfter2;
 		interface->GetConfiguration(dispConfigAfter2);
@@ -2722,12 +2708,16 @@
 		TInt completeCount = 0;
 		while (notComplete)
 			{
+            RDebug::Printf("iInfoScreenDevice->SetAppScreenMode");
 			iInfoScreenDevice->SetAppScreenMode(screenModeList[index]);
 			iSession.Finish(ETrue);
 			iSession.HeapSetFail(RHeap::EDeterministic,heapFail);
+            RDebug::Printf("iInfoScreenDevice->SetAppScreenMode");
 			iInfoScreenDevice->SetScreenMode(screenModeList[index]);
+            RDebug::Printf("SetScreenMode done");
 			iSession.HeapSetFail(RHeap::ENone,0);
 			iSession.Finish(ETrue);
+            RDebug::Printf("Finish done");
 			Pause(50);
 			TInt newMode = iInfoScreenDevice->CurrentScreenMode();
 
@@ -2736,7 +2726,7 @@
 				completeCount++;
 				if (completeCount == 5)
 					{
-					INFO_PRINTF2(_L("Succeeded with heapFail = %d"),heapFail);
+					INFO_PRINTF3(_L("Mode %i Succeeded with heapFail = %d"),index, heapFail);
 					notComplete = EFalse;
 					}
 				iInfoScreenDevice->SetAppScreenMode(screenModeList[0]);
@@ -3740,6 +3730,8 @@
 
 	if (aBitmapRegionPairArray.Count()>0)
 		{
+        RDebug::Printf("Checking");
+        TInt countchecks=0;
 		for (TInt i=0; i<width; i++)
 			{
 			for (TInt j=0; j<height; j++)
@@ -3822,6 +3814,7 @@
 				}
 			}
 		}
+	
 	ignoreDueToResizing.Close();
 	if (errorPixels+diffPixels < 2)
 		{
--- a/windowing/windowserver/test/tframerate/framerate.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tframerate/framerate.h	Wed Aug 18 11:05:09 2010 +0300
@@ -23,8 +23,8 @@
 #define __GRAPHICDRAWERTESTFRAMERATE_H__
 
 #include <e32std.h>
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 //Maximum number of animations at a time.
 #define KMaxAnim 100
--- a/windowing/windowserver/test/tlisten/listener.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tlisten/listener.h	Wed Aug 18 11:05:09 2010 +0300
@@ -23,8 +23,8 @@
 #define __LISTENER_H__
 
 #include <bitstd.h>
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 class CFbsBitmap;
 class CFbsBitmapDevice;
--- a/windowing/windowserver/test/tredir/redirector.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/test/tredir/redirector.h	Wed Aug 18 11:05:09 2010 +0300
@@ -22,8 +22,8 @@
 #ifndef __REDIRECTOR_H__
 #define __REDIRECTOR_H__
 
-#include "Graphics/WSGRAPHICDRAWER.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "graphics/WSGRAPHICDRAWER.H"
+#include <graphics/WSGRAPHICDRAWERINTERFACE.H>
 
 class CFbsBitmap;
 class CFbsBitmapDevice;
--- a/windowing/windowserver/wins_switching/ws32_stubs.h	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserver/wins_switching/ws32_stubs.h	Wed Aug 18 11:05:09 2010 +0300
@@ -5292,6 +5292,15 @@
 	_asm jmp common_dispatch
 	}
 
+__declspec(dllexport)
+__declspec(naked)
+void call_vector_587 ()
+	{
+	// ; void RWsSession::IndicateAppOrientation(enum TRenderOrientation)
+	_asm mov eax, 587
+	_asm jmp common_dispatch
+	}
+
 }
-#define MAX_ORDINAL 587
-
+#define MAX_ORDINAL 588
+
--- a/windowing/windowserverplugins/group/BLD.INF	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserverplugins/group/BLD.INF	Wed Aug 18 11:05:09 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of "Eclipse Public License v1.0"
@@ -30,6 +30,8 @@
 
 PRJ_MMPFILES
 
+#include "../keyeventrouting/group/bld.inf"
+
 #ifndef SYMBIAN_GRAPHICS_BUILD_OPENWF_WSERV
 #include "../restricted/group/BLD.INF"
 #else
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/bwins/keyrouteru.def	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	?NewL@CKeyEventRouter@@SAPAV1@XZ @ 1 NONAME ; class CKeyEventRouter * CKeyEventRouter::NewL(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/eabi/keyrouteru.def	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+	_ZN15CKeyEventRouter4NewLEv @ 1 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/group/bld.inf	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,29 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Key Event Routing plug-in for Window Server
+//
+
+PRJ_EXPORTS
+../bwins/keyrouteru.def	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/def/bwins/keyrouteru.def)
+../eabi/keyrouteru.def	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/def/eabi/keyrouteru.def)
+keyeventrouting.iby		/epoc32/rom/include/keyeventrouting.iby
+
+PRJ_TESTEXPORTS
+keyeventrouting_test.iby		/epoc32/rom/include/keyeventrouting_test.iby
+
+PRJ_MMPFILES
+keyeventrouting.mmp
+
+PRJ_TESTMMPFILES
+keyeventrouting_test.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/group/keyeventrouting.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: 
+// Key Event Routing plug-in for Window Server
+//
+
+#ifndef __KEYEVENTROUTING_IBY__
+#define __KEYEVENTROUTING_IBY__
+
+file=ABI_DIR\BUILD_DIR\keyrouter.dll		System\Libs\keyrouter.dll
+
+#endif // __KEYEVENTROUTING_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/group/keyeventrouting.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,28 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Key Event Routing plug-in for Window Server
+//
+
+TARGET		keyrouter.dll
+TARGETTYPE	dll
+CAPABILITY  PowerMgmt ReadDeviceData WriteDeviceData ProtServ
+UID			0x102872e1 0x102872e2
+VENDORID	0x70000001
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+SOURCEPATH	../src
+SOURCE		keyrouter.cpp
+
+LIBRARY		euser.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/group/keyeventrouting_test.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description: 
+// Key Event Routing plug-in for Window Server: test version
+//
+
+#ifndef __KEYEVENTROUTING_TEST_IBY__
+#define __KEYEVENTROUTING_TEST_IBY__
+
+file=ABI_DIR\BUILD_DIR\keyrouter_test.dll		System\Libs\keyrouter_test.dll
+
+#endif // __KEYEVENTROUTING_TEST_IBY__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/group/keyeventrouting_test.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,32 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Key Event Routing plug-in for Window Server: test version
+//
+
+TARGET		keyrouter_test.dll
+TARGETTYPE	dll
+CAPABILITY  PowerMgmt ReadDeviceData WriteDeviceData ProtServ
+UID			0x102872e1 0x102872e6
+VENDORID	0x70000001
+
+MACRO		KEYROUTER_TEST
+
+DEFFILE		keyrouter.def
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+SOURCEPATH	../src
+SOURCE		keyrouter.cpp
+
+LIBRARY		euser.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/src/keyaliases.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,110 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Key code and scan code aliases for platform specific keys.
+// The definitions are as per S60 <mw/eikon.hrh> with the addition of the
+// full set of scan codes.
+
+/**
+@file
+@internalTechnology
+@prototype
+*/
+
+#include <e32keys.h>
+
+/**
+TStdScanCode aliases
+*/
+#define EStdKeyPhoneSend		EStdKeyYes
+#define EStdKeyPhoneEnd			EStdKeyNo
+#define EStdKeyCBA1				EStdKeyDevice0
+#define EStdKeyCBA2				EStdKeyDevice1
+#define EStdKeyPowerOff			EStdKeyDevice2
+#define EStdKeyOK				EStdKeyDevice3
+#define EStdKeyGripOpen			EStdKeyDevice4
+#define EStdKeyGripClose		EStdKeyDevice5
+#define EStdKeySide				EStdKeyDevice6	// Voice key
+#define EStdKeyCamera			EStdKeyDevice7
+#define EStdKeyTwistOpen		EStdKeyDevice8
+#define EStdKeyTwistClose		EStdKeyDevice9
+#define EStdKeyFlipOpen			EStdKeyDeviceA
+#define EStdKeyFlipClose		EStdKeyDeviceB
+#define EStdKeyLock				EStdKeyDeviceF
+#define EStdKeyLeftUpArrow		EStdKeyDevice10	// Diagonal arrow event
+#define EStdKeyRightUpArrow		EStdKeyDevice11	// Diagonal arrow event
+#define EStdKeyRightDownArrow	EStdKeyDevice12	// Diagonal arrow event
+#define EStdKeyLeftDownArrow	EStdKeyDevice13	// Diagonal arrow event
+#define EStdKeyVolumeUp			EStdKeyIncVolume
+#define EStdKeyVolumeDown		EStdKeyDecVolume
+#define EStdKeyApplication		EStdKeyApplication0
+#define EStdKeyPoC				EStdKeyApplication1
+#define EStdKeyPlay				EStdKeyApplication2
+#define EStdKeyStop				EStdKeyApplication3
+#define EStdKeyForward			EStdKeyApplication4
+#define EStdKeyRewind			EStdKeyApplication5
+#define EStdKeyOperator			EStdKeyApplication6
+#define EStdKeyQwertyOn			EStdKeyApplication7
+#define EStdKeyQwertyOff		EStdKeyApplication8
+#define EStdKeyNext				EStdKeyApplication9
+#define EStdKeyPrevious			EStdKeyApplicationA
+#define EStdKeyHoldSwitch		EStdKeyApplicationB
+#define EStdKeyZoomIn			EStdKeyApplicationC
+#define EStdKeyZoomOut			EStdKeyApplicationD
+#define EStdKey4x10QwertyOn		EStdKeyApplicationE
+#define EStdKey3x11QwertyOn		EStdKeyApplication10
+#define EStdKeyHalfQwertyOn		EStdKeyApplication11
+#define EStdKeyCustomKeyboardOn	EStdKeyApplication12
+
+/**
+TKeyCode aliases
+*/
+#define EKeyPhoneSend			EKeyYes
+#define EKeyPhoneEnd			EKeyNo
+#define EKeyCBA1				EKeyDevice0
+#define EKeyCBA2				EKeyDevice1
+#define EKeyPowerOff			EKeyDevice2
+#define EKeyOK					EKeyDevice3
+#define EKeyGripOpen			EKeyDevice4
+#define EKeyGripClose			EKeyDevice5
+#define EKeySide				EKeyDevice6		// Voice key
+#define EKeyCamera				EKeyDevice7
+#define EKeyTwistOpen			EKeyDevice8
+#define EKeyTwistClose			EKeyDevice9
+#define EKeyFlipOpen			EKeyDeviceA
+#define EKeyFlipClose			EKeyDeviceB
+#define EKeyLock				EKeyDeviceF
+#define EKeyLeftUpArrow			EKeyDevice10	// Diagonal arrow event
+#define EKeyRightUpArrow		EKeyDevice11	// Diagonal arrow event
+#define EKeyRightDownArrow		EKeyDevice12	// Diagonal arrow event
+#define EKeyLeftDownArrow		EKeyDevice13	// Diagonal arrow event
+#define EKeyVolumeUp			EKeyIncVolume
+#define EKeyVolumeDown			EKeyDecVolume
+#define EKeyApplication 		EKeyApplication0
+#define EKeyPoC					EKeyApplication1
+#define EKeyPlay				EKeyApplication2
+#define EKeyStop				EKeyApplication3
+#define EKeyForward				EKeyApplication4
+#define EKeyRewind				EKeyApplication5
+#define EKeyOperator			EKeyApplication6
+#define EKeyQwertyOn			EKeyApplication7
+#define EKeyQwertyOff			EKeyApplication8
+#define EKeyNext				EKeyApplication9
+#define EKeyPrevious			EKeyApplicationA
+#define EKeyHoldSwitch			EKeyApplicationB
+#define EKeyZoomIn				EKeyApplicationC
+#define EKeyZoomOut				EKeyApplicationD
+#define EKey4x10QwertyOn		EKeyApplicationE
+#define EKey3x11QwertyOn		EKeyApplication10
+#define EKeyHalfQwertyOn		EKeyApplication11
+#define EKeyCustomKeyboardOn	EKeyApplication12
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/src/keyrouter.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,543 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Reference implementation of Key Event Routing plug-in
+
+/**
+@file
+@internalTechnology
+@prototype
+*/
+
+#include <e32cmn.h>
+#include <e32debug.h>
+#include "keyrouterimpl.h"
+#include "keyaliases.h"
+
+#ifndef KEYROUTER_TEST
+// Temporary: to be made configurable
+#define COMBINED_POWER_END_KEY
+#endif
+
+/**
+Privileged application UIDs
+*/
+#ifdef KEYROUTER_TEST
+const TInt KUidTAutoServer = 0x10205152;
+const TInt KUidReservedApp = 0x102872e3;
+#else
+const TInt KUidPhoneApp = 0x100058b3;
+const TInt KUidSysAp = 0x100058f3;
+const TInt KUidAutoLock = 0x100059b5;
+const TInt KUidHomeScreen = 0x20022f35;
+const TInt KUidAknCapServer = 0x10207218;
+#endif
+
+#if defined(KEYROUTER_TEST) || defined(COMBINED_POWER_END_KEY)
+/**
+Key Capture Translation Table
+
+The following scan codes and key codes are translated at capture-request time.
+
+@note	The data in this table is for example/test purposes only.
+*/
+const TTranslationEntry KTranslations[] =
+	{
+		// Req. scancode,	Capture scancode,	Req. keycode,	Capture keycode
+#ifndef KEYROUTER_TEST
+		// On devices with a combined Power and End key, that key produces a
+		// PowerOff code. Map capture requests for the End key to PowerOff.
+		// At routing time, an End key event will automatically be delivered
+		// to the capturing application.
+		{ EStdKeyPhoneEnd,	EStdKeyPowerOff,	EKeyPhoneEnd,	EKeyPowerOff }
+#else
+		// Entry for TEvent test case GRAPHICS-WSERV-0751.
+		// Capture requests for psuedo key Device0 are mapped to capture
+		// the real key Device1.
+		{ EStdKeyDevice0,	EStdKeyDevice1,		EKeyDevice0,	EKeyDevice1 }
+#endif
+	};
+
+const TInt KNumTranslations = TABLE_SIZE(KTranslations);
+#endif // defined(KEYROUTER_TEST) || defined(COMBINED_POWER_END_KEY)
+
+/**
+Restricted Key Table
+
+The following keys may be captured only by the specified applications.
+More than one application may be listed for a given key-type combination.
+*/
+const TRestrictedKeyEntry KRestrictedKeys[] =
+	{
+#ifndef KEYROUTER_TEST
+		// Short Apps key events may only be captured by HomeScreen, SysApp,
+		// AutoLock, Phone and AknCapServer.
+		{ EStdKeyApplication,	ECaptureTypeKeyUpDown,	KUidHomeScreen },
+		{ EKeyApplication,		ECaptureTypeKey,		KUidHomeScreen },
+		{ EStdKeyApplication,	ECaptureTypeKeyUpDown,	KUidSysAp },
+		{ EKeyApplication,		ECaptureTypeKey,		KUidSysAp },
+		{ EStdKeyApplication,	ECaptureTypeKeyUpDown,	KUidAutoLock },
+		{ EKeyApplication,		ECaptureTypeKey,		KUidAutoLock },
+		{ EStdKeyApplication,	ECaptureTypeKeyUpDown,	KUidPhoneApp },
+		{ EKeyApplication,		ECaptureTypeKey,		KUidPhoneApp },
+		{ EStdKeyApplication,	ECaptureTypeKeyUpDown,	KUidAknCapServer },
+		{ EKeyApplication,		ECaptureTypeKey,		KUidAknCapServer },
+
+		// Long Apps key events may only be captured by SysAp (for launching
+		// the task switcher), AutoLock and Phone.
+		{ EKeyApplication,		ECaptureTypeLongKey,	KUidSysAp },
+		{ EKeyApplication,		ECaptureTypeLongKey,	KUidAutoLock },
+		{ EKeyApplication,		ECaptureTypeLongKey,	KUidPhoneApp },
+
+		// Only SysAp and AutoLock are allowed to capture Power key events
+		{ EKeyPowerOff,			ECaptureTypeKey,		KUidSysAp },
+		{ EKeyPowerOff,			ECaptureTypeLongKey,	KUidSysAp },
+		{ EStdKeyPowerOff,		ECaptureTypeKeyUpDown,	KUidSysAp },
+		{ EKeyPowerOff,			ECaptureTypeKey,		KUidAutoLock },
+		{ EKeyPowerOff,			ECaptureTypeLongKey,	KUidAutoLock },
+		{ EStdKeyPowerOff,		ECaptureTypeKeyUpDown,	KUidAutoLock },
+
+		// Only AutoLock is allowed to capture Lock key events
+		{ EKeyLock,				ECaptureTypeKey,		KUidAutoLock },
+		{ EKeyLock,				ECaptureTypeLongKey,	KUidAutoLock },
+		{ EStdKeyLock,			ECaptureTypeKeyUpDown,	KUidAutoLock }
+#else
+		// The following entries are for test purposes only.
+		// Test Case GRAPHICS-WSERV-0754. Only a reserved UID is allowed to
+		// capture F20 key events.
+		{ EKeyF20,				ECaptureTypeKey,		KUidReservedApp },
+		{ EKeyF20,				ECaptureTypeLongKey,	KUidReservedApp },
+		{ EStdKeyF20,			ECaptureTypeKeyUpDown,	KUidReservedApp },
+		// Only the reserved UID and the TAuto tests are allowed to capture
+		// F21 key events
+		{ EKeyF21,				ECaptureTypeKey,		KUidReservedApp },
+		{ EKeyF21,				ECaptureTypeLongKey,	KUidReservedApp },
+		{ EStdKeyF21,			ECaptureTypeKeyUpDown,	KUidReservedApp },
+		{ EKeyF21,				ECaptureTypeKey,		KUidTAutoServer },
+		{ EKeyF21,				ECaptureTypeLongKey,	KUidTAutoServer },
+		{ EStdKeyF21,			ECaptureTypeKeyUpDown,	KUidTAutoServer }
+#endif
+	};
+
+/**
+Application Priority Table
+
+The following applications have fixed priorities for capture of the associated
+key. The priority specified in this table overrides the priority in the capture
+request. When any other application captures a key listed here, the priority is
+forced to zero.
+
+@note	If a key should be never be delivered to any other application, then
+		it should be placed in KRestrictedKeys[] instead.
+*/
+const TAppPriorityEntry KAppPriorityKeys[] =
+	{
+#ifndef KEYROUTER_TEST
+		// The Phone app has priority for capture of Send key events
+		{ EStdKeyPhoneSend,	ECaptureTypeKeyUpDown,	KUidPhoneApp, 1 },
+		{ EKeyPhoneSend,	ECaptureTypeKey,		KUidPhoneApp, 1 },
+		{ EKeyPhoneSend,	ECaptureTypeLongKey,	KUidPhoneApp, 1 },
+
+		// The Phone app has the highest priority for capture of End key
+		// events. Note: any applications that capture these events apart
+		// from those listed here (e.g. other telephony apps) will effectively
+		// have priority 0.
+		{ EStdKeyPhoneEnd,	ECaptureTypeKeyUpDown,	KUidPhoneApp, 1 },
+		{ EKeyPhoneEnd,		ECaptureTypeKey,		KUidPhoneApp, 1 },
+		{ EKeyPhoneEnd,		ECaptureTypeLongKey,	KUidPhoneApp, 1 },
+
+		// The Home Screen app has low priority for capture of End key events
+		{ EStdKeyPhoneEnd,	ECaptureTypeKeyUpDown,	KUidHomeScreen, -1 },
+		{ EKeyPhoneEnd,		ECaptureTypeKey,		KUidHomeScreen, -1 },
+		{ EKeyPhoneEnd,		ECaptureTypeLongKey,	KUidHomeScreen, -1 },
+
+		// SysAp has the lowest priority for capture of End key events
+		{ EStdKeyPhoneEnd,	ECaptureTypeKeyUpDown,	KUidSysAp, -2 },
+		{ EKeyPhoneEnd,		ECaptureTypeKey,		KUidSysAp, -2 },
+		{ EKeyPhoneEnd,		ECaptureTypeLongKey,	KUidSysAp, -2 },
+
+#ifdef COMBINED_POWER_END_KEY
+		// SysAp has the same priority for capture of Power key events as
+		// it does for End key events. This is necessary to maintain correct
+		// relative priorities when there is a combined Power and End key.
+		{ EStdKeyPowerOff,	ECaptureTypeKeyUpDown,	KUidSysAp, -2 },
+		{ EKeyPowerOff,		ECaptureTypeKey,		KUidSysAp, -2 },
+		{ EKeyPowerOff,		ECaptureTypeLongKey,	KUidSysAp, -2 }
+#endif
+
+#else // KEYROUTER_TEST
+		// The following entries are for test purposes only.
+		// Test Case GRAPHICS-WSERV-0757. TAuto tests have priority for
+		// capture of F22 key events.
+		{ EStdKeyF22,		ECaptureTypeKeyUpDown,	KUidTAutoServer, 1 },
+		{ EKeyF22,			ECaptureTypeKey,		KUidTAutoServer, 1 },
+		{ EKeyF22,			ECaptureTypeLongKey,	KUidTAutoServer, 1 }
+#endif // KEYROUTER_TEST
+	};
+
+#ifdef KEYROUTER_TEST
+/**
+Blocked key table.
+
+The following keys are not routed by default.
+
+@note	The data in this table is for example/test purposes only.
+		Since long key events are never routed by default, there is no need
+		to list them here.
+*/
+const TBlockedKeyEntry KBlockedKeys[] =
+	{
+		// Entries for TEvent test case GRAPHICS-WSERV-0760
+		{ EStdKeyDevice3,	ECaptureTypeKeyUpDown },
+		{ EKeyDevice3,		ECaptureTypeKey }
+	};
+
+const TInt KNumBlockedKeys = TABLE_SIZE(KBlockedKeys);
+#endif // KEYROUTER_TEST
+
+const TInt KNumRestrictedKeys = TABLE_SIZE(KRestrictedKeys);
+const TInt KNumAppPriorityKeys = TABLE_SIZE(KAppPriorityKeys);
+const TInt KCaptureKeyArrayGranularity = 5;
+
+/**
+Create and return an instance of CKeyEventRouter
+
+@return	Pointer to new router instance
+*/
+EXPORT_C CKeyEventRouter* CKeyEventRouter::NewL()
+	{
+	return new(ELeave) CKeyEventRouterImpl;
+	}
+
+CKeyEventRouterImpl::CKeyEventRouterImpl()
+: iCaptureKeys(KCaptureKeyArrayGranularity, _FOFF(TKeyCaptureRequest, iHandle))
+	{
+	}
+
+CKeyEventRouterImpl::~CKeyEventRouterImpl()
+	{
+	iCaptureKeys.Close();
+	}
+
+/**
+Add a new key capture request
+
+@param	aRequest	Capture request details
+
+@see CKeyEventRouter::AddCaptureKeyL
+*/
+void CKeyEventRouterImpl::AddCaptureKeyL(const TKeyCaptureRequest& aRequest)
+	{
+	CheckCaptureKeyL(aRequest);
+	iCaptureKeys.InsertL(aRequest, 0);
+	ProcessAppPriorities(iCaptureKeys[0]);
+	TranslateCaptureKey(aRequest.iType, iCaptureKeys[0].iInputCode);
+	}
+
+   
+/**
+Update an existing key capture request
+
+@param	aRequest	Updated capture request details
+
+@note	This function is used only for window server hotkeys, hence key/scan
+		code translation and processing of special application priorities are
+		omitted.
+
+@see CKeyEventRouter::UpdateCaptureKeyL
+*/
+void CKeyEventRouterImpl::UpdateCaptureKeyL(const TKeyCaptureRequest& aRequest)
+	{
+	ASSERT(!aRequest.iWindowGroup);
+	CheckCaptureKeyL(aRequest);
+
+	TInt index = iCaptureKeys.Find(aRequest);
+	ASSERT(index != KErrNotFound);
+
+	if (index != KErrNotFound)
+		{
+		iCaptureKeys[index] = aRequest;
+		}
+	}
+
+/**
+Cancel a key capture request
+
+@param	aType		Capture type
+@param	aHandle		Opaque handle of request to be cancelled
+
+@see CKeyEventRouter::CancelCaptureKey
+
+Note: aType is unused in this implementation, but is present to permit
+implementations that use separate lists for each of the three capture types.
+*/
+void CKeyEventRouterImpl::CancelCaptureKey(TKeyCaptureType /*aType*/, TAny* aHandle)
+	{
+	TKeyCaptureRequest request;
+	request.iHandle = aHandle;
+
+	TInt index = iCaptureKeys.Find(request);
+	if (index != KErrNotFound)
+		{
+		iCaptureKeys.Remove(index);
+		}
+	}
+
+/**
+Route the key event described by aInput and return its destination in iOutput
+
+@param	aInput		Input data with key event to be routed
+@param	aOutput		Output key event and routing results
+
+@see CKeyEventRouter::RouteKey
+*/
+void CKeyEventRouterImpl::RouteKey(const TKeyEventRouterInput& aInput, TKeyEventRouterOutput& aOutput)
+	{
+	TUint inputCode = (aInput.iType == ECaptureTypeKeyUpDown) ?
+						aInput.iKeyEvent.iScanCode : aInput.iKeyEvent.iCode;
+	TInt priority = KMinTInt;
+	TInt captureCount = iCaptureKeys.Count();
+	TKeyCaptureRequest* matchRequest = NULL;
+
+	// Find the highest priority matching capture request. If there are
+	// multiple entries with the same priority then use the first one, i.e.
+	// the most recent request.
+	for (TInt index = 0; index < captureCount; index++)
+		{
+		TKeyCaptureRequest& request = iCaptureKeys[index];
+		if (request.iType == aInput.iType &&
+			request.iInputCode == inputCode &&
+		    (aInput.iKeyEvent.iModifiers & request.iModifierMask) == request.iModifiers &&
+			(request.iPriority > priority))
+			{
+			matchRequest = &request;
+			priority = request.iPriority;
+			}
+		}
+
+	if (matchRequest)
+		{
+		// Found matching capture request. Route the key event to the window
+		// group that made the capture request.
+		aOutput.iWindowGroup = matchRequest->iWindowGroup;
+		if (aInput.iType == ECaptureTypeKeyUpDown)
+			{
+			aOutput.iKeyEvent.iScanCode = matchRequest->iOutputCode;
+			aOutput.iKeyEvent.iCode = aInput.iKeyEvent.iCode;
+#ifdef COMBINED_POWER_END_KEY
+			// When routing to SysAp on devices with a combined Power and End
+			// key, deliver this event as PowerOff if the HomeScreen currently
+			// has focus, otherwise as End. (Note that when the HomeScreen app
+			// is showing the application library, it will capture the End key
+			// itself with higher priority.)
+			if (matchRequest->iAppUid.iUid == KUidSysAp &&
+				aInput.iKeyEvent.iScanCode == EStdKeyPowerOff)
+				{
+				aOutput.iKeyEvent.iScanCode =
+					(aInput.iFocusAppUid.iUid == KUidHomeScreen) ?
+					EStdKeyPowerOff : EStdKeyPhoneEnd;
+				}
+#endif
+			}
+		else
+			{
+			aOutput.iKeyEvent.iScanCode = aInput.iKeyEvent.iScanCode;
+			aOutput.iKeyEvent.iCode = matchRequest->iOutputCode;
+#ifdef COMBINED_POWER_END_KEY
+			if (matchRequest->iAppUid.iUid == KUidSysAp &&
+				aInput.iKeyEvent.iCode == EKeyPowerOff)
+				{
+				aOutput.iKeyEvent.iCode =
+					(aInput.iFocusAppUid.iUid == KUidHomeScreen) ?
+					EKeyPowerOff : EKeyPhoneEnd;
+				}
+#endif
+			}
+		aOutput.iKeyEvent.iModifiers = aInput.iKeyEvent.iModifiers;
+		aOutput.iCaptureHandle = matchRequest->iHandle;
+		aOutput.iResult = ECaptured;
+		}
+#ifdef KEYROUTER_TEST
+	else if (IsKeyBlocked(aInput.iType, inputCode))
+		{
+		// No matching capture request and key is blocked. Do not route.
+		aOutput.iResult = EConsumed;
+		}
+#endif
+	else
+		{
+		// No matching capture request. Route the key event to the current
+		// focussed window group.
+		aOutput.iWindowGroup = aInput.iFocusWindowGroup;
+		aOutput.iKeyEvent = aInput.iKeyEvent;
+		aOutput.iCaptureHandle = NULL;
+		aOutput.iResult = ERouted;
+		}
+	}
+
+/**
+Check that capture request arguments are sane and capture is allowed
+
+@param	aRequest	Capture request details
+
+@leave	KErrArgument if modifier state contains bits that are not in the
+		modifier mask or modifier mask contains EModifierLongKey or priority
+		is KMinTInt.
+		KErrPermissionDenied if key is restricted to capture by a specific
+		application UID and the UID of the requesting app does not match.
+
+@note	Requests with a priority of KMinTint would never be captured: this was
+		also true of the previous implementation in ektran.dll but was ignored.
+		Client code must use the appropriate API function to capture short or
+		long key events, so including EModifierLongKey in the modifier mask is
+		not allowed. (Hotkeys are excepted since a mask of 0xffffffff is used
+		to disable them).
+*/
+void CKeyEventRouterImpl::CheckCaptureKeyL(const TKeyCaptureRequest& aRequest)
+	{
+	if ((aRequest.iModifiers & ~aRequest.iModifierMask) != 0 ||
+		(aRequest.iModifierMask & EModifierLongKey) != 0 && aRequest.iWindowGroup != NULL ||
+		aRequest.iPriority == KMinTInt)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	if (aRequest.iWindowGroup != NULL && IsRestrictedKey(aRequest))
+		{
+		User::Leave(KErrPermissionDenied);
+		}
+	}
+
+/**
+Check if the requested key capture is restricted by application UID
+
+@param	aRequest	Capture request details
+
+@return	ETrue if the key-type combination in aRequest is listed in
+		KRestrictedKeys[] but the requesting application UID does not match
+		any entry in the table; otherwise EFalse.
+*/
+TBool CKeyEventRouterImpl::IsRestrictedKey(const TKeyCaptureRequest& aRequest)
+	{
+	TBool foundKey = EFalse;
+
+	for (const TRestrictedKeyEntry* entry = KRestrictedKeys; entry < &KRestrictedKeys[KNumRestrictedKeys]; entry++)
+		{
+		if (entry->iCode == aRequest.iInputCode &&
+			entry->iType == aRequest.iType)
+			{
+			foundKey = ETrue;
+			if (entry->iAppUidValue == aRequest.iAppUid.iUid)
+				{
+				return EFalse;
+				}
+			}
+		}
+
+	return foundKey;
+	}
+
+/**
+Process special application priorities
+
+@param	aRequest	Capture request details. If the key-type combination is
+					listed in KAppPriorityKeys[], then the capture priority is
+					replaced with the configured priority for the requesting
+					application, or with zero if the application UID does not
+					match any entry in the table.
+*/
+void CKeyEventRouterImpl::ProcessAppPriorities(TKeyCaptureRequest& aRequest)
+	{
+	TBool foundKey = EFalse;
+
+	for (const TAppPriorityEntry* entry = KAppPriorityKeys; entry < &KAppPriorityKeys[KNumAppPriorityKeys]; entry++)
+		{
+		if (entry->iCode == aRequest.iInputCode &&
+			entry->iType == aRequest.iType)
+			{
+			foundKey = ETrue;
+			if (entry->iAppUidValue == aRequest.iAppUid.iUid)
+				{
+				aRequest.iPriority = entry->iAppPriority;
+				return;
+				}
+			}
+		}
+
+	if (foundKey)
+		{
+		aRequest.iPriority = 0;
+		}
+	}
+
+#ifdef KEYROUTER_TEST
+/**
+Check if the specified key is blocked from default routing
+
+@param	aType		Key capture type
+@param	aCode		Scan code or key code
+
+@return	ETrue if key is blocked, otherwise EFalse.
+*/
+TBool CKeyEventRouterImpl::IsKeyBlocked(TKeyCaptureType aType, TUint aCode)
+	{
+	for (const TBlockedKeyEntry* entry = KBlockedKeys; entry < &KBlockedKeys[KNumBlockedKeys]; entry++)
+		{
+		if (entry->iCode == aCode && entry->iType == aType)
+			{
+			return ETrue;
+			}
+		}
+
+		return EFalse;
+	}
+#endif // KEYROUTER_TEST
+
+/**
+Translate the scan or key code of a capture request
+
+@param	aType	Key capture type
+@param	aCode	Key code or scan code, updated to translated value (if any)
+
+@note	This function is used to translate the input key or scan code of a
+		capture request on addition to the capture list. When a key event that
+		matches the list entry is routed, the output code will be taken from
+		TKeyCaptureRequest.iOutputCode and hence automatically translated again
+		(typically back to the original input code of the request, unless the
+		input and output codes were different). For example, a request to
+		capture key code A will be translated to key code B in the capture list.
+		When RouteKey() processes an event with key code B and selects that
+		list entry, it will output key code A for delivery to the application.
+*/
+void CKeyEventRouterImpl::TranslateCaptureKey(TKeyCaptureType aType, TUint& aCode)
+	{
+#if defined(KEYROUTER_TEST) || defined(COMBINED_POWER_END_KEY)
+	for (const TTranslationEntry* entry = KTranslations; entry < &KTranslations[KNumTranslations]; entry++)
+		{
+		if (aType == ECaptureTypeKeyUpDown)
+			{
+			if (aCode == entry->iRequestScanCode)
+				{
+				aCode = entry->iCaptureScanCode;
+				}
+			}
+		else
+			{
+			if (aCode == entry->iRequestKeyCode)
+				{
+				aCode = entry->iCaptureKeyCode;
+				}
+			}
+		}
+#endif
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserverplugins/keyeventrouting/src/keyrouterimpl.h	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,92 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Reference implementation of Key Event Routing plug-in
+
+/**
+@file
+@internalTechnology
+@prototype
+*/
+
+#ifndef KEYROUTERIMPL_H
+#define KEYROUTERIMPL_H
+
+#include <graphics/wskeyrouter.h>
+
+/** Key Capture Translation Table entry */
+struct TTranslationEntry
+	{
+	TUint	iRequestScanCode;
+	TUint	iCaptureScanCode;
+	TUint	iRequestKeyCode;
+	TUint	iCaptureKeyCode;
+	};
+
+/** Restricted Key Table entry */
+struct TRestrictedKeyEntry
+	{
+	TUint			iCode;
+	TKeyCaptureType	iType;
+	TInt			iAppUidValue;
+	};
+
+/** Application Priority Table entry */
+struct TAppPriorityEntry
+	{
+	TUint			iCode;
+	TKeyCaptureType	iType;
+	TInt			iAppUidValue;
+	TInt			iAppPriority;
+	};
+
+#ifdef KEYROUTER_TEST
+/** Blocked Key Table entry */
+struct TBlockedKeyEntry
+	{
+	TUint			iCode;
+	TKeyCaptureType	iType;
+	};
+#endif // KEYROUTER_TEST
+
+#define TABLE_SIZE(table) (sizeof(table) / sizeof((table)[0]))
+
+/**
+Key Event Router implementation class
+*/
+NONSHARABLE_CLASS(CKeyEventRouterImpl) : public CKeyEventRouter
+	{
+public:
+	CKeyEventRouterImpl();
+	~CKeyEventRouterImpl();
+
+	// From CKeyEventRouter
+	void AddCaptureKeyL(const TKeyCaptureRequest& aRequest);
+	void UpdateCaptureKeyL(const TKeyCaptureRequest& aRequest);
+	void CancelCaptureKey(TKeyCaptureType aType, TAny* aHandle);
+	void RouteKey(const TKeyEventRouterInput& aInput,
+				  TKeyEventRouterOutput& aOutput);
+private:
+	void CheckCaptureKeyL(const TKeyCaptureRequest& aRequest);
+	void ProcessAppPriorities(TKeyCaptureRequest& aRequest);
+	void TranslateCaptureKey(TKeyCaptureType aType, TUint& aCode);
+	TBool IsRestrictedKey(const TKeyCaptureRequest& aRequest);
+#ifdef KEYROUTER_TEST
+	TBool IsKeyBlocked(TKeyCaptureType aType, TUint aCode);
+#endif
+
+private:
+	RArray<TKeyCaptureRequest>	iCaptureKeys;
+	};
+
+#endif // KEYROUTERIMPL_H
--- a/windowing/windowserverplugins/openwfc/group/stdplugin.mmp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserverplugins/openwfc/group/stdplugin.mmp	Wed Aug 18 11:05:09 2010 +0300
@@ -75,6 +75,7 @@
 LIBRARY     wfcinterop.lib
 LIBRARY     surfacemanager.lib
 LIBRARY	 	libEGL.lib
+LIBRARY	 	bitgdi.lib
 //TODO Change the following line once eglsynchelper has been corrected
 //     to be available as a dynamic library
 STATICLIBRARY  eglsynchelper.lib
--- a/windowing/windowserverplugins/openwfc/group/wserv_std_plugins.iby	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserverplugins/openwfc/group/wserv_std_plugins.iby	Wed Aug 18 11:05:09 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -30,4 +30,6 @@
 ECOM_PLUGIN(10286378.dll,10286378.rsc)
 #endif
 
+#include <keyeventrouting.iby>
+
 #endif // __WSERV_STD_PLUGINS_IBY__
--- a/windowing/windowserverplugins/openwfc/src/displayrenderstage.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserverplugins/openwfc/src/displayrenderstage.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -312,7 +312,10 @@
 
 TDisplayMode CDisplayRenderStage::DisplayMode() const
 	{
-	return iRenderTarget->DisplayMode();
+	const TInt KThirtyTwoBpp = 32;
+	const TDisplayMode dm = iRenderTarget->DisplayMode();
+	const TInt bpp = TDisplayModeUtils::NumDisplayModeBitsPerPixel(dm);
+	return bpp == KThirtyTwoBpp ? CFbsDevice::DisplayMode16M() : dm;
 	}
 
 TSize CDisplayRenderStage::SizeInPixels() const
--- a/windowing/windowserverplugins/openwfc/src/fbrenderstage.cpp	Tue Jul 06 15:45:57 2010 +0300
+++ b/windowing/windowserverplugins/openwfc/src/fbrenderstage.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -18,6 +18,7 @@
 #include "panic.h"
 #include <graphics/wsdisplaycontrol.h>
 #include "displaypolicy.h"
+#include <graphics/sgutils.h>
 #include "utils.h"
 
 #if defined(__WINS__) && defined(_DEBUG)
@@ -154,7 +155,18 @@
 	if (iniFile->FindVar(iNextScreenDevice->ScreenNumber(), KFlickerBufferMode, flickerBufferModeName))
 		displayMode = ParseDisplayMode(flickerBufferModeName);
 	if (displayMode == ENone)
-		displayMode = iNextScreenDevice->DisplayMode();
+		{
+		// Display render stage MWsScreenDevice::DisplayMode now reports the supported screendriver display mode in 32bpp. 
+		// It is necessary in order to maintain BC with 3rd party apps and DSA framework.
+		// The reported display mode may be different from the actual UI surface pixel format, so flicker buffer
+	    // must not rely on DisplayMode() to determine pixel format for its rendering target.
+		//
+		MWsUiBuffer* uiBuf = aNextStage->ObjectInterface<MWsUiBuffer>();
+		if (uiBuf)
+			{
+			displayMode = SgUtils::PixelFormatToDisplayMode(uiBuf->PixelFormat());
+			}
+		}
 	STD_ASSERT_DEBUG(displayMode!=ENone, EPluginPanicNoDisplayModeFound);
 	
 	const TUint32 usage = ESgUsageDirectGdiTarget | ESgUsageWindowGcSource;