Merge include/opencv1 and include/opencv2

Warning, this is a brutish hack, and unless fixed, should not be used.
Release_1.3_Bugfix
Bradlee Speice 2012-07-19 17:17:06 -04:00
parent 556e8b59ed
commit c4c700fcda
17 changed files with 23 additions and 2551 deletions

View File

@ -30,14 +30,23 @@ AC_PATH_X
#Configure OpenCV - version 2+ breaks a lot of things
PKG_CHECK_MODULES([OpenCV], [opencv >= 2.0.0], [use_opencv2=true], [use_opencv1=true])
AM_CONDITIONAL(USEOPENCV2, [test "$use_opencv2" != ""])
#Let doxygen know where our headers are at
AC_SUBST(CV_VERSION, "opencv2")
AC_SUBST(CV_HEADERS_1, ["/* OpenCV2 includes - some filenames are different"])
AC_SUBST(CV_HEADERS_2, [" * from the OpenCV1 counterparts */"])
AC_SUBST(CV_HEADERS_3, ["include <opencv2/core/core_c.h>"])
AC_SUBST(CV_HEADERS_4, ["include <opencv2/highgui/highgui_c.h>"])
AC_SUBST(CV_HEADERS_5, ["include <opencv2/imgproc/imgproc_c.h>"])
if test "$use_opencv1" != ""; then
echo "could not find OpenCV version 2.0.0 or higher, checking for 1.0.0 or higher..."
PKG_CHECK_MODULES([OpenCV], [opencv >= 1.0.0])
#Update doxygen on where our headers are at
AC_SUBST(CV_VERSION, "opencv1")
AC_SUBST(CV_HEADERS_1, ["/* OpenCV includes */"])
AC_SUBST(CV_HEADERS_2, [" " ])
AC_SUBST(CV_HEADERS_3, ["include <opencv/cv.h>"])
AC_SUBST(CV_HEADERS_4, ["include <opencv/highgui.h>"])
AC_SUBST(CV_HEADERS_5, ["define NEVER_USED"])
fi
AC_SUBST(CV_CFLAGS, [`pkg-config --cflags opencv`])
AC_SUBST(CV_LIBS, [`pkg-config --libs opencv`])
@ -111,4 +120,5 @@ AC_OUTPUT(
[docs/Makefile]
[libcvautomation.pc]
[rpm/libcvautomation.spec]
[include/libcvautomation/libcvautomation.h]
)

View File

@ -1,12 +1,7 @@
if BUILD_EXAMPLES
#Need to include the -Ilibcvautomation so that libcvautomation.h can find everything that it needs
if USEOPENCV2
AM_LDFLAGS = -L../libcvautomation/.libs -lcvautomation `pkg-config --libs x11` -lopencv_imgproc -lopencv_core -lopencv_highgui -lXtst
AM_CFLAGS = -Wall -Werror -O2 -I$(top_srcdir)/include/opencv2 #-I$(top_srcdir)/include/libcvautomation
else
AM_LDFLAGS = -L../libcvautomation/.libs -lcvautomation `pkg-config --libs x11` `pkg-config --libs opencv` -lXtst
AM_CFLAGS = -Wall -Werror -O2 -I$(top_srcdir)/include/opencv1 #-I$(top_srcdir)/include/libcvautomation
endif
AM_LDFLAGS = -L../libcvautomation/.libs -lcvautomation `pkg-config --libs x11` `pkg-config --libs opencv` `pkg-config --libs xtst`
AM_CFLAGS = -Wall -Werror -O2 -I$(top_srcdir)/include
#Build only if we're building the examples
bin_PROGRAMS = cva-match cva-input

View File

@ -17,16 +17,19 @@
#ifndef LIBCVAUTOMATION_H
#define LIBCVAUTOMATION_H
#define LIBCVAUTOMATION_VERSION "1.3"
#define LIBCVAUTOMATION_BUGREPORT "bspeice@uncc.edu"
#define LIBCVAUTOMATION_VERSION "@PACKAGE_VERSION@"
#define LIBCVAUTOMATION_BUGREPORT "@PACKAGE_BUGREPORT@"
/* C includes */
#include <stdio.h>
#include <string.h>
/* OpenCV includes */
#include <opencv/cv.h>
#include <opencv/highgui.h>
/* Autoconf logic to select the correct OpenCV version */
@CV_HEADERS_1@
@CV_HEADERS_2@
#@CV_HEADERS_3@
#@CV_HEADERS_4@
#@CV_HEADERS_5@
/* X11 includes */
#include <X11/Xlib.h>

View File

@ -1,205 +0,0 @@
/*
* =====================================================================================
*
* Filename: libcvautomation-opencv.h
*
* Description: Function definitions for opencv functionality
*
* Created: 06/21/2012 08:34:21 AM
* Revision: none
* Compiler: gcc
*
* Author: Bradlee Speice, bspeice@uncc.edu
* Organization: MOSAIC at University of North Carolina at Charlotte
*
* =====================================================================================
*/
#ifndef LIBCVAUTOMATION_OPENCV_H
#define LIBCVAUTOMATION_OPENCV_H
#include <libcvautomation/libcvautomation.h>
/* It should be noted that the following are the macros for template matching:
* CV_TM_SQDIFF (default)
* CV_TM_SQDIFF_NORMED
* CV_TM_CCORR
* CV_TM_CCORR_NORMED
* CV_TM_CCOEFF
* CV_TM_CCOEFF_NORMED
*/
/* Match a root image and sub image */
CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMethod, double tolerance );
/* Match a root image and sub image, return the center */
CvPoint matchSubImage_center ( IplImage *rootImage, IplImage *subImage, int searchMethod, double tolerance );
/* Match a root image and sub image from filename */
CvPoint matchSubImage_location ( const char *rootImage_location, const char *subImage_location, int searchMethod, double tolerance );
/* Match a root image and sub image from filename, return the center */
CvPoint matchSubImage_location_center ( const char *rootImage_location, const char *subImage_location, int searchMethod, double tolerance );
/* Match a root image and sub images from an array of images */
void matchSubImage_a ( IplImage *rootImage, cvautomationList *subImageArray, int listSize );
/* Match a root image and sub images from an array of images, return the center */
void matchSubImage_a_center ( IplImage *rootImage, cvautomationList *subImageArray, int listSize );
/* Match a root image and sub images from an array of images */
void matchSubImage_a_location ( const char *rootImageFileName, cvautomationList *subImageArray, int listSize );
/* Match a root image and sub images from an array of images, return the center */
void matchSubImage_a_location_center ( const char *rootImageFileName, cvautomationList *subImageArray, int listSize );
#endif /* LIBCVAUTOMATION_OPENCV_H */
/* Doxygen information */
/** \file libcvautomation-opencv.h
* \brief The source code to access libcv from inside libcvautomation.
* \details This source file builds in the necessary functionality to use libcv functions inside libcvautomation.
* \author Bradlee Speice
* \date 7/18/2012
*/
/** \page libcv_search_methods Libcv Search Methods
This page describes the methods libcv uses to search for a sub image in a root image.
\section tolerance Tolerance Values
Tolerance values are used to control how strict each of the following search methods are. Acceptable values are from \c INT_MIN to \c INT_MAX.
Additionally, each of the reference programs - \c cva-input and \c cva-match - have a "sane tolerance" built in. This is accessed by the "-o" switch, and allows you to specify a tolerance on scale of 1-100, where 1 is incredibly strict, and 100 is incredibly loose.
\note The formula for calculating the sane tolerance is: \f$ T(x) = (10^{\frac{\log{INT\_MAX}}{\lambda}})^x \f$ where \f$ \lambda \f$ is the highest tolerance value (in our case, 100). Finally, we have to round down a little bit to ensure that we don't accidentally generate a value higher than \c INT_MAX. The formula used does mean that we will never be able to generate values lower than 0.
\warning The "sane-tolerance" option doesn't know which search method you are using - Thus while 1 is an incredibly strict search for \ref SQDIFF and \ref SQDIFF_NORMED, it is fairly loose search for \ref CCORR, \ref CCORR_NORMED, \ref CCOEFF, and \ref CCOEFF_NORMED
\section SQDIFF Squared Difference
\code #define CV_TM_SQDIFF 0 \endcode
Squared Difference is the default search method used by \c libcvautomation, as well as \c cva-match and \c cva-input.
\par For this method, setting a low tolerance value results in a more strict match.
Formula:
\f$R(x,y) = \sum_{x',y'} (T(x',y') - I(x + x', y+y'))^2 \f$
\section SQDIFF_NORMED Squared Difference (Normalized)
\code #define CV_TM_SQDIFF_NORMED 1 \endcode
This is a normalized version of the \ref SQDIFF search method.
\par For this method, setting a low tolerance value results in a more strict match.
Formula:
\f$ R(x,y) = \frac{\sum_{x',y'}(T(x',y') - I(x + x', y + y'))^2}{ \sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'}I(x + x', y + y')^2}} \f$
\section CCORR Cross Correlation
\code #define CV_TM_CCORR 2 \endcode
This is the Cross Correlation search method.
\par For this method, setting a high tolerance value results in a more strict match.
Formula:
\f$ R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y')) \f$
\section CCORR_NORMED Cross Correlation (Normalized)
\code #define CV_TM_CCORR_NORMED 3 \endcode
This is the normalized version of the \ref CCORR search method.
\par For this method, setting a high tolerance value results in a more strict match.
Formula:
\f$ R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I'(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}} \f$
\section CCOEFF Correlation Coefficient
\code #define CV_TM_CCOEFF 4 \endcode
This is the Correlation Coefficient search method.
\par For this method, setting a high tolerance value results in a more strict match.
Formula:
\f$ R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I(x+x',y+y')) \f$
where:
\f$ \begin{array}{l} T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h) \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array} \f$
\section CCOEFF_NORMED Correlation Coefficient (Normalized)
\code #define CV_TM_CCOEFF_NORMED 5 \endcode
This is the normalized version of the \ref CCOEFF search method.
\par For this method, setting a high tolerance value results in a more strict match.
Formula:
\f$ R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} } \f$
*/
/** \fn CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMethod, double tolerance );
* \brief Return the location of a sub image in its root image
* \param rootImage The root image (in IplImage format) to search in
* \param subImage The sub image (in IplImage format) to search for in \c rootImage
* \param searchMethod The search method to use when searching for \c subImage in \c rootImage.
* \param tolerance The tolerance to use when searching for \c subImage in \c rootImage.
* \see \ref libcv_search_methods
* \return The location of the sub image in root image
*/
/** \fn CvPoint matchSubImage_center ( IplImage *rootImage, IplImage *subImage, int searchMethod, double tolerance );
* \brief Return the center of a sub image in its root image, rather than the top-left corner
* \param rootImage The root image (in IplImage format) to search in
* \param subImage The sub image (in IplImage format) to search for in \c rootImage
* \param searchMethod The search method to use when searching for \c subImage in \c rootImage.
* \param tolerance The tolerance to use when searching for \c subImage in \c rootImage.
* \see \ref libcv_search_methods
* \return The center location of the sub image in root image
*/
/** \fn CvPoint matchSubImage_location ( const char *rootImage_location, const char *subImage_location, int searchMethod, double tolerance );
* \brief Return the location of a sub image in its root image
* \details The difference that this function has over matchSubImage() is that \e rootImage_location and \e subImage_location are from files, rather than an IplImage format image.
* \param rootImage_location The location of the root image
* \param subImage_location The location of the sub image to search for in \c rootImage
* \param searchMethod The search method to use when searching for \c subImage in \c rootImage.
* \param tolerance The tolerance to use when searching for \c subImage in \c rootImage.
* \see \ref libcv_search_methods
* \return The location of the sub image in root image
*/
/** \fn CvPoint matchSubImage_location_center ( const char *rootImage_location, const char *subImage_location, int searchMethod, double tolerance );
* \brief Return the center of a sub image in its root image, rather than the top-left corner
* \details The difference that this function has over matchSubImage_center() is that \e rootImage_location and \e subImage_location are from files, rather than an IplImage format image.
* \param rootImage_location The location of the root image
* \param subImage_location The location of the sub image to search for in \c rootImage
* \param searchMethod The search method to use when searching for \c subImage in \c rootImage.
* \param tolerance The tolerance to use when searching for \c subImage in \c rootImage.
* \see \ref libcv_search_methods
* \return The center location of the sub image in root image
*/
/** \fn void matchSubImage_a ( IplImage *rootImage, cvautomationList *subImageArray, int listSize );
* \brief Parse an array of sub images and send them to matchSubImage()
* \param rootImage The root image (in IplImage format) to search in
* \param subImageArray The sub image array to search for in \c rootImage - Note that the contents of \c subImageArray are modified during execution of this routine
* \param listSize The number of sub images to search for in subImageArray
* \see cvautomationList
* \return This function returns void, and modifies the contents of subImageArray
*/
/** \fn void matchSubImage_a_center ( IplImage *rootImage, cvautomationList *subImageArray, int listSize );
* \brief Parse an array of sub images and send them to matchSubImage_center()
* \details Uses the cvautomationList.cvaImage parameter to find a \c subImage in \c rootImage
* \param rootImage The root image (in IplImage format) to search in
* \param subImageArray The sub image array to search for in \c rootImage - Note that the contents of \c subImageArray are modified during execution of this routine
* \param listSize The number of sub images to search for in subImageArray
* \see cvautomationList
* \return This function returns void, and modifies the contents of subImageArray
*/
/** \fn void matchSubImage_a_location ( const char *rootImage_location, cvautomationList *subImageArray, int listSize );
* \brief Parse an array of sub images and send them to matchSubImage()
* \details The difference between this and matchSubImage_a() is that this uses a root image from filename, rather than from an IplImage format.
* \param rootImage_location The location of the root image
* \param subImageArray The sub image array to search for in \c rootImage_location - Note that the contents of \c subImageArray are modified during execution of this routine
* \param listSize The number of sub images to search for in subImageArray
* \see cvautomationList
* \return This function returns void, and modifies the contents of subImageArray
*/
/** \fn void matchSubImage_a_location_center ( const char *rootImage_location, cvautomationList *subImageArray, int listSize );
* \brief Parse an array of sub images and send them to matchSubImage_center()
* \details The difference that this function has over matchSubImage_a_center() is that \c rootImage_location is from a file
* \param rootImage_location The location of the root image
* \param subImageArray The sub image array to search for in \c rootImage_location - Note that the contents of \c subImageArray are modified during execution of this routine
* \param listSize The number of sub images to search for in subImageArray
* \see cvautomationList
* \return This function returns void, and modifies the contents of subImageArray
*/

View File

@ -1,110 +0,0 @@
/*
* =====================================================================================
*
* Filename: libcvautomation-xlib.h
*
* Description: Function definitions for X11 operations
*
* Created: 06/21/2012 08:34:21 AM
* Revision: none
* Compiler: gcc
*
* Author: Bradlee Speice, bspeice@uncc.edu
* Organization: MOSAIC at University of North Carolina at Charlotte
*
* =====================================================================================
*/
#ifndef LIBCVAUTOMATION_XLIB_H
#define LIBCVAUTOMATION_XLIB_H
#include <libcvautomation/libcvautomation.h>
/* Custom wrapper for XOpenDisplay function */
Display* cvaOpenDisplay ( char *displayName );
/* Custom wrapper for XCloseDisplay funtion */
void cvaCloseDisplay ( Display *displayLocation );
/* Match a sub image using the X11 root window as root */
CvPoint matchSubImage_X11( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
/* Match a sub image using the X11 root window as root, return the center */
CvPoint matchSubImage_X11_center( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
/* Match a sub image using X11 as root, from filename */
CvPoint matchSubImage_X11_location( Display *displayLocation, const char *subImage_location, int search_method, int tolerance );
/* Match a sub image using X11 as root, from filename, return the center */
CvPoint matchSubImage_X11_location_center( Display *displayLocation, const char *subImage_location, int search_method, int tolerance );
#endif /* LIBCVAUTOMATION_XLIB_H */
/* Doxygen information */
/** \file libcvautomation-xlib.h
* \brief The source code to access Xlib from inside libcvautomation
* \details This source file builds in the necessary functionality to use xlib functions inside libcvautomation.
* \author Bradlee Speice
* \date 7/18/2012
*/
/** \fn Display* cvaOpenDisplay ( char *displayName );
* \brief Simple wrapper for XOpenDisplay
* \details Currently this function literally just passes off to XOpenDisplay, but is designed to be used in the future if extra functionality is needed.
* \param displayName The name of the display to open - '' is a valid name
* \returns Pointer to the opened X11 Display
* \warning You must open a display to use any functions.
* \warning The program using this library is responsible to close the display as well.
*/
/** \fn void cvaCloseDisplay ( Display *displayLocation );
* \brief Simple wrapper for XCloseDisplay
* \details Currently this function literally just passes off to XCloseDisplay, but is designed to be used in the future if extra functionality is needed.
* \param displayLocation Pointer to the display to close
* \returns Nothing
*/
/** \fn CvPoint matchSubImage_X11( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
* \brief Return the location of a sub image in the X11 root window
* \details This function wraps grabbing the X11 root window, converting it to IplImage format, and then giving this to matchSubImage()
* \param displayLocation Pointer to the currently open X11 Display
* \param subImage The sub image (in IplImage format) to search for in the root X11 window
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of the sub image in root X11 window
*/
/** \fn CvPoint matchSubImage_X11_center( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
* \brief Return the center of a sub image in root X11 window, rather than the top-left corner
* \details This function wraps grabbing the X11 root window, converting it to IplImage format, and then giving this to matchSubImage_center()
* \param displayLocation Pointer to the currently open X11 Display
* \param subImage The sub image (in IplImage format) to search for in the root X11 window
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The center location of the sub image in the root X11 window
*/
/** \fn CvPoint matchSubImage_X11_location( Display *displayLocation, const char *subImage_location, int searchMethod, int tolerance );
* \brief Return the location of a sub image in the X11 root window
* \details This function wraps grabbing the X11 root window, converting it to IplImage format, and then giving this to matchSubImage_location()
* \param displayLocation Pointer to the currently open X11 Display
* \param subImage_location The location of the sub image to search for in the root X11 window
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The center location of the sub image in the root X11 window
*/
/** \fn CvPoint matchSubImage_X11_location_center( Display *displayLocation, const char *subImage_location, int searchMethod, int tolerance );
* \brief Return the center of a sub image in the root X11 window, rather than the top-left corner
* \details This function wraps grabbing the X11 root window, converting it to IplImage format, and then giving this to matchSubImage_location_center()
* \param displayLocation Pointer to the currently open X11 Display
* \param subImage_location The location of the sub image to search for in the root X11 window
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The center location of the sub image in the root X11 window
*/

View File

@ -1,663 +0,0 @@
/*
* =====================================================================================
*
* Filename: libcvautomation-xinput.h
*
* Description:
*
* Created: 06/26/2012 09:08:41 AM
* Revision: none
* Compiler: gcc
*
* Author: Bradlee Speice (), bspeice.nc@gmail.com
* Organization:
*
* =====================================================================================
*/
#ifndef LIBCVAUTOMATION_XTEST_H
#define LIBCVAUTOMATION_XTEST_H
#include <libcvautomation/libcvautomation.h>
#define IS_CMD( x, y ) strncmp( x, y, strlen( y ) ) == 0
#define COMMAND_STR_LEN 512
/* Make sure that the XTest extension is supported.
* If it's not, return 0 (false) */
Bool xte_XTestSupported ( Display *displayLocation );
/* Get the current location of the pointer */
cvaPoint xte_pointerLocation ( Display *displayLocation );
/* Click the mouse where it is currently at */
void xte_clickMouse ( Display *displayLocation, int mouseButton );
/* Click the mouse on an absolute screen location */
void xte_clickMouseXY ( Display *displayLocation, int xLocation, int yLocation, int mouseButton );
/* Click the mouse on a screen location relative to where it currently is */
void xte_clickMouseRXY ( Display *displayLocation, int xIncrement, int yIncrement, int mouseButton );
/* Click the mouse at the top-left corner of an image on the specified display */
cvaPoint xte_clickMouseImage ( Display *displayLocation, IplImage *subImage, int mouseButton, int searchMethod, int tolerance );
/* Click the mouse at the top-left corner of an image on the specified display
* where the subImage is a file location */
cvaPoint xte_clickMouseImage_location ( Display *displayLocation, const char *fileName, int mouseButton, int searchMethod, int tolerance );
/* Click the mouse at the center of an image on the specified display */
cvaPoint xte_clickMouseImage_center ( Display *displayLocation, IplImage *subImage, int mouseButton, int searchMethod, int tolerance );
/* Click the mouse at the center of an image on the specified display
* where the subImage is a file location */
cvaPoint xte_clickMouseImage_location_center ( Display *displayLocation, const char *fileName, int mouseButton, int searchMethod, int tolerance );
/* Move the mouse to a location and leave it there */
void xte_hoverMouseXY ( Display *displayLocation, int xLocation, int yLocation );
/* Move the mouse to a location relative to where it currently is and leave it there */
void xte_hoverMouseRXY ( Display *displayLocation, int xIncrement, int yIncrement );
/* Move the mouse to a location at the top-left corner of an image on the specified display
* but don't click the mouse */
cvaPoint xte_hoverMouseImage ( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
/* Move the mouse to a location at the top-left corner of an image from file on the specified display
* but don't click the mouse */
cvaPoint xte_hoverMouseImage_location ( Display *displayLocation, const char *filename, int searchMethod, int tolerance );
/* Move the mouse to a location at the center of an image on the specified display
* but don't click the mouse */
cvaPoint xte_hoverMouseImage_center ( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
/* Move the mouse to a location at the center of an image from file on the specified display
* but don't click the mouse */
cvaPoint xte_hoverMouseImage_location_center ( Display *displayLocation, const char *fileName, int searchMethod, int tolerance );
/* Push a mouse button down, but don't release it */
void xte_mouseDown ( Display *displayLocation, int mouseButton );
/* Let a mouse button up */
void xte_mouseUp ( Display *displayLocation, int mouseButton );
/* Move the mouse a little bit */
void xte_mouseJiggle ( Display *displayLocation );
/* Scroll the mouse up */
void xte_mouseScrollUp ( Display *displayLocation );
/* Scroll the mouse down */
void xte_mouseScrollDown ( Display *displayLocation );
/* Press and release a key
* Note that we use a string for *key, since keys like "space" are still valid. */
void xte_clickKey ( Display *displayLocation, char *key );
/* Press and release keys in a string */
void xte_clickKeyStr ( Display *displayLocation, char *string );
/* Press a key down */
void xte_keyDown ( Display *displayLocation, char *key );
/* Release a key */
void xte_keyUp ( Display *displayLocation, char *key );
/* Use one of the functions by command name */
cvaPoint xte_commandString ( Display *displayLocation, char *commandString, int mouseButton, int searchMethod, int tolerance );
#endif /* LIBCVAUTOMATION_XTEST_H */
/* Doxygen information */
/** \file libcvautomation-xtest.h
* \brief The source code to access the XTest extension inside libcvautomation
* \details This source file builds in the necessary functionality to drive the X11 server in libcvautomation
* \author Bradlee Speice
* \date 7/18/2012
*/
/** \page XTest_key_strings XTest Key Strings
This page describes the various extra key strings to use with X11.
The following list is generated with this command:
\code xmodmap -pke | cut -d'=' -f2 | sed 's/ /\n/g' | tr -s '\n' | awk '{ print length(), $0 | "sort -n" }' | cut -d' ' -f2 | uniq \endcode
\code
0
1
2
3
4
5
6
7
8
9
a
A
b
B
c
C
d
D
e
E
f
F
g
G
h
H
i
I
j
J
k
K
l
L
m
M
n
N
o
O
p
P
q
Q
r
R
s
S
t
T
u
U
v
V
w
W
x
X
y
Y
z
Z
at
F1
F2
F3
F4
F5
F6
F7
F8
F9
Up
bar
End
F10
F11
F12
Tab
Down
Home
KP_0
KP_1
KP_2
KP_3
KP_4
KP_5
KP_6
KP_7
KP_8
KP_9
Left
less
Menu
Next
plus
Alt_L
Break
colon
comma
equal
grave
KP_Up
minus
Pause
Print
Prior
Right
slash
space
aacute
Aacute
dagger
Delete
dollar
eacute
Eacute
Escape
exclam
iacute
Iacute
Insert
KP_Add
KP_End
Meta_L
oacute
Oacute
period
Return
uacute
Uacute
greater
Hyper_L
KP_Down
KP_Home
KP_Left
KP_Next
percent
Shift_L
Shift_R
Super_L
Super_R
Sys_Req
XF86WWW
asterisk
KP_Begin
KP_Enter
KP_Equal
KP_Prior
KP_Right
NoSymbol
Num_Lock
question
quotedbl
XF86Back
XF86Mail
XF86Stop
XF86WLAN
ampersand
backslash
BackSpace
braceleft
brokenbar
Caps_Lock
Control_L
Control_R
KP_Delete
KP_Divide
KP_Insert
parenleft
semicolon
XF86Eject
XF86Sleep
adiaeresis
Adiaeresis
apostrophe
asciitilde
braceright
ediaeresis
Ediaeresis
idiaeresis
KP_Decimal
numbersign
odiaeresis
Odiaeresis
parenright
udiaeresis
Udiaeresis
underscore
XF86Reload
XF86Search
XF86WakeUp
asciicircum
bracketleft
KP_Multiply
KP_Subtract
Mode_switch
Scroll_Lock
XF86Battery
XF86Display
XF86Forward
XF86_Ungrab
bracketright
doubledagger
ISO_Left_Tab
XF86PowerOff
XF86AudioMute
XF86AudioNext
XF86AudioPrev
XF86AudioStop
XF86Favorites
XF86AudioMedia
XF86AudioPause
XF86Calculator
XF86_ClearGrab
XF86MyComputer
XF86_Next_VMode
XF86_Prev_VMode
ISO_Level3_Shift
Terminate_Server
XF86_Switch_VT_1
XF86_Switch_VT_2
XF86_Switch_VT_3
XF86_Switch_VT_4
XF86_Switch_VT_5
XF86_Switch_VT_6
XF86_Switch_VT_7
XF86_Switch_VT_8
XF86_Switch_VT_9
XF86KbdLightOnOff
XF86_Switch_VT_10
XF86_Switch_VT_11
XF86_Switch_VT_12
Pointer_EnableKeys
XF86KbdBrightnessUp
XF86MonBrightnessUp
XF86AudioLowerVolume
XF86AudioRaiseVolume
XF86KbdBrightnessDown
XF86MonBrightnessDown
\endcode
\warning Please note that each key string above is first translated into a key code, and then into the actual key click. Thus, while you might intend to press "dollar", it will actually come out as "4". If you need a <tt>'$'</tt> to come out, use the <tt>'keystring $'</tt> command to \ref xte_commandString() or <tt>'key_str $'</tt> function in the BASH wrapper - see the \ref wrapper_functions.
*/
/** \page XTest_command_strings xte_commandString() Command Strings
This page describes the various command strings available for the \ref xte_commandString() function.
\section mouseclick Mouse Click
\code 'mouseclick <button_number>' \endcode
Click the mouse button \c <button_number> in-place.
\section imouseclick Image Mouse Click
\code 'imouseclick <image_name>' \endcode
Click the mouse at an image's top-left corner.
\section icmouseclick Image Mouse Click (Centered)
\code 'icmouseclick <image_name>' \endcode
Click the mouse at an image's center.
\section mousexy Mouse XY Move
\code 'mousexy <x-coord> <y-coord>' \endcode
Move the mouse to an absolute coordinate.
\warning The \c <x-coord> and \c <y-coord> are expected to be integers.
\section mouserxy Mouse XY Move (Relative)
\code 'mouserxy <x-increment> <y-increment>' \endcode
Move the mouse by the given x and y values (relative motion).
\par A positive X increment will move the mouse to the right, and a positive Y increment will move the mouse down.
\warning The \c <x-increment> and \c <y-increment> are expected to be integers.
\section mouseimage Mouse Image Move
\code 'mouseimage <image_name>' \endcode
Move the mouse to an image's top-left corner.
\section cmouseimage Mouse Image Move (Centered)
\code 'cmouseimage <image_name>' \endcode
Move the mouse to an image's center.
\section mousedown Mouse Button Down
\code 'mousedown <button_number>' \endcode
Push and leave down a mouse button.
\section mouseup Mouse Button Up
\code 'mouseup <button_number>' \endcode
Release mouse button \c <button_number>
\section mousejiggle Mouse Jiggle
\code 'mousejiggle' \endcode
Jiggle the mouse (helps to activate some widgets). Moves the mouse right and down 1 pixel, and then back.
\section mousescrolld Mouse Scroll Down
\code 'mousescrolld' \endcode
Scroll the mouse down 1 time - depending on window manager settings, etc., this may be multiple lines.
\note This is a wrapper function for clicking button 4 on the mouse
\section mousescrollu Mouse Scroll Up
\code 'mousescrollu' \endcode
Scroll the mouse up 1 time - depending on window manager settings, etc., this may be multiple lines.
\note This is a wrapper function for clicking button 5 on the mouse
\section keyclick Key Button Click
\code 'keyclick <key_name>' \endcode
Push and release a keyboard key. This can be a key like \c 'a', \c 'b', or something fancy like \c 'space'. Please see \ref XTest_key_strings for a full list of special keys.
\section keydown Key Button Down
\code 'keydown <key_name>' \endcode
Push down <em>but do not release</em> a keyboard key. This can be a key like \c 'a', \c 'b', or something fancy like \c 'space'. Please see \ref XTest_key_strings for a full list of special keys.
\section keyup Key Button Up
\code 'keyup <key_name>' \endcode
Release a keyboard key. This can be a key like \c 'a', \c 'b', or something fancy like \c 'space'. Please see \ref XTest_key_strings for a full list of special keys.
\section keystring Keyboard Input String
\code 'keystring <string>' \endcode
Input a string of text to the X11 server. For example, inputting 'Hello, world!" will act as if you typed 'Hello, world!' from the keyboard.
\warning Unlike \ref keydown, \ref keyup, and \ref keyclick, this function can not handle special keys like 'space'.
*/
/** \def IS_CMD (x, y)
* \brief Checks if string \c 'x' is in \c 'y'
* \details Performs a safe check to see if x is in y - this way, you can check that \c "command" is inside \c "command argument"*/
/** \def COMMAND_STR_LEN
* \brief Specifies the maximum length of a command string*/
/** \fn Bool xte_XTestSupported ( Display *displayLocation );
* \brief Check if the XTest extension is supported
* \param displayLocation The Display to check if XTest is supported on
* \returns True if XTest is supported, False otherwise
* \warning The program using this library is responsible for checking to see if XTest is supported.
*/
/** \fn cvaPoint xte_pointerLocation ( Display *displayLocation );
* \brief Grab the current location of the pointer
* \param displayLocation The Display of which to grab the pointer location from
* \returns cvaPoint with the current location of the pointer
*/
/** \fn void xte_clickMouse ( Display *displayLocation, int mouseButton );
* \brief Click the mouse in its current location
* \details Perform a mouse-down and mouse-up event on button \c mouseButton
* \param displayLocation The Display of which to click the mouse on
* \param mouseButton The mouse button to click
*/
/** \fn void xte_clickMouseXY ( Display *displayLocation, int xLocation, int yLocation, int mouseButton );
* \brief Click the mouse button at an absolute location
* \details Move the mouse to location (\c xLocation, \c yLocation ) and then click button \c mouseButton
* \param displayLocation The Display of which to click the mouse on
* \param xLocation The X-coordinate to move the mouse to before clicking
* \param yLocation The Y-location to move the mouse to before clicking
* \param mouseButton The mouse button to click
*/
/** \fn void xte_clickMouseRXY ( Display *displayLocation, int xIncrement, int yIncrement, int mouseButton );
* \brief Click the mouse button at a relative location
* \details Move the mouse horizontally \c xIncrement and vertically \c yIncrement before clicking button \c mouseButton
* \param displayLocation The Display of which to click the mouse on
* \param xIncrement Move the mouse horizontally this many pixels - positive value is motion to the right
* \param yIncrement Move the mouse vertically this many pixels - positive value is motion downwards
* \param mouseButton The mouse button to click
*/
/** \fn cvaPoint xte_clickMouseImage ( Display *displayLocation, IplImage *subImage, int mouseButton, int searchMethod, int tolerance );
* \brief Click the mouse based on location of an image
* \details Wraps grabbing the X11 root window of \c displayLocation, finding \c subImage in this display, moving the mouse to that location, and then clicking \c mouseButton. The return value can be ignored, the mouse will already have been clicked there.
* \param displayLocation The Display of which to click the mouse on
* \param subImage The sub image (in IplImage format) to find in the root X11 window
* \param mouseButton The mouse button to click
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was clicked. This will be (-1,-1) if there was an error, in which case the mouse will not have been clicked.
*/
/** \fn cvaPoint xte_clickMouseImage_location ( Display *displayLocation, const char *fileName, int mouseButton, int searchMethod, int tolerance );
* \brief Click the mouse based on the location of an image from file
* \details Wraps grabbing the X11 root window of \c displayLocation, finding the sub image from \c fileName in this display, moving the mouse to that location, and then clicking \c mouseButton. The return value can be ignored, the mouse will already have been clicked there.
* \param displayLocation The Display of which to click the mouse on
* \param fileName The file name from which to load the sub-image
* \param mouseButton The mouse button to click
* \param searchMethod The search method to use when searching for the sub image in the root X11 window
* \param tolerance The tolerance to use when searching for the sub image in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was clicked. This will be (-1,-1) if there was an error, in which case the mouse will not have been clicked.
*/
/** \fn cvaPoint xte_clickMouseImage_center ( Display *displayLocation, IplImage *subImage, int mouseButton, int searchMethod, int tolerance );
* \brief Click the mouse based on center location of an image
* \details Wraps grabbing the X11 root window of \c displayLocation, finding the center of \c subImage in this display, moving the mouse to that location, and then clicking \c mouseButton. The return value can be ignored, the mouse will already have been clicked there.
* \param displayLocation The Display of which to click the mouse on
* \param subImage The sub image (in IplImage format) to find in the root X11 window
* \param mouseButton The mouse button to click
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was clicked. This will be (-1,-1) if there was an error, in which case the mouse will not have been clicked.
*/
/** \fn cvaPoint xte_clickMouseImage_location_center ( Display *displayLocation, const char *fileName, int mouseButton, int searchMethod, int tolerance );
* \brief Click the mouse based on the center location of an image from file
* \details Wraps grabbing the X11 root window of \c displayLocation, finding the center location of the sub image from \c fileName in this display, moving the mouse to that location, and then clicking \c mouseButton. The return value can be ignored, the mouse will already have been clicked there.
* \param displayLocation The Display of which to click the mouse on
* \param fileName The file name from which to load the sub-image
* \param mouseButton The mouse button to click
* \param searchMethod The search method to use when searching for the sub image in the root X11 window
* \param tolerance The tolerance to use when searching for the sub image in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was clicked. This will be (-1,-1) if there was an error, in which case the mouse will not have been clicked.
*/
/** \fn void xte_hoverMouseXY ( Display *displayLocation, int xLocation, int yLocation );
* \brief Move the mouse to a location, but do not click it
* \param displayLocation The Display of which to move the mouse
* \param xLocation The X-coordinate of which to move the mouse
* \param yLocation The Y-coordinate of which to move the mouse
*/
/** \fn void xte_hoverMouseRXY ( Display *displayLocation, int xIncrement, int yIncrement );
* \brief Move the mouse to a relative location, but do not click it
* \param displayLocation The Display of which to move the mouse
* \param xIncrement How far to move the mouse horizontally. Positive values indicate motion to the right.
* \param yIncrement How far to move the mouse vertically. Positive values indicate motion downward.
*/
/** \fn cvaPoint xte_hoverMouseImage ( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
* \brief Move the mouse based on location of an image
* \details Wraps grabbing the X11 root window of \c displayLocation, finding \c subImage in this display, and then moving the mouse to that location. The return value can be ignored, the mouse will already have been moved there.
* \param displayLocation The Display of which to move the mouse on
* \param subImage The sub image (in IplImage format) to find in the root X11 window
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was moved. This will be (-1,-1) if there was an error, in which case the mouse will not have been moved.
*/
/** \fn cvaPoint xte_hoverMouseImage_location ( Display *displayLocation, const char *filename, int searchMethod, int tolerance );
* \brief Move the mouse based on location of an image from file
* \details Wraps grabbing the X11 root window of \c displayLocation, finding the sub image from \c fileName in this display, and then moving the mouse to that location. The return value can be ignored, the mouse will already have been moved there.
* \param displayLocation The Display of which to move the mouse on
* \param filename The file name from which to load the sub-image
* \param searchMethod The search method to use when searching for the sub image in the root X11 window
* \param tolerance The tolerance to use when searching for the sub image in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was moved. This will be (-1,-1) if there was an error, in which case the mouse will not have been moved.
*/
/** \fn cvaPoint xte_hoverMouseImage_center ( Display *displayLocation, IplImage *subImage, int searchMethod, int tolerance );
* \brief Move the mouse based on center location of an image
* \details Wraps grabbing the X11 root window of \c displayLocation, finding the center of \c subImage in this display, and then moving the mouse to that location. The return value can be ignored, the mouse will already have been moved there.
* \param displayLocation The Display of which to move the mouse on
* \param subImage The sub image (in IplImage format) to find in the root X11 window
* \param searchMethod The search method to use when searching for \c subImage in the root X11 window
* \param tolerance The tolerance to use when searching for \c subImage in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was moved. This will be (-1,-1) if there was an error, in which case the mouse will not have been moved.
*/
/** \fn cvaPoint xte_hoverMouseImage_location_center ( Display *displayLocation, const char *fileName, int searchMethod, int tolerance );
* \brief Move the mouse based on the center location of an image from file
* \details Wraps grabbing the X11 root window of \c displayLocation, finding the center location of the sub image from \c fileName in this display, and then moving the mouse to that location. The return value can be ignored, the mouse will already have been moved there.
* \param displayLocation The Display of which to move the mouse on
* \param fileName The file name from which to load the sub-image
* \param searchMethod The search method to use when searching for the sub image in the root X11 window
* \param tolerance The tolerance to use when searching for the sub image in the root X11 window
* \see \ref libcv_search_methods
* \returns The location of where the mouse was moved. This will be (-1,-1) if there was an error, in which case the mouse will not have been moved.
*/
/** \fn void xte_mouseDown ( Display *displayLocation, int mouseButton );
* \brief Press a mouse button down, and do not release it
* \param displayLocation The Display of which to push a mouse button down
* \param mouseButton The mouse button to push down
*/
/** \fn void xte_mouseUp ( Display *displayLocation, int mouseButton );
* \brief Release a mouse button
* \param displayLocation The Display of which to release a mouse button
* \param mouseButton The mouse button to release
*/
/** \fn void xte_mouseJiggle ( Display *displayLocation );
* \brief Jiggle the mouse in place
* \details This moves the mouse down and right one pixel, and then back. This may be needed to activate menu items, etc.
* \param displayLocation The Display of which to move the mouse
*/
/** \fn void xte_mouseScrollUp ( Display *displayLocation );
* \brief Scroll the mouse up
* \details This moves the mouse scroll wheel up one rotation, which may be multiple lines. What this really does is click mouse button 4.
* \param displayLocation The Display of which to scroll the mouse
*/
/** \fn void void xte_mouseScrollDown ( Display *displayLocation );
* \brief Scroll the mouse down
* \details This moves the mouse scroll wheel down one rotation, which may be multiple lines. What this really does is click mouse button 5.
* \param displayLocation The Display of which to scroll the mouse
*/
/** \fn void xte_clickKey ( Display *displayLocation, char *key );
* \brief Press and release a keyboard key
* \details This method allows you to press and release a key, where the key may be \c 'a', \c 'b', or maybe something fancy like \c 'space'. Please see \ref XTest_key_strings for a full list of keys.
* \param displayLocation The Display of which to click a key
* \param key The key to click as a string
* \see \ref XTest_key_strings
*/
/** \fn void xte_clickKeyStr ( Display *displayLocation, char *string );
* \brief Input a string of characters to the X Server
* \details Instead of specifying a single character to enter at a time (\c 'a', \c 'space') this function allows you to enter an entire string (\c 'Hello, World!') at a time.
* \param displayLocation The Display of which to enter a key string on
* \param string The key string to input to the X Server
*/
/** \fn void xte_keyDown ( Display *displayLocation, char *key );
* \brief Press a key down, but do not release it
* \details This method allows you to push down a key, where the key may be \c 'a', \c 'b', or maybe something fancy like \c 'space'. Please see \ref XTest_key_strings for a full list of keys.
* \param displayLocation The Display of which to push down a key
* \param key The key to click as a string
* \see \ref XTest_key_strings
*/
/** \fn void xte_keyUp ( Display *displayLocation, char *key );
* \brief Release a key
* \details This method allows you to release a key, where the key may be \c 'a', \c 'b', or maybe something fancy like \c 'space'. Please see \ref XTest_key_strings for a full list of keys.
* \param displayLocation The Display of which to release a key
* \param key The key to click as a string
* \see \ref XTest_key_strings
*/
/** \fn cvaPoint xte_commandString ( Display *displayLocation, char *commandString, int mouseButton, int searchMethod, int tolerance );
* \brief Execute a command where the command is coming from a string
* \details This function allows you to input a command to libcvautomation from a string. For example, to click a mouse button, you would use the \c command 'mouseclick'. Please note that some <tt>command</tt>s may need arguments to the string, and some may use function arguments. See \ref XTest_command_strings for a full list of command and arguments
* \param displayLocation The Display of which to operate on
* \param commandString The command string to execute - limit to \ref COMMAND_STR_LEN characters
* \param mouseButton The mouse button to click if it is needed by the command being executed
* \param searchMethod The search method to use if it is needed by the command being executed
* \param tolerance The tolerance to use if it is needed by the command being executed
* \see \ref XTest_command_strings
* \see \ref libcv_search_methods
*/

View File

@ -1,416 +0,0 @@
/*
* =====================================================================================
*
* Filename: libcvautomation.h
*
* Description: Include wrapper for libcvautomation subsections
*
* Created: 06/21/2012 12:20:43 PM
* Revision: none
* Compiler: gcc
*
* Author: Bradlee Speice (), bspeice.nc@gmail.com
* Organization:
*
* =====================================================================================
*/
#ifndef LIBCVAUTOMATION_H
#define LIBCVAUTOMATION_H
#define LIBCVAUTOMATION_VERSION "1.3"
#define LIBCVAUTOMATION_BUGREPORT "bspeice@uncc.edu"
/* C includes */
#include <stdio.h>
#include <string.h>
/* OpenCV2 includes - some filenames are different
* from the OpenCV1 counterparts */
#include <opencv2/core/core_c.h>
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/imgproc/imgproc_c.h>
/* X11 includes */
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/XTest.h>
/* Define a basic structure to help us with using multiple-picture arguments
* Yes, it's a hackish implementation, nobody said you had to use this one. */
typedef struct {
/* Use one or the other of fileName or cvaImage - cvaImage takes priority */
IplImage *cvaImage;
char *fileName;
CvPoint resultPoint;
int searchMethod;
int tolerance;
} cvautomationList;
/* Define another basic structure for points */
typedef struct {
int x, y;
} cvaPoint;
/* Project component includes */
/* The includes come here to make sure all function prototypes have access
* to the cvautomationList struct */
#include <libcvautomation/libcvautomation-opencv.h>
#include <libcvautomation/libcvautomation-xlib.h>
#include <libcvautomation/libcvautomation-xtest.h>
#endif /* LIBCVAUTOMATION_H */
/* Doxygen information */
/** \file libcvautomation.h
* \brief The top-level include for all projects involving libcvautomation
* \details This source file includes all other files needed for libcvautomation projects, and also defines the cvautomationList and cvaPoint structs to be used among libcvautomation functions. Please note that while the opencv2 version is being documented, there is no actual difference in usage for opencv version 1.
* \author Bradlee Speice
* \date 7/18/2012
*/
/** \mainpage Libcvautomation
* \author Bradlee Speice <<a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a>>
* \date 7/18/2012
* \section intro Introduction
* Welcome to Libcvautomation!
* Libcvautomation is a GUI automation and testing tool based on image recognition and response. This program was designed as a direct replacement for <a href="http://sikuli.org">Sikuli</a> and <a href="https://wiki.ubuntu.com/Xpresser">Xpresser</a>. I was having incredible difficulty getting either of these solutions to work - Sikuli would crash whenever I tried to take a screenshot, and Xpresser was both too new for our Prominent North American Enterprise Linux systems, but also didn't work or \c import correctly. I really liked the way each of these programs approached GUI automation, but they simply didn't work. Additionally, I wanted to create a simple solution - it does what you want it to, and that's it.
* \section how_it_works How Libcvautomation Works
* Libcvautomation represents two software products coming together - <a href="http://opencv.willowgarage.com/wiki/">OpenCV</a> and the <a href="http://www.x.org/docs/Xext/xtest.pdf">XTest extension</a> to the X11 server. OpenCV is used for image recognition, and XTest is used to actually drive the X server. You can dig into \ref libcvautomation-xtest.h to get an idea of what all this library is capable of. <br>
* Basically what happens is that for whenever you need to do image recognition, OpenCV is used to find the images, and XTest is used to generate any events needed. Libcvautomation is mostly a wrapper to integrate both of these products, but also adds some functions like matchSubImage_X11() that allow you to match an image against the X11 root window in place. This means no more <tt>'xwd | convert "<out_name>"'</tt>.
* \section main_using Using Libcvautomation And Writing Application Tests
* So how does one go about using libcvautomation? <br>
* I'm so glad you asked! I've provided a few reference programs - \c cva-match and \c cva-input - that can be used to demonstrate most of libcvautomation's capabilities. I've even provided a BASH wrapper to make it incredibly easy to use BASH with libcvautomation as well (requires that cva-match and cva-input are installed). Python bindings are on their way too. <br>
* Finally, if you want to know how to write your own application tests, please see \ref writing_app_tests for more information on that. I've provided code to give you a basic idea of how they work.
* \section questions Questions? Comments? Concerns?
* Please send any feedback to <<a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a>>. Pull requests can be submitted to <a href="https://github.com/DjBushido/libcvautomation">my github repository</a>.*/
/** \page libcvautomation
* \author Bradlee Speice <<a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a>>
* \date 7/18/2012
* \section intro Introduction
* Welcome to Libcvautomation!
* Libcvautomation is a GUI automation and testing tool based on image recognition and response. This program was designed as a direct replacement for <a href="http://sikuli.org">Sikuli</a> and <a href="https://wiki.ubuntu.com/Xpresser">Xpresser</a>. I was having incredible difficulty getting either of these solutions to work - Sikuli would crash whenever I tried to take a screenshot, and Xpresser was both too new for our Prominent North American Enterprise Linux systems, but also didn't work or \c import correctly. I really liked the way each of these programs approached GUI automation, but they simply didn't work. Additionally, I wanted to create a simple solution - it does what you want it to, and that's it.
* \section how_it_works How Libcvautomation Works
* Libcvautomation represents two software products coming together - <a href="http://opencv.willowgarage.com/wiki/">OpenCV</a> and the <a href="http://www.x.org/docs/Xext/xtest.pdf">XTest extension</a> to the X11 server. OpenCV is used for image recognition, and XTest is used to actually drive the X server. You can dig into \ref libcvautomation-xtest.h to get an idea of what all this library is capable of. <br>
* Basically what happens is that for whenever you need to do image recognition, OpenCV is used to find the images, and XTest is used to generate any events needed. Libcvautomation is mostly a wrapper to integrate both of these products, but also adds some functions like matchSubImage_X11() that allow you to match an image against the X11 root window in place. This means no more <tt>'xwd | convert "<out_name>"'</tt>.
* \section main_using Using Libcvautomation And Writing Application Tests
* So how does one go about using libcvautomation? <br>
* I'm so glad you asked! I've provided a few reference programs - \c cva-match and \c cva-input - that can be used to demonstrate most of libcvautomation's capabilities. I've even provided a BASH wrapper to make it incredibly easy to use BASH with libcvautomation as well (requires that cva-match and cva-input are installed). Python bindings are on their way too. <br>
* Finally, if you want to know how to write your own application tests, please see \ref writing_app_tests for more information on that. I've provided code to give you a basic idea of how they work.
* \section questions Questions? Comments? Concerns?
* Please send any feedback to <<a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a>>. Pull requests can be submitted to <a href="https://github.com/DjBushido/libcvautomation">my github repository</a>.*/
/** \page writing_app_tests Writing Application Tests
* \author Bradlee Speice <<a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a>>
* \date 7/18/2012
* \section audience Audience
* <ul>
* <li>This document was written for people with some intermediate knowledge of BASH.
* <li>Screenshot experience is required - being able to create screenshots of windows using <a href="http://www.gimp.org/">GIMP</a>, the \c import command from <a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>, or something similar. <br>
* <li>Required for working with libcvautomation internals (not needed strictly for writing application testing):
* <ul>
* <li>Intermediate-level C knowledge required for interfacing with libcvautomation. There isn't much complicated going on with libcvautomation itself, but you need to know to use cvaOpenDisplay() for grabbing a display and then cvaCloseDisplay() for closing it later for example.
* <li>C++ is available, but currently only as <tt>extern "C"</tt> style bindings.
* <li>Python bindings are in progress as of time-of-writing
* </ul>
* </ul>
*
* \section purpose Purpose
* <ul>
* <li>This document is intended to outline the libcvautomation testing library for GUI applications and its two reference programs \c cva-match and \c cva-input
* <li>These programs allow you to automate mouse and keyboard events in response to what appears on screen - for example, clicking a button based on an image of that button on screen.
* </ul>
*
* \section using Using Libcvautomation
* <ul>
* <li>Since libcvautomation is a shared-object library intended to bundle a lot of functionality in one area, we must use external programs to agin access to the functions of libcvautomation.
* <li>Two reference programs have been included to make this easy - \c cva-match and \c cva-input
* <li>The reference programs are fairly full-featured, and expose most of libcvautomation:
* <ul>
* <li>\c cva-match allows you to match multiple image files against a root image providing very fine control over how specific the match is
* <li>\c cva-input allows you to drive the X11 server using the XTest extension - for example, clicking on a button from image, clicking a key on the keyboard, and more.
* </ul>
* <li>These two programs should implement all functionality needed for GUI automation. Please contact <a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a> if you have suggestions for extra functionality, patches, comments, etc.
* <li>Finally, if you want to write your own programs using libcvautomation, the headers are located on your system. Use:
* \code #include <libcvautomation/libcvautomation.h> \endcode
* to include all necessary header files. See the "Files" tab above to get an idea of what functionality exists.
* \note Intermediate C or C++ knowledge is required for programming with libcvautomation. C++ is currently only supported through <tt>extern "C"</tt>, and full C++ bindings are not currently planned. Libcvautomation itself is incredibly simple, but interfaces with a few API's (Xlib, libcv) that it is helpful to have an idea of how to use.
*
* \section testing Application Testing
* Now we get into the good stuff. The basic process for application testing is as follows:
* <ul>
* <li>Create a sequence of screenshots for all mouse-clicks
* <li>Create a testing wrapper in BASH for automating the application
* <li>Test the wrapper and tune any necessary options
* </ul>
* \subsection screenshot_sequence Creating the Screenshot Sequence
* <ul>
* <li>This process creates a set of screenshots by which libcvautomation can drive the X11 server
* <li>The process is simple - create a screenshot of all buttons you would like to click in an application test, or location where you would like to move the mouse, etc.
* <li>This can be accomplished a number of different ways - using GIMP, the \c import command, or any other screenshot program. Additionally, libcvautomation will support any image format that OpenCV does. At the time of writing, these are:
* <ul>
* <li>Windows bitmaps - <tt>*.bmp</tt>, <tt>*.dib</tt>
* <li>JPEG files - <tt>*.jpeg</tt>, <tt>*.jpg</tt>, <tt>*.jpe</tt>
* <li>JPEG 2000 files - <tt>*.jp2</tt>
* <li>Portable Network Graphics - <tt>*.png</tt>
* <li>Portable image format - <tt>*.pbm</tt>, <tt>*.pgm</tt>, <tt>*.ppm</tt>
* <li>Sun rasters - <tt>*.sr</tt>, <tt>*.ras</tt>
* <li>TIFF files - <tt>*.tiff</tt>, <tt>*.tif</tt>
* </ul>
* <br>
* <li>Some tips on creating screenshots:
* <ul>
* <li>Use as distinct an image as possible in a screenshot. For example, the following images look very similar, but can do very different things:
* \image html print-printbutton1.png
* <br>
* \image html print-helpbutton.png
* <ul>
* <li>The large amount of grey-space in each of the images can be very confusing. While the text itself is different, the overwhelming amount of grey space can result in a false positive. Limiting the space of the screenshot can be useful:
* \image html print-printbutton2.png
* <br>
* \image html print-helpbutton.png
* <li>Limiting the button size in this case helps the program identify what button you want to click, but in general you want to include as much detail as possible.
* </ul>
* <br>
* <li>Be careful of where an image may appear multiple times in a screenshot. For example, a "Help" button on a dialog may get confused with the "Help" menu at the top of the screen.
* </ul>
*
* \subsection testing_wrapper Create a Testing Wrapper
* <ul>
* <li>This is where the BASH knowledge comes into play. We are going to write a script that will run your application test, to make sure that the GUI is functioning correctly.
* <li>The following is the (strongly) recommended process, but is not strictly necessary to follow this. The way I'm going to explain this is by giving an example test I wrote, and explain what is going on:
* \code
* #!/bin/bash
* #This is an application test involving libcvautomation and libreoffice
* . /usr/local/etc/libcvautomation_funcs
*
* #Changing any wrapper parameters should go here
*
*
* start_libreoffice_writer ()
* {
* click_i "screens/gnome-1_menu.png" "screens/kde-1_menu.png" && sleep 1
* click_i "screens/gnome-2_officeMenu.png" "screens/kde-2_officeMenu.png" && sleep 1
* hover_i "screens/gnome-3_LibreOfficeWriter.png" "screens/kde-3_LibreOfficeWriter.png"
* jiggle_mouse
* click
* sleep 30
* }
*
* close_libreoffice_writer()
* {
* click_i "screens/gnome-4_fileMenu.png" "screens/kde-4_fileMenu.png" && sleep 1
* click_i "screens/gnome-5_fileExit.png" "screens/kde-5_fileExit.png" && sleep 1
* click_i "screens/gnome-6_discard.png" "screens/kde-6_discard.png" && sleep 1
* }
*
* start_libreoffice_writer
* close_libreoffice_writer
* \endcode
* <br>
* \code
* #!/bin/bash
* #This is an application test involving libcvautomation and libreoffice
* . /usr/local/etc/libcvautomation_funcs
* #Changing any wrapper parameters should go here
* \endcode
* <li>The purpose of these lines is just the standard BASH header. Additionally, we import a wrapper created for libcvautomation to make our job easier. Please note that this is the default directory for the wrapper, your installation may be different. Use the command <tt>locate libcvautomation_funcs</tt> to find it on your computer. The wrapper itself is a handful of macros used to make our job easy.
* <li>Changing any wrapper parameters should go after sourcing the wrapper functions. See below on \ref testing_test_wrapper for more information.
* <br><br>
* \code
* start_libreoffice_writer ()
* {
* click_i "screens/gnome-1_menu.png" "screens/kde-1_menu.png" && sleep 1
* click_i "screens/gnome-2_officeMenu.png" "screens/kde-2_officeMenu.png" && sleep 1
* hover_i "screens/gnome-3_LibreOfficeWriter.png" "screens/kde-3_LibreOfficeWriter.png"
* jiggle_mouse
* click
* sleep 30
* }
* \endcode
* <li>This is the actual body of work done by libcvautomation
* <li>\c click_i is a function to click the mouse at an image - in this case, the gnome or kde menu.
* <ul>
* <li>Because of how the cva-input program is designed, you can give it multiple images, and it will only select the one currently available. See \ref testing_test_wrapper for more information on how to use this (TOLERANCE specifically)
* <li>By using the function \c click_i, we make things a bit more readable - the full command line is <tt>cva-input -s 'icmouseclick <filename>'</tt>
* <li>See \ref wrapper_functions for a list of all functions available in the wrapper.
* </ul>
* <li>\c hover_i is a function to move the mouse to an image - in this case, move it over the LibreOffice menu item.
* <li>Then we jiggle the mouse to make sure that the item activates, click, and wait for the program to start up.
* <br><br>
* \code
* close_libreoffice_writer()
* {
* click_i "screens/gnome-4_fileMenu.png" "screens/kde-4_fileMenu.png" && sleep 1
* click_i "screens/gnome-5_fileExit.png" "screens/kde-5_fileExit.png" && sleep 1
* click_i "screens/gnome-6_discard.png" "screens/kde-6_discard.png" && sleep 1
* }
* \endcode
* <li>Use the \c click_i function to close down LibreOffice writer - Find the "File" menu, click "Exit", and then make sure to discard all changes.
* <br><br>
* \code
* start_libreoffice_writer
* close_libreoffice_writer
* \endcode
* <li>Actually run the functions given.
* <br><br>
* <li>Please note that this is a fairly trivial example. The full list of commands available in the wrapper is given in \ref wrapper_functions
* </ul>
*
* \subsection testing_test_wrapper Testing the Testing Wrapper
* <ul>
* <li>First things first, run through the testing wrapper to make sure that everything is O.K.
* <li>If you need to, some things you can do to tune the application test are as follows:
* <ul>
* <li>Set the \c SEARCH_METHOD
* <ul>
* <li>This value adjusts how libcvautomation searches for sub-images. See \ref libcv_search_methods for more information on accepted values, and how each works.
* </ul>
* <li>Set the \c TOLERANCE
* <ul>
* <li>This value adjusts how strict libcvautomation is when trying to find a sub-image. See \ref libcv_search_methods for more information on how to control how libcvautomation searches for images.
* </ul>
* <li>Set \c USE_SANE_TOLERANCE
* <ul>
* <li>This value implements a more sane way of setting the tolerance value - Where normally the tolerance ranges from \c INT_MIN to \c INT_MAX, the sane tolerance accepts values of 1 - 100 (\f$ 1 \approx 0 \f$, and \f$ 100 \approx INT\_MAX \f$)
* <li>To enable sane tolerance, set: \code USE_SANE_TOLERANCE="<any_value>" \endcode
* <li>To disable sane tolerance (the default) set: \code USE_SANE_TOLERANCE="" \endcode
* <li>Set \c USE_CENTER
* <ul>
* <li>By default, the wrapper will use the center of an image as opposed to the upper-left corner to click on. To disable this behavior, set: \code USE_CENTER="" \endcode
* <li>To set the behavior back to using center-based matching, set: \code USE_CENTER="<any_value>" \endcode
* </ul>
* <li>Set the \c OUTFILE and \c ERRFILE
* <ul>
* <li>The application wrapper logs a whole lot of information about what it does to make debugging easy. However, to make sure that you're not overwhelmed by the output, the wrapper also directs the output to <tt>/dev/null</tt> by default.
* <li>To redirect the output of \c OUTFILE and \c ERRFILE, set them to any file you want. For example, the following code will create a temporary file for OUTFILE and ERRFILE, and notify you of what they are:
* \code
* OUTFILE=`mktemp`
* ERRFILE=`mktemp`
* echo "OUTFILE location: $OUTFILE"
* echo "ERRFILE location: $ERRFILE"
* \endcode
* </ul>
* </ul>
* <li>A full list of commands provided by the wrapper is available at \ref wrapper_functions
* </ul>
*
* \note These options are controlled using the testing script as demonstrated above. Any modifications to the following values should be done at the line: \code #Changing any wrapper parameters should go here \endcode
* </ul>
* \section wrapping_up Wrapping Up
* <ul>
* <li>At this point you should have all the information you need to write your own application tests. The libcvautomation library and reference programs were designed to be simple and powerful, but if you invest the time to learn them and some expert BASH scripting, you can do some very complex things.
* <ul>
* <li>For example, integrating a <a href="http://testanything.org/wiki/index.php/Tap-functions">Test Anything Protocol</a> wrapper into your scripts as well.
* </ul>
* <li>If you have questions, comments, concerns, suggestions, or feedback in general, feel free to let me know at <a href="mailto:bspeice@uncc.edu">bspeice@uncc.edu</a>.
* </ul>
*/
/** \page wrapper_functions Appendix of Wrapper Functions
* \section appendix_click Click the mouse
* \code click \endcode
* Click the mouse where it is currently located
* <br><br>
*
* \code click_xy <x-coordinate> <y-coordinate> \endcode
* Click the mouse on an absolute point on screen
* \note The actual process is to move the mouse to the given location, then click there.
* <br><br>
*
* \code clickr_xy <x-increment> <y-increment> \endcode
* Click the mouse on the screen relative to where the mouse is at
* \note The actual process is to move the mouse the given distance, then click there.
* \note Also, note that a positive \c x-increment moves the mouse to the right, and a positive \c y-increment moves the mouse down.
* <br><br>
*
* \code click_i <filename> \endcode
* Click the mouse on a screenshot from \c filename
* \note This is affected by the \c CENTER, \c TOLERANCE, and \c SEARCH_METHOD variables. See \ref testing_test_wrapper for more information on these.
* <br><br>
*
* \section appendix_move Move the mouse
* \code hover_xy <x-coordinate> <y-increment> \endcode
* Move the mouse to a location on screen using absolute positioning
* <br><br>
*
* \code hoverr_xy <x-increment> <y-increment> \endcode
* Move the mouse to a location on screen using relative positioning
* \note Note that a positive \c x-increment moves the mouse to the right, and a positive \c y-increment moves the mouse down.
* <br><br>
*
* \code hover_i <filename> \endcode
* Move the mouse to a location on screen based on screenshot
* \note This is affected by the \c CENTER, \c TOLERANCE, and \c SEARCH_METHOD variables. See \ref testing_test_wrapper for more information on these.
* <br><br>
*
* \code mouse_scrollu \endcode
* Scroll the mouse wheel up one
*
* \code mouse_scrolld \endcode
* Scroll the mouse wheel down one
*
* \section appendix_find Find an Image
* \code image_location <filename> \endcode
* Get the location of an image on screen
* \note This is affected by the \c CENTER, \c TOLERANCE, and \c SEARCH_METHOD variables. See \ref testing_test_wrapper for more information on these.
* <br><br>
*
* \section appendix_keyboard Click the keyboard
* \code key_str "<string>" \endcode
* Enter a string of characters on the keyboard rather than a single character at a time.
* \warning This function <b>does not</b> accept key strings like "Space" as \c key_down, \c key_up, and \c key_click do. If you pass in "Space", that is exactly what will be typed.
* <br><br>
*
* \code key_down "<key-name>" \endcode
* Press a key down and leave it down
* \note This function accepts special keys like "Space" - see \ref XTest_key_strings for a full list of characters allowed.
* <br><br>
*
* \code key_up "<key-name>" \endcode
* Release a key
* \note This function accepts special keys like "Space" - see \ref XTest_key_strings for a full list of characters allowed.
* <br><br>
*
* \code key_click "<key-name>" \endcode
* Press a key down and then release it immediately after
* \note This function accepts special keys like "Space" - see \ref XTest_key_strings for a full list of characters allowed.
* <br><br>
*
* \section appendix_utilities Useful extras
* \code run_process "<process-name>" \endcode
* Start a process on the system, background it, and return the PID of the created process.
* <br><br>
*
* \code is_running "<process-name>" \endcode
* \code is_running "<process-id>" \endcode
* Check if a program name or PID is currently running
*
* \code notify "<string_to_display>" \endcode
* Display a notification to the user, and wait for a response
* \warning Uses \c zenity - if \c zenity isn't available, will return an error without pausing, and will not display anything.
*/
/** \def LIBCVAUTOMATION_VERSION
* \brief Define what version of Libcvautomation we are using
* \details This define provides access to what version of Libcvautomation we're using. All times that you need to know what it is should use this.
*/
/** \def LIBCVAUTOMATION_BUGREPORT
* \brief Define who to send bug reports to for Libcvautomation
* \details This define provides access to who should be emailed in case of a Libcvautomation bug. All times that you need to know what it is should use this.*/
/** \struct cvautomationList
* \brief Implements a structure to build an array for methods like matchSubImage_a()
* \details This structure is a simple way to wrap up all needed information for matching sub images in one location.
* \param cvaImage An image in IplImage format
* \param fileName The file location of an image to be loaded
* \param resultPoint Holder for a result - for example, storing where this sub image was located in its root image
* \param searchMethod The search method to use when searching for this sub image in a root image
* \param tolerance The tolerance to use when searching for this sub image in a root image
* \see \ref libcv_search_methods
*/
/** \struct cvaPoint
* \brief Very simple structure to standardize how points are used in libcvautomation
* \param x An X-coordinate
* \param y A Y-coordinate */

View File

@ -1,30 +0,0 @@
/*
*
* Copyright (c) 2002 Steve Slaven, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
#define NUM_KEY_MODIFIERS 3
/* ISO_Level3_Shift = AltGr */
char *key_modifiers[] = { NULL, "Mode_switch", "ISO_Level3_Shift" };
char *shift_key = "Shift_L";
#define MAX_KEYSYM 65536
/* this maps what keysyms need a modifier pushed */
int keysym_to_modifier_map[ MAX_KEYSYM ];
KeyCode keysym_to_keycode_map[ MAX_KEYSYM ];

View File

@ -1,806 +0,0 @@
/* keysym_map.h - Maps the unicode number of charactes to X11 keysym codes.
* The first element in the array is unicode number 0x0100.
* Latin-1 characters (keysym = unicode_number <= 0xff) and newer
* characters (keysym = unicode_number + 0x01000000) are not included.
*
* Marco Steinacher <marco@websource.ch> - 12.04.2009
*
* The contents below have been created from /usr/include/X11/keysymdef.h with the following
* perl script:
---------------
#!/usr/bin/perl -w
$max=0;
while ($l = <>) {
if ($l =~ m/^#define\s+\S+\s+0x([0-9a-f]{4})\s*\/\*[ (]*U\+([0-9a-f]{4})/i) {
$shifted = hex($2) - hex("0x0100");
if (($shifted >= 0) && !defined($map[$shifted])) {
$map[$shifted] = $1;
$max=$shifted if ($shifted>$max);
}
}
}
print "#define WCHAR_TO_KEYSYM_MAP_SIZE ".($max+1)."\n";
print "uint16_t wchar_to_keysym_map[] = { ";
for($u=0;$u<=$max;$u++) {
print "," if ($u>0);
print "\n" if ($u%16==0);
if (defined($map[$u])) {
print "0x".$map[$u];
} else {
print "0";
}
}
print "\n};\n";
---------------
*/
#define WCHAR_TO_KEYSYM_MAP_SIZE 12285
uint16_t wchar_to_keysym_map[] = {
0x03c0,0x03e0,0x01c3,0x01e3,0x01a1,0x01b1,0x01c6,0x01e6,0x02c6,0x02e6,0x02c5,0x02e5,0x01c8,0x01e8,0x01cf,0x01ef,
0x01d0,0x01f0,0x03aa,0x03ba,0,0,0x03cc,0x03ec,0x01ca,0x01ea,0x01cc,0x01ec,0x02d8,0x02f8,0x02ab,0x02bb,
0x02d5,0x02f5,0x03ab,0x03bb,0x02a6,0x02b6,0x02a1,0x02b1,0x03a5,0x03b5,0x03cf,0x03ef,0,0,0x03c7,0x03e7,
0x02a9,0x02b9,0,0,0x02ac,0x02bc,0x03d3,0x03f3,0x03a2,0x01c5,0x01e5,0x03a6,0x03b6,0x01a5,0x01b5,0,
0,0x01a3,0x01b3,0x01d1,0x01f1,0x03d1,0x03f1,0x01d2,0x01f2,0,0x03bd,0x03bf,0x03d2,0x03f2,0,0,
0x01d5,0x01f5,0x13bc,0x13bd,0x01c0,0x01e0,0x03a3,0x03b3,0x01d8,0x01f8,0x01a6,0x01b6,0x02de,0x02fe,0x01aa,0x01ba,
0x01a9,0x01b9,0x01de,0x01fe,0x01ab,0x01bb,0x03ac,0x03bc,0x03dd,0x03fd,0x03de,0x03fe,0x02dd,0x02fd,0x01d9,0x01f9,
0x01db,0x01fb,0x03d9,0x03f9,0,0,0,0,0x13be,0x01ac,0x01bc,0x01af,0x01bf,0x01ae,0x01be,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0x08f6,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0x01b7,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x01a2,0x01ff,0,0x01b2,0,0x01bd,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,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,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,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,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,0,0,
0,0,0,0,0,0x07ae,0x07a1,0,0x07a2,0x07a3,0x07a4,0,0x07a7,0,0x07a8,0x07ab,
0x07b6,0x07c1,0x07c2,0x07c3,0x07c4,0x07c5,0x07c6,0x07c7,0x07c8,0x07c9,0x07ca,0x07cb,0x07cc,0x07cd,0x07ce,0x07cf,
0x07d0,0x07d1,0,0x07d2,0x07d4,0x07d5,0x07d6,0x07d7,0x07d8,0x07d9,0x07a5,0x07a9,0x07b1,0x07b2,0x07b3,0x07b4,
0x07ba,0x07e1,0x07e2,0x07e3,0x07e4,0x07e5,0x07e6,0x07e7,0x07e8,0x07e9,0x07ea,0x07eb,0x07ec,0x07ed,0x07ee,0x07ef,
0x07f0,0x07f1,0x07f3,0x07f2,0x07f4,0x07f5,0x07f6,0x07f7,0x07f8,0x07f9,0x07b5,0x07b9,0x07b7,0x07b8,0x07bb,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,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0x06b3,0x06b1,0x06b2,0x06b4,0x06b5,0x06b6,0x06b7,0x06b8,0x06b9,0x06ba,0x06bb,0x06bc,0,0x06be,0x06bf,
0x06e1,0x06e2,0x06f7,0x06e7,0x06e4,0x06e5,0x06f6,0x06fa,0x06e9,0x06ea,0x06eb,0x06ec,0x06ed,0x06ee,0x06ef,0x06f0,
0x06f2,0x06f3,0x06f4,0x06f5,0x06e6,0x06e8,0x06e3,0x06fe,0x06fb,0x06fd,0x06ff,0x06f9,0x06f8,0x06fc,0x06e0,0x06f1,
0x06c1,0x06c2,0x06d7,0x06c7,0x06c4,0x06c5,0x06d6,0x06da,0x06c9,0x06ca,0x06cb,0x06cc,0x06cd,0x06ce,0x06cf,0x06d0,
0x06d2,0x06d3,0x06d4,0x06d5,0x06c6,0x06c8,0x06c3,0x06de,0x06db,0x06dd,0x06df,0x06d9,0x06d8,0x06dc,0x06c0,0x06d1,
0,0x06a3,0x06a1,0x06a2,0x06a4,0x06a5,0x06a6,0x06a7,0x06a8,0x06a9,0x06aa,0x06ab,0x06ac,0,0x06ae,0x06af,
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,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x06bd,0x06ad,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,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,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,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,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,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,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,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,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,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,
0x0ce0,0x0ce1,0x0ce2,0x0ce3,0x0ce4,0x0ce5,0x0ce6,0x0ce7,0x0ce8,0x0ce9,0x0cea,0x0ceb,0x0cec,0x0ced,0x0cee,0x0cef,
0x0cf0,0x0cf1,0x0cf2,0x0cf3,0x0cf4,0x0cf5,0x0cf6,0x0cf7,0x0cf8,0x0cf9,0x0cfa,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,0,0x05ac,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0x05bb,0,0,0,0x05bf,
0,0x05c1,0x05c2,0x05c3,0x05c4,0x05c5,0x05c6,0x05c7,0x05c8,0x05c9,0x05ca,0x05cb,0x05cc,0x05cd,0x05ce,0x05cf,
0x05d0,0x05d1,0x05d2,0x05d3,0x05d4,0x05d5,0x05d6,0x05d7,0x05d8,0x05d9,0x05da,0,0,0,0,0,
0x05e0,0x05e1,0x05e2,0x05e3,0x05e4,0x05e5,0x05e6,0x05e7,0x05e8,0x05e9,0x05ea,0x05eb,0x05ec,0x05ed,0x05ee,0x05ef,
0x05f0,0x05f1,0x05f2,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0x0da1,0x0da2,0x0da3,0x0da4,0x0da5,0x0da6,0x0da7,0x0da8,0x0da9,0x0daa,0x0dab,0x0dac,0x0dad,0x0dae,0x0daf,
0x0db0,0x0db1,0x0db2,0x0db3,0x0db4,0x0db5,0x0db6,0x0db7,0x0db8,0x0db9,0x0dba,0x0dbb,0x0dbc,0x0dbd,0x0dbe,0x0dbf,
0x0dc0,0x0dc1,0x0dc2,0x0dc3,0x0dc4,0x0dc5,0x0dc6,0x0dc7,0x0dc8,0x0dc9,0x0dca,0x0dcb,0x0dcc,0x0dcd,0x0dce,0x0dcf,
0x0dd0,0x0dd1,0x0dd2,0x0dd3,0x0dd4,0x0dd5,0x0dd6,0x0dd7,0x0dd8,0x0dd9,0x0dda,0,0,0,0,0x0ddf,
0x0de0,0x0de1,0x0de2,0x0de3,0x0de4,0x0de5,0x0de6,0x0de7,0x0de8,0x0de9,0x0dea,0x0deb,0x0dec,0x0ded,0,0,
0x0df0,0x0df1,0x0df2,0x0df3,0x0df4,0x0df5,0x0df6,0x0df7,0x0df8,0x0df9,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,
0,0,0x0aa2,0x0aa1,0x0aa3,0x0aa4,0,0x0aa5,0x0aa6,0x0aa7,0x0aa8,0,0,0,0,0,
0,0,0x0abb,0x0aaa,0x0aa9,0x07af,0,0x0cdf,0x0ad0,0x0ad1,0x0afd,0,0x0ad2,0x0ad3,0x0afe,0,
0x0af1,0x0af2,0x0ae6,0,0,0x0aaf,0x0aae,0,0,0,0,0,0,0,0,0,
0,0,0x0ad6,0x0ad7,0,0,0,0,0x0afc,0,0,0,0,0,0x047e,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,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,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,0,
0,0,0,0,0,0,0,0,0,0x0eff,0,0,0x20ac,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,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,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x0ab8,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0x06b0,0x0afb,0,0,0,0,0,0,0x0ad4,0,
0,0,0x0ac9,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,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0x0ab0,0x0ab1,0x0ab2,0x0ab3,0x0ab4,0x0ab5,0x0ab6,0x0ab7,0x0ac3,0x0ac4,0x0ac5,0x0ac6,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,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x08fb,0x08fc,0x08fd,0x08fe,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,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,0x08ce,0,0x08cd,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,0,0,0,0,0,0,0,0,0,0,0,
0,0,0x08ef,0,0,0,0,0x08c5,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x0bca,0,0x08d6,0,0,0x08c1,0x08c2,0,
0,0,0,0,0,0,0,0x08de,0x08df,0x08dc,0x08dd,0x08bf,0,0,0,0,
0,0,0,0,0x08c0,0,0,0,0,0,0,0,0x08c8,0,0,0,
0,0,0,0x08c9,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,
0x08bd,0x08cf,0,0,0x08bc,0x08be,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,0x08da,0x08db,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,0x0bdc,0x0bfc,0x0bce,0x0bc2,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,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,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,0,0,0x0bd3,0,0x0bc4,0,0,0,0,0,
0,0,0,0,0,0x0afa,0,0,0,0,0,0,0,0,0,0,
0x08a4,0x08a5,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0x0bcc,0,0,0,0,0,0x08ab,0,0x08ac,0x08ad,0,
0x08ae,0x08a7,0,0x08a8,0x08a9,0,0x08aa,0,0x08af,0,0,0,0x08b0,0,0,0,
0,0,0,0,0,0,0,0x08a1,0,0,0x09ef,0x09f0,0x09f2,0x09f3,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,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,0,0,
0,0,0,0,0,0,0,0,0,0x09e2,0x09e5,0x09e9,0x09e3,0x09e4,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0x0aac,0x09e8,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,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,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,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,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,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,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,
0x08a3,0,0x08a6,0,0,0,0,0,0,0,0,0,0x08a2,0,0,0,
0x09eb,0,0,0,0x09ed,0,0,0,0x09ea,0,0,0,0x09f4,0,0,0,
0,0,0,0,0x09f5,0,0,0,0,0,0,0,0x09f7,0,0,0,
0,0,0,0,0x09f6,0,0,0,0,0,0,0,0x09ee,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,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,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0x09e1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x0ae7,0x0ae1,0x0adb,0x0ae2,0x0adf,0x0acf,
0,0,0x0ae8,0x0ae3,0,0,0x0add,0x0acd,0,0,0,0,0x0ae9,0x0ae4,0,0,
0x0adc,0x0acc,0,0,0,0,0x09e0,0,0,0,0,0x0ace,0,0,0,0x0ade,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0x0ae0,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,0x0ae5,0,0,0,0,0,0,0,0x0af9,0,
0,0,0,0x0aca,0,0,0,0,0,0,0,0,0x0aea,0,0x0aeb,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,0,
0x0af8,0,0x0af7,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,0x0aec,0,0x0aee,0x0aed,0,0,0,0,0,0,0x0af6,0,0x0af5,
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,
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,
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,
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,
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,
0,0,0,0x0af3,0,0,0,0x0af4,0,0,0,0,0,0x0ad9,0,0,
0x0af0,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,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,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,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,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,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,0,0,0,0,0,0,0,0x0abc,0x0abe,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0x04a4,0x04a1,0,0,0,0,0,0,0,0,0,0x04a2,0x04a3,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,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,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,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,0,0,
0,0,0,0,0,0,0,0,0,0,0,0x04de,0x04df,0,0,0,
0,0x04a7,0x04b1,0x04a8,0x04b2,0x04a9,0x04b3,0x04aa,0x04b4,0x04ab,0x04b5,0x04b6,0,0x04b7,0,0x04b8,
0,0x04b9,0,0x04ba,0,0x04bb,0,0x04bc,0,0x04bd,0,0x04be,0,0x04bf,0,0x04c0,
0,0x04c1,0,0x04af,0x04c2,0,0x04c3,0,0x04c4,0,0x04c5,0x04c6,0x04c7,0x04c8,0x04c9,0x04ca,
0,0,0x04cb,0,0,0x04cc,0,0,0x04cd,0,0,0x04ce,0,0,0x04cf,0x04d0,
0x04d1,0x04d2,0x04d3,0x04ac,0x04d4,0x04ad,0x04d5,0x04ae,0x04d6,0x04d7,0x04d8,0x04d9,0x04da,0x04db,0,0x04dc,
0,0,0x04a6,0x04dd,0,0,0,0,0,0,0,0x04a5,0x04b0
};

View File

@ -1,298 +0,0 @@
/* multikey_map.h - Multi_key combinations for some characters:
* <Character> = Multi_key + <Fist> + <Second>
* The unicode numbers of <Character>, <Fist>,
* and <Second> are in the arrays below.
*
* Marco Steinacher <marco@websource.ch> - 12.04.2009
*
* Combinations that don't start with Multi_key or require more
* than two characters are currently not supported.
*
* The contents below have been created from /usr/share/X11/locale/en_US.UTF-8/Compose
* and /usr/include/X11/keysymdef.h with the following (very slow) perl script:
---------------
#!/usr/bin/perl -w
$compose_file = "/usr/share/X11/locale/en_US.UTF-8/Compose";
$keysym_file = "/usr/include/X11/keysymdef.h";
open(FH,"<:encoding(UTF-8)",$compose_file);
while ($l = <FH>) {
if ($l =~ m/^\s*<Multi_key>\s+<(\S+)>\s+<(\S+)>\s+:\s+"(.)"/) {
$utf8 = sprintf("%x",ord($3));
next if (length($utf8)>4);
$first = get_utf8($1);
$second = get_utf8($2);
if ($first && $second) {
$map_first{$utf8} = $first;
$map_second{$utf8} = $second;
}
}
}
close(FH);
$char = "uint16_t multikey_map_char[] = { ";
$first = "uint16_t multikey_map_first[] = { ";
$second = "uint16_t multikey_map_second[] = { ";
$count=0;
foreach $c (sort { hex($a) <=> hex($b)} keys %map_first) {
if ($count != 0) {
$char.=",";
$first.=",";
$second.=",";
}
if ($count%16==0) {
$char.="\n";
$first.="\n";
$second.="\n";
}
$char.="0x".$c;
$first.="0x".$map_first{$c};
$second.="0x".$map_second{$c};
$count++;
}
$char.="\n};\n";
$first.="\n};\n";
$second.="\n};\n";
print "#define MULTIKEY_MAP_SIZE ".$count."\n";
print $char.$first.$second;
sub get_utf8 {
$sym = shift;
return $1 if ($sym =~ m/^U([0-9a-f]{4})$/i);
$cmd = "grep \"#define XK_".$sym." \" ".$keysym_file;
$re = "^#define\\s+XK_".$sym."\\s+0x[0-9a-f]+\\s*\\/\\*[ (]*U\\+([0-9a-f]{4})";
return $1 if (`$cmd` =~ m/$re/i);
return 0;
}
---------------
*/
#define MULTIKEY_MAP_SIZE 1195
uint16_t multikey_map_char[] = {
0x23,0x27,0x40,0x5b,0x5d,0x5e,0x60,0x7b,0x7c,0x7d,0x7e,0xa0,0xa1,0xa2,0xa3,0xa4,
0xa5,0xa6,0xa7,0xa9,0xab,0xac,0xae,0xb0,0xb1,0xb2,0xb3,0xb5,0xb6,0xb7,0xb8,0xb9,
0xbb,0xbc,0xbd,0xbe,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,
0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
0xdb,0xdc,0xdd,0xde,0xdf,0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
0xeb,0xec,0xed,0xee,0xef,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
0xfb,0xfc,0xfd,0xfe,0xff,0x100,0x101,0x102,0x103,0x104,0x105,0x106,0x107,0x108,0x109,0x10a,
0x10b,0x10c,0x10d,0x10e,0x10f,0x110,0x111,0x112,0x113,0x114,0x115,0x116,0x117,0x118,0x119,0x11a,
0x11b,0x11c,0x11d,0x11e,0x11f,0x120,0x121,0x122,0x123,0x124,0x125,0x126,0x127,0x128,0x129,0x12a,
0x12b,0x12c,0x12d,0x12e,0x12f,0x130,0x131,0x134,0x135,0x136,0x137,0x138,0x139,0x13a,0x13b,0x13c,
0x13d,0x13e,0x141,0x142,0x143,0x144,0x145,0x146,0x147,0x148,0x14a,0x14b,0x14c,0x14d,0x14e,0x14f,
0x150,0x151,0x152,0x153,0x154,0x155,0x156,0x157,0x158,0x159,0x15a,0x15b,0x15c,0x15d,0x15e,0x15f,
0x160,0x161,0x162,0x163,0x164,0x165,0x166,0x167,0x168,0x169,0x16a,0x16b,0x16c,0x16d,0x16e,0x16f,
0x170,0x171,0x172,0x173,0x174,0x175,0x176,0x177,0x178,0x179,0x17a,0x17b,0x17c,0x17d,0x17e,0x17f,
0x180,0x197,0x1a0,0x1a1,0x1af,0x1b0,0x1b5,0x1b6,0x1cd,0x1ce,0x1cf,0x1d0,0x1d1,0x1d2,0x1d3,0x1d4,
0x1d5,0x1d6,0x1d7,0x1d8,0x1d9,0x1da,0x1db,0x1dc,0x1de,0x1df,0x1e0,0x1e1,0x1e2,0x1e3,0x1e4,0x1e5,
0x1e6,0x1e7,0x1e8,0x1e9,0x1ea,0x1eb,0x1ec,0x1ed,0x1ee,0x1ef,0x1f0,0x1f4,0x1f5,0x1f8,0x1f9,0x1fa,
0x1fb,0x1fc,0x1fd,0x1fe,0x1ff,0x21e,0x21f,0x226,0x227,0x228,0x229,0x22a,0x22b,0x22c,0x22d,0x22e,
0x22f,0x230,0x231,0x232,0x233,0x259,0x268,0x2a1,0x344,0x385,0x386,0x388,0x389,0x38a,0x38c,0x38e,
0x38f,0x390,0x3aa,0x3ab,0x3ac,0x3ad,0x3ae,0x3af,0x3b0,0x3ca,0x3cb,0x3cc,0x3cd,0x3ce,0x3d4,0x400,
0x401,0x403,0x407,0x40c,0x40d,0x40e,0x419,0x439,0x450,0x451,0x453,0x457,0x45c,0x45d,0x45e,0x492,
0x493,0x49e,0x49f,0x4b0,0x4b1,0x4c1,0x4c2,0x4d0,0x4d1,0x4d2,0x4d3,0x4d6,0x4d7,0x4da,0x4db,0x4dc,
0x4dd,0x4de,0x4df,0x4e2,0x4e3,0x4e4,0x4e5,0x4e6,0x4e7,0x4ea,0x4eb,0x4ec,0x4ed,0x4ee,0x4ef,0x4f0,
0x4f1,0x4f2,0x4f3,0x4f4,0x4f5,0x4f8,0x4f9,0x622,0x623,0x624,0x625,0x626,0x6c0,0x6c2,0x6d3,0x929,
0x931,0x934,0x958,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x95f,0x9cb,0x9cc,0x9dc,0x9dd,0x9df,0xa33,
0xa36,0xa59,0xa5a,0xa5b,0xa5e,0xb48,0xb4b,0xb4c,0xb5c,0xb5d,0xb94,0xbca,0xbcb,0xbcc,0xc48,0xcc0,
0xcc7,0xcc8,0xcca,0xccb,0xd4a,0xd4b,0xd4c,0xdda,0xddc,0xddd,0xdde,0xf43,0xf4d,0xf52,0xf57,0xf5c,
0xf69,0xf73,0xf75,0xf76,0xf78,0xf81,0xf93,0xf9d,0xfa2,0xfa7,0xfac,0xfb9,0x1026,0x1101,0x1104,0x1108,
0x110a,0x110d,0x1113,0x1114,0x1115,0x1116,0x1117,0x1118,0x1119,0x111a,0x111b,0x111c,0x111d,0x111e,0x111f,0x1120,
0x1121,0x1122,0x1123,0x1124,0x1125,0x1126,0x1127,0x1128,0x1129,0x112a,0x112b,0x112c,0x112d,0x112e,0x112f,0x1130,
0x1131,0x1132,0x1133,0x1134,0x1135,0x1136,0x1137,0x1138,0x1139,0x113a,0x113b,0x113d,0x113f,0x1141,0x1142,0x1143,
0x1144,0x1145,0x1146,0x1147,0x1148,0x1149,0x114a,0x114b,0x114d,0x114f,0x1151,0x1152,0x1153,0x1156,0x1157,0x1158,
0x1162,0x1164,0x1166,0x1168,0x116a,0x116b,0x116c,0x116f,0x1170,0x1171,0x1174,0x1176,0x1177,0x1178,0x1179,0x117a,
0x117b,0x117c,0x117d,0x117e,0x117f,0x1180,0x1181,0x1182,0x1183,0x1184,0x1185,0x1186,0x1187,0x1188,0x1189,0x118a,
0x118b,0x118c,0x118d,0x118e,0x118f,0x1190,0x1191,0x1192,0x1193,0x1194,0x1195,0x1196,0x1197,0x1198,0x1199,0x119a,
0x119b,0x119c,0x119d,0x119f,0x11a0,0x11a1,0x11a2,0x11a9,0x11aa,0x11ac,0x11ad,0x11b0,0x11b1,0x11b2,0x11b3,0x11b4,
0x11b5,0x11b6,0x11b9,0x11bb,0x11c3,0x11c4,0x11c5,0x11c6,0x11c7,0x11c8,0x11c9,0x11ca,0x11cb,0x11cc,0x11cd,0x11ce,
0x11cf,0x11d0,0x11d1,0x11d2,0x11d3,0x11d4,0x11d5,0x11d6,0x11d7,0x11d8,0x11d9,0x11da,0x11db,0x11dc,0x11dd,0x11de,
0x11df,0x11e0,0x11e1,0x11e2,0x11e3,0x11e4,0x11e5,0x11e6,0x11e7,0x11e8,0x11e9,0x11ea,0x11ec,0x11ed,0x11ee,0x11ef,
0x11f1,0x11f2,0x11f3,0x11f4,0x11f5,0x11f6,0x11f7,0x11f8,0x1e02,0x1e03,0x1e04,0x1e05,0x1e08,0x1e09,0x1e0a,0x1e0b,
0x1e0c,0x1e0d,0x1e10,0x1e11,0x1e14,0x1e15,0x1e16,0x1e17,0x1e1c,0x1e1d,0x1e1e,0x1e1f,0x1e20,0x1e21,0x1e22,0x1e23,
0x1e24,0x1e25,0x1e26,0x1e27,0x1e28,0x1e29,0x1e2e,0x1e2f,0x1e30,0x1e31,0x1e32,0x1e33,0x1e36,0x1e37,0x1e38,0x1e39,
0x1e3e,0x1e3f,0x1e40,0x1e41,0x1e42,0x1e43,0x1e44,0x1e45,0x1e46,0x1e47,0x1e4c,0x1e4d,0x1e4e,0x1e4f,0x1e50,0x1e51,
0x1e52,0x1e53,0x1e54,0x1e55,0x1e56,0x1e57,0x1e58,0x1e59,0x1e5a,0x1e5b,0x1e5c,0x1e5d,0x1e60,0x1e61,0x1e62,0x1e63,
0x1e64,0x1e65,0x1e66,0x1e67,0x1e68,0x1e69,0x1e6a,0x1e6b,0x1e6c,0x1e6d,0x1e78,0x1e79,0x1e7a,0x1e7b,0x1e7c,0x1e7d,
0x1e7e,0x1e7f,0x1e80,0x1e81,0x1e82,0x1e83,0x1e84,0x1e85,0x1e86,0x1e87,0x1e88,0x1e89,0x1e8a,0x1e8b,0x1e8c,0x1e8d,
0x1e8e,0x1e8f,0x1e90,0x1e91,0x1e92,0x1e93,0x1e97,0x1e98,0x1e99,0x1e9b,0x1ea0,0x1ea1,0x1ea2,0x1ea3,0x1ea4,0x1ea5,
0x1ea6,0x1ea7,0x1ea8,0x1ea9,0x1eaa,0x1eab,0x1eac,0x1ead,0x1eae,0x1eaf,0x1eb0,0x1eb1,0x1eb2,0x1eb3,0x1eb4,0x1eb5,
0x1eb6,0x1eb7,0x1eb8,0x1eb9,0x1eba,0x1ebb,0x1ebc,0x1ebd,0x1ebe,0x1ebf,0x1ec0,0x1ec1,0x1ec2,0x1ec3,0x1ec4,0x1ec5,
0x1ec6,0x1ec7,0x1ec8,0x1ec9,0x1eca,0x1ecb,0x1ecc,0x1ecd,0x1ece,0x1ecf,0x1ed0,0x1ed1,0x1ed2,0x1ed3,0x1ed4,0x1ed5,
0x1ed6,0x1ed7,0x1ed8,0x1ed9,0x1eda,0x1edb,0x1edc,0x1edd,0x1ede,0x1edf,0x1ee0,0x1ee1,0x1ee2,0x1ee3,0x1ee4,0x1ee5,
0x1ee6,0x1ee7,0x1ee8,0x1ee9,0x1eea,0x1eeb,0x1eec,0x1eed,0x1eee,0x1eef,0x1ef0,0x1ef1,0x1ef2,0x1ef3,0x1ef4,0x1ef5,
0x1ef6,0x1ef7,0x1ef8,0x1ef9,0x1f00,0x1f01,0x1f02,0x1f03,0x1f04,0x1f05,0x1f06,0x1f07,0x1f08,0x1f09,0x1f0a,0x1f0b,
0x1f0c,0x1f0d,0x1f0e,0x1f0f,0x1f10,0x1f11,0x1f12,0x1f13,0x1f14,0x1f15,0x1f18,0x1f19,0x1f1a,0x1f1b,0x1f1c,0x1f1d,
0x1f20,0x1f21,0x1f22,0x1f23,0x1f24,0x1f25,0x1f26,0x1f27,0x1f28,0x1f29,0x1f2a,0x1f2b,0x1f2c,0x1f2d,0x1f2e,0x1f2f,
0x1f30,0x1f31,0x1f32,0x1f33,0x1f34,0x1f35,0x1f36,0x1f37,0x1f38,0x1f39,0x1f3a,0x1f3b,0x1f3c,0x1f3d,0x1f3e,0x1f3f,
0x1f40,0x1f41,0x1f42,0x1f43,0x1f44,0x1f45,0x1f48,0x1f49,0x1f4a,0x1f4b,0x1f4c,0x1f4d,0x1f50,0x1f51,0x1f52,0x1f53,
0x1f54,0x1f55,0x1f56,0x1f57,0x1f59,0x1f5b,0x1f5d,0x1f5f,0x1f60,0x1f61,0x1f62,0x1f63,0x1f64,0x1f65,0x1f66,0x1f67,
0x1f68,0x1f69,0x1f6a,0x1f6b,0x1f6c,0x1f6d,0x1f6e,0x1f6f,0x1f70,0x1f72,0x1f74,0x1f76,0x1f78,0x1f7a,0x1f7c,0x1f80,
0x1f81,0x1f82,0x1f83,0x1f84,0x1f85,0x1f86,0x1f87,0x1f88,0x1f89,0x1f8a,0x1f8b,0x1f8c,0x1f8d,0x1f8e,0x1f8f,0x1f90,
0x1f91,0x1f92,0x1f93,0x1f94,0x1f95,0x1f96,0x1f97,0x1f98,0x1f99,0x1f9a,0x1f9b,0x1f9c,0x1f9d,0x1f9e,0x1f9f,0x1fa0,
0x1fa1,0x1fa2,0x1fa3,0x1fa4,0x1fa5,0x1fa6,0x1fa7,0x1fa8,0x1fa9,0x1faa,0x1fab,0x1fac,0x1fad,0x1fae,0x1faf,0x1fb0,
0x1fb1,0x1fb2,0x1fb3,0x1fb4,0x1fb6,0x1fb7,0x1fb8,0x1fb9,0x1fba,0x1fbc,0x1fc1,0x1fc2,0x1fc3,0x1fc4,0x1fc6,0x1fc7,
0x1fc8,0x1fca,0x1fcc,0x1fcd,0x1fce,0x1fcf,0x1fd0,0x1fd1,0x1fd2,0x1fd6,0x1fd7,0x1fd8,0x1fd9,0x1fda,0x1fdd,0x1fde,
0x1fdf,0x1fe0,0x1fe1,0x1fe2,0x1fe4,0x1fe5,0x1fe6,0x1fe7,0x1fe8,0x1fe9,0x1fea,0x1fec,0x1fed,0x1ff2,0x1ff3,0x1ff4,
0x1ff6,0x1ff7,0x1ff8,0x1ffa,0x1ffc,0x2008,0x2018,0x2019,0x201a,0x201c,0x201d,0x201e,0x2022,0x2026,0x2030,0x2039,
0x203a,0x203d,0x2070,0x2074,0x2075,0x2076,0x2077,0x2078,0x2079,0x207a,0x207b,0x207c,0x207d,0x207e,0x2080,0x2081,
0x2082,0x2083,0x2084,0x2085,0x2086,0x2087,0x2088,0x2089,0x208a,0x208b,0x208c,0x208d,0x208e,0x20a0,0x20a1,0x20a2,
0x20a3,0x20a4,0x20a5,0x20a6,0x20a7,0x20a8,0x20a9,0x20ab,0x20ac,0x2116,0x2120,0x2122,0x219a,0x219b,0x21ae,0x2204,
0x2209,0x220c,0x2224,0x2226,0x2241,0x2244,0x2247,0x2249,0x2260,0x2262,0x226d,0x226e,0x226f,0x2270,0x2271,0x2274,
0x2275,0x2278,0x2279,0x2280,0x2281,0x2284,0x2285,0x2288,0x2289,0x22ac,0x22ad,0x22ae,0x22af,0x22e0,0x22e1,0x22e2,
0x22e3,0x22ea,0x22eb,0x22ec,0x22ed,0x266d,0x266e,0x266f,0x2adc,0x301d,0x301e,0x3192,0x3193,0x3194,0x3195,0x3196,
0x3197,0x3198,0x3199,0x319a,0x319b,0x319c,0x319d,0x319e,0x319f,0xfb1d,0xfb1f,0xfb2a,0xfb2b,0xfb2c,0xfb2d,0xfb2e,
0xfb2f,0xfb30,0xfb31,0xfb32,0xfb33,0xfb34,0xfb35,0xfb36,0xfb38,0xfb39,0xfb3a,0xfb3b,0xfb3c,0xfb3e,0xfb40,0xfb41,
0xfb43,0xfb44,0xfb46,0xfb47,0xfb48,0xfb49,0xfb4a,0xfb4b,0xfb4c,0xfb4d,0xfb4e
};
uint16_t multikey_map_first[] = {
0x002B,0x0020,0x0041,0x0028,0x0029,0x0020,0x0020,0x002D,0x006C,0x002D,0x0020,0x0020,0x0021,0x002F,0x002D,0x0078,
0x003D,0x0021,0x043F,0x004F,0x003C,0x002D,0x004F,0x006F,0x002B,0x005E,0x005E,0x006D,0x0050,0x002E,0x0020,0x005E,
0x003E,0x0031,0x0031,0x0033,0x003F,0x0060,0x0027,0x005E,0x007E,0x0022,0x006F,0x0041,0x00B8,0x0060,0x0027,0x005E,
0x0022,0x0060,0x0027,0x005E,0x0022,0x0044,0x007E,0x0060,0x0027,0x005E,0x007E,0x0022,0x0078,0x002F,0x0060,0x0027,
0x005E,0x0022,0x0027,0x0054,0x0073,0x0060,0x0027,0x005E,0x007E,0x0022,0x006F,0x0061,0x00B8,0x0060,0x0027,0x005E,
0x0022,0x0060,0x0027,0x005E,0x0022,0x0064,0x007E,0x0060,0x0027,0x005E,0x007E,0x0022,0x002D,0x002F,0x0060,0x0027,
0x005E,0x0022,0x0027,0x0074,0x0022,0x005F,0x005F,0x0062,0x0062,0x003B,0x003B,0x0027,0x0027,0x005E,0x005E,0x002E,
0x002E,0x0063,0x0063,0x0063,0x0063,0x002F,0x002F,0x005F,0x005F,0x0062,0x0062,0x002E,0x002E,0x003B,0x003B,0x0063,
0x0063,0x005E,0x005E,0x0062,0x0062,0x002E,0x002E,0x00B8,0x00B8,0x005E,0x005E,0x002F,0x002F,0x007E,0x007E,0x005F,
0x005F,0x0062,0x0062,0x003B,0x003B,0x002E,0x0069,0x005E,0x005E,0x00B8,0x00B8,0x006B,0x0027,0x0027,0x00B8,0x00B8,
0x0063,0x0063,0x002F,0x002F,0x0027,0x0027,0x00B8,0x00B8,0x0063,0x0063,0x004E,0x006E,0x005F,0x005F,0x0062,0x0062,
0x003D,0x003D,0x004F,0x006F,0x0027,0x0027,0x00B8,0x00B8,0x0063,0x0063,0x0027,0x0027,0x005E,0x005E,0x00B8,0x00B8,
0x0063,0x0063,0x00B8,0x00B8,0x0063,0x0063,0x002F,0x002F,0x007E,0x007E,0x005F,0x005F,0x0062,0x0062,0x006F,0x006F,
0x003D,0x003D,0x003B,0x003B,0x005E,0x005E,0x005E,0x005E,0x0022,0x0027,0x0027,0x002E,0x002E,0x0063,0x0063,0x0066,
0x002F,0x002F,0x002B,0x002B,0x002B,0x002B,0x002F,0x002F,0x0063,0x0063,0x0063,0x0063,0x0063,0x0063,0x0063,0x0063,
0x005F,0x005F,0x0027,0x0027,0x0063,0x0063,0x0060,0x0060,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x002F,0x002F,
0x0063,0x0063,0x0063,0x0063,0x003B,0x003B,0x005F,0x005F,0x0063,0x0063,0x0063,0x0027,0x0027,0x0060,0x0060,0x0027,
0x0027,0x0027,0x0027,0x0027,0x0027,0x0063,0x0063,0x002E,0x002E,0x00B8,0x00B8,0x005F,0x005F,0x005F,0x005F,0x002E,
0x002E,0x005F,0x005F,0x005F,0x005F,0x0065,0x002F,0x002F,0x0022,0x00A8,0x0027,0x0027,0x0027,0x0027,0x0027,0x0027,
0x0027,0x0027,0x0022,0x0022,0x0027,0x0027,0x0027,0x0027,0x0027,0x0022,0x0022,0x0027,0x0027,0x0027,0x0022,0x0060,
0x0022,0x0027,0x0022,0x0027,0x0060,0x0062,0x0062,0x0062,0x0060,0x0022,0x0027,0x0022,0x0027,0x0060,0x0062,0x002F,
0x002F,0x002F,0x002F,0x002F,0x002F,0x0062,0x0062,0x0062,0x0062,0x0022,0x0022,0x0062,0x0062,0x0022,0x0022,0x0022,
0x0022,0x0022,0x0022,0x005F,0x005F,0x0022,0x0022,0x0022,0x0022,0x0022,0x0022,0x0022,0x0022,0x005F,0x005F,0x0022,
0x0022,0x003D,0x003D,0x0022,0x0022,0x0022,0x0022,0x0653,0x0654,0x0654,0x0655,0x0654,0x0654,0x0654,0x0654,0x093C,
0x093C,0x093C,0x093C,0x093C,0x093C,0x093C,0x093C,0x093C,0x093C,0x093C,0x09C7,0x09C7,0x09BC,0x09BC,0x09BC,0x0A3C,
0x0A3C,0x0A3C,0x0A3C,0x0A3C,0x0A3C,0x0B47,0x0B47,0x0B47,0x0B3C,0x0B3C,0x0BD7,0x0BC6,0x0BC7,0x0BC6,0x0C46,0x0CBF,
0x0CC6,0x0CC6,0x0CC6,0x0CCA,0x0D46,0x0D47,0x0D46,0x0DD9,0x0DD9,0x0DDC,0x0DD9,0x0FB7,0x0FB7,0x0FB7,0x0FB7,0x0FB7,
0x0FB5,0x0F71,0x0F71,0x0FB2,0x0FB3,0x0F71,0x0F92,0x0F9C,0x0FA1,0x0FA6,0x0FAB,0x0F90,0x102E,0x1100,0x1103,0x1107,
0x1109,0x110C,0x1102,0x1102,0x1102,0x1102,0x1103,0x1105,0x1105,0x1105,0x1105,0x1106,0x1106,0x1107,0x1107,0x1107,
0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1109,0x1109,0x1109,0x1109,
0x1109,0x1109,0x1109,0x1109,0x1109,0x1109,0x1109,0x1109,0x1109,0x1109,0x1109,0x113C,0x113E,0x110B,0x110B,0x110B,
0x110B,0x110B,0x110B,0x110B,0x110B,0x110B,0x110B,0x110B,0x110C,0x114E,0x1150,0x110E,0x110E,0x1111,0x1111,0x1112,
0x1161,0x1163,0x1165,0x1167,0x1169,0x1169,0x1169,0x116E,0x116E,0x116E,0x1173,0x1161,0x1161,0x1163,0x1163,0x1165,
0x1165,0x1165,0x1167,0x1167,0x1169,0x1169,0x1169,0x1169,0x1169,0x116D,0x116D,0x116D,0x116D,0x116D,0x116E,0x116E,
0x116E,0x116E,0x116E,0x1172,0x1172,0x1172,0x1172,0x1172,0x1172,0x1172,0x1173,0x1173,0x1174,0x1175,0x1175,0x1175,
0x1175,0x1175,0x1175,0x119E,0x119E,0x119E,0x119E,0x11A8,0x11A8,0x11AB,0x11AB,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,
0x11AF,0x11AF,0x11B8,0x11BA,0x11A8,0x11A8,0x11AB,0x11AB,0x11AB,0x11AB,0x11AB,0x11AE,0x11AE,0x11AF,0x11AF,0x11AF,
0x11CE,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,0x11AF,0x11B7,0x11B7,0x11B7,0x11B7,0x11B7,
0x11B7,0x11B7,0x11B7,0x11B7,0x11B8,0x11B8,0x11B8,0x11B8,0x11BA,0x11BA,0x11BA,0x11BA,0x11BC,0x11BC,0x11BC,0x11BC,
0x11F0,0x11F0,0x11C1,0x11C1,0x11C2,0x11C2,0x11C2,0x11C2,0x002E,0x002E,0x0021,0x0021,0x0027,0x0027,0x002E,0x002E,
0x0021,0x0021,0x00B8,0x00B8,0x0060,0x0060,0x0027,0x0027,0x0062,0x0062,0x002E,0x002E,0x005F,0x005F,0x002E,0x002E,
0x0021,0x0021,0x0022,0x0022,0x00B8,0x00B8,0x0027,0x0027,0x0027,0x0027,0x0021,0x0021,0x0021,0x0021,0x005F,0x005F,
0x0027,0x0027,0x002E,0x002E,0x0021,0x0021,0x002E,0x002E,0x0021,0x0021,0x0027,0x0027,0x0022,0x0022,0x0060,0x0060,
0x0027,0x0027,0x0027,0x0027,0x002E,0x002E,0x002E,0x002E,0x0021,0x0021,0x005F,0x005F,0x002E,0x002E,0x0021,0x0021,
0x002E,0x002E,0x002E,0x002E,0x002E,0x002E,0x002E,0x002E,0x0021,0x0021,0x0027,0x0027,0x0022,0x0022,0x007E,0x007E,
0x0021,0x0021,0x0060,0x0060,0x0027,0x0027,0x0022,0x0022,0x002E,0x002E,0x0021,0x0021,0x002E,0x002E,0x0022,0x0022,
0x002E,0x002E,0x005E,0x005E,0x0021,0x0021,0x0022,0x006F,0x006F,0x002E,0x0021,0x0021,0x003F,0x003F,0x0027,0x0027,
0x0060,0x0060,0x003F,0x003F,0x007E,0x007E,0x005E,0x005E,0x0027,0x0027,0x0060,0x0060,0x003F,0x003F,0x007E,0x007E,
0x0062,0x0062,0x0021,0x0021,0x003F,0x003F,0x007E,0x007E,0x0027,0x0027,0x0060,0x0060,0x003F,0x003F,0x007E,0x007E,
0x005E,0x005E,0x003F,0x003F,0x0021,0x0021,0x0021,0x0021,0x003F,0x003F,0x0027,0x0027,0x0060,0x0060,0x003F,0x003F,
0x007E,0x007E,0x005E,0x005E,0x0027,0x0027,0x0060,0x0060,0x003F,0x003F,0x007E,0x007E,0x0021,0x0021,0x0021,0x0021,
0x003F,0x003F,0x0027,0x0027,0x0060,0x0060,0x003F,0x003F,0x007E,0x007E,0x0021,0x0021,0x0060,0x0060,0x0021,0x0021,
0x003F,0x003F,0x007E,0x007E,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,0x0029,0x0028,0x0060,0x0060,
0x0027,0x0027,0x007E,0x007E,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,
0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,
0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,
0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x0029,0x0028,0x0060,0x0060,
0x0027,0x0027,0x007E,0x007E,0x0028,0x0060,0x0027,0x007E,0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,
0x0029,0x0028,0x0060,0x0060,0x0027,0x0027,0x007E,0x007E,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x0060,0x03B9,
0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,
0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,
0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x03B9,0x0062,
0x005F,0x03B9,0x03B9,0x03B9,0x007E,0x03B9,0x0062,0x005F,0x0060,0x03B9,0x00A8,0x03B9,0x03B9,0x03B9,0x007E,0x03B9,
0x0060,0x0060,0x03B9,0x1FBF,0x1FBF,0x1FBF,0x0062,0x005F,0x0060,0x007E,0x007E,0x0062,0x005F,0x0060,0x1FFE,0x1FFE,
0x1FFE,0x0062,0x005F,0x0060,0x0029,0x0028,0x007E,0x007E,0x0062,0x005F,0x0060,0x0028,0x00A8,0x03B9,0x03B9,0x03B9,
0x007E,0x03B9,0x0060,0x0060,0x03B9,0x0020,0x0027,0x0027,0x0027,0x0022,0x0022,0x0022,0x002E,0x002E,0x0025,0x002E,
0x002E,0x0021,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005F,0x005F,
0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x0043,0x002F,0x0043,
0x0046,0x003D,0x002F,0x003D,0x0050,0x0052,0x003D,0x0064,0x003D,0x041D,0x0073,0x0074,0x002F,0x002F,0x002F,0x2203,
0x2208,0x220B,0x2223,0x2225,0x223C,0x2243,0x223C,0x2248,0x003D,0x2261,0x224D,0x003C,0x003E,0x2264,0x2265,0x2272,
0x2273,0x2276,0x2277,0x227A,0x227B,0x2282,0x2283,0x2286,0x2287,0x22A3,0x22A8,0x22A9,0x22AB,0x227C,0x227D,0x2291,
0x2292,0x22B2,0x22B3,0x22B4,0x22B5,0x0023,0x0023,0x0023,0x2ADD,0x0022,0x0022,0x005E,0x005E,0x005E,0x005E,0x005E,
0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x005E,0x05B4,0x05B7,0x05C1,0x05C2,0x05C1,0x05C2,0x05B7,
0x05B8,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,
0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05BC,0x05B9,0x05BF,0x05BF,0x05BF
};
uint16_t multikey_map_second[] = {
0x002B,0x0027,0x0054,0x0028,0x0029,0x003E,0x0060,0x0028,0x0076,0x0029,0x002D,0x0020,0x0021,0x0063,0x004C,0x006F,
0x0059,0x005E,0x0430,0x0043,0x003C,0x002C,0x0052,0x006F,0x002D,0x0032,0x0033,0x0075,0x0050,0x002D,0x002C,0x0031,
0x003E,0x0034,0x0032,0x0034,0x003F,0x0041,0x0041,0x0041,0x0041,0x0041,0x0041,0x0045,0x0043,0x0045,0x0045,0x0045,
0x0045,0x0049,0x0049,0x0049,0x0049,0x0048,0x004E,0x004F,0x004F,0x004F,0x004F,0x004F,0x0078,0x004F,0x0055,0x0055,
0x0055,0x0055,0x0059,0x0048,0x0073,0x0061,0x0061,0x0061,0x0061,0x0061,0x0061,0x0065,0x0063,0x0065,0x0065,0x0065,
0x0065,0x0069,0x0069,0x0069,0x0069,0x0068,0x006E,0x006F,0x006F,0x006F,0x006F,0x006F,0x003A,0x006F,0x0075,0x0075,
0x0075,0x0075,0x0079,0x0068,0x0079,0x0041,0x0061,0x0041,0x0061,0x0041,0x0061,0x0043,0x0063,0x0043,0x0063,0x0043,
0x0063,0x0043,0x0063,0x0044,0x0064,0x0044,0x0064,0x0045,0x0065,0x0045,0x0065,0x0045,0x0065,0x0045,0x0065,0x0045,
0x0065,0x0047,0x0067,0x0047,0x0067,0x0047,0x0067,0x0047,0x0067,0x0048,0x0068,0x0048,0x0068,0x0049,0x0069,0x0049,
0x0069,0x0049,0x0069,0x0049,0x0069,0x0049,0x002E,0x004A,0x006A,0x004B,0x006B,0x006B,0x004C,0x006C,0x004C,0x006C,
0x004C,0x006C,0x004C,0x006C,0x004E,0x006E,0x004E,0x006E,0x004E,0x006E,0x0047,0x0067,0x004F,0x006F,0x004F,0x006F,
0x004F,0x006F,0x0045,0x0065,0x0052,0x0072,0x0052,0x0072,0x0052,0x0072,0x0053,0x0073,0x0053,0x0073,0x0053,0x0073,
0x0053,0x0073,0x0054,0x0074,0x0054,0x0074,0x0054,0x0074,0x0055,0x0075,0x0055,0x0075,0x0055,0x0075,0x0055,0x0075,
0x0055,0x0075,0x0055,0x0075,0x0057,0x0077,0x0059,0x0079,0x0059,0x005A,0x007A,0x005A,0x007A,0x005A,0x007A,0x0053,
0x0062,0x0049,0x004F,0x006F,0x0055,0x0075,0x005A,0x007A,0x0041,0x0061,0x0049,0x0069,0x004F,0x006F,0x0055,0x0075,
0x00DC,0x00FC,0x00DC,0x00FC,0x00DC,0x00FC,0x00DC,0x00FC,0x00C4,0x00E4,0x0226,0x0227,0x00C6,0x00E6,0x0047,0x0067,
0x0047,0x0067,0x004B,0x006B,0x004F,0x006F,0x01EA,0x01EB,0x01B7,0x0292,0x006A,0x0047,0x0067,0x004E,0x006E,0x00C5,
0x00E5,0x00C6,0x00E6,0x00D8,0x00F8,0x0048,0x0068,0x0041,0x0061,0x0045,0x0065,0x00D6,0x00F6,0x00D5,0x00F5,0x004F,
0x006F,0x022E,0x022F,0x0059,0x0079,0x0065,0x0069,0x0294,0x0027,0x0027,0x0391,0x0395,0x0397,0x0399,0x039F,0x03A5,
0x03A9,0x03CA,0x0399,0x03A5,0x03B1,0x03B5,0x03B7,0x03B9,0x03CB,0x03B9,0x03C5,0x03BF,0x03C5,0x03C9,0x03D2,0x0415,
0x0415,0x0413,0x0406,0x041A,0x0418,0x0423,0x0418,0x0438,0x0435,0x0435,0x0433,0x0456,0x043A,0x0438,0x0443,0x0413,
0x0433,0x041A,0x043A,0x04AE,0x04AF,0x0416,0x0436,0x0410,0x0430,0x0410,0x0430,0x0415,0x0435,0x04D8,0x04D9,0x0416,
0x0436,0x0417,0x0437,0x0418,0x0438,0x0418,0x0438,0x041E,0x043E,0x04E8,0x04E9,0x042D,0x044D,0x0423,0x0443,0x0423,
0x0443,0x0423,0x0443,0x0427,0x0447,0x042B,0x044B,0x0627,0x0627,0x0648,0x0627,0x064A,0x06D5,0x06C1,0x06D2,0x0928,
0x0930,0x0933,0x0915,0x0916,0x0917,0x091C,0x0921,0x0922,0x092B,0x092F,0x09BE,0x09D7,0x09A1,0x09A2,0x09AF,0x0A32,
0x0A38,0x0A16,0x0A17,0x0A1C,0x0A2B,0x0B56,0x0B3E,0x0B57,0x0B21,0x0B22,0x0B92,0x0BBE,0x0BBE,0x0BD7,0x0C56,0x0CD5,
0x0CD5,0x0CD6,0x0CC2,0x0CD5,0x0D3E,0x0D3E,0x0D57,0x0DCA,0x0DCF,0x0DCA,0x0DDF,0x0F42,0x0F4C,0x0F51,0x0F56,0x0F5B,
0x0F40,0x0F72,0x0F74,0x0F80,0x0F80,0x0F80,0x0FB7,0x0FB7,0x0FB7,0x0FB7,0x0FB7,0x0FB5,0x1025,0x1100,0x1103,0x1107,
0x1109,0x110C,0x1100,0x1102,0x1103,0x1107,0x1100,0x1102,0x1105,0x1112,0x110B,0x1107,0x110B,0x1100,0x1102,0x1103,
0x1109,0x112D,0x112F,0x1132,0x110A,0x1136,0x110C,0x110E,0x1110,0x1111,0x110B,0x112B,0x1100,0x1102,0x1103,0x1105,
0x1106,0x1107,0x111E,0x110A,0x110B,0x110C,0x110E,0x110F,0x1110,0x1111,0x1112,0x113C,0x113E,0x1100,0x1103,0x1106,
0x1107,0x1109,0x1140,0x110B,0x110C,0x110E,0x1110,0x1111,0x110B,0x114E,0x1150,0x110F,0x1112,0x1107,0x110B,0x1112,
0x1175,0x1175,0x1175,0x1175,0x1161,0x1162,0x1175,0x1165,0x1166,0x1175,0x1175,0x1169,0x116E,0x1169,0x116D,0x1169,
0x116E,0x1173,0x1169,0x116E,0x1165,0x1166,0x1168,0x1169,0x116E,0x1163,0x1164,0x1167,0x1169,0x1175,0x1161,0x1162,
0x117C,0x1168,0x116E,0x1161,0x1165,0x1166,0x1167,0x1168,0x116E,0x1175,0x116E,0x1173,0x116E,0x1161,0x1163,0x1169,
0x116E,0x1173,0x119E,0x1165,0x116E,0x1175,0x119E,0x11A8,0x11BA,0x11BD,0x11C2,0x11A8,0x11B7,0x11B8,0x11BA,0x11C0,
0x11C1,0x11C2,0x11BA,0x11BA,0x11AF,0x11E7,0x11A8,0x11AE,0x11BA,0x11EB,0x11C0,0x11A8,0x11AF,0x11AA,0x11AB,0x11AE,
0x11C2,0x11AF,0x11DA,0x11DD,0x11B9,0x11E5,0x11E6,0x11BB,0x11EB,0x11BF,0x11F9,0x11A8,0x11AF,0x11B8,0x11BA,0x11BB,
0x11EB,0x11BE,0x11C2,0x11BC,0x11AF,0x11C1,0x11C2,0x11BC,0x11A8,0x11AE,0x11AF,0x11B8,0x11A8,0x11A9,0x11BC,0x11BF,
0x11BA,0x11EB,0x11B8,0x11BC,0x11AB,0x11AF,0x11B7,0x11B8,0x0042,0x0062,0x0042,0x0062,0x00C7,0x00E7,0x0044,0x0064,
0x0044,0x0064,0x0044,0x0064,0x0112,0x0113,0x0112,0x0113,0x0228,0x0229,0x0046,0x0066,0x0047,0x0067,0x0048,0x0068,
0x0048,0x0068,0x0048,0x0068,0x0048,0x0068,0x00CF,0x00EF,0x004B,0x006B,0x004B,0x006B,0x004C,0x006C,0x1E36,0x1E37,
0x004D,0x006D,0x004D,0x006D,0x004D,0x006D,0x004E,0x006E,0x004E,0x006E,0x00D5,0x00F5,0x00D5,0x00F5,0x014C,0x014D,
0x014C,0x014D,0x0050,0x0070,0x0050,0x0070,0x0052,0x0072,0x0052,0x0072,0x1E5A,0x1E5B,0x0053,0x0073,0x0053,0x0073,
0x015A,0x015B,0x0160,0x0161,0x1E62,0x1E63,0x0054,0x0074,0x0054,0x0074,0x0168,0x0169,0x016A,0x016B,0x0056,0x0076,
0x0056,0x0076,0x0057,0x0077,0x0057,0x0077,0x0057,0x0077,0x0057,0x0077,0x0057,0x0077,0x0058,0x0078,0x0058,0x0078,
0x0059,0x0079,0x005A,0x007A,0x005A,0x007A,0x0074,0x0077,0x0079,0x017F,0x0041,0x0061,0x0041,0x0061,0x00C2,0x00E2,
0x00C2,0x00E2,0x00C2,0x00E2,0x00C2,0x00E2,0x1EA0,0x1EA1,0x0102,0x0103,0x0102,0x0103,0x0102,0x0103,0x0102,0x0103,
0x1EA0,0x1EA1,0x0045,0x0065,0x0045,0x0065,0x0045,0x0065,0x00CA,0x00EA,0x00CA,0x00EA,0x00CA,0x00EA,0x00CA,0x00EA,
0x1EB8,0x1EB9,0x0049,0x0069,0x0049,0x0069,0x004F,0x006F,0x004F,0x006F,0x00D4,0x00F4,0x00D4,0x00F4,0x00D4,0x00F4,
0x00D4,0x00F4,0x1ECC,0x1ECD,0x01A0,0x01A1,0x01A0,0x01A1,0x01A0,0x01A1,0x01A0,0x01A1,0x01A0,0x01A1,0x0055,0x0075,
0x0055,0x0075,0x01AF,0x01B0,0x01AF,0x01B0,0x01AF,0x01B0,0x01AF,0x01B0,0x01AF,0x01B0,0x0059,0x0079,0x0059,0x0079,
0x0059,0x0079,0x0059,0x0079,0x03B1,0x03B1,0x1F00,0x1F01,0x1F00,0x1F01,0x1F00,0x1F01,0x0391,0x0391,0x1F08,0x1F09,
0x1F08,0x1F09,0x1F08,0x1F09,0x03B5,0x03B5,0x1F10,0x1F11,0x1F10,0x1F11,0x0395,0x0395,0x1F18,0x1F19,0x1F18,0x1F19,
0x03B7,0x03B7,0x1F20,0x1F21,0x1F20,0x1F21,0x1F20,0x1F21,0x0397,0x0397,0x1F28,0x1F29,0x1F28,0x1F29,0x1F28,0x1F29,
0x03B9,0x03B9,0x1F30,0x1F31,0x1F30,0x1F31,0x1F30,0x1F31,0x0399,0x0399,0x1F38,0x1F39,0x1F38,0x1F39,0x1F38,0x1F39,
0x03BF,0x03BF,0x1F40,0x1F41,0x1F40,0x1F41,0x039F,0x039F,0x1F48,0x1F49,0x1F48,0x1F49,0x03C5,0x03C5,0x1F50,0x1F51,
0x1F50,0x1F51,0x1F50,0x1F51,0x03A5,0x1F59,0x1F59,0x1F59,0x03C9,0x03C9,0x1F60,0x1F61,0x1F60,0x1F61,0x1F60,0x1F61,
0x03A9,0x03A9,0x1F68,0x1F69,0x1F68,0x1F69,0x1F68,0x1F69,0x03B1,0x03B5,0x03B7,0x03B9,0x03BF,0x03C5,0x03C9,0x1F00,
0x1F01,0x1F02,0x1F03,0x1F04,0x1F05,0x1F06,0x1F07,0x1F08,0x1F09,0x1F0A,0x1F0B,0x1F0C,0x1F0D,0x1F0E,0x1F0F,0x1F20,
0x1F21,0x1F22,0x1F23,0x1F24,0x1F25,0x1F26,0x1F27,0x1F28,0x1F29,0x1F2A,0x1F2B,0x1F2C,0x1F2D,0x1F2E,0x1F2F,0x1F60,
0x1F61,0x1F62,0x1F63,0x1F64,0x1F65,0x1F66,0x1F67,0x1F68,0x1F69,0x1F6A,0x1F6B,0x1F6C,0x1F6D,0x1F6E,0x1F6F,0x03B1,
0x03B1,0x1F70,0x03B1,0x03AC,0x03B1,0x1FB6,0x0391,0x0391,0x0391,0x0391,0x007E,0x1F74,0x03B7,0x03AE,0x03B7,0x1FC6,
0x0395,0x0397,0x0397,0x0060,0x0027,0x007E,0x03B9,0x03B9,0x03CA,0x03B9,0x03CA,0x0399,0x0399,0x0399,0x0060,0x0027,
0x007E,0x03C5,0x03C5,0x03CB,0x03C1,0x03C1,0x03C5,0x03CB,0x03A5,0x03A5,0x03A5,0x03A1,0x0060,0x1F7C,0x03C9,0x03CE,
0x03C9,0x1FF6,0x039F,0x03A9,0x03A9,0x002E,0x003C,0x003E,0x002C,0x003C,0x003E,0x002C,0x003D,0x002E,0x006F,0x003C,
0x003E,0x003F,0x0030,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x002B,0x2212,0x003D,0x0028,0x0029,0x0030,0x0031,
0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x002B,0x2212,0x003D,0x0028,0x0029,0x0045,0x0043,0x0072,
0x0072,0x004C,0x006D,0x004E,0x0074,0x0073,0x0057,0x002D,0x0415,0x041E,0x006D,0x006D,0x2190,0x2192,0x2194,0x0338,
0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,
0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,0x0338,
0x0338,0x0338,0x0338,0x0338,0x0338,0x0062,0x0066,0x0023,0x0338,0x005C,0x002F,0x4E00,0x4E8C,0x4E09,0x56DB,0x4E0A,
0x4E2D,0x4E0B,0x7532,0x4E59,0x4E19,0x4E01,0x5929,0x5730,0x4EBA,0x05D9,0x05F2,0x05E9,0x05E9,0xFB49,0xFB49,0x05D0,
0x05D0,0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DE,0x05E0,0x05E1,
0x05E3,0x05E4,0x05E6,0x05E7,0x05E8,0x05E9,0x05EA,0x05D5,0x05D1,0x05DB,0x05E4
};

View File

@ -1,8 +1,4 @@
if USEOPENCV2
AM_CFLAGS = -Wall -Werror -O2 -I$(top_srcdir)/include/opencv2
else
AM_CFLAGS = -Wall -Werror -O2 -I$(top_srcdir)/include/opencv1
endif
AM_CFLAGS = -Wall -Werror -O2 -I$(top_srcdir)/include/
AM_LDFLAGS =
AM_LIBS = -shared
@ -12,8 +8,4 @@ libcvautomation_la_SOURCES = libcvautomation-opencv.c libcvautomation-xlib.c lib
#libcvautomation_CFLAGS = -shared -I$(top_srcdir)/include -I$(top_srcdir)/libcvautomation -I$(top_srcdir)/include/libcvautomation
#Lists the headers to distribute
if USEOPENCV2
pkginclude_HEADERS = $(top_srcdir)/include/opencv2/libcvautomation/libcvautomation.h $(top_srcdir)/include/opencv2/libcvautomation/libcvautomation-opencv.h $(top_srcdir)/include/opencv2/libcvautomation/libcvautomation-xlib.h $(top_srcdir)/include/opencv2/libcvautomation/libcvautomation-xtest.h $(top_srcdir)/include/opencv2/libcvautomation/xautomation_kbd.h $(top_srcdir)/include/opencv2/libcvautomation/xautomation_keysym_map.h $(top_srcdir)/include/opencv2/libcvautomation/xautomation_multikey_map.h
else
pkginclude_HEADERS = $(top_srcdir)/include/opencv1/libcvautomation/libcvautomation.h $(top_srcdir)/include/opencv1/libcvautomation/libcvautomation-opencv.h $(top_srcdir)/include/opencv1/libcvautomation/libcvautomation-xlib.h $(top_srcdir)/include/opencv1/libcvautomation/libcvautomation-xtest.h $(top_srcdir)/include/opencv1/libcvautomation/xautomation_kbd.h $(top_srcdir)/include/opencv1/libcvautomation/xautomation_keysym_map.h $(top_srcdir)/include/opencv1/libcvautomation/xautomation_multikey_map.h
endif
pkginclude_HEADERS = $(top_srcdir)/include/libcvautomation/libcvautomation.h $(top_srcdir)/include/libcvautomation/libcvautomation-opencv.h $(top_srcdir)/include/libcvautomation/libcvautomation-xlib.h $(top_srcdir)/include/libcvautomation/libcvautomation-xtest.h $(top_srcdir)/include/libcvautomation/xautomation_kbd.h $(top_srcdir)/include/libcvautomation/xautomation_keysym_map.h $(top_srcdir)/include/libcvautomation/xautomation_multikey_map.h